#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