You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.8 KiB
GDScript
92 lines
2.8 KiB
GDScript
extends Node3D
|
|
class_name Buff
|
|
|
|
@onready var character = (get_owner() as Character)
|
|
@onready var status = (%Status as Status)
|
|
|
|
class BuffInfo:
|
|
var name : String
|
|
var duration_max : float
|
|
var duration : float
|
|
var ignore_pause : bool
|
|
|
|
var buff_map = {} #命中信息
|
|
|
|
func _process(delta):
|
|
for buff_name in buff_map:
|
|
var buff_info = buff_map[buff_name]
|
|
if has_buff("pause") and buff_name!="pause" and !buff_info.ignore_pause:
|
|
continue
|
|
if buff_info.duration_max == -1:
|
|
trigger_buff_effect(buff_info,"update")
|
|
else:
|
|
if buff_info.duration == 0:
|
|
trigger_buff_effect(buff_info,"second")
|
|
buff_info.duration += delta
|
|
if buff_info.duration >= buff_info.duration_max:
|
|
trigger_buff_effect(buff_info,"end")
|
|
buff_map.erase(buff_name)
|
|
else:
|
|
trigger_buff_effect(buff_info,"update")
|
|
|
|
func trigger_buff_effect(buff:BuffInfo,trigger_name:String):
|
|
var buff_name = buff.name
|
|
var function_name = "on_%s_%s" % [trigger_name,buff_name]
|
|
if has_method(function_name):
|
|
var rate = buff.duration/buff.duration_max
|
|
call(function_name,rate)
|
|
|
|
func has_buff(buff_name:String) -> bool:
|
|
return buff_name in buff_map
|
|
|
|
func add_buff(buff_name:String,duration:float,ignore_pause:bool=false):
|
|
var buff : BuffInfo
|
|
if buff_name in buff_map:
|
|
buff = buff_map[buff_name]
|
|
else:
|
|
buff = BuffInfo.new()
|
|
buff.name = buff_name
|
|
buff_map[buff_name] = buff
|
|
buff.duration_max = duration
|
|
buff.duration = 0
|
|
buff.ignore_pause = ignore_pause
|
|
trigger_buff_effect(buff,"start")
|
|
|
|
func remove_buff(buff_name:String):
|
|
buff_map.erase(buff_name)
|
|
|
|
#==具体实现==
|
|
#位移
|
|
func on_end_hit_back(rate):status.hit_back_speed = 0
|
|
func on_end_hit_up(rate):status.hit_up_speed = 0
|
|
func on_start_jumping(rate):status.is_jumping = true
|
|
func on_end_jumping(rate):status.is_jumping = false
|
|
func on_start_floating(rate):status.is_floating = true
|
|
func on_update_floating(rate):
|
|
if status.is_on_floor:
|
|
#反弹
|
|
status.is_floating=false
|
|
|
|
#战斗状态
|
|
func on_start_stagger(rate):status.is_stagger = true
|
|
func on_end_stagger(rate):status.is_stagger = false
|
|
func on_end_stun(rate):status.is_stun = false
|
|
|
|
#表现
|
|
func on_second_pause(rate):status.is_pause = true
|
|
func on_end_pause(rate):status.is_pause = false
|
|
|
|
func on_start_flash_white(rate):status.flash_white_rate = 1
|
|
func on_update_flash_white(rate):status.flash_white_rate = 1 - rate
|
|
func on_end_flash_white(rate):status.flash_white_rate = 0
|
|
|
|
func on_update_shake_x(rate):status.shake_offset = Vector3((sin(rate * PI * 4) - 0.5)*0.02,0,0);
|
|
func on_end_shake_x(rate):status.shake_offset = Vector3.ZERO
|
|
|
|
func on_start_deformation(rate):
|
|
status.deformation_dir=Vector2(status.hit_back_speed,status.hit_up_speed)
|
|
status.deformation_rate = 1;
|
|
func on_update_deformation(rate):status.deformation_rate = 1 - rate
|
|
func on_end_deformation(rate):status.deformation_rate = 0
|
|
|