diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-03-30 22:46:02 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-03-30 22:46:02 +0800 |
commit | f37bab92c49dcbd4cf08ad5962dad5cb83fef68e (patch) | |
tree | 280ef01848cf1b9053780fb54582afb25e8399cf /src/2015 | |
parent | 2352df37c31fa87110706e201c13acfa8db9c4de (diff) | |
download | advent-of-code-f37bab92c49dcbd4cf08ad5962dad5cb83fef68e.tar.gz advent-of-code-f37bab92c49dcbd4cf08ad5962dad5cb83fef68e.zip |
another wizard
Diffstat (limited to 'src/2015')
-rw-r--r-- | src/2015/day22/aoc.h | 74 |
1 files changed, 23 insertions, 51 deletions
diff --git a/src/2015/day22/aoc.h b/src/2015/day22/aoc.h index 61cdf30..eae4825 100644 --- a/src/2015/day22/aoc.h +++ b/src/2015/day22/aoc.h @@ -1,7 +1,6 @@ #pragma once #include "common.h" #include <set> -#include <string.h> #include <vector> namespace aoc2015 { @@ -15,78 +14,51 @@ struct wizard { }; struct spell { - int turns; - spell(int t) : turns(t) {} virtual int cost() = 0; - virtual void apply(wizard&, wizard&) = 0; + virtual void apply(wizard&) = 0; + virtual void unapply(wizard&) = 0; }; struct magic_missile : public spell { - magic_missile() : spell(1) {} virtual int cost() override { return 53; }; - virtual void apply(wizard& w1, wizard& w2) override { - if (turns-- > 0) { - w2.hitpoints -= 4; - } - } + virtual void apply(wizard& w) override { w.hitpoints -= 4; } + virtual void unapply(wizard& w) override { w.hitpoints += 4; } }; -struct drain : public spell { - drain() : spell(1) {} +struct drain_heal : public spell { virtual int cost() override { return 73; }; - virtual void apply(wizard& w1, wizard& w2) override { - if (turns-- > 0) { - w1.hitpoints += 1; - w2.hitpoints -= 2; - } - } + virtual void apply(wizard& w) override { w.hitpoints += 2; } + virtual void unapply(wizard& w) override { w.hitpoints -= 2; } +}; + +struct drain_hurt : public spell { + virtual int cost() override { return 0; }; + virtual void apply(wizard& w) override { w.hitpoints -= 2; } + virtual void unapply(wizard& w) override { w.hitpoints += 2; } }; struct shield : public spell { - shield() : spell(6) {} + int armor; virtual int cost() override { return 113; }; - virtual void apply(wizard& w1, wizard& w2) override { - if (turns-- > 0) { - w1.armor = 7; - } + virtual void apply(wizard& w) override { + armor = w.armor; + w.armor = 7; } + virtual void unapply(wizard& w) override { w.armor = armor; } }; struct poison : public spell { - poison() : spell(6) {} virtual int cost() override { return 173; }; - virtual void apply(wizard& w1, wizard& w2) override { - if (turns-- > 0) { - w2.hitpoints -= 3; - } - } + virtual void apply(wizard& w) override { w.hitpoints -= 3; } + virtual void unapply(wizard& w) override { w.hitpoints += 3; } }; struct recharge : public spell { - recharge() : spell(5) {} virtual int cost() override { return 229; }; - virtual void apply(wizard& w1, wizard& w2) override { - if (turns-- > 0) { - w1.mana += 101; - } - } -}; - -// boss -// Hit Points: 55 -// Damage: 8 -struct bossfight : public spell { - bossfight() : spell(INT32_MAX) {} - virtual int cost() override { return 0; }; - virtual void apply(wizard& w1, wizard& w2) override { - int d = 8 - w1.armor; - w1.hitpoints -= d < 1 ? 1 : d; - } + virtual void apply(wizard& w) override { w.mana += 101; } + virtual void unapply(wizard& w) override { w.mana -= 101; } }; -struct arena { - // backtrace - void fight(int turn, wizard& w1, wizard& w2, std::set<spell*>& active, int* least) {} -}; +struct arena {}; } // namespace aoc2015 |