import { Player, PlayerPhantom } from "../model/tactic/Player" import { TacticComponent, TacticContent } from "../model/tactic/Tactic" import { removeComponent, updateComponent } from "./TacticContentDomains" import { removeAllActionsTargeting } from "./ActionsDomains" export function getOrigin( pathItem: PlayerPhantom, components: TacticComponent[], ): Player { // Trust the components to contains only phantoms with valid player origin identifiers return components.find((c) => c.id == pathItem.originPlayerId)! as Player } export function removePlayerPath( player: Player, content: TacticContent, ): TacticContent { if (player.path == null) { return content } for (const pathElement of player.path.items) { content = removeComponent(pathElement, content) } return updateComponent( { ...player, path: null, }, content, ) } export function removePlayer( player: Player | PlayerPhantom, content: TacticContent, ): TacticContent { content = removeAllActionsTargeting(player.id, content) if (player.type == "phantom") { const origin = getOrigin(player, content.components) return truncatePlayerPath(origin, player, content) } content = removePlayerPath(player, content) return removeComponent(player.id, content) } export function truncatePlayerPath( player: Player, phantom: PlayerPhantom, content: TacticContent, ): TacticContent { if (player.path == null) return content const path = player.path! let truncateStartIdx = -1 for (let i = 0; i < path.items.length; i++) { const pathPhantomId = path.items[i] if (truncateStartIdx != -1 || pathPhantomId == phantom.id) { if (truncateStartIdx == -1) truncateStartIdx = i //remove the phantom from the tactic content = removeComponent(pathPhantomId, content) } } return updateComponent( { ...player, path: truncateStartIdx == 0 ? null : { ...path, items: path.items.toSpliced(truncateStartIdx), }, }, content, ) }