@supalosa/chronodivide-bot 0.2.2 → 0.3.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/.prettierrc +5 -5
- package/TODO.md +18 -0
- package/dist/bot/bot.js +4 -4
- package/dist/bot/bot.js.map +1 -1
- package/dist/bot/logic/awareness.js +8 -8
- package/dist/bot/logic/awareness.js.map +1 -1
- package/dist/bot/logic/building/ArtilleryUnit.js +30 -9
- package/dist/bot/logic/building/antiGroundStaticDefence.js +2 -2
- package/dist/bot/logic/building/antiGroundStaticDefence.js.map +1 -1
- package/dist/bot/logic/building/artilleryUnit.js.map +1 -0
- package/dist/bot/logic/building/basicAirUnit.js +3 -2
- package/dist/bot/logic/building/basicAirUnit.js.map +1 -1
- package/dist/bot/logic/building/basicBuilding.js +1 -1
- package/dist/bot/logic/building/basicBuilding.js.map +1 -1
- package/dist/bot/logic/building/basicGroundUnit.js +4 -3
- package/dist/bot/logic/building/basicGroundUnit.js.map +1 -1
- package/dist/bot/logic/building/building.js +11 -55
- package/dist/bot/logic/building/buildingRules.js +162 -0
- package/dist/bot/logic/building/buildingRules.js.map +1 -0
- package/dist/bot/logic/building/harvester.js.map +1 -1
- package/dist/bot/logic/building/massedAntiGroundUnit.js +20 -0
- package/dist/bot/logic/building/powerPlant.js +1 -1
- package/dist/bot/logic/building/powerPlant.js.map +1 -1
- package/dist/bot/logic/building/queueController.js +1 -1
- package/dist/bot/logic/building/queueController.js.map +1 -1
- package/dist/bot/logic/building/queues.js +19 -0
- package/dist/bot/logic/building/resourceCollectionBuilding.js +5 -3
- package/dist/bot/logic/building/resourceCollectionBuilding.js.map +1 -1
- package/dist/bot/logic/common/scout.js +49 -32
- package/dist/bot/logic/common/scout.js.map +1 -1
- package/dist/bot/logic/common/utils.js +50 -1
- package/dist/bot/logic/common/utils.js.map +1 -1
- package/dist/bot/logic/knowledge.js +1 -0
- package/dist/bot/logic/map/map.js +17 -19
- package/dist/bot/logic/map/map.js.map +1 -1
- package/dist/bot/logic/map/sector.js +10 -13
- package/dist/bot/logic/map/sector.js.map +1 -1
- package/dist/bot/logic/mission/basicMission.js +26 -0
- package/dist/bot/logic/mission/expansionMission.js +32 -0
- package/dist/bot/logic/mission/missionFactories.js +2 -0
- package/dist/bot/logic/mission/missionFactories.js.map +1 -1
- package/dist/bot/logic/mission/missions/attackMission.js +4 -4
- package/dist/bot/logic/mission/missions/attackMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/defenceMission.js +2 -1
- package/dist/bot/logic/mission/missions/defenceMission.js.map +1 -1
- package/dist/bot/logic/mission/missions/engineerMission.js +34 -0
- package/dist/bot/logic/mission/missions/engineerMission.js.map +1 -0
- package/dist/bot/logic/mission/missions/retreatMission.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/attackSquad.js +56 -63
- package/dist/bot/logic/squad/behaviours/combatSquad.js +18 -19
- package/dist/bot/logic/squad/behaviours/combatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/common.js +19 -2
- package/dist/bot/logic/squad/behaviours/common.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/defenceSquad.js +2 -15
- package/dist/bot/logic/squad/behaviours/engineerSquad.js +36 -0
- package/dist/bot/logic/squad/behaviours/engineerSquad.js.map +1 -0
- package/dist/bot/logic/squad/behaviours/retreatSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js +21 -17
- package/dist/bot/logic/squad/behaviours/scoutingSquad.js.map +1 -1
- package/dist/bot/logic/squad/behaviours/squadExpansion.js +31 -0
- package/dist/bot/logic/squad/behaviours/squadScouters.js +8 -0
- package/dist/bot/logic/squad/squad.js +5 -8
- 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 +2 -3
- package/dist/bot/logic/squad/squadController.js.map +1 -1
- package/dist/bot/logic/threat/threatCalculator.js +4 -3
- package/dist/bot/logic/threat/threatCalculator.js.map +1 -1
- package/dist/exampleBot.js +6 -6
- package/dist/exampleBot.js.map +1 -1
- package/package.json +5 -9
- package/src/bot/bot.ts +8 -10
- package/src/bot/logic/awareness.ts +13 -17
- package/src/bot/logic/building/antiGroundStaticDefence.ts +13 -9
- package/src/bot/logic/building/artilleryUnit.ts +65 -0
- package/src/bot/logic/building/basicAirUnit.ts +10 -8
- package/src/bot/logic/building/basicBuilding.ts +1 -1
- package/src/bot/logic/building/basicGroundUnit.ts +4 -4
- package/src/bot/logic/building/{building.ts → buildingRules.ts} +94 -48
- package/src/bot/logic/building/harvester.ts +7 -4
- package/src/bot/logic/building/powerPlant.ts +1 -1
- package/src/bot/logic/building/queueController.ts +1 -1
- package/src/bot/logic/building/resourceCollectionBuilding.ts +8 -12
- package/src/bot/logic/common/scout.ts +83 -38
- package/src/bot/logic/common/utils.ts +65 -1
- package/src/bot/logic/map/map.ts +27 -31
- package/src/bot/logic/map/sector.ts +17 -21
- package/src/bot/logic/mission/missionFactories.ts +2 -0
- package/src/bot/logic/mission/missions/attackMission.ts +27 -27
- package/src/bot/logic/mission/missions/defenceMission.ts +3 -3
- package/src/bot/logic/mission/missions/engineerMission.ts +61 -0
- package/src/bot/logic/mission/missions/retreatMission.ts +2 -2
- package/src/bot/logic/squad/behaviours/combatSquad.ts +24 -26
- package/src/bot/logic/squad/behaviours/common.ts +33 -3
- package/src/bot/logic/squad/behaviours/engineerSquad.ts +53 -0
- package/src/bot/logic/squad/behaviours/retreatSquad.ts +2 -2
- package/src/bot/logic/squad/behaviours/scoutingSquad.ts +26 -28
- package/src/bot/logic/squad/squad.ts +8 -13
- package/src/bot/logic/squad/squadBehaviour.ts +9 -10
- package/src/bot/logic/squad/squadController.ts +2 -5
- package/src/bot/logic/threat/threat.ts +15 -15
- package/src/bot/logic/threat/threatCalculator.ts +4 -3
- package/src/exampleBot.ts +6 -6
- package/dist/bot/logic/awarenessImpl.js +0 -132
- package/dist/bot/logic/awarenessImpl.js.map +0 -1
- package/dist/bot/logic/building/ArtilleryUnit.js.map +0 -1
- package/dist/bot/logic/building/building.js.map +0 -1
- package/src/bot/logic/building/ArtilleryUnit.ts +0 -43
package/.prettierrc
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"tabWidth": 4,
|
|
3
|
-
"useTabs": false,
|
|
4
|
-
"printWidth": 120
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"tabWidth": 4,
|
|
3
|
+
"useTabs": false,
|
|
4
|
+
"printWidth": 120
|
|
5
|
+
}
|
package/TODO.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# TODO for Supabot
|
|
2
|
+
|
|
3
|
+
Urgent
|
|
4
|
+
|
|
5
|
+
- maybe not spam move commands for scouting and attacking missions
|
|
6
|
+
- don't spam repair
|
|
7
|
+
- handle multiple opponents or allies
|
|
8
|
+
- leader pathfinding
|
|
9
|
+
|
|
10
|
+
Medium priority
|
|
11
|
+
|
|
12
|
+
- detect naval map (can scan tiles to check if more of the map is water or not)
|
|
13
|
+
- handle naval construction
|
|
14
|
+
- detect islands and implement island-hopping
|
|
15
|
+
|
|
16
|
+
Not urgent
|
|
17
|
+
|
|
18
|
+
- Remove squad paradigm, all unit-related for mission can just go into the mission.
|
package/dist/bot/bot.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { ApiEventType, Bot, QueueStatus, ObjectType, FactoryType, } from "@chronodivide/game-api";
|
|
2
|
-
import { Duration } from "luxon";
|
|
3
2
|
import { determineMapBounds } from "./logic/map/map.js";
|
|
4
3
|
import { SectorCache } from "./logic/map/sector.js";
|
|
5
4
|
import { MissionController } from "./logic/mission/missionController.js";
|
|
6
5
|
import { SquadController } from "./logic/squad/squadController.js";
|
|
7
6
|
import { QUEUES, QueueController, queueTypeToName } from "./logic/building/queueController.js";
|
|
8
7
|
import { MatchAwarenessImpl } from "./logic/awareness.js";
|
|
8
|
+
import { formatTimeDuration } from "./logic/common/utils.js";
|
|
9
9
|
const DEBUG_TIMESTAMP_OUTPUT_INTERVAL_SECONDS = 60;
|
|
10
10
|
// Number of ticks per second at the base speed.
|
|
11
11
|
const NATURAL_TICK_RATE = 15;
|
|
12
|
-
const BOT_AUTO_SURRENDER_TIME_SECONDS = 7200; // 7200
|
|
12
|
+
const BOT_AUTO_SURRENDER_TIME_SECONDS = 7200; // 7200 = 2 hours (approx 30 mins in real time, given a game speed of 4)
|
|
13
13
|
export class SupalosaBot extends Bot {
|
|
14
14
|
constructor(name, country, enableLogging = true) {
|
|
15
15
|
super(name, country);
|
|
@@ -29,7 +29,7 @@ export class SupalosaBot extends Bot {
|
|
|
29
29
|
const myPlayer = game.getPlayerData(this.name);
|
|
30
30
|
this.matchAwareness = new MatchAwarenessImpl(null, new SectorCache(game.mapApi, this.knownMapBounds), myPlayer.startLocation, (message, sayInGame) => this.logBotStatus(message, sayInGame));
|
|
31
31
|
this.matchAwareness.onGameStart(game, myPlayer);
|
|
32
|
-
this.logBotStatus(`Map bounds: ${this.knownMapBounds.
|
|
32
|
+
this.logBotStatus(`Map bounds: ${this.knownMapBounds.width}, ${this.knownMapBounds.height}`);
|
|
33
33
|
}
|
|
34
34
|
onGameTick(game) {
|
|
35
35
|
if (!this.matchAwareness) {
|
|
@@ -67,7 +67,7 @@ export class SupalosaBot extends Bot {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
getHumanTimestamp(game) {
|
|
70
|
-
return
|
|
70
|
+
return formatTimeDuration(game.getCurrentTick() / NATURAL_TICK_RATE);
|
|
71
71
|
}
|
|
72
72
|
logBotStatus(message, sayInGame = false) {
|
|
73
73
|
if (!this.enableLogging) {
|
package/dist/bot/bot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/bot/bot.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/bot/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Vector2 } from "@chronodivide/game-api";
|
|
2
2
|
import { calculateGlobalThreat } from "./threat/threatCalculator.js";
|
|
3
3
|
import { getDistanceBetweenPoints, getPointTowardsOtherPoint } from "./map/map.js";
|
|
4
4
|
import { Circle, Quadtree } from "@timohausmann/quadtree-ts";
|
|
5
5
|
import { ScoutingManager } from "./common/scout.js";
|
|
6
6
|
const SECTORS_TO_UPDATE_PER_CYCLE = 8;
|
|
7
|
-
const RALLY_POINT_UPDATE_INTERVAL_TICKS =
|
|
7
|
+
const RALLY_POINT_UPDATE_INTERVAL_TICKS = 90;
|
|
8
8
|
const THREAT_UPDATE_INTERVAL_TICKS = 30;
|
|
9
9
|
const rebuildQuadtree = (quadtree, units) => {
|
|
10
10
|
quadtree.clear();
|
|
@@ -19,7 +19,7 @@ export class MatchAwarenessImpl {
|
|
|
19
19
|
this.mainRallyPoint = mainRallyPoint;
|
|
20
20
|
this.logger = logger;
|
|
21
21
|
this._shouldAttack = false;
|
|
22
|
-
const {
|
|
22
|
+
const { width, height } = sectorCache.getMapBounds();
|
|
23
23
|
this.hostileQuadTree = new Quadtree({ width, height });
|
|
24
24
|
this.scoutingManager = new ScoutingManager(logger);
|
|
25
25
|
}
|
|
@@ -30,7 +30,7 @@ export class MatchAwarenessImpl {
|
|
|
30
30
|
const intersections = this.hostileQuadTree.retrieve(new Circle({ x: searchX, y: searchY, r: radius }));
|
|
31
31
|
return intersections
|
|
32
32
|
.map(({ x, y, data: unitId }) => ({ x, y, unitId: unitId }))
|
|
33
|
-
.filter(({ x, y }) => getDistanceBetweenPoints(
|
|
33
|
+
.filter(({ x, y }) => getDistanceBetweenPoints(new Vector2(x, y), new Vector2(searchX, searchY)) <= radius)
|
|
34
34
|
.filter(({ unitId }) => !!unitId);
|
|
35
35
|
}
|
|
36
36
|
getThreatCache() {
|
|
@@ -49,9 +49,9 @@ export class MatchAwarenessImpl {
|
|
|
49
49
|
return this._shouldAttack;
|
|
50
50
|
}
|
|
51
51
|
checkShouldAttack(threatCache, threatFactor) {
|
|
52
|
-
let scaledGroundPower =
|
|
52
|
+
let scaledGroundPower = threatCache.totalAvailableAntiGroundFirepower * 1.1;
|
|
53
53
|
let scaledGroundThreat = (threatFactor * threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat) * 1.1;
|
|
54
|
-
let scaledAirPower =
|
|
54
|
+
let scaledAirPower = threatCache.totalAvailableAirPower * 1.1;
|
|
55
55
|
let scaledAirThreat = (threatFactor * threatCache.totalOffensiveAntiAirThreat + threatCache.totalDefensiveThreat) * 1.1;
|
|
56
56
|
return scaledGroundPower > scaledGroundThreat || scaledAirPower > scaledAirThreat;
|
|
57
57
|
}
|
|
@@ -67,7 +67,7 @@ export class MatchAwarenessImpl {
|
|
|
67
67
|
onAiUpdate(game, playerData) {
|
|
68
68
|
const sectorCache = this.sectorCache;
|
|
69
69
|
sectorCache.updateSectors(game.getCurrentTick(), SECTORS_TO_UPDATE_PER_CYCLE, game.mapApi, playerData);
|
|
70
|
-
this.scoutingManager.onAiUpdate(game, playerData);
|
|
70
|
+
this.scoutingManager.onAiUpdate(game, playerData, sectorCache);
|
|
71
71
|
let updateRatio = sectorCache?.getSectorUpdateRatio(game.getCurrentTick() - game.getTickRate() * 60);
|
|
72
72
|
if (updateRatio && updateRatio < 1.0) {
|
|
73
73
|
this.logger(`${updateRatio * 100.0}% of sectors updated in last 60 seconds.`);
|
|
@@ -80,7 +80,7 @@ export class MatchAwarenessImpl {
|
|
|
80
80
|
!game.areAlliedPlayers(playerData.name, other.name))
|
|
81
81
|
.map((other) => other.name);
|
|
82
82
|
// Build the quadtree, if this is too slow we should consider doing this periodically.
|
|
83
|
-
const hostileUnitIds = game.getVisibleUnits(playerData.name, "hostile"
|
|
83
|
+
const hostileUnitIds = game.getVisibleUnits(playerData.name, "hostile");
|
|
84
84
|
try {
|
|
85
85
|
const hostileUnits = hostileUnitIds
|
|
86
86
|
.map((id) => game.getUnitData(id))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../../src/bot/logic/awareness.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../../src/bot/logic/awareness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,46 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GameMath } from "@chronodivide/game-api";
|
|
2
|
+
import { numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
2
3
|
export class ArtilleryUnit {
|
|
3
|
-
constructor(basePriority, baseAmount) {
|
|
4
|
+
constructor(basePriority, artilleryPower, antiGroundPower, baseAmount) {
|
|
4
5
|
this.basePriority = basePriority;
|
|
6
|
+
this.artilleryPower = artilleryPower;
|
|
7
|
+
this.antiGroundPower = antiGroundPower;
|
|
5
8
|
this.baseAmount = baseAmount;
|
|
6
9
|
}
|
|
7
10
|
getPlacementLocation(game, playerData, technoRules) {
|
|
8
11
|
return undefined;
|
|
9
12
|
}
|
|
10
13
|
getPriority(game, playerData, technoRules, threatCache) {
|
|
14
|
+
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
15
|
+
let priority = this.basePriority;
|
|
11
16
|
// If the enemy's defensive power is increasing we will start to build these.
|
|
12
|
-
if (threatCache) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
(threatCache.totalAvailableAntiGroundFirepower / Math.max(1, threatCache.totalDefensivePower))
|
|
17
|
+
if (threatCache && threatCache.totalDefensivePower > threatCache.totalAvailableAntiGroundFirepower) {
|
|
18
|
+
priority +=
|
|
19
|
+
this.artilleryPower *
|
|
20
|
+
(threatCache.totalAvailableAntiGroundFirepower / Math.max(1, threatCache.totalDefensivePower));
|
|
21
|
+
}
|
|
22
|
+
if (threatCache && this.antiGroundPower > 0) {
|
|
23
|
+
// If the enemy's power is increasing we should try to keep up.
|
|
24
|
+
if (threatCache.totalOffensiveLandThreat > threatCache.totalAvailableAntiGroundFirepower) {
|
|
25
|
+
priority +=
|
|
26
|
+
this.antiGroundPower *
|
|
27
|
+
this.basePriority *
|
|
28
|
+
(threatCache.totalOffensiveLandThreat / Math.max(1, threatCache.totalAvailableAntiGroundFirepower));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// But also, if our power dwarfs the enemy, keep pressing the advantage.
|
|
32
|
+
priority +=
|
|
33
|
+
(this.antiGroundPower *
|
|
34
|
+
this.basePriority *
|
|
35
|
+
GameMath.sqrt(threatCache.totalAvailableAntiGroundFirepower /
|
|
36
|
+
Math.max(1, threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat))) /
|
|
37
|
+
(numOwned + 1);
|
|
16
38
|
}
|
|
17
39
|
}
|
|
18
|
-
|
|
19
|
-
return this.basePriority * (1.0 - numOwned / this.baseAmount);
|
|
40
|
+
return priority * (1.0 - numOwned / this.baseAmount);
|
|
20
41
|
}
|
|
21
42
|
getMaxCount(game, playerData, technoRules, threatCache) {
|
|
22
43
|
return null;
|
|
23
44
|
}
|
|
24
45
|
}
|
|
25
|
-
//# sourceMappingURL=
|
|
46
|
+
//# sourceMappingURL=artilleryUnit.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getPointTowardsOtherPoint } from "../map/map.js";
|
|
2
|
-
import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./
|
|
2
|
+
import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
3
3
|
export class AntiGroundStaticDefence {
|
|
4
4
|
constructor(basePriority, baseAmount, strength) {
|
|
5
5
|
this.basePriority = basePriority;
|
|
@@ -20,7 +20,7 @@ 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);
|
|
23
|
+
return getDefaultPlacementLocation(game, playerData, selectedLocation, technoRules, 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.
|
|
@@ -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,
|
|
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,QAAgB;QAFhB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAQ;QAClB,aAAQ,GAAR,QAAQ,CAAQ;IACzB,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,CAAC,CAAC,CAAC;IAC3F,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,QAAQ,CAAC;YACpG,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;SACJ;QACD,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAClE,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artilleryUnit.js","sourceRoot":"","sources":["../../../../src/bot/logic/building/artilleryUnit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAA2B,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAmB,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,MAAM,OAAO,aAAa;IACtB,YACY,YAAoB,EACpB,cAAsB,EACtB,eAAuB,EACvB,UAAkB;QAHlB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,mBAAc,GAAd,cAAc,CAAQ;QACtB,oBAAe,GAAf,eAAe,CAAQ;QACvB,eAAU,GAAV,UAAU,CAAQ;IAC3B,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,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,6EAA6E;QAC7E,IAAI,WAAW,IAAI,WAAW,CAAC,mBAAmB,GAAG,WAAW,CAAC,iCAAiC,EAAE;YAChG,QAAQ;gBACJ,IAAI,CAAC,cAAc;oBACnB,CAAC,WAAW,CAAC,iCAAiC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;SACtG;QACD,IAAI,WAAW,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;YACzC,+DAA+D;YAC/D,IAAI,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,iCAAiC,EAAE;gBACtF,QAAQ;oBACJ,IAAI,CAAC,eAAe;wBACpB,IAAI,CAAC,YAAY;wBACjB,CAAC,WAAW,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC,CAAC;aAC3G;iBAAM;gBACH,wEAAwE;gBACxE,QAAQ;oBACJ,CAAC,IAAI,CAAC,eAAe;wBACjB,IAAI,CAAC,YAAY;wBACjB,QAAQ,CAAC,IAAI,CACT,WAAW,CAAC,iCAAiC;4BACzC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAC3F,CAAC;wBACN,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;aACtB;SACJ;QACD,OAAO,QAAQ,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GameMath } from "@chronodivide/game-api";
|
|
2
|
+
import { numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
2
3
|
export class BasicAirUnit {
|
|
3
4
|
constructor(basePriority, baseAmount, antiGroundPower = 1, // boolean for now, but will eventually be used in weighting.
|
|
4
5
|
antiAirPower = 0) {
|
|
@@ -27,7 +28,7 @@ export class BasicAirUnit {
|
|
|
27
28
|
(threatCache.totalOffensiveAirThreat / Math.max(1, threatCache.totalAvailableAntiAirFirepower));
|
|
28
29
|
}
|
|
29
30
|
// sqrt so we don't build too much of one unit type.
|
|
30
|
-
priority += Math.min(1.0, Math.max(1,
|
|
31
|
+
priority += Math.min(1.0, Math.max(1, GameMath.sqrt(threatCache.totalAvailableAirPower / Math.max(1, threatCache.totalOffensiveAntiAirThreat))));
|
|
31
32
|
return this.baseAmount * priority;
|
|
32
33
|
}
|
|
33
34
|
const numOwned = numBuildingsOwnedOfType(game, playerData, technoRules);
|
|
@@ -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":"AAAA,OAAO,EAAW,QAAQ,EAA2B,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAgD,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE3G,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,4DAA4D;QAC5D,IAAI,WAAW,EAAE;YACb,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IACI,IAAI,CAAC,eAAe,GAAG,CAAC;gBACxB,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,iCAAiC,EACtF;gBACE,QAAQ;oBACJ,IAAI,CAAC,YAAY;wBACjB,CAAC,WAAW,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC,CAAC;aAC3G;YACD,IACI,IAAI,CAAC,YAAY,GAAG,CAAC;gBACrB,WAAW,CAAC,uBAAuB,GAAG,WAAW,CAAC,8BAA8B,EAClF;gBACE,QAAQ;oBACJ,IAAI,CAAC,YAAY;wBACjB,CAAC,WAAW,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,8BAA8B,CAAC,CAAC,CAAC;aACvG;YACD,oDAAoD;YACpD,QAAQ,IAAI,IAAI,CAAC,GAAG,CAChB,GAAG,EACH,IAAI,CAAC,GAAG,CACJ,CAAC,EACD,QAAQ,CAAC,IAAI,CACT,WAAW,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAC5F,CACJ,CACJ,CAAC;YACF,OAAO,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;SACrC;QACD,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,CAAC;IAClE,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./
|
|
1
|
+
import { getDefaultPlacementLocation, numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
2
2
|
export class BasicBuilding {
|
|
3
3
|
constructor(basePriority, maxNeeded, onlyBuildWhenFloatingCreditsAmount) {
|
|
4
4
|
this.basePriority = basePriority;
|
|
@@ -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,
|
|
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,CAAC,GAAG,CAAC;SACf;QAED,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;CACJ"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GameMath } from "@chronodivide/game-api";
|
|
2
|
+
import { numBuildingsOwnedOfType } from "./buildingRules.js";
|
|
2
3
|
export class BasicGroundUnit {
|
|
3
4
|
constructor(basePriority, baseAmount, antiGroundPower = 1, // boolean for now, but will eventually be used in weighting.
|
|
4
5
|
antiAirPower = 0) {
|
|
@@ -28,7 +29,7 @@ export class BasicGroundUnit {
|
|
|
28
29
|
priority +=
|
|
29
30
|
(this.antiGroundPower *
|
|
30
31
|
this.basePriority *
|
|
31
|
-
|
|
32
|
+
GameMath.sqrt(threatCache.totalAvailableAntiGroundFirepower /
|
|
32
33
|
Math.max(1, threatCache.totalOffensiveLandThreat + threatCache.totalDefensiveThreat))) /
|
|
33
34
|
(numOwned + 1);
|
|
34
35
|
}
|
|
@@ -44,7 +45,7 @@ export class BasicGroundUnit {
|
|
|
44
45
|
priority +=
|
|
45
46
|
(this.antiAirPower *
|
|
46
47
|
this.basePriority *
|
|
47
|
-
|
|
48
|
+
GameMath.sqrt(threatCache.totalAvailableAntiAirFirepower /
|
|
48
49
|
Math.max(1, threatCache.totalOffensiveAirThreat + threatCache.totalDefensiveThreat))) /
|
|
49
50
|
(numOwned + 1);
|
|
50
51
|
}
|
|
@@ -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":"AAAA,OAAO,EAAW,QAAQ,EAA2B,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAgD,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE3G,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,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACxE,IAAI,WAAW,EAAE;YACb,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;YACjC,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;gBAC1B,+DAA+D;gBAC/D,IAAI,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,iCAAiC,EAAE;oBACtF,QAAQ;wBACJ,IAAI,CAAC,eAAe;4BACpB,IAAI,CAAC,YAAY;4BACjB,CAAC,WAAW,CAAC,wBAAwB;gCACjC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC,CAAC;iBACvE;qBAAM;oBACH,wEAAwE;oBACxE,QAAQ;wBACJ,CAAC,IAAI,CAAC,eAAe;4BACjB,IAAI,CAAC,YAAY;4BACjB,QAAQ,CAAC,IAAI,CACT,WAAW,CAAC,iCAAiC;gCACzC,IAAI,CAAC,GAAG,CACJ,CAAC,EACD,WAAW,CAAC,wBAAwB,GAAG,WAAW,CAAC,oBAAoB,CAC1E,CACR,CAAC;4BACN,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;iBACtB;aACJ;YACD,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE;gBACvB,IAAI,WAAW,CAAC,uBAAuB,GAAG,WAAW,CAAC,8BAA8B,EAAE;oBAClF,QAAQ;wBACJ,IAAI,CAAC,YAAY;4BACjB,IAAI,CAAC,YAAY;4BACjB,CAAC,WAAW,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,8BAA8B,CAAC,CAAC,CAAC;iBACvG;qBAAM;oBACH,QAAQ;wBACJ,CAAC,IAAI,CAAC,YAAY;4BACd,IAAI,CAAC,YAAY;4BACjB,QAAQ,CAAC,IAAI,CACT,WAAW,CAAC,8BAA8B;gCACtC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,uBAAuB,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAC1F,CAAC;4BACN,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;iBACtB;aACJ;YACD,OAAO,QAAQ,CAAC;SACnB;QACD,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAED,WAAW,CACP,IAAa,EACb,UAAsB,EACtB,WAAwB,EACxB,WAAgC;QAEhC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ObjectType, } from "@chronodivide/game-api";
|
|
2
1
|
import { AntiGroundStaticDefence } from "./antiGroundStaticDefence.js";
|
|
3
2
|
import { ArtilleryUnit } from "./ArtilleryUnit.js";
|
|
4
3
|
import { BasicAirUnit } from "./basicAirUnit.js";
|
|
@@ -13,65 +12,23 @@ export function numBuildingsOwnedOfType(game, playerData, technoRules) {
|
|
|
13
12
|
export function numBuildingsOwnedOfName(game, playerData, name) {
|
|
14
13
|
return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
|
|
15
14
|
}
|
|
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
|
-
}
|
|
64
15
|
export function getDefaultPlacementLocation(game, playerData, startPoint, technoRules, space = 1) {
|
|
65
16
|
// Random location, preferably near start location.
|
|
17
|
+
let startX = startPoint.x;
|
|
18
|
+
let startY = startPoint.y;
|
|
66
19
|
let size = game.getBuildingPlacementData(technoRules.name);
|
|
67
20
|
if (!size) {
|
|
68
21
|
return undefined;
|
|
69
22
|
}
|
|
70
|
-
let
|
|
71
|
-
let
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
23
|
+
let largestSize = Math.max(size.foundation.height, size.foundation.width);
|
|
24
|
+
for (let searchRadius = largestSize; searchRadius < 25 + largestSize; ++searchRadius) {
|
|
25
|
+
for (let xx = startX - searchRadius; xx < startX + searchRadius; ++xx) {
|
|
26
|
+
for (let yy = startY - searchRadius; yy < startY + searchRadius; ++yy) {
|
|
27
|
+
let tile = game.mapApi.getTile(xx, yy);
|
|
28
|
+
if (tile && game.canPlaceBuilding(playerData.name, technoRules.name, tile)) {
|
|
29
|
+
return { rx: xx, ry: yy };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
75
32
|
}
|
|
76
33
|
}
|
|
77
34
|
return undefined;
|
|
@@ -123,4 +80,3 @@ export const BUILDING_NAME_TO_RULES = new Map([
|
|
|
123
80
|
["ZEP", new BasicAirUnit(5, 1, 5, 1)],
|
|
124
81
|
["V3", new ArtilleryUnit(9, 1)], // V3 Rocket Launcher
|
|
125
82
|
]);
|
|
126
|
-
//# sourceMappingURL=building.js.map
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { GameMath, ObjectType, Vector2, } from "@chronodivide/game-api";
|
|
2
|
+
import { AntiGroundStaticDefence } from "./antiGroundStaticDefence.js";
|
|
3
|
+
import { ArtilleryUnit } from "./artilleryUnit.js";
|
|
4
|
+
import { BasicAirUnit } from "./basicAirUnit.js";
|
|
5
|
+
import { BasicBuilding } from "./basicBuilding.js";
|
|
6
|
+
import { BasicGroundUnit } from "./basicGroundUnit.js";
|
|
7
|
+
import { PowerPlant } from "./powerPlant.js";
|
|
8
|
+
import { ResourceCollectionBuilding } from "./resourceCollectionBuilding.js";
|
|
9
|
+
import { Harvester } from "./harvester.js";
|
|
10
|
+
import { uniqBy } from "../common/utils.js";
|
|
11
|
+
export function numBuildingsOwnedOfType(game, playerData, technoRules) {
|
|
12
|
+
return game.getVisibleUnits(playerData.name, "self", (r) => r == technoRules).length;
|
|
13
|
+
}
|
|
14
|
+
export function numBuildingsOwnedOfName(game, playerData, name) {
|
|
15
|
+
return game.getVisibleUnits(playerData.name, "self", (r) => r.name === name).length;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Computes a rect 'centered' around a structure of a certain size with additional radius.
|
|
19
|
+
*
|
|
20
|
+
* This is essentially the placeable area around a given structure.
|
|
21
|
+
*
|
|
22
|
+
* @param point Top-left location of the inner rect.
|
|
23
|
+
* @param t Size of the inner rect.
|
|
24
|
+
* @param adjacent Size of the outer rect.
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
function computeAdjacentRect(point, t, adjacent) {
|
|
28
|
+
return {
|
|
29
|
+
x: point.x - adjacent,
|
|
30
|
+
y: point.y - adjacent,
|
|
31
|
+
width: t.width + 2 * adjacent,
|
|
32
|
+
height: t.height + 2 * adjacent,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function getAdjacencyTiles(game, playerData, technoRules, minimumSpace) {
|
|
36
|
+
const placementRules = game.getBuildingPlacementData(technoRules.name);
|
|
37
|
+
const { width: newBuildingWidth, height: newBuildingHeight } = placementRules.foundation;
|
|
38
|
+
const tiles = [];
|
|
39
|
+
const buildings = game.getVisibleUnits(playerData.name, "self", (r) => r.type === ObjectType.Building);
|
|
40
|
+
const removedTiles = new Set();
|
|
41
|
+
for (let buildingId of buildings) {
|
|
42
|
+
const building = game.getUnitData(buildingId);
|
|
43
|
+
if (building?.rules?.baseNormal) {
|
|
44
|
+
const { foundation, tile } = building;
|
|
45
|
+
const buildingBase = new Vector2(tile.rx, tile.ry);
|
|
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));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Remove duplicate tiles.
|
|
77
|
+
const withDuplicatesRemoved = uniqBy(tiles, (tile) => tile.id);
|
|
78
|
+
// Remove tiles containing buildings and potentially area around them removed as well.
|
|
79
|
+
return withDuplicatesRemoved.filter((tile) => !removedTiles.has(tile.id));
|
|
80
|
+
}
|
|
81
|
+
function getTileDistances(startPoint, tiles) {
|
|
82
|
+
return tiles
|
|
83
|
+
.map((tile) => ({
|
|
84
|
+
tile,
|
|
85
|
+
distance: distance(tile.rx, tile.ry, startPoint.x, startPoint.y),
|
|
86
|
+
}))
|
|
87
|
+
.sort((a, b) => {
|
|
88
|
+
return a.distance - b.distance;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function distance(x1, y1, x2, y2) {
|
|
92
|
+
var dx = x1 - x2;
|
|
93
|
+
var dy = y1 - y2;
|
|
94
|
+
let tmp = dx * dx + dy * dy;
|
|
95
|
+
if (0 === tmp) {
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
return GameMath.sqrt(tmp);
|
|
99
|
+
}
|
|
100
|
+
export function getDefaultPlacementLocation(game, playerData, startPoint, technoRules, minSpace = 1) {
|
|
101
|
+
// Random location, preferably near start location.
|
|
102
|
+
const size = game.getBuildingPlacementData(technoRules.name);
|
|
103
|
+
if (!size) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const tiles = getAdjacencyTiles(game, playerData, technoRules, minSpace);
|
|
107
|
+
const tileDistances = getTileDistances(startPoint, tiles);
|
|
108
|
+
for (let tileDistance of tileDistances) {
|
|
109
|
+
if (tileDistance.tile && game.canPlaceBuilding(playerData.name, technoRules.name, tileDistance.tile)) {
|
|
110
|
+
return tileDistance.tile;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
export const DEFAULT_BUILDING_PRIORITY = 1;
|
|
116
|
+
export const BUILDING_NAME_TO_RULES = new Map([
|
|
117
|
+
// Allied
|
|
118
|
+
["GAPOWR", new PowerPlant()],
|
|
119
|
+
["GAREFN", new ResourceCollectionBuilding(10, 3)],
|
|
120
|
+
["GAWEAP", new BasicBuilding(15, 1)],
|
|
121
|
+
["GAPILE", new BasicBuilding(12, 1)],
|
|
122
|
+
["CMIN", new Harvester(15, 4, 2)],
|
|
123
|
+
["ENGINEER", new BasicBuilding(10, 1, 1000)],
|
|
124
|
+
["GADEPT", new BasicBuilding(1, 1, 10000)],
|
|
125
|
+
["GAAIRC", new BasicBuilding(10, 1, 500)],
|
|
126
|
+
["GATECH", new BasicBuilding(20, 1, 4000)],
|
|
127
|
+
["GAYARD", new BasicBuilding(0, 0, 0)],
|
|
128
|
+
["GAPILL", new AntiGroundStaticDefence(5, 1, 5)],
|
|
129
|
+
["ATESLA", new AntiGroundStaticDefence(5, 1, 10)],
|
|
130
|
+
["GAWALL", new AntiGroundStaticDefence(0, 0, 0)],
|
|
131
|
+
["E1", new BasicGroundUnit(2, 3, 0.25, 0)],
|
|
132
|
+
["MTNK", new BasicGroundUnit(10, 3, 2, 0)],
|
|
133
|
+
["MGTK", new BasicGroundUnit(10, 1, 2.5, 0)],
|
|
134
|
+
["FV", new BasicGroundUnit(5, 2, 0.5, 1)],
|
|
135
|
+
["JUMPJET", new BasicAirUnit(10, 1, 1, 1)],
|
|
136
|
+
["ORCA", new BasicAirUnit(7, 1, 2, 0)],
|
|
137
|
+
["SREF", new ArtilleryUnit(10, 5, 3, 3)],
|
|
138
|
+
["CLEG", new BasicGroundUnit(0, 0)],
|
|
139
|
+
["SHAD", new BasicGroundUnit(0, 0)],
|
|
140
|
+
// Soviet
|
|
141
|
+
["NAPOWR", new PowerPlant()],
|
|
142
|
+
["NAREFN", new ResourceCollectionBuilding(10, 3)],
|
|
143
|
+
["NAWEAP", new BasicBuilding(15, 1)],
|
|
144
|
+
["NAHAND", new BasicBuilding(12, 1)],
|
|
145
|
+
["HARV", new Harvester(15, 4, 2)],
|
|
146
|
+
["SENGINEER", new BasicBuilding(10, 1, 1000)],
|
|
147
|
+
["NADEPT", new BasicBuilding(1, 1, 10000)],
|
|
148
|
+
["NARADR", new BasicBuilding(10, 1, 500)],
|
|
149
|
+
["NANRCT", new PowerPlant()],
|
|
150
|
+
["NAYARD", new BasicBuilding(0, 0, 0)],
|
|
151
|
+
["NATECH", new BasicBuilding(20, 1, 4000)],
|
|
152
|
+
["NALASR", new AntiGroundStaticDefence(5, 1, 5)],
|
|
153
|
+
["TESLA", new AntiGroundStaticDefence(5, 1, 10)],
|
|
154
|
+
["NAWALL", new AntiGroundStaticDefence(0, 0, 0)],
|
|
155
|
+
["E2", new BasicGroundUnit(2, 3, 0.25, 0)],
|
|
156
|
+
["HTNK", new BasicGroundUnit(10, 3, 3, 0)],
|
|
157
|
+
["APOC", new BasicGroundUnit(6, 1, 5, 0)],
|
|
158
|
+
["HTK", new BasicGroundUnit(5, 2, 0.33, 1.5)],
|
|
159
|
+
["ZEP", new BasicAirUnit(5, 1, 5, 1)],
|
|
160
|
+
["V3", new ArtilleryUnit(9, 10, 0, 3)], // V3 Rocket Launcher
|
|
161
|
+
]);
|
|
162
|
+
//# sourceMappingURL=buildingRules.js.map
|