New background property: <animal_friend> will refuse to attack animals, unless attacked by that animal.

New background property: <civgroup_loyal> will refuse to attack neutral members of the same civilian group.
Fixed array bound in GetTileSetIndexVector().

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8731 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2020-01-15 20:27:00 +00:00
parent 9c563c9c8a
commit cbc1b8c5e3
13 changed files with 104 additions and 41 deletions
+1 -1
View File
@@ -495,7 +495,7 @@ void AssignBackgroundHelpText( UINT16 ubNumber, MOUSE_REGION* pMouseregion )
UINT8 strused = 0;
for ( UINT8 i = 0; i < BG_MAX; ++i)
{
if ( BG_DISLIKEBG == i && zBackground[ubNumber].value[i] )
if (BG_DISLIKEBG == i && zBackground[ubNumber].value[i])
{
swprintf( atStr, szBackgroundText_Value[strused] );
wcscat( apStr, atStr );
+43 -18
View File
@@ -317,41 +317,66 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
return( ITEM_HANDLE_BROKEN );
}
if ( fFromUI && pSoldier->bTeam == gbPlayerNum && pTargetSoldier &&
(pTargetSoldier->bTeam == gbPlayerNum || pTargetSoldier->aiData.bNeutral) && pTargetSoldier->ubBodyType != CROW &&
Item[usHandItem].usItemClass != IC_MEDKIT &&
!Item[usHandItem].gascan &&
!ItemCanBeAppliedToOthers( usHandItem ) &&
!HasItemFlag( usHandItem, EMPTY_BLOOD_BAG ) )
if (fFromUI &&
pSoldier->bTeam == gbPlayerNum &&
pSoldier->ubProfile != NO_PROFILE &&
pTargetSoldier &&
Item[usHandItem].usItemClass != IC_MEDKIT &&
!Item[usHandItem].gascan &&
!ItemCanBeAppliedToOthers(usHandItem) &&
!HasItemFlag(usHandItem, EMPTY_BLOOD_BAG))
{
if ( pSoldier->ubProfile != NO_PROFILE )
if (pTargetSoldier->bTeam == gbPlayerNum || pTargetSoldier->aiData.bNeutral)
{
// nice mercs won't shoot other nice guys or neutral civilians
if ( (gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY) && ( (pTargetSoldier->ubProfile == NO_PROFILE && pTargetSoldier->aiData.bNeutral) || gMercProfiles[ pTargetSoldier->ubProfile ].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY) )
if ((gMercProfiles[pSoldier->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY) &&
((pTargetSoldier->ubProfile == NO_PROFILE && pTargetSoldier->aiData.bNeutral && pTargetSoldier->ubBodyType != CROW) ||
pTargetSoldier->ubProfile != NO_PROFILE && gMercProfiles[pTargetSoldier->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY))
{
TacticalCharacterDialogue( pSoldier, QUOTE_REFUSING_ORDER );
return( ITEM_HANDLE_REFUSAL );
TacticalCharacterDialogue(pSoldier, QUOTE_REFUSING_ORDER);
return(ITEM_HANDLE_REFUSAL);
}
if ( pTargetSoldier->ubProfile != NO_PROFILE )
if (pTargetSoldier->ubProfile != NO_PROFILE)
{
// Flugente: as relations are now dynamic, check that instead
// buddies won't shoot each other
INT8 bOpinion = SoldierRelation( pSoldier, pTargetSoldier );
INT8 bOpinion = SoldierRelation(pSoldier, pTargetSoldier);
if ( bOpinion > BUDDY_OPINION - 5 || ((gMercProfiles[pSoldier->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY) && bOpinion > HATED_OPINION + 5) )
if (bOpinion > BUDDY_OPINION - 5 || ((gMercProfiles[pSoldier->ubProfile].ubMiscFlags3 & PROFILE_MISC_FLAG3_GOODGUY) && bOpinion > HATED_OPINION + 5))
{
TacticalCharacterDialogue( pSoldier, QUOTE_REFUSING_ORDER );
TacticalCharacterDialogue(pSoldier, QUOTE_REFUSING_ORDER);
return(ITEM_HANDLE_REFUSAL);
}
}
// any recruited rebel will refuse to fire on another rebel or neutral nameless civ
if ( pSoldier->ubCivilianGroup == REBEL_CIV_GROUP && (pTargetSoldier->ubCivilianGroup == REBEL_CIV_GROUP || ( pTargetSoldier->aiData.bNeutral && pTargetSoldier->ubProfile == NO_PROFILE && pTargetSoldier->ubCivilianGroup == NON_CIV_GROUP && pTargetSoldier->ubBodyType != CROW ) ) )
if (pSoldier->ubCivilianGroup == REBEL_CIV_GROUP &&
(pTargetSoldier->ubCivilianGroup == REBEL_CIV_GROUP ||
(pTargetSoldier->aiData.bNeutral && pTargetSoldier->ubProfile == NO_PROFILE && pTargetSoldier->ubCivilianGroup == NON_CIV_GROUP && pTargetSoldier->ubBodyType != CROW)))
{
TacticalCharacterDialogue( pSoldier, QUOTE_REFUSING_ORDER );
return( ITEM_HANDLE_REFUSAL );
TacticalCharacterDialogue(pSoldier, QUOTE_REFUSING_ORDER);
return(ITEM_HANDLE_REFUSAL);
}
// civgroup loyal will attack members of the same group
if (pSoldier->ubCivilianGroup != NON_CIV_GROUP &&
pSoldier->HasBackgroundFlag(BACKGROUND_CIVGROUPLOYAL) &&
pTargetSoldier->ubCivilianGroup == pSoldier->ubCivilianGroup)
{
TacticalCharacterDialogue(pSoldier, QUOTE_REFUSING_ORDER);
return(ITEM_HANDLE_REFUSAL);
}
}
// animal friend will refuse to attack animals
if (pSoldier->HasBackgroundFlag(BACKGROUND_ANIMALFRIEND) &&
(pTargetSoldier->ubBodyType == CROW || pTargetSoldier->ubBodyType == COW || pTargetSoldier->ubBodyType == BLOODCAT) &&
pSoldier->ubPreviousAttackerID != pTargetSoldier->ubID &&
pSoldier->ubNextToPreviousAttackerID != pTargetSoldier->ubID)
{
TacticalCharacterDialogue(pSoldier, QUOTE_REFUSING_ORDER);
return(ITEM_HANDLE_REFUSAL);
}
}
@@ -7959,7 +7984,7 @@ std::vector<std::pair<INT16, STR16> > GetTileSetIndexVector( INT16 aKey )
{
std::vector<std::pair<INT16, STR16> > vec;
if ( 0 <= aKey && aKey <= STRUCTURE_CONSTRUCT_MAX )
if ( 0 <= aKey && aKey < STRUCTURE_CONSTRUCT_MAX )
{
std::set<UINT8> indexset;
+4 -1
View File
@@ -452,7 +452,10 @@ enum
#define BACKGROUND_GLOBALOYALITYLOSSONDEATH 0x0000000000000100 //256 // if character dies, huge loyalty loss in entire country
#define BACKGROUND_FLAG_MAX 9 // number of flagged backgrounds - keep this updated, or properties will get lost!
#define BACKGROUND_ANIMALFRIEND 0x0000000000000200 //512 // refuses to attack animals
#define BACKGROUND_CIVGROUPLOYAL 0x0000000000000400 //1024 // refuses to attack members of the same civgroup
#define BACKGROUND_FLAG_MAX 11 // number of flagged backgrounds - keep this updated, or properties will get lost!
// some properties are hidden (forbid background in MP creation)
// corruption property is not relevant in 1.13
+13 -2
View File
@@ -148,8 +148,9 @@ backgroundStartElementHandle(void *userData, const XML_Char *name, const XML_Cha
strcmp(name, "traplevel") == 0 ||
strcmp(name, "no_male") == 0 ||
strcmp(name, "no_female") == 0 ||
strcmp(name, "loyalitylossondeath" ) == 0 ))
strcmp(name, "loyalitylossondeath" ) == 0 ||
strcmp(name, "animal_friend") == 0 ||
strcmp(name, "civgroup_loyal") == 0 ))
{
pData->curElement = ELEMENT_PROPERTY;
@@ -654,6 +655,16 @@ backgroundEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
pData->curBackground.uiFlags |= (UINT16)atol( pData->szCharData ) ? BACKGROUND_GLOBALOYALITYLOSSONDEATH : 0;
}
else if (strcmp(name, "animal_friend") == 0)
{
pData->curElement = ELEMENT;
pData->curBackground.uiFlags |= (UINT16)atol(pData->szCharData) ? BACKGROUND_ANIMALFRIEND : 0;
}
else if (strcmp(name, "civgroup_loyal") == 0)
{
pData->curElement = ELEMENT;
pData->curBackground.uiFlags |= (UINT16)atol(pData->szCharData) ? BACKGROUND_CIVGROUPLOYAL : 0;
}
pData->maxReadDepth--;
}
+17 -17
View File
@@ -23,35 +23,35 @@
//ONLY HAVE 8 MISC FLAGS.. SHOULD BE ENOUGH
#define PROFILE_MISC_FLAG_RECRUITED 0x01
#define PROFILE_MISC_FLAG_HAVESEENCREATURE 0x02
#define PROFILE_MISC_FLAG_RECRUITED 0x01
#define PROFILE_MISC_FLAG_HAVESEENCREATURE 0x02
#define PROFILE_MISC_FLAG_FORCENPCQUOTE 0x04
#define PROFILE_MISC_FLAG_WOUNDEDBYPLAYER 0x08
#define PROFILE_MISC_FLAG_TEMP_NPC_QUOTE_DATA_EXISTS 0x10
#define PROFILE_MISC_FLAG_SAID_HOSTILE_QUOTE 0x20
#define PROFILE_MISC_FLAG_EPCACTIVE 0x40
#define PROFILE_MISC_FLAG_ALREADY_USED_ITEMS 0x80 //The player has already purchased the mercs items.
#define PROFILE_MISC_FLAG_TEMP_NPC_QUOTE_DATA_EXISTS 0x10
#define PROFILE_MISC_FLAG_SAID_HOSTILE_QUOTE 0x20
#define PROFILE_MISC_FLAG_EPCACTIVE 0x40
#define PROFILE_MISC_FLAG_ALREADY_USED_ITEMS 0x80 //The player has already purchased the mercs items.
#define PROFILE_MISC_FLAG2_DONT_ADD_TO_SECTOR 0x01
#define PROFILE_MISC_FLAG2_DONT_ADD_TO_SECTOR 0x01
#define PROFILE_MISC_FLAG2_LEFT_COUNTRY 0x02
#define PROFILE_MISC_FLAG2_BANDAGED_TODAY 0x04
#define PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE 0x08
#define PROFILE_MISC_FLAG2_NEEDS_TO_SAY_HOSTILE_QUOTE 0x10
#define PROFILE_MISC_FLAG2_MARRIED_TO_HICKS 0x20
#define PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE 0x08
#define PROFILE_MISC_FLAG2_NEEDS_TO_SAY_HOSTILE_QUOTE 0x10
#define PROFILE_MISC_FLAG2_MARRIED_TO_HICKS 0x20
#define PROFILE_MISC_FLAG2_ASKED_BY_HICKS 0x40
//JMich_MMG: Flag to see if gearkit cost is still unpaid for
#define PROFILE_MISC_FLAG2_MERC_GEARKIT_UNPAID 0x80
#define PROFILE_MISC_FLAG2_MERC_GEARKIT_UNPAID 0x80
#define PROFILE_MISC_FLAG3_PLAYER_LEFT_MSG_FOR_MERC_AT_AIM 0x01 // In the aimscreen, the merc was away and the player left a message
#define PROFILE_MISC_FLAG3_PERMANENT_INSERTION_CODE 0x02
#define PROFILE_MISC_FLAG3_PLAYER_HAD_CHANCE_TO_HIRE 0x04 // player's had a chance to hire this merc
#define PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL 0x08
#define PROFILE_MISC_FLAG3_PERMANENT_INSERTION_CODE 0x02
#define PROFILE_MISC_FLAG3_PLAYER_HAD_CHANCE_TO_HIRE 0x04 // player's had a chance to hire this merc
#define PROFILE_MISC_FLAG3_HANDLE_DONE_TRAVERSAL 0x08
#define PROFILE_MISC_FLAG3_NPC_PISSED_OFF 0x10
#define PROFILE_MISC_FLAG3_NPC_PISSED_OFF 0x10
#define PROFILE_MISC_FLAG3_MERC_MERC_IS_DEAD_AND_QUOTE_SAID 0x20 // In the merc site, the merc has died and Speck quote for the dead merc has been said
#define PROFILE_MISC_FLAG3_TOWN_DOESNT_CARE_ABOUT_DEATH 0x40
#define PROFILE_MISC_FLAG3_GOODGUY 0x80
#define PROFILE_MISC_FLAG3_TOWN_DOESNT_CARE_ABOUT_DEATH 0x40
#define PROFILE_MISC_FLAG3_GOODGUY 0x80
//
// The following variables are used with the 'bMercStatus' variable
//
+3
View File
@@ -9008,6 +9008,9 @@ STR16 szBackgroundText_Flags[]=
L" male only", //L" male only", won't show up, text exists for compatibility reasons
L"如果我们死了所有城镇都会受到巨大的忠诚惩罚\n", //L" huge loyality penalty in all towns if we die\n",
L" refuses to attack animals\n", // TODO.Translate
L" refuses to attack members of the same group\n", // TODO.Translate
};
STR16 szBackgroundText_Value[]=
+3
View File
@@ -9026,6 +9026,9 @@ STR16 szBackgroundText_Flags[]=
L" male only", // won't show up, text exists for compatibility reasons
L" huge loyality penalty in all towns if we die\n", // TODO.Translate
L" refuses to attack animals\n", // TODO.Translate
L" refuses to attack members of the same group\n", // TODO.Translate
};
// TODO.Translate
+4 -1
View File
@@ -9008,6 +9008,9 @@ STR16 szBackgroundText_Flags[]=
L" male only", // won't show up, text exists for compatibility reasons
L" huge loyality penalty in all towns if we die\n",
L" refuses to attack animals\n",
L" refuses to attack members of the same group\n",
};
STR16 szBackgroundText_Value[]=
@@ -9096,7 +9099,7 @@ STR16 szBackgroundText_Value[]=
L" %s%d%% building speed\n",
L" hacking skill: %s%d ",
L" %s%d%% burial speed\n",
L" %s%d%% administration effectiveness\n",
L" %s%d%% administration effectiveness\n",
};
STR16 szBackgroundTitleText[] =
+3
View File
@@ -9008,6 +9008,9 @@ STR16 szBackgroundText_Flags[]=
L" homme seulement", // won't show up, text exists for compatibility reasons
L" huge loyality penalty in all towns if we die\n", // TODO.Translate
L" refuses to attack animals\n", // TODO.Translate
L" refuses to attack members of the same group\n", // TODO.Translate
};
+3
View File
@@ -8838,6 +8838,9 @@ STR16 szBackgroundText_Flags[]=
L" male only", // won't show up, text exists for compatibility reasons
L" huge loyality penalty in all towns if we die\n", // TODO.Translate
L" refuses to attack animals\n", // TODO.Translate
L" refuses to attack members of the same group\n", // TODO.Translate
};
// TODO.Translate
+3
View File
@@ -9017,6 +9017,9 @@ STR16 szBackgroundText_Flags[]=
L" male only", // won't show up, text exists for compatibility reasons
L" huge loyality penalty in all towns if we die\n", // TODO.Translate
L" refuses to attack animals\n", // TODO.Translate
L" refuses to attack members of the same group\n", // TODO.Translate
};
// TODO.Translate
+3
View File
@@ -9030,6 +9030,9 @@ STR16 szBackgroundText_Flags[]=
L" male only", // won't show up, text exists for compatibility reasons
L" huge loyality penalty in all towns if we die\n", // TODO.Translate
L" refuses to attack animals\n", // TODO.Translate
L" refuses to attack members of the same group\n", // TODO.Translate
};
// TODO.Translate
+4 -1
View File
@@ -9007,7 +9007,10 @@ STR16 szBackgroundText_Flags[]=
L" только женский", // won't show up, text exists for compatibility reasons
L" только мужской", // won't show up, text exists for compatibility reasons
L" значительный штраф к лояльности во всех городах, если мы умрём\n",
L" значительный штраф к лояльности во всех городах, если умирает\n",
L" отказывается атаковать животных\n",
L" отказывается атаковать тех, кто состоит в той же группе\n",
};
STR16 szBackgroundText_Value[]=