281 lines
9.0 KiB
C
281 lines
9.0 KiB
C
![]() |
/*
|
||
|
** 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
|
||
|
|