Files
source/Tactical/Disease.h
T
Flugente 098dc8e280 Disease update:
- <InfectionChance_WOUND_FIRE> can cause infections when taking fire damage
- <InfectionChance_WOUND_GAS> can cause infections when taking non-fire gas damage
- <fSpecialFlagLimitedUseArms> causes the infected to be unable to use one arm
- <fSpecialFlagLimitedUseLegs> causes the infected to be unable to run, and walk and travel slowly
- JA2_options.ini option DISEASE_SEVERE_LIMITATIONS controls whether <fSpecialFlagContractDisability>, <fSpecialFlagLimitedUseArms> and <fSpecialFlagLimitedUseLegs> are used

For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&th=22099&goto=360451&#msg_360451

- Gas damage split up in fire and non-fire damage.
- Flamethrower projectile damaged is affected by fire resistance.

Requires GameDir >= r2553.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8828 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2020-06-25 22:42:44 +00:00

162 lines
6.0 KiB
C

#ifndef __DISEASE_H
#define __DISEASE_H
/**
* @file
* @author Flugente (bears-pit.com)
*/
#include "Types.h"
// number of different diseases. Altering this will alter the size of INT32 sDiseasePoints[NUM_DISEASES]; in SOLDIERTYPE
#define NUM_DISEASES 20
#include "Soldier Control.h"
// infection types - how can we be infected
enum
{
// infection depending on sector type
INFECTION_TYPE_SWAMP = 0,
INFECTION_TYPE_TROPICS,
// infection by having sex
INFECTION_TYPE_SEX,
// infection by contact with lifeforms
INFECTION_TYPE_CONTACT_HUMAN, // infection by human interaction
INFECTION_TYPE_CONTACT_CORPSE, // infection by interacting with corpses
// infections when taking damage
INFECTION_TYPE_WOUND_ANIMAL, // wounded by an animal (bloodcat)
INFECTION_TYPE_WOUND_OPEN, // we have a new non-bandaged wound
INFECTION_TYPE_WOUND_GUNSHOT, // we were wounded by gunshot
INFECTION_TYPE_WOUND_FIRE, // we were wounded by fire
INFECTION_TYPE_WOUND_GAS, // we were wounded by gas (that isn't fire)
// wound caused statloss
INFECTION_TYPE_WOUND_AGI,
INFECTION_TYPE_WOUND_DEX,
INFECTION_TYPE_WOUND_STR,
INFECTION_TYPE_WOUND_WIS,
INFECTION_TYPE_TRAUMATIC, // certain events traumatized us
// infection by bad foodstuff
INFECTION_TYPE_BADFOOD,
INFECTION_TYPE_BADWATER,
INFECTION_TYPE_MAX
};
// stats that can be affected
enum
{
INFST_AGI = 0,
INFST_DEX,
INFST_STR,
INFST_WIS,
INFST_EXP,
INFST_MAX
};
// disase flags for a sector
#define SECTORDISEASE_DIAGNOSED_PLAYER 0x04 //4 // disease has been diagnosed by the player
// properties of diseases
#define DISEASE_PROPERTY_CANBECURED 0x00000001 // this disease can be healed by doctoring
#define DISEASE_PROPERTY_REVERSEONFULL 0x00000002 // once sInfectionPtsFull are reached, the infection reverses - negative sInfectionPtsGainPerHour is used
#define DISEASE_PROPERTY_CANREINFECT 0x00000004 // infection can be reapplied if already infected
#define DISEASE_PROPERTY_HIDESYMBOL 0x00000008 // do not show a symbol for this disease on the merc's face, even if diagnosed
#define DISEASE_PROPERTY_DISGUSTING 0x00000010 // other merc's will be disgusted by anyone with this disease if broken out
#define DISEASE_PROPERTY_PTSD_BUNS 0x00000020 // if Buns has this disease, she can change personality
#define DISEASE_PROPERTY_ADD_DISABILITY 0x00000040 // whenever we contract this disease, we gain a new disability
#define DISEASE_PROPERTY_LIMITED_USE_ARMS 0x00000080 // our arms have limited functionality
#define DISEASE_PROPERTY_LIMITED_USE_LEGS 0x00000100 // our legs have limited functionality
#define CORPSEREMOVALPOINTSPERCORPSE 1.0f // number of corpse removal points required to, you guessed it, remove a corpse
#define DISEASE_PER_ROTTINGCORPSE 100.0f // if a corpse is removed by rotting, add this many disease points to the sector
#define DISEASE_MAX_SECTOR 10000.0f // max disease points in a sector
typedef struct
{
UINT8 uiIndex;
CHAR16 szName[80]; // name of disease, used for display
CHAR16 szFatName[80]; // name of disease, used for display
CHAR16 szDescription[256]; // a short description of the disease. Observe and learn, kids!
// diseases are measured in disease points
INT32 sInfectionPtsInitial; // number of points gained on infection
INT32 sInfectionPtsOutbreak; // at this many points, the disease breaks out - effects start and one can see it
INT32 sInfectionPtsFull; // the nominal point of a full-blown infection. Effects are scaled towards this
INT32 sInfectionPtsGainPerHour; // extra points gained every hour if infected
// infection chances and behaviour
FLOAT dInfectionChance[INFECTION_TYPE_MAX]; // percentage chance of being infected this way if conditions are fulfilled
UINT32 usDiseaseProperties; // properties of the disease
// effects of disease (effect at sInfectionPtsFull points), scaled
INT8 sEffStat[INFST_MAX]; // stat effectivity is altered
INT8 sEffAP; // alter APs
UINT8 usMaxBreath; // max Breath is lowered by this percentage
INT8 sEffCarryStrength; // carrying strength
INT16 sLifeRegenHundreds; // alter hourly life regen by these hundreds
INT8 sNeedToSleep; // +/- need to sleep
INT16 sDrinkModifier; // +/- % water consumption
INT16 sFoodModifier; // +/- % water consumption
FLOAT moralemodifier; // a modifier to total morale
} DISEASE;
//GLOBALS
extern DISEASE Disease[NUM_DISEASES];
void HandleDisease();
// handle possible infection of type aInfectionType to pSoldier. Possible related to pOtherSoldier (can be NULL !)
// chance gets modified by aModifier (contextual modifier)
// if fStrategicOnly == TRUE, then we only handle disease 0
void HandlePossibleInfection( SOLDIERTYPE *pSoldier, SOLDIERTYPE* pOtherSoldier, UINT8 aInfectionType, FLOAT aModifier = 1.0f, BOOLEAN fStrategicOnly = FALSE );
////////////// STRATEGIC DISEASE //////////////////////////
enum
{
MAPMODE_OFF = 0,
MAPMODE_DISEASE,
MAPMODE_MAX,
};
// directions for adjacent sectors
enum {
SP_UP,
SP_LEFT,
SP_RIGHT,
SP_DOWN,
SP_DIR_MAX,
};
// return number of adjacent sector or -1 if there is none
INT16 GetAdjacentSector( UINT8 sector, UINT8 spdir );
// get a sector population (not the tactical one - we use an xml estimation + troops present)
UINT16 GetSectorPopulation( INT16 sX, INT16 sY, BOOLEAN fWithMilitary = TRUE );
void HandleDiseaseDailyRefresh();
// heal sector population, return number of points used
UINT32 HealSectorPopulation( INT16 sX, INT16 sY, UINT32 uHealpts );
// Flugente: get workforce effectiveness with regards to strategic disease
FLOAT GetWorkforceEffectivenessWithDisease( INT8 bTownId, UINT8 usTeam );
// if this fraction of a sector's population is infected, outbreak is declared regardless of infection severity
// Otherwise infection would be untreatable at this point
FLOAT GetSectorDiseaseOverFlowThreshold();
#endif //__DISEASE_H