mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&th=23044&goto=352617&#msg_352617 git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8537 3b4a5df2-a311-0410-b5c6-a8a6f20db521
193 lines
7.2 KiB
C++
193 lines
7.2 KiB
C++
#ifndef _MILITIA_INDIVIDUAL_H
|
|
#define _MILITIA_INDIVIDUAL_H
|
|
|
|
/**
|
|
* @file
|
|
* @author Flugente (bears-pit.com)
|
|
*/
|
|
|
|
// These functions are used for the individual militia feature
|
|
|
|
#include "Assignments.h"
|
|
#include "soldier profile type.h"
|
|
#include "Animation Data.h"
|
|
#include "Soldier Create.h"
|
|
|
|
// not used atm
|
|
/*typedef struct
|
|
{
|
|
UINT16 item; // item id, refers to the ones in Items.xml
|
|
UINT16 status; // status of item. In case of ammo items, this instead refers to the ammo count. No bullets lost here.
|
|
} MILITIA_ITEM;*/
|
|
|
|
/*enum
|
|
{
|
|
WISDOM = NUM_TRAINABLE_STATS,
|
|
LEVEL,
|
|
HEALTH_CURRENT,
|
|
NUM_TOTAL_STATS
|
|
};*/
|
|
|
|
#define MILITIA_BATTLEREPORT_FLAG_RECRUITED 0x00000001 // this was not a battle, but we were recruited - use id as timestamp in hours
|
|
#define MILITIA_BATTLEREPORT_FLAG_PROMOTED 0x00000002 // this was not a battle, but we were promoted - use id as timestamp in hours
|
|
#define MILITIA_BATTLEREPORT_FLAG_DIED 0x00000004 // militia died in this battle
|
|
#define MILITIA_BATTLEREPORT_FLAG_WOUNDED_SMALL 0x00000008 // was lightly wounded
|
|
|
|
#define MILITIA_BATTLEREPORT_FLAG_WOUNDED_HEAVY 0x00000010 // was heavily wounded
|
|
#define MILITIA_BATTLEREPORT_FLAG_WOUNDED_COMA 0x00000020 // wounds were so heavy that we fell into a coma
|
|
#define MILITIA_BATTLEREPORT_FLAG_KILLEDENEMY 0x00000040 // killed an enemy
|
|
#define MILITIA_BATTLEREPORT_FLAG_FIRED 0x00000080 // militia was fired
|
|
|
|
struct MILITIA_BATTLEREPORT
|
|
{
|
|
MILITIA_BATTLEREPORT( ) : id( 0 ), flagmask( 0 ) {}
|
|
|
|
UINT32 id; // id of battle militia took part in. Ties to campaign history, thus we know with more detail what happened there.
|
|
UINT32 flagmask; // we can note up to 16 different properties here - perhaps wether we were a reinforcement, or were wounded and such
|
|
};
|
|
|
|
// a militia's origin affects the chances of his makeout
|
|
enum MilitiaOrigin
|
|
{
|
|
MO_ARULCO, // standard, militia was an aruclan volunteer that has been trained by the player
|
|
MO_PMC, // militia was hired from a PMC by the player
|
|
MO_DEFECTOR, // militia was an enemy captured by the player and switched to the player side during interrogation
|
|
|
|
MO_MAX
|
|
};
|
|
|
|
// This struct defines necessary data for a pool of militia origins.
|
|
// For example, if you want PMC militia to resemble eastern european buff guys, you only need to define the specific fore- and surnames,
|
|
// set the chance for huge male bodytpes high, and give according skin colour chances
|
|
typedef struct
|
|
{
|
|
// possible name pool
|
|
std::vector<std::wstring> szMale_Forename;
|
|
std::vector<std::wstring> szMale_Surname;
|
|
std::vector<std::wstring> szFemale_Forename;
|
|
std::vector<std::wstring> szFemale_Surname;
|
|
|
|
// chances for bodytypes and skin colours (hair is chosen auomatically according to coded scheme)
|
|
UINT8 chance_bodytype[ADULTFEMALEMONSTER];
|
|
UINT8 chance_skin[NUMSKINS];
|
|
UINT16 dailycost[MAX_MILITIA_LEVELS];
|
|
} MilitiaOriginData;
|
|
|
|
extern MilitiaOriginData gMilitiaOriginData[MO_MAX];
|
|
|
|
#define MILITIAFLAG_DEAD 0x00000001 // this guy is dead
|
|
#define MILITIAFLAG_FIRED 0x00000002 // this guy no longer works for us - we fired him, or didn't have the money to keep them
|
|
#define MILITIAFLAG_NEEDS_SECTOR 0x00000004 // as the player currently resets militia in a town's sector in the map, this militia's sector is not clear
|
|
|
|
class MILITIA
|
|
{
|
|
public:
|
|
MILITIA();
|
|
|
|
BOOLEAN Save( HWFILE hFile );
|
|
BOOLEAN Load( HWFILE hwFile );
|
|
|
|
STR16 GetName( );
|
|
STR16 GetSector( );
|
|
STR16 GetOriginSector( );
|
|
void AddKills( UINT16 aKills, UINT16 aAssists );
|
|
UINT16 GetWage();
|
|
void Fire(); // release militia from our service. Does not take care of actually removing a militia from the sector!
|
|
|
|
UINT32 id; // number of militia. Tied with one or more separate tables of names, this gives us a name
|
|
UINT32 flagmask; // individual flags - we are dead etc.
|
|
|
|
// origin
|
|
UINT8 origin; // one of MilitiaOrigin
|
|
UINT8 originsector; // sector militia was first created in
|
|
UINT8 sector; // sector militia currently is in
|
|
UINT8 age;
|
|
|
|
// visuals
|
|
UINT8 militiarank; // green/veteran/elite
|
|
UINT8 bodytype; // male/bigmale1/bigmale2/female
|
|
UINT8 skin;
|
|
UINT8 hair;
|
|
|
|
// name
|
|
UINT16 forename;
|
|
UINT16 surname;
|
|
UINT16 callsign;
|
|
|
|
// As stats are highly dependent of game progress and current sector, storing the stats themselves is ill-advised.
|
|
// We thus only store the current HP percentage.
|
|
FLOAT healthratio;
|
|
|
|
UINT16 kills;
|
|
UINT16 assists;
|
|
|
|
// we don't store the experience level, we store the amount of points in regard to promotion.
|
|
// While this is made up of kills and assists, we need this, as we have to account for militia initially starting at regular level
|
|
FLOAT promotionpoints;
|
|
|
|
char endOfPOD; // marker for end of POD (plain old data)
|
|
|
|
std::vector<MILITIA_BATTLEREPORT> history; // reports on all battles this militia took part in
|
|
};
|
|
|
|
#define SIZEOF_MILITIA_POD offsetof( MILITIA, endOfPOD )
|
|
|
|
// later on, make this an array with a vector for each sector
|
|
extern std::vector<MILITIA> gIndividualMilitiaVector;
|
|
|
|
void InitIndividualMilitiaData();
|
|
BOOLEAN SaveIndividualMilitiaData( HWFILE hwFile );
|
|
BOOLEAN LoadIndividualMilitiaData( HWFILE hwFile );
|
|
|
|
// wrapper functions to retrieve militia
|
|
UINT32 TotalNumberIndividualMilitia( );
|
|
UINT32 GetFreeIndividualMilitiaId();
|
|
BOOLEAN IsLegalMilitiaId( UINT32 aId );
|
|
|
|
// return militia with a certain id
|
|
BOOLEAN GetMilitia( UINT32 aId, MILITIA* apMilitia );
|
|
|
|
// update data
|
|
void UpdateMilitia( MILITIA aMilitia );
|
|
|
|
SOLDIERTYPE* GetUsedSoldierToIndividualMilitia( UINT32 aMilitiaId );
|
|
|
|
// apply tactical life ratio to militia health ratio
|
|
void ApplyTacticalLifeRatioToMilitia();
|
|
|
|
// apply health ratios to militia in tactical
|
|
void ApplyMilitiaHealthRatioToTactical();
|
|
|
|
void HandleHourlyMilitiaHealing( );
|
|
UINT32 MilitiaIndividual_Heal(UINT32 points, UINT8 aSector );
|
|
|
|
UINT32 CreateRandomIndividualMilitia( UINT8 aMilitiaRank, UINT8 aOrigin, UINT8 aSector );
|
|
|
|
UINT32 CreateNewIndividualMilitia( UINT8 aMilitiaRank, UINT8 aOrigin, UINT8 aSector );
|
|
|
|
UINT32 GetIdOfUnusedIndividualMilitia( UINT8 aSoldierClass, UINT8 aSector );
|
|
|
|
BOOLEAN GetIdOfIndividualMilitiaWithClassSector( UINT8 aSoldierClass, UINT8 aSector, UINT32& arId );
|
|
|
|
FLOAT PromoteIndividualMilitiaInSector( UINT8 aSector, FLOAT aPointsToAdd );
|
|
|
|
// handle possible militia promotion and individual militia update
|
|
void HandlePossibleMilitiaPromotion( SOLDIERTYPE* pSoldier, BOOLEAN aAutoResolve );
|
|
|
|
void MoveIndividualMilitiaProfiles( UINT8 aSourceSector, UINT8 aTargetSector, UINT8 usGreens, UINT8 usRegulars, UINT8 usElites );
|
|
|
|
// militia are disbanded - we have to take note of that
|
|
void DisbandIndividualMilitia( UINT8 aSector, UINT8 usGreens, UINT8 usRegulars, UINT8 usElites );
|
|
|
|
void PromoteIndividualMilitia( UINT8 aSector, UINT8 aSoldierClass );
|
|
|
|
void PossiblyPromoteIndividualMilitia( MILITIA& aMilitia );
|
|
|
|
// return the sum of daily wages, and the number of individual militia per class
|
|
UINT32 GetDailyUpkeep_IndividualMilitia( UINT32& arNumGreen, UINT32& arNumRegular, UINT32& arNumElite );
|
|
|
|
// if the player repositions militia in a town in strategic, we need to reposition militia as well
|
|
void PickIndividualMilitia( UINT8 aSector, UINT8 ubType, UINT16 aNumber );
|
|
void DropIndividualMilitia( UINT8 aSector, UINT8 ubType, UINT16 aNumber );
|
|
|
|
#endif |