You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
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,
|
|
)
|
|
}
|