project-dung/scripts/rover_game.gd

54 lines
1.5 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")
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 (Array,Resource) var loot_items = []
export (Array,int) var loot_weights = []
var loot_table = null
func _ready():
loot_table = LootTable.new(loot_items, loot_weights)
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 = loot_table.roll_for_loot()
assert(rock.treasure != null)
location.add_child(rock)
func _on_collection_area_area_entered(area):
if area.has_meta("owner"):
area = area.get_meta("owner")
emit_signal("got_treasure", area.treasure)
area.queue_free()
func _process(delta):
$"%progress_bar".value = timer.time_left * 100.0 / timer.wait_time
var dir_vec : Vector3 = level_arrow.transform.origin - rover.transform.origin
var distance = dir_vec.length() - arrow_viz_distance
var pct = 0.0 if distance < 0 else (distance / arrow_viz_distance)
level_arrow.get_active_material(0).set_shader_param("alpha", pct)
func _on_Timer_timeout():
emit_signal("game_over")
func _on_rover_rover_exit_level():
timer.stop()
emit_signal("game_over")