summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/characters/items_controller.rb1
-rw-r--r--app/controllers/hearth_amenities_controller.rb32
-rw-r--r--app/models/built_hearth_amenity.rb25
-rw-r--r--app/views/characters/hearth/index.html.erb3
4 files changed, 61 insertions, 0 deletions
diff --git a/app/controllers/characters/items_controller.rb b/app/controllers/characters/items_controller.rb
index 4d47ebb..e1dfd5c 100644
--- a/app/controllers/characters/items_controller.rb
+++ b/app/controllers/characters/items_controller.rb
@@ -35,6 +35,7 @@ class Characters::ItemsController < ApplicationController
@item.whatnot[:use_effects]&.each do |effect|
case effect[:type]
when "change_wounds"
+ # This is basically duplicated in HearthAmenityController
Character.transaction do
wounds_change = [effect[:value], -current_char.wounds].max
current_char.shift_item(@item, -1)
diff --git a/app/controllers/hearth_amenities_controller.rb b/app/controllers/hearth_amenities_controller.rb
new file mode 100644
index 0000000..09ea7bf
--- /dev/null
+++ b/app/controllers/hearth_amenities_controller.rb
@@ -0,0 +1,32 @@
+class HearthAmenitiesController < ApplicationController
+ def use
+ @hearth_amenity = HearthAmenity.find(params[:hearth_amenity_id])
+ built_hearth_amenity = current_char.hearth.built_hearth_amenities.find_by(hearth_amenity: @hearth_amenity)
+ unless built_hearth_amenity&.usable?
+ flash[:alert] = "You can't use that."
+ redirect_to character_hearth_path(current_char) and return
+ end
+ if built_hearth_amenity.on_cooldown?
+ flash[:alert] = "You need to wait another #{built_hearth_amenity.seconds_until_cooled_down.ceil} seconds."
+ redirect_to character_hearth_path(current_char) and return
+ end
+ built_hearth_amenity.hearth_amenity.whatnot[:use_effects].each do |use_effect|
+ case use_effect[:type]
+ when "change_wounds"
+ # This is basically duplicated in ItemsController
+ Character.transaction do
+ wounds_change = [use_effect[:value], -current_char.wounds].max
+ current_char.wounds = current_char.wounds + wounds_change
+ current_char.save!
+ flash[:notice] = "#{use_effect[:message]}"
+ heal_or_gain = wounds_change.positive? ? "gain" : "heal"
+ flash[:notice] += " You #{heal_or_gain} #{wounds_change.abs} wound(s)."
+ end
+ else
+ raise "Invalid use effect type (#{use_effect[:type]}"
+ end
+ end
+ built_hearth_amenity.update(last_used_at: Time.now)
+ redirect_to character_hearth_path(current_char)
+ end
+end
diff --git a/app/models/built_hearth_amenity.rb b/app/models/built_hearth_amenity.rb
index 5ae8a42..39b6679 100644
--- a/app/models/built_hearth_amenity.rb
+++ b/app/models/built_hearth_amenity.rb
@@ -3,4 +3,29 @@ class BuiltHearthAmenity < ApplicationRecord
belongs_to :hearth_amenity
validates :hearth_id, uniqueness: { scope: :hearth_amenity_id }
+
+ def cooldown
+ # TODO: HACK: Update this so multiple use effects will work
+ self.hearth_amenity.whatnot[:use_effects].first[:cooldown]
+ end
+
+ def usable?
+ self.hearth_amenity.whatnot[:use_effects].present?
+ end
+
+ def on_cooldown?
+ if usable? && cooldown.present?
+ # If it's never been used, it's off cooldown
+ return false unless self.last_used_at
+ seconds_until_cooled_down > 0
+ else
+ false
+ end
+ end
+
+ def seconds_until_cooled_down
+ return nil unless usable?
+ seconds_until_cooled_down = cooldown - (Time.now - self.last_used_at)
+ [0, seconds_until_cooled_down].max
+ end
end
diff --git a/app/views/characters/hearth/index.html.erb b/app/views/characters/hearth/index.html.erb
index 563d4b6..a5522ad 100644
--- a/app/views/characters/hearth/index.html.erb
+++ b/app/views/characters/hearth/index.html.erb
@@ -20,6 +20,9 @@
<%= f.submit "Go" %>
<% end %>
<% end %>
+ <% if built_amenity.usable? %>
+ <%= button_to "Use", hearth_amenity_use_path(built_amenity.hearth_amenity) %>
+ <% end %>
<% end %>
<% next_level = built_amenity ? built_amenity.level + 1 : 1 %>
<% construct_activity = ha.construct_activity(next_level) %>