A paramedic can use empty bloodbags (<emptybloodbag>-tag, item #1756) to create blood bags (<bloodbag>-tag, item #1757) from other mercs. These can then boost the health returned by surgery by ONTOP_PERCENT_SURGERY_HEAL_BLOODBAG percent.

Requires GameDir >= r2467.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8662 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2019-02-10 16:26:48 +00:00
parent be7005c3f8
commit 84d08a8821
40 changed files with 754 additions and 59 deletions
+3
View File
@@ -2439,6 +2439,7 @@ void LoadSkillTraitsExternalSettings()
gSkillTraitValues.ubDONumberTraitsNeededForSurgery = iniReader.ReadInteger("Doctor","NUMBER_OF_TRAITS_NEEDED_FOR_SURGERY", 1, 0, 2); gSkillTraitValues.ubDONumberTraitsNeededForSurgery = iniReader.ReadInteger("Doctor","NUMBER_OF_TRAITS_NEEDED_FOR_SURGERY", 1, 0, 2);
gSkillTraitValues.ubDOSurgeryHealPercentBase = iniReader.ReadInteger("Doctor","BASE_PERCENT_SURGERY_HEAL", 10, 0, 100); gSkillTraitValues.ubDOSurgeryHealPercentBase = iniReader.ReadInteger("Doctor","BASE_PERCENT_SURGERY_HEAL", 10, 0, 100);
gSkillTraitValues.ubDOSurgeryHealPercentOnTop = iniReader.ReadInteger("Doctor","ONTOP_PERCENT_SURGERY_HEAL_PER_TRAIT", 20, 0, 100); gSkillTraitValues.ubDOSurgeryHealPercentOnTop = iniReader.ReadInteger("Doctor","ONTOP_PERCENT_SURGERY_HEAL_PER_TRAIT", 20, 0, 100);
gSkillTraitValues.ubDOSurgeryHealPercentBloodbag = iniReader.ReadInteger( "Doctor", "ONTOP_PERCENT_SURGERY_HEAL_BLOODBAG", 15, 0, 100 );
gSkillTraitValues.usDOSurgeryMedBagConsumption = iniReader.ReadInteger("Doctor","MEDICAL_BAG_CONSUMPTION_BY_SURGERY", 100, 0, 1000); gSkillTraitValues.usDOSurgeryMedBagConsumption = iniReader.ReadInteger("Doctor","MEDICAL_BAG_CONSUMPTION_BY_SURGERY", 100, 0, 1000);
gSkillTraitValues.usDOSurgeryMaxBreathLoss = iniReader.ReadInteger("Doctor","MAX_ENERGY_LOSS_FOR_LIFE_HEALED", 100, 0, 500); gSkillTraitValues.usDOSurgeryMaxBreathLoss = iniReader.ReadInteger("Doctor","MAX_ENERGY_LOSS_FOR_LIFE_HEALED", 100, 0, 500);
gSkillTraitValues.usDORepairStatsRateBasic = iniReader.ReadInteger("Doctor","REPAIR_STATS_RATE_BASIC", 20, 0, 1000); gSkillTraitValues.usDORepairStatsRateBasic = iniReader.ReadInteger("Doctor","REPAIR_STATS_RATE_BASIC", 20, 0, 1000);
@@ -3255,6 +3256,7 @@ void LoadGameAPBPConstants()
APBPConstants[AP_WATERTAP] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_WATERTAP", 20 ), 20 ); APBPConstants[AP_WATERTAP] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_WATERTAP", 20 ), 20 );
APBPConstants[AP_SODAMACHINE] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_SODAMACHINE", 30 ), 30 ); APBPConstants[AP_SODAMACHINE] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_SODAMACHINE", 30 ), 30 );
APBPConstants[AP_CAMERA] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_CAMERA", 30 ), 30 ); APBPConstants[AP_CAMERA] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_CAMERA", 30 ), 30 );
APBPConstants[AP_FILLBLOODBAG] = DynamicAdjustAPConstants( iniReader.ReadInteger( "APConstants", "AP_FILLBLOODBAG", 100 ), 100 );
APBPConstants[AP_ENTER_VEHICLE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_ENTER_VEHICLE",30),30); APBPConstants[AP_ENTER_VEHICLE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_ENTER_VEHICLE",30),30);
APBPConstants[AP_EXIT_VEHICLE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_EXIT_VEHICLE",30),30); APBPConstants[AP_EXIT_VEHICLE] = DynamicAdjustAPConstants(iniReader.ReadInteger("APConstants","AP_EXIT_VEHICLE",30),30);
@@ -3321,6 +3323,7 @@ void LoadGameAPBPConstants()
APBPConstants[BP_HANDCUFF] = iniReader.ReadInteger("BPConstants","BP_HANDCUFF", 100); APBPConstants[BP_HANDCUFF] = iniReader.ReadInteger("BPConstants","BP_HANDCUFF", 100);
APBPConstants[BP_APPLYITEM] = iniReader.ReadInteger("BPConstants","BP_APPLYITEM", 5); APBPConstants[BP_APPLYITEM] = iniReader.ReadInteger("BPConstants","BP_APPLYITEM", 5);
APBPConstants[BP_INVENTORY_ARM] = iniReader.ReadInteger("BPConstants","BP_INVENTORY_ARM", 0); APBPConstants[BP_INVENTORY_ARM] = iniReader.ReadInteger("BPConstants","BP_INVENTORY_ARM", 0);
APBPConstants[BP_FILLBLOODBAG] = iniReader.ReadInteger("BPConstants","BP_FILLBLOODBAG", 20 );
SetupMaxActionPointsAnimation(); SetupMaxActionPointsAnimation();
#undef ReadInteger #undef ReadInteger
+1
View File
@@ -1785,6 +1785,7 @@ typedef struct
UINT8 ubDONumberTraitsNeededForSurgery; UINT8 ubDONumberTraitsNeededForSurgery;
UINT8 ubDOSurgeryHealPercentBase; UINT8 ubDOSurgeryHealPercentBase;
UINT8 ubDOSurgeryHealPercentOnTop; UINT8 ubDOSurgeryHealPercentOnTop;
UINT8 ubDOSurgeryHealPercentBloodbag;
UINT16 usDOSurgeryMedBagConsumption; UINT16 usDOSurgeryMedBagConsumption;
UINT16 usDOSurgeryMaxBreathLoss; UINT16 usDOSurgeryMaxBreathLoss;
UINT16 usDORepairStatsRateBasic; UINT16 usDORepairStatsRateBasic;
+2
View File
@@ -160,6 +160,7 @@ AP_READFILE,
AP_WATERTAP, AP_WATERTAP,
AP_SODAMACHINE, AP_SODAMACHINE,
AP_CAMERA, AP_CAMERA,
AP_FILLBLOODBAG,
AP_ENTER_VEHICLE, AP_ENTER_VEHICLE,
AP_EXIT_VEHICLE, AP_EXIT_VEHICLE,
@@ -223,6 +224,7 @@ BP_REMOVE_FORTIFICATION,
BP_HANDCUFF, BP_HANDCUFF,
BP_APPLYITEM, BP_APPLYITEM,
BP_INVENTORY_ARM, BP_INVENTORY_ARM,
BP_FILLBLOODBAG,
TOTAL_APBP_VALUES TOTAL_APBP_VALUES
}; };
#endif #endif
+6
View File
@@ -7773,6 +7773,12 @@ void AssignPersonnelSkillTraitHelpText( UINT8 ubTraitNumber, BOOLEAN fExpertLeve
wcscat( apStr, gzIMPMajorTraitsHelpTextsDoctor[2] ); wcscat( apStr, gzIMPMajorTraitsHelpTextsDoctor[2] );
wcscat( apStr, L"\n" ); wcscat( apStr, L"\n" );
if ( gSkillTraitValues.ubDOSurgeryHealPercentBloodbag )
{
swprintf( atStr, gzIMPMajorTraitsHelpTextsDoctor[10], gSkillTraitValues.ubDOSurgeryHealPercentBloodbag, sSpecialCharacters[0] );
wcscat( apStr, atStr );
}
} }
} }
if( (gSkillTraitValues.usDORepairStatsRateBasic + gSkillTraitValues.usDORepairStatsRateOnTop) > 0 ) if( (gSkillTraitValues.usDORepairStatsRateBasic + gSkillTraitValues.usDORepairStatsRateOnTop) > 0 )
+163 -11
View File
@@ -3032,11 +3032,11 @@ UINT8 GetNumberThatCanBeDoctored( SOLDIERTYPE *pDoctor, BOOLEAN fThisHour, BOOLE
AssertNotNIL(pDoctor); AssertNotNIL(pDoctor);
// go through list of characters, find all who are patients/doctors healable by this doctor // go through list of characters, find all who are patients/doctors healable by this doctor
for ( cnt = 0, pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ pSoldier->bTeam ].bLastID; ++cnt,pTeamSoldier++) for ( cnt = 0, pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ pSoldier->bTeam ].bLastID; ++cnt, ++pTeamSoldier)
{ {
if( pTeamSoldier->bActive ) if( pTeamSoldier->bActive )
{ {
if( CanSoldierBeHealedByDoctor( pTeamSoldier, pDoctor, FALSE, fThisHour, fSkipKitCheck, fSkipSkillCheck, fCheckForSurgery ) == TRUE ) if( CanSoldierBeHealedByDoctor( pTeamSoldier, pDoctor, FALSE, fThisHour, fSkipKitCheck, fSkipSkillCheck, fCheckForSurgery ) )
{ {
// increment number of doctorable patients/doctors // increment number of doctorable patients/doctors
++ubNumberOfPeople; ++ubNumberOfPeople;
@@ -3047,6 +3047,28 @@ UINT8 GetNumberThatCanBeDoctored( SOLDIERTYPE *pDoctor, BOOLEAN fThisHour, BOOLE
return( ubNumberOfPeople ); return( ubNumberOfPeople );
} }
SOLDIERTYPE* GetPatientThatCanBeDoctored( SOLDIERTYPE *pDoctor, BOOLEAN fThisHour, BOOLEAN fSkipKitCheck, BOOLEAN fSkipSkillCheck, BOOLEAN fCheckForSurgery )
{
int cnt;
SOLDIERTYPE *pSoldier = MercPtrs[0], *pTeamSoldier = NULL;
AssertNotNIL( pDoctor );
// go through list of characters, find all who are patients/doctors healable by this doctor
for ( cnt = 0, pTeamSoldier = MercPtrs[cnt]; cnt <= gTacticalStatus.Team[pSoldier->bTeam].bLastID; ++cnt, ++pTeamSoldier )
{
if ( pTeamSoldier->bActive )
{
if ( CanSoldierBeHealedByDoctor( pTeamSoldier, pDoctor, FALSE, fThisHour, fSkipKitCheck, fSkipSkillCheck, fCheckForSurgery ) )
{
return pTeamSoldier;
}
}
}
return NULL;
}
SOLDIERTYPE *AnyDoctorWhoCanHealThisPatient( SOLDIERTYPE *pPatient, BOOLEAN fThisHour ) SOLDIERTYPE *AnyDoctorWhoCanHealThisPatient( SOLDIERTYPE *pPatient, BOOLEAN fThisHour )
{ {
int cnt; int cnt;
@@ -13278,14 +13300,35 @@ void AssignmentMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
} }
} }
} }
if (pBestMedic != NULL) if (pBestMedic != NULL)
{ {
CHAR16 zStr[200]; CHAR16 zStr[200];
pAutomaticSurgeryDoctor = pBestMedic; pAutomaticSurgeryDoctor = pBestMedic;
pAutomaticSurgeryPatient = pSoldier; pAutomaticSurgeryPatient = pSoldier;
swprintf( zStr, New113Message[ MSG113_SURGERY_BEFORE_PATIENT_ASSIGNMENT ] );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, MSG_BOX_FLAG_YESNO, SurgeryBeforePatientingRequesterCallback ); INT32 healwithout_bloodbag = pAutomaticSurgeryPatient->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pAutomaticSurgeryDoctor, DOCTOR_NT ) ) / 10000;
// Flugente: check whether we have a bloodbag we can use
INT32 healwith_bloodbag = -1;
if ( gSkillTraitValues.ubDOSurgeryHealPercentBloodbag > 0 && pAutomaticSurgeryDoctor->GetObjectWithItemFlag( BLOOD_BAG ) != NULL )
healwith_bloodbag = pAutomaticSurgeryPatient->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pAutomaticSurgeryDoctor, DOCTOR_NT ) ) / 10000;
if ( healwith_bloodbag > healwithout_bloodbag )
{
swprintf( zStr, New113Message[MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT_BLOODBAG], pAutomaticSurgeryPatient->GetName(), healwithout_bloodbag, healwith_bloodbag );
wcscpy( gzUserDefinedButton[0], L"Yes*" );
wcscpy( gzUserDefinedButton[1], L"Yes" );
wcscpy( gzUserDefinedButton[2], L"No" );
wcscpy( gzUserDefinedButton[3], L"" );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, ( MSG_BOX_FLAG_GENERIC_FOUR_BUTTONS | MSG_BOX_BUTTONS_HORIZONTAL_ORIENTATION ), SurgeryBeforePatientingRequesterCallback );
}
else
{
swprintf( zStr, New113Message[MSG113_SURGERY_BEFORE_PATIENT_ASSIGNMENT] );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, MSG_BOX_FLAG_YESNO, SurgeryBeforePatientingRequesterCallback );
}
} }
} }
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
@@ -13381,14 +13424,52 @@ void AssignmentMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
/////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - added check for surgery // SANDRO - added check for surgery
if( gGameOptions.fNewTraitSystem && ( GetNumberThatCanBeDoctored( pSoldier, HEALABLE_EVER, FALSE, FALSE, TRUE ) > 0 ) && if( gGameOptions.fNewTraitSystem &&
( NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) >= gSkillTraitValues.ubDONumberTraitsNeededForSurgery ) ) ( NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) >= gSkillTraitValues.ubDONumberTraitsNeededForSurgery ) )
{ {
CHAR16 zStr[200]; CHAR16 zStr[200];
pAutomaticSurgeryDoctor = pSoldier; pAutomaticSurgeryDoctor = pSoldier;
swprintf( zStr, New113Message[ MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT ], GetNumberThatCanBeDoctored( pSoldier, HEALABLE_EVER, TRUE, TRUE, TRUE ) );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, MSG_BOX_FLAG_YESNO, SurgeryBeforeDoctoringRequesterCallback ); UINT8 numsurgerytargets = GetNumberThatCanBeDoctored( pSoldier, HEALABLE_EVER, FALSE, FALSE, TRUE );
if ( numsurgerytargets )
{
BOOLEAN offerbloodbagoption = FALSE;
if ( numsurgerytargets == 1 && gSkillTraitValues.ubDOSurgeryHealPercentBloodbag > 0 && pSoldier->GetObjectWithItemFlag( BLOOD_BAG ) != NULL )
{
SOLDIERTYPE* pPatient = GetPatientThatCanBeDoctored( pSoldier, HEALABLE_EVER, FALSE, FALSE, TRUE );
if ( pPatient )
{
pAutomaticSurgeryPatient = pPatient;
INT32 healwithout_bloodbag = pAutomaticSurgeryPatient->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pAutomaticSurgeryDoctor, DOCTOR_NT ) ) / 10000;
INT32 healwith_bloodbag = pAutomaticSurgeryPatient->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pAutomaticSurgeryDoctor, DOCTOR_NT ) ) / 10000;
if ( healwith_bloodbag > healwithout_bloodbag )
{
swprintf( zStr, New113Message[MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT_BLOODBAG], pAutomaticSurgeryPatient->GetName(), healwithout_bloodbag, healwith_bloodbag );
offerbloodbagoption = TRUE;
}
}
}
if ( offerbloodbagoption )
{
wcscpy( gzUserDefinedButton[0], L"Yes*" );
wcscpy( gzUserDefinedButton[1], L"Yes" );
wcscpy( gzUserDefinedButton[2], L"No" );
wcscpy( gzUserDefinedButton[3], L"No" );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, ( MSG_BOX_FLAG_GENERIC_FOUR_BUTTONS | MSG_BOX_BUTTONS_HORIZONTAL_ORIENTATION ), SurgeryBeforeDoctoringRequesterCallback );
}
else
{
swprintf( zStr, New113Message[MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT], numsurgerytargets );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, MSG_BOX_FLAG_YESNO, SurgeryBeforeDoctoringRequesterCallback );
}
}
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////
} }
@@ -13501,14 +13582,35 @@ void AssignmentMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
} }
} }
} }
if (pBestMedic != NULL) if (pBestMedic != NULL)
{ {
CHAR16 zStr[200]; CHAR16 zStr[200];
pAutomaticSurgeryDoctor = pBestMedic; pAutomaticSurgeryDoctor = pBestMedic;
pAutomaticSurgeryPatient = pSoldier; pAutomaticSurgeryPatient = pSoldier;
swprintf( zStr, New113Message[ MSG113_SURGERY_BEFORE_PATIENT_ASSIGNMENT ] );
INT32 healwithout_bloodbag = pAutomaticSurgeryPatient->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pAutomaticSurgeryDoctor, DOCTOR_NT ) ) / 10000;
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, MSG_BOX_FLAG_YESNO, SurgeryBeforePatientingRequesterCallback ); // Flugente: check whether we have a bloodbag we can use
INT32 healwith_bloodbag = -1;
if ( gSkillTraitValues.ubDOSurgeryHealPercentBloodbag > 0 && pAutomaticSurgeryDoctor->GetObjectWithItemFlag( BLOOD_BAG ) != NULL )
healwith_bloodbag = pAutomaticSurgeryPatient->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pAutomaticSurgeryDoctor, DOCTOR_NT ) ) / 10000;
if ( healwith_bloodbag > healwithout_bloodbag )
{
swprintf( zStr, New113Message[MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT_BLOODBAG], pAutomaticSurgeryPatient->GetName(), healwithout_bloodbag, healwith_bloodbag );
wcscpy( gzUserDefinedButton[0], L"Yes*" );
wcscpy( gzUserDefinedButton[1], L"Yes" );
wcscpy( gzUserDefinedButton[2], L"No" );
wcscpy( gzUserDefinedButton[3], L"No" );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, ( MSG_BOX_FLAG_GENERIC_FOUR_BUTTONS | MSG_BOX_BUTTONS_HORIZONTAL_ORIENTATION ), SurgeryBeforePatientingRequesterCallback );
}
else
{
swprintf( zStr, New113Message[MSG113_SURGERY_BEFORE_PATIENT_ASSIGNMENT] );
DoMapMessageBox( MSG_BOX_BASIC_STYLE, zStr, MAP_SCREEN, MSG_BOX_FLAG_YESNO, SurgeryBeforePatientingRequesterCallback );
}
} }
} }
///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////
@@ -21278,8 +21380,30 @@ void HandleShadingOfLinesForFacilityAssignmentMenu( void )
// SANDRO - function for automatic surgery button callback // SANDRO - function for automatic surgery button callback
void SurgeryBeforeDoctoringRequesterCallback( UINT8 bExitValue ) void SurgeryBeforeDoctoringRequesterCallback( UINT8 bExitValue )
{ {
if( bExitValue == MSG_BOX_RETURN_YES ) if ( bExitValue == 1 || bExitValue == MSG_BOX_RETURN_YES )
{ {
// Flugente: use up a blood bag if we've requested that and boost surgery
if ( bExitValue == 1 )
{
OBJECTTYPE* pObj = pAutomaticSurgeryDoctor->GetObjectWithItemFlag( BLOOD_BAG );
if ( pObj )
{
// if object is infected, infect the victim
if ( ( *pObj )[0]->data.sObjectFlag & INFECTED && gGameExternalOptions.fDiseaseContaminatesItems )
pAutomaticSurgeryPatient->Infect( 0 );
pObj->RemoveObjectsFromStack( 1 );
if ( pObj->ubNumberOfObjects <= 0 )
{
DeleteObj( pObj );
}
pAutomaticSurgeryDoctor->usSoldierFlagMask2 |= SOLDIER_SURGERY_BOOSTED;
}
}
if (MakeAutomaticSurgeryOnAllPatients( pAutomaticSurgeryDoctor ) > 0) if (MakeAutomaticSurgeryOnAllPatients( pAutomaticSurgeryDoctor ) > 0)
{ {
DoScreenIndependantMessageBox( L"Healed!" , MSG_BOX_FLAG_OK, NULL ); DoScreenIndependantMessageBox( L"Healed!" , MSG_BOX_FLAG_OK, NULL );
@@ -21289,6 +21413,9 @@ void SurgeryBeforeDoctoringRequesterCallback( UINT8 bExitValue )
DoScreenIndependantMessageBox( L"NOT Healed!" , MSG_BOX_FLAG_OK, NULL ); DoScreenIndependantMessageBox( L"NOT Healed!" , MSG_BOX_FLAG_OK, NULL );
} }
// Flugente: after surgery is done, remove the optional blood bag boosting
pAutomaticSurgeryDoctor->usSoldierFlagMask2 & ~SOLDIER_SURGERY_BOOSTED;
pAutomaticSurgeryDoctor = NULL; pAutomaticSurgeryDoctor = NULL;
} }
} }
@@ -21296,8 +21423,30 @@ void SurgeryBeforeDoctoringRequesterCallback( UINT8 bExitValue )
// SANDRO - function for automatic surgery button callback // SANDRO - function for automatic surgery button callback
void SurgeryBeforePatientingRequesterCallback( UINT8 bExitValue ) void SurgeryBeforePatientingRequesterCallback( UINT8 bExitValue )
{ {
if( bExitValue == MSG_BOX_RETURN_YES ) if ( bExitValue == 1 || bExitValue == MSG_BOX_RETURN_YES )
{ {
// Flugente: use up a blood bag if we've requested that and boost surgery
if ( bExitValue == 1 )
{
OBJECTTYPE* pObj = pAutomaticSurgeryDoctor->GetObjectWithItemFlag( BLOOD_BAG );
if ( pObj )
{
// if object is infected, infect the victim
if ( ( *pObj )[0]->data.sObjectFlag & INFECTED && gGameExternalOptions.fDiseaseContaminatesItems )
pAutomaticSurgeryPatient->Infect( 0 );
pObj->RemoveObjectsFromStack( 1 );
if ( pObj->ubNumberOfObjects <= 0 )
{
DeleteObj( pObj );
}
pAutomaticSurgeryDoctor->usSoldierFlagMask2 |= SOLDIER_SURGERY_BOOSTED;
}
}
if( (CanSoldierBeHealedByDoctor( pAutomaticSurgeryPatient, pAutomaticSurgeryDoctor, FALSE, HEALABLE_EVER, FALSE, FALSE, TRUE ) == TRUE ) && if( (CanSoldierBeHealedByDoctor( pAutomaticSurgeryPatient, pAutomaticSurgeryDoctor, FALSE, HEALABLE_EVER, FALSE, FALSE, TRUE ) == TRUE ) &&
(MakeAutomaticSurgery( pAutomaticSurgeryPatient, pAutomaticSurgeryDoctor ) == TRUE) ) (MakeAutomaticSurgery( pAutomaticSurgeryPatient, pAutomaticSurgeryDoctor ) == TRUE) )
{ {
@@ -21308,6 +21457,9 @@ void SurgeryBeforePatientingRequesterCallback( UINT8 bExitValue )
DoScreenIndependantMessageBox( L"NOT Healed!" , MSG_BOX_FLAG_OK, NULL ); DoScreenIndependantMessageBox( L"NOT Healed!" , MSG_BOX_FLAG_OK, NULL );
} }
// Flugente: after surgery is done, remove the optional blood bag boosting
pAutomaticSurgeryDoctor->usSoldierFlagMask2 & ~SOLDIER_SURGERY_BOOSTED;
pAutomaticSurgeryDoctor = NULL; pAutomaticSurgeryDoctor = NULL;
} }
} }
+87 -5
View File
@@ -319,8 +319,10 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
if ( fFromUI && pSoldier->bTeam == gbPlayerNum && pTargetSoldier && if ( fFromUI && pSoldier->bTeam == gbPlayerNum && pTargetSoldier &&
(pTargetSoldier->bTeam == gbPlayerNum || pTargetSoldier->aiData.bNeutral) && pTargetSoldier->ubBodyType != CROW && (pTargetSoldier->bTeam == gbPlayerNum || pTargetSoldier->aiData.bNeutral) && pTargetSoldier->ubBodyType != CROW &&
Item[usHandItem].usItemClass != IC_MEDKIT && !Item[usHandItem].gascan && Item[usHandItem].usItemClass != IC_MEDKIT &&
!ItemCanBeAppliedToOthers( usHandItem ) ) !Item[usHandItem].gascan &&
!ItemCanBeAppliedToOthers( usHandItem ) &&
!HasItemFlag( usHandItem, EMPTY_BLOOD_BAG ) )
{ {
if ( pSoldier->ubProfile != NO_PROFILE ) if ( pSoldier->ubProfile != NO_PROFILE )
{ {
@@ -1525,6 +1527,86 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
} }
} }
// Flugente: apply misc items to other soldiers
if ( HasItemFlag( usHandItem, EMPTY_BLOOD_BAG ) )
{
// ATE: AI CANNOT GO THROUGH HERE!
BOOLEAN fHadToUseCursorPos = FALSE;
// See if we can get there to stab
sActionGridNo = FindAdjacentGridEx( pSoldier, sGridNo, &ubDirection, &sAdjustedGridNo, TRUE, FALSE );
if ( sActionGridNo == -1 )
{
// Try another location...
sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE );
if ( sActionGridNo == -1 )
{
return( ITEM_HANDLE_CANNOT_GETTO_LOCATION );
}
}
// Calculate AP costs...
sAPCost = GetAPsToFillBloodbag( pSoldier, sActionGridNo );
sAPCost += PlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, FALSE, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints );
// if we are at the action gridno, the item is a bomb, but nobody is at the gridno, do not apply and do not return - we will plant the bomb instead (handlded later in this function)
if ( Item[usHandItem].usItemClass == IC_BOMB && pSoldier->sGridNo == sActionGridNo && WhoIsThere2( usMapPos, pSoldier->pathing.bLevel ) == NOBODY )
{
;
}
else if ( EnoughPoints( pSoldier, sAPCost, 0, fFromUI ) )
{
// OK, set UI
SetUIBusy( pSoldier->ubID );
// CHECK IF WE ARE AT THIS GRIDNO NOW
if ( pSoldier->sGridNo != sActionGridNo )
{
// SEND PENDING ACTION
pSoldier->aiData.ubPendingAction = MERC_FILLBLOODBAG;
if ( fHadToUseCursorPos )
{
pSoldier->aiData.sPendingActionData2 = usMapPos;
}
else
{
if ( pTargetSoldier != NULL )
{
pSoldier->aiData.sPendingActionData2 = pTargetSoldier->sGridNo;
}
else
{
pSoldier->aiData.sPendingActionData2 = sGridNo;
}
}
pSoldier->aiData.bPendingActionData3 = ubDirection;
pSoldier->aiData.ubPendingActionAnimCount = 0;
// WALK UP TO DEST FIRST
pSoldier->EVENT_InternalGetNewSoldierPath( sActionGridNo, pSoldier->usUIMovementMode, FALSE, TRUE );
}
else
{
pSoldier->EVENT_SoldierTakeBloodFromPerson( sAdjustedGridNo, ubDirection );
UnSetUIBusy( pSoldier->ubID );
}
if ( fFromUI )
{
guiPendingOverrideEvent = A_CHANGE_TO_MOVE;
}
return( ITEM_HANDLE_OK );
}
else
{
return( ITEM_HANDLE_NOAPS );
}
}
if ( Item[usHandItem].canandstring ) if ( Item[usHandItem].canandstring )
{ {
STRUCTURE *pStructure; STRUCTURE *pStructure;
@@ -5431,7 +5513,7 @@ void BombMessageBoxCallBack( UINT8 ubExitValue )
// Flugente: tripwire rolls are not planted - instead we spawn tripwire and plant that // Flugente: tripwire rolls are not planted - instead we spawn tripwire and plant that
OBJECTTYPE* pObj = &(gpTempSoldier->inv[HANDPOS]); OBJECTTYPE* pObj = &(gpTempSoldier->inv[HANDPOS]);
if ( Item[ gpTempSoldier->inv[ HANDPOS ].usItem ].usItemFlag & TRIPWIREROLL && Item[ gpTempSoldier->inv[ HANDPOS ].usItem ].usBuddyItem != NOTHING ) if ( HasItemFlag( gpTempSoldier->inv[HANDPOS].usItem, TRIPWIREROLL ) && Item[ gpTempSoldier->inv[ HANDPOS ].usItem ].usBuddyItem != NOTHING )
{ {
(*pObj)[0]->data.objectStatus--; (*pObj)[0]->data.objectStatus--;
@@ -5794,11 +5876,11 @@ void BoobyTrapDialogueCallBack( void )
// now prompt the user... // now prompt the user...
if( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) if( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN )
{ {
DoScreenIndependantMessageBox( TacticalStr[ DISARM_BOOBYTRAP_PROMPT ], ( UINT8 )MSG_BOX_FLAG_YESNO, BoobyTrapInMapScreenMessageBoxCallBack ); DoScreenIndependantMessageBox( TacticalStr[ DISARM_BOOBYTRAP_PROMPT ], MSG_BOX_FLAG_YESNO, BoobyTrapInMapScreenMessageBoxCallBack );
} }
else else
{ {
DoScreenIndependantMessageBox( TacticalStr[ DISARM_BOOBYTRAP_PROMPT ], ( UINT8 )MSG_BOX_FLAG_YESNO, BoobyTrapMessageBoxCallBack ); DoScreenIndependantMessageBox( TacticalStr[ DISARM_BOOBYTRAP_PROMPT ], MSG_BOX_FLAG_YESNO, BoobyTrapMessageBoxCallBack );
} }
} }
+87 -11
View File
@@ -1157,10 +1157,10 @@ UINT32 UIHandleNewBadMerc( UI_EVENT *pUIEvent )
return( GAME_SCREEN ); return( GAME_SCREEN );
} }
usRandom = (UINT16)Random( 20 ); usRandom = 12;// (UINT16)Random( 20 );
if( usRandom < 5 ) if( usRandom < 5 )
pSoldier = TacticalCreateAdministrator(); pSoldier = TacticalCreateAdministrator();
else if( usRandom < 10 ) else if( usRandom < 15 )
pSoldier = TacticalCreateArmyTroop(); pSoldier = TacticalCreateArmyTroop();
else if ( usRandom < 12 ) else if ( usRandom < 12 )
pSoldier = TacticalCreateEnemyTank( ); pSoldier = TacticalCreateEnemyTank( );
@@ -2838,14 +2838,35 @@ void AttackRequesterCallback( UINT8 bExitValue )
// SANDRO - added function // SANDRO - added function
void SurgeryRequesterCallback( UINT8 bExitValue ) void SurgeryRequesterCallback( UINT8 bExitValue )
{ {
if( bExitValue == MSG_BOX_RETURN_YES ) if ( bExitValue == 1 || bExitValue == MSG_BOX_RETURN_YES )
{ {
//gpRequesterMerc->ubSurgeryApprovalMerc = gpRequesterTargetMerc->ubID; // Flugente: use up a blood bag if we've requested that and boost surgery
if ( bExitValue == 1 )
{
OBJECTTYPE* pObj = gpRequesterMerc->GetObjectWithItemFlag( BLOOD_BAG );
if ( pObj )
{
// if object is infected, infect the victim
if ( ( *pObj )[0]->data.sObjectFlag & INFECTED && gGameExternalOptions.fDiseaseContaminatesItems )
gpRequesterTargetMerc->Infect( 0 );
pObj->RemoveObjectsFromStack( 1 );
if ( pObj->ubNumberOfObjects <= 0 )
{
DeleteObj( pObj );
}
gpRequesterMerc->usSoldierFlagMask2 |= SOLDIER_SURGERY_BOOSTED;
}
}
gTacticalStatus.ubLastRequesterSurgeryTargetID = gpRequesterTargetMerc->ubID; gTacticalStatus.ubLastRequesterSurgeryTargetID = gpRequesterTargetMerc->ubID;
UIHandleMercAttack( gpRequesterMerc , gpRequesterTargetMerc, gsRequesterGridNo ); UIHandleMercAttack( gpRequesterMerc , gpRequesterTargetMerc, gsRequesterGridNo );
} }
else if( bExitValue == MSG_BOX_RETURN_NO ) else if( bExitValue == MSG_BOX_RETURN_NO || bExitValue == 4 )
{ {
gTacticalStatus.ubLastRequesterSurgeryTargetID = NOBODY; gTacticalStatus.ubLastRequesterSurgeryTargetID = NOBODY;
@@ -2920,20 +2941,43 @@ UINT32 UIHandleCAMercShoot( UI_EVENT *pUIEvent )
gsRequesterGridNo = usMapPos; gsRequesterGridNo = usMapPos;
fDidRequester = TRUE; fDidRequester = TRUE;
INT32 healwithout_bloodbag = pTSoldier->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) ) / 10000;
// Flugente: if we wouldn't really heal anything due to the wound being too small, tell us so // Flugente: if we wouldn't really heal anything due to the wound being too small, tell us so
if ( !pTSoldier->bBleeding && ( pTSoldier->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT )) / 10000 ) <= 0 ) if ( !pTSoldier->bBleeding && healwithout_bloodbag <= 0 )
{ {
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[19], pTSoldier->GetName( ) ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[19], pTSoldier->GetName( ) );
} }
else else
{ {
if (pTSoldier->bBleeding) // Flugente: check whether we have a bloodbag we can use
swprintf( zStr, New113Message[ MSG113_DO_WE_WANT_SURGERY_FIRST ], pTSoldier->GetName(), (pTSoldier->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT )) / 10000) ); INT32 healwith_bloodbag = -1;
else if ( gSkillTraitValues.ubDOSurgeryHealPercentBloodbag > 0 && pSoldier->GetObjectWithItemFlag( BLOOD_BAG ) != NULL )
swprintf( zStr, New113Message[ MSG113_DO_WE_WANT_SURGERY ], pTSoldier->GetName(), (pTSoldier->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT )) / 10000) ); healwith_bloodbag = pTSoldier->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) ) / 10000;
DoMessageBox( MSG_BOX_BASIC_STYLE, zStr, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_YESNO, SurgeryRequesterCallback, NULL ); if ( healwith_bloodbag > healwithout_bloodbag )
{
if ( pTSoldier->bBleeding )
swprintf( zStr, New113Message[MSG113_DO_WE_WANT_SURGERY_FIRST_BLOODBAG], pTSoldier->GetName(), healwithout_bloodbag, healwith_bloodbag );
else
swprintf( zStr, New113Message[MSG113_DO_WE_WANT_SURGERY_BLOODBAG], pTSoldier->GetName(), healwithout_bloodbag, healwith_bloodbag );
wcscpy( gzUserDefinedButton[0], L"Yes*" );
wcscpy( gzUserDefinedButton[1], L"Yes" );
wcscpy( gzUserDefinedButton[2], L"No" );
wcscpy( gzUserDefinedButton[3], L"No" );
DoMessageBox( MSG_BOX_BASIC_SMALL_BUTTONS, zStr, GAME_SCREEN, (MSG_BOX_FLAG_GENERIC_FOUR_BUTTONS| MSG_BOX_BUTTONS_HORIZONTAL_ORIENTATION), SurgeryRequesterCallback, NULL );
}
else
{
if ( pTSoldier->bBleeding )
swprintf( zStr, New113Message[MSG113_DO_WE_WANT_SURGERY_FIRST], pTSoldier->GetName(), healwithout_bloodbag );
else
swprintf( zStr, New113Message[MSG113_DO_WE_WANT_SURGERY], pTSoldier->GetName(), healwithout_bloodbag );
DoMessageBox( MSG_BOX_BASIC_STYLE, zStr, GAME_SCREEN, (UINT8)MSG_BOX_FLAG_YESNO, SurgeryRequesterCallback, NULL );
}
} }
} }
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4541,6 +4585,24 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags )
} }
} }
} }
else if ( uiFlags == MOVEUI_TARGET_BLOODBAG )
{
sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE );
if ( sActionGridNo == -1 )
{
sActionGridNo = usMapPos;
}
sAPCost = GetAPsToFillBloodbag( pSoldier, sActionGridNo );
sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints );
if ( sActionGridNo != pSoldier->sGridNo )
{
gfUIHandleShowMoveGrid = TRUE;
gsUIHandleShowMoveGridLocation = sActionGridNo;
}
}
else else
{ {
sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ); sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints );
@@ -4737,6 +4799,20 @@ BOOLEAN UIMouseOnValidAttackLocation( SOLDIERTYPE *pSoldier )
return FALSE; return FALSE;
} }
if ( ubItemCursor == BLOODBAGCURS )
{
if ( HasItemFlag( ( &( pSoldier->inv[HANDPOS] ) )->usItem, EMPTY_BLOOD_BAG ) )
{
if ( gfUIFullTargetFound )
{
if ( pSoldier->ubID != gusUIFullTargetID && MercPtrs[gusUIFullTargetID]->IsValidBloodDonor() )
return( TRUE );
}
}
return( FALSE );
}
if ( ubItemCursor == APPLYITEMCURS ) if ( ubItemCursor == APPLYITEMCURS )
{ {
if ( ItemCanBeAppliedToOthers( (&(pSoldier->inv[HANDPOS]))->usItem ) ) if ( ItemCanBeAppliedToOthers( (&(pSoldier->inv[HANDPOS]))->usItem ) )
+1
View File
@@ -33,6 +33,7 @@
#define MOVEUI_TARGET_HANDCUFF 14 #define MOVEUI_TARGET_HANDCUFF 14
#define MOVEUI_TARGET_APPLYITEM 15 #define MOVEUI_TARGET_APPLYITEM 15
#define MOVEUI_TARGET_INTERACTIVEACTION 16 #define MOVEUI_TARGET_INTERACTIVEACTION 16
#define MOVEUI_TARGET_BLOODBAG 17
#define MOVEUI_RETURN_ON_TARGET_MERC 1 #define MOVEUI_RETURN_ON_TARGET_MERC 1
+3
View File
@@ -235,6 +235,9 @@ UICursor gUICursors[ NUM_UI_CURSORS ] =
CAMERA_GREY_UICURSOR, UICURSOR_FREEFLOWING, CURSOR_CAMERA, 0, CAMERA_GREY_UICURSOR, UICURSOR_FREEFLOWING, CURSOR_CAMERA, 0,
CAMERA_RED_UICURSOR, UICURSOR_FREEFLOWING, CURSOR_CAMERA_RED, 0, CAMERA_RED_UICURSOR, UICURSOR_FREEFLOWING, CURSOR_CAMERA_RED, 0,
BLOODBAG_GREY_UICURSOR, UICURSOR_FREEFLOWING, CURSOR_BLOODBAG, 0,
BLOODBAG_RED_UICURSOR, UICURSOR_FREEFLOWING, CURSOR_BLOODBAG_RED, 0,
}; };
+3
View File
@@ -213,6 +213,9 @@ typedef enum
CAMERA_GREY_UICURSOR, CAMERA_GREY_UICURSOR,
CAMERA_RED_UICURSOR, CAMERA_RED_UICURSOR,
BLOODBAG_GREY_UICURSOR,
BLOODBAG_RED_UICURSOR,
NUM_UI_CURSORS NUM_UI_CURSORS
} UICursorDefines; } UICursorDefines;
+36 -2
View File
@@ -2729,7 +2729,7 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
MSYS_EnableRegion( &gUDBFasthelpRegions[iFirstDataRegion + cnt] ); MSYS_EnableRegion( &gUDBFasthelpRegions[iFirstDataRegion + cnt] );
++cnt; ++cnt;
} }
//////////////////// BURIAL MODIFIER //////////////////// BURIAL MODIFIER
if ( Item[gpItemDescObject->usItem].usBurialModifier ) if ( Item[gpItemDescObject->usItem].usBurialModifier )
{ {
@@ -2738,6 +2738,24 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
MSYS_EnableRegion( &gUDBFasthelpRegions[iFirstDataRegion + cnt] ); MSYS_EnableRegion( &gUDBFasthelpRegions[iFirstDataRegion + cnt] );
++cnt; ++cnt;
} }
//////////////////// EMPTY BLOOD BAG
if ( HasItemFlag( gpItemDescObject->usItem, EMPTY_BLOOD_BAG ) )
{
swprintf( pStr, L"%s%s", szUDBGenSecondaryStatsTooltipText[43], szUDBGenSecondaryStatsExplanationsTooltipText[43] );
SetRegionFastHelpText( &( gUDBFasthelpRegions[iFirstDataRegion + cnt] ), pStr );
MSYS_EnableRegion( &gUDBFasthelpRegions[iFirstDataRegion + cnt] );
++cnt;
}
//////////////////// BLOOD BAG
if ( HasItemFlag( gpItemDescObject->usItem, BLOOD_BAG ) )
{
swprintf( pStr, L"%s%s", szUDBGenSecondaryStatsTooltipText[44], szUDBGenSecondaryStatsExplanationsTooltipText[44] );
SetRegionFastHelpText( &( gUDBFasthelpRegions[iFirstDataRegion + cnt] ), pStr );
MSYS_EnableRegion( &gUDBFasthelpRegions[iFirstDataRegion + cnt] );
++cnt;
}
} }
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
@@ -6334,7 +6352,7 @@ void DrawSecondaryStats( OBJECTTYPE * gpItemDescObject )
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 39, gItemDescGenSecondaryRegions[cnt].sLeft + sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 39, gItemDescGenSecondaryRegions[cnt].sLeft + sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
cnt++; cnt++;
} }
//////////////////// BURIAL MODIFIER //////////////////// BURIAL MODIFIER
if ( ( Item[gpItemDescObject->usItem].usBurialModifier && !fComparisonMode ) || if ( ( Item[gpItemDescObject->usItem].usBurialModifier && !fComparisonMode ) ||
( fComparisonMode && Item[gpComparedItemDescObject->usItem].usBurialModifier ) ) ( fComparisonMode && Item[gpComparedItemDescObject->usItem].usBurialModifier ) )
@@ -6342,6 +6360,22 @@ void DrawSecondaryStats( OBJECTTYPE * gpItemDescObject )
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 40, gItemDescGenSecondaryRegions[cnt].sLeft + sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 40, gItemDescGenSecondaryRegions[cnt].sLeft + sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
cnt++; cnt++;
} }
//////////////////// EMPTY BLOOD BAG
if ( ( HasItemFlag( gpItemDescObject->usItem, EMPTY_BLOOD_BAG ) && !fComparisonMode ) ||
( fComparisonMode && HasItemFlag( gpComparedItemDescObject->usItem, EMPTY_BLOOD_BAG ) ) )
{
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 41, gItemDescGenSecondaryRegions[cnt].sLeft + sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
++cnt;
}
//////////////////// BLOOD BAG
if ( ( HasItemFlag( gpItemDescObject->usItem, BLOOD_BAG ) && !fComparisonMode ) ||
( fComparisonMode && HasItemFlag( gpComparedItemDescObject->usItem, BLOOD_BAG ) ) )
{
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 42, gItemDescGenSecondaryRegions[cnt].sLeft + sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop + sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
++cnt;
}
} }
void DrawPropertyValueInColour( INT16 iValue, UINT8 ubNumLine, UINT8 ubNumRegion, BOOLEAN fComparisonMode, BOOLEAN fModifier, BOOLEAN fHigherBetter, UINT16 uiOverwriteColour = 0, BOOLEAN fPercentSign = FALSE ) void DrawPropertyValueInColour( INT16 iValue, UINT8 ubNumLine, UINT8 ubNumRegion, BOOLEAN fComparisonMode, BOOLEAN fModifier, BOOLEAN fHigherBetter, UINT16 uiOverwriteColour = 0, BOOLEAN fPercentSign = FALSE )
+7 -2
View File
@@ -178,6 +178,7 @@ typedef enum ATTACHMENT_SLOT{
#define HANDCUFFCURS 25 #define HANDCUFFCURS 25
#define APPLYITEMCURS 26 #define APPLYITEMCURS 26
#define INTERACTIVEACTIONCURS 27 #define INTERACTIVEACTIONCURS 27
#define BLOODBAGCURS 28
#define CAMERARANGE 10 #define CAMERARANGE 10
@@ -734,7 +735,7 @@ extern OBJECTTYPE gTempObject;
// -------- added by Flugente: various item flags -------- // -------- added by Flugente: various item flags --------
// flags used for various item properties (easier than adding 32 differently named variables). DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!! // flags used for various item properties (easier than adding 32 differently named variables). DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!!
// note that these should not be used to determine what kind of an attachment an item is, that is determined by attachmentclass and the AC_xxx flags above // note that these should not be used to determine what kind of an attachment an item is, that is determined by attachmentclass and the AC_xxx flags above
//#define EMPTY_SANDBAG 0x00000001 //1 #define BLOOD_BAG 0x00000001 //1 // this item is a blood bag can can be used to boost surgery
#define MANPAD 0x00000002 //2 // this item is a MAn-Portable Air-Defense System #define MANPAD 0x00000002 //2 // this item is a MAn-Portable Air-Defense System
#define BEARTRAP 0x00000004 //4 // a mechanical trap that does no explosion, but causes leg damage to whoever activates it #define BEARTRAP 0x00000004 //4 // a mechanical trap that does no explosion, but causes leg damage to whoever activates it
#define CAMERA 0x00000008 //8 #define CAMERA 0x00000008 //8
@@ -773,6 +774,10 @@ extern OBJECTTYPE gTempObject;
#define DISEASEPROTECTION_1 0x20000000 //536870912 // this item protects us from getting diseases by human contact if kept in inventory #define DISEASEPROTECTION_1 0x20000000 //536870912 // this item protects us from getting diseases by human contact if kept in inventory
#define DISEASEPROTECTION_2 0x40000000 //1073741824 // this item protects us from getting diseases by human contact if kept in inventory #define DISEASEPROTECTION_2 0x40000000 //1073741824 // this item protects us from getting diseases by human contact if kept in inventory
#define LBE_EXPLOSIONPROOF 0x80000000 //2147483648 // any gear in LBE with this flag is protected from explosions #define LBE_EXPLOSIONPROOF 0x80000000 //2147483648 // any gear in LBE with this flag is protected from explosions
// extended flagmask to UINT64
#define EMPTY_BLOOD_BAG 0x0000000100000000 // this item is a empty blood bag
// ---------------------------------------------------------------- // ----------------------------------------------------------------
// -------- added by Flugente: flags for objects -------- // -------- added by Flugente: flags for objects --------
@@ -1133,7 +1138,7 @@ typedef struct
BOOLEAN blockironsight; // if a gun or any attachment have this property, the iron sight won't be usable (if there is at least one other usable sight) BOOLEAN blockironsight; // if a gun or any attachment have this property, the iron sight won't be usable (if there is at least one other usable sight)
UINT32 usItemFlag; // bitflags to store various item properties (better than introducing 32 BOOLEAN values). If I only had thought of this earlier.... UINT64 usItemFlag; // bitflags to store various item properties (better than introducing 32 BOOLEAN values). If I only had thought of this earlier....
// Flugente: food type // Flugente: food type
UINT32 foodtype; UINT32 foodtype;
+4 -4
View File
@@ -5324,7 +5324,7 @@ BOOLEAN OBJECTTYPE::AttachObjectNAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttac
case TRIPWIRE_ROLL: case TRIPWIRE_ROLL:
{ {
// check if this can work // check if this can work
if ( Item[ this->usItem ].tripwire && Item[pAttachment->usItem].tripwire && Item[ this->usItem ].usItemFlag == TRIPWIREROLL ) if ( Item[ this->usItem ].tripwire && Item[pAttachment->usItem].tripwire && HasItemFlag( this->usItem, TRIPWIREROLL ) )
{ {
if ( (*this)[subObject]->data.objectStatus < 100 ) if ( (*this)[subObject]->data.objectStatus < 100 )
(*this)[subObject]->data.objectStatus++; (*this)[subObject]->data.objectStatus++;
@@ -5509,7 +5509,7 @@ BOOLEAN OBJECTTYPE::AttachObjectNAS( SOLDIERTYPE * pSoldier, OBJECTTYPE * pAttac
(*this)[subObject]->data.objectStatus = ((*this)[subObject]->data.objectStatus + (*pAttachment)[0]->data.objectStatus) / 2; (*this)[subObject]->data.objectStatus = ((*this)[subObject]->data.objectStatus + (*pAttachment)[0]->data.objectStatus) / 2;
// Flugente: if the new item has the TRIPWIREROLL property, it only gets status 2 upon creation via merges // Flugente: if the new item has the TRIPWIREROLL property, it only gets status 2 upon creation via merges
if ( Item[ this->usItem ].usItemFlag == TRIPWIREROLL ) if ( HasItemFlag( this->usItem, TRIPWIREROLL ) )
{ {
(*this)[subObject]->data.objectStatus = 2; (*this)[subObject]->data.objectStatus = 2;
} }
@@ -14927,13 +14927,13 @@ void CheckBombSpecifics( OBJECTTYPE * pObj, INT8* detonatortype, INT8* setting,
} }
// Flugente: check for specific flags // Flugente: check for specific flags
BOOLEAN HasItemFlag( UINT16 usItem, UINT32 aFlag ) BOOLEAN HasItemFlag( UINT16 usItem, UINT64 aFlag )
{ {
return( (Item[usItem].usItemFlag & aFlag) != 0 ); return( (Item[usItem].usItemFlag & aFlag) != 0 );
} }
// Flugente: get first item number that has this flag. Use with caution, as we search in all items // Flugente: get first item number that has this flag. Use with caution, as we search in all items
BOOLEAN GetFirstItemWithFlag( UINT16* pusItem, UINT32 aFlag ) BOOLEAN GetFirstItemWithFlag( UINT16* pusItem, UINT64 aFlag )
{ {
register UINT16 i; register UINT16 i;
for ( i = 1; i < gMAXITEMS_READ; ++i ) for ( i = 1; i < gMAXITEMS_READ; ++i )
+2 -2
View File
@@ -479,10 +479,10 @@ UINT64 GetAvailableAttachmentPoint ( OBJECTTYPE * pObject, UINT8 subObject );
void CheckBombSpecifics( OBJECTTYPE * pObj, INT8* detonatortype, INT8* setting, INT8* defusefrequency ); void CheckBombSpecifics( OBJECTTYPE * pObj, INT8* detonatortype, INT8* setting, INT8* defusefrequency );
// Flugente: check for specific flags // Flugente: check for specific flags
BOOLEAN HasItemFlag( UINT16 usItem, UINT32 aFlag ); BOOLEAN HasItemFlag( UINT16 usItem, UINT64 aFlag );
// Flugente: get first item number that has this flag. Use with caution, as we search in all items // Flugente: get first item number that has this flag. Use with caution, as we search in all items
BOOLEAN GetFirstItemWithFlag( UINT16* pusItem, UINT32 aFlag ); BOOLEAN GetFirstItemWithFlag( UINT16* pusItem, UINT64 aFlag );
// Flugente: check if this object is currently fed from an external source (belts in inventory, other mercs) // Flugente: check if this object is currently fed from an external source (belts in inventory, other mercs)
BOOLEAN ObjectIsBeingFedExternal(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject); BOOLEAN ObjectIsBeingFedExternal(SOLDIERTYPE* pSoldier, OBJECTTYPE * pObject);
+6 -1
View File
@@ -1567,7 +1567,12 @@ BOOLEAN ExecuteOverhead( )
pSoldier->EVENT_SoldierInteractiveAction( pSoldier->aiData.sPendingActionData2, pSoldier->aiData.bPendingActionData3 ); pSoldier->EVENT_SoldierInteractiveAction( pSoldier->aiData.sPendingActionData2, pSoldier->aiData.bPendingActionData3 );
pSoldier->aiData.ubPendingAction = NO_PENDING_ACTION; pSoldier->aiData.ubPendingAction = NO_PENDING_ACTION;
} }
else if ( pSoldier->aiData.ubPendingAction == MERC_FILLBLOODBAG )
{
pSoldier->EVENT_SoldierTakeBloodFromPerson( pSoldier->aiData.sPendingActionData2, pSoldier->aiData.bPendingActionData3 );
pSoldier->aiData.ubPendingAction = NO_PENDING_ACTION;
}
if ( fNoAPsForPendingAction ) if ( fNoAPsForPendingAction )
{ {
// Change status of guy to waiting // Change status of guy to waiting
+11
View File
@@ -4111,6 +4111,17 @@ INT16 GetAPsToApplyItem( SOLDIERTYPE *pSoldier, INT32 usMapPos )
return sAPCost; return sAPCost;
} }
INT16 GetAPsToFillBloodbag( SOLDIERTYPE *pSoldier, INT32 usMapPos )
{
INT16 sAPCost = 0;
sAPCost = PlotPath( pSoldier, usMapPos, NO_COPYROUTE, NO_PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints );
sAPCost += APBPConstants[AP_FILLBLOODBAG];
return sAPCost;
}
// added by Flugente // added by Flugente
INT16 GetAPsForMultiTurnAction( SOLDIERTYPE *pSoldier, UINT8 usActionType ) INT16 GetAPsForMultiTurnAction( SOLDIERTYPE *pSoldier, UINT8 usActionType )
{ {
+1 -1
View File
@@ -350,10 +350,10 @@ INT16 GetBPsToStealItem( SOLDIERTYPE *pSoldier );
INT16 GetAPsToUseJar( SOLDIERTYPE *pSoldier, INT32 usMapPos ); INT16 GetAPsToUseJar( SOLDIERTYPE *pSoldier, INT32 usMapPos );
INT16 GetAPsToUseCan( SOLDIERTYPE *pSoldier, INT32 usMapPos ); INT16 GetAPsToUseCan( SOLDIERTYPE *pSoldier, INT32 usMapPos );
INT16 GetBPsTouseJar( SOLDIERTYPE *pSoldier );
INT16 GetAPsToHandcuff( SOLDIERTYPE *pSoldier, INT32 usMapPos ); // added by Flugente INT16 GetAPsToHandcuff( SOLDIERTYPE *pSoldier, INT32 usMapPos ); // added by Flugente
INT16 GetAPsToApplyItem( SOLDIERTYPE *pSoldier, INT32 usMapPos ); // added by Flugente INT16 GetAPsToApplyItem( SOLDIERTYPE *pSoldier, INT32 usMapPos ); // added by Flugente
INT16 GetAPsToFillBloodbag( SOLDIERTYPE *pSoldier, INT32 usMapPos ); // added by Flugente
INT16 GetAPsForMultiTurnAction( SOLDIERTYPE *pSoldier, UINT8 usActionType ); // added by Flugente INT16 GetAPsForMultiTurnAction( SOLDIERTYPE *pSoldier, UINT8 usActionType ); // added by Flugente
INT16 GetAPsForInteractiveAction( SOLDIERTYPE *pSoldier, UINT8 usActionType ); // added by Flugente INT16 GetAPsForInteractiveAction( SOLDIERTYPE *pSoldier, UINT8 usActionType ); // added by Flugente
+171 -5
View File
@@ -13315,7 +13315,10 @@ UINT32 SOLDIERTYPE::SoldierDressWound( SOLDIERTYPE *pVictim, INT16 sKitPts, INT1
// this means the rest of HPs will remain as "unhealable", the patient will miss X HPs but has no HealableInjury on self.. // this means the rest of HPs will remain as "unhealable", the patient will miss X HPs but has no HealableInjury on self..
if ( ubPtsLeft >= (pVictim->iHealableInjury / 100) ) if ( ubPtsLeft >= (pVictim->iHealableInjury / 100) )
{ {
usLifeReturned = pVictim->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT )) / 100; if ( this->usSoldierFlagMask2 & SOLDIER_SURGERY_BOOSTED )
usLifeReturned = pVictim->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT ) ) / 100;
else
usLifeReturned = pVictim->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT )) / 100;
pVictim->iHealableInjury = 0; pVictim->iHealableInjury = 0;
//CHRISL: Why would we arbitrarily use all ubPtsLeft when a victim isn't bleeding? And why would the medical bag, which we have to use in order to //CHRISL: Why would we arbitrarily use all ubPtsLeft when a victim isn't bleeding? And why would the medical bag, which we have to use in order to
@@ -13352,7 +13355,10 @@ UINT32 SOLDIERTYPE::SoldierDressWound( SOLDIERTYPE *pVictim, INT16 sKitPts, INT1
} }
else else
{ {
usLifeReturned = ubPtsLeft * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT )); if ( this->usSoldierFlagMask2 & SOLDIER_SURGERY_BOOSTED )
usLifeReturned = ubPtsLeft * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT ) );
else
usLifeReturned = ubPtsLeft * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( this, DOCTOR_NT ));
pVictim->iHealableInjury -= (ubPtsLeft * 100); pVictim->iHealableInjury -= (ubPtsLeft * 100);
ubPtsLeft = 0; ubPtsLeft = 0;
@@ -13547,6 +13553,8 @@ void SOLDIERTYPE::InternalReceivingSoldierCancelServices( BOOLEAN fPlayEndAnim )
// Flugente: additional dialogue // Flugente: additional dialogue
AdditionalTacticalCharacterDialogue_CallsLua( pTSoldier, ADE_BANDAGE_PERFORM_END, this->ubProfile ); AdditionalTacticalCharacterDialogue_CallsLua( pTSoldier, ADE_BANDAGE_PERFORM_END, this->ubProfile );
AdditionalTacticalCharacterDialogue_CallsLua( this, ADE_BANDAGE_RECEIVE_END, pTSoldier->ubProfile ); AdditionalTacticalCharacterDialogue_CallsLua( this, ADE_BANDAGE_RECEIVE_END, pTSoldier->ubProfile );
pTSoldier->usSoldierFlagMask2 &= ~SOLDIER_SURGERY_BOOSTED;
} }
} }
} }
@@ -15159,7 +15167,7 @@ BOOLEAN SOLDIERTYPE::IsFeedingExternal( UINT8* pubId1, UINT16* pGunSlot1, UINT1
} }
// Flugente: return first found object with a specific flag from our inventory // Flugente: return first found object with a specific flag from our inventory
OBJECTTYPE* SOLDIERTYPE::GetObjectWithFlag( UINT32 aFlag ) OBJECTTYPE* SOLDIERTYPE::GetObjectWithFlag( UINT64 aFlag )
{ {
OBJECTTYPE* pObj = NULL; OBJECTTYPE* pObj = NULL;
@@ -20099,6 +20107,87 @@ void SOLDIERTYPE::DrugAutoUse()
} }
} }
OBJECTTYPE* SOLDIERTYPE::GetObjectWithItemFlag( UINT64 aFlag )
{
for ( INT8 bLoop = 0, invsize = (INT8)inv.size(); bLoop < invsize; ++bLoop )
{
if ( inv[bLoop].exists() )
{
OBJECTTYPE* pObj = &( inv[bLoop] );
if ( pObj && HasItemFlag( pObj->usItem, aFlag ) )
{
return pObj;
}
}
}
return NULL;
}
void SOLDIERTYPE::DestroyOneObjectWithItemFlag( UINT64 aFlag )
{
for ( INT8 bLoop = 0, invsize = (INT8)inv.size(); bLoop < invsize; ++bLoop )
{
if ( inv[bLoop].exists() )
{
OBJECTTYPE* pObj = &( inv[bLoop] );
if ( pObj && HasItemFlag( pObj->usItem, aFlag ) )
{
pObj->RemoveObjectsFromStack( 1 );
if ( pObj->ubNumberOfObjects <= 0 )
{
DeleteObj( pObj );
}
}
}
}
}
#define BLOODDONATION_AMOUNT 10
// Flugente: can we fill a blood bag from this guy?
BOOLEAN SOLDIERTYPE::IsValidBloodDonor()
{
// not during combat
if ( gTacticalStatus.uiFlags & INCOMBAT )
return FALSE;
// must be player team
if ( this->bTeam != gbPlayerNum )
return FALSE;
// not if wounded
if ( this->stats.bLife < this->stats.bLifeMax )
return FALSE;
// not if doing so would drop us into coma
if ( this->stats.bLife - BLOODDONATION_AMOUNT < OKLIFE )
return FALSE;
// not if we have any KNOWN disease
if ( this->HasDisease( TRUE, FALSE ) )
return FALSE;
// not if we're drunk or drugged
if ( MercDruggedOrDrunk( this ) )
return FALSE;
// need to be properly fed and watered
if ( UsingFoodSystem() )
{
UINT8 foodsituation;
UINT8 watersituation;
GetFoodSituation( this, &foodsituation, &watersituation );
if ( foodsituation > FOOD_NORMAL || watersituation > FOOD_NORMAL )
return FALSE;
}
return TRUE;
}
INT32 CheckBleeding( SOLDIERTYPE *pSoldier ) INT32 CheckBleeding( SOLDIERTYPE *pSoldier )
{ {
INT8 bBandaged; //,savedOurTurn; INT8 bBandaged; //,savedOurTurn;
@@ -21200,6 +21289,77 @@ void SOLDIERTYPE::EVENT_SoldierApplyItemToPerson( INT32 sGridNo, UINT8 ubDirecti
} }
} }
void SOLDIERTYPE::EVENT_SoldierTakeBloodFromPerson( INT32 sGridNo, UINT8 ubDirection )
{
UINT8 ubPerson = WhoIsThere2( sGridNo, this->pathing.bLevel );
if ( ubPerson != NOBODY && ubPerson != this->ubID )
{
// we found someone
SOLDIERTYPE* pSoldier = MercPtrs[ubPerson];
OBJECTTYPE* pObj = &( this->inv[HANDPOS] );
if ( pSoldier && pObj->exists() && HasItemFlag( pObj->usItem, EMPTY_BLOOD_BAG ) && pSoldier->IsValidBloodDonor() )
{
// delete empty blood bag
DeleteObj( pObj );
// create full blood bag
static UINT16 bloodbagitem = 1757;
if ( HasItemFlag( bloodbagitem, BLOOD_BAG ) || GetFirstItemWithFlag( &bloodbagitem, BLOOD_BAG ) )
{
CreateItem( bloodbagitem, 100, &gTempObject );
// Flugente: if this guy has the disease, infect object
if ( pSoldier->sDiseasePoints[0] > 0 )
gTempObject[0]->data.sObjectFlag |= INFECTED;
if ( !AutoPlaceObject( this, &gTempObject, FALSE ) )
AddItemToPool( pSoldier->sGridNo, &gTempObject, VISIBLE, this->pathing.bLevel, 0, -1 );
// wound the donor
// we don't want the health loss taken to be healable by surgery (how would surgery restore that), so reset it afterwards
INT32 healableinjury_tmp = pSoldier->iHealableInjury;
INT8 bleeding_tmp = pSoldier->bBleeding;
// we need to set attacker as NOBODY, otherwise this calls dialogue events. This can be justified since they 'volunteered' for this
pSoldier->SoldierTakeDamage( 0, BLOODDONATION_AMOUNT, 0, TAKE_DAMAGE_BLOODLOSS, NOBODY, sGridNo, 0, TRUE );
pSoldier->iHealableInjury = healableinjury_tmp;
pSoldier->bBleeding = bleeding_tmp;
DeductPoints( this, GetAPsToFillBloodbag( this, sGridNo ), APBPConstants[BP_FILLBLOODBAG], AFTERACTION_INTERRUPT );
return;
}
else
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Error: no blood bag item found in Items.xml!" );
}
}
// Say NOTHING quote...
this->DoMercBattleSound( BATTLE_SOUND_NOTHING );
}
else
{
// if this is bomb, but nobody is there, plant the bomb instead
OBJECTTYPE* pObj = &( this->inv[HANDPOS] );
if ( pObj->exists() )
{
UINT16 usItem = pObj->usItem;
if ( Item[usItem].usItemClass == IC_BOMB )
{
this->EVENT_SoldierBeginDropBomb();
}
}
}
}
void SOLDIERTYPE::EVENT_SoldierInteractiveAction( INT32 sGridNo, UINT16 usActionType ) void SOLDIERTYPE::EVENT_SoldierInteractiveAction( INT32 sGridNo, UINT16 usActionType )
{ {
DoInteractiveAction( sGridNo, this ); DoInteractiveAction( sGridNo, this );
@@ -23782,7 +23942,10 @@ UINT32 VirtualSoldierDressWound( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pVictim, OB
// this means the rest of HPs will remain as "unhealable", the patient will miss X HPs but has no HealableInjury on self.. // this means the rest of HPs will remain as "unhealable", the patient will miss X HPs but has no HealableInjury on self..
if ( bPtsLeft >= (pVictim->iHealableInjury / 100) ) if ( bPtsLeft >= (pVictim->iHealableInjury / 100) )
{ {
iLifeReturned = pVictim->iHealableInjury * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT )) / 100; if ( pSoldier->usSoldierFlagMask2 & SOLDIER_SURGERY_BOOSTED )
iLifeReturned = pVictim->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) ) / 100;
else
iLifeReturned = pVictim->iHealableInjury * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) ) / 100;
pVictim->iHealableInjury = 0; pVictim->iHealableInjury = 0;
// keep the rest of the points to bandaging if neccessary // keep the rest of the points to bandaging if neccessary
@@ -23806,7 +23969,10 @@ UINT32 VirtualSoldierDressWound( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pVictim, OB
} }
else else
{ {
iLifeReturned = bPtsLeft * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT )); if ( pSoldier->usSoldierFlagMask2 & SOLDIER_SURGERY_BOOSTED )
iLifeReturned = bPtsLeft * (gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentBloodbag + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ));
else
iLifeReturned = bPtsLeft * ( gSkillTraitValues.ubDOSurgeryHealPercentBase + gSkillTraitValues.ubDOSurgeryHealPercentOnTop * NUM_SKILL_TRAITS( pSoldier, DOCTOR_NT ) );
pVictim->iHealableInjury -= (bPtsLeft * 100); pVictim->iHealableInjury -= (bPtsLeft * 100);
bPtsLeft = 0; bPtsLeft = 0;
+11 -2
View File
@@ -232,6 +232,7 @@ enum
MERC_HANDCUFF_PERSON, MERC_HANDCUFF_PERSON,
MERC_APPLYITEM, MERC_APPLYITEM,
MERC_INTERACTIVEACTION, MERC_INTERACTIVEACTION,
MERC_FILLBLOODBAG,
}; };
// ENUMERATIONS FOR THROW ACTIONS // ENUMERATIONS FOR THROW ACTIONS
@@ -418,7 +419,8 @@ enum
#define SOLDIER_CONCEALINSERTION 0x00008000 // we enteri a sector by transition from concealed state (which causes us to spawn at the location we left the sector in) #define SOLDIER_CONCEALINSERTION 0x00008000 // we enteri a sector by transition from concealed state (which causes us to spawn at the location we left the sector in)
#define SOLDIER_CONCEALINSERTION_DISCOVERED 0x00010000 // we enter a sector by transition from concealed state, but as we were 'discovered', set red alert #define SOLDIER_CONCEALINSERTION_DISCOVERED 0x00010000 // we enter a sector by transition from concealed state, but as we were 'discovered', set red alert
#define SOLDIER_MERC_POW_LOCATIONKNOWN 0x00020000 // we are a POW, but the player has discovered our location #define SOLDIER_MERC_POW_LOCATIONKNOWN 0x00020000 // we are a POW, but the player has discovered our location
#define SOLDIER_SURGERY_BOOSTED 0x00040000 // we are a boosted performing surgery (e.g. by using up a blood bag)
#define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags #define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags
// ---------------------------------------------------------------- // ----------------------------------------------------------------
@@ -1658,6 +1660,7 @@ public:
void EVENT_SoldierBuildStructure( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente void EVENT_SoldierBuildStructure( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente
void EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente void EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente
void EVENT_SoldierApplyItemToPerson( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente void EVENT_SoldierApplyItemToPerson( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente
void EVENT_SoldierTakeBloodFromPerson( INT32 sGridNo, UINT8 ubDirection ); // added by Flugente
void EVENT_SoldierInteractiveAction( INT32 sGridNo, UINT16 usActionType ); // added by Flugente void EVENT_SoldierInteractiveAction( INT32 sGridNo, UINT16 usActionType ); // added by Flugente
BOOLEAN EVENT_InternalGetNewSoldierPath( INT32 sDestGridNo, UINT16 usMovementAnim, BOOLEAN fFromUI, BOOLEAN fForceRestart ); BOOLEAN EVENT_InternalGetNewSoldierPath( INT32 sDestGridNo, UINT16 usMovementAnim, BOOLEAN fFromUI, BOOLEAN fForceRestart );
@@ -1795,7 +1798,7 @@ public:
BOOLEAN IsFeedingExternal(UINT8* pubId1, UINT16* pGunSlot1, UINT16* pAmmoSlot1, UINT8* pubId2, UINT16* pGunSlot2, UINT16* pAmmoSlot2); BOOLEAN IsFeedingExternal(UINT8* pubId1, UINT16* pGunSlot1, UINT16* pAmmoSlot1, UINT8* pubId2, UINT16* pGunSlot2, UINT16* pAmmoSlot2);
// Flugente: return first found object with a specific flag from our inventory // Flugente: return first found object with a specific flag from our inventory
OBJECTTYPE* GetObjectWithFlag( UINT32 aFlag ); OBJECTTYPE* GetObjectWithFlag( UINT64 aFlag );
// Flugente: functions for the covert ops trait // Flugente: functions for the covert ops trait
@@ -1992,6 +1995,12 @@ public:
void StopChatting(); void StopChatting();
void DrugAutoUse(); void DrugAutoUse();
OBJECTTYPE* GetObjectWithItemFlag( UINT64 aFlag );
void DestroyOneObjectWithItemFlag( UINT64 aFlag );
// Flugente: can we fill a blood bag from this guy ?
BOOLEAN IsValidBloodDonor();
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
}; // SOLDIERTYPE; }; // SOLDIERTYPE;
+28
View File
@@ -52,6 +52,7 @@ UINT8 HandleRepairCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorF
UINT8 HandleRefuelCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorFlags ); UINT8 HandleRefuelCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorFlags );
UINT8 HandleRemoteCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags ); UINT8 HandleRemoteCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags );
UINT8 HandleCameraCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags ); UINT8 HandleCameraCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags );
UINT8 HandleBloodbagCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags );
UINT8 HandleBombCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags ); UINT8 HandleBombCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags );
UINT8 HandleJarCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorFlags ); UINT8 HandleJarCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorFlags );
UINT8 HandleTinCanCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorFlags ); UINT8 HandleTinCanCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT32 uiCursorFlags );
@@ -283,6 +284,10 @@ UINT8 GetProperItemCursor( UINT8 ubSoldierID, UINT16 ubItemIndex, INT32 usMapPos
ubCursorID = HandleCameraCursor( pSoldier, sTargetGridNo, fActivated, uiCursorFlags ); ubCursorID = HandleCameraCursor( pSoldier, sTargetGridNo, fActivated, uiCursorFlags );
break; break;
case BLOODBAGCURS:
ubCursorID = HandleBloodbagCursor( pSoldier, sTargetGridNo, fActivated, uiCursorFlags );
break;
case REMOTECURS: case REMOTECURS:
ubCursorID = HandleRemoteCursor( pSoldier, sTargetGridNo, fActivated, uiCursorFlags ); ubCursorID = HandleRemoteCursor( pSoldier, sTargetGridNo, fActivated, uiCursorFlags );
@@ -2203,6 +2208,25 @@ UINT8 HandleCameraCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivat
return CAMERA_RED_UICURSOR; return CAMERA_RED_UICURSOR;
} }
UINT8 HandleBloodbagCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags )
{
// DRAW PATH TO GUY
HandleUIMovementCursor( pSoldier, uiCursorFlags, sGridNo, MOVEUI_TARGET_APPLYITEM );
if ( HasItemFlag( ( &( pSoldier->inv[HANDPOS] ) )->usItem, EMPTY_BLOOD_BAG ) )
{
// is there a person here?
UINT8 usSoldierIndex = WhoIsThere2( sGridNo, pSoldier->pathing.bLevel );
if ( usSoldierIndex != NOBODY )
{
if ( usSoldierIndex != pSoldier->ubID && MercPtrs[usSoldierIndex]->IsValidBloodDonor() )
return BLOODBAG_GREY_UICURSOR;
}
}
return BLOODBAG_RED_UICURSOR;
}
UINT8 HandleBombCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags ) UINT8 HandleBombCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags )
{ {
@@ -2869,6 +2893,10 @@ UINT8 GetActionModeCursor( SOLDIERTYPE *pSoldier )
if ( HasItemFlag( usInHand, CAMERA ) ) if ( HasItemFlag( usInHand, CAMERA ) )
ubCursor = CAMERACURS; ubCursor = CAMERACURS;
// Flugente: blood bag cursor
if ( HasItemFlag( usInHand, EMPTY_BLOOD_BAG ) )
ubCursor = BLOODBAGCURS;
// Flugente: interactive actions // Flugente: interactive actions
// we only check whether an action is possible in principle, not whether this particular guy can do it. That way we know an action is possible here even if we can't perform it at the moment. // we only check whether an action is possible in principle, not whether this particular guy can do it. That way we know an action is possible here even if we can't perform it at the moment.
// only do this if the item doesn't already allow us to do something else // only do this if the item doesn't already allow us to do something else
+19 -1
View File
@@ -145,6 +145,9 @@ CursorFileData CursorFileDatabase[] =
{ "CURSORS\\camera.sti" , FALSE, 0, ANIMATED_CURSOR, 3, NULL }, // Flugente: camera { "CURSORS\\camera.sti" , FALSE, 0, ANIMATED_CURSOR, 3, NULL }, // Flugente: camera
{ "CURSORS\\camera_r.sti" , FALSE, 0, ANIMATED_CURSOR, 3, NULL }, { "CURSORS\\camera_r.sti" , FALSE, 0, ANIMATED_CURSOR, 3, NULL },
{ "CURSORS\\bloodbag.sti" , FALSE, 0, ANIMATED_CURSOR, 11, NULL }, // Flugente: bloodbag
{ "CURSORS\\bloodbag_r.sti" , FALSE, 0, ANIMATED_CURSOR, 1, NULL },
{ "CURSORS\\can_01.sti" , FALSE, 0, 0, 0, NULL }, { "CURSORS\\can_01.sti" , FALSE, 0, 0, 0, NULL },
{ "CURSORS\\can_02.sti" , FALSE, 0, 0, 0, NULL }, { "CURSORS\\can_02.sti" , FALSE, 0, 0, 0, NULL },
@@ -1340,7 +1343,22 @@ CursorData CursorDatabase[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, CENTER_CURSOR, CENTER_CURSOR, 0, 0, 0, 0 }, 2, CENTER_CURSOR, CENTER_CURSOR, 0, 0, 0, 0 },
// Flugente: blood bag
{ C_TRINGS, 6, 0, HIDE_SUBCURSOR, HIDE_SUBCURSOR,
C_BLOODBAG, 0, 0, CENTER_SUBCURSOR, CENTER_SUBCURSOR,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
2, CENTER_CURSOR, CENTER_CURSOR, 0, 0, 0, 0 },
{ C_TRINGS, 6, 0, HIDE_SUBCURSOR, HIDE_SUBCURSOR,
C_BLOODBAG_RED, 0, 0, CENTER_SUBCURSOR, CENTER_SUBCURSOR,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
2, CENTER_CURSOR, CENTER_CURSOR, 0, 0, 0, 0 },
{ C_TRINGS, 6, 0, HIDE_SUBCURSOR, HIDE_SUBCURSOR, { C_TRINGS, 6, 0, HIDE_SUBCURSOR, HIDE_SUBCURSOR,
C_FUEL , 0, 0, CENTER_SUBCURSOR, CENTER_SUBCURSOR, C_FUEL , 0, 0, CENTER_SUBCURSOR, CENTER_SUBCURSOR,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+6 -1
View File
@@ -180,9 +180,12 @@ typedef enum
CURSOR_CAMERA, CURSOR_CAMERA,
CURSOR_CAMERA_RED, CURSOR_CAMERA_RED,
CURSOR_BLOODBAG,
CURSOR_BLOODBAG_RED,
CURSOR_FUEL, CURSOR_FUEL,
CURSOR_FUEL_RED, CURSOR_FUEL_RED,
} CursorTypeDefines; } CursorTypeDefines;
typedef enum typedef enum
@@ -271,6 +274,8 @@ typedef enum
C_MINIGAME_RED, C_MINIGAME_RED,
C_CAMERA, C_CAMERA,
C_CAMERA_RED, C_CAMERA_RED,
C_BLOODBAG,
C_BLOODBAG_RED,
C_FUEL, C_FUEL,
C_FUEL_RED, C_FUEL_RED,
C_ACTIONMODERED_NCTH, C_ACTIONMODERED_NCTH,
+3
View File
@@ -2499,6 +2499,9 @@ enum
MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT, MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT,
MSG113_SURGERY_BEFORE_PATIENT_ASSIGNMENT, MSG113_SURGERY_BEFORE_PATIENT_ASSIGNMENT,
MSG113_SURGERY_ON_TACTICAL_AUTOBANDAGE, MSG113_SURGERY_ON_TACTICAL_AUTOBANDAGE,
MSG113_DO_WE_WANT_SURGERY_FIRST_BLOODBAG,
MSG113_DO_WE_WANT_SURGERY_BLOODBAG,
MSG113_SURGERY_BEFORE_DOCTOR_ASSIGNMENT_BLOODBAG,
MSG113_SURGERY_FINISHED, MSG113_SURGERY_FINISHED,
MSG113_LOSES_ONE_POINT_MAX_HEALTH, MSG113_LOSES_ONE_POINT_MAX_HEALTH,
MSG113_LOSES_X_POINTS_MAX_HEALTH, MSG113_LOSES_X_POINTS_MAX_HEALTH,
+23 -7
View File
@@ -294,7 +294,9 @@ itemStartElementHandle(void *userData, const XML_Char *name, const XML_Char **at
strcmp(name, "diseaseprotectionface" ) == 0 || strcmp(name, "diseaseprotectionface" ) == 0 ||
strcmp(name, "diseaseprotectionhand" ) == 0|| strcmp(name, "diseaseprotectionhand" ) == 0||
strcmp(name, "usRiotShieldStrength" ) == 0 || strcmp(name, "usRiotShieldStrength" ) == 0 ||
strcmp(name, "usRiotShieldGraphic" ) == 0)) strcmp(name, "usRiotShieldGraphic" ) == 0 ||
strcmp(name, "bloodbag" ) == 0 ||
strcmp(name, "emptybloodbag" ) == 0))
{ {
pData->curElement = ELEMENT_PROPERTY; pData->curElement = ELEMENT_PROPERTY;
//DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("itemStartElementHandle: going into element, name = %s",name) ); //DebugMsg(TOPIC_JA2, DBG_LEVEL_3, String("itemStartElementHandle: going into element, name = %s",name) );
@@ -1372,7 +1374,7 @@ itemEndElementHandle(void *userData, const XML_Char *name)
else if(strcmp(name, "ItemFlag") == 0) else if(strcmp(name, "ItemFlag") == 0)
{ {
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
pData->curItem.usItemFlag = (UINT32) strtoul(pData->szCharData, NULL, 0); pData->curItem.usItemFlag = (UINT64) strtoul(pData->szCharData, NULL, 0);
} }
else if(strcmp(name, "FoodType") == 0) else if(strcmp(name, "FoodType") == 0)
{ {
@@ -1517,6 +1519,20 @@ itemEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
pData->curItem.usRiotShieldGraphic = (UINT16)atol( pData->szCharData ); pData->curItem.usRiotShieldGraphic = (UINT16)atol( pData->szCharData );
} }
else if ( strcmp( name, "bloodbag" ) == 0 )
{
pData->curElement = ELEMENT;
if ( (BOOLEAN)atol( pData->szCharData ) )
pData->curItem.usItemFlag |= BLOOD_BAG;
}
else if ( strcmp( name, "emptybloodbag" ) == 0 )
{
pData->curElement = ELEMENT;
if ( (BOOLEAN)atol( pData->szCharData ) )
pData->curItem.usItemFlag |= EMPTY_BLOOD_BAG;
}
--pData->maxReadDepth; --pData->maxReadDepth;
} }
@@ -2150,11 +2166,11 @@ BOOLEAN WriteItemStats()
FilePrintf(hFile,"\t\t<cigarette>%d</cigarette>\r\n", Item[cnt].cigarette ); FilePrintf(hFile,"\t\t<cigarette>%d</cigarette>\r\n", Item[cnt].cigarette );
FilePrintf(hFile,"\t\t<usPortionSize>%d</usPortionSize>\r\n", Item[cnt].usPortionSize ); FilePrintf(hFile,"\t\t<usPortionSize>%d</usPortionSize>\r\n", Item[cnt].usPortionSize );
if ( Item[cnt].usItemFlag & DISEASEPROTECTION_1 ) if ( HasItemFlag( cnt, DISEASEPROTECTION_1 ) ) FilePrintf( hFile, "\t\t<diseaseprotectionface>%d</diseaseprotectionface>\r\n", 1 );
FilePrintf( hFile, "\t\t<diseaseprotectionface>%d</diseaseprotectionface>\r\n", 1 ); if ( HasItemFlag( cnt, DISEASEPROTECTION_2 ) ) FilePrintf( hFile, "\t\t<diseaseprotectionhand>%d</diseaseprotectionhand>\r\n", 1 );
if ( Item[cnt].usItemFlag & DISEASEPROTECTION_2 ) if ( HasItemFlag( cnt, BLOOD_BAG) ) FilePrintf( hFile, "\t\t<bloodbag>%d</bloodbag>\r\n", 1 );
FilePrintf( hFile, "\t\t<diseaseprotectionhand>%d</diseaseprotectionhand>\r\n", 1 ); if ( HasItemFlag( cnt, EMPTY_BLOOD_BAG ) ) FilePrintf( hFile, "\t\t<emptybloodbag>%d</emptybloodbag>\r\n", 1 );
FilePrintf(hFile,"\t\t<usRiotShieldStrength>%d</usRiotShieldStrength>\r\n", Item[cnt].usRiotShieldStrength ); FilePrintf(hFile,"\t\t<usRiotShieldStrength>%d</usRiotShieldStrength>\r\n", Item[cnt].usRiotShieldStrength );
FilePrintf(hFile,"\t\t<usRiotShieldGraphic>%d</usRiotShieldGraphic>\r\n", Item[cnt].usRiotShieldGraphic ); FilePrintf(hFile,"\t\t<usRiotShieldGraphic>%d</usRiotShieldGraphic>\r\n", Item[cnt].usRiotShieldGraphic );
+7
View File
@@ -7418,6 +7418,9 @@ STR16 New113Message[] =
L"是否进行必要的手术?(%i名病人)",// L"Do you wish to make necessary surgeries first? (%i patient(s))", L"是否进行必要的手术?(%i名病人)",// L"Do you wish to make necessary surgeries first? (%i patient(s))",
L"是否在该病人身上进行手术?",// L"Do you wish to make the surgery on this patient first?", L"是否在该病人身上进行手术?",// L"Do you wish to make the surgery on this patient first?",
L"在包扎前是否进行手术?",// L"Apply first aid automatically with necessary surgeries or without them?", L"在包扎前是否进行手术?",// L"Apply first aid automatically with necessary surgeries or without them?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"%s手术完毕。",// L"Surgery on %s finished.", L"%s手术完毕。",// L"Surgery on %s finished.",
L"%s 胸部中弹,失去1点生命上限!",// L"%s is hit in the chest and loses a point of maximum health!", L"%s 胸部中弹,失去1点生命上限!",// L"%s is hit in the chest and loses a point of maximum health!",
L"%s 胸部中弹,失去%d点生命上限!",// L"%s is hit in the chest and loses %d points of maximum health!", L"%s 胸部中弹,失去%d点生命上限!",// L"%s is hit in the chest and loses %d points of maximum health!",
@@ -8450,6 +8453,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|护|盾", //L"|S|h|i|e|l|d", L"|护|盾", //L"|S|h|i|e|l|d",
L"|照|相|机", //L"|C|a|m|e|r|a", L"|照|相|机", //L"|C|a|m|e|r|a",
L"|掩|埋|工|具|", //L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|掩|埋|工|具|", //L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g", // TODO.Translate
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8497,6 +8502,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \n拿在手里,就可以抵挡前方的伤害。", //L"\n \nIf equipped in a hand, this will block incoming damage.", L"\n \n拿在手里,就可以抵挡前方的伤害。", //L"\n \nIf equipped in a hand, this will block incoming damage.",
L"\n \n你可以使用它拍照。", //L"\n \nYou can take photos with this.", L"\n \n你可以使用它拍照。", //L"\n \nYou can take photos with this.",
L"\n \n这个物品能让你更有效地掩埋尸体。", //L"\n \nThis item makes you more effective at burying corpses.", L"\n \n这个物品能让你更有效地掩埋尸体。", //L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+7
View File
@@ -7430,6 +7430,9 @@ STR16 New113Message[] =
L"Do you wish to make surgeries first? (%i patient(s))", L"Do you wish to make surgeries first? (%i patient(s))",
L"Do you wish to make the surgery on this patient first?", L"Do you wish to make the surgery on this patient first?",
L"Apply first aid automatically with surgeries or without them?", L"Apply first aid automatically with surgeries or without them?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Surgery on %s finished.", L"Surgery on %s finished.",
L"%s is hit in the chest and loses a point of maximum health!", L"%s is hit in the chest and loses a point of maximum health!",
L"%s is hit in the chest and loses %d points of maximum health!", L"%s is hit in the chest and loses %d points of maximum health!",
@@ -8466,6 +8469,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|S|h|i|e|l|d", // TODO.Translate L"|S|h|i|e|l|d", // TODO.Translate
L"|C|a|m|e|r|a", // TODO.Translate L"|C|a|m|e|r|a", // TODO.Translate
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g", // TODO.Translate
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8513,6 +8518,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate
L"\n \nYou can take photos with this.", // TODO.Translate L"\n \nYou can take photos with this.", // TODO.Translate
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+11 -2
View File
@@ -7413,11 +7413,14 @@ STR16 New113Message[] =
// These added by SANDRO // These added by SANDRO
L"%s was successful at stealing!", // MINTY - Changed "on" to "at": More natural English L"%s was successful at stealing!", // MINTY - Changed "on" to "at": More natural English
L"%s did not have enough action points to steal all selected items.", // MINTY - Changed "had not" to "did not": More natural English L"%s did not have enough action points to steal all selected items.", // MINTY - Changed "had not" to "did not": More natural English
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i Health.)", // MINTY - Changed "make" to "perform": More natural English L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health.)", // MINTY - Changed "make" to "perform": More natural English
L"Do you want to perform surgery on %s? (You can heal about %i Health.)",// MINTY - Changed "make" to "perform": More natural English L"Do you want to perform surgery on %s? (You can heal about %i health.)",// MINTY - Changed "make" to "perform": More natural English
L"Do you wish to perform surgeries first? (%i patient(s))",// MINTY - Changed "make" to "perform": More natural English L"Do you wish to perform surgeries first? (%i patient(s))",// MINTY - Changed "make" to "perform": More natural English
L"Do you wish to perform the surgery on this patient first?",// MINTY - Changed "make" to "perform": More natural English L"Do you wish to perform the surgery on this patient first?",// MINTY - Changed "make" to "perform": More natural English
L"Apply first aid automatically with surgeries or without them?", L"Apply first aid automatically with surgeries or without them?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)",
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Surgery on %s finished.", L"Surgery on %s finished.",
L"%s is hit in the chest and loses a point of maximum health!", L"%s is hit in the chest and loses a point of maximum health!",
L"%s is hit in the chest and loses %d points of maximum health!", L"%s is hit in the chest and loses %d points of maximum health!",
@@ -8450,6 +8453,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|S|h|i|e|l|d", L"|S|h|i|e|l|d",
L"|C|a|m|e|r|a", L"|C|a|m|e|r|a",
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g",
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8497,6 +8502,10 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", L"\n \nIf equipped in a hand, this will block incoming damage.",
L"\n \nYou can take photos with this.", L"\n \nYou can take photos with this.",
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.",
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+7
View File
@@ -7427,6 +7427,9 @@ STR16 New113Message[] =
L"Voulez-vous lui faire les premiers soins d'abord ? (%i patient(s))", L"Voulez-vous lui faire les premiers soins d'abord ? (%i patient(s))",
L"Voulez-vous faire les premiers soins sur ce patient d'abord ?", L"Voulez-vous faire les premiers soins sur ce patient d'abord ?",
L"Appliquez les premiers soins automatiquement avec chirurgie ou sans ?", L"Appliquez les premiers soins automatiquement avec chirurgie ou sans ?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"La chirurgie sur %s est finie.", L"La chirurgie sur %s est finie.",
L"%s est touché(e) au torse et perd un maximum de points de vie !", L"%s est touché(e) au torse et perd un maximum de points de vie !",
L"%s est touché(e) au torse et perd %d points de vie !", L"%s est touché(e) au torse et perd %d points de vie !",
@@ -8453,6 +8456,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|S|h|i|e|l|d", // TODO.Translate L"|S|h|i|e|l|d", // TODO.Translate
L"|C|a|m|e|r|a", // TODO.Translate L"|C|a|m|e|r|a", // TODO.Translate
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g", // TODO.Translate
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8500,6 +8505,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate
L"\n \nYou can take photos with this.", // TODO.Translate L"\n \nYou can take photos with this.", // TODO.Translate
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+9 -2
View File
@@ -7254,6 +7254,9 @@ STR16 New113Message[] =
L"Möchten Sie zuerst Operationen durchführen? (%i Patient(en))", L"Möchten Sie zuerst Operationen durchführen? (%i Patient(en))",
L"Möchten Sie an diesem Patienten zuerst eine Operation durchführen?", L"Möchten Sie an diesem Patienten zuerst eine Operation durchführen?",
L"Erste Hilfe automatisch mit entsprechender operativer Behandlung durchführen oder ohne?", L"Erste Hilfe automatisch mit entsprechender operativer Behandlung durchführen oder ohne?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"%s wurde erfolgreich operiert.", L"%s wurde erfolgreich operiert.",
L"%s ist am Torso getroffen und verliert einen Punkt maximaler Gesundheit!", L"%s ist am Torso getroffen und verliert einen Punkt maximaler Gesundheit!",
L"%s ist am Torso getroffen und verliert %d Punkte maximaler Gesundheit!", L"%s ist am Torso getroffen und verliert %d Punkte maximaler Gesundheit!",
@@ -8279,9 +8282,11 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate
L"|F|a|c|e |P|r|o|t|e|c|t|i|o|n", L"|F|a|c|e |P|r|o|t|e|c|t|i|o|n",
L"|I|n|f|e|c|t|i|o|n |P|r|o|t|e|c|t|i|o|n", // 39 L"|I|n|f|e|c|t|i|o|n |P|r|o|t|e|c|t|i|o|n", // 39
L"|S|h|i|e|l|d", // TODO.Translate L"|S|c|h|i||l|d",
L"|C|a|m|e|r|a", // TODO.Translate L"|K|a|m|e|r|a",
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|B|l|u|t|b|e|u|t|e|l |(|l|e|e|r|)",
L"|B|l|u|t|b|e|u|t|e|l", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8329,6 +8334,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate
L"\n \nYou can take photos with this.", // TODO.Translate L"\n \nYou can take photos with this.", // TODO.Translate
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+7
View File
@@ -7421,6 +7421,9 @@ STR16 New113Message[] =
L"Do you wish to make surgeries first? (%i patient(s))", L"Do you wish to make surgeries first? (%i patient(s))",
L"Do you wish to make the surgery on this patient first?", L"Do you wish to make the surgery on this patient first?",
L"Apply first aid automatically with surgeries or without them?", L"Apply first aid automatically with surgeries or without them?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Surgery on %s finished.", L"Surgery on %s finished.",
L"%s is hit in the chest and loses a point of maximum health!", L"%s is hit in the chest and loses a point of maximum health!",
L"%s is hit in the chest and loses %d points of maximum health!", L"%s is hit in the chest and loses %d points of maximum health!",
@@ -8456,6 +8459,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|S|h|i|e|l|d", // TODO.Translate L"|S|h|i|e|l|d", // TODO.Translate
L"|C|a|m|e|r|a", // TODO.Translate L"|C|a|m|e|r|a", // TODO.Translate
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g", // TODO.Translate
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8503,6 +8508,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate
L"\n \nYou can take photos with this.", // TODO.Translate L"\n \nYou can take photos with this.", // TODO.Translate
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"包扎速度 +%d%s\n",// L"+%d%s bandaging speed\n", L"包扎速度 +%d%s\n",// L"+%d%s bandaging speed\n",
L"所在区域自然回复生命值速度 +%d%s",// L"+%d%s natural regeneration speed of all soldiers in the same sector", L"所在区域自然回复生命值速度 +%d%s",// L"+%d%s natural regeneration speed of all soldiers in the same sector",
L"(这种效果最多叠加%d次)",// L" (max %d these bonuses per sector)", L"(这种效果最多叠加%d次)",// L" (max %d these bonuses per sector)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s bandaging speed\n", L"+%d%s bandaging speed\n",
L"+%d%s natural regeneration speed for all soldiers in the same sector", L"+%d%s natural regeneration speed for all soldiers in the same sector",
L" (max %d of these bonuses per sector stack)", L" (max %d of these bonuses per sector stack)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s bandaging speed\n", L"+%d%s bandaging speed\n",
L"+%d%s natural regeneration speed for all soldiers in the same sector", L"+%d%s natural regeneration speed for all soldiers in the same sector",
L" (max %d of these bonuses per sector stack)", L" (max %d of these bonuses per sector stack)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n",
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s de vitesse de bandage\n", L"+%d%s de vitesse de bandage\n",
L"+%d%s de la vitesse de régénération naturelle de tous soldats présent dans le même secteur", L"+%d%s de la vitesse de régénération naturelle de tous soldats présent dans le même secteur",
L" (un maximum de %d bonus par secteur)", L" (un maximum de %d bonus par secteur)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s schnelleres Anlegen von Wundverbänden\n", L"+%d%s schnelleres Anlegen von Wundverbänden\n",
L"+%d%s natürliche Regenerationsrate aller Söldner im selben Sektor", L"+%d%s natürliche Regenerationsrate aller Söldner im selben Sektor",
L" (maximal %d Instanzen dieses Bonus pro Sektor)", L" (maximal %d Instanzen dieses Bonus pro Sektor)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -245,6 +245,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s bandaging speed\n", L"+%d%s bandaging speed\n",
L"+%d%s natural regeneration speed for all soldiers in the same sector", L"+%d%s natural regeneration speed for all soldiers in the same sector",
L" (max %d of these bonuses per sector stack)", L" (max %d of these bonuses per sector stack)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s bandaging speed\n", L"+%d%s bandaging speed\n",
L"+%d%s natural regeneration speed for all soldiers in the same sector", L"+%d%s natural regeneration speed for all soldiers in the same sector",
L" (max %d of these bonuses per sector stack)", L" (max %d of these bonuses per sector stack)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+1
View File
@@ -247,6 +247,7 @@ STR16 gzIMPMajorTraitsHelpTextsDoctor[]=
L"+%d%s к скорости перевязки\n", L"+%d%s к скорости перевязки\n",
L"+%d%s к природной скорости регенерации для всех солдат в том же квадрате", L"+%d%s к природной скорости регенерации для всех солдат в том же квадрате",
L" (максимум %d бонуса на находящихся в квадрате)", L" (максимум %d бонуса на находящихся в квадрате)",
L"Returned health can be boosted an additional %d%s by using blood bags.\n", // TODO.Translate
}; };
STR16 gzIMPMajorTraitsHelpTextsCovertOps[]= STR16 gzIMPMajorTraitsHelpTextsCovertOps[]=
+7
View File
@@ -7430,6 +7430,9 @@ STR16 New113Message[] =
L"Do you wish to perform surgeries first? (%i patient(s))", // TODO.Translate L"Do you wish to perform surgeries first? (%i patient(s))", // TODO.Translate
L"Czy chcesz najpierw operować pacjenta?", L"Czy chcesz najpierw operować pacjenta?",
L"Apply first aid automatically with surgeries or without them?", L"Apply first aid automatically with surgeries or without them?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"operacja na %s zakończona.", L"operacja na %s zakończona.",
L"%s otrzymuje trafienie w korpus i traci punkt maksymalnego zdrowia!", L"%s otrzymuje trafienie w korpus i traci punkt maksymalnego zdrowia!",
L"%s otrzymuje trafienie w korpus i traci %d punktów maksymalnego zdrowia!", L"%s otrzymuje trafienie w korpus i traci %d punktów maksymalnego zdrowia!",
@@ -8468,6 +8471,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|S|h|i|e|l|d", // TODO.Translate L"|S|h|i|e|l|d", // TODO.Translate
L"|C|a|m|e|r|a", // TODO.Translate L"|C|a|m|e|r|a", // TODO.Translate
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g", // TODO.Translate
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8515,6 +8520,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate
L"\n \nYou can take photos with this.", // TODO.Translate L"\n \nYou can take photos with this.", // TODO.Translate
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=
+7
View File
@@ -7418,6 +7418,9 @@ STR16 New113Message[] =
L"Do you wish to perform surgeries first? (%i patient(s))", // TODO.Translate L"Do you wish to perform surgeries first? (%i patient(s))", // TODO.Translate
L"Хотите провести операцию сначала этому пациенту?", //Do you wish to perform the surgery on this patient first? L"Хотите провести операцию сначала этому пациенту?", //Do you wish to perform the surgery on this patient first?
L"Apply first aid automatically with surgeries or without them?", L"Apply first aid automatically with surgeries or without them?",
L"Do you want to perform surgery on %s before bandaging? (You can heal about %i health, *: %i by blood bag use.)", // TODO.Translate
L"Do you want to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"Do you wish to perform surgery on %s? (You can heal about %i Health, *: %i by blood bag use.)",
L"%s успешно прооперирован(а).", //Surgery on %s finished. L"%s успешно прооперирован(а).", //Surgery on %s finished.
L"%s пропустил(а) удар в грудную клетку и теряет единицу максимального значения здоровья!", //%s is hit in the chest and loses a point of maximum health! L"%s пропустил(а) удар в грудную клетку и теряет единицу максимального значения здоровья!", //%s is hit in the chest and loses a point of maximum health!
L"%s пропустил(а) удар в грудную клетку и теряет %d максимального значения здоровья!", //%s is hit in the chest and loses %d points of maximum health! L"%s пропустил(а) удар в грудную клетку и теряет %d максимального значения здоровья!", //%s is hit in the chest and loses %d points of maximum health!
@@ -8450,6 +8453,8 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
L"|S|h|i|e|l|d", // TODO.Translate L"|S|h|i|e|l|d", // TODO.Translate
L"|C|a|m|e|r|a", // TODO.Translate L"|C|a|m|e|r|a", // TODO.Translate
L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r", L"|B|u|r|i|a|l |M|o|d|i|f|i|e|r",
L"|E|m|p|t|y |B|l|o|o|d |B|a|g", // TODO.Translate
L"|B|l|o|o|d |B|a|g", // 44
}; };
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
@@ -8497,6 +8502,8 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate L"\n \nIf equipped in a hand, this will block incoming damage.", // TODO.Translate
L"\n \nYou can take photos with this.", // TODO.Translate L"\n \nYou can take photos with this.", // TODO.Translate
L"\n \nThis item makes you more effective at burying corpses.", L"\n \nThis item makes you more effective at burying corpses.",
L"\n \nA paramedic can extract blood\nfrom a donor with this.", // TODO.Translate
L"\n \nA paramedic can use up this item to increase\nthe amount of health regenerated by surgery.", // 44
}; };
STR16 szUDBAdvStatsTooltipText[]= STR16 szUDBAdvStatsTooltipText[]=