Created
April 15, 2020 12:41
-
-
Save snelson/3753b411ae626ba6138b93d2d44aa0b0 to your computer and use it in GitHub Desktop.
Implementation of Gilded Rose
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module GildedRose | |
def self.new(name:, days_remaining:, quality:) | |
item_class = case name | |
when "Aged Brie" | |
AgedItem | |
when "Sulfuras, Hand of Ragnaros" | |
LegendaryItem | |
when "Backstage passes to a TAFKAL80ETC concert" | |
BackstagePass | |
when "Conjured Mana Cake" | |
ConjuredItem | |
else | |
NormalItem | |
end | |
item_class.new(name: name, days_remaining: days_remaining, quality: quality) | |
end | |
class BaseItem | |
MAX_QUALITY = 50 | |
attr_reader :name, :days_remaining, :quality | |
def initialize(name:, days_remaining:, quality:) | |
@name = name | |
@days_remaining = days_remaining | |
@quality = quality | |
end | |
def tick | |
raise "not implemented" | |
end | |
private | |
def decrease_days_remaining | |
@days_remaining -= 1 | |
end | |
def before_sell_date? | |
@days_remaining > 0 | |
end | |
def decrease_quality(n) | |
@quality.tap do | |
@quality = @quality - n | |
@quality = 0 if @quality < 0 | |
end | |
end | |
def increase_quality(n) | |
@quality.tap do | |
@quality = @quality + n | |
@quality = MAX_QUALITY if @quality > MAX_QUALITY | |
end | |
end | |
end | |
class NormalItem < BaseItem | |
def tick | |
if before_sell_date? | |
decrease_quality(1) | |
else | |
decrease_quality(2) | |
end | |
decrease_days_remaining | |
end | |
end | |
class AgedItem < BaseItem | |
def tick | |
if before_sell_date? | |
increase_quality(1) | |
else | |
increase_quality(2) | |
end | |
decrease_days_remaining | |
end | |
end | |
class BackstagePass < BaseItem | |
def tick | |
if days_remaining <= 0 | |
@quality = 0 | |
elsif days_remaining <= 5 | |
increase_quality(3) | |
elsif days_remaining <= 10 | |
increase_quality(2) | |
elsif days_remaining > 10 | |
increase_quality(1) | |
end | |
decrease_days_remaining | |
end | |
end | |
class ConjuredItem < BaseItem | |
def tick | |
if before_sell_date? | |
decrease_quality(2) | |
else | |
decrease_quality(4) | |
end | |
decrease_days_remaining | |
end | |
end | |
class LegendaryItem < BaseItem | |
QUALITY = 80 | |
def tick | |
# no-op | |
end | |
def quality | |
@quality = QUALITY | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment