/* ** Command & Conquer Generals(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. // // // //////////////////////////////////////////////////////////////////////////////// // AISkirmishPlayer.h // Computerized opponent // Author: Michael S. Booth, January 2002 #pragma once #ifndef _AI_SKIRMISH_PLAYER_H_ #define _AI_SKIRMISH_PLAYER_H_ #include "Common/GameMemory.h" #include "GameLogic/AIPlayer.h" class BuildListInfo; class SpecialPowerTemplate; #if !defined(_PLAYTEST) /** * The computer-controlled opponent. */ class AISkirmishPlayer : public AIPlayer { MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( AISkirmishPlayer, "AISkirmishPlayer" ) public: // AISkirmish specific methods. AISkirmishPlayer( Player *p ); ///< constructor virtual void computeSuperweaponTarget(const SpecialPowerTemplate *power, Coord3D *pos, Int playerNdx, Real weaponRadius); ///< Calculates best pos for weapon given radius. public: // AIPlayer interface methods. virtual void update(); ///< simulates the behavior of a player virtual void newMap(); ///< New map loaded call. /// Invoked when a unit I am training comes into existence virtual void onUnitProduced( Object *factory, Object *unit ); virtual void buildSpecificAITeam(TeamPrototype *teamProto, Bool priorityBuild); ///< Builds this team immediately. virtual void buildSpecificAIBuilding(const AsciiString &thingName); ///< Builds this building as soon as possible. virtual void buildAIBaseDefense(Bool flank); ///< Builds base defense on front or flank of base. virtual void buildAIBaseDefenseStructure(const AsciiString &thingName, Bool flank); ///< Builds base defense on front or flank of base. virtual void recruitSpecificAITeam(TeamPrototype *teamProto, Real recruitRadius); ///< Builds this team immediately. virtual Bool isSkirmishAI(void) {return true;} virtual Bool checkBridges(Object *unit, Waypoint *way); virtual Player *getAiEnemy(void); ///< Solo AI attacks based on scripting. Only skirmish auto-acquires an enemy at this point. jba. protected: // snapshot methods virtual void crc( Xfer *xfer ); virtual void xfer( Xfer *xfer ); virtual void loadPostProcess( void ); virtual void doBaseBuilding(void); virtual void checkReadyTeams(void); virtual void checkQueuedTeams(void); virtual void doTeamBuilding(void); virtual Object *findDozer(const Coord3D *pos); virtual void queueDozer(void); protected: virtual Bool selectTeamToBuild( void ); ///< determine the next team to build virtual Bool selectTeamToReinforce( Int minPriority ); ///< determine the next team to reinforce virtual Bool startTraining( WorkOrder *order, Bool busyOK, AsciiString teamName); ///< find a production building that can handle the order, and start building virtual Bool isAGoodIdeaToBuildTeam( TeamPrototype *proto ); ///< return true if team should be built virtual void processBaseBuilding( void ); ///< do base-building behaviors virtual void processTeamBuilding( void ); ///< do team-building behaviors protected: void adjustBuildList(BuildListInfo *list); Int getMyEnemyPlayerIndex(void); void acquireEnemy(void); protected: Int m_curFrontBaseDefense; // First is 0. Int m_curFlankBaseDefense; // First is 0. Real m_curFrontLeftDefenseAngle; Real m_curFrontRightDefenseAngle; Real m_curLeftFlankLeftDefenseAngle; Real m_curLeftFlankRightDefenseAngle; Real m_curRightFlankLeftDefenseAngle; Real m_curRightFlankRightDefenseAngle; UnsignedInt m_frameToCheckEnemy; Player *m_currentEnemy; }; #endif #endif // _AI_SKIRMISH_PLAYER_H_