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; } }; }