From 1c74ca4bf1a7ff2af8026bff32c8955b829c0e00 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sun, 5 May 2013 20:56:00 +0000 Subject: [PATCH] new feature: fixed bayonets (still in need of animation) git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6065 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Interface Items.cpp | 60 +++++++++++++++++++++++++---------- Tactical/Interface Panels.cpp | 5 +-- Tactical/Items.cpp | 30 ++++++++++-------- Tactical/Items.h | 12 +++---- Tactical/Soldier Control.cpp | 26 +++++++++++++-- Tactical/Turn Based Input.cpp | 4 +-- Tactical/Weapons.cpp | 24 ++++++++++---- Tactical/Weapons.h | 1 + Utils/Text.h | 1 + Utils/_ChineseText.cpp | 1 + Utils/_DutchText.cpp | 1 + Utils/_EnglishText.cpp | 1 + Utils/_FrenchText.cpp | 1 + Utils/_GermanText.cpp | 1 + Utils/_ItalianText.cpp | 1 + Utils/_PolishText.cpp | 1 + Utils/_RussianText.cpp | 1 + Utils/_TaiwaneseText.cpp | 1 + 18 files changed, 122 insertions(+), 50 deletions(-) diff --git a/Tactical/Interface Items.cpp b/Tactical/Interface Items.cpp index e832f3bc8..3fd9a9342 100644 --- a/Tactical/Interface Items.cpp +++ b/Tactical/Interface Items.cpp @@ -3740,24 +3740,47 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec // Flugente: check for underbarrel weapons and use that object if necessary OBJECTTYPE* pObjShown = pObject; INVTYPE *pItemShown = pItem; - if ( pItem->usItemClass == IC_GUN && pSoldier && ( pSoldier->bWeaponMode == WM_ATTACHED_UB || pSoldier->bWeaponMode == WM_ATTACHED_UB_BURST || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO ) ) + if ( pItem->usItemClass == IC_GUN && pSoldier ) { - OBJECTTYPE *pObjectUnderBarrel = FindAttachment_UnderBarrel( pObject ); - - if ( pObjectUnderBarrel ) + if ( pSoldier->bWeaponMode == WM_ATTACHED_UB || pSoldier->bWeaponMode == WM_ATTACHED_UB_BURST || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO ) { - INVTYPE *pItemUnderBarrel; - if ( ubStatusIndex < RENDER_ITEM_ATTACHMENT1 ) - { - pItemUnderBarrel = &Item[ pObjectUnderBarrel->usItem ]; - } - else - { - pItemUnderBarrel = &Item[ (*pObjectUnderBarrel)[iter]->GetAttachmentAtIndex( ubStatusIndex - RENDER_ITEM_ATTACHMENT1 )->usItem ]; - } + OBJECTTYPE *pObjectUnderBarrel = FindAttachedWeapon( pObject, IC_GUN ); - pObjShown = pObjectUnderBarrel; - pItemShown = pItemUnderBarrel; + if ( pObjectUnderBarrel ) + { + INVTYPE *pItemUnderBarrel; + if ( ubStatusIndex < RENDER_ITEM_ATTACHMENT1 ) + { + pItemUnderBarrel = &Item[ pObjectUnderBarrel->usItem ]; + } + else + { + pItemUnderBarrel = &Item[ (*pObjectUnderBarrel)[iter]->GetAttachmentAtIndex( ubStatusIndex - RENDER_ITEM_ATTACHMENT1 )->usItem ]; + } + + pObjShown = pObjectUnderBarrel; + pItemShown = pItemUnderBarrel; + } + } + else if ( pSoldier->bWeaponMode == WM_ATTACHED_BAYONET ) + { + OBJECTTYPE *pObjectUnderBarrel = FindAttachedWeapon( pObject, IC_BLADE ); + + if ( pObjectUnderBarrel ) + { + INVTYPE *pItemUnderBarrel; + if ( ubStatusIndex < RENDER_ITEM_ATTACHMENT1 ) + { + pItemUnderBarrel = &Item[ pObjectUnderBarrel->usItem ]; + } + else + { + pItemUnderBarrel = &Item[ (*pObjectUnderBarrel)[iter]->GetAttachmentAtIndex( ubStatusIndex - RENDER_ITEM_ATTACHMENT1 )->usItem ]; + } + + pObjShown = pObjectUnderBarrel; + pItemShown = pItemUnderBarrel; + } } } @@ -4083,7 +4106,12 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec swprintf( pStr, New113Message[MSG113_UB_AUTO] ); SetFontForeground( FONT_ORANGE ); } - + else if(pSoldier->bWeaponMode == WM_ATTACHED_BAYONET) + { + swprintf( pStr, New113Message[MSG113_BAYONET] ); + SetFontForeground( FONT_ORANGE ); + } + // Get length of string uiStringLength=StringPixLength(pStr, ITEM_FONT ); diff --git a/Tactical/Interface Panels.cpp b/Tactical/Interface Panels.cpp index 985e6bef8..d1dafeeba 100644 --- a/Tactical/Interface Panels.cpp +++ b/Tactical/Interface Panels.cpp @@ -1099,7 +1099,7 @@ void UpdateSMPanel( ) // Enable some buttons! // Changed by ADB, rev 1513 //if ( ((IsGunAutofireCapable( gpSMCurrentMerc, HANDPOS ) || IsGunBurstCapable( gpSMCurrentMerc, HANDPOS , FALSE )) && !Weapon[gpSMCurrentMerc->inv[HANDPOS].usItem].NoSemiAuto ) || IsGrenadeLauncherAttached ( &(gpSMCurrentMerc->inv[HANDPOS]) ) ) - if ( ((IsGunAutofireCapable( &gpSMCurrentMerc->inv[HANDPOS] ) || IsGunBurstCapable( &gpSMCurrentMerc->inv[HANDPOS], FALSE, gpSMCurrentMerc )) && !Weapon[gpSMCurrentMerc->inv[HANDPOS].usItem].NoSemiAuto ) || IsGrenadeLauncherAttached ( &(gpSMCurrentMerc->inv[HANDPOS]) ) || IsUnderBarrelAttached( &(gpSMCurrentMerc->inv[HANDPOS]) ) ) + if ( ((IsGunAutofireCapable( &gpSMCurrentMerc->inv[HANDPOS] ) || IsGunBurstCapable( &gpSMCurrentMerc->inv[HANDPOS], FALSE, gpSMCurrentMerc )) && !Weapon[gpSMCurrentMerc->inv[HANDPOS].usItem].NoSemiAuto ) || IsGrenadeLauncherAttached ( &(gpSMCurrentMerc->inv[HANDPOS]) ) || IsWeaponAttached( &(gpSMCurrentMerc->inv[HANDPOS]), IC_GUN ) ) { EnableButton( iSMPanelButtons[ BURSTMODE_BUTTON ] ); } @@ -2189,6 +2189,7 @@ BOOLEAN CreateSMPanelButtons( ) iBurstButtonImages[ WM_ATTACHED_UB ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 7, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_UB_BURST ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); iBurstButtonImages[ WM_ATTACHED_UB_AUTO ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); + iBurstButtonImages[ WM_ATTACHED_BAYONET ] = UseLoadedButtonImage( iSMPanelImages[ STANCEUP_IMAGES ], -1, 17, -1, -1, -1 ); FilenameForBPP("INTERFACE\\invadd-ons.sti", ubString); // Load button Graphics @@ -2415,7 +2416,7 @@ void RemoveSMPanelButtons( ) UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_UB ] ); UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_UB_BURST ] ); UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_UB_AUTO ] ); - + UnloadButtonImage( iBurstButtonImages[ WM_ATTACHED_BAYONET ] ); } diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 394dabafc..e75ff6a62 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -8035,8 +8035,9 @@ BOOLEAN OBJECTTYPE::RemoveAttachment( OBJECTTYPE* pAttachment, OBJECTTYPE * pNew if (pSoldier != NULL) { // if in attached weapon mode and don't have weapon with GL attached in hand, reset weapon mode - if ( ( (pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO )&& !IsGrenadeLauncherAttached( &(pSoldier->inv[ HANDPOS ]) ) ) || - ( (pSoldier->bWeaponMode == WM_ATTACHED_UB || pSoldier->bWeaponMode == WM_ATTACHED_UB_BURST || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO )&& !IsUnderBarrelAttached( &(pSoldier->inv[ HANDPOS ] ) ) ) ) + if ( ( (pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO ) && !IsGrenadeLauncherAttached( &(pSoldier->inv[ HANDPOS ] ) ) ) || + ( (pSoldier->bWeaponMode == WM_ATTACHED_UB || pSoldier->bWeaponMode == WM_ATTACHED_UB_BURST || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO ) && !IsWeaponAttached( &(pSoldier->inv[ HANDPOS ]), IC_GUN ) ) || + ( (pSoldier->bWeaponMode == WM_ATTACHED_BAYONET ) && !IsWeaponAttached( &(pSoldier->inv[ HANDPOS ]), IC_BLADE ) ) ) { if ( !Weapon[pSoldier->inv[ HANDPOS ].usItem].NoSemiAuto ) { @@ -11740,27 +11741,28 @@ UINT16 GetAttachedGrenadeLauncher( OBJECTTYPE * pObj ) return( NONE ); } -UINT16 GetAttachedUnderBarrel( OBJECTTYPE * pObj ) +INT16 GetUnderBarrelStatus( OBJECTTYPE * pObj, UINT32 usFlag ) { if (pObj->exists() == true) { for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) { - if (iter->exists() && (Item[iter->usItem].usItemClass & (IC_GUN | IC_BLADE) )) + if (iter->exists() && Item[iter->usItem].usItemClass & usFlag ) { - return( (UINT16) Item[iter->usItem].uiIndex ); + return( (*iter)[0]->data.objectStatus ); } } } - return( NONE ); + return( ITEM_NOT_FOUND ); } -BOOLEAN IsUnderBarrelAttached( OBJECTTYPE * pObj, UINT8 subObject ) + +BOOLEAN IsWeaponAttached( OBJECTTYPE * pObj, UINT32 usFlag, UINT8 subObject ) { if (pObj->exists() == true) { for (attachmentList::iterator iter = (*pObj)[subObject]->attachments.begin(); iter != (*pObj)[subObject]->attachments.end(); ++iter) { - if (iter->exists() && Item[iter->usItem].usItemClass & (IC_GUN | IC_BLADE) ) + if (iter->exists() && Item[iter->usItem].usItemClass & usFlag ) { return TRUE; } @@ -11769,13 +11771,13 @@ BOOLEAN IsUnderBarrelAttached( OBJECTTYPE * pObj, UINT8 subObject ) return FALSE; } -OBJECTTYPE* FindAttachment_UnderBarrel( OBJECTTYPE * pObj ) +OBJECTTYPE* FindAttachedWeapon( OBJECTTYPE * pObj, UINT32 usFlag ) { if (pObj->exists() == true) { for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) { - if (iter->exists() && Item[iter->usItem].usItemClass & (IC_GUN | IC_BLADE) ) + if (iter->exists() && Item[iter->usItem].usItemClass & usFlag ) { return( &(*iter) ); } @@ -11784,19 +11786,19 @@ OBJECTTYPE* FindAttachment_UnderBarrel( OBJECTTYPE * pObj ) return( NULL ); } -INT16 GetUnderBarrelStatus( OBJECTTYPE * pObj ) +UINT16 GetAttachedWeapon( OBJECTTYPE * pObj, UINT32 usFlag ) { if (pObj->exists() == true) { for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) { - if (iter->exists() && Item[iter->usItem].usItemClass & (IC_GUN | IC_BLADE) ) + if (iter->exists() && (Item[iter->usItem].usItemClass & usFlag ) ) { - return( (*iter)[0]->data.objectStatus ); + return( (UINT16) Item[iter->usItem].uiIndex ); } } } - return( ITEM_NOT_FOUND ); + return( NONE ); } INT16 GetAttachedArmourBonus( OBJECTTYPE * pObj ) diff --git a/Tactical/Items.h b/Tactical/Items.h index 3cf2b328e..be24d27c7 100644 --- a/Tactical/Items.h +++ b/Tactical/Items.h @@ -346,12 +346,12 @@ BOOLEAN IsGrenadeLauncherAttached( OBJECTTYPE * pObj, UINT8 subObject = 0 ); OBJECTTYPE* FindAttachment_GrenadeLauncher( OBJECTTYPE * pObj ); UINT16 GetAttachedGrenadeLauncher( OBJECTTYPE * pObj ); -// JMich & Flugente: functions for underbarrel weapons -INT16 GetUnderBarrelStatus( OBJECTTYPE * pObj ); -BOOLEAN IsUnderBarrelAttached( OBJECTTYPE * pObj, UINT8 subObject = 0 ); -OBJECTTYPE* FindAttachment_UnderBarrel( OBJECTTYPE * pObj ); -UINT16 GetAttachedUnderBarrel( OBJECTTYPE * pObj ); -OBJECTTYPE* GetUsedWeapon( OBJECTTYPE * pObj ); +// JMich & Flugente: functions for underbarrel weapons and bayonets +// As we can have both underbarrel gun and a bayonet, use usFlag to specify (IC_GUN or IC_BLADE are used here, or both) +INT16 GetUnderBarrelStatus( OBJECTTYPE * pObj, UINT32 usFlag ); +BOOLEAN IsWeaponAttached( OBJECTTYPE * pObj, UINT32 usFlag, UINT8 subObject = 0 ); +OBJECTTYPE* FindAttachedWeapon( OBJECTTYPE * pObj, UINT32 usFlag ); +UINT16 GetAttachedWeapon( OBJECTTYPE * pObj, UINT32 usFlag ); INT8 FindRocketLauncher( SOLDIERTYPE * pSoldier ); INT8 FindRocketLauncherOrCannon( SOLDIERTYPE * pSoldier ); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 750870b07..98eaa934e 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -11682,8 +11682,14 @@ void SOLDIERTYPE::EVENT_SoldierBeginBladeAttack( INT32 sGridNo, UINT8 ubDirectio { GetSoldier( &pTSoldier, usSoldierIndex ); + // Flugente: if we attack with a bayonet, we don't need to change stance if even if we are stadning and the target is prone... + // so we simulate here that the target is still standing + UINT8 targetheight = gAnimControl[ pTSoldier->usAnimState ].ubEndHeight; + if ( this->bWeaponMode == WM_ATTACHED_BAYONET ) + targetheight = ANIM_STAND; + // Look at stance of target - switch( gAnimControl[ pTSoldier->usAnimState ].ubEndHeight ) + switch( targetheight ) { case ANIM_STAND: case ANIM_CROUCH: @@ -13945,7 +13951,14 @@ OBJECTTYPE* SOLDIERTYPE::GetUsedWeapon( OBJECTTYPE * pObj ) { if ( bWeaponMode == WM_ATTACHED_UB || bWeaponMode == WM_ATTACHED_UB_BURST || bWeaponMode == WM_ATTACHED_UB_AUTO ) { - OBJECTTYPE* pObjUnderBarrel = FindAttachment_UnderBarrel(pObj); + OBJECTTYPE* pObjUnderBarrel = FindAttachedWeapon(pObj, IC_GUN); + + if ( pObjUnderBarrel ) + return( pObjUnderBarrel ); + } + else if ( bWeaponMode == WM_ATTACHED_BAYONET ) + { + OBJECTTYPE* pObjUnderBarrel = FindAttachedWeapon(pObj, IC_BLADE); if ( pObjUnderBarrel ) return( pObjUnderBarrel ); @@ -13958,7 +13971,14 @@ UINT16 SOLDIERTYPE::GetUsedWeaponNumber( OBJECTTYPE * pObj ) { if ( bWeaponMode == WM_ATTACHED_UB || bWeaponMode == WM_ATTACHED_UB_BURST || bWeaponMode == WM_ATTACHED_UB_AUTO ) { - UINT16 weaponnr = GetAttachedUnderBarrel(pObj); + UINT16 weaponnr = GetAttachedWeapon(pObj, IC_GUN); + + if ( weaponnr != NONE ) + return( weaponnr ); + } + else if ( bWeaponMode == WM_ATTACHED_BAYONET ) + { + UINT16 weaponnr = GetAttachedWeapon(pObj, IC_BLADE); if ( weaponnr != NONE ) return( weaponnr ); diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 0c4dd40df..24b84cfca 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -4025,9 +4025,9 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) } } } - if (IsUnderBarrelAttached(pGun)) + if (IsWeaponAttached(pGun, IC_GUN)) { - OBJECTTYPE *pGun2 = FindAttachment_UnderBarrel(pGun); + OBJECTTYPE *pGun2 = FindAttachedWeapon(pGun, IC_GUN); if ( (*pGun2)[0]->data.gun.ubGunShotsLeft < GetMagSize( pGun2 ) ) { diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index ab306cbb6..71a33408d 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -1388,6 +1388,8 @@ BOOLEAN FireWeapon( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo ) UINT32 usItemClass = Item[ pSoldier->usAttackingWeapon ].usItemClass; if ( pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO ) usItemClass = IC_LAUNCHER; + if ( pSoldier->bWeaponMode == WM_ATTACHED_BAYONET ) + usItemClass = IC_BLADE; switch( usItemClass ) { @@ -9556,6 +9558,10 @@ UINT32 CalcChanceHTH( SOLDIERTYPE * pAttacker,SOLDIERTYPE *pDefender, INT16 ubAi usInHand = pAttacker->usAttackingWeapon; + // Flugente: we might be using a bayonet, we should check that + if ( pAttacker->bWeaponMode == WM_ATTACHED_BAYONET ) + usInHand = pAttacker->GetUsedWeaponNumber( &(pAttacker->inv[HANDPOS]) ); + if ( (usInHand != CREATURE_QUEEN_TENTACLES ) && (pDefender->stats.bLife < OKLIFE || pDefender->bBreath < OKBREATH) ) { // there is NO way to miss @@ -10167,9 +10173,9 @@ void ReloadWeapon( SOLDIERTYPE *pSoldier, UINT8 ubHandPos ) { pSoldier->inv[ ubHandPos ][0]->data.gun.ubGunShotsLeft = GetMagSize(&pSoldier->inv[ ubHandPos ]); // Dirty Bars - if ( IsUnderBarrelAttached(&pSoldier->inv[ ubHandPos ])) + if ( IsWeaponAttached(&pSoldier->inv[ ubHandPos ], IC_GUN) ) { - (*FindAttachment_UnderBarrel(&pSoldier->inv[ ubHandPos ]))[0]->data.gun.ubGunShotsLeft = GetMagSize(FindAttachment_UnderBarrel(&pSoldier->inv[ ubHandPos ])); + (*FindAttachedWeapon(&pSoldier->inv[ ubHandPos ], IC_GUN))[0]->data.gun.ubGunShotsLeft = GetMagSize(FindAttachedWeapon(&pSoldier->inv[ ubHandPos ], IC_GUN)); } DirtyMercPanelInterface( pSoldier, DIRTYLEVEL1 ); } @@ -10226,13 +10232,16 @@ BOOLEAN IsGunWeaponModeCapable( OBJECTTYPE* pObject, WeaponMode bWpnMode, SOLDIE // return (!Item[pSoldier->inv[ubHandPos].usItem].grenadelauncher && Weapon[GetAttachedGrenadeLauncher(&pSoldier->inv[ubHandPos])].bAutofireShotsPerFiveAP > 0 && FindLaunchableAttachment( &(pSoldier->inv[ubHandPos]), GetAttachedGrenadeLauncher( &(pSoldier->inv[ubHandPos]) ) != ITEM_NOT_FOUND ); case WM_ATTACHED_UB: - return (IsUnderBarrelAttached( pObject ) && !Weapon[FindAttachment_UnderBarrel(pObject)->usItem].NoSemiAuto ); + return (IsWeaponAttached( pObject, IC_GUN ) && !Weapon[FindAttachedWeapon(pObject, IC_GUN)->usItem].NoSemiAuto ); case WM_ATTACHED_UB_BURST: - return (IsUnderBarrelAttached( pObject ) && IsGunBurstCapable(FindAttachment_UnderBarrel(pObject), FALSE, pSoldier)); + return (IsWeaponAttached( pObject, IC_GUN ) && IsGunBurstCapable(FindAttachedWeapon(pObject, IC_GUN), FALSE, pSoldier)); case WM_ATTACHED_UB_AUTO: - return (IsUnderBarrelAttached( pObject ) && (IsGunAutofireCapable(FindAttachment_UnderBarrel(pObject)) || Weapon[FindAttachment_UnderBarrel(pObject)->usItem].NoSemiAuto)); + return (IsWeaponAttached( pObject, IC_GUN ) && (IsGunAutofireCapable(FindAttachedWeapon(pObject, IC_GUN)) || Weapon[FindAttachedWeapon(pObject, IC_GUN)->usItem].NoSemiAuto)); + + case WM_ATTACHED_BAYONET: + return IsWeaponAttached( pObject, IC_BLADE ); default: return FALSE; @@ -10300,8 +10309,9 @@ void HandleTacticalEffectsOfEquipmentChange( SOLDIERTYPE *pSoldier, UINT32 uiInv SetBurstAndAutoFireMode(pSoldier, GetWeaponMode(&pSoldier->inv[uiInvPos])); #endif // if in attached weapon mode and don't have weapon with GL attached in hand, reset weapon mode - if ( ( (pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO )&& !IsGrenadeLauncherAttached( &(pSoldier->inv[ HANDPOS ]) ) ) || - ( (pSoldier->bWeaponMode == WM_ATTACHED_UB || pSoldier->bWeaponMode == WM_ATTACHED_UB_BURST || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO )&& !IsUnderBarrelAttached( &(pSoldier->inv[ HANDPOS ] ) ) ) ) + if ( ( (pSoldier->bWeaponMode == WM_ATTACHED_GL || pSoldier->bWeaponMode == WM_ATTACHED_GL_BURST || pSoldier->bWeaponMode == WM_ATTACHED_GL_AUTO ) && !IsGrenadeLauncherAttached( &(pSoldier->inv[ HANDPOS ] ) ) ) || + ( (pSoldier->bWeaponMode == WM_ATTACHED_UB || pSoldier->bWeaponMode == WM_ATTACHED_UB_BURST || pSoldier->bWeaponMode == WM_ATTACHED_UB_AUTO ) && !IsWeaponAttached( &(pSoldier->inv[ HANDPOS ]), IC_GUN ) ) || + ( (pSoldier->bWeaponMode == WM_ATTACHED_BAYONET ) && !IsWeaponAttached( &(pSoldier->inv[ HANDPOS ]), IC_BLADE ) ) ) { if ( !Weapon[pSoldier->inv[ HANDPOS ].usItem].NoSemiAuto ) { diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h index ce05ef621..fc3f35a6e 100644 --- a/Tactical/Weapons.h +++ b/Tactical/Weapons.h @@ -15,6 +15,7 @@ enum WeaponMode WM_ATTACHED_UB, WM_ATTACHED_UB_BURST, WM_ATTACHED_UB_AUTO, + WM_ATTACHED_BAYONET, NUM_WEAPON_MODES } ; diff --git a/Utils/Text.h b/Utils/Text.h index 9cbe9a487..d7f3dbb56 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -2271,6 +2271,7 @@ enum MSG113_UB, MSG113_UB_BRST, MSG113_UB_AUTO, + MSG113_BAYONET, MSG113_SNIPER, MSG113_UNABLETOSPLITMONEY, MSG113_ARRIVINGREROUTED, diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 1bd57e7c1..c0c025053 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -6169,6 +6169,7 @@ STR16 New113Message[] = L"UB", // INFO: UB = Under Barrel L"UBRST", L"UAUTO", + L"BAYONET", L"狙击手!", L"已经点选物品,此时无法分钱。", L"新兵的会合地被挪至 %s, 因降落地点 %s 目前由敌人占据。", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 01a915b30..1e5e625c6 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -6174,6 +6174,7 @@ STR16 New113Message[] = L"UB", L"UBRST", L"UAUTO", + L"BAYONET", L"Sniper!", L"Unable to split money due to having an item on your cursor.", L"Arrival of new recruits is being rerouted to sector %s, as scheduled drop-off point of sector %s is enemy occupied.", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 2a956b600..82a759380 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -6169,6 +6169,7 @@ STR16 New113Message[] = L"UB", L"UBRST", L"UAUTO", + L"BAYONET", L"Sniper!", L"Unable to split money due to having an item on your cursor.", L"Arrival of new recruits is being rerouted to sector %s, as scheduled drop-off point of sector %s is enemy occupied.", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index cc4d48781..6238ca961 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -6165,6 +6165,7 @@ STR16 New113Message[] = L"UB", // TODO.Translate L"UBRST", L"UAUTO", + L"BAYONET", L"Tireur embusqué !", L"Unable to split money due to having an item on your cursor.", L"Arrivée de nouvelles recrues est déroutée au secteur %s, car le point d'arrivée prévu %s est sous contrôle ennemi.", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 64053d16f..45dde9ba7 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -5996,6 +5996,7 @@ STR16 New113Message[] = L"UB", L"UBRST", L"UAUTO", + L"BAYONET", L"Scharfschütze!", L"Geld kann nicht aufgeteilt werden, weil ein Gegenstand am Cursor ist.", L"Ankunft der neuen Söldner wurde in den Sektor %s verlegt, weil der geplante Sektor %s von Feinden belagert ist.", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 55963622d..6eb4493c5 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -6160,6 +6160,7 @@ STR16 New113Message[] = L"UB", L"UBRST", L"UAUTO", + L"BAYONET", L"Sniper!", L"Unable to split money due to having an item on your cursor.", L"Arrival of new recruits is being rerouted to sector %s, as scheduled drop-off point of sector %s is enemy occupied.", diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 59252b927..dd8aa7ebd 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -6175,6 +6175,7 @@ STR16 New113Message[] = L"UB", // TODO.Translate L"UBRST", L"UAUTO", + L"BAYONET", L"Snajper!", L"Nie można podzielić pieniędzy z powodu przedmiotu na kursorze.", L"Przybycie nowych rekrutów zostało przekierowane do sektora %s , z uwagi na to, że poprzedni punkt zrzutu w sektorze %s jest zajęty przez wroga.", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index d06c28586..f1c7a0396 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -6167,6 +6167,7 @@ STR16 New113Message[] = L"UB", // TODO.Translate L"UBRST", L"UAUTO", + L"BAYONET", L"Снайпер!", L"Невозможно разделить деньги из-за предмета на курсоре.", L"Точка высадки прибывающих наёмников перенесена в %s, так как запланированное место высадки %s захвачено противником.", diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index 0a6471698..faaaf7fbf 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -6177,6 +6177,7 @@ STR16 New113Message[] = L"UB", L"UBRST", L"UAUTO", + L"BAYONET", L"Sniper!", L"Unable to split money due to having an item on your cursor.", L"Arrival of new recruits is being rerouted to sector %s, as scheduled drop-off point of sector %s is enemy occupied.",