| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- /*
- ** 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 <http://www.gnu.org/licenses/>.
- */
- ////////////////////////////////////////////////////////////////////////////////
- // //
- // (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
|