diff --git a/.env b/.env index 2ba519b..98e138b 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -REACT_APP_HOST_URL=http://localhost:8082 \ No newline at end of file +REACT_APP_HOST_URL=http://wiki-backend.dawn-of-war.pro +#REACT_APP_HOST_URL=http://localhost:8082 \ No newline at end of file diff --git a/public/images/Resource_faith.gif b/public/images/Resource_faith.gif new file mode 100644 index 0000000..7a3b8b5 Binary files /dev/null and b/public/images/Resource_faith.gif differ diff --git a/public/images/Resource_souls.gif b/public/images/Resource_souls.gif new file mode 100644 index 0000000..3fa4247 Binary files /dev/null and b/public/images/Resource_souls.gif differ diff --git a/src/Routes.tsx b/src/Routes.tsx index a94c425..4a25525 100644 --- a/src/Routes.tsx +++ b/src/Routes.tsx @@ -3,6 +3,7 @@ import ModsPage from "./pages/ModsPage"; import ModPage from "./pages/ModPage"; import RacePageFast from "./pages/RacePageFast"; import UnitPage from "./pages/UnitPage"; +import BuildingPage from "./pages/BuildingPage"; export const MyRoutes = () => { @@ -13,6 +14,7 @@ export const MyRoutes = () => { }/> }/> }/> + }/> ) diff --git a/src/classes/Sergeant.tsx b/src/classes/Sergeant.tsx index 0bd2db9..911bc4a 100644 --- a/src/classes/Sergeant.tsx +++ b/src/classes/Sergeant.tsx @@ -60,13 +60,19 @@ const Sergeant = (props: SergeantProps) => { {sergeant.buildCostRequisition > 0 &&    - {sergeant.buildCostRequisition}} + {sergeant.buildCostRequisition.toFixed(0)}} {sergeant.buildCostPower > 0 &&    - {sergeant.buildCostPower}} + {sergeant.buildCostPower.toFixed(0)}} {(sergeant.buildCostPopulation !== undefined && sergeant.buildCostPopulation > 0) &&    - {sergeant.buildCostPopulation}} + {sergeant.buildCostPopulation.toFixed(0)}} + {(sergeant.buildCostFaith !== undefined && sergeant.buildCostFaith > 0) &&    + {sergeant.buildCostFaith}} + {(sergeant.buildCostSouls !== undefined && sergeant.buildCostSouls > 0) &&    + {sergeant.buildCostSouls.toFixed(0)}} {(sergeant.buildCostTime !== undefined && sergeant.buildCostTime > 0) &&    {sergeant.buildCostTime}s} diff --git a/src/classes/UnitsTable.tsx b/src/classes/UnitsTable.tsx index 0cf87af..fc9761a 100644 --- a/src/classes/UnitsTable.tsx +++ b/src/classes/UnitsTable.tsx @@ -1,18 +1,21 @@ import React, {useEffect, useState} from "react"; -import {AvailableUnits} from "../core/api"; +import {AvailableBuildings, AvailableUnits} from "../core/api"; import {Grid2, Table, TableBody, TableCell, TableContainer, TableHead, TableRow} from "@mui/material"; import {NavLink} from "react-router-dom"; import {IRaceUnits, IUnitShort} from "../types/IUnitShort"; +import {IBuildingShort, IRaceBuildings} from "../types/IBuildingShort"; interface IUnitsTable { - racesUnits: IRaceUnits[]; + racesUnits: IRaceUnits[] + racesBuildings: IRaceBuildings[] } export default function UnitsTable(prop: {modId: number}) { const [unitsTable, setUnitsTable] = useState({ - racesUnits: [] + racesUnits: [], + racesBuildings: [] }); @@ -22,13 +25,25 @@ export default function UnitsTable(prop: {modId: number}) {
} + function getBuildingRef(modId: number, raceId: string, building: IBuildingShort) { + return + {building.name} +
+ } + useEffect(() => { - fetch(AvailableUnits + "/mod/" + prop.modId) + + fetch(AvailableBuildings + "/mod/" + prop.modId) .then(res => res.json()) - .then((res: IRaceUnits[]) => { - setUnitsTable({ - racesUnits : res - }); + .then((resBuildings: IRaceBuildings[]) => { + fetch(AvailableUnits + "/mod/" + prop.modId) + .then(res => res.json()) + .then((res: IRaceUnits[]) => { + setUnitsTable({ + racesUnits : res, + racesBuildings: resBuildings + }); + }) }) }, []); @@ -77,7 +92,7 @@ export default function UnitsTable(prop: {modId: number}) { ) } - function generateRaceUnitTable(racesUnitsPart: IRaceUnits[]){ + function generateRaceUnitTable(racesUnitsPart: IRaceUnits[], racesBuildings: IRaceBuildings[]){ return ( { @@ -91,7 +106,7 @@ export default function UnitsTable(prop: {modId: number}) { {racesUnitsPart.map(raceUnits => - {getUnitsRef(raceUnits.infantry, raceUnits.race.id)} + {getUnitsRef(raceUnits.infantry.concat(raceUnits.support), raceUnits.race.id)} ) } @@ -103,9 +118,9 @@ export default function UnitsTable(prop: {modId: number}) { } - {racesUnitsPart.map(raceUnits => + {racesBuildings.map(raceBuilding => - {getUnitsRef(raceUnits.support, raceUnits.race.id)} + {raceBuilding.buildings.map(building => getBuildingRef(prop.modId, raceBuilding.race.id, building))} ) } @@ -114,10 +129,20 @@ export default function UnitsTable(prop: {modId: number}) { ) } - function generateRaceUnitTables(racesUnits: IRaceUnits[], raceCount: number){ + function generateRaceUnitTables(racesUnits: IRaceUnits[], racesBuildings: IRaceBuildings[], raceCount: number){ var elements: JSX.Element[] = [] + racesBuildings = racesBuildings.reverse() for(let i = 0; i < racesUnits.length;i = i + raceCount){ - elements.push(generateRaceUnitTable(racesUnits.slice(i, i + raceCount))) + var unitsThisTable = racesUnits.slice(i, i + raceCount) + var buildingsThisTable: IRaceBuildings[] = [] + unitsThisTable.forEach(ut => { + var buildings = racesBuildings.find(rb => rb.race.id === ut.race.id) + if (buildings != null) { + buildingsThisTable.push(buildings) + } + }) + + elements.push(generateRaceUnitTable(unitsThisTable, buildingsThisTable)) } return elements } @@ -126,7 +151,7 @@ export default function UnitsTable(prop: {modId: number}) { return ( - {generateRaceUnitTables(unitsTable.racesUnits, 9)} + {generateRaceUnitTables(unitsTable.racesUnits, unitsTable.racesBuildings, 5)} {unitsTable.racesUnits.map(raceUnits =>

{ getPiercingK(armorType: string): number { - const weaponPiercing = this.props.weapon.weaponPiercings.find((p) => p.armorType.name === armorType) - return (typeof weaponPiercing !== "undefined" ? weaponPiercing.piercingValue : 10 ) / 100 + const weaponPiercing = this.props.weapon.weaponArmorPiercing.find((p) => p.armorType.name === armorType) + return (typeof weaponPiercing !== "undefined" ? weaponPiercing.piercingValue : 10) / 100 } - handleChange = (e: React.MouseEvent, selectedDamageTable: String | null) => { + handleChange = (e: React.MouseEvent, selectedDamageTable: String | null) => { this.setState({ currentTable: selectedDamageTable }); } - render() { const weapon = this.props.weapon - const dpsK = (this.state.currentTable == "dps") ? weapon.accuracy * (1/(weapon.reloadTime - (weapon.reloadTime % 0.125))) : 1 + const dpsK = (this.state.currentTable == "dps") ? weapon.accuracy * (1 / (weapon.reloadTime - (weapon.reloadTime % 0.125))) : 1 const infLowPiercing = this.getPiercingK(ArmorTypeNames.InfantryLow) const infMedPiercing = this.getPiercingK(ArmorTypeNames.InfantryMedium) @@ -83,16 +87,16 @@ class Weapon extends React.Component { const getTotalDamage = (damagePiercing: number, isAir: boolean = false) => { - if(!isAir && !weapon.canAttackGround && !weapon.isMeleeWeapon) return "" - if(isAir && !weapon.canAttackAir) return "" + if (!isAir && !weapon.canAttackGround && !weapon.isMeleeWeapon) return "" + if (isAir && !weapon.canAttackAir) return "" var minDamage = damagePiercing * weapon.minDamage var maxDamage = damagePiercing * weapon.maxDamage - if(minDamage < weapon.minDamageValue){ + if (minDamage < weapon.minDamageValue) { minDamage = weapon.minDamageValue } - if(maxDamage < weapon.minDamageValue){ + if (maxDamage < weapon.minDamageValue) { maxDamage = weapon.minDamageValue } @@ -106,7 +110,7 @@ class Weapon extends React.Component { } - const StyledTableCell = styled(TableCell)(({ theme }) => ({ + const StyledTableCell = styled(TableCell)(({theme}) => ({ [`&.${tableCellClasses.head}`]: { backgroundColor: "rgb(234, 234, 234)", color: theme.palette.common.white, @@ -119,162 +123,213 @@ class Weapon extends React.Component { })); return ( -
-

{ weapon.name ? weapon.name : this.humanReadableName(weapon.filename)}

- +
+ } + aria-controls="panel1-content" + id="panel1-header" + > + {!this.props.isDefault && weapon.icon && weapon.haveEquipButton ? + : ( + weapon.isMeleeWeapon ? + : + + )} {weapon.name ? weapon.name : this.humanReadableName(weapon.filename)} + + + + +
+ {this.props.isDefault ? "Default weapon" : weapon.description} +
+
- - -

- - - Base damage - {weapon.minDamage} {weapon.maxDamage !== weapon.minDamage && -weapon.maxDamage} - - - - Accuracy - {weapon.accuracy.toFixed(2)} - - - - Accuracy moving - {weapon.setupTime === 0 ? (weapon.accuracy - weapon.accuracyReductionMoving).toFixed(2) : "-"} - - - - Reload time - {weapon.reloadTime} - - - - Max range - {weapon.maxRange ? (weapon.maxRange) : "-"} - - - - Setup time - {weapon.setupTime != 0 ? (weapon.setupTime).toFixed(2) : "-"} - - - {(weapon.costRequisition > 0 || weapon.costPower > 0) && + + +
+ {/*Damage*/} + + + Base damage + {weapon.minDamage} {weapon.maxDamage !== weapon.minDamage && -weapon.maxDamage} + + + + Accuracy + {weapon.accuracy.toFixed(3).replace(/[,.]?0+$/, '')} + + + + Accuracy moving + {weapon.setupTime === 0 && weapon.accuracy - weapon.accuracyReductionMoving > 0 ? (weapon.accuracy - weapon.accuracyReductionMoving).toFixed(3).replace(/[,.]?0+$/, '') : "-"} + + + + +
+
+ + + + + + + Reload time + {weapon.reloadTime} + + + + Range + {weapon.maxRange ? (weapon.maxRange) : "-"} {weapon.minRange ? "(min " + (weapon.minRange) + ")" : ""} + + + + Damage radius + {weapon.damageRadius ? (weapon.damageRadius) : "-"} + + + + +
+
+
+ + + + Cost + {(weapon.costRequisition > 0 || weapon.costPower > 0) ? + + {weapon.costRequisition > 0 && +    + {weapon.costRequisition.toFixed(0)}} + {weapon.costPower > 0 && +    + {weapon.costPower.toFixed(0)}} + : - + } + + + Setup time - {weapon.costRequisition > 0 &&    - {weapon.costRequisition}} - {weapon.costPower > 0 &&    - {weapon.costPower}} + scope="row">{weapon.setupTime != 0 ? (weapon.setupTime).toFixed(3).replace(/[,.]?0+$/, '') : "-"} - } - -
-
+ + Throw force + {weapon.throwForceMin != 0 ? weapon.throwForceMin + " - " + weapon.throwForceMax : "-"} + + + + + +
+ + + + Dps + One hit average damage + + + + + + + + + + + + + + + + + + + + + + + + + + {getTotalDamage(infLowPiercing)} + {getTotalDamage(infMedPiercing)} + {getTotalDamage(infHighPiercing)} + {getTotalDamage(infHeavyMedPiercing)} + {getTotalDamage(infHeavyHighPiercing)} + {getTotalDamage(commanderPiercing)} + {getTotalDamage(demonPiercing)} + {getTotalDamage(demonHighPiercing)} + {getTotalDamage(airPiercing, true)} + {getTotalDamage(vehLowPiercing)} + {getTotalDamage(vehMedPiercing)} + {getTotalDamage(vehHighPiercing)} + {getTotalDamage(buildingLowPiercing)} + {getTotalDamage(buildingMedPiercing)} + {getTotalDamage(buildingHighPiercing)} + {getMoraleDamage()} + + +
+
+ {weapon.filename} +
- -
- {!this.props.isDefault && weapon.icon ? : ( - weapon.isMeleeWeapon ? - : - - ) }
- {this.props.isDefault ? "Default weapon" : weapon.description} -
-
- - - Dps - One hit average damage - - - - - - - - - - - - - - - - - - - - - - - - - - {getTotalDamage(infLowPiercing)} - {getTotalDamage(infMedPiercing)} - {getTotalDamage(infHighPiercing)} - {getTotalDamage(infHeavyMedPiercing)} - {getTotalDamage(infHeavyHighPiercing)} - {getTotalDamage(commanderPiercing)} - {getTotalDamage(demonPiercing)} - {getTotalDamage(demonHighPiercing)} - {getTotalDamage(airPiercing, true)} - {getTotalDamage(vehLowPiercing)} - {getTotalDamage(vehMedPiercing)} - {getTotalDamage(vehHighPiercing)} - {getTotalDamage(buildingLowPiercing)} - {getTotalDamage(buildingMedPiercing)} - {getTotalDamage(buildingHighPiercing)} - {getMoraleDamage()} - - -
-
- {weapon.filename} -
- - + + ); } } diff --git a/src/core/api.js b/src/core/api.js index ade7811..ff581dd 100644 --- a/src/core/api.js +++ b/src/core/api.js @@ -3,4 +3,5 @@ export const UserUrl = process.env.REACT_APP_HOST_URL + '/api/v1/user'; export const AvailableMods = process.env.REACT_APP_HOST_URL + '/api/v1/mods'; export const AvailableRacesPart = process.env.REACT_APP_HOST_URL + '/api/v1/races'; export const AvailableUnits = process.env.REACT_APP_HOST_URL + '/api/v1/units'; +export const AvailableBuildings = process.env.REACT_APP_HOST_URL + '/api/v1/buildings'; export const IconUrl = process.env.REACT_APP_HOST_URL + '/api/v1/grapics/icon/'; diff --git a/src/css/Unit.css b/src/css/Unit.css index 120c295..ecf8391 100644 --- a/src/css/Unit.css +++ b/src/css/Unit.css @@ -2,6 +2,10 @@ width: 50px; } +.weaponIcon{ + width: 40px; +} + .sergeantIcon{ padding: 0px; width: 40px; diff --git a/src/pages/BuildingPage.tsx b/src/pages/BuildingPage.tsx new file mode 100644 index 0000000..ccff72d --- /dev/null +++ b/src/pages/BuildingPage.tsx @@ -0,0 +1,173 @@ +import {AvailableBuildings, AvailableMods, AvailableUnits, IconUrl} from "../core/api"; +import React from "react"; +import {withRouter} from "../core/withrouter"; +import {IWeapon} from "../types/IUnit"; +import '../css/Unit.css' +import {Button, Grid2, Paper, Table, TableBody, TableCell, TableContainer, TableRow} from "@mui/material"; +import {ArrowBack} from "@mui/icons-material"; +import ArmorType from "../classes/ArmorType"; +import AvTimerOutlinedIcon from '@mui/icons-material/AvTimer'; +import WeaponSlot from "../classes/WeaponSlot"; +import UnitsTable from "../classes/UnitsTable"; +import {IMod} from "../types/Imod"; +import {IBuilding} from "../types/IBuilding"; + +interface UintPageState { + building: IBuilding, + mod: IMod, +} + + +function Building(building: IBuilding, mod: IMod) { + + const detect = building.detectRadius > 0 ?   {building.detectRadius} : +   + + let mapBuildingWeapons: Map> = new Map(); + + building.weapons.forEach(weapon => { + const weaponMap = mapBuildingWeapons.get(weapon.hardpoint) + if (weaponMap == null) { + const weaponMap = new Map() + weaponMap.set(weapon.hardpointOrder, weapon.weapon) + mapBuildingWeapons.set(weapon.hardpoint, weaponMap) + } else { + weaponMap.set(weapon.hardpointOrder, weapon.weapon) + } + }) + + + return ( +
+

{mod.name} ({mod.version})

+

{building.icon && + } {building.name}

+ + + + + + + + Cost + + {building.buildCostRequisition > 0 && +    + {building.buildCostRequisition.toFixed(0)}} + {building.buildCostPower > 0 &&    + {building.buildCostPower.toFixed(0)}} + {(building.buildCostPopulation !== undefined && building.buildCostPopulation > 0) && +    + {building.buildCostPopulation.toFixed(0)}} + {(building.buildCostFaith !== undefined && building.buildCostFaith > 0) && +    + {building.buildCostFaith}} + {(building.buildCostSouls !== undefined && building.buildCostSouls > 0) && +    + {building.buildCostSouls.toFixed(0)}} + {(building.buildCostTime !== undefined && building.buildCostTime > 0) && +    + {building.buildCostTime}s} + + + + Armor type + + + + + + Health + +   + {building.health} {building.healthRegeneration > 0 && + +{building.healthRegeneration}/s} + + + + Detect + + {detect} + + + + Repair max + + {building.repairMax} + + + +
+
+
+ +
+ {building.description} +
+
+ + {[...mapBuildingWeapons.keys()].sort(function (a, b) { + return a - b; + }).map(h => )} + +
+ {building.filename} +
+ +
) +} + + +class BuildingPage extends React.Component { + + async componentDidMount() { + const buildingResponse = await fetch(AvailableBuildings + "/" + this.props.match.params.buildingId); + const buildingData: IBuilding = await buildingResponse.json(); + + this.setState({ + building: buildingData + }); + + const responseMod = await fetch(AvailableMods + "/" + this.props.match.params.modId); + const modData: IMod = await responseMod.json(); + + this.setState({ + mod: modData + }); + } + + render() { + + if (this.state != null && this.state.building != null && this.state.mod != null) { + const backRef = "/mod/" + this.props.match.params.modId + "/race/" + this.props.match.params.raceId + + return
+ {Building(this.state.building, this.state.mod)} +
; + } else { + return "loading..."; + } + } +} + +export default withRouter(BuildingPage); \ No newline at end of file diff --git a/src/pages/RacePageFast.tsx b/src/pages/RacePageFast.tsx index 64e2352..13e77ef 100644 --- a/src/pages/RacePageFast.tsx +++ b/src/pages/RacePageFast.tsx @@ -1,4 +1,4 @@ -import {AvailableMods, AvailableRacesPart, AvailableUnits, IconUrl} from "../core/api"; +import {AvailableBuildings, AvailableMods, AvailableRacesPart, AvailableUnits, IconUrl} from "../core/api"; import React, {useState} from "react"; import {withRouter} from "../core/withrouter"; import {IMod} from "../types/Imod"; @@ -30,6 +30,7 @@ import {ArrowBack, ArrowDropDown} from "@mui/icons-material"; import ArmorType from "../classes/ArmorType"; import Weapon from "../classes/Weapon"; import {IRaceUnits, IUnitShort} from "../types/IUnitShort"; +import {IBuildingShort, IRaceBuildings} from "../types/IBuildingShort"; interface RacePageState { mod: IMod, @@ -49,14 +50,26 @@ function Unit (unit: IUnitShort, modId: number, raceId: String) { ) } -interface UnitsProps{ - raceId: string, - modId: number, -} +function Building (building: IBuildingShort, modId: number, raceId: String) { + + return ( + {building.icon && } + {building.name} + {building.canDetect &&  } + + ) + } + + interface UnitsProps{ + raceId: string, + modId: number, + } interface UnitsState { selectedUnits: String | null, units: IRaceUnits | null, + buildings: IRaceBuildings | null, } class Units extends React.Component { @@ -64,26 +77,28 @@ class Units extends React.Component { constructor(props: any) { super(props); - let url = AvailableUnits + "/" + this.props.modId + "/" + this.props.raceId; + let urlUnits = AvailableUnits + "/" + this.props.modId + "/" + this.props.raceId; - fetch(url) + fetch(urlUnits) .then(res => res.json()) .then((res: IRaceUnits) => { this.setState({ units: res, }) }) + + let urlBuildings = AvailableBuildings + "/" + this.props.modId + "/" + this.props.raceId; + + fetch(urlBuildings) + .then(res => res.json()) + .then((res: IRaceBuildings) => { + this.setState({ + buildings: res, + }) + }) } - handleChange = (e: React.MouseEvent, newUnitType: String | null) => { - this.setState({ - selectedUnits: newUnitType - }); - - } - - render () { @@ -91,8 +106,7 @@ class Units extends React.Component { return (
- - {this.state.units != null ? + {this.state.units != null && this.state.buildings != null ?

Infantry

@@ -110,6 +124,12 @@ class Units extends React.Component { {this.state.units.support.map(unit => Unit(unit, this.props.modId, this.props.raceId))}
+ +

Buildings

+ + {this.state.buildings.buildings.map(building => Building(building, this.props.modId, this.props.raceId))} + +
: "Loading"} diff --git a/src/pages/UnitPage.tsx b/src/pages/UnitPage.tsx index a824f65..dcbcb77 100644 --- a/src/pages/UnitPage.tsx +++ b/src/pages/UnitPage.tsx @@ -95,19 +95,27 @@ function Unit(unit: IUnit, mod: IMod) { - cost + Cost {unit.buildCostRequisition > 0 &&    - {unit.buildCostRequisition}} + {unit.buildCostRequisition.toFixed(0)}} {unit.buildCostPower > 0 &&    - {unit.buildCostPower}} + {unit.buildCostPower.toFixed(0)}} {(unit.buildCostPopulation !== undefined && unit.buildCostPopulation > 0) &&    - {unit.buildCostPopulation}} + {unit.buildCostPopulation.toFixed(0)}} + {(unit.buildCostFaith !== undefined && unit.buildCostFaith > 0) && +    + {unit.buildCostFaith}} + {(unit.buildCostSouls !== undefined && unit.buildCostSouls > 0) && +    + {unit.buildCostSouls.toFixed(0)}} {unit.capInfantry > 0 &&    @@ -121,22 +129,30 @@ function Unit(unit: IUnit, mod: IMod) { {unit.buildCostTime}s} - {(unit?.reinforceTime !== 0 && unit.reinforceTime !== null) && + {(unit?.reinforceTime !== 0 && unit.reinforceTime !== null && unit.squadMaxSize > 1) && - reinforce cost + Reinforce cost {unit.reinforceCostRequisition && unit.reinforceCostRequisition > 0 &&    - {unit.reinforceCostRequisition}} + {unit.reinforceCostRequisition.toFixed(0)}} {unit.reinforceCostPower !== undefined && unit.reinforceCostPower > 0 &&    - {unit.reinforceCostPower}} + {unit.reinforceCostPower.toFixed(0)}} {(unit.reinforceCostPopulation !== undefined && unit.reinforceCostPopulation > 0) &&    - {unit.reinforceCostPopulation}} + {unit.reinforceCostPopulation.toFixed(0)}} + {(unit.reinforceCostFaith !== undefined && unit.reinforceCostFaith > 0) && +    + {unit.reinforceCostFaith}} + {(unit.reinforceCostSouls !== undefined && unit.reinforceCostSouls > 0) && +    + {unit.reinforceCostSouls.toFixed(0)}} {(unit.reinforceTime !== undefined && unit.reinforceTime > 0) &&    @@ -144,10 +160,18 @@ function Unit(unit: IUnit, mod: IMod) { } + {unit.squadMaxSize > 1 && + + Squad size + + {unit.squadStartSize} / {unit.squadMaxSize} + + + } - armor type + Armor type @@ -155,7 +179,7 @@ function Unit(unit: IUnit, mod: IMod) { - health + Health   @@ -166,7 +190,7 @@ function Unit(unit: IUnit, mod: IMod) { - move speed + Move speed {unit.moveSpeed} @@ -174,7 +198,7 @@ function Unit(unit: IUnit, mod: IMod) { - morale + Morale {morale} @@ -182,7 +206,15 @@ function Unit(unit: IUnit, mod: IMod) { - detect + Mass + + {unit.mass} + + + + Detect {detect} diff --git a/src/types/IBuilding.tsx b/src/types/IBuilding.tsx new file mode 100644 index 0000000..87e1307 --- /dev/null +++ b/src/types/IBuilding.tsx @@ -0,0 +1,28 @@ +import {Irace} from "./Irace"; +import {IArmorType} from "./IArmorType"; +import {WeaponHardpoint} from "./IUnit"; + +export interface IBuilding { + id: number + race: Irace + armorType: IArmorType + armorType2?: IArmorType + name: string + filename: string + description: string + buildCostRequisition: number + buildCostPower: number + buildCostPopulation: number + buildCostFaith: number + buildCostSouls: number + buildCostTime: number + health: number + healthRegeneration: number + sightRadius: number + detectRadius: number + repairMax: number + icon: string + modId: number + weapons: WeaponHardpoint[] +} + diff --git a/src/types/IBuildingShort.tsx b/src/types/IBuildingShort.tsx new file mode 100644 index 0000000..f783cc0 --- /dev/null +++ b/src/types/IBuildingShort.tsx @@ -0,0 +1,14 @@ +import {Irace} from "./Irace"; + +export interface IRaceBuildings { + race: Irace + buildings: IBuildingShort[] +} + +export interface IBuildingShort { + name: string + icon: string + id: number + canDetect: boolean + armourTypeName: string +} diff --git a/src/types/IUnit.tsx b/src/types/IUnit.tsx index 7d12a0c..608ddf9 100644 --- a/src/types/IUnit.tsx +++ b/src/types/IUnit.tsx @@ -40,6 +40,7 @@ export interface IUnit { reinforceCostPower?: number reinforceCostPopulation ?: number reinforceCostFaith ?: number + reinforceCostSouls ?: number reinforceTime?: number icon: string modId: number @@ -90,22 +91,25 @@ export interface IWeapon { reloadTime: number setupTime: number accuracyReductionMoving: number + minRange: number maxRange: number minDamage: number maxDamage: number minDamageValue: number moraleDamage: number + damageRadius: number + throwForceMin: number + throwForceMax: number isMeleeWeapon: boolean canAttackAir: boolean canAttackGround: boolean haveEquipButton: boolean icon: string modId: number - weaponPiercings: IWeaponPiercing[] + weaponArmorPiercing: IWeaponPiercing[] } export interface IWeaponPiercing { - id: number armorType: IArmorType piercingValue: number }