From 0fac92a969f8f3049a55a824c1af65255c9d1654 Mon Sep 17 00:00:00 2001 From: David Gay Date: Mon, 31 May 2021 13:33:13 -0400 Subject: Plug in equip requirements --- app/controllers/characters/items_controller.rb | 7 ++++++- app/models/character.rb | 13 +++++++++++++ app/models/item.rb | 13 +++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/controllers/characters/items_controller.rb b/app/controllers/characters/items_controller.rb index 722c8ff..470e21c 100644 --- a/app/controllers/characters/items_controller.rb +++ b/app/controllers/characters/items_controller.rb @@ -5,10 +5,15 @@ class Characters::ItemsController < ApplicationController def equip @item = Item.find(params[:item_id]) + unless current_char.can_equip? @item + flash[:alert] = "Couldn't equip #{@item.name}" + flash[:alert] += " (requires #{@item.equip_requirements&.join(", ")})" if @item.equip_requirements.any? + return + end current_char.equip(@item) flash[:notice] = "Equipped #{@item.name}." rescue EquipmentError - flash[:alert] = "Couldn't equip #{@item.name}." + flash[:alert] = "Couldn't equip #{@item.name}. Make sure the slot is free." ensure redirect_to character_items_path(current_char) end diff --git a/app/models/character.rb b/app/models/character.rb index 7e80d65..56be0c0 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -133,8 +133,21 @@ class Character < ApplicationRecord end end + def can_equip?(item) + item.whatnot[:equip_requirements]&.each do |requirement| + case requirement[:type] + when "skill" + return false unless self.skill_level(requirement[:gid]) >= requirement[:level] + else + raise "Invalid requirement type string (#{requirement[:type]})" + end + end + true + end + def equip(item) Character.transaction do + raise EquipmentError unless self.can_equip?(item) open_slots = self.open_slots_for(item) raise EquipmentError unless open_slots.any? self.shift_item(item, -1) diff --git a/app/models/item.rb b/app/models/item.rb index 1ef5d7d..8b80788 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -17,4 +17,17 @@ class Item < ApplicationRecord return [] unless self.equipment? self.whatnot[:equip_slots].map { |data| data.to_sym } end + + def equip_requirements + requirements = [] + self.whatnot[:equip_requirements]&.each do |req| + case req[:type] + when "skill" + requirements.push "level #{req[:level]} #{Skill.find_by_gid(req[:gid]).name}" + else + raise "Invalid equip requirement type string (#{req[:type]})" + end + end + requirements + end end -- cgit v1.2.3