using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public partial class SaionjiScript : MonoBehaviour
{
///
/// ability system
///
AbilitySystem m_AbilitySystem = new AbilitySystem();
ConditionBase Not(ConditionBase cond)
{
return new ConditionNot(cond);
}
ConditionBase And(ConditionBase c1, ConditionBase c2)
{
return new ConditionAnd(c1, c2);
}
ConditionBase Or(ConditionBase c1, ConditionBase c2)
{
return new ConditionOr(c1,c2);
}
///
/// 设置abilities
///
void SetupAbilities()
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// abilities
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IdleAbility idle = new IdleAbility(animator, Anim_Idle);
MoveAbility move = new MoveAbility(animator, Anim_Run);
MoveAbility dash = new MoveAbility(animator, Anim_DashWithSword);
AttackAbility attk1 = new AttackAbility(animator, Anim_LightAttack1);
AttackAbility attk2 = new AttackAbility(animator, Anim_LightAttack2);
AttackAbility attk3 = new AttackAbility(animator, Anim_LightAttack3);
AttackAbility attk4 = new AttackAbility(animator, Anim_LightAttack4);
AttackAbility attk5 = new AttackAbility(animator, Anim_LightAttack5);
AttackAbility attkRush = new AttackAbility(animator, Anim_LightAttackRush);
AttackAbility sideKick = new AttackAbility(animator, Anim_SideKick);
AttackAbility sideKickRush = new AttackAbility(animator, Anim_SideKickRush);
AttackAbility superKick = new AttackAbility(animator, Anim_SuperKick);
AttackAbility gun1 = new AttackAbility(animator, Anim_Gun1);
AttackAbility gun2 = new AttackAbility(animator, Anim_Gun2);
AttackAbility gun3 = new AttackAbility(animator, Anim_Gun3);
AttackAbility gun4 = new AttackAbility(animator, Anim_Gun4);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// actions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ActionTurn180 turn180 = new ActionTurn180(this.transform);
ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform);
ActionTowardRight towardRight = new ActionTowardRight(this.transform);
ActionSwitchAbility switchToMove = new ActionSwitchAbility(m_AbilitySystem, move);
ActionSwitchAbility switchToIdle = new ActionSwitchAbility(m_AbilitySystem, idle);
ActionSwitchAbility switchToAttk1 = new ActionSwitchAbility(m_AbilitySystem, attk1);
ActionSwitchAbility switchToAttk2 = new ActionSwitchAbility(m_AbilitySystem, attk2);
ActionSwitchAbility switchToAttk3 = new ActionSwitchAbility(m_AbilitySystem, attk3);
ActionSwitchAbility switchToAttk4 = new ActionSwitchAbility(m_AbilitySystem, attk4);
ActionSwitchAbility switchToAttk5 = new ActionSwitchAbility(m_AbilitySystem, attk5);
ActionSwitchAbility switchToAttkRush = new ActionSwitchAbility(m_AbilitySystem, attkRush);
ActionSwitchAbility switchToSideKick = new ActionSwitchAbility(m_AbilitySystem, sideKick);
ActionSwitchAbility switchToSideKickRush = new ActionSwitchAbility(m_AbilitySystem, sideKickRush);
ActionSwitchAbility switchToDash = new ActionSwitchAbility(m_AbilitySystem, dash);
ActionSwitchAbility switchToSuperKick = new ActionSwitchAbility(m_AbilitySystem, superKick);
ActionSwitchAbility switchToGun1 = new ActionSwitchAbility(m_AbilitySystem, gun1);
ActionSwitchAbility switchToGun2 = new ActionSwitchAbility(m_AbilitySystem, gun2);
ActionSwitchAbility switchToGun3 = new ActionSwitchAbility(m_AbilitySystem, gun3);
ActionSwitchAbility switchToGun4 = new ActionSwitchAbility(m_AbilitySystem, gun4);
ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord();
ActionEffectGhost enableGhost = new ActionEffectGhost(Effects[0] as CharacterGhostEffect);
ActionDisableGhost disableGhost = new ActionDisableGhost(Effects[0] as CharacterGhostEffect);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// conditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ConditionCommand condLeftCmd = new ConditionCommand(GamepadButton.Left);
ConditionCommand condRightCmd = new ConditionCommand(GamepadButton.Right);
ConditionNoMoveButtonHold condNoMoveButtonHold = new ConditionNoMoveButtonHold();
ConditionButtonHold condRightButtonHold = new ConditionButtonHold(GamepadButton.Right);
ConditionButtonHold condLeftButtonHold = new ConditionButtonHold(GamepadButton.Left);
ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle);
ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross);
ConditionCommand condSquareCmd = new ConditionCommand(GamepadButton.Square);
ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform);
ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform);
ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List{GamepadButton.Right, GamepadButton.Right }, 0.8f);
ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List { GamepadButton.Left, GamepadButton.Left }, 0.8f);
ConditionCommandSeq condDRC = new ConditionCommandSeq(new List { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f);
ConditionCommandSeq condDLC = new ConditionCommandSeq(new List { GamepadButton.Down, GamepadButton.Left, GamepadButton.Circle}, 1f);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// common triggers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Trigger triggerTurnRight = new Trigger(And(condRightCmd, Not(condTowardRight)), towardRight);
Trigger triggerTurnLeft = new Trigger(And(condLeftCmd, Not(condTowardLeft)), towardLeft);
Trigger trigger = null;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ability setup
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// idle ability
trigger = new Trigger(And(condTowardRight, condDRC), new List { wipeCmdRecord, switchToSuperKick });
idle.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, condDLC), new List { wipeCmdRecord, switchToSuperKick });
idle.AddTrigger(trigger);
trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord , switchToDash });
idle.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord , switchToDash });
idle.AddTrigger(trigger);
trigger = new Trigger(condRightButtonHold, new List { switchToMove, towardRight });
idle.AddTrigger(trigger);
trigger = new Trigger(condLeftButtonHold, new List { switchToMove, towardLeft });
idle.AddTrigger(trigger);
trigger = new Trigger(condCircleCmd, switchToAttk1);
idle.AddTrigger(trigger);
trigger = new Trigger(condCrossCmd, switchToSideKick);
idle.AddTrigger(trigger);
trigger = new Trigger(condSquareCmd, switchToGun1);
idle.AddTrigger(trigger);
idle.AddTrigger(triggerTurnRight);
idle.AddTrigger(triggerTurnLeft);
// move ability
trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord, switchToDash, });
move.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord, switchToDash });
move.AddTrigger(trigger);
trigger = new Trigger(And(condRightButtonHold, condCircleCmd), new List { towardRight, switchToAttkRush });
move.AddTrigger(trigger);
trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List { towardLeft, switchToAttkRush });
move.AddTrigger(trigger);
trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List { towardRight, switchToSideKickRush });
move.AddTrigger(trigger);
trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List { towardLeft, switchToSideKickRush });
move.AddTrigger(trigger);
trigger = new Trigger(And(condTowardRight, Not(condRightButtonHold)), switchToIdle);
move.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, Not(condLeftButtonHold)), switchToIdle);
move.AddTrigger(trigger);
trigger = new Trigger(condCircleCmd, switchToAttk1);
move.AddTrigger(trigger);
trigger = new Trigger(condCrossCmd, switchToSideKick);
move.AddTrigger(trigger);
// dash ability
trigger = new Trigger(And(new ConditionAnimRange(animator, 0.5f, 1.0f), condCircleCmd), switchToAttk1);
dash.AddTrigger(trigger);
trigger = new Trigger(new ConditionAnimAtEnd(animator, Anim_DashWithSword), switchToIdle);
dash.AddTrigger(trigger);
// attack abilities
float expireTime = 0.3f;
// sword normal attack
ConditionAnimAtEnd condAttk1AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack1);
trigger = new Trigger(And(condAttk1AtEnd, condCircleCmd), switchToAttk2);
attk1.AddTrigger(trigger);
ConditionAttkExpireTime condAttk1ExpireTime = new ConditionAttkExpireTime(attk1, expireTime);
trigger = new Trigger(condAttk1ExpireTime, switchToIdle);
attk1.AddTrigger(trigger);
attk1.AddTrigger(triggerTurnRight);
attk1.AddTrigger(triggerTurnLeft);
//ConditionAnimRange condAttkRushGhostRange = new ConditionAnimRange(animator, 0f, 0.8f);
//trigger = new Trigger(condAttkRushGhostRange, enableGhost, false);
//attkRush.AddTrigger(trigger);
//ConditionAnimRange condAttkRushGhostDisableRange = new ConditionAnimRange(animator, 0.8f, 10f);
//trigger = new Trigger(condAttkRushGhostDisableRange, disableGhost, false);
//attkRush.AddTrigger(trigger);
ConditionAnimRange condAttkRushAtRange = new ConditionAnimRange(animator, 0.5f, 1f);
trigger = new Trigger(And(condAttkRushAtRange, condCircleCmd), switchToAttk2);
attkRush.AddTrigger(trigger);
//trigger = new Trigger(And(And(condAttkRushAtRange, condTowardRight), condRightCmd), switchToAttkRush);
//attkRush.AddTrigger(trigger);
//trigger = new Trigger(And(And(condAttkRushAtRange, condTowardLeft), condLeftCmd), switchToAttkRush);
//attkRush.AddTrigger(trigger);
ConditionAttkExpireTime condAttkRushExpireTime = new ConditionAttkExpireTime(attkRush, expireTime);
trigger = new Trigger(condAttkRushExpireTime, switchToIdle);
attkRush.AddTrigger(trigger);
//attkRush.AddTrigger(triggerTurnRight);
//attkRush.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk2AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack2);
trigger = new Trigger(And(condAttk2AtEnd, condCircleCmd), switchToAttk3);
attk2.AddTrigger(trigger);
ConditionAttkExpireTime condAttk2ExpireTime = new ConditionAttkExpireTime(attk2, expireTime);
trigger = new Trigger(condAttk2ExpireTime, switchToIdle);
attk2.AddTrigger(trigger);
attk2.AddTrigger(triggerTurnRight);
attk2.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk3AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack3);
trigger = new Trigger(And(condAttk3AtEnd, condCircleCmd), switchToAttk4);
attk3.AddTrigger(trigger);
ConditionAttkExpireTime condAttk3ExpireTime = new ConditionAttkExpireTime(attk3, expireTime);
trigger = new Trigger(condAttk3ExpireTime, switchToIdle);
attk3.AddTrigger(trigger);
attk3.AddTrigger(triggerTurnRight);
attk3.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk4AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack4);
trigger = new Trigger(And(condAttk4AtEnd, condCircleCmd), switchToAttk5);
attk4.AddTrigger(trigger);
ConditionAttkExpireTime condAttk4ExpireTime = new ConditionAttkExpireTime(attk4, expireTime);
trigger = new Trigger(condAttk4ExpireTime, switchToIdle);
attk4.AddTrigger(trigger);
attk4.AddTrigger(triggerTurnRight);
attk4.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk5AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack5);
trigger = new Trigger(condAttk5AtEnd, switchToIdle);
attk5.AddTrigger(trigger);
ConditionAttkExpireTime condAttk5ExpireTime = new ConditionAttkExpireTime(attk5, expireTime);
trigger = new Trigger(condAttk5ExpireTime, switchToIdle);
attk5.AddTrigger(trigger);
attk5.AddTrigger(triggerTurnRight);
attk5.AddTrigger(triggerTurnLeft);
// side kick normal
ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime);
trigger = new Trigger(condSideKickExpireTime, switchToIdle);
sideKick.AddTrigger(trigger);
// side kick rush
ConditionAttkExpireTime condSideKickRushExpireTime = new ConditionAttkExpireTime(sideKickRush, expireTime);
trigger = new Trigger(condSideKickRushExpireTime, switchToIdle);
sideKickRush.AddTrigger(trigger);
ConditionAnimRange condSideKickRushAnimRange = new ConditionAnimRange(animator, 0.5f, 10f);
trigger = new Trigger(And(condSideKickRushAnimRange, And(condRightButtonHold, condCircleCmd)), new List { towardRight, switchToAttkRush });
sideKickRush.AddTrigger(trigger);
trigger = new Trigger(And(condSideKickRushAnimRange, And(condLeftButtonHold, condCircleCmd)), new List { towardLeft, switchToAttkRush });
sideKickRush.AddTrigger(trigger);
// super kick combo
ConditionAttkExpireTime condSuperKickExpireTime = new ConditionAttkExpireTime(superKick, expireTime);
trigger = new Trigger(condSuperKickExpireTime, switchToIdle);
superKick.AddTrigger(trigger);
// gun normal
ConditionAnimAtEnd condGun1AtEnd = new ConditionAnimAtEnd(animator, Anim_Gun1);
trigger = new Trigger(And(condGun1AtEnd, condSquareCmd), switchToGun2);
gun1.AddTrigger(trigger);
ConditionAttkExpireTime condGun1ExpireTime = new ConditionAttkExpireTime(gun1, expireTime);
trigger = new Trigger(condGun1ExpireTime, switchToIdle);
gun1.AddTrigger(trigger);
ConditionAnimAtEnd condGun2AtEnd = new ConditionAnimAtEnd(animator, Anim_Gun2);
trigger = new Trigger(And(condGun2AtEnd, condSquareCmd), switchToGun3);
gun2.AddTrigger(trigger);
ConditionAttkExpireTime condGun2ExpireTime = new ConditionAttkExpireTime(gun2, expireTime);
trigger = new Trigger(condGun2ExpireTime, switchToIdle);
gun2.AddTrigger(trigger);
ConditionAnimAtEnd condGun3AtEnd = new ConditionAnimAtEnd(animator, Anim_Gun3);
trigger = new Trigger(And(condGun3AtEnd, condSquareCmd), switchToGun4);
gun3.AddTrigger(trigger);
ConditionAttkExpireTime condGun3ExpireTime = new ConditionAttkExpireTime(gun3, expireTime);
trigger = new Trigger(condGun3ExpireTime, switchToIdle);
gun3.AddTrigger(trigger);
ConditionAttkExpireTime condGun4ExpireTime = new ConditionAttkExpireTime(gun4, expireTime);
trigger = new Trigger(condGun4ExpireTime, switchToIdle);
gun4.AddTrigger(trigger);
ConditionAnimRange condGun4AnimRange = new ConditionAnimRange(animator, 0.6f, 1f);
trigger = new Trigger(And(condGun4AnimRange, condRight2Cmd), new List { switchToDash, towardRight });
gun4.AddTrigger(trigger);
trigger = new Trigger(And(condGun4AnimRange, condLeft2Cmd), new List { switchToDash, towardLeft });
gun4.AddTrigger(trigger);
m_AbilitySystem.ForceStart(idle);
}
}