summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/characters/spells_controller.rb5
-rw-r--r--app/lib/activity_processor.rb7
-rw-r--r--app/models/character.rb6
-rw-r--r--app/models/concerns/has_costs_and_requirements.rb2
-rw-r--r--app/models/item_infix.rb4
-rw-r--r--app/views/application/_navbar.html.erb3
-rw-r--r--app/views/application/_results.html.erb2
-rw-r--r--app/views/characters/skills/index.html.erb2
-rw-r--r--app/views/characters/spells/index.html.erb10
-rw-r--r--config/routes.rb1
-rw-r--r--data/activities.yml29
11 files changed, 69 insertions, 2 deletions
diff --git a/app/controllers/characters/spells_controller.rb b/app/controllers/characters/spells_controller.rb
new file mode 100644
index 0000000..9694856
--- /dev/null
+++ b/app/controllers/characters/spells_controller.rb
@@ -0,0 +1,5 @@
+class Characters::SpellsController < ApplicationController
+ def index
+ @spell_activities = Activity.where("gid like ?", "havencast_%").order(:name)
+ end
+end
diff --git a/app/lib/activity_processor.rb b/app/lib/activity_processor.rb
index 4a06a98..9b03f55 100644
--- a/app/lib/activity_processor.rb
+++ b/app/lib/activity_processor.rb
@@ -90,6 +90,13 @@ class ActivityProcessor
item = Item.find_by_gid(result[:gid])
hp = @character.hearth.hearth_plantings.create(item: item)
@results.push({ type: type, hearth_planting: hp })
+ when "condition"
+ Character.transaction do
+ condition = Condition.find_by_gid(result[:gid])
+ @character.states.create!(condition: condition, expires_at: Time.now + result[:duration])
+ @results.push({ type: "message", body: result[:message] })
+ @results.push({ type: type, condition: condition })
+ end
when "activity"
next if rand > (result[:chance] || 1)
table_roll = rand
diff --git a/app/models/character.rb b/app/models/character.rb
index 4ee1f71..5ff067c 100644
--- a/app/models/character.rb
+++ b/app/models/character.rb
@@ -273,6 +273,9 @@ class Character < ApplicationRecord
case requirement[:type]
when "equipment"
return false unless self.equipment_with_gid(requirement[:gid])
+ when "stat"
+ # TODO: HACK: This won't work with built-in stats! Need to change this to work with power and whatnot.
+ return false unless self.total_stat_change(requirement[:gid]) >= requirement[:value]
when "skill"
return false unless self.skill_level(requirement[:gid]) >= requirement[:level]
when "hearth_amenity"
@@ -331,7 +334,8 @@ class Character < ApplicationRecord
hearth_amenity_effects = self.hearth.built_hearth_amenities.filter_map { |a| a.effects if a.effects }
equipment_effects = self.equipment.filter_map { |a| a.effects if a.effects }
state_effects = self.states.filter_map { |a| a.effects if a.effects && !a.expired? }
- (hearth_amenity_effects + equipment_effects + state_effects).flatten
+ item_infix_effects = self.item_infixes.filter_map { |a| a.effects if a.effects }
+ (hearth_amenity_effects + equipment_effects + state_effects + item_infix_effects).flatten
end
def total_stat_change(gid)
diff --git a/app/models/concerns/has_costs_and_requirements.rb b/app/models/concerns/has_costs_and_requirements.rb
index 34ff0f3..9f859f5 100644
--- a/app/models/concerns/has_costs_and_requirements.rb
+++ b/app/models/concerns/has_costs_and_requirements.rb
@@ -19,6 +19,8 @@ module HasCostsAndRequirements
case req[:type]
when "skill"
requirements.push "level #{req[:level]} #{Skill.find_by_gid(req[:gid]).name}"
+ when "stat"
+ requirements.push "#{req[:value]} #{req[:gid]}"
when "equipment"
requirements.push "equipped #{Item.find_by_gid(req[:gid]).name}"
when "hearth_amenity"
diff --git a/app/models/item_infix.rb b/app/models/item_infix.rb
index cc99ee7..3167320 100644
--- a/app/models/item_infix.rb
+++ b/app/models/item_infix.rb
@@ -5,6 +5,10 @@ class ItemInfix < ApplicationRecord
before_create :check_max_infixes
+ def effects
+ self.item.whatnot[:infix_effects]
+ end
+
private
def check_max_infixes
current_infixes = character.item_infixes.where(skill: skill)
diff --git a/app/views/application/_navbar.html.erb b/app/views/application/_navbar.html.erb
index 3436619..aaec030 100644
--- a/app/views/application/_navbar.html.erb
+++ b/app/views/application/_navbar.html.erb
@@ -13,6 +13,9 @@
<%= link_to "Inventory", character_items_path(current_char) %>
</li>
<li class="mr-6 inline">
+ <%= link_to "Spells", character_spells_path(current_char) %>
+ </li>
+ <li class="mr-6 inline">
<%= link_to "Hearth", character_hearth_path(current_char) %>
</li>
<li class="mr-6 inline">
diff --git a/app/views/application/_results.html.erb b/app/views/application/_results.html.erb
index ec62991..691f1d5 100644
--- a/app/views/application/_results.html.erb
+++ b/app/views/application/_results.html.erb
@@ -24,6 +24,8 @@
<p class="text-xs">You gained <%= result[:xp] %> <%= result[:skill].name %> XP.</p>
<% when "title" %>
<p>You earned the title <%= render "application/components/text/title", title: result[:title] %>!</p>
+ <% when "condition" %>
+ <p>You gained the <%= result[:condition].name %> condition.</p>
<% when "message" %>
<p><%= result[:body] %></p>
<% when "warning" %>
diff --git a/app/views/characters/skills/index.html.erb b/app/views/characters/skills/index.html.erb
index f79b06e..d804384 100644
--- a/app/views/characters/skills/index.html.erb
+++ b/app/views/characters/skills/index.html.erb
@@ -47,7 +47,7 @@
</div>
<% end %>
<% else %>
- <div class="text-gray-500">No items to infix.</div>
+ <div class="text-gray-500">No omens to infix.</div>
<% end %>
<% end %>
<% end %>
diff --git a/app/views/characters/spells/index.html.erb b/app/views/characters/spells/index.html.erb
new file mode 100644
index 0000000..5f415a3
--- /dev/null
+++ b/app/views/characters/spells/index.html.erb
@@ -0,0 +1,10 @@
+<h2 class="text-3xl mb-2">Spells</h2>
+<div data-controller="activity-select">
+ <%= form_with url: start_activity_path, method: :post do |f| %>
+ <%= f.select :id, @spell_activities.map { |a| [a.name, a.id] }, {},
+ { data: { activity_select_target: "select", action: "activity-select#load" } } %>
+ <%= f.number_field :actions, value: 1, size: 5, min: 1, max: 2_000_000_000 %>
+ <%= f.submit "Cast" %>
+ <% end %>
+ <div data-activity-select-target="output" class="my-1"></div>
+</div>
diff --git a/config/routes.rb b/config/routes.rb
index 51d9e6c..af608e5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -34,6 +34,7 @@ Rails.application.routes.draw do
post "/use", to: "items#use"
end
resources :skills, only: [:index]
+ resources :spells, only: [:index]
resources :titles, only: [:index] do
post "/activate", to: "titles#activate"
end
diff --git a/data/activities.yml b/data/activities.yml
index a508781..ec82b38 100644
--- a/data/activities.yml
+++ b/data/activities.yml
@@ -2741,3 +2741,32 @@ craft_faint_mana:
xp:
- gid: "omenbind"
value: 6
+havencast_light:
+ name: "Cast Light"
+ description: "Risk a little light."
+ whatnot:
+ tags:
+ - "spell"
+ - "cantrip"
+ duration:
+ base: 30
+ minimum: 10
+ scaling:
+ - type: "skill"
+ gid: "havencast"
+ scale_value: 1
+ requirements:
+ - type: "skill"
+ gid: "havencast"
+ level: 1
+ - type: "stat"
+ gid: "mana"
+ value: 1
+ results:
+ - type: "condition"
+ gid: "light"
+ duration: 3600 # 1 Hour
+ message: "A ball of light glows before you."
+ - type: "xp"
+ gid: "havencast"
+ base: 3