Files
seeding-planets/gui/vending_machine/scripts/vending_machine_3d.gd
Zacharie Guet d45fab6a3d Feature pour l'alpha 1.3
* Ajout d'un mode infini (pour nos hard core gamers)
* Ajout d'un message de découverte d'un nouvel outil
* Séparation de la pelle en deux outils : la pioche et la fourche
* Amélioration de la lisibilité des capsules d'énergies
* Changement léger des texture du sol et de la pierre
* Correction d'un bug lors du clic frénétique sur le porte de sortie du vaisseau
* Ajout d'un icône de recharge
* Fix de la mutation Ancien qui ne s'améliorait pas au niveau 4

+ début de dev des artefacts avec un distributeur
2026-03-27 17:28:20 +01:00

110 lines
3.2 KiB
GDScript

@tool
extends Node3D
class_name VendingMachine3d
const LINE_OBJECT_NUMBER = 5
const LINE_OBJECT_SEPARATION = Vector3.LEFT * 0.2
const FALLING_OBJECT_LINE_SHIFT = Vector3.FORWARD * 0.3
@export_tool_button("Update", "Callable") var update_action = update
@export_tool_button("Fall Object 1", "Callable") var fall_object_1_action = fall_object_1
@export_tool_button("Fall Object 1", "Callable") var fall_object_2_action = fall_object_2
@export var object_1_scene : PackedScene = null : set = set_object_1_scene
@export var object_2_scene : PackedScene = null : set = set_object_2_scene
@export var screen_1_hide : bool = true : set = set_screen_1_hide
@export var screen_2_hide : bool = true : set = set_screen_2_hide
# func _input(_e):
# if Input.is_action_just_pressed("action"):
# fall_object([
# %Line1,
# %Line2,
# %Line3,
# %Line4
# ].pick_random())
func _ready():
update()
func update():
set_object_1_scene()
set_object_2_scene()
set_screen_1_hide()
set_screen_2_hide()
func set_object_1_scene(scene := object_1_scene):
if scene and is_node_ready():
fill_lines(%Line1, scene.instantiate())
fill_lines(%Line2, scene.instantiate())
object_1_scene = scene
func set_object_2_scene(scene := object_2_scene):
if scene and is_node_ready():
fill_lines(%Line3, scene.instantiate())
fill_lines(%Line4, scene.instantiate())
object_2_scene = scene
func set_screen_1_hide(v := screen_1_hide):
screen_1_hide = v
if is_node_ready():
%HideScreen1.visible = v
func set_screen_2_hide(v := screen_2_hide):
screen_2_hide = v
if is_node_ready():
%HideScreen2.visible = v
func fall_object_1():
fall_object([
%Line1,
%Line2
].pick_random())
func fall_object_2():
fall_object([
%Line3,
%Line4
].pick_random())
func fall_object(from_line : Node3D):
if len(from_line.get_children()):
var falling_object = create_falling_object()
var object = from_line.get_children().pick_random() as Node3D
falling_object.global_position = object.global_position + FALLING_OBJECT_LINE_SHIFT
var falling_model = object.duplicate()
falling_model.position = Vector3.ZERO
falling_object.add_child(falling_model)
falling_object.freeze = false
object.queue_free()
%FallingObjects.add_child(falling_object)
func clear_falling_objects():
for c in %FallingObjects.get_children():
c.queue_free()
func create_falling_object() -> RigidBody3D:
var falling_object = RigidBody3D.new()
var falling_collider = CollisionShape3D.new()
var falling_shape = SphereShape3D.new()
falling_shape.radius = 0.08
falling_collider.shape = falling_shape
falling_object.add_child(falling_collider)
falling_object.gravity_scale = 0.2
return falling_object
func fill_lines(line : Node3D, object : Node3D):
for c in line.get_children():
c.queue_free()
for i in range(LINE_OBJECT_NUMBER):
var new_object = object.duplicate()
line.add_child(new_object)
new_object.position = i * LINE_OBJECT_SEPARATION