/* ** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved. ** ** File: missionIGC.h ** ** Author: ** ** Description: ** Header for the CmissionIGC class. This file was initially created by ** the ATL wizard. ** ** History: */ // missionIGC.h : Declaration of the CmissionIGC #ifndef __MISSIONIGC_H_ #define __MISSIONIGC_H_ struct Constants { float floatConstants[c_fcidMax]; float damageConstants[c_dmgidMax][c_defidMax]; }; //Define a class that will handle all of the static data (for all missions) class CstaticIGC { public: CstaticIGC(void); ~CstaticIGC(void) { } // IstaticIGC void Initialize(void) { } void Terminate(void) { { DroneTypeLinkIGC* l; while ((l = m_droneTypes.first()) != NULL) { l->data()->Terminate(); } } { StationTypeLinkIGC* l; while ((l = m_stationTypes.first()) != NULL) { l->data()->Terminate(); } } { HullTypeLinkIGC* l; while ((l = m_hullTypes.first()) != NULL) { l->data()->Terminate(); } } { ExpendableTypeLinkIGC* l; while ((l = m_expendableTypes.first()) != NULL) { l->data()->Terminate(); } } { PartTypeLinkIGC* l; while ((l = m_partTypes.first()) != NULL) { l->data()->Terminate(); } } { ProjectileTypeLinkIGC* l; while ((l = m_projectileTypes.first()) != NULL) { l->data()->Terminate(); } } { DevelopmentLinkIGC* l; while ((l = m_developments.first()) != NULL) { l->data()->Terminate(); } } { CivilizationLinkIGC* l; while ((l = m_civilizations.first()) != NULL) { l->data()->Terminate(); } } { TreasureSetLinkIGC* l; while ((l = m_treasureSets.first()) != NULL) { l->data()->Terminate(); } } assert (m_stationTypes.n() == 0); assert (m_hullTypes.n() == 0); assert (m_partTypes.n() == 0); assert (m_projectileTypes.n() == 0); assert (m_developments.n() == 0); assert (m_droneTypes.n() == 0); assert (m_civilizations.n() == 0); assert (m_treasureSets.n() == 0); if (m_pptAmmoPack) { m_pptAmmoPack->Release(); m_pptAmmoPack = NULL; } if (m_pptFuelPack) { m_pptFuelPack->Release(); m_pptFuelPack = NULL; } } virtual float GetFloatConstant(FloatConstantID fcid) const { assert (fcid >= 0); assert (fcid < c_fcidMax); return m_constants.floatConstants[fcid]; } virtual void SetFloatConstant(FloatConstantID fcid, float f) { assert (fcid >= 0); assert (fcid < c_fcidMax); m_constants.floatConstants[fcid] = f; } virtual float GetDamageConstant(DamageTypeID dmgid, DefenseTypeID defid) const { assert ((dmgid & c_dmgidMask) >= 0); assert ((dmgid & c_dmgidMask) < c_dmgidMax); assert (defid >= 0); assert (defid < c_defidMax); return m_constants.damageConstants[dmgid & c_dmgidMask][defid]; } virtual void SetDamageConstant(DamageTypeID dmgid, DefenseTypeID defid, float f) { assert ((dmgid & c_dmgidMask) >= 0); assert ((dmgid & c_dmgidMask) < c_dmgidMax); assert (defid >= 0); assert (defid < c_defidMax); m_constants.damageConstants[dmgid & c_dmgidMask][defid] = f; } virtual const void* GetConstants(void) const { return &m_constants; } virtual void SetConstants(const void* pf) { memcpy(&m_constants, pf, sizeof(m_constants)); } virtual int GetSizeOfConstants(void) const { return sizeof(m_constants); } void AddDroneType(IdroneTypeIGC* dt) { AddIbaseIGC((BaseListIGC*)&m_droneTypes, dt); } void DeleteDroneType(IdroneTypeIGC* dt) { DeleteIbaseIGC((BaseListIGC*)&m_droneTypes, dt); } IdroneTypeIGC* GetDroneType(DroneTypeID id) const { return (IdroneTypeIGC*)GetIbaseIGC((BaseListIGC*)&m_droneTypes, id); } const DroneTypeListIGC* GetDroneTypes(void) const { return &m_droneTypes; } void AddDevelopment(IdevelopmentIGC* d) { AddIbaseIGC((BaseListIGC*)&m_developments, d); } void DeleteDevelopment(IdevelopmentIGC* d) { DeleteIbaseIGC((BaseListIGC*)&m_developments, d); } IdevelopmentIGC* GetDevelopment(DevelopmentID id) const { return (IdevelopmentIGC*)GetIbaseIGC((BaseListIGC*)&m_developments, id); } const DevelopmentListIGC* GetDevelopments(void) const { return &m_developments; } void AddStationType(IstationTypeIGC* st) { AddIbaseIGC((BaseListIGC*)&m_stationTypes, st); } void DeleteStationType(IstationTypeIGC* st) { DeleteIbaseIGC((BaseListIGC*)&m_stationTypes, st); } IstationTypeIGC* GetStationType(StationTypeID id) const { return (IstationTypeIGC*)GetIbaseIGC((BaseListIGC*)&m_stationTypes, id); } const StationTypeListIGC* GetStationTypes(void) const { return &m_stationTypes; } void AddCivilization(IcivilizationIGC* c) { AddIbaseIGC((BaseListIGC*)&m_civilizations, c); } void DeleteCivilization(IcivilizationIGC* c) { DeleteIbaseIGC((BaseListIGC*)&m_civilizations, c); } IcivilizationIGC* GetCivilization(CivID id) const { return (IcivilizationIGC*)GetIbaseIGC((BaseListIGC*)&m_civilizations, id); } const CivilizationListIGC* GetCivilizations(void) const { return &m_civilizations; } void AddHullType(IhullTypeIGC* ht) { AddIbaseIGC((BaseListIGC*)&m_hullTypes, ht); } void DeleteHullType(IhullTypeIGC* ht) { DeleteIbaseIGC((BaseListIGC*)&m_hullTypes, ht); } IhullTypeIGC* GetHullType(HullID id) const { return (IhullTypeIGC*)GetIbaseIGC((BaseListIGC*)&m_hullTypes, id); } const HullTypeListIGC* GetHullTypes(void) const { return &m_hullTypes; } void AddExpendableType(IexpendableTypeIGC* mt) { AddIbaseIGC((BaseListIGC*)&m_expendableTypes, mt); } void DeleteExpendableType(IexpendableTypeIGC* mt) { DeleteIbaseIGC((BaseListIGC*)&m_expendableTypes, mt); } IexpendableTypeIGC* GetExpendableType(ExpendableTypeID id) const { return (IexpendableTypeIGC*)GetIbaseIGC((BaseListIGC*)&m_expendableTypes, id); } const ExpendableTypeListIGC* GetExpendableTypes(void) const { return &m_expendableTypes; } void AddPartType(IpartTypeIGC* pt) { AddIbaseIGC((BaseListIGC*)&m_partTypes, pt); if (pt->GetEquipmentType() == ET_Pack) { DataPackTypeIGC* pdpt = (DataPackTypeIGC*)(pt->GetData()); if (pdpt->packType == c_packAmmo) { if (m_pptAmmoPack == NULL) { m_pptAmmoPack = pt; pt->AddRef(); } } else if (pdpt->packType == c_packFuel) { if (m_pptFuelPack == NULL) { m_pptFuelPack = pt; pt->AddRef(); } } } } void DeletePartType(IpartTypeIGC* pt) { DeleteIbaseIGC((BaseListIGC*)&m_partTypes, pt); } IpartTypeIGC* GetPartType(PartID id) const { return (IpartTypeIGC*)GetIbaseIGC((BaseListIGC*)&m_partTypes, id); } const PartTypeListIGC* GetPartTypes(void) const { return &m_partTypes; } virtual void AddTreasureSet(ItreasureSetIGC* pt) { AddIbaseIGC((BaseListIGC*)&m_treasureSets, pt); } virtual void DeleteTreasureSet(ItreasureSetIGC* pt) { DeleteIbaseIGC((BaseListIGC*)&m_treasureSets, pt); } virtual ItreasureSetIGC* GetTreasureSet(TreasureSetID id) const { return (ItreasureSetIGC*)GetIbaseIGC((BaseListIGC*)&m_treasureSets, id); } virtual const TreasureSetListIGC* GetTreasureSets(void) const { return &m_treasureSets; } void AddProjectileType(IprojectileTypeIGC* pt) { AddIbaseIGC((BaseListIGC*)&m_projectileTypes, pt); } void DeleteProjectileType(IprojectileTypeIGC* pt) { DeleteIbaseIGC((BaseListIGC*)&m_projectileTypes, pt); } IprojectileTypeIGC* GetProjectileType(ProjectileTypeID id) const { return (IprojectileTypeIGC*)GetIbaseIGC((BaseListIGC*)&m_projectileTypes, id); } const ProjectileTypeListIGC* GetProjectileTypes(void) const { return &m_projectileTypes; } IpartTypeIGC* GetAmmoPack(void) const { return m_pptAmmoPack; } IpartTypeIGC* GetFuelPack(void) const { return m_pptFuelPack; } private: HullTypeListIGC m_hullTypes; PartTypeListIGC m_partTypes; ProjectileTypeListIGC m_projectileTypes; ExpendableTypeListIGC m_expendableTypes; StationTypeListIGC m_stationTypes; CivilizationListIGC m_civilizations; DroneTypeListIGC m_droneTypes; DevelopmentListIGC m_developments; TreasureSetListIGC m_treasureSets; IpartTypeIGC* m_pptAmmoPack; IpartTypeIGC* m_pptFuelPack; Constants m_constants; }; ///////////////////////////////////////////////////////////////////////////// // CmissionIGC class CmissionIGC : public ImissionIGC { public: CmissionIGC(void) : m_pIgcSite(NULL), m_dwPrivate(0), m_nextBuoyID(0), m_nextShipID(0), m_nextAsteroidID(0), m_nextTreasureID(0), m_nextMineID(0), m_nextProbeID(0), m_nextMissileID(0), m_nextStationID(0), m_stageMission(STAGE_NOTSTARTED), m_missionID(0), m_pStatic(NULL), m_bHasGenerated(false), m_nReplayCount(0) { // Record the creation time SYSTEMTIME st; ::GetLocalTime(&st); ::SystemTimeToFileTime(&st, &m_ftCreated); } virtual ~CmissionIGC(void); // IstaticIGC virtual void Initialize(void) { //Never called ... should use the initialize of ImissionIGC assert (false); } virtual void Terminate(void); virtual float GetFloatConstant(FloatConstantID fcid) const { return m_pStatic->GetFloatConstant(fcid); } virtual void SetFloatConstant(FloatConstantID fcid, float f) { m_pStatic->SetFloatConstant(fcid, f); } virtual float GetDamageConstant(DamageTypeID dmgid, DefenseTypeID defid) const { return m_pStatic->GetDamageConstant(dmgid, defid); } virtual void SetDamageConstant(DamageTypeID dmgid, DefenseTypeID defid, float f) { m_pStatic->SetDamageConstant(dmgid, defid, f); } virtual const void* GetConstants(void) const { return m_pStatic->GetConstants(); } virtual void SetConstants(const void* pf) { m_pStatic->SetConstants(pf); } virtual int GetSizeOfConstants(void) const { return m_pStatic->GetSizeOfConstants(); } virtual void AddDroneType(IdroneTypeIGC* dt) { m_pStatic->AddDroneType(dt); } virtual void DeleteDroneType(IdroneTypeIGC* dt) { m_pStatic->DeleteDroneType(dt); } virtual IdroneTypeIGC* GetDroneType(DroneTypeID id) const { return m_pStatic->GetDroneType(id); } virtual const DroneTypeListIGC* GetDroneTypes(void) const { return m_pStatic->GetDroneTypes(); } virtual void AddDevelopment(IdevelopmentIGC* d) { m_pStatic->AddDevelopment(d); } virtual void DeleteDevelopment(IdevelopmentIGC* d) { m_pStatic->DeleteDevelopment(d); } virtual IdevelopmentIGC* GetDevelopment(DevelopmentID id) const { return m_pStatic->GetDevelopment(id); } virtual const DevelopmentListIGC* GetDevelopments(void) const { return m_pStatic->GetDevelopments(); } virtual void AddStationType(IstationTypeIGC* st) { m_pStatic->AddStationType(st); } virtual void DeleteStationType(IstationTypeIGC* st) { m_pStatic->DeleteStationType(st); } virtual IstationTypeIGC* GetStationType(StationTypeID id) const { return m_pStatic->GetStationType(id); } virtual const StationTypeListIGC* GetStationTypes(void) const { return m_pStatic->GetStationTypes(); } virtual void AddCivilization(IcivilizationIGC* c) { m_pStatic->AddCivilization(c); } virtual void DeleteCivilization(IcivilizationIGC* c) { m_pStatic->DeleteCivilization(c); } virtual IcivilizationIGC* GetCivilization(CivID id) const { return m_pStatic->GetCivilization(id); } virtual const CivilizationListIGC* GetCivilizations(void) const { return m_pStatic->GetCivilizations(); } virtual void AddHullType(IhullTypeIGC* ht) { m_pStatic->AddHullType(ht); } virtual void DeleteHullType(IhullTypeIGC* ht) { m_pStatic->DeleteHullType(ht); } virtual IhullTypeIGC* GetHullType(HullID id) const { return m_pStatic->GetHullType(id); } virtual const HullTypeListIGC* GetHullTypes(void) const { return m_pStatic->GetHullTypes(); } virtual void AddExpendableType(IexpendableTypeIGC* mt) { m_pStatic->AddExpendableType(mt); } virtual void DeleteExpendableType(IexpendableTypeIGC* mt) { m_pStatic->DeleteExpendableType(mt); } virtual IexpendableTypeIGC* GetExpendableType(ExpendableTypeID id) const { return m_pStatic->GetExpendableType(id); } virtual const ExpendableTypeListIGC* GetExpendableTypes(void) const { return m_pStatic->GetExpendableTypes(); } virtual void AddPartType(IpartTypeIGC* pt) { m_pStatic->AddPartType(pt); { //Preload the art for the corresponding model m_pIgcSite->Preload(pt->GetModelName(), NULL); } } virtual void DeletePartType(IpartTypeIGC* pt) { m_pStatic->DeletePartType(pt); } virtual IpartTypeIGC* GetPartType(PartID id) const { return m_pStatic->GetPartType(id); } virtual const PartTypeListIGC* GetPartTypes(void) const { return m_pStatic->GetPartTypes(); } virtual void AddTreasureSet(ItreasureSetIGC* pt) { m_pStatic->AddTreasureSet(pt); } virtual void DeleteTreasureSet(ItreasureSetIGC* pt) { m_pStatic->DeleteTreasureSet(pt); } virtual ItreasureSetIGC* GetTreasureSet(TreasureSetID id) const { return m_pStatic->GetTreasureSet(id); } virtual const TreasureSetListIGC* GetTreasureSets(void) const { return m_pStatic->GetTreasureSets(); } virtual void AddProjectileType(IprojectileTypeIGC* pt) { m_pStatic->AddProjectileType(pt); } virtual void DeleteProjectileType(IprojectileTypeIGC* pt) { m_pStatic->DeleteProjectileType(pt); } virtual IprojectileTypeIGC* GetProjectileType(ProjectileTypeID id) const { return m_pStatic->GetProjectileType(id); } virtual const ProjectileTypeListIGC* GetProjectileTypes(void) const { return m_pStatic->GetProjectileTypes(); } // ImissionIGC virtual void Initialize(Time now, IIgcSite* pIgcSite); virtual void Update(Time now); virtual MissionID GetMissionID(void) const { return m_missionID; } virtual int Export(__int64 maskTypes, char* pdata) const; virtual void Import(Time now, __int64 maskTypes, char* pdata, int datasize); virtual void SetMissionID(MissionID mid) { m_missionID = mid; } virtual IIgcSite* GetIgcSite(void) const { return m_pIgcSite; } virtual IbaseIGC* CreateObject(Time now, ObjectType objecttype, const void* data, int dataSize); virtual ImodelIGC* GetModel(ObjectType type, ObjectID id) const; virtual IbaseIGC* GetBase(ObjectType type, ObjectID id) const; virtual DamageTrack* CreateDamageTrack(void) { return m_damageTracks.Create(); } //Global list of stations virtual void AddStation(IstationIGC* s); virtual void DeleteStation(IstationIGC* s); virtual IstationIGC* GetStation(StationID stationID) const; virtual const StationListIGC* GetStations(void) const; //Global list of warps virtual void AddWarp(IwarpIGC* w); virtual void DeleteWarp(IwarpIGC* w); virtual IwarpIGC* GetWarp(WarpID warpID) const; virtual const WarpListIGC* GetWarps(void) const; //Global list of asteroids virtual void AddAsteroid(IasteroidIGC* s); virtual void DeleteAsteroid(IasteroidIGC* s); virtual IasteroidIGC* GetAsteroid(AsteroidID id) const; virtual const AsteroidListIGC* GetAsteroids(void) const; //Global list of mines virtual void AddMine(ImineIGC* ms); virtual void DeleteMine(ImineIGC* m); virtual ImineIGC* GetMine(MineID mineID) const; virtual const MineListIGC* GetMines(void) const; //Global list of probes virtual void AddProbe(IprobeIGC* ms); virtual void DeleteProbe(IprobeIGC* m); virtual IprobeIGC* GetProbe(ProbeID probeID) const; virtual const ProbeListIGC* GetProbes(void) const; //Global list of treasures virtual void AddTreasure(ItreasureIGC* t); virtual void DeleteTreasure(ItreasureIGC* t); virtual ItreasureIGC* GetTreasure(TreasureID treasureID) const; virtual const TreasureListIGC* GetTreasures(void) const; //Global list of sides virtual void AddSide(IsideIGC* s); virtual void DeleteSide(IsideIGC* s); virtual IsideIGC* GetSide(SideID sideID) const; virtual const SideListIGC* GetSides(void) const; //Global list of clusters virtual void AddCluster(IclusterIGC* c); virtual void DeleteCluster(IclusterIGC* c); virtual IclusterIGC* GetCluster(SectorID clusterID) const; virtual const ClusterListIGC* GetClusters(void) const; //Global list of ships virtual void AddShip(IshipIGC* s); virtual void DeleteShip(IshipIGC* s); virtual IshipIGC* GetShip(ShipID shipID) const; virtual const ShipListIGC* GetShips(void) const; //Global list of buoys virtual void AddBuoy(IbuoyIGC* s); virtual void DeleteBuoy(IbuoyIGC* s); virtual IbuoyIGC* GetBuoy(BuoyID buoyID) const; virtual const BuoyListIGC* GetBuoys(void) const; virtual IpartTypeIGC* GetAmmoPack(void) const { return m_pStatic->GetAmmoPack(); } virtual IpartTypeIGC* GetFuelPack(void) const { return m_pStatic->GetFuelPack(); } IpartIGC* CreatePart(Time now, IpartTypeIGC* ppt) { static const ObjectType objectTypes[ET_MAX] = {OT_dispenser, OT_weapon, OT_magazine, OT_dispenser, OT_shield, OT_cloak, OT_pack, OT_afterburner }; assert (objectTypes[ET_ChaffLauncher] == OT_dispenser); assert (objectTypes[ET_Weapon] == OT_weapon); assert (objectTypes[ET_Magazine] == OT_magazine); assert (objectTypes[ET_Dispenser] == OT_dispenser); assert (objectTypes[ET_Shield] == OT_shield); assert (objectTypes[ET_Cloak] == OT_cloak); assert (objectTypes[ET_Pack] == OT_pack); assert (objectTypes[ET_Afterburner] == OT_afterburner); //The "data" used to create a part is a pointer to the part type. return (IpartIGC*)CreateObject(now, objectTypes[ppt->GetEquipmentType()], &ppt, sizeof(ppt)); } void SetMissionStage(STAGE st) { m_stageMission = st; } STAGE GetMissionStage() { return m_stageMission; } void EnterGame(void) { if (m_missionParams.IsProsperityGame()) { IdevelopmentIGC* pdTeamMoney = GetDevelopment(c_didTeamMoney); assert (pdTeamMoney); assert (m_missionParams.fGoalTeamMoney > 0); for (SideLinkIGC* psl = m_sides.first(); (psl != NULL); psl = psl->next()) { //It is something we might be able to build and it will actually //do something useful DataBucketIGC db = {pdTeamMoney, psl->data()}; IbucketIGC* b = (IbucketIGC*)(CreateObject(m_lastUpdate, OT_bucket, &db, sizeof(db))); assert (b); b->SetPrice((Money)(m_missionParams.fGoalTeamMoney * GetFloatConstant(c_fcidWinTheGameMoney))); b->Release(); //Creating the bucket adds it to the side's list of buckets } } //Go through all sides and create the prosperity development (adjusting the price as needed) //Go through all the treasures and reset their expiration time for (TreasureLinkIGC* ptl = m_treasures.first(); (ptl != NULL); ptl = ptl->next()) ptl->data()->ResetExpiration(m_lastUpdate); //Go through all stations and reset their start time for (StationLinkIGC* psl = m_stations.first(); (psl != NULL); psl = psl->next()) psl->data()->SetLastUpdate(m_lastUpdate); } void UpdateSides(Time now, const MissionParams * pmp, const char sideNames[c_cSidesMax][c_cbSideName]); void ResetMission(); void GenerateMission(Time now, const MissionParams * pmp, TechTreeBitMask * pttbmShouldOverride, TechTreeBitMask * pttbmOverrideValue); void GenerateTreasure(Time now, IclusterIGC* pcluster, short tsi); virtual void SetPrivateData(DWORD dwPrivate) { m_dwPrivate = dwPrivate; } virtual DWORD GetPrivateData(void) const { return m_dwPrivate; } BuoyID GenerateNewBuoyID(void) { return m_nextBuoyID++; } ShipID GenerateNewShipID(void) { return m_nextShipID++; } AsteroidID GenerateNewAsteroidID(void) { return m_nextAsteroidID++; } TreasureID GenerateNewTreasureID(void) { return m_nextTreasureID++; } MineID GenerateNewMineID(void) { return m_nextMineID++; } ProbeID GenerateNewProbeID(void) { return m_nextProbeID++; } MissileID GenerateNewMissileID(void) { return m_nextMissileID++; } StationID GenerateNewStationID(void) { return m_nextStationID++; } Time GetLastUpdate(void) const { return m_lastUpdate; } const MissionParams* GetMissionParams(void) const { return &m_missionParams; } void SetMissionParams(const MissionParams* pmp) { m_missionParams = *pmp; } virtual void SetStartTime(Time timeStart) { m_missionParams.timeStart = timeStart; } CstaticIGC* GetStaticCore(void) const { return m_pStatic; } void SetStaticCore(CstaticIGC* pStatic) { assert (m_pStatic == NULL); if (pStatic) m_pStatic = pStatic; else { m_pStatic = new CstaticIGC; m_pStatic->Initialize(); } } short GetReplayCount(void) const; const char* GetContextName(void); private: MissionParams m_missionParams; DWORD m_dwPrivate; MissionID m_missionID; CstaticIGC* m_pStatic; IIgcSite* m_pIgcSite; DamageTrackSet m_damageTracks; ClusterListIGC m_clusters; BuoyListIGC m_buoys; ShipListIGC m_ships; WarpListIGC m_warps; StationListIGC m_stations; AsteroidListIGC m_asteroids; ProbeListIGC m_probes; MineListIGC m_mines; TreasureListIGC m_treasures; SideListIGC m_sides; IsideIGC* m_sideTeamLobby; Time m_lastUpdate; BuoyID m_nextBuoyID; ShipID m_nextShipID; AsteroidID m_nextAsteroidID; TreasureID m_nextTreasureID; MineID m_nextMineID; ProbeID m_nextProbeID; MissileID m_nextMissileID; StationID m_nextStationID; STAGE m_stageMission; FILETIME m_ftCreated; bool m_bHasGenerated; short m_nReplayCount; ZString m_strContextName; }; #endif //__MISSIONIGC_H_