mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
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:
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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--;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
//
|
||||
|
||||
@@ -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[]=
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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[] =
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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[]=
|
||||
|
||||
Reference in New Issue
Block a user