54 lines
1.6 KiB
GDScript
54 lines
1.6 KiB
GDScript
extends Spatial
|
|
|
|
signal game_over
|
|
signal got_treasure(item_type)
|
|
|
|
const LootTable = preload("res://scripts/loot_table.gd")
|
|
const RockScene = preload("res://scenes/rock.tscn")
|
|
|
|
const GeodeResource = preload("res://item_types/geode.tres")
|
|
|
|
onready var timer : Timer = $Timer
|
|
onready var rover = $"%rover"
|
|
onready var level_arrow = $"%LevelArrow"
|
|
|
|
export var play_time: float = 20.0
|
|
export var arrow_viz_distance = 10.0
|
|
export var geode_loot_count_per_chance = {}
|
|
|
|
var loot_table : SimpleLootTable = null
|
|
|
|
func _ready():
|
|
loot_table = LootTable.new(geode_loot_count_per_chance)
|
|
timer.start(play_time)
|
|
spawn_rocks(10)
|
|
|
|
func spawn_rocks(count: int):
|
|
var locations: Array = get_tree().get_nodes_in_group("rock_spawn_location")
|
|
locations.shuffle()
|
|
for i in range(min(count, locations.size())):
|
|
var location = locations[i]
|
|
var rock = RockScene.instance()
|
|
rock.treasure_count = loot_table.roll_for_loot()
|
|
location.add_child(rock)
|
|
|
|
func _on_collection_area_area_entered(area):
|
|
if area.has_meta("owner"):
|
|
area = area.get_meta("owner")
|
|
for i in area.treasure_count:
|
|
emit_signal("got_treasure", GeodeResource)
|
|
area.queue_free()
|
|
|
|
func _process(delta):
|
|
$"%progress_bar".value = timer.time_left * 100.0 / timer.wait_time
|
|
var distance = rover.transform.origin.z - level_arrow.transform.origin.z
|
|
var pct = 0.0 if distance <= arrow_viz_distance else ((distance - arrow_viz_distance) / arrow_viz_distance)
|
|
level_arrow.get_active_material(0).set_shader_param("alpha", min(pct, 1.0))
|
|
|
|
func _on_Timer_timeout():
|
|
emit_signal("game_over")
|
|
|
|
func _on_rover_rover_exit_level():
|
|
timer.stop()
|
|
emit_signal("game_over")
|