From 882333b4a9b3b2e739e849e93015fb151ea04f7c Mon Sep 17 00:00:00 2001 From: Guilherme Henrique Teixeira de Oliveira Date: Tue, 27 Nov 2018 21:16:38 -0200 Subject: [PATCH] Added monster drops (#61) * 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 * Embedded drops array to battler template, fixed code issues --- godot/combat/Rewards.gd | 15 ++++++++++++-- godot/combat/battlers/Battler.gd | 4 ++++ godot/combat/battlers/BattlerTemplate.gd | 17 ++++++++++++++++ godot/combat/battlers/enemies/Porcupine.tres | 13 ------------ .../battlers/enemies/porcupine/Porcupine.tres | 20 +++++++++++++++++++ .../{ => porcupine}/StrongerPorcupine.tres | 0 .../formations/PorcupineFormation001.tscn | 5 +++-- 7 files changed, 57 insertions(+), 17 deletions(-) delete mode 100644 godot/combat/battlers/enemies/Porcupine.tres create mode 100644 godot/combat/battlers/enemies/porcupine/Porcupine.tres rename godot/combat/battlers/enemies/{ => porcupine}/StrongerPorcupine.tres (100%) diff --git a/godot/combat/Rewards.gd b/godot/combat/Rewards.gd index 85c1536..79fd3ce 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]) @@ -20,8 +21,18 @@ func initialize(battlers : Array): party.append(battler) func _add_reward(battler : Battler): + """ + Appends dictionaries with the form { 'item': Item.tres, 'amount': amount } of dropped items to the drops array. + """ experience_earned += battler.stats.experience - # TODO add item drops + for drop in battler.drops: + if drop.chance - randf() > drop.chance: + continue + var amount : int = 1 if drop.max_amount == 1 else round(rand_range(drop.min_amount, drop.max_amount)) + drops.append({ + 'item': drop.item, + 'amount': amount + }) func _reward_to_battlers() -> Array: """ @@ -56,7 +67,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.amount, 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 1cf3bfd..86311ee 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 : Array 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 + 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 ba7094e..f55c00c 100644 --- a/godot/combat/battlers/BattlerTemplate.gd +++ b/godot/combat/battlers/BattlerTemplate.gd @@ -5,3 +5,20 @@ class_name BattlerTemplate export var anim : PackedScene export var stats : Resource export var skills : Array + +""" +For drops, we're currently using an Array of dictionaries +Example: + { + 'item': Sword.tres, + 'min_amount': 1, + 'max_amount': 1, + 'chance': 0.5 + }, { + 'item': Potion.tres, + 'min_amount': 3, + 'max_amount': 20, + 'chance': 0.25 + }, +""" +export var drops : Array \ No newline at end of file diff --git a/godot/combat/battlers/enemies/Porcupine.tres b/godot/combat/battlers/enemies/Porcupine.tres deleted file mode 100644 index 6c58c5f..0000000 --- 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 0000000..7aeac56 --- /dev/null +++ b/godot/combat/battlers/enemies/porcupine/Porcupine.tres @@ -0,0 +1,20 @@ +[gd_resource type="Resource" load_steps=5 format=2] + +[ext_resource path="res://animation/PorcupineAnim.tscn" type="PackedScene" id=1] +[ext_resource path="res://items/Potion.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 = [ { +"chance": 0.75, +"item": ExtResource( 2 ), +"max_amount": 4, +"min_amount": 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 d57d61f..e7f2542 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 ) -- GitLab