summaryrefslogtreecommitdiff
path: root/app/controllers/game_controller.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/controllers/game_controller.rb')
-rw-r--r--app/controllers/game_controller.rb68
1 files changed, 40 insertions, 28 deletions
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