From d7ea36a73654f378e8a404810089ddac3225db36 Mon Sep 17 00:00:00 2001 From: MaddMugsy Date: Fri, 4 Aug 2006 05:21:14 +0000 Subject: [PATCH] -tested and fixed new camouflage types and ammo weights -fixed localization to read in XML file git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@400 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameVersion.cpp | 4 +- Init.cpp | 6 +- Tactical/Interface Items.cpp | 2 +- Tactical/Items.cpp | 122 ++++++++++++++++++++++++++++++----- Tactical/Items.h | 9 +++ Tactical/LOS.cpp | 28 ++++---- Tactical/Soldier Create.cpp | 8 +-- Tactical/XML.h | 2 +- Utils/XML_Items.cpp | 15 +++-- 9 files changed, 146 insertions(+), 50 deletions(-) diff --git a/GameVersion.cpp b/GameVersion.cpp index 33b49ef0..d04ea034 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -23,12 +23,12 @@ INT16 zVersionLabel[256] = { L"Beta v. 0.98" }; #else //RELEASE BUILD VERSION - INT16 zVersionLabel[256] = { L"Release v1.13.389" }; + INT16 zVersionLabel[256] = { L"Release v1.13.400" }; #endif -INT8 czVersionNumber[16] = { "Build 06.08.01" }; +INT8 czVersionNumber[16] = { "Build 06.08.03" }; INT16 zTrackingNumber[16] = { L"Z" }; diff --git a/Init.cpp b/Init.cpp index 4e82aa41..a68d423e 100644 --- a/Init.cpp +++ b/Init.cpp @@ -119,7 +119,7 @@ BOOLEAN LoadExternalGameplayData(STR directoryName) strcpy(fileName, directoryName); strcat(fileName, ITEMSFILENAME); DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - if(!ReadInItemStats(fileName)) + if(!ReadInItemStats(fileName,FALSE)) return FALSE; //Madd: Simple localization @@ -138,7 +138,7 @@ BOOLEAN LoadExternalGameplayData(STR directoryName) if ( FileExists(fileName) ) { DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - if(!ReadInItemStats(fileName)) + if(!ReadInItemStats(fileName,TRUE)) return FALSE; } #endif @@ -149,7 +149,7 @@ BOOLEAN LoadExternalGameplayData(STR directoryName) if ( FileExists(fileName) ) { DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LoadExternalGameplayData, fileName = %s", fileName)); - if(!ReadInItemStats(fileName)) + if(!ReadInItemStats(fileName,TRUE)) return FALSE; } #endif diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index 3f50690d..c16badc2 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -7543,7 +7543,7 @@ void GetHelpTextForItem( INT16 * pzStr, OBJECTTYPE *pObject, SOLDIERTYPE *pSoldi Armour[ Item[ usItem ].ubClassIndex ].ubProtection, //Protection (raw data) Armour[ Item[ usItem ].ubClassIndex ].ubProtection * sValue / 100, pInvPanelTitleStrings[ 3 ], //Camo string - Item[ usItem ].camobonus, //Camo bonus + GetCamoBonus(pObject)+GetUrbanCamoBonus(pObject)+GetDesertCamoBonus(pObject)+GetSnowCamoBonus(pObject), //Camo bonus gWeaponStatsDesc[ 12 ], //Weight string fWeight, //Weight GetWeightUnitString() //Weight units diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 890731b1..32c80336 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -2200,7 +2200,7 @@ UINT8 CalculateObjectWeight( OBJECTTYPE *pObject ) { if (pObject->ubShotsLeft[cnt] > 0 ) { - usWeight += (INT16)(pObject->ubShotsLeft[cnt]/Magazine[pItem->usItemClass].ubMagSize) * pItem->ubWeight; + usWeight += (INT16)(pObject->ubShotsLeft[cnt]/Magazine[pItem->ubClassIndex].ubMagSize) * pItem->ubWeight; } } } @@ -5685,9 +5685,6 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP //get total camo bonus for kit -- note that camo kits now require the camobonus tag to be set int itemCamo = Item[pObj->usItem].camobonus + Item[pObj->usItem].urbanCamobonus + Item[pObj->usItem].desertCamobonus + Item[pObj->usItem].snowCamobonus; - if ( itemCamo < 100 ) - usTotalKitPoints = (INT16)((itemCamo / 100) * usTotalKitPoints); - int totalCamo = pSoldier->bCamo + pSoldier->wornCamo + pSoldier->urbanCamo+pSoldier->wornUrbanCamo+pSoldier->desertCamo+pSoldier->wornDesertCamo+pSoldier->snowCamo+pSoldier->wornSnowCamo; if ((totalCamo) >= 100) { @@ -5701,15 +5698,15 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP bPointsToUse = __min( bPointsToUse, usTotalKitPoints ); //figure out proportions of each to be applied, one item can theoretically have more than one camouflage type this way - int urban = (int)((Item[pObj->usItem].urbanCamobonus / itemCamo) * bPointsToUse); - int jungle = (int)((Item[pObj->usItem].camobonus / itemCamo) * bPointsToUse); - int desert = (int)((Item[pObj->usItem].desertCamobonus / itemCamo) * bPointsToUse); - int snow = (int)((Item[pObj->usItem].snowCamobonus / itemCamo) * bPointsToUse); + int urban = (int)(Item[pObj->usItem].urbanCamobonus * bPointsToUse / itemCamo ); + int jungle = (int)(Item[pObj->usItem].camobonus * bPointsToUse / itemCamo ); + int desert = (int)(Item[pObj->usItem].desertCamobonus * bPointsToUse / itemCamo ); + int snow = (int)(Item[pObj->usItem].snowCamobonus * bPointsToUse / itemCamo ); - pSoldier->bCamo = __min( 100, pSoldier->bCamo + jungle * 2); - pSoldier->urbanCamo = __min( 100, pSoldier->urbanCamo + urban * 2); - pSoldier->desertCamo = __min( 100, pSoldier->desertCamo + desert * 2); - pSoldier->snowCamo = __min( 100, pSoldier->snowCamo + snow * 2); + pSoldier->bCamo = __min( 100, pSoldier->bCamo + jungle ); + pSoldier->urbanCamo = __min( 100, pSoldier->urbanCamo + urban ); + pSoldier->desertCamo = __min( 100, pSoldier->desertCamo + desert ); + pSoldier->snowCamo = __min( 100, pSoldier->snowCamo + snow ); UseKitPoints( pObj, bPointsToUse, pSoldier ); @@ -7168,6 +7165,45 @@ INT16 GetCamoBonus( OBJECTTYPE * pObj ) } return( bns ); } +INT16 GetUrbanCamoBonus( OBJECTTYPE * pObj ) +{ + INT8 bLoop; + INT16 bns=0; + + bns = (INT16) (Item[pObj->usItem].urbanCamobonus);// * (WEAPON_STATUS_MOD(pObj->bStatus[0]) / 100)) ; + + for (bLoop = 0; bLoop < MAX_ATTACHMENTS; bLoop++) + { + bns += (INT16) (Item[pObj->usAttachItem[bLoop]].urbanCamobonus);// * (WEAPON_STATUS_MOD(pObj->bAttachStatus[bLoop]) / 100)); + } + return( bns ); +} +INT16 GetDesertCamoBonus( OBJECTTYPE * pObj ) +{ + INT8 bLoop; + INT16 bns=0; + + bns = (INT16) (Item[pObj->usItem].desertCamobonus);// * (WEAPON_STATUS_MOD(pObj->bStatus[0]) / 100)) ; + + for (bLoop = 0; bLoop < MAX_ATTACHMENTS; bLoop++) + { + bns += (INT16) (Item[pObj->usAttachItem[bLoop]].desertCamobonus);// * (WEAPON_STATUS_MOD(pObj->bAttachStatus[bLoop]) / 100)); + } + return( bns ); +} +INT16 GetSnowCamoBonus( OBJECTTYPE * pObj ) +{ + INT8 bLoop; + INT16 bns=0; + + bns = (INT16) (Item[pObj->usItem].snowCamobonus);// * (WEAPON_STATUS_MOD(pObj->bStatus[0]) / 100)) ; + + for (bLoop = 0; bLoop < MAX_ATTACHMENTS; bLoop++) + { + bns += (INT16) (Item[pObj->usAttachItem[bLoop]].snowCamobonus);// * (WEAPON_STATUS_MOD(pObj->bAttachStatus[bLoop]) / 100)); + } + return( bns ); +} INT16 GetWornCamo( SOLDIERTYPE * pSoldier ) { INT8 bLoop; @@ -7181,6 +7217,45 @@ INT16 GetWornCamo( SOLDIERTYPE * pSoldier ) return __min( ttl, 100 ); } +INT16 GetWornUrbanCamo( SOLDIERTYPE * pSoldier ) +{ + INT8 bLoop; + INT16 ttl=0; + + for (bLoop = HELMETPOS; bLoop <= LEGPOS; bLoop++) + { + if ( pSoldier->inv[bLoop].usItem > NONE ) + ttl += GetUrbanCamoBonus(&pSoldier->inv[bLoop]); + } + + return __min( ttl, 100 ); +} +INT16 GetWornDesertCamo( SOLDIERTYPE * pSoldier ) +{ + INT8 bLoop; + INT16 ttl=0; + + for (bLoop = HELMETPOS; bLoop <= LEGPOS; bLoop++) + { + if ( pSoldier->inv[bLoop].usItem > NONE ) + ttl += GetDesertCamoBonus(&pSoldier->inv[bLoop]); + } + + return __min( ttl, 100 ); +} +INT16 GetWornSnowCamo( SOLDIERTYPE * pSoldier ) +{ + INT8 bLoop; + INT16 ttl=0; + + for (bLoop = HELMETPOS; bLoop <= LEGPOS; bLoop++) + { + if ( pSoldier->inv[bLoop].usItem > NONE ) + ttl += GetSnowCamoBonus(&pSoldier->inv[bLoop]); + } + + return __min( ttl, 100 ); +} void ApplyEquipmentBonuses(SOLDIERTYPE * pSoldier) { @@ -7189,12 +7264,25 @@ void ApplyEquipmentBonuses(SOLDIERTYPE * pSoldier) INT16 newCamo = GetWornCamo ( pSoldier ); INT16 oldCamo = pSoldier->wornCamo; if ( oldCamo != newCamo ) - { - pSoldier->wornCamo = newCamo; + pSoldier->wornCamo = (INT8)newCamo; - if ( newCamo > oldCamo && pSoldier->bTeam == OUR_TEAM ) - DoMercBattleSound( pSoldier, BATTLE_SOUND_COOL1 ); - } + newCamo = GetWornUrbanCamo ( pSoldier ); + oldCamo = pSoldier->wornUrbanCamo; + if ( oldCamo != newCamo ) + pSoldier->wornUrbanCamo = (INT8)newCamo; + + newCamo = GetWornDesertCamo ( pSoldier ); + oldCamo = pSoldier->wornDesertCamo; + if ( oldCamo != newCamo ) + pSoldier->wornDesertCamo = (INT8)newCamo; + + newCamo = GetWornSnowCamo ( pSoldier ); + oldCamo = pSoldier->wornSnowCamo; + if ( oldCamo != newCamo ) + pSoldier->wornSnowCamo = (INT8)newCamo; + + if ( newCamo > oldCamo && pSoldier->bTeam == OUR_TEAM ) + DoMercBattleSound( pSoldier, BATTLE_SOUND_COOL1 ); //Madd: do this regardless of camo. This will need to be called to do custom part colours and new overlays anyway. if ( pSoldier->bInSector) diff --git a/Tactical/Items.h b/Tactical/Items.h index 1979116b..8bf43ccd 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -294,5 +294,14 @@ INT8 FindNightGoggles( SOLDIERTYPE * pSoldier, INT16 bonusToBeat ); INT16 GetMinRangeForAimBonus( OBJECTTYPE * pObj ); UINT8 AllowedAimingLevels(SOLDIERTYPE * pSoldier); +INT16 GetWornUrbanCamo( SOLDIERTYPE * pSoldier ); +INT16 GetUrbanCamoBonus( OBJECTTYPE * pObj ); +INT16 GetWornDesertCamo( SOLDIERTYPE * pSoldier ); +INT16 GetDesertCamoBonus( OBJECTTYPE * pObj ); +INT16 GetWornSnowCamo( SOLDIERTYPE * pSoldier ); +INT16 GetSnowCamoBonus( OBJECTTYPE * pObj ); + + + #endif diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index 13774e83..f73d6ea0 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -1613,17 +1613,11 @@ INT32 SoldierToSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE } //get the total camouflage - float jungle = (float)(pEndSoldier->bCamo + pEndSoldier->wornCamo); - float urban = (float)(pEndSoldier->urbanCamo + pEndSoldier->wornUrbanCamo); - float desert = (float)(pEndSoldier->desertCamo + pEndSoldier->wornDesertCamo); - float snow = (float)(pEndSoldier->snowCamo + pEndSoldier->wornSnowCamo); - int totalCamo = (int)(jungle + urban + desert + snow); - - //get the percentage of each type - jungle = jungle / totalCamo; - urban = urban / totalCamo; - desert = desert / totalCamo; - snow = snow / totalCamo; + int jungle = max(1,min(100,pEndSoldier->bCamo + pEndSoldier->wornCamo)); + int urban = max(1,min(100,pEndSoldier->urbanCamo + pEndSoldier->wornUrbanCamo)); + int desert = max(1,min(100,pEndSoldier->desertCamo + pEndSoldier->wornDesertCamo)); + int snow = max(1,min(100,pEndSoldier->snowCamo + pEndSoldier->wornSnowCamo)); + int totalCamo = max(1,min(100,jungle + urban + desert + snow)); if ( ( totalCamo ) > 0 && !bAware ) { @@ -1647,23 +1641,23 @@ INT32 SoldierToSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE { case LOW_GRASS: case HIGH_GRASS: // jungle camo bonus - iTemp -= iTemp * (int)(jungle * bEffectiveCamo / 3) / 100; + iTemp -= iTemp * (jungle * bEffectiveCamo / 3 / totalCamo) / 100; break; case FLAT_FLOOR: // flat floor = indoors case PAVED_ROAD: // urban camo bonus - iTemp -= iTemp * (int)(urban * bEffectiveCamo / 3) / 100; + iTemp -= iTemp * (urban * bEffectiveCamo / 3 / totalCamo) / 100; break; case DIRT_ROAD: // desert camo bonus case TRAIN_TRACKS: - iTemp -= iTemp * (int)(desert * bEffectiveCamo / 3) / 100; + iTemp -= iTemp * (desert * bEffectiveCamo / 3 / totalCamo) / 100; break; //case ??? : // snow camo bonus - // iTemp -= iTemp * (snow * bEffectiveCamo / 3) / 100; + // iTemp -= iTemp * (snow * bEffectiveCamo / 3 / totalCamo) / 100; // break; case FLAT_GROUND: //in this case both desert and jungle can work: - iTemp -= iTemp * (int)(jungle * bEffectiveCamo / 3) / 100; - iTemp -= iTemp * (int)(desert * bEffectiveCamo / 3) / 100; + iTemp -= iTemp * (jungle * bEffectiveCamo / 3 / totalCamo) / 100; + iTemp -= iTemp * (desert * bEffectiveCamo / 3 / totalCamo) / 100; break; default: break; diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp index 7dfea26d..f40c9463 100644 --- a/Tactical/Soldier Create.cpp +++ b/Tactical/Soldier Create.cpp @@ -457,10 +457,10 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 * if ( i != NO_SLOT && Random( 5 ) < SoldierDifficultyLevel( &Soldier )) { // start camouflaged - Soldier.bCamo = Item[i].camobonus; - Soldier.urbanCamo = Item[i].urbanCamobonus; - Soldier.desertCamo = Item[i].desertCamobonus; - Soldier.snowCamo = Item[i].snowCamobonus; + Soldier.bCamo = (INT8)Item[i].camobonus; + Soldier.urbanCamo = (INT8)Item[i].urbanCamobonus; + Soldier.desertCamo = (INT8)Item[i].desertCamobonus; + Soldier.snowCamo = (INT8)Item[i].snowCamobonus; } } } diff --git a/Tactical/XML.h b/Tactical/XML.h index a19ecfb6..53a3d339 100644 --- a/Tactical/XML.h +++ b/Tactical/XML.h @@ -67,7 +67,7 @@ typedef PARSE_STAGE; #define EXPLOSIONDATAFILENAME "ExplosionData.xml" #define CITYTABLEFILENAME "Cities.xml" -extern BOOLEAN ReadInItemStats(STR fileName); +extern BOOLEAN ReadInItemStats(STR fileName, BOOLEAN localizedVersion); extern BOOLEAN WriteItemStats(); extern BOOLEAN ReadInAttachmentStats(STR fileName); diff --git a/Utils/XML_Items.cpp b/Utils/XML_Items.cpp index 68d3de02..20e513ee 100644 --- a/Utils/XML_Items.cpp +++ b/Utils/XML_Items.cpp @@ -58,6 +58,8 @@ struct } typedef itemParseData; +BOOLEAN localizedTextOnly; + static void XMLCALL itemStartElementHandle(void *userData, const char *name, const char **atts) { @@ -70,7 +72,8 @@ itemStartElementHandle(void *userData, const char *name, const char **atts) { pData->curElement = ELEMENT_LIST; - memset(pData->curArray,0,sizeof(INVTYPE)*pData->maxArraySize); + if ( !localizedTextOnly ) + memset(pData->curArray,0,sizeof(INVTYPE)*pData->maxArraySize); pData->maxReadDepth++; //we are not skipping this element } @@ -78,7 +81,8 @@ itemStartElementHandle(void *userData, const char *name, const char **atts) { pData->curElement = ELEMENT; - memset(&pData->curItem,0,sizeof(INVTYPE)); + if ( !localizedTextOnly ) + memset(&pData->curItem,0,sizeof(INVTYPE)); pData->maxReadDepth++; //we are not skipping this element } @@ -250,9 +254,8 @@ itemEndElementHandle(void *userData, const char *name) { if ( pData->curItem.usItemClass != 0 ) pData->curArray[pData->curItem.uiIndex] = pData->curItem; //write the item into the table - else if ( sizeof(pData->curItem.szItemName)>0 ) + else if ( sizeof(pData->curItem.szItemName)>0 && localizedTextOnly ) { - //Madd: needs testing 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); @@ -946,7 +949,7 @@ itemEndElementHandle(void *userData, const char *name) -BOOLEAN ReadInItemStats(STR fileName) +BOOLEAN ReadInItemStats(STR fileName, BOOLEAN localizedVersion ) { HWFILE hFile; UINT32 uiBytesRead; @@ -955,6 +958,8 @@ BOOLEAN ReadInItemStats(STR fileName) XML_Parser parser = XML_ParserCreate(NULL); itemParseData pData; + + localizedTextOnly = localizedVersion; DebugMsg(TOPIC_JA2, DBG_LEVEL_3, "Loading Items.xml" );