- reworked the tripwire nework flags. This will allow much more complex networks in the future. WARNING: planted tripwires in savegames from previous savegames will behave strangely with this version.

- externalised texts for cleaning, food, corpse handling and covert ops
- tripwire can now be defused even if it does not have a blue flag. When having a wirecutter in the main hand, click on the planted tripwire while crouched, the defuse dialogue will show up.
- corpses spawned from items will behave according to the zombie spawn rules
- fixed a few glitches with the covert ops trait
- fixed a bug that gave the 'mounted' bonus on a roof

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5546 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2012-09-02 20:38:17 +00:00
parent da441439ac
commit 41bc80dc3c
25 changed files with 1028 additions and 170 deletions
+1 -1
View File
@@ -3073,7 +3073,7 @@ void recievePLANTEXPLOSIVE (RPCParameters *rpcParameters)
(*pObj)[0]->data.misc.bDelay = exp->bDelayFreq;
(*pObj)[0]->data.ubDirection = DIRECTION_IRRELEVANT;
(*pObj)[0]->data.ubWireNetworkFlag = ENEMY_NET_1_LVL_1;
(*pObj)[0]->data.ubWireNetworkFlag = (TRIPWIRE_NETWORK_OWNER_ENEMY|TRIPWIRE_NETWORK_NET_1|TRIPWIRE_NETWORK_LVL_1);
(*pObj)[0]->data.bDefuseFrequency = 0;
// save old clients WorldID if we can
+29 -25
View File
@@ -1129,15 +1129,19 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE
// determine this tripwire's flag
UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag;
// correct network?
if ( (ubWireNetworkFlag & ( PLAYER_NET_1_LVL_1 | PLAYER_NET_1_LVL_2 | PLAYER_NET_1_LVL_3 | PLAYER_NET_1_LVL_4 ) ) != 0 )
bMines = MINES_NET_1;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_2_LVL_1 | PLAYER_NET_2_LVL_2 | PLAYER_NET_2_LVL_3 | PLAYER_NET_2_LVL_4 ) ) != 0 )
bMines = MINES_NET_2;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_3_LVL_1 | PLAYER_NET_3_LVL_2 | PLAYER_NET_3_LVL_3 | PLAYER_NET_3_LVL_4 ) ) != 0 )
bMines = MINES_NET_3;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_4_LVL_1 | PLAYER_NET_4_LVL_2 | PLAYER_NET_4_LVL_3 | PLAYER_NET_4_LVL_4 ) ) != 0 )
bMines = MINES_NET_4;
// only if its one of our networks
if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 )
{
// correct network?
if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_1 ) != 0 )
bMines = MINES_NET_1;
else if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_2 ) != 0 )
bMines = MINES_NET_2;
else if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_3 ) != 0 )
bMines = MINES_NET_3;
else if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_4 ) != 0 )
bMines = MINES_NET_4;
}
}
}
break;
@@ -1151,15 +1155,15 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE
UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag;
// correct network?
if ( (ubWireNetworkFlag & ( PLAYER_NET_1_LVL_1 | PLAYER_NET_1_LVL_2 | PLAYER_NET_1_LVL_3 | PLAYER_NET_1_LVL_4 ) ) != 0 )
if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_1 ) != 0 )
{
bMines = MINES_LVL_1;
if ( (ubWireNetworkFlag & ( PLAYER_NET_1_LVL_2 ) ) != 0 )
if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 )
bMines = MINES_LVL_2;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_1_LVL_3 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 )
bMines = MINES_LVL_3;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_1_LVL_4 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 )
bMines = MINES_LVL_4;
}
}
@@ -1175,15 +1179,15 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE
UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag;
// correct network?
if ( (ubWireNetworkFlag & ( PLAYER_NET_2_LVL_1 | PLAYER_NET_2_LVL_2 | PLAYER_NET_2_LVL_3 | PLAYER_NET_2_LVL_4 ) ) != 0 )
if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_2 ) != 0 )
{
bMines = MINES_LVL_1;
if ( (ubWireNetworkFlag & ( PLAYER_NET_2_LVL_2 ) ) != 0 )
if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 )
bMines = MINES_LVL_2;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_2_LVL_3 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 )
bMines = MINES_LVL_3;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_2_LVL_4 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 )
bMines = MINES_LVL_4;
}
}
@@ -1199,15 +1203,15 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE
UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag;
// correct network?
if ( (ubWireNetworkFlag & ( PLAYER_NET_3_LVL_1 | PLAYER_NET_3_LVL_2 | PLAYER_NET_3_LVL_3 | PLAYER_NET_3_LVL_4 ) ) != 0 )
if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_3 ) != 0 )
{
bMines = MINES_LVL_1;
if ( (ubWireNetworkFlag & ( PLAYER_NET_3_LVL_2 ) ) != 0 )
if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 )
bMines = MINES_LVL_2;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_3_LVL_3 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 )
bMines = MINES_LVL_3;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_3_LVL_4 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 )
bMines = MINES_LVL_4;
}
}
@@ -1223,15 +1227,15 @@ void DetermineMineDisplayInTile( INT32 sGridNo, INT8 bLevel, INT8& bMines, BOOLE
UINT32 ubWireNetworkFlag = (*pObj)[0]->data.ubWireNetworkFlag;
// correct network?
if ( (ubWireNetworkFlag & ( PLAYER_NET_4_LVL_1 | PLAYER_NET_4_LVL_2 | PLAYER_NET_4_LVL_3 | PLAYER_NET_4_LVL_4 ) ) != 0 )
if ( (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER ) != 0 && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_4 ) != 0 )
{
bMines = MINES_LVL_1;
if ( (ubWireNetworkFlag & ( PLAYER_NET_4_LVL_2 ) ) != 0 )
if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_2 ) ) != 0 )
bMines = MINES_LVL_2;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_4_LVL_3 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_3 ) ) != 0 )
bMines = MINES_LVL_3;
else if ( (ubWireNetworkFlag & ( PLAYER_NET_4_LVL_4 ) ) != 0 )
else if ( (ubWireNetworkFlag & ( TRIPWIRE_NETWORK_LVL_4 ) ) != 0 )
bMines = MINES_LVL_4;
}
}
+13 -13
View File
@@ -116,9 +116,9 @@ BOOLEAN ApplyFood( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObject, BOOLEAN fForce, B
// notification
if ( type == AP_EAT )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s does not want to eat %s", pSoldier->name, Item[pObject->usItem].szItemName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_DONOTWANT_EAT], pSoldier->name, Item[pObject->usItem].szItemName );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s does not want to drink %s", pSoldier->name, Item[pObject->usItem].szItemName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_DONOTWANT_DRINK], pSoldier->name, Item[pObject->usItem].szItemName );
// Say quote!
TacticalCharacterDialogue( pSoldier, 61 );
@@ -192,9 +192,9 @@ BOOLEAN ApplyFood( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObject, BOOLEAN fForce, B
// notification
if ( type == AP_EAT )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s ate %s", pSoldier->name, Item[pObject->usItem].szItemName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_ATE], pSoldier->name, Item[pObject->usItem].szItemName );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s drank %s", pSoldier->name, Item[pObject->usItem].szItemName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_DRANK], pSoldier->name, Item[pObject->usItem].szItemName );
// now remove a portion of the food item (or the whole item altogether)
UINT16 ptsconsumed = UseKitPoints( pObject, Food[foodtype].ubPortionSize, pSoldier );
@@ -367,9 +367,9 @@ void HourlyFoodSituationUpdate( SOLDIERTYPE *pSoldier )
pSoldier->usValueGoneUp &= ~( STRENGTH_INCREASE );
if ( foodsituation < FOOD_NORMAL )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's strength was damaged due to being overfed!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_STR_DAMAGE_FOOD_TOO_MUCH], pSoldier->name );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's strength was damaged due to lack of nutrition!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_STR_DAMAGE_FOOD_TOO_LESS], pSoldier->name );
}
// damage health
@@ -398,9 +398,9 @@ void HourlyFoodSituationUpdate( SOLDIERTYPE *pSoldier )
gMercProfiles[ pSoldier->ubProfile ].records.usTimesStatDamaged++;
if ( foodsituation < FOOD_NORMAL )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's health was damaged due to being overfed!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_HEALTH_DAMAGE_FOOD_TOO_MUCH], pSoldier->name );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's health was damaged due to lack of nutrition!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_HEALTH_DAMAGE_FOOD_TOO_LESS], pSoldier->name );
// if we fall below OKLIFE, we start bleeding...
// Reason for this is that
@@ -451,9 +451,9 @@ void HourlyFoodSituationUpdate( SOLDIERTYPE *pSoldier )
pSoldier->usValueGoneUp &= ~( STRENGTH_INCREASE );
if ( watersituation < FOOD_NORMAL )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's strength was damaged due to excessive drinking!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_STR_DAMAGE_DRINK_TOO_MUCH], pSoldier->name );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's strength was damaged due to lack of water!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_STR_DAMAGE_DRINK_TOO_LESS], pSoldier->name );
}
// damage health
@@ -484,9 +484,9 @@ void HourlyFoodSituationUpdate( SOLDIERTYPE *pSoldier )
gMercProfiles[ pSoldier->ubProfile ].records.usTimesStatDamaged++;
if ( watersituation < FOOD_NORMAL )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's health was damaged due to excessive drinking!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_HEALTH_DAMAGE_DRINK_TOO_MUCH], pSoldier->name );
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s's health was damaged due to lack of water!", pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_HEALTH_DAMAGE_DRINK_TOO_LESS], pSoldier->name );
// if we fall below OKLIFE, we start bleeding...
// Reason for this is that
@@ -733,7 +733,7 @@ void SectorFillCanteens( void )
{
if ( !gGameOptions.fFoodSystem )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"SectorFillCanteen not possible, Food System is off!" );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szFoodTextStr[STR_FOOD_ERROR_NO_FOOD_SYSTEM] );
return;
}
+19 -2
View File
@@ -902,7 +902,12 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
}
else
{
pSoldier->EVENT_SoldierBeginCutFence( sAdjustedGridNo, ubDirection );
// Flugente: if we are trying to defuse a tripwire, call EVENT_SoldierDefuseTripwire() instead
INT32 tripwirefound = FindWorldItemForTripwireInGridNo( sGridNo, pSoldier->pathing.bLevel, TRUE );
if ( tripwirefound != -1 )
pSoldier->EVENT_SoldierDefuseTripwire( sGridNo, tripwirefound );
else
pSoldier->EVENT_SoldierBeginCutFence( sAdjustedGridNo, ubDirection );
}
@@ -1611,7 +1616,7 @@ void HandleSoldierDropBomb( SOLDIERTYPE *pSoldier, INT32 sGridNo )
pSoldier->inv[ HANDPOS ][0]->data.ubDirection = pSoldier->ubDirection;
// no frequency known... give a default value, so we don't defuse it by accident
gTempObject[0]->data.ubWireNetworkFlag = ENEMY_NET_1_LVL_1;
gTempObject[0]->data.ubWireNetworkFlag = (TRIPWIRE_NETWORK_OWNER_ENEMY|TRIPWIRE_NETWORK_NET_1|TRIPWIRE_NETWORK_LVL_1);
gTempObject[0]->data.bDefuseFrequency = 0;
// we now know there is something nasty here
@@ -1655,6 +1660,18 @@ void HandleSoldierUseCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
StartCorpseMessageBox( pSoldier, sGridNo, bLevel );
}
void HandleSoldierDefuseTripwire( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT32 sItem )
{
gpBoobyTrapItemPool = GetItemPoolForIndex( sGridNo, sItem, pSoldier->pathing.bLevel );
gpBoobyTrapSoldier = pSoldier;
gsBoobyTrapGridNo = sGridNo;
gbBoobyTrapLevel = pSoldier->pathing.bLevel;
gfDisarmingBuriedBomb = FALSE;
gbTrapDifficulty = (gWorldItems[ sItem ].object)[0]->data.bTrap;
DoMessageBox( MSG_BOX_BASIC_STYLE, TacticalStr[ DISARM_BOOBYTRAP_PROMPT ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, BoobyTrapMessageBoxCallBack, NULL );
}
void SoldierHandleDropItem( SOLDIERTYPE *pSoldier )
{
// LOOK IN PANDING DATA FOR ITEM TO DROP, AND LOCATION
+1
View File
@@ -136,6 +136,7 @@ void HandleSoldierUseRemote( SOLDIERTYPE *pSoldier, INT32 sGridNo );
void HandleTacticalFunctionSelection( SOLDIERTYPE *pSoldier, INT32 sGridNo ); // Flugente: in tactical, open a selection box for different actions
void HandleSoldierUseCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); // Flugente: handle corpses
void HandleSoldierDefuseTripwire( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT32 sItem ); // Flugente: defuse tripwire
BOOLEAN ItemPoolOKForDisplay( ITEM_POOL *pItemPool, INT8 bZLevel );
INT16 GetNumOkForDisplayItemsInPool( ITEM_POOL *pItemPool, INT8 bZLevel );
+5
View File
@@ -4408,6 +4408,11 @@ BOOLEAN UIMouseOnValidAttackLocation( SOLDIERTYPE *pSoldier )
{
return( TRUE );
}
// Flugente: if there is tripwire here that we know of, allow handling
else if ( FindWorldItemForTripwireInGridNo( usMapPos, pSoldier->pathing.bLevel, TRUE ) != -1 )
{
return( TRUE );
}
else
{
return( FALSE );
+1 -1
View File
@@ -1317,7 +1317,7 @@ OBJECTTYPE& OBJECTTYPE::operator=(const OLD_OBJECTTYPE_101& src)
(*this)[0]->data.misc.bActionValue = src.ugYucky.bActionValue;
(*this)[0]->data.misc.ubTolerance = src.ugYucky.ubTolerance; // includes ubLocationID
(*this)[0]->data.ubDirection = DIRECTION_IRRELEVANT;
(*this)[0]->data.ubWireNetworkFlag = ENEMY_NET_1_LVL_1;
(*this)[0]->data.ubWireNetworkFlag = (TRIPWIRE_NETWORK_OWNER_ENEMY|TRIPWIRE_NETWORK_NET_1|TRIPWIRE_NETWORK_LVL_1);
(*this)[0]->data.bDefuseFrequency = 0;
break;
default:
+30 -24
View File
@@ -675,45 +675,51 @@ extern OBJECTTYPE gTempObject;
// -------- added by Flugente: flags for tripwire networks --------
// the numbering of these flags is important. DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!!
#define ENEMY_NET_1_LVL_1 0x00000001 //1
#define ENEMY_NET_2_LVL_1 0x00000002 //2
#define ENEMY_NET_3_LVL_1 0x00000004 //4
#define ENEMY_NET_4_LVL_1 0x00000008 //8
// these flags were revised on 2012-9-2
// it is theoretically possible to have much more than the currently existing 4 networks, and to have many more hierarchy levels
// however, at the moment, there is no need for that
#define TRIPWIRE_NETWORK_OWNER_ENEMY 0x00000001 //1 // this wire belongs to an enemy network
#define TRIPWIRE_NETWORK_OWNER_PLAYER 0x00000002 //2 // this wire was set by the player
//#define TRIPWIRE_NETWORK_OWNER_PLAYER 0x00000004 //4 // unused, might one day be used in multiplayer or with several factions
//#define TRIPWIRE_NETWORK_OWNER_PLAYER 0x00000008 //8 // unused, might one day be used in multiplayer or with several factions
#define ENEMY_NET_1_LVL_2 0x00000010 //16
#define ENEMY_NET_2_LVL_2 0x00000020 //32
#define ENEMY_NET_3_LVL_2 0x00000040 //64
#define ENEMY_NET_4_LVL_2 0x00000080 //128
#define TRIPWIRE_NETWORK_NET_1 0x00000010 //16 // network number of the wire
#define TRIPWIRE_NETWORK_NET_2 0x00000020 //32
#define TRIPWIRE_NETWORK_NET_3 0x00000040 //64
#define TRIPWIRE_NETWORK_NET_4 0x00000080 //128
#define ENEMY_NET_1_LVL_3 0x00000100 //256
/*#define ENEMY_NET_1_LVL_3 0x00000100 //256
#define ENEMY_NET_2_LVL_3 0x00000200 //512
#define ENEMY_NET_3_LVL_3 0x00000400 //1024
#define ENEMY_NET_4_LVL_3 0x00000800 //2048
#define ENEMY_NET_1_LVL_4 0x00001000 //4096
#define ENEMY_NET_2_LVL_4 0x00002000 //8192
#define ENEMY_NET_3_LVL_4 0x00004000 //16384
#define ENEMY_NET_4_LVL_4 0x00008000 //32768
#define TRIPWIRE_NETWORK_LVL_1 0x00001000 //4096 // hierarchy level of the wire
#define TRIPWIRE_NETWORK_LVL_2 0x00002000 //8192
#define TRIPWIRE_NETWORK_LVL_3 0x00004000 //16384
#define TRIPWIRE_NETWORK_LVL_4 0x00008000 //32768
#define PLAYER_NET_1_LVL_1 0x00010000 //65536
#define PLAYER_NET_2_LVL_1 0x00020000 //131072
#define PLAYER_NET_3_LVL_1 0x00040000 //262144
#define PLAYER_NET_4_LVL_1 0x00080000 //524288
#define PLAYER_NET_4_LVL_1 0x00080000 //524288*/
#define PLAYER_NET_1_LVL_2 0x00100000 //1048576
#define PLAYER_NET_2_LVL_2 0x00200000 //2097152
#define PLAYER_NET_3_LVL_2 0x00400000 //4194304
#define PLAYER_NET_4_LVL_2 0x00800000 //8388608
// WARNING! It is important that the flags with the highest numbers are the hierarchy flags!
// This allows for a very simple check on wether a wire gets called
// keep this in mind when adding additional flags!
#define TRIPWIRE_NETWORK_LVL_1 0x00100000 //1048576 // hierarchy level of the wire
#define TRIPWIRE_NETWORK_LVL_2 0x00200000 //2097152
#define TRIPWIRE_NETWORK_LVL_3 0x00400000 //4194304
#define TRIPWIRE_NETWORK_LVL_4 0x00800000 //8388608
#define PLAYER_NET_1_LVL_3 0x01000000 //16777216
#define PLAYER_NET_2_LVL_3 0x02000000 //33554432
#define PLAYER_NET_3_LVL_3 0x04000000 //67108864
#define PLAYER_NET_4_LVL_3 0x08000000 //134217728
/*#define TRIPWIRE_NETWORK_LVL_1 0x01000000 //16777216
#define TRIPWIRE_NETWORK_LVL_2 0x02000000 //33554432
#define TRIPWIRE_NETWORK_LVL_3 0x04000000 //67108864
#define TRIPWIRE_NETWORK_LVL_4 0x08000000 //134217728
#define PLAYER_NET_1_LVL_4 0x10000000 //268435456
#define PLAYER_NET_2_LVL_4 0x20000000 //536870912
#define PLAYER_NET_3_LVL_4 0x40000000 //1073741824
#define PLAYER_NET_4_LVL_4 0x80000000 //2147483648
#define PLAYER_NET_4_LVL_4 0x80000000 //2147483648*/
// ----------------------------------------------------------------
// -------- added by Flugente: various item flags --------
@@ -772,7 +778,7 @@ extern OBJECTTYPE gTempObject;
#define CORPSE_HAIR_WHITE 0x00000040 //64
#define CORPSE_HAIR_BLOND 0x00000080 //128
#define CORPSE_HAIR_RED 0x00000100 //256
#define CORPSE_NO_ZOMBIE_RISE 0x00000100 //256 // no zombie can rise from this corpse
#define CORPSE_SKIN_PINK 0x00000200 //512
#define CORPSE_SKIN_TAN 0x00000400 //1024
#define CORPSE_SKIN_DARK 0x00000800 //2048
+24 -4
View File
@@ -7843,12 +7843,32 @@ BOOLEAN ArmBomb( OBJECTTYPE * pObj, INT8 bSetting )
UINT32 ubWireNetworkFlag = 0;
if ( Item[pObj->usItem].tripwire == 1 && bSetting > 0 && bSetting < 17 ) // checks for safety
{
// we are placing it, so it's ours
ubWireNetworkFlag |= TRIPWIRE_NETWORK_OWNER_PLAYER;
// the bSetting consists of the network number + 4 * (network hierarchy - 1)
INT8 netnr = bSetting % 4;
INT8 hierarchytimesfour = bSetting - netnr;
// account for placement by the enemy
INT8 editoradj = 16;
//if ( editor ) editoradj = 0; or something like that
ubWireNetworkFlag = 1 << (editoradj - 1 + bSetting);
if ( 1 == netnr )
ubWireNetworkFlag |= TRIPWIRE_NETWORK_NET_1;
else if ( 2 == netnr )
ubWireNetworkFlag |= TRIPWIRE_NETWORK_NET_2;
else if ( 3 == netnr )
ubWireNetworkFlag |= TRIPWIRE_NETWORK_NET_3;
else
ubWireNetworkFlag |= TRIPWIRE_NETWORK_NET_4;
if ( 0 == hierarchytimesfour )
ubWireNetworkFlag |= TRIPWIRE_NETWORK_LVL_1;
else if ( 1 == hierarchytimesfour )
ubWireNetworkFlag |= TRIPWIRE_NETWORK_LVL_2;
else if ( 2 == hierarchytimesfour )
ubWireNetworkFlag |= TRIPWIRE_NETWORK_LVL_3;
else
ubWireNetworkFlag |= TRIPWIRE_NETWORK_LVL_4;
// TOOD: once tripwire can be placed in the editor, this has to be altered
}
if (fDefuse) // TODO: doesn't work this way if both a detonator and a remote defuse is attached...
+31 -7
View File
@@ -1896,7 +1896,11 @@ void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
// All teams lok for this...
NotifySoldiersToLookforItems( );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_HEAD_ITEM] );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_DECAPITATION] );
}
// Flugente: can this corpse be gutted?
@@ -1945,9 +1949,11 @@ void GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
// All teams lok for this...
NotifySoldiersToLookforItems( );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_MEAT_ITEM] );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Not possible, you sick, sick individual!" );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_GUTTING] );
}
// Flugente: can clothes be taken off of this corpse?
@@ -1969,7 +1975,7 @@ void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
{
ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel );
if ( pCorpse == NULL )
if ( pCorpse == NULL || !pSoldier )
return;
// can this thing be stripped?
@@ -1981,9 +1987,11 @@ void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
// we took the clothes, mark this
pCorpse->def.usFlags |= ROTTING_CORPSE_CLOTHES_TAKEN;
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_STRIPPING_POSSIBLE], pSoldier->name );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"No clothes to take!" );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_CLOTHESFOUND] );
}
// Flugente: can clothes be taken off of this corpse?
@@ -2000,7 +2008,7 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
{
ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel );
if ( pCorpse == NULL )
if ( pCorpse == NULL || !pSoldier )
return;
// can this corpse be picked up?
@@ -2029,6 +2037,11 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
if ( pCorpse->def.usFlags & ROTTING_CORPSE_CLOTHES_TAKEN )
gTempObject[0]->data.sObjectFlag |= CORPSE_STRIPPED;
#ifdef ENABLE_ZOMBIES
if ( pCorpse->def.usFlags & ROTTING_CORPSE_NEVER_RISE_AGAIN )
gTempObject[0]->data.sObjectFlag |= CORPSE_NO_ZOMBIE_RISE;
#endif
// now we have to get the correct flags for the object from the corpse, so that upon recreating the corpse, it looks the same
UINT8 headpal = 0, skinpal = 0, vestpal = 0, pantspal = 0;
@@ -2053,7 +2066,7 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
break;
case 4:
default:
gTempObject[0]->data.sObjectFlag |= CORPSE_HAIR_RED;
// the default value (which is also used for red hair) is nothing. Upon spawning a corpse from an item, we assume that it has red hair if none of the above flags is found
break;
}
@@ -2145,12 +2158,16 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
}
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"No free hand to carry corpse!" );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_FREEHAND] );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_CORPSE_ITEM] );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_TAKING] );
}
// Flugente: create a corpse from an object and plce it in the world
// Flugente: create a corpse from an object and place it in the world
BOOLEAN AddCorpseFromObject(OBJECTTYPE* pObj, INT32 sGridNo, INT8 bLevel )
{
if ( !pObj || !HasItemFlag(pObj->usItem, CORPSE) )
@@ -2291,8 +2308,15 @@ BOOLEAN AddCorpseFromObject(OBJECTTYPE* pObj, INT32 sGridNo, INT8 bLevel )
else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BLACK && (*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_BLACK )
gRottingCorpse[ iCorpseID ].def.usFlags |= ROTTING_CORPSE_FROM_ELITE;
#ifdef ENABLE_ZOMBIES
if ( (*pObj)[0]->data.sObjectFlag & CORPSE_NO_ZOMBIE_RISE )
gRottingCorpse[ iCorpseID ].def.usFlags |= ROTTING_CORPSE_NEVER_RISE_AGAIN;
#endif
return TRUE;
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_INVALID_CORPSE_ID] );
return FALSE;
}
+175 -79
View File
@@ -12058,7 +12058,7 @@ void SOLDIERTYPE::EVENT_SoldierBeginKnifeThrowAttack( INT32 sGridNo, UINT8 ubDir
}
void SOLDIERTYPE::EVENT_SoldierBeginDropBomb( void )
void SOLDIERTYPE::EVENT_SoldierBeginDropBomb( )
{
// Increment the number of people busy doing stuff because of an attack
switch( gAnimControl[ this->usAnimState ].ubHeight )
@@ -12078,6 +12078,29 @@ void SOLDIERTYPE::EVENT_SoldierBeginDropBomb( void )
}
void SOLDIERTYPE::EVENT_SoldierDefuseTripwire( INT32 sGridNo, INT32 sItem )
{
// Flugente: if item is tripwireactivated and is a planted bomb, call the defuse dialogue. We obviously know about the item's existence already...
if ( gWorldItems[ sItem ].object.exists() && gWorldItems[ sItem ].object.fFlags & OBJECT_ARMED_BOMB && Item[gWorldItems[ sItem ].object.usItem].tripwire == 1 )
{
// Increment the number of people busy doing stuff because of an attack
switch( gAnimControl[ this->usAnimState ].ubHeight )
{
case ANIM_STAND:
this->EVENT_InitNewSoldierAnim( CROUCHING, 0 , FALSE );
break;
default:
// Call handler for planting bomb...
HandleSoldierDefuseTripwire(this, sGridNo, sItem );
this->SoldierGotoStationaryStance( );
break;
}
}
}
void SOLDIERTYPE::EVENT_SoldierBeginUseDetonator( void )
{
@@ -13694,10 +13717,9 @@ BOOLEAN SOLDIERTYPE::IsWeaponMounted( void )
if ( gAnimControl[ this->usAnimState ].ubEndHeight == ANIM_PRONE )
return( FALSE );
BOOLEAN onroof = FALSE;
// not possible to get this bonus on a roof, as there are no objects on the roof on which we could rest our gun
if ( this->pathing.bLevel == 1 )
onroof = TRUE;
return( FALSE );
// we determine the height of the next tile in our direction. Because of the way structures are handled, we sometimes have to take the very tile we're occupying right now
INT32 nextGridNoinSight = this->sGridNo;
@@ -13719,9 +13741,9 @@ BOOLEAN SOLDIERTYPE::IsWeaponMounted( void )
if (!pStructure)
{
// for some reason I find EXTREMELY FRUSTRATING, we might get a heigth of 2 on a totally empty tile... so we check if we could occupy the tile
if ( !IsLocationSittable( nextGridNoinSight, onroof ) )
if ( !IsLocationSittable( nextGridNoinSight, 0 ) )
// resting our gun on people would be rude - only allow if nobody is there
if( WhoIsThere2( nextGridNoinSight, onroof ) == NOBODY )
if( WhoIsThere2( nextGridNoinSight, 0 ) == NOBODY )
applybipod = TRUE;
}
}
@@ -13764,9 +13786,9 @@ BOOLEAN SOLDIERTYPE::IsWeaponMounted( void )
if (!pStructure)
{
// for some reason I find EXTREMELY FRUSTRATING, we might get a heigth of 2 on a totally empty tile... so we check if we could occupy the tile
if ( !IsLocationSittable( nextGridNoinSight, onroof ) )
if ( !IsLocationSittable( nextGridNoinSight, 0 ) )
// resting our gun on people would be rude - only allow if nobody is there
if( WhoIsThere2( nextGridNoinSight, onroof ) == NOBODY )
if( WhoIsThere2( nextGridNoinSight, 0 ) == NOBODY )
applybipod = TRUE;
}
}
@@ -14006,7 +14028,7 @@ void SOLDIERTYPE::InventoryExplosion( void )
INT16 status = (*pObj)[0]->data.objectStatus;
(*pObj)[0]->data.objectStatus = max(1, (INT16)(status/2));
// for every objects, we also have to check wether there are weapon attachments (eg. underbarrel grenade launchers), and cool them down too
// also damage every attachment
attachmentList::iterator iterend = (*pObj)[i]->attachments.end();
for (attachmentList::iterator iter = (*pObj)[i]->attachments.begin(); iter != iterend; ++iter)
{
@@ -14070,12 +14092,10 @@ BOOLEAN SOLDIERTYPE::IsFeedingExternal(UINT8* pubId1, UINT16* pGunSlot1, UINT16
UINT16 usGunItem = 0;
UINT8 usGunCalibre = 0;
//UINT16 usGunMagSize = 0;
UINT8 usGunAmmoType = 0;
UINT16 usAmmoItem = 0;
UINT8 usAmmoCalibre = 0;
//UINT16 usAmmoMagSize = 0;
UINT8 usAmmoAmmoType = 0;
UINT16 usMagIndex = 0;
@@ -14102,7 +14122,6 @@ BOOLEAN SOLDIERTYPE::IsFeedingExternal(UINT8* pubId1, UINT16* pGunSlot1, UINT16
usMagIndex = Item[usAmmoItem].ubClassIndex;
usAmmoCalibre = Magazine[usMagIndex].ubCalibre;
//usAmmoMagSize = Magazine[usMagIndex].ubMagSize;
usAmmoAmmoType = Magazine[usMagIndex].ubAmmoType;
// our current stance is important
@@ -14191,11 +14210,10 @@ BOOLEAN SOLDIERTYPE::IsFeedingExternal(UINT8* pubId1, UINT16* pGunSlot1, UINT16
OBJECTTYPE* pObjInHands = &(pTeamSoldier->inv[teamsoldierinvpos]);
if ( pObjInHands && pObjInHands->exists() && Item [ pObjInHands->usItem ].usItemClass == IC_GUN && (HasItemFlag( pObjInHands->usItem, BELT_FED ) || HasAttachmentOfClass(pObjInHands, AC_FEEDER) ) && (*pObjInHands)[0]->data.gun.ubGunShotsLeft > 0 )
{
// remember the caliber, magsize (TODO: really?) and type of ammo. They all have to fit
// remember the caliber and type of ammo. They all have to fit
usGunItem = pObjInHands->usItem;
usGunCalibre = Weapon[usGunItem].ubCalibre;
//usGunMagSize = Weapon[usGunItem].ubMagSize;
usGunAmmoType = (*pObjInHands)[0]->data.gun.ubGunAmmoType;
if ( usGunCalibre == usAmmoCalibre && /*usGunMagSize == usAmmoMagSize &&*/ usGunAmmoType == usAmmoAmmoType )
@@ -14267,9 +14285,8 @@ BOOLEAN SOLDIERTYPE::IsFeedingExternal(UINT8* pubId1, UINT16* pGunSlot1, UINT16
// can't use this, end
continue;
// remember the caliber, magsize (TODO: really?) and type of ammo. They all have to fit
// remember the caliber and type of ammo. They all have to fit
usGunCalibre = Weapon[usGunItem].ubCalibre;
//usGunMagSize = Weapon[usGunItem].ubMagSize;
usGunAmmoType = (*pObj)[0]->data.gun.ubGunAmmoType;
// now check the inventory for an ammo belt. If we are not from the player team or a robot, we will search the entire inventory
@@ -14385,7 +14402,7 @@ void SOLDIERTYPE::CleanWeapon( BOOLEAN fCleanAll )
{
(*pObj)[i]->data.bDirtLevel = 0.0f;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s cleaned %s", this->name, Item[pObj->usItem].szItemName );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, TacticalStr[WEAPON_CLEANING_STR], this->name, Item[pObj->usItem].szItemName );
// 33% chance to use up 1% of the cleaning kit
if ( Random(2) > 0 )
@@ -14423,7 +14440,10 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
{
// if we have any camo: not covert
if ( GetWornCamo(this) > 0 || GetWornUrbanCamo(this) > 0 || GetWornDesertCamo(this) > 0 || GetWornSnowCamo(this) > 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CAMOFOUND], this->name );
return FALSE;
}
if ( UsingNewInventorySystem() )
{
@@ -14434,7 +14454,10 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
{
// if we have a back pack: not covert
if ( bLoop == BPACKPOCKPOS )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_BACKPACKFOUND], this->name );
return FALSE;
}
// do not check the LBE itself (we already checked for camo above)
if ( bLoop >= VESTPOCKPOS && bLoop <= CPACKPOCKPOS )
@@ -14442,10 +14465,13 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
// seriously? a corpse? of course this is suspicious!
if ( HasItemFlag(this->inv[bLoop].usItem, CORPSE) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CARRYCORPSEFOUND], this->name );
return FALSE;
}
BOOLEAN checkfurther = FALSE;
// further checks it item is not covert. This means that a gun that has that tag will not be detectedif if its inside a pocket!
// further checks it item is not covert. This means that a gun that has that tag will not be detected if its inside a pocket!
if ( bLoop == HANDPOS || bLoop == SECONDHANDPOS || bLoop == GUNSLINGPOCKPOS || bLoop == HELMETPOS || bLoop == VESTPOS || bLoop == LEGPOS || bLoop == HEAD1POS || bLoop == HEAD2POS )
checkfurther = TRUE;
else if ( bLoop == KNIFEPOCKPOS && !HasItemFlag(this->inv[bLoop].usItem, COVERT) )
@@ -14458,6 +14484,9 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
UINT8 checkslot = 0;
switch (uiNIVSlotType[bLoop])
{
case 2:
// this is worn LBE gear itself
break;
case 3:
checkslot = VESTPOCKPOS;
break;
@@ -14471,8 +14500,11 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
checkslot = CPACKPOCKPOS;
break;
default:
return FALSE;
break;
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CARRY_BADLBE], this->name );
return FALSE;
}
break;
}
// found a slot to check for LBE
@@ -14492,7 +14524,10 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
( (Item[this->inv[bLoop].usItem].usItemClass & (IC_ARMOUR) ) && !Item[this->inv[bLoop].usItem].leatherjacket && Armour[ Item[this->inv[bLoop].usItem].ubClassIndex ].ubProtection > 10 ) ||
( Item[this->inv[bLoop].usItem].nightvisionrangebonus > 0 || Item[this->inv[bLoop].usItem].hearingrangebonus > 0 )
)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_MILITARYGEARFOUND], this->name );
return FALSE;
}
}
}
}
@@ -14511,7 +14546,10 @@ BOOLEAN SOLDIERTYPE::LooksLikeACivilian( void )
( (Item[this->inv[bLoop].usItem].usItemClass & (IC_ARMOUR) ) && !Item[this->inv[bLoop].usItem].leatherjacket && Armour[ Item[this->inv[bLoop].usItem].ubClassIndex ].ubProtection > 10 ) ||
( Item[this->inv[bLoop].usItem].nightvisionrangebonus > 0 || Item[this->inv[bLoop].usItem].hearingrangebonus > 0 )
)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_MILITARYGEARFOUND], this->name );
return FALSE;
}
}
}
}
@@ -14530,7 +14568,10 @@ BOOLEAN SOLDIERTYPE::LooksLikeASoldier( void )
{
// seriously? a corpse? of course this is suspicious!
if ( HasItemFlag(this->inv[bLoop].usItem, CORPSE) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CARRYCORPSEFOUND], this->name );
return FALSE;
}
}
}
@@ -14557,16 +14598,25 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
{
// if we have a back pack: not covert
if ( bLoop == BPACKPOCKPOS )
return FALSE;
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_BACKPACKFOUND], this->name );
return TRUE;
}
// further checks it item is not covert. This means that a gun that has that tag will not be detectedif if its inside a pocket!
if ( bLoop == HANDPOS || bLoop == SECONDHANDPOS || bLoop == GUNSLINGPOCKPOS || bLoop == HELMETPOS || bLoop == VESTPOS || bLoop == LEGPOS || bLoop == HEAD1POS || bLoop == HEAD2POS ||
!HasItemFlag(this->inv[bLoop].usItem, COVERT) )
// further checks it item is not covert. This means that an item that has that tag will not be detected if it is inside a pocket!
if ( bLoop == HANDPOS || bLoop == SECONDHANDPOS || bLoop == GUNSLINGPOCKPOS || bLoop == HELMETPOS || bLoop == VESTPOS || bLoop == LEGPOS || bLoop == HEAD1POS || bLoop == HEAD2POS )
;
else if ( bLoop == KNIFEPOCKPOS && !HasItemFlag(this->inv[bLoop].usItem, COVERT) )
;
else if ( !HasItemFlag(this->inv[bLoop].usItem, COVERT) )
{
// item will be detected if someone looks - check for the LBE item that gave us this slot. If that one is covert, this item is also covert
UINT8 checkslot = 0;
switch (uiNIVSlotType[bLoop])
{
case 2:
// this is worn LBE gear itself
break;
case 3:
checkslot = VESTPOCKPOS;
break;
@@ -14580,8 +14630,11 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
checkslot = CPACKPOCKPOS;
break;
default:
return FALSE;
break;
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CARRY_BADLBE], this->name );
return FALSE;
}
break;
}
// found a slot to check for LBE
@@ -14592,47 +14645,59 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
// pass for this item
continue;
}
}
// if that item is a gun, explosives, military armour or facewear, investigate further
if ( (Item[this->inv[bLoop].usItem].usItemClass & (IC_GUN|IC_LAUNCHER|IC_ARMOUR|IC_FACE) ) )
// if that item is a gun, explosives, military armour or facewear, investigate further
if ( (Item[this->inv[bLoop].usItem].usItemClass & (IC_GUN|IC_LAUNCHER|IC_ARMOUR|IC_FACE) ) )
{
if ( (Item[this->inv[bLoop].usItem].usItemClass & (IC_GUN|IC_LAUNCHER) ) )
{
if ( (Item[this->inv[bLoop].usItem].usItemClass & (IC_GUN|IC_LAUNCHER) ) )
++numberofguns;
if ( numberofguns > 2 )
{
++numberofguns;
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOOMANYGUNS], this->name );
return TRUE;
}
}
if ( numberofguns > 2 )
return TRUE;
OBJECTTYPE * pObj = &(this->inv[bLoop]); // ... get pointer for this item ...
OBJECTTYPE * pObj = &(this->inv[bLoop]); // ... get pointer for this item ...
if ( pObj != NULL )
if ( pObj != NULL )
{
for(INT16 i = 0; i < pObj->ubNumberOfObjects; ++i) // ... there might be multiple items here (item stack), so for each one ...
{
// loop over every item and its attachments
if ( Item[pObj->usItem].ubCoolness > maxcoolnessallowed )
{
for(INT16 i = 0; i < pObj->ubNumberOfObjects; ++i) // ... there might be multiple items here (item stack), so for each one ...
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ITEMSTOOGOOD], this->name );
return TRUE;
}
UINT8 numberofattachments = 0;
// for every objects, we also have to check wether there are weapon attachments (eg. underbarrel grenade launchers), and cool them down too
attachmentList::iterator iterend = (*pObj)[i]->attachments.end();
for (attachmentList::iterator iter = (*pObj)[i]->attachments.begin(); iter != iterend; ++iter)
{
if ( iter->exists() )
{
// loop over every item and its attachments
if ( Item[pObj->usItem].ubCoolness > maxcoolnessallowed )
return TRUE;
UINT8 numberofattachments = 0;
// for every objects, we also have to check wether there are weapon attachments (eg. underbarrel grenade launchers), and cool them down too
attachmentList::iterator iterend = (*pObj)[i]->attachments.end();
for (attachmentList::iterator iter = (*pObj)[i]->attachments.begin(); iter != iterend; ++iter)
if ( Item[iter->usItem].ubCoolness > maxcoolnessallowed )
{
if ( iter->exists() )
{
// loop over every item and its attachments
if ( Item[iter->usItem].ubCoolness > maxcoolnessallowed )
return TRUE;
++numberofattachments;
}
}
// no ordinary soldier is allowed that many attachemnts > not covert
if ( numberofattachments > gGameExternalOptions.iMaxEnemyAttachments )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ITEMSTOOGOOD], this->name );
return TRUE;
}
++numberofattachments;
// no ordinary soldier is allowed that many attachments > not covert
if ( numberofattachments > gGameExternalOptions.iMaxEnemyAttachments )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOOMANYATTACHMENTS], this->name );
return TRUE;
}
}
}
}
}
}
}
@@ -14654,7 +14719,10 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
++numberofguns;
if ( numberofguns > 2 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOOMANYGUNS], this->name );
return TRUE;
}
OBJECTTYPE * pObj = &(this->inv[bLoop]); // ... get pointer for this item ...
@@ -14664,7 +14732,10 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
{
// loop over every item and its attachments
if ( Item[pObj->usItem].ubCoolness > maxcoolnessallowed )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ITEMSTOOGOOD], this->name );
return TRUE;
}
UINT8 numberofattachments = 0;
// for every objects, we also have to check wether there are weapon attachments (eg. underbarrel grenade launchers), and cool them down too
@@ -14675,7 +14746,10 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
{
// loop over every item and its attachments
if ( Item[iter->usItem].ubCoolness > maxcoolnessallowed )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ITEMSTOOGOOD], this->name );
return TRUE;
}
++numberofattachments;
}
@@ -14683,7 +14757,10 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook )
// no ordinary soldier is allowed that many attachments > not covert
if ( numberofattachments > gGameExternalOptions.iMaxEnemyAttachments )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOOMANYATTACHMENTS], this->name );
return TRUE;
}
}
}
}
@@ -14709,7 +14786,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
if ( !(this->bSoldierFlagMask & (SOLDIER_COVERT_CIV|SOLDIER_COVERT_SOLDIER) ) )
return FALSE;
// if we are in a suspicious stance: not covert
// if we are in a suspicious activity: not covert
if ( this->usAnimState == NINJA_SPINKICK ||
this->usAnimState == NINJA_PUNCH ||
this->usAnimState == NINJA_LOWKICK ||
@@ -14743,25 +14820,20 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
this->usAnimState == JUMPWINDOWS
)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s was seen performing suspicious activities!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ACTIVITIES], this->name );
return FALSE;
}
BOOLEAN looklikeaciv = this->LooksLikeACivilian();
// if we are trying to dress like a civilian, but aren't sucessful: not covert
if ( this->bSoldierFlagMask & SOLDIER_COVERT_CIV && !looklikeaciv)
if ( this->bSoldierFlagMask & SOLDIER_COVERT_CIV && !(this->LooksLikeACivilian()) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s does not look like a civilian!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_CIV], this->name );
return FALSE;
}
BOOLEAN looklikeasoldier = this->LooksLikeASoldier();
// if we are trying to dress like a soldier, but aren't sucessful: not covert
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER && !looklikeasoldier)
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER && !(this->LooksLikeASoldier()) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s is carrying a corpse!", this->name );
return FALSE;
}
@@ -14783,13 +14855,13 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// if we are openly bleeding: not covert
if ( this->bBleeding > 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s bleeding was discovered!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_BLEEDING], this->name );
return FALSE;
}
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER && GetDrunkLevel( this ) != SOBER )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s is drunk and doesn't look like a soldier!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_DRUNKEN_SOLDIER], this->name );
return FALSE;
}
}
@@ -14801,13 +14873,13 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// if we are openly bleeding: not covert
if ( this->bBleeding > 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s bleeding was discovered!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_BLEEDING], this->name );
return FALSE;
}
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"On closer inspection, %s's disguise does not hold!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOO_CLOSE], this->name );
return FALSE;
}
}
@@ -14817,7 +14889,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// without the covert ops skill, we can only dress up as civilians. We will be discovered if we get too close to the enemy
if ( (this->bSoldierFlagMask & SOLDIER_COVERT_NPC_SPECIAL) == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"On closer inspection, %s's disguise does not hold!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOO_CLOSE], this->name );
return FALSE;
}
break;
@@ -14842,13 +14914,13 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
if ( sectordata > 1 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s isn't supposed to be here!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CURFEW_BROKEN], this->name );
return FALSE;
}
// is it night?
else if ( sectordata == 1 && GetTimeOfDayAmbientLightLevel() < NORMAL_LIGHTLEVEL_DAY + 2 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s isn't supposed to be here at this time!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_CURFEW_BROKEN_NIGHT], this->name );
return FALSE;
}
@@ -14864,7 +14936,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// a corpse was found near our position. If the soldier observing us can see it, he will be alarmed
if ( SoldierTo3DLocationLineOfSightTest( pSoldier, pCorpse->def.sGridNo, pCorpse->def.bLevel, 3, TRUE, CALC_FROM_WANTED_DIR ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s was seen near a fresh corpse!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NEAR_CORPSE], this->name );
return FALSE;
}
}
@@ -14876,7 +14948,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// if our equipment is too good, that is suspicious... not covert!
if ( this->EquipmentTooGood( (distance < discoverrange) ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s equipment raises a few eyebrows!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_SUSPICIOUS_EQUIPMENT], this->name );
return FALSE;
}
@@ -14886,7 +14958,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// if we aiming at a soldier, others will notice our intent... not covert!
if ( WeaponReady(this) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s is seen targeting a soldier!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TARGETTING_SOLDIER], this->name );
return FALSE;
}
}
@@ -14907,7 +14979,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
// a corpse was found near our position. If the soldier observing us can see it, he will be alarmed
if ( SoldierTo3DLocationLineOfSightTest( pSoldier, pCorpse->def.sGridNo, pCorpse->def.bLevel, 3, TRUE, CALC_FROM_WANTED_DIR ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s was seen near a fresh corpse!", this->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NEAR_CORPSE], this->name );
return FALSE;
}
}
@@ -14981,7 +15053,7 @@ BOOLEAN SOLDIERTYPE::RecognizeAsCombatant(UINT8 ubTargetID)
{
pSoldier->LooseDisguise();
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s has seen through %s disguise!", this->name, pSoldier->name );
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_UNCOVERED], this->name, pSoldier->name );
// we have uncovered a spy! Get alerted, if we aren't already
if ( this->aiData.bAlertStatus < STATUS_BLACK )
@@ -15036,6 +15108,8 @@ void SOLDIERTYPE::LooseDisguise( void )
if ( !AutoPlaceObject( this, &gTempObject, FALSE ) )
AddItemToPool( sGridNo, &gTempObject, 1, 0, 0, -1 );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_CLOTHES_ITEM] );
}
// if we are also disguised as a soldier, remove that flag
@@ -15050,13 +15124,19 @@ BOOLEAN SOLDIERTYPE::DisguiseAsCivilian( void )
{
// this will only work with the new trait system
if (!gGameOptions.fNewTraitSystem)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ERROR_OLDTRAITS] );
return FALSE;
}
UINT8 skilllevel = NUM_SKILL_TRAITS( this, COVERT_NT );
INT16 apcost = (APBPConstants[AP_DISGUISE] * ( gSkillTraitValues.sCODisguiseAPReduction * skilllevel))/100;
if ( !EnoughPoints( this, apcost, 0, TRUE ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NOT_ENOUGH_APS] );
return( FALSE );
}
this->bSoldierFlagMask |= SOLDIER_COVERT_CIV;
@@ -15094,6 +15174,8 @@ BOOLEAN SOLDIERTYPE::DisguiseAsCivilian( void )
this->CreateSoldierPalettes();
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_BAD_PALETTE] );
// if we are also disguised as a soldier, remove that flag
if ( this->bSoldierFlagMask & SOLDIER_COVERT_SOLDIER )
@@ -15111,16 +15193,25 @@ BOOLEAN SOLDIERTYPE::DisguiseAsSoldierFromCorpse( UINT32 usFlag )
{
// this will only work with the new trait system
if (!gGameOptions.fNewTraitSystem)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_ERROR_OLDTRAITS] );
return FALSE;
}
// action is only possible if we have the covert ops trait
UINT8 skilllevel = NUM_SKILL_TRAITS( this, COVERT_NT );
if ( skilllevel < 1)
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_SKILL] );
return FALSE;
}
INT16 apcost = (APBPConstants[AP_DISGUISE] * ( gSkillTraitValues.sCODisguiseAPReduction * skilllevel))/100;
if ( !EnoughPoints( this, apcost, 0, TRUE ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NOT_ENOUGH_APS] );
return( FALSE );
}
UINT8 uniformtype = 0;
@@ -15131,8 +15222,11 @@ BOOLEAN SOLDIERTYPE::DisguiseAsSoldierFromCorpse( UINT32 usFlag )
else if ( usFlag & ROTTING_CORPSE_FROM_ELITE )
uniformtype = UNIFORM_ENEMY_ELITE;
else
{
// no uniform here, so nothing to wear
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_UNIFORM_FOUND] );
return FALSE;
}
this->bSoldierFlagMask |= SOLDIER_COVERT_SOLDIER;
@@ -15166,6 +15260,8 @@ BOOLEAN SOLDIERTYPE::DisguiseAsSoldierFromCorpse( UINT32 usFlag )
CreateItem( civilianclothesitem, 100, &gTempObject );
AddItemToPool( sGridNo, &gTempObject, 1, 0, 0, -1 );
}
else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_NO_CLOTHES_ITEM] );
}
DeductPoints( this, apcost, 0 );
+2 -1
View File
@@ -1296,7 +1296,8 @@ public:
void EVENT_SoldierBeginRefuel( INT32 sGridNo, UINT8 ubDirection );
void EVENT_SoldierBeginKnifeThrowAttack( INT32 sGridNo, UINT8 ubDirection );
void EVENT_SoldierBeginUseDetonator( void );
void EVENT_SoldierBeginDropBomb( void );
void EVENT_SoldierBeginDropBomb( );
void EVENT_SoldierDefuseTripwire( INT32 sGridNo, INT32 sItem );
void EVENT_SoldierEnterVehicle( INT32 sGridNo, UINT8 ubDirection );
void EVENT_SoldierBeginGiveItem( void );
void EVENT_SetSoldierPositionAndMaybeFinalDest( FLOAT dNewXPos, FLOAT dNewYPos, BOOLEAN fUpdateFinalDest );
+30
View File
@@ -287,6 +287,36 @@ INT32 FindWorldItemForBombInGridNo( INT32 sGridNo, INT8 bLevel )
return( -1 );
}
// Flugente: is there a planted tripwire at this gridno? fKnown = TRUE: only return true if we know of that one already
INT32 FindWorldItemForTripwireInGridNo( INT32 sGridNo, INT8 bLevel, BOOLEAN fKnown )
{
UINT32 uiBombIndex;
OBJECTTYPE* pObj = NULL;
for (uiBombIndex = 0; uiBombIndex < guiNumWorldBombs; uiBombIndex++)
{
if (gWorldBombs[ uiBombIndex ].fExists && gWorldItems[ gWorldBombs[ uiBombIndex ].iItemIndex ].sGridNo == sGridNo && gWorldItems[ gWorldBombs[ uiBombIndex ].iItemIndex ].ubLevel == bLevel )
{
pObj = &( gWorldItems[ gWorldBombs[ uiBombIndex ].iItemIndex ].object );
if ( pObj && Item[pObj->usItem].tripwire )
{
if ( !fKnown )
return( gWorldBombs[ uiBombIndex ].iItemIndex );
// owned by the player team - we know of this thing
if ( (*pObj)[0]->data.ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER )
return( gWorldBombs[ uiBombIndex ].iItemIndex );
// something is here, as a blue flag is planted
if ( gpWorldLevelData[sGridNo].uiFlags & MAPELEMENT_PLAYER_MINE_PRESENT )
return( gWorldBombs[ uiBombIndex ].iItemIndex );
}
}
}
return( -1 );
}
void FindPanicBombsAndTriggers( void )
{
+3
View File
@@ -118,6 +118,9 @@ extern INT32 AddBombToWorld( INT32 iItemIndex );
extern void FindPanicBombsAndTriggers( void );
extern INT32 FindWorldItemForBombInGridNo( INT32 sGridNo, INT8 bLevel);
// Flugente: is there a planted tripwire at this gridno? fKnown = TRUE: only return true if we know of that one already
extern INT32 FindWorldItemForTripwireInGridNo( INT32 sGridNo, INT8 bLevel, BOOLEAN fKnown = TRUE );
void RefreshWorldItemsIntoItemPools( WORLDITEM * pItemList, INT32 iNumberOfItems );
void CoolDownWorldItems( ); // Flugente: Cool/decay down all items in this sector
+13 -12
View File
@@ -3686,25 +3686,26 @@ BOOLEAN ActivateSurroundingTripwire( UINT8 ubID, INT32 sGridNo, INT8 bLevel, UIN
BOOLEAN samenetwork = FALSE;
BOOLEAN sameorlowerhierarchy = FALSE;
if ( ubWireNetworkFlag <= ubFlag ) // hierarchy of a group is sorted, so this suffices
// the biggest flags are the hierarchy flags, so a simple comparison is enough here
if ( ubWireNetworkFlag <= ubFlag )
sameorlowerhierarchy = TRUE;
if ( !sameorlowerhierarchy )
continue;
for (INT8 i = 0; i < 2; ++i) // 2 runs: first for enemy networks, second for player networks
// test: do the 2 wires belong to the same 'side'?
if ( ( (ubFlag & TRIPWIRE_NETWORK_OWNER_ENEMY) && (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_ENEMY) ) || ( (ubFlag & TRIPWIRE_NETWORK_OWNER_PLAYER) && (ubWireNetworkFlag & TRIPWIRE_NETWORK_OWNER_PLAYER) ) )
{
for (INT8 j = 0; j < 4; ++j)
{
UINT32 samenetworkflag = ( ENEMY_NET_1_LVL_1 | ENEMY_NET_1_LVL_2 | ENEMY_NET_1_LVL_3 | ENEMY_NET_1_LVL_4 ) << (16*i + j); // comparing with this flag will determine the network
if ( ( (ubFlag & samenetworkflag) != 0 ) && ( (ubWireNetworkFlag & samenetworkflag) != 0 ) )
samenetwork = TRUE;
if ( samenetwork )
break;
}
if ( ( (ubFlag & TRIPWIRE_NETWORK_NET_1) && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_1) ) ||
( (ubFlag & TRIPWIRE_NETWORK_NET_2) && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_2) ) ||
( (ubFlag & TRIPWIRE_NETWORK_NET_3) && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_3) ) ||
( (ubFlag & TRIPWIRE_NETWORK_NET_4) && (ubWireNetworkFlag & TRIPWIRE_NETWORK_NET_4) ) )
samenetwork = TRUE;
else
continue;
}
else
continue;
if ( samenetwork && sameorlowerhierarchy )
{
+75 -1
View File
@@ -651,6 +651,80 @@ extern CHAR16 zHealthStr[][13];
extern STR16 gzHiddenHitCountStr[1];
extern STR16 zVehicleName[ 6 ];
// Flugente: externalised texts for some features
enum
{
STR_COVERT_CAMOFOUND,
STR_COVERT_BACKPACKFOUND,
STR_COVERT_CARRYCORPSEFOUND,
STR_COVERT_CARRY_BADLBE,
STR_COVERT_MILITARYGEARFOUND,
STR_COVERT_TOOMANYGUNS,
STR_COVERT_ITEMSTOOGOOD,
STR_COVERT_TOOMANYATTACHMENTS,
STR_COVERT_ACTIVITIES,
STR_COVERT_NO_CIV,
STR_COVERT_BLEEDING,
STR_COVERT_DRUNKEN_SOLDIER,
STR_COVERT_TOO_CLOSE,
STR_COVERT_CURFEW_BROKEN,
STR_COVERT_CURFEW_BROKEN_NIGHT,
STR_COVERT_NEAR_CORPSE,
STR_COVERT_SUSPICIOUS_EQUIPMENT,
STR_COVERT_TARGETTING_SOLDIER,
STR_COVERT_UNCOVERED,
STR_COVERT_NO_CLOTHES_ITEM,
STR_COVERT_ERROR_OLDTRAITS,
STR_COVERT_NOT_ENOUGH_APS,
STR_COVERT_BAD_PALETTE,
STR_COVERT_NO_SKILL,
STR_COVERT_NO_UNIFORM_FOUND,
TEXT_NUM_COVERT_STR
};
extern STR16 szCovertTextStr[];
enum
{
STR_CORPSE_NO_HEAD_ITEM,
STR_CORPSE_NO_DECAPITATION,
STR_CORPSE_NO_MEAT_ITEM,
STR_CORPSE_NO_GUTTING,
STR_CORPSE_NO_CLOTHESFOUND,
STR_CORPSE_NO_STRIPPING_POSSIBLE,
STR_CORPSE_NO_TAKING,
STR_CORPSE_NO_FREEHAND,
STR_CORPSE_NO_CORPSE_ITEM,
STR_CORPSE_INVALID_CORPSE_ID,
TEXT_NUM_CORPSE_STR
};
extern STR16 szCorpseTextStr[];
enum
{
STR_FOOD_DONOTWANT_EAT,
STR_FOOD_DONOTWANT_DRINK,
STR_FOOD_ATE,
STR_FOOD_DRANK,
STR_FOOD_STR_DAMAGE_FOOD_TOO_MUCH,
STR_FOOD_STR_DAMAGE_FOOD_TOO_LESS,
STR_FOOD_HEALTH_DAMAGE_FOOD_TOO_MUCH,
STR_FOOD_HEALTH_DAMAGE_FOOD_TOO_LESS,
STR_FOOD_STR_DAMAGE_DRINK_TOO_MUCH,
STR_FOOD_STR_DAMAGE_DRINK_TOO_LESS,
STR_FOOD_HEALTH_DAMAGE_DRINK_TOO_MUCH,
STR_FOOD_HEALTH_DAMAGE_DRINK_TOO_LESS,
STR_FOOD_ERROR_NO_FOOD_SYSTEM,
TEXT_NUM_FOOD_STR
};
extern STR16 szFoodTextStr[];
enum
{
AIR_RAID_TURN_STR,
@@ -818,8 +892,8 @@ enum
MERC_VITAL_STATS_WITH_POISON_AND_FOOD_POPUPTEXT,
FUNCTION_SELECTION_STR,
CORPSE_SELECTION_STR,
WEAPON_CLEANING_STR,
TEXT_NUM_TACTICAL_STR
};
+64
View File
@@ -2903,6 +2903,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7395,4 +7398,65 @@ STR16 gszPocketPopupText[]=
L"更多...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //CHINESE
+64
View File
@@ -2900,6 +2900,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7388,4 +7391,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //DUTCH
+64
View File
@@ -2902,6 +2902,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body",
// Flugente: weapon cleaning
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7377,4 +7380,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //ENGLISH
+64
View File
@@ -2902,6 +2902,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7363,4 +7366,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //FRENCH
+64
View File
@@ -2905,6 +2905,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7203,4 +7206,65 @@ STR16 gszPocketPopupText[]=
L"weitere...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //GERMAN
+64
View File
@@ -2895,6 +2895,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7375,4 +7378,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //ITALIAN
+64
View File
@@ -2910,6 +2910,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7389,4 +7392,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //POLISH
+64
View File
@@ -2903,6 +2903,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7355,4 +7358,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //RUSSIAN
+64
View File
@@ -2904,6 +2904,9 @@ CHAR16 TacticalStr[][ MED_STRING_LENGTH ] =
// added by Flugente: decide what to do with the corpses
L"1 - Decapitate 2 - Gut 3 - Take Clothes 4 - Take Body", // TODO.Translate
// Flugente: weapon cleaning // TODO.Translate
L"%s cleaned %s",
};
//Varying helptext explains (for the "Go to Sector/Map" checkbox) what will happen given different circumstances in the "exiting sector" interface.
@@ -7392,4 +7395,65 @@ STR16 gszPocketPopupText[]=
L"more...", //POCKET_POPUP_MOAR
};
// Flugente: externalised texts for some features // TODO.Translate
STR16 szCovertTextStr[]=
{
L"%s has camo!",
L"%s has a backpack!",
L"%s is seen carrying a corpse!",
L"%s wears suspicious LBE gear!",
L"%s possesses military hardware!",
L"%s carries too many guns!",
L"%s equipment is too good!",
L"%s gun has too many attachments!",
L"%s was seen performing suspicious activities!",
L"%s does not look like a civilian!",
L"%s bleeding was discovered!",
L"%s is drunk and doesn't look like a soldier!",
L"On closer inspection, %s's disguise does not hold!",
L"%s isn't supposed to be here!",
L"%s isn't supposed to be here at this time!",
L"%s was seen near a fresh corpse!",
L"%s equipment raises a few eyebrows!",
L"%s is seen targeting a soldier!",
L"%s has seen through %s disguise!",
L"No clothes item found in Items.xml!",
L"This does not work with the old trait system!",
L"Not enough Aps!",
L"Bad palette found!",
L"You need the covert skill to do this!",
L"No uniform found!",
};
STR16 szCorpseTextStr[]=
{
L"No head item found in Items.xml!",
L"Corpse cannot be decapitated!",
L"No meat item found in Items.xml!",
L"Not possible, you sick, twisted individual!",
L"No clothes to take!",
L"%s cannot take clothes off of this corpse!",
L"This corpse cannot be taken!",
L"No free hand to carry corpse!",
L"No corpse item found in Items.xml!",
L"Invalid corpse ID!",
};
STR16 szFoodTextStr[]=
{
L"%s does not want to eat %s",
L"%s does not want to drink %s",
L"%s ate %s",
L"%s drank %s",
L"%s's strength was damaged due to being overfed!",
L"%s's strength was damaged due to lack of nutrition!",
L"%s's health was damaged due to being overfed!",
L"%s's health was damaged due to lack of nutrition!",
L"%s's strength was damaged due to excessive drinking!",
L"%s's strength was damaged due to lack of water!",
L"%s's health was damaged due to excessive drinking!",
L"%s's health was damaged due to lack of water!",
L"Sectorwide canteen filling not possible, Food System is off!"
};
#endif //TAIWANESE