diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index a59fe30d..9d91d690 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -8535,15 +8535,15 @@ void CreateDestroyMouseRegionsForTrainingMenu( void ) if( ( fShowTrainingMenu == TRUE ) && ( fCreated == FALSE ) ) { - - if( ( fShowTrainingMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) - { - SetBoxPosition( ghTrainingBox, TrainPosition ); - } - - HandleShadingOfLinesForTrainingMenu( ); - - CheckAndUpdateTacticalAssignmentPopUpPositions( ); + // Moa: removed, this missplaces popups when screensize>3. + //if( ( fShowTrainingMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) + //{ + //SetBoxPosition( ghTrainingBox, TrainPosition ); + //} + // + //HandleShadingOfLinesForTrainingMenu( ); + // + //CheckAndUpdateTacticalAssignmentPopUpPositions( ); // grab height of font iFontHeight = GetLineSpace( ghTrainingBox ) + GetFontHeight( GetBoxFont( ghTrainingBox ) ); @@ -8637,14 +8637,14 @@ void CreateDestroyMouseRegionsForAttributeMenu( void ) if( ( fShowAttributeMenu == TRUE ) && ( fCreated == FALSE ) ) { - - if( ( fShowAssignmentMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) - { - SetBoxPosition( ghAssignmentBox, AssignmentPosition ); - } - - HandleShadingOfLinesForAttributeMenus( ); - CheckAndUpdateTacticalAssignmentPopUpPositions( ); + // Moa: removed, this missplaces popups when screensize>3. + //if( ( fShowAssignmentMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) + //{ + //SetBoxPosition( ghAssignmentBox, AssignmentPosition ); + //} + + //HandleShadingOfLinesForAttributeMenus( ); + //CheckAndUpdateTacticalAssignmentPopUpPositions( ); // grab height of font iFontHeight = GetLineSpace( ghAttributeBox ) + GetFontHeight( GetBoxFont( ghAttributeBox ) ); @@ -11166,6 +11166,9 @@ BOOLEAN CreateDestroyAssignmentPopUpBoxes( void ) RemoveBox(ghFacilityBox); ghFacilityBox = -1; + RemoveBox(ghFacilityAssignmentBox); + ghFacilityAssignmentBox = -1; + fCreated = FALSE; gfIgnoreScrolling = FALSE; RebuildCurrentSquad( ); @@ -16874,13 +16877,14 @@ void CreateDestroyMouseRegionsForFacilityAssignmentMenu( void ) if( ( fShowFacilityAssignmentMenu == TRUE ) && ( fCreated == FALSE ) ) { - if( ( fShowAssignmentMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) - { - SetBoxPosition( ghAssignmentBox, AssignmentPosition ); - } + // Moa: removed, this missplaces popups when screensize>3. + //if( ( fShowAssignmentMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) + //{ + // SetBoxPosition( ghAssignmentBox, AssignmentPosition ); + //} //HandleShadingOfLinesForFacilityAssignmentMenus( ); - CheckAndUpdateTacticalAssignmentPopUpPositions( ); + //CheckAndUpdateTacticalAssignmentPopUpPositions( ); // grab height of font iFontHeight = GetLineSpace( ghFacilityAssignmentBox ) + GetFontHeight( GetBoxFont( ghFacilityAssignmentBox ) ); diff --git a/Strategic/Map Screen Interface Bottom.cpp b/Strategic/Map Screen Interface Bottom.cpp index 716e7fe9..adf40fb0 100644 --- a/Strategic/Map Screen Interface Bottom.cpp +++ b/Strategic/Map Screen Interface Bottom.cpp @@ -1542,17 +1542,17 @@ void CreateDestroyMouseRegionMasksForTimeCompressionButtons( void ) if( ( fDisabled ) && ( fCreated == FALSE ) ) { // mask over compress more button - MSYS_DefineRegion( &gTimeCompressionMask[ 0 ], xResOffset + (xResSize - 112), (SCREEN_HEIGHT - 24), xResOffset + (xResSize - 112) + 13, (SCREEN_HEIGHT - 24) + 14, MSYS_PRIORITY_HIGHEST - 1, + MSYS_DefineRegion( &gTimeCompressionMask[ 0 ], xResOffset + (xResSize - 112), (SCREEN_HEIGHT - 24), xResOffset + (xResSize - 112) + 13, (SCREEN_HEIGHT - 24) + 16, MSYS_PRIORITY_HIGHEST - 1, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, CompressMaskClickCallback ); // mask over compress less button - MSYS_DefineRegion( &gTimeCompressionMask[ 1 ], xResOffset + (xResSize - 174), (SCREEN_HEIGHT - 24), xResOffset + (xResSize - 174) + 13, (SCREEN_HEIGHT - 24) + 14, MSYS_PRIORITY_HIGHEST - 1, + MSYS_DefineRegion( &gTimeCompressionMask[ 1 ], xResOffset + (xResSize - 174), (SCREEN_HEIGHT - 24), xResOffset + (xResSize - 174) + 13, (SCREEN_HEIGHT - 24) + 16, MSYS_PRIORITY_HIGHEST - 1, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, CompressMaskClickCallback ); // mask over pause game button MSYS_DefineRegion( &gTimeCompressionMask[ 2 ], xResOffset + (xResSize - 153), (SCREEN_HEIGHT - 24), xResOffset + (xResSize - 153) + 118, (SCREEN_HEIGHT - 13), MSYS_PRIORITY_HIGHEST - 1, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, CompressMaskClickCallback ); - + RemoveMouseRegionForPauseOfClock(); fCreated = TRUE; } else if( ( fDisabled == FALSE ) && ( fCreated ) ) @@ -1561,6 +1561,7 @@ void CreateDestroyMouseRegionMasksForTimeCompressionButtons( void ) MSYS_RemoveRegion( &gTimeCompressionMask[ 0 ] ); MSYS_RemoveRegion( &gTimeCompressionMask[ 1 ] ); MSYS_RemoveRegion( &gTimeCompressionMask[ 2 ] ); + CreateMouseRegionForPauseOfClock( INTERFACE_CLOCK_X, INTERFACE_CLOCK_Y ); fCreated = FALSE; } } diff --git a/Strategic/strategicmap.cpp b/Strategic/strategicmap.cpp index 1f7929bc..ccd8557e 100644 --- a/Strategic/strategicmap.cpp +++ b/Strategic/strategicmap.cpp @@ -3311,8 +3311,8 @@ void UpdateMercInSector( SOLDIERTYPE *pSoldier, INT16 sSectorX, INT16 sSectorY, return; break; default: - // TODO.WANNE: Hardcoded grid number - pSoldier->sInsertionGridNo = 12880;//dnl!!! + //Moa: Hardcoded grid number set to CenterGrid + pSoldier->sInsertionGridNo = ( WORLD_ROWS * WORLD_COLS + WORLD_COLS ) / 2;//12880 DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String( "Improper insertion code %d given to UpdateMercsInSector", pSoldier->ubStrategicInsertionCode ) ); break; } @@ -3352,7 +3352,7 @@ void UpdateMercInSector( SOLDIERTYPE *pSoldier, INT16 sSectorX, INT16 sSectorY, else { ScreenMsg( FONT_RED, MSG_BETAVERSION, L"Sector %s has NO entrypoints -- using precise center of map for %s.", szSector, pSoldier->name ); - pSoldier->sInsertionGridNo = 12880;//dnl!!! + pSoldier->sInsertionGridNo = ( WORLD_ROWS * WORLD_COLS + WORLD_COLS ) / 2;//12880 AddSoldierToSector( pSoldier->ubID ); return; } @@ -3380,7 +3380,7 @@ void UpdateMercInSector( SOLDIERTYPE *pSoldier, INT16 sSectorX, INT16 sSectorY, if ( pSoldier->sInsertionGridNo == -1 ) { DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String( "Insertion gridno for direction %d not added to map sector %d %d", pSoldier->ubStrategicInsertionCode, sSectorX, sSectorY ) ); - pSoldier->sInsertionGridNo = 12880;//dnl!!! + pSoldier->sInsertionGridNo = ( WORLD_ROWS * WORLD_COLS + WORLD_COLS ) / 2;//12880 } AddSoldierToSector( pSoldier->ubID ); diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp index da7e6bfc..09f69d67 100644 --- a/Tactical/Interface Enhanced.cpp +++ b/Tactical/Interface Enhanced.cpp @@ -1455,7 +1455,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr CHAR16 pStr[1000]; ///////////////// PRIMARY DATA - ICONS - for (cnt = 0; cnt < 12; cnt++) + for (cnt = 0; cnt < 13; cnt++) { MSYS_DefineRegion( &gUDBFasthelpRegions[ iRegionsCreated ], (INT16)(gItemDescGenRegions[cnt][0].sLeft), @@ -3712,7 +3712,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr { if ( Item[gpItemDescObject->usItem].usItemClass & (IC_GUN|IC_LAUNCHER) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? ///////////////////// SINGLE SHOT TEMPERATURE if (cnt >= sFirstLine && cnt < sLastLine) { @@ -3779,7 +3779,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr } else if ( Item[gpItemDescObject->usItem].barrel == TRUE ) // for barrel items { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? ///////////////////// COOLDOWN FACTOR if (cnt >= sFirstLine && cnt < sLastLine) { @@ -3793,7 +3793,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr // other stuff: various overheat modificators if ( ( Item[gpItemDescObject->usItem].overheatTemperatureModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatCooldownModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatJamThresholdModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatDamageThresholdModificator != 0.0 ) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? ///////////////////// TEMPERATURE MODIFICATOR if ( Item[gpItemDescObject->usItem].overheatTemperatureModificator != 0.0 ) { @@ -3848,7 +3848,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr // only draw if item is poisoned in any way if ( Item[gpItemDescObject->usItem].bPoisonPercentage != 0 || ( (Item[gpItemDescObject->usItem].usItemClass & IC_GUN) && AmmoTypes[Magazine[ Item[ gpItemDescObject->usItem ].ubClassIndex].ubAmmoType].poisonPercentage != 0 ) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? if (cnt >= sFirstLine && cnt < sLastLine) { swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 56 ], szUDBAdvStatsExplanationsTooltipText[ 56 ]); @@ -3863,7 +3863,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr ///////////////////// DIRT MODIFICATOR if ( Item[gpItemDescObject->usItem].usItemClass & (IC_GUN|IC_LAUNCHER) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? if (cnt >= sFirstLine && cnt < sLastLine ) { swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 57 ], szUDBAdvStatsExplanationsTooltipText[ 57 ]); @@ -3874,23 +3874,96 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr } } + if ( gGameOptions.fFoodSystem && Item[gpItemDescObject->usItem].foodtype > 0 ) + { + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? + + ////////////////////// POISONED FOOD + if ( (*gpItemDescObject)[0]->data.bTemperature != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + {//reusing Poison text here + swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 58 ], szUDBAdvStatsExplanationsTooltipText[ 58 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] ); + } + cnt++; + } + UINT32 foodtype = Item[gpItemDescObject->usItem].foodtype; + ////////////////////// FOOD POINTS + if ( Food[foodtype].bFoodPoints != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 59 ], szUDBAdvStatsExplanationsTooltipText[ 59 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] ); + } + cnt++; + } + /////////////////////// DRINK POINTS + if ( Food[foodtype].bDrinkPoints != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 60 ], szUDBAdvStatsExplanationsTooltipText[ 60 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] ); + } + cnt++; + } + ////////////////////// PORTION SIZE + if ( Food[foodtype].ubPortionSize != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 61 ], szUDBAdvStatsExplanationsTooltipText[ 61 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] ); + } + cnt++; + } + ////////////////////// MORALE MODIFIER + if ( Food[foodtype].bMoraleMod != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 62 ], szUDBAdvStatsExplanationsTooltipText[ 62 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] ); + } + cnt++; + } + ////////////////////// DECAY RATE + if ( Food[foodtype].usDecayRate != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + swprintf( pStr, L"%s%s", szUDBAdvStatsTooltipText[ 63 ], szUDBAdvStatsExplanationsTooltipText[ 63 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (cnt-sFirstLine) ] ); + } + cnt++; + } + + } // Moa: moved additional Indexes to the end to avoid doublication. We have allready secured a free slot for this line so no cnt++ here! if (fDrawGenIndexes) { ///////////////////// INDEXES (Prop., 0, +/-, =) if (fDrawGenIndexes >= sFirstLine && fDrawGenIndexes < sLastLine) { - SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (fDrawGenIndexes-sFirstLine) ]), gzUDBGenIndexTooltipText[ 0 ]); - MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (fDrawGenIndexes-sFirstLine) ] ); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + (fDrawGenIndexes-sFirstLine-1) ]), gzUDBGenIndexTooltipText[ 0 ]); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + (fDrawGenIndexes-sFirstLine-1) ] ); //Moa: start bugfix (changed gItemDescAdvIndexRegions[] to gItemDescAdvRegions[] and adding correct region) for (cnt2 = 1; cnt2 < 4; cnt2++) { MSYS_DefineRegion( &gUDBFasthelpRegions[ iRegionsCreated ], - (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][cnt2].sLeft), - (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][cnt2].sTop), - (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][cnt2].sRight), - (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][cnt2].sBottom), + (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine-1][cnt2].sLeft), + (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine-1][cnt2].sTop), + (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine-1][cnt2].sRight), + (INT16)(gItemDescAdvRegions[fDrawGenIndexes-sFirstLine-1][cnt2].sBottom), MSYS_PRIORITY_HIGHEST, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, ItemDescCallback ); MSYS_AddRegion( &gUDBFasthelpRegions[ iRegionsCreated ]); @@ -5113,7 +5186,7 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject ) { if( Item[gpItemDescObject->usItem].usItemClass & (IC_GUN|IC_LAUNCHER) || Item[gpItemDescObject->usItem].barrel == TRUE || ( Item[gpItemDescObject->usItem].overheatTemperatureModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatCooldownModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatJamThresholdModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatDamageThresholdModificator != 0.0 ) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? } } @@ -5209,7 +5282,7 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject ) // only draw if item is poisoned in any way if ( Item[gpItemDescObject->usItem].bPoisonPercentage != 0 || ( (Item[gpItemDescObject->usItem].usItemClass & IC_GUN) && AmmoTypes[Magazine[ Item[ gpItemDescObject->usItem ].ubClassIndex].ubAmmoType].poisonPercentage != 0 ) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // new index line here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? if (cnt >= sFirstLine && cnt < sLastLine) { BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoWH40KIcon, 0, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); @@ -5229,6 +5302,69 @@ void DrawAdvancedStats( OBJECTTYPE * gpItemDescObject ) cnt++; } } + + if ( gGameOptions.fFoodSystem ) + { + if ( Item[gpItemDescObject->usItem].foodtype > 0 ) + { + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // new index line here? + + if ( (*gpItemDescObject)[0]->data.bTemperature != 0 ) + { + //////////////////// POISONED FOOD + if (cnt >= sFirstLine && cnt < sLastLine) + {// using damage icon here (skull) + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 10, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY,VO_BLT_SRCTRANSPARENCY, NULL ); + } + cnt++; + } + if ( Food[Item[gpItemDescObject->usItem].foodtype].bFoodPoints > 0 ) + { + //////////////////// FOOD POINTS + if (cnt >= sFirstLine && cnt < sLastLine) + { + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 57, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); + } + cnt++; + } + if ( Food[Item[gpItemDescObject->usItem].foodtype].bDrinkPoints > 0 ) + { + //////////////////// DRINK POINTS + if (cnt >= sFirstLine && cnt < sLastLine) + { + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 58, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); + } + cnt++; + } + if ( Food[Item[gpItemDescObject->usItem].foodtype].ubPortionSize > 0 ) + { + //////////////////// PORTION SIZE + if (cnt >= sFirstLine && cnt < sLastLine) + { + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 59, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); + } + cnt++; + } + if ( Food[Item[gpItemDescObject->usItem].foodtype].bMoraleMod > 0 ) + { + //////////////////// MORALE MODIFICATOR + if (cnt >= sFirstLine && cnt < sLastLine) + { + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 60, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); + } + cnt++; + } + if ( Food[Item[gpItemDescObject->usItem].foodtype].usDecayRate > 0 ) + { + //////////////////// DECAY RATE + if (cnt >= sFirstLine && cnt < sLastLine) + { + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoAdvancedIcon, 61, gItemDescAdvRegions[cnt-sFirstLine][0].sLeft + sOffsetX, gItemDescAdvRegions[cnt-sFirstLine][0].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); + } + cnt++; + } + } + } } void DrawMiscStats( OBJECTTYPE * gpItemDescObject ) @@ -10970,7 +11106,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) { if ( Item[gpItemDescObject->usItem].usItemClass & (IC_GUN|IC_LAUNCHER) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // insert Indexes here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // insert Indexes here? ///////////////////// SINGLE SHOT TEMPERATURE if (cnt >= sFirstLine && cnt < sLastLine) { @@ -11187,7 +11323,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) } else if ( Item[gpItemDescObject->usItem].barrel == TRUE ) // display for barrel items { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // insert Indexes here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // insert Indexes here? ///////////////////// COOLDOWN FACTOR if (cnt >= sFirstLine && cnt < sLastLine) { @@ -11243,7 +11379,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) } else if ( ( Item[gpItemDescObject->usItem].overheatTemperatureModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatCooldownModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatJamThresholdModificator != 0.0 ) || ( Item[gpItemDescObject->usItem].overheatDamageThresholdModificator != 0.0 ) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // insert Indexes here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // insert Indexes here? ///////////////////// TEMPERATURE MODIFIER if ( ( Item[gpItemDescObject->usItem].overheatTemperatureModificator != 0.0 ) && cnt >= sFirstLine && cnt < sLastLine) @@ -11475,7 +11611,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) // only draw if item is poisoned in any way if ( iModifier[0] != 0 || iModifier[1] != 0 || iModifier[2] != 0 ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; // insert Indexes here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; // insert Indexes here? if (cnt >= sFirstLine && cnt < sLastLine) { // Set Y coordinates @@ -11523,7 +11659,7 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) { if ( Item[gpItemDescObject->usItem].usItemClass & (IC_GUN|IC_LAUNCHER) ) { - if (!fDrawGenIndexes) fDrawGenIndexes = cnt++; //insert Indexes here? + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; //insert Indexes here? ///////////////////// DIRT MODIFICATOR if (cnt >= sFirstLine && cnt < sLastLine) { @@ -11578,6 +11714,204 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) cnt++; } } + ////////////////////// FOOD + if ( gGameOptions.fFoodSystem ) + { + UINT32 fFoodtype = Item[gpItemDescObject->usItem].foodtype; + if ( fFoodtype > 0 ) + { + if (!fDrawGenIndexes) fDrawGenIndexes = ++cnt; //insert Indexes here? + //////////////////////////// POISONED FOOD + iFloatModifier[0] = (*gpItemDescObject)[0]->data.bTemperature;//temperature is reused for poisoned food + if ( iFloatModifier[0] != 0.0f && OVERHEATING_MAX_TEMPERATURE > 0.0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + iFloatModifier[0] = min( 1.0f, iFloatModifier[0] / OVERHEATING_MAX_TEMPERATURE );//FoodCondition: fresh=1.0 poisoned=0.0 + sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop; + sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; + iModifier[0] = 0; + //FOOD_BAD_THRESHOLD + if ( iFloatModifier[0] < 0.5f ) + { + iModifier[1] = (INT16)( max( Food[fFoodtype].bFoodPoints, Food[fFoodtype].bDrinkPoints ) * (1.0 - iFloatModifier[0]) * 0.025 );//Poison formula coppied from food.cpp + iModifier[1] = min( iModifier[1], gGameExternalOptions.usFoodMaxPoisoning ); + } + else + iModifier[1] = 0; + iModifier[2] = iModifier[1]; + for ( UINT8 cnt2 = 0; cnt2 < 3; cnt2++ ) + { + sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft; + sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft; + if ( iModifier[cnt2] > 0 ) + { + SetFontForeground( ITEMDESC_FONTNEGATIVE ); + swprintf( pStr, L"%d", iModifier[cnt2] ); + } + else if ( iModifier[cnt2] < 0 ) + { + SetFontForeground( ITEMDESC_FONTPOSITIVE ); + swprintf( pStr, L"%d", iModifier[cnt2] ); + } + else + { + SetFontForeground( 5 ); + swprintf( pStr, L"--", iModifier[cnt2] ); + } + FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY ); + mprintf( usX, usY, pStr ); + } + } + cnt++; + } + //////////////////////////// FOOD POINTS + iFloatModifier[0] = ( (FLOAT) Food[fFoodtype].bFoodPoints )/1000; + sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop; + sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; + if ( iFloatModifier[0] != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + iFloatModifier[2] = ( ( (FLOAT)(*gpItemDescObject)[0]->data.objectStatus )/100 ) * iFloatModifier[0]; + iFloatModifier[1] = iFloatModifier[2] - iFloatModifier[0]; + for ( UINT8 cnt2 = 0; cnt2 < 3; cnt2++ ) + { + sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft; + sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft; + if ( iFloatModifier[cnt2] > 0 ) + { + SetFontForeground( ITEMDESC_FONTPOSITIVE ); + swprintf( pStr, L"%4.3f", iFloatModifier[cnt2] ); + } + else if ( iFloatModifier[cnt2] < 0 ) + { + SetFontForeground( ITEMDESC_FONTNEGATIVE ); + swprintf( pStr, L"%4.3f", iFloatModifier[cnt2] ); + } + else + { + SetFontForeground( 5 ); + swprintf( pStr, L"--", iFloatModifier[cnt2] ); + } + FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY ); + mprintf( usX, usY, pStr ); + } + } + cnt++; + } + ////////////////////////// DRINK POINTS + iFloatModifier[0] = ( (FLOAT) Food[fFoodtype].bDrinkPoints )/1000; + sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop; + sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; + if ( iFloatModifier[0] != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + iFloatModifier[2] = ( ( (FLOAT)(*gpItemDescObject)[0]->data.objectStatus )/100 ) * iFloatModifier[0]; + iFloatModifier[1] = iFloatModifier[2] - iFloatModifier[0]; + for ( UINT8 cnt2 = 0; cnt2 < 3; cnt2++ ) + { + sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft; + sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft; + if ( iFloatModifier[cnt2] > 0 ) + { + SetFontForeground( ITEMDESC_FONTPOSITIVE ); + swprintf( pStr, L"%3.2f", iFloatModifier[cnt2] ); + } + else if ( iFloatModifier[cnt2] < 0 ) + { + SetFontForeground( ITEMDESC_FONTNEGATIVE ); + swprintf( pStr, L"%3.2f", iFloatModifier[cnt2] ); + } + else + { + SetFontForeground( 5 ); + swprintf( pStr, L"--", iFloatModifier[cnt2] ); + } + FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY ); + mprintf( usX, usY, pStr ); + } + } + cnt++; + } + ////////////////////////// PORTION SIZE + iModifier[0] = Food[fFoodtype].ubPortionSize; + sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop; + sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; + if ( iModifier[0] != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + if ( iModifier[0] <= 20 ) + SetFontForeground( ITEMDESC_FONTPOSITIVE ); + else + SetFontForeground( ITEMDESC_FONTNEGATIVE ); + for ( UINT8 cnt2 = 0; cnt2 < 3; cnt2++ ) + { + sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft; + sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft; + swprintf( pStr, L"%d", iModifier[0] ); + wcscat( pStr, L"%" ); + FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY ); +#ifdef CHINESE + wcscat( pStr, ChineseSpecString1 ); +#else + wcscat( pStr, L"%" ); +#endif + mprintf( usX, usY, pStr ); + } + } + cnt++; + } + ////////////////////////// MORALE MODIFIER + iModifier[0] = Food[fFoodtype].bMoraleMod; + sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop; + sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; + if ( iModifier[0] != 0 ) + { + if (cnt >= sFirstLine && cnt < sLastLine) + { + if ( iModifier[0] > 0 ) + SetFontForeground( ITEMDESC_FONTPOSITIVE ); + else + SetFontForeground( ITEMDESC_FONTNEGATIVE ); + for ( UINT8 cnt2 = 0; cnt2 < 3; cnt2++ ) + { + sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft; + sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft; + swprintf( pStr, L"%d", iModifier[0] ); + FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY ); + mprintf( usX, usY, pStr ); + } + } + cnt++; + } + ////////////////////////// DECAY RATE + iFloatModifier[0] = Food[fFoodtype].usDecayRate; + sTop = gItemDescAdvRegions[cnt-sFirstLine][1].sTop; + sHeight = gItemDescAdvRegions[cnt-sFirstLine][1].sBottom - sTop; + if ( iFloatModifier[0] != 0 ) + { + if ( cnt >= sFirstLine && cnt < sLastLine ) + { + if ( iFloatModifier[0] > 1.0f ) + SetFontForeground( ITEMDESC_FONTNEGATIVE ); + else + SetFontForeground( ITEMDESC_FONTPOSITIVE ); + for ( UINT8 cnt2 = 0; cnt2 < 3; cnt2++ ) + { + sLeft = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sLeft; + sWidth = gItemDescAdvRegions[cnt-sFirstLine][cnt2+1].sRight - sLeft; + swprintf( pStr, L"%4.2f", iFloatModifier[0] ); + FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY ); + mprintf( usX, usY, pStr ); + } + } + cnt++; + } + }//foodtype > 0 + }//gGameOptions.fFoodSystem //Moa: moved indexes here to avoid doublicates of the index ///////////////////// ADDITIONAL GENERAL INDEX (if required: cnt was allready increased) @@ -11588,8 +11922,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) SetFontForeground( FONT_MCOLOR_WHITE ); // Set Y coordinates - sTop = gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][1].sTop; - sHeight = gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][1].sBottom - sTop; + sTop = gItemDescAdvRegions[ fDrawGenIndexes-sFirstLine-1 ][1].sTop; + sHeight = gItemDescAdvRegions[ fDrawGenIndexes-sFirstLine-1 ][1].sBottom - sTop; // Repeatedly draw each index: four separate column headers per index. for (UINT8 i = 0; i < 4; i++) @@ -11597,8 +11931,8 @@ void DrawAdvancedValues( OBJECTTYPE *gpItemDescObject ) // Select "PROPERTY", "0", "+" or "=" as appropriate. swprintf(pStr, L"%s", gzItemDescGenIndexes[ i ]); - sLeft = gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][i].sLeft; - sWidth = gItemDescAdvRegions[fDrawGenIndexes-sFirstLine][i].sRight - sLeft; + sLeft = gItemDescAdvRegions[fDrawGenIndexes-sFirstLine-1][i].sLeft; + sWidth = gItemDescAdvRegions[fDrawGenIndexes-sFirstLine-1][i].sRight - sLeft; FindFontCenterCoordinates( sLeft, sTop, sWidth, sHeight, pStr, BLOCKFONT2, &usX, &usY); diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index efd8465a..33e1e1ee 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -3914,13 +3914,13 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec { FLOAT condition = (*pObject)[0]->data.bTemperature / OVERHEATING_MAX_TEMPERATURE; - UINT32 red = (UINT32) ( 127 ); - UINT32 green = (UINT32) ( 54 + 201 * ( min(1.0f, condition ) ) ); + UINT32 red = (UINT32) ( 126 + 127 * ( 1.0f - min(1.0f, condition) ) ); //127 + UINT32 green = (UINT32) ( 54 + 200 * min(1.0f, condition ) ); //54 + 201 * ( min(1.0f, condition ) ) UINT32 blue = 0; UINT16 colour = Get16BPPColor( FROMRGB( red, green, blue ) ); - DrawItemUIBarEx( pObject, DRAW_ITEM_TEMPERATURE, sX, sY + sHeight-1, ITEMDESC_ITEM_STATUS_WIDTH, sHeight-1, colour, colour, TRUE, guiSAVEBUFFER); + DrawItemUIBarEx( pObject, DRAW_ITEM_TEMPERATURE, sX, sY + sHeight-1, ITEMDESC_ITEM_STATUS_WIDTH, (INT16)((sHeight-1)*(1-condition)), colour, colour, TRUE, guiSAVEBUFFER); } } @@ -6594,30 +6594,36 @@ void RenderItemDescriptionBox( ) } else*/ { - for (UINT16 x = 0; x < MAXITEMS; x++) - { - if (Transform[x].usItem == -1) - { - break; - } + //Moa: had to solve the performance issue which was caused partially here by creating multiple videoObjects. + // Mousregions for the Transformation looks fine (line5036 in internalInitItemDescriptionBox), however still took awhile to show the DB for Items. + // So I set up a breakpoint in the loop and figured that -1 is not a good test: Transform[] was initialized with -1 which translates to 65535 for UINT16. + // Testing again for -1 is interpreted as (UINT16)65535 == (int)-1 which is false. instead either use MAXITEMS or 0 or test for (UINT16)-1. I decided for the latter. + // Because 0 is also the first uiIndex in Item[]. After the change the DB loads in Debugversion in just under a second on my PC, which is still not acceptible, but in + // Release the delay is not noticed anymore. - // Flugente: ok, this looks complicated. We allow a transformation option to pop up if: - // - there is a transformation - // - we are in the game or map screen, it is a single item, and - // - the item is a grenade - // - the item is a bomb and has a detonator or remote detonator attached - if ( Transform[x].usItem == gpItemDescObject->usItem ) + // Flugente: ok, this looks complicated. We allow a transformation option to pop up if: + // - there is a transformation + // - we are in the game or map screen, it is a single item, and + // - the item is a grenade + // - the item is a bomb and has a detonator or remote detonator attached + BOOLEAN renderTransformIcon = FALSE; + if ( ( (guiCurrentScreen == GAME_SCREEN || guiCurrentScreen == MAP_SCREEN) && gpItemDescObject->ubNumberOfObjects == 1 ) && + ( (Item[gpItemDescObject->usItem].usItemClass == IC_GRENADE) || + ( (Item[gpItemDescObject->usItem].usItemClass == IC_BOMB) && HasAttachmentOfClass( gpItemDescObject, (AC_DETONATOR | AC_REMOTEDET)) ) ) ) + renderTransformIcon = TRUE; + if (!renderTransformIcon) + for (UINT16 x = 0; x < MAXITEMS; x++) { - BltVideoObjectFromIndex( guiSAVEBUFFER, guiTransformIconGraphic, 0, (ITEMDESC_ITEM_X+ITEMDESC_ITEM_WIDTH)-13, (ITEMDESC_ITEM_Y+ITEMDESC_ITEM_HEIGHT)-17, VO_BLT_SRCTRANSPARENCY, NULL ); - } - else if ( (guiCurrentScreen == GAME_SCREEN || guiCurrentScreen == MAP_SCREEN) && gpItemDescObject->ubNumberOfObjects == 1 ) - { - if ( (Item[gpItemDescObject->usItem].usItemClass == IC_GRENADE) || ( (Item[gpItemDescObject->usItem].usItemClass == IC_BOMB) && HasAttachmentOfClass( gpItemDescObject, (AC_DETONATOR | AC_REMOTEDET)) ) ) + if (Transform[x].usItem == (UINT16)-1) + break; + else if ( Transform[x].usItem == gpItemDescObject->usItem ) { - BltVideoObjectFromIndex( guiSAVEBUFFER, guiTransformIconGraphic, 0, (ITEMDESC_ITEM_X+ITEMDESC_ITEM_WIDTH)-13, (ITEMDESC_ITEM_Y+ITEMDESC_ITEM_HEIGHT)-17, VO_BLT_SRCTRANSPARENCY, NULL ); + renderTransformIcon = TRUE; + break; } } - } + if (renderTransformIcon) + BltVideoObjectFromIndex( guiSAVEBUFFER, guiTransformIconGraphic, 0, (ITEMDESC_ITEM_X+ITEMDESC_ITEM_WIDTH)-13, (ITEMDESC_ITEM_Y+ITEMDESC_ITEM_HEIGHT)-17, VO_BLT_SRCTRANSPARENCY, NULL ); } // Display status @@ -6813,7 +6819,7 @@ void RenderItemDescriptionBox( ) mprintf( ITEMDESC_NAME_X, ITEMDESC_NAME_Y, L"%s", gzItemName ); #endif - // Render extra data on name bar for weapons and launchers (Caliber, Fingerprints) + // Render extra data on name bar for weapons and launchers (Caliber, Fingerprints, Coolness) if ( ITEM_PROS_AND_CONS( gpItemDescObject->usItem ) ) { SetFontForeground( FONT_BLACK ); @@ -12877,7 +12883,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason ) { for (INT32 x = 0; x < MAXITEMS; x++) { - if (Transform[x].usItem == -1) + if (Transform[x].usItem == (UINT16)-1) { break; } @@ -12943,7 +12949,7 @@ void ItemDescTransformRegionCallback( MOUSE_REGION *pRegion, INT32 reason ) INT32 iNumOptions = 0; for (INT32 x = 0; x < MAXITEMS; x++) { - if (Transform[x].usItem == -1) + if (Transform[x].usItem == (UINT16)-1) { break; } diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index c5df4300..df09cdc3 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -3090,6 +3090,9 @@ UINT16 OBJECTTYPE::GetWeightOfObjectInStack(unsigned int index) weight += Item[ (*this)[index]->data.gun.usGunAmmoItem ].ubWeight; } } + // account for partially eaten food + if ( gGameOptions.fFoodSystem && Item[usItem].foodtype > 0 ) + weight *= (FLOAT)((*this)[index])->data.objectStatus/100.0f; } else if ( pItem->usItemClass == IC_AMMO && gGameExternalOptions.fAmmoDynamicWeight == TRUE )//Pulmu: added weight allowance for ammo not being full { diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index d7535df5..ba794dce 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -8667,7 +8667,7 @@ UINT32 CalcCounterForceAccuracy(SOLDIERTYPE *pShooter, OBJECTTYPE *pWeapon, UINT gbForceWeaponNotReady = true; INT16 sDistVisNoScope = pShooter->GetMaxDistanceVisible(pShooter->sTargetGridNo, pShooter->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE; gbForceWeaponNotReady = false; - FLOAT scopeRangeMod = (float)sDistVis / (float)sDistVisNoScope; + FLOAT scopeRangeMod = ( sDistVisNoScope ? (float)sDistVis / (float)sDistVisNoScope : 1.0f ); INT32 iSightRange = 0; if (ubTargetID != NOBODY) diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index 663e3ac0..c3601b28 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -503,8 +503,36 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 u } } // Check for backpack - if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSoldier ) != ITEM_NOT_FOUND ) - sPoints += APBPConstants[AP_MODIFIER_PACK]; + // Moa: apply penalty for heavily packed backpack (wobble penalty) + if ( UsingNewInventorySystem() == true ) + { + INT8 bSlot= FindBackpackOnSoldier( pSoldier ); + if ( bSlot != ITEM_NOT_FOUND ) + { + UINT16 usBPPenalty = APBPConstants[ AP_MODIFIER_PACK ]; + if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back + { + OBJECTTYPE * pObj = &( pSoldier->inv[ BPACKPOCKPOS ] ); + UINT16 usBackPackWeight = CalculateObjectWeight( pObj ); + // CalculateObjectWeight checks for active LBE gear. Unfortunatly our backpack is not active since we are carying it. + // Sounds not intuitive at all, active means the LBE caries items (marked with blue *), but when put on the LBE adittional slots of our soldier + // are activated where something can be carried. So we have to add the weights of those slots as well. + std::vector vbLBESlots; + GetLBESlots( BPACKPOCKPOS, vbLBESlots ); + for ( UINT8 i = 0; i < vbLBESlots.size() ; i++ ) + { + pObj = &( pSoldier->inv[ vbLBESlots[ i ] ] ); + usBackPackWeight += CalculateObjectWeight( pObj ); + } + usBPPenalty = min( ( usBackPackWeight / 50 ), usBPPenalty ); //1 AP penalty for each 5kg of weight up to the penalty defined by AP_MODIFIER_PACK (default = 4) + } + else //Backpack caried not on back (maybe somewhere inside another LBE or in Hand?) + { + //apply full penalty + } + sPoints += usBPPenalty; + } + } /////////////////////////////////////////////////////////////////////////////////////////////////////////// } @@ -1883,6 +1911,8 @@ INT16 BaseAPsToShootOrStab( INT16 bAPs, INT16 bAimSkill, OBJECTTYPE * pObj, SOLD // rof = 15.46, we return an AP cost of exactly 23. So this will allow for fine control over "default" AP costs. // Calculate default top & bottom of the magic "aiming" formula! + // Formula: AP to Shoot% = (maxAP_soldier) / ((MAXAIM*0.5 + aimSkill_soldier*0.5) * ROF_PER4TURNS / 4) + // AP to Shoot = (AP to Shoot%) * MAXAP // get this man's maximum possible action points (ignoring carryovers) // the 2 times is here only to allow rounding off using integer math later diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 5205890d..43ad7c8a 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -18623,7 +18623,7 @@ void HandleSystemNewAISituation( SOLDIERTYPE *pSoldier, BOOLEAN fResetABC ) // silversurfer: bugfix for endless dying mercs on roof edges // if we delete their pending animation here they will just turn into the proper direction for the fall (in TurnSoldier( void ) ) // and stand there forever afterwards in "dying" state, so let this guy fall off the roof first! - if ( !pSoldier->usPendingAnimation == FALLOFF && !pSoldier->usPendingAnimation == FALLFORWARD_ROOF ) + if ( pSoldier->usPendingAnimation != FALLOFF && pSoldier->usPendingAnimation != FALLFORWARD_ROOF ) pSoldier->usPendingAnimation = NO_PENDING_ANIMATION; pSoldier->usPendingAnimation2 = NO_PENDING_ANIMATION; pSoldier->flags.bTurningFromPronePosition = FALSE; diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 342cda3c..407fca1a 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -4951,7 +4951,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi // bool highPowerScope = false; // INT16 sTotalAutofirePenalty = 0; bool fCantSeeTarget = false; - FLOAT scopeRangeMod; + FLOAT scopeRangeMod = 0.0f; // make sure the guy's actually got a weapon in his hand! pInHand = &(pSoldier->inv[pSoldier->ubAttackingHand]); @@ -5011,8 +5011,13 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi gbForceWeaponNotReady = false; // Flugente: blind soldiers have sDistVisNoScope = 0... - scopeRangeMod = (float)sDistVis / (float)max(1.0f, sDistVisNoScope); // percentage DistVis has been enhanced due to an attached scope - iSightRange = (INT32)(iSightRange / scopeRangeMod); + if ( sDistVisNoScope ) + scopeRangeMod = (float)sDistVis / (float)sDistVisNoScope; // percentage DistVis has been enhanced due to an attached scope + + iSightRange = 0; + if ( scopeRangeMod ) + iSightRange = (INT32)(iSightRange / scopeRangeMod); + if(iSightRange > 0){ //CHRISL: The LOS system, which determines whether to display an enemy unit, does not factor in the AimBonus tag during it's calculations. So having // the CTH system use that tag to adjust iSightRange for AimBonus applied from armor might not be the best option. Especially as it can sometimes @@ -5103,7 +5108,7 @@ if (gGameExternalOptions.fUseNewCTHCalculation) fBaseChance = __max( fBaseChance, 0 ); fBaseChance = __min( fBaseChance, 100 ); - + fFinalChance = fBaseChance; ////////////////////////////////////////////////////////////////////////////////// // Second step: Calculate bonuses from aiming // @@ -6492,7 +6497,7 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime, UINT16 iBulletsLeft, iTracersFired = 0, iBulletsPerTracer, iBulletsSinceLastTracer=0, iRoundsFiredPreviously; INT8 bBandaged, maxClickBonus = 10, AIM_PENALTY_PER_TARGET_SHOCK; UINT8 ubAdjAimPos, ubTargetID, bLightLevel, ubCoweringDivisor, ubAutoPenaltySinceLastTracer=0; - FLOAT maxBonus, aimTimeBonus, scopeRangeMod, iAimBonus; + FLOAT maxBonus, aimTimeBonus, scopeRangeMod = 0.0f, iAimBonus; bool fCantSeeTarget = false, fCoverObscured = false; DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("CalcChanceToHitGun")); @@ -6548,7 +6553,11 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime, gbForceWeaponNotReady = true; sDistVisNoScope = pSoldier->GetMaxDistanceVisible(sGridNo, pSoldier->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE; gbForceWeaponNotReady = false; - scopeRangeMod = (float)sDistVis / (float)sDistVisNoScope; // percentage DistVis has been enhanced due to an attached scope + + // Flugente: blind soldiers have sDistVisNoScope = 0... + if ( sDistVisNoScope ) + scopeRangeMod = (float)sDistVis / (float)sDistVisNoScope; // percentage DistVis has been enhanced due to an attached scope + iMaxNormRange = MaxNormalDistanceVisible() * CELL_X_SIZE; if ( Item[ usItemUsed ].usItemClass == IC_GUN || Item[ usItemUsed ].usItemClass == IC_LAUNCHER) iMaxRange = GunRange( pInHand, pSoldier ); // SANDRO - added argument @@ -6571,7 +6580,11 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime, ///////////////////////////////////////////////////////////////////////////////////// // Modify Sight and Physical Range - iSightRange = (INT32)(iSightRange / scopeRangeMod); + + iSightRange = 0; + if ( scopeRangeMod ) + iSightRange = (INT32)(iSightRange / scopeRangeMod); + if(iSightRange > 0 && !pSoldier->IsValidAlternativeFireMode( ubAimTime, sGridNo ) ){ //CHRISL: The LOS system, which determines whether to display an enemy unit, does not factor in the AimBonus tag during it's calculations. So having // the CTH system use that tag to adjust iSightRange for AimBonus applied from armor might not be the best option. Especially as it can sometimes diff --git a/Tactical/XML_ItemAdjustments.cpp b/Tactical/XML_ItemAdjustments.cpp index 34c6e501..7eef606c 100644 --- a/Tactical/XML_ItemAdjustments.cpp +++ b/Tactical/XML_ItemAdjustments.cpp @@ -40,7 +40,7 @@ transformStartElementHandle(void *userData, const XML_Char *name, const XML_Char // Reset all transformation indexes to -1, indicating they are "Not Taken" for (UINT16 x = 0; x < MAXITEMS; x++) { - Transform[x].usItem = -1; + Transform[x].usItem = (UINT16)-1; } pData->maxReadDepth++; //we are not skipping this element diff --git a/Utils/Text.h b/Utils/Text.h index d83aa05a..9b4c5e64 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -647,8 +647,8 @@ extern STR16 szUDBGenExplosiveStatsTooltipText[ 22 ]; extern STR16 szUDBGenExplosiveStatsExplanationsTooltipText[ 22 ]; extern STR16 szUDBGenSecondaryStatsTooltipText[ 32 ]; // Flugente Food System: 26 -> 28 external feeding: 28->30 JMich_SkillsModifiers: 31 for Defusal kit - covert item: 31->32 extern STR16 szUDBGenSecondaryStatsExplanationsTooltipText[ 32 ]; // Flugente Food System: 26 -> 28 external feeding: 28->30 JMich_SkillsModifiers: 31 for Defusal kit - covert item: 31->32 -extern STR16 szUDBAdvStatsTooltipText[ 58 ]; // Flugente Overheating Weapons: 48->56 poison: 56->57 dirt: 57->58 -extern STR16 szUDBAdvStatsExplanationsTooltipText[ 58 ]; // Flugente Overheating Weapons: 48->56 poison: 56->57 dirt: 57->58 +extern STR16 szUDBAdvStatsTooltipText[ 64 ]; // Flugente Overheating Weapons: 48->56 poison: 56->57 dirt: 57->58 food:58->64 +extern STR16 szUDBAdvStatsExplanationsTooltipText[ 64 ]; // Flugente Overheating Weapons: 48->56 poison: 56->57 dirt: 57->58 food:58->64 extern STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[ 52 ]; // Flugente Overheating Weapons: 48->52 // Headrock: End Externs diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 911a73f8..e623183d 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -7255,6 +7255,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|损|坏|阈|值", L"|毒|性|百|分|比", L"|污|垢|修|正", + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7318,6 +7324,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \n武器的损坏阈值增加了(百分比)。\n \n该数值越高越好。", L"\n \n总伤害中毒性伤害所占的百分比。\n\n部分取决于敌人的装备是否有毒性抵抗或毒性吸收属性。", L"\n \n单发射击所造成的污垢。\n所使用的子弹类型和附件种类对本值有影响。\n \n该数值越低越好。", + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 27f34c3b..9bf4facf 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -7251,6 +7251,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", // TODO.Translate L"|D|i|r|t |M|o|d|i|f|i|e|r", // TODO.Translate + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7314,6 +7320,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", // TODO.Translate L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", // TODO.Translate + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 8e14d075..ddb83acb 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -7240,6 +7240,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", L"|D|i|r|t |M|o|d|i|f|i|e|r", + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r", + L"|F|o|o|d| |P|o|i|n|t|s", + L"|D|r|i|n|k |P|o|i|n|t|s", + L"|P|o|r|t|i|o|n |S|i|z|e", + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r", + L"|D|e|c|a|y |M|o|d|i|f|i|e|r", }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7303,6 +7309,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", + L"\n \nAmount of energy in kcal.\n \nHigher is better.", + L"\n \nAmount of water in liter.\n \nHigher is better.", + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 14252e97..b9fb603a 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -7235,6 +7235,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", // TODO.Translate L"|D|i|r|t |M|o|d|i|f|i|e|r", // TODO.Translate + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7298,6 +7304,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", // TODO.Translate L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", // TODO.Translate + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 2e1e1aff..5514225f 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -7064,6 +7064,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|M|o|d|i|f|i|k|a|t|o|r|-|H|i|t|z|e|s|c|h|a|d|e|n|s|s|c|h|r|a|n|k|e", L"|G|i|f|t|-|I|n|d|i|k|a|t|o|r", L"|S|c|h|m|u|t|z |M|o|d|i|f|i|k|a|t|o|r", + L"|G|i|f|t|i|g|k|e|i|t", + L"|N|a|h|r|u|n|g|s |P|u|n|k|t|e", + L"|T|r|i|n|k |P|u|n|k|t|e", + L"|P|o|r|t|i|o|n|s |G|r|ö|s|s|e", + L"|M|o|r|a|l |M|o|d|i|f|i|k|a|t|o|r", + L"|S|c|h|i|m|m|e|l |R|a|t|e", }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7127,6 +7133,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nHitzeschadensschranke wird um diesen Prozentsatz erhöht.\n \nHöher is besser.", L"\n \nDies ist der prozentuelle Schaden der durch\nden vergifteten Gegenstand verursacht wird.\n\nDieser Schaden hängt natürlich davon ab,\noder der Feind eine Gift-Resistenz hat oder nicht.", L"\n \nEin einziger Schuss verursacht diesen Schmutz.\nUnterschiedliche Munition und Waffen-Anbauten\nkönnen diesen Wert verändern.\n \nNiedriger ist besser.", + L"\n \nDies zu Essen verursacht soviel Vergiftung.\n \nNiedriger ist besser.", + L"\n \nMenge an Energy in kcal.\n \nHöher ist besser.", + L"\n \nWasseranteil in Litern.\n \nHöher ist besser.", + L"\n \nProzentsatz des Gegenstandes der mit einem\n Bissen aufgebraucht wird.\n \nWeniger ist besser.", + L"\n \nDie Moral wird um diese Zahl modifiziert.\n \nHöher ist besser.", + L"\n \nDer Gegenstand wird mit der Zeit schlecht.\nIst mehr als 50% verschimmelt wird er giftig.\nDies ist die Rate in der Schimmel entsteht.\n \nNiedriger ist besser.", }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 982979e1..6cb55785 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -7237,6 +7237,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", // TODO.Translate L"|D|i|r|t |M|o|d|i|f|i|e|r", // TODO.Translate + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7300,6 +7306,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", // TODO.Translate L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", // TODO.Translate + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 5a2349e7..f97fa2bb 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -7255,6 +7255,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", // TODO.Translate L"|D|i|r|t |M|o|d|i|f|i|e|r", // TODO.Translate + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7318,6 +7324,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", // TODO.Translate L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", // TODO.Translate + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index a711d42e..52e876f8 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -7240,6 +7240,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", // TODO.Translate L"|D|i|r|t |M|o|d|i|f|i|e|r", // TODO.Translate + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7303,6 +7309,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", // TODO.Translate L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", // TODO.Translate + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]= diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index ad365419..17d297e0 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -7255,6 +7255,12 @@ STR16 szUDBAdvStatsTooltipText[]= L"|D|a|m|a|g|e |T|h|r|e|s|h|o|l|d |M|o|d|i|f|i|e|r", L"|P|o|i|s|o|n |P|e|r|c|e|n|t|a|g|e", // TODO.Translate L"|D|i|r|t |M|o|d|i|f|i|e|r", // TODO.Translate + L"|P|o|i|s|o|n |M|o|d|i|f|i|e|r",//TODO.translate + L"|F|o|o|d| |P|o|i|n|t|s",//TODO.translate + L"|D|r|i|n|k |P|o|i|n|t|s",//TODO.translate + L"|P|o|r|t|i|o|n |S|i|z|e",//TODO.translate + L"|M|o|r|a|l|e |M|o|d|i|f|i|e|r",//TODO.translate + L"|D|e|c|a|y |M|o|d|i|f|i|e|r",//TODO.translate }; // Alternate tooltip text for weapon Advanced Stats. Just different wording, nothing spectacular. @@ -7318,6 +7324,12 @@ STR16 szUDBAdvStatsExplanationsTooltipText[]= L"\n \nA gun's damage threshold is\nincreased by this percentage.\n \nHigher is better.", L"\n \nThis is the percentage of damage dealt\nby this item that will be poisonous.\n\nUsefulness depends on wether enemy\nhas poison resistance or absorption.", // TODO.Translate L"\n \nA single shot causes this much dirt.\nAmmunition types and attachments can\naffect this value.\n \nLower is better.", // TODO.Translate + L"\n \nWhen this item is eaten\nit causes that much poison.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nAmount of energy in kcal.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nAmount of water in liter.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThe percentage of the item\nthat will be eaten at once.\n \nLower is better.", // TODO.TRANSLATE + L"\n \nMorale is adjusted by this amount.\n \nHigher is better.", // TODO.TRANSLATE + L"\n \nThis item becomes stale over time.\nIf more then 50% is molded it becomes poisoneous.\nThis is the rate at which mold is generated.\nLower is better.", // TODO.TRANSLATE }; STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[]=