From 4641b0b1455f46dacc8eb651e8f89d67830d8377 Mon Sep 17 00:00:00 2001 From: Zarkonnen Date: Mon, 8 Jul 2013 19:16:16 +0200 Subject: [PATCH] Initial medicine implementation. Needs more events. --- script/events.js | 45 +++ script/events/encounters.js | 65 ++-- script/events/setpieces.js | 713 ++++++++++++++++++++++++++++++++++-- script/room.js | 8 + script/world.js | 7 +- 5 files changed, 787 insertions(+), 51 deletions(-) diff --git a/script/events.js b/script/events.js index 6219a4c..c47ca4b 100644 --- a/script/events.js +++ b/script/events.js @@ -7,6 +7,7 @@ var Events = { _PANEL_FADE: 200, _FIGHT_SPEED: 100, _EAT_COOLDOWN: 5, + _MEDS_COOLDOWN: 7, STUN_DURATION: 4000, init: function(options) { @@ -103,6 +104,7 @@ var Events = { Events.createAttackButton('fists').prependTo(btns); } + Events.createUseMedsButton().prependTo(btns); Events.createEatMeatButton().prependTo(btns); // Set up the enemy attack timer @@ -129,6 +131,26 @@ var Events = { return btn; }, + createUseMedsButton: function(cooldown) { + if (cooldown == null) { + cooldown = Events._MEDS_COOLDOWN; + } + + var btn = new Button.Button({ + id: 'meds', + text: 'use meds', + cooldown: cooldown, + click: Events.useMeds, + cost: { 'medicine': 1 } + }); + + if(Path.outfit['medicine'] == 0) { + Button.setDisabled(btn, true); + } + + return btn; + }, + createAttackButton: function(weaponName) { var weapon = World.Weapons[weaponName]; var cd = weapon.cooldown; @@ -192,6 +214,28 @@ var Events = { } }, + useMeds: function() { + if(Path.outfit['medicine'] > 0) { + Path.outfit['medicine']--; + World.updateSupplies(); + if(Path.outfit['medicine'] == 0) { + Button.setDisabled($('#meds'), true); + } + + var hp = World.health; + hp += World.medsHeal(); + hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; + World.setHp(hp); + + if(Events.activeEvent()) { + var w = $('#wanderer'); + w.data('hp', hp); + Events.updateFighterDiv(w); + Events.drawFloatText('+' + World.medsHeal(), '#wanderer .hp'); + } + } + }, + useWeapon: function(btn) { if(Events.activeEvent()) { var weaponName = btn.attr('id').substring(7).replace('-', ' '); @@ -426,6 +470,7 @@ var Events = { }).appendTo(btns); Events.createEatMeatButton(0).appendTo(btns); + Events.createUseMedsButton(0).appendTo(btns); } } catch(e) { // It is possible to die and win if the timing is perfect. Just let it fail. diff --git a/script/events/encounters.js b/script/events/encounters.js index 891f48d..5286948 100644 --- a/script/events/encounters.js +++ b/script/events/encounters.js @@ -169,11 +169,16 @@ Events.Encounters = [ max: 10, chance: 0.8 }, - 'iron': { - min: 1, - max: 5, - chance: 0.5 - } + 'iron': { + min: 1, + max: 5, + chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 + } }, notification: 'a scavenger draws close, hoping for an easy score' } @@ -271,16 +276,21 @@ Events.Encounters = [ max: 10, chance: 0.8 }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 + } }, notification: 'a soldier opens fire from across the desert' } @@ -307,16 +317,21 @@ Events.Encounters = [ max: 10, chance: 0.8 }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 + } }, notification: 'a shot rings out, from somewhere in the long grass' } diff --git a/script/events/setpieces.js b/script/events/setpieces.js index af55075..5759b02 100644 --- a/script/events/setpieces.js +++ b/script/events/setpieces.js @@ -210,6 +210,11 @@ Events.Setpieces = { min: 1, max: 3, chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 } }, buttons: { @@ -444,6 +449,11 @@ Events.Setpieces = { min: 1, max: 3, chance: 0.3 + }, + 'medicine': { + min: 1, + max: 4, + chance: 0.15 } }, onLoad: function() { @@ -470,7 +480,12 @@ Events.Setpieces = { min: 1, max: 3, chance: 0.5 - } + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.3 + } }, onLoad: function() { World.clearDungeon(); @@ -496,7 +511,7 @@ Events.Setpieces = { buttons: { 'enter': { text: 'explore', - nextScene: {0.5: 'a1', 1: 'a2'} + nextScene: {0.3: 'a1', 0.7: 'a3', 1: 'a2'} }, 'leave': { text: 'leave', @@ -522,6 +537,7 @@ Events.Setpieces = { } } }, + 'a2': { combat: true, enemy: 'thug', @@ -559,6 +575,23 @@ Events.Setpieces = { } } }, + 'a3': { + text: [ + "a squat building up ahead.", + 'a green cross barely visible behind grimy windows.' + ], + buttons: { + 'enter': { + text: 'enter', + nextScene: {0.5: 'b5', 1: 'c7'}, + cost: {torch: 1} + }, + 'leave': { + text: 'leave town', + nextScene: 'end' + } + } + }, 'b1': { text: [ 'a small cache of supplies is tucked inside a rusting locker.' @@ -578,7 +611,12 @@ Events.Setpieces = { min: 1, max: 5, chance: 0.3 - } + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.05 + } }, buttons: { 'continue': { @@ -610,11 +648,11 @@ Events.Setpieces = { max: 10, chance: 0.8 }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.5 - } + 'cured meat': { + min: 1, + max: 5, + chance: 0.5 + } }, notification: 'a scavenger waits just inside the door.', buttons: { @@ -680,6 +718,11 @@ Events.Setpieces = { min: 1, max: 5, chance: 0.3 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.1 } }, buttons: { @@ -693,6 +736,43 @@ Events.Setpieces = { } } }, + 'b2': { + combat: true, + enemy: 'madman', + char: 'M', + damage: 6, + hit: 0.3, + attackDelay: 1, + health: 10, + loot: { + 'cloth': { + min: 2, + max: 4, + chance: 0.3 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.9 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.4 + } + }, + notification: 'a madman attacks, screeching.', + buttons: { + 'continue': { + text: 'continue', + nextScene: {0.3: 'c7', 1: 'c8'} + }, + 'leave': { + text: 'leave town', + nextScene: 'end' + } + } + }, 'c1': { combat: true, enemy: 'thug', @@ -850,6 +930,37 @@ Events.Setpieces = { } } }, + 'c7': { + text: [ + 'you search the clinic and find some medicine abandoned in the drawers.' + ], + loot: { + 'medicine': { + min: 2, + max: 5, + chance: 1 + } + }, + buttons: { + 'leave': { + text: 'leave town', + nextScene: 'end' + } + } + }, + 'c8': { + text: [ + 'the clinic has been ransacked.', + 'only dust and stains remain.' + ], + loot: {}, + buttons: { + 'leave': { + text: 'leave town', + nextScene: 'end' + } + } + }, 'd1': { combat: true, enemy: 'scavenger', @@ -906,11 +1017,11 @@ Events.Setpieces = { max: 10, chance: 0.8 }, - 'steel sword': { - min: 1, - max: 1, - chance: 0.5 - } + 'steel sword': { + min: 1, + max: 1, + chance: 0.5 + } }, notification: "a man stands over a dead wanderer. notices he's not alone.", buttons: { @@ -952,6 +1063,11 @@ Events.Setpieces = { min: 1, max: 5, chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.3 } }, buttons: { @@ -1049,6 +1165,11 @@ Events.Setpieces = { min: 1, max: 5, chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 } }, buttons: { @@ -1129,6 +1250,22 @@ Events.Setpieces = { } } }, + 'a4': { + text: [ + 'the shell of an abandoned hospital looms ahead.' + ], + buttons: { + 'enter' { + text: 'enter', + cost: { 'torch': 1 }, + nextScene: {0.5: 'b7', 1: 'b8'} + } + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, 'b1': { text: [ 'the old tower seems mostly intact.', @@ -1274,16 +1411,21 @@ Events.Setpieces = { max: 5, chance: 0.8 }, - 'cloth': { - min: 1, - max: 5, - chance: 0.5 - }, - 'leather': { - min: 1, - max: 1, - chance: 0.2 - } + 'cloth': { + min: 1, + max: 5, + chance: 0.5 + }, + 'leather': { + min: 1, + max: 1, + chance: 0.2 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.05 + } }, buttons: { 'continue': { @@ -1311,6 +1453,59 @@ Events.Setpieces = { nextScene: 'end' } } + }, + 'b7': { + text: [ + 'empty corridors.', + 'the place has been swept clean by scavengers.' + ], + buttons: { + 'continue': { + text: 'continue', + nextScene: {0.3: 'c12', 0.7: 'c10', 1: 'c11'} + }, + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + 'b8': { + notification: 'an old man bursts through a door, wielding a scalpel.', + combat: true, + enemy: 'old man', + char: 'M', + damage: 3, + hit: 0.5, + attackDelay: 2, + health: 10, + loot: { + 'cured meat': { + min: 1, + max: 3, + chance: 0.5 + }, + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.5 + } + }, + buttons: { + 'continue': { + text: 'continue', + nextScene: {0.3: 'c13', 0.7: 'c11', 1: 'end15'} + }, + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } }, 'c1': { notification: 'a thug is waiting on the other side of the wall.', @@ -1501,6 +1696,11 @@ Events.Setpieces = { min: 1, max: 1, chance: 0.01 + }, + 'medicine': { + min: 1, + max: 4, + chance: 0.5 } }, buttons: { @@ -1539,6 +1739,123 @@ Events.Setpieces = { } }, + 'c10': { + text: [ + 'someone has locked and barricaded the door to this operating theatre.' + ], + buttons: { + 'enter': { + text: 'continue', + nextScene: {0.2: 'end12', 0.6: 'd10', 1: 'd11'} + }, + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'c11': { + notification: 'a tribe of elderly squatters is camped out in this ward.', + combat: true, + enemy: 'squatters', + plural: true, + char: 'SSS', + damage: 2, + hit: 0.7, + attackDelay: 0.5, + health: 40, + loot: { + 'cured meat': { + min: 1, + max: 3, + chance: 0.5 + }, + 'cloth': { + min: 3, + max: 8, + chance: 0.8 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.3 + } + }, + buttons: { + 'continue': { + text: 'continue', + nextScene: 'end10' + }, + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'c12': { + notification: 'a pack of lizards rounds the corner.', + combat: true, + enemy: 'lizards', + plural: true, + char: 'LLL', + damage: 4, + hit: 0.7, + attackDelay: 0.7, + health: 30, + loot: { + 'meat': { + min: 3, + max: 8, + chance: 1 + }, + 'teeth': { + min: 2, + max: 4, + chance: 1 + }, + 'scales': { + min: 3, + max: 5, + chance: 1 + } + }, + buttons: { + 'continue': { + text: 'continue', + nextScene: 'end10' + }, + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'c13': { + text: [ + 'strips of meat are hung up to dry in this ward.' + ], + loot: { + 'cured meat': { + min: 3, + max: 10, + chance: 1 + } + }, + buttons: { + 'continue': { + text: 'continue', + nextScene: { 0.5: 'end10', 1: 'end11' } + }, + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + 'd1': { notification: 'a large bird nests at the top of the stairs.', combat: true, @@ -1850,6 +2167,70 @@ Events.Setpieces = { } } }, + + 'd10': { + notification: 'as you prise open the door, a deformed figure awakes and attacks.', + combat: true, + enemy: 'deformed', + char: 'D', + damage: 8, + hit: 0.6, + attackDelay: 2, + health: 40, + loot: { + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + }, + 'teeth': { + min: 2, + max: 2, + chance: 1 + }, + 'steel': { + min: 1, + max: 3, + chance: 0.6 + }, + 'scales': { + min: 2, + max: 3, + chance: 0.1 + } + }, + buttons: { + 'continue': { + text: 'continue', + nextScene: 'end14' + } + } + }, + + 'd11': { + notification: 'as soon as the door is open a little bit, hundreds of tentacles erupt.', + combat: true, + enemy: 'tentacles', + plural: true, + char: 'TTT', + damage: 2, + hit: 0.6, + attackDelay: 0.5, + health: 60, + loot: { + 'meat': { + min: 10, + max: 20, + chance: 1 + } + }, + buttons: { + 'continue': { + text: 'continue', + nextScene: 'end13' + } + } + }, 'end1': { text: [ @@ -2020,6 +2401,11 @@ Events.Setpieces = { min: 1, max: 5, chance: 0.8 + }, + 'medicine': { + min: 1, + max: 4, + chance: 0.1 } }, buttons: { @@ -2173,7 +2559,262 @@ Events.Setpieces = { nextScene: 'end' } } - } + }, + + 'end10': { + text: [ + 'the stench of rot and death fills the operating theatres.', + "a few items are scattered on the ground.", + 'there is nothing else here.' + ], + onLoad: function() { + World.clearDungeon(); + State.cityCleared = true; + }, + loot: { + 'energy cell': { + min: 1, + max: 1, + chance: 0.3 + }, + 'medicine': { + min: 1, + max: 5, + chance: 0.3 + }, + 'teeth': { + min: 3, + max: 8, + chance: 1 + }, + 'scales': { + min: 4, + max: 7, + chance: 0.9 + } + }, + buttons: { + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'end11': { + text: [ + 'at the end of a hallway you find a pristine medicine cabinet.', + "the rest of the hospital is empty." + ], + onLoad: function() { + World.clearDungeon(); + State.cityCleared = true; + }, + loot: { + 'energy cell': { + min: 1, + max: 1, + chance: 0.2 + }, + 'medicine': { + min: 3, + max: 10, + chance: 1 + }, + 'teeth': { + min: 1, + max: 2, + chance: 0.2 + } + }, + buttons: { + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'end12': { + text: [ + 'someone had been stockpiling loot here.' + ], + onLoad: function() { + World.clearDungeon(); + State.cityCleared = true; + }, + loot: { + 'energy cell': { + min: 1, + max: 3, + chance: 0.2 + }, + 'medicine': { + min: 3, + max: 10, + chance: 0.5 + }, + 'bullets': { + min: 2, + max: 8, + chance: 1 + }, + 'torch': { + min: 1, + max: 3, + chance: 0.5 + }, + 'grenade': { + min: 1, + max: 1, + chance: 0.5 + }, + 'alien alloy': { + min: 1, + max: 2, + chance: 0.8 + } + }, + buttons: { + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'end13': { + text: [ + 'the tentacular horror is defeated.', + 'you wade into the operating theatre.', + 'the remains of its victims are everywhere.' + ], + onLoad: function() { + World.clearDungeon(); + State.cityCleared = true; + }, + loot: { + 'steel sword': { + min: 1, + max: 3, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 2, + chance: 0.3 + }, + 'teeth': { + min: 2, + max: 8, + chance: 1 + }, + 'cloth': { + min: 3, + max: 6, + chance: 0.5 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.1 + } + }, + buttons: { + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'end14': { + text: [ + 'the warped man lies dead.', + 'you examine the operating theatre.', + 'a lot of curious equipment.' + ], + onLoad: function() { + World.clearDungeon(); + State.cityCleared = true; + }, + loot: { + 'energy cell': { + min: 2, + max: 5, + chance: 0.8 + }, + 'medicine': { + min: 3, + max: 12, + chance: 1 + }, + 'cloth': { + min: 1, + max: 3, + chance: 0.5 + }, + 'steel': { + min: 2, + max: 3, + chance: 0.3 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.3 + } + }, + buttons: { + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, + + 'end15': { + text: [ + 'the old man had a small cache of interesting items.' + ], + onLoad: function() { + World.clearDungeon(); + State.cityCleared = true; + }, + loot: { + 'alien alloy': { + min: 1, + max: 1, + chance: 0.8 + }, + 'medicine': { + min: 1, + max: 4, + chance: 1 + }, + 'cured meat': { + min: 3, + max: 7, + chance: 1 + }, + 'bolas': { + min: 1, + max: 3, + chance: 0.5 + }, + 'fur': { + min: 1, + max: 5, + chance: 0.8 + } + }, + buttons: { + 'leave': { + text: 'leave city', + nextScene: 'end' + } + } + }, } }, "house": { /* Abandoned House */ @@ -2188,7 +2829,7 @@ Events.Setpieces = { buttons: { 'enter': { text: 'go inside', - nextScene: { 0.5: 'supplies', 1: 'occupied' } + nextScene: { 0.25: 'medicine', 0.5: 'supplies', 1: 'occupied' } }, 'leave': { text: 'leave', @@ -2230,6 +2871,28 @@ Events.Setpieces = { } } }, + 'supplies': { + text: [ + 'the house has been ransacked.' + 'but there is a cache of medicine under the floorboards.', + ], + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + }, + loot: { + 'medicine': { + min: 2, + max: 5, + chance: 1 + } + }, + buttons: { + 'leave': { + text: 'leave', + nextScene: 'end' + } + } + }, 'occupied': { combat: true, enemy: 'squatter', diff --git a/script/room.js b/script/room.js index 6b2e27f..d77c1a8 100644 --- a/script/room.js +++ b/script/room.js @@ -349,6 +349,14 @@ var Room = { } } }, + 'medicine': { + type: 'good', + cost: function() { + return { + 'scales': 50, 'teeth': 30 + } + } + }, 'bullets': { type: 'good', cost: function() { diff --git a/script/world.js b/script/world.js index 46f1a5b..9c74d80 100644 --- a/script/world.js +++ b/script/world.js @@ -31,7 +31,8 @@ var World = { FIGHT_CHANCE: 0.20, BASE_HEALTH: 10, BASE_HIT_CHANCE: 0.8, - MEAT_HEAL: 10, + MEAT_HEAL: 8, + MEDS_HEAL: 20, FIGHT_DELAY: 3, // At least three moves between fights NORTH: [ 0, -1], SOUTH: [ 0, 1], @@ -447,6 +448,10 @@ var World = { return World.MEAT_HEAL * (Engine.hasPerk('gastronome') ? 2 : 1); }, + medsHeal: function() { + return World.MEDS_HEAL; + }, + checkFight: function() { World.fightMove = typeof World.fightMove == 'number' ? World.fightMove : 0; World.fightMove++;