/* ** Command & Conquer Generals Zero Hour(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: AcademyStats.h //////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Electronic Arts Los Angeles // // Confidential Information // Copyright (C) 2003 - All Rights Reserved // //----------------------------------------------------------------------------- // // Project: RTS3 // // File name: AcademyStats.h // // Created: Kris Morness, July 2003 // // Desc: Keeps track of various statistics in order to provide advice to // the player about how to improve playing. // //----------------------------------------------------------------------------- #pragma once #ifndef __ACADEMY_STATS_H #define __ACADEMY_STATS_H #include "Lib/BaseType.h" #include "Common/Debug.h" #include "Common/Snapshot.h" #include "Common/UnicodeString.h" class Object; class Player; class SpecialPowerTemplate; class UpgradeTemplate; class CommandSet; class ThingTemplate; #define MAX_ADVICE_TIPS 1 struct AcademyAdviceInfo { UnicodeString advice[ MAX_ADVICE_TIPS ]; UnsignedInt numTips; }; enum AcademyClassificationType { //Don't forget to update the strings too! ACT_NONE, ACT_UPGRADE_RADAR, ACT_SUPERPOWER, }; extern const char *TheAcademyClassificationTypeNames[]; //Change above, change this! // ---------------------------------------------------------------------------------------------- class AcademyStats : public Snapshot { public: AcademyStats(); void init( const Player *player ); void update(); Bool isFirstUpdate() const { return m_firstUpdate; } void setFirstUpdate( Bool set ) { m_firstUpdate = set; } void recordProduction( const Object *obj, const Object *constructer ); void recordUpgrade( const UpgradeTemplate *upgrade, Bool granted ); void recordSpecialPowerUsed( const SpecialPowerTemplate *spTemplate ); void recordIncome(); void recordBuildingCapture() { m_structuresCaptured++; } void recordGeneralsPointsSpent( Int points ) { m_generalsPointsSpent += points; } void recordBuildingGarrisoned() { m_structuresGarrisoned++; } void recordDragSelection() { m_dragSelectUnits++; } void recordStrategyCenter() { m_hadAStrategyCenter = TRUE; } void recordBattlePlanSelected() { m_choseAStrategyForCenter = TRUE; } void recordUnitEnteredTunnelNetwork() { m_unitsEnteredTunnelNetwork++; } void recordControlGroupsUsed() { m_controlGroupsUsed++; } void recordClearedGarrisonedBuilding() { m_clearedGarrisonedBuildings++; } void recordVehicleDisguised() { m_vehiclesDisguised++; } void recordFirestormCreated() { m_firestormsCreated++; } void recordGuardAbilityUsed() { m_guardAbilityUsedCount++; } void recordSalvageCollected() { m_salvageCollected++;} void recordDoubleClickAttackMoveOrderGiven() { m_doubleClickAttackMoveOrdersGiven++; } void recordMineCleared() { m_minesCleared++; } //Returns the natural command center template (you may capture others in a game...) const ThingTemplate* getCommandCenterTemplate() const { return m_commandCenterTemplate; } //Use these functions for the Neutral player only! void recordVehicleSniped() { m_vehiclesSniped++; } UnsignedInt getVehiclesSniped() const { return m_vehiclesSniped; } void recordMine() { m_mines++; } UnsignedInt getMines() const { return m_mines; } const Player *getPlayer() { return m_player; } Bool hadASupplyCenter() const { return m_supplyCentersBuilt > 0; } Bool calculateAcademyAdvice( AcademyAdviceInfo *info ); protected: // snapshot methods virtual void crc( Xfer *xfer ); virtual void xfer( Xfer *xfer ); virtual void loadPostProcess( void ); private: void evaluateTier1Advice( AcademyAdviceInfo *info, Int numAvailableTips = -1 ); void evaluateTier2Advice( AcademyAdviceInfo *info, Int numAvailableTips = -1 ); void evaluateTier3Advice( AcademyAdviceInfo *info, Int numAvailableTips = -1 ); const Player *m_player; UnsignedInt m_nextUpdateFrame; Bool m_firstUpdate; const CommandSet *m_dozerCommandSet; Bool m_unknownSide; const ThingTemplate *m_commandCenterTemplate; //+-----------------------+ //| Tier 1 (Basic advice) | //+-----------------------+ //1) Did player build at least one of each structure type available? //CUT!!! //2) Did player run out of money before building a supply center? Bool m_spentCashBeforeBuildingSupplyCenter; UnsignedInt m_supplyCentersBuilt; const ThingTemplate *m_supplyCenterTemplate; UnsignedInt m_supplyCenterCost; //3) Did player build radar (if applicable)? Bool m_researchedRadar; //4) Did player build any dozers/workers? UnsignedInt m_peonsBuilt; //5) Did player ever capture a structure? UnsignedInt m_structuresCaptured; //6) Did player spend any generals points? UnsignedInt m_generalsPointsSpent; //7) Did player ever use a generals power or superweapon? UnsignedInt m_specialPowersUsed; //8) Did player garrison any structures? UnsignedInt m_structuresGarrisoned; //9) How idle was the player in building military units? UnsignedInt m_idleBuildingUnitsMaxFrames; UnsignedInt m_lastUnitBuiltFrame; //10) Did player drag select units? UnsignedInt m_dragSelectUnits; //11) Did player upgrade anything? UnsignedInt m_upgradesPurchased; //12) Was player out of power for more than 10 minutes? UnsignedInt m_powerOutMaxFrames; UnsignedInt m_oldestPowerOutFrame; Bool m_hadPowerLastCheck; //13) Extra gathers built? UnsignedInt m_gatherersBuilt; //14) Heros built? UnsignedInt m_heroesBuilt; //+------------------------------+ //| Tier 2 (Intermediate advice) | //+------------------------------+ //15) Selected a strategy center battle plan? Bool m_hadAStrategyCenter; Bool m_choseAStrategyForCenter; //16) Placed units inside tunnel network? UnsignedInt m_unitsEnteredTunnelNetwork; Bool m_hadATunnelNetwork; //17) Player used control groups? UnsignedInt m_controlGroupsUsed; //18) Built secondary income unit (hacker, dropzone, blackmarket)? UnsignedInt m_secondaryIncomeUnitsBuilt; //19) Cleared out garrisoned buildings? UnsignedInt m_clearedGarrisonedBuildings; //20) Did the Player pick up salvage (as GLA)? UnsignedInt m_salvageCollected; //21) Did the player ever use the "Guard" ability? UnsignedInt m_guardAbilityUsedCount; //22) Did the player build more than one Supply Center (that is, did he expand out)? //Uses m_supplyCentersBuilt! //23) Did the player ever garrison a vehicle? //CUT!!! //24) Did the player ever use the hotkey to grab all of one unit type (change to use any hotkeys)? //CUT!!! //+--------------------------+ //| Tier 3 (Advanced advice) | //+--------------------------+ //25) Did the player use the new alternate interface in the options? //Uses TheGlobalData->m_useAlternateMouse //26) Player did not use the new "double click location attack move/guard" UnsignedInt m_doubleClickAttackMoveOrdersGiven; //27) Built barracks within 5 minutes? Bool m_builtBarracksWithinFiveMinutes; //28) Built war factory within 10 minutes? Bool m_builtWarFactoryWithinTenMinutes; //29) Built tech structure within 15 minutes? Bool m_builtTechStructureWithinFifteenMinutes; //30) No income for 2 minutes? UnsignedInt m_lastIncomeFrame; UnsignedInt m_maxFramesBetweenIncome; //31) Did the Player ever use Dozers/Workers to clear out traps/mines/booby traps? UnsignedInt m_mines; //Neutral player stat UnsignedInt m_minesCleared; //32) Captured any sniped vehicles? UnsignedInt m_vehiclesRecovered; UnsignedInt m_vehiclesSniped; //33) Did the player ever build a "disguisable" unit and never used the disguise ability? UnsignedInt m_disguisableVehiclesBuilt; UnsignedInt m_vehiclesDisguised; //34) Did the player never build a "stealth" upgrade? //CUT!!! //35) Did the player ever create a "Firestorm" with his MiGs or Inferno Cannons? UnsignedInt m_firestormsCreated; }; #endif // __ACADEMY_STATS_H