mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-22 13:29:45 +00:00
chore: revert broken edits and restore PlayerImpl; prepare Nuke Wars UI changes
This commit is contained in:
@@ -190,12 +190,21 @@ export class SinglePlayerModal extends LitElement {
|
||||
${translateText("game_mode.teams")}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="option-card ${this.gameMode === GameMode.NukeWars
|
||||
? "selected"
|
||||
: ""}"
|
||||
@click=${() => this.handleGameModeSelection(GameMode.NukeWars)}
|
||||
>
|
||||
<div class="option-card-title">
|
||||
${translateText("game_mode.nukewars")}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
${this.gameMode === GameMode.FFA
|
||||
? ""
|
||||
: html`
|
||||
${this.gameMode === GameMode.Team
|
||||
? html`
|
||||
<!-- Team Count Selection -->
|
||||
<div class="options-section">
|
||||
<div class="option-title">
|
||||
@@ -220,7 +229,8 @@ export class SinglePlayerModal extends LitElement {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
`}
|
||||
`
|
||||
: ""}
|
||||
|
||||
<!-- Game Options -->
|
||||
<div class="options-section">
|
||||
|
||||
+1
-147
@@ -66,7 +66,6 @@ class Donation {
|
||||
export class PlayerImpl implements Player {
|
||||
public _lastTileChange: number = 0;
|
||||
public _pseudo_random: PseudoRandom;
|
||||
public _initialSpawnTile: TileRef | null = null;
|
||||
|
||||
private _gold: bigint;
|
||||
private _troops: bigint;
|
||||
@@ -176,7 +175,6 @@ export class PlayerImpl implements Player {
|
||||
hasSpawned: this.hasSpawned(),
|
||||
betrayals: stats?.betrayals,
|
||||
lastDeleteUnitTick: this.lastDeleteUnitTick,
|
||||
initialSpawnTile: this._initialSpawnTile ?? undefined,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -309,9 +307,6 @@ export class PlayerImpl implements Player {
|
||||
this._troops = toInt(troops);
|
||||
}
|
||||
conquer(tile: TileRef) {
|
||||
if (this._initialSpawnTile === null && this._tiles.size === 0) {
|
||||
this._initialSpawnTile = tile;
|
||||
}
|
||||
this.mg.conquer(this, tile);
|
||||
}
|
||||
orderRetreat(id: string) {
|
||||
@@ -916,79 +911,6 @@ export class PlayerImpl implements Player {
|
||||
});
|
||||
}
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
private isInTeamSpawnZone(tile: TileRef): boolean {
|
||||
const gameMode = this.mg.config().gameConfig().gameMode;
|
||||
if (gameMode !== GameMode.NukeWars) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const team = this.team();
|
||||
if (!team) return false;
|
||||
|
||||
// Simple geometric split:
|
||||
// Team 1 (first team) gets left half (x < width/2)
|
||||
// Team 2 (second team) gets right half (x >= width/2)
|
||||
const x = this.mg.x(tile);
|
||||
const mapWidth = this.mg.width();
|
||||
const midpoint = Math.floor(mapWidth / 2);
|
||||
|
||||
// Team 1 gets left half, Team 2 gets right half
|
||||
const isTeam1 = team === this.mg.teams()[0];
|
||||
return isTeam1 ? x < midpoint : x >= midpoint;
|
||||
}
|
||||
|
||||
private isNukeWars(): boolean {
|
||||
return this.mg.config().gameConfig().gameMode === GameMode.NukeWars;
|
||||
}
|
||||
|
||||
private isNukeWarsAndBaikal(): boolean {
|
||||
const gc = this.mg.config().gameConfig();
|
||||
return (
|
||||
gc.gameMode === GameMode.NukeWars && gc.gameMap === GameMapType.Baikal
|
||||
);
|
||||
}
|
||||
|
||||
private canBuildShipNukeWars(
|
||||
unitType: UnitType,
|
||||
targetTile: TileRef,
|
||||
): boolean {
|
||||
// Transport ships cannot enter enemy team territory
|
||||
if (unitType === UnitType.TransportShip) {
|
||||
const targetOwner = this.mg.owner(targetTile);
|
||||
if (
|
||||
targetOwner.isPlayer() &&
|
||||
!this.isOnSameTeam(targetOwner as Player)
|
||||
) {
|
||||
this.mg.displayMessage(
|
||||
"Transport ships cannot enter enemy team territory in Nuke Wars",
|
||||
MessageType.ATTACK_FAILED,
|
||||
this.id(),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Warships and TradeShips are allowed to go over to the enemy's spawn
|
||||
return true;
|
||||
}
|
||||
|
||||
private canBuildNukeNukeWars(unitType: UnitType): boolean {
|
||||
if (
|
||||
(unitType === UnitType.AtomBomb || unitType === UnitType.HydrogenBomb) &&
|
||||
this.mg.inPreparationPhase()
|
||||
) {
|
||||
this.mg.displayMessage(
|
||||
"Nuclear weapons cannot be launched during the preparation phase",
|
||||
MessageType.ATTACK_FAILED,
|
||||
this.id(),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
canBuild(
|
||||
unitType: UnitType,
|
||||
targetTile: TileRef,
|
||||
@@ -998,31 +920,10 @@ export class PlayerImpl implements Player {
|
||||
return false;
|
||||
}
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
if (this.isNukeWarsAndBaikal()) {
|
||||
if (!this.canBuildShipNukeWars(unitType, targetTile)) {
|
||||
return false;
|
||||
}
|
||||
if (
|
||||
this.mg.inPreparationPhase() &&
|
||||
!this.isInTeamSpawnZone(targetTile)
|
||||
) {
|
||||
this.mg.displayMessage(
|
||||
"During preparation phase, you can only build in your own territory",
|
||||
MessageType.ATTACK_FAILED,
|
||||
this.id(),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
const cost = this.mg.unitInfo(unitType).cost(this);
|
||||
if (!this.isAlive() || this.gold() < cost) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (unitType) {
|
||||
case UnitType.MIRV:
|
||||
if (!this.mg.hasOwner(targetTile)) {
|
||||
@@ -1031,12 +932,6 @@ export class PlayerImpl implements Player {
|
||||
return this.nukeSpawn(targetTile);
|
||||
case UnitType.AtomBomb:
|
||||
case UnitType.HydrogenBomb:
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
if (this.isNukeWars() && !this.canBuildNukeNukeWars(unitType)) {
|
||||
return false;
|
||||
}
|
||||
>>>>>>> Stashed changes
|
||||
return this.nukeSpawn(targetTile);
|
||||
case UnitType.MIRVWarhead:
|
||||
return targetTile;
|
||||
@@ -1138,16 +1033,7 @@ export class PlayerImpl implements Player {
|
||||
}
|
||||
|
||||
private validStructureSpawnTiles(tile: TileRef): TileRef[] {
|
||||
<<<<<<< Updated upstream
|
||||
if (this.mg.owner(tile) !== this) {
|
||||
=======
|
||||
const owner = this.mg.owner(tile);
|
||||
if (this.isNukeWars() && this.mg.inPreparationPhase()) {
|
||||
if (!owner.isPlayer() || !this.isOnSameTeam(owner as Player)) {
|
||||
return [];
|
||||
}
|
||||
} else if (owner !== this) {
|
||||
>>>>>>> Stashed changes
|
||||
return [];
|
||||
}
|
||||
const searchRadius = 15;
|
||||
@@ -1259,7 +1145,7 @@ export class PlayerImpl implements Player {
|
||||
return this._incomingAttacks;
|
||||
}
|
||||
|
||||
public canAttack(tile: TileRef, unitType: UnitType): boolean {
|
||||
public canAttack(tile: TileRef): boolean {
|
||||
if (
|
||||
this.mg.hasOwner(tile) &&
|
||||
this.mg.config().numSpawnPhaseTurns() +
|
||||
@@ -1282,38 +1168,6 @@ export class PlayerImpl implements Player {
|
||||
if (!this.mg.isLand(tile)) {
|
||||
return false;
|
||||
}
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
|
||||
// Nuke Wars specific attack rules
|
||||
if (this.isNukeWarsAndBaikal()) {
|
||||
const mapWidth = this.mg.width();
|
||||
const tx = this.mg.x(tile);
|
||||
const attackerLeft = this.smallID() % 2 === 1;
|
||||
const tileLeft = tx < Math.floor(mapWidth / 2);
|
||||
|
||||
// During spawn phase, only attack within own half
|
||||
if (this.mg.inSpawnPhase()) {
|
||||
if (attackerLeft !== tileLeft) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// After spawn phase, only nuclear missiles, warships, and tradeships can cross the midpoint
|
||||
const canCross =
|
||||
unitType === UnitType.AtomBomb ||
|
||||
unitType === UnitType.HydrogenBomb ||
|
||||
unitType === UnitType.MIRV ||
|
||||
unitType === UnitType.MIRVWarhead ||
|
||||
unitType === UnitType.Warship ||
|
||||
unitType === UnitType.TradeShip;
|
||||
|
||||
if (attackerLeft !== tileLeft && !canCross) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
if (this.mg.hasOwner(tile)) {
|
||||
return this.sharesBorderWith(other);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user