diff --git a/.idea/sbt.xml b/.idea/sbt.xml deleted file mode 100644 index 2018743..0000000 --- a/.idea/sbt.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/public/images/NoImg.gif b/public/images/NoImg.gif new file mode 100644 index 0000000..c7aa35d Binary files /dev/null and b/public/images/NoImg.gif differ diff --git a/public/images/PassiveIcon.gif b/public/images/PassiveIcon.gif new file mode 100644 index 0000000..105d854 Binary files /dev/null and b/public/images/PassiveIcon.gif differ diff --git a/public/images/mods/Uni_Lionhead.webp b/public/images/mods/Uni_Lionhead.webp new file mode 100644 index 0000000..4a21361 Binary files /dev/null and b/public/images/mods/Uni_Lionhead.webp differ diff --git a/public/images/psd/NoImg.psd b/public/images/psd/NoImg.psd new file mode 100644 index 0000000..200a0bc Binary files /dev/null and b/public/images/psd/NoImg.psd differ diff --git a/public/images/psd/PassiveIcon.psd b/public/images/psd/PassiveIcon.psd new file mode 100644 index 0000000..bfead04 Binary files /dev/null and b/public/images/psd/PassiveIcon.psd differ diff --git a/src/classes/Ability.tsx b/src/classes/Ability.tsx new file mode 100644 index 0000000..cb84ad4 --- /dev/null +++ b/src/classes/Ability.tsx @@ -0,0 +1,42 @@ +import {Accordion, AccordionDetails, AccordionSummary} from "@mui/material"; +import {ExpandMore} from "@mui/icons-material"; +import React from "react"; +import {IAbilityShort} from "../types/IAbility"; +import {getIcon} from "./ModifiersProvideTable"; +import {IMod} from "../types/Imod"; +import AbilityFull from "./AbilityFull"; +import {Irace} from "../types/Irace"; + + +interface IAbilityProps { + ability: IAbilityShort, + race: Irace, + mod: IMod, +} + +function Ability(props: IAbilityProps){ + + const ability = props.ability + + return
+ } + aria-controls="panel1-content" + > + + {ability.activationType === "Passive ability" ? : } +   {ability.name ? ability.name : ability.fileName.charAt(0).toUpperCase() + ability.fileName.slice(1).replaceAll('_', ' ').replace('.rgd', '')} + ({ability.activationType}) + + + + + + +
+ +} + + +export default Ability; + diff --git a/src/classes/AbilityFull.tsx b/src/classes/AbilityFull.tsx new file mode 100644 index 0000000..f90b9c2 --- /dev/null +++ b/src/classes/AbilityFull.tsx @@ -0,0 +1,423 @@ +import React, {useEffect, useState} from "react"; +import {AbilityUrl, AvailableBuildings, AvailableUnits, UserUrl, WeaponUrl} from "../core/api"; +import {IWeapon} from "../types/IUnit"; +import ArmorTypeNames from "../types/ArmorTypeValues"; +import { + AccordionDetails, + Grid2, + Paper, + styled, + Table, + TableBody, + TableCell, + tableCellClasses, + TableContainer, TableHead, + TableRow, ToggleButton, ToggleButtonGroup +} from "@mui/material"; +import ArmorType from "./ArmorType"; +import Required from "./Required"; +import {renderAffectedResearches} from "./building/Research"; +import {IMod} from "../types/Imod"; +import {Irace} from "../types/Irace"; +import {IRaceUnits} from "../types/IUnitShort"; +import {IRaceBuildings} from "../types/IBuildingShort"; +import {ModifiersProvidesTable} from "./ModifiersProvideTable"; +import {IAbilityFill, IAbilityShort} from "../types/IAbility"; +import AvTimerOutlinedIcon from "@mui/icons-material/AvTimer"; +import ability from "./Ability"; + +interface IAbilityFullState { + ability?: IAbilityFill; +} + +export default function AbilityFull(props: { abilityId?: number, mod: IMod, race: Irace, isChild?: boolean, abilityFull?: IAbilityFill }) { + + const [abilityFull, setAbilityFull] = useState({ + ability: undefined, + }); + + + + + const StyledTableCell = styled(TableCell)(({theme}) => ({ + [`&.${tableCellClasses.head}`]: { + backgroundColor: "rgb(244,244,244)", + marginRight: 'auto', + marginLeft: 'auto', + paddingLeft: 10 + }, + [`&.${tableCellClasses.body}`]: { + fontSize: 12, + textAlign: 'center', + paddingRight: 18, + paddingLeft: 10 + }, + })); + + useEffect(() => { + + if(props.abilityFull !== undefined){ + setAbilityFull({ + ability: props.abilityFull, + }) + } else { + fetch(AbilityUrl + "/" + props.mod.id + "/" + props.abilityId) + .then(res => res.json()) + .then((ability: IAbilityFill) => { + setAbilityFull({ + ability: ability, + }) + + }); + } + + }, []); + + + + + if(abilityFull.ability !== undefined){ + + const ability = abilityFull.ability + + function getPiercingK(armorType: string): number|null { + if(ability.targetFilter.length > 0 && ability.targetFilter.find(tf => tf.name == armorType) === undefined) return null + const abilityPiercing = ability.piercings.find((p) => p.armorType.name === armorType) + return (typeof abilityPiercing !== "undefined" ? abilityPiercing.piercingValue : 10) / 100 + } + + const infLowPiercing = getPiercingK(ArmorTypeNames.InfantryLow) + const infMedPiercing = getPiercingK(ArmorTypeNames.InfantryMedium) + const infHighPiercing = getPiercingK(ArmorTypeNames.InfantryHigh) + const infHeavyMedPiercing = getPiercingK(ArmorTypeNames.InfantryHeavyMedium) + const infHeavyHighPiercing = getPiercingK(ArmorTypeNames.InfantryHeavyHigh) + const demonPiercing = getPiercingK(ArmorTypeNames.DemonMedium) + const demonHighPiercing = getPiercingK(ArmorTypeNames.DemonHigh) + const commanderPiercing = getPiercingK(ArmorTypeNames.Commander) + + const airPiercing = getPiercingK(ArmorTypeNames.Air) + const vehLowPiercing = getPiercingK(ArmorTypeNames.VehicleLow) + const vehMedPiercing = getPiercingK(ArmorTypeNames.VehicleMedium) + const vehHighPiercing = getPiercingK(ArmorTypeNames.VehicleHigh) + const buildingLowPiercing = getPiercingK(ArmorTypeNames.BuildingLow) + const buildingMedPiercing = getPiercingK(ArmorTypeNames.BuildingMedium) + const buildingHighPiercing = getPiercingK(ArmorTypeNames.BuildingHigh) + + // UA mod + const demonLowPiercing = getPiercingK(ArmorTypeNames.DemonLow) + const buildingSuperPiercing = getPiercingK(ArmorTypeNames.BuildingSuper) + const livingMetalPiercing = getPiercingK(ArmorTypeNames.LivingMetal) + const titanPiercing = getPiercingK(ArmorTypeNames.Titan) + + const getTotalDamage = (damagePiercing: number|null) => { + if(damagePiercing === null) return "" + + if(ability.minDamageValue !== undefined && ability.minDamage !== undefined && ability.maxDamage !== undefined){ + var minDamage = damagePiercing * ability.minDamage + var maxDamage = damagePiercing * ability.maxDamage + + if(ability.minDamageValue !== undefined){ + if (minDamage < ability.minDamageValue) { + minDamage = ability.minDamageValue + } + if (maxDamage < ability.minDamageValue) { + maxDamage = ability.minDamageValue + } + } + + + const averageDmg = (minDamage + maxDamage) / 2 + + return averageDmg.toFixed(2) + } + + + } + + const getMoraleDamage = () => { + if(ability.moraleDamage !== undefined) return (ability.moraleDamage / 2).toFixed(2) + } + + + return ( +
+ + + {ability.initialDelayTime !== undefined && props.isChild === true && +
 After {ability.initialDelayTime.toFixed(1)}s  +
} +
+ + + + + + Affected on + {ability.areaFilter} + + {props.isChild !== true && (ability.costPower !== undefined && ability.costPower > 0 || + ability.costRequisition !== undefined && ability.costRequisition > 0 || + ability.costFaith !== undefined && ability.costFaith > 0 || + ability.costSouls !== undefined && ability.costSouls > 0) && + + Cost + + {ability.costRequisition !== undefined && ability.costRequisition > 0 && +    + {ability.costRequisition.toFixed(0)}} + {ability.costPower !== undefined && ability.costPower > 0 &&    + {ability.costPower.toFixed(0)}} + {(ability.costFaith !== undefined && ability.costFaith > 0) && +    + {ability.costFaith}} + {(ability.costSouls !== undefined && ability.costSouls > 0) && +    + {ability.costSouls.toFixed(0)}} + + } + + {props.isChild !== true && ability.rechargeTime !== undefined && ability.rechargeTime > 0 && ability.activation !== "On/off ability" && + + Recharge time + +   + {ability.rechargeTime.toFixed(0)}s  + {ability.rechargeTimerGlobal && global cooldown} + + + } + {props.isChild !== true && ability.initialDelayTime !== undefined && ability.initialDelayTime > 0 && + + Delay after cast + +   + {ability.initialDelayTime.toFixed(1)}s + + + } + {ability.durationTime !== undefined && ability.durationTime > 1.5 && + + Duration time + +   + {ability.durationTime.toFixed(1)}s + + + } + {ability.areaEffect !== null && ability.radius !== undefined && ability.radius > 0 && + + Radius + + {ability.radius.toFixed(0)} {ability.areaEffect} + + + } + {props.isChild !== true && ability.range !== undefined && ability.areaFilter !== "Own" && ability.range > 0 && + + Range + + {ability.range.toFixed(0)} + + + } + {ability.throwForceMin !== undefined && ability.throwForceMax !== undefined && ability.throwForceMax > 0 && ability.throwForceMin > 0 && + + Throw force + {ability.throwForceMin != 0 ? ability.throwForceMin + " - " + ability.throwForceMax : "-"} + + } + + + + +
+

+
+ +
+ {props.isChild !== true && ability.description} +
+
+ {(ability.minDamage !== undefined && ability.minDamage > 0 || ability.moraleDamage !== undefined && ability.moraleDamage > 0) && + + {(ability.refreshTime !== undefined && ability.durationTime !== undefined && ability.refreshTime * 2 < ability.durationTime) && Every {ability.refreshTime.toFixed(1)}s deal damege:} + + { props.mod !== undefined && props.mod.name.includes("Ultimate Apocalypse") ? + + + + + + + + + + + + + + + + + + {getTotalDamage(infLowPiercing)} + {getTotalDamage(infMedPiercing)} + {getTotalDamage(infHighPiercing)} + {getTotalDamage(infHeavyMedPiercing)} + {getTotalDamage(infHeavyHighPiercing)} + {getTotalDamage(commanderPiercing)} + {getTotalDamage(demonLowPiercing)} + {getTotalDamage(demonPiercing)} + {getTotalDamage(demonHighPiercing)} + {getTotalDamage(airPiercing)} + + + + + + + + + + + + + + +
+ Morale
+
+
+
+ + + {getTotalDamage(vehLowPiercing)} + {getTotalDamage(vehMedPiercing)} + {getTotalDamage(vehHighPiercing)} + {getTotalDamage(livingMetalPiercing)} + {getTotalDamage(titanPiercing)} + {getTotalDamage(buildingLowPiercing)} + {getTotalDamage(buildingMedPiercing)} + {getTotalDamage(buildingHighPiercing)} + {getTotalDamage(buildingSuperPiercing)} + {getMoraleDamage()} + + +
: + + + + + + + + + + + + + + + + + + + +
+ Morale
+
+
+
+ + + {getTotalDamage(infLowPiercing)} + {getTotalDamage(infMedPiercing)} + {getTotalDamage(infHighPiercing)} + {getTotalDamage(infHeavyMedPiercing)} + {getTotalDamage(infHeavyHighPiercing)} + {getTotalDamage(commanderPiercing)} + {getTotalDamage(demonPiercing)} + {getTotalDamage(demonHighPiercing)} + {getTotalDamage(airPiercing)} + {getTotalDamage(vehLowPiercing)} + {getTotalDamage(vehMedPiercing)} + {getTotalDamage(vehHighPiercing)} + {getTotalDamage(buildingLowPiercing)} + {getTotalDamage(buildingMedPiercing)} + {getTotalDamage(buildingHighPiercing)} + {getMoraleDamage()} + + +
+ } +
+
} + + {/*TODO: spawnedEntityName not parsing correctly, fix it*/} + {ability.spawnedEntityName !== undefined && ability.spawnedEntityName !== null && Spawn {ability.spawnedEntityName}} +
+ {ability.childAbility !== undefined && ability.childAbility !== null && } + {props.isChild !== true && ability.requirements !== undefined && ability.requirements !== null && + + + } + {ability.activation !== "Passive ability" && props.isChild !== true && Hotkey: {ability.hotkey}} +
+ ) + } else return
loading...
; + + + + + + + +} diff --git a/src/classes/ModifiersProvideTable.tsx b/src/classes/ModifiersProvideTable.tsx index f29c0b4..fb4a136 100644 --- a/src/classes/ModifiersProvideTable.tsx +++ b/src/classes/ModifiersProvideTable.tsx @@ -13,7 +13,7 @@ interface IModifiersProvidesTable{ interface IModifiersProvidesResearchTable{ modifiers: IModifier[], - affectedData: IAffectedData, + affectedData: IAffectedData | null, modId: number, race: Irace, } @@ -153,44 +153,45 @@ export function ModifiersProvidesTable (props: IModifiersProvidesResearchTable) let mods = props.modifiers function getTarget(target: String) { - console.log(props.affectedData.affectedUnits.map(au => au.filename)) - var affectedUnit = props.affectedData.affectedUnits.find(au => au.filename.replaceAll('.rgd', '').split(";")[0] === target || au.filename.replaceAll('.rgd', '').split(";")[1] === target); - if(affectedUnit != null) { - return + if(props.affectedData !== null){ + console.log(props.affectedData.affectedUnits.map(au => au.filename)) + var affectedUnit = props.affectedData.affectedUnits.find(au => au.filename.replaceAll('.rgd', '').split(";")[0] === target || au.filename.replaceAll('.rgd', '').split(";")[1] === target); + if(affectedUnit != null) { + return {affectedUnit.name} - } - var affectedSergeant = props.affectedData.affectedSergeants.find(as => as.filename.replaceAll('.rgd', '') === target); - if(affectedSergeant != null) { - return {affectedSergeant.name} at + } + var affectedSergeant = props.affectedData.affectedSergeants.find(as => as.filename.replaceAll('.rgd', '') === target); + if(affectedSergeant != null) { + return {affectedSergeant.name} at {affectedSergeant.unit.name} - } - var affectedBuilding = props.affectedData.affectedBuildings.find(ab => ab.filename.replaceAll('.rgd', '') === target); - if(affectedBuilding != null) { - return + } + var affectedBuilding = props.affectedData.affectedBuildings.find(ab => ab.filename.replaceAll('.rgd', '') === target); + if(affectedBuilding != null) { + return {affectedBuilding.name} - } + } - var affectedWeapon = props.affectedData.affectedWeapons.find(aw => aw.filename.replaceAll('.rgd', '') === target); - if (affectedWeapon != null) { - return {affectedWeapon.name ? affectedWeapon.name : affectedWeapon.filename.replaceAll('_', ' ').replace('.rgd', '')} at { - affectedWeapon.units.map(unit => - + var affectedWeapon = props.affectedData.affectedWeapons.find(aw => aw.filename.replaceAll('.rgd', '') === target); + if (affectedWeapon != null) { + return {affectedWeapon.name ? affectedWeapon.name : affectedWeapon.filename.replaceAll('_', ' ').replace('.rgd', '')} at { + affectedWeapon.units.map(unit => + {unit.name} - ) + ) } - { - affectedWeapon.sergeants.map(affectedSergeant => + { + affectedWeapon.sergeants.map(affectedSergeant => {affectedSergeant.name} at {affectedSergeant.unit.name} - ) - } - { - affectedWeapon.buildings.map(affectedBuilding => - + ) + } + { + affectedWeapon.buildings.map(affectedBuilding => + {affectedBuilding.name} - ) - } + ) + } + } } - return {target}; } @@ -224,7 +225,9 @@ export function ModifiersProvidesTable (props: IModifiersProvidesResearchTable) > {getTarget(m.target)} {getModName(m.reference)} - {getModIcon(m.reference)} {getChangeDescription(m.usageType, m.value)} + {getModIcon(m.reference)} {getChangeDescription(m.usageType, m.value)} + {m.maxLifeTime !== undefined && m.maxLifeTime > 0 && {m.maxLifeTime}s + }{m.exclusive ? " does not stuck" : " does stuck"} )} @@ -235,7 +238,7 @@ export function ModifiersProvidesTable (props: IModifiersProvidesResearchTable) export function getIcon(icon?: string): string{ if(icon !== null && icon !== undefined){ return IconUrl + icon.replaceAll('\\', '/') - } else return '/images/shakal.png' + } else return '/images/NoImg.gif' } diff --git a/src/classes/Sergeant.tsx b/src/classes/Sergeant.tsx index c511e78..542cec5 100644 --- a/src/classes/Sergeant.tsx +++ b/src/classes/Sergeant.tsx @@ -9,6 +9,8 @@ import {IMod} from "../types/Imod"; import {renderAffectedResearches} from "./building/Research"; import {Irace} from "../types/Irace"; import Required from "./Required"; +import {ModifiersProvidesTable} from "./ModifiersProvideTable"; +import Ability from "./Ability"; export interface SergeantProps { @@ -111,6 +113,9 @@ const Sergeant = (props: SergeantProps) => { > Morale + {sergeant.moraleIncomeMax && +{sergeant.moraleIncomeMax} } + {sergeant.moraleRate && + {sergeant.moraleRate}/s } -{sergeant.moraleDeathPenalty} @@ -136,6 +141,16 @@ const Sergeant = (props: SergeantProps) => { } + {sergeant.modifiers.length > 0 && +

Affected on

+ +
} + {sergeant.abilities.length > 0 && +

Abilities

+ {sergeant.abilities.map(a => + + )} +
} {[...mapWithUnitWeapons.keys()].sort(function (a, b) { @@ -146,7 +161,7 @@ const Sergeant = (props: SergeantProps) => { {renderAffectedResearches(sergeant.affectedResearches, props.mod.id, props.race.id)} - {sergeant.filename} + Hotkey: {sergeant.hotkey} ) }; diff --git a/src/classes/WeaponFull.tsx b/src/classes/WeaponFull.tsx index de1983d..f34f083 100644 --- a/src/classes/WeaponFull.tsx +++ b/src/classes/WeaponFull.tsx @@ -21,6 +21,7 @@ import {IMod} from "../types/Imod"; import {Irace} from "../types/Irace"; import {IRaceUnits} from "../types/IUnitShort"; import {IRaceBuildings} from "../types/IBuildingShort"; +import {ModifiersProvidesTable} from "./ModifiersProvideTable"; interface IWeaponFull { currentTable: string; @@ -407,8 +408,12 @@ export default function WeaponFull(props: {weaponId: number, isDefault: Boolean, } - {weapon.filename} + + {weapon.modifiers.length > 0 && +

Modifiers

+ +
} {weapon.requirements !== null && !props.isDefault && props.haveReinforceMenu && @@ -417,6 +422,7 @@ export default function WeaponFull(props: {weaponId: number, isDefault: Boolean, {renderAffectedResearches(weapon.affectedResearches, props.mod.id, props.race.id)} + {!props.isDefault && props.haveReinforceMenu && Hotkey: {weapon.hotkey}} ) } else return
loading...
; diff --git a/src/classes/building/BuildingAddon.tsx b/src/classes/building/BuildingAddon.tsx index 259cd3c..07072a3 100644 --- a/src/classes/building/BuildingAddon.tsx +++ b/src/classes/building/BuildingAddon.tsx @@ -93,7 +93,7 @@ function BuildingAddon(props: IBuildingAddonProps){ } - {addon.filename} + Hotkey: {addon.hotkey} } diff --git a/src/classes/building/ResearchFull.tsx b/src/classes/building/ResearchFull.tsx index f88ff81..8173b3e 100644 --- a/src/classes/building/ResearchFull.tsx +++ b/src/classes/building/ResearchFull.tsx @@ -107,6 +107,7 @@ function ResearchFull(props: { id: number, building: IBuilding }){ } + Hotkey: {research.hotkey} } else return
loading...
} diff --git a/src/core/api.js b/src/core/api.js index 14b5834..292f2cf 100644 --- a/src/core/api.js +++ b/src/core/api.js @@ -1,6 +1,7 @@ export const UserUrl = process.env.REACT_APP_HOST_URL + '/api/v1/user'; export const WeaponUrl = process.env.REACT_APP_HOST_URL + '/api/v1/weapon'; +export const AbilityUrl = process.env.REACT_APP_HOST_URL + '/api/v1/ability'; export const ResearchUrl = process.env.REACT_APP_HOST_URL + '/api/v1/research'; export const AvailableMods = process.env.REACT_APP_HOST_URL + '/api/v1/mods'; export const AvailableRacesPart = process.env.REACT_APP_HOST_URL + '/api/v1/races'; diff --git a/src/css/Unit.css b/src/css/Unit.css index 4b2aae1..6a6198a 100644 --- a/src/css/Unit.css +++ b/src/css/Unit.css @@ -16,6 +16,11 @@ width: 40px; } +.abilityIcon{ + padding: 0px; + width: 40px; +} + .unitHeader{ margin-left: 15px; } @@ -30,6 +35,6 @@ } -.rgdFrom{ - font-size: 11px; +.hotkey{ + font-size: 12px; } \ No newline at end of file diff --git a/src/pages/BuildingPage.tsx b/src/pages/BuildingPage.tsx index 215d922..eea1603 100644 --- a/src/pages/BuildingPage.tsx +++ b/src/pages/BuildingPage.tsx @@ -29,6 +29,7 @@ import {IUnitShort} from "../types/IUnitShort"; import Research, {renderAffectedResearches} from "../classes/building/Research"; import Required from "../classes/Required"; import {ModifiersProvidesTable} from "../classes/ModifiersProvideTable"; +import Ability from "../classes/Ability"; interface UintPageState { building: IBuilding, @@ -191,6 +192,12 @@ function Building(building: IBuilding, mod: IMod) { )} } + {building.abilities.length > 0 && +

Abilities

+ {building.abilities.map(a => + + )} +
} {building.addons.length > 0 &&

Addons

{building.addons.map(b => @@ -212,7 +219,7 @@ function Building(building: IBuilding, mod: IMod) { {renderAffectedResearches(building.affectedResearches, mod.id, building.race.id)}
- {building.filename} + Hotkey: {building.hotkey}
) diff --git a/src/pages/ModsPage.tsx b/src/pages/ModsPage.tsx index b1796fd..adc6063 100644 --- a/src/pages/ModsPage.tsx +++ b/src/pages/ModsPage.tsx @@ -27,6 +27,7 @@ function Mods (mods: IMod[]) {

{modName}

+ {modName == "Unification new races" && } {sameMods.filter((m) => !m.isBeta).map(mod =>
    {mod.version}
)} {sameMods.find((m) => m.isBeta) != null &&
Beta versions:
} diff --git a/src/pages/UnitPage.tsx b/src/pages/UnitPage.tsx index 55798d5..20ceff0 100644 --- a/src/pages/UnitPage.tsx +++ b/src/pages/UnitPage.tsx @@ -27,6 +27,8 @@ import {IMod} from "../types/Imod"; import Vision from "../classes/Vision"; import Required from "../classes/Required"; import {renderAffectedResearches} from "../classes/building/Research"; +import {ModifiersProvidesTable} from "../classes/ModifiersProvideTable"; +import Ability from "../classes/Ability"; interface UintPageState { unit: IUnit, @@ -290,6 +292,18 @@ function Unit(unit: IUnit, mod: IMod) { )} + {unit.modifiers.length > 0 && +

Affected on

+ +
} + + {unit.abilities.length > 0 && +

Abilities

+ {unit.abilities.map(a => + + )} +
} + {[...mapWithUnitWeapons.keys()].sort(function (a, b) { return a - b; @@ -299,7 +313,7 @@ function Unit(unit: IUnit, mod: IMod) { {renderAffectedResearches(unit.affectedResearches, mod.id, unit.race.id)} - {unit.filename} + Hotkey: {unit.hotkey}
) diff --git a/src/types/IAbility.tsx b/src/types/IAbility.tsx new file mode 100644 index 0000000..c10e650 --- /dev/null +++ b/src/types/IAbility.tsx @@ -0,0 +1,56 @@ +import {IModifier} from "./IModifier"; +import {IRequirement} from "./IRequirement"; +import {IArmorType} from "./IArmorType"; +import {IAffectedData} from "./IAffectedData"; + +export interface IAbilityShort { + id: number; + name: string; + fileName: string; + icon: string; + activationType: string; +} + +export interface IAbilityFill { + id?: number; + activationType: string; + modId?: number; + filename?: string; + name?: string; + description?: string; + costRequisition?: number; + costPower?: number; + costFaith?: number; + costSouls?: number; + icon?: string; + uiIndexHint: number; + hotkey?: string; + childAbility?: IAbilityFill; + initialDelayTime?: number; + range?: number; + rechargeTime?: number; + rechargeTimerGlobal?: boolean; + refreshTime?: number; + durationTime?: number; + spawnedEntityName?: string; + radius?: number; + minDamage?: number; + minDamageValue?: number; + maxDamage?: number; + moraleDamage?: number; + throwForceMin?: number; + throwForceMax?: number; + activation?: string; + areaEffect?: string; + areaFilter?: string; + modifiers: IModifier[]; + requirements?: IRequirement; + affectedData: IAffectedData, + targetFilter: IArmorType[]; + piercings: IAbilityPiercing[]; +} + +export interface IAbilityPiercing { + armorType: IArmorType + piercingValue: number +} diff --git a/src/types/IBuilding.tsx b/src/types/IBuilding.tsx index 06c923f..449c81c 100644 --- a/src/types/IBuilding.tsx +++ b/src/types/IBuilding.tsx @@ -4,9 +4,9 @@ import {WeaponHardpoint} from "./IUnit"; import {IUnitShort} from "./IUnitShort"; import {IModifier} from "./IModifier"; import {IRequirement} from "./IRequirement"; -import {IResearch} from "./IResearch"; import {IResearchShort} from "./IResearchShort"; import {IAffectedData} from "./IAffectedData"; +import {IAbilityShort} from "./IAbility"; export interface IBuilding { id: number @@ -36,11 +36,13 @@ export interface IBuilding { modifiers: IModifier[] affectedData: IAffectedData, weapons: WeaponHardpoint[] + abilities: IAbilityShort[] addons: IBuildingAddon[] researches: IResearchShort[] units: IUnitShort[] affectedResearches: IResearchShort[], requirements: IRequirement, + hotkey: string } export interface IBuildingAddon { @@ -58,6 +60,7 @@ export interface IBuildingAddon { addonModifiers: IModifier[]; addonRequirement: IRequirement; icon?: string; + hotkey?: string; } export interface IBuildingAddonShort { diff --git a/src/types/IModifier.tsx b/src/types/IModifier.tsx index 7104072..1ca323d 100644 --- a/src/types/IModifier.tsx +++ b/src/types/IModifier.tsx @@ -5,4 +5,8 @@ export interface IModifier { usageType: string; target: string; value: number; + maxLifeTime: number; + applicationType: string; + probabilityOfApplying: number; + exclusive: boolean; } \ No newline at end of file diff --git a/src/types/IResearch.tsx b/src/types/IResearch.tsx index 3137e4c..7d759de 100644 --- a/src/types/IResearch.tsx +++ b/src/types/IResearch.tsx @@ -18,4 +18,5 @@ export interface IResearch { affectedData: IAffectedData requirements: IRequirement modifiers: IModifier[] + hotkey?: string } \ No newline at end of file diff --git a/src/types/IUnit.tsx b/src/types/IUnit.tsx index 1624755..39d8efd 100644 --- a/src/types/IUnit.tsx +++ b/src/types/IUnit.tsx @@ -2,6 +2,9 @@ import {Irace} from "./Irace"; import {IArmorType} from "./IArmorType"; import {IResearchShort} from "./IResearchShort"; import {IRequirement} from "./IRequirement"; +import {IModifier} from "./IModifier"; +import {IAffectedData} from "./IAffectedData"; +import {IAbilityShort} from "./IAbility"; export interface IUnitResponse { race: string @@ -57,7 +60,11 @@ export interface IUnit { haveReinforceMenu: boolean, sergeants: ISergeant[] weapons: WeaponHardpoint[] + modifiers: IModifier[] + abilities: IAbilityShort[] + affectedData: IAffectedData, affectedResearches: IResearchShort[], + hotkey?: string, } export interface ISergeant { @@ -79,15 +86,21 @@ export interface ISergeant { health: number armour?: number healthRegeneration: number + morale: number moraleDeathPenalty: number + moraleIncomeMax: number + moraleRate: number mass: number upTime: number sightRadius: number detectRadius: number icon: string + modifiers: IModifier[] requirements: IRequirement, weapons: WeaponHardpoint[] + abilities: IAbilityShort[] affectedResearches: IResearchShort[], + hotkey?: string, } @@ -133,8 +146,10 @@ export interface IWeapon { icon: string modId: number requirements: IRequirement + modifiers: IModifier[] weaponArmorPiercing: IWeaponPiercing[] affectedResearches: IResearchShort[], + hotkey?: string, } export interface IWeaponPiercing {