summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDavid Gay <david@davidgay.org>2021-06-06 19:56:40 -0400
committerDavid Gay <david@davidgay.org>2021-06-06 19:56:40 -0400
commita2af06fae8b70bfb24e805a8023124cf9371b8a6 (patch)
tree967e8bc53819bad921a908ce3b5c91f9ceb14f52 /app
parent7521721651573a35f31a1c363b4bd0a9094a4851 (diff)
Slightly improve monster spawn reward code and fix bug where only one item reward would be awarded
Diffstat (limited to 'app')
-rw-r--r--app/models/monster_spawn_combat.rb51
1 files changed, 34 insertions, 17 deletions
diff --git a/app/models/monster_spawn_combat.rb b/app/models/monster_spawn_combat.rb
index 7ad06c8..5b61bb5 100644
--- a/app/models/monster_spawn_combat.rb
+++ b/app/models/monster_spawn_combat.rb
@@ -13,18 +13,19 @@ class MonsterSpawnCombat < ApplicationRecord
message_body_parts = {}
# TODO: HACK (should allow multiple xp awards, eventually)
- xp_award_data = monster.whatnot[:awards].find { |a| a[:type] == "xp" }
+
involved_character_ids = MonsterSpawnCombat.where(monster_spawn: monster_spawn).pluck(:character_id).uniq
involved_characters = Character.where(id: involved_character_ids)
- involved_characters.each do |character|
- total_xp = xp_award_data[:base] * MonsterSpawnCombat.where(monster_spawn: monster_spawn, character: character).count
- character.add_skill_xp(xp_award_data[:gid], total_xp)
- message_body_parts[character.id] ||= []
- message_body_parts[character.id].push("You got #{total_xp} #{Skill.find_by_gid(xp_award_data[:gid]).name} XP.")
- end
monster.whatnot[:awards]&.each do |data|
case data[:type]
+ when "xp"
+ involved_characters.each do |character|
+ total_xp = data[:base] * MonsterSpawnCombat.where(monster_spawn: monster_spawn, character: character).count
+ character.add_skill_xp(data[:gid], total_xp)
+ message_body_parts[character.id] ||= []
+ message_body_parts[character.id].push("You got #{total_xp} #{Skill.find_by_gid(data[:gid]).name} XP")
+ end
when "item"
return if rand > (data[:chance] || 1)
@@ -39,25 +40,41 @@ class MonsterSpawnCombat < ApplicationRecord
score = table_entry[:score]
if table_roll >= score
- winning_character = involved_characters.sample
item = Item.find_by_gid(data[:gid])
- winning_character.shift_item(item, quantity)
- message_body_parts[winning_character.id] ||= []
- message_body_parts[winning_character.id].push("You got #{quantity} #{item.name}.k")
- break
+
+ character_quantities = {}
+ quantity.times do
+ id = involved_characters.sample.id
+ character_quantities[id] ||= 0
+ character_quantities[id] += 1
+ end
+ character_quantities.each do |character_id, character_quantity|
+ Character.find(character_id).shift_item(item, character_quantity)
+ message_body_parts[character_id] ||= []
+ message_body_parts[character_id].push("You got #{character_quantity} #{item.name}")
+ end
end
end
else
min_quantity = data[:min_quantity] || data[:quantity] || 1
max_quantity = data[:max_quantity] || data[:quantity] || 1
quantity = rand(min_quantity..max_quantity)
- winning_character = involved_characters.sample
item = Item.find_by_gid(data[:gid])
- winning_character.shift_item(item, quantity)
- message_body_parts[winning_character.id] ||= []
- message_body_parts[winning_character.id].push("You got #{quantity} #{item.name}.")
- break
+
+ character_quantities = {}
+ quantity.times do
+ id = involved_characters.sample.id
+ character_quantities[id] ||= 0
+ character_quantities[id] += 1
+ end
+ character_quantities.each do |character_id, character_quantity|
+ Character.find(character_id).shift_item(item, character_quantity)
+ message_body_parts[character_id] ||= []
+ message_body_parts[character_id].push("You got #{character_quantity} #{item.name}")
+ end
end
+ else
+ raise "Invalid monster spawn reward gid string"
end
end