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;
}