diff --git a/German.vsprops b/German.vsprops
new file mode 100644
index 00000000..dd3a2b9f
--- /dev/null
+++ b/German.vsprops
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/Init.cpp b/Init.cpp
index a7537af0..a31f3935 100644
--- a/Init.cpp
+++ b/Init.cpp
@@ -89,6 +89,27 @@ extern BOOLEAN gfUseConsecutiveQuickSaveSlots;
extern HINSTANCE ghInstance;
+// Prepends the language prefix to the file name in a proposed path.
+static void AddLanguagePrefix(STR fileName, const STR language)
+{
+ char *fileComponent;
+
+ fileComponent = strrchr( fileName, '\\');
+ if (fileComponent)
+ {
+ fileComponent++;
+ }
+ else
+ {
+ fileComponent = fileName;
+ }
+
+ // Make sure to use the overlap-safe version of memory copy
+ memmove( fileComponent + strlen( language), fileComponent, strlen( fileComponent) + 1);
+ memmove( fileComponent, language, strlen( language) );
+}
+
+
BOOLEAN LoadExternalGameplayData(STR directoryName)
{
char fileName[MAX_PATH];
@@ -373,6 +394,16 @@ BOOLEAN LoadExternalGameplayData(STR directoryName)
if(!ReadInMapStructure(fileName))
return FALSE;
+#ifdef RUSSIAN
+ AddLanguagePrefix( fileName, RUSSIAN_PREFIX);
+ if ( FileExists(fileName) )
+ {
+ DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName));
+ if(!ReadInMapStructure(fileName))
+ return FALSE;
+ }
+#endif
+
// Lesh: Strategic movement costs will be read in Strategic\Strategic Movement Costs.cpp,
// function BOOLEAN InitStrategicMovementCosts();
// It is called several times from various places and acts after clearing SectorInfo array
diff --git a/Laptop/AimMembers.cpp b/Laptop/AimMembers.cpp
index 1a715553..496f270d 100644
--- a/Laptop/AimMembers.cpp
+++ b/Laptop/AimMembers.cpp
@@ -1592,6 +1592,8 @@ void BtnContractLengthButtonCallback(GUI_BUTTON *btn,INT32 reason)
gubContractLength = ubRetValue;
DisplaySelectLights(TRUE, FALSE);
+
+ DisplayMercChargeAmount();
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
@@ -1626,6 +1628,7 @@ void BtnBuyEquipmentButtonCallback(GUI_BUTTON *btn,INT32 reason)
gfBuyEquipment = (UINT8)MSYS_GetBtnUserData( btn, 0 );
DisplaySelectLights(FALSE, TRUE);
+ DisplayMercChargeAmount();
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
diff --git a/Laptop/email.cpp b/Laptop/email.cpp
index 83a56503..3e64c497 100644
--- a/Laptop/email.cpp
+++ b/Laptop/email.cpp
@@ -5008,21 +5008,24 @@ void ModifyInsuranceEmails( UINT16 usMessageId, INT32 *iResults, EmailPtr pMail,
// increment height for size of one line
iHeight+=GetFontHeight( MESSAGE_FONT );
- for( ubCnt=0; ubCnt
+
+
+
diff --git a/Standard Gaming Platform/stringicmp.cpp b/Standard Gaming Platform/stringicmp.cpp
index 89a6e259..8a60e4da 100644
--- a/Standard Gaming Platform/stringicmp.cpp
+++ b/Standard Gaming Platform/stringicmp.cpp
@@ -34,7 +34,7 @@ bool TStringiLess::operator() (std::string const& s1, std::string const& s2) con
++p2;
}
- if (!*p1) return *p2;
+ if (!*p1) return *p2 != 0;
if (!*p2) return false;
return toupper(*p1) < toupper(*p2);
diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp
index a2c66f26..60f5910f 100644
--- a/Strategic/strategicmap.cpp
+++ b/Strategic/strategicmap.cpp
@@ -814,6 +814,8 @@ citytableStartElementHandle(void *userData, const XML_Char *name, const XML_Char
{
citytableParseData * pData = (citytableParseData *) userData;
+ memset( pData->szCharData, 0, sizeof( pData->szCharData) );
+
if(pData->currentDepth <= pData->maxReadDepth) //are we reading this element?
{
@@ -918,7 +920,7 @@ citytableStartElementHandle(void *userData, const XML_Char *name, const XML_Char
pData->maxReadDepth++; //we are not skipping this element
}
- pData->szCharData[0] = '\0';
+ //pData->szCharData[0] = '\0';
}
pData->currentDepth++;
@@ -986,7 +988,8 @@ citytableEndElementHandle(void *userData, const XML_Char *name)
gfTownUsesLoyalty [pData->curCityInfo.uiIndex ] = pData->curCityInfo.townUsesLoyalty;
gubTownRebelSentiment [pData->curCityInfo.uiIndex ] = pData->curCityInfo.townRebelSentiment;
gfMilitiaAllowedInTown[pData->curCityInfo.uiIndex ] = pData->curCityInfo.townMilitiaAllowed;
- mbstowcs( pTownNames[pData->curCityInfo.uiIndex], pData->curCityInfo.cityName, MAX_TOWN_NAME_LENGHT);
+ //mbstowcs( pTownNames[pData->curCityInfo.uiIndex], pData->curCityInfo.cityName, MAX_TOWN_NAME_LENGHT);
+ MultiByteToWideChar( CP_UTF8, 0, pData->curCityInfo.cityName, -1, pTownNames[pData->curCityInfo.uiIndex], MAX_TOWN_NAME_LENGHT);
}
}
else if(strcmp(name, "uiIndex") == 0 && pData->curElement == CITYTABLE_ELEMENT_INDEX)
diff --git a/Tactical/ArmsDealerInvInit.cpp b/Tactical/ArmsDealerInvInit.cpp
index f84afa9c..bb2fb16e 100644
--- a/Tactical/ArmsDealerInvInit.cpp
+++ b/Tactical/ArmsDealerInvInit.cpp
@@ -1389,9 +1389,9 @@ int CompareItemsForSorting( UINT16 usItem1Index, UINT16 usItem2Index, UINT8 ubIt
//}
//Madd: sort by name (for now at least):
- if (_stricmp(Item[usItem1Index].szBRName,Item[usItem2Index].szBRName) < 0 )
+ if (_wcsicmp(Item[usItem1Index].szBRName,Item[usItem2Index].szBRName) < 0 )
return -1;
- else if (_stricmp(Item[usItem1Index].szBRName,Item[usItem2Index].szBRName) > 0 )
+ else if (_wcsicmp(Item[usItem1Index].szBRName,Item[usItem2Index].szBRName) > 0 )
return 1;
else
{
diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp
index d4e9a67f..408f1def 100644
--- a/Tactical/Interface Items.cpp
+++ b/Tactical/Interface Items.cpp
@@ -1081,8 +1081,8 @@ void HandleRenderInvSlots( SOLDIERTYPE *pSoldier, UINT8 fDirtyLevel )
# if defined( _DEBUG ) /* Sergeant_Kolja, to be removed later again */
if( pSoldier->inv[ cnt ].ItemData.Gun.ubGunAmmoType >= MAXITEMS )
{
- DebugMsg(TOPIC_JA2, DBG_LEVEL_1, String("pObject (%s) corrupted! GetHelpTextForItem() can crash.", (pSoldier->inv[ cnt ].usIteminv[ cnt ].usItem].szItemName : "???" ));
- ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"pObject (%S) corrupted! GetHelpTextForItem() can crash.", (pSoldier->inv[ cnt ].usIteminv[ cnt ].usItem].szItemName : "???" );
+ DebugMsg(TOPIC_JA2, DBG_LEVEL_1, String("pObject (%S) corrupted! GetHelpTextForItem() can crash.", (pSoldier->inv[ cnt ].usIteminv[ cnt ].usItem].szItemName : L"???" ));
+ ScreenMsg( MSG_FONT_RED, MSG_DEBUG, L"pObject (%s) corrupted! GetHelpTextForItem() can crash.", (pSoldier->inv[ cnt ].usIteminv[ cnt ].usItem].szItemName : L"???" );
DebugBreak();
AssertMsg( 0, "pObject corrupted! GetHelpTextForItem() can crash." );
}
@@ -7447,8 +7447,8 @@ void GetHelpTextForItem( STR16 pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldier
if ( (pObject->ItemData.Gun.ubGunAmmoType >= MAXITEMS)
)
{
- DebugMsg(TOPIC_JA2, DBG_LEVEL_1, String( "corrupted pObject (%s) found in GetHelpTextForItem()", (usItemubNumberOfObjects - 1; bLoop >= 0; bLoop--)
{
- if (pTargetObj->ItemData.Generic.bStatus[0] + pAttachment->ItemData.Generic.bStatus[bLoop] <= ubLimit)
+ if ( Item[ pTargetObj->usItem ].usItemClass == IC_AMMO )
{
- // consume this one totally and continue
- pTargetObj->ItemData.Generic.bStatus[0] += pAttachment->ItemData.Generic.bStatus[bLoop];
- RemoveObjFrom( pAttachment, bLoop );
- // reset loop limit
- bLoop = pAttachment->ubNumberOfObjects; // add 1 to counteract the -1 from the loop
- }
+ // Cast to a bigger int to prevent overflow
+ UINT32 uiTotal = pTargetObj->ItemData.Ammo.ubShotsLeft[0] + pAttachment->ItemData.Ammo.ubShotsLeft[bLoop];
+ if ( uiTotal <= ubLimit)
+ {
+ // consume this one totally and continue
+ pTargetObj->ItemData.Ammo.ubShotsLeft[0] = (UINT8) uiTotal;
+ RemoveObjFrom( pAttachment, bLoop );
+ // reset loop limit
+ bLoop = pAttachment->ubNumberOfObjects; // add 1 to counteract the -1 from the loop
+ }
+ else
+ {
+ // add part of this one and then we're done
+ pAttachment->ItemData.Ammo.ubShotsLeft[bLoop] = (UINT8) (uiTotal - ubLimit);
+ pTargetObj->ItemData.Ammo.ubShotsLeft[0] = ubLimit;
+ break;
+ }
+ }
else
{
- // add part of this one and then we're done
- pAttachment->ItemData.Generic.bStatus[bLoop] -= (ubLimit - pTargetObj->ItemData.Generic.bStatus[0]);
- pTargetObj->ItemData.Generic.bStatus[0] = ubLimit;
- break;
+ // Cast to a bigger int to prevent overflow
+ INT32 iTotal = pTargetObj->ItemData.Generic.bStatus[0] + pAttachment->ItemData.Generic.bStatus[bLoop];
+ if ( iTotal <= ubLimit)
+ {
+ // consume this one totally and continue
+ pTargetObj->ItemData.Generic.bStatus[0] = (INT8) iTotal;
+ RemoveObjFrom( pAttachment, bLoop );
+ // reset loop limit
+ bLoop = pAttachment->ubNumberOfObjects; // add 1 to counteract the -1 from the loop
+ }
+ else
+ {
+ // add part of this one and then we're done
+ pAttachment->ItemData.Generic.bStatus[bLoop] = (INT8) (iTotal - ubLimit);
+ pTargetObj->ItemData.Generic.bStatus[0] = (INT8) ubLimit;
+ break;
+ }
}
}
break;
diff --git a/Tactical/PATHAI.cpp b/Tactical/PATHAI.cpp
index f5bdb469..55cfaab9 100644
--- a/Tactical/PATHAI.cpp
+++ b/Tactical/PATHAI.cpp
@@ -2302,9 +2302,11 @@ void RestorePathAIToDefaults( void )
////////////////////////////////////////////////////////////////////////
INT32 FindBestPath(SOLDIERTYPE *s , INT16 sDestination, INT8 ubLevel, INT16 usMovementMode, INT8 bCopy, UINT8 fFlags )
{
+ s->sPlotSrcGrid = s->sGridNo;
+
#ifdef USE_ASTAR_PATHS
int retVal = ASTAR::AStarPathfinder::GetInstance().GetPath(s, sDestination, ubLevel, usMovementMode, bCopy, fFlags);
- if (retVal) {
+ if (retVal || sDestination == NOWHERE) {
return retVal;
}
else {
diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp
index 12b58636..ab8f5b98 100644
--- a/Tactical/Points.cpp
+++ b/Tactical/Points.cpp
@@ -113,22 +113,45 @@ INT16 TerrainActionPoints( SOLDIERTYPE *pSoldier, INT16 sGridno, INT8 bDir, INT8
case TRAVELCOST_DEBRIS : sAPCost += AP_MOVEMENT_RUBBLE;
break;
case TRAVELCOST_SHORE : sAPCost += AP_MOVEMENT_SHORE; // wading shallow water
+ if (!IS_MERC_BODY_TYPE( pSoldier ))
+ {
+ return -1;
+ }
break;
case TRAVELCOST_KNEEDEEP : sAPCost += AP_MOVEMENT_LAKE; // wading waist/chest deep - very slow
+ if (!IS_MERC_BODY_TYPE( pSoldier ))
+ {
+ return -1;
+ }
break;
case TRAVELCOST_DEEPWATER: sAPCost += AP_MOVEMENT_OCEAN; // can swim, so it's faster than wading
+ if (!IS_MERC_BODY_TYPE( pSoldier ))
+ {
+ return -1;
+ }
break;
/*
case TRAVELCOST_VEINEND :
case TRAVELCOST_VEINMID : sAPCost += AP_MOVEMENT_FLAT;
break;
*/
- case TRAVELCOST_DOOR : sAPCost += AP_MOVEMENT_FLAT + AP_OPEN_DOOR + AP_OPEN_DOOR; // Include open and close costs!
+ case TRAVELCOST_DOOR :
+ if (pSoldier->bTeam == gbPlayerNum)
+ {
+ return -1;
+ }
+ sAPCost += AP_MOVEMENT_FLAT + AP_OPEN_DOOR + AP_OPEN_DOOR; // Include open and close costs!
break;
// cost for jumping a fence REPLACES all other AP costs!
- case TRAVELCOST_FENCE : return( AP_JUMPFENCE );
+ case TRAVELCOST_FENCE :
+ if (!IS_MERC_BODY_TYPE( pSoldier ))
+ {
+ return -1;
+ }
+
+ return( AP_JUMPFENCE );
case TRAVELCOST_NONE : return( 0 );
diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp
index 9fe0ecc0..33db47e1 100644
--- a/Tactical/Soldier Control.cpp
+++ b/Tactical/Soldier Control.cpp
@@ -2391,6 +2391,10 @@ BOOLEAN EVENT_InitNewSoldierAnim( SOLDIERTYPE *pSoldier, UINT16 usNewState, UINT
// CHECK IF THIS NEW STATE IS NON-INTERRUPTABLE
// IF SO - SET NON-INT FLAG
+ // 0verhaul: Okay, here is a question: Is the "non-interrupt" supposed to be transferrable to other anims?
+ // That is, if one anim is not interruptable but it chains to another anim, should the "not interruptable" flag
+ // remain? I'm going to try out the theory that new animations should reset the "don't interrupt" flag.
+#if 0
if ( uiNewAnimFlags & ANIM_NONINTERRUPT )
{
pSoldier->fInNonintAnim = TRUE;
@@ -2400,6 +2404,10 @@ BOOLEAN EVENT_InitNewSoldierAnim( SOLDIERTYPE *pSoldier, UINT16 usNewState, UINT
{
pSoldier->fRTInNonintAnim = TRUE;
}
+#else
+ pSoldier->fInNonintAnim = (uiNewAnimFlags & ANIM_NONINTERRUPT) != 0;
+ pSoldier->fRTInNonintAnim = (uiNewAnimFlags & ANIM_RT_NONINTERRUPT) != 0;
+#endif
// CHECK IF WE ARE NOT AIMING, IF NOT, RESET LAST TAGRET!
if ( !(gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIREREADY ) && !(gAnimControl[ usNewState ].uiFlags & ANIM_FIREREADY ) )
@@ -2653,6 +2661,9 @@ BOOLEAN EVENT_InitNewSoldierAnim( SOLDIERTYPE *pSoldier, UINT16 usNewState, UINT
usNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( pSoldier->ubDirection ) );
usNewGridNo = NewGridNo( (UINT16)usNewGridNo, DirectionInc( pSoldier->ubDirection ) );
+ pSoldier->sPlotSrcGrid = pSoldier->sGridNo;
+ pSoldier->fPastXDest = FALSE;
+ pSoldier->fPastYDest = FALSE;
pSoldier->usPathDataSize = 0;
pSoldier->usPathIndex = 0;
pSoldier->usPathingData[ pSoldier->usPathDataSize ] = pSoldier->ubDirection;
@@ -8409,13 +8420,13 @@ InternalGivingSoldierCancelServices( pSoldier, FALSE );
void MoveMerc( SOLDIERTYPE *pSoldier, FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckRange )
{
- INT16 dDegAngle;
+ //INT16 dDegAngle;
FLOAT dDeltaPos;
FLOAT dXPos , dYPos;
BOOLEAN fStop = FALSE;
- dDegAngle = (INT16)( dAngle * 180 / PI );
+ //dDegAngle = (INT16)( dAngle * 180 / PI );
//sprintf( gDebugStr, "Move Angle: %d", (int)dDegAngle );
// Find delta Movement for X pos
@@ -8588,7 +8599,7 @@ UINT8 atan8( INT16 sXPos, INT16 sYPos, INT16 sXPos2, INT16 sYPos2 )
DOUBLE test_x = sXPos2 - sXPos;
DOUBLE test_y = sYPos2 - sYPos;
UINT8 mFacing = WEST;
- INT16 dDegAngle;
+ //INT16 dDegAngle;
DOUBLE angle;
if ( test_x == 0 )
@@ -8599,7 +8610,7 @@ UINT8 atan8( INT16 sXPos, INT16 sYPos, INT16 sXPos2, INT16 sYPos2 )
angle = atan2( test_x, test_y );
- dDegAngle = (INT16)( angle * 180 / PI );
+ //dDegAngle = (INT16)( angle * 180 / PI );
//sprintf( gDebugStr, "Move Angle: %d", (int)dDegAngle );
do
@@ -11602,6 +11613,8 @@ void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection )
// Remove any previous actions
pSoldier->ubPendingAction = NO_PENDING_ACTION;
+ pSoldier->sPlotSrcGrid = pSoldier->sGridNo;
+
// Since we're manually setting our path, we have to reset these @#$@# flags too. Otherwise we don't reach the
// destination a lot of the time
pSoldier->fPastXDest = 0;
@@ -11647,6 +11660,8 @@ void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection )
// Remove any previous actions
pSoldier->ubPendingAction = NO_PENDING_ACTION;
+ pSoldier->sPlotSrcGrid = pSoldier->sGridNo;
+
// Since we're manually setting our path, we have to reset these @#$@# flags too. Otherwise we don't reach the
// destination a lot of the time
pSoldier->fPastXDest = 0;
@@ -11689,7 +11704,7 @@ void SetSoldierCowerState( SOLDIERTYPE *pSoldier, BOOLEAN fOn )
}
else
{
- if ( (pSoldier->uiStatusFlags & SOLDIER_COWERING) )
+ if ( (pSoldier->uiStatusFlags & SOLDIER_COWERING) || (gAnimControl[ pSoldier->usAnimState ].ubEndHeight != ANIM_STAND) )
{
EVENT_InitNewSoldierAnim( pSoldier, END_COWER, 0, FALSE );
diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h
index e37b0c2a..c7ebdbb5 100644
--- a/Tactical/Soldier Control.h
+++ b/Tactical/Soldier Control.h
@@ -1073,6 +1073,8 @@ public:
vector bNewItemCount;
vector bNewItemCycleCount;
+
+ INT16 sPlotSrcGrid;
}; // SOLDIERTYPE;
#define SIZEOF_SOLDIERTYPE_POD offsetof( SOLDIERTYPE, endOfPOD )
diff --git a/Tactical/Soldier Profile.cpp b/Tactical/Soldier Profile.cpp
index f4435124..c2b28ea4 100644
--- a/Tactical/Soldier Profile.cpp
+++ b/Tactical/Soldier Profile.cpp
@@ -950,6 +950,8 @@ SOLDIERTYPE *ChangeSoldierTeam( SOLDIERTYPE *pSoldier, UINT8 ubTeam )
pNewSoldier->bScientific = pSoldier->bScientific;
pNewSoldier->bLastRenderVisibleValue = pSoldier->bLastRenderVisibleValue;
pNewSoldier->bVisible = pSoldier->bVisible;
+ // 0verhaul: Need to pass certain flags over. COWERING is one of them. Others to be determined.
+ pNewSoldier->uiStatusFlags |= pSoldier->uiStatusFlags & (SOLDIER_COWERING | SOLDIER_MUTE | SOLDIER_GASSED);
if ( ubTeam == gbPlayerNum )
{
diff --git a/Tactical/XML_AmmoStrings.cpp b/Tactical/XML_AmmoStrings.cpp
index 4da80452..5c1dbc3e 100644
--- a/Tactical/XML_AmmoStrings.cpp
+++ b/Tactical/XML_AmmoStrings.cpp
@@ -128,11 +128,16 @@ ammoEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
if(pData->curIndex < pData->maxArraySize)
{
+#if 0
for(int i=0;iszCharData),MAX_CHAR_DATA_LENGTH);i++)
{
temp = pData->szCharData[i];
AmmoCaliber[pData->curIndex][i] = temp;
}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, AmmoCaliber[pData->curIndex], sizeof(AmmoCaliber[0])/sizeof(AmmoCaliber[0][0]) );
+ AmmoCaliber[pData->curIndex][sizeof(AmmoCaliber[0])/sizeof(AmmoCaliber[0][0]) - 1] = '\0';
+#endif
}
}
@@ -141,11 +146,16 @@ ammoEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
if(pData->curIndex < pData->maxArraySize)
{
+#if 0
for(int i=0;iszCharData),MAX_CHAR_DATA_LENGTH);i++)
{
temp = pData->szCharData[i];
BobbyRayAmmoCaliber[pData->curIndex][i] = temp;
}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, BobbyRayAmmoCaliber[pData->curIndex], sizeof(BobbyRayAmmoCaliber[0])/sizeof(BobbyRayAmmoCaliber[0][0]) );
+ BobbyRayAmmoCaliber[pData->curIndex][sizeof(BobbyRayAmmoCaliber[0])/sizeof(BobbyRayAmmoCaliber[0][0]) - 1] = '\0';
+#endif
}
}
diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp
index 81e7240f..6e3decd0 100644
--- a/Tactical/opplist.cpp
+++ b/Tactical/opplist.cpp
@@ -1957,73 +1957,73 @@ INT16 ManLooksForMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, UINT8 ubCall
void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno, INT8 bOppLevel, UINT8 ubCaller, UINT8 ubCaller2)
{
- INT8 bDoLocate = FALSE;
- BOOLEAN fNewOpponent = FALSE;
- BOOLEAN fNotAddedToList = TRUE;
- INT8 bOldOppList = pSoldier->bOppList[pOpponent->ubID];
+ INT8 bDoLocate = FALSE;
+ BOOLEAN fNewOpponent = FALSE;
+ BOOLEAN fNotAddedToList = TRUE;
+ INT8 bOldOppList = pSoldier->bOppList[pOpponent->ubID];
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"ManSeesMan");
- if (pSoldier->ubID >= TOTAL_SOLDIERS)
- {
- /*
-#ifdef BETAVERSION
- NumMessage("ManSeesMan: ERROR - ptr->guynum = ",ptr->guynum);
-#endif
- */
- return;
- }
+ if (pSoldier->ubID >= TOTAL_SOLDIERS)
+ {
+ /*
+ #ifdef BETAVERSION
+ NumMessage("ManSeesMan: ERROR - ptr->guynum = ",ptr->guynum);
+ #endif
+ */
+ return;
+ }
- if (pOpponent->ubID >= TOTAL_SOLDIERS)
- {
- /*
-#ifdef BETAVERSION
- NumMessage("ManSeesMan: ERROR - oppPtr->guynum = ",oppPtr->guynum);
-#endif
- */
- return;
- }
+ if (pOpponent->ubID >= TOTAL_SOLDIERS)
+ {
+ /*
+ #ifdef BETAVERSION
+ NumMessage("ManSeesMan: ERROR - oppPtr->guynum = ",oppPtr->guynum);
+ #endif
+ */
+ return;
+ }
- // if we're somehow looking while inactive, at base, dying or already dead
- if (!pSoldier->bActive || !pSoldier->bInSector || (pSoldier->bLife < OKLIFE))
- {
- /*
-#ifdef BETAVERSION
- sprintf(tempstr,"ManSeesMan: ERROR - %s is SEEING ManSeesMan while inactive/at base/dead/dying",ExtMen[ptr->guynum].name);
- PopMessage(tempstr);
-#endif
- */
- return;
- }
+ // if we're somehow looking while inactive, at base, dying or already dead
+ if (!pSoldier->bActive || !pSoldier->bInSector || (pSoldier->bLife < OKLIFE))
+ {
+ /*
+ #ifdef BETAVERSION
+ sprintf(tempstr,"ManSeesMan: ERROR - %s is SEEING ManSeesMan while inactive/at base/dead/dying",ExtMen[ptr->guynum].name);
+ PopMessage(tempstr);
+ #endif
+ */
+ return;
+ }
- // if we're somehow seeing a guy who is inactive, at base, or already dead
- if (!pOpponent->bActive || !pOpponent->bInSector || pOpponent->bLife <= 0)
- {
- /*
-#ifdef BETAVERSION
- sprintf(tempstr,"ManSeesMan: ERROR - %s sees %s, ManSeesMan, who is inactive/at base/dead",ExtMen[ptr->guynum].name,ExtMen[oppPtr->guynum].name);
- PopMessage(tempstr);
-#endif
- */
- return;
- }
+ // if we're somehow seeing a guy who is inactive, at base, or already dead
+ if (!pOpponent->bActive || !pOpponent->bInSector || pOpponent->bLife <= 0)
+ {
+ /*
+ #ifdef BETAVERSION
+ sprintf(tempstr,"ManSeesMan: ERROR - %s sees %s, ManSeesMan, who is inactive/at base/dead",ExtMen[ptr->guynum].name,ExtMen[oppPtr->guynum].name);
+ PopMessage(tempstr);
+ #endif
+ */
+ return;
+ }
- // if we're somehow seeing a guy who is on the same team
- if (pSoldier->bTeam == pOpponent->bTeam)
- {
- /*
-#ifdef BETAVERSION
- sprintf(tempstr,"ManSeesMan: ERROR - on SAME TEAM. ptr->guynum = %d, oppPtr->guynum = %d",
- ptr->guynum,oppPtr->guynum);
- PopMessage(tempstr);
-#endif
- */
- return;
- }
+ // if we're somehow seeing a guy who is on the same team
+ if (pSoldier->bTeam == pOpponent->bTeam)
+ {
+ /*
+ #ifdef BETAVERSION
+ sprintf(tempstr,"ManSeesMan: ERROR - on SAME TEAM. ptr->guynum = %d, oppPtr->guynum = %d",
+ ptr->guynum,oppPtr->guynum);
+ PopMessage(tempstr);
+ #endif
+ */
+ return;
+ }
- // if we're seeing a guy we didn't see on our last chance to look for him
- if (pSoldier->bOppList[pOpponent->ubID] != SEEN_CURRENTLY)
- {
+ // if we're seeing a guy we didn't see on our last chance to look for him
+ if (pSoldier->bOppList[pOpponent->ubID] != SEEN_CURRENTLY)
+ {
if ( pOpponent->bTeam == gbPlayerNum )
{
if ( pSoldier->ubProfile != NO_PROFILE )
@@ -2048,95 +2048,95 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno,
AddToShouldBecomeHostileOrSayQuoteList( pSoldier->ubID );
fNotAddedToList = FALSE;
}
-
+
if ( fNotAddedToList )
{
switch( pSoldier->ubProfile )
{
- case CARMEN:
- if (pOpponent->ubProfile == SLAY ) // 64
- {
- // Carmen goes to war (against Slay)
- if ( pSoldier->bNeutral )
- {
- //SetSoldierNonNeutral( pSoldier );
- pSoldier->bAttitude = ATTACKSLAYONLY;
- TriggerNPCRecord( pSoldier->ubProfile, 28 );
- }
- /*
- if ( ! gTacticalStatus.uiFlags & INCOMBAT )
- {
- EnterCombatMode( pSoldier->bTeam );
- }
- */
- }
- break;
- case ELDIN:
+ case CARMEN:
+ if (pOpponent->ubProfile == SLAY ) // 64
+ {
+ // Carmen goes to war (against Slay)
if ( pSoldier->bNeutral )
{
- UINT8 ubRoom = 0;
- // if player is in behind the ropes of the museum display
- // or if alarm has gone off (status red)
- InARoom( pOpponent->sGridNo, &ubRoom );
+ //SetSoldierNonNeutral( pSoldier );
+ pSoldier->bAttitude = ATTACKSLAYONLY;
+ TriggerNPCRecord( pSoldier->ubProfile, 28 );
+ }
+ /*
+ if ( ! gTacticalStatus.uiFlags & INCOMBAT )
+ {
+ EnterCombatMode( pSoldier->bTeam );
+ }
+ */
+ }
+ break;
+ case ELDIN:
+ if ( pSoldier->bNeutral )
+ {
+ UINT8 ubRoom = 0;
+ // if player is in behind the ropes of the museum display
+ // or if alarm has gone off (status red)
+ InARoom( pOpponent->sGridNo, &ubRoom );
- if ( ( CheckFact( FACT_MUSEUM_OPEN, 0 ) == FALSE && ubRoom >= 22 && ubRoom <= 41 ) || CheckFact( FACT_MUSEUM_ALARM_WENT_OFF, 0 ) || ( ubRoom == 39 || ubRoom == 40 ) || ( FindObj( pOpponent, CHALICE ) != NO_SLOT ) )
- {
- SetFactTrue( FACT_MUSEUM_ALARM_WENT_OFF );
- AddToShouldBecomeHostileOrSayQuoteList( pSoldier->ubID );
- }
- }
- break;
- case JIM:
- case JACK:
- case OLAF:
- case RAY:
- case OLGA:
- case TYRONE:
- // change orders, reset action!
- if ( pSoldier->bOrders != SEEKENEMY )
+ if ( ( CheckFact( FACT_MUSEUM_OPEN, 0 ) == FALSE && ubRoom >= 22 && ubRoom <= 41 ) || CheckFact( FACT_MUSEUM_ALARM_WENT_OFF, 0 ) || ( ubRoom == 39 || ubRoom == 40 ) || ( FindObj( pOpponent, CHALICE ) != NO_SLOT ) )
{
- pSoldier->bOrders = SEEKENEMY;
- if ( pSoldier->bOppCnt == 0 )
- {
- // didn't see anyone before!
- CancelAIAction( pSoldier, TRUE );
- SetNewSituation( pSoldier );
- }
+ SetFactTrue( FACT_MUSEUM_ALARM_WENT_OFF );
+ AddToShouldBecomeHostileOrSayQuoteList( pSoldier->ubID );
}
- break;
- case ANGEL:
- if ( pOpponent->ubProfile == MARIA )
- {
- if ( CheckFact( FACT_MARIA_ESCORTED_AT_LEATHER_SHOP, MARIA ) == TRUE )
- {
- // she was rescued! yay!
- TriggerNPCRecord( ANGEL, 12 );
- }
- }
- else if ( ( CheckFact( FACT_ANGEL_LEFT_DEED, ANGEL ) == TRUE ) && ( CheckFact( FACT_ANGEL_MENTIONED_DEED, ANGEL ) == FALSE ) )
+ }
+ break;
+ case JIM:
+ case JACK:
+ case OLAF:
+ case RAY:
+ case OLGA:
+ case TYRONE:
+ // change orders, reset action!
+ if ( pSoldier->bOrders != SEEKENEMY )
+ {
+ pSoldier->bOrders = SEEKENEMY;
+ if ( pSoldier->bOppCnt == 0 )
{
+ // didn't see anyone before!
CancelAIAction( pSoldier, TRUE );
- pSoldier->sAbsoluteFinalDestination = NOWHERE;
- EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection );
- TriggerNPCRecord( ANGEL, 20 );
- // trigger Angel to walk off afterwards
- //TriggerNPCRecord( ANGEL, 24 );
+ SetNewSituation( pSoldier );
}
- break;
- //case QUEEN:
- case JOE:
- case ELLIOT:
- if ( ! ( gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE ) )
+ }
+ break;
+ case ANGEL:
+ if ( pOpponent->ubProfile == MARIA )
+ {
+ if ( CheckFact( FACT_MARIA_ESCORTED_AT_LEATHER_SHOP, MARIA ) == TRUE )
{
- if ( !AreInMeanwhile() )
- {
- TriggerNPCRecord( pSoldier->ubProfile, 4 );
- gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE;
- }
+ // she was rescued! yay!
+ TriggerNPCRecord( ANGEL, 12 );
}
- break;
- default:
- break;
+ }
+ else if ( ( CheckFact( FACT_ANGEL_LEFT_DEED, ANGEL ) == TRUE ) && ( CheckFact( FACT_ANGEL_MENTIONED_DEED, ANGEL ) == FALSE ) )
+ {
+ CancelAIAction( pSoldier, TRUE );
+ pSoldier->sAbsoluteFinalDestination = NOWHERE;
+ EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->ubDirection );
+ TriggerNPCRecord( ANGEL, 20 );
+ // trigger Angel to walk off afterwards
+ //TriggerNPCRecord( ANGEL, 24 );
+ }
+ break;
+ //case QUEEN:
+ case JOE:
+ case ELLIOT:
+ if ( ! ( gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE ) )
+ {
+ if ( !AreInMeanwhile() )
+ {
+ TriggerNPCRecord( pSoldier->ubProfile, 4 );
+ gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE;
+ }
+ }
+ break;
+ default:
+ break;
}
}
}
@@ -2146,21 +2146,21 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno,
{
/*
case MIKE:
- if ( gfPlayerTeamSawMike && !( gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE ) )
- {
- InitiateConversation( pSoldier, pOpponent, NPC_INITIAL_QUOTE, 0 );
- gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE;
- }
- break;
- */
- case IGGY:
- if ( ! ( gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE ) )
- {
- TriggerNPCRecord( pSoldier->ubProfile, 9 );
- gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE;
- gbPublicOpplist[ gbPlayerNum ][ pSoldier->ubID ] = HEARD_THIS_TURN;
- }
- break;
+ if ( gfPlayerTeamSawMike && !( gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE ) )
+ {
+ InitiateConversation( pSoldier, pOpponent, NPC_INITIAL_QUOTE, 0 );
+ gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE;
+ }
+ break;
+ */
+ case IGGY:
+ if ( ! ( gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 & PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE ) )
+ {
+ TriggerNPCRecord( pSoldier->ubProfile, 9 );
+ gMercProfiles[ pSoldier->ubProfile ].ubMiscFlags2 |= PROFILE_MISC_FLAG2_SAID_FIRSTSEEN_QUOTE;
+ gbPublicOpplist[ gbPlayerNum ][ pSoldier->ubID ] = HEARD_THIS_TURN;
+ }
+ break;
}
}
}
@@ -2206,7 +2206,7 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno,
else if ( pSoldier->ubCivilianGroup == HICKS_CIV_GROUP && CheckFact( FACT_HICKS_MARRIED_PLAYER_MERC, 0 ) == FALSE )
{
UINT32 uiTime;
- INT16 sX, sY;
+ INT16 sX, sY;
// if before 6:05 or after 22:00, make hostile and enter combat
uiTime = GetWorldMinutesInDay();
@@ -2218,99 +2218,99 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno,
{
EnterCombatMode( pSoldier->bTeam );
- LocateSoldier( pSoldier->ubID, TRUE );
- GetSoldierScreenPos( pSoldier, &sX, &sY );
- // begin quote
- BeginCivQuote( pSoldier, CIV_QUOTE_HICKS_SEE_US_AT_NIGHT, 0, sX, sY );
- }
+ LocateSoldier( pSoldier->ubID, TRUE );
+ GetSoldierScreenPos( pSoldier, &sX, &sY );
+ // begin quote
+ BeginCivQuote( pSoldier, CIV_QUOTE_HICKS_SEE_US_AT_NIGHT, 0, sX, sY );
+ }
}
}
}
}
}
- else if ( pSoldier->bTeam == gbPlayerNum )
- {
- if ( (pOpponent->ubProfile == MIKE) && ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) && !(pSoldier->usQuoteSaidExtFlags & SOLDIER_QUOTE_SAID_EXT_MIKE) )
- {
- if (gfMikeShouldSayHi == FALSE)
- {
- gfMikeShouldSayHi = TRUE;
- }
- TacticalCharacterDialogue( pSoldier, QUOTE_AIM_SEEN_MIKE );
- pSoldier->usQuoteSaidExtFlags |= SOLDIER_QUOTE_SAID_EXT_MIKE;
- }
- else if ( pOpponent->ubProfile == JOEY && gfPlayerTeamSawJoey == FALSE )
- {
- TacticalCharacterDialogue( pSoldier, QUOTE_SPOTTED_JOEY );
- gfPlayerTeamSawJoey = TRUE;
- }
- }
+ else if ( pSoldier->bTeam == gbPlayerNum )
+ {
+ if ( (pOpponent->ubProfile == MIKE) && ( pSoldier->ubWhatKindOfMercAmI == MERC_TYPE__AIM_MERC ) && !(pSoldier->usQuoteSaidExtFlags & SOLDIER_QUOTE_SAID_EXT_MIKE) )
+ {
+ if (gfMikeShouldSayHi == FALSE)
+ {
+ gfMikeShouldSayHi = TRUE;
+ }
+ TacticalCharacterDialogue( pSoldier, QUOTE_AIM_SEEN_MIKE );
+ pSoldier->usQuoteSaidExtFlags |= SOLDIER_QUOTE_SAID_EXT_MIKE;
+ }
+ else if ( pOpponent->ubProfile == JOEY && gfPlayerTeamSawJoey == FALSE )
+ {
+ TacticalCharacterDialogue( pSoldier, QUOTE_SPOTTED_JOEY );
+ gfPlayerTeamSawJoey = TRUE;
+ }
+ }
- // as soon as a bloodcat sees someone, it becomes hostile
- // this is safe to do here because we haven't made this new person someone we've seen yet
- // (so we are assured we won't count 'em twice for oppcnt purposes)
- if ( pSoldier->ubBodyType == BLOODCAT )
- {
- if ( pSoldier->bNeutral )
- {
+ // as soon as a bloodcat sees someone, it becomes hostile
+ // this is safe to do here because we haven't made this new person someone we've seen yet
+ // (so we are assured we won't count 'em twice for oppcnt purposes)
+ if ( pSoldier->ubBodyType == BLOODCAT )
+ {
+ if ( pSoldier->bNeutral )
+ {
+ MakeBloodcatsHostile();
+ /*
+ SetSoldierNonNeutral( pSoldier );
+ RecalculateOppCntsDueToNoLongerNeutral( pSoldier );
+ if ( ( gTacticalStatus.uiFlags & INCOMBAT ) )
+ {
+ CheckForPotentialAddToBattleIncrement( pSoldier );
+ }
+ */
+
+ PlayJA2Sample( BLOODCAT_ROAR, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN );
+ }
+ else
+ {
+ if ( pSoldier->bOppCnt == 0 )
+ {
+ if ( Random( 2 ) == 0 )
+ {
+ PlayJA2Sample( BLOODCAT_ROAR, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN );
+ }
+ }
+ }
+ }
+ else if ( pOpponent->ubBodyType == BLOODCAT && pOpponent->bNeutral)
+ {
MakeBloodcatsHostile();
/*
- SetSoldierNonNeutral( pSoldier );
- RecalculateOppCntsDueToNoLongerNeutral( pSoldier );
- if ( ( gTacticalStatus.uiFlags & INCOMBAT ) )
- {
- CheckForPotentialAddToBattleIncrement( pSoldier );
- }
- */
-
- PlayJA2Sample( BLOODCAT_ROAR, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN );
- }
- else
- {
- if ( pSoldier->bOppCnt == 0 )
- {
- if ( Random( 2 ) == 0 )
- {
- PlayJA2Sample( BLOODCAT_ROAR, RATE_11025, HIGHVOLUME, 1, MIDDLEPAN );
- }
- }
- }
- }
- else if ( pOpponent->ubBodyType == BLOODCAT && pOpponent->bNeutral)
- {
- MakeBloodcatsHostile();
- /*
- SetSoldierNonNeutral( pOpponent );
- RecalculateOppCntsDueToNoLongerNeutral( pOpponent );
- if ( ( gTacticalStatus.uiFlags & INCOMBAT ) )
- {
+ SetSoldierNonNeutral( pOpponent );
+ RecalculateOppCntsDueToNoLongerNeutral( pOpponent );
+ if ( ( gTacticalStatus.uiFlags & INCOMBAT ) )
+ {
CheckForPotentialAddToBattleIncrement( pOpponent );
+ }
+ */
}
- */
- }
- // if both of us are not neutral, AND
- // if this man is actually a true opponent (we're not on the same side)
- if (!CONSIDERED_NEUTRAL( pOpponent, pSoldier ) && !CONSIDERED_NEUTRAL( pSoldier, pOpponent ) && (pSoldier->bSide != pOpponent->bSide))
- {
- AddOneOpponent(pSoldier);
+ // if both of us are not neutral, AND
+ // if this man is actually a true opponent (we're not on the same side)
+ if (!CONSIDERED_NEUTRAL( pOpponent, pSoldier ) && !CONSIDERED_NEUTRAL( pSoldier, pOpponent ) && (pSoldier->bSide != pOpponent->bSide))
+ {
+ AddOneOpponent(pSoldier);
#ifdef TESTOPPLIST
- DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, String( "ManSeesMan: ID %d(%S) to ID %d NEW TO ME",pSoldier->ubID,pSoldier->name,pOpponent->ubID) );
+ DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, String( "ManSeesMan: ID %d(%S) to ID %d NEW TO ME",pSoldier->ubID,pSoldier->name,pOpponent->ubID) );
#endif
- // if we also haven't seen him earlier this turn
- if (pSoldier->bOppList[pOpponent->ubID] != SEEN_THIS_TURN)
- {
- fNewOpponent = TRUE;
- pSoldier->bNewOppCnt++; // increment looker's NEW opponent count
- //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Soldier %d sees soldier %d!", pSoldier->ubID, pOpponent->ubID );
+ // if we also haven't seen him earlier this turn
+ if (pSoldier->bOppList[pOpponent->ubID] != SEEN_THIS_TURN)
+ {
+ fNewOpponent = TRUE;
+ pSoldier->bNewOppCnt++; // increment looker's NEW opponent count
+ //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Soldier %d sees soldier %d!", pSoldier->ubID, pOpponent->ubID );
- //ExtMen[ptr->guynum].lastCaller = caller;
- //ExtMen[ptr->guynum].lastCaller2 = caller2;
+ //ExtMen[ptr->guynum].lastCaller = caller;
+ //ExtMen[ptr->guynum].lastCaller2 = caller2;
IncrementWatchedLoc( pSoldier->ubID, pOpponent->sGridNo, pOpponent->bLevel );
-
+
if ( pSoldier->bTeam == OUR_TEAM && pOpponent->bTeam == ENEMY_TEAM )
{
if ( CheckFact( FACT_FIRST_BATTLE_FOUGHT, 0 ) == FALSE )
@@ -2320,182 +2320,182 @@ void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno,
}
- }
+ }
else
{
SetWatchedLocAsUsed( pSoldier->ubID, pOpponent->sGridNo, pOpponent->bLevel );
}
- // we already know the soldier isn't SEEN_CURRENTLY,
- // now check if he is really "NEW" ie. not expected to be there
+ // we already know the soldier isn't SEEN_CURRENTLY,
+ // now check if he is really "NEW" ie. not expected to be there
- // if the looker hasn't seen this opponent at all earlier this turn, OR
- // if the opponent is not where the looker last thought him to be
- if ((pSoldier->bOppList[pOpponent->ubID] != SEEN_THIS_TURN) ||
- (gsLastKnownOppLoc[pSoldier->ubID][pOpponent->ubID] != sOppGridno))
- {
+ // if the looker hasn't seen this opponent at all earlier this turn, OR
+ // if the opponent is not where the looker last thought him to be
+ if ((pSoldier->bOppList[pOpponent->ubID] != SEEN_THIS_TURN) ||
+ (gsLastKnownOppLoc[pSoldier->ubID][pOpponent->ubID] != sOppGridno))
+ {
SetNewSituation( pSoldier ); // force the looker to re-evaluate
}
- else
- {
- // if we in a non-combat movement decision, presumably this is not
- // something we were quite expecting, so make a new decision. For
- // other (combat) movement decisions, we took his position into account
- // when we made it, so don't make us think again & slow things down.
- switch (pSoldier->bAction)
+ else
+ {
+ // if we in a non-combat movement decision, presumably this is not
+ // something we were quite expecting, so make a new decision. For
+ // other (combat) movement decisions, we took his position into account
+ // when we made it, so don't make us think again & slow things down.
+ switch (pSoldier->bAction)
{
- case AI_ACTION_RANDOM_PATROL:
- case AI_ACTION_SEEK_OPPONENT:
- case AI_ACTION_SEEK_FRIEND:
- case AI_ACTION_POINT_PATROL:
- case AI_ACTION_LEAVE_WATER_GAS:
- case AI_ACTION_SEEK_NOISE:
- SetNewSituation( pSoldier ); // force the looker to re-evaluate
- break;
+ case AI_ACTION_RANDOM_PATROL:
+ case AI_ACTION_SEEK_OPPONENT:
+ case AI_ACTION_SEEK_FRIEND:
+ case AI_ACTION_POINT_PATROL:
+ case AI_ACTION_LEAVE_WATER_GAS:
+ case AI_ACTION_SEEK_NOISE:
+ SetNewSituation( pSoldier ); // force the looker to re-evaluate
+ break;
}
- }
- }
+ }
+ }
- }
+ }
#ifdef TESTOPPLIST
-else
- DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, String( "ManSeesMan: ID %d(%S) to ID %d ALREADYSEENCURRENTLY",pSoldier->ubID,pSoldier->name,pOpponent->ubID) );
+ else
+ DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, String( "ManSeesMan: ID %d(%S) to ID %d ALREADYSEENCURRENTLY",pSoldier->ubID,pSoldier->name,pOpponent->ubID) );
#endif
//bOldOppValue = pSoldier->bOppList[ pOpponent->ubID ];
- // remember that the soldier is currently seen and his new location
- UpdatePersonal(pSoldier,pOpponent->ubID,SEEN_CURRENTLY,sOppGridno,bOppLevel);
+ // remember that the soldier is currently seen and his new location
+ UpdatePersonal(pSoldier,pOpponent->ubID,SEEN_CURRENTLY,sOppGridno,bOppLevel);
- if ( ubCaller2 == MANLOOKSFOROTHERTEAMS || ubCaller2 == OTHERTEAMSLOOKFORMAN || ubCaller2 == CALLER_UNKNOWN ) // unknown->hearing
- {
-
- if ( gubBestToMakeSightingSize != BEST_SIGHTING_ARRAY_SIZE_INCOMBAT && gTacticalStatus.bBoxingState == NOT_BOXING )
+ if ( ubCaller2 == MANLOOKSFOROTHERTEAMS || ubCaller2 == OTHERTEAMSLOOKFORMAN || ubCaller2 == CALLER_UNKNOWN ) // unknown->hearing
{
- if ( fNewOpponent )
+
+ if ( gubBestToMakeSightingSize != BEST_SIGHTING_ARRAY_SIZE_INCOMBAT && gTacticalStatus.bBoxingState == NOT_BOXING )
{
- if ( gTacticalStatus.uiFlags & INCOMBAT )
+ if ( fNewOpponent )
{
- // presumably a door opening... we do require standard interrupt conditions
- if (StandardInterruptConditionsMet(pSoldier,pOpponent->ubID,bOldOppList))
+ if ( gTacticalStatus.uiFlags & INCOMBAT )
+ {
+ // presumably a door opening... we do require standard interrupt conditions
+ if (StandardInterruptConditionsMet(pSoldier,pOpponent->ubID,bOldOppList))
+ {
+ ReevaluateBestSightingPosition( pSoldier, CalcInterruptDuelPts( pSoldier, pOpponent->ubID, TRUE ) );
+ }
+ }
+ // require the enemy not to be dying if we are the sighter; in other words,
+ // always add for AI guys, and always add for people with life >= OKLIFE
+ else if ( !(pSoldier->bTeam == gbPlayerNum && pOpponent->bLife < OKLIFE ) )
{
ReevaluateBestSightingPosition( pSoldier, CalcInterruptDuelPts( pSoldier, pOpponent->ubID, TRUE ) );
}
}
- // require the enemy not to be dying if we are the sighter; in other words,
- // always add for AI guys, and always add for people with life >= OKLIFE
- else if ( !(pSoldier->bTeam == gbPlayerNum && pOpponent->bLife < OKLIFE ) )
- {
- ReevaluateBestSightingPosition( pSoldier, CalcInterruptDuelPts( pSoldier, pOpponent->ubID, TRUE ) );
- }
}
}
- }
- // if this man has never seen this opponent before in this sector
- if (gbSeenOpponents[pSoldier->ubID][pOpponent->ubID] == FALSE)
- // remember that he is just seeing him now for the first time (-1)
- gbSeenOpponents[pSoldier->ubID][pOpponent->ubID] = -1;
- else
- // man is seeing an opponent AGAIN whom he has seen at least once before
- gbSeenOpponents[pSoldier->ubID][pOpponent->ubID] = TRUE;
+ // if this man has never seen this opponent before in this sector
+ if (gbSeenOpponents[pSoldier->ubID][pOpponent->ubID] == FALSE)
+ // remember that he is just seeing him now for the first time (-1)
+ gbSeenOpponents[pSoldier->ubID][pOpponent->ubID] = -1;
+ else
+ // man is seeing an opponent AGAIN whom he has seen at least once before
+ gbSeenOpponents[pSoldier->ubID][pOpponent->ubID] = TRUE;
- // if looker is on local team, and the enemy was invisible or "maybe"
- // visible just prior to this
+ // if looker is on local team, and the enemy was invisible or "maybe"
+ // visible just prior to this
#ifdef WE_SEE_WHAT_MILITIA_SEES_AND_VICE_VERSA
- if ( ( PTR_OURTEAM || (pSoldier->bTeam == MILITIA_TEAM) ) && (pOpponent->bVisible <= 0))
+ if ( ( PTR_OURTEAM || (pSoldier->bTeam == MILITIA_TEAM) ) && (pOpponent->bVisible <= 0))
#else
- if (PTR_OURTEAM && (pOpponent->bVisible <= 0))
+ if (PTR_OURTEAM && (pOpponent->bVisible <= 0))
#endif
- {
- // if opponent was truly invisible, not just turned off temporarily (FALSE)
- if (pOpponent->bVisible == -1)
- {
- // then locate to him and set his locator flag
- bDoLocate = TRUE;
-
- //rain
- if( gfLightningInProgress ) gfHaveSeenSomeone = TRUE;
- //end rain
- }
-
- // make opponent visible (to us)
- // must do this BEFORE the locate since it checks for visibility
- pOpponent->bVisible = TRUE;
-
- //ATE: Cancel any fading going on!
- // ATE: Added for fade in.....
- if ( pOpponent->fBeginFade == 1 || pOpponent->fBeginFade == 2 )
- {
- pOpponent->fBeginFade = FALSE;
-
- if ( pOpponent->bLevel > 0 && gpWorldLevelData[ pOpponent->sGridNo ].pRoofHead != NULL )
+ {
+ // if opponent was truly invisible, not just turned off temporarily (FALSE)
+ if (pOpponent->bVisible == -1)
{
- pOpponent->ubFadeLevel = gpWorldLevelData[ pOpponent->sGridNo ].pRoofHead->ubShadeLevel;
+ // then locate to him and set his locator flag
+ bDoLocate = TRUE;
+
+ //rain
+ if( gfLightningInProgress ) gfHaveSeenSomeone = TRUE;
+ //end rain
}
- else
+
+ // make opponent visible (to us)
+ // must do this BEFORE the locate since it checks for visibility
+ pOpponent->bVisible = TRUE;
+
+ //ATE: Cancel any fading going on!
+ // ATE: Added for fade in.....
+ if ( pOpponent->fBeginFade == 1 || pOpponent->fBeginFade == 2 )
{
- pOpponent->ubFadeLevel = gpWorldLevelData[ pOpponent->sGridNo ].pLandHead->ubShadeLevel;
+ pOpponent->fBeginFade = FALSE;
+
+ if ( pOpponent->bLevel > 0 && gpWorldLevelData[ pOpponent->sGridNo ].pRoofHead != NULL )
+ {
+ pOpponent->ubFadeLevel = gpWorldLevelData[ pOpponent->sGridNo ].pRoofHead->ubShadeLevel;
+ }
+ else
+ {
+ pOpponent->ubFadeLevel = gpWorldLevelData[ pOpponent->sGridNo ].pLandHead->ubShadeLevel;
+ }
+
+ // Set levelnode shade level....
+ if ( pOpponent->pLevelNode )
+ {
+ pOpponent->pLevelNode->ubShadeLevel = pOpponent->ubFadeLevel;
+ }
}
- // Set levelnode shade level....
- if ( pOpponent->pLevelNode )
- {
- pOpponent->pLevelNode->ubShadeLevel = pOpponent->ubFadeLevel;
- }
- }
-
#ifdef TESTOPPLIST
- DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, String("!!! ID %d (%S) MAKING %d VISIBLE",pSoldier->ubID,pSoldier->name,pOpponent->ubID) );
+ DebugMsg( TOPIC_JA2OPPLIST, DBG_LEVEL_3, String("!!! ID %d (%S) MAKING %d VISIBLE",pSoldier->ubID,pSoldier->name,pOpponent->ubID) );
#endif
- // update variable for STATUS screen
- //pOpponent->bLastKnownLife = pOpponent->life;
+ // update variable for STATUS screen
+ //pOpponent->bLastKnownLife = pOpponent->life;
- if (bDoLocate)
- {
+ if (bDoLocate)
+ {
- // Change his anim speed!
- SetSoldierAniSpeed( pOpponent );
+ // Change his anim speed!
+ SetSoldierAniSpeed( pOpponent );
- // if show enemies is ON, then we must have already revealed these roofs
- // and we're also following his movements, so don't bother sliding
- if (!gbShowEnemies)
- {
- //DoSoldierRoofs(pOpponent);
+ // if show enemies is ON, then we must have already revealed these roofs
+ // and we're also following his movements, so don't bother sliding
+ if (!gbShowEnemies)
+ {
+ //DoSoldierRoofs(pOpponent);
- // slide to the newly seen opponent, and if appropriate, start his locator
- //SlideToMe = oppPtr->guynum;
- }
+ // slide to the newly seen opponent, and if appropriate, start his locator
+ //SlideToMe = oppPtr->guynum;
+ }
- //LastOpponentLocatedTo = oppPtr->guynum;
+ //LastOpponentLocatedTo = oppPtr->guynum;
- /*
-#ifdef RECORDNET
- fprintf(NetDebugFile,"\tManSeesMan - LOCATE\n");
-#endif
- */
+ /*
+ #ifdef RECORDNET
+ fprintf(NetDebugFile,"\tManSeesMan - LOCATE\n");
+ #endif
+ */
- if ( gTacticalStatus.uiFlags & TURNBASED && ( ( gTacticalStatus.uiFlags & INCOMBAT ) | gTacticalStatus.fVirginSector ) )
- {
- if (!pOpponent->bNeutral && (pSoldier->bSide != pOpponent->bSide))
- {
+ if ( gTacticalStatus.uiFlags & TURNBASED && ( ( gTacticalStatus.uiFlags & INCOMBAT ) | gTacticalStatus.fVirginSector ) )
+ {
+ if (!pOpponent->bNeutral && (pSoldier->bSide != pOpponent->bSide))
+ {
//SlideTo(0,pOpponent->ubID, pSoldier->ubID, SETLOCATOR);
//rain
SlideTo(0,pOpponent->ubID, pSoldier->ubID, SETLOCATORFAST);
//end rain
- }
- }
- }
+ }
+ }
+ }
- }
+ }
else if (!PTR_OURTEAM)
{
- // ATE: Check stance, change to threatending
- ReevaluateEnemyStance( pSoldier, pSoldier->usAnimState );
+ // ATE: Check stance, change to threatending
+ ReevaluateEnemyStance( pSoldier, pSoldier->usAnimState );
}
}
diff --git a/TacticalAI/AIUtils.cpp b/TacticalAI/AIUtils.cpp
index 3c894437..66d5ce7b 100644
--- a/TacticalAI/AIUtils.cpp
+++ b/TacticalAI/AIUtils.cpp
@@ -1559,7 +1559,7 @@ INT16 ClosestReachableFriendInTrouble(SOLDIERTYPE *pSoldier, BOOLEAN * pfClimbin
// civilians don't really have any "friends", so they don't bother with this
if (PTR_CIVILIAN)
{
- return(sClosestFriend);
+ return(NOWHERE);
}
// consider every friend of this soldier (locations assumed to be known)
diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp
index e240bf02..ccbfd4a7 100644
--- a/TacticalAI/DecideAction.cpp
+++ b/TacticalAI/DecideAction.cpp
@@ -958,7 +958,8 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
//hide those suicidal militia on the roofs for better defensive positions
- if ( pSoldier->bTeam == MILITIA_TEAM )
+ // 0verhaul: If they are allowed at all to move
+ if ( pSoldier->bTeam == MILITIA_TEAM && iChance != 0)
iChance += 20;
// reduce chance for any injury, less likely to hop up if hurt
@@ -1636,7 +1637,11 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
if (!fUp)
DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Soldier %d, is climbing down",pSoldier->ubID) );
- if ( CanClimbFromHere ( pSoldier, fUp ) )
+ // 0verhaul: the Closest Noise call returns the location of a climb. So 1) it's not necessary to
+ // ask if we can climb from here. And 2) It's not necessary to look for the climb point. We already
+ // have it.
+// if ( CanClimbFromHere ( pSoldier, fUp ) )
+ if ( pSoldier->sGridNo == sNoiseGridNo)
{
if (IsActionAffordable(pSoldier) && pSoldier->bActionPoints >= ( AP_CLIMBROOF + MinAPsToAttack( pSoldier, sNoiseGridNo, ADDTURNCOST)))
{
@@ -1645,8 +1650,9 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
}
else
{
- pSoldier->usActionData = FindClosestClimbPoint(pSoldier, pSoldier->sGridNo , sNoiseGridNo , fUp );
- if ( pSoldier->usActionData != NOWHERE )
+// pSoldier->usActionData = FindClosestClimbPoint(pSoldier, pSoldier->sGridNo , sNoiseGridNo , fUp );
+ pSoldier->usActionData = sNoiseGridNo;
+ //if ( pSoldier->usActionData != NOWHERE )
{
return( AI_ACTION_MOVE_TO_CLIMB );
}
@@ -1776,7 +1782,10 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
if (!fUp)
DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Soldier %d is climbing down",pSoldier->ubID) );
- if ( CanClimbFromHere ( pSoldier, fUp ) )
+ // 0verhaul: Closest Friend call also returns the climb point if climbing is necessary. So don't
+ // climb the wrong building and don't search again
+ //if ( CanClimbFromHere ( pSoldier, fUp ) )
+ if (pSoldier->sGridNo == sClosestFriend)
{
if (IsActionAffordable(pSoldier) )
{
@@ -1785,8 +1794,9 @@ INT8 DecideActionYellow(SOLDIERTYPE *pSoldier)
}
else
{
- pSoldier->usActionData = FindClosestClimbPoint(pSoldier, pSoldier->sGridNo , sClosestFriend , fUp );
- if ( pSoldier->usActionData != NOWHERE )
+ //pSoldier->usActionData = FindClosestClimbPoint(pSoldier, pSoldier->sGridNo , sClosestFriend , fUp );
+ pSoldier->usActionData = sClosestFriend;
+ //if ( pSoldier->usActionData != NOWHERE )
{
return( AI_ACTION_MOVE_TO_CLIMB );
}
@@ -3023,7 +3033,10 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
if (!fUp)
DebugMsg ( TOPIC_JA2AI , DBG_LEVEL_3 , String("Soldier %d is climbing down",pSoldier->ubID) );
- if ( CanClimbFromHere ( pSoldier, fUp ) )
+ // 0verhaul: Yet another chance to climb the wrong building and otherwise waste CPU power.
+ // We already know the climb point we want, which may not be here even if climbing is possible.
+ //if ( CanClimbFromHere ( pSoldier, fUp ) )
+ if (pSoldier->sGridNo == sClosestFriend)
{
if (IsActionAffordable(pSoldier) && pSoldier->bActionPoints >= ( AP_CLIMBROOF + MinAPsToAttack( pSoldier, sClosestFriend, ADDTURNCOST)))
{
@@ -3032,10 +3045,11 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier, UINT8 ubUnconsciousOK)
}
else
{
- INT16 sClimbPoint = FindClosestClimbPoint(pSoldier, pSoldier->sGridNo , sClosestFriend , fUp );
- if ( sClimbPoint != NOWHERE )
+ pSoldier->usActionData = sClosestFriend;
+ //INT16 sClimbPoint = FindClosestClimbPoint(pSoldier, pSoldier->sGridNo , sClosestFriend , fUp );
+ //if ( sClimbPoint != NOWHERE )
{
- pSoldier->usActionData = sClimbPoint;
+ //pSoldier->usActionData = sClimbPoint;
return( AI_ACTION_MOVE_TO_CLIMB );
}
}
diff --git a/TacticalAI/Movement.cpp b/TacticalAI/Movement.cpp
index 757721be..f8e3638a 100644
--- a/TacticalAI/Movement.cpp
+++ b/TacticalAI/Movement.cpp
@@ -450,6 +450,7 @@ INT16 InternalGoAsFarAsPossibleTowards(SOLDIERTYPE *pSoldier, INT16 sDesGrid, IN
UINT8 ubDirection,ubDirsLeft,ubDirChecked[8],fFound = FALSE;
INT8 bAPsLeft, fPathFlags;
UINT8 ubRoomRequired = 0, ubTempRoom;
+ BOOLEAN fAllowDest = FALSE;
// 0verhaul: Make sure to clear the stored path since this always calculates a new one.
// This is needed if the path cannot be found.
@@ -618,6 +619,13 @@ INT16 InternalGoAsFarAsPossibleTowards(SOLDIERTYPE *pSoldier, INT16 sDesGrid, IN
sGoToGrid = pSoldier->sGridNo; // start back where soldier is standing now
sAPCost = 0; // initialize path cost counter
+ // 0verhaul: If the destination is within the patrol route, allow it. This is necessary to allow an errant soldier
+ // to return to his patrol route if flanking or other actions have pulled him beyond his allowed range from origin.
+ if (SpacesAway(sOrigin,sDesGrid) <= usMaxDist)
+ {
+ fAllowDest = TRUE;
+ }
+
// we'll only go as far along the plotted route as is within our
// permitted roaming range, and we'll stop as soon as we're down to <= 5 APs
@@ -647,7 +655,8 @@ INT16 InternalGoAsFarAsPossibleTowards(SOLDIERTYPE *pSoldier, INT16 sDesGrid, IN
}
// if this takes us beyond our permitted "roaming range"
- if (SpacesAway(sOrigin,sTempDest) > usMaxDist)
+ // but if it brings us closer, then allow it!
+ if (SpacesAway(sOrigin,sTempDest) > usMaxDist && !fAllowDest)
break; // quit here, sGoToGrid is where we are going
diff --git a/Utils/Text Utils.cpp b/Utils/Text Utils.cpp
index 4cfe1719..d7971938 100644
--- a/Utils/Text Utils.cpp
+++ b/Utils/Text Utils.cpp
@@ -13,6 +13,7 @@ BOOLEAN LoadItemInfo(UINT16 ubIndex, STR16 pNameString, STR16 pInfoString )
if (pNameString != NULL)
{
+#if 0
j = -1;
for (int i=0;i<80;i++)
{
@@ -189,10 +190,15 @@ BOOLEAN LoadItemInfo(UINT16 ubIndex, STR16 pNameString, STR16 pInfoString )
pNameString[i] ='\0';
}
}
+#else
+ wcsncpy( pNameString, Item[ubIndex].szLongItemName, 80);
+ pNameString[79] ='\0';
+#endif
}
if(pInfoString != NULL)
{
+#if 0
j = -1;
for (int i=0;i<400;i++)
{
@@ -379,6 +385,10 @@ BOOLEAN LoadItemInfo(UINT16 ubIndex, STR16 pNameString, STR16 pInfoString )
pInfoString[i] ='\0';
}
}
+#else
+ wcsncpy( pInfoString, Item[ubIndex].szItemDesc, 400);
+ pInfoString[399] ='\0';
+#endif
}
return(TRUE);
@@ -388,6 +398,7 @@ BOOLEAN LoadBRName(UINT16 ubIndex, STR16 pNameString )
{
if (pNameString != NULL)
{
+#if 0
int j = -1;
for (int i=0;i<80;i++)
@@ -564,6 +575,10 @@ BOOLEAN LoadBRName(UINT16 ubIndex, STR16 pNameString )
pNameString[i] ='\0';
}
}
+#else
+ wcsncpy( pNameString, Item[ubIndex].szBRName, 80);
+ pNameString[79] ='\0';
+#endif
}
return TRUE;
}
@@ -572,6 +587,7 @@ BOOLEAN LoadBRDesc(UINT16 ubIndex, STR16 pDescString )
{
if (pDescString != NULL)
{
+#if 0
int j = -1;
for (int i=0;i<400;i++)
@@ -749,6 +765,10 @@ BOOLEAN LoadBRDesc(UINT16 ubIndex, STR16 pDescString )
pDescString[i] ='\0';
}
}
+#else
+ wcsncpy( pDescString, Item[ubIndex].szBRDesc, 400);
+ pDescString[399] ='\0';
+#endif
}
return TRUE;
@@ -758,13 +778,14 @@ BOOLEAN LoadShortNameItemInfo(UINT16 ubIndex, STR16 pNameString )
{
if(pNameString != NULL)
{
+#if 0
int j = -1;
for (int i=0;i<80;i++)
{
j++;
- if ( i<(int)strlen(Item[ubIndex].szItemName))
+ if ( i<(int)wcslen(Item[ubIndex].szItemName))
{
pNameString[i] = Item[ubIndex].szItemName [j];
@@ -939,6 +960,10 @@ BOOLEAN LoadShortNameItemInfo(UINT16 ubIndex, STR16 pNameString )
pNameString[i] ='\0';
}
}
+#else
+ wcsncpy( pNameString, Item[ubIndex].szItemName, 80 );
+ pNameString[79] ='\0';
+#endif
}
return(TRUE);
diff --git a/Utils/XML_Items.cpp b/Utils/XML_Items.cpp
index 552e9980..86291b76 100644
--- a/Utils/XML_Items.cpp
+++ b/Utils/XML_Items.cpp
@@ -260,11 +260,11 @@ itemEndElementHandle(void *userData, const XML_Char *name)
pData->curArray[pData->curItem.uiIndex] = pData->curItem; //write the item into the table
else if ( sizeof(pData->curItem.szItemName)>0 && localizedTextOnly )
{
- strcpy(pData->curArray[pData->curItem.uiIndex].szItemName,pData->curItem.szItemName);
- strcpy(pData->curArray[pData->curItem.uiIndex].szLongItemName,pData->curItem.szLongItemName);
- strcpy(pData->curArray[pData->curItem.uiIndex].szBRName,pData->curItem.szBRName);
- strcpy(pData->curArray[pData->curItem.uiIndex].szItemDesc,pData->curItem.szItemDesc);
- strcpy(pData->curArray[pData->curItem.uiIndex].szBRDesc,pData->curItem.szBRDesc);
+ wcscpy(pData->curArray[pData->curItem.uiIndex].szItemName,pData->curItem.szItemName);
+ wcscpy(pData->curArray[pData->curItem.uiIndex].szLongItemName,pData->curItem.szLongItemName);
+ wcscpy(pData->curArray[pData->curItem.uiIndex].szBRName,pData->curItem.szBRName);
+ wcscpy(pData->curArray[pData->curItem.uiIndex].szItemDesc,pData->curItem.szItemDesc);
+ wcscpy(pData->curArray[pData->curItem.uiIndex].szBRDesc,pData->curItem.szBRDesc);
}
}
}
@@ -286,6 +286,7 @@ itemEndElementHandle(void *userData, const XML_Char *name)
// pData->curItem.szItemName[MAX_CHAR_DATA_LENGTH] = '\0';
//}
+#if 0
if(MAX_CHAR_DATA_LENGTH >= strlen(pData->szCharData))
strcpy(pData->curItem.szItemName,pData->szCharData);
else
@@ -300,12 +301,17 @@ itemEndElementHandle(void *userData, const XML_Char *name)
pData->curItem.szItemName[i] = temp;
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("itemEndElementHandle: itemname[%d] = %s, temp = %s",i,&pData->curItem.szItemName[i],&temp));
}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curItem.szItemName, sizeof(pData->curItem.szItemName)/sizeof(pData->curItem.szItemName[0]) );
+ pData->curItem.szItemName[sizeof(pData->curItem.szItemName)/sizeof(pData->curItem.szItemName[0]) - 1] = '\0';
+#endif
}
else if(strcmp(name, "szLongItemName") == 0)
{
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"itemEndElementHandle: longitemname");
pData->curElement = ELEMENT;
+#if 0
if(MAX_CHAR_DATA_LENGTH >= strlen(pData->szCharData))
{
strcpy(pData->curItem.szLongItemName,pData->szCharData);
@@ -331,12 +337,17 @@ itemEndElementHandle(void *userData, const XML_Char *name)
// strncpy(pData->curItem.szLongItemName,pData->szCharData,MAX_CHAR_DATA_LENGTH);
// pData->curItem.szLongItemName[MAX_CHAR_DATA_LENGTH] = '\0';
//}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curItem.szLongItemName, sizeof(pData->curItem.szLongItemName)/sizeof(pData->curItem.szLongItemName[0]) );
+ pData->curItem.szLongItemName[sizeof(pData->curItem.szLongItemName)/sizeof(pData->curItem.szLongItemName[0]) - 1] = '\0';
+#endif
}
else if(strcmp(name, "szItemDesc") == 0)
{
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"itemEndElementHandle: itemdesc");
pData->curElement = ELEMENT;
+#if 0
if(MAX_CHAR_DATA_LENGTH >= strlen(pData->szCharData))
strcpy(pData->curItem.szItemDesc,pData->szCharData);
else
@@ -351,12 +362,17 @@ itemEndElementHandle(void *userData, const XML_Char *name)
pData->curItem.szItemDesc[i] = temp;
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("itemEndElementHandle: itemdesc[%d] = %s, temp = %s",i,&pData->curItem.szItemDesc[i],&temp));
}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curItem.szItemDesc, sizeof(pData->curItem.szItemDesc)/sizeof(pData->curItem.szItemDesc[0]) );
+ pData->curItem.szItemDesc[sizeof(pData->curItem.szItemDesc)/sizeof(pData->curItem.szItemDesc[0]) - 1] = '\0';
+#endif
}
else if(strcmp(name, "szBRName") == 0)
{
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"itemEndElementHandle: brname");
pData->curElement = ELEMENT;
+#if 0
if(MAX_CHAR_DATA_LENGTH >= strlen(pData->szCharData))
strcpy(pData->curItem.szBRName,pData->szCharData);
else
@@ -371,12 +387,17 @@ itemEndElementHandle(void *userData, const XML_Char *name)
pData->curItem.szBRName[i] = temp;
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("itemEndElementHandle: BRname[%d] = %s, temp = %s",i,&pData->curItem.szBRName[i],&temp));
}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curItem.szBRName, sizeof(pData->curItem.szBRName)/sizeof(pData->curItem.szBRName[0]) );
+ pData->curItem.szBRName[sizeof(pData->curItem.szBRName)/sizeof(pData->curItem.szBRName[0]) - 1] = '\0';
+#endif
}
else if(strcmp(name, "szBRDesc") == 0)
{
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"itemEndElementHandle: brdesc");
pData->curElement = ELEMENT;
+#if 0
if(MAX_CHAR_DATA_LENGTH >= strlen(pData->szCharData))
strcpy(pData->curItem.szBRDesc,pData->szCharData);
else
@@ -391,6 +412,10 @@ itemEndElementHandle(void *userData, const XML_Char *name)
pData->curItem.szBRDesc[i] = temp;
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("itemEndElementHandle: BRdesc[%d] = %s, temp = %s",i,&pData->curItem.szBRDesc[i],&temp));
}
+#else
+ MultiByteToWideChar( CP_UTF8, 0, pData->szCharData, -1, pData->curItem.szBRDesc, sizeof(pData->curItem.szBRDesc)/sizeof(pData->curItem.szBRDesc[0]) );
+ pData->curItem.szBRDesc[sizeof(pData->curItem.szBRDesc)/sizeof(pData->curItem.szBRDesc[0]) - 1] = '\0';
+#endif
}
else if(strcmp(name, "usItemClass") == 0)
{