Extensive work done on basically everything. Attacks prototyped, animations prototyped, pawnbody split out, all traps but pitfall implemented, UI hooked up more.
This commit is contained in:
112
scripts/trap.gd
112
scripts/trap.gd
@@ -26,40 +26,64 @@ const trap_icons : Dictionary = {
|
||||
Trap.Type.MINE : preload("res://visuals/images/icons/t-mine.png"),
|
||||
}
|
||||
|
||||
const explosion_template = preload("res://templates/explosion.tscn")
|
||||
const bomb_explosion_template = preload("res://templates/explosion.tscn")
|
||||
const mine_explosion_template = preload("res://templates/explosion.tscn")
|
||||
const switch_explosion_template = preload("res://templates/explosion.tscn")
|
||||
const gas_emitter_template = preload("res://templates/gas_emitter.tscn")
|
||||
|
||||
@onready var range_area : Area3D = %RangeArea
|
||||
@onready var range_shape : BoxShape3D = %RangeShape.shape
|
||||
@onready var model : MeshInstance3D = %Model
|
||||
@onready var icon : Sprite3D = %Icon
|
||||
@onready var force_strip : Sprite3D = %ForceStrip
|
||||
@onready var material : StandardMaterial3D = model.get_surface_override_material(0)
|
||||
@onready var reveal_timer : Timer = %RevealTimer
|
||||
@onready var activation_timer : Timer = %ActivationTimer
|
||||
|
||||
var type : Type
|
||||
var square : Vector3i
|
||||
var trap_owner : int
|
||||
var direction : Vector3
|
||||
|
||||
var disarming : bool
|
||||
var disarm_id : int
|
||||
|
||||
var delayed_trigger_tween : Tween = null
|
||||
|
||||
var damage : int = 10
|
||||
|
||||
var just_revealed : bool = false
|
||||
|
||||
signal disarmed(type : Trap.Type)
|
||||
signal activated(type : Trap.Type)
|
||||
|
||||
|
||||
func setup(type : Type, trap_owner : int) -> void:
|
||||
func setup(type : Type, direction : Vector3, trap_owner : int) -> void:
|
||||
self.type = type
|
||||
self.trap_owner = trap_owner
|
||||
if type == Type.FORCE_PANEL:
|
||||
var r : float = atan2(direction.z, direction.x)
|
||||
var cardinal : float = roundi(r * 2 / PI) * PI / 2
|
||||
self.direction = Vector3(cos(cardinal), 0, sin(cardinal))
|
||||
|
||||
func disarm() -> void:
|
||||
disarmed.emit(type)
|
||||
queue_free()
|
||||
|
||||
func reveal() -> void:
|
||||
if model.visible:
|
||||
return
|
||||
model.visible = true
|
||||
reveal_timer.start(5)
|
||||
just_revealed = true
|
||||
|
||||
func is_just_revealed() -> bool:
|
||||
return just_revealed
|
||||
|
||||
func is_revealed() -> bool:
|
||||
return model.visible
|
||||
|
||||
func _on_reveal_timeout() -> void:
|
||||
if Game.level.is_square_detected(square):
|
||||
if Game.level.is_square_detected(square) or disarming:
|
||||
reveal_timer.start(5)
|
||||
else:
|
||||
model.visible = false
|
||||
@@ -71,15 +95,87 @@ func _ready() -> void:
|
||||
icon.visible = owns_trap
|
||||
range_shape.size = range_shapes[type]
|
||||
material.albedo_color = Color.YELLOW if owns_trap else Color.RED
|
||||
match(type):
|
||||
Type.BOMB:
|
||||
damage = 15
|
||||
Type.MINE:
|
||||
damage = 10
|
||||
Type.SWITCH:
|
||||
damage = 5
|
||||
Type.GAS:
|
||||
activation_timer.start()
|
||||
Type.FORCE_PANEL:
|
||||
var r : float = atan2(direction.z, -direction.x) + PI/2
|
||||
force_strip.rotate_y(r)
|
||||
force_strip.visible = true
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
just_revealed = false
|
||||
|
||||
func blast(body : Player) -> void:
|
||||
body.hurt(damage)
|
||||
|
||||
func activate() -> void:
|
||||
var exp = explosion_template.instantiate()
|
||||
Game.level.add_vfx(exp, square)
|
||||
var explode : bool = false
|
||||
match(type):
|
||||
Type.FORCE_PANEL:
|
||||
for body in get_overlapping_bodies():
|
||||
body.fling(direction, 5.0)
|
||||
Type.MINE:
|
||||
var exp = mine_explosion_template.instantiate()
|
||||
Game.level.add_vfx(exp, square)
|
||||
explode = true
|
||||
Type.SWITCH:
|
||||
var exp = switch_explosion_template.instantiate()
|
||||
Game.level.add_vfx(exp, square)
|
||||
explode = true
|
||||
Type.BOMB:
|
||||
var exp = bomb_explosion_template.instantiate()
|
||||
Game.level.add_vfx(exp, square)
|
||||
explode = true
|
||||
Type.GAS:
|
||||
var emitter = gas_emitter_template.instantiate()
|
||||
emitter.trap_owner = trap_owner
|
||||
emitter.square = square
|
||||
emitter.damage = 4
|
||||
Game.level.add_vfx(emitter, square)
|
||||
|
||||
if explode:
|
||||
trigger_adjacent_bombs()
|
||||
blast_players()
|
||||
|
||||
Game.level.remove_trap_square(square)
|
||||
activated.emit(type)
|
||||
queue_free()
|
||||
|
||||
func trigger_adjacent_bombs() -> void:
|
||||
for trap : Trap in range_area.get_overlapping_areas():
|
||||
if trap.type == Type.BOMB:
|
||||
trap.delay_trigger()
|
||||
|
||||
func blast_players() -> void:
|
||||
for body in range_area.get_overlapping_bodies():
|
||||
body.hurt(damage)
|
||||
#match(type):
|
||||
blast(body)
|
||||
|
||||
func delay_trigger() -> void:
|
||||
if delayed_trigger_tween != null:
|
||||
return
|
||||
delayed_trigger_tween = create_tween()
|
||||
delayed_trigger_tween.tween_interval(.25)
|
||||
delayed_trigger_tween.tween_callback(activate)
|
||||
|
||||
|
||||
func _on_body_entered(body: Node3D) -> void:
|
||||
if type == Type.GAS:
|
||||
return
|
||||
|
||||
if body.id == trap_owner:
|
||||
return
|
||||
|
||||
if !disarming or body.id != disarm_id:
|
||||
if !body.detecting:
|
||||
activate()
|
||||
|
||||
|
||||
func _on_activation_timer_timeout() -> void:
|
||||
activate()
|
||||
|
||||
Reference in New Issue
Block a user