Allow Advanced advisors to use the physical Ornithopter

Adopt the supplied advisor/city distinction: advisors do not grant city access, but both printed physical-card modes permit advisor groups. Retain native stance/arrival/locks and distinct original cohorts; use shared advisor-aware paths and entry for minimal bot candidates. Add persistent guidance and genuine paid-acquisition/native-advisor regressions.

Validation: frozen10-file87/87, types/lint/build and three original-action/rendered-table programmes. Actual host/setup, cache1 purchase, foreign shipment/accompaniment and paid BG reinforcement cover range3, two groups and leaving the last city fighter. Eight minimal policy proposals remain legal; controlled geometry and UI checks are separate. No wider combinations, complete modes, final assurance or browser/deployed acceptance claimed. No saved-room/reset/restart/deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 12:58:54 +11:00
1 parent 884a09fa92
commit 7fe84ffbbd
14 files changed
+634 -36

No files matched your search

+3 -9
View File
@@ -95,6 +95,7 @@ import { liveShipmentPromises, matchesShipment } from './shipment-promises';
import {
botEntryAllowed,
botGroundMoveAllowed,
groundMoveRouteDistance,
fremenReserveEntry,
guildTransportCost,
} from './bot-mobility';
@@ -479,13 +480,6 @@ function ornithopterMoves(g: GameView): Action[] {
? ['range3', 'twoGroups']
: ['twoGroups', 'range3'];
const result: Action[] = [];
const pathsBlocked = (key: string) => {
const loc = splitLocation(key);
return (
loc.sector === g.storm ||
strongholdPathBlocked(g.players, me.id, loc.territory)
);
};
const targets = destinations(g).filter(
(to) =>
to.t !== MOBILE_STRONGHOLD &&
@@ -511,7 +505,7 @@ function ornithopterMoves(g: GameView): Action[] {
if (
source.from === to.key ||
origin.sector === g.storm ||
isAdvisor(me, origin.territory) ||
!botEntryAllowed(g, me, to.t, to.s, 'move', origin.territory) ||
(origin.territory !== to.t &&
g.balisetRestrictions.some(
(b) => b.player === me.id && b.territory === to.t,
@@ -536,7 +530,7 @@ function ornithopterMoves(g: GameView): Action[] {
(me.faction === 'ixians' && elite > 0 && !me.ixMovementBlocked)
? 2
: 1) + (me.faction === 'choam' ? g.choamMovementBonus : 0);
const distance = gameDistance(g, source.from, to.key, pathsBlocked);
const distance = groundMoveRouteDistance(g, me, source.from, to.key);
if (
distance > (mode === 'range3' ? 3 : normalRange) ||
(!active && mode === 'range3' && distance <= normalRange)