From eece6423abd0ff1202beb3d1888bec8170bcc8b7 Mon Sep 17 00:00:00 2001 From: Greegko Date: Mon, 7 Nov 2022 11:26:08 +0100 Subject: [PATCH] update activities interface --- packages/core/src/core/module/module.ts | 4 ++-- .../src/modules/activity/activity-manager.ts | 16 ++++++++++------ .../core/src/modules/activity/activity-store.ts | 4 ++-- .../activity/interfaces/activity-handler.ts | 12 ++++++------ .../src/modules/activity/interfaces/activity.ts | 14 ++++++++++---- .../interfaces/get-activity-handler-by-tag.ts | 4 ++-- .../core/src/modules/battle/battle-activity.ts | 14 +++++++------- .../src/modules/game/interfaces/game-state.ts | 4 ++-- .../core/src/modules/map/activites/explore.ts | 14 +++++++------- .../core/src/modules/map/activites/travel.ts | 14 +++++++------- .../modules/village/activities/village-heal.ts | 17 ++++++++++------- .../training-field/activities/train-activity.ts | 15 +++++++-------- 12 files changed, 72 insertions(+), 60 deletions(-) diff --git a/packages/core/src/core/module/module.ts b/packages/core/src/core/module/module.ts index 81e7b32..6e8a2a1 100644 --- a/packages/core/src/core/module/module.ts +++ b/packages/core/src/core/module/module.ts @@ -1,7 +1,7 @@ import { ModuleConfig } from "@core/global-type"; import { IStore } from "@core/store"; -import { AnyActivity, IActivityHandler } from "@modules/activity"; +import { Activity, IActivityHandler } from "@modules/activity"; export interface ProvideClass { new (...args: any[]): any; @@ -17,7 +17,7 @@ export interface StoreClass { } export interface ActivityClass { - new (...args: any[]): IActivityHandler; + new (...args: any[]): IActivityHandler; } export interface ModulActivity { diff --git a/packages/core/src/modules/activity/activity-manager.ts b/packages/core/src/modules/activity/activity-manager.ts index b216a10..bd14d76 100644 --- a/packages/core/src/modules/activity/activity-manager.ts +++ b/packages/core/src/modules/activity/activity-manager.ts @@ -6,7 +6,7 @@ import { GetActivityHandlerToken } from "@core/module/tokens"; import { PartyStore } from "@modules/party"; import { ActivityStore } from "./activity-store"; -import { ActivityType, GetActivityHandlerByName, PartyActivity, PartyActivityStartArgs } from "./interfaces"; +import { Activity, ActivityType, GetActivityHandlerByName, PartyActivityStartArgs } from "./interfaces"; @injectable() export class ActivityManager { @@ -28,6 +28,7 @@ export class ActivityManager { type: ActivityType.Party, startArgs: startingArgs, }); + this.partyStore.setActivity(startingArgs.partyId, activity.id); if (startingArgs.involvedPartyId) { this.partyStore.setActivity(startingArgs.involvedPartyId, activity.id); @@ -39,18 +40,21 @@ export class ActivityManager { forEach(activity => this.executeActivity(activity), values(this.activityStore.getState())); } - private executeActivity(activity: PartyActivity) { + private executeActivity(activity: Activity) { const activityHandler = this.getActivityHandler(activity.name); const activityNewState = activityHandler.execute(activity); - const updatedActivity = assoc("state", activityNewState, activity); + const updatedActivity = assoc("state", activityNewState, activity) as Activity; const isDone = activityHandler.isDone(updatedActivity); if (isDone) { activityHandler.resolve(updatedActivity); this.activityStore.remove(activity.id); - this.partyStore.clearActivity(activity.startArgs.partyId); - if (activity.startArgs.involvedPartyId) { - this.partyStore.clearActivity(activity.startArgs.involvedPartyId); + + if(activity.type === ActivityType.Party) { + this.partyStore.clearActivity(activity.startArgs.partyId); + if (activity.startArgs.involvedPartyId) { + this.partyStore.clearActivity(activity.startArgs.involvedPartyId); + } } } else { this.activityStore.update(activity.id, updatedActivity); diff --git a/packages/core/src/modules/activity/activity-store.ts b/packages/core/src/modules/activity/activity-store.ts index d71cec7..edde40b 100644 --- a/packages/core/src/modules/activity/activity-store.ts +++ b/packages/core/src/modules/activity/activity-store.ts @@ -1,5 +1,5 @@ import { EntityStore } from "@core/store"; -import { ActivityID, PartyActivity } from "./interfaces"; +import { ActivityID, Activity } from "./interfaces"; -export class ActivityStore extends EntityStore {} +export class ActivityStore extends EntityStore {} diff --git a/packages/core/src/modules/activity/interfaces/activity-handler.ts b/packages/core/src/modules/activity/interfaces/activity-handler.ts index cf1c041..4111344 100644 --- a/packages/core/src/modules/activity/interfaces/activity-handler.ts +++ b/packages/core/src/modules/activity/interfaces/activity-handler.ts @@ -1,9 +1,9 @@ import { Activity } from "./activity"; -export interface IActivityHandler { - start(startArgs: A['startArgs']): A['state']; - isRunnable(startArgs: A['startArgs']): boolean; - isDone(activity: Activity): boolean; - execute(activity: Activity): A['state']; - resolve(activity: Activity): void; +export interface IActivityHandler { + start(startArgs: T['startArgs']): T['state']; + isRunnable(startArgs: T['startArgs']): boolean; + isDone(activity: T): boolean; + execute(activity: T): T['state']; + resolve(activity: T): void; } diff --git a/packages/core/src/modules/activity/interfaces/activity.ts b/packages/core/src/modules/activity/interfaces/activity.ts index a94f5a2..d954bc4 100644 --- a/packages/core/src/modules/activity/interfaces/activity.ts +++ b/packages/core/src/modules/activity/interfaces/activity.ts @@ -3,9 +3,10 @@ import { PartyID } from "@modules/party"; export type ActivityID = string; export enum ActivityType { Party = "party", + Global = "global" } -export type Activity = { +type ActivityBase = { id: ActivityID; state: State; name: string; @@ -13,13 +14,18 @@ export type Activity = { type: ActivityType; }; -export type AnyActivity = Activity; - export type PartyActivityStartArgs = { partyId: PartyID; involvedPartyId?: PartyID; }; -export type PartyActivity = Activity & { +export interface GlobalActivity extends ActivityBase { + type: ActivityType.Global; + +} + +export interface PartyActivity extends ActivityBase { type: ActivityType.Party; }; + +export type Activity = GlobalActivity | PartyActivity; diff --git a/packages/core/src/modules/activity/interfaces/get-activity-handler-by-tag.ts b/packages/core/src/modules/activity/interfaces/get-activity-handler-by-tag.ts index e2f45e7..0e21255 100644 --- a/packages/core/src/modules/activity/interfaces/get-activity-handler-by-tag.ts +++ b/packages/core/src/modules/activity/interfaces/get-activity-handler-by-tag.ts @@ -1,4 +1,4 @@ -import { AnyActivity } from "./activity"; +import { Activity } from "./activity"; import { IActivityHandler } from "./activity-handler"; -export type GetActivityHandlerByName = (name: string) => IActivityHandler; +export type GetActivityHandlerByName = (name: string) => IActivityHandler; diff --git a/packages/core/src/modules/battle/battle-activity.ts b/packages/core/src/modules/battle/battle-activity.ts index 3458f1e..f607f83 100644 --- a/packages/core/src/modules/battle/battle-activity.ts +++ b/packages/core/src/modules/battle/battle-activity.ts @@ -4,7 +4,7 @@ import { complement, prop } from "ramda"; import { ModuleConfig } from "@core/global-type"; import { ModuleConfigToken } from "@core/module/tokens"; -import { Activity, IActivityHandler } from "@modules/activity"; +import { IActivityHandler, PartyActivity } from "@modules/activity"; import { PartyID, PartyService } from "@modules/party"; import { isAlive } from "@modules/unit"; import { VillageStashService } from "@modules/village"; @@ -14,11 +14,11 @@ import { BattleService } from "./battle-service"; import { BattleID } from "./interfaces"; import { calculateLoot, calculateXpGain } from "./lib"; -export type BattleState = { battleId: BattleID }; -export type BattleStartArgs = { partyId: PartyID; involvedPartyId: PartyID }; +type BattleState = { battleId: BattleID }; +type BattleStartArgs = { partyId: PartyID; involvedPartyId: PartyID }; @injectable() -export class BattleActivity implements IActivityHandler> { +export class BattleActivity implements IActivityHandler> { constructor( private partyService: PartyService, private battleService: BattleService, @@ -36,17 +36,17 @@ export class BattleActivity implements IActivityHandler): BattleState { + execute(activity: PartyActivity): BattleState { this.battleService.turnBattle(activity.state.battleId); return activity.state; } - isDone({ state: { battleId } }: Activity): boolean { + isDone({ state: { battleId } }: PartyActivity): boolean { return this.battleService.isDoneBattle(battleId); } - resolve({ state }: Activity) { + resolve({ state }: PartyActivity) { const battle = this.battleService.getBattle(state.battleId); const [winnerPartyId, looserPartyId] = this.partyService.isPartyAlive(battle.partyId) diff --git a/packages/core/src/modules/game/interfaces/game-state.ts b/packages/core/src/modules/game/interfaces/game-state.ts index 76fc470..9f4d640 100644 --- a/packages/core/src/modules/game/interfaces/game-state.ts +++ b/packages/core/src/modules/game/interfaces/game-state.ts @@ -1,4 +1,4 @@ -import { ActivityID, PartyActivity } from "@modules/activity"; +import { Activity, ActivityID } from "@modules/activity"; import { BattleID, BattleStoreState } from "@modules/battle"; import { Map, MapID, MapLocation, MapLocationID } from "@modules/map"; import { Party, PartyID } from "@modules/party"; @@ -8,7 +8,7 @@ import { VillageState } from "@modules/village"; import { GeneralGameStoreState } from "./general-game-store-state"; export type GameState = { - activities: Record>; + activities: Record; battle: Record; units: Record; parties: Record; diff --git a/packages/core/src/modules/map/activites/explore.ts b/packages/core/src/modules/map/activites/explore.ts index 670abc3..bc82051 100644 --- a/packages/core/src/modules/map/activites/explore.ts +++ b/packages/core/src/modules/map/activites/explore.ts @@ -1,23 +1,23 @@ import { injectable } from "inversify"; import { dec, evolve } from "ramda"; -import { Activity, IActivityHandler } from "@modules/activity"; +import { PartyActivity, IActivityHandler } from "@modules/activity"; import { PartyID, PartyStore } from "@modules/party"; import { MapLocationStore } from "../map-location-store"; import { MapService } from "../map-service"; -export type ExploreState = { +type ExploreState = { progress: number; partyId: PartyID; }; -export type ExploreStartArgs = { +type ExploreStartArgs = { partyId: PartyID; }; @injectable() -export class MapExploreActivity implements IActivityHandler> { +export class MapExploreActivity implements IActivityHandler> { constructor( private mapService: MapService, private mapLocationStore: MapLocationStore, @@ -37,15 +37,15 @@ export class MapExploreActivity implements IActivityHandler): ExploreState { + execute({ state }: PartyActivity): ExploreState { return evolve({ progress: dec }, state); } - isDone({ state }: Activity): boolean { + isDone({ state }: PartyActivity): boolean { return state.progress === 0; } - resolve({ state }: Activity) { + resolve({ state }: PartyActivity) { this.mapService.exploreLocation(this.partyStore.get(state.partyId).locationId); } } diff --git a/packages/core/src/modules/map/activites/travel.ts b/packages/core/src/modules/map/activites/travel.ts index 6e8050d..9929a8d 100644 --- a/packages/core/src/modules/map/activites/travel.ts +++ b/packages/core/src/modules/map/activites/travel.ts @@ -3,25 +3,25 @@ import { dec, evolve } from "ramda"; import { EventSystem } from "@core/event"; -import { Activity, IActivityHandler } from "@modules/activity"; +import { PartyActivity, IActivityHandler } from "@modules/activity"; import { PartyEvent, PartyID, PartyStore } from "@modules/party"; import { MapLocationID } from "../interfaces"; import { MapService } from "../map-service"; -export type TravelState = { +type TravelState = { partyId: PartyID; targetLocationId: MapLocationID; progress: number; }; -export type TravelStartArgs = { +type TravelStartArgs = { partyId: PartyID; targetLocationId: MapLocationID; }; @injectable() -export class MapTravelActivity implements IActivityHandler> { +export class MapTravelActivity implements IActivityHandler> { constructor(private partyStore: PartyStore, private mapService: MapService, private eventSystem: EventSystem) {} start({ partyId, targetLocationId }: TravelStartArgs): TravelState { @@ -40,15 +40,15 @@ export class MapTravelActivity implements IActivityHandler): TravelState { + execute({ state }: PartyActivity): TravelState { return evolve({ progress: dec }, state); } - isDone({ state }: Activity): boolean { + isDone({ state }: PartyActivity): boolean { return state.progress === 0; } - resolve({ state }: Activity) { + resolve({ state }: PartyActivity) { this.partyStore.setLocation(state.partyId, state.targetLocationId); this.eventSystem.fire(PartyEvent.ArrivedToLocation, { partyId: state.partyId, diff --git a/packages/core/src/modules/village/activities/village-heal.ts b/packages/core/src/modules/village/activities/village-heal.ts index 1834c39..5d725c6 100644 --- a/packages/core/src/modules/village/activities/village-heal.ts +++ b/packages/core/src/modules/village/activities/village-heal.ts @@ -1,19 +1,22 @@ import { injectable } from "inversify"; import { filter, forEach, map } from "ramda"; -import { Activity, IActivityHandler } from "@modules/activity"; +import { PartyActivity, IActivityHandler } from "@modules/activity"; import { PartyID, PartyStore } from "@modules/party"; import { UnitID, UnitService, UnitStore } from "@modules/unit"; -export type VillageHealState = { +type VillageHealState = { partyId: PartyID; }; -export type VillageHealStartArgs = VillageHealState; -export type RecoverableUnit = { id: UnitID; hp: number; maxhp: number }; +type VillageHealStartArgs = { + partyId: PartyID; +}; + +type RecoverableUnit = { id: UnitID; hp: number; maxhp: number }; @injectable() -export class VillageHealActivity implements IActivityHandler> { +export class VillageHealActivity implements IActivityHandler> { constructor(private unitStore: UnitStore, private unitService: UnitService, private partyStore: PartyStore) {} start({ partyId }: VillageHealStartArgs): VillageHealState { @@ -26,7 +29,7 @@ export class VillageHealActivity implements IActivityHandler 0; } - execute({ state }: Activity): VillageHealState { + execute({ state }: PartyActivity): VillageHealState { const recoverableUnits = this.getRecoverableUnits(state.partyId); forEach(unit => this.unitService.healUnit(unit.id, Math.ceil(unit.maxhp / 10)), recoverableUnits); @@ -34,7 +37,7 @@ export class VillageHealActivity implements IActivityHandler): boolean { + isDone({ state: { partyId } }: PartyActivity): boolean { return this.getRecoverableUnits(partyId).length === 0; } diff --git a/packages/core/src/modules/village/buildings/training-field/activities/train-activity.ts b/packages/core/src/modules/village/buildings/training-field/activities/train-activity.ts index f11c302..1abc00f 100644 --- a/packages/core/src/modules/village/buildings/training-field/activities/train-activity.ts +++ b/packages/core/src/modules/village/buildings/training-field/activities/train-activity.ts @@ -1,20 +1,19 @@ import { injectable } from "inversify"; import { dec, evolve, forEach } from "ramda"; -import { Activity, IActivityHandler } from "@modules/activity"; +import { PartyActivity, IActivityHandler } from "@modules/activity"; import { PartyID, PartyStore } from "@modules/party"; -import { UnitID, UnitService } from "@modules/unit"; +import { UnitService } from "@modules/unit"; -export type TrainingFieldState = { +type TrainingFieldState = { partyId: PartyID; progress: number; }; -export type TrainingFieldStartArgs = TrainingFieldState; -export type RecoverableUnit = { id: UnitID; hp: number; maxhp: number }; +type TrainingFieldStartArgs = TrainingFieldState; @injectable() -export class TrainingFieldTrainActivity implements IActivityHandler> { +export class TrainingFieldTrainActivity implements IActivityHandler> { constructor(private unitService: UnitService, private partyStore: PartyStore) {} start({ partyId }: TrainingFieldStartArgs): TrainingFieldState { @@ -28,7 +27,7 @@ export class TrainingFieldTrainActivity implements IActivityHandler): TrainingFieldState { + execute({ state }: PartyActivity): TrainingFieldState { const units = this.partyStore.get(state.partyId).unitIds; forEach(unitId => this.unitService.gainXpUnit(unitId, 25), units); @@ -36,7 +35,7 @@ export class TrainingFieldTrainActivity implements IActivityHandler): boolean { + isDone({ state }: PartyActivity): boolean { return state.progress === 0; }