diff --git a/@sammo/game_logic/src/Nation.ts b/@sammo/game_logic/src/Nation.ts index 4a7503f..513c7b0 100644 --- a/@sammo/game_logic/src/Nation.ts +++ b/@sammo/game_logic/src/Nation.ts @@ -41,33 +41,42 @@ export class Nation extends LazyEntityUpdater { constructor( raw: INationEntity, - protected readonly rsc: IResourceController + protected readonly rsc: IResourceController, + bootstrapInfo: { + general: GeneralID[]; + squad: SquadID[]; + city: CityID[]; + }, ) { super(); this._raw = raw; + this._bootstrapInfo = bootstrapInfo; } + private _bootstrapInfo?: ConstructorParameters[2]; bootstrap() { const rsc = this.rsc; - const raw = this._raw; - //raw값만 읽을것 - for (const city of rsc.cityList.values()) { - if (city.raw.nationID !== raw.id) { - continue; - } + const bootstrapInfo = must(this._bootstrapInfo); + delete this._bootstrapInfo; + + const nationID = this._raw.id; + + const bootstrapCityID = bootstrapInfo.city; + for (const city of bootstrapCityID.map((id) => must(rsc.cityList.get(id)))) { this.cityList.set(city.id, new WeakRef(city)); } + + const bootstrapSquadID = bootstrapInfo.squad; for (const squad of rsc.squadList.values()) { - if (squad.raw.nationID !== raw.id) { + if (squad.raw.nationID !== nationID) { continue; } this.squadList.set(squad.id, new WeakRef(squad)); } - for (const general of rsc.generalList.values()) { - if (general.raw.nationID !== raw.id) { - continue; - } + + const bootstrapGeneralID = bootstrapInfo.general; + for (const general of bootstrapGeneralID.map((id) => must(rsc.generalList.get(id)))) { this.generalList.set(general.id, new WeakRef(general)); if (general.isUser) { @@ -93,7 +102,6 @@ export class Nation extends LazyEntityUpdater { this.staffList.set(staffLevel, new WeakRef(general)); } } - } public get id(): NationID { diff --git a/@sammo/game_logic/src/Squad.ts b/@sammo/game_logic/src/Squad.ts index 8fad8e1..18473a1 100644 --- a/@sammo/game_logic/src/Squad.ts +++ b/@sammo/game_logic/src/Squad.ts @@ -15,15 +15,24 @@ export class Squad extends LazyEntityUpdater { constructor( raw: ISquadEntity, protected rsc: IResourceController, - private _rawMembers: GeneralID[] - ){ + bootstrapInfo: { + general: GeneralID[] + } + ) { super(); this._raw = raw; + this._bootstrapInfo = bootstrapInfo; } - public bootstrap(){ - this._members = new Map(this._rawMembers.map((id)=>{ - return [id, new WeakRef(must(this.rsc.general(id)))]; + private _bootstrapInfo?: ConstructorParameters[2]; + public bootstrap() { + const rsc = this.rsc; + + const bootstrapInfo = must(this._bootstrapInfo); + delete this._bootstrapInfo; + + this._members = new Map(bootstrapInfo.general.map((id) => { + return [id, new WeakRef(must(rsc.general(id)))]; })); const leaderID = this._raw.id as GeneralID; @@ -32,11 +41,11 @@ export class Squad extends LazyEntityUpdater { this._members.delete(leaderID); } - public get id(){ + public get id() { return this._raw.id; } - public get leader(){ + public get leader() { return must(this._leader.deref()); } @@ -44,12 +53,12 @@ export class Squad extends LazyEntityUpdater { return this._members; } - public destroySquad(withLeader = true){ - this._members.forEach((member)=>{ + public destroySquad(withLeader = true) { + this._members.forEach((member) => { const general = must(member.deref()); general.quitSquad(); }); - if(withLeader){ + if (withLeader) { this.leader.quitSquad(); } @@ -58,8 +67,8 @@ export class Squad extends LazyEntityUpdater { this.rsc.reserveDelete(this); } - public changeName(name: string){ - this.update((raw)=>{ + public changeName(name: string) { + this.update((raw) => { raw.name = name; }); } diff --git a/@sammo/server/src/ResourceController.ts b/@sammo/server/src/ResourceController.ts index 9ab1288..0aa23db 100644 --- a/@sammo/server/src/ResourceController.ts +++ b/@sammo/server/src/ResourceController.ts @@ -19,7 +19,7 @@ import type { IGameEnvEntity } from "@sammo/game_logic/src/Entity/GameEnvEntity. type ChangeType = "insert" | "update" | "delete"; //TODO: Implement! -export class ResourceController implements IResourceController{ +export class ResourceController implements IResourceController { constructor( private readonly db: Mongoose ) { @@ -59,10 +59,10 @@ export class ResourceController implements IResourceController{ squad(id: SquadID, nation: NationID): Squad | undefined { const squad = this.squadList.get(id); - if(!squad){ + if (!squad) { return undefined; } - if(squad.raw.nationID !== nation){ + if (squad.raw.nationID !== nation) { return undefined; } return squad; @@ -81,7 +81,7 @@ export class ResourceController implements IResourceController{ } insertGeneralTurnTimeQueue(general: General, maybeTail: boolean): void { - insertItemAtArrayLike(this._generalByTurnTime, general, (a, b)=>a.compareTurnTime(b), maybeTail); + insertItemAtArrayLike(this._generalByTurnTime, general, (a, b) => a.compareTurnTime(b), maybeTail); } allNations(): Map { @@ -185,44 +185,67 @@ export class ResourceController implements IResourceController{ const rawGeneralList = new Map(); - const rawGeneralListBySquad = new Map(); - for(const rawSquad of rawSquadList.values()){ - rawGeneralListBySquad.set(rawSquad.id, []); + const generalIDByNation = new Map(); + const generalIDListBySquad = new Map(); + for (const rawSquad of rawSquadList.values()) { + generalIDListBySquad.set(rawSquad.id, []); } - for(const rawGeneral of rawGeneralList.values()){ - if(!rawGeneral.squadID){ + for (const rawGeneral of rawGeneralList.values()) { + if (!rawGeneral.squadID) { continue; } - const list = must(rawGeneralListBySquad.get(rawGeneral.squadID)); + const list = must(generalIDListBySquad.get(rawGeneral.squadID)); list.push(rawGeneral.id); } + const cityIDByNation = new Map(); + for (const rawCity of rawCityList.values()) { + const list = must(cityIDByNation.get(rawCity.nationID)); + list.push(rawCity.id); + } + + const squadIDByNation = new Map(); + for (const rawSquad of rawSquadList.values()) { + const list = must(squadIDByNation.get(rawSquad.nationID)); + list.push(rawSquad.id); + } + this._gameEnv = new GameEnv(rawGameEnv, this); this._gameEnv.bootstrap(); - for(const rawNation of rawNationList.values()){ - const nation = new Nation(rawNation, this); + for (const rawNation of rawNationList.values()) { + const nation = new Nation( + rawNation, + this, + { + general: must(generalIDByNation.get(rawNation.id)), + squad: squadIDByNation.get(rawNation.id) ?? [], + city: cityIDByNation.get(rawNation.id) ?? [], + } + ); this.nationList.set(nation.id, nation); } - for(const rawCity of rawCityList.values()){ + for (const rawCity of rawCityList.values()) { const city = new City(rawCity, this); this.cityList.set(city.id, city); } - for(const rawSquad of rawSquadList.values()){ - const squad = new Squad(rawSquad, this, must(rawGeneralListBySquad.get(rawSquad.id))); + for (const rawSquad of rawSquadList.values()) { + const squad = new Squad(rawSquad, this, { + general: generalIDListBySquad.get(rawSquad.id) ?? [] + }); this.squadList.set(squad.id, squad); } - for(const rawGeneral of rawGeneralList.values()){ + for (const rawGeneral of rawGeneralList.values()) { const general = new General(rawGeneral, this); this.generalList.set(general.id, general); } //lazyInit()을 호출한다. - this.nationList.forEach(nation=>nation.bootstrap()); - this.cityList.forEach(city=>city.bootstrap()); - this.squadList.forEach(squad=>squad.bootstrap()); + this.nationList.forEach(nation => nation.bootstrap()); + this.cityList.forEach(city => city.bootstrap()); + this.squadList.forEach(squad => squad.bootstrap()); //iAction때문에 general의 lazyInit이 가장 마지막 - this.generalList.forEach(general=>general.bootstrap()); + this.generalList.forEach(general => general.bootstrap()); throw new NotYetImplemented(); }