diff --git a/feast.html b/feast.html
index e66922d..a27cb72 100644
--- a/feast.html
+++ b/feast.html
@@ -6,6 +6,7 @@
   
Feast
   
   
+  
   
   
   
diff --git a/feast.js b/feast.js
index 57681dc..6a48e05 100644
--- a/feast.js
+++ b/feast.js
@@ -115,6 +115,8 @@ function updateExploreCompass() {
   }
 }
 function updateExploreActions() {
+  updateActions();
+
   for (let i = 0; i < actionButtons.length; i++) {
     if (i < actions.length) {
       actionButtons[i].disabled = false;
@@ -307,27 +309,32 @@ function move(direction) {
   moveTo(target,currentRoom.exitDescs[direction]);
 }
 
+function updateActions() {
+  actions = [];
+  currentRoom.objects.forEach(function (object) {
+    object.actions.forEach(function (action) {
+      if (action.conditions == undefined || action.conditions.reduce((result, cond) => result && cond(player.prefs), true))
+        actions.push(action);
+    });
+  });
+
+}
+
 function moveToByName(roomName, desc="You go places lol", loading=false) {
   moveTo(world[roomName], desc, loading);
 }
 
 function moveTo(room,desc="You go places lol", loading=false) {
-  actions = [];
   currentRoom = room;
 
   if (!loading)
     advanceTime(30);
 
-  currentRoom.objects.forEach(function (object) {
-    object.actions.forEach(function (action) {
-      if (action.conditions == undefined || action.conditions.reduce((result, cond) => result && cond(player.prefs), true))
-        actions.push(action);
-    });
-  });
-
   update([desc,newline]);
 
   currentRoom.visit();
+
+  updateDisplay();
 }
 
 window.addEventListener('load', function(event) {
diff --git a/forest.js b/forest.js
new file mode 100644
index 0000000..6abbfad
--- /dev/null
+++ b/forest.js
@@ -0,0 +1,148 @@
+function ForestExplore() {
+  GameObject.call(this, "Explore the Forest");
+
+  this.actions.push({
+    "name": "Explore",
+    "action": function() {
+      let outcome = Math.random();
+      advanceTime(60*30 * (Math.random() * 0.2 + 0.9));
+
+      if (outcome < 0.25) {
+        currentRoom.flags.exit = true;
+        update(["You find a way back!"]);
+      } else if (outcome < 0.5) {
+        startCombat(new Wolf());
+      } else if (outcome < 0.6) {
+        startCombat(new AlphaWolf());
+      } else {
+        update(["You explore the forest for a while, but don't find anything."]);
+      }
+    }
+  });
+
+  this.actions.push({
+    "name": "Leave",
+    "action": function() {
+      moveToByName("East Trail", "You leave the forest");
+    },
+    "conditions": [
+      function(player) {
+        return currentRoom.flags.exit;
+      }
+    ]
+  });
+}
+
+function Wolf() {
+  Creature.call(this, "Wolf", 10, 15, 15);
+
+  this.hasName = false;
+
+  this.description = function() { return "wolf"; };
+
+  this.attacks = [];
+
+  this.attacks.push(wolfBite(this));
+
+  //this.attacks.push(wolfSwallow(this));
+
+  this.attacks.push(wolfTackle(this));
+  //this.attacks.push(wolfTackleBite(this));
+  this.attacks.push(wolfTackleSwallow(this));
+
+  this.attacks.push(wolfDigest(this));
+
+  this.backupAttack = pass(this);
+
+  this.flags.stage = "combat";
+
+  this.startCombat = function(player) {
+    return ["Oh no a feral wolf"];
+  };
+
+  this.finishCombat = function() {
+    return ["Oops eaten"];
+  };
+
+  this.status = function(player) {
+    return ["It's a wolf"];
+  };
+}
+
+function wolfBite(attacker) {
+  return {
+    attackPlayer: function(defender){
+      let damage = attack(attacker, defender, attacker.str);
+      return ["The wolf jumps at you, biting for " + damage + " damage"];
+    },
+    requirements: [
+      function(attacker, defender) {
+        return attacker.flags.stage == "combat";
+      },
+      function(attacker, defender) {
+        return !attacker.flags.grappled && !defender.flags.grappled;
+      }
+    ],
+    priority: 1,
+    weight: function(attacker, defender) { return 1 + defender.health/defender.maxHealth; }
+  };
+}
+
+function wolfTackle(attacker) {
+  return {
+    attackPlayer: function(defender){
+      defender.flags.grappled = true;
+      return ["The wolf leaps on top of you, pinning you to the ground!"];
+    },
+    requirements: [
+      function(attacker, defender) {
+        return attacker.flags.stage == "combat";
+      },
+      function(attacker, defender) {
+        return !attacker.flags.grappled && !defender.flags.grappled;
+      }
+    ],
+    priority: 1,
+    weight: function(attacker, defender) { return 1.25 - defender.health/defender.maxHealth; }
+  };
+}
+
+function wolfTackleSwallow(attacker) {
+  return {
+    attackPlayer: function(defender){
+      attacker.flags.stage = "oral";
+      return ["You struggle against the wolf, but it's not enough - its greedy jaws envelop your head, then your shoulders. The hungry beast swallows you down in seconds, cramming you into its hot, slimy stomach."];
+    },
+    conditions: [
+      function(attacker, defender) {
+        return defender.prefs.prey && defender.prefs.vore.oral > 0;
+      }
+    ],
+    requirements: [
+      function(attacker, defender) {
+        return attacker.flags.stage == "combat";
+      },
+      function(attacker, defender) {
+        return !attacker.flags.grappled && defender.flags.grappled;
+      }
+    ],
+    priority: 1,
+    weight: function(attacker, defender) { return 1; }
+  };
+}
+
+function wolfDigest(attacker) {
+  return {
+    attackPlayer: function(defender){
+      let damage = attack(attacker, defender, 25);
+      return ["The wolf's churning guts wear you down."];
+    },
+    requirements: [
+      function(attacker, defender) {
+        return attacker.flags.stage == "oral";
+      }
+    ],
+    priority: 1,
+    weight: function(attacker, defender) { return 1; }
+  };
+}
diff --git a/objects.js b/objects.js
index d23cd2c..ac2da0b 100644
--- a/objects.js
+++ b/objects.js
@@ -46,8 +46,8 @@ function Toilet() {
       update(lines);
     },
     "conditions": [
-      function(prefs) {
-        return prefs.scat == true;
+      function(player) {
+        return player.prefs.scat == true;
       }
     ]
   });
diff --git a/world.js b/world.js
index cf364a6..dde6f44 100644
--- a/world.js
+++ b/world.js
@@ -156,6 +156,11 @@ let locationsSrc = [
         "dir": NORTH,
         "desc": "You walk north"
       },
+      {
+        "name": "East Street",
+        "dir": EAST,
+        "desc": "You walk east"
+      },
       {
         "name": "South Street",
         "dir": SOUTH,
@@ -168,6 +173,58 @@ let locationsSrc = [
       }
     ]
   },
+  {
+    "name": "East Street",
+    "desc": "This street is in the east",
+    "conn": [
+      {
+        "name": "Crossroads",
+        "dir": WEST,
+        "desc": "You walk to the crossroads"
+      },
+      {
+        "name": "East Trail",
+        "dir": EAST,
+        "desc": "You head out on the road."
+      }
+    ]
+  },
+  {
+    "name": "East Trail",
+    "desc": "A trail from your hometown to lands beyond",
+    "conn": [
+      {
+        "name": "East Street",
+        "dir": WEST,
+        "desc": "You walk back into town"
+      },
+      {
+        "name": "Woods",
+        "dir": NORTH,
+        "desc": "You wander into the woods."
+      },
+      {
+        "name": "Woods",
+        "dir": SOUTH,
+        "desc": "You wander into the woods."
+      },
+    ]
+  },
+  {
+    "name": "Woods",
+    "desc": "A thick forest. It's easy to get lost here, but it's not too dangerous, at least.",
+    "conn": [
+
+    ],
+    "objs": [
+      ForestExplore,
+    ],
+    "hooks": [
+      function() {
+        currentRoom.flags.exit = false;
+      }
+    ]
+  },
   {
     "name": "South Street",
     "desc": "This street is in the south",
@@ -272,6 +329,7 @@ function Location(name="Nowhere",desc="Nada") {
   this.objects = [];
   this.hooks = [];
   this.conditions = [];
+  this.flags = [];
 
   this.visit = function() {
     this.hooks.forEach(function (x) {