diff --git a/Laptop/IMP Background.cpp b/Laptop/IMP Background.cpp index e49dfcaf6..d32184ac7 100644 --- a/Laptop/IMP Background.cpp +++ b/Laptop/IMP Background.cpp @@ -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 ); diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index 9600645d1..884645e67 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -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 > GetTileSetIndexVector( INT16 aKey ) { std::vector > vec; - if ( 0 <= aKey && aKey <= STRUCTURE_CONSTRUCT_MAX ) + if ( 0 <= aKey && aKey < STRUCTURE_CONSTRUCT_MAX ) { std::set indexset; diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index a356e0943..9bf3b2934 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -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 diff --git a/Tactical/XML_Background.cpp b/Tactical/XML_Background.cpp index c2f5c1888..43159dd79 100644 --- a/Tactical/XML_Background.cpp +++ b/Tactical/XML_Background.cpp @@ -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--; } diff --git a/Tactical/soldier profile type.h b/Tactical/soldier profile type.h index 05a60ddb3..410acc945 100644 --- a/Tactical/soldier profile type.h +++ b/Tactical/soldier profile type.h @@ -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 // diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index fddde733d..647703819 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -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[]= diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 776f0fcca..f020002dd 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -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 diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 40d90f229..3882526e6 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -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[] = diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index e9adc24c1..0e0ca3541 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -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 }; diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 8789a0f1a..d43d16656 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -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 diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 4a968dba6..7f8dfde4c 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -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 diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 90f02010d..9fcade655 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -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 diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 26b9e75af..c49a148a8 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -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[]=