Merge pull request #1 from doublespeakgames/master

Update fork to latest head
This commit is contained in:
Esa Koskinen
2017-01-20 11:27:24 +02:00
committed by GitHub
43 changed files with 32183 additions and 24659 deletions
+1
View File
@@ -2,3 +2,4 @@
*.TODO
*.mo
*.swp
.idea
-17
View File
@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>A Dark Room</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>
+3 -3
View File
@@ -563,12 +563,12 @@ body.noMask #description {
#lootButtons {
padding-bottom: 0px !important;
margin: 20px 0 0 5px;
margin: 20px 0 5px 0;
position: relative;
}
#lootButtons:before {
content: "take:";
content: attr(data-legend);
position: absolute;
top: -25px;
left: 0px;
@@ -586,7 +586,7 @@ body.noMask #description {
}
#dropMenu:before {
content: "drop:";
content: attr(data-legend);
border-bottom: 1px solid black;
display: block;
margin-bottom: 5px;
BIN
View File
Binary file not shown.
+1 -1
View File
File diff suppressed because one or more lines are too long
+50 -51
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2015-08-18 21:53+0200\n"
"PO-Revision-Date: 2015-08-18 22:09+0200\n"
"POT-Creation-Date: 2016-02-15 02:03+0100\n"
"PO-Revision-Date: 2016-02-15 02:03+0100\n"
"Last-Translator: Bernd Dorer <bdorer@mailbox.org>\n"
"Language-Team: German\n"
"Language: de\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.4\n"
"X-Generator: Poedit 1.7.6\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-Basepath: ../..\n"
"X-Poedit-SearchPath-0: .\n"
@@ -35,7 +35,7 @@ msgid "connect"
msgstr "verbinden"
#: script/dropbox.js:75 script/dropbox.js:107 script/dropbox.js:133
#: script/dropbox.js:163 script/engine.js:285 script/engine.js:330
#: script/dropbox.js:163 script/engine.js:285 script/engine.js:331
msgid "cancel"
msgstr "abbrechen"
@@ -100,7 +100,6 @@ msgid "punches do more damage"
msgstr "faustschläge verursachen mehr schaden"
# more force
#. TRANSLATORS : means with more force.
#: script/engine.js:18
msgid "learned to throw punches with purpose"
msgstr "gelernt kraftvolle schläge auszuteilen"
@@ -118,7 +117,6 @@ msgid "learned to fight quite effectively without weapons"
msgstr "gelernt effizienter ohne Waffen zu kämpfen"
# unarmed master = master of unarmed combat.
#. TRANSLATORS : master of unarmed combat
#: script/engine.js:27
msgid "unarmed master"
msgstr "nahkampfmeister"
@@ -228,34 +226,34 @@ msgstr "erlange mehr gesundheit durch nahrung"
msgid "learned to make the most of food"
msgstr "gelernt besser mit essen aus zu kommen"
#: script/engine.js:138 script/engine.js:483
#: script/engine.js:138 script/space.js:450
msgid "app store."
msgstr "app store."
#: script/engine.js:144 script/engine.js:485
msgid "lights off."
msgstr "licht aus."
#: script/engine.js:144 script/engine.js:493
#: script/engine.js:150 script/engine.js:521
msgid "hyper."
msgstr "hyper."
#: script/engine.js:150 script/space.js:442
#: script/engine.js:156 script/space.js:442
msgid "restart."
msgstr "neu starten."
#: script/engine.js:156
#: script/engine.js:162
msgid "share."
msgstr "teilen."
#: script/engine.js:162
#: script/engine.js:168
msgid "save."
msgstr "speichern."
#: script/engine.js:171
#: script/engine.js:177
msgid "dropbox."
msgstr "dropbox."
#: script/engine.js:178
msgid "app store."
msgstr "app store."
#: script/engine.js:184
msgid "github."
msgstr "github."
@@ -276,7 +274,7 @@ msgstr "oder zum wechseln von computern"
msgid "export"
msgstr "export"
#: script/engine.js:281 script/engine.js:325
#: script/engine.js:281 script/engine.js:326
msgid "import"
msgstr "import"
@@ -284,79 +282,88 @@ msgstr "import"
msgid "save this."
msgstr "speichere das."
#: script/engine.js:296
#: script/engine.js:297
msgid "got it"
msgstr "habe verstanden"
#: script/engine.js:304
#: script/engine.js:305
msgid "are you sure?"
msgstr "bist du sicher?"
#: script/engine.js:305
#: script/engine.js:306
msgid "if the code is invalid, all data will be lost."
msgstr "wenn der code nicht stimmt, werden alle informationen verloren gehen."
#: script/engine.js:306
#: script/engine.js:307
msgid "this is irreversible."
msgstr "dies ist nicht umkehrbar."
#: script/engine.js:310 script/engine.js:378
#: script/engine.js:311 script/engine.js:380 script/engine.js:499
msgid "yes"
msgstr "ja"
#: script/engine.js:315 script/engine.js:383
#: script/engine.js:316 script/engine.js:385 script/engine.js:504
msgid "no"
msgstr "nein"
#: script/engine.js:321
#: script/engine.js:322
msgid "put the save code here."
msgstr "lege den speichercode hier ab."
#: script/engine.js:372
#: script/engine.js:374
msgid "Restart?"
msgstr "neu starten?"
#: script/engine.js:375
#: script/engine.js:377
msgid "restart the game?"
msgstr "das spiel neu starten?"
#: script/engine.js:406
#: script/engine.js:408
msgid "Share"
msgstr "Teilen"
#: script/engine.js:409
#: script/engine.js:411
msgid "bring your friends."
msgstr "bringe deine freunde mit."
#: script/engine.js:412
#: script/engine.js:414
msgid "facebook"
msgstr "facebook"
#: script/engine.js:419
#: script/engine.js:421
msgid "google+"
msgstr "google+"
#: script/engine.js:426
#: script/engine.js:428
msgid "twitter"
msgstr "twitter"
#: script/engine.js:433
#: script/engine.js:435
msgid "reddit"
msgstr "reddit"
#: script/engine.js:440
#: script/engine.js:442
msgid "close"
msgstr "schließen"
#: script/engine.js:474 script/engine.js:478
#: script/engine.js:476 script/engine.js:480
msgid "lights on."
msgstr "licht an."
#: script/engine.js:491
#: script/engine.js:493
msgid "Go Hyper?"
msgstr ""
#: script/engine.js:496
msgid ""
"turning hyper mode speeds up the game to x2 speed. do you want to do that?"
msgstr ""
#: script/engine.js:519
msgid "classic."
msgstr "Klassisch."
#: script/engine.js:592
#: script/engine.js:620
msgid "{0} per {1}s"
msgstr "{0} per {1}s"
@@ -421,7 +428,6 @@ msgstr "Alle"
msgid "take everything"
msgstr "nimm alles"
#. TRANSLATORS : Mind the whitespaces at the beginning and end.
#: script/events.js:653 script/outside.js:627
msgid " and "
msgstr " und "
@@ -912,12 +918,13 @@ msgid "the old compass is dented and dusty, but it looks to work."
msgstr ""
"der alte kompass ist verbeult und rostig aber er scheint zu funktionieren."
#: script/events/room.js:45 script/events/room.js:227 script/events/room.js:240
#: script/events/room.js:253 script/events/room.js:309
#: script/events/room.js:332 script/events/room.js:388
#: script/events/room.js:411 script/events/room.js:450
#: script/events/room.js:568 script/events/room.js:584
#: script/events/room.js:600 script/events/room.js:611
#: script/events/room.js:45 script/events/room.js:227
#: script/events/room.js:240 script/events/room.js:253
#: script/events/room.js:309 script/events/room.js:332
#: script/events/room.js:388 script/events/room.js:411
#: script/events/room.js:450 script/events/room.js:568
#: script/events/room.js:584 script/events/room.js:600
#: script/events/room.js:611
msgid "say goodbye"
msgstr "verabschiede dich"
@@ -1372,7 +1379,6 @@ msgid "rot's been to work on it, and some of the pieces are missing."
msgstr "verwesung hat eingesetzt. einige teile fehlen."
# 'it' is a wanderer corpse
#. TRANSLATORS : 'it' is a rotting wanderer's body
#: script/events/setpieces.js:202
msgid "can't tell what left it here."
msgstr "schwer zu sagen was ihn hier zurückgelassen hat."
@@ -1771,7 +1777,6 @@ msgid "looks like a camp of sorts up ahead."
msgstr "sieht dort vorn nach einer art lager aus."
# a chainlink fence
#. TRANSLATORS : chainlink is a type of metal fence.
#: script/events/setpieces.js:1677
msgid "rusted chainlink is pulled across an alleyway."
msgstr "rostiger drahtzaun liegt in der gasse."
@@ -1797,7 +1802,6 @@ msgid "the street ahead glows with firelight."
msgstr "die straßen glühen rot im feuer."
# define squatter
#. TRANSLATORS : squatters occupy abandoned dwellings they don't own.
#: script/events/setpieces.js:1729
msgid "more squatters are crowding around now."
msgstr "mehr hausbesetzer sammeln sich jetzt."
@@ -1909,7 +1913,6 @@ msgid "scavengers must have gotten to this place already."
msgstr "plünderer waren wohl schon hier."
# part of the subway?
#. TRANSLATORS : a platform in the subway
#: script/events/setpieces.js:2403
msgid "the tunnel opens up at another platform."
msgstr "der tunnel öffnet sich an einer anderen haltestelle."
@@ -2029,7 +2032,6 @@ msgid "inside, the remains of its victims are everywhere."
msgstr "innen liegen die überreste seiner opfer verstreut."
# extremly disfigured
#. TRANSLATORS : warped means extremely disfigured.
#: script/events/setpieces.js:2845
msgid "the warped man lies dead."
msgstr "der entstellte mann liegt tot am boden."
@@ -2271,7 +2273,6 @@ msgid "charred bodies litter the ground."
msgstr "verkohlte leichen bedecken den boden."
# afterburner: a engine
#. TRANSLATORS : tang = strong metallic smell, wanderer afterburner = ship's engines
#: script/events/setpieces.js:3532
msgid "the metallic tang of wanderer afterburner hangs in the air."
msgstr "der metallische geruch eines wanderer-nachbrenners hängt in der luft."
@@ -2591,7 +2592,6 @@ msgid "the town's booming. word does get around."
msgstr "die stadt wächst. gerüchte verbreiten sich doch."
# short for population.
#. TRANSLATORS : pop is short for population.
#: script/outside.js:452
msgid "pop "
msgstr "volk "
@@ -2636,7 +2636,6 @@ msgstr "der himmel ist grau und der wind heult erbarmungslos"
msgid "dry brush and dead branches litter the forest floor"
msgstr "trockenes gestrüpp und herabgefallene äste bedecken den waldboden"
#. TRANSLATORS : Mind the whitespace at the end.
#: script/outside.js:621
msgid "the traps contain "
msgstr "die fallen beinhalten "
+875 -790
View File
File diff suppressed because it is too large Load Diff
+1839 -1748
View File
File diff suppressed because it is too large Load Diff
+16 -1
View File
@@ -1,3 +1,18 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
.eventPanel .button {width: 122px !important;}
#lootButtons:before {
content: "prendre :" !important;
}
#dropMenu:before {
content: "déposer :" !important;
}
#hullRow {
width: 80px !important;
}
div#workers {
width: 160px !important;
}
div.button div.tooltip {
width: 120px !important;
}
+1 -1
View File
File diff suppressed because one or more lines are too long
+2935 -1941
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
+875 -789
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
File diff suppressed because one or more lines are too long
+863 -788
View File
File diff suppressed because it is too large Load Diff
+925 -807
View File
File diff suppressed because it is too large Load Diff
+15 -6
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2015-12-10 10:23+0900\n"
"PO-Revision-Date: 2015-05-21 05:35+0900\n"
"POT-Creation-Date: 2015-12-22 13:35-0600\n"
"PO-Revision-Date: 2016-02-15 02:05+0100\n"
"Last-Translator: Jeong YunWon <adarkroom@youknowone.org>\n"
"Language-Team: \n"
"Language: ko\n"
@@ -228,7 +228,7 @@ msgstr "앱 스토어."
msgid "lights off."
msgstr "어둡게."
#: script/engine.js:150 script/engine.js:495
#: script/engine.js:150 script/engine.js:521
msgid "hyper."
msgstr "하이퍼."
@@ -292,11 +292,11 @@ msgstr "입력하신 코드가 정확하지 않으면, 모든 데이터가 사
msgid "this is irreversible."
msgstr "이것은 되돌릴 수 없습니다."
#: script/engine.js:311 script/engine.js:380
#: script/engine.js:311 script/engine.js:380 script/engine.js:499
msgid "yes"
msgstr "네"
#: script/engine.js:316 script/engine.js:385
#: script/engine.js:316 script/engine.js:385 script/engine.js:504
msgid "no"
msgstr "아니오"
@@ -345,10 +345,19 @@ msgid "lights on."
msgstr "밝게."
#: script/engine.js:493
msgid "Go Hyper?"
msgstr ""
#: script/engine.js:496
msgid ""
"turning hyper mode speeds up the game to x2 speed. do you want to do that?"
msgstr ""
#: script/engine.js:519
msgid "classic."
msgstr "클래식."
#: script/engine.js:594
#: script/engine.js:620
msgid "{0} per {1}s"
msgstr "{1}초 당 {0}개"
+926 -798
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
+1 -1
View File
File diff suppressed because one or more lines are too long
+1824 -1587
View File
File diff suppressed because it is too large Load Diff
+934 -798
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+1096 -1076
View File
File diff suppressed because it is too large Load Diff
+2871 -2493
View File
File diff suppressed because it is too large Load Diff
+2867 -1873
View File
File diff suppressed because it is too large Load Diff
+919 -967
View File
File diff suppressed because it is too large Load Diff
+2882 -1902
View File
File diff suppressed because it is too large Load Diff
+2872 -1857
View File
File diff suppressed because it is too large Load Diff
+925 -798
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+2462 -1528
View File
File diff suppressed because it is too large Load Diff
+2829 -1857
View File
File diff suppressed because it is too large Load Diff
+44 -20
View File
@@ -1,34 +1,58 @@
<!doctype html>
<html>
<head>
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<title>A Dark Room</title>
<style>
body {
background-color: #000000;
color: #FFFFFF;
background-color: #000000;
color: #FFFFFF;
line-height: 1.5;
font-size: 22px;
display: flex;
flex-direction: column;
justify-content: center;
}
a {
color: #FFFFFF;
color: #FFFFFF;
}
p {
margin: 10px 20px;
text-align: center;
}
.logo {
width: 100%;
}
.store {
width: 90%;
}
.storeLink {
text-align: center;
}
div {
width: 100%;
margin: auto;
text-align: center;
margin-top: 20px;
}
div {
width: 960px;
margin: auto;
text-align: center;
margin-top: 20px;
}
</style>
</head>
<body>
<center>
<img src="img/Logo1.jpg" />
<div>
<strong>
A Dark Room isn't really mobile-friendly, and it requires arrow keys.<br/>
Sorry about that!<br/>
</strong><br/>
Of course you can <a href='index.html?ignorebrowser=true'>play anyway</a>, but it probably won't work!<br/><br/>
A Dark Room is now native on iOS! Get it on the <a href="https://itunes.apple.com/app/apple-store/id736683061?pt=2073437&ct=mobilesplash&mt=8">App Store</a>.
</div>
</center>
<img class="logo" src="img/Logo1.jpg" />
<p>
A Dark Room isn't mobile-friendly, and it requires arrow keys.
<br>
Sorry about that!
</p>
<p>
There are native apps, though! Get them now!
</p>
<a class="storeLink" href="https://itunes.apple.com/app/apple-store/id736683061?pt=2073437&ct=mobilesplash&mt=8">
<img class="store" src="http://i.imgur.com/DMdnDYq.png" alt="App Store">
</a>
<a class="storeLink" href = "https://play.google.com/store/apps/details?id=com.yourcompany.adarkroom&hl=en">
<img class="store" src="http://i.imgur.com/bLWWj4r.png" alt="Google Play">
</a>
</body>
</html>
+3
View File
@@ -70,6 +70,9 @@ var Button = {
var cd = btn.data("cooldown");
var id = 'cooldown.'+ btn.attr('id');
if(cd > 0) {
if(typeof option == 'number') {
cd = option;
}
// param "start" takes value from cooldown time if not specified
var start, left;
switch(option){
+2 -4
View File
@@ -577,10 +577,6 @@
stores.animate({right: -(panelIndex * 700) + 'px'}, 300 * diff);
}
Engine.activeModule = module;
module.onArrival(diff);
if(Engine.activeModule == Room || Engine.activeModule == Path) {
// Don't fade out the weapons if we're switching to a module
// where we're going to keep showing them anyway.
@@ -593,6 +589,8 @@
$('div#weapons').animate({opacity: 1}, 300);
}
Engine.activeModule = module;
module.onArrival(diff);
Notifications.printQueue(module);
}
+209 -118
View File
@@ -72,20 +72,36 @@ var Events = {
startCombat: function(scene) {
Engine.event('game event', 'combat');
Events.won = false;
Events.fought = false;
var desc = $('#description', Events.eventPanel());
$('<div>').text(scene.notification).appendTo(desc);
// Draw the wanderer
Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(desc);
// Draw pause button
/* Disable for now, because it doesn't work and looks weird
var pauseBox = $('<div>').attr('id', 'pauseButton').appendTo(desc);
var pause = new Button.Button({
id: 'pause',
text: '',
cooldown: Events._PAUSE_COOLDOWN,
click: Events.togglePause
}).appendTo(pauseBox);
$('<span>').addClass('text').insertBefore(pause.children('.cooldown'));
$('<div>').addClass('clear').appendTo(pauseBox);
Events.setPause(pause, 'set');
Events.removePause(pause, 'set');
*/
var fightBox = $('<div>').attr('id', 'fight').appendTo(desc);
// Draw the wanderer
Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(fightBox);
// Draw the enemy
Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(desc);
Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(fightBox);
// Draw the action buttons
var btns = $('#buttons', Events.eventPanel());
var attackBtns = $('<div>').appendTo(btns).attr('id','attackButtons');
var numWeapons = 0;
for(var k in World.Weapons) {
var weapon = World.Weapons[k];
@@ -103,21 +119,105 @@ var Events = {
}
}
numWeapons++;
Events.createAttackButton(k).appendTo(btns);
Events.createAttackButton(k).appendTo(attackBtns);
}
}
if(numWeapons === 0) {
// No weapons? You can punch stuff!
Events.createAttackButton('fists').prependTo(btns);
Events.createAttackButton('fists').prependTo(attackBtns);
}
$('<div>').addClass('clear').appendTo(attackBtns);
Events.createEatMeatButton().appendTo(btns);
var healBtns = $('<div>').appendTo(btns).attr('id','healButtons');
Events.createEatMeatButton().appendTo(healBtns);
if((Path.outfit['medicine'] || 0) !== 0) {
Events.createUseMedsButton().appendTo(btns);
Events.createUseMedsButton().appendTo(healBtns);
}
$('<div>').addClass('clear').appendTo(healBtns);
Events.setHeal(healBtns);
// Set up the enemy attack timer
Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000);
Events._enemyAttackTimer = Engine.setInterval(Events.enemyAttack, scene.attackDelay * 1000);
},
setPause: function(btn, state){
if(!btn) {
btn = $('#pause');
}
var event = btn.closest('#event');
var string, log;
if(state == 'set') {
string = 'start.';
log = 'loaded';
} else {
string = 'resume.';
log = 'paused';
}
btn.children('.text').first().text( _(string) )
Events.paused = (state == 'auto') ? 'auto' : true;
event.addClass('paused');
Button.clearCooldown(btn);
$('#buttons').find('.button').each(function(i){
if($(this).data('onCooldown')){
$(this).children('.cooldown').stop(true,false);
}
});
Engine.log('fight '+ log +'.');
},
removePause: function(btn, state){
if(!btn) {
btn = $('#pause');
}
var event = btn.closest('#event');
var log, time, target;
if(state == 'auto' && Events.paused != 'auto') {
return;
}
switch(state){
case 'set':
Button.cooldown(btn, Events._LEAVE_COOLDOWN);
log = 'started';
time = Events._LEAVE_COOLDOWN * 1000;
target = $();
break;
case 'end':
Button.setDisabled(btn, true);
log = 'ended';
time = Events._FIGHT_SPEED;
target = $();
break;
case 'auto':
Button.cooldown(btn);
default:
log = 'resumed';
time = Events._PAUSE_COOLDOWN * 1000;
target = $('#buttons').find('.button');
break;
}
Engine.setTimeout(function(){
btn.children('.text').first().text( _('pause.') );
Events.paused = false;
event.removeClass('paused');
target.each(function(i){
if($(this).data('onCooldown')){
Button.cooldown($(this), 'pause');
}
});
Engine.log('Event '+ log);
}, time);
},
togglePause: function(btn, auto){
if(!btn) {
btn = $('#pause');
}
if((auto) && (document.hasFocus() == !Events.paused)) {
return;
}
var f = (Events.paused) ? Events.removePause : Events.setPause;
var state = (auto) ? 'auto' : false;
f(btn, state);
},
createEatMeatButton: function(cooldown) {
@@ -201,52 +301,48 @@ var Events = {
});
},
eatMeat: function() {
if(Path.outfit['cured meat'] > 0) {
Path.outfit['cured meat']--;
setHeal: function(healBtns) {
if(!healBtns){
healBtns = $('#healButtons');
}
healBtns = healBtns.children('.button');
var canHeal = (World.health < World.getMaxHealth());
healBtns.each(function(i){
Button.setDisabled($(this), !canHeal);
});
return canHeal;
},
doHeal: function(healing, cured, btn) {
if(Path.outfit[healing] > 0) {
Path.outfit[healing]--;
World.updateSupplies();
if(Path.outfit['cured meat'] === 0) {
Button.setDisabled($('#eat'), true);
if(Path.outfit[healing] === 0) {
Button.setDisabled(btn, true);
}
var hp = World.health;
hp += World.meatHeal();
hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp;
var hp = World.health + cured;
hp = Math.min(World.getMaxHealth(),hp);
World.setHp(hp);
Events.setHeal();
if(Events.activeEvent()) {
var w = $('#wanderer');
w.data('hp', hp);
Events.updateFighterDiv(w);
Events.drawFloatText('+' + World.meatHeal(), '#wanderer .hp');
Events.drawFloatText('+' + cured, '#wanderer .hp');
var takeETbutton = Events.setTakeAll();
Events.canLeave(takeETbutton);
}
}
},
useMeds: function() {
if(Path.outfit['medicine'] > 0) {
Path.outfit['medicine']--;
World.updateSupplies();
if(Path.outfit['medicine'] === 0) {
Button.setDisabled($('#meds'), true);
}
eatMeat: function(btn) {
Events.doHeal('cured meat', World.meatHeal(), btn);
},
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');
var takeETbutton = Events.setTakeAll();
Events.canLeave(takeETbutton);
}
}
useMeds: function(btn) {
Events.doHeal('medicine', World.medsHeal(), btn);
},
useWeapon: function(btn) {
@@ -330,6 +426,33 @@ var Events = {
}
},
damage: function(fighter, enemy, dmg) {
var enemyHp = enemy.data('hp');
var msg = "";
if(typeof dmg == 'number') {
if(dmg < 0) {
msg = _('miss');
dmg = 0;
} else {
msg = '-' + dmg;
enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg);
enemy.data('hp', enemyHp);
if(fighter.attr('id') == 'enemy') {
World.setHp(enemyHp);
Events.setHeal();
}
Events.updateFighterDiv(enemy);
}
} else {
if(dmg == 'stun') {
msg = _('stunned');
enemy.data('stunned', Events.STUN_DURATION);
}
}
Events.drawFloatText(msg, $('.hp', enemy));
},
animateMelee: function(fighter, dmg, callback) {
var start, end, enemy;
if(fighter.attr('id') == 'wanderer') {
@@ -343,32 +466,8 @@ var Events = {
}
fighter.stop(true, true).animate(start, Events._FIGHT_SPEED, function() {
var enemyHp = enemy.data('hp');
var msg = "";
if(typeof dmg == 'number') {
if(dmg < 0) {
msg = _('miss');
dmg = 0;
} else {
msg = '-' + dmg;
enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg);
enemy.data('hp', enemyHp);
if(fighter.attr('id') == 'enemy') {
World.setHp(enemyHp);
}
Events.updateFighterDiv(enemy);
}
} else {
if(dmg == 'stun') {
msg = _('stunned');
enemy.data('stunned', true);
Engine.setTimeout(function() {
enemy.data('stunned', false);
}, Events.STUN_DURATION);
}
}
Events.drawFloatText(msg, $('.hp', enemy));
Events.damage(fighter, enemy, dmg);
$(this).animate(end, Events._FIGHT_SPEED, callback);
});
@@ -387,33 +486,9 @@ var Events = {
}
$('<div>').css(start).addClass('bullet').text('o').appendTo('#description')
.animate(end, Events._FIGHT_SPEED * 2, 'linear', function() {
var enemyHp = enemy.data('hp');
var msg = "";
if(typeof dmg == 'number') {
if(dmg < 0) {
msg = _('miss');
dmg = 0;
} else {
msg = '-' + dmg;
enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg);
enemy.data('hp', enemyHp);
if(fighter.attr('id') == 'enemy') {
World.setHp(enemyHp);
}
Events.updateFighterDiv(enemy);
}
} else {
if(dmg == 'stun') {
msg = _('stunned');
enemy.data('stunned', true);
Engine.setTimeout(function() {
enemy.data('stunned', false);
}, Events.STUN_DURATION);
}
}
.animate(end, Events._FIGHT_SPEED * 2, 'linear', function() {
Events.drawFloatText(msg, $('.hp', enemy));
Events.damage(fighter, enemy, dmg);
$(this).remove();
if(typeof callback == 'function') {
@@ -423,6 +498,7 @@ var Events = {
},
enemyAttack: function() {
// Events.togglePause($('#pause'),'auto');
var scene = Events.activeEvent().scenes[Events.activeScene];
@@ -445,16 +521,22 @@ var Events = {
}
});
}
},
Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000);
endFight: function() {
Events.fought = true;
clearTimeout(Events._enemyAttackTimer);
Events.removePause($('#pause'), 'end');
},
winFight: function() {
Events.won = true;
clearTimeout(Events._enemyAttackTimer);
$('#enemy').animate({opacity: 0}, 300, 'linear', function() {
Engine.setTimeout(function() {
try {
Engine.setTimeout(function() {
if(Events.fought) {
return;
}
Events.endFight();
$('#enemy').animate({opacity: 0}, 300, 'linear', function() {
Engine.setTimeout(function() {
var scene = Events.activeEvent().scenes[Events.activeScene];
var leaveBtn = false;
var desc = $('#description', Events.eventPanel());
@@ -465,6 +547,7 @@ var Events = {
var takeETbtn = Events.drawLoot(scene.loot);
var exitBtns = $('<div>').appendTo(btns).attr('id','exitButtons');
if(scene.buttons) {
// Draw the buttons
leaveBtn = Events.drawButtons(scene);
@@ -481,19 +564,28 @@ var Events = {
},
text: _('leave')
});
Button.cooldown(leaveBtn.appendTo(btns));
Button.cooldown(leaveBtn.appendTo(exitBtns));
Events.createEatMeatButton(0).appendTo(btns);
var healBtns = $('<div>').appendTo(btns).attr('id','healButtons');
Events.createEatMeatButton(0).appendTo(healBtns);
if((Path.outfit['medicine'] || 0) !== 0) {
Events.createUseMedsButton(0).appendTo(btns);
Events.createUseMedsButton(0).appendTo(healBtns);
}
$('<div>').addClass('clear').appendTo(healBtns);
Events.setHeal(healBtns);
}
$('<div>').addClass('clear').appendTo(exitBtns);
Events.allowLeave(takeETbtn, leaveBtn);
} catch(e) {
// It is possible to die and win if the timing is perfect. Just let it fail.
}
}, 1000, true);
});
}, 1000, true);
});
}, Events._FIGHT_SPEED);
},
loseFight: function(){
Events.endFight();
Events.endEvent();
World.die();
},
drawDrop:function(btn) {
@@ -604,7 +696,9 @@ var Events = {
},
setTakeAll: function(lootButtons){
var lootButtons = lootButtons || $('#lootButtons');
if(!lootButtons) {
lootButtons = $('#lootButtons');
}
var canTakeSomething = false;
var free = Path.getFreeSpace();
var takeETbutton = lootButtons.find('#loot_takeEverything');
@@ -628,11 +722,7 @@ var Events = {
takeAll.children('span').first().text(_('all'));
}
});
if(canTakeSomething){
takeETbutton.removeClass('disabled');
} else {
takeETbutton.addClass('disabled');
}
Button.setDisabled(takeETbutton, !canTakeSomething);
takeETbutton.data('canTakeEverything', (free >= 0) ? true : false);
return takeETbutton;
},
@@ -647,18 +737,16 @@ var Events = {
},
canLeave: function(btn){
var basetext = _('take everything');
var basetext = (btn.data('canTakeEverything')) ? _('take everything') : _('take all you can');
var textbox = btn.children('span');
var takeAndLeave = (btn.data('leaveBtn')) ? btn.data('canTakeEverything') : false;
var text = _(basetext);
if(takeAndLeave){
var verb = btn.data('leaveBtn').text() || _('leave');
textbox.text( basetext + _(' and ') + verb);
btn.data('canLeave', true);
Button.cooldown(btn);
} else {
textbox.text( basetext );
btn.data('canLeave', false)
text += _(' and ') + btn.data('leaveBtn').text();
}
textbox.text( text );
btn.data('canLeave', takeAndLeave);
},
dropStuff: function(e) {
@@ -774,13 +862,16 @@ var Events = {
}
// Draw the buttons
var exitBtns = $('<div>').attr('id','exitButtons').appendTo($('#buttons', Events.eventPanel()));
leaveBtn = Events.drawButtons(scene);
$('<div>').addClass('clear').appendTo(exitBtns);
Events.allowLeave(takeETbtn, leaveBtn);
},
drawButtons: function(scene) {
var btns = $('#buttons', Events.eventPanel());
var btns = $('#exitButtons', Events.eventPanel());
var btnsList = [];
for(var id in scene.buttons) {
var info = scene.buttons[id];
+1 -1
View File
@@ -68,7 +68,7 @@ Events.Outside = [
{ /* Hut fire */
title: _('Fire'),
isAvailable: function() {
return Engine.activeModule == Outside && $SM.get('game.buildings["hut"]', true) > 0 && $SM.get('game.population', true) > 5;
return Engine.activeModule == Outside && $SM.get('game.buildings["hut"]', true) > 0 && $SM.get('game.population', true) > 50;
},
scenes: {
'start': {
+3
View File
@@ -433,6 +433,9 @@ Events.Room = [
'buyMap': {
text: _('buy map'),
cost: { 'fur': 200, 'scales': 10 },
available: function() {
return !World.seenAll;
},
notification: _('the map uncovers a bit of the world'),
onChoose: World.applyMap
},
+39 -24
View File
@@ -157,20 +157,19 @@ var Path = {
$('.row_val', wRow).text(World.getMaxWater());
}
var space = Path.getFreeSpace();
var total = 0;
var currentBagCapacity = 0;
// Add the non-craftables to the craftables
var carryable = $.extend({
'cured meat': { type: 'tool' },
'bullets': { type: 'tool' },
'cured meat': { type: 'tool', desc: 'restores '+ World.MEAT_HEAL + ' hp' },
'bullets': { type: 'tool', desc: 'use with rifle' },
'grenade': {type: 'weapon' },
'bolas': {type: 'weapon' },
'laser rifle': {type: 'weapon' },
'energy cell': {type: 'tool' },
'energy cell': {type: 'tool', desc: 'use with laser rifle' },
'bayonet': {type: 'weapon' },
'charm': {type: 'tool'},
'medicine': {type: 'tool'}
'medicine': {type: 'tool', desc: 'restores ' + World.MEDS_HEAL + ' hp' }
}, Room.Craftables);
for(var k in carryable) {
@@ -179,13 +178,16 @@ var Path = {
var have = $SM.get('stores["'+k+'"]');
var num = Path.outfit[k];
num = typeof num == 'number' ? num : 0;
if (have < num) { num = have; }
var numAvailable = $SM.get('stores["'+k+'"]', true);
if (have !== undefined) {
if (have < num) { num = have; }
$SM.set(k, num, true);
}
var row = $('div#outfit_row_' + k.replace(' ', '-'), outfit);
if((store.type == 'tool' || store.type == 'weapon') && have > 0) {
total += num * Path.getWeight(k);
currentBagCapacity += num * Path.getWeight(k);
if(row.length === 0) {
row = Path.createOutfittingRow(k, num, store.name);
row = Path.createOutfittingRow(k, num, store, store.name);
var curPrev = null;
outfit.children().each(function(i) {
@@ -204,7 +206,7 @@ var Path = {
}
} else {
$('div#' + row.attr('id') + ' > div.row_val > span', outfit).text(num);
$('div#' + row.attr('id') + ' .tooltip .numAvailable', outfit).text(numAvailable - num);
$('div#' + row.attr('id') + ' .tooltip .numAvailable', outfit).text(have - num);
}
if(num === 0) {
$('.dnBtn', row).addClass('disabled');
@@ -213,10 +215,10 @@ var Path = {
$('.dnBtn', row).removeClass('disabled');
$('.dnManyBtn', row).removeClass('disabled');
}
if(num >= numAvailable || space < Path.getWeight(k)) {
if(num == have || space < Path.getWeight(k)) {
$('.upBtn', row).addClass('disabled');
$('.upManyBtn', row).addClass('disabled');
} else if(space >= Path.getWeight(k)) {
} else {
$('.upBtn', row).removeClass('disabled');
$('.upManyBtn', row).removeClass('disabled');
}
@@ -224,21 +226,27 @@ var Path = {
row.remove();
}
}
Path.updateBagSpace(currentBagCapacity);
},
updateBagSpace: function(currentBagCapacity) {
// Update bagspace
$('#bagspace').text(_('free {0}/{1}', Math.floor(Path.getCapacity() - total) , Path.getCapacity()));
$('#bagspace').text(_('free {0}/{1}', Math.floor(Path.getCapacity() - currentBagCapacity) , Path.getCapacity()));
if(Path.outfit['cured meat'] > 0) {
Button.setDisabled($('#embarkButton'), false);
} else {
Button.setDisabled($('#embarkButton'), true);
}
},
createOutfittingRow: function(key, num, name) {
if(!name) name = _(key);
createOutfittingRow: function(key, num, store) {
if(!store.name) store.name = _(key);
var row = $('<div>').attr('id', 'outfit_row_' + key.replace(' ', '-')).addClass('outfitRow').attr('key',key);
$('<div>').addClass('row_key').text(name).appendTo(row);
$('<div>').addClass('row_key').text(store.name).appendTo(row);
var val = $('<div>').addClass('row_val').appendTo(row);
$('<span>').text(num).appendTo(val);
@@ -250,6 +258,14 @@ var Path = {
var numAvailable = $SM.get('stores["'+key+'"]', true);
var tt = $('<div>').addClass('tooltip bottom right').appendTo(row);
if(store.type == 'weapon') {
$('<div>').addClass('row_key').text(_('damage')).appendTo(tt);
$('<div>').addClass('row_val').text(World.getDamage(key)).appendTo(tt);
} else if(store.type == 'tool' && store.desc != "undefined") {
$('<div>').addClass('row_key').text(store.desc).appendTo(tt);
}
$('<div>').addClass('row_key').text(_('weight')).appendTo(tt);
$('<div>').addClass('row_val').text(Path.getWeight(key)).appendTo(tt);
$('<div>').addClass('row_key').text(_('available')).appendTo(tt);
@@ -266,8 +282,7 @@ var Path = {
if(Path.getFreeSpace() >= Path.getWeight(supply) && cur < $SM.get('stores["'+supply+'"]', true)) {
var maxExtraByWeight = Math.floor(Path.getFreeSpace() / Path.getWeight(supply));
var maxExtraByStore = $SM.get('stores["'+supply+'"]', true) - cur;
var maxExtraByBtn = btn.data;
Path.outfit[supply] = cur + Math.min(maxExtraByBtn, Math.min(maxExtraByWeight, maxExtraByStore));
Path.outfit[supply] = cur + Math.min(btn.data, maxExtraByWeight, maxExtraByStore);
$SM.set('outfit['+supply+']', Path.outfit[supply]);
Path.updateOutfitting();
}
@@ -289,7 +304,6 @@ var Path = {
Path.setTitle();
Path.updateOutfitting();
Path.updatePerks(true);
$SM.set('outfit', Path.outfit);
Engine.moveStoresView($('#perks'), transition_diff);
},
@@ -302,7 +316,6 @@ var Path = {
for(var k in Path.outfit) {
$SM.add('stores["'+k+'"]', -Path.outfit[k]);
}
$SM.remove('outfit');
World.onArrival();
$('#outerSlider').animate({left: '-700px'}, 300);
Engine.activeModule = World;
@@ -311,7 +324,9 @@ var Path = {
handleStateUpdates: function(e){
if(e.category == 'character' && e.stateName.indexOf('character.perks') === 0 && Engine.activeModule == Path){
Path.updatePerks();
};
} else if(e.category == 'income' && Engine.activeModule == Path){
Path.updateOutfitting();
}
},
scrollSidebar: function(direction, reset){
+12 -6
View File
@@ -750,7 +750,7 @@ var Room = {
updateStoresView: function() {
var stores = $('div#stores');
var resources = $('div#resources');
var resources = $('div#resources');
var special = $('div#special');
var weapons = $('div#weapons');
var needsAppend = false, rNeedsAppend = false, sNeedsAppend = false, wNeedsAppend = false, newRow = false;
@@ -796,6 +796,9 @@ var Room = {
case 'upgrade':
// Don't display upgrades on the Room screen
continue;
case 'building':
// Don't display buildings either
continue;
case 'weapon':
location = weapons;
break;
@@ -825,7 +828,7 @@ var Room = {
$SM.startThieves();
}
if(row.length === 0 && num > 0) {
if(row.length === 0) {
row = $('<div>').attr('id', id).addClass('storeRow');
$('<div>').addClass('row_key').text(lk).appendTo(row);
$('<div>').addClass('row_val').text(Math.floor(num)).appendTo(row);
@@ -844,7 +847,7 @@ var Room = {
row.insertAfter(location.find('#' + curPrev));
}
newRow = true;
} else if(num>= 0){
} else {
$('div#' + row.attr('id') + ' > div.row_val', location).text(Math.floor(num));
}
}
@@ -890,7 +893,8 @@ var Room = {
$('div.storeRow', stores).each(function(index, el) {
el = $(el);
$('div.tooltip', el).remove();
var tt = $('<div>').addClass('tooltip bottom right');
var ttPos = index > 10 ? 'top right' : 'bottom right';
var tt = $('<div>').addClass('tooltip ' + ttPos);
var storeName = el.attr('id').substring(4).replace('-', ' ');
for(var incomeSource in $SM.get('income')) {
var income = $SM.get('income["'+incomeSource+'"]');
@@ -1114,7 +1118,8 @@ var Room = {
cost: good.cost(),
text: _(k),
click: Room.buy,
width: '80px'
width: '80px',
ttPos: buySection.children().length > 10 ? 'top right' : 'bottom right'
}).css('opacity', 0).attr('buildThing', k).appendTo(buySection).animate({opacity:1}, 300, 'linear');
}
} else {
@@ -1149,7 +1154,8 @@ var Room = {
},
compassTooltip: function(direction){
var tt = $('<div>').addClass('tooltip bottom right');
var ttPos = $('div#resources').children().length > 10 ? 'top right' : 'bottom right';
var tt = $('<div>').addClass('tooltip ' + ttPos);
$('<div>').addClass('row_key').text(_('the compass points '+ direction)).appendTo(tt);
tt.appendTo($('#row_compass'));
},
+20 -1
View File
@@ -445,12 +445,31 @@ var Space = {
.animate({opacity:1},1500);
$('<br />')
.appendTo('.centerCont');
$('<br />')
.appendTo('.centerCont');
$('<span>')
.addClass('endGame')
.text(_('expanded story. alternate ending. behind the scenes commentary. get the app.'))
.appendTo('.centerCont')
.animate({opacity:1}, 1500);
$('<br />')
.appendTo('.centerCont');
$('<br />')
.appendTo('.centerCont');
$('<span>')
.addClass('endGame endGameOption')
.text(_('app store.'))
.text(_('iOS.'))
.click(function() { window.open('https://itunes.apple.com/app/apple-store/id736683061?pt=2073437&ct=gameover&mt=8'); })
.appendTo('.centerCont')
.animate({opacity:1},1500);
$('<br />')
.appendTo('.centerCont');
$('<span>')
.addClass('endGame endGameOption')
.text(_('android.'))
.click(function() { window.open('https://play.google.com/store/apps/details?id=com.yourcompany.adarkroom'); })
.appendTo('.centerCont')
.animate({opacity:1},1500);
Engine.options = {};
Engine.deleteSave(true);
}
+36 -3
View File
@@ -162,6 +162,9 @@ var World = {
// compass tooltip text
Room.compassTooltip(World.dir);
// Check if everything has been seen
World.testMap();
//subscribe to stateUpdates
$.Dispatch('stateUpdate').subscribe(World.handleStateUpdates);
},
@@ -549,6 +552,10 @@ var World = {
return World.state.map[World.curPos[0]][World.curPos[1]];
},
getDamage: function(thing) {
return World.Weapons[thing].damage;
},
narrateMove: function(oldTile, newTile) {
var msg = null;
switch(oldTile) {
@@ -617,10 +624,33 @@ var World = {
}
},
testMap: function() {
if(!World.seenAll) {
var dark;
var mask = $SM.get('game.world.mask');
loop:
for(var i = 0; i < mask.length; i++) {
for(var j = 0; j < mask[i].length; j++) {
if(!mask[i][j]) {
dark = true;
break loop;
}
}
}
World.seenAll = !dark;
}
},
applyMap: function() {
var x = Math.floor(Math.random() * (World.RADIUS * 2) + 1);
var y = Math.floor(Math.random() * (World.RADIUS * 2) + 1);
World.uncoverMap(x, y, 5, $SM.get('game.world.mask'));
if(!World.seenAll){
var x,y,mask = $SM.get('game.world.mask');
do {
x = Math.floor(Math.random() * (World.RADIUS * 2) + 1);
y = Math.floor(Math.random() * (World.RADIUS * 2) + 1);
} while (mask[x][y]);
World.uncoverMap(x, y, 5, mask);
}
World.testMap();
},
generateMap: function() {
@@ -851,6 +881,7 @@ var World = {
Notifications.notify(World, _('the world fades'));
World.state = null;
Path.outfit = {};
$SM.remove('outfit');
$('#outerSlider').animate({opacity: '0'}, 600, 'linear', function() {
$('#outerSlider').css('left', '0px');
$('#locationSlider').css('left', '0px');
@@ -872,6 +903,8 @@ var World = {
goHome: function() {
// Home safe! Commit the changes.
$SM.setM('game.world', World.state);
World.testMap();
if(World.state.sulphurmine && $SM.get('game.buildings["sulphur mine"]', true) === 0) {
$SM.add('game.buildings["sulphur mine"]', 1);
Engine.event('progress', 'sulphur mine');