diff --git a/src/coord.cpp b/src/coord.cpp
index 3d371c047f97ad070d9981b4791f9028c4dbc666..2f8c069df36c0677cb7ff67445fcfbf8496097e4 100644
--- a/src/coord.cpp
+++ b/src/coord.cpp
@@ -78,3 +78,7 @@ std::string Coord::toString() const{
 int Coord::distanceTo(const Coord& other) const {
 	return std::max(std::abs(x - other.x), std::abs(y - other.y));
 }
+
+bool Coord::isAdjacentTo(const Coord& other) const {
+	return (std::abs(this->x - other.x) + std::abs(this->y - other.y)) <= 1;
+}
\ No newline at end of file
diff --git a/src/include/coord.h b/src/include/coord.h
index b0e858e7c4f1ec0db299480011a9ef00be439d0d..281249e0fd702458d6434b5212826328769f87e7 100644
--- a/src/include/coord.h
+++ b/src/include/coord.h
@@ -24,6 +24,7 @@ class Coord {
 		bool operator!=(const Coord&);
 		Coord asScreen();
 		Coord copy();
+		bool isAdjacentTo(const Coord&) const;
 		std::string toString() const;
 		// maximum distance in either dimension
 		int distanceTo(const Coord&) const;
diff --git a/src/include/item.h b/src/include/item.h
index bd700322d4384cf34d958b83b4bc5e9cc4984484..8df7343936c8f62560a28fb19bd66654996e0d2f 100644
--- a/src/include/item.h
+++ b/src/include/item.h
@@ -2,6 +2,7 @@
 
 #include <map>
 #include <string>
+#include <vector>
 
 #include "coord.h"
 #include "feature.h"
@@ -10,6 +11,8 @@ class Level;
 
 class Item : public Feature {
 	public:
+		static std::vector<std::string> shuffleNameVector(std::vector<std::string>);
+		
 		enum Context {FLOOR, INVENTORY};
 		
 		Item(char, Coord, Context, std::string, std::string, int, bool, bool);
diff --git a/src/include/mob.h b/src/include/mob.h
index 0db15a760a0f5270d290b74d31baef1e7c94ec76..87ef26e1631900d22df6334dfffcf590b8e221c1 100644
--- a/src/include/mob.h
+++ b/src/include/mob.h
@@ -12,6 +12,7 @@ class Mob {
 		static int diceSum(int, int);
 
 		virtual void attack(Mob*) = 0;
+		virtual int calculateDamage() = 0;
 		void changeArmor(int);
 		int getArmor();
 		int getExperience();
diff --git a/src/include/monster.h b/src/include/monster.h
index 3f4b837d6d48d6f2baa55552451fd9d1e5a79a0b..c70f6b5ad50e4f62478e7d5f76cb17708aa9eaa4 100644
--- a/src/include/monster.h
+++ b/src/include/monster.h
@@ -17,7 +17,7 @@ class Monster : public Mob {
 	public:
 		Monster(char, Coord);
 
-		void attack(Mob*);
+		void attack(Level*);
 		int calculateDamage();
 		int getCarryChance();
 		std::vector<char> getSymbolsForLevel(int);
@@ -28,6 +28,8 @@ class Monster : public Mob {
 	private:
 		static std::map<char, MONSTER_TUPLE_TYPE > templateMap;
 
+		void relocate(Level*);
+
 		enum Behaviour {AGGRESSIVE, FLYING, REGENERATIVE, GREEDY, INVISIBLE};
 
 		int carryChance;
diff --git a/src/include/playerchar.h b/src/include/playerchar.h
index 4413569c45ebd20c8a215132c117e4ecacb88d14..a7000c488388cd0a016513aee2ebc3ce7721f77d 100644
--- a/src/include/playerchar.h
+++ b/src/include/playerchar.h
@@ -24,6 +24,7 @@ class PlayerChar : public Mob {
 		void activateItem(Item*);
 		void appendLog(std::string);
 		void attack(Mob*);
+		int calculateDamage();
 		void collectGold(GoldPile*);
 		bool dropItem(Item*);
 		void eat(Food*);
@@ -47,6 +48,7 @@ class PlayerChar : public Mob {
 		bool throwItem(Item*);
 		bool zap(Wand*, Level*);
 		std::vector<std::string>& getLog();
+		
 	private:
 		int currentStr;
 		int foodLife;
@@ -59,9 +61,12 @@ class PlayerChar : public Mob {
 		std::vector<std::string> log;
 		static const int MAX_LOG = 30;
 		int maxStr;
-		static const int START_ARMOR = 1, 
-		START_EXP = 0, START_GOLD = 0, START_HP = 12,
-		START_LEVEL = 1, START_STR = 16, SIGHT_RADIUS=1,
-		START_FOOD = 1250;		
-		bool removeItem(Item*);
+		static const int START_ARMOR = 1; 
+		static const int START_EXP = 0;
+		static const int START_GOLD = 0;
+		static const int START_HP = 12;
+		static const int START_LEVEL = 1;
+		static const int START_STR = 16;
+		static const int SIGHT_RADIUS = 1;
+		static const int START_FOOD = 1250;		
 };
diff --git a/src/include/potion.h b/src/include/potion.h
index 4cc579d107ea33914d32c32262edcb9b04d975d7..ece37dbd4a8e2c3c570de93574f15ac5ca3ce489 100644
--- a/src/include/potion.h
+++ b/src/include/potion.h
@@ -14,8 +14,6 @@ class Level;
 
 class Potion : public Item {
 	public:
-		static void initializeMap();
-		
 		Potion(Coord);
 		Potion(Coord, Item::Context, int);
 		bool activate(Mob*);
diff --git a/src/include/projectile.h b/src/include/projectile.h
deleted file mode 100644
index 63580e68418b6af1af1b1fe1e8d2692570bb98f8..0000000000000000000000000000000000000000
--- a/src/include/projectile.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include <string>
-
-#include "coord.h"
-#include "item.h"
-
-class Projectile : public Item {
-	public:
-		Projectile(Coord, Item::Context, std::string, unsigned char, std::pair<int, int>);
-		int getChance();
-		int getDamage();
-	private:
-		std::pair<int, int> enchantment;
-};
\ No newline at end of file
diff --git a/src/include/random.h b/src/include/random.h
index afd412af339892ae65e67f03977e63420102a6e0..e4c542fd60fdafc6aee7da2365ef3a310ddec83e 100644
--- a/src/include/random.h
+++ b/src/include/random.h
@@ -1,4 +1,7 @@
 #include <random>
+#include <string>
+#include <vector>
+
 #include "coord.h"
 
 #ifndef RANDOM_H
diff --git a/src/include/ring.h b/src/include/ring.h
index 2f052575181c509fcaf866454caba49daa4f4381..93e4def0cb68aa55ac34395c0c4956d608b709df 100644
--- a/src/include/ring.h
+++ b/src/include/ring.h
@@ -12,8 +12,6 @@ class Level;
 
 class Ring : public Item {
 	public:
-		static void initializeMap();
-
 		Ring(Coord);
 		Ring(Coord, Item::Context, int);
 		bool activate(Level*);
diff --git a/src/include/scroll.h b/src/include/scroll.h
index defe808cf9e194cf07a4c6b2d7232325af5a6865..fc38bdb31e1de708c29ddf84379e8acee49e0e89 100644
--- a/src/include/scroll.h
+++ b/src/include/scroll.h
@@ -13,7 +13,7 @@ class Level;
 
 class Scroll : public Item {
 	public:
-		static void initializeMap();
+		static std::vector<std::string> initializeScrollNames();
 
 		Scroll(Coord);
 		Scroll(Coord, Item::Context, int);
diff --git a/src/include/wand.h b/src/include/wand.h
index dbf18f3d2fcbddad9a45ae9066d9fd310af7c322..f118c30b6ba18f0faaf32067e370311af31fbe5d 100644
--- a/src/include/wand.h
+++ b/src/include/wand.h
@@ -12,9 +12,7 @@ using WAND_TUPLE_TYPE = std::tuple<std::string>;
 class Level;
 
 class Wand : public Item {
-	public:
-		static void initializeMap();
-		
+	public:	
 		Wand(Coord);
 		Wand(Coord, Item::Context, int);
 		bool activate(Level*);
diff --git a/src/item.cpp b/src/item.cpp
index 662f94b0612981c39338fb01b6565aec6f831266..a9d20a0dce764184e8447935a255a187d70eccf3 100644
--- a/src/item.cpp
+++ b/src/item.cpp
@@ -1,11 +1,17 @@
 #include <algorithm>
 #include <map>
 #include <string>
+#include <vector>
 
 #include "include/item.h"
 
 std::map<std::string, std::map<int, bool> > Item::identified;
 
+std::vector<std::string> Item::shuffleNameVector(std::vector<std::string> nameVector) {
+	std::random_shuffle(nameVector.begin(), nameVector.end());
+	return nameVector;	
+};
+
 Item::Item(char symbol, Coord location, Item::Context context, std::string className, std::string name, std::string pseudoName, int type, bool canStack, bool canThrow)
 	: Feature(symbol, location),
 	  canStack(canStack),
diff --git a/src/mob.cpp b/src/mob.cpp
index 79da60cd254c95a312e519fdffeb55b20259a3aa..0018ad263bd425587518f421576cdaa1be68bc6a 100644
--- a/src/mob.cpp
+++ b/src/mob.cpp
@@ -1,3 +1,4 @@
+#include <cmath>
 #include <string>
 
 #include "include/coord.h"
@@ -59,7 +60,10 @@ char Mob::getSymbol() {
 }
 
 void Mob::hit(int damage) {
-	this->currentHP -= damage;
+	// TODO
+	
+	int deltaHP = std::max(1, damage - this->armor);
+	this->currentHP -= deltaHP;
 }
 
 void Mob::moveLocation(Coord location) {
diff --git a/src/monster.cpp b/src/monster.cpp
index f4ffb604820da0b5220b555c96000c88ca22e1ac..d236accc5230ee1c351b9dcc8493c7afce0a5c10 100644
--- a/src/monster.cpp
+++ b/src/monster.cpp
@@ -59,16 +59,22 @@ Monster::Monster(char symbol, Coord location)
 	name = std::get<7>(monsterTuple);
 }
 
-void Monster::attack(Mob* mob) {
+void Monster::attack(Level* level) {
 	std::cout << "Monster " << this->getName() << " Attack\n";
 
 	// TODO
-	if (std::abs(this->location[0] - mob->getLocation()[0]) <= 1 && std::abs(this->location[1] - mob->getLocation()[1]) <= 1) {
-		if (rand() % 2 == 0) {
-			mob->hit(1);
+	
+	/*
+	std::vector<Coord> possibleCoords = level->getAdjPassable(this->location);
+
+	for (auto coordIt = possibleCoords.begin() ; coordIt != possibleCoords.end() ; coordIt++) {
+		PlayerChar* playerChar = level->playerCharAt(*coordIt);
+		if (playerChar != NULL) {
+			playerChar->hit(this->calculateDamage());
+			break;
 		}
 	}
-	
+	*/
 }
 
 int Monster::calculateDamage() {
@@ -99,24 +105,20 @@ std::vector<char> Monster::getSymbolsForTreasure(int depth) {
 	return getSymbolsForLevel(depth);
 }
 
-int Monster::turn(Level* level) {
-	std::cout << "Monster " << this->getName() << "'s Turn\n";
-
-	if (level->tileAt(this->location + Coord(1, 0)).isPassable() && rand() % 2 == 0) {
-		this->moveLocation(Coord(1, 0));
-	}
-
-	if (level->tileAt(this->location + Coord(-1, 0)).isPassable() && rand() % 2 == 0) {
-		this->moveLocation(Coord(-1, 0));
+void Monster::relocate(Level* level) {
+	/*
+	if (rand() % 2 == 0) {
+		std::vector<Coord> possibleCoords = level->getAdjPassable(this->location);
+		this->location = possibleCoords[rand() % possibleCoords.size()];
 	}
+	*/
+}
 
-	if (level->tileAt(this->location + Coord(0, 1)).isPassable() && rand() % 2 == 0) {
-		this->moveLocation(Coord(0, 1));
-	}
+int Monster::turn(Level* level) {
+	std::cout << "Monster " << this->getName() << "'s Turn\n";
 
-	if (level->tileAt(this->location + Coord(0, -1)).isPassable() && rand() % 2 == 0) {
-		this->moveLocation(Coord(0, -1));
-	}
+	relocate(level);
+	attack(level);
 
 	return 1;
-}
+}
\ No newline at end of file
diff --git a/src/playerchar.cpp b/src/playerchar.cpp
index 9e24df216682213b6051557c367737fc41790c98..0c080addd169517273f788f71ae08424f0dec2c1 100644
--- a/src/playerchar.cpp
+++ b/src/playerchar.cpp
@@ -37,14 +37,24 @@ void PlayerChar::attack(Mob* mob) {
 	// TODO
 
 	/*
-	if (std::abs(this->location[0] - mob->getLocation[0]) <= 1 && std::abs(this->location[1] - mob->getLocation[1]) <= 1) {
-		if (rand() % 2 == 0) {
-			mob->hit(2);
+	std::vector<Coord> possibleCoords = level->getAdjPassable(this->location);
+
+	for (auto coordIt = possibleCoords.begin() ; coordIt != possibleCoords.end() ; coordIt++) {
+		Monster* monster = level->monsterAt(*coordIt);
+		if (monster != NULL) {
+			monster->hit(this->calculateDamage());
+			break;
 		}
 	}
 	*/
 }
 
+int PlayerChar::calculateDamage() {
+	// TODO
+
+	return 1;
+}
+
 void PlayerChar::collectGold(GoldPile* goldpile) {
 	std::cout << "PlayerChar Collected " << goldpile->getQuantity() << " Gold\n";
 	this->gold += goldpile->getQuantity();
diff --git a/src/potion.cpp b/src/potion.cpp
index 4342667ecec5c45a879e3dc3ae79baa40720b399..550abc6b65188d90cc9cbef2c60f6d47c522ef80 100644
--- a/src/potion.cpp
+++ b/src/potion.cpp
@@ -6,11 +6,11 @@
 #include "include/item.h"
 #include "include/potion.h"
 
-std::vector<std::string> Potion::nameVector = {
+std::vector<std::string> Potion::nameVector = Item::shuffleNameVector({
 	"Blue Potion", "Red Potion", "Green Potion", "Grey Potion", "Brown Potion",
 	"Clear Potion", "Pink Potion", "White Potion", "Purple Potion", "Black Potion",
 	"Yellow Potion", "Plaid Potion", "Burgundy Potion", "Beige Potion"
-};
+});
 
 std::vector<POTION_TUPLE_TYPE > Potion::typeVector = {
 	POTION_TUPLE_TYPE {"Potion of Increase Strength"},
@@ -29,10 +29,6 @@ std::vector<POTION_TUPLE_TYPE > Potion::typeVector = {
 	POTION_TUPLE_TYPE {"Potion of See Invisible"}
 };
 
-void Potion::initializeMap() {
-	std::random_shuffle(Potion::nameVector.begin(), Potion::nameVector.end());
-}
-
 Potion::Potion(Coord location)
 	: Potion(location, Item::Context::FLOOR, rand() % Potion::typeVector.size()) {}
 
diff --git a/src/projectile.cpp b/src/projectile.cpp
deleted file mode 100644
index f1e3bcb2abbcf526e9d8d254b83400ae838b40a9..0000000000000000000000000000000000000000
--- a/src/projectile.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "include/coord.h"
-#include "include/item.h"
-#include "include/projectile.h"
-
-Projectile::Projectile(Coord location, Item::Context context, std::string name, unsigned char type, std::pair<int, int> enchantment)
-	: Item('*', location, context, "Projectile", name, name, type, true, true),
-	  enchantment(enchantment) {}
-
-int Projectile::getChance() {
-	return this->enchantment.first;
-}
-
-int Projectile::getDamage() {
-	return this->enchantment.second;
-}
diff --git a/src/random.cpp b/src/random.cpp
index 2f81853d0e144acc46879c0f603edff8db770184..86a4868610887389f6342d95373055751520e167 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -22,4 +22,4 @@ Coord Generator::randPosition(Coord a, Coord b) {
 
 void Generator::shuffle(std::vector<Coord>* s) {
 	std::random_shuffle(s->begin(), s->end());
-}
+}
\ No newline at end of file
diff --git a/src/ring.cpp b/src/ring.cpp
index 209b2856beae0bcb53ccd7cea6ba0224b5748364..2dd0e7bdb17275a8e9338b2cdf9f7d60ebde3f99 100644
--- a/src/ring.cpp
+++ b/src/ring.cpp
@@ -6,9 +6,11 @@
 #include "include/item.h"
 #include "include/ring.h"
 
-bool Ring::activate(Level* level) {
-	return false;
-}
+std::vector<std::string> Ring::nameVector = Item::shuffleNameVector({
+	"Diamond Ring",  "Stibotantalite Ring",  "Lapi-Lazuli Ring",  "Ruby Ring",  "Emerald Ring", 
+	"Sapphire Ring",  "Amethyst Ring",  "Quartz Ring",  "Tiger-Eye  Ring",  "Opal Ring", 
+	"Agate Ring",  "Turquoise Ring",  "Pearl Ring",  "Garnet Ring"
+});
 
 std::vector<RING_TUPLE_TYPE > Ring::typeVector = {
 	RING_TUPLE_TYPE {"Ring of Stealth"},
@@ -24,18 +26,12 @@ std::vector<RING_TUPLE_TYPE > Ring::typeVector = {
 	RING_TUPLE_TYPE {"Ring of Searching"}
 };
 
-std::vector<std::string> Ring::nameVector = {
-	"Diamond Ring",  "Stibotantalite Ring",  "Lapi-Lazuli Ring",  "Ruby Ring",  "Emerald Ring", 
-	"Sapphire Ring",  "Amethyst Ring",  "Quartz Ring",  "Tiger-Eye  Ring",  "Opal Ring", 
-	"Agate Ring",  "Turquoise Ring",  "Pearl Ring",  "Garnet Ring"
-};
-
-void Ring::initializeMap() {
-	std::random_shuffle(Ring::nameVector.begin(), Ring::nameVector.end());
-}
-
 Ring::Ring(Coord location)
 	: Ring(location, Item::Context::FLOOR, rand() % Ring::typeVector.size()) {}
 
 Ring::Ring(Coord location, Item::Context context, int type)
 	: Item('=', location, context, "Ring", std::get<0>(Ring::typeVector[type]), Ring::nameVector[type], type, true, true) {}
+
+bool Ring::activate(Level* level) {
+	return false;
+}
\ No newline at end of file
diff --git a/src/scroll.cpp b/src/scroll.cpp
index 9def1789a01fd224cac80e1cc6def1d890582f73..1c56004e3b2f02460c0420211ebaa6aab9a47c7c 100644
--- a/src/scroll.cpp
+++ b/src/scroll.cpp
@@ -23,8 +23,6 @@ std::vector<SCROLL_TUPLE_TYPE > Scroll::typeVector = {
 	SCROLL_TUPLE_TYPE {"Scroll of Confuse Monster"}
 };
 
-std::vector<std::string> Scroll::nameVector;
-
 std::vector<std::string> Scroll::syllableVector = {
 	"Blech", "Foo", "Barf", "Rech", "Bar",
 	"Quo", "Bloto", "Oh", "Caca", "Blorp",
@@ -36,7 +34,10 @@ std::vector<std::string> Scroll::syllableVector = {
 	"Coph", "Swerr", "Mihln", "Poxi"
 };
 
-void Scroll::initializeMap() {
+std::vector<std::string> Scroll::nameVector = Scroll::initializeScrollNames();
+
+std::vector<std::string> Scroll::initializeScrollNames() {
+	std::vector<std::string> nameVector;
 	for (int type = 0 ; type < static_cast<int>(Scroll::typeVector.size()) ; type++) {
 		std::string scrollName = "Scroll titled '";
 		scrollName += Scroll::syllableVector[rand() % Scroll::syllableVector.size()];
@@ -48,8 +49,10 @@ void Scroll::initializeMap() {
 		}
 
 		scrollName += "'";
-		Scroll::nameVector.push_back(scrollName);
+		nameVector.push_back(scrollName);
 	}
+
+	return nameVector;
 }
 
 Scroll::Scroll(Coord location)
diff --git a/src/wand.cpp b/src/wand.cpp
index d8ac67033d4c657c4e174fb347bac904064fa390..e3dd500572a19e01bce88d724250fdc2d1678dc1 100644
--- a/src/wand.cpp
+++ b/src/wand.cpp
@@ -6,11 +6,6 @@
 #include "include/item.h"
 #include "include/wand.h"
 
-bool Wand::activate(Level* level) {
-	this->charges--;
-	return false;
-}
-
 std::vector<WAND_TUPLE_TYPE > Wand::typeVector = {
 	WAND_TUPLE_TYPE {"Wand of Teleport Away"},
 	WAND_TUPLE_TYPE {"Wand of Slow Monster"},
@@ -25,18 +20,15 @@ std::vector<WAND_TUPLE_TYPE > Wand::typeVector = {
 	WAND_TUPLE_TYPE {"Wand of Fire"}
 };
 
-std::vector<std::string> Wand::nameVector = {
+std::vector<std::string> Wand::nameVector = Item::shuffleNameVector({
 	"Steel Wand", "Bronze Wand", "Gold Wand", "Silver Wand", "Copper Wand",
 	"Nickel Wand", "Cobalt Wand", "Tin Wand", "Iron Wand", "Magnesium Wand",
 	"Chrome Wand", "Carbon Wand", "Platinum Wand", "Silicon Wand", "Titanium Wand",
 	"Teak Wand", "Oak Wand", "Cherry Wand", "Birch Wand", "Pine Wand",
 	"Cedar Wand", "Redwood Wand", "Balsa Wand", "Ivory Wand", "Walnut Wand",
 	"Maple Wand", "Mahogany Wand", "Elm Wand", "Palm Wand", "Wooden Wand"
-};
+});
 
-void Wand::initializeMap() {
-	std::random_shuffle(Wand::nameVector.begin(), Wand::nameVector.end());
-}
 
 Wand::Wand(Coord location)
 	: Wand(location, Item::Context::FLOOR, rand() % Wand::typeVector.size()) {}
@@ -45,6 +37,11 @@ Wand::Wand(Coord location, Item::Context context, int type)
 	: Item('/', location, context, "Wand", std::get<0>(Wand::typeVector[type]), Wand::nameVector[type], type, false, false),
 	  charges(3 + (rand() % 5)) {}
 
+bool Wand::activate(Level* level) {
+	this->charges--;
+	return false;
+}
+
 int Wand::getCharges() {
 	return this->charges;
 }