From 045867220ea68b912f74b74a1476ac08bd19dbfd Mon Sep 17 00:00:00 2001 From: David Gay Date: Wed, 19 May 2021 19:04:13 -0400 Subject: More work on getting amenity construction working --- app/controllers/game_controller.rb | 68 ++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 28 deletions(-) (limited to 'app/controllers/game_controller.rb') diff --git a/app/controllers/game_controller.rb b/app/controllers/game_controller.rb index 147b692..1b88cb8 100644 --- a/app/controllers/game_controller.rb +++ b/app/controllers/game_controller.rb @@ -2,45 +2,57 @@ class GameController < ApplicationController def finish_activity @results = [] return unless current_char.activity_time_remaining <= 0 - return unless current_char.can_do_activity?(current_char.activity) # TODO: Add error message + activity = current_char.activity + + return unless current_char.can_do_activity?(activity) # TODO: Add error message 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 + Character.transaction do + current_char.pay_cost_for(activity) + + 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 + result[:table].sort_by { |_, v| -v[:score] }.each do |item_gid, item_data| + quantity = item_data[:quantity] || 1 - score = item_data[:score] - if result[:table_scaling] - result[:table_scaling][:skills]&.each do |skill_gid, scale_value| - score = score**(1 + (scale_value * current_char.skill_level(skill_gid))) + score = item_data[:score] + if result[:table_scaling] + result[:table_scaling][:skills]&.each do |skill_gid, scale_value| + score = score**(1 + (scale_value * current_char.skill_level(skill_gid))) + end end - end - if table_roll >= 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.to_s), amount: amount } } - xp_awards.each do |award| - current_char.add_skill_xp(award[:skill], award[:amount]) + if table_roll >= 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.to_s), 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 - 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 + when "hearth_amenity" + bhi = BuiltHearthAmenity.find_or_initialize_by(hearth_amenity: HearthAmenity.find_by_gid(result[:gid])) + bhi.update(level: result[:level]) + @results.push({ type: type, hearth_amenity: bhi.hearth_amenity }) + else + raise "Invalid result type (#{type})" # TODO: Improve this. end - else - raise "Invalid result type (#{type})" # TODO: Improve this. end end + rescue ItemQuantityError + @results.replace({ type: "error", message: "You don't have enough items to complete this activity." }) end end -- cgit v1.2.3