From d5b2211b1e5e94f6abe077e081dae8a44c735012 Mon Sep 17 00:00:00 2001 From: Guilherme Henrique Teixeira de Oliveira Date: Mon, 26 Nov 2018 20:38:25 -0200 Subject: [PATCH] Added monster drops Monsters can now be configured to drop items based on a resource (MonsterDrops.gd). The usability is not the greatest, but that's due to not being able to export custom types. There were two possible approaches that I saw: 1. An `Array` holding dictionaries for each item that can be dropped along with the data needed for the drop behavior. 2. Create a custom resource that would encapsulate all the data for the items that can be dropped from a monster: The item itself, min and max quantities, and the chance. I decided to go with the first one. ps: The items are _NOT_ being added to the player's inventory . This is just the functionality needed for the monsters to start dropping items. Closes #59 --- godot/combat/Rewards.gd | 13 ++++++++++-- godot/combat/battlers/Battler.gd | 4 ++++ godot/combat/battlers/BattlerTemplate.gd | 1 + godot/combat/battlers/enemies/MonsterDrops.gd | 20 +++++++++++++++++++ godot/combat/battlers/enemies/Porcupine.tres | 13 ------------ .../battlers/enemies/porcupine/Porcupine.tres | 15 ++++++++++++++ .../enemies/porcupine/PorcupineDrops.tres | 15 ++++++++++++++ .../{ => porcupine}/StrongerPorcupine.tres | 0 .../formations/PorcupineFormation001.tscn | 5 +++-- 9 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 godot/combat/battlers/enemies/MonsterDrops.gd delete mode 100644 godot/combat/battlers/enemies/Porcupine.tres create mode 100644 godot/combat/battlers/enemies/porcupine/Porcupine.tres create mode 100644 godot/combat/battlers/enemies/porcupine/PorcupineDrops.tres rename godot/combat/battlers/enemies/{ => porcupine}/StrongerPorcupine.tres (100%) diff --git a/godot/combat/Rewards.gd b/godot/combat/Rewards.gd index 85c15368..533646a7 100644 --- a/godot/combat/Rewards.gd +++ b/godot/combat/Rewards.gd @@ -13,6 +13,7 @@ func initialize(battlers : Array): $Panel.visible = false party = [] experience_earned = 0 + randomize() for battler in battlers: if not battler.party_member: battler.stats.connect("health_depleted", self, "_add_reward", [battler]) @@ -21,7 +22,15 @@ func initialize(battlers : Array): func _add_reward(battler : Battler): experience_earned += battler.stats.experience - # TODO add item drops + if battler.drops != null: + for drop in battler.drops: + if drop.chance < 1.0 and rand_range(0.0, 1.0) > drop.chance: + continue + var quantity : int = 1 if drop.max_quantity == 1 else rand_range(drop.min_quantity, drop.max_quantity) as int + drops.append({ + 'item': drop.item, + 'quantity': quantity + }) func _reward_to_battlers() -> Array: """ @@ -56,7 +65,7 @@ func on_battle_completed(): $Panel/Label.text = "%s Leveled Up to %d" % [battler.name, battler.stats.level + 1] yield(get_tree().create_timer(2.0), "timeout") for drop in drops: - $Panel/Label.text = "Found %s" % drop.name + $Panel/Label.text = "Found %s %s(s)" % [drop.quantity, drop.item.name] yield(get_tree().create_timer(2.0), "timeout") $Panel.visible = false diff --git a/godot/combat/battlers/Battler.gd b/godot/combat/battlers/Battler.gd index 1cf3bfd7..2d7e5fc4 100644 --- a/godot/combat/battlers/Battler.gd +++ b/godot/combat/battlers/Battler.gd @@ -7,6 +7,7 @@ export var template : Resource const DEFAULT_CHANCE = 0.75 var stats : CharacterStats +var drops onready var lifebar_anchor = $InterfaceAnchor onready var skin = $Skin onready var actions = $Actions @@ -26,6 +27,9 @@ func _ready() -> void: var _t = template as BattlerTemplate actions.initialize(_t.skills) + + drops = _t.drops.items if _t.drops != null else null + skin.add_child(_t.anim.instance()) if stats == null: var starting_stats = _t.stats as CharacterStats diff --git a/godot/combat/battlers/BattlerTemplate.gd b/godot/combat/battlers/BattlerTemplate.gd index ba7094ea..7d493866 100644 --- a/godot/combat/battlers/BattlerTemplate.gd +++ b/godot/combat/battlers/BattlerTemplate.gd @@ -5,3 +5,4 @@ class_name BattlerTemplate export var anim : PackedScene export var stats : Resource export var skills : Array +export var drops : Resource \ No newline at end of file diff --git a/godot/combat/battlers/enemies/MonsterDrops.gd b/godot/combat/battlers/enemies/MonsterDrops.gd new file mode 100644 index 00000000..78eb8aff --- /dev/null +++ b/godot/combat/battlers/enemies/MonsterDrops.gd @@ -0,0 +1,20 @@ +extends Resource +class_name MonsterDrops + +""" +While we still can't export custom types, we'll have to use an Array of dictionaries +Example: + { + 'item': Sword.tres, + 'min_quantity': 1, + 'max_quantity': 1, + 'chance': 0.5 + }, { + 'item': Potion.tres, + 'min_quantity': 3, + 'max_quantity': 20, + 'chance': 0.25 + }, +""" + +export var items : Array diff --git a/godot/combat/battlers/enemies/Porcupine.tres b/godot/combat/battlers/enemies/Porcupine.tres deleted file mode 100644 index 6c58c5f4..00000000 --- a/godot/combat/battlers/enemies/Porcupine.tres +++ /dev/null @@ -1,13 +0,0 @@ -[gd_resource type="Resource" load_steps=4 format=2] - -[ext_resource path="res://animation/PorcupineAnim.tscn" type="PackedScene" id=1] -[ext_resource path="res://combat/battlers/BattlerTemplate.gd" type="Script" id=2] -[ext_resource path="res://combat/battlers/jobs/Porcupine.tres" type="Resource" id=3] - -[resource] - -script = ExtResource( 2 ) -anim = ExtResource( 1 ) -stats = ExtResource( 3 ) -skills = [ ] - diff --git a/godot/combat/battlers/enemies/porcupine/Porcupine.tres b/godot/combat/battlers/enemies/porcupine/Porcupine.tres new file mode 100644 index 00000000..e0976985 --- /dev/null +++ b/godot/combat/battlers/enemies/porcupine/Porcupine.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" load_steps=5 format=2] + +[ext_resource path="res://animation/PorcupineAnim.tscn" type="PackedScene" id=1] +[ext_resource path="res://combat/battlers/enemies/porcupine/PorcupineDrops.tres" type="Resource" id=2] +[ext_resource path="res://combat/battlers/BattlerTemplate.gd" type="Script" id=3] +[ext_resource path="res://combat/battlers/jobs/Porcupine.tres" type="Resource" id=4] + +[resource] + +script = ExtResource( 3 ) +anim = ExtResource( 1 ) +stats = ExtResource( 4 ) +skills = [ ] +drops = ExtResource( 2 ) + diff --git a/godot/combat/battlers/enemies/porcupine/PorcupineDrops.tres b/godot/combat/battlers/enemies/porcupine/PorcupineDrops.tres new file mode 100644 index 00000000..6563c130 --- /dev/null +++ b/godot/combat/battlers/enemies/porcupine/PorcupineDrops.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://items/Potion.tres" type="Resource" id=1] +[ext_resource path="res://combat/battlers/enemies/MonsterDrops.gd" type="Script" id=2] + +[resource] + +script = ExtResource( 2 ) +items = [ { +"chance": 0.75, +"item": ExtResource( 1 ), +"max_quantity": 4, +"min_quantity": 2 +} ] + diff --git a/godot/combat/battlers/enemies/StrongerPorcupine.tres b/godot/combat/battlers/enemies/porcupine/StrongerPorcupine.tres similarity index 100% rename from godot/combat/battlers/enemies/StrongerPorcupine.tres rename to godot/combat/battlers/enemies/porcupine/StrongerPorcupine.tres diff --git a/godot/combat/battlers/formations/PorcupineFormation001.tscn b/godot/combat/battlers/formations/PorcupineFormation001.tscn index d57d61f5..e7f2542a 100644 --- a/godot/combat/battlers/formations/PorcupineFormation001.tscn +++ b/godot/combat/battlers/formations/PorcupineFormation001.tscn @@ -3,8 +3,9 @@ [ext_resource path="res://combat/battlers/Formation.gd" type="Script" id=1] [ext_resource path="res://combat/background/StonePlatform.tscn" type="PackedScene" id=2] [ext_resource path="res://combat/battlers/formations/FormationMember.tscn" type="PackedScene" id=3] -[ext_resource path="res://combat/battlers/enemies/Porcupine.tres" type="Resource" id=4] -[ext_resource path="res://combat/battlers/enemies/StrongerPorcupine.tres" type="Resource" id=5] +[ext_resource path="res://combat/battlers/enemies/porcupine/Porcupine.tres" type="Resource" id=4] +[ext_resource path="res://combat/battlers/enemies/porcupine/StrongerPorcupine.tres" type="Resource" id=5] + [node name="Formation" type="Node"] script = ExtResource( 1 )