|  |  |  | extends AnimatedSprite3D | 
					
						
							|  |  |  | class_name View | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @onready var status = (%Status as Status) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Trans: | 
					
						
							|  |  |  | 	var condition:StringName | 
					
						
							|  |  |  | 	var compareType:String | 
					
						
							|  |  |  | 	var conditionValue | 
					
						
							|  |  |  | 	var from:StringName | 
					
						
							|  |  |  | 	var to:StringName | 
					
						
							|  |  |  | 	var trigger_name:StringName | 
					
						
							|  |  |  | 	var on_end:bool	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var trans_list = [] | 
					
						
							|  |  |  | var move_sprite_frames:SpriteFrames | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _ready(): | 
					
						
							|  |  |  | 	# 地面行走 | 
					
						
							|  |  |  | 	trans("idle_loop","run1","speed_xz",">",1) | 
					
						
							|  |  |  | 	run("run1","run2_loop") | 
					
						
							|  |  |  | 	trans("run1","run3","speed_xz","<",1) | 
					
						
							|  |  |  | 	trans("run2_loop","run3","speed_xz","<",1) | 
					
						
							|  |  |  | 	run("run3","idle_loop") | 
					
						
							|  |  |  | 	trans("run3","run1","speed_xz",">",1) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	# 跳跃 | 
					
						
							|  |  |  | 	trigger("any","jump1","trigger_jump") | 
					
						
							|  |  |  | 	run("jump1","jump2_loop") | 
					
						
							|  |  |  | 	trans("jump2_loop","jump3","speed_y","<=",0) | 
					
						
							|  |  |  | 	run("jump3","jump4_loop") | 
					
						
							|  |  |  | 	trans("jump4_loop","jump5","is_on_floor","=",true) | 
					
						
							|  |  |  | 	run("jump5","idle_loop") | 
					
						
							|  |  |  | 	trans("jump5","run1","speed_xz",">",1) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	#地面受击 | 
					
						
							|  |  |  | 	trigger("any","hit1","trigger_hit") | 
					
						
							|  |  |  | 	trigger("any","mhit1","trigger_mhit") | 
					
						
							|  |  |  | 	trigger("any","lhit1","trigger_lhit") | 
					
						
							|  |  |  | 	run("hit1","hit2_loop") | 
					
						
							|  |  |  | 	run("mhit1","mhit2_loop") | 
					
						
							|  |  |  | 	run("lhit1","lhit2_loop") | 
					
						
							|  |  |  | 	trans("hit2_loop","hit3","is_stagger","=",false) | 
					
						
							|  |  |  | 	trans("mhit2_loop","mhit3","is_stagger","=",false) | 
					
						
							|  |  |  | 	trans("lhit2_loop","lhit3","is_stagger","=",false) | 
					
						
							|  |  |  | 	run("hit3","idle_loop") | 
					
						
							|  |  |  | 	run("mhit3","idle_loop") | 
					
						
							|  |  |  | 	run("lhit3","idle_loop") | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	#空中受击 | 
					
						
							|  |  |  | 	trigger("any","airhit1","trigger_air_hit_up") | 
					
						
							|  |  |  | 	trigger("any","airhit4_loop","trigger_air_hit_down") | 
					
						
							|  |  |  | 	run("airhit1","airhit2_loop") | 
					
						
							|  |  |  | 	trans("airhit2_loop","airhit3","speed_y","<=",0) | 
					
						
							|  |  |  | 	run("airhit3","airhit4_loop") | 
					
						
							|  |  |  | 	trans("airhit4_loop","airhit5","is_on_floor","=",true) | 
					
						
							|  |  |  | 	run("airhit5","ground1_loop") | 
					
						
							|  |  |  | 	trans("ground1_loop","ground2","is_stagger","=",false) | 
					
						
							|  |  |  | 	run("ground2","idle_loop") | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	#眩晕受击 | 
					
						
							|  |  |  | 	trigger_with_condition("any","stunhit","trigger_stun_hit","is_on_floor","=",true) | 
					
						
							|  |  |  | 	run("stunhit","ground_stun1_loop") | 
					
						
							|  |  |  | 	trans("ground_stun1_loop","ground_stun2","is_stun","=",false) | 
					
						
							|  |  |  | 	run("ground_stun2","idle_loop") | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	#空中眩晕受击 | 
					
						
							|  |  |  | 	trans("airhit5","airhit5_stun","is_stun","=",true) | 
					
						
							|  |  |  | 	run("airhit5_stun","ground_stun1_loop") | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	#落地反弹 | 
					
						
							|  |  |  | 	trigger("any","rebound","trigger_rebound") | 
					
						
							|  |  |  | 	run("rebound","airhit2_loop") | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func _process(delta): | 
					
						
							|  |  |  | 	if not status.is_skill_running and status.is_pause == is_playing(): | 
					
						
							|  |  |  | 		if status.is_pause:pause() | 
					
						
							|  |  |  | 		else:play() | 
					
						
							|  |  |  | 	if status.is_pause:return | 
					
						
							|  |  |  | 	update_flip() | 
					
						
							|  |  |  | 	update_trans(false) | 
					
						
							|  |  |  | 	update_material() | 
					
						
							|  |  |  | 	update_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init(default:SpriteFrames): | 
					
						
							|  |  |  | 	sprite_frames = default | 
					
						
							|  |  |  | 	move_sprite_frames = default | 
					
						
							|  |  |  | 	play_animation("idle_loop") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func reset(): | 
					
						
							|  |  |  | 	sprite_frames = move_sprite_frames | 
					
						
							|  |  |  | 	play_animation("idle_loop") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func run(from:StringName,to:StringName): | 
					
						
							|  |  |  | 	_add_trans(from,to,"","","","",true) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func run_with_condition(from:StringName,to:StringName,condition,compareType,conditionValue): | 
					
						
							|  |  |  | 	_add_trans(from,to,condition,compareType,conditionValue,"",true) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | func trans(from:StringName,to:StringName,condition,compareType,conditionValue): | 
					
						
							|  |  |  | 	_add_trans(from,to,condition,compareType,conditionValue,"",false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func trigger(from:StringName,to:StringName,trigger_name:StringName): | 
					
						
							|  |  |  | 	_add_trans(from,to,"","","",trigger_name,false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func trigger_with_condition(from:StringName,to:StringName,trigger_name:StringName,condition,compareType,conditionValue): | 
					
						
							|  |  |  | 	_add_trans(from,to,condition,compareType,conditionValue,trigger_name,false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _add_trans(from:StringName,to:StringName,condition,compareType,conditionValue,trigger_name:StringName,on_end:bool): | 
					
						
							|  |  |  | 	var new_trans = Trans.new() | 
					
						
							|  |  |  | 	new_trans.condition = condition | 
					
						
							|  |  |  | 	new_trans.compareType = compareType | 
					
						
							|  |  |  | 	new_trans.conditionValue = conditionValue | 
					
						
							|  |  |  | 	new_trans.from = from | 
					
						
							|  |  |  | 	new_trans.to = to | 
					
						
							|  |  |  | 	new_trans.trigger_name = trigger_name | 
					
						
							|  |  |  | 	new_trans.on_end = on_end | 
					
						
							|  |  |  | 	trans_list.append(new_trans) | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | func update_trans(on_end:bool): | 
					
						
							|  |  |  | 	for trans in trans_list: | 
					
						
							|  |  |  | 		if on_end != trans.on_end: | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		if not (trans.from == "any" or trans.from == animation): | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		if trans.condition != "": | 
					
						
							|  |  |  | 			var conditionValue = status.get(trans.condition) | 
					
						
							|  |  |  | 			match trans.compareType: | 
					
						
							|  |  |  | 				">":if conditionValue <= trans.conditionValue:continue | 
					
						
							|  |  |  | 				"<":if conditionValue >= trans.conditionValue:continue | 
					
						
							|  |  |  | 				">=":if conditionValue < trans.conditionValue:continue | 
					
						
							|  |  |  | 				"<=":if conditionValue > trans.conditionValue:continue | 
					
						
							|  |  |  | 				"=":if conditionValue != trans.conditionValue:continue | 
					
						
							|  |  |  | 		if trans.trigger_name != "": | 
					
						
							|  |  |  | 			if status.get(trans.trigger_name): | 
					
						
							|  |  |  | 				status.set(trans.trigger_name,false) | 
					
						
							|  |  |  | 			else:continue | 
					
						
							|  |  |  | 		play_animation(trans.to) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_flip(): | 
					
						
							|  |  |  | 	scale.x = 1 if status.is_right else -1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func update_view(): | 
					
						
							|  |  |  | 	position = status.basic_offset + status.shake_offset | 
					
						
							|  |  |  | 	global_position = Util.snap_vector3(global_position) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func _on_animation_finished(): | 
					
						
							|  |  |  | 	update_trans(true) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | func update_material(): | 
					
						
							|  |  |  | 	var material = material_override as ShaderMaterial | 
					
						
							|  |  |  | 	material.set_shader_parameter("flash_white",status.flash_white_rate) | 
					
						
							|  |  |  | 	material.set_shader_parameter("deformation_dir",status.deformation_dir) | 
					
						
							|  |  |  | 	material.set_shader_parameter("deformation_rate",status.deformation_rate*0.4) | 
					
						
							|  |  |  | 	call_deferred("refresh_texture") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func refresh_texture(): | 
					
						
							|  |  |  | 	var material = material_override as ShaderMaterial | 
					
						
							|  |  |  | 	var tex = sprite_frames.get_frame_texture(animation,frame) | 
					
						
							|  |  |  | 	material.set_shader_parameter("tex",tex) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func clone(target:AnimatedSprite3D): | 
					
						
							|  |  |  | 	target.sprite_frames = sprite_frames | 
					
						
							|  |  |  | 	target.animation = animation | 
					
						
							|  |  |  | 	target.frame = frame | 
					
						
							|  |  |  | 	target.frame_progress = frame_progress | 
					
						
							|  |  |  | 	target.scale.x = scale.x | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func play_animation(animation_name:String): | 
					
						
							|  |  |  | 	if animation_name == animation: | 
					
						
							|  |  |  | 		frame = 0 | 
					
						
							|  |  |  | 		frame_progress = 0 | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 		play(animation_name) | 
					
						
							|  |  |  | 		 |