mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-25 11:12:42 +00:00
update unitlayer to use new api
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { Colord } from "colord";
|
||||
import { Theme } from "../../../core/configuration/Config";
|
||||
import { Unit, Cell, Game, Tile, UnitType, Player } from "../../../core/game/Game";
|
||||
import { Unit, Cell, Game, Tile, UnitType, Player, UnitUpdate } from "../../../core/game/Game";
|
||||
import { bfs, dist, euclDist } from "../../../core/Util";
|
||||
import { Layer } from "./Layer";
|
||||
import { EventBus } from "../../../core/EventBus";
|
||||
@@ -14,10 +14,6 @@ enum Relationship {
|
||||
Enemy
|
||||
}
|
||||
|
||||
class UnitEvent {
|
||||
constructor(public unit: Unit, public oldTile: Tile) { }
|
||||
}
|
||||
|
||||
export class UnitLayer implements Layer {
|
||||
private canvas: HTMLCanvasElement;
|
||||
private context: CanvasRenderingContext2D;
|
||||
@@ -46,13 +42,12 @@ export class UnitLayer implements Layer {
|
||||
if (this.myPlayer == null) {
|
||||
this.myPlayer = this.game.playerByClientID(this.clientID)
|
||||
}
|
||||
for (const unit of this.game.units()) {
|
||||
this.onUnitEvent(new UnitEvent(unit, unit.tile()))
|
||||
for (const unit of this.game.recentlyUpdatedUnits()) {
|
||||
this.onUnitEvent(unit)
|
||||
}
|
||||
}
|
||||
|
||||
init() {
|
||||
this.eventBus.on(UnitEvent, e => this.onUnitEvent(e));
|
||||
this.eventBus.on(AlternateViewEvent, e => this.onAlternativeViewEvent(e))
|
||||
this.redraw()
|
||||
}
|
||||
@@ -97,125 +92,125 @@ export class UnitLayer implements Layer {
|
||||
return Relationship.Enemy
|
||||
}
|
||||
|
||||
onUnitEvent(event: UnitEvent) {
|
||||
switch (event.unit.type()) {
|
||||
onUnitEvent(unit: Unit) {
|
||||
switch (unit.type()) {
|
||||
case UnitType.TransportShip:
|
||||
this.handleBoatEvent(event);
|
||||
this.handleBoatEvent(unit);
|
||||
break;
|
||||
case UnitType.Destroyer:
|
||||
this.handleDestroyerEvent(event);
|
||||
this.handleDestroyerEvent(unit);
|
||||
break;
|
||||
case UnitType.Battleship:
|
||||
this.handleBattleshipEvent(event);
|
||||
this.handleBattleshipEvent(unit);
|
||||
break;
|
||||
case UnitType.Shell:
|
||||
this.handleShellEvent(event)
|
||||
this.handleShellEvent(unit)
|
||||
break;
|
||||
case UnitType.TradeShip:
|
||||
this.handleTradeShipEvent(event)
|
||||
this.handleTradeShipEvent(unit)
|
||||
break;
|
||||
case UnitType.AtomBomb:
|
||||
case UnitType.HydrogenBomb:
|
||||
this.handleNuke(event)
|
||||
this.handleNuke(unit)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
private handleDestroyerEvent(event: UnitEvent) {
|
||||
const rel = this.relationship(event.unit)
|
||||
bfs(event.oldTile, euclDist(event.oldTile, 4)).forEach(t => {
|
||||
private handleDestroyerEvent(unit: Unit) {
|
||||
const rel = this.relationship(unit)
|
||||
bfs(unit.lastTile(), euclDist(unit.lastTile(), 4)).forEach(t => {
|
||||
this.clearCell(t.cell());
|
||||
});
|
||||
if (!event.unit.isActive()) {
|
||||
if (!unit.isActive()) {
|
||||
return
|
||||
}
|
||||
bfs(event.unit.tile(), euclDist(event.unit.tile(), 4))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255));
|
||||
bfs(event.unit.tile(), dist(event.unit.tile(), 3))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(event.unit.owner().info()), 255));
|
||||
bfs(unit.tile(), euclDist(unit.tile(), 4))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(unit.owner().info()), 255));
|
||||
bfs(unit.tile(), dist(unit.tile(), 3))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(unit.owner().info()), 255));
|
||||
}
|
||||
|
||||
private handleBattleshipEvent(event: UnitEvent) {
|
||||
const rel = this.relationship(event.unit)
|
||||
bfs(event.oldTile, euclDist(event.oldTile, 6)).forEach(t => {
|
||||
private handleBattleshipEvent(unit: Unit) {
|
||||
const rel = this.relationship(unit)
|
||||
bfs(unit.lastTile(), euclDist(unit.lastTile(), 6)).forEach(t => {
|
||||
this.clearCell(t.cell());
|
||||
});
|
||||
if (!event.unit.isActive()) {
|
||||
if (!unit.isActive()) {
|
||||
return
|
||||
}
|
||||
bfs(event.unit.tile(), euclDist(event.unit.tile(), 5))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(event.unit.owner().info()), 255));
|
||||
bfs(event.unit.tile(), dist(event.unit.tile(), 4))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255));
|
||||
bfs(event.unit.tile(), euclDist(event.unit.tile(), 1))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(event.unit.owner().info()), 255));
|
||||
bfs(unit.tile(), euclDist(unit.tile(), 5))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(unit.owner().info()), 255));
|
||||
bfs(unit.tile(), dist(unit.tile(), 4))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(unit.owner().info()), 255));
|
||||
bfs(unit.tile(), euclDist(unit.tile(), 1))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(unit.owner().info()), 255));
|
||||
}
|
||||
|
||||
private handleShellEvent(event: UnitEvent) {
|
||||
const rel = this.relationship(event.unit)
|
||||
private handleShellEvent(unit: Unit) {
|
||||
const rel = this.relationship(unit)
|
||||
|
||||
this.clearCell(event.oldTile.cell())
|
||||
if (this.oldShellTile.has(event.unit)) {
|
||||
this.clearCell(this.oldShellTile.get(event.unit).cell())
|
||||
this.clearCell(unit.lastTile().cell())
|
||||
if (this.oldShellTile.has(unit)) {
|
||||
this.clearCell(this.oldShellTile.get(unit).cell())
|
||||
}
|
||||
|
||||
this.oldShellTile.set(event.unit, event.oldTile)
|
||||
if (!event.unit.isActive()) {
|
||||
this.oldShellTile.set(unit, unit.lastTile())
|
||||
if (!unit.isActive()) {
|
||||
return
|
||||
}
|
||||
this.paintCell(event.unit.tile().cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255)
|
||||
this.paintCell(event.oldTile.cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255)
|
||||
this.paintCell(unit.tile().cell(), rel, this.theme.borderColor(unit.owner().info()), 255)
|
||||
this.paintCell(unit.lastTile().cell(), rel, this.theme.borderColor(unit.owner().info()), 255)
|
||||
}
|
||||
|
||||
|
||||
private handleNuke(event: UnitEvent) {
|
||||
const rel = this.relationship(event.unit)
|
||||
bfs(event.oldTile, euclDist(event.oldTile, 2)).forEach(t => {
|
||||
private handleNuke(unit: Unit) {
|
||||
const rel = this.relationship(unit)
|
||||
bfs(unit.lastTile(), euclDist(unit.lastTile(), 2)).forEach(t => {
|
||||
this.clearCell(t.cell());
|
||||
});
|
||||
if (event.unit.isActive()) {
|
||||
bfs(event.unit.tile(), euclDist(event.unit.tile(), 2))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255));
|
||||
if (unit.isActive()) {
|
||||
bfs(unit.tile(), euclDist(unit.tile(), 2))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(unit.owner().info()), 255));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private handleTradeShipEvent(event: UnitEvent) {
|
||||
const rel = this.relationship(event.unit)
|
||||
bfs(event.oldTile, euclDist(event.oldTile, 3)).forEach(t => {
|
||||
private handleTradeShipEvent(unit: Unit) {
|
||||
const rel = this.relationship(unit)
|
||||
bfs(unit.lastTile(), euclDist(unit.lastTile(), 3)).forEach(t => {
|
||||
this.clearCell(t.cell());
|
||||
});
|
||||
if (event.unit.isActive()) {
|
||||
bfs(event.unit.tile(), dist(event.unit.tile(), 2))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(event.unit.owner().info()), 255));
|
||||
if (unit.isActive()) {
|
||||
bfs(unit.tile(), dist(unit.tile(), 2))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(unit.owner().info()), 255));
|
||||
}
|
||||
if (event.unit.isActive()) {
|
||||
bfs(event.unit.tile(), dist(event.unit.tile(), 1))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255));
|
||||
if (unit.isActive()) {
|
||||
bfs(unit.tile(), dist(unit.tile(), 1))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(unit.owner().info()), 255));
|
||||
}
|
||||
}
|
||||
|
||||
private handleBoatEvent(event: UnitEvent) {
|
||||
const rel = this.relationship(event.unit)
|
||||
if (!this.boatToTrail.has(event.unit)) {
|
||||
this.boatToTrail.set(event.unit, new Set<Tile>());
|
||||
private handleBoatEvent(unit: Unit) {
|
||||
const rel = this.relationship(unit)
|
||||
if (!this.boatToTrail.has(unit)) {
|
||||
this.boatToTrail.set(unit, new Set<Tile>());
|
||||
}
|
||||
const trail = this.boatToTrail.get(event.unit);
|
||||
trail.add(event.oldTile);
|
||||
bfs(event.oldTile, dist(event.oldTile, 3)).forEach(t => {
|
||||
const trail = this.boatToTrail.get(unit);
|
||||
trail.add(unit.lastTile());
|
||||
bfs(unit.lastTile(), dist(unit.lastTile(), 3)).forEach(t => {
|
||||
this.clearCell(t.cell());
|
||||
});
|
||||
if (event.unit.isActive()) {
|
||||
if (unit.isActive()) {
|
||||
for (const t of trail) {
|
||||
this.paintCell(t.cell(), rel, this.theme.territoryColor(event.unit.owner().info()), 150);
|
||||
this.paintCell(t.cell(), rel, this.theme.territoryColor(unit.owner().info()), 150);
|
||||
}
|
||||
bfs(event.unit.tile(), dist(event.unit.tile(), 2))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(event.unit.owner().info()), 255));
|
||||
bfs(event.unit.tile(), dist(event.unit.tile(), 1))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(event.unit.owner().info()), 255));
|
||||
bfs(unit.tile(), dist(unit.tile(), 2))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.borderColor(unit.owner().info()), 255));
|
||||
bfs(unit.tile(), dist(unit.tile(), 1))
|
||||
.forEach(t => this.paintCell(t.cell(), rel, this.theme.territoryColor(unit.owner().info()), 255));
|
||||
} else {
|
||||
trail.forEach(t => this.clearCell(t.cell()));
|
||||
this.boatToTrail.delete(event.unit);
|
||||
this.boatToTrail.delete(unit);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ export class GameRunner {
|
||||
|
||||
this.callBack({
|
||||
tick: this.game.ticks(),
|
||||
units: this.game.units().map(u => u.toUpdate()),
|
||||
units: updates.filter(u => u.type == GameUpdateType.Unit),
|
||||
packedTileUpdates: updates.filter(u => u.type == GameUpdateType.Tile).map(u => packTileData(u)),
|
||||
players: playerViewData
|
||||
})
|
||||
|
||||
@@ -232,6 +232,7 @@ export class GameView {
|
||||
private _players = new Map<PlayerID, PlayerView>()
|
||||
private _units = new Map<number, UnitView>()
|
||||
private updatedTiles: TileView[] = []
|
||||
private updatedUnits: UnitView[] = []
|
||||
|
||||
constructor(public worker: WorkerClient, private _config: Config, private _terrainMap: TerrainMap) {
|
||||
// Initialize the 2D array
|
||||
@@ -276,11 +277,15 @@ export class GameView {
|
||||
this._units.set(unit.id, new UnitView(this, unit))
|
||||
}
|
||||
})
|
||||
this.updatedUnits = gu.units.map(u => this._units.get(u.id))
|
||||
}
|
||||
|
||||
recentlyUpdatedTiles(): TileView[] {
|
||||
return this.updatedTiles
|
||||
}
|
||||
recentlyUpdatedUnits(): UnitView[] {
|
||||
return this.updatedUnits
|
||||
}
|
||||
|
||||
player(id: PlayerID): PlayerView {
|
||||
if (this._players.has(id)) {
|
||||
|
||||
@@ -23,12 +23,12 @@ export class DevConfig extends DefaultConfig {
|
||||
// return 100
|
||||
}
|
||||
|
||||
// unitInfo(type: UnitType): UnitInfo {
|
||||
// const info = super.unitInfo(type)
|
||||
// const oldCost = info.cost
|
||||
// info.cost = (p: Player) => oldCost(p) / 10000
|
||||
// return info
|
||||
// }
|
||||
unitInfo(type: UnitType): UnitInfo {
|
||||
const info = super.unitInfo(type)
|
||||
const oldCost = info.cost
|
||||
info.cost = (p: Player) => oldCost(p) / 10000
|
||||
return info
|
||||
}
|
||||
|
||||
// tradeShipSpawnRate(): number {
|
||||
// return 10
|
||||
|
||||
Reference in New Issue
Block a user