diff --git a/public/images/Jump.png b/public/images/Jump.png new file mode 100644 index 0000000..16dfea3 Binary files /dev/null and b/public/images/Jump.png differ diff --git a/public/images/NoImg.png b/public/images/NoImg.png new file mode 100644 index 0000000..cbf56cf Binary files /dev/null and b/public/images/NoImg.png differ diff --git a/public/images/Passiveicon.png b/public/images/Passiveicon.png new file mode 100644 index 0000000..757162b Binary files /dev/null and b/public/images/Passiveicon.png differ diff --git a/public/images/Teleport.png b/public/images/Teleport.png new file mode 100644 index 0000000..8acf976 Binary files /dev/null and b/public/images/Teleport.png differ diff --git a/public/images/dowde.png b/public/images/dowde.png new file mode 100644 index 0000000..9fbaee5 Binary files /dev/null and b/public/images/dowde.png differ diff --git a/src/classes/Ability.tsx b/src/classes/Ability.tsx index d17ebe0..d38d86c 100644 --- a/src/classes/Ability.tsx +++ b/src/classes/Ability.tsx @@ -29,7 +29,7 @@ function Ability(props: IAbilityProps){ aria-controls="panel1-content" > - {ability.activationType === "Passive ability" ? : } + {ability.activationType === "Passive ability" ? : }   {ability.name ? ability.name : ability.fileName.charAt(0).toUpperCase() + ability.fileName.slice(1).replaceAll('_', ' ').replace('.rgd', '')} ({ability.activationType}) diff --git a/src/classes/AbilityFull.tsx b/src/classes/AbilityFull.tsx index 66b4f5c..5b46361 100644 --- a/src/classes/AbilityFull.tsx +++ b/src/classes/AbilityFull.tsx @@ -1,5 +1,6 @@ import React, {useEffect, useState} from "react"; import {useTheme} from "@mui/material/styles"; +import useMediaQuery from "@mui/material/useMediaQuery"; import {AbilityUrl, AvailableBuildings, AvailableUnits, UserUrl, WeaponUrl} from "../core/api"; import {IWeapon} from "../types/IUnit"; import ArmorTypeNames from "../types/ArmorTypeValues"; @@ -24,7 +25,6 @@ import AvTimerOutlinedIcon from "@mui/icons-material/AvTimer"; import ability from "./Ability"; import AbilitySpawnedObject from "./AbilitySpawnedObject"; import DpsTable from "./DpsTable"; -import {DescriptionBox} from "../commons/DescriptionBox"; import {StyledPaper} from "../commons/StyledPaper"; import {StyledTableCell} from "../commons/StyledTableCell"; @@ -34,6 +34,7 @@ interface IAbilityFullState { export default function AbilityFull(props: { abilityId?: number, mod: IMod, race: Irace, isChild?: boolean, abilityFull?: IAbilityFill }) { const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('md')); const isDark = theme.palette.mode === 'dark'; const textColor = isDark ? '#dee2e6' : 'rgba(0, 0, 0, 0.85)'; @@ -181,7 +182,7 @@ export default function AbilityFull(props: { abilityId?: number, mod: IMod, race
- {props.isChild !== true && {ability.description}} + {props.isChild !== true && {ability.description}} {showDpsTable ? @@ -191,8 +192,71 @@ export default function AbilityFull(props: { abilityId?: number, mod: IMod, race : showTargetTable ? - { props.mod !== undefined && props.mod.technicalName === 'UltimateApocalypse' ? - + {isMobile ? (() => { + const items = props.mod !== undefined && props.mod.technicalName === 'UltimateApocalypse' ? [ + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryHeavyMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryHeavyHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.Commander) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.DemonLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.DemonMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.DemonHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.Air) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.VehicleLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.VehicleMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.VehicleHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.LivingMetal) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.Titan) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingSuper) }, + { label: null, value: () => null }, + ] : [ + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryHeavyMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.InfantryHeavyHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.Commander) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.DemonMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.DemonHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.Air) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.VehicleLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.VehicleMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.VehicleHigh) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingLow) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingMedium) }, + { label: , value: () => isAbilityApplyTo(ArmorTypeNames.BuildingHigh) }, + ]; + + const chunks = []; + for (let i = 0; i < items.length; i += 5) { + chunks.push(items.slice(i, i + 5)); + } + + return (<>{chunks.map((chunk, chunkIndex) => ( +
+ + + {chunk.map((item, i) => ( + {item.label} + ))} + + + + + {chunk.map((item, i) => ( + {item.value()} + ))} + + +
+ ))}) + })() : props.mod !== undefined && props.mod.technicalName === 'UltimateApocalypse' ? +
: - +
} - : } + + : } {(ability.abilityEnvironment != null) && } diff --git a/src/classes/DpsTable.tsx b/src/classes/DpsTable.tsx index d5d520b..0b06033 100644 --- a/src/classes/DpsTable.tsx +++ b/src/classes/DpsTable.tsx @@ -1,4 +1,6 @@ import React from "react"; +import {useTheme} from "@mui/material/styles"; +import useMediaQuery from "@mui/material/useMediaQuery"; import ArmorTypeNames from "../types/ArmorTypeValues"; import { Table, @@ -14,6 +16,8 @@ import {IArmorType} from "../types/IArmorType"; import {StyledTableCell} from "../commons/StyledTableCell"; export default function DpsTable(props: { mod: IMod, minDamageValue?: number, minDamage?: number, maxDamage?: number, piercings: IPiercing[], targetFilter: IArmorType[], moraleDamage?: number }) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('md')); function getPiercingK(armorType: string): number|null { if(props.targetFilter.length > 0 && props.targetFilter.find(tf => tf.name == armorType) === undefined) return null @@ -72,6 +76,72 @@ export default function DpsTable(props: { mod: IMod, minDamageValue?: number, mi if(props.moraleDamage !== undefined) return (props.moraleDamage / 2).toFixed(2) } + if (isMobile) { + const items = props.mod !== undefined && props.mod.name.includes("Ultimate Apocalypse") ? [ + { label: , value: () => getTotalDamage(infLowPiercing) }, + { label: , value: () => getTotalDamage(infMedPiercing) }, + { label: , value: () => getTotalDamage(infHighPiercing) }, + { label: , value: () => getTotalDamage(infHeavyMedPiercing) }, + { label: , value: () => getTotalDamage(infHeavyHighPiercing) }, + { label: , value: () => getTotalDamage(commanderPiercing) }, + { label: , value: () => getTotalDamage(demonLowPiercing) }, + { label: , value: () => getTotalDamage(demonPiercing) }, + { label: , value: () => getTotalDamage(demonHighPiercing) }, + { label: , value: () => getTotalDamage(airPiercing) }, + { label: , value: () => getTotalDamage(vehLowPiercing) }, + { label: , value: () => getTotalDamage(vehMedPiercing) }, + { label: , value: () => getTotalDamage(vehHighPiercing) }, + { label: , value: () => getTotalDamage(livingMetalPiercing) }, + { label: , value: () => getTotalDamage(titanPiercing) }, + { label: , value: () => getTotalDamage(buildingLowPiercing) }, + { label: , value: () => getTotalDamage(buildingMedPiercing) }, + { label: , value: () => getTotalDamage(buildingHighPiercing) }, + { label: , value: () => getTotalDamage(buildingSuperPiercing) }, + { label: , value: () => getMoraleDamage() }, + ] : [ + { label: , value: () => getTotalDamage(infLowPiercing) }, + { label: , value: () => getTotalDamage(infMedPiercing) }, + { label: , value: () => getTotalDamage(infHighPiercing) }, + { label: , value: () => getTotalDamage(infHeavyMedPiercing) }, + { label: , value: () => getTotalDamage(infHeavyHighPiercing) }, + { label: , value: () => getTotalDamage(commanderPiercing) }, + { label: , value: () => getTotalDamage(demonPiercing) }, + { label: , value: () => getTotalDamage(demonHighPiercing) }, + { label: , value: () => getTotalDamage(airPiercing) }, + { label: , value: () => getTotalDamage(vehLowPiercing) }, + { label: , value: () => getTotalDamage(vehMedPiercing) }, + { label: , value: () => getTotalDamage(vehHighPiercing) }, + { label: , value: () => getTotalDamage(buildingLowPiercing) }, + { label: , value: () => getTotalDamage(buildingMedPiercing) }, + { label: , value: () => getTotalDamage(buildingHighPiercing) }, + { label: , value: () => getMoraleDamage() }, + ]; + + const chunks = []; + for (let i = 0; i < items.length; i += 5) { + chunks.push(items.slice(i, i + 5)); + } + + return (<>{chunks.map((chunk, chunkIndex) => ( +
+ + + {chunk.map((item, i) => ( + {item.label} + ))} + + + + + {chunk.map((item, i) => ( + {item.value()} + ))} + + +
+ ))}) + } + return ( { props.mod !== undefined && props.mod.name.includes("Ultimate Apocalypse") ? @@ -153,7 +223,7 @@ export default function DpsTable(props: { mod: IMod, minDamageValue?: number, mi : - +
+ + } + aria-controls="jump-content" + id="jump-header" + sx={{ + color: textColor, + '& .MuiAccordionSummary-content': {margin: '12px 0'}, + '& .MuiAccordionSummary-content.Mui-expanded': {margin: '12px 0'} + }} + > + + +   {title} + + + + + {(() => { + const rows: { label: string; value: React.ReactNode }[] = [ + { label: "Charge cost", value: jumps.chargeJumpCostMin === jumps.chargeJumpCostMax + ? jumps.chargeJumpCostMin.toFixed(0) + : `${jumps.chargeJumpCostMin.toFixed(0)} - ${jumps.chargeJumpCostMax.toFixed(0)}` }, + { label: "Charge max", value: jumps.chargeMax.toFixed(0) }, + { label: "Charge regeneration", value: `${jumps.chargeRegeneration}/s` }, + { label: "Distance", value: jumps.jumpDistanceMax.toFixed(0) }, + { label: "Setup time", value:  {jumps.setupTime}s }, + { label: "Breakdown time", value:  {jumps.breakdownTime}s }, + ]; + if (!isTeleport) { + if (jumps.goUpTime !== undefined && jumps.goUpTime !== null) { + rows.push({ label: "Go up time", value:  {jumps.goUpTime}s }); + } + if (jumps.goDownTime !== undefined && jumps.goDownTime !== null) { + rows.push({ label: "Go down time", value:  {jumps.goDownTime}s }); + } + } + const chunks: { label: string; value: React.ReactNode }[][] = []; + for (let i = 0; i < rows.length; i += 3) { + chunks.push(rows.slice(i, i + 3)); + } + return chunks.map((chunk, chunkIndex) => ( + + +
+ + {chunk.map((row, i) => ( + + {row.label} + {row.value} + + ))} + +
+
+
+ )); + })()} + + {jumps.requirements !== null && + + + } + + + + ); +} + +export default Jump; diff --git a/src/classes/ModifiersProvideTable.tsx b/src/classes/ModifiersProvideTable.tsx index 21c6819..9d078d3 100644 --- a/src/classes/ModifiersProvideTable.tsx +++ b/src/classes/ModifiersProvideTable.tsx @@ -265,7 +265,7 @@ export function ModifiersProvidesTable(props: IModifiersProvidesResearchTable) { export function getIcon(icon?: string): string { if (icon !== null && icon !== undefined) { return IconUrl + icon.replaceAll('\\', '/') - } else return '/images/NoImg.gif' + } else return '/images/NoImg.png' } diff --git a/src/classes/WeaponFull.tsx b/src/classes/WeaponFull.tsx index d5a2100..2317524 100644 --- a/src/classes/WeaponFull.tsx +++ b/src/classes/WeaponFull.tsx @@ -1,5 +1,6 @@ import React, {useEffect, useState} from "react"; import {useTheme} from "@mui/material/styles"; +import useMediaQuery from "@mui/material/useMediaQuery"; import {AvailableBuildings, AvailableUnits, UserUrl, WeaponUrl} from "../core/api"; import {IWeapon} from "../types/IUnit"; import ArmorTypeNames from "../types/ArmorTypeValues"; @@ -20,7 +21,6 @@ import {Irace} from "../types/Irace"; import {IRaceUnits} from "../types/IUnitShort"; import {IRaceBuildings} from "../types/IBuildingShort"; import {ModifiersProvidesTable} from "./ModifiersProvideTable"; -import {DescriptionBox} from "../commons/DescriptionBox"; import {StyledPaper} from "../commons/StyledPaper"; import {StyledTableCell} from "../commons/StyledTableCell"; import AvTimerOutlinedIcon from "@mui/icons-material/AvTimer"; @@ -32,6 +32,7 @@ interface IWeaponFull { export default function WeaponFull(props: {weaponId: number, isDefault: Boolean, mod: IMod, race: Irace, haveReinforceMenu: Boolean}) { const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('md')); const isDark = theme.palette.mode === 'dark'; const textColor = isDark ? '#dee2e6' : 'rgba(0, 0, 0, 0.85)'; @@ -54,8 +55,6 @@ export default function WeaponFull(props: {weaponId: number, isDefault: Boolean, }, []); - - if(weaoponFull.weapon !== undefined){ const weapon = weaoponFull.weapon @@ -126,9 +125,7 @@ export default function WeaponFull(props: {weaponId: number, isDefault: Boolean,
{!props.isDefault && - - {weapon.description} - + {weapon.description} } @@ -238,7 +235,71 @@ export default function WeaponFull(props: {weaponId: number, isDefault: Boolean, One hit average damage - { props.mod !== undefined && props.mod.technicalName === 'UltimateApocalypse' ? + {isMobile ? (() => { + const items = props.mod !== undefined && props.mod.technicalName === 'UltimateApocalypse' ? [ + { label: , value: () => getTotalDamage(infLowPiercing) }, + { label: , value: () => getTotalDamage(infMedPiercing) }, + { label: , value: () => getTotalDamage(infHighPiercing) }, + { label: , value: () => getTotalDamage(infHeavyMedPiercing) }, + { label: , value: () => getTotalDamage(infHeavyHighPiercing) }, + { label: , value: () => getTotalDamage(commanderPiercing) }, + { label: , value: () => getTotalDamage(demonLowPiercing) }, + { label: , value: () => getTotalDamage(demonPiercing) }, + { label: , value: () => getTotalDamage(demonHighPiercing) }, + { label: , value: () => getTotalDamage(airPiercing, true) }, + { label: , value: () => getTotalDamage(vehLowPiercing) }, + { label: , value: () => getTotalDamage(vehMedPiercing) }, + { label: , value: () => getTotalDamage(vehHighPiercing) }, + { label: , value: () => getTotalDamage(livingMetalPiercing) }, + { label: , value: () => getTotalDamage(titanPiercing) }, + { label: , value: () => getTotalDamage(buildingLowPiercing) }, + { label: , value: () => getTotalDamage(buildingMedPiercing) }, + { label: , value: () => getTotalDamage(buildingHighPiercing) }, + { label: , value: () => getTotalDamage(buildingSuperPiercing) }, + { label: (<>
Morale
), value: () => getMoraleDamage() }, + ] : [ + { label: , value: () => getTotalDamage(infLowPiercing) }, + { label: , value: () => getTotalDamage(infMedPiercing) }, + { label: , value: () => getTotalDamage(infHighPiercing) }, + { label: , value: () => getTotalDamage(infHeavyMedPiercing) }, + { label: , value: () => getTotalDamage(infHeavyHighPiercing) }, + { label: , value: () => getTotalDamage(commanderPiercing) }, + { label: , value: () => getTotalDamage(demonPiercing) }, + { label: , value: () => getTotalDamage(demonHighPiercing) }, + { label: , value: () => getTotalDamage(airPiercing, true) }, + { label: , value: () => getTotalDamage(vehLowPiercing) }, + { label: , value: () => getTotalDamage(vehMedPiercing) }, + { label: , value: () => getTotalDamage(vehHighPiercing) }, + { label: , value: () => getTotalDamage(buildingLowPiercing) }, + { label: , value: () => getTotalDamage(buildingMedPiercing) }, + { label: , value: () => getTotalDamage(buildingHighPiercing) }, + { label: , value: () => getMoraleDamage() }, + ]; + + const chunks = []; + for (let i = 0; i < items.length; i += 5) { + chunks.push(items.slice(i, i + 5)); + } + + return chunks.map((chunk, chunkIndex) => ( + + + + {chunk.map((item, i) => ( + {item.label} + ))} + + + + + {chunk.map((item, i) => ( + {item.value()} + ))} + + +
+ )); + })() : props.mod !== undefined && props.mod.technicalName === 'UltimateApocalypse' ? @@ -378,7 +439,6 @@ export default function WeaponFull(props: {weaponId: number, isDefault: Boolean,
} -
diff --git a/src/classes/building/BuildingAddon.tsx b/src/classes/building/BuildingAddon.tsx index 84e6756..a68d553 100644 --- a/src/classes/building/BuildingAddon.tsx +++ b/src/classes/building/BuildingAddon.tsx @@ -18,7 +18,6 @@ import {IMod} from "../../types/Imod"; import {getIcon, ModifiersProvidesTable,} from "../ModifiersProvideTable"; import Required from "../Required"; import {StyledAccordion} from "../../commons/StyledAccordion"; -import {DescriptionBox} from "../../commons/DescriptionBox"; import {StyledPaper} from "../../commons/StyledPaper"; import {styled} from "@mui/material/styles"; @@ -92,9 +91,7 @@ function BuildingAddon(props: IBuildingAddonProps){
- - {addon.description} - + {addon.description} {addon.addonRequirement !== null && diff --git a/src/classes/building/ResearchFull.tsx b/src/classes/building/ResearchFull.tsx index 1c4c813..0ed7fa4 100644 --- a/src/classes/building/ResearchFull.tsx +++ b/src/classes/building/ResearchFull.tsx @@ -22,7 +22,6 @@ import {IResearchShort} from "../../types/IResearchShort"; import {ResearchUrl, WeaponUrl} from "../../core/api"; import {IWeapon} from "../../types/IUnit"; import {styled} from '@mui/material/styles'; -import {DescriptionBox} from "../../commons/DescriptionBox"; import {StyledPaper} from "../../commons/StyledPaper"; @@ -96,10 +95,7 @@ function ResearchFull(props: { id: number, building: IBuilding }){
- - {research.description} - - + {research.description} { color: textColor, paddingRight: 18, paddingLeft: 10, + [theme.breakpoints.down('md')]: { + paddingRight: 4, + paddingLeft: 2, + }, }, }; }); diff --git a/src/css/Unit.css b/src/css/Unit.css index 6a6198a..0ac539f 100644 --- a/src/css/Unit.css +++ b/src/css/Unit.css @@ -21,6 +21,11 @@ width: 40px; } +.jumpIcon{ + padding: 0px; + width: 40px; +} + .unitHeader{ margin-left: 15px; } diff --git a/src/pages/ModsPage.tsx b/src/pages/ModsPage.tsx index 39b8da1..8037714 100644 --- a/src/pages/ModsPage.tsx +++ b/src/pages/ModsPage.tsx @@ -183,7 +183,6 @@ function Mods({ mods }: ModsProps) { const sameMods = mapWithModVersions.get(modName) ?? []; // The latest version is the one with the maximum id const latest = sameMods.reduce((max, mod) => mod.id > max.id ? mod : max, sameMods[0]); - const nonBetaMods = sameMods.filter(m => !m.isBeta); const betaMods = sameMods.filter(m => m.isBeta); return { latest: latest, @@ -329,7 +328,7 @@ class ModsPage extends React.Component { const response = await fetch(AvailableMods); const data: IMod[] = await response.json(); this.setState({ - mods: data, + mods: data.filter(mod => !mod.isHide), loading: false }); } catch (error) { diff --git a/src/pages/UnitPage.tsx b/src/pages/UnitPage.tsx index ae2016a..2096899 100644 --- a/src/pages/UnitPage.tsx +++ b/src/pages/UnitPage.tsx @@ -33,6 +33,7 @@ import {AffectedResearches} from "../classes/building/Research"; import {ModifiersProvidesTable} from "../classes/ModifiersProvideTable"; import Ability from "../classes/Ability"; import DeathExplosion from "../classes/DeathExplosion"; +import Jump from "../classes/Jump"; import {styled} from '@mui/material/styles'; import {withTheme} from "../core/api"; import {DescriptionBox} from "../commons/DescriptionBox"; @@ -337,7 +338,7 @@ function Unit(unit: IUnit, mod: IMod, theme: Theme) { unit.moraleBrakeModifiers.find(m => m.reference.includes("speed_maximum_modifier") && m.value === 1.2) !== undefined && unit.moraleBrakeModifiers.length === 2) && - Morale broken unusual behavior + Morale broken } @@ -353,6 +354,11 @@ function Unit(unit: IUnit, mod: IMod, theme: Theme) { )} } + {unit.jumps != null && + Jumps + + } + {[...mapWithUnitWeapons.keys()].sort(function (a, b) { return a - b; diff --git a/src/themes/theme.ts b/src/themes/theme.ts index 202411d..622bbef 100644 --- a/src/themes/theme.ts +++ b/src/themes/theme.ts @@ -61,8 +61,8 @@ export const lightTheme = createTheme({ paper: '#ffffff', }, text: { - primary: 'rgba(0, 0, 0, 0.85)', - secondary: 'rgba(0, 0, 0, 0.6)', + primary: '#111111', + secondary: '#333333', }, }, typography: { @@ -75,7 +75,7 @@ export const lightTheme = createTheme({ MuiTableCell: { styleOverrides: { root: { - color: 'rgba(0, 0, 0, 0.85)', + color: '#111111', }, }, }, diff --git a/src/types/IUnit.tsx b/src/types/IUnit.tsx index fae88a4..257907b 100644 --- a/src/types/IUnit.tsx +++ b/src/types/IUnit.tsx @@ -13,6 +13,21 @@ export interface IUnitResponse { units: IUnit[] } +export interface IJumps { + chargeRegeneration: number; + goUpTime?: number; + jumpDistanceMax: number; + breakdownTime: number; + chargeJumpCostMin: number; + chargeJumpCostMax: number; + jumpHeight: number; + chargeMax: number; + setupTime: number; + goDownTime?: number; + teleport: boolean; + requirements: IRequirement | null; +} + export interface IUnit { id: number race: Irace @@ -69,6 +84,7 @@ export interface IUnit { affectedData: IAffectedData, affectedResearches: IResearchShort[], deathExplosions: IDeathExplosion[], + jumps?: IJumps | null, hotkey?: string, } diff --git a/src/types/Imod.tsx b/src/types/Imod.tsx index 4b3cade..179567f 100644 --- a/src/types/Imod.tsx +++ b/src/types/Imod.tsx @@ -5,4 +5,5 @@ export interface IMod { version: string; technicalName: string; isBeta: boolean; + isHide: boolean; }