@supalosa/chronodivide-bot 0.3.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.template +5 -0
- package/README.md +57 -39
- package/dist/bot/bot.js +27 -37
- package/dist/bot/bot.js.map +1 -1
- package/dist/bot/logic/awareness.js +13 -8
- package/dist/bot/logic/awareness.js.map +1 -1
- package/dist/bot/logic/awarenessImpl.js +132 -0
- package/dist/bot/logic/awarenessImpl.js.map +1 -0
- package/dist/bot/logic/building/ArtilleryUnit.js +2 -29
- package/dist/bot/logic/building/ArtilleryUnit.js.map +1 -0
- package/dist/bot/logic/building/antiAirStaticDefence.js +43 -0
- package/dist/bot/logic/building/antiAirStaticDefence.js.map +1 -0
- package/dist/bot/logic/building/antiGroundStaticDefence.js +8 -5
- package/dist/bot/logic/building/antiGroundStaticDefence.js.map +1 -1
- package/dist/bot/logic/building/basicAirUnit.js +2 -23
- package/dist/bot/logic/building/basicAirUnit.js.map +1 -1
- package/dist/bot/logic/building/basicBuilding.js +3 -2
- package/dist/bot/logic/building/basicBuilding.js.map +1 -1
- package/dist/bot/logic/building/basicGroundUnit.js +2 -43
- package/dist/bot/logic/building/basicGroundUnit.js.map +1 -1
- package/dist/bot/logic/building/building.js +55 -11
- package/dist/bot/logic/building/building.js.map +1 -0
- package/dist/bot/logic/building/buildingRules.js +62 -50
- package/dist/bot/logic/building/buildingRules.js.map +1 -1
- package/dist/bot/logic/building/common.js +19 -0
- package/dist/bot/logic/building/common.js.map +1 -0
- package/dist/bot/logic/building/harvester.js +2 -1
- package/dist/bot/logic/building/harvester.js.map +1 -1
- package/dist/bot/logic/building/queueController.js +73 -41
- package/dist/bot/logic/building/queueController.js.map +1 -1
- package/dist/bot/logic/common/utils.js +35 -0
- package/dist/bot/logic/common/utils.js.map +1 -1
- package/dist/bot/logic/composition/alliedCompositions.js +13 -0
- package/dist/bot/logic/composition/alliedCompositions.js.map +1 -0
- package/dist/bot/logic/composition/common.js +2 -0
- package/dist/bot/logic/composition/common.js.map +1 -0
- package/dist/bot/logic/composition/sovietCompositions.js +13 -0
- package/dist/bot/logic/composition/sovietCompositions.js.map +1 -0
- package/dist/bot/logic/mission/actionBatcher.js +92 -0
- package/dist/bot/logic/mission/actionBatcher.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/combatSquad.js +124 -0
- package/dist/bot/logic/mission/behaviours/combatSquad.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/common.js +58 -0
- package/dist/bot/logic/mission/behaviours/common.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/engineerSquad.js +39 -0
- package/dist/bot/logic/mission/behaviours/engineerSquad.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/expansionSquad.js +46 -0
- package/dist/bot/logic/mission/behaviours/expansionSquad.js.map +1 -0
- package/dist/bot/logic/mission/behaviours/retreatSquad.js +31 -0
- package/dist/bot/logic/mission/behaviours/retreatSquad.js.map +1 -0
- package/{src/bot/logic/squad/behaviours/scoutingSquad.ts → dist/bot/logic/mission/behaviours/scoutingSquad.js} +29 -47
- package/dist/bot/logic/mission/behaviours/scoutingSquad.js.map +1 -0
- package/dist/bot/logic/mission/mission.js +91 -19
- package/dist/bot/logic/mission/mission.js.map +1 -1
- package/dist/bot/logic/mission/missionController.js +262 -21
- package/dist/bot/logic/mission/missionController.js.map +1 -1
- package/dist/bot/logic/mission/missions/attackMission.js +159 -52
- package/dist/bot/logic/mission/missions/attackMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/basicMission.js +13 -0
- package/dist/bot/logic/mission/missions/basicMission.js.map +1 -0
- package/dist/bot/logic/mission/missions/defenceMission.js +43 -28
- package/dist/bot/logic/mission/missions/defenceMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/engineerMission.js +37 -7
- package/dist/bot/logic/mission/missions/engineerMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/expansionMission.js +42 -6
- package/dist/bot/logic/mission/missions/expansionMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/missionBehaviour.js +2 -0
- package/dist/bot/logic/mission/missions/missionBehaviour.js.map +1 -0
- package/dist/bot/logic/mission/missions/retreatMission.js +31 -5
- package/dist/bot/logic/mission/missions/retreatMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/scoutingMission.js +103 -6
- package/dist/bot/logic/mission/missions/scoutingMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/squads/combatSquad.js +116 -0
- package/dist/bot/logic/mission/missions/squads/combatSquad.js.map +1 -0
- package/dist/bot/logic/mission/missions/squads/common.js +58 -0
- package/dist/bot/logic/mission/missions/squads/common.js.map +1 -0
- package/dist/bot/logic/mission/missions/squads/squad.js +2 -0
- package/dist/bot/logic/mission/missions/squads/squad.js.map +1 -0
- package/dist/bot/logic/squad/behaviours/attackSquad.js +63 -56
- package/dist/bot/logic/squad/behaviours/combatSquad.js +19 -18
- package/dist/bot/logic/squad/behaviours/combatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/common.js +2 -19
- package/dist/bot/logic/squad/behaviours/common.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/defenceSquad.js +15 -2
- package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js +17 -21
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +1 -1
- package/dist/bot/logic/squad/squad.js +8 -5
- package/dist/bot/logic/squad/squad.js.map +1 -1
- package/dist/bot/logic/squad/squadBehaviour.js.map +1 -1
- package/dist/bot/logic/squad/squadController.js +3 -2
- package/dist/bot/logic/squad/squadController.js.map +1 -1
- package/dist/bot/logic/threat/threatCalculator.js +5 -5
- package/dist/bot/logic/threat/threatCalculator.js.map +1 -1
- package/dist/exampleBot.js +53 -16
- package/dist/exampleBot.js.map +1 -1
- package/package.json +5 -4
- package/src/bot/bot.ts +38 -53
- package/src/bot/logic/awareness.ts +34 -22
- package/src/bot/logic/building/antiAirStaticDefence.ts +64 -0
- package/src/bot/logic/building/antiGroundStaticDefence.ts +7 -20
- package/src/bot/logic/building/artilleryUnit.ts +2 -28
- package/src/bot/logic/building/basicAirUnit.ts +2 -33
- package/src/bot/logic/building/basicBuilding.ts +8 -6
- package/src/bot/logic/building/basicGroundUnit.ts +2 -46
- package/src/bot/logic/building/buildingRules.ts +73 -57
- package/src/bot/logic/building/common.ts +23 -0
- package/src/bot/logic/building/harvester.ts +2 -1
- package/src/bot/logic/building/queueController.ts +105 -42
- package/src/bot/logic/common/utils.ts +47 -0
- package/src/bot/logic/composition/alliedCompositions.ts +22 -0
- package/src/bot/logic/composition/common.ts +3 -0
- package/src/bot/logic/composition/sovietCompositions.ts +21 -0
- package/src/bot/logic/mission/actionBatcher.ts +124 -0
- package/src/bot/logic/mission/mission.ts +186 -37
- package/src/bot/logic/mission/missionController.ts +340 -31
- package/src/bot/logic/mission/missionFactories.ts +3 -3
- package/src/bot/logic/mission/missions/attackMission.ts +234 -56
- package/src/bot/logic/mission/missions/defenceMission.ts +72 -45
- package/src/bot/logic/mission/missions/engineerMission.ts +67 -15
- package/src/bot/logic/mission/missions/expansionMission.ts +67 -14
- package/src/bot/logic/mission/missions/retreatMission.ts +50 -6
- package/src/bot/logic/mission/missions/scoutingMission.ts +138 -14
- package/src/bot/logic/mission/missions/squads/combatSquad.ts +160 -0
- package/src/bot/logic/{squad/behaviours → mission/missions/squads}/common.ts +14 -20
- package/src/bot/logic/mission/missions/squads/squad.ts +19 -0
- package/src/bot/logic/threat/threat.ts +15 -15
- package/src/bot/logic/threat/threatCalculator.ts +10 -10
- package/src/exampleBot.ts +59 -19
- package/.prettierrc +0 -5
- package/TODO.md +0 -18
- package/dist/bot/logic/building/artilleryUnit.js.map +0 -1
- package/dist/bot/logic/building/massedAntiGroundUnit.js +0 -20
- package/dist/bot/logic/building/queues.js +0 -19
- package/dist/bot/logic/knowledge.js +0 -1
- package/dist/bot/logic/mission/basicMission.js +0 -26
- package/dist/bot/logic/mission/expansionMission.js +0 -32
- package/dist/bot/logic/squad/behaviours/squadExpansion.js +0 -31
- package/dist/bot/logic/squad/behaviours/squadScouters.js +0 -8
- package/rules.ini +0 -23126
- package/src/bot/logic/mission/missions/oneTimeMission.ts +0 -33
- package/src/bot/logic/squad/behaviours/combatSquad.ts +0 -127
- package/src/bot/logic/squad/behaviours/engineerSquad.ts +0 -53
- package/src/bot/logic/squad/behaviours/expansionSquad.ts +0 -59
- package/src/bot/logic/squad/behaviours/retreatSquad.ts +0 -44
- package/src/bot/logic/squad/squad.ts +0 -159
- package/src/bot/logic/squad/squadBehaviour.ts +0 -62
- package/src/bot/logic/squad/squadBehaviours.ts +0 -8
- package/src/bot/logic/squad/squadController.ts +0 -254
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getPointTowardsOtherPoint } from "../map/map.js";
|
|
2
2
|
import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
3
3
|
export class AntiGroundStaticDefence {
|
|
4
|
-
constructor(basePriority, baseAmount,
|
|
4
|
+
constructor(basePriority, baseAmount, groundStrength) {
|
|
5
5
|
this.basePriority = basePriority;
|
|
6
6
|
this.baseAmount = baseAmount;
|
|
7
|
-
this.
|
|
7
|
+
this.groundStrength = groundStrength;
|
|
8
8
|
}
|
|
9
9
|
getPlacementLocation(game, playerData, technoRules) {
|
|
10
10
|
// Prefer front towards enemy.
|
|
@@ -20,17 +20,20 @@ export class AntiGroundStaticDefence {
|
|
|
20
20
|
enemyFacingLocationCandidates.push(getPointTowardsOtherPoint(game, startLocation, enemyPlayer.startLocation, 4, 16, 1.5));
|
|
21
21
|
}
|
|
22
22
|
let selectedLocation = enemyFacingLocationCandidates[Math.floor(game.generateRandom() * enemyFacingLocationCandidates.length)];
|
|
23
|
-
return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, 0);
|
|
23
|
+
return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 0);
|
|
24
24
|
}
|
|
25
25
|
getPriority(game, playerData, technoRules, threatCache) {
|
|
26
26
|
// If the enemy's ground power is increasing we should try to keep up.
|
|
27
27
|
if (threatCache) {
|
|
28
|
-
let denominator = threatCache.totalAvailableAntiGroundFirepower + threatCache.totalDefensivePower + this.
|
|
28
|
+
let denominator = threatCache.totalAvailableAntiGroundFirepower + threatCache.totalDefensivePower + this.groundStrength;
|
|
29
29
|
if (threatCache.totalOffensiveLandThreat > denominator * 1.1) {
|
|
30
30
|
return this.basePriority * (threatCache.totalOffensiveLandThreat / Math.max(1, denominator));
|
|
31
31
|
}
|
|
32
|
+
else {
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
32
35
|
}
|
|
33
|
-
const strengthPerCost = (this.
|
|
36
|
+
const strengthPerCost = (this.groundStrength / technoRules.cost) * 1000;
|
|
34
37
|
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
35
38
|
return this.basePriority * (1.0 - numOwned / this.baseAmount) * strengthPerCost;
|
|
36
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"antiGroundStaticDefence.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/antiGroundStaticDefence.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAmB,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE3G,MAAM,OAAO,uBAAuB;IAChC,YACY,YAAoB,EACpB,UAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"antiGroundStaticDefence.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/antiGroundStaticDefence.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAmB,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE3G,MAAM,OAAO,uBAAuB;IAChC,YACY,YAAoB,EACpB,UAAkB,EAClB,cAAsB;QAFtB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAQ;QAClB,mBAAc,GAAd,cAAc,CAAQ;IAC/B,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,8BAA8B;QAC9B,IAAI,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,6BAA6B,GAAc,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACrC,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE;gBAC/B,SAAS;aACZ;YACD,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACjD,6BAA6B,CAAC,IAAI,CAC9B,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CACxF,CAAC;SACL;QACD,IAAI,gBAAgB,GAChB,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5G,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,sEAAsE;QACtE,IAAI,WAAW,EAAE;YACb,IAAI,WAAW,GACX,WAAW,CAAC,iCAAiC,GAAG,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC;YAC1G,IAAI,WAAW,CAAC,wBAAwB,GAAG,WAAW,GAAG,GAAG,EAAE;gBAC1D,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,WAAW,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;aAChG;iBAAM;gBACH,OAAO,CAAC,CAAC;aACZ;SACJ;QACD,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACxE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC;IACpF,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { GameMath } from "@chronodivide/game-api";
|
|
2
|
-
import { numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
3
1
|
export class BasicAirUnit {
|
|
4
2
|
constructor(basePriority, baseAmount, antiGroundPower = 1, // boolean for now, but will eventually be used in weighting.
|
|
5
3
|
antiAirPower = 0) {
|
|
@@ -12,27 +10,8 @@ export class BasicAirUnit {
|
|
|
12
10
|
return undefined;
|
|
13
11
|
}
|
|
14
12
|
getPriority(game, playerData, technoRules, threatCache) {
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
let priority = 0;
|
|
18
|
-
if (this.antiGroundPower > 0 &&
|
|
19
|
-
threatCache.totalOffensiveLandThreat > threatCache.totalAvailableAntiGroundFirepower) {
|
|
20
|
-
priority +=
|
|
21
|
-
this.basePriority *
|
|
22
|
-
(threatCache.totalOffensiveLandThreat / Math.max(1, threatCache.totalAvailableAntiGroundFirepower));
|
|
23
|
-
}
|
|
24
|
-
if (this.antiAirPower > 0 &&
|
|
25
|
-
threatCache.totalOffensiveAirThreat > threatCache.totalAvailableAntiAirFirepower) {
|
|
26
|
-
priority +=
|
|
27
|
-
this.basePriority *
|
|
28
|
-
(threatCache.totalOffensiveAirThreat / Math.max(1, threatCache.totalAvailableAntiAirFirepower));
|
|
29
|
-
}
|
|
30
|
-
// sqrt so we don't build too much of one unit type.
|
|
31
|
-
priority += Math.min(1.0, Math.max(1, GameMath.sqrt(threatCache.totalAvailableAirPower / Math.max(1, threatCache.totalOffensiveAntiAirThreat))));
|
|
32
|
-
return this.baseAmount * priority;
|
|
33
|
-
}
|
|
34
|
-
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
35
|
-
return this.basePriority * (1.0 - numOwned / this.baseAmount);
|
|
13
|
+
// Units aren't built automatically, but are instead requested by missions.
|
|
14
|
+
return 0;
|
|
36
15
|
}
|
|
37
16
|
getMaxCount(game, playerData, technoRules, threatCache) {
|
|
38
17
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicAirUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/basicAirUnit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"basicAirUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/basicAirUnit.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,YAAY;IACrB,YACY,YAAoB,EACpB,UAAkB,EAClB,kBAA0B,CAAC,EAAE,6DAA6D;IAC1F,eAAuB,CAAC;QAHxB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAY;QAC3B,iBAAY,GAAZ,YAAY,CAAY;IACjC,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,2EAA2E;QAC3E,OAAO,CAAC,CAAC;IACb,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -14,10 +14,11 @@ export class BasicBuilding {
|
|
|
14
14
|
if (numOwned >= (calcMaxCount ?? this.maxNeeded)) {
|
|
15
15
|
return -100;
|
|
16
16
|
}
|
|
17
|
+
const priority = this.basePriority * (1.0 - numOwned / this.maxNeeded);
|
|
17
18
|
if (this.onlyBuildWhenFloatingCreditsAmount && playerData.credits < this.onlyBuildWhenFloatingCreditsAmount) {
|
|
18
|
-
return
|
|
19
|
+
return priority * (playerData.credits / this.onlyBuildWhenFloatingCreditsAmount);
|
|
19
20
|
}
|
|
20
|
-
return
|
|
21
|
+
return priority;
|
|
21
22
|
}
|
|
22
23
|
getMaxCount(game, playerData, technoRules, threatCache) {
|
|
23
24
|
return this.maxNeeded;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicBuilding.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/basicBuilding.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG3G,MAAM,OAAO,aAAa;IACtB,YACc,YAAoB,EACpB,SAAiB,EACjB,kCAA2C;QAF3C,iBAAY,GAAZ,YAAY,CAAQ;QACpB,cAAS,GAAT,SAAS,CAAQ;QACjB,uCAAkC,GAAlC,kCAAkC,CAAS;IACtD,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAChG,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAClF,IAAI,QAAQ,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC;SACf;QAED,IAAI,IAAI,CAAC,kCAAkC,IAAI,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,kCAAkC,EAAE;YACzG,OAAO,
|
|
1
|
+
{"version":3,"file":"basicBuilding.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/basicBuilding.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG3G,MAAM,OAAO,aAAa;IACtB,YACc,YAAoB,EACpB,SAAiB,EACjB,kCAA2C;QAF3C,iBAAY,GAAZ,YAAY,CAAQ;QACpB,cAAS,GAAT,SAAS,CAAQ;QACjB,uCAAkC,GAAlC,kCAAkC,CAAS;IACtD,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAChG,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAClF,IAAI,QAAQ,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC;SACf;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvE,IAAI,IAAI,CAAC,kCAAkC,IAAI,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,kCAAkC,EAAE;YACzG,OAAO,QAAQ,GAAG,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,kCAAkC,CAAC,CAAC;SACpF;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;CACJ"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { GameMath } from "@chronodivide/game-api";
|
|
2
|
-
import { numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
3
1
|
export class BasicGroundUnit {
|
|
4
2
|
constructor(basePriority, baseAmount, antiGroundPower = 1, // boolean for now, but will eventually be used in weighting.
|
|
5
3
|
antiAirPower = 0) {
|
|
@@ -12,47 +10,8 @@ export class BasicGroundUnit {
|
|
|
12
10
|
return undefined;
|
|
13
11
|
}
|
|
14
12
|
getPriority(game, playerData, technoRules, threatCache) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let priority = this.basePriority;
|
|
18
|
-
if (this.antiGroundPower > 0) {
|
|
19
|
-
// If the enemy's power is increasing we should try to keep up.
|
|
20
|
-
if (threatCache.totalOffensiveLandThreat > threatCache.totalAvailableAntiGroundFirepower) {
|
|
21
|
-
priority +=
|
|
22
|
-
this.antiGroundPower *
|
|
23
|
-
this.basePriority *
|
|
24
|
-
(threatCache.totalOffensiveLandThreat /
|
|
25
|
-
Math.max(1, threatCache.totalAvailableAntiGroundFirepower));
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
// But also, if our power dwarfs the enemy, keep pressing the advantage.
|
|
29
|
-
priority +=
|
|
30
|
-
(this.antiGroundPower *
|
|
31
|
-
this.basePriority *
|
|
32
|
-
GameMath.sqrt(threatCache.totalAvailableAntiGroundFirepower /
|
|
33
|
-
Math.max(1, threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat))) /
|
|
34
|
-
(numOwned + 1);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (this.antiAirPower > 0) {
|
|
38
|
-
if (threatCache.totalOffensiveAirThreat > threatCache.totalAvailableAntiAirFirepower) {
|
|
39
|
-
priority +=
|
|
40
|
-
this.antiAirPower *
|
|
41
|
-
this.basePriority *
|
|
42
|
-
(threatCache.totalOffensiveAirThreat / Math.max(1, threatCache.totalAvailableAntiAirFirepower));
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
priority +=
|
|
46
|
-
(this.antiAirPower *
|
|
47
|
-
this.basePriority *
|
|
48
|
-
GameMath.sqrt(threatCache.totalAvailableAntiAirFirepower /
|
|
49
|
-
Math.max(1, threatCache.totalOffensiveAirThreat + threatCache.totalDefensiveThreat))) /
|
|
50
|
-
(numOwned + 1);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return priority;
|
|
54
|
-
}
|
|
55
|
-
return this.basePriority * (1.0 - numOwned / this.baseAmount);
|
|
13
|
+
// Units aren't built automatically, but are instead requested by missions.
|
|
14
|
+
return 0;
|
|
56
15
|
}
|
|
57
16
|
getMaxCount(game, playerData, technoRules, threatCache) {
|
|
58
17
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicGroundUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/basicGroundUnit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"basicGroundUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/basicGroundUnit.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,eAAe;IACxB,YACc,YAAoB,EACpB,UAAkB,EAClB,kBAA0B,CAAC,EAAE,6DAA6D;IAC1F,eAAuB,CAAC;QAHxB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAY;QAC3B,iBAAY,GAAZ,YAAY,CAAY;IACnC,CAAC;IAEJ,oBAAoB,CAChB,IAAa,EACb,UAAsB,EACtB,WAAwB;QAExB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,2EAA2E;QAC3E,OAAO,CAAC,CAAC;IACb,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ObjectType, } from "@chronodivide/game-api";
|
|
1
2
|
import { AntiGroundStaticDefence } from "./antiGroundStaticDefence.js";
|
|
2
3
|
import { ArtilleryUnit } from "./ArtilleryUnit.js";
|
|
3
4
|
import { BasicAirUnit } from "./basicAirUnit.js";
|
|
@@ -12,23 +13,65 @@ export function numBuildingsOwnedOfType(game, playerData, technoRules) {
|
|
|
12
13
|
export function numBuildingsOwnedOfName(game, playerData, name) {
|
|
13
14
|
return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
|
|
14
15
|
}
|
|
16
|
+
function computeAdjacentRect(point, t, adjacent) {
|
|
17
|
+
return {
|
|
18
|
+
x: point.x - adjacent,
|
|
19
|
+
y: point.y - adjacent,
|
|
20
|
+
width: t.width + 2 * adjacent,
|
|
21
|
+
height: t.height + 2 * adjacent
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function getAdjacencyTiles(game, playerData, technoRules) {
|
|
25
|
+
let tiles = [];
|
|
26
|
+
let buildings = game.getVisibleUnits(playerData.name, "self", (tech) => { return tech.type === ObjectType.Building; });
|
|
27
|
+
for (let i in buildings) {
|
|
28
|
+
let building = game.getUnitData(buildings[i]);
|
|
29
|
+
if (building?.rules?.baseNormal) {
|
|
30
|
+
let foundation = building?.foundation;
|
|
31
|
+
let range = computeAdjacentRect({ x: building?.tile.rx, y: building?.tile.ry }, { width: foundation?.width, height: foundation?.height }, technoRules.adjacent);
|
|
32
|
+
let baseTile = game.mapApi.getTile(range.x, range.y);
|
|
33
|
+
if (!baseTile) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
tiles.push(...game.mapApi.getTilesInRect(baseTile, { width: range.width, height: range.height }));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return tiles;
|
|
40
|
+
}
|
|
41
|
+
function getTileDistances(startPoint, tiles) {
|
|
42
|
+
let ret = [];
|
|
43
|
+
for (let i in tiles) {
|
|
44
|
+
let currentTile = tiles[i];
|
|
45
|
+
ret.push({
|
|
46
|
+
tile: currentTile,
|
|
47
|
+
distance: distance(currentTile.rx, currentTile.ry, startPoint.x, startPoint.y)
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
ret.sort((a, b) => {
|
|
51
|
+
return a.distance - b.distance;
|
|
52
|
+
});
|
|
53
|
+
return ret;
|
|
54
|
+
}
|
|
55
|
+
function distance(x1, y1, x2, y2) {
|
|
56
|
+
var dx = x1 - x2;
|
|
57
|
+
var dy = y1 - y2;
|
|
58
|
+
let tmp = dx * dx + dy * dy;
|
|
59
|
+
if (0 === tmp) {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
return Math.sqrt(tmp);
|
|
63
|
+
}
|
|
15
64
|
export function getDefaultPlacementLocation(game, playerData, startPoint, technoRules, space = 1) {
|
|
16
65
|
// Random location, preferably near start location.
|
|
17
|
-
let startX = startPoint.x;
|
|
18
|
-
let startY = startPoint.y;
|
|
19
66
|
let size = game.getBuildingPlacementData(technoRules.name);
|
|
20
67
|
if (!size) {
|
|
21
68
|
return undefined;
|
|
22
69
|
}
|
|
23
|
-
let
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (tile && game.canPlaceBuilding(playerData.name, technoRules.name, tile)) {
|
|
29
|
-
return { rx: xx, ry: yy };
|
|
30
|
-
}
|
|
31
|
-
}
|
|
70
|
+
let tiles = getAdjacencyTiles(game, playerData, technoRules);
|
|
71
|
+
let tileDistances = getTileDistances(startPoint, tiles);
|
|
72
|
+
for (let tileDistance of tileDistances) {
|
|
73
|
+
if (tileDistance.tile && game.canPlaceBuilding(playerData.name, technoRules.name, tileDistance.tile)) {
|
|
74
|
+
return tileDistance.tile;
|
|
32
75
|
}
|
|
33
76
|
}
|
|
34
77
|
return undefined;
|
|
@@ -80,3 +123,4 @@ export const BUILDING_NAME_TO_RULES = new Map([
|
|
|
80
123
|
["ZEP", new BasicAirUnit(5, 1, 5, 1)],
|
|
81
124
|
["V3", new ArtilleryUnit(9, 1)], // V3 Rocket Launcher
|
|
82
125
|
]);
|
|
126
|
+
//# sourceMappingURL=building.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"building.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/building.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GameMath, ObjectType, Vector2, } from "@chronodivide/game-api";
|
|
1
|
+
import { GameMath, LandType, ObjectType, Vector2, } from "@chronodivide/game-api";
|
|
2
2
|
import { AntiGroundStaticDefence } from "./antiGroundStaticDefence.js";
|
|
3
3
|
import { ArtilleryUnit } from "./artilleryUnit.js";
|
|
4
4
|
import { BasicAirUnit } from "./basicAirUnit.js";
|
|
@@ -8,6 +8,7 @@ import { PowerPlant } from "./powerPlant.js";
|
|
|
8
8
|
import { ResourceCollectionBuilding } from "./resourceCollectionBuilding.js";
|
|
9
9
|
import { Harvester } from "./harvester.js";
|
|
10
10
|
import { uniqBy } from "../common/utils.js";
|
|
11
|
+
import { AntiAirStaticDefence } from "./antiAirStaticDefence.js";
|
|
11
12
|
export function numBuildingsOwnedOfType(game, playerData, technoRules) {
|
|
12
13
|
return game.getVisibleUnits(playerData.name, "self", (r) => r == technoRules).length;
|
|
13
14
|
}
|
|
@@ -15,24 +16,26 @@ export function numBuildingsOwnedOfName(game, playerData, name) {
|
|
|
15
16
|
return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
|
-
* Computes a rect 'centered' around a structure of a certain size with additional radius.
|
|
19
|
+
* Computes a rect 'centered' around a structure of a certain size with an additional radius (`adjacent`).
|
|
20
|
+
* The radius is optionally expanded by the size of the new building.
|
|
19
21
|
*
|
|
20
|
-
* This is essentially the
|
|
22
|
+
* This is essentially the candidate placement around a given structure.
|
|
21
23
|
*
|
|
22
24
|
* @param point Top-left location of the inner rect.
|
|
23
25
|
* @param t Size of the inner rect.
|
|
24
|
-
* @param adjacent
|
|
26
|
+
* @param adjacent Amount to expand the building's inner rect by (so buildings must be adjacent by this many tiles)
|
|
27
|
+
* @param newBuildingSize? Size of the new building
|
|
25
28
|
* @returns
|
|
26
29
|
*/
|
|
27
|
-
function computeAdjacentRect(point, t, adjacent) {
|
|
30
|
+
function computeAdjacentRect(point, t, adjacent, newBuildingSize) {
|
|
28
31
|
return {
|
|
29
|
-
x: point.x - adjacent,
|
|
30
|
-
y: point.y - adjacent,
|
|
31
|
-
width: t.width + 2 * adjacent,
|
|
32
|
-
height: t.height + 2 * adjacent,
|
|
32
|
+
x: point.x - adjacent - (newBuildingSize?.width || 0),
|
|
33
|
+
y: point.y - adjacent - (newBuildingSize?.height || 0),
|
|
34
|
+
width: t.width + 2 * adjacent + (newBuildingSize?.width || 0),
|
|
35
|
+
height: t.height + 2 * adjacent + (newBuildingSize?.height || 0),
|
|
33
36
|
};
|
|
34
37
|
}
|
|
35
|
-
export function getAdjacencyTiles(game, playerData, technoRules, minimumSpace) {
|
|
38
|
+
export function getAdjacencyTiles(game, playerData, technoRules, onWater, minimumSpace) {
|
|
36
39
|
const placementRules = game.getBuildingPlacementData(technoRules.name);
|
|
37
40
|
const { width: newBuildingWidth, height: newBuildingHeight } = placementRules.foundation;
|
|
38
41
|
const tiles = [];
|
|
@@ -40,38 +43,42 @@ export function getAdjacencyTiles(game, playerData, technoRules, minimumSpace) {
|
|
|
40
43
|
const removedTiles = new Set();
|
|
41
44
|
for (let buildingId of buildings) {
|
|
42
45
|
const building = game.getUnitData(buildingId);
|
|
43
|
-
if (building?.rules?.baseNormal) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const buildingSize = {
|
|
47
|
-
width: foundation?.width,
|
|
48
|
-
height: foundation?.height,
|
|
49
|
-
};
|
|
50
|
-
const range = computeAdjacentRect(buildingBase, buildingSize, technoRules.adjacent);
|
|
51
|
-
const baseTile = game.mapApi.getTile(range.x, range.y);
|
|
52
|
-
if (!baseTile) {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const adjacentTiles = game.mapApi.getTilesInRect(baseTile, {
|
|
56
|
-
width: range.width,
|
|
57
|
-
height: range.height,
|
|
58
|
-
});
|
|
59
|
-
tiles.push(...adjacentTiles);
|
|
60
|
-
// Prevent placing the new building on tiles that would cause it to overlap with this building.
|
|
61
|
-
const modifiedBase = new Vector2(buildingBase.x - (newBuildingWidth - 1), buildingBase.y - (newBuildingHeight - 1));
|
|
62
|
-
const modifiedSize = {
|
|
63
|
-
width: buildingSize.width + (newBuildingWidth - 1),
|
|
64
|
-
height: buildingSize.height + (newBuildingHeight - 1),
|
|
65
|
-
};
|
|
66
|
-
const blockedRect = computeAdjacentRect(modifiedBase, modifiedSize, minimumSpace);
|
|
67
|
-
const buildingTiles = adjacentTiles.filter((tile) => {
|
|
68
|
-
return (tile.rx >= blockedRect.x &&
|
|
69
|
-
tile.rx < blockedRect.x + blockedRect.width &&
|
|
70
|
-
tile.ry >= blockedRect.y &&
|
|
71
|
-
tile.ry < blockedRect.y + blockedRect.height);
|
|
72
|
-
});
|
|
73
|
-
buildingTiles.forEach((buildingTile) => removedTiles.add(buildingTile.id));
|
|
46
|
+
if (!building?.rules?.baseNormal) {
|
|
47
|
+
// This building is not considered for adjacency checks.
|
|
48
|
+
continue;
|
|
74
49
|
}
|
|
50
|
+
const { foundation, tile } = building;
|
|
51
|
+
const buildingBase = new Vector2(tile.rx, tile.ry);
|
|
52
|
+
const buildingSize = {
|
|
53
|
+
width: foundation?.width,
|
|
54
|
+
height: foundation?.height,
|
|
55
|
+
};
|
|
56
|
+
const range = computeAdjacentRect(buildingBase, buildingSize, technoRules.adjacent, placementRules.foundation);
|
|
57
|
+
const baseTile = game.mapApi.getTile(range.x, range.y);
|
|
58
|
+
if (!baseTile) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const adjacentTiles = game.mapApi
|
|
62
|
+
.getTilesInRect(baseTile, {
|
|
63
|
+
width: range.width,
|
|
64
|
+
height: range.height,
|
|
65
|
+
})
|
|
66
|
+
.filter((tile) => !onWater || tile.landType === LandType.Water);
|
|
67
|
+
tiles.push(...adjacentTiles);
|
|
68
|
+
// Prevent placing the new building on tiles that would cause it to overlap with this building.
|
|
69
|
+
const modifiedBase = new Vector2(buildingBase.x - (newBuildingWidth - 1), buildingBase.y - (newBuildingHeight - 1));
|
|
70
|
+
const modifiedSize = {
|
|
71
|
+
width: buildingSize.width + (newBuildingWidth - 1),
|
|
72
|
+
height: buildingSize.height + (newBuildingHeight - 1),
|
|
73
|
+
};
|
|
74
|
+
const blockedRect = computeAdjacentRect(modifiedBase, modifiedSize, minimumSpace);
|
|
75
|
+
const buildingTiles = adjacentTiles.filter((tile) => {
|
|
76
|
+
return (tile.rx >= blockedRect.x &&
|
|
77
|
+
tile.rx < blockedRect.x + blockedRect.width &&
|
|
78
|
+
tile.ry >= blockedRect.y &&
|
|
79
|
+
tile.ry < blockedRect.y + blockedRect.height);
|
|
80
|
+
});
|
|
81
|
+
buildingTiles.forEach((buildingTile) => removedTiles.add(buildingTile.id));
|
|
75
82
|
}
|
|
76
83
|
// Remove duplicate tiles.
|
|
77
84
|
const withDuplicatesRemoved = uniqBy(tiles, (tile) => tile.id);
|
|
@@ -97,14 +104,14 @@ function distance(x1, y1, x2, y2) {
|
|
|
97
104
|
}
|
|
98
105
|
return GameMath.sqrt(tmp);
|
|
99
106
|
}
|
|
100
|
-
export function getDefaultPlacementLocation(game, playerData,
|
|
101
|
-
//
|
|
107
|
+
export function getDefaultPlacementLocation(game, playerData, idealPoint, technoRules, onWater = false, minSpace = 1) {
|
|
108
|
+
// Closest possible location near `startPoint`.
|
|
102
109
|
const size = game.getBuildingPlacementData(technoRules.name);
|
|
103
110
|
if (!size) {
|
|
104
111
|
return undefined;
|
|
105
112
|
}
|
|
106
|
-
const tiles = getAdjacencyTiles(game, playerData, technoRules, minSpace);
|
|
107
|
-
const tileDistances = getTileDistances(
|
|
113
|
+
const tiles = getAdjacencyTiles(game, playerData, technoRules, onWater, minSpace);
|
|
114
|
+
const tileDistances = getTileDistances(idealPoint, tiles);
|
|
108
115
|
for (let tileDistance of tileDistances) {
|
|
109
116
|
if (tileDistance.tile && game.canPlaceBuilding(playerData.name, technoRules.name, tileDistance.tile)) {
|
|
110
117
|
return tileDistance.tile;
|
|
@@ -112,7 +119,7 @@ export function getDefaultPlacementLocation(game, playerData, startPoint, techno
|
|
|
112
119
|
}
|
|
113
120
|
return undefined;
|
|
114
121
|
}
|
|
115
|
-
export const DEFAULT_BUILDING_PRIORITY =
|
|
122
|
+
export const DEFAULT_BUILDING_PRIORITY = 0;
|
|
116
123
|
export const BUILDING_NAME_TO_RULES = new Map([
|
|
117
124
|
// Allied
|
|
118
125
|
["GAPOWR", new PowerPlant()],
|
|
@@ -120,15 +127,16 @@ export const BUILDING_NAME_TO_RULES = new Map([
|
|
|
120
127
|
["GAWEAP", new BasicBuilding(15, 1)],
|
|
121
128
|
["GAPILE", new BasicBuilding(12, 1)],
|
|
122
129
|
["CMIN", new Harvester(15, 4, 2)],
|
|
123
|
-
["ENGINEER", new BasicBuilding(10, 1, 1000)],
|
|
124
130
|
["GADEPT", new BasicBuilding(1, 1, 10000)],
|
|
125
131
|
["GAAIRC", new BasicBuilding(10, 1, 500)],
|
|
132
|
+
["AMRADR", new BasicBuilding(10, 1, 500)],
|
|
126
133
|
["GATECH", new BasicBuilding(20, 1, 4000)],
|
|
127
134
|
["GAYARD", new BasicBuilding(0, 0, 0)],
|
|
128
135
|
["GAPILL", new AntiGroundStaticDefence(5, 1, 5)],
|
|
129
136
|
["ATESLA", new AntiGroundStaticDefence(5, 1, 10)],
|
|
130
137
|
["GAWALL", new AntiGroundStaticDefence(0, 0, 0)],
|
|
131
|
-
["E1", new BasicGroundUnit(2,
|
|
138
|
+
["E1", new BasicGroundUnit(2, 2, 0.2, 0)],
|
|
139
|
+
["ENGINEER", new BasicGroundUnit(1, 0, 0)],
|
|
132
140
|
["MTNK", new BasicGroundUnit(10, 3, 2, 0)],
|
|
133
141
|
["MGTK", new BasicGroundUnit(10, 1, 2.5, 0)],
|
|
134
142
|
["FV", new BasicGroundUnit(5, 2, 0.5, 1)],
|
|
@@ -143,16 +151,20 @@ export const BUILDING_NAME_TO_RULES = new Map([
|
|
|
143
151
|
["NAWEAP", new BasicBuilding(15, 1)],
|
|
144
152
|
["NAHAND", new BasicBuilding(12, 1)],
|
|
145
153
|
["HARV", new Harvester(15, 4, 2)],
|
|
146
|
-
["SENGINEER", new BasicBuilding(10, 1, 1000)],
|
|
147
154
|
["NADEPT", new BasicBuilding(1, 1, 10000)],
|
|
148
155
|
["NARADR", new BasicBuilding(10, 1, 500)],
|
|
149
156
|
["NANRCT", new PowerPlant()],
|
|
150
157
|
["NAYARD", new BasicBuilding(0, 0, 0)],
|
|
151
158
|
["NATECH", new BasicBuilding(20, 1, 4000)],
|
|
152
159
|
["NALASR", new AntiGroundStaticDefence(5, 1, 5)],
|
|
160
|
+
["NAFLAK", new AntiAirStaticDefence(5, 1, 5)],
|
|
153
161
|
["TESLA", new AntiGroundStaticDefence(5, 1, 10)],
|
|
154
162
|
["NAWALL", new AntiGroundStaticDefence(0, 0, 0)],
|
|
155
|
-
["E2", new BasicGroundUnit(2,
|
|
163
|
+
["E2", new BasicGroundUnit(2, 2, 0.2, 0)],
|
|
164
|
+
["SENGINEER", new BasicGroundUnit(1, 0, 0)],
|
|
165
|
+
["FLAKT", new BasicGroundUnit(2, 2, 0.1, 0.3)],
|
|
166
|
+
["YURI", new BasicGroundUnit(1, 1, 1, 0)],
|
|
167
|
+
["DOG", new BasicGroundUnit(1, 1, 0, 0)],
|
|
156
168
|
["HTNK", new BasicGroundUnit(10, 3, 3, 0)],
|
|
157
169
|
["APOC", new BasicGroundUnit(6, 1, 5, 0)],
|
|
158
170
|
["HTK", new BasicGroundUnit(5, 2, 0.33, 1.5)],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildingRules.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/buildingRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,QAAQ,EACR,UAAU,EAKV,OAAO,GACV,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"buildingRules.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/buildingRules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getPointTowardsOtherPoint } from "../map/map.js";
|
|
2
|
+
import { getDefaultPlacementLocation } from "./buildingRules.js";
|
|
3
|
+
export const getStaticDefencePlacement = (game, playerData, technoRules) => {
|
|
4
|
+
// Prefer front towards enemy.
|
|
5
|
+
let startLocation = playerData.startLocation;
|
|
6
|
+
let players = game.getPlayers();
|
|
7
|
+
let enemyFacingLocationCandidates = [];
|
|
8
|
+
for (let i = 0; i < players.length; ++i) {
|
|
9
|
+
let playerName = players[i];
|
|
10
|
+
if (playerName == playerData.name) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
let enemyPlayer = game.getPlayerData(playerName);
|
|
14
|
+
enemyFacingLocationCandidates.push(getPointTowardsOtherPoint(game, startLocation, enemyPlayer.startLocation, 4, 16, 1.5));
|
|
15
|
+
}
|
|
16
|
+
let selectedLocation = enemyFacingLocationCandidates[Math.floor(game.generateRandom() * enemyFacingLocationCandidates.length)];
|
|
17
|
+
return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, false, 0);
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAa,EAAE,UAAsB,EAAE,WAAwB,EAAE,EAAE;IACzG,8BAA8B;IAC9B,IAAI,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;IAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,IAAI,6BAA6B,GAAc,EAAE,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACrC,IAAI,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE;YAC/B,SAAS;SACZ;QACD,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACjD,6BAA6B,CAAC,IAAI,CAC9B,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CACxF,CAAC;KACL;IACD,IAAI,gBAAgB,GAChB,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5G,OAAO,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAClG,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BasicGroundUnit } from "./basicGroundUnit.js";
|
|
2
2
|
const IDEAL_HARVESTERS_PER_REFINERY = 2;
|
|
3
|
+
const MAX_HARVESTERS_PER_REFINERY = 4;
|
|
3
4
|
export class Harvester extends BasicGroundUnit {
|
|
4
5
|
constructor(basePriority, baseAmount, minNeeded) {
|
|
5
6
|
super(basePriority, baseAmount, 0, 0);
|
|
@@ -9,7 +10,7 @@ export class Harvester extends BasicGroundUnit {
|
|
|
9
10
|
getPriority(game, playerData, technoRules, threatCache) {
|
|
10
11
|
const refineries = game.getVisibleUnits(playerData.name, "self", (r) => r.refinery).length;
|
|
11
12
|
const harvesters = game.getVisibleUnits(playerData.name, "self", (r) => r.harvester).length;
|
|
12
|
-
const boost = harvesters < this.minNeeded ? 3 : 1;
|
|
13
|
+
const boost = harvesters < this.minNeeded ? 3 : harvesters > refineries * MAX_HARVESTERS_PER_REFINERY ? 0 : 1;
|
|
13
14
|
return this.basePriority * (refineries / Math.max(harvesters / IDEAL_HARVESTERS_PER_REFINERY, 1)) * boost;
|
|
14
15
|
}
|
|
15
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harvester.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/harvester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,6BAA6B,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"harvester.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/harvester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,6BAA6B,GAAG,CAAC,CAAC;AACxC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC1C,YACI,YAAoB,EACpB,UAAkB,EACV,SAAiB;QAEzB,KAAK,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAF9B,cAAS,GAAT,SAAS,CAAQ;IAG7B,CAAC;IAED,iEAAiE;IACjE,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC3F,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAE5F,MAAM,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9G,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,6BAA6B,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC9G,CAAC;CACJ"}
|