统一缩进为制表符

master
chendian 11 months ago
parent e885c52f20
commit 9e23f0f9e2

@ -6,15 +6,15 @@ enum EDamageType {Sharp, Blunt}
enum ECharacterType {Player, Monster, Bullet, Soul}
enum ETeam {Player, Monster}
enum EStance {
GroundIdle, Ground1, Ground2, Ground3, Ground4, Ground5,
AirIdle = 10, Air1, Air2, Air3,
Charging = 20,
Stab = 30,
Slash = 40,
None = 99,
GroundAny = 100,
AirAny = 101,
Any = 102,
GroundIdle, Ground1, Ground2, Ground3, Ground4, Ground5,
AirIdle = 10, Air1, Air2, Air3,
Charging = 20,
Stab = 30,
Slash = 40,
None = 99,
GroundAny = 100,
AirAny = 101,
Any = 102,
}
enum EBreakLevel {None, Cancel, Jump, Break, Walk} #不可打断 取消技打断 跳跃打断 连招打断 行走打断
enum ECoreType {Active, Passive}

@ -7,7 +7,7 @@ const animation_frame_rate: float = 0.1
const animation_speed_scale: float = 1.0
#技能系统
const input_alive_time: float = 0.5
const bullet_cd: float = 0.1
const bullet_cd: float = 0.1
#移动
const drag_ground: float = 20
const drag_air: float = 5

@ -290,6 +290,7 @@ func get_character_cfg_by_name(name: String) -> CharacterCfg:
return res
return null
func get_level_active_scene_by_name(name: String) -> PackedScene:
var path_default: String = "res://scene/level_active/%s.tscn" % name
if ResourceLoader.exists(path_default):

@ -10,66 +10,66 @@ var has_ai: bool = false
func _process(delta) -> void:
if not is_init:
init()
else:
process(delta)
if not is_init:
init()
else:
process(delta)
func init() -> void:
if not status.cfg:
return
is_init = true
var ai_scene: PackedScene = status.cfg.get_ai()
if not ai_scene:
return
ai = ai_scene.instantiate() as BeehaveTree
add_child(ai)
has_ai = true
on_init()
ai.init()
if not status.cfg:
return
is_init = true
var ai_scene: PackedScene = status.cfg.get_ai()
if not ai_scene:
return
ai = ai_scene.instantiate() as BeehaveTree
add_child(ai)
has_ai = true
on_init()
ai.init()
func process(delta) -> void:
if has_ai and status.ai_is_alert:
on_process(delta)
ai.process(delta)
else:
if status.cfg.ai:
stroll()
var player: Character = Global.character_mgr.get_player()
var dir: Vector2 = player.pos2D() - character.pos2D()
var dist: float = dir.length()
var can_see: bool = character.get_face_dir().angle_to(dir) < PI/2
var alert_range: float = status.cfg.ai.alert_range if can_see else status.cfg.ai.alert_range_back
var alert_speed: float = status.cfg.ai.alert_speed if can_see else status.cfg.ai.alert_speed_back
if dist < alert_range:
status.ai_alert += alert_speed * delta
status.emit_status("ai_alert")
if status.ai_alert >= status.ai_alert_max:
status.ai_is_alert = true
status.ai_alert = 0
status.emit_status("ai_is_alert")
status.emit_status("ai_alert")
else:
status.ai_alert -= status.cfg.ai.alert_recover * delta
if status.ai_alert < 0:
status.ai_alert = 0
status.emit_status("ai_alert")
else:
status.ai_is_alert = true
status.emit_status("ai_is_alert")
if has_ai and status.ai_is_alert:
on_process(delta)
ai.process(delta)
else:
if status.cfg.ai:
stroll()
var player: Character = Global.character_mgr.get_player()
var dir: Vector2 = player.pos2D() - character.pos2D()
var dist: float = dir.length()
var can_see: bool = character.get_face_dir().angle_to(dir) < PI/2
var alert_range: float = status.cfg.ai.alert_range if can_see else status.cfg.ai.alert_range_back
var alert_speed: float = status.cfg.ai.alert_speed if can_see else status.cfg.ai.alert_speed_back
if dist < alert_range:
status.ai_alert += alert_speed * delta
status.emit_status("ai_alert")
if status.ai_alert >= status.ai_alert_max:
status.ai_is_alert = true
status.ai_alert = 0
status.emit_status("ai_is_alert")
status.emit_status("ai_alert")
else:
status.ai_alert -= status.cfg.ai.alert_recover * delta
if status.ai_alert < 0:
status.ai_alert = 0
status.emit_status("ai_alert")
else:
status.ai_is_alert = true
status.emit_status("ai_is_alert")
func stroll() -> void:
#todo 闲逛
character.move_stop()
pass
#todo 闲逛
character.move_stop()
pass
func on_init() -> void:
pass
pass
func on_process(delta):
pass
pass

@ -5,6 +5,6 @@ var alive_time: float = 0
func on_process(delta):
alive_time += delta
if alive_time >= 5:
Global.character_mgr.destroy_character(character.id())
alive_time += delta
if alive_time >= 5:
Global.character_mgr.destroy_character(character.id())

@ -5,8 +5,8 @@ class_name MonsterAI
func on_init()->void:
var core_list: Array[CoreCfg] = character.status.cfg.get_core_cfg_list()
var index: int = 0
for core_cfg in core_list:
core.set_active_core(index, core_cfg)
index += 1
var core_list: Array[CoreCfg] = character.status.cfg.get_core_cfg_list()
var index: int = 0
for core_cfg in core_list:
core.set_active_core(index, core_cfg)
index += 1

@ -21,7 +21,7 @@ func attack1() -> void:
var attack: AttackCfg = status.skill_cfg.get_attack1()
var attack_box: AttackBoxCfg = status.skill_cfg.get_attack1_box()
add_attack(attack, attack_box, false, Vector2.ZERO,
status.skill_cfg.attack1_with_pause_frame, status.skill_cfg.attack1_with_stop, status.skill_cfg.ignore_push)
status.skill_cfg.attack1_with_pause_frame, status.skill_cfg.attack1_with_stop, status.skill_cfg.ignore_push)
func attack2() -> void:
@ -30,7 +30,7 @@ func attack2() -> void:
var attack: AttackCfg = status.skill_cfg.get_attack2()
var attack_box: AttackBoxCfg = status.skill_cfg.get_attack2_box()
add_attack(attack, attack_box, false, Vector2.ZERO,
status.skill_cfg.attack2_with_pause_frame, status.skill_cfg.attack2_with_stop, status.skill_cfg.ignore_push)
status.skill_cfg.attack2_with_pause_frame, status.skill_cfg.attack2_with_stop, status.skill_cfg.ignore_push)
func character_attack1() -> bool:
@ -46,7 +46,7 @@ func character_attack2() -> bool:
func add_attack(attack: AttackCfg, attack_box: AttackBoxCfg, hit_self: bool = false, attack_dir: Vector2 = Vector2.ZERO,
with_pause_frame: bool = false, with_stop: bool = false, ignore_push: bool = false) -> bool:
with_pause_frame: bool = false, with_stop: bool = false, ignore_push: bool = false) -> bool:
if not attack or not attack_box:
return false

