ef2gamesource/dlls/game/mp_modifiers.hpp
2012-12-31 16:19:55 +01:00

700 lines
24 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /Code/DLLs/game/multiplayerArena.cpp $
// $Revision:: 48 $
// $Author:: Steven $
// $Date:: 7/23/02 2:55p $
//
// Copyright (C) 2002 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// Description:
//
#ifndef __MP_MODIFIERS_HPP__
#define __MP_MODIFIERS_HPP__
#include "g_local.h" // common game stuff
#include "player.h" // for Player
#include "item.h"
#include "PlayerStart.h" // for PlayerDeathmatchStart
#include "container.h" // for Container
#include "str.h" // for str
#include "mp_shared.hpp"
#include "equipment.h"
class MultiplayerModifier
{
private:
public:
MultiplayerModifier() {};
virtual ~MultiplayerModifier() {};
virtual void init( int maxPlayers ) { Q_UNUSED(maxPlayers); };
virtual void initItems( void ) {};
virtual void start( void ) {};
virtual bool shouldKeepItem( MultiplayerItem *item ) { Q_UNUSED(item); return false; }
virtual bool shouldKeepNormalItem( Item *item ) { Q_UNUSED(item); return true; }
virtual void itemKept( MultiplayerItem *item ) { Q_UNUSED(item); };
virtual bool checkRule( const char *rule, bool defaultValue, Player *player = NULL ) { Q_UNUSED(rule); Q_UNUSED(player); return defaultValue; }
virtual bool checkGameType( const char *rule ) { Q_UNUSED(rule); return false; }
virtual bool doesPlayerHaveItem( Player *player, const char *itemName ) { Q_UNUSED(player); Q_UNUSED(itemName); return false; }
virtual int getStat( Player *player, int statNum, int value ) { Q_UNUSED(player); Q_UNUSED(statNum); return value; }
virtual int getIcon( Player *player, int statNum, int value ) { Q_UNUSED(player); Q_UNUSED(statNum); return value; }
virtual int getScoreIcon( Player *player, int index, int value ) { Q_UNUSED(player); Q_UNUSED(index); return value; }
virtual int getInfoIcon( Player *player ) { Q_UNUSED(player); return 0; }
virtual float playerDamaged( Player *damagedPlayer, Player *attackingPlayer, float damage, int meansOfDeath ) { Q_UNUSED(damagedPlayer); Q_UNUSED(attackingPlayer); Q_UNUSED(meansOfDeath); return damage; };
virtual void playerFired( Player *attackingPlayer ) { Q_UNUSED(attackingPlayer); };
virtual void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath ) { Q_UNUSED(killedPlayer); Q_UNUSED(attackingPlayer); Q_UNUSED(inflictor); Q_UNUSED(meansOfDeath); };
virtual void playerSpawned( Player * ) {};
virtual void matchOver( void ) {};
virtual void itemTouched( Player *player, MultiplayerItem *item ) { Q_UNUSED(player); Q_UNUSED(item); };
virtual void itemDestroyed( Player *player, MultiplayerItem *item ) { Q_UNUSED(player); Q_UNUSED(item); };
virtual float itemDamaged( MultiplayerItem *item, Player *attackingPlayer, float damage, int meansOfDeath ) { Q_UNUSED(item); Q_UNUSED(attackingPlayer); Q_UNUSED(meansOfDeath); return damage; }
virtual void itemUsed( Entity *entity, MultiplayerItem *item ) { Q_UNUSED(entity); Q_UNUSED(item); };
virtual void playerUsed( Player *usedPlayer, Player *usingPlayer, Equipment *equipment ) { Q_UNUSED(usedPlayer); Q_UNUSED(usingPlayer); Q_UNUSED(equipment); };
virtual bool canGivePlayerItem( int entnum, const str &itemName ) { Q_UNUSED(entnum); Q_UNUSED(itemName); return true; }
virtual void addPlayer( Player * ) {};
virtual void removePlayer( Player * ) {};
virtual void joinedTeam( Player *player, const str &teamName ) { Q_UNUSED(player); Q_UNUSED(teamName); }
virtual void applySpeedModifiers( Player *player, int *moveSpeed ) { Q_UNUSED(player); Q_UNUSED(moveSpeed); }
virtual void applyJumpModifiers( Player *player, int *jumpSpeed ) { Q_UNUSED(player); Q_UNUSED(jumpSpeed); }
virtual void applyAirAccelerationModifiers( Player *player, int *airAcceleration ) { Q_UNUSED(player); Q_UNUSED(airAcceleration); }
virtual bool canPickup( Player *player, MultiplayerItemType itemType, const char *item_name ) { Q_UNUSED(player); Q_UNUSED(itemType); Q_UNUSED(item_name); return true; }
virtual void pickedupItem( Player *player, MultiplayerItemType itemType, const char *itemName ) { Q_UNUSED(player); Q_UNUSED(itemType); Q_UNUSED(itemName); }
virtual void update( float frameTime ) { Q_UNUSED(frameTime); }
virtual int getPointsForKill( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath, int points ) { Q_UNUSED(killedPlayer); Q_UNUSED(attackingPlayer); Q_UNUSED(inflictor); Q_UNUSED(meansOfDeath); return points; }
virtual void playerEventNotification( const char *eventName, const char *eventItemName, Player *eventPlayer ) { Q_UNUSED(eventName); Q_UNUSED(eventItemName); Q_UNUSED(eventPlayer); }
virtual void playerCommand( Player *player, const char *command, const char *parm ) { Q_UNUSED(player); Q_UNUSED(command); Q_UNUSED(parm); }
virtual void matchStarted( void ) {};
virtual void matchStarting( void ) {};
virtual void matchRestarted( void ) {};
virtual void matchEnded( void ) {};
virtual str getSpawnPointType( Player * ) { return ""; }
virtual float getSpawnPointPriority( Player * ) { return 0.0f; }
virtual bool isValidPlayerModel( Player *player, str modelToUse, bool defaultValue ) { Q_UNUSED(player); Q_UNUSED(modelToUse); return defaultValue; }
virtual str getDefaultPlayerModel( Player *player, str modelName ) { Q_UNUSED(player); return modelName; }
virtual void playerChangedModel( Player * ) {};
virtual bool skipWeaponReloads( void ) { return false; }
};
class DestructionPlayerData
{
public:
float _lastHealTime;
float _damageDone;
float _healthHealed;
DestructionPlayerData() { reset(); }
void reset( void ) { _lastHealTime = 0.0f; _damageDone = 0.0f; _healthHealed = 0.0f; }
};
class ModifierDestruction : public MultiplayerModifier
{
private:
static const float _defaultObjectHealth;
static const int _pointsForDestroyingObject;
static const float _objectHealRate;
static const float _maxGuardingDist;
static const float _minDamageForPoints;
static const float _minHealingForPoints;
static const int _pointsForDamage;
static const int _pointsForHealing;
static const int _pointsForDestroying;
static const int _pointsForGuarding;
MultiplayerItem * _redDestructionObject;
MultiplayerItem * _blueDestructionObject;
float _redLastDamageSoundTime;
float _blueLastDamageSoundTime;
int _maxPlayers;
DestructionPlayerData * _destructionPlayerData;
float _redObjectLasthealth;
float _blueObjectLasthealth;
bool _blueObjectDestroyed;
bool _redObjectDestroyed;
float _respawnTime;
float findDistanceToTeamsObject( const str &teamName, const Vector &position );
void updateObjectAnim( MultiplayerItem *destructionObject, float health, float lastHealth, float maxHealth );
int getStage( float health, float maxHealth );
public:
ModifierDestruction();
~ModifierDestruction();
/* virtual */ void init( int maxPlayers );
/* virtual */ int getStat( Player *player, int statNum, int value );
/* virtual */ void addPlayer( Player *player );
/* virtual */ void playerSpawned( Player *player );
/* virtual */ void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
/* virtual */ bool shouldKeepItem( MultiplayerItem *item );
/* virtual */ void itemDestroyed( Player *player, MultiplayerItem *item );
/* virtual */ float itemDamaged( MultiplayerItem *item, Player *attackingPlayer, float damage, int meansOfDeath );
/* virtual */ void itemUsed( Entity *entity, MultiplayerItem *item );
/* virtual */ void update( float frameTime );
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
/* virtual */ bool checkGameType( const char *rule );
};
class ModifierOneFlag : public MultiplayerModifier
{
private:
public:
ModifierOneFlag() {};
~ModifierOneFlag() {};
/* virtual */ bool shouldKeepItem( MultiplayerItem *item );
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
/* virtual */ bool checkGameType( const char *rule );
/* virtual */ void addPlayer( Player *player );
};
class EliminationPlayerData
{
public:
bool _eliminated;
EliminationPlayerData() { reset(); }
void reset( void ) { _eliminated = false; }
};
class ModifierElimination : public MultiplayerModifier
{
private:
static const int _pointsForBeingLastAlive;
bool _respawning;
bool _playerEliminated;
int _maxPlayers;
EliminationPlayerData* _playerEliminationData;
bool _matchOver;
float _matchStartTime;
int _eliminatedIconIndex;
bool _needPlayers;
int _eliminatedTextIndex;
int _nextRoundTextIndex;
void reset( void );
int numPlayersAliveOnTeam( const str &teamName );
public:
ModifierElimination();
~ModifierElimination();
/* virtual */ void init( int maxPlayers );
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
/* virtual */ void update( float frameTime );
/* virtual */ int getStat( Player *player, int statNum, int value );
/* virtual */ int getScoreIcon( Player *player, int index, int value );
/* virtual */ void addPlayer( Player *player );
/* virtual */ void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
/* virtual */ void matchStarting( void );
};
/* typedef enum
{
DIFFUSION_NONE,
DIFFUSION_BOMBER,
DIFFUSION_DIFFUSER
} DiffusionType;
class DiffusionPlayerData
{
public:
DiffusionType _diffusionSpecialty;
MultiplayerItem * _item;
DiffusionPlayerData() { reset(); }
void reset( void ) { _diffusionSpecialty = DIFFUSION_NONE; _item = NULL; }
}; */
class DiffusionBombPlace
{
public:
MultiplayerItem * _item;
bool _armed;
float _totalArmingTime;
float _totalDisarmingTime;
float _lastArmingTime;
float _lastDisarmingTime;
float _totalArmedTime;
DiffusionBombPlace();
void reset( void );
};
class ModifierDiffusion : public MultiplayerModifier
{
private:
static const float _timeNeededToArmBomb;
static const float _timeNeededToDisarmBomb;
static const float _maxGuardingDist;
static const float _maxArmingPause;
static const float _maxDisarmingPause;
static const float _maxBombOnGroundTime;
static const int _pointsForArmingBomb;
static const int _pointsForExplodingBomb;
static const int _pointsForDisarmingBomb;
static const int _pointsForGuardingBase;
static const int _pointsForGuardingTheBomber;
static const int _pointsForGuardingBomb;
static const int _pointsForKillingTheBomber;
static const int _teamPointsForBombing;
int _bomber;
int _bombArmedByPlayer;
int _lastBomber;
float _bombDroppedTime;
float _timeNeededForBombToExplode;
DiffusionBombPlace _redBombPlace;
DiffusionBombPlace _blueBombPlace;
MultiplayerItem * _bomb;
MultiplayerItem * _tempBombItem;
Entity * _attachedBomb;
float _tempBombItemTime;
//DiffusionPlayerData *_playerDiffusionData;
int _maxPlayers;
int _bomberIconIndex;
int _diffuserIconIndex;
int _bombNormalIconIndex;
int _bombPlacedIconIndex;
int _bombArmedIconIndex;
int _redBombPlaceArmedIconIndex;
int _blueBombPlaceArmedIconIndex;
int _bombCarriedByRedTeamIconIndex;
int _bombCarriedByBlueTeamIconIndex;
int _bombInBaseIconIndex;
int _bombOnGroundIconIndex;
float _respawnTime;
void dropBomb( Player *player );
void respawnBomb( bool quiet = false );
bool playerOnOffense( Player *player );
Player * getBomber( void );
void makeBomber( Player *player );
void clearBomber( void );
bool withinGuardDistance( const Vector &origin1, const Vector &origin2 );
bool playerGuardedBomber( Player *attackingPlayer, Player *killedPlayer );
bool playerGuardedBase( Player *attackingPlayer, Player *killedPlayer );
bool playerGuardedBomb( Player *attackingPlayer, Player *killedPlayer );
void attachBomb( Player *player );
public:
ModifierDiffusion();
~ModifierDiffusion();
/* virtual */ void init( int maxPlayers );
/* virtual */ bool shouldKeepItem( MultiplayerItem *item );
///* virtual */ void start( void );
/* virtual */ void matchStarted( void );
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
/* virtual */ void update( float frameTime );
/* virtual */ void itemTouched( Player *player, MultiplayerItem *item );
/* virtual */ void itemUsed( Entity *entity, MultiplayerItem *item );
/* virtual */ int getStat( Player *player, int statNum, int value );
///* virtual */ int getPointsForKill( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath, int points );
/* virtual */ void addPlayer( Player *player );
/* virtual */ void removePlayer( Player *player );
/* virtual */ void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
/* virtual */ void playerCommand( Player *player, const char *command, const char *parm );
/* virtual */ void playerSpawned( Player *player );
/* virtual */ void playerEventNotification( const char *eventName, const char *eventItemName, Player *eventPlayer );
/* virtual */ int getIcon( Player *player, int statNum, int value );
/* virtual */ int getScoreIcon( Player *player, int index, int value );
/* virtual */ void playerChangedModel( Player *player );
};
typedef enum
{
SPECIALTY_NONE,
SPECIALTY_INFILTRATOR,
SPECIALTY_MEDIC,
SPECIALTY_TECHNICIAN,
SPECIALTY_DEMOLITIONIST,
SPECIALTY_HEAVY_WEAPONS,
SPECIALTY_SNIPER
} SpecialtyType;
class SpecialtyPlayerData
{
public:
static const SpecialtyType _defaultSpecialty;
SpecialtyType _specialty;
MultiplayerItem * _item;
float _lastUseTime;
bool _forced;
float _amountOfHealing;
int _lastPlayer;
float _lastPlayerTime;
float _regenHoldableItemTime;
SpecialtyPlayerData();
void reset( void );
};
class SpecialtyItem
{
public:
MultiplayerItem * _item;
SpecialtyType _type;
str _teamName;
bool _needToRespawn;
float _respawnTime;
float _minimumRespawnTime;
float _pickedupTime;
};
class ModifierSpecialties : public MultiplayerModifier
{
private:
static const float _infiltratorMinRespawnTime;
static const float _medicMinRespawnTime;
static const float _technicianMinRespawnTime;
static const float _demolitionistMinRespawnTime;
static const float _heavyweaponsMinRespawnTime;
static const float _sniperMinRespawnTime;
static const float _startingInfiltratorHealth;
static const float _startingInfiltratorMassModifier;
static const float _startingMedicArmor;
static const float _startingTechnicianArmor;
static const float _startingDemolitionistArmor;
static const float _startingHeavyWeaponsHealth;
static const float _startingHeavyWeaponsArmor;
static const float _startingHeavyWeaponsMassModifier;
static const float _startingSniperArmor;
static const float _startingNormalHealth;
static const float _medicHealOtherRate;
static const float _medicHealSelfRate;
static const float _infiltratorMoveSpeedModifier;
static const float _heavyWeaponsMoveSpeedModifier;
static const float _infiltratorJumpSpeedModifier;
static const float _infiltratorAirAccelerationModifier;
static const float _technicianHoldableItemRegenTime;
static const float _demolitionistHoldableItemRegenTime;
static const bool _medicCanSeeEnemyHealth;
static const float _amountOfHealingForPoints;
static const int _pointsForHealing;
static const bool _removeItems;
SpecialtyPlayerData *_playerSpecialtyData;
int _maxPlayers;
Container<SpecialtyItem> _specialtyItems;
int _infiltratorIconIndex;
int _medicIconIndex;
int _technicianIconIndex;
int _demolitionistIconIndex;
int _heavyweaponsIconIndex;
int _sniperIconIndex;
void putItemBack( Player *player );
void removeItem( MultiplayerItem *item );
void setupSpecialty( Player *player, SpecialtyType specialty, bool chosen );
SpecialtyItem * findSpecialtyItem( MultiplayerItem *item );
void attachBackpack( Player *player );
public:
ModifierSpecialties();
~ModifierSpecialties();
/* virtual */ void init( int maxPlayers );
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
/* virtual */ bool shouldKeepItem( MultiplayerItem *item );
/* virtual */ bool shouldKeepNormalItem( Item *item );
/* virtual */ void itemTouched( Player *player, MultiplayerItem *item );
/* virtual */ void addPlayer( Player *player );
/* virtual */ void removePlayer( Player *player );
/* virtual */ void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
/* virtual */ void playerSpawned( Player *player );
/* virtual */ void applySpeedModifiers( Player *player, int *moveSpeed );
/* virtual */ void applyJumpModifiers( Player *player, int *jumpSpeed );
/* virtual */ void applyAirAccelerationModifiers( Player *player, int *airAcceleration );
/* virtual */ bool canPickup( Player *player, MultiplayerItemType itemType, const char *item_name );
/* virtual */ void update( float frameTime );
/* virtual */ int getStat( Player *player, int statNum, int value );
/* virtual */ int getIcon( Player *player, int statNum, int value );
/* virtual */ int getScoreIcon( Player *player, int index, int value );
/* virtual */ void playerUsed( Player *usedPlayer, Player *usingPlayer, Equipment *equipment );
/* virtual */ void playerCommand( Player *player, const char *command, const char *parm );
/* virtual */ str getSpawnPointType( Player *player );
/* virtual */ float getSpawnPointPriority( Player * ) { return 100.0f; }
/* virtual */ void playerChangedModel( Player *player );
};
class HandicapPlayerData
{
public:
float _handicap;
HandicapPlayerData() { _handicap = 1.0f; }
void reset( void ) { _handicap = 1.0f; }
};
class ModifierAutoHandicap : public MultiplayerModifier
{
private:
static const float _attackerHandicapModifier;
static const float _victimHandicapModifier;
HandicapPlayerData *_playerHandicapData;
public:
ModifierAutoHandicap();
~ModifierAutoHandicap();
/* virtual */ void init( int maxPlayers );
/* virtual */ void addPlayer( Player *player );
/* virtual */ float playerDamaged( Player *damagedPlayer, Player *attackingPlayer, float damage, int meansOfDeath );
/* virtual */ void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
};
class PointsPerWeaponData
{
public:
str _name;
int _points;
};
class ModifierPointsPerWeapon : public MultiplayerModifier
{
private:
Container<PointsPerWeaponData> _weapons;
Container<PointsPerWeaponData> _projectiles;
public:
ModifierPointsPerWeapon() {};
~ModifierPointsPerWeapon();
/* virtual */ void init( int maxPlayers );
void readMultiplayerConfig( const char *configName );
bool parseConfigToken( const char *key, Script *buffer );
/* virtual */ int getPointsForKill( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath, int points );
};
typedef enum
{
CONTROL_POINT_NONE,
CONTROL_POINT_ALPHA,
CONTROL_POINT_BETA,
CONTROL_POINT_DELTA,
CONTROL_POINT_GAMMA
} ControlPointType;
struct ControlPointData
{
MultiplayerItem * _controlPoint;
ControlPointType _controlPointType;
Team * _controllingTeam;
Team * _lastControllingTeam;
float _lastTime;
int _lastPlayerToTouch;
int _playerPointsAwardedForCapture;
};
class ModifierControlPoints : public MultiplayerModifier
{
private:
static const float _timeNeededToControl;
static const int _maxNumberAwardsForPlayerCapture;
static const int _pointsForEachAwardForCapture;
static const int _pointsForProtectingControlPoint;
static const int _maxGuardingDist;
Container<ControlPointData> _controlPoints;
int _alphaControlPointRedControlledIndex;
int _alphaControlPointBlueControlledIndex;
int _alphaControlPointNeutralControlledIndex;
int _betaControlPointRedControlledIndex;
int _betaControlPointBlueControlledIndex;
int _betaControlPointNeutralControlledIndex;
int _deltaControlPointRedControlledIndex;
int _deltaControlPointBlueControlledIndex;
int _deltaControlPointNeutralControlledIndex;
int _gammaControlPointRedControlledIndex;
int _gammaControlPointBlueControlledIndex;
int _gammaControlPointNeutralControlledIndex;
float findNearestControlledControlPoint( const str &teamName, const Vector &position );
ControlPointType getControlPointType( const str &name );
public:
ModifierControlPoints();
~ModifierControlPoints();
/* virtual */ void init( int maxPlayers );
/* virtual */ void addPlayer( Player *player );
/* virtual */ int getStat( Player *player, int statNum, int value );
/* virtual */ bool shouldKeepItem( MultiplayerItem *item );
/* virtual */ void itemTouched( Player *player, MultiplayerItem *item );
/* virtual */ void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
///* virtual */ int getPointsForKill( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath, int points );
/* virtual */ void update( float frameTime );
/* virtual */ str getSpawnPointType( Player *player );
/* virtual */ float getSpawnPointPriority( Player * ) { return 10.0f; }
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
};
class ModifierInstantKill : public MultiplayerModifier
{
private:
static const float _instantKillDamage;
static const float _regenTime;
static const int _regenAmount;
float _lastRegenTime;
public:
ModifierInstantKill();
~ModifierInstantKill() {};
/* virtual */ void init( int maxPlayers );
float playerDamaged( Player *damagedPlayer, Player *attackingPlayer, float damage, int meansOfDeath );
/* virtual */ bool canGivePlayerItem( int entnum, const str &itemName );
/* virtual */ bool checkRule( const char *rule, bool defaultValue, Player *player = NULL );
/* virtual */ void playerSpawned( Player *player );
/* virtual */ bool shouldKeepNormalItem( Item *item );
/* virtual */ void update( float frameTime );
/* virtual */ bool skipWeaponReloads( void ) { return true; }
};
class ModifierActionHero : public MultiplayerModifier
{
private:
static const float _actionHeroRegenRate;
static const int _extraPointsForKillingActionHero;
int _actionHeroNum;
float _healthRegenRate;
int _actionHeroIconIndex;
int _actionHeroInfoIconIndex;
public:
ModifierActionHero();
~ModifierActionHero() {};
/* virtual */ void init( int maxPlayers );
virtual void playerKilled( Player *killedPlayer, Player *attackingPlayer, Entity *inflictor, int meansOfDeath );
virtual void removePlayer( Player *player );
virtual void update( float frameTime );
/* virutal */ void matchStarting( void );
/* virtual */ int getIcon( Player *player, int statNum, int value );
/* virtual */ int getScoreIcon( Player *player, int index, int value );
/* virtual */ int getInfoIcon( Player *player );
};
#endif // __MP_MODIFIERS_HPP__