class GameController < ApplicationController def finish_activity @results = [] return unless current_char.activity_time_remaining <= 0 current_char.update(activity_started_at: Time.now) current_char.activity.whatnot["results"].each do |result| type = result["type"] case type when "item" next if rand > result["chance"] table_roll = rand result["table"].sort_by { |_, v| -v["score"] }.each do |item_gid, item_data| quantity = item_data["quantity"] || 1 if table_roll >= item_data["score"] item = Item.find_by_gid(item_gid) xp_awards = {} if item.whatnot && item.whatnot.key?("xp_value") xp_awards = item.whatnot["xp_value"] .map { |gid, amount| { skill: Skill.find_by_gid(gid), amount: amount } } xp_awards.each do |award| current_char.add_skill_xp(award[:skill], award[:amount]) end end current_char.shift_item(item_gid, quantity) @results.push({ type: type, item: Item.find_by_gid(item_gid), quantity: quantity, xp: xp_awards }) break end end else raise "Invalid result type (#{type})" # TODO: Improve this. end end end end