aboutsummaryrefslogtreecommitdiff
path: root/src/2015
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-03-30 22:46:02 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-03-30 22:46:02 +0800
commitf37bab92c49dcbd4cf08ad5962dad5cb83fef68e (patch)
tree280ef01848cf1b9053780fb54582afb25e8399cf /src/2015
parent2352df37c31fa87110706e201c13acfa8db9c4de (diff)
downloadadvent-of-code-f37bab92c49dcbd4cf08ad5962dad5cb83fef68e.tar.gz
advent-of-code-f37bab92c49dcbd4cf08ad5962dad5cb83fef68e.zip
another wizard
Diffstat (limited to 'src/2015')
-rw-r--r--src/2015/day22/aoc.h74
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