New (originally very old) feature: merc relations are influenced by appearance/refinement/racism/nationality/sexism. See http://www.bears-pit.com/board/ubbthreads.php/topics/326828.html#Post326828 for more info.

Also includes classes for creation of dropdown menua, see Laptop/DropDown.h.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6510 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2013-10-19 16:33:43 +00:00
parent 73be285e09
commit b9ac50aaac
29 changed files with 3624 additions and 21 deletions
+133 -2
View File
@@ -1095,12 +1095,143 @@ void HourlyMoraleUpdate( void )
bOpinion = 0;
}
// Flugente: evaluate appearance/refinement/hated nationalities
// some people loathe ugly people and like beautiful people. It's a mean world.
// we also handle sexism here
switch ( gMercProfiles[ pOtherSoldier->ubProfile ].bAppearance )
{
case APPEARANCE_UGLY:
{
if ( pProfile->bAppearanceCareLevel == CARELEVEL_SOME )
bOpinion -= gGameExternalOptions.sMoraleModAppearance * 2;
else if ( pProfile->bAppearanceCareLevel == CARELEVEL_EXTREME )
bOpinion -= gGameExternalOptions.sMoraleModAppearance * 4;
// some people are sexists
if ( pProfile->bSexist && gMercProfiles[ pOtherSoldier->ubProfile ].bSex != pProfile->bSex )
{
if ( pProfile->bSexist == SOMEWHAT_SEXIST )
bOpinion -= gGameExternalOptions.sMoraleModSexism * 2;
else if ( pProfile->bSexist == VERY_SEXIST )
bOpinion -= gGameExternalOptions.sMoraleModSexism * 4;
}
}
break;
case APPEARANCE_HOMELY:
{
if ( pProfile->bAppearanceCareLevel == CARELEVEL_SOME )
bOpinion -= gGameExternalOptions.sMoraleModAppearance;
else if ( pProfile->bAppearanceCareLevel == CARELEVEL_EXTREME )
bOpinion -= gGameExternalOptions.sMoraleModAppearance * 2;
// some people are sexists
if ( pProfile->bSexist && gMercProfiles[ pOtherSoldier->ubProfile ].bSex != pProfile->bSex )
{
if ( pProfile->bSexist == SOMEWHAT_SEXIST )
bOpinion -= gGameExternalOptions.sMoraleModSexism;
else if ( pProfile->bSexist == VERY_SEXIST )
bOpinion -= gGameExternalOptions.sMoraleModSexism * 2;
}
}
break;
case APPEARANCE_ATTRACTIVE:
{
if ( pProfile->bAppearanceCareLevel == CARELEVEL_SOME )
bOpinion += gGameExternalOptions.sMoraleModAppearance;
else if ( pProfile->bAppearanceCareLevel == CARELEVEL_EXTREME )
bOpinion += gGameExternalOptions.sMoraleModAppearance * 2;
// some people are sexists
if ( pProfile->bSexist && gMercProfiles[ pOtherSoldier->ubProfile ].bSex != pProfile->bSex )
{
if ( pProfile->bSexist == SOMEWHAT_SEXIST )
bOpinion += gGameExternalOptions.sMoraleModSexism;
else if ( pProfile->bSexist == VERY_SEXIST )
bOpinion += gGameExternalOptions.sMoraleModSexism * 2;
}
}
break;
case APPEARANCE_BABE:
{
if ( pProfile->bAppearanceCareLevel == CARELEVEL_SOME )
bOpinion += gGameExternalOptions.sMoraleModAppearance * 2;
else if ( pProfile->bAppearanceCareLevel == CARELEVEL_EXTREME )
bOpinion += gGameExternalOptions.sMoraleModAppearance * 4;
// some people are sexists
if ( pProfile->bSexist && gMercProfiles[ pOtherSoldier->ubProfile ].bSex != pProfile->bSex )
{
if ( pProfile->bSexist == SOMEWHAT_SEXIST )
bOpinion += gGameExternalOptions.sMoraleModSexism * 2;
else if ( pProfile->bSexist == VERY_SEXIST )
bOpinion += gGameExternalOptions.sMoraleModSexism * 4;
}
}
break;
}
// some people care about how distuingished other people are. Malus if on different ends of the spectrum, a small bonus if on the same and its really important to the person
switch ( gMercProfiles[ pOtherSoldier->ubProfile ].bRefinement )
{
case REFINEMENT_SLOB:
{
if ( pProfile->bRefinement == REFINEMENT_SLOB )
{
if ( pProfile->bRefinementCareLevel == CARELEVEL_EXTREME )
bOpinion += gGameExternalOptions.sMoraleModRefinement;
}
else if ( pProfile->bRefinement == REFINEMENT_SNOB )
{
if ( pProfile->bRefinementCareLevel == CARELEVEL_SOME )
bOpinion -= gGameExternalOptions.sMoraleModRefinement;
else if ( pProfile->bRefinementCareLevel == CARELEVEL_EXTREME )
bOpinion -= gGameExternalOptions.sMoraleModRefinement * 2;
}
}
break;
case REFINEMENT_SNOB:
{
if ( pProfile->bRefinement == REFINEMENT_SNOB )
{
if ( pProfile->bRefinementCareLevel == CARELEVEL_EXTREME )
bOpinion += gGameExternalOptions.sMoraleModRefinement;
}
else if ( pProfile->bRefinement == REFINEMENT_SLOB )
{
if ( pProfile->bRefinementCareLevel == CARELEVEL_SOME )
bOpinion -= gGameExternalOptions.sMoraleModRefinement;
else if ( pProfile->bRefinementCareLevel == CARELEVEL_EXTREME )
bOpinion -= gGameExternalOptions.sMoraleModRefinement * 2;
}
}
break;
}
// some people hate other nationalities (do not mix up with racism, which uses bRace)
if ( pProfile->bHatedNationality > -1 && gMercProfiles[ pOtherSoldier->ubProfile ].bNationality == pProfile->bHatedNationality )
{
if ( pProfile->bHatedNationalityCareLevel == CARELEVEL_SOME )
bOpinion -= gGameExternalOptions.sMoraleModHatedNationality;
else if ( pProfile->bHatedNationalityCareLevel == CARELEVEL_EXTREME )
bOpinion -= gGameExternalOptions.sMoraleModHatedNationality * 2;
}
// some people are racists
if ( pProfile->bRacist && gMercProfiles[ pOtherSoldier->ubProfile ].bRace != pProfile->bRace )
{
if ( pProfile->bRacist == RACIST_SOME )
bOpinion -= gGameExternalOptions.sMoraleModRacism;
else if ( pProfile->bRacist == RACIST_VERY )
bOpinion -= gGameExternalOptions.sMoraleModRacism * 2;
}
// Flugente: backgrounds
if ( pSoldier->HasBackgroundFlag( BACKGROUND_XENOPHOBIC ) && pOtherSoldier->ubProfile != NO_PROFILE && gMercProfiles[pSoldier->ubProfile].usBackground != gMercProfiles[pOtherSoldier->ubProfile].usBackground )
bOpinion -= 2;
bOpinion -= gGameExternalOptions.sMoraleModXenophobicBackGround;
if (bOpinion == HATED_OPINION)
{
bHated = WhichHated( pSoldier->ubProfile, pOtherSoldier->ubProfile );
if ( bHated >= 2 )
{
+11
View File
@@ -379,6 +379,17 @@ typedef struct
UINT8 bLearnToHate;
INT8 bLearnToHateTime;
INT8 bRace;
INT8 bNationality;
INT8 bAppearance;
INT8 bAppearanceCareLevel;
INT8 bRefinement;
INT8 bRefinementCareLevel;
INT8 bHatedNationality;
INT8 bHatedNationalityCareLevel;
INT8 bRacist;
UINT8 bSexist;
INT16 sSalary;
UINT32 uiWeeklySalary;
UINT32 uiBiWeeklySalary;
+119 -4
View File
@@ -158,6 +158,16 @@ profileStartElementHandle(void *userData, const XML_Char *name, const XML_Char *
strcmp(name, "bHatedTime5") == 0 ||
strcmp(name, "bLearnToHate") == 0 ||
strcmp(name, "bLearnToHateTime") == 0 ||
strcmp(name, "bRace") == 0 ||
strcmp(name, "bNationality") == 0 ||
strcmp(name, "bAppearance") == 0 ||
strcmp(name, "bAppearanceCareLevel") == 0 ||
strcmp(name, "bRefinement") == 0 ||
strcmp(name, "bRefinementCareLevel") == 0 ||
strcmp(name, "bHatedNationality") == 0 ||
strcmp(name, "bHatedNationalityCareLevel") == 0 ||
strcmp(name, "bRacist") == 0 ||
strcmp(name, "bSexist") == 0 ||
strcmp(name, "sSalary") == 0 ||
strcmp(name, "uiWeeklySalary") == 0 ||
strcmp(name, "uiBiWeeklySalary") == 0 ||
@@ -318,6 +328,17 @@ profileEndElementHandle(void *userData, const XML_Char *name)
tempProfiles[pData->curIndex].bLearnToHate = pData->curProfile.bLearnToHate;
tempProfiles[pData->curIndex].bLearnToHateTime = pData->curProfile.bLearnToHateTime;
tempProfiles[pData->curIndex].bRace = pData->curProfile.bRace;
tempProfiles[pData->curIndex].bNationality = pData->curProfile.bNationality;
tempProfiles[pData->curIndex].bAppearance = pData->curProfile.bAppearance;
tempProfiles[pData->curIndex].bAppearanceCareLevel = pData->curProfile.bAppearanceCareLevel;
tempProfiles[pData->curIndex].bRefinement = pData->curProfile.bRefinement;
tempProfiles[pData->curIndex].bRefinementCareLevel = pData->curProfile.bRefinementCareLevel;
tempProfiles[pData->curIndex].bHatedNationality = pData->curProfile.bHatedNationality;
tempProfiles[pData->curIndex].bHatedNationalityCareLevel = pData->curProfile.bHatedNationalityCareLevel;
tempProfiles[pData->curIndex].bRacist = pData->curProfile.bRacist;
tempProfiles[pData->curIndex].bSexist = pData->curProfile.bSexist;
tempProfiles[pData->curIndex].sSalary = pData->curProfile.sSalary;
tempProfiles[pData->curIndex].uiWeeklySalary = pData->curProfile.uiWeeklySalary;
tempProfiles[pData->curIndex].uiBiWeeklySalary = pData->curProfile.uiBiWeeklySalary;
@@ -854,6 +875,87 @@ profileEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
pData->curProfile.bLearnToHateTime = (UINT32) strtoul(pData->szCharData, NULL, 0);
}
else if(strcmp(name, "bRace") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bRace = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bRace = max(0, min(NUM_RACES-1, pData->curProfile.bRace));
}
else if(strcmp(name, "bNationality") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bNationality = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bNationality = max(0, min(NUM_NATIONALITIES-1, pData->curProfile.bNationality));
}
else if(strcmp(name, "bAppearance") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bAppearance = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bAppearance = max(0, min(NUM_APPEARANCES-1, pData->curProfile.bAppearance));
}
else if(strcmp(name, "bAppearanceCareLevel") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bAppearanceCareLevel = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bAppearanceCareLevel = max(0, min(NUM_CARELEVELS-1, pData->curProfile.bAppearanceCareLevel));
}
else if(strcmp(name, "bRefinement") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bRefinement = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bRefinement = max(0, min(NUM_REFINEMENT-1, pData->curProfile.bRefinement));
}
else if(strcmp(name, "bRefinementCareLevel") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bRefinementCareLevel = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bRefinementCareLevel = max(0, min(NUM_CARELEVELS-1, pData->curProfile.bRefinementCareLevel));
}
else if(strcmp(name, "bHatedNationality") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bHatedNationality = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bHatedNationality = max(-1, min(NUM_NATIONALITIES-1, pData->curProfile.bHatedNationality));
}
else if(strcmp(name, "bHatedNationalityCareLevel") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bHatedNationalityCareLevel = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bHatedNationalityCareLevel = max(0, min(NUM_CARELEVELS-1, pData->curProfile.bHatedNationalityCareLevel));
}
else if(strcmp(name, "bRacist") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bRacist = (INT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bRacist = max(0, min(NUM_RACIST-1, pData->curProfile.bRacist));
}
else if(strcmp(name, "bSexist") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bSexist = (UINT8) strtoul(pData->szCharData, NULL, 0);
// no nonsense values
pData->curProfile.bSexist = max(0, min(NUM_SEXIST-1, pData->curProfile.bSexist));
}
else if(strcmp(name, "sSalary") == 0)
{
@@ -962,7 +1064,7 @@ profileEndElementHandle(void *userData, const XML_Char *name)
{
pData->curElement = ELEMENT;
pData->curProfile.bSectorZ = (INT8) atol(pData->szCharData);
}
}
else if(strcmp(name, "ubCivilianGroup") == 0)
{
pData->curElement = ELEMENT;
@@ -972,8 +1074,10 @@ profileEndElementHandle(void *userData, const XML_Char *name)
{
pData->curElement = ELEMENT;
pData->curProfile.bTown = (INT8) atol(pData->szCharData);
}
else if(strcmp(name, "bTownAttachment") == 0)
}
// Flugente: need to break the 'else if' structure here. Otherwise the compiler will complain about fatal error C1061: compiler limit : blocks nested too deeply
if(strcmp(name, "bTownAttachment") == 0)
{
pData->curElement = ELEMENT;
pData->curProfile.bTownAttachment = (INT8) atol(pData->szCharData);
@@ -982,7 +1086,7 @@ profileEndElementHandle(void *userData, const XML_Char *name)
{
pData->curElement = ELEMENT;
pData->curProfile.usBackground = (UINT8) atol(pData->szCharData);
}
}
pData->maxReadDepth--;
@@ -1523,6 +1627,17 @@ BOOLEAN WriteMercProfiles()
FilePrintf(hFile,"\t\t<bLearnToHate>%d</bLearnToHate>\r\n", gMercProfiles[ cnt ].bLearnToHate);
FilePrintf(hFile,"\t\t<bLearnToHateTime>%d</bLearnToHateTime>\r\n", gMercProfiles[ cnt ].bLearnToHateTime);
FilePrintf(hFile,"\t\t<bRace>%d</bRace>\r\n", gMercProfiles[ cnt ].bRace);
FilePrintf(hFile,"\t\t<bNationality>%d</bNationality>\r\n", gMercProfiles[ cnt ].bNationality);
FilePrintf(hFile,"\t\t<bAppearance>%d</bAppearance>\r\n", gMercProfiles[ cnt ].bAppearance);
FilePrintf(hFile,"\t\t<bAppearanceCareLevel>%d</bAppearanceCareLevel>\r\n", gMercProfiles[ cnt ].bAppearanceCareLevel);
FilePrintf(hFile,"\t\t<bRefinement>%d</bRefinement>\r\n", gMercProfiles[ cnt ].bRefinement);
FilePrintf(hFile,"\t\t<bRefinementCareLevel>%d</bRefinementCareLevel>\r\n", gMercProfiles[ cnt ].bRefinementCareLevel);
FilePrintf(hFile,"\t\t<bHatedNationality>%d</bHatedNationality>\r\n", gMercProfiles[ cnt ].bHatedNationality);
FilePrintf(hFile,"\t\t<bHatedNationalityCareLevel>%d</bHatedNationalityCareLevel>\r\n", gMercProfiles[ cnt ].bHatedNationalityCareLevel);
FilePrintf(hFile,"\t\t<bRacist>%d</bRacist>\r\n", gMercProfiles[ cnt ].bRacist);
FilePrintf(hFile,"\t\t<bSexist>%d</bSexist>\r\n", gMercProfiles[ cnt ].bSexist);
FilePrintf(hFile,"\t\t<sSalary>%d</sSalary>\r\n", gMercProfiles[ cnt ].sSalary);
FilePrintf(hFile,"\t\t<uiWeeklySalary>%d</uiWeeklySalary>\r\n", gMercProfiles[ cnt ].uiWeeklySalary);
FilePrintf(hFile,"\t\t<uiBiWeeklySalary>%d</uiBiWeeklySalary>\r\n", gMercProfiles[ cnt ].uiBiWeeklySalary);
+98 -2
View File
@@ -197,13 +197,108 @@ typedef enum
// SANDRO - appearances
typedef enum
{
APPEARANCE_AVARAGE = 0,
APPEARANCE_AVERAGE = 0,
APPEARANCE_UGLY,
APPEARANCE_HOMELY,
APPEARANCE_ATTRACTIVE,
APPEARANCE_BABE,
NUM_APPEARANCES
} Appearances;
// Flugente - care levels
typedef enum
{
CARELEVEL_NONE = 0,
CARELEVEL_SOME = 1,
CARELEVEL_EXTREME = 2,
NUM_CARELEVELS
} CareLevels;
// Flugente - refinements
typedef enum
{
REFINEMENT_AVERAGE = 0,
REFINEMENT_SLOB = 1,
REFINEMENT_SNOB = 2,
NUM_REFINEMENT
} Refinements;
// Flugente - nationalities
typedef enum
{
// old Sirtech values
AMERICAN = 0, // take that, Murica! Sirtech knew you have no value :-)
ARAB = 1,
AUSTRALIAN = 2,
BRITISH = 3,
CANADIAN = 4,
CUBAN = 5,
DANISH = 6,
FRENCH = 7,
RUSSIAN = 8,
NIGERIAN = 9, // this was simply not defined in original data (I did not find any country), but we can't have any holes in here, so just invented soemthing
SWISS = 10,
JAMAICAN = 11,
POLISH = 12,
CHINESE = 13,
IRISH = 14,
SOUTH_AFRICAN = 15,
HUNGARIAN = 16,
SCOTTISH = 17,
ARULCAN = 18,
GERMAN = 19,
AFRICAN = 20,
ITALIAN = 21,
DUTCH = 22,
ROMANIAN = 23,
METAVIRAN = 24,
// new values, because why not
GREEK, // 25
ESTONIAN,
VENEZUELAN ,
JAPANESE,
TURKISH,
INDIAN, // 30
MEXICAN,
NORWEGIAN,
SPANISH,
BRASILIAN,
FINNISH, // 35
IRANIAN,
ISRAELI,
BULGARIAN,
SWEDISH,
IRAQI, // 40
SYRIAN,
NUM_NATIONALITIES
} Nationalities;
// Flugente - races
typedef enum
{
WHITE = 0,
BLACK = 1,
ASIAN = 2,
ESKIMO = 3,
HISPANIC = 4,
NUM_RACES
} Races;
// Flugente - racist levels
typedef enum
{
RACIST_NONE = 0,
RACIST_SOME = 1,
RACIST_VERY = 2,
NUM_RACIST
} RacistLevels;
//////////////////////////////////////////////////////////////////////
typedef enum
@@ -250,7 +345,8 @@ typedef enum
NOT_SEXIST = 0,
SOMEWHAT_SEXIST,
VERY_SEXIST,
GENTLEMAN
GENTLEMAN,
NUM_SEXIST
} SexistLevels;