@ -138,9 +138,11 @@ func move_stop():
set_status("move_dir", Vector2.ZERO)
move.stop()
func move_tick(delta) -> bool:
return move.move_tick(delta)
func get_face_dir() -> Vector2:
if status.move_dir == Vector2.ZERO:
return Vector2.RIGHT if is_right() else Vector2.LEFT
@ -199,15 +201,18 @@ func add_hp(value: float):
func cost_mp(value: int):
battle.cost_mp(value)
func cost_mp_sub():
battle.cost_mp_sub()
func get_break_level_def() -> int:
var shield: float = get_status("shield")
var shield: float = get_status("shield")
var break_level_def: int = cfg().shield.break_level_on if shield > 0 else cfg().shield.break_level_off
break_level_def += get_status("skill_break_level_add")
return break_level_def
func set_effect_lock(value: bool):
effect.set_effect_lock(value)

@ -10,85 +10,85 @@ var active_core_action_list: Array[String] = ["free_attack_heavy", "free_attack_
func _ready():
for i in range(8):
status.core_active_list.append(null)
for i in range(8):
status.core_active_list.append(null)
func _process(delta):
pass
pass
func get_action_index(action: String) -> int:
return active_core_action_list.find(action)
return active_core_action_list.find(action)
func cast_skill_sub(index: int, cast_dir: Vector2, target: int) -> void:
var core: CoreCfg = status.core_active_list[index]
if not core:
return
#施放技能扣除mp
var skill_cfg: SkillCfg = core.get_skill_cfg(0) #todo
if not skill.cast_skill_mp_cost(skill_cfg):
return
var sub_character: Character = Global.character_mgr.get_character(status.sub_character_id)
if not sub_character:
return
var skill_order = Status.SkillOrder.new()
skill_order.skill_cfg = skill_cfg
skill_order.cast_dir = cast_dir
skill_order.target = target
sub_character.add_ai_skill_order(skill_order)
var core: CoreCfg = status.core_active_list[index]
if not core:
return
#施放技能扣除mp
var skill_cfg: SkillCfg = core.get_skill_cfg(0) #todo
if not skill.cast_skill_mp_cost(skill_cfg):
return
var sub_character: Character = Global.character_mgr.get_character(status.sub_character_id)
if not sub_character:
return
var skill_order = Status.SkillOrder.new()
skill_order.skill_cfg = skill_cfg
skill_order.cast_dir = cast_dir
skill_order.target = target
sub_character.add_ai_skill_order(skill_order)
func cast_skill_by_action(action: String, cast_dir: Vector2) -> bool:
var index: int = active_core_action_list.find(action)
if index < 0:
return false
return cast_skill(index, cast_dir)
var index: int = active_core_action_list.find(action)
if index < 0:
return false
return cast_skill(index, cast_dir)
func cast_skill(index: int, cast_dir: Vector2) -> bool:
var core: CoreCfg = status.core_active_list[index]
if not core:
return false
match core.type:
Enum.ECoreType.Passive: return false
_: pass
var skill_cfg: SkillCfg = core.get_skill_cfg(0) #todo
#施放技能条件检查
if not skill.cast_skill_check(skill_cfg, status.break_level):
return false
#施放技能扣除mp
if not skill.cast_skill_mp_cost(skill_cfg):
return false
skill.cast_skill(skill_cfg, cast_dir)
return true
var core: CoreCfg = status.core_active_list[index]
if not core:
return false
match core.type:
Enum.ECoreType.Passive: return false
_: pass
var skill_cfg: SkillCfg = core.get_skill_cfg(0) #todo
#施放技能条件检查
if not skill.cast_skill_check(skill_cfg, status.break_level):
return false
#施放技能扣除mp
if not skill.cast_skill_mp_cost(skill_cfg):
return false
skill.cast_skill(skill_cfg, cast_dir)
return true
func set_active_core(index: int, core: CoreCfg) -> void:
match core.type:
Enum.ECoreType.Passive: return
_: pass
if (index < 0) or (index >= 8):
return
status.core_active_list[index] = core
status.emit_status("core_active_list")
return
match core.type:
Enum.ECoreType.Passive: return
_: pass
if (index < 0) or (index >= 8):
return
status.core_active_list[index] = core
status.emit_status("core_active_list")
return
func add_passive_core(core: CoreCfg) -> void:
match core.type:
Enum.ECoreType.Active: return
_: pass
status.core_passive_list.append(core)
status.emit_status("core_passive_list")
return
match core.type:
Enum.ECoreType.Active: return
_: pass
status.core_passive_list.append(core)
status.emit_status("core_passive_list")
return
func remove_passive_core(core: CoreCfg) -> void:
match core.type:
Enum.ECoreType.Active: return
_: pass
status.core_passive_list.filter(func(c): return c!=core)
status.emit_status("core_passive_list")
return
match core.type:
Enum.ECoreType.Active: return
_: pass
status.core_passive_list.filter(func(c): return c!=core)
status.emit_status("core_passive_list")
return

@ -153,6 +153,7 @@ func release_effect():
for particle: Particle in particle_list():
_release_effect(particle)
func _release_effect(particle: Particle):
var pos: Vector3 = particle.get_global_position()
particle.set_pause(false)

@ -10,46 +10,46 @@ var pushbox_list: Array[Hitbox] = []
func _ready():
var collisionShape3D: CollisionShape3D = $CollisionShape3D as CollisionShape3D
var shape: CylinderShape3D = collisionShape3D.shape as CylinderShape3D
radius = shape.radius * scale.x
var collisionShape3D: CollisionShape3D = $CollisionShape3D as CollisionShape3D
var shape: CylinderShape3D = collisionShape3D.shape as CylinderShape3D
radius = shape.radius * scale.x
func _process(delta) -> void:
var speed_dir: Vector2 = character.get_status("speed_dir") as Vector2
if speed_dir.length() == 0:
return
var is_skill_running: bool = character.get_status("is_skill_running") as bool
if not is_skill_running:
character.set_status("speed_down_push_rate", 0)
return
var skill_cfg: SkillCfg = character.get_status("skill_cfg") as SkillCfg
if not skill_cfg:
return
if skill_cfg.ignore_push:
character.set_status("speed_down_push_rate", 0)
return
var speed_down_push_rate: float = 0
var pos: Vector2 = character.pos2D()
for pushbox: Hitbox in pushbox_list:
var target_pos: Vector2 = pushbox.character.pos2D()
var dir: Vector2 = target_pos - pos
if speed_dir.dot(dir) <= 0:
continue
var dist: float = dir.length()
if dist == 0:
continue
var dist_rate = clamp(dist/(radius+pushbox.radius), 0, 1)
speed_down_push_rate = max(speed_down_push_rate, pushbox_curve.sample(dist_rate))
character.set_status("speed_down_push_rate", speed_down_push_rate)
return
var speed_dir: Vector2 = character.get_status("speed_dir") as Vector2
if speed_dir.length() == 0:
return
var is_skill_running: bool = character.get_status("is_skill_running") as bool
if not is_skill_running:
character.set_status("speed_down_push_rate", 0)
return
var skill_cfg: SkillCfg = character.get_status("skill_cfg") as SkillCfg
if not skill_cfg:
return
if skill_cfg.ignore_push:
character.set_status("speed_down_push_rate", 0)
return
var speed_down_push_rate: float = 0
var pos: Vector2 = character.pos2D()
for pushbox: Hitbox in pushbox_list:
var target_pos: Vector2 = pushbox.character.pos2D()
var dir: Vector2 = target_pos - pos
if speed_dir.dot(dir) <= 0:
continue
var dist: float = dir.length()
if dist == 0:
continue
var dist_rate = clamp(dist/(radius+pushbox.radius), 0, 1)
speed_down_push_rate = max(speed_down_push_rate, pushbox_curve.sample(dist_rate))
character.set_status("speed_down_push_rate", speed_down_push_rate)
return
func on_area_entered(area: Area3D):
if area is Hitbox:
pushbox_list.append(area)
if area is Hitbox:
pushbox_list.append(area)
func on_area_exited(area: Area3D):
if area is Hitbox:
pushbox_list.erase(area)
if area is Hitbox:
pushbox_list.erase(area)

@ -78,6 +78,7 @@ func update_break():
if is_break:
break
func update_break_none() -> bool:
return update_break_by_level(Enum.EBreakLevel.None)

@ -95,6 +95,7 @@ func is_target_lockable(target_id: int) -> bool:
return false
return true
func lock(is_pressed: bool):
is_lock = is_pressed

@ -2,5 +2,6 @@ extends Node3D
@onready var character: Character = (get_owner() as Character)
func _process(delta) -> void:
pass
pass

@ -11,65 +11,65 @@ var skill_action_list: Array[Variant] = ["skill1", "skill2", "skill3", "skill4"
func _ready():
SignalManager.connect("input_action_pressed", on_input_action_pressed)
SignalManager.connect("input_action_released", on_input_action_released)
SignalManager.connect("input_action_move", on_input_action_move)
SignalManager.connect("input_action_pressed", on_input_action_pressed)
SignalManager.connect("input_action_released", on_input_action_released)
SignalManager.connect("input_action_move", on_input_action_move)
func on_input_action_pressed(action_name: String) -> void:
if action_name in action_map:
return
action_map[action_name] = true
var is_switch: bool = is_switch_action(action_name)
if is_switch:
action_name = get_switch_action(action_name)
action_name = get_skill_action(action_name)
Global.ui_mgr.input_action(action_name, true)
if Global.is_control_pause:
return
if not action.check_action(action_name, true):
combo.add_input_action(action_name, is_switch)
if action_name in action_map:
return
action_map[action_name] = true
var is_switch: bool = is_switch_action(action_name)
if is_switch:
action_name = get_switch_action(action_name)
action_name = get_skill_action(action_name)
Global.ui_mgr.input_action(action_name, true)
if Global.is_control_pause:
return
if not action.check_action(action_name, true):
combo.add_input_action(action_name, is_switch)
func on_input_action_released(action_name: String) -> void:
if not action_name in action_map:
return
action_map.erase(action_name)
var is_switch: bool = is_switch_action(action_name)
Global.ui_mgr.input_action(action_name, false)
if Global.is_control_pause:
return
if not action.check_action(action_name, false):
combo.add_input_action("%s_release" % action_name, is_switch)
return
if not action_name in action_map:
return
action_map.erase(action_name)
var is_switch: bool = is_switch_action(action_name)
Global.ui_mgr.input_action(action_name, false)
if Global.is_control_pause:
return
if not action.check_action(action_name, false):
combo.add_input_action("%s_release" % action_name, is_switch)
return
func on_input_action_move(input_dir) -> void:
Global.ui_mgr.input_dir(input_dir)
if Global.is_control_pause:
return
status.input_dir = input_dir
Global.ui_mgr.input_dir(input_dir)
if Global.is_control_pause:
return
status.input_dir = input_dir
func is_switch_action(action_name: String)->bool:
return action_name in skill_action_list or (status.is_switch and action_name in switch_action_list)
return action_name in skill_action_list or (status.is_switch and action_name in switch_action_list)
func get_switch_action(action_name: String)->String:
if not action_name in switch_action_list:
return action_name
if status.is_lock:
return "lock_%s" % action_name
else:
return "free_%s" % action_name
if not action_name in switch_action_list:
return action_name
if status.is_lock:
return "lock_%s" % action_name
else:
return "free_%s" % action_name
func get_skill_action(action_name: String)->String:
if not action_name in skill_action_list:
return action_name
var index: int = skill_action_list.find(action_name)
action_name = switch_action_list[index]
if status.is_lock:
return "lock_%s" % action_name
else:
return "free_%s"% action_name
if not action_name in skill_action_list:
return action_name
var index: int = skill_action_list.find(action_name)
action_name = switch_action_list[index]
if status.is_lock:
return "lock_%s" % action_name
else:
return "free_%s"% action_name

@ -145,7 +145,7 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = ""):
_: pass
var animation_name: String = "animation_library/%s" % cfg.get_res_name()
print("play ",animation_name)
print("play ", animation_name)
play(animation_name, -1, Setting.animation_speed_scale)
seek(0, true, true)

@ -6,6 +6,7 @@ class SkillOrder:
var cast_dir: Vector2
var target: int
class BulletOrder:
var bullet_cfg: CharacterCfg
var cast_dir: Vector2
@ -50,7 +51,9 @@ var move_dir: Vector2 #移动方向
var speed_dir: Vector2 #速度方向
var velocity_change: Vector3 #一帧内速度变化值
var speed_down_push_rate: float #来自软阻挡的速度减少比率
@export var speed_up_rate: float #移动速度比率
var speed_xz: float #水平移动速度
var speed_y: float #竖直移动速度
var is_free_control: bool = true #是否可以自由控制
@ -59,7 +62,9 @@ var is_free_turn: bool = true #是否允许转向
var is_right: bool = true #是否向右
var is_jumping: bool #是否正在跳跃
var is_jumped: bool #是否已跳跃
@export var is_speed_y_freeze: bool #是否冻结竖直速度
#buff状态
var is_stagger: bool #是否硬直
var is_stun: bool #是否眩晕
@ -75,18 +80,24 @@ var skill_cfg: SkillCfg #当前技能
var is_skill_running: bool #技能是否正在释放
var skill_dir: Vector2 #技能释放方向
var skill_move_dir: Vector2 #技能位移方向
@export var skill_move_speed: float #技能位移速度
@export var skill_float_speed: float #技能y位移速度
@export var skill_move_stop: bool #技能位移速度是否停止生效
var skill_action_key: String #技能输入指令
@export var skill_break_level_add: int #技能额外打断等级
#核心状态
var core_active_list: Array[CoreCfg] = [] #主动核心列表 8个
var core_passive_list: Array[CoreCfg] = [] #被动核心列表
#玩家技能状态
var input_dir: Vector2 #指令方向
@export var stance: Enum.EStance #技能姿态
@export var break_level: Enum.EBreakLevel #打断等级
var weapon_list: Array[WeaponCfg] = [] #武器列表
var weapon_index: int #当前武器下标
var weapon_index_change_dir: int #武器下标操作变化方向
@ -96,7 +107,7 @@ var is_charging: bool #是否蓄力
var charging_level: int #蓄力等级
#ai状态
var ai_role: int #ai角色
var ai_skill_order: Array[SkillOrder] = [] #ai技能指令
var ai_skill_order: Array[SkillOrder] = [] #ai技能指令
var ai_bullet_order: Array[BulletOrder] = [] #ai子弹指令
var ai_alert_max: float #警戒值最大值
var ai_alert: float #警戒值

@ -8,7 +8,7 @@ class_name Throw
func _process(delta) -> void:
if status.throw_target == 0:
return
var target: Character = Global.character_mgr.get_character(status.throw_target)
var target: Character = Global.character_mgr.get_character(status.throw_target)
if not target:
return
var thorw_pos_2d: Vector2 = status.skill_dir.normalized() * position.x

@ -73,6 +73,7 @@ func _process(delta) -> void:
tick_view()
return
func tick_view() -> void:
update_flip()
if not sprite_frames: return
@ -161,6 +162,8 @@ func update_flip():
func update_view():
position = status.basic_offset + status.shake_offset
# global_position = Util.snap_vector3(global_position)

@ -3,25 +3,25 @@ extends Cfg
class_name AnimationSelectCfg
@export var sprite_frames: SpriteFrames:
set(value):
sprite_frames = value
notify_property_list_changed()
set(value):
sprite_frames = value
notify_property_list_changed()
var animation_name: String
func _get_property_list() -> Array[Dictionary]:
var hint_string: String = "none"
if sprite_frames:
hint_string = ",".join(sprite_frames.get_animation_names())
var hint_string: String = "none"
if sprite_frames:
hint_string = ",".join(sprite_frames.get_animation_names())
var properties: Array[Dictionary] = []
properties.append({
"name": "animation_name",
"type": TYPE_STRING,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_ENUM,
"hint_string": hint_string
})
var properties: Array[Dictionary] = []
properties.append({
"name": "animation_name",
"type": TYPE_STRING,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_ENUM,
"hint_string": hint_string
})
return properties
return properties

@ -3,6 +3,7 @@ class_name Cfg
var res_name: String
func get_res_name() -> String:
if res_name == "":
res_name = Util.get_resource_name(self)

@ -44,33 +44,33 @@ func get_attack2_box()->AttackBoxCfg: return attack2_box if attack2_box else Res
func get_particle()->Resource:
var res_name: String = get_res_name()
var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
return load(path_default)
return null
var res_name: String = get_res_name()
var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
return load(path_default)
return null
func get_ai()->PackedScene:
var res_name: String = get_res_name()
var path_default: String = "res://scene/ai/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
return load(path_default) as PackedScene
return null
var res_name: String = get_res_name()
var path_default: String = "res://scene/ai/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
return load(path_default) as PackedScene
return null
func get_core_cfg_list()->Array[CoreCfg]:
if core_cfg_list:
return core_cfg_list
core_cfg_list = []
var res_name: String = get_res_name()
var dir_path: String = "res://config/core"
var dir: DirAccess = DirAccess.open(dir_path)
for file in dir.get_files():
if not file.begins_with(res_name):
continue
var path: String = dir_path + "/" + file
var res = load(path)
if res is CoreCfg:
core_cfg_list.append(res)
return core_cfg_list
if core_cfg_list:
return core_cfg_list
core_cfg_list = []
var res_name: String = get_res_name()
var dir_path: String = "res://config/core"
var dir: DirAccess = DirAccess.open(dir_path)
for file in dir.get_files():
if not file.begins_with(res_name):
continue
var path: String = dir_path + "/" + file
var res = load(path)
if res is CoreCfg:
core_cfg_list.append(res)
return core_cfg_list

@ -9,28 +9,28 @@ var skill_cfg: Dictionary = {}
func get_icon()->Texture2D:
if not icon:
var res_name: String = get_res_name()
var path: String = "res://resource/ui/icon/core/%s.png" % res_name
if ResourceLoader.exists(path):
icon = load(path) as Texture2D
else:
icon = load("res://resource/ui/icon/core/default.png") as Texture2D
return icon
if not icon:
var res_name: String = get_res_name()
var path: String = "res://resource/ui/icon/core/%s.png" % res_name
if ResourceLoader.exists(path):
icon = load(path) as Texture2D
else:
icon = load("res://resource/ui/icon/core/default.png") as Texture2D
return icon
func get_skill_cfg(index: int)->SkillCfg:
if index in skill_cfg:
return skill_cfg[index]
var res_name: String = get_res_name()
var path_index: String = "res://config/skill_core/%s_%d.tres" % [res_name, index]
if ResourceLoader.exists(path_index):
skill_cfg[index] = load(path_index) as SkillCfg
else:
var path_default: String = "res://config/skill_core/%s.tres" % res_name
if ResourceLoader.exists(path_default):
skill_cfg[index] = load(path_default) as SkillCfg
if index in skill_cfg:
return skill_cfg[index]
print("无效的技能配置: %s_%d" % [res_name, index])
return null
if index in skill_cfg:
return skill_cfg[index]
var res_name: String = get_res_name()
var path_index: String = "res://config/skill_core/%s_%d.tres" % [res_name, index]
if ResourceLoader.exists(path_index):
skill_cfg[index] = load(path_index) as SkillCfg
else:
var path_default: String = "res://config/skill_core/%s.tres" % res_name
if ResourceLoader.exists(path_default):
skill_cfg[index] = load(path_default) as SkillCfg
if index in skill_cfg:
return skill_cfg[index]
print("无效的技能配置: %s_%d" % [res_name, index])
return null

@ -28,33 +28,33 @@ class_name SkillCfg
@export var is_lock_x_move: bool = false
@export var refresh_animation: bool:
get: return false
set(value): if Engine.is_editor_hint(): check_animation()
get: return false
set(value): if Engine.is_editor_hint(): check_animation()
var attack_particle: Dictionary = {}
var owner: CharacterCfg
func check_animation() -> bool:
var res_name: String = get_res_name()
var path: String = "res://resource/skill_animation/%s.tres" % res_name
if sprite_frames == null:
print("未设置技能动画资源")
return false
if animation_name == "":
print("未设置技能动画名")
return false
if !sprite_frames.has_animation(animation_name):
print("技能动画名不存在")
return false
var animation: Animation = ResourceLoader.load(path) as Animation
if not animation:
animation = Animation.new()
animation.resource_name = res_name
Util.refresh_animation_by_sprite_frames(path, sprite_frames, animation_name, animation)
Util.refresh_animation_lib()
skill_animation = load(path)
return true
var res_name: String = get_res_name()
var path: String = "res://resource/skill_animation/%s.tres" % res_name
if sprite_frames == null:
print("未设置技能动画资源")
return false
if animation_name == "":
print("未设置技能动画名")
return false
if !sprite_frames.has_animation(animation_name):
print("技能动画名不存在")
return false
var animation: Animation = ResourceLoader.load(path) as Animation
if not animation:
animation = Animation.new()
animation.resource_name = res_name
Util.refresh_animation_by_sprite_frames(path, sprite_frames, animation_name, animation)
Util.refresh_animation_lib()
skill_animation = load(path)
return true
func get_attack1()->AttackCfg: return attack1 if attack1 else ResourceManager.cfg_attack_normal
@ -70,23 +70,23 @@ func get_attack2_box()->AttackBoxCfg: return attack2_box if attack2_box else Res
func get_attack_particle(index: int)->Resource:
var res_name: String = get_res_name()
var path_index: String = "res://scene/effect/particle/%s_%d.tscn" % [res_name, index]
if ResourceLoader.exists(path_index):
attack_particle[index] = load(path_index)
else:
var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
attack_particle[index] = load(path_default)
if index in attack_particle:
return attack_particle[index]
return null
var res_name: String = get_res_name()
var path_index: String = "res://scene/effect/particle/%s_%d.tscn" % [res_name, index]
if ResourceLoader.exists(path_index):
attack_particle[index] = load(path_index)
else:
var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
attack_particle[index] = load(path_default)
if index in attack_particle:
return attack_particle[index]
return null
func get_owner() -> CharacterCfg:
if not owner:
var owner_name: String = get_res_name().split("_")[0]
var path: String = "res://config/character/%s.tres" % owner_name
if ResourceLoader.exists(path):
owner = load(path) as CharacterCfg
return owner
if not owner:
var owner_name: String = get_res_name().split("_")[0]
var path: String = "res://config/character/%s.tres" % owner_name
if ResourceLoader.exists(path):
owner = load(path) as CharacterCfg
return owner

@ -2,91 +2,91 @@
extends Node3D
@export var refresh_animation_lib: bool:
get: return false
set(_value):
Util.refresh_animation_lib()
get: return false
set(_value):
Util.refresh_animation_lib()
@export var clean_animation_lib: bool:
get: return false
set(_value):
Util.clean_animation_lib()
get: return false
set(_value):
Util.clean_animation_lib()
@export var refresh_mesh_lib: bool:
get: return false
set(_value):
process_mesh_lib("res://resource/mesh_level")
print("done.")
get: return false
set(_value):
process_mesh_lib("res://resource/mesh_level")
print("done.")
@export var refresh_uid: bool:
get: return false
set(_value):
process_dir("res://")
print("done.")
get: return false
set(_value):
process_dir("res://")
print("done.")
var selected_skill_file: String
func _process(delta: float) -> void:
if not get_node_or_null("Character"):
return
if not Engine.is_editor_hint():
if $Character:
$Character.free()
return
var selected_paths: PackedStringArray = EditorInterface.get_selected_paths()
if len(selected_paths) != 1:
return
var selected_path: String = selected_paths[0]
if selected_skill_file == selected_path:
return
selected_skill_file = selected_path
if not selected_path.ends_with(".tres"):
return
var res := ResourceLoader.load(selected_path)
if not res is SkillCfg:
return
var skill_cfg: SkillCfg = res as SkillCfg
if not get_node_or_null("Character"):
return
if not Engine.is_editor_hint():
if $Character:
$Character.free()
return
var selected_paths: PackedStringArray = EditorInterface.get_selected_paths()
if len(selected_paths) != 1:
return
var selected_path: String = selected_paths[0]
if selected_skill_file == selected_path:
return
selected_skill_file = selected_path
if not selected_path.ends_with(".tres"):
return
var res := ResourceLoader.load(selected_path)
if not res is SkillCfg:
return
var skill_cfg: SkillCfg = res as SkillCfg
if not skill_cfg.skill_animation:
return
if not skill_cfg.skill_animation:
return
var character_skill: AnimationPlayer = $Character/Skill as AnimationPlayer
var character_view: AnimatedSprite3D = $Character/View as AnimatedSprite3D
EditorInterface.edit_node(character_skill)
var animation_name: String = "animation_library/%s" % Util.get_resource_name(res)
character_skill.current_animation = animation_name
EditorInterface.edit_resource(res)
var character_skill: AnimationPlayer = $Character/Skill as AnimationPlayer
var character_view: AnimatedSprite3D = $Character/View as AnimatedSprite3D
EditorInterface.edit_node(character_skill)
var animation_name: String = "animation_library/%s" % Util.get_resource_name(res)
character_skill.current_animation = animation_name
EditorInterface.edit_resource(res)
func process_mesh_lib(dir_name: String) -> void:
var dir := DirAccess.open(dir_name)
if not dir:
print("An error occurred when trying to access the path: ", dir_name)
return
var path_list: Array[Variant] = []
dir.list_dir_begin()
for file_name in dir.get_files():
if file_name.ends_with(".vox"):
path_list.append(dir_name + "/" + file_name)
Util.refresh_mesh_library(path_list, true)
var dir := DirAccess.open(dir_name)
if not dir:
print("An error occurred when trying to access the path: ", dir_name)
return
var path_list: Array[Variant] = []
dir.list_dir_begin()
for file_name in dir.get_files():
if file_name.ends_with(".vox"):
path_list.append(dir_name + "/" + file_name)
Util.refresh_mesh_library(path_list, true)
func process_dir(dir_name: String) -> void:
var dir := DirAccess.open(dir_name)
if dir:
dir.list_dir_begin()
var file_name: String = dir.get_next()
if dir_name.ends_with("/"):
dir_name = dir_name.trim_suffix("/")
while file_name != "":
if dir.current_is_dir():
print("-----" + dir_name + "/" + file_name + " -----")
process_dir(dir_name + "/" + file_name)
elif file_name.get_extension() in [ "tres", "res" ]:
print(dir_name + "/" + file_name)
var res := ResourceLoader.load(dir_name + "/" + file_name)
ResourceSaver.save(res)
var dir := DirAccess.open(dir_name)
if dir:
dir.list_dir_begin()
var file_name: String = dir.get_next()
if dir_name.ends_with("/"):
dir_name = dir_name.trim_suffix("/")
while file_name != "":
if dir.current_is_dir():
print("-----" + dir_name + "/" + file_name + " -----")
process_dir(dir_name + "/" + file_name)
elif file_name.get_extension() in [ "tres", "res" ]:
print(dir_name + "/" + file_name)
var res := ResourceLoader.load(dir_name + "/" + file_name)
ResourceSaver.save(res)
file_name = dir.get_next()
else:
print("An error occurred when trying to access the path: ", dir_name)
file_name = dir.get_next()
else:
print("An error occurred when trying to access the path: ", dir_name)

@ -3,18 +3,20 @@ extends MultiMeshInstance3D
@export var extents := Vector2.ONE
@export var scale_basic := 1.0
@export var refresh: bool:
get: return false
set(_value):
refresh_grass()
func refresh_grass() -> void:
var rng := RandomNumberGenerator.new()
rng.randomize()
for instance_index in multimesh.instance_count:
var scale: float = rng.randf_range(scale_basic - 0.1, scale_basic + 0.1)
var transform := Transform3D().rotated(Vector3.UP, 0).scaled(Vector3.ONE * scale)
var scale: float = rng.randf_range(scale_basic - 0.1, scale_basic + 0.1)
var transform := Transform3D().rotated(Vector3.UP, 0).scaled(Vector3.ONE * scale)
var x: float
var z: float
x = rng.randf_range(-extents.x, extents.x)

@ -5,14 +5,14 @@ class_name Fragment
@export var gravity_scale: float = 1.0
@export var alive_time: float = 1.0
var velocity_min: Vector2 = Vector2(0, 2)
var velocity_max: Vector2 = Vector2(2, 4)
var velocity_min: Vector2 = Vector2(0, 2)
var velocity_max: Vector2 = Vector2(2, 4)
@onready var sprite3D: Sprite3D = %Sprite3D as Sprite3D
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
var frame_rate: float = 0.1
var frame_time: float = 0
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
var frame_rate: float = 0.1
var frame_time: float = 0
var fade_out_treshold: float = 0.5

@ -38,6 +38,6 @@ func on_process(delta: float) -> void:
scale = Vector3(scale_sample, 1, scale_sample) * size_scale
#旋转
# rotation_degrees.y = particle_rotate * rate + random_rotate
# rotation_degrees.y = particle_rotate * rate + random_rotate
rotation_degrees.y = particle_rotate * rate
return

@ -33,14 +33,17 @@ var character_born_spots: Array[ChacacterBornSpot] #运行时设置
var level_active_spots: Array[LevelActiveSpot] #运行时设置
var enemy_cfgs: Array[CharacterCfg] #运行时设置
class ChacacterSpot:
var pos: Vector3
var cfg: CharacterCfg
class ChacacterBornSpot:
var pos: Vector3
var type: int
class LevelActiveSpot:
var pos: Vector3
var scene: PackedScene
@ -99,9 +102,9 @@ func init_character_spots(level_character: GridMap) -> void:
for x in range(id_min.x, id_max.x):
for y in range(id_min.y, id_max.y):
for z in range(id_min.z, id_max.z):
var pos: Vector3i = Vector3i(x, y, z)
var pos: Vector3i = Vector3i(x, y, z)
var float_pos: Vector3 = Util.get_level_float_pos(pos) + Vector3(0.32, 0, 0.32)
var item_id: int = level_character.get_cell_item(pos)
var item_id: int = level_character.get_cell_item(pos)
if item_id == GridMap.INVALID_CELL_ITEM:
continue
var item_name: String = mesh_library.get_item_name(item_id)
@ -119,8 +122,8 @@ func init_character_spots(level_character: GridMap) -> void:
character_spot.pos = float_pos
character_spots.append(character_spot)
elif item_name.begins_with("a_"):
var scene_name: String = item_name.trim_prefix("a_")
var scene : PackedScene = Util.get_level_active_scene_by_name(scene_name)
var scene_name: String = item_name.trim_prefix("a_")
var scene: PackedScene = Util.get_level_active_scene_by_name(scene_name)
if not scene:
continue
var level_active_spot = LevelActiveSpot.new()
@ -136,15 +139,19 @@ func init_character_spots(level_character: GridMap) -> void:
func get_character_spots() -> Array[ChacacterSpot]:
return character_spots
func get_character_born_spots() -> Array[ChacacterBornSpot]:
return character_born_spots
func get_enemy_cfgs() -> Array[CharacterCfg]:
return enemy_cfgs
func get_level_active_spots() -> Array[LevelActiveSpot]:
return level_active_spots
func pos_min() -> Vector3:
return get_global_position()
@ -159,5 +166,5 @@ func is_in_active_area(pos: Vector3) -> bool:
var active_pos_min: Vector3 = pos_min() + Vector3(0.96, 0, 0.96)
var active_pos_max: Vector3 = pos_max() - Vector3(0.96, 0, 0.96)
return pos.x >= active_pos_min.x and pos.x <= active_pos_max.x and \
pos.z >= active_pos_min.z and pos.z <= active_pos_max.z and \
pos.y >= active_pos_min.y and pos.y <= active_pos_max.y
pos.z >= active_pos_min.z and pos.z <= active_pos_max.z and \
pos.y >= active_pos_min.y and pos.y <= active_pos_max.y

@ -6,37 +6,37 @@ var tick_time_left: float = 1
func _ready():
pass
pass
func _process(delta) -> void:
tick_time_left -= delta
if tick_time_left <= 0:
tick_time_left = tick_time
tick_time_left = 0
if tick_time_left > 0:
return
var player: Character = Global.character_mgr.get_player()
if not player: return
var enemy_list: Array[Character] = Global.character_mgr.get_enemy_list(player.id())
if not enemy_list: return
var pos_player: Vector2 = player.pos2D()
enemy_list.sort_custom(func(a: Character, b: Character): return a.pos2D().distance_squared_to(pos_player) < b.pos2D().distance_squared_to(pos_player))
var count: int = enemy_list.size()
var role_num_1: int = max(int(count*0.2), 2) #近战
var role_num_2: int = max(int(count*0.1), 1) #刺客
var role_num_3: int = max(int(count*0.2), 2) #远程
var index: int = 0
for enemy in enemy_list:
if enemy.get_status("is_stagger") or enemy.get_status("is_stun"):
enemy.set_status("ai_role", Enum.EAIRoleType.None)
continue
if index < role_num_1:
enemy.set_status("ai_role", Enum.EAIRoleType.Saber)
elif index < role_num_1 + role_num_2:
enemy.set_status("ai_role", Enum.EAIRoleType.Assassin)
elif index < role_num_1 + role_num_2 + role_num_3:
enemy.set_status("ai_role", Enum.EAIRoleType.Caster)
else:
enemy.set_status("ai_role", Enum.EAIRoleType.None)
index += 1
tick_time_left -= delta
if tick_time_left <= 0:
tick_time_left = tick_time
tick_time_left = 0
if tick_time_left > 0:
return
var player: Character = Global.character_mgr.get_player()
if not player: return
var enemy_list: Array[Character] = Global.character_mgr.get_enemy_list(player.id())
if not enemy_list: return
var pos_player: Vector2 = player.pos2D()
enemy_list.sort_custom(func(a: Character, b: Character): return a.pos2D().distance_squared_to(pos_player) < b.pos2D().distance_squared_to(pos_player))
var count: int = enemy_list.size()
var role_num_1: int = max(int(count*0.2), 2) #近战
var role_num_2: int = max(int(count*0.1), 1) #刺客
var role_num_3: int = max(int(count*0.2), 2) #远程
var index: int = 0
for enemy in enemy_list:
if enemy.get_status("is_stagger") or enemy.get_status("is_stun"):
enemy.set_status("ai_role", Enum.EAIRoleType.None)
continue
if index < role_num_1:
enemy.set_status("ai_role", Enum.EAIRoleType.Saber)
elif index < role_num_1 + role_num_2:
enemy.set_status("ai_role", Enum.EAIRoleType.Assassin)
elif index < role_num_1 + role_num_2 + role_num_3:
enemy.set_status("ai_role", Enum.EAIRoleType.Caster)
else:
enemy.set_status("ai_role", Enum.EAIRoleType.None)
index += 1

@ -171,6 +171,7 @@ func effect(pause_time) -> void:
#add_global_effect(Enum.EGlobalEffect.SpeedLine,effect_time,0.2* rate)
return
func effect_shake(pause_time) -> void:
if not pause_time:
return

@ -1,12 +1,12 @@
extends Node3D
func _input(event) -> void:
if !event.is_action_type():
return
for action_name in InputMap.get_actions():
if event.is_action_pressed(action_name):
SignalManager.input_action_pressed.emit(action_name)
elif event.is_action_released(action_name):
SignalManager.input_action_released.emit(action_name)
var input_dir: Vector2 = Input.get_vector("move_left", "move_right", "move_up", "move_down")
SignalManager.input_action_move.emit(input_dir)
if !event.is_action_type():
return
for action_name in InputMap.get_actions():
if event.is_action_pressed(action_name):
SignalManager.input_action_pressed.emit(action_name)
elif event.is_action_released(action_name):
SignalManager.input_action_released.emit(action_name)
var input_dir: Vector2 = Input.get_vector("move_left", "move_right", "move_up", "move_down")
SignalManager.input_action_move.emit(input_dir)

@ -2,29 +2,29 @@ extends Node3D
class_name ItemManager
func _ready():
Global.item_mgr = self
SignalManager.level_loading_start.connect(on_level_loading_start)
Global.item_mgr = self
SignalManager.level_loading_start.connect(on_level_loading_start)
func on_level_loading_start():
pass
pass
func create_pt(type: Enum.EPtType, value: int, pos: Vector3):
value = randi_range(0.5 * value, 1.5 * value)
var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1]
while value > 0:
for i in pt_slice:
if value < i:
continue
value -= i
_create_pt(type, i, pos)
break
value = randi_range(0.5 * value, 1.5 * value)
var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1]
while value > 0:
for i in pt_slice:
if value < i:
continue
value -= i
_create_pt(type, i, pos)
break
func _create_pt(type: Enum.EPtType, value: int, pos: Vector3):
var pt: PT = ResourceManager.scene_pt.instantiate() as PT
pt.type = type
pt.value = value
add_child(pt)
pt.position = pos
var pt: PT = ResourceManager.scene_pt.instantiate() as PT
pt.type = type
pt.value = value
add_child(pt)
pt.position = pos

