194 lines
12 KiB
C
Raw Normal View History

/*
** 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: ScriptConditions.h ///////////////////////////////////////////////////////////////////////////
// Script conditions evaluator for the scripting engine.
// Author: John Ahlquist, Nov 2001
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __SCRIPTCONDITIONS_H_
#define __SCRIPTCONDITIONS_H_
class Condition;
class ObjectTypes;
class Parameter;
class Player;
//-----------------------------------------------------------------------------
// ScriptConditionsInterface
//-----------------------------------------------------------------------------
/** Pure virtual class for Script Conditions interface format */
//-----------------------------------------------------------------------------
class ScriptConditionsInterface : public SubsystemInterface
{
public:
virtual ~ScriptConditionsInterface() { };
virtual void init( void ) = 0; ///< Init
virtual void reset( void ) = 0; ///< Reset
virtual void update( void ) = 0; ///< Update
virtual Bool evaluateCondition( Condition *pCondition ) = 0; ///< evaluate a a script condition.
virtual Bool evaluateSkirmishCommandButtonIsReady( Parameter *pSkirmishPlayerParm, Parameter *pTeamParm, Parameter *pCommandButtonParm, Bool allReady ) = 0;
virtual Bool evaluateTeamIsContained(Parameter *pTeamParm, Bool allContained) = 0;
}; // end class ScriptConditionsInterface
extern ScriptConditionsInterface *TheScriptConditions; ///< singleton definition
//-----------------------------------------------------------------------------
// ScriptConditions
//-----------------------------------------------------------------------------
/** Implementation for the Script Conditions singleton */
//-----------------------------------------------------------------------------
class ScriptConditions : public ScriptConditionsInterface
{
public:
ScriptConditions();
~ScriptConditions();
public:
virtual void init( void ); ///< Init
virtual void reset( void ); ///< Reset
virtual void update( void ); ///< Update
Bool evaluateCondition( Condition *pCondition );
protected:
Player *playerFromParam(Parameter *pSideParm); // Gets a player from a parameter.
void objectTypesFromParam(Parameter *pTypeParm, ObjectTypes *outObjectTypes); // Must pass in a valid objectTypes for outObjectTypes
Bool evaluateAllDestroyed(Parameter *pSideParm);
Bool evaluateAllBuildFacilitiesDestroyed(Parameter *pSideParm);
Bool evaluateIsDestroyed(Parameter *pTeamParm);
Bool evaluateBridgeBroken(Parameter *pBridgeParm);
Bool evaluateBridgeRepaired(Parameter *pBridgeParm);
Bool evaluateNamedUnitDestroyed(Parameter *pUnitParm);
Bool evaluateNamedUnitExists(Parameter *pUnitParm);
Bool evaluateNamedUnitDying(Parameter *pUnitParm);
Bool evaluateNamedUnitTotallyDead(Parameter *pUnitParm);
Bool evaluateHasUnits(Parameter *pTeamParm);
Bool evaluateTeamEnteredAreaEntirely(Parameter *pTeamParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateTeamEnteredAreaPartially(Parameter *pTeamParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateTeamExitedAreaEntirely(Parameter *pTeamParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateTeamExitedAreaPartially(Parameter *pTeamParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateTeamInsideAreaEntirely(Parameter *pTeamParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateTeamInsideAreaPartially(Parameter *pUnitParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateTeamOutsideAreaEntirely(Parameter *pTeamParm, Parameter *pTriggerParm, Parameter *pTypeParm);
Bool evaluateNamedEnteredArea(Parameter *pUnitParm, Parameter *pTriggerParm);
Bool evaluateNamedExitedArea(Parameter *pUnitParm, Parameter *pTriggerParm);
Bool evaluateNamedInsideArea(Parameter *pUnitParm, Parameter *pTriggerParm);
Bool evaluateNamedOutsideArea(Parameter *pUnitParm, Parameter *pTriggerParm);
Bool evaluateTeamStateIs(Parameter *pTeamParm, Parameter *pStateParm);
Bool evaluateTeamStateIsNot(Parameter *pTeamParm, Parameter *pStateParm);
Bool evaluatePlayerHasCredits(Parameter *pCreditsParm, Parameter* pComparisonParm, Parameter *pPlayerParm);
Bool evaluateNamedCreated(Parameter* pUnitParm); ///< Implemented as evaluateNamedExists(...)
Bool evaluateTeamCreated(Parameter* pTeamParm); ///< Implemented as evaluateTeamExists(...)
Bool evaluateNamedOwnedByPlayer(Parameter *pUnitParm, Parameter *pPlayerParm);
Bool evaluateTeamOwnedByPlayer(Parameter *pTeamParm, Parameter *pPlayerParm);
Bool evaluateMultiplayerAlliedVictory(void);
Bool evaluateMultiplayerAlliedDefeat(void);
Bool evaluateMultiplayerPlayerDefeat(void);
Bool evaluateNamedAttackedByType(Parameter *pUnitParm, Parameter *pTypeParm);
Bool evaluateTeamAttackedByType(Parameter *pTeamParm, Parameter *pTypeParm);
Bool evaluateNamedAttackedByPlayer(Parameter *pUnitParm, Parameter *pPlayerParm);
Bool evaluateTeamAttackedByPlayer(Parameter *pTeamParm, Parameter *pPlayerParm);
Bool evaluateBuiltByPlayer(Condition *pCondition, Parameter* pTypeParm, Parameter* pPlayerParm);
Bool evaluatePlayerHasNOrFewerBuildings(Parameter *pBuildingCountParm, Parameter *pPlayerParm);
Bool evaluatePlayerHasNOrFewerFactionBuildings(Parameter *pBuildingCountParm, Parameter *pPlayerParm);
Bool evaluatePlayerHasPower(Parameter *pPlayerParm);
Bool evaluateNamedReachedWaypointsEnd(Parameter *pUnitParm, Parameter* pWaypointPathParm);
Bool evaluateTeamReachedWaypointsEnd(Parameter *pTeamParm, Parameter* pWaypointPathParm);
Bool evaluateNamedSelected(Condition *pCondition, Parameter *pUnitParm);
Bool evaluateVideoHasCompleted(Parameter *pVideoParm);
Bool evaluateSpeechHasCompleted(Parameter *pSpeechParm);
Bool evaluateAudioHasCompleted(Parameter *pAudioParm);
Bool evaluateNamedDiscovered(Parameter *pItemParm, Parameter* pPlayerParm);
Bool evaluateTeamDiscovered(Parameter *pTeamParm, Parameter *pPlayerParm);
Bool evaluateBuildingEntered(Parameter *pItemParm, Parameter *pUnitParm );
Bool evaluateIsBuildingEmpty(Parameter *pItemParm);
Bool evaluateEnemySighted(Parameter *pItemParm, Parameter *pAllianceParm, Parameter* pPlayerParm);
Bool evaluateTypeSighted(Parameter *pItemParm, Parameter *pTypeParm, Parameter* pPlayerParm);
Bool evaluateUnitHealth(Parameter *pItemParm, Parameter* pComparisonParm, Parameter *pHealthPercent);
Bool evaluatePlayerUnitCondition(Condition *pCondition, Parameter *pPlayerParm, Parameter *pComparisonParm, Parameter *pCountParm, Parameter *pUnitTypeParm);
Bool evaluatePlayerSpecialPowerFromUnitTriggered(Parameter *pPlayerParm, Parameter *pSpecialPowerParm, Parameter* pUnitParm);
Bool evaluatePlayerSpecialPowerFromUnitMidway (Parameter *pPlayerParm, Parameter *pSpecialPowerParm, Parameter* pUnitParm);
Bool evaluatePlayerSpecialPowerFromUnitComplete (Parameter *pPlayerParm, Parameter *pSpecialPowerParm, Parameter* pUnitParm);
Bool evaluateUpgradeFromUnitComplete (Parameter *pPlayerParm, Parameter *pUpgradeParm, Parameter* pUnitParm);
Bool evaluateScienceAcquired (Parameter *pPlayerParm, Parameter *pScienceParm);
Bool evaluateCanPurchaseScience (Parameter *pPlayerParm, Parameter *pScienceParm);
Bool evaluateSciencePurchasePoints (Parameter *pPlayerParm, Parameter *pSciencePointParm);
Bool evaluateNamedHasFreeContainerSlots(Parameter *pUnitParm);
Bool evaluatePlayerDestroyedNOrMoreBuildings(Parameter *pPlayerParm, Parameter *pNumParm, Parameter *pOppenentParm);
Bool evaluateUnitHasObjectStatus(Parameter *pUnitParm, Parameter *pObjectStatus);
Bool evaluateTeamHasObjectStatus(Parameter *pTeamParm, Parameter *pObjectStatus, Bool entireTeam);
Bool evaluatePlayerHasComparisonPercentPower(Parameter *pPlayerParm, Parameter *pComparisonParm, Parameter *pPercent);
Bool evaluatePlayerHasComparisonValueExcessPower(Parameter *pPlayerParm, Parameter *pComparisonParm, Parameter *pKWHParm);
Bool evaluatePlayerHasUnitTypeInArea(Condition *pCondition, Parameter *pPlayerParm, Parameter *pComparisonParm, Parameter *pCountParm, Parameter *pTypeParm, Parameter *pTriggerParm);
Bool evaluatePlayerHasUnitKindInArea(Condition *pCondition, Parameter *pPlayerParm, Parameter *pComparisonParm, Parameter *pCountParm,Parameter *pKindParm, Parameter *pTriggerParm);
Bool evaluateUnitHasEmptied(Parameter *pUnitParm);
Bool evaluateTeamIsContained(Parameter *pTeamParm, Bool allContained);
Bool evaluateMusicHasCompleted(Parameter *pMusicParm, Parameter *pIntParm);
Bool evaluatePlayerLostObjectType(Parameter *pPlayerParm, Parameter *pTypeParm);
// Skirmish Scripts. Please note that ALL Skirmish conditions should first pass a pSkirmishPlayerParm to
// prevent the necessity of having to write additional scripts for other players / skirmish types later.
Bool evaluateSkirmishSpecialPowerIsReady(Parameter *pSkirmishPlayerParm, Parameter *pPower);
Bool evaluateSkirmishValueInArea(Condition *pCondition, Parameter *pSkirmishPlayerParm, Parameter *pComparisonParm, Parameter *pMoneyParm, Parameter *pTriggerParm);
Bool evaluateSkirmishPlayerIsFaction(Parameter *pSkirmishPlayerParm, Parameter *pFactionParm);
Bool evaluateSkirmishSuppliesWithinDistancePerimeter(Parameter *pSkirmishPlayerParm, Parameter *pDistanceParm, Parameter *pLocationParm, Parameter *pValueParm);
Bool evaluateSkirmishPlayerTechBuildingWithinDistancePerimeter(Condition *pCondition, Parameter *pSkirmishPlayerParm, Parameter *pDistanceParm, Parameter *pLocationParm);
Bool evaluateSkirmishCommandButtonIsReady( Parameter *pSkirmishPlayerParm, Parameter *pTeamParm, Parameter *pCommandButtonParm, Bool allReady );
Bool evaluateSkirmishUnownedFactionUnitComparison( Parameter *pSkirmishPlayerParm, Parameter *pComparisonParm, Parameter *pCountParm );
Bool evaluateSkirmishPlayerHasPrereqsToBuild( Parameter *pSkirmishPlayerParm, Parameter *pObjectTypeParm );
Bool evaluateSkirmishPlayerHasComparisonGarrisoned(Parameter *pSkirmishPlayerParm, Parameter *pComparisonParm, Parameter *pCountParm );
Bool evaluateSkirmishPlayerHasComparisonCapturedUnits(Parameter *pSkirmishPlayerParm, Parameter *pComparisonParm, Parameter *pCountParm );
Bool evaluateSkirmishNamedAreaExists(Parameter *pSkirmishPlayerParm, Parameter *pTriggerParm);
Bool evaluateSkirmishPlayerHasUnitsInArea(Condition *pCondition, Parameter *pSkirmishPlayerParm, Parameter *pTriggerParm );
Bool evaluateSkirmishPlayerHasBeenAttackedByPlayer(Parameter *pSkirmishPlayerParm, Parameter *pAttackedByParm );
Bool evaluateSkirmishPlayerIsOutsideArea(Condition *pCondition, Parameter *pSkirmishPlayerParm, Parameter *pTriggerParm );
Bool evaluateSkirmishPlayerHasDiscoveredPlayer(Parameter *pSkirmishPlayerParm, Parameter *pDiscoveredByParm );
Bool evaluateSkirmishSupplySourceSafe(Condition *pCondition, Parameter *pSkirmishPlayerParm, Parameter *pMinAmountOfSupplies );
Bool evaluateSkirmishSupplySourceAttacked(Parameter *pSkirmishPlayerParm );
Bool evaluateSkirmishStartPosition(Parameter *pSkirmishPlayerParm, Parameter *startNdx );
// Stubs
Bool evaluateMissionAttempts(Parameter *pPlayerParm, Parameter *pComparisonParm, Parameter *pAttemptsParm);
}; // end class ScriptConditions
#endif // end __SCRIPTCONDITIONS_H_