Prototype Planetologist movement and Special-card battles
Connect capped extra range, two-origin gathering, Fremen cancellation and saved replacement choices. Add human controls and actual first-choice AI paths for all four profiles. Admit the exact nine base green Specials in the actual skilled leader's weapon slot for +2 on survival, with mandatory physical discard and no native utility effect. Reject stale dead-disc plans. Independent movement/battle review closed after the saved-dead-disc fix. 84 focused tests passed. Two four-profile Basic/Advanced samples completed (194/186 accepted actions, six JSON restorations each, zero rejected actions). Basic used both movement branches; Advanced used added range. Browser genuine setup/gather/refresh and a separate targeted Special/traitor-loss fixture passed. Required verification: types, lint, 4435 offline tests, build and 43 HTTP tests passed. First attempt stopped at missing explicit test promise markers; corrected before the successful broad run. Final check/build/HTTP durations: 144157/6638/25048 ms. Source fingerprint (1260 files): bb7be69cf3e925bf7338ea444f77279ed7b37faadc3c44ed7db01b941f27b861 Private report: checkpoints/20260913-planetologist/checks-final/report.json. Preserved all 325 opening games and all original application/seat/recovery records; 359 rooms after 34 new QA/HTTP rooms. SQLite quick_check ok and zero foreign-key violations. Healthy existing server reused; no reset/restart. Boundaries: eight other Leader Skills, enemy-only mixed BG gather response, expansion roster/green-card/optional-module combinations remain unfinished. Winning traitor caller discard remains a documented card-specific inference. No mode or publication gates opened. Efficiency measure: aggregate goal counter 67321978 -> 68710948 (1388970), including context and coordination; not billing tokens or a savings claim. One skill's three connected effects, selective implementation/research/review, one interrupted lint attempt followed by the required complete verification.
This commit is contained in:
1 parent
6e6fecc9d4
commit
5082c81353
22 files changed
+2473
-93
No files matched your search
+17
-3
@@ -3,6 +3,11 @@ import { guildShipmentCost } from './shipment-price';
|
||||
import { fighterCount, isAdvisor } from './advisors';
|
||||
import { presenceAt } from './force-presence';
|
||||
import { EcazOccupancyError } from './ecaz-occupy';
|
||||
import {
|
||||
planetologistLeader,
|
||||
planetologistRange,
|
||||
type PlanetologistMoveMode,
|
||||
} from './planetologist-movement';
|
||||
import { territoryEntryBlock, strongholdPathBlocked } from './occupancy';
|
||||
import {
|
||||
distance,
|
||||
@@ -66,7 +71,12 @@ export function botEntryAllowed(
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
export function botMovementRange(g: GameView, p: Seat, elite: number) {
|
||||
export function botMovementRange(
|
||||
g: GameView,
|
||||
p: Seat,
|
||||
elite: number,
|
||||
planetologist?: PlanetologistMoveMode,
|
||||
) {
|
||||
const base =
|
||||
fighterCount(p, 'arrakeen') || fighterCount(p, 'carthag')
|
||||
? 3
|
||||
@@ -74,7 +84,10 @@ export function botMovementRange(g: GameView, p: Seat, elite: number) {
|
||||
(p.faction === 'ixians' && elite > 0 && !p.ixMovementBlocked)
|
||||
? 2
|
||||
: 1;
|
||||
return base + (p.faction === 'choam' ? g.choamMovementBonus : 0);
|
||||
const ordinary = base + (p.faction === 'choam' ? g.choamMovementBonus : 0);
|
||||
return planetologist && planetologistLeader(g, p.id)
|
||||
? planetologistRange(ordinary, planetologist)
|
||||
: ordinary;
|
||||
}
|
||||
export function botGroundMoveAllowed(
|
||||
g: GameView,
|
||||
@@ -82,6 +95,7 @@ export function botGroundMoveAllowed(
|
||||
from: string,
|
||||
to: string,
|
||||
elite: number,
|
||||
planetologist?: PlanetologistMoveMode,
|
||||
) {
|
||||
const source = splitLocation(from),
|
||||
target = splitLocation(to);
|
||||
@@ -117,7 +131,7 @@ export function botGroundMoveAllowed(
|
||||
(loc.sector !== 0 && loc.sector === g.storm) ||
|
||||
strongholdPathBlocked(g.players, p.id, loc.territory, advisors)
|
||||
);
|
||||
}) <= botMovementRange(g, p, elite)
|
||||
}) <= botMovementRange(g, p, elite, planetologist)
|
||||
);
|
||||
}
|
||||
/** Fremen reinforcement radius is static territory geometry, not a ground route. */
|
||||
|
||||
Reference in new issue
Block a user