From d3fe2ff23b8238d448a88b7e5380410a650db6eb Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 12 Oct 2019 18:00:53 +0300 Subject: [PATCH] Add deposit concept --- spec/deposit_spec.cr | 38 ++++++++++++++++++++++++++++++++++++++ src/game/deposit.cr | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 spec/deposit_spec.cr create mode 100644 src/game/deposit.cr diff --git a/spec/deposit_spec.cr b/spec/deposit_spec.cr new file mode 100644 index 0000000..83ba11c --- /dev/null +++ b/spec/deposit_spec.cr @@ -0,0 +1,38 @@ +require "./spec_helper" + +module Game::Test + describe Deposit do + it "should be created fulfilled" do + dep = Deposit.new(Resources::Type::Crystals, 100) + dep.cap.should eq 100 + dep.cur.should eq 100 + end + + it "can be created partially filled" do + dep = Deposit.new(Resources::Type::Crystals, 100, 20) + dep.cap.should eq 100 + dep.cur.should eq 20 + end + + it "should be decreased with span" do + dep = Deposit.new(Resources::Type::Crystals, 100) + dep.dec Deposit::Span.new(Resources::Type::Crystals, 20) + dep.cap.should eq 100 + dep.cur.should eq 80 + end + + it "should not be increased above capacity" do + dep = Deposit.new(Resources::Type::Crystals, 100, 20) + dep.inc Deposit::Span.new(Resources::Type::Crystals, 100) + dep.cap.should eq 100 + dep.cur.should eq 100 + end + + it "should not be decreased below zero" do + dep = Deposit.new(Resources::Type::Crystals, 100) + dep.dec Deposit::Span.new(Resources::Type::Crystals, 120) + dep.cap.should eq 100 + dep.cur.should eq 0 + end + end +end diff --git a/src/game/deposit.cr b/src/game/deposit.cr new file mode 100644 index 0000000..96c42ff --- /dev/null +++ b/src/game/deposit.cr @@ -0,0 +1,40 @@ +module Game + class Deposit + class Span + def initialize(@res : Resources::Type, @cap : Capacity) + end + + getter res + getter cap + end + + @cur : Capacity = 0 + + def initialize(@res : Resources::Type, @cap : Capacity) + @cur = @cap + end + + def initialize(@res : Resources::Type, @cap : Capacity, @cur : Capacity) + end + + getter res + getter cap + getter cur + + def inc(span : Span) + check_res span.res + @cur = Math.min(@cap, @cur + span.cap) + end + + def dec(span : Span) + check_res span.res + @cur = Math.max(0, @cur - span.cap) + end + + private def check_res(other_res : Resources::Type) + if @res != other_res + raise ResourceMismatch.new + end + end + end +end