@ -14,6 +14,7 @@ var is_level_active: bool
var enemy_count: int #由关卡生成的怪物数量
var current_enmey: Array[int] #当前存活怪物id
func _ready():
Global.level_mgr = self
SignalManager.character_create.connect(on_character_create)
@ -92,6 +93,7 @@ func set_player_position(pos: Vector3) -> void:
cur_level_instance = new_level_instance
enter_level()
func enter_level() -> void:
SignalManager.level_loading_start.emit()
is_level_active = false
@ -119,6 +121,7 @@ func enter_level() -> void:
SignalManager.level_loading_end.emit()
func check_level_active(pos: Vector3) -> void:
if is_level_active:
return
@ -149,7 +152,7 @@ func get_level_id_list(pos: Vector3, size: Vector3i) -> Array[Vector3i]:
return ret
func enemy_born(count : int) -> bool:
func enemy_born(count: int) -> bool:
if level_character_born_spots.size() == 0:
return false
var count_max: int = level_enemy_cfgs.size()
@ -158,9 +161,9 @@ func enemy_born(count : int) -> bool:
return false
var count_start = enemy_count
for i in count:
var cfg_index: int = count_start + i
var cfg: CharacterCfg = level_enemy_cfgs[cfg_index]
var pos_index: int = enemy_count % level_character_born_spots.size()
var cfg_index: int = count_start + i
var cfg: CharacterCfg = level_enemy_cfgs[cfg_index]
var pos_index: int = enemy_count % level_character_born_spots.size()
var character_spot: LevelInstance.ChacacterBornSpot = level_character_born_spots[pos_index]
Global.character_mgr.create_character(cfg, Enum.ETeam.Monster, character_spot.pos)
enemy_count += 1

