summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Test/SaionjiScript_Ability.cs
blob: 2ed956efac34c8c291a9f4d2d387f1bbfed6bb3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public partial class SaionjiScript : MonoBehaviour
{
	/// <summary>
	/// ability system
	/// </summary>
	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);
	}

	/// <summary>
	/// 设置abilities
	/// </summary>
	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>{GamepadButton.Right, GamepadButton.Right }, 0.8f);
		ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Left, GamepadButton.Left }, 0.8f);
		ConditionCommandSeq condDRC = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f);
		ConditionCommandSeq condDLC = new ConditionCommandSeq(new List<GamepadButton> { GamepadButton.Down, GamepadButton.Left, GamepadButton.Circle}, 1f);

		ConditionHit condIsHit = new ConditionHit(this);

		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		// 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<ActionBase> { wipeCmdRecord, switchToSuperKick });
		idle.AddTrigger(trigger);
		trigger = new Trigger(And(condTowardLeft, condDLC), new List<ActionBase> { wipeCmdRecord, switchToSuperKick });
		idle.AddTrigger(trigger);
		trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash  });
		idle.AddTrigger(trigger);
		trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash });
		idle.AddTrigger(trigger);
		trigger = new Trigger(condRightButtonHold, new List<ActionBase> { switchToMove, towardRight });
		idle.AddTrigger(trigger);
		trigger = new Trigger(condLeftButtonHold, new List<ActionBase> { 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<ActionBase> { wipeCmdRecord, switchToDash, });
		move.AddTrigger(trigger);
		trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash });
		move.AddTrigger(trigger);
		trigger = new Trigger(And(condRightButtonHold, condCircleCmd), new List<ActionBase> { towardRight, switchToAttkRush });
		move.AddTrigger(trigger);
		trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List<ActionBase> { towardLeft, switchToAttkRush });
		move.AddTrigger(trigger);
		trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List<ActionBase> { towardRight, switchToSideKickRush });
		move.AddTrigger(trigger);
		trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List<ActionBase> { 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);
		trigger = new Trigger(condIsHit, new ActionLog("hit!!!"));
		attk1.AddLateTrigger(trigger);

		//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<ActionBase> { towardRight, switchToAttkRush });
		sideKickRush.AddTrigger(trigger);
		trigger = new Trigger(And(condSideKickRushAnimRange, And(condLeftButtonHold, condCircleCmd)), new List<ActionBase> { 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<ActionBase> { switchToDash, towardRight });
		gun4.AddTrigger(trigger);
		trigger = new Trigger(And(condGun4AnimRange, condLeft2Cmd), new List<ActionBase> { switchToDash, towardLeft });
		gun4.AddTrigger(trigger);

		m_AbilitySystem.ForceStart(idle);
	}

}