Files
source/Tactical/Food.h

113 lines
3.8 KiB
C

#ifndef __FOOD_H
#define __FOOD_H
#include "Soldier Control.h"
#include "soldier profile type.h"
#define FOOD_MIN - 20000
#define FOOD_MAX 20000
#define FOOD_RANGE (FOOD_MAX - FOOD_MIN)
#define FOOD_HALF_RANGE (FOOD_RANGE / 2)
typedef enum
{
FOOD_STUFFED,
FOOD_EXTREMELY_FULL,
FOOD_VERY_FULL,
FOOD_FULL,
FOOD_SLIGHTLY_FULL,
FOOD_NORMAL,
FOOD_LOW,
FOOD_EVEN_LOWER,
FOOD_VERY_LOW,
FOOD_DANGER,
FOOD_DESPERATE,
FOOD_STARVING,
NUM_FOOD_MORALE_TYPES
} FoodMoraleModType;
#define FOOD_MERC_START_CONSUME FOOD_LOW
#define FOOD_MERC_START_SHOW_HUNGER_SYMBOL FOOD_EVEN_LOWER
#define FOOD_MERC_STOP_FACILITY FOOD_FULL
#define FOOD_MERC_REFUSAL FOOD_VERY_FULL
typedef struct
{
INT32 bThreshold;
INT8 bMoraleModifier; // absolute modifier to max morale
INT8 bSleepModifier; // absolute modifier
INT8 bBreathRegenModifier; // percentage modifier
INT8 bAssignmentEfficiencyModifier; // percentage modifier
UINT8 ubStatDamageChance; // percentual chance to receive damage to life and strength
} FoodMoraleMod;
extern FoodMoraleMod FoodMoraleMods[NUM_FOOD_MORALE_TYPES];
extern UINT8 gbPlayerNum;
typedef struct
{
UINT16 uiIndex;
CHAR16 szName[80]; // name of this food
INT32 bFoodPoints; // points that will be added to our drink level
INT32 bDrinkPoints; // points that will be added to our drink level
FLOAT usDecayRate; // rate at which food decays
} FOODTYPE;
//GLOBALS
extern FOODTYPE Food[FOOD_TYPE_MAX];
// mercs can have different opinions on food
typedef struct
{
INT8 sFoodOpinion[FOOD_TYPE_MAX];
} FOODOPINIONS;
extern FOODOPINIONS FoodOpinions[NUM_PROFILES];
// for determining the type of water source a sector has
typedef enum
{
WATER_NONE, // no water at all
WATER_DRINKABLE, // drinkable water (rivers, water supply from houses)
WATER_SALTWATER, // salt water, can't drink that (until something special for this gets implemented)
WATER_POISONOUS // there is water, but it is poisoned (swamps and polluted sectors)
} FoodSectorWaterSupply;
BOOLEAN DoesSoldierRefuseToEat( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj );
// eat a food object. if fForce = FALSE, the soldier can reject to eat this once
// if fForceFromDrugs = TRUE, we HAVE to eat this, because we already got the effects from the ApplyDrugs-function (item is both drug and food)
BOOLEAN ApplyFood( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObject, UINT16 usPointsToUse );
void GetFoodSituation( SOLDIERTYPE *pSoldier, UINT8* pFoodSituation, UINT8* pWaterSituation );
void FoodMaxMoraleModifiy( SOLDIERTYPE *pSoldier, UINT8* pubMaxMorale );
void FoodNeedForSleepModifiy( SOLDIERTYPE *pSoldier, UINT8* pubNeedForSleep );
void ReducePointsForHunger( SOLDIERTYPE *pSoldier, UINT32 *pusPoints );
void ReduceBPRegenForHunger( SOLDIERTYPE *pSoldier, INT32 *psPoints );
void HourlyFoodSituationUpdate( SOLDIERTYPE *pSoldier );
void HourlyFoodAutoDigestion( SOLDIERTYPE *pSoldier );
// eat stuff from the inventory. if fcanteensonly = TRUE, only drink from canteen items
void EatFromInventory( SOLDIERTYPE *pSoldier, BOOLEAN fcanteensonly = FALSE );
void HourlyFoodUpdate( void );
UINT8 GetWaterQuality(INT16 asMapX, INT16 asMapY, INT8 asMapZ);
// a function that tries to fill up all canteens in this sector
void SectorFillCanteens( void );
OBJECTTYPE* GetUsableWaterDrumInSector( void );
// soldier refills canteen while auto-consuming. Only clean sector water souces are consumed, an sector inventory is not touched (sector is likely not loaded)
void SoldierAutoFillCanteens(SOLDIERTYPE *pSoldier);
BOOLEAN HasFoodInInventory( SOLDIERTYPE *pSoldier, BOOLEAN fCheckFood, BOOLEAN fCheckDrink );
void DrinkFromWaterTap( SOLDIERTYPE *pSoldier );
#endif