@ -31,11 +31,11 @@ var particle_hit_common: PackedScene = load("res://scene/effect/particle/particl
#hit_material
var particle_material_cloth: PackedScene = load("res://scene/effect/particle/particle_material_cloth.tscn")
#move
var particle_move_hit_ground: PackedScene = load("res://scene/effect/particle/particle_move_hit_ground.tscn")
var particle_move_dash: PackedScene = load("res://scene/effect/particle/particle_move_dash.tscn")
var particle_move_speed: PackedScene = load("res://scene/effect/particle/particle_move_speed.tscn")
var particle_move_hit_ground: PackedScene = load("res://scene/effect/particle/particle_move_hit_ground.tscn")
var particle_move_dash: PackedScene = load("res://scene/effect/particle/particle_move_dash.tscn")
var particle_move_speed: PackedScene = load("res://scene/effect/particle/particle_move_speed.tscn")
var particle_move_jump_ground: PackedScene = load("res://scene/effect/particle/particle_move_jump_ground.tscn")
var particle_move_jump_air: PackedScene = load("res://scene/effect/particle/particle_move_jump_air.tscn")
var particle_move_jump_air: PackedScene = load("res://scene/effect/particle/particle_move_jump_air.tscn")
#collect
var particle_pt_collect: PackedScene = load("res://scene/effect/particle/particle_pt_collect.tscn")
#warn

@ -8,56 +8,57 @@ var top_ui_screen: Node
func _ready():
Global.ui_mgr = self
close_all()
open("hud")
Global.ui_mgr = self
close_all()
open("hud")
func input_action(key: String, is_pressed: bool):
if top_ui_screen:
top_ui_screen.call("input_action", key, is_pressed)
if top_ui_screen:
top_ui_screen.call("input_action", key, is_pressed)
func input_dir(dir: Vector2):
if top_ui_screen:
top_ui_screen.call("input_dir", dir)
if top_ui_screen:
top_ui_screen.call("input_dir", dir)
func open(ui_name: String):
set_ui_visible(ui_name, true)
set_ui_visible(ui_name, true)
func close(ui_name: String):
set_ui_visible(ui_name, false)
set_ui_visible(ui_name, false)
func close_all():
for ui_name in ui_map:
close(ui_name)
for ui_name in ui_map:
close(ui_name)
func pause_open(ui_name: String):
open(ui_name)
set_pause(true)
open(ui_name)
set_pause(true)
func pause_close(ui_name: String):
close(ui_name)
set_pause(false)
close(ui_name)
set_pause(false)
func set_ui_visible(ui_name: String, is_visible: bool) -> void:
if not ui_name in ui_map:
return
var ui_screen = ui_map[ui_name]
ui_screen.visible = is_visible
if is_visible:
top_ui_screen = ui_screen
print("top_ui_screen:", ui_name)
return
if not ui_name in ui_map:
return
var ui_screen = ui_map[ui_name]
ui_screen.visible = is_visible
if is_visible:
top_ui_screen = ui_screen
print("top_ui_screen:", ui_name)
return
func set_pause(is_pause: bool):
pause_count += 1 if is_pause else -1
is_pause = pause_count > 0
Global.is_control_pause = is_pause
get_tree().paused = is_pause
pause_count += 1 if is_pause else -1
is_pause = pause_count > 0
Global.is_control_pause = is_pause
get_tree().paused = is_pause

@ -4,8 +4,8 @@ extends Control
func on_hp_max_changed(value: float):
hp_bar.max_value = value
hp_bar.max_value = value
func on_hp_changed(value: float):
hp_bar.value = value
hp_bar.value = value

@ -7,7 +7,7 @@ class_name CoreItemSub
func set_icon(value: Texture2D):
if value:
icon.texture = value
else:
icon.texture = icon_empty
if value:
icon.texture = value
else:
icon.texture = icon_empty

@ -5,89 +5,89 @@ extends Control
class HeadbarMeta:
var pos: Vector3
var headbar: Headbar
var pos: Vector3
var headbar: Headbar
var headbar_map: Dictionary = {}
func _ready():
SignalManager.character_create.connect(on_character_create)
SignalManager.character_ui_pos_changed.connect(on_character_ui_pos_changed)
SignalManager.character_destroy.connect(on_character_destroy)
SignalManager.character_status_changed.connect(on_character_status_changed)
SignalManager.character_hit_text.connect(on_character_hit_text)
SignalManager.character_hit_damage.connect(on_character_hit_damage)
SignalManager.character_die.connect(on_character_die)
SignalManager.character_create.connect(on_character_create)
SignalManager.character_ui_pos_changed.connect(on_character_ui_pos_changed)
SignalManager.character_destroy.connect(on_character_destroy)
SignalManager.character_status_changed.connect(on_character_status_changed)
SignalManager.character_hit_text.connect(on_character_hit_text)
SignalManager.character_hit_damage.connect(on_character_hit_damage)
SignalManager.character_die.connect(on_character_die)
func _process(delta):
for k in headbar_map:
var headbar_meta: HeadbarMeta = headbar_map[k] as HeadbarMeta
headbar_meta.headbar.position = camera.get_screen_pos(headbar_meta.pos)
for k in headbar_map:
var headbar_meta: HeadbarMeta = headbar_map[k] as HeadbarMeta
headbar_meta.headbar.position = camera.get_screen_pos(headbar_meta.pos)
func on_character_create(id: int, type: int, pos: Vector3) -> void:
if type != Enum.ECharacterType.Monster:
return
var new_headbar_meta = HeadbarMeta.new()
var new_headbar: Headbar = headbar_scene.instantiate() as Headbar
new_headbar_meta.pos = pos
new_headbar_meta.headbar = new_headbar
new_headbar.set_debug_info_show(get_tree().debug_collisions_hint)
add_child(new_headbar)
on_character_ui_pos_changed(id, pos)
headbar_map[id] = new_headbar_meta
if type != Enum.ECharacterType.Monster:
return
var new_headbar_meta = HeadbarMeta.new()
var new_headbar: Headbar = headbar_scene.instantiate() as Headbar
new_headbar_meta.pos = pos
new_headbar_meta.headbar = new_headbar
new_headbar.set_debug_info_show(get_tree().debug_collisions_hint)
add_child(new_headbar)
on_character_ui_pos_changed(id, pos)
headbar_map[id] = new_headbar_meta
func on_character_ui_pos_changed(id: int, pos: Vector3) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar_meta.pos = pos
headbar.position = camera.get_screen_pos(pos)
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar_meta.pos = pos
headbar.position = camera.get_screen_pos(pos)
func on_character_destroy(id: int) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)
func on_character_status_changed(id: int, status_name: String, value) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
var func_name: String = "on_%s_changed" % status_name
if headbar.has_method(func_name):
headbar.call(func_name, value)
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
var func_name: String = "on_%s_changed" % status_name
if headbar.has_method(func_name):
headbar.call(func_name, value)
func on_character_hit_text(id: int, value: String) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_text(value)
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_text(value)
func on_character_hit_damage(id: int, value: float) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_damage(value)
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_damage(value)
func on_character_die(id: int) -> void:
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)
if not id in headbar_map:
return
var headbar_meta = headbar_map[id]
var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)

