diff --git a/Content/Blueprints/BP_FighterGameInstance.uasset b/Content/Blueprints/BP_FighterGameInstance.uasset index fe10ce2..a188f27 100644 Binary files a/Content/Blueprints/BP_FighterGameInstance.uasset and b/Content/Blueprints/BP_FighterGameInstance.uasset differ diff --git a/Content/Blueprints/BP_FighterGameState.uasset b/Content/Blueprints/BP_FighterGameState.uasset index d93a44b..e4bcbf4 100644 Binary files a/Content/Blueprints/BP_FighterGameState.uasset and b/Content/Blueprints/BP_FighterGameState.uasset differ diff --git a/Content/Blueprints/CharacterBP/Common/States/AirTech.uasset b/Content/Blueprints/CharacterBP/Common/States/AirTech.uasset index e019f76..9b4e75e 100644 Binary files a/Content/Blueprints/CharacterBP/Common/States/AirTech.uasset and b/Content/Blueprints/CharacterBP/Common/States/AirTech.uasset differ diff --git a/Content/Blueprints/CharacterBP/Common/States/WakeUp.uasset b/Content/Blueprints/CharacterBP/Common/States/WakeUp.uasset new file mode 100644 index 0000000..0feb416 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Common/States/WakeUp.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/BP_Mannequin.uasset b/Content/Blueprints/CharacterBP/Mannequin/BP_Mannequin.uasset index 253b2b8..b322700 100644 Binary files a/Content/Blueprints/CharacterBP/Mannequin/BP_Mannequin.uasset and b/Content/Blueprints/CharacterBP/Mannequin/BP_Mannequin.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/Manny_CollisionData.uasset b/Content/Blueprints/CharacterBP/Mannequin/Manny_CollisionData.uasset index f7393f0..3892b80 100644 Binary files a/Content/Blueprints/CharacterBP/Mannequin/Manny_CollisionData.uasset and b/Content/Blueprints/CharacterBP/Mannequin/Manny_CollisionData.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/Manny_StateData.uasset b/Content/Blueprints/CharacterBP/Mannequin/Manny_StateData.uasset index 89d93ed..31b4ede 100644 Binary files a/Content/Blueprints/CharacterBP/Mannequin/Manny_StateData.uasset and b/Content/Blueprints/CharacterBP/Mannequin/Manny_StateData.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_2A.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_2A.uasset new file mode 100644 index 0000000..7f4b106 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_2A.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_5A.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_5A.uasset new file mode 100644 index 0000000..5572310 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_5A.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Air5A.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Air5A.uasset new file mode 100644 index 0000000..9646885 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Air5A.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_AirBlock.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_AirBlock.uasset new file mode 100644 index 0000000..0cdb560 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_AirBlock.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_AirTech.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_AirTech.uasset new file mode 100644 index 0000000..821a1b5 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_AirTech.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_BLaunch.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_BLaunch.uasset new file mode 100644 index 0000000..78ded3f Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_BLaunch.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_BackWalk.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_BackWalk.uasset new file mode 100644 index 0000000..112960b Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_BackWalk.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Block.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Block.uasset new file mode 100644 index 0000000..c7286e0 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Block.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_CrouchBlock.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_CrouchBlock.uasset new file mode 100644 index 0000000..22a6926 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_CrouchBlock.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Crumple.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Crumple.uasset new file mode 100644 index 0000000..2010ec7 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Crumple.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_FaceUp.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_FaceUp.uasset new file mode 100644 index 0000000..850051b Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_FaceUp.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_FaceUpBounce.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_FaceUpBounce.uasset new file mode 100644 index 0000000..27950a7 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_FaceUpBounce.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun0.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun0.uasset new file mode 100644 index 0000000..1293231 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun0.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun1.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun1.uasset new file mode 100644 index 0000000..15a9e21 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun1.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun2.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun2.uasset new file mode 100644 index 0000000..5ea2aa8 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun2.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun3.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun3.uasset new file mode 100644 index 0000000..7369b94 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun3.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun4.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun4.uasset new file mode 100644 index 0000000..32167a2 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_Hitstun4.uasset differ diff --git a/Content/Blueprints/CharacterBP/Mannequin/States/Manny_WakeUpFaceUp.uasset b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_WakeUpFaceUp.uasset new file mode 100644 index 0000000..61df652 Binary files /dev/null and b/Content/Blueprints/CharacterBP/Mannequin/States/Manny_WakeUpFaceUp.uasset differ diff --git a/Content/CharacterAssets/Common/Animations/BaseAnimBP.uasset b/Content/CharacterAssets/Common/Animations/BaseAnimBP.uasset index c8fd846..7462d1e 100644 Binary files a/Content/CharacterAssets/Common/Animations/BaseAnimBP.uasset and b/Content/CharacterAssets/Common/Animations/BaseAnimBP.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_2A.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_2A.uasset new file mode 100644 index 0000000..c8b6d8c Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_2A.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_5A.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_5A.uasset new file mode 100644 index 0000000..e3fb9bc Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_5A.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_Air5A.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_Air5A.uasset new file mode 100644 index 0000000..c13f917 Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_Air5A.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_AnimArray.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_AnimArray.uasset index 4b05ee1..4cb2297 100644 Binary files a/Content/CharacterAssets/Mannequins/Animations/Manny_AnimArray.uasset and b/Content/CharacterAssets/Mannequins/Animations/Manny_AnimArray.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_airblock.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_airblock.uasset new file mode 100644 index 0000000..a989ef0 Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_airblock.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_airtech.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_airtech.uasset new file mode 100644 index 0000000..20e4701 Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_airtech.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_backlaunch.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_backlaunch.uasset new file mode 100644 index 0000000..f2e19ae Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_backlaunch.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_backwalk.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_backwalk.uasset new file mode 100644 index 0000000..134b333 Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_backwalk.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_block.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_block.uasset new file mode 100644 index 0000000..b2d6bca Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_block.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_crouchblock.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_crouchblock.uasset new file mode 100644 index 0000000..b377e6e Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_crouchblock.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_crumple.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_crumple.uasset new file mode 100644 index 0000000..18d927e Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_crumple.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_forwardwalk.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_forwardwalk.uasset index ef5732a..7745120 100644 Binary files a/Content/CharacterAssets/Mannequins/Animations/Manny_forwardwalk.uasset and b/Content/CharacterAssets/Mannequins/Animations/Manny_forwardwalk.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_hitstun.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_hitstun.uasset new file mode 100644 index 0000000..73ef4f2 Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_hitstun.uasset differ diff --git a/Content/CharacterAssets/Mannequins/Animations/Manny_wakeup.uasset b/Content/CharacterAssets/Mannequins/Animations/Manny_wakeup.uasset new file mode 100644 index 0000000..dc791d0 Binary files /dev/null and b/Content/CharacterAssets/Mannequins/Animations/Manny_wakeup.uasset differ diff --git a/Content/Manny_2A_sequencer.uasset b/Content/Manny_2A_sequencer.uasset new file mode 100644 index 0000000..7f68978 Binary files /dev/null and b/Content/Manny_2A_sequencer.uasset differ diff --git a/Content/Manny_5A_sequencer.uasset b/Content/Manny_5A_sequencer.uasset new file mode 100644 index 0000000..80464c3 Binary files /dev/null and b/Content/Manny_5A_sequencer.uasset differ diff --git a/Content/Manny_Air5A_sequencer.uasset b/Content/Manny_Air5A_sequencer.uasset new file mode 100644 index 0000000..a14131a Binary files /dev/null and b/Content/Manny_Air5A_sequencer.uasset differ diff --git a/Content/Manny_airblock_sequencer.uasset b/Content/Manny_airblock_sequencer.uasset new file mode 100644 index 0000000..08f0678 Binary files /dev/null and b/Content/Manny_airblock_sequencer.uasset differ diff --git a/Content/Manny_airtech_sequencer.uasset b/Content/Manny_airtech_sequencer.uasset new file mode 100644 index 0000000..24502d7 Binary files /dev/null and b/Content/Manny_airtech_sequencer.uasset differ diff --git a/Content/Manny_backlaunch_sequencer.uasset b/Content/Manny_backlaunch_sequencer.uasset new file mode 100644 index 0000000..20c9425 Binary files /dev/null and b/Content/Manny_backlaunch_sequencer.uasset differ diff --git a/Content/Manny_backwalk_sequencer.uasset b/Content/Manny_backwalk_sequencer.uasset new file mode 100644 index 0000000..e4697fb Binary files /dev/null and b/Content/Manny_backwalk_sequencer.uasset differ diff --git a/Content/Manny_block_sequencer.uasset b/Content/Manny_block_sequencer.uasset new file mode 100644 index 0000000..212b583 Binary files /dev/null and b/Content/Manny_block_sequencer.uasset differ diff --git a/Content/Manny_crouch_sequencer.uasset b/Content/Manny_crouch_sequencer.uasset index f222a63..617602a 100644 Binary files a/Content/Manny_crouch_sequencer.uasset and b/Content/Manny_crouch_sequencer.uasset differ diff --git a/Content/Manny_crouchblock_sequencer.uasset b/Content/Manny_crouchblock_sequencer.uasset new file mode 100644 index 0000000..138de39 Binary files /dev/null and b/Content/Manny_crouchblock_sequencer.uasset differ diff --git a/Content/Manny_crumple_sequencer.uasset b/Content/Manny_crumple_sequencer.uasset new file mode 100644 index 0000000..00a2d1b Binary files /dev/null and b/Content/Manny_crumple_sequencer.uasset differ diff --git a/Content/Manny_forwardwalk_sequencer.uasset b/Content/Manny_forwardwalk_sequencer.uasset index 42c0d91..92e67b2 100644 Binary files a/Content/Manny_forwardwalk_sequencer.uasset and b/Content/Manny_forwardwalk_sequencer.uasset differ diff --git a/Content/Manny_hitstun_sequencer.uasset b/Content/Manny_hitstun_sequencer.uasset new file mode 100644 index 0000000..a2511a2 Binary files /dev/null and b/Content/Manny_hitstun_sequencer.uasset differ diff --git a/Content/Manny_wakeup_sequence.uasset b/Content/Manny_wakeup_sequence.uasset new file mode 100644 index 0000000..eb3bc1c Binary files /dev/null and b/Content/Manny_wakeup_sequence.uasset differ diff --git a/Content/Maps/Battle/TestMap.umap b/Content/Maps/Battle/TestMap.umap index 419ca5c..b75c036 100644 Binary files a/Content/Maps/Battle/TestMap.umap and b/Content/Maps/Battle/TestMap.umap differ diff --git a/Content/UI/Battle/W_Battle.uasset b/Content/UI/Battle/W_Battle.uasset index bcbf376..69fa8f5 100644 Binary files a/Content/UI/Battle/W_Battle.uasset and b/Content/UI/Battle/W_Battle.uasset differ diff --git a/Content/UI/CharaSelect/CharaSelectData.uasset b/Content/UI/CharaSelect/CharaSelectData.uasset index 693f0db..152bbcc 100644 Binary files a/Content/UI/CharaSelect/CharaSelectData.uasset and b/Content/UI/CharaSelect/CharaSelectData.uasset differ diff --git a/Content/UI/CharaSelect/W_CSelectMain.uasset b/Content/UI/CharaSelect/W_CSelectMain.uasset index 9120cad..7abd74d 100644 Binary files a/Content/UI/CharaSelect/W_CSelectMain.uasset and b/Content/UI/CharaSelect/W_CSelectMain.uasset differ diff --git a/Source/FighterEngine/Battle/Actors/BattleActor.cpp b/Source/FighterEngine/Battle/Actors/BattleActor.cpp index 37e4679..38c57ce 100644 --- a/Source/FighterEngine/Battle/Actors/BattleActor.cpp +++ b/Source/FighterEngine/Battle/Actors/BattleActor.cpp @@ -262,6 +262,7 @@ void ABattleActor::HaltMomentum() { SpeedX = 0; SpeedY = 0; + Gravity = 0; ClearInertia(); } @@ -617,491 +618,518 @@ void ABattleActor::HandleHitCollision(APlayerCharacter* OtherChar) { if (IsAttacking && HitActive && !OtherChar->StrikeInvulnerable && OtherChar != Player) { - for (int i = 0; i < CollisionArraySize; i++) + if (!(AttackHeadAttribute && OtherChar->HeadInvulnerable)) { - if (CollisionBoxesInternal[i].Type == Hitbox) + for (int i = 0; i < CollisionArraySize; i++) { - for (int j = 0; j < CollisionArraySize; j++) + if (CollisionBoxesInternal[i].Type == Hitbox) { - if (OtherChar->CollisionBoxesInternal[j].Type == Hurtbox) + for (int j = 0; j < CollisionArraySize; j++) { - FCollisionBoxInternal Hitbox = CollisionBoxesInternal[i]; + if (OtherChar->CollisionBoxesInternal[j].Type == Hurtbox) + { + FCollisionBoxInternal Hitbox = CollisionBoxesInternal[i]; - FCollisionBoxInternal Hurtbox = OtherChar->CollisionBoxesInternal[j]; + FCollisionBoxInternal Hurtbox = OtherChar->CollisionBoxesInternal[j]; - if (FacingRight) - { - Hitbox.PosX += PosX; - } - else - { - Hitbox.PosX = -Hitbox.PosX + PosX; - } - Hitbox.PosY += PosY; - if (OtherChar->FacingRight) - { - Hurtbox.PosX += OtherChar->PosX; - } - else - { - Hurtbox.PosX = -Hurtbox.PosX + OtherChar->PosX; - } - Hurtbox.PosY += OtherChar->PosY; - - if (Hitbox.PosY + Hitbox.SizeY / 2 >= Hurtbox.PosY - Hurtbox.SizeY / 2 - && Hitbox.PosY - Hitbox.SizeY / 2 <= Hurtbox.PosY + Hurtbox.SizeY / 2 - && Hitbox.PosX + Hitbox.SizeX / 2 >= Hurtbox.PosX - Hurtbox.SizeX / 2 - && Hitbox.PosX - Hitbox.SizeX / 2 <= Hurtbox.PosX + Hurtbox.SizeX / 2) - { - OtherChar->HandleFlip(); - OtherChar->IsStunned = true; - OtherChar->HaltMomentum(); - HitActive = false; - HasHit = true; - int CollisionDepthX; - if (Hitbox.PosX < Hurtbox.PosX) - CollisionDepthX = Hurtbox.PosX - Hurtbox.SizeX / 2 - Hitbox.PosX - Hitbox.SizeX / 2; - else - CollisionDepthX = Hurtbox.PosX + Hurtbox.SizeX / 2 - Hitbox.PosX + Hitbox.SizeX / 2; - int CollisionDepthY; - if (Hitbox.PosY < Hurtbox.PosY) - CollisionDepthY = Hurtbox.PosY - Hurtbox.SizeY / 2 - Hitbox.PosY - Hitbox.SizeY / 2; + if (FacingRight) + { + Hitbox.PosX += PosX; + } else - CollisionDepthY = Hurtbox.PosY + Hurtbox.SizeY / 2 - Hitbox.PosY + Hitbox.SizeY / 2; - HitPosX = Hitbox.PosX - CollisionDepthX / 2; - HitPosY = Hitbox.PosY - CollisionDepthY / 2; - - if (IsPlayer) - Player->StateMachine.CurrentState->OnHitOrBlock(); + { + Hitbox.PosX = -Hitbox.PosX + PosX; + } + Hitbox.PosY += PosY; + if (OtherChar->FacingRight) + { + Hurtbox.PosX += OtherChar->PosX; + } else - ObjectState->OnHitOrBlock(); + { + Hurtbox.PosX = -Hurtbox.PosX + OtherChar->PosX; + } + Hurtbox.PosY += OtherChar->PosY; - if (OtherChar->EnableFlags & ENB_Block || OtherChar->Blockstun > 0) //check blocking + if (Hitbox.PosY + Hitbox.SizeY / 2 >= Hurtbox.PosY - Hurtbox.SizeY / 2 + && Hitbox.PosY - Hitbox.SizeY / 2 <= Hurtbox.PosY + Hurtbox.SizeY / 2 + && Hitbox.PosX + Hitbox.SizeX / 2 >= Hurtbox.PosX - Hurtbox.SizeX / 2 + && Hitbox.PosX - Hitbox.SizeX / 2 <= Hurtbox.PosX + Hurtbox.SizeX / 2) { - if (OtherChar->IsCorrectBlock(HitEffect.BlockType)) + OtherChar->HandleFlip(); + OtherChar->IsStunned = true; + OtherChar->HaltMomentum(); + HitActive = false; + HasHit = true; + int CollisionDepthX; + if (Hitbox.PosX < Hurtbox.PosX) + CollisionDepthX = Hurtbox.PosX - Hurtbox.SizeX / 2 - Hitbox.PosX - Hitbox.SizeX / 2; + else + CollisionDepthX = Hurtbox.PosX + Hurtbox.SizeX / 2 - Hitbox.PosX + Hitbox.SizeX / 2; + int CollisionDepthY; + if (Hitbox.PosY < Hurtbox.PosY) + CollisionDepthY = Hurtbox.PosY - Hurtbox.SizeY / 2 - Hitbox.PosY - Hitbox.SizeY / 2; + else + CollisionDepthY = Hurtbox.PosY + Hurtbox.SizeY / 2 - Hitbox.PosY + Hitbox.SizeY / 2; + HitPosX = Hitbox.PosX - CollisionDepthX / 2; + HitPosY = Hitbox.PosY - CollisionDepthY / 2; + + if (IsPlayer) + Player->StateMachine.CurrentState->OnHitOrBlock(); + else + ObjectState->OnHitOrBlock(); + + if (OtherChar->EnableFlags & ENB_Block || OtherChar->Blockstun > 0) //check blocking { - if (IsPlayer) - Player->StateMachine.CurrentState->OnBlock(); - else - ObjectState->OnBlock(); - OtherChar->Hitstop = HitEffect.Hitstop; - OtherChar->Blockstun = HitEffect.Blockstun; - Hitstop = HitEffect.Hitstop; - if (OtherChar->PosY <= 0) + if (OtherChar->IsCorrectBlock(HitEffect.BlockType)) { - OtherChar->SetInertia(-HitEffect.HitPushbackX); - if (OtherChar->TouchingWall) + if (IsPlayer) + Player->StateMachine.CurrentState->OnBlock(); + else + ObjectState->OnBlock(); + OtherChar->Hitstop = HitEffect.Hitstop; + OtherChar->Blockstun = HitEffect.Blockstun; + Hitstop = HitEffect.Hitstop; + if (OtherChar->PosY <= 0) { - if (IsPlayer && Player != nullptr) + OtherChar->SetInertia(-HitEffect.HitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-HitEffect.HitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-HitEffect.HitPushbackX); + } } } - } - else - { - OtherChar->SetInertia(-HitEffect.AirHitPushbackX); - if (OtherChar->TouchingWall) + else { - if (IsPlayer && Player != nullptr) + OtherChar->SetInertia(-HitEffect.AirHitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-HitEffect.AirHitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-HitEffect.AirHitPushbackX); + } } + OtherChar->SetSpeedY(HitEffect.AirHitPushbackY); + OtherChar->AirDashTimer = 0; } - OtherChar->SetSpeedY(HitEffect.AirHitPushbackY); - OtherChar->AirDashTimer = 0; + OtherChar->HandleBlockAction(); + return; } - OtherChar->HandleBlockAction(); - return; } - } - if (!OtherChar->IsAttacking) - { - if (IsPlayer) - Player->StateMachine.CurrentState->OnHit(); - else - ObjectState->OnHit(); - - int32 Proration = HitEffect.ForcedProration; - if (Player->ComboCounter == 0) - Proration *= HitEffect.InitialProration; - else - Proration *= 100; - if (Player->ComboCounter == 0) - OtherChar->TotalProration = 10000; - Proration = Proration * OtherChar->TotalProration / 10000; - OtherChar->TotalProration = OtherChar->TotalProration * HitEffect.ForcedProration / 100; - int FinalDamage; - if (Player->ComboCounter == 0) - FinalDamage = HitEffect.HitDamage; - else - FinalDamage = HitEffect.HitDamage * Proration * Player->ComboRate / 1000000; - - OtherChar->CurrentHealth -= FinalDamage; - Player->ComboCounter++; - if (OtherChar->CurrentHealth < 0) - OtherChar->CurrentHealth = 0; - OtherChar->Hitstop = HitEffect.Hitstop; - OtherChar->Blockstun = -1; - Hitstop = HitEffect.Hitstop; - OtherChar->Gravity = HitEffect.HitGravity; - if (OtherChar->PosY == 0 && OtherChar->KnockdownTime < 0) + if (!OtherChar->IsAttacking) { - if (HitEffect.GroundHitAction == HACT_GroundNormal) + if (IsPlayer) + Player->StateMachine.CurrentState->OnHit(); + else + ObjectState->OnHit(); + + int32 Proration = HitEffect.ForcedProration; + if (Player->ComboCounter == 0) + Proration *= HitEffect.InitialProration; + else + Proration *= 100; + if (Player->ComboCounter == 0) + OtherChar->TotalProration = 10000; + Proration = Proration * OtherChar->TotalProration / 10000; + OtherChar->TotalProration = OtherChar->TotalProration * HitEffect.ForcedProration / 100; + int FinalDamage; + if (Player->ComboCounter == 0) + FinalDamage = HitEffect.HitDamage; + else + FinalDamage = HitEffect.HitDamage * Proration * Player->ComboRate / 1000000; + + OtherChar->CurrentHealth -= FinalDamage; + Player->ComboCounter++; + if (OtherChar->CurrentHealth < 0) + OtherChar->CurrentHealth = 0; + OtherChar->Hitstop = HitEffect.Hitstop; + OtherChar->Blockstun = -1; + Hitstop = HitEffect.Hitstop; + OtherChar->Gravity = HitEffect.HitGravity; + if (OtherChar->PosY == 0 && OtherChar->KnockdownTime < 0) { - OtherChar->Hitstun = HitEffect.Hitstun; - OtherChar->Untech = -1; - OtherChar->SetInertia(-HitEffect.HitPushbackX); - if (OtherChar->TouchingWall) + if (HitEffect.GroundHitAction == HACT_GroundNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Hitstun = HitEffect.Hitstun; + OtherChar->Untech = -1; + OtherChar->SetInertia(-HitEffect.HitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-HitEffect.HitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-HitEffect.HitPushbackX); + } } } - } - else if (HitEffect.GroundHitAction == HACT_AirNormal) - { - OtherChar->Untech = HitEffect.Untech; - OtherChar->Hitstun = -1; - OtherChar->KnockdownTime = HitEffect.KnockdownTime; - OtherChar->SetInertia(-HitEffect.AirHitPushbackX); - if (OtherChar->TouchingWall) + else if (HitEffect.GroundHitAction == HACT_AirNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Untech = HitEffect.Untech; + OtherChar->Hitstun = -1; + OtherChar->KnockdownTime = HitEffect.KnockdownTime; + OtherChar->SetInertia(-HitEffect.AirHitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-HitEffect.AirHitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-HitEffect.AirHitPushbackX); + } } + OtherChar->SetSpeedY(HitEffect.AirHitPushbackY); } - OtherChar->SetSpeedY(HitEffect.AirHitPushbackY); + OtherChar->ReceivedHitAction = HitEffect.GroundHitAction; + OtherChar->ReceivedAttackLevel = HitEffect.AttackLevel; } - OtherChar->ReceivedHitAction = HitEffect.GroundHitAction; - OtherChar->ReceivedAttackLevel = HitEffect.AttackLevel; - } - else - { - if (HitEffect.AirHitAction == HACT_GroundNormal) + else { - OtherChar->Hitstun = HitEffect.Hitstun; - OtherChar->Untech = -1; - OtherChar->SetInertia(-HitEffect.HitPushbackX); - if (OtherChar->TouchingWall) + if (HitEffect.AirHitAction == HACT_GroundNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Hitstun = HitEffect.Hitstun; + OtherChar->Untech = -1; + OtherChar->SetInertia(-HitEffect.HitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-HitEffect.HitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-HitEffect.HitPushbackX); + } } } - } - else if (HitEffect.AirHitAction == HACT_AirNormal) - { - OtherChar->Untech = HitEffect.Untech; - OtherChar->Hitstun = -1; - OtherChar->KnockdownTime = HitEffect.KnockdownTime; - OtherChar->SetInertia(-HitEffect.AirHitPushbackX); - if (OtherChar->TouchingWall) + else if (HitEffect.AirHitAction == HACT_AirNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Untech = HitEffect.Untech; + OtherChar->Hitstun = -1; + OtherChar->KnockdownTime = HitEffect.KnockdownTime; + OtherChar->SetInertia(-HitEffect.AirHitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-HitEffect.AirHitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-HitEffect.AirHitPushbackX); + } } + OtherChar->SetSpeedY(HitEffect.AirHitPushbackY); } - OtherChar->SetSpeedY(HitEffect.AirHitPushbackY); + OtherChar->ReceivedHitAction = HitEffect.AirHitAction; + OtherChar->ReceivedAttackLevel = HitEffect.AttackLevel; + OtherChar->AirDashTimer = 0; } - OtherChar->ReceivedHitAction = HitEffect.AirHitAction; - OtherChar->ReceivedAttackLevel = HitEffect.AttackLevel; - OtherChar->AirDashTimer = 0; - } - if (strcmp(HitEffectName.GetString(), "")) - { - CreateCharaParticle(FString(HitEffectName.GetString()), POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - if (HitEffect.AttackLevel < 1) + + if (OtherChar->PosY <= 0 && OtherChar->HasBeenOTG > 1) { - PlayCommonSound("HitMeleeS"); + OtherChar->SetStrikeInvulnerable(true); + OtherChar->SetThrowInvulnerable(true); + OtherChar->Untech = 6; + OtherChar->SetSpeedY(15000); + OtherChar->SetInertia(-35000); } - else if (HitEffect.AttackLevel < 3) + if (OtherChar->PosY <= 0 && OtherChar->KnockdownTime > 0) + OtherChar->HasBeenOTG++; + + if (strcmp(HitEffectName.GetString(), "")) { - PlayCommonSound("HitMeleeM"); + CreateCharaParticle(FString(HitEffectName.GetString()), POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + if (HitEffect.AttackLevel < 1) + { + PlayCommonSound("HitMeleeS"); + } + else if (HitEffect.AttackLevel < 3) + { + PlayCommonSound("HitMeleeM"); + } + else + { + PlayCommonSound("HitMeleeL"); + } } - else + else if (ObjectState != nullptr) { - PlayCommonSound("HitMeleeL"); + if (ObjectState->StateType == EStateType::SpecialAttack || ObjectState->StateType == EStateType::SuperAttack) + { + CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + if (HitEffect.AttackLevel < 1) + { + PlayCommonSound("HitMeleeS"); + } + else if (HitEffect.AttackLevel < 3) + { + PlayCommonSound("HitMeleeM"); + } + else + { + PlayCommonSound("HitMeleeL"); + } + } + else + { + if (HitEffect.AttackLevel < 1) + { + CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeS"); + } + else if (HitEffect.AttackLevel < 3) + { + CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeM"); + } + else + { + CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeL"); + } + } + } + else if (IsPlayer) + { + if (Player->StateMachine.CurrentState->StateType == EStateType::SpecialAttack || Player->StateMachine.CurrentState->StateType == EStateType::SuperAttack) + { + CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + if (HitEffect.AttackLevel < 1) + { + PlayCommonSound("HitMeleeS"); + } + else if (HitEffect.AttackLevel < 3) + { + PlayCommonSound("HitMeleeM"); + } + else + { + PlayCommonSound("HitMeleeL"); + } + } + else + { + if (HitEffect.AttackLevel < 1) + { + CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeS"); + } + else if (HitEffect.AttackLevel < 3) + { + CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeM"); + } + else + { + CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeL"); + } + } } } - else if (ObjectState != nullptr) - { - if (ObjectState->StateType == EStateType::SpecialAttack || ObjectState->StateType == EStateType::SuperAttack) - { - CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - if (HitEffect.AttackLevel < 1) - { - PlayCommonSound("HitMeleeS"); - } - else if (HitEffect.AttackLevel < 3) - { - PlayCommonSound("HitMeleeM"); - } - else - { - PlayCommonSound("HitMeleeL"); - } - } - else - { - if (HitEffect.AttackLevel < 1) - { - CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeS"); - } - else if (HitEffect.AttackLevel < 3) - { - CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeM"); - } - else - { - CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeL"); - } - } - } - else if (IsPlayer) - { - if (Player->StateMachine.CurrentState->StateType == EStateType::SpecialAttack || Player->StateMachine.CurrentState->StateType == EStateType::SuperAttack) - { - CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - if (HitEffect.AttackLevel < 1) - { - PlayCommonSound("HitMeleeS"); - } - else if (HitEffect.AttackLevel < 3) - { - PlayCommonSound("HitMeleeM"); - } - else - { - PlayCommonSound("HitMeleeL"); - } - } - else - { - if (HitEffect.AttackLevel < 1) - { - CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeS"); - } - else if (HitEffect.AttackLevel < 3) - { - CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeM"); - } - else - { - CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeL"); - } - } - } - } - else - { - if (IsPlayer) - Player->StateMachine.CurrentState->OnCounterHit(); - else - ObjectState->OnCounterHit(); - - int32 Proration = CounterHitEffect.ForcedProration; - if (Player->ComboCounter == 0) - Proration *= CounterHitEffect.InitialProration; - else - Proration *= 100; - if (Player->ComboCounter == 0) - OtherChar->TotalProration = 10000; - Proration = Proration * OtherChar->TotalProration / 10000; - OtherChar->TotalProration = OtherChar->TotalProration * CounterHitEffect.ForcedProration / 100; - int FinalDamage; - if (Player->ComboCounter == 0) - FinalDamage = CounterHitEffect.HitDamage; else - FinalDamage = CounterHitEffect.HitDamage * Proration * Player->ComboRate / 1000000; - - OtherChar->CurrentHealth -= FinalDamage; - Player->ComboCounter++; - if (OtherChar->CurrentHealth < 0) - OtherChar->CurrentHealth = 0; - OtherChar->Hitstop = CounterHitEffect.Hitstop; - Hitstop = HitEffect.Hitstop; - OtherChar->Blockstun = -1; - OtherChar->Gravity = CounterHitEffect.HitGravity; - if (OtherChar->PosY == 0 && OtherChar->KnockdownTime < 0) { - if (CounterHitEffect.GroundHitAction == HACT_GroundNormal) + if (IsPlayer) + Player->StateMachine.CurrentState->OnCounterHit(); + else + ObjectState->OnCounterHit(); + + int32 Proration = CounterHitEffect.ForcedProration; + if (Player->ComboCounter == 0) + Proration *= CounterHitEffect.InitialProration; + else + Proration *= 100; + if (Player->ComboCounter == 0) + OtherChar->TotalProration = 10000; + Proration = Proration * OtherChar->TotalProration / 10000; + OtherChar->TotalProration = OtherChar->TotalProration * CounterHitEffect.ForcedProration / 100; + int FinalDamage; + if (Player->ComboCounter == 0) + FinalDamage = CounterHitEffect.HitDamage; + else + FinalDamage = CounterHitEffect.HitDamage * Proration * Player->ComboRate / 1000000; + + OtherChar->CurrentHealth -= FinalDamage; + Player->ComboCounter++; + if (OtherChar->CurrentHealth < 0) + OtherChar->CurrentHealth = 0; + OtherChar->Hitstop = CounterHitEffect.Hitstop; + Hitstop = HitEffect.Hitstop; + OtherChar->Blockstun = -1; + OtherChar->Gravity = CounterHitEffect.HitGravity; + if (OtherChar->PosY == 0 && OtherChar->KnockdownTime < 0) { - OtherChar->Hitstun = CounterHitEffect.Hitstun; - OtherChar->Untech = -1; - OtherChar->SetInertia(-CounterHitEffect.HitPushbackX); - if (OtherChar->TouchingWall) + if (CounterHitEffect.GroundHitAction == HACT_GroundNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Hitstun = CounterHitEffect.Hitstun; + OtherChar->Untech = -1; + OtherChar->SetInertia(-CounterHitEffect.HitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-CounterHitEffect.HitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-CounterHitEffect.HitPushbackX); + } } } - } - else if (CounterHitEffect.GroundHitAction == HACT_AirNormal) - { - OtherChar->Untech = CounterHitEffect.Untech; - OtherChar->Hitstun = -1; - OtherChar->KnockdownTime = CounterHitEffect.KnockdownTime; - OtherChar->SetInertia(-CounterHitEffect.AirHitPushbackX); - if (OtherChar->TouchingWall) + else if (CounterHitEffect.GroundHitAction == HACT_AirNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Untech = CounterHitEffect.Untech; + OtherChar->Hitstun = -1; + OtherChar->KnockdownTime = CounterHitEffect.KnockdownTime; + OtherChar->SetInertia(-CounterHitEffect.AirHitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-CounterHitEffect.AirHitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-CounterHitEffect.AirHitPushbackX); + } } + OtherChar->SetSpeedY(CounterHitEffect.AirHitPushbackY); } - OtherChar->SetSpeedY(CounterHitEffect.AirHitPushbackY); + OtherChar->ReceivedHitAction = CounterHitEffect.GroundHitAction; + OtherChar->ReceivedAttackLevel = CounterHitEffect.AttackLevel; } - OtherChar->ReceivedHitAction = CounterHitEffect.GroundHitAction; - OtherChar->ReceivedAttackLevel = CounterHitEffect.AttackLevel; - } - else - { - if (CounterHitEffect.AirHitAction == HACT_GroundNormal) + else { - OtherChar->Hitstun = CounterHitEffect.Hitstun; - OtherChar->Untech = -1; - OtherChar->SetInertia(-CounterHitEffect.HitPushbackX); - if (OtherChar->TouchingWall) + if (CounterHitEffect.AirHitAction == HACT_GroundNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Hitstun = CounterHitEffect.Hitstun; + OtherChar->Untech = -1; + OtherChar->SetInertia(-CounterHitEffect.HitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-CounterHitEffect.HitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-CounterHitEffect.HitPushbackX); + } } } - } - else if (CounterHitEffect.AirHitAction == HACT_AirNormal) - { - OtherChar->Untech = CounterHitEffect.Untech; - OtherChar->Hitstun = -1; - OtherChar->KnockdownTime = CounterHitEffect.KnockdownTime; - OtherChar->SetInertia(-CounterHitEffect.AirHitPushbackX); - if (OtherChar->TouchingWall) + else if (CounterHitEffect.AirHitAction == HACT_AirNormal) { - if (IsPlayer && Player != nullptr) + OtherChar->Untech = CounterHitEffect.Untech; + OtherChar->Hitstun = -1; + OtherChar->KnockdownTime = CounterHitEffect.KnockdownTime; + OtherChar->SetInertia(-CounterHitEffect.AirHitPushbackX); + if (OtherChar->TouchingWall) { - SetInertia(-CounterHitEffect.AirHitPushbackX); + if (IsPlayer && Player != nullptr) + { + SetInertia(-CounterHitEffect.AirHitPushbackX); + } } + OtherChar->SetSpeedY(CounterHitEffect.AirHitPushbackY); } - OtherChar->SetSpeedY(CounterHitEffect.AirHitPushbackY); + OtherChar->ReceivedHitAction = CounterHitEffect.AirHitAction; + OtherChar->ReceivedAttackLevel = CounterHitEffect.AttackLevel; + OtherChar->AirDashTimer = 0; } - OtherChar->ReceivedHitAction = CounterHitEffect.AirHitAction; - OtherChar->ReceivedAttackLevel = CounterHitEffect.AttackLevel; - OtherChar->AirDashTimer = 0; - } - if (strcmp(HitEffectName.GetString(), "")) - { - CreateCharaParticle(FString(HitEffectName.GetString()), POS_Hit, FVector(-50, 0, 0), FRotator(-CounterHitEffect.HitAngle, 0, 0)); - if (CounterHitEffect.AttackLevel < 1) + + if (OtherChar->PosY <= 0 && OtherChar->HasBeenOTG > 1) + { + OtherChar->SetStrikeInvulnerable(true); + OtherChar->SetThrowInvulnerable(true); + OtherChar->Untech = 6; + OtherChar->SetSpeedY(15000); + OtherChar->SetInertia(-35000); + } + if (OtherChar->PosY <= 0 && OtherChar->KnockdownTime > 0) + OtherChar->HasBeenOTG = true; + + if (strcmp(HitEffectName.GetString(), "")) { - PlayCommonSound("HitMeleeS"); + CreateCharaParticle(FString(HitEffectName.GetString()), POS_Hit, FVector(-50, 0, 0), FRotator(-CounterHitEffect.HitAngle, 0, 0)); + if (CounterHitEffect.AttackLevel < 1) + { + PlayCommonSound("HitMeleeS"); + } + else if (CounterHitEffect.AttackLevel < 3) + { + PlayCommonSound("HitMeleeM"); + } + else + { + PlayCommonSound("HitMeleeL"); + } } - else if (CounterHitEffect.AttackLevel < 3) + else if (ObjectState != nullptr) { - PlayCommonSound("HitMeleeM"); + if (ObjectState->StateType == EStateType::SpecialAttack || ObjectState->StateType == EStateType::SuperAttack) + { + CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + if (CounterHitEffect.AttackLevel < 1) + { + PlayCommonSound("HitMeleeS"); + } + else if (CounterHitEffect.AttackLevel < 3) + { + PlayCommonSound("HitMeleeM"); + } + else + { + PlayCommonSound("HitMeleeL"); + } + } + else + { + if (CounterHitEffect.AttackLevel < 1) + { + CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeS"); + } + else if (CounterHitEffect.AttackLevel < 3) + { + CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeM"); + } + else + { + CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeL"); + } + } } - else + else if (IsPlayer) { - PlayCommonSound("HitMeleeL"); + if (Player->StateMachine.CurrentState->StateType == EStateType::SpecialAttack || Player->StateMachine.CurrentState->StateType == EStateType::SuperAttack) + { + CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + if (CounterHitEffect.AttackLevel < 1) + { + PlayCommonSound("HitMeleeS"); + } + else if (CounterHitEffect.AttackLevel < 3) + { + PlayCommonSound("HitMeleeM"); + } + else + { + PlayCommonSound("HitMeleeL"); + } + } + else + { + if (CounterHitEffect.AttackLevel < 1) + { + CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeS"); + } + else if (CounterHitEffect.AttackLevel < 3) + { + CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeM"); + } + else + { + CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); + PlayCommonSound("HitMeleeL"); + } + } } - } - else if (ObjectState != nullptr) + } + if(OtherChar->PosX < PosX) { - if (ObjectState->StateType == EStateType::SpecialAttack || ObjectState->StateType == EStateType::SuperAttack) - { - CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - if (CounterHitEffect.AttackLevel < 1) - { - PlayCommonSound("HitMeleeS"); - } - else if (CounterHitEffect.AttackLevel < 3) - { - PlayCommonSound("HitMeleeM"); - } - else - { - PlayCommonSound("HitMeleeL"); - } - } - else - { - if (CounterHitEffect.AttackLevel < 1) - { - CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeS"); - } - else if (CounterHitEffect.AttackLevel < 3) - { - CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeM"); - } - else - { - CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeL"); - } - } + OtherChar->SetFacing(true); } - else if (IsPlayer) + else if(OtherChar->PosX > PosX) { - if (Player->StateMachine.CurrentState->StateType == EStateType::SpecialAttack || Player->StateMachine.CurrentState->StateType == EStateType::SuperAttack) - { - CreateCommonParticle("cmn_hit_sp", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - if (CounterHitEffect.AttackLevel < 1) - { - PlayCommonSound("HitMeleeS"); - } - else if (CounterHitEffect.AttackLevel < 3) - { - PlayCommonSound("HitMeleeM"); - } - else - { - PlayCommonSound("HitMeleeL"); - } - } - else - { - if (CounterHitEffect.AttackLevel < 1) - { - CreateCommonParticle("cmn_hit_s", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeS"); - } - else if (CounterHitEffect.AttackLevel < 3) - { - CreateCommonParticle("cmn_hit_m", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeM"); - } - else - { - CreateCommonParticle("cmn_hit_l", POS_Hit, FVector(-50, 0, 0), FRotator(-HitEffect.HitAngle, 0, 0)); - PlayCommonSound("HitMeleeL"); - } - } + OtherChar->SetFacing(false); } - } - if(OtherChar->PosX < PosX) - { - OtherChar->SetFacing(true); - } - else if(OtherChar->PosX > PosX) - { - OtherChar->SetFacing(false); + OtherChar->Move(); + OtherChar->DisableAll(); + return; } - OtherChar->Move(); - OtherChar->DisableAll(); - return; } } } @@ -1148,6 +1176,11 @@ void ABattleActor::SetAttacking(bool Attacking) IsAttacking = Attacking; } +void ABattleActor::SetHeadAttribute(bool HeadAttribute) +{ + AttackHeadAttribute = HeadAttribute; +} + void ABattleActor::SetHitEffect(FHitEffect InHitEffect) { HitEffect = InHitEffect; @@ -1357,6 +1390,7 @@ void ABattleActor::ResetObject() CounterHitEffect = FHitEffect(); HitActive = false; IsAttacking = false; + AttackHeadAttribute = false; RoundStart = false; FacingRight = false; HasHit = false; diff --git a/Source/FighterEngine/Battle/Actors/BattleActor.h b/Source/FighterEngine/Battle/Actors/BattleActor.h index f56ddc7..e6b1a0c 100644 --- a/Source/FighterEngine/Battle/Actors/BattleActor.h +++ b/Source/FighterEngine/Battle/Actors/BattleActor.h @@ -137,6 +137,7 @@ class FIGHTERENGINE_API ABattleActor : public APawn FHitEffect CounterHitEffect; bool HitActive; bool IsAttacking; + bool AttackHeadAttribute; bool RoundStart = true; bool HasHit; bool DeactivateOnNextUpdate; @@ -274,6 +275,8 @@ class FIGHTERENGINE_API ABattleActor : public APawn UFUNCTION(BlueprintCallable) void SetAttacking(bool Attacking); //sets attacking. while this is true, you can be counter hit, but you can also chain cancel UFUNCTION(BlueprintCallable) + void SetHeadAttribute(bool HeadAttribute); //sets attacking. while this is true, you can be counter hit, but you can also chain cancel + UFUNCTION(BlueprintCallable) void SetHitEffect(FHitEffect InHitEffect); //sets hit effect on normal hit UFUNCTION(BlueprintCallable) void SetCounterHitEffect(FHitEffect InHitEffect); //sets hit effect on counter hit diff --git a/Source/FighterEngine/Battle/Actors/FighterGameState.cpp b/Source/FighterEngine/Battle/Actors/FighterGameState.cpp index 6fa8265..fb3c02f 100644 --- a/Source/FighterEngine/Battle/Actors/FighterGameState.cpp +++ b/Source/FighterEngine/Battle/Actors/FighterGameState.cpp @@ -279,8 +279,10 @@ void AFighterGameState::HandleRoundWin() BattleState.P1RoundsWon++; Players[0]->RoundWinTimer--; Players[0]->RoundWinInputLock = true; + BattleState.PauseTimer = true; if (Players[0]->RoundWinTimer <= 0) { + BattleState.PauseTimer = false; HandleMatchWin(); RoundInit(); } @@ -291,8 +293,10 @@ void AFighterGameState::HandleRoundWin() BattleState.P2RoundsWon++; Players[3]->RoundWinTimer--; Players[3]->RoundWinInputLock = true; + BattleState.PauseTimer = true; if (Players[3]->RoundWinTimer <= 0) { + BattleState.PauseTimer = false; HandleMatchWin(); RoundInit(); } @@ -306,12 +310,62 @@ void AFighterGameState::HandleRoundWin() } Players[0]->RoundWinInputLock = true; Players[0]->RoundWinTimer--; + BattleState.PauseTimer = true; if (Players[0]->RoundWinTimer <= 0) { + BattleState.PauseTimer = false; HandleMatchWin(); RoundInit(); } } + else if (BattleState.RoundTimer <= 0) + { + if (Players[0]->CurrentHealth > 0) + { + if (!Players[0]->RoundWinInputLock) + BattleState.P1RoundsWon++; + Players[0]->RoundWinTimer--; + Players[0]->RoundWinInputLock = true; + BattleState.PauseTimer = true; + if (Players[0]->RoundWinTimer <= 0) + { + BattleState.PauseTimer = false; + HandleMatchWin(); + RoundInit(); + } + } + else if (Players[3]->CurrentHealth > 0) + { + if (!Players[3]->RoundWinInputLock) + BattleState.P2RoundsWon++; + Players[3]->RoundWinTimer--; + Players[3]->RoundWinInputLock = true; + BattleState.PauseTimer = true; + if (Players[3]->RoundWinTimer <= 0) + { + BattleState.PauseTimer = false; + HandleMatchWin(); + RoundInit(); + } + } + else if (Players[0]->CurrentHealth == Players[3]->CurrentHealth) + { + if (!Players[0]->RoundWinInputLock) + { + BattleState.P1RoundsWon++; + BattleState.P2RoundsWon++; + } + Players[0]->RoundWinInputLock = true; + Players[0]->RoundWinTimer--; + BattleState.PauseTimer = true; + if (Players[0]->RoundWinTimer <= 0) + { + BattleState.PauseTimer = false; + HandleMatchWin(); + RoundInit(); + } + } + } } } @@ -755,6 +809,9 @@ void AFighterGameState::UpdateUI() BattleUIActor->Widget->P2Health[1] = float(Players[4]->CurrentHealth) / float(Players[4]->Health); BattleUIActor->Widget->P2Health[2] = float(Players[5]->CurrentHealth) / float(Players[5]->Health); } + BattleUIActor->Widget->P1RoundsWon = BattleState.P1RoundsWon; + BattleUIActor->Widget->P2RoundsWon = BattleState.P2RoundsWon; + BattleUIActor->Widget->Timer = ceil((float)BattleState.RoundTimer / 60); } } } diff --git a/Source/FighterEngine/Battle/Actors/PlayerCharacter.cpp b/Source/FighterEngine/Battle/Actors/PlayerCharacter.cpp index c3cee6f..c65ef34 100644 --- a/Source/FighterEngine/Battle/Actors/PlayerCharacter.cpp +++ b/Source/FighterEngine/Battle/Actors/PlayerCharacter.cpp @@ -151,6 +151,9 @@ void APlayerCharacter::Update() if (Untech == 0 && PosY > 0 && !IsDead) EnableState(ENB_Tech); + if (StateMachine.CurrentState->StateType == EStateType::Tech) + HasBeenOTG = 0; + if (StateMachine.CurrentState->StateType == EStateType::Hitstun && PosY <= 0 && PrevPosY > 0) { if (StateMachine.CurrentState->Name == "BLaunch") @@ -168,6 +171,8 @@ void APlayerCharacter::Update() if (KnockdownTime == 0 && PosY <= 0 && !IsDead) { + Enemy->ComboCounter = 0; + HasBeenOTG = 0; ClearInertia(); if (StateMachine.CurrentState->Name == "FaceDown" || StateMachine.CurrentState->Name == "FaceDownBounce") JumpToState("WakeUpFaceDown"); @@ -624,6 +629,10 @@ bool APlayerCharacter::IsCorrectBlock(EBlockType BlockType) { return true; } + if ((CheckInput(EInputCondition::Input_Left_Hold) || CheckInput(EInputCondition::Input_Left_Press))) + { + return true; + } } return false; } @@ -631,11 +640,11 @@ bool APlayerCharacter::IsCorrectBlock(EBlockType BlockType) void APlayerCharacter::HandleBlockAction() { EnableInertia(); - if (CheckInputRaw(InputLeft) && !CheckInputRaw(InputDown)) + if (CheckInputRaw(InputLeft) && !CheckInputRaw(InputDown) && PosY <= 0) { JumpToState("Block"); } - else if (CheckInputRaw(InputDownLeft)) + else if (CheckInputRaw(InputDownLeft) && PosY <= 0) { JumpToState("CrouchBlock"); } @@ -691,6 +700,11 @@ void APlayerCharacter::SetThrowInvulnerable(bool Invulnerable) ThrowInvulnerable = Invulnerable; } +void APlayerCharacter::SetHeadInvulnerable(bool Invulnerable) +{ + HeadInvulnerable = Invulnerable; +} + void APlayerCharacter::SetThrowActive(bool Active) { ThrowActive = Active; @@ -865,6 +879,7 @@ void APlayerCharacter::OnStateChange() WhiffCancelOptions.Empty(); StateName.SetString(""); HitEffectName.SetString(""); + Gravity = JumpGravity; for (int i = 0; i < CancelArraySize; i++) { ChainCancelOptionsInternal[i] = -1; @@ -886,6 +901,8 @@ void APlayerCharacter::OnStateChange() ThrowActive = false; StrikeInvulnerable = false; ThrowInvulnerable = false; + HeadInvulnerable = false; + AttackHeadAttribute = false; PushWidthExpand = 0; } @@ -1039,13 +1056,14 @@ void APlayerCharacter::ResetForRound() Untech = -1; TotalProration = 10000; ComboCounter = 0; + HasBeenOTG = 0; TouchingWall = false; ChainCancelEnabled = true; - WhiffCancelEnabled = true; - StrikeInvulnerable = true; - WhiffCancelEnabled = true; - StrikeInvulnerable = true; - ThrowInvulnerable = true; + WhiffCancelEnabled = false; + StrikeInvulnerable = false; + WhiffCancelEnabled = false; + StrikeInvulnerable = false; + ThrowInvulnerable = false; RoundWinTimer = 300; RoundWinInputLock = false; for (int i = 0; i < CancelArraySize; i++) diff --git a/Source/FighterEngine/Battle/Actors/PlayerCharacter.h b/Source/FighterEngine/Battle/Actors/PlayerCharacter.h index e41f259..6901d39 100644 --- a/Source/FighterEngine/Battle/Actors/PlayerCharacter.h +++ b/Source/FighterEngine/Battle/Actors/PlayerCharacter.h @@ -60,11 +60,13 @@ class FIGHTERENGINE_API APlayerCharacter : public ABattleActor int32 KnockdownTime = -1; int32 TotalProration = 10000; int32 ComboCounter = 0; + int HasBeenOTG; bool TouchingWall; bool ChainCancelEnabled = true; bool WhiffCancelEnabled; bool StrikeInvulnerable; bool ThrowInvulnerable; + bool HeadInvulnerable; int RoundWinTimer = 300; bool RoundWinInputLock; @@ -288,6 +290,8 @@ class FIGHTERENGINE_API APlayerCharacter : public ABattleActor UFUNCTION(BlueprintCallable) void SetThrowInvulnerable(bool Invulnerable); //sets throw invulnerable enabled UFUNCTION(BlueprintCallable) + void SetHeadInvulnerable(bool Invulnerable); //sets throw invulnerable enabled + UFUNCTION(BlueprintCallable) void SetThrowActive(bool Active); //initiate throw UFUNCTION(BlueprintCallable) void ThrowEnd(); //end throw diff --git a/Source/FighterEngine/Miscellaneous/FighterBattleWidget.h b/Source/FighterEngine/Miscellaneous/FighterBattleWidget.h index 69bdf53..bc3a36c 100644 --- a/Source/FighterEngine/Miscellaneous/FighterBattleWidget.h +++ b/Source/FighterEngine/Miscellaneous/FighterBattleWidget.h @@ -28,4 +28,8 @@ class FIGHTERENGINE_API UFighterBattleWidget : public UUserWidget float P1Gauge2; UPROPERTY(BlueprintReadOnly) float P2Gauge2; + UPROPERTY(BlueprintReadOnly) + int P1RoundsWon; + UPROPERTY(BlueprintReadOnly) + int P2RoundsWon; };