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) {