From cbbfe694ed2cbb135257da9279b9dfd2e4c8d077 Mon Sep 17 00:00:00 2001 From: akshay Date: Sat, 20 Aug 2022 15:22:32 -0400 Subject: [PATCH] Added a simple loot table and set the base data in rover game. Also fixed a bad assert in item_generator --- scenes/rover_game.tscn | 7 ++++++- scripts/item_generator/state/broken.gd | 2 +- scripts/loot_table.gd | 22 ++++++++++++++++++++++ scripts/rover_game.gd | 25 +++++++++++++++---------- 4 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 scripts/loot_table.gd diff --git a/scenes/rover_game.tscn b/scenes/rover_game.tscn index 01d2656..7663aca 100644 --- a/scenes/rover_game.tscn +++ b/scenes/rover_game.tscn @@ -1,9 +1,12 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://scenes/rover.tscn" type="PackedScene" id=1] +[ext_resource path="res://item_types/crystal.tres" type="Resource" id=2] +[ext_resource path="res://item_types/gem.tres" type="Resource" id=3] [ext_resource path="res://assets/rover_level/RoverGame.glb" type="PackedScene" id=4] [ext_resource path="res://scripts/rover_camera.gd" type="Script" id=5] [ext_resource path="res://scripts/rover_game.gd" type="Script" id=6] +[ext_resource path="res://item_types/geode.tres" type="Resource" id=7] [sub_resource type="BoxShape" id=7] extents = Vector3( 21.7976, 4.38074, 5.34608 ) @@ -23,6 +26,8 @@ extents = Vector3( 100, 1, 400 ) [node name="rover_game" type="Spatial"] script = ExtResource( 6 ) +loot_items = [ ExtResource( 7 ), ExtResource( 2 ), ExtResource( 3 ) ] +loot_weights = [ 60, 25, 15 ] [node name="RoverGame" parent="." instance=ExtResource( 4 )] __meta__ = { diff --git a/scripts/item_generator/state/broken.gd b/scripts/item_generator/state/broken.gd index c04b19c..4a54cc2 100644 --- a/scripts/item_generator/state/broken.gd +++ b/scripts/item_generator/state/broken.gd @@ -30,7 +30,7 @@ func on_gen_timer_timeout(): assert(false, "gen timer should be disabled while broken") func on_item_slot_item_changed(item): - assert(item == null, "item dump adds should be disabled while broken") + pass func on_item_dump_item_dump_completed(): ctx.full_heal() diff --git a/scripts/loot_table.gd b/scripts/loot_table.gd new file mode 100644 index 0000000..63405bd --- /dev/null +++ b/scripts/loot_table.gd @@ -0,0 +1,22 @@ +extends Reference + +var item_map = {} +var total_weight = 0 + +func _init(items, weights): + item_map.clear() + # Calculate total weight and accumulate the weight for each item + for i in items.size(): + total_weight += weights[i] + var item : Resource = items[i] + assert(item != null) + item_map[item] = total_weight + +func roll_for_loot() -> Resource: + randomize() + var rng = randi() % total_weight + for item in item_map.keys(): + # if the RNG is <= item cumulated weight then drop that item + if rng <= item_map[item]: + return item + return null diff --git a/scripts/rover_game.gd b/scripts/rover_game.gd index 67ae656..47a3b66 100644 --- a/scripts/rover_game.gd +++ b/scripts/rover_game.gd @@ -3,17 +3,20 @@ 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 + export var play_time: float = 20.0 +export (Array,Resource) var loot_items = [] +export (Array,int) var loot_weights = [] -const loot_table = { - #preload("res://") -} - -var main: Node -var treasure := [] # is array of item_types +var loot_table = null func _ready(): - $Timer.start(play_time) + loot_table = LootTable.new(loot_items, loot_weights) + timer.start(play_time) spawn_rocks(10) func spawn_rocks(count: int): @@ -21,17 +24,19 @@ func spawn_rocks(count: int): locations.shuffle() for i in range(min(count, locations.size())): var location = locations[i] - var rock = preload("res://scenes/rock.tscn").instance() + 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() - emit_signal("got_treasure", preload("res://item_types/ore.tres")) func _process(delta): - $"%progress_bar".value = $Timer.time_left * 100.0 / $Timer.wait_time + $"%progress_bar".value = timer.time_left * 100.0 / timer.wait_time func _on_Timer_timeout(): emit_signal("game_over")