From b8aa0a69cbdc8b145592ac142c397e0520021fdd Mon Sep 17 00:00:00 2001 From: David Gay Date: Wed, 14 Jul 2021 17:27:26 -0400 Subject: Only allow a character to hunt up to two different leviathans in a 24 hour period --- CHANGELOG.md | 1 + app/errors/too_many_monster_spawn_combats_error.rb | 2 ++ app/lib/activity_processor.rb | 13 ++++++++++--- app/models/character.rb | 6 ++++++ 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 app/errors/too_many_monster_spawn_combats_error.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 857543e..c770b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. ### Leviathans - A location can now only have one living leviathan at a time. +- A character can now only hunt up to two different leviathans in a 24 hour period. ### Hearth - Hearths now have locations, like characters do. All existing hearths are now located at Floret. diff --git a/app/errors/too_many_monster_spawn_combats_error.rb b/app/errors/too_many_monster_spawn_combats_error.rb new file mode 100644 index 0000000..51153c8 --- /dev/null +++ b/app/errors/too_many_monster_spawn_combats_error.rb @@ -0,0 +1,2 @@ +class TooManyMonsterSpawnCombatsError < StandardError +end diff --git a/app/lib/activity_processor.rb b/app/lib/activity_processor.rb index d3bf5cb..d14282e 100644 --- a/app/lib/activity_processor.rb +++ b/app/lib/activity_processor.rb @@ -40,14 +40,17 @@ class ActivityProcessor puts "Result: #{result}" handle_xp_result(result) when "monster_spawn" + monster_spawn = MonsterSpawn.where(location: Location.find_by_gid(result[:location])).select(&:alive?).first + raise MonsterSpawnError unless monster_spawn + raise TooManyWoundsError unless @character.can_fight? + unless @character.monster_spawns_attacked_in_past_24_hours.count < 2 || @character.monster_spawns_attacked_in_past_24_hours.include?(monster_spawn) + raise TooManyMonsterSpawnCombatsError + end next if rand > (result[:chance] || 1) @results.push({ type: "br" }) - monster_spawn = MonsterSpawn.where(location: Location.find_by_gid(result[:location])).select(&:alive?).first - raise MonsterSpawnError unless monster_spawn - @results.push({ type: type, monster_spawn: monster_spawn }) resolve_combat_with(monster_spawn) break @@ -186,6 +189,10 @@ class ActivityProcessor @character.stop_activity @results.replace([{ type: "error", message: "There are no living leviathans here." }]) + rescue TooManyMonsterSpawnCombatsError + @character.stop_activity + @results.replace([{ type: "error", + message: "You're too worn out to hunt any more leviathans right now. You can only hunt two different leviathans in a 24 hour period." }]) end private diff --git a/app/models/character.rb b/app/models/character.rb index f6ddb92..b3d8c25 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -16,6 +16,7 @@ class Character < ApplicationRecord has_many :states has_many :chat_messages has_many :monster_kills + has_many :monster_spawn_combats has_many :bazaar_orders validates :name, presence: true # TODO: Make defaults better. This has to allow nil so the `attribute` default works, and I don't like that. @@ -459,6 +460,11 @@ class Character < ApplicationRecord base end + def monster_spawns_attacked_in_past_24_hours + # TODO: Don't load into memory + monster_spawn_combats.where(created_at: 24.hours.ago..).map { |msc| msc.monster_spawn }.uniq + end + private def create_skills Skill.all.each { |skill| self.character_skills.create(skill: skill, xp: 0) } -- cgit v1.2.3