@ -5,20 +5,22 @@ extends Control
var color_material: ShaderMaterial
@export var duration: float:
set(value):
if color_material: color_material.set_shader_parameter("position", value)
set(value):
if color_material: color_material.set_shader_parameter("position", value)
func _ready():
color_material = $ColorRect.material as ShaderMaterial
color_material = $ColorRect.material as ShaderMaterial
# SignalManager.level_loading_start.connect(on_level_loading_start)
# SignalManager.level_loading_end.connect(on_level_loading_end)
func on_level_loading_start():
animation.play("start")
animation.play("start")
func on_level_loading_end():
animation.play("end")
animation.play("end")

@ -8,37 +8,37 @@ extends Control
func _process(delta: float) -> void:
# test
var player: Character = Global.character_mgr.get_player()
if player:
break_level_label.text = str(player.get_status("break_level"))
# test
var player: Character = Global.character_mgr.get_player()
if player:
break_level_label.text = str(player.get_status("break_level"))
func on_hp_max_changed(value: float):
hp_bar.max_value = value
hp_bar.max_value = value
func on_hp_changed(value: float):
hp_bar.value = value
hp_bar.value = value
func on_mp_sub_max_changed(value: float):
mp_sub_bar.max_value = value
mp_sub_bar.max_value = value
func on_mp_sub_changed(value: float):
mp_sub_bar.value = value
mp_sub_bar.value = value
func on_mp_max_changed(value: int):
for child in mp_list.get_children():
child.queue_free()
for i in range(value):
var mp_item: MpItemSub = mp_scene.instantiate() as MpItemSub
mp_list.add_child(mp_item)
for child in mp_list.get_children():
child.queue_free()
for i in range(value):
var mp_item: MpItemSub = mp_scene.instantiate() as MpItemSub
mp_list.add_child(mp_item)
func on_mp_changed(value: int):
for i in range(mp_list.get_child_count()):
var mp_item: MpItemSub = mp_list.get_child(i) as MpItemSub
mp_item.set_active(i<value)
for i in range(mp_list.get_child_count()):
var mp_item: MpItemSub = mp_list.get_child(i) as MpItemSub
mp_item.set_active(i<value)

@ -6,13 +6,13 @@ var slot: TextureRect
func init(value: Texture2D):
icon = $WeaponIcon
slot = $WeaponSlot
icon.texture = value
icon = $WeaponIcon
slot = $WeaponSlot
icon.texture = value
func update_alpha(alpha_from: float, alpha_to: float, rate: float):
var alpha = lerp(alpha_from, alpha_to, rate)
icon.modulate = Color(1, 1, 1, alpha)
slot.modulate = Color(1, 1, 1, alpha)
var alpha = lerp(alpha_from, alpha_to, rate)
icon.modulate = Color(1, 1, 1, alpha)
slot.modulate = Color(1, 1, 1, alpha)

@ -1,7 +1,7 @@
extends Control
func input_action_pressed(key: String):
match key:
"menu":
Global.ui_mgr.pause_close("menu")
Global.ui_mgr.open("hud")
match key:
"menu":
Global.ui_mgr.pause_close("menu")
Global.ui_mgr.open("hud")

@ -1,4 +1,4 @@
extends Label
func _process(delta):
set_text("%d FPS" % Engine.get_frames_per_second())
set_text("%d FPS" % Engine.get_frames_per_second())

@ -1,7 +1,7 @@
extends Control
func input_action_pressed(key: String):
match key:
"status":
Global.ui_mgr.pause_close("status")
Global.ui_mgr.open("hud")
match key:
"status":
Global.ui_mgr.pause_close("status")
Global.ui_mgr.open("hud")

Loading…
Cancel
Save