From a2af06fae8b70bfb24e805a8023124cf9371b8a6 Mon Sep 17 00:00:00 2001 From: David Gay Date: Sun, 6 Jun 2021 19:56:40 -0400 Subject: Slightly improve monster spawn reward code and fix bug where only one item reward would be awarded --- app/models/monster_spawn_combat.rb | 51 +++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 17 deletions(-) (limited to 'app/models') 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 -- cgit v1.2.3