public void SetThrowBreak() { State = GameplayEnums.CharacterState.ThrowBreak; StateFrames = 0; Hitboxes.RemoveAll(o => o.HitboxType == GameplayEnums.HitboxType.Hurtbox_Limb); Hitboxes.RemoveAll(o => o.HitboxType == GameplayEnums.HitboxType.Hitbox_Throw); }
public CharacterState(bool _p1, Character _selectedCharacter) { Position = 0; StateFrames = 0; State = GameplayEnums.CharacterState.Idle; Hitboxes = new List <Hitbox_Gameplay>(); Gauge = 0; FacingRight = _p1; SelectedCharacter = _selectedCharacter; Armor = false; DisableThrowBreak = false; AttackConnected = false; }
public override void HandleInputs(CharacterState _cstate, SinglePlayerInputs _currentInputs, SinglePlayerInputs _previousInputs) { //can't block but can cancel into attack or throw GameplayEnums.CharacterState potentialCancelState = _cstate.GetCharacterAction(_currentInputs, _previousInputs); switch (potentialCancelState) { case GameplayEnums.CharacterState.AttackStartup: case GameplayEnums.CharacterState.ThrowStartup: _cstate.SetCharacterState(potentialCancelState); break; default: break; } }
public CharacterState(CharacterState _toCopy) { Position = _toCopy.Position; StateFrames = _toCopy.StateFrames; State = _toCopy.State; Hitboxes = new List <Hitbox_Gameplay>(); foreach (Hitbox_Gameplay hbox in _toCopy.Hitboxes) { Hitboxes.Add(new Hitbox_Gameplay(hbox)); } Gauge = _toCopy.Gauge; FacingRight = _toCopy.FacingRight; SelectedCharacter = _toCopy.SelectedCharacter.CopyCharacter(); Armor = _toCopy.Armor; DisableThrowBreak = _toCopy.DisableThrowBreak; AttackConnected = _toCopy.AttackConnected; }
public void SetCharacterState(GameplayEnums.CharacterState _state) { ResetAttributes(); State = _state; StateFrames = 0; switch (_state) { case GameplayEnums.CharacterState.AttackStartup: Hitboxes.Add(CreateHitbox(GameplayEnums.HitboxType.Hurtbox_Limb, GameplayConstants.HURTBOX_STARTUP)); SetCharacterHurtboxStanding(Hitboxes); DisableThrowBreak = true; AttackConnected = false; //play sfx GameManager.Instance.SoundManager.PlaySfx(SoundManager.SFX.Whiff); break; case GameplayEnums.CharacterState.ThrowStartup: Hitboxes.Add(CreateHitbox(GameplayEnums.HitboxType.Hurtbox_Limb, GameplayConstants.THROW_STARTUP_HURTBOX)); SetCharacterHurtboxStanding(Hitboxes); //play sfx GameManager.Instance.SoundManager.PlaySfx(SoundManager.SFX.Whiff); break; case GameplayEnums.CharacterState.WalkBack: case GameplayEnums.CharacterState.WalkForward: case GameplayEnums.CharacterState.Idle: SetCharacterHurtboxStanding(Hitboxes); break; case GameplayEnums.CharacterState.Crouch: SetCharacterHurtboxCrouching(Hitboxes); break; case GameplayEnums.CharacterState.Special: if (SelectedCharacter.CanUseSpecial(this)) { SelectedCharacter.SetSpecial(this); } else { State = GameplayEnums.CharacterState.Idle; } break; } }
private void CreateNewHitbox(Hitbox_Gameplay _hbox_gameplay, bool _p1, GameState _gameState) { Hitbox_Render _renderBox = new Hitbox_Render(); _renderBox.ReferenceBox = _hbox_gameplay; _renderBox.ObjectInGame = GameObject.CreatePrimitive(PrimitiveType.Cube); ModifyHitbox(_renderBox, _hbox_gameplay, _p1, _gameState); switch (_hbox_gameplay.HitboxType) { case GameplayEnums.HitboxType.Hitbox_Attack: case GameplayEnums.HitboxType.Hitbox_Throw: if (_p1) { _renderBox.ObjectInGame.GetComponent <Renderer>().material = P1_Active; } else { _renderBox.ObjectInGame.GetComponent <Renderer>().material = P2_Active; } break; case GameplayEnums.HitboxType.Hurtbox_Limb: case GameplayEnums.HitboxType.Hurtbox_Main: GameplayEnums.CharacterState currentCharacterState; if (_p1) { currentCharacterState = _gameState.P1_State; } else { currentCharacterState = _gameState.P2_State; } Material toSet; GameplayEnums.CharacterState cstate = currentCharacterState; if (cstate == GameplayEnums.CharacterState.Special) { if (_p1) { cstate = _gameState.P1_CState.SelectedCharacter.GetEquivalentState(); } else { cstate = _gameState.P2_CState.SelectedCharacter.GetEquivalentState(); } } switch (cstate) { case GameplayEnums.CharacterState.AttackActive: case GameplayEnums.CharacterState.AttackStartup: case GameplayEnums.CharacterState.ThrowActive: case GameplayEnums.CharacterState.ThrowStartup: if (_p1) { toSet = P1_Startup; } else { toSet = P2_Startup; } break; case GameplayEnums.CharacterState.AttackRecovery: case GameplayEnums.CharacterState.Blockstun: case GameplayEnums.CharacterState.Clash: case GameplayEnums.CharacterState.ThrowBreak: case GameplayEnums.CharacterState.ThrowRecovery: if (_p1) { toSet = P1_Recovery; } else { toSet = P2_Recovery; } break; default: if (_p1) { toSet = P1_Character; } else { toSet = P2_Character; } break; } _renderBox.ObjectInGame.GetComponent <Renderer>().material = toSet; break; } m_activeHitboxes.Add(_renderBox); }
//updates this character's state by one frame public MatchOutcome UpdateCharacterState() { int positionOffset = 0; ++StateFrames; switch (State) { case GameplayEnums.CharacterState.AttackActive: if (StateFrames > GameplayConstants.ATTACK_ACTIVE) { State = GameplayEnums.CharacterState.AttackRecovery; StateFrames = 0; Hitboxes.RemoveAll(o => o.HitboxType == GameplayEnums.HitboxType.Hitbox_Attack); ModifyHitbox(Hitboxes, GameplayConstants.HURTBOX_WHIFF_EARLY); DisableThrowBreak = false; } if (StateFrames == GameplayConstants.ATTACK_FULL_EXTEND) { ModifyHitbox(Hitboxes, GameplayConstants.HITBOX_ACTIVE_LATE, GameplayEnums.HitboxType.Hitbox_Attack); } break; case GameplayEnums.CharacterState.AttackRecovery: if (StateFrames > GameplayConstants.ATTACK_RECOVERY_TOTAL) { State = GameplayEnums.CharacterState.Idle; StateFrames = 0; Hitboxes.RemoveAll(o => o.HitboxType == GameplayEnums.HitboxType.Hurtbox_Limb); } if (StateFrames == GameplayConstants.ATTACK_RECOVERY_SHORTEN) { ModifyHitbox(Hitboxes, GameplayConstants.HURTBOX_WHIFF_LATE); } break; case GameplayEnums.CharacterState.AttackStartup: if (StateFrames > GameplayConstants.ATTACK_STARTUP) { State = GameplayEnums.CharacterState.AttackActive; StateFrames = 0; Hitboxes.Add(CreateHitbox(GameplayEnums.HitboxType.Hitbox_Attack, GameplayConstants.HITBOX_ACTIVE_EARLY)); ModifyHitbox(Hitboxes, GameplayConstants.HURTBOX_ACTIVE); } break; case GameplayEnums.CharacterState.BeingThrown: SetCharacterHurtboxStanding(Hitboxes); if (StateFrames > GameplayConstants.THROW_BREAK_WINDOW) { if (P1) { return(new MatchOutcome(false, true, GameplayEnums.Outcome.Throw)); } else { return(new MatchOutcome(true, false, GameplayEnums.Outcome.Throw)); } } break; //this is handled in checking if a player wins case GameplayEnums.CharacterState.Blockstun: SetCharacterHurtboxStanding(Hitboxes); if (StateFrames < GameplayConstants.ATTACK_PUSHBACK_DURATION) { positionOffset = GameplayConstants.ATTACK_PUSHBACK_SPEED; } if (StateFrames > GameplayConstants.ATTACK_BLOCKSTUN) { State = GameplayEnums.CharacterState.Idle; StateFrames = 0; } break; case GameplayEnums.CharacterState.Clash: if (StateFrames > GameplayConstants.CLASH_PUSHBACK_DURATION) { State = GameplayEnums.CharacterState.Idle; StateFrames = 0; } positionOffset = GameplayConstants.CLASH_PUSHBACK_SPEED; break; case GameplayEnums.CharacterState.Crouch: SetCharacterHurtboxCrouching(Hitboxes); break; case GameplayEnums.CharacterState.Idle: SetCharacterHurtboxStanding(Hitboxes); break; case GameplayEnums.CharacterState.Inactive: throw new System.Exception("character state was inactive. not supposed to happen???"); case GameplayEnums.CharacterState.Special: MatchOutcome specialOutcome = SelectedCharacter.UpdateSpecial(this, ref positionOffset); if (specialOutcome.IsEnd()) { return(specialOutcome); } break; case GameplayEnums.CharacterState.ThrowActive: if (StateFrames > GameplayConstants.THROW_ACTIVE) { State = GameplayEnums.CharacterState.ThrowRecovery; StateFrames = 0; Hitboxes.RemoveAll(o => o.HitboxType == GameplayEnums.HitboxType.Hitbox_Throw); ModifyHitbox(Hitboxes, GameplayConstants.THROW_RECOVERY_HURTBOX); } break; case GameplayEnums.CharacterState.ThrowBreak: if (StateFrames > GameplayConstants.BREAK_DURATION) { State = GameplayEnums.CharacterState.Idle; StateFrames = 0; } positionOffset = GameplayConstants.BREAK_PUSHBACK; break; case GameplayEnums.CharacterState.ThrowingOpponent: if (StateFrames > GameplayConstants.THROW_BREAK_WINDOW) { if (P1) { return(new MatchOutcome(true, false, GameplayEnums.Outcome.Throw)); } else { return(new MatchOutcome(false, true, GameplayEnums.Outcome.Throw)); } } break; //this is handled in checking if a player wins case GameplayEnums.CharacterState.ThrowRecovery: if (StateFrames > GameplayConstants.THROW_RECOVERY) { State = GameplayEnums.CharacterState.Idle; StateFrames = 0; Hitboxes.RemoveAll(o => o.HitboxType == GameplayEnums.HitboxType.Hurtbox_Limb); } break; case GameplayEnums.CharacterState.ThrowStartup: SetCharacterHurtboxStanding(Hitboxes); if (StateFrames > GameplayConstants.THROW_STARTUP) { State = GameplayEnums.CharacterState.ThrowActive; StateFrames = 0; Hitboxes.Add(CreateHitbox(GameplayEnums.HitboxType.Hitbox_Throw, GameplayConstants.THROW_ACTIVE_RANGE)); ModifyHitbox(Hitboxes, GameplayConstants.THROW_STARTUP_HURTBOX); } break; case GameplayEnums.CharacterState.WalkBack: SetCharacterHurtboxStanding(Hitboxes); positionOffset = GameplayConstants.WALK_B_SPEED; break; case GameplayEnums.CharacterState.WalkForward: SetCharacterHurtboxStanding(Hitboxes); positionOffset = GameplayConstants.WALK_F_SPEED; break; default: throw new System.Exception("Ooops looks like I forgot to handle state : " + State.ToString()); } if (FacingRight) { Position += positionOffset; } else { Position -= positionOffset; } return(new MatchOutcome()); }