diff --git a/.project b/.project index 33ac207c2..4860616ba 100644 --- a/.project +++ b/.project @@ -1,17 +1,17 @@ - - - A Dark Room - - - - - - org.eclipse.wst.jsdt.core.javascriptValidator - - - - - - org.eclipse.wst.jsdt.core.jsNature - - + + + A Dark Room + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/browserWarning.html b/browserWarning.html index 7b5d634da..087463e76 100644 --- a/browserWarning.html +++ b/browserWarning.html @@ -1,43 +1,43 @@ - - - - A Dark Room - - - -
- -
- - A Dark Room makes use of HTML5 and CSS3, which your current browser does not appear to support.
- Please update your browser for the best experience:
-
- Firefox - Chrome - Internet Explorer - Opera - Safari -

- Or you can play anyway, but it probably won't work! -
-
- + + + + A Dark Room + + + +
+ +
+ + A Dark Room makes use of HTML5 and CSS3, which your current browser does not appear to support.
+ Please update your browser for the best experience:
+
+ Firefox + Chrome + Internet Explorer + Opera + Safari +

+ Or you can play anyway, but it probably won't work! +
+
+ \ No newline at end of file diff --git a/css/main.css b/css/main.css index a9ed05970..26da0544e 100644 --- a/css/main.css +++ b/css/main.css @@ -1,584 +1,584 @@ -/* Fonts */ -body, .tooltip, select.menuBtn { - font-family: "Times New Roman", Times, serif; - font-size: 16px; - font-weight: normal; - line-height: normal; - letter-spacing: normal; -} - -html { - height: 100%; -} - -body { - height: 100%; - margin: 0; -} - -::selection { - background-color: transparent; -} - -::-moz-selection { - background-color: transparent; -} - -#description textarea::selection { - background-color: gray; -} - -#description textarea::-moz-selection { - background-color: gray; -} - -/* Framework stuff */ - -div.clear { - clear: both; -} - -div#wrapper { - margin: auto; - width: 700px; - padding: 20px 0 0 220px; - position: relative; -} - -div#saveNotify { - position: absolute; - top: 20px; - right: 0px; - background: white; - opacity: 0; -} - -div#content { - position: relative; - overflow: hidden; - height: 700px; -} - -div#header { - padding-bottom: 20px; - height: 20px; -} - -.menu { - position: fixed; - right: 10px; - bottom: 10px; - color: #666; -} - -.menu span { - cursor: pointer; - float: right; - margin-left: 20px; -} - -.customSelect { - height: 20px; -} - -span.customSelectOptions { - margin: 0; - width: 80px; -} - -.customSelectOptions > ul { - max-height: 20px; - width: 80px; - overflow: hidden; - -webkit-transition: max-height 1s; - transition: max-height 1s; - padding: 0; - margin: 0; - bottom: 0; - position: absolute; - right: 0; -} - -.customSelectOptions > ul:hover { - max-height: 400px; -} - -.customSelectOptions > ul > li { - padding: 0 0 3px 0; - list-style-type: none; - height: 20px; -} - -.customSelectOptions > ul > li:last-child { - padding: 0; -} - -.customSelectOptions > ul > li:hover { - text-decoration: underline; -} - -.customSelectOptions > ul > li:first-child:hover { - cursor: default; - text-decoration: none; -} - -.menu span:hover { - text-decoration: underline; -} - -div.headerButton { - font-size: 18px; - cursor: pointer; - float: left; - border-left: 1px solid black; - margin-left: 10px; - padding-left: 10px; -} - -div.headerButton:hover { - text-decoration: underline; -} - -div.headerButton:first-child { - border-left: none; - margin-left: 0px; - padding-left: 0px; -} - -div.headerButton.selected, div.headerButton.selected:hover { - cursor: default; - text-decoration: underline; -} - -div#outerSlider { - position: absolute; -} - -div#outerSlider > div { - position: relative; - float: left; - width: 700px; - height: 700px; - overflow: hidden; -} - -div#locationSlider { - position: absolute; -} - -div.location { - position: relative; - float: left; - width: 700px; -} - -div.row_key { - clear: both; - float: left; -} - -div.row_val { - float: right; -} - -/* Notifications */ - -div#notifications { - position: absolute; - top: 20px; - left: 0px; - height: 700px; - width: 200px; - overflow: hidden; -} - -div#notifications div.notification { - margin-bottom: 10px; -} - -div#notifyGradient { - position: absolute; - top: 0px; - left: 0px; - height: 100%; - width: 100%; - background-color: white; - background: -webkit-linear-gradient( - rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100% - ); - background: linear-gradient( - rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100% - ); - filter: alpha( - Opacity=0, FinishOpacity=100, Style=1, StartX=0, StartY=0, FinishX=0, FinishY=500 - ); -} - -/* Button */ - -div.button { - position: relative; - text-align: center; - border: 1px solid black; - width: 100px; - margin-bottom: 5px; - padding: 5px 10px; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -div.button:hover { - text-decoration: underline; -} - -div.button.disabled, div.button.disabled:hover { - cursor: default; - border-color: #b2b2b2; - color: #b2b2b2; - text-decoration: none; -} - -div.button div.cooldown { - position: absolute; - top: 0px; - left: 0px; - z-index: -1; - height: 100%; - background-color: #DDDDDD; -} - -/* Up/Down buttons. They're complicated! */ - -.upBtn, .dnBtn, .upManyBtn, .dnManyBtn { - position: absolute; - width: 14px; - height: 15px; - cursor: pointer; -} - -.upBtn, .dnBtn { - right: 0px; -} - -.upManyBtn, .dnManyBtn { - right: -11px; -} - -.upBtn.disabled, .dnBtn.disabled, .upManyBtn.disabled, .dnManyBtn.disabled { - cursor: default; -} - -.upBtn { - top: -2px; -} - -.upManyBtn { - top: -2px; -} - -.upBtn:after, .upBtn:before, .upManyBtn:after, .upManyBtn:before { - position: absolute; - border: medium solid transparent; - content: " "; - height: 0; - width: 0; - bottom: 4px; -} - -.upBtn:after, .upManyBtn:after { - border-color: transparent transparent white; -} - -.upBtn:before, .upManyBtn:before { - border-color: transparent transparent black; -} - -.upBtn.disabled:before, .upManyBtn.disabled:before { - border-color: transparent transparent #999; -} - - -.dnBtn { - bottom: -3px; -} - -.dnManyBtn { - bottom: -3px; -} - -.dnBtn:after, .dnBtn:before, .dnManyBtn:after, .dnManyBtn:before { - position: absolute; - border: medium solid transparent; - content: " "; - height: 0; - width: 0; - top: 4px; -} - -.upBtn:after, .dnBtn:after { - border-width: 3px; - left: 50%; - margin-left: -3px; -} - -.upBtn:before, .dnBtn:before, .upManyBtn:before, .dnManyBtn:before { - border-width: 5px; - left: 50%; - margin-left: -5px; -} - -.upManyBtn:after, .dnManyBtn:after { - border-width: 2px; - left: 50%; - margin-left: -2px; -} - -.dnBtn:after, .dnManyBtn:after { - border-color: white transparent transparent; -} - -.dnBtn:before, .dnManyBtn:before { - border-color: black transparent transparent; -} - -.dnBtn.disabled:before, .dnManyBtn.disabled:before { - border-color: #999 transparent transparent; -} - -div.button div.tooltip { - width: 100px; -} - -/* Tooltip */ - -div.tooltip { - display: none; - padding: 2px 5px; - border: 1px solid black; - position: absolute; - box-shadow: -1px 3px 2px #666; - background: white; - z-index: 999; -} - -.tooltip.bottom { - top: 30px; -} - -.tooltip.right { - left: 2px; -} - -.tooltip.left { - right: 0px; -} - -.tooltip.top { - bottom: 20px; -} - -*:hover > div.tooltip { - display: block; -} - -div.tooltip:hover { - display: none !important; -} - -.disabled:hover > div.tooltip, .button.free:hover > div.tooltip { - display: none; -} - -#event .button.disabled:hover > div.tooltip { - display: block; -} - -/* Events */ - -.eventPanel { - background: none repeat scroll 0 0 white; - border: 2px solid transparent; - left: 250px; - padding: 20px; - position: absolute; - top: 90px; - width: 335px; - z-index: 20; -} - -body.noMask .eventPanel { - background-color: black; -} - -.eventPanel:before { - background-color:white; - opacity: 0.6; - content: " "; - height: 700px; - left: -252px; - position: absolute; - top: -75px; - width: 920px; - z-index: -2; -} - -body.noMask .eventPanel:before { - opacity: 0; -} - -.eventPanel:after { - position: absolute; - top: -2px; - left: -2px; - width: 100%; - height: 100%; - content: " "; - border: 2px solid black; - box-shadow: 5px 5px 5px #666666; - z-index: -2; -} - -body.noMask .eventPanel:after { - border-color: white; -} - -.eventPanel .button { - float:left; - margin-right: 20px; -} - -body.noMask .eventPanel .button { - border-color: white; - color: white; -} - -.eventTitle { - display: inline-block; - font-weight: bold; - position: absolute; - top: -12px; -} - -body.noMask .eventTitle { - color: white; -} - -.eventTitle:after { - background-color: white; - bottom: 32%; - content: " "; - height: 5px; - left: 0; - position: absolute; - width: 100%; - z-index: -1; -} - -body.noMask .eventTitle:after { - background-color: black; -} - -#description { - position: relative; - min-height: 100px; -} - -#description textarea { - width: 100%; - height: 225px; -} - -body.noMask #description { - color: white; -} - -#description > div { - padding-bottom: 20px; -} - -#buttons > .button { - margin: 0 5px 5px; - margin-right: 15px; -} - -/* Combat! */ -#description div.fighter { - padding: 0px; - position: absolute; - bottom: 15px; -} - -#wanderer { - left: 25%; -} - -#enemy { - right: 25%; -} - -.hp { - position: absolute; - top: -15px; - margin-left: -50%; -} - -#description .bullet { - padding: 0px 20px 0px 20px; - bottom: 25px; - position: absolute; - height: 1px; - line-height: 1px; -} - -.damageText { - position: absolute; - bottom: 15px; - left: 50%; - margin-left: -50%; -} - -#lootButtons { - padding-bottom: 0px !important; - margin: 20px 0 0 5px; - position: relative; -} - -#lootButtons:before { - content: "take:"; - position: absolute; - top: -25px; - left: 0px; -} - -#dropMenu { - background: none repeat scroll 0 0 white; - border: 1px solid black; - position: absolute; - z-index: 100; - padding-top: 5px; - text-align: left; - box-shadow: -1px 3px 2px #666; - cursor: default; -} - -#dropMenu:before { - content: "drop:"; - border-bottom: 1px solid black; - display: block; - margin-bottom: 5px; - padding: 0px 0px 5px 5px; -} - -#dropMenu > div { - padding: 0px 5px 5px 5px; - cursor: pointer; -} - -#dropMenu > div:hover { - text-decoration: underline; -} +/* Fonts */ +body, .tooltip, select.menuBtn { + font-family: "Times New Roman", Times, serif; + font-size: 16px; + font-weight: normal; + line-height: normal; + letter-spacing: normal; +} + +html { + height: 100%; +} + +body { + height: 100%; + margin: 0; +} + +::selection { + background-color: transparent; +} + +::-moz-selection { + background-color: transparent; +} + +#description textarea::selection { + background-color: gray; +} + +#description textarea::-moz-selection { + background-color: gray; +} + +/* Framework stuff */ + +div.clear { + clear: both; +} + +div#wrapper { + margin: auto; + width: 700px; + padding: 20px 0 0 220px; + position: relative; +} + +div#saveNotify { + position: absolute; + top: 20px; + right: 0px; + background: white; + opacity: 0; +} + +div#content { + position: relative; + overflow: hidden; + height: 700px; +} + +div#header { + padding-bottom: 20px; + height: 20px; +} + +.menu { + position: fixed; + right: 10px; + bottom: 10px; + color: #666; +} + +.menu span { + cursor: pointer; + float: right; + margin-left: 20px; +} + +.customSelect { + height: 20px; +} + +span.customSelectOptions { + margin: 0; + width: 80px; +} + +.customSelectOptions > ul { + max-height: 20px; + width: 80px; + overflow: hidden; + -webkit-transition: max-height 1s; + transition: max-height 1s; + padding: 0; + margin: 0; + bottom: 0; + position: absolute; + right: 0; +} + +.customSelectOptions > ul:hover { + max-height: 400px; +} + +.customSelectOptions > ul > li { + padding: 0 0 3px 0; + list-style-type: none; + height: 20px; +} + +.customSelectOptions > ul > li:last-child { + padding: 0; +} + +.customSelectOptions > ul > li:hover { + text-decoration: underline; +} + +.customSelectOptions > ul > li:first-child:hover { + cursor: default; + text-decoration: none; +} + +.menu span:hover { + text-decoration: underline; +} + +div.headerButton { + font-size: 18px; + cursor: pointer; + float: left; + border-left: 1px solid black; + margin-left: 10px; + padding-left: 10px; +} + +div.headerButton:hover { + text-decoration: underline; +} + +div.headerButton:first-child { + border-left: none; + margin-left: 0px; + padding-left: 0px; +} + +div.headerButton.selected, div.headerButton.selected:hover { + cursor: default; + text-decoration: underline; +} + +div#outerSlider { + position: absolute; +} + +div#outerSlider > div { + position: relative; + float: left; + width: 700px; + height: 700px; + overflow: hidden; +} + +div#locationSlider { + position: absolute; +} + +div.location { + position: relative; + float: left; + width: 700px; +} + +div.row_key { + clear: both; + float: left; +} + +div.row_val { + float: right; +} + +/* Notifications */ + +div#notifications { + position: absolute; + top: 20px; + left: 0px; + height: 700px; + width: 200px; + overflow: hidden; +} + +div#notifications div.notification { + margin-bottom: 10px; +} + +div#notifyGradient { + position: absolute; + top: 0px; + left: 0px; + height: 100%; + width: 100%; + background-color: white; + background: -webkit-linear-gradient( + rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100% + ); + background: linear-gradient( + rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100% + ); + filter: alpha( + Opacity=0, FinishOpacity=100, Style=1, StartX=0, StartY=0, FinishX=0, FinishY=500 + ); +} + +/* Button */ + +div.button { + position: relative; + text-align: center; + border: 1px solid black; + width: 100px; + margin-bottom: 5px; + padding: 5px 10px; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.button:hover { + text-decoration: underline; +} + +div.button.disabled, div.button.disabled:hover { + cursor: default; + border-color: #b2b2b2; + color: #b2b2b2; + text-decoration: none; +} + +div.button div.cooldown { + position: absolute; + top: 0px; + left: 0px; + z-index: -1; + height: 100%; + background-color: #DDDDDD; +} + +/* Up/Down buttons. They're complicated! */ + +.upBtn, .dnBtn, .upManyBtn, .dnManyBtn { + position: absolute; + width: 14px; + height: 15px; + cursor: pointer; +} + +.upBtn, .dnBtn { + right: 0px; +} + +.upManyBtn, .dnManyBtn { + right: -11px; +} + +.upBtn.disabled, .dnBtn.disabled, .upManyBtn.disabled, .dnManyBtn.disabled { + cursor: default; +} + +.upBtn { + top: -2px; +} + +.upManyBtn { + top: -2px; +} + +.upBtn:after, .upBtn:before, .upManyBtn:after, .upManyBtn:before { + position: absolute; + border: medium solid transparent; + content: " "; + height: 0; + width: 0; + bottom: 4px; +} + +.upBtn:after, .upManyBtn:after { + border-color: transparent transparent white; +} + +.upBtn:before, .upManyBtn:before { + border-color: transparent transparent black; +} + +.upBtn.disabled:before, .upManyBtn.disabled:before { + border-color: transparent transparent #999; +} + + +.dnBtn { + bottom: -3px; +} + +.dnManyBtn { + bottom: -3px; +} + +.dnBtn:after, .dnBtn:before, .dnManyBtn:after, .dnManyBtn:before { + position: absolute; + border: medium solid transparent; + content: " "; + height: 0; + width: 0; + top: 4px; +} + +.upBtn:after, .dnBtn:after { + border-width: 3px; + left: 50%; + margin-left: -3px; +} + +.upBtn:before, .dnBtn:before, .upManyBtn:before, .dnManyBtn:before { + border-width: 5px; + left: 50%; + margin-left: -5px; +} + +.upManyBtn:after, .dnManyBtn:after { + border-width: 2px; + left: 50%; + margin-left: -2px; +} + +.dnBtn:after, .dnManyBtn:after { + border-color: white transparent transparent; +} + +.dnBtn:before, .dnManyBtn:before { + border-color: black transparent transparent; +} + +.dnBtn.disabled:before, .dnManyBtn.disabled:before { + border-color: #999 transparent transparent; +} + +div.button div.tooltip { + width: 100px; +} + +/* Tooltip */ + +div.tooltip { + display: none; + padding: 2px 5px; + border: 1px solid black; + position: absolute; + box-shadow: -1px 3px 2px #666; + background: white; + z-index: 999; +} + +.tooltip.bottom { + top: 30px; +} + +.tooltip.right { + left: 2px; +} + +.tooltip.left { + right: 0px; +} + +.tooltip.top { + bottom: 20px; +} + +*:hover > div.tooltip { + display: block; +} + +div.tooltip:hover { + display: none !important; +} + +.disabled:hover > div.tooltip, .button.free:hover > div.tooltip { + display: none; +} + +#event .button.disabled:hover > div.tooltip { + display: block; +} + +/* Events */ + +.eventPanel { + background: none repeat scroll 0 0 white; + border: 2px solid transparent; + left: 250px; + padding: 20px; + position: absolute; + top: 90px; + width: 335px; + z-index: 20; +} + +body.noMask .eventPanel { + background-color: black; +} + +.eventPanel:before { + background-color:white; + opacity: 0.6; + content: " "; + height: 700px; + left: -252px; + position: absolute; + top: -75px; + width: 920px; + z-index: -2; +} + +body.noMask .eventPanel:before { + opacity: 0; +} + +.eventPanel:after { + position: absolute; + top: -2px; + left: -2px; + width: 100%; + height: 100%; + content: " "; + border: 2px solid black; + box-shadow: 5px 5px 5px #666666; + z-index: -2; +} + +body.noMask .eventPanel:after { + border-color: white; +} + +.eventPanel .button { + float:left; + margin-right: 20px; +} + +body.noMask .eventPanel .button { + border-color: white; + color: white; +} + +.eventTitle { + display: inline-block; + font-weight: bold; + position: absolute; + top: -12px; +} + +body.noMask .eventTitle { + color: white; +} + +.eventTitle:after { + background-color: white; + bottom: 32%; + content: " "; + height: 5px; + left: 0; + position: absolute; + width: 100%; + z-index: -1; +} + +body.noMask .eventTitle:after { + background-color: black; +} + +#description { + position: relative; + min-height: 100px; +} + +#description textarea { + width: 100%; + height: 225px; +} + +body.noMask #description { + color: white; +} + +#description > div { + padding-bottom: 20px; +} + +#buttons > .button { + margin: 0 5px 5px; + margin-right: 15px; +} + +/* Combat! */ +#description div.fighter { + padding: 0px; + position: absolute; + bottom: 15px; +} + +#wanderer { + left: 25%; +} + +#enemy { + right: 25%; +} + +.hp { + position: absolute; + top: -15px; + margin-left: -50%; +} + +#description .bullet { + padding: 0px 20px 0px 20px; + bottom: 25px; + position: absolute; + height: 1px; + line-height: 1px; +} + +.damageText { + position: absolute; + bottom: 15px; + left: 50%; + margin-left: -50%; +} + +#lootButtons { + padding-bottom: 0px !important; + margin: 20px 0 0 5px; + position: relative; +} + +#lootButtons:before { + content: "take:"; + position: absolute; + top: -25px; + left: 0px; +} + +#dropMenu { + background: none repeat scroll 0 0 white; + border: 1px solid black; + position: absolute; + z-index: 100; + padding-top: 5px; + text-align: left; + box-shadow: -1px 3px 2px #666; + cursor: default; +} + +#dropMenu:before { + content: "drop:"; + border-bottom: 1px solid black; + display: block; + margin-bottom: 5px; + padding: 0px 0px 5px 5px; +} + +#dropMenu > div { + padding: 0px 5px 5px 5px; + cursor: pointer; +} + +#dropMenu > div:hover { + text-decoration: underline; +} diff --git a/css/outside.css b/css/outside.css index 135a13806..1e56a790c 100644 --- a/css/outside.css +++ b/css/outside.css @@ -1,64 +1,64 @@ -div#village { - position: absolute; - top: 0px; - right: 0px; - border: 1px solid black; - cursor: default; - padding: 5px 10px; - width: 200px; -} - -div#population { - position: absolute; - top: -13px; - right: 10px; - background-color: white; -} - -.noHuts #population { - display: none; -} - -div#village:before { - position: absolute; - background: white; - content: "village"; - left: 8px; - top: -13px; -} - -div#village.noHuts:before { - content: "forest"; -} - -div#workers { - position:absolute; - top: -4px; - left: 160px; - width: 150px; -} - -.workerRow > .row_val { - position: relative; - padding-right: 20px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.workerRow { - position: relative; - margin: 10px 0px; - cursor: default; -} - -.workerRow .tooltip { - width: 150px; -} - -div.storeRow div.tooltip { - width: 160px; +div#village { + position: absolute; + top: 0px; + right: 0px; + border: 1px solid black; + cursor: default; + padding: 5px 10px; + width: 200px; +} + +div#population { + position: absolute; + top: -13px; + right: 10px; + background-color: white; +} + +.noHuts #population { + display: none; +} + +div#village:before { + position: absolute; + background: white; + content: "village"; + left: 8px; + top: -13px; +} + +div#village.noHuts:before { + content: "forest"; +} + +div#workers { + position:absolute; + top: -4px; + left: 160px; + width: 150px; +} + +.workerRow > .row_val { + position: relative; + padding-right: 20px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.workerRow { + position: relative; + margin: 10px 0px; + cursor: default; +} + +.workerRow .tooltip { + width: 150px; +} + +div.storeRow div.tooltip { + width: 160px; } \ No newline at end of file diff --git a/css/path.css b/css/path.css index 24faecd6d..95504928f 100644 --- a/css/path.css +++ b/css/path.css @@ -1,66 +1,66 @@ -#outfitting { - position: relative; - border: 1px solid black; - width: 200px; - margin-bottom: 20px; - padding: 5px 10px; -} - -div#outfitting:before { - position: absolute; - content: "supplies"; - top: -13px; - background-color: white; -} - -div.outfitRow { - position: relative; - cursor: default; - margin: 10px -30px 10px 0px; -} - -div.outfitRow > .row_val { - padding-right: 30px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -div.outfitRow .tooltip { - width: 150px; -} - -div#bagspace { - background-color: white; - position: absolute; - top:-13px; - right: 10px; -} - -div#perks { - position: absolute; - top: 0px; - right: 0px; - border: 1px solid black; - cursor: default; - padding: 5px 10px; - width: 200px; -} - -div#perks:before { - position: absolute; - content: "perks"; - top: -13px; - background-color: white; -} - -div.perkRow { - position: relative; -} - -div.perkRow .row_key { - float: none; +#outfitting { + position: relative; + border: 1px solid black; + width: 200px; + margin-bottom: 20px; + padding: 5px 10px; +} + +div#outfitting:before { + position: absolute; + content: "supplies"; + top: -13px; + background-color: white; +} + +div.outfitRow { + position: relative; + cursor: default; + margin: 10px -30px 10px 0px; +} + +div.outfitRow > .row_val { + padding-right: 30px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.outfitRow .tooltip { + width: 150px; +} + +div#bagspace { + background-color: white; + position: absolute; + top:-13px; + right: 10px; +} + +div#perks { + position: absolute; + top: 0px; + right: 0px; + border: 1px solid black; + cursor: default; + padding: 5px 10px; + width: 200px; +} + +div#perks:before { + position: absolute; + content: "perks"; + top: -13px; + background-color: white; +} + +div.perkRow { + position: relative; +} + +div.perkRow .row_key { + float: none; } \ No newline at end of file diff --git a/css/room.css b/css/room.css index 8641bc7d8..9d9b0db0b 100644 --- a/css/room.css +++ b/css/room.css @@ -1,79 +1,79 @@ -div#buildBtns { - position: absolute; - top: 50px; - left: 0px; -} - -div#buildBtns:before { - content: "build:"; - position: relative; - top: -5px; -} - -div#craftBtns { - position: absolute; - top: 50px; - left: 150px; -} - -div#craftBtns:before { - content: "craft:"; - position: relative; - top: -5px; -} - -div#buyBtns { - position: absolute; - top: 50px; - left: 300px; -} - -div#buyBtns:before { - content: "buy:"; - position: relative; - top: -5px; -} - -div#storesContainer { - position: absolute; - top: 0px; - right: 0px; -} - -div#stores { - position: relative; - border: 1px solid black; - cursor: default; - padding: 5px 10px; - width: 200px; -} - -div.storeRow { - position: relative; -} - -div#stores:before { - position: absolute; - background: white; - content: "stores"; - left: 8px; - top: -13px; -} - -div#weapons { - margin-top: 15px; - position: relative; - right: 0px; - border: 1px solid black; - cursor: default; - padding: 5px 10px; - width: 200px; -} - -div#weapons:before { - position: absolute; - background: white; - content: "weapons"; - left: 8px; - top: -13px; +div#buildBtns { + position: absolute; + top: 50px; + left: 0px; +} + +div#buildBtns:before { + content: "build:"; + position: relative; + top: -5px; +} + +div#craftBtns { + position: absolute; + top: 50px; + left: 150px; +} + +div#craftBtns:before { + content: "craft:"; + position: relative; + top: -5px; +} + +div#buyBtns { + position: absolute; + top: 50px; + left: 300px; +} + +div#buyBtns:before { + content: "buy:"; + position: relative; + top: -5px; +} + +div#storesContainer { + position: absolute; + top: 0px; + right: 0px; +} + +div#stores { + position: relative; + border: 1px solid black; + cursor: default; + padding: 5px 10px; + width: 200px; +} + +div.storeRow { + position: relative; +} + +div#stores:before { + position: absolute; + background: white; + content: "stores"; + left: 8px; + top: -13px; +} + +div#weapons { + margin-top: 15px; + position: relative; + right: 0px; + border: 1px solid black; + cursor: default; + padding: 5px 10px; + width: 200px; +} + +div#weapons:before { + position: absolute; + background: white; + content: "weapons"; + left: 8px; + top: -13px; } \ No newline at end of file diff --git a/css/ship.css b/css/ship.css index f3b44cbd9..88b85c858 100644 --- a/css/ship.css +++ b/css/ship.css @@ -1,8 +1,8 @@ -div#hullRow { - width: 70px; -} - -div#engineRow { - width: 70px; - margin-bottom: 20px; -} +div#hullRow { + width: 70px; +} + +div#engineRow { + width: 70px; + margin-bottom: 20px; +} diff --git a/css/space.css b/css/space.css index 9d203c67a..61705e6f4 100644 --- a/css/space.css +++ b/css/space.css @@ -1,154 +1,154 @@ -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - transform:rotate(0deg); - } - 100% { - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - transform:rotate(360deg); - } -} - -@-webkit-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - transform:rotate(0deg); - } - 100% { - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - transform:rotate(360deg); - } -} - -@-moz-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - transform:rotate(0deg); - } - 100% { - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - transform:rotate(360deg); - } -} - -@keyframes spin { - 0% { - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - transform:rotate(0deg); - } - 100% { - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - transform:rotate(360deg); - } -} - -#spacePanel { - float: none !important; - position: absolute !important; - top: -700px; - left: 0px; -} - -#starsContainer { - width: 100%; - height: 100%; - position: absolute; - top: 0px; - left: 0px; - overflow: hidden; -} - -#stars, #starsBack { - position: absolute; - z-index: -1; - left: 0px; -} - -#stars > div, #starsBack > div { - position: relative; - height: 3000px; - width: 3000px; - color: white; -} - -#starsBack { - opacity: 0.5; -} - -.star { - position: absolute; -} - -#ship { - cursor: default; - position: absolute; - margin-top: -10px; - margin-left: -7.5px; -} - -#theEnd { - position: relative; - cursor: default; - top: 200px; - margin-left: -220px; - text-align: center; - font-size: 24px; - font-weight: bold; - opacity: 0; - color: white; -} - -.asteroid { - cursor: default; - position: absolute; - top: -40px; - left: 350px; - -webkit-animation: 1s linear 0s normal none infinite spin; - -moz-animation: 1s linear 0s normal none infinite spin; - -ms-animation: 1s linear 0s normal none infinite spin; - animation: 1s linear 0s normal none infinite spin; - font-size: 32px; -} - -#hullRemaining { - width: 70px; - position: absolute; - top: 0px; - left: 0px; -} - -.centerCont { - padding-top:10%; -} - -.endGame { - font-size:48px; - color:#FFFFFF; - opacity:0; - position:relative; -} - -.endGameRestart { - font-size: 32px; - cursor: pointer; -} - -.endGameRestart:hover { - text-decoration: underline; -} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + transform:rotate(0deg); + } + 100% { + -ms-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + transform:rotate(360deg); + } +} + +@-webkit-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + transform:rotate(0deg); + } + 100% { + -ms-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + transform:rotate(360deg); + } +} + +@-moz-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + transform:rotate(0deg); + } + 100% { + -ms-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + transform:rotate(360deg); + } +} + +@keyframes spin { + 0% { + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + transform:rotate(0deg); + } + 100% { + -ms-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + transform:rotate(360deg); + } +} + +#spacePanel { + float: none !important; + position: absolute !important; + top: -700px; + left: 0px; +} + +#starsContainer { + width: 100%; + height: 100%; + position: absolute; + top: 0px; + left: 0px; + overflow: hidden; +} + +#stars, #starsBack { + position: absolute; + z-index: -1; + left: 0px; +} + +#stars > div, #starsBack > div { + position: relative; + height: 3000px; + width: 3000px; + color: white; +} + +#starsBack { + opacity: 0.5; +} + +.star { + position: absolute; +} + +#ship { + cursor: default; + position: absolute; + margin-top: -10px; + margin-left: -7.5px; +} + +#theEnd { + position: relative; + cursor: default; + top: 200px; + margin-left: -220px; + text-align: center; + font-size: 24px; + font-weight: bold; + opacity: 0; + color: white; +} + +.asteroid { + cursor: default; + position: absolute; + top: -40px; + left: 350px; + -webkit-animation: 1s linear 0s normal none infinite spin; + -moz-animation: 1s linear 0s normal none infinite spin; + -ms-animation: 1s linear 0s normal none infinite spin; + animation: 1s linear 0s normal none infinite spin; + font-size: 32px; +} + +#hullRemaining { + width: 70px; + position: absolute; + top: 0px; + left: 0px; +} + +.centerCont { + padding-top:10%; +} + +.endGame { + font-size:48px; + color:#FFFFFF; + opacity:0; + position:relative; +} + +.endGameRestart { + font-size: 32px; + cursor: pointer; +} + +.endGameRestart:hover { + text-decoration: underline; +} diff --git a/css/world.css b/css/world.css index a1b461b8e..1d4c0db8c 100644 --- a/css/world.css +++ b/css/world.css @@ -1,74 +1,74 @@ -#worldOuter { - position: relative; - display: inline-block; -} - -#map { - position: relative; - font-family: "Courier New", Courier, monospace; - border: 1px solid black; - overflow: hidden; - display: inline-block; - line-height: 10px; - letter-spacing: 1px; - color: #999; - cursor: default; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -#map .landmark { - position: relative; - font-weight: bold; - color: black; - line-height: 0px; /* Hack to prevent the boldness from increasing the row's line-height. I hope it works in all browsers... */ -} - -#bagspace-world { - border: 1px solid black; - height: 62px; - margin-bottom: 5px; - margin-top: 13px; - overflow: hidden; -} - -#bagspace-world > div { - padding: 6px 4px; -} - -#backpackTitle { - position: absolute; - top: 0px; - left: 10px; - background-color: white; - z-index: 1; -} - -#backpackSpace { - position: absolute; - top: 0px; - right: 10px; - background-color: white; - z-index: 1; -} - -#healthCounter { - position: absolute; - top: 0px; - left: 80px; - background-color: white; - z-index: 1; -} - -div.supplyItem { - display: inline-block; - border: 1px solid #999; - float: left; - margin: 0px 5px 6px 0px; - padding: 0 5px; - cursor: default; +#worldOuter { + position: relative; + display: inline-block; +} + +#map { + position: relative; + font-family: "Courier New", Courier, monospace; + border: 1px solid black; + overflow: hidden; + display: inline-block; + line-height: 10px; + letter-spacing: 1px; + color: #999; + cursor: default; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#map .landmark { + position: relative; + font-weight: bold; + color: black; + line-height: 0px; /* Hack to prevent the boldness from increasing the row's line-height. I hope it works in all browsers... */ +} + +#bagspace-world { + border: 1px solid black; + height: 62px; + margin-bottom: 5px; + margin-top: 13px; + overflow: hidden; +} + +#bagspace-world > div { + padding: 6px 4px; +} + +#backpackTitle { + position: absolute; + top: 0px; + left: 10px; + background-color: white; + z-index: 1; +} + +#backpackSpace { + position: absolute; + top: 0px; + right: 10px; + background-color: white; + z-index: 1; +} + +#healthCounter { + position: absolute; + top: 0px; + left: 80px; + background-color: white; + z-index: 1; +} + +div.supplyItem { + display: inline-block; + border: 1px solid #999; + float: left; + margin: 0px 5px 6px 0px; + padding: 0 5px; + cursor: default; } \ No newline at end of file diff --git a/doc/Zones.txt b/doc/Zones.txt index 08a1c8b43..03621a2a4 100644 --- a/doc/Zones.txt +++ b/doc/Zones.txt @@ -1,5 +1,5 @@ -Radius Enemy DPS Player DPS Enemy HP Player HP -===================================================================== -< 10 1 1 5 10 -< 20 3 3 10 15-20 +Radius Enemy DPS Player DPS Enemy HP Player HP +===================================================================== +< 10 1 1 5 10 +< 20 3 3 10 15-20 < 30 6 4 20 30-40 \ No newline at end of file diff --git a/index.html b/index.html index b88475c82..2e6f9dce0 100644 --- a/index.html +++ b/index.html @@ -1,112 +1,112 @@ - - - - - - A Dark Room - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- -
-
-
-
- - + + + + + + A Dark Room + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+
+
+
+ + diff --git a/lang/fr/strings.js b/lang/fr/strings.js index fb721c935..0393cecd5 100644 --- a/lang/fr/strings.js +++ b/lang/fr/strings.js @@ -1 +1 @@ -_.setTranslation({"lights off.": "lumi\u00e8res \u00e9teintes.", "a safe place in the wilds.": "Un endroit s\u00fbr dans la nature.", "the compass points north.": "le boussole pointe vers le nord.", "charred bodies litter the ground.": "des corps carbonis\u00e9s jonchent le sol.", "strange noises can be heard through the walls": "de l'autre cot\u00e9 du mur s'\u00e9chappent des bruits \u00e9tranges ", "the night is silent.": "la nuit est silencieuse.", "the wanderer leaves, cart loaded with furs": "la vagabonde s'en va, la charrette charg\u00e9e de fourrure", "bring your friends.": "Invitez vos amis.", "arms and munitions, relics from the war, are neatly arranged on the store-room floor.": "des armes et des munitions, reliques de la guerre, sont bien rang\u00e9s dans l'armurerie.", "armourer": "armurier", "give 1 medicine": "donner 1 m\u00e9dicament", "the body of a wanderer lies in a small cavern.": "le corps d'un vagabond repose dans une petite caverne.", "the camp is still, save for the crackling of the fires.": "il ne reste plus qu'un camp vite avec un feu cr\u00e9pitant.", "A Murky Swamp": "Un marais boueux", "battered technology from both sides lays dormant on the blasted landscape.": "les armes de bataille des deux factions sont commes endormies sur le paysage ravag\u00e9.", "scratching noises can be heard from the store room.": "des grattements semblent provenir de l'entrep\u00f4t.", "l armour": "armure cuir", "the people here were broken a long time ago.": "les gens d'ici ont tout perdu il y'a longtemps.", "thieves": "voleurs", "the bodies of the wanderers that lived here are still visible in the flames.": "les corps de quelques vagabonds qui s'\u00e9taient install\u00e9s ici sont toujours visibles dans les flammes.", "the double doors creak endlessly in the wind.": "le grincement des doubles portes battantes est port\u00e9 par le vent.", "a shivering man approaches and attacks with surprising strength": "un homme tremblant s'approche et attaque avec une force surprenante", "A Strange Bird": "Un oiseau \u00e9trange", "lift off": "d\u00e9coller", "unarmed master": "expert en combat \u00e0 mains nues", "the wanderer takes the charm and nods slowly.": "le vagabond prend le charme et hoche lentement la t\u00eate.", "A Damp Cave": "Une grotte humide", "yes": "oui", "the remains of an old camp sits just inside the cave.": "a l'int\u00e9rieur de la grotte, les restes d'un ancien campement.", "the shot echoes in the empty street.": "l'\u00e9cho du tir se propage dans les rues d\u00e9sertes. ", "learned to love the dry air": "vous savez appr\u00e9cier l'air sec", "the fire is {0}": "le feu {0}", "a thug is waiting on the other side of the wall.": "un voyou attend de l'autre cot\u00e9 du mur.", "lights flash through the alleys between buildings.": "des lumi\u00e8res clignotent le long des all\u00e9es entre les immeubles.", "share.": "partager.", "slow metabolism": "m\u00e9tabolisme lent", "dangerous to be this far from the village without proper protection": "c'est dangereux de s'\u00e9loigner autant du village sans une bonne protection.", "weight": "poids", "shoot": "tirer (fusil)", "score for this game: {0}": "score de la partie: {0}", "not enough leather": "cuir insuffisant", "builder puts up a hut, out in the forest. says word will get around.": "l'ouvri\u00e8re construit une cabane dans la foret. Elle dit que \u00e7a se saura.", "buy scales": "acheter des \u00e9cailles", "bodies and supplies from both sides litter the ground.": "les corps et les provisions des deux factions sont \u00e9parpill\u00e9s au sol.", "the shell of an abandoned hospital looms ahead.": "les restes d'un hopital abandonn\u00e9 aparaissent droit devant.", "eat meat": "manger", "a scavenger draws close, hoping for an easy score": "Un pilleur s'approche, esp\u00e9rant un cible facile", "The Sick Man": "Le malade", "the map uncovers a bit of the world": "la carte d\u00e9voile un petit morceau du monde", "total score: {0}": "score total: {0}", "scales": "\u00e9cailles", "iron miner": "mineur de fer", "leaves a pile of small scales behind.": "il laisse une pile de petites \u00e9cailles derri\u00e8re lui.", "hull: ": "bouclier:", "time to get out of this place. won't be coming back.": "c'est l'heure de quitter cet endroit. il n'y aura pas de retour en arri\u00e8re.", "there are still supplies inside.": "il reste des provisions \u00e0 l'int\u00e9rieur.", "weapons": "armes", "orange traffic cones are set across the street, faded and cracked.": "des plots oranges barrent ce qui devait \u00eatre autrefois une rue.", "agree": "accepter", "the military is already set up at the mine's entrance.": "les militaires sont d\u00e9j\u00e0 install\u00e9s \u00e0 l'entr\u00e9e de la mine.", "the man says he's grateful. says he won't come around any more.": "l'homme dit \u00eatre reconnaissant. Il dit qu'il ne reviendra plus.", "go back inside": "rentrer \u00e0 l\u2019int\u00e9rieur", "the rickety cart will carry more wood from the forest": "la charrette d\u00e9labr\u00e9e aidera \u00e0 ramener plus de bois de la for\u00eat", "the wind howls outside": "le vent siffle dehors", "the man-eater is dead": "Le mangeur d'homme est mort", "a small group arrives, all dust and bones.": "un petit groupe arrive, sale et affam\u00e9.", "a small cache of supplies is tucked inside a rusting locker.": "quelques objets sont cach\u00e9s dans un casier rouill\u00e9.", "the street ahead glows with firelight.": "la rue est illumin\u00e9e par des flammes.", "precision": "pr\u00e9cision", "build:": "construire:", "scavenger'd been looking for supplies in here, it seems.": "le vagabond devait rechercher quelques provisisions ici.", "the soldier is dead": "le soldat est mort", "a terrible plague is fast spreading through the village.": "une terrible peste se propage rapidement dans le village.", "all he has are some scales.": "quelques \u00e9cailles, toutes ses possessions.", "can't read the words.": "impossibles de d\u00e9chiffrer les mots.", "mild": "ti\u00e8de", "the ground is littered with small teeth": "le sol est jonch\u00e9 de petites dents", "The Coal Mine": "Une mine de charbon", "The Scout": "L'\u00e9claireur", "an old wanderer arrives": "un vieux vagabond arrive", "a trading post would make commerce easier": "un comptoir rendrait le commerce plus facile", "the mouth of the cave is wide and dark.": "l'entr\u00e9e de la grotte est grande et sombre.", "a small supply cache is hidden at the back of the cave.": "une petite cachette \u00e0 provision se trouve au fond de la cave.", "willing to talk about it, for a price.": "Elle veut bien en parler, mais \u00e7a a un prix.", "a large beast charges out of the dark": "Une grande b\u00eate appara\u00eet dans l'obscurit\u00e9 et charge", "steelworks": "aci\u00e9rie", "The Thief": "Le voleur", "a strange looking bird speeds across the plains": "un oiseau \u00e9trange vole rapidement au dessus des plaines", "a scout stops for the night": "une \u00e9claireuse s\u2019arr\u00eate pour la nuit", "A Borehole": "Un forage", "leave cave": "sortir de la cave", "should cure the meat, or it'll spoil. builder says she can fix something up.": "il faudrait faire s\u00e9cher la viande pour \u00e9viter qu'elle pourrisse. L'ouvri\u00e8re dit qu'elle pourra bricoler quelque chose.", "cloth": "chiffon", "tell him to leave": "lui dire de partir", "an improvised shop is set up on the sidewalk.": "un magasin improvis\u00e9 est mont\u00e9 sur le trottoire.", "armour": "armure", "an old house remains here, once white siding yellowed and peeling.": "une vielle maison est toujours l\u00e0. sa peinture, \u00e0 l'origine blanche, est maintenant jaune et \u00e9caill\u00e9e.", "never go thirsty again": "plus jamais soif", "baited trap": "pi\u00e8ge avec app\u00e2t", "a giant lizard shambles forward": "Un l\u00e9zard gigantesque se tra\u00eene vers vous", "the tunnel opens up at another platform.": "le tunnel d\u00e9bouche sur une nouvelle station.", "restart the game?": "recommencer la partie ?", "searching the bodies yields a few supplies.": "les corps sont fouill\u00e9s pour trouver quelques objets de valeurs.", "hull:": "bouclier:", "builder says leather could be useful. says the villagers could make it.": "l'ouvri\u00e8re dit que du cuir pourrait \u00eatre utile. elle dit que les villageois pourraient en fabriquer.", "builder finishes the smokehouse. she looks hungry.": "L'ouvri\u00e8re a fini le fumoir. elle a l'air affam\u00e9e.", "sword is sharp. good protection out in the wilds.": "l'\u00e9p\u00e9e est tranchante, une bonne protection dans la nature.", "he smiles warmly and asks for lodgings for the night.": "il souri chaleureusement et demande un abri pour la nuit.", "camp fires burn by the entrance to the mine.": "un feu de camps br\u00fble a l'entr\u00e9e de la mine.", "the sulphur mine is clear of dangers": "la mine de souffre est maintenant sans danger", "give 100": "donner 100", "just as deadly now as they were then.": "toujours aussi mortels.", "ignore it": "l'ignorer", "the mysterious wanderer returns, cart piled high with furs.": "la myst\u00e9rieuse vagabonde revient, la charrette d\u00e9bordante de fourrures.", "starvation sets in": "la famine s'installe", "A Scavenger": "Un pilleur", "but there is a cache of medicine under the floorboards.": "mais il reste quelques m\u00e9dicaments dans une cachette sous le plancher.", "a snarling beast leaps out of the underbrush": "une b\u00eate grondante surgit des buissons", "a ragged stranger stumbles through the door and collapses in the corner": "une \u00e9trang\u00e8re en loque rentre en titubant et s'effondre dans un coin", "A Battlefield": "Un champ de bataille", "charm": "charme", "are you sure?": "\u00eates vous sur ?", "convoy": "convoi", "a haze falls over the village as the steelworks fires up": "une brume tombe sur le village lorsque l\u2019aci\u00e9rie d\u00e9marre", "builder's not sure he's to be trusted.": "l'ouvri\u00e8re ne lui fait pas confiance.", "A Soldier": "Un soldat", "A Military Raid": "Un raid militaire", "there's not much, but some useful things can still be found.": "il n'y a pas grand chose, mais il reste n\u00e9anmois quelques objets utiles.", "a pack of lizards rounds the corner.": "au coin de la rue, plusieurs l\u00e9zards.", "s armour": "armure acier", "the sky is grey and the wind blows relentlessly": "le ciel est gris et le vents souffle implacablement", "a thug moves out of the shadows.": "un voyou sort de l'ombre.", "water replenished": "plein d'eau fait.", "won't say from where he came, but it's clear that he's not staying.": "il ne dit pas d'o\u00f9 il vient, mais il est clair qu'il ne restera pas.", "the hunting lodge stands in the forest, a ways out of town": "la cabane de chasseur est construite \u00e0 la sortie du village", "leaves a pile of small teeth behind.": "il laisse une pile de petites dents derri\u00e8re lui.", "a lone frog sits in the muck, silently.": "une grenouille solitaire est assise dans la vase, silencieuse.", "stealthy": "furtif", "nothing but downcast eyes.": "seul son regard d\u00e9moralis\u00e9 est visible.", "a fight, maybe.": "un combat, peut-\u00eatre.", "cart": "charrette", "dry brush and dead branches litter the forest floor": "des buissons secs et des branches mortes recouvrent le sol de la for\u00eat", "an old man bursts through a door, wielding a scalpel.": "un vieil homme surgit d'une porte, arm\u00e9 d'un scalpel.", "some medicine abandoned in the drawers.": "quelques m\u00e9dicaments ont \u00e9t\u00e9 abandonn\u00e9s dans les placards.", "time to move on.": "il est temps de repartir", "the streets are empty.": "les rues sont vides.", "saved.": "sauvegarde.", "A Raucous Village": "Un village bruyant", "A Murky Swamp": "Un marais boueux", "a small suburb lays ahead, empty houses scorched and peeling.": "devant, un petit lotissement. ses maisons br\u00fbl\u00e9es ou effondr\u00e9es.", "not enough wood to get the fire going": "pas assez de bois pour alimenter le feu", "bird must have liked shiney things.": "l'oiseau devait aimer ce qui brille.", "the clinic has been ransacked.": "la clinique \u00e0 \u00e9t\u00e9 saccag\u00e9e", "builder says there are more wanderers. says they'll work, too.": "l'ouvri\u00e8re dit qu'il y'a d'autres vagabonds dehors. elle dit qu'ils travailleront. eux aussi.", "a mysterious wanderer arrives": "un myst\u00e9rieux vagabond arrive", "castoff from the mammoth drills can still be found by the edges of the precipice.": "les \u00e9normes t\u00eates de forages sont encore visibles au bord du gouffre.", "he leaves a reward.": "il laisse une r\u00e9compense.", "restart.": "recommencer.", "buy bait": "acheter des app\u00e2ts", "punches do more damage": "les points font plus de d\u00e9gats", "a military perimeter is set up around the mine.": "un p\u00e9rim\u00e8tre s\u00e9curis\u00e9 a \u00e9t\u00e9 mis en place autour de la mine.", "leather's not strong. better than rags, though.": "le cuir n'est pas tr\u00e8s r\u00e9sistant, mais c'est mieux que des chiffons.", "carrying more means longer expeditions to the wilds": "porter plus signifie des exp\u00e9ditions plus longue dans les contr\u00e9s sauvages", "iron": "fer", "it puts up little resistance before the knife.": "elle r\u00e9siste faiblement face au couteau.", "the villagers hang the thief high in front of the store room.": "les villageois pendent le voleur devant l\u2019entrep\u00f4t.", "The Iron Mine": "La mine de fer", "hang him": "le pendre", "A Ruined City": "Une ville en ruine", "Room": "Pi\u00e8ce", "men mill about, weapons at the ready.": "des hommes patrouillent, les armes charg\u00e9es.", "say goodbye": "dire au revoir", "shares what he knows about sneaking before he goes.": "il partage ses astuces pour \u00eatre discret avant de s'en aller.", "buy:": "acheter:", "the cask holds enough water for longer expeditions": "le tonneau contiendra assez d'eau pour des exp\u00e9ditions plus longues", "the warped man lies dead.": "l'homme d\u00e9form\u00e9 est mort.", "medicine": "m\u00e9dicament", "snarling beast": "b\u00eate qui grogne", "a gunshot rings through the trees.": "une d\u00e9tonation retenti dans la for\u00eat.", "learned to throw punches with purpose": "appris \u00e0 donner des coups de points avec un objectif", "the towers of a decaying city dominate the skyline": "les grattes ciels d'une ville sont visibles \u00e0 l'horizon", "builder says she could make finer things, if she had the tools": "L'ouvri\u00e8re dit qu'elle pourrait faire des objets de meilleurs qualit\u00e9s, si elle avait les outils.", "the operating theatre has a lot of curious equipment.": "le bloc op\u00e9ratoire contient un curieux mat\u00e9riel.", "salvage": "r\u00e9cup\u00e9rer", "evasive": "esquive", "the wanderer leaves, cart loaded with wood": "le vagabond s'en va, la charrette charg\u00e9e de bois", "talk": "parler", "The Mysterious Wanderer": "Le myst\u00e9rieux vagabond", "a large bird nests at the top of the stairs.": "un grand nid d'oiseau en haut de l'\u00e9scalier.", "the wagon can carry a lot of supplies": "le chariot peut transporter plus de provisions", "strips of meat are hung up to dry in this ward.": "des morecaux de viande sont accroch\u00e9s aux fenetres de la maison pour s\u00e9cher.", "do nothing": "ne rien faire", "continue": "continuer", "learned how not to be seen": "vous savez comment ne pas \u00eatre vu", "A Silent Forest": "Une for\u00eat silencieuse", "smoldering": "est fumant", "the feral terror is dead": "la terreur sauvage est morte", "A Firelit Room": "Une pi\u00e8ce \u00e9clair\u00e9e", "the plague rips through the village.": "la peste d\u00e9cime tout le village", "use meds": "se soigner", "feral howls echo out of the darkness.": "des hurlements de terreurs r\u00e9sonnent dans le noir.", "An Old House": "Une vieille maison", "bone spear": "lance", "a bundle of sticks lies just beyond the threshold, wrapped in coarse furs.": "quelques brindilles enroul\u00e9es d'une fourrure grossi\u00e8re sont pos\u00e9s sur le seuil de la porte.", "An Outpost": "Un avant poste", "the man is thankful.": "l'homme est reconnaissant.", "more traps won't help now": "plus de pi\u00e8ge n'apportera rien de plus maintenant", "a snarling beast jumps out from behind a car.": "une b\u00eate grondante \u00e9tait cach\u00e9 derri\u00e8re une voiture.", "A Huge Borehole": "Un \u00e9norme forage", "A Sniper": "Un sniper", "scavenger": "pilleur", "more soldiers will be on their way.": "d'autre soldats vont venir.", "a nomad arrives, looking to trade": "un nomade arrive, pr\u00eat \u00e0 faire du troc", "someone throws a stone.": "quelqu'un jete une pierre.", "track them": "les suivre", "spare him": "l'\u00e9pargner", "lights on.": "lumi\u00e8res allum\u00e9es.", "scraps of fur": "des morceaux de fourrure", "there is no more water": "il n'y a plus d'eau", "a large creature lunges, muscles rippling in the torchlight": "une grande cr\u00e9ature se pr\u00e9cipite, ses muscles ondulant sous la lumi\u00e8re des torches", "street above the subway platform is blown away.": "la rue au dessus de la station de metro \u00e0 \u00e9xplos\u00e9e.", "a convoy lurches in, equal parts worry and hope.": "un convoi arrive, plein de crainte et d'\u00e9spoir.", "the remains of an old house stand as a monument to simpler times": "les restes d'une ancienne maison reste tel un monument en m\u00e9moire d'un temps ou les choses \u00e9taient plus simples", "the small military outpost is well supplied.": "le petit avant poste militaire est bien \u00e9quip\u00e9.", "leather": "cuir", "burning": "cr\u00e9pite", "Noises": "Bruits", "the compass points south.": "la boussole pointe vers le sud", "it contains travelling gear, and a few trinkets.": "il contient des objets pour voyager et quelques babioles.", "it's been picked over by scavengers, but there's still some things worth taking.": "le batiment \u00e0 \u00e9t\u00e9 pill\u00e9, mais il reste quelques objets qui m\u00e9ritent d'\u00eatre emmen\u00e9s.", "scout": "\u00e9claireur", "An Outpost": "Un avant poste", "learned to strike faster without weapons": "appris \u00e0 attaquer plus vite sans arme", "available": "disponible", "a man charges down the hall, a rusty blade in his hand": "un homme charge dans l'entr\u00e9e, une vieille \u00e9p\u00e9e rouill\u00e9e \u00e0 la main", "enter": "entrer", "cured meat": "viande s\u00e9ch\u00e9e", "deep in the swamp is a moss-covered cabin.": "au centre du mar\u00e9cage, une cabane recouverte de mousse.", "A Ruined Trap": "Un pi\u00e8ge d\u00e9truit", "lets some light down into the dusty haze.": "un peu de lumi\u00e8re la dedans sera le bienvenue.", "a squat building up ahead.": "Unsquat en vue devant.", "maybe some useful stuff in the rubble.": "il y'a peut \u00eatre quelque chose d'utile dans ces d\u00e9combres.", "the mysterious wanderer returns, cart piled high with wood.": "le myst\u00e9rieux vagabond reviens, la charrette d\u00e9bordante de bois.", "still time to rescue a few supplies.": "il est encore temps de sauver quelques objets.", "attack": "attaquer", "An Abandoned Town": "Une ville abandonn\u00e9e", "a pack of snarling beasts pours out of the trees.": "une meute de b\u00eates sort de la foret.", "the stranger in the corner stops shivering. her breathing calms.": "l'\u00e9trang\u00e8re dans le coin arr\u00eate de trembler. sa respiration se calme.", "a soldier, alerted, opens fire.": "un soldat, alert\u00e9, ouvre le feu.", "free {0}/{1}": "libre {0}/{1}", "man-eater": "mangeur d'homme", "a huge lizard scrambles up out of the darkness of an old metro station.": "un \u00e9norme l\u00e9zard s'extirpe de l'entr\u00e9e sombre d'une vieille station de m\u00e9tro.", "builder": "ouvrier", "the door hangs open.": "la porte est ouverte", "the darkness is absolute": "l\u2019obscurit\u00e9 est compl\u00e8te", "A Snarling Beast": "Une b\u00eate qui grogne", "a battle was fought here, long ago.": "Une bataille \u00e0 eu lieu ici, il y'a longtemps.", "tangle": "bola", "restore more health when eating": "r\u00e9cup\u00e9rer plus de vie en mangeant", "the gaunt man is dead": "l'homme d\u00e9charn\u00e9 est mort.", "some weird metal he picked up on his travels.": "un m\u00e9tal \u00e9trange qu'il a ramass\u00e9 durant ses voyages.", "another beast, draw by the noise, leaps out of a copse of trees.": "une autre b\u00eate, attir\u00e9e par le bruit, sort d'un arbre mort.", "the rest of the hospital is empty.": "le reste de l'hopital est vide.", "ripe for the picking.": "qui attendent un nouveau propri\u00e9taire.", "the crowd surges forward.": "la foule s'\u00e9lance.", "bedrolls, torn and blackened, lay beneath a thin layer of dust.": "des sacs de couchage, d\u00e9chir\u00e9s et noircis, tra\u00eenent sous une mince couche de poussi\u00e8re.", "the nights are rent with screams.": "les nuits sont remplies de cris.", "not enough ": "insuffisant", "the coal mine is clear of dangers": "La mine de charbon est s\u00e9curis\u00e9e", "wagon": "chariot", "only the chief remains.": "seul le chef reste.", "not enough scales": "\u00e9caille insuffisante", "not enough cloth": "chiffon insuffisante", "say he should be strung up as an example.": "ils disent qu'il devrait \u00eatre pendu, pour l'exemple.", "a youth lashes out with a tree branch.": "un jeune attaque arm\u00e9 d'une branche d'arbre.", "a masked soldier rounds the corner, gun drawn": "un soldat masqu\u00e9 appara\u00eet a un croisement, l'arme au poing", "learned to make the most of food": "vous savez tirer partie un maximum de la nourriture", "a pristine medicine cabinet at the end of a hallway.": "au bout du couloir, une armoire \u00e0 pharmacie en parfait \u00e9tat.", "slash": "coup d'\u00e9p\u00e9e (acier)", "more squatters are crowding around now.": "de plus en plus de squatters se rassemblent.", "A Tiny Village": "Un petit village", "the debris is denser here.": "il y'a plus de d\u00e9brits par ici.", "most of the windows at ground level are busted anyway.": "de toute fa\u00e7on, la plupart des fen\u00eatres du rez de chauss\u00e9e ont \u00e9clat\u00e9es", "a beast stands alone in an overgrown park.": "au milieu d'un parc se trouve une b\u00eate.", "a sick man hobbles up": "un homme arrive, boitillant", "Sickness": "Maladie", "traps are more effective with bait.": "les pi\u00e8ges sont plus efficace avec des app\u00e2ts", "the compass points northeast.": "le boussole pointe vers le nord est.", "there is nothing else here.": "il n'y a rien d'autre ici.", "the walls are scorched from an old battle.": "les murs sont cribl\u00e9s d'impacts suite \u00e0 des combats finis depuis longtemps.", "learned to fight quite effectively without weapons": "apprendre \u00e0 se battre de fa\u00e7on efficace sans arme", "water": "eau", "Outside": "Dehors", "the nest of a large animal lies at the back of the cave.": "le nid d'un grand animal se trouve au fond de la cave.", "an old case is wedged behind a rock, covered in a thick layer of dust.": "une vieille valise est pos\u00e9e contre un rocher. elle est recouverte d'une \u00e9paisse couche de poussi\u00e8re.", "hp: {0}/{1}": "vie: {0}/{1}", "A Deserted Town": "Une ville d\u00e9serte", "they must be here for a reason.": "ils ne doivent pas \u00eatre l\u00e0 sans raison.", "with a little effort, it might fly again.": "Avec quelques efforts, \u00e7a pourrait revoler.", "hunter": "chasseur", "the sound of gunfire carries on the wind.": "un bruit d'arme \u00e0 feu est port\u00e9 par le vent.", "might be things worth having still inside.": "il y reste peut \u00eatre des choses de valeurs \u00e0 l'int\u00e9rieur.", "An Old House": "Une vieille maison", "well armed men charge out of the forest, firing into the crowd.": "des hommes arm\u00e9s surgissent hors de la foret et tirent sur tout ce qui bouge.", "strange bird": "oiseau \u00e9trange", "large prints lead away, into the forest.": "de larges empruntes vont vers la for\u00eat.", "cask": "tonneau", "a tribe of elderly squatters is camped out in this ward.": "une tribue de vieux squatters campe dans ce quartier.", "Sulphur Mine": "Mine de souffre", "app store.": "app store", "a sickness is spreading through the village.": "le village est contamin\u00e9 par une maladie", "blast": "tirer (lazer)", "the towers that haven't crumbled jut from the landscape like the ribcage of some ancient beast.": "les tours qui ne se sont pas effondr\u00e9es ressemblent \u00e0 une cage thoracique d'une b\u00eate pr\u00e9historique.", "go twice as far without drinking": "aller deux fois plus loin sans boire", "sulphur miner": "mineur de souffre", "the place has been swept clean by scavengers.": "cet endroit \u00e0 \u00e9t\u00e9 completement nettoy\u00e9 par des pillards.", "some wood is missing.": "du bois a disparu.", "not enough iron": "fer insuffisant", "stores": "entrep\u00f4t", "picking the bones finds some useful trinkets.": "en fouillant dans les ossements, on trouve quelques babioles qui pourraient \u00eatre utiles.", "A Ruined City": "Une ville en ruine", "inside, the remains of its victims are everywhere.": "a l'int\u00e9rieur, les restes de ses victimes sont partout.", "the room is {0}": "la pi\u00e8ce est {0}", "save this.": "sauvegarder.", "builder stokes the fire": "L'ouvrier attise le feu", "export or import save data, for backing up": "exporter ou importer vos donn\u00e9es de sauvegarde", "the shivering man is dead": "l'homme tremblant est mort.", "the rest bury them.": "ils sont enterr\u00e9s par les survivants.", "the point is made. in the next few days, the missing supplies are returned.": "le message est pass\u00e9. Les biens manquant sont rendus dans les jours qui suivent.", "a second soldier joins the fight.": "un deuxi\u00e8me soldat rejoint le combat.", "a few belongings rest against the walls.": "quelques objets sont pos\u00e9s contre les murs.", "dodge attacks more effectively": "esquiver les attaques de fa\u00e7on plus efficace", "something's causing a commotion a ways down the road.": "quelque chose s'agite en bas de la route.", "only dust and stains remain.": "seul reste quelques marques ainsi qu'un peu de poussi\u00e8re.", "engine:": "moteur:", "ignore them": "les ignorer", "meat": "viande", "tannery": "tannerie", "run": "courir", "craft:": "fabriquer:", "a beast charges out of a ransacked classroom.": "un b\u00eate sort d'une salle de classe saccag\u00e9e et charge.", "leave town": "quitter la ville", "land blows more often": "mieux reconna\u00eetre les mouvements", "the thirst becomes unbearable": "la soif devient insupportable", "a second soldier opens fire.": "un deuxi\u00e8me soldat ouvre le feu.", "learn scouting": "apprendre la reconnaissance", "some traps have been destroyed": "des pi\u00e8ges ont \u00e9t\u00e9 d\u00e9truits", "someone has locked and barricaded the door to this operating theatre.": "quelqu'un \u00e0 ferm\u00e9 et barricad\u00e9 la porte de cette salle d'op\u00e9ration.", "the sickness is cured in time.": "la maladie est soign\u00e9 \u00e0 temps.", "leave city": "quitter la cit\u00e9", "a green cross barely visible behind grimy windows.": "une croix verte est a peine visible derri\u00e8re des rideaux d\u00e9pareill\u00e9s.", "take:": "prendre:", "a sound comes from the tunnel, just ahead.": "un bruit vient du tunnel, droit devant.", "scattered teeth": "des dents", "the old compass is dented and dusty, but it looks to work.": "la vieille boussole est ab\u00eem\u00e9e et rouill\u00e9e, mais elle semble encore fonctionner", "A Shivering Man": "Un homme tremblant", "give 500": "en donner 500", "lob": "lancer grenade", "still a few drops of water in the old well.": "il reste un peu d'eau dans le puit.", "feral terror": "terreur sauvage", "an old wanderer arrives.": "un vieux vagabond arrive.", "a shack stands at the center of the village.": "une cabane se trouve au centre du village.", "a large man attacks, waving a bayonet.": "un homme costaud attaque avec une ba\u00efonnette. ", "not enough coal": "charbon insuffisant", "asks for any spare furs to keep him warm at night.": "il demande quelques morceaux de fourrure pour lui tenir chaud la nuit.", "a weathered family takes up in one of the huts.": "une famille \u00e9puis\u00e9e s'intalle dans une cabane.", "the people back away, avoiding eye contact.": "les gens reculent, \u00e9vitant de croiser le regard.", "the path leads to an abandoned mine": "le chemin m\u00e8ne \u00e0 une mine abandonn\u00e9e", "a panicked scavenger bursts through the door, screaming.": "un pillard paniqu\u00e9 sort pr\u00e9cipitament en hurlant.", "tannery goes up quick, on the edge of the village": "au bord du village, la tannerie se construit vite", "Thermosphere": "Thermosph\u00e8re", "the familiar curves of a wanderer vessel rise up out of the dust and ash. ": "la courbe famili\u00e8re d'un vaisseau de vagabond apparait derri\u00e8re la poussi\u00e8re et la cendre.", "freezing": "gel\u00e9e", "a startled beast defends its home": "Une b\u00eate effray\u00e9e d\u00e9fend son territoire", "bait": "app\u00e2t", "the torch sputters and dies in the damp air": "la torche cr\u00e9pite une derni\u00e8re fois et s\u2019\u00e9teint dans l'air humide.", "not far from the village lies a large beast, its fur matted with blood.": "pas loin du village g\u00eet une b\u00eate agonisante, sa fourrure pleine de sang.", "save.": "sauvegarder.", "cancel": "annuler", "rifle": "fusil", "in exchange, the wanderer offers his wisdom.": "en \u00e9change, il offrira un peu de sa sagesse.", "the compass points northwest.": "le boussole pointe vers le nord ouest.", "boxer": "boxeur", "The Beggar": "Le mendiant", "a few items are scattered on the ground.": "quelques objets trainent sur le sol.", "builder just shivers": "L'ouvri\u00e8re \u00e0 trop froid", "tattered cloth": "un tas de chiffons", "no": "non", "learned to look ahead": "vous savez regarder plus loin", "the footsteps stop.": "les bruits de pas s'arr\u00eatent.", "only a few die.": "seuls quelques uns meurent.", "the steel is strong, and the blade true.": "l'acier est r\u00e9sistant, et la larme magnifique", "the house has been ransacked.": "la maison \u00e0 \u00e9t\u00e9 saccag\u00e9e.", "a shot rings out, from somewhere in the long grass": "un tir retenti, quelque part dans les hautes herbes", "some good stuff woven into its nest.": "il y'a des choses int\u00e9ressantes dans sont nid.", "the beggar expresses his thanks.": "le mendiant vous remercie chaleureusement.", "wood": "bois", "put the save code here.": "copier le code ici.", "faces, darkened by soot and blood, stare out from crooked huts.": "dans des cabanes d\u00e9labr\u00e9es, des visages noirs de suie et de sang, observent", "a wanderer arrives with an empty cart. says if she leaves with furs, she'll be back with more.": "une vagabonde arrive avec une charrette vide. elle dit que si elle peut emmener des fourrures, elle en ram\u00e8nera encore plus.", "the torchlight casts a flickering glow down the hallway.": "la torche projete des ombres dansantes le long du couloir.", "the old man had a small cache of interesting items.": "le vieille homme avait une cachette contenant des objets int\u00e9r\u00e9ssants.", "something's in there.": "il y'a quelque chose \u00e0 l\u2019int\u00e9rieur.", "punches do even more damage.": "les coups de points font plus de d\u00e9gats", "black powder and bullets, like the old days.": "de la poudre noir et des balles, comme a l'\u00e9poque.", "go home": "rentrer", "turn her away": "la renvoyer", "learned to swing weapons with force": "vous savez manier vos armes avec plus de force", "a soldier opens fire from across the desert": "un soldat ouvre feu dans le desert", "martial artist": "ma\u00eetre d'un art martial", "trap": "pi\u00e8ge", "a stranger arrives in the night": "un \u00e9tranger arrive durant la nuit", "not enough teeth": "dent insuffisante", "steel's stronger than iron": "l'acier est plus dur que le fer", "Stratosphere": "Stratosph\u00e8re", "eye for an eye seems fair.": "\u0153il pour \u0153il, dent pour dent, cela semble \u00e9quitable.", "rucksack": "sac \u00e0 dos", "5 medicine": "5 m\u00e9dicaments", "A Lonely Hut": "Une cabane solitaire", "Export / Import": "Exporter/Importer", "builder says the villagers could make steel, given the tools": "l'ouvri\u00e8re dit qu'avec les bon outils, les villageois pourraient fabriquer de l'acier", "Wanderer": "Vagabond", "A Gaunt Man": "Un homme d\u00e9charn\u00e9", "A Feral Terror": "Une terreur sauvage", "trapper": "trappeur", "iron's stronger than leather": "le fer est plus dur que le cuir", "A Forgotten Battlefield": "Un champ de bataille oubli\u00e9", "charcutier": "boucher", "smokehouse": "fumoir", "some weird glowing boxes he picked up on his travels.": "d'\u00e9trange boites lumineuses qu'il a ramass\u00e9 durant ses voyages.", "not much here.": "pas grand chose ici.", "Coal Mine": "Mine de charbon", "the young settler was carrying a canvas sack.": "le jeune portait un sac.", "evasion": "esquive", "not enough wood": "bois insuffisant", "armoury's done, welcoming back the weapons of the past.": "l'armurerie est finie, r\u00e9cup\u00e9rant avec plaisir les armes d'un temps pass\u00e9.", "can't tell what left it here.": "impossible de savoir ce qui \u00e0 fait \u00e7a.", "soldier": "soldat", "Iron Mine": "Mine :de fer", "A Large Village": "Un grand village", "the wood is running out": "il n'y a bient\u00f4t plus de bois", "the shell of a burned out car blocks the entrance.": "les restes d'une voiture brul\u00e9e bloquent l'entr\u00e9e.", "shivering man": "homme tremblant", "steel sword": "\u00e9p\u00e9e en acier", "a madman attacks, screeching.": "un fou attaque un hurlant.", "a wall of gnarled trees rises from the dust. their branches twist into a skeletal canopy overhead.": "un mur d'arbres noueaux sorte de la poussi\u00e8re. leurs branches se tordant pour former une canop\u00e9 squelettique.", "builder's not sure she's to be trusted.": "l'ouvri\u00e8re ne lui fait pas confiance.", "the grass thrashes wildly as a huge lizard pushes through": "l'herbe bouge bizarrement et un \u00e9norme l\u00e9zard surgit", "the trees yield to dry grass. the yellowed brush rustles in the wind.": "quelques arbres entour\u00e9s d'herbes s\u00e8ches et jauni, bruissant sous le vent", "precise": "pr\u00e9cision", "not enough fur": "fourrure insuffisante", "soldiers patrol the perimeter, rifles slung over their shoulders.": "des soldats patrouillent dans le p\u00e9rim\u00e8tre, fusils pos\u00e9s sur leurs \u00e9paules.", "melee weapons deal more damage": "les armes de m\u00eal\u00e9s font plus de d\u00e9g\u00e2ts", "a small basket of food is hidden under a park bench, with a note attached.": "un petit panier de nourriture est cach\u00e9 sous un banc. il y'a une note dessus.", "coal": "charbon", "go twice as far without eating": "aller deux fois plus loin sans manger", "the compass points ": "la boussole montre :", "the villagers haul a filthy man out of the store room.": "les villageois trainent un homme louche hors de l'entrep\u00f4t.", "more voices can be heard ahead.": "quelques voies semblent venir de devant.", "leaves some scraps of cloth behind.": "il laisse quelques vieux chiffons derri\u00e8re lui.", "a thief is caught": "un voleur est attrap\u00e9", "a scavenger waits just inside the door.": "un pillard attend de l'autre cot\u00e9 de la porte.", "the tracks disappear after just a few minutes.": "les empruntes disparaissent apr\u00e8s quelques minutes.", "behind the door, a deformed figure awakes and attacks.": "derri\u00e8re la porte, une forme d\u00e9figur\u00e9e se r\u00e9veille et attaque.", "the mine is now safe for workers.": "la mine est maintenant s\u00fbre pour les mineurs.", "the scavenger is dead": "le voleur est mort.", "the fight is short and bloody, but the beasts are repelled.": "le combat est bref et sanglant, mais les b\u00eates sont repouss\u00e9es.", "builder says she can make traps to catch any creatures might still be alive out there": "l'ouvri\u00e8re dit qu'elle peut fabriquer des pi\u00e8ges pour attraper des animaux qui pourraient \u00eatre toujours vivant dehors", "give 50": "donner 50", "not enough steel": "acier insuffisant", "the air is filled with dust, driven relentlessly by the hard winds.": "l'air est plein de poussi\u00e8re, d\u00e9plac\u00e9 par des vents secs implacables.", "steelworker": "sid\u00e9rurgiste", "A Crashed Starship": "Un vaisseau spatial \u00e9cras\u00e9", "the stench of rot and death fills the operating theatres.": "le bloc op\u00e9ratoire empeste une odeur de pourriture et de mort.", "barbarian": "barbare", "see farther": "voir plus loin", "investigate": "enqu\u00eater", "the soldier steps out from between the buildings, rifle raised.": "le soldat apparait entre deux immeubles, fusil \u00e0 l'\u00e9paule.", "warm": "douce", "empty corridors.": "des couloirs vides.", "the sounds stop.": "le bruit s\u2019arr\u00eate.", "the lizard is dead": "le l\u00e9zard est mort", "check traps": "v\u00e9rifier les pi\u00e8ges", "swing": "coup d'\u00e9p\u00e9e (fer)", "a swarm of rats rushes up the tunnel.": "une meute de rats d\u00e9boule du tunnel.", "the ground is littered with small scales": "le sol est jonch\u00e9 de petites \u00e9cailles", "a gaunt man approaches, a crazed look in his eye": "un homme d\u00e9charn\u00e9 approche, un regard d\u00e9ment dans ses yeux", "the convoy can haul mostly everything": "le convoi peut transporter presque tout", "broken streetlights stand, rusting. light hasn't graced this place in a long time.": "les r\u00e9verb\u00e8res sont cass\u00e9s et rouill\u00e9s. Cet endroit est d\u00e9sert depuis longtemps.", "this spear's not elegant, but it's pretty good at stabbing": "cette lance n'est pas tr\u00e8s jolie, mais elle est tr\u00e8s bonne pour frapper", "his time here, now, is his penance.": "sa pr\u00e9sence ici est sa p\u00e9nitence.", "a grizzled soldier attacks, waving a bayonet.": "un soldat grisonnant attaque \u00e0 la ba\u00efonnette.", "explore": "explorer", "waterskin": "gourde", "a beggar arrives.": "un mendiant arrive.", "The Master": "Le ma\u00eetre", "gather wood": "ramasser du bois", "looks like a camp of sorts up ahead.": "quelque chose ressemblant \u00e0 un campement devant.", "Ship": "Vaisseau", "take": "prendre", "a wanderer arrives with an empty cart. says if he leaves with wood, he'll be back with more.": "un vagabond arrive avec une charrette vide. il dit que s'il peut emmener du bois, il en ram\u00e8nera encore plus.", "forest": "foret", "the military presence has been cleared.": "la pr\u00e9sence militaire a \u00e9t\u00e9 n\u00e9ttoy\u00e9e.", "a large creature attacks, claws freshly bloodied": "Une grande cr\u00e9ature attaque, les griffes d\u00e9goulinante de sang", "the tentacular horror is defeated.": "l'horreur tentaculaire est vaincue.", "A Barren World": "Un monde st\u00e9rile", "a cave lizard attacks": "un l\u00e9zard attaque", "learned to predict their movement": "vous savez pr\u00e9dire leurs mouvement", "can't tell what they're up to.": "impossible de comprendre ce qui se dit.", "the compass points southwest.": "la boussole pointe vers le sud ouest.", "supplies:": "\u00e9quipement:", "somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.": "quelque part au dessus du nuage de d\u00e9bris s'en va le vaisseau du vagabond. Assez de temps pass\u00e9 sur ce morceau de caillou.", "a large shanty town sprawls across the streets.": "un grand bidonville s'\u00e9tend le long des rues.", "turn him away": "le renvoyer", " and ": " et ", "the remaining settlers flee from the violence, their belongings forgotten.": "les derniers habitants fuient la violence, laissant derri\u00e8re eux tout leurs biens.", "lodge": "relais de chasse", "the strange bird is dead": "l'\u00e9trange oiseau est mort.", "safer here": "c'est plus s\u00fbr ici", "through the walls, shuffling noises can be heard.": "a travers le murs, on peut entendre quelques bruits \u00e9touff\u00e9s ", "a nomad shuffles into view, laden with makeshift bags bound with rough twine.": "un nomade appara\u00eet, charg\u00e9 d'un sac de fortune ferm\u00e9 avec une corde rudimentaire.", "the sniper is dead": "le sniper est mort", "go inside": "entrer", "A Dark Room": "Une pi\u00e8ce sombre", "iron sword": "\u00e9p\u00e9e en fer", "A Huge Lizard": "Un \u00e9norme l\u00e9zard", "the small settlement has clearly been burning a while.": "la petite colonie br\u00fble visiblement depuis quelques temps.", "embark": "partir", "something's in the store room": "il y'a quelque chose dans l'entrep\u00f4t", "the compass points east.": "la boussole pointe vers l'est.", "stab": "coup de lance", "rotting reeds rise out of the swampy earth.": "des racines pourrissantes ressortent des mar\u00e9cages.", "the traps contain ": "les pi\u00e8ges contiennent ", "they took what they came for, and left.": "ils ont pris ce pour quoi ils \u00e9taient venus, puis sont repartis.", "there's nothing else here.": "il ny'a rien d'autre ici.", "the ground is littered with scraps of cloth": "des chiffons sont \u00e9parpill\u00e9s au sol", "now the nomads have a place to set up shop, they might stick around a while": "maintenant que les nomades ont un endroit pour faire du commerce, ils resteront ici quelques temps", "steel": "acier", "i armour": "armure fer", "The Nomad": "Le nomade", "import": "importer", "a shame to let what he'd found go to waste.": "ce serait une honte de gacher ce qu'il avait trouv\u00e9.", "the man swallows the medicine eagerly": "l'homme avale le m\u00e9dicament avidement", "the world fades": "le monde s\u2019efface", "descend": "descendre", "A Destroyed Village": "Un village d\u00e9truit", "light fire": "allumer le feu", "the meat has run out": "il n'y a plus de viande", "learned to be where they're not": "vous savez \u00eatre l\u00e0 o\u00f9 ils ne sont pas", "compass": "boussole", "the grasses thin. soon, only dust remains.": "l'herbe se rar\u00e9fie. Il ne reste bient\u00f4t plus qu'une terre poussi\u00e9reuse.", "the villagers retreat to mourn the dead.": "les villageois rentrent et vont pleurer leurs morts", "the days are spent with burials.": "les enterrements s\u2019encha\u00eenent durant des jours.", "a destroyed village lies in the dust.": "Des ruines d'un village recouvert de poussi\u00e8res.", "a swamp festers in the stagnant air.": "un mar\u00e9cage empeste.", "rusted chainlink is pulled across an alleyway.": "une chaine rouill\u00e9e bloque l'entr\u00e9e de l'all\u00e9e.", "close": "fermer", "armoury": "armurerie", "the plague is kept from spreading.": "La peste ne se propage plus.", "lucky that the natives can't work the mechanisms.": "heureusement que les natifs ne peuvent pas en comprendre le fonctionnement.", "the stranger is standing by the fire. she says she can help. says she builds things.": "l'\u00e9trang\u00e8re se tient pr\u00eat du feu. elle dit qu'elle peut aider. elle dit qu'elle sait construire des choses.", "A Crashed Ship": "Un vaisseau \u00e9cras\u00e9", "as soon as the door is open a little bit, hundreds of tentacles erupt.": "d\u00e8s que la porte est entre ouverte, des centaines de tentacules surgissent.", "Export": "Exporter", "unfathomable destruction to fuel wanderer hungers.": "mais il \u00e0 \u00e9chou\u00e9 et la men\u00e9 \u00e0 sa perte.", "a man hobbles up, coughing.": "un homme arrive. boitillant et toussant.", "this is irreversible.": "Il n'y a pas de retour en arri\u00e8re possible.", "Plague": "La peste", "the owner stands by, stoic.": "le propri\u00e9taire attend, sto\u00efque.", "ambushed on the street.": "une embuscade dans la rue.", "an overturned caravan is spread across the pockmarked street.": "une caravane est renvers\u00e9e sur une route d\u00e9j\u00e0 bien abim\u00e9e.", "A Man-Eater": "Un mangeur d'homme", "always worked before, at least.": "du moins, \u00e7a fonctionnait comme \u00e7a avant.", "got it": "compris", "flickering": "vacille", "a man joins the fight": "Une personne rejoint le combat", "a frail man stands defiantly, blocking the path.": "un homme fr\u00eale se tien debout, bloquant le chemin avec un air de d\u00e9fi.", "worth killing for, it seems.": "il semblerait que ce soit suffisant pour justifier un meurtre", "a squatter stands firmly in the doorway of a small hut.": "un squatter se tient fermement devant l'entr\u00e9e d'une petite cabane.", "hut": "cabane", "A Destroyed Village": "Un village d\u00e9truit", "or migrating computers": "pour sauver votre partie ou changer d'ordinateur", "The Sulphur Mine": "La mine de souffre", "an old iron mine sits here, tools abandoned and left to rust.": "ici se trouve une vieille mine de fer, les outils abandonn\u00e9s, bon pour rouiller.", "roaring": "br\u00fble", "punch twice as fast, and with even more force": "frapper deux fois plus vite, et avec plus de force", "a beggar arrives": "un mendiant arrive", "the metallic tang of wanderer afterburner hangs in the air.": "une odeur m\u00e9tallique flotte dans l'air.", "rot's been to work on it, and some of the pieces are missing.": "le corps est en pleine d\u00e9composition et il en manque une partie.", "builder says she can make a cart for carrying wood": "l\u2019ouvri\u00e8re dit qu'elle peut construire un charrette pour ramasser du bois", "a man stands over a dead wanderer. notices he's not alone.": "un homme se tien debout \u00e0 cot\u00e9 du cadavre d'un vagabond. Il n'est pas seul.", "strange scales": "des \u00e9cailles \u00e9tranges", "a huge hole is cut deep into the earth, evidence of the past harvest.": "un trou \u00e9norme \u00e0 \u00e9t\u00e9 d\u00e9coup\u00e9 dans la terre, une preuve d'une activit\u00e9 pass\u00e9e.", "strips of meat hang drying by the side of the street.": " des morceaux de viandes sechent sur le bord de la route.", "Troposphere": "Troposph\u00e8re", "scavengers must have gotten to this place already.": "les pillards ont d\u00e9j\u00e0 du trouver cet endroit.", "bleached bones are strewn about the entrance. many, deeply scored with jagged grooves.": "des os compl\u00e8tement blancs sont \u00e9parpill\u00e9s autour de l'entr\u00e9e. Nombre d'entre eux portent des traces de dents.", "nothing": "rien", "squeeze": "se serrer", "buy map": "acheter une carte", "not enough alien alloy": "pas assez de carburant extra-terrestre", "teeth": "dent", "vague shapes move, just out of sight.": "une forme indistincte s'\u00e9loigne dans l'ombre.", "the town's booming. word does get around.": "la ville s'agrandie, le mot se passe.", "the wood has run out": "il n'y a plus de bois", "Share": "Partager", "the forest is silent.": "la foret est silencieuse", "hot": "chaude", "the cave narrows a few feet in.": "la grotte se r\u00e9tr\u00e9cit apr\u00e8s quelques pas \u00e0 l'int\u00e9rieur.", "A Damp Cave": "Une cave humide", "linger": "s'attarder", "dead": "est \u00e9teint", "export": "exporter", "torch": "torche", "A Dusty Path": "Un chemin poussi\u00e9reux", "the scout says she's been all over.": "l'\u00e9claireuse dit qu'elle a \u00e9t\u00e9 partout.", "enegy cell": "chargeur energie", "upgrade engine": "am\u00e9liorer le moteur", "bullets": "balles", "the stranger shivers, and mumbles quietly. her words are unintelligible.": "l'\u00e9trang\u00e8re tremble, marmonne quelques mots. ses mots sont inintelligibles.", "gatherer": "ramasseur", "through the large gymnasium doors, footsteps can be heard.": "on peut entendre des bruits de pas \u00e0 travers les grandes portes du gymnase.", "pockets": "poches", "he speaks of once leading the great fleets to fresh worlds.": "il raconte qu'il fut un temps ou il menait la grande flotte en qu\u00eate d'un monde meilleur.", "the walls are moist and moss-covered": "les murs sont humides et recouverts de moisissures", "desert rat": "rat du d\u00e9sert", "buy compass": "acheter une boussole", "the barrens break at a sea of dying grass, swaying in the arid breeze.": "la lande s'arrete au profit d'une herbe morte parcourue par une brise s\u00e8che.", "bits of meat": "des morceaux de viande", "scavenger had a small camp in the school.": "le vagabond avait install\u00e9 un petit campement dans l'\u00e9cole.", "lizard": "l\u00e9zard", "the only hope is a quick death.": "le seul espoir est une mort rapide.", "tanner": "tanneur", "the man expresses his thanks and hobbles off.": "l'homme vous remercie et repart, boitillant.", "the trees are gone. parched earth and blowing dust are poor replacements.": "il n'y a plus d'arbre. la terre dess\u00e9ch\u00e9e et l'air emplis de poussi\u00e8re ne compensent pas leurs disparitions.", "Space": "L'\u00c9space", "the earth here is split, as if bearing an ancient wound": "\u00e0 cet endroit, la terre s'ouvre en deux, comme une ancienne blessure", "the light from the fire spills from the windows, out into the dark": "la lumi\u00e8re du feu se repend \u00e0 travers la a fen\u00eatre, dehors dans la nuit", "reinforce hull": "renforcer les bouclier", "trees loom on the horizon. grasses gradually yield to a forest floor of dry branches and fallen leaves.": "des arbres se dessinent \u00e0 l'horizon. l'herbe dispara\u00eet peu \u00e0 peu au profit d'une foret dont le sol est recouvert de feuilles mortes.", "the compass points west.": "le boussole pointe vers l'ouest", "A Modest Village": "Un village", "The Village": "Le village", "inside the hut, a child cries.": "\u00e0 l'int\u00e9rieur de la cabane, un enfant pleur.", "all the work of a previous generation is here.": "tout le travail d'une ancienne g\u00e9n\u00e9ration est l\u00e0.", "laser rifle": "fusil lazer", "if the code is invalid, all data will be lost.": "si le code est incorrect, toutes les donn\u00e9es seront perdues.", "trading post": "comptoir", "after a skirmish they are driven away, but not without losses.": "ils sont repouss\u00e9s apr\u00e8s une escarmouche, mais pas sans pertes.", "water:{0}": "eau:{0}", "Mesosphere": "M\u00e9sosph\u00e8re", "where the windows of the schoolhouse aren't shattered, they're blackened with soot.": "les quelques fen\u00eatres de l'\u00e9cole qui n'ont pas \u00e9t\u00e9 bris\u00e9es sont recouvertes de suie.", "learned how to ignore the hunger": "vous savez ignorer la faim", "the compass points southeast.": "la boussole pointe vers le sud est", "a crudely made charm": "un charme rudimentaire", "punch": "coup de poing", "the town lies abandoned, its citizens long dead": "la ville est totalement abandonn\u00e9e. ses citoyens mort depuis longtemps", "Ready to Leave?": "Pr\u00eat \u00e0 partir ?", "fires burn in the courtyard beyond.": "un feu br\u00fble dans une cour derri\u00e8re.", "say his folk have been skimming the supplies.": "ils disent que cet homme \u00e0 vol\u00e9 des provisions.", "1 medicine": "1 m\u00e9dicament", "coal miner": "mineur de charbon", "no more room for huts.": "il n'y a plus de place pour des cabanes.", "gaunt man": "homme d\u00e9charn\u00e9", "An Old Starship": "Un ancien vaisseau spatial", "the sickness spreads through the village.": "la maladie se repend dans le village.", "he begs for medicine.": "il supplie pour quelques m\u00e9dicaments.", "a torch to keep the dark away": "une torche pour repousser la nuit", "workshop's finally ready. builder's excited to get to it": "l'atelier est enfin pr\u00eat. L'ouvri\u00e8re est impatiente de s'y mettre", "A Beast Attack": "Une attaque de b\u00eate", "this waterskin'll hold a bit of water, at least": "cette gourde retiendra un peu d'eau, au moins", "some of the traps have been torn apart.": "des pi\u00e8ges ont \u00e9t\u00e9 mis en pi\u00e8ces", "none": "aucune", "the torch goes out": "la torche s\u2019\u00e9teint", "the house is abandoned, but not yet picked over.": "la maison est abandonn\u00e9e, mais elle n'a pas encore \u00e9t\u00e9 visit\u00e9e.", "collected scraps spread across the floor like they fell from heaven.": "des petits tas de d\u00e9chets sont \u00e9parpill\u00e9s sur le sol, comme s'ils \u00e9taient tomb\u00e9s du ciel.", "the iron mine is clear of dangers": "la mine de fer est s\u00fbre.", "this old mine is not abandoned": "cette vieille mine n'est pas abandonn\u00e9e", "beneath the wanderer's rags, clutched in one of its many hands, a glint of steel.": "sous quelques chiffons du vagabond, serr\u00e9e dans une main, un petit morceau d'acier.", "stoke fire": "attiser le feu", "cold": "froide", "Restart?": "Recommencer ?", "villagers could help hunt, given the means": "les villageois pourraient aider pour la chasse, si on leur donne les moyens", "fur": "fourrure", "someone had been stockpiling loot here.": "quelqu'un a stock\u00e9 plein de choses dedans.", "more traps to catch more creatures": "plus de pi\u00e8ges pour attraper plus d'animaux", "an old wanderer sits inside, in a seeming trance.": "\u00e0 l'int\u00e9rieur, un vieux vagabond est assis. il \u00e0 l'air en trance.", "a battered highway sign stands guard at the entrance to this once-great city.": "un panneau bossel\u00e9 tien toujours \u00e0 l'entr\u00e9e de ce qui fut autrefois une grande ville.", "can't see what's inside.": "impossible de voir ce qu'il y'a \u00e0 l'int\u00e9rieur.", "builder says it'd be useful to have a steady source of bullets": "l'ouvri\u00e8re dit que \u00e7a pourrait \u00eatre int\u00e9ressant d'avoir une source d'approvisionnement constante en munitions", "a beast, wilder than imagining, erupts out of the foliage": "une b\u00eate inimaginable surgit des feuillages", "the beast is dead.": "la b\u00eate est morte.", "medicine is needed immediately.": "des m\u00e9dicaments sont n\u00e9cessaires imm\u00e9diatement.", "thrust": "ba\u00efonnette", "perks:": "avantages:", "better avoid conflict in the wild": "mieux \u00e9viter les conflits dans un environnement hostile", "water tank": "r\u00e9servoir d'eau", "{0} per {1}s": "{0} /{1}s", "the snarling beast is dead": "la b\u00eate grognante est morte.", "buy teeth": "acheter des dents", "Exosphere": "Exosph\u00e8re", "alien alloy": "alliage extraterrestre", "leave": "partir", "workshop": "atelier", "the old tower seems mostly intact.": "la vieille tour \u00e0 l'air globalement intacte."}); +_.setTranslation({"lights off.": "lumi\u00e8res \u00e9teintes.", "a safe place in the wilds.": "Un endroit s\u00fbr dans la nature.", "the compass points north.": "le boussole pointe vers le nord.", "charred bodies litter the ground.": "des corps carbonis\u00e9s jonchent le sol.", "strange noises can be heard through the walls": "de l'autre cot\u00e9 du mur s'\u00e9chappent des bruits \u00e9tranges ", "the night is silent.": "la nuit est silencieuse.", "the wanderer leaves, cart loaded with furs": "la vagabonde s'en va, la charrette charg\u00e9e de fourrure", "bring your friends.": "Invitez vos amis.", "arms and munitions, relics from the war, are neatly arranged on the store-room floor.": "des armes et des munitions, reliques de la guerre, sont bien rang\u00e9s dans l'armurerie.", "armourer": "armurier", "give 1 medicine": "donner 1 m\u00e9dicament", "the body of a wanderer lies in a small cavern.": "le corps d'un vagabond repose dans une petite caverne.", "the camp is still, save for the crackling of the fires.": "il ne reste plus qu'un camp vite avec un feu cr\u00e9pitant.", "A Murky Swamp": "Un marais boueux", "battered technology from both sides lays dormant on the blasted landscape.": "les armes de bataille des deux factions sont commes endormies sur le paysage ravag\u00e9.", "scratching noises can be heard from the store room.": "des grattements semblent provenir de l'entrep\u00f4t.", "l armour": "armure cuir", "the people here were broken a long time ago.": "les gens d'ici ont tout perdu il y'a longtemps.", "thieves": "voleurs", "the bodies of the wanderers that lived here are still visible in the flames.": "les corps de quelques vagabonds qui s'\u00e9taient install\u00e9s ici sont toujours visibles dans les flammes.", "the double doors creak endlessly in the wind.": "le grincement des doubles portes battantes est port\u00e9 par le vent.", "a shivering man approaches and attacks with surprising strength": "un homme tremblant s'approche et attaque avec une force surprenante", "A Strange Bird": "Un oiseau \u00e9trange", "lift off": "d\u00e9coller", "unarmed master": "expert en combat \u00e0 mains nues", "the wanderer takes the charm and nods slowly.": "le vagabond prend le charme et hoche lentement la t\u00eate.", "A Damp Cave": "Une grotte humide", "yes": "oui", "the remains of an old camp sits just inside the cave.": "a l'int\u00e9rieur de la grotte, les restes d'un ancien campement.", "the shot echoes in the empty street.": "l'\u00e9cho du tir se propage dans les rues d\u00e9sertes. ", "learned to love the dry air": "vous savez appr\u00e9cier l'air sec", "the fire is {0}": "le feu {0}", "a thug is waiting on the other side of the wall.": "un voyou attend de l'autre cot\u00e9 du mur.", "lights flash through the alleys between buildings.": "des lumi\u00e8res clignotent le long des all\u00e9es entre les immeubles.", "share.": "partager.", "slow metabolism": "m\u00e9tabolisme lent", "dangerous to be this far from the village without proper protection": "c'est dangereux de s'\u00e9loigner autant du village sans une bonne protection.", "weight": "poids", "shoot": "tirer (fusil)", "score for this game: {0}": "score de la partie: {0}", "not enough leather": "cuir insuffisant", "builder puts up a hut, out in the forest. says word will get around.": "l'ouvri\u00e8re construit une cabane dans la foret. Elle dit que \u00e7a se saura.", "buy scales": "acheter des \u00e9cailles", "bodies and supplies from both sides litter the ground.": "les corps et les provisions des deux factions sont \u00e9parpill\u00e9s au sol.", "the shell of an abandoned hospital looms ahead.": "les restes d'un hopital abandonn\u00e9 aparaissent droit devant.", "eat meat": "manger", "a scavenger draws close, hoping for an easy score": "Un pilleur s'approche, esp\u00e9rant un cible facile", "The Sick Man": "Le malade", "the map uncovers a bit of the world": "la carte d\u00e9voile un petit morceau du monde", "total score: {0}": "score total: {0}", "scales": "\u00e9cailles", "iron miner": "mineur de fer", "leaves a pile of small scales behind.": "il laisse une pile de petites \u00e9cailles derri\u00e8re lui.", "hull: ": "bouclier:", "time to get out of this place. won't be coming back.": "c'est l'heure de quitter cet endroit. il n'y aura pas de retour en arri\u00e8re.", "there are still supplies inside.": "il reste des provisions \u00e0 l'int\u00e9rieur.", "weapons": "armes", "orange traffic cones are set across the street, faded and cracked.": "des plots oranges barrent ce qui devait \u00eatre autrefois une rue.", "agree": "accepter", "the military is already set up at the mine's entrance.": "les militaires sont d\u00e9j\u00e0 install\u00e9s \u00e0 l'entr\u00e9e de la mine.", "the man says he's grateful. says he won't come around any more.": "l'homme dit \u00eatre reconnaissant. Il dit qu'il ne reviendra plus.", "go back inside": "rentrer \u00e0 l\u2019int\u00e9rieur", "the rickety cart will carry more wood from the forest": "la charrette d\u00e9labr\u00e9e aidera \u00e0 ramener plus de bois de la for\u00eat", "the wind howls outside": "le vent siffle dehors", "the man-eater is dead": "Le mangeur d'homme est mort", "a small group arrives, all dust and bones.": "un petit groupe arrive, sale et affam\u00e9.", "a small cache of supplies is tucked inside a rusting locker.": "quelques objets sont cach\u00e9s dans un casier rouill\u00e9.", "the street ahead glows with firelight.": "la rue est illumin\u00e9e par des flammes.", "precision": "pr\u00e9cision", "build:": "construire:", "scavenger'd been looking for supplies in here, it seems.": "le vagabond devait rechercher quelques provisisions ici.", "the soldier is dead": "le soldat est mort", "a terrible plague is fast spreading through the village.": "une terrible peste se propage rapidement dans le village.", "all he has are some scales.": "quelques \u00e9cailles, toutes ses possessions.", "can't read the words.": "impossibles de d\u00e9chiffrer les mots.", "mild": "ti\u00e8de", "the ground is littered with small teeth": "le sol est jonch\u00e9 de petites dents", "The Coal Mine": "Une mine de charbon", "The Scout": "L'\u00e9claireur", "an old wanderer arrives": "un vieux vagabond arrive", "a trading post would make commerce easier": "un comptoir rendrait le commerce plus facile", "the mouth of the cave is wide and dark.": "l'entr\u00e9e de la grotte est grande et sombre.", "a small supply cache is hidden at the back of the cave.": "une petite cachette \u00e0 provision se trouve au fond de la cave.", "willing to talk about it, for a price.": "Elle veut bien en parler, mais \u00e7a a un prix.", "a large beast charges out of the dark": "Une grande b\u00eate appara\u00eet dans l'obscurit\u00e9 et charge", "steelworks": "aci\u00e9rie", "The Thief": "Le voleur", "a strange looking bird speeds across the plains": "un oiseau \u00e9trange vole rapidement au dessus des plaines", "a scout stops for the night": "une \u00e9claireuse s\u2019arr\u00eate pour la nuit", "A Borehole": "Un forage", "leave cave": "sortir de la cave", "should cure the meat, or it'll spoil. builder says she can fix something up.": "il faudrait faire s\u00e9cher la viande pour \u00e9viter qu'elle pourrisse. L'ouvri\u00e8re dit qu'elle pourra bricoler quelque chose.", "cloth": "chiffon", "tell him to leave": "lui dire de partir", "an improvised shop is set up on the sidewalk.": "un magasin improvis\u00e9 est mont\u00e9 sur le trottoire.", "armour": "armure", "an old house remains here, once white siding yellowed and peeling.": "une vielle maison est toujours l\u00e0. sa peinture, \u00e0 l'origine blanche, est maintenant jaune et \u00e9caill\u00e9e.", "never go thirsty again": "plus jamais soif", "baited trap": "pi\u00e8ge avec app\u00e2t", "a giant lizard shambles forward": "Un l\u00e9zard gigantesque se tra\u00eene vers vous", "the tunnel opens up at another platform.": "le tunnel d\u00e9bouche sur une nouvelle station.", "restart the game?": "recommencer la partie ?", "searching the bodies yields a few supplies.": "les corps sont fouill\u00e9s pour trouver quelques objets de valeurs.", "hull:": "bouclier:", "builder says leather could be useful. says the villagers could make it.": "l'ouvri\u00e8re dit que du cuir pourrait \u00eatre utile. elle dit que les villageois pourraient en fabriquer.", "builder finishes the smokehouse. she looks hungry.": "L'ouvri\u00e8re a fini le fumoir. elle a l'air affam\u00e9e.", "sword is sharp. good protection out in the wilds.": "l'\u00e9p\u00e9e est tranchante, une bonne protection dans la nature.", "he smiles warmly and asks for lodgings for the night.": "il souri chaleureusement et demande un abri pour la nuit.", "camp fires burn by the entrance to the mine.": "un feu de camps br\u00fble a l'entr\u00e9e de la mine.", "the sulphur mine is clear of dangers": "la mine de souffre est maintenant sans danger", "give 100": "donner 100", "just as deadly now as they were then.": "toujours aussi mortels.", "ignore it": "l'ignorer", "the mysterious wanderer returns, cart piled high with furs.": "la myst\u00e9rieuse vagabonde revient, la charrette d\u00e9bordante de fourrures.", "starvation sets in": "la famine s'installe", "A Scavenger": "Un pilleur", "but there is a cache of medicine under the floorboards.": "mais il reste quelques m\u00e9dicaments dans une cachette sous le plancher.", "a snarling beast leaps out of the underbrush": "une b\u00eate grondante surgit des buissons", "a ragged stranger stumbles through the door and collapses in the corner": "une \u00e9trang\u00e8re en loque rentre en titubant et s'effondre dans un coin", "A Battlefield": "Un champ de bataille", "charm": "charme", "are you sure?": "\u00eates vous sur ?", "convoy": "convoi", "a haze falls over the village as the steelworks fires up": "une brume tombe sur le village lorsque l\u2019aci\u00e9rie d\u00e9marre", "builder's not sure he's to be trusted.": "l'ouvri\u00e8re ne lui fait pas confiance.", "A Soldier": "Un soldat", "A Military Raid": "Un raid militaire", "there's not much, but some useful things can still be found.": "il n'y a pas grand chose, mais il reste n\u00e9anmois quelques objets utiles.", "a pack of lizards rounds the corner.": "au coin de la rue, plusieurs l\u00e9zards.", "s armour": "armure acier", "the sky is grey and the wind blows relentlessly": "le ciel est gris et le vents souffle implacablement", "a thug moves out of the shadows.": "un voyou sort de l'ombre.", "water replenished": "plein d'eau fait.", "won't say from where he came, but it's clear that he's not staying.": "il ne dit pas d'o\u00f9 il vient, mais il est clair qu'il ne restera pas.", "the hunting lodge stands in the forest, a ways out of town": "la cabane de chasseur est construite \u00e0 la sortie du village", "leaves a pile of small teeth behind.": "il laisse une pile de petites dents derri\u00e8re lui.", "a lone frog sits in the muck, silently.": "une grenouille solitaire est assise dans la vase, silencieuse.", "stealthy": "furtif", "nothing but downcast eyes.": "seul son regard d\u00e9moralis\u00e9 est visible.", "a fight, maybe.": "un combat, peut-\u00eatre.", "cart": "charrette", "dry brush and dead branches litter the forest floor": "des buissons secs et des branches mortes recouvrent le sol de la for\u00eat", "an old man bursts through a door, wielding a scalpel.": "un vieil homme surgit d'une porte, arm\u00e9 d'un scalpel.", "some medicine abandoned in the drawers.": "quelques m\u00e9dicaments ont \u00e9t\u00e9 abandonn\u00e9s dans les placards.", "time to move on.": "il est temps de repartir", "the streets are empty.": "les rues sont vides.", "saved.": "sauvegarde.", "A Raucous Village": "Un village bruyant", "A Murky Swamp": "Un marais boueux", "a small suburb lays ahead, empty houses scorched and peeling.": "devant, un petit lotissement. ses maisons br\u00fbl\u00e9es ou effondr\u00e9es.", "not enough wood to get the fire going": "pas assez de bois pour alimenter le feu", "bird must have liked shiney things.": "l'oiseau devait aimer ce qui brille.", "the clinic has been ransacked.": "la clinique \u00e0 \u00e9t\u00e9 saccag\u00e9e", "builder says there are more wanderers. says they'll work, too.": "l'ouvri\u00e8re dit qu'il y'a d'autres vagabonds dehors. elle dit qu'ils travailleront. eux aussi.", "a mysterious wanderer arrives": "un myst\u00e9rieux vagabond arrive", "castoff from the mammoth drills can still be found by the edges of the precipice.": "les \u00e9normes t\u00eates de forages sont encore visibles au bord du gouffre.", "he leaves a reward.": "il laisse une r\u00e9compense.", "restart.": "recommencer.", "buy bait": "acheter des app\u00e2ts", "punches do more damage": "les points font plus de d\u00e9gats", "a military perimeter is set up around the mine.": "un p\u00e9rim\u00e8tre s\u00e9curis\u00e9 a \u00e9t\u00e9 mis en place autour de la mine.", "leather's not strong. better than rags, though.": "le cuir n'est pas tr\u00e8s r\u00e9sistant, mais c'est mieux que des chiffons.", "carrying more means longer expeditions to the wilds": "porter plus signifie des exp\u00e9ditions plus longue dans les contr\u00e9s sauvages", "iron": "fer", "it puts up little resistance before the knife.": "elle r\u00e9siste faiblement face au couteau.", "the villagers hang the thief high in front of the store room.": "les villageois pendent le voleur devant l\u2019entrep\u00f4t.", "The Iron Mine": "La mine de fer", "hang him": "le pendre", "A Ruined City": "Une ville en ruine", "Room": "Pi\u00e8ce", "men mill about, weapons at the ready.": "des hommes patrouillent, les armes charg\u00e9es.", "say goodbye": "dire au revoir", "shares what he knows about sneaking before he goes.": "il partage ses astuces pour \u00eatre discret avant de s'en aller.", "buy:": "acheter:", "the cask holds enough water for longer expeditions": "le tonneau contiendra assez d'eau pour des exp\u00e9ditions plus longues", "the warped man lies dead.": "l'homme d\u00e9form\u00e9 est mort.", "medicine": "m\u00e9dicament", "snarling beast": "b\u00eate qui grogne", "a gunshot rings through the trees.": "une d\u00e9tonation retenti dans la for\u00eat.", "learned to throw punches with purpose": "appris \u00e0 donner des coups de points avec un objectif", "the towers of a decaying city dominate the skyline": "les grattes ciels d'une ville sont visibles \u00e0 l'horizon", "builder says she could make finer things, if she had the tools": "L'ouvri\u00e8re dit qu'elle pourrait faire des objets de meilleurs qualit\u00e9s, si elle avait les outils.", "the operating theatre has a lot of curious equipment.": "le bloc op\u00e9ratoire contient un curieux mat\u00e9riel.", "salvage": "r\u00e9cup\u00e9rer", "evasive": "esquive", "the wanderer leaves, cart loaded with wood": "le vagabond s'en va, la charrette charg\u00e9e de bois", "talk": "parler", "The Mysterious Wanderer": "Le myst\u00e9rieux vagabond", "a large bird nests at the top of the stairs.": "un grand nid d'oiseau en haut de l'\u00e9scalier.", "the wagon can carry a lot of supplies": "le chariot peut transporter plus de provisions", "strips of meat are hung up to dry in this ward.": "des morecaux de viande sont accroch\u00e9s aux fenetres de la maison pour s\u00e9cher.", "do nothing": "ne rien faire", "continue": "continuer", "learned how not to be seen": "vous savez comment ne pas \u00eatre vu", "A Silent Forest": "Une for\u00eat silencieuse", "smoldering": "est fumant", "the feral terror is dead": "la terreur sauvage est morte", "A Firelit Room": "Une pi\u00e8ce \u00e9clair\u00e9e", "the plague rips through the village.": "la peste d\u00e9cime tout le village", "use meds": "se soigner", "feral howls echo out of the darkness.": "des hurlements de terreurs r\u00e9sonnent dans le noir.", "An Old House": "Une vieille maison", "bone spear": "lance", "a bundle of sticks lies just beyond the threshold, wrapped in coarse furs.": "quelques brindilles enroul\u00e9es d'une fourrure grossi\u00e8re sont pos\u00e9s sur le seuil de la porte.", "An Outpost": "Un avant poste", "the man is thankful.": "l'homme est reconnaissant.", "more traps won't help now": "plus de pi\u00e8ge n'apportera rien de plus maintenant", "a snarling beast jumps out from behind a car.": "une b\u00eate grondante \u00e9tait cach\u00e9 derri\u00e8re une voiture.", "A Huge Borehole": "Un \u00e9norme forage", "A Sniper": "Un sniper", "scavenger": "pilleur", "more soldiers will be on their way.": "d'autre soldats vont venir.", "a nomad arrives, looking to trade": "un nomade arrive, pr\u00eat \u00e0 faire du troc", "someone throws a stone.": "quelqu'un jete une pierre.", "track them": "les suivre", "spare him": "l'\u00e9pargner", "lights on.": "lumi\u00e8res allum\u00e9es.", "scraps of fur": "des morceaux de fourrure", "there is no more water": "il n'y a plus d'eau", "a large creature lunges, muscles rippling in the torchlight": "une grande cr\u00e9ature se pr\u00e9cipite, ses muscles ondulant sous la lumi\u00e8re des torches", "street above the subway platform is blown away.": "la rue au dessus de la station de metro \u00e0 \u00e9xplos\u00e9e.", "a convoy lurches in, equal parts worry and hope.": "un convoi arrive, plein de crainte et d'\u00e9spoir.", "the remains of an old house stand as a monument to simpler times": "les restes d'une ancienne maison reste tel un monument en m\u00e9moire d'un temps ou les choses \u00e9taient plus simples", "the small military outpost is well supplied.": "le petit avant poste militaire est bien \u00e9quip\u00e9.", "leather": "cuir", "burning": "cr\u00e9pite", "Noises": "Bruits", "the compass points south.": "la boussole pointe vers le sud", "it contains travelling gear, and a few trinkets.": "il contient des objets pour voyager et quelques babioles.", "it's been picked over by scavengers, but there's still some things worth taking.": "le batiment \u00e0 \u00e9t\u00e9 pill\u00e9, mais il reste quelques objets qui m\u00e9ritent d'\u00eatre emmen\u00e9s.", "scout": "\u00e9claireur", "An Outpost": "Un avant poste", "learned to strike faster without weapons": "appris \u00e0 attaquer plus vite sans arme", "available": "disponible", "a man charges down the hall, a rusty blade in his hand": "un homme charge dans l'entr\u00e9e, une vieille \u00e9p\u00e9e rouill\u00e9e \u00e0 la main", "enter": "entrer", "cured meat": "viande s\u00e9ch\u00e9e", "deep in the swamp is a moss-covered cabin.": "au centre du mar\u00e9cage, une cabane recouverte de mousse.", "A Ruined Trap": "Un pi\u00e8ge d\u00e9truit", "lets some light down into the dusty haze.": "un peu de lumi\u00e8re la dedans sera le bienvenue.", "a squat building up ahead.": "Unsquat en vue devant.", "maybe some useful stuff in the rubble.": "il y'a peut \u00eatre quelque chose d'utile dans ces d\u00e9combres.", "the mysterious wanderer returns, cart piled high with wood.": "le myst\u00e9rieux vagabond reviens, la charrette d\u00e9bordante de bois.", "still time to rescue a few supplies.": "il est encore temps de sauver quelques objets.", "attack": "attaquer", "An Abandoned Town": "Une ville abandonn\u00e9e", "a pack of snarling beasts pours out of the trees.": "une meute de b\u00eates sort de la foret.", "the stranger in the corner stops shivering. her breathing calms.": "l'\u00e9trang\u00e8re dans le coin arr\u00eate de trembler. sa respiration se calme.", "a soldier, alerted, opens fire.": "un soldat, alert\u00e9, ouvre le feu.", "free {0}/{1}": "libre {0}/{1}", "man-eater": "mangeur d'homme", "a huge lizard scrambles up out of the darkness of an old metro station.": "un \u00e9norme l\u00e9zard s'extirpe de l'entr\u00e9e sombre d'une vieille station de m\u00e9tro.", "builder": "ouvrier", "the door hangs open.": "la porte est ouverte", "the darkness is absolute": "l\u2019obscurit\u00e9 est compl\u00e8te", "A Snarling Beast": "Une b\u00eate qui grogne", "a battle was fought here, long ago.": "Une bataille \u00e0 eu lieu ici, il y'a longtemps.", "tangle": "bola", "restore more health when eating": "r\u00e9cup\u00e9rer plus de vie en mangeant", "the gaunt man is dead": "l'homme d\u00e9charn\u00e9 est mort.", "some weird metal he picked up on his travels.": "un m\u00e9tal \u00e9trange qu'il a ramass\u00e9 durant ses voyages.", "another beast, draw by the noise, leaps out of a copse of trees.": "une autre b\u00eate, attir\u00e9e par le bruit, sort d'un arbre mort.", "the rest of the hospital is empty.": "le reste de l'hopital est vide.", "ripe for the picking.": "qui attendent un nouveau propri\u00e9taire.", "the crowd surges forward.": "la foule s'\u00e9lance.", "bedrolls, torn and blackened, lay beneath a thin layer of dust.": "des sacs de couchage, d\u00e9chir\u00e9s et noircis, tra\u00eenent sous une mince couche de poussi\u00e8re.", "the nights are rent with screams.": "les nuits sont remplies de cris.", "not enough ": "insuffisant", "the coal mine is clear of dangers": "La mine de charbon est s\u00e9curis\u00e9e", "wagon": "chariot", "only the chief remains.": "seul le chef reste.", "not enough scales": "\u00e9caille insuffisante", "not enough cloth": "chiffon insuffisante", "say he should be strung up as an example.": "ils disent qu'il devrait \u00eatre pendu, pour l'exemple.", "a youth lashes out with a tree branch.": "un jeune attaque arm\u00e9 d'une branche d'arbre.", "a masked soldier rounds the corner, gun drawn": "un soldat masqu\u00e9 appara\u00eet a un croisement, l'arme au poing", "learned to make the most of food": "vous savez tirer partie un maximum de la nourriture", "a pristine medicine cabinet at the end of a hallway.": "au bout du couloir, une armoire \u00e0 pharmacie en parfait \u00e9tat.", "slash": "coup d'\u00e9p\u00e9e (acier)", "more squatters are crowding around now.": "de plus en plus de squatters se rassemblent.", "A Tiny Village": "Un petit village", "the debris is denser here.": "il y'a plus de d\u00e9brits par ici.", "most of the windows at ground level are busted anyway.": "de toute fa\u00e7on, la plupart des fen\u00eatres du rez de chauss\u00e9e ont \u00e9clat\u00e9es", "a beast stands alone in an overgrown park.": "au milieu d'un parc se trouve une b\u00eate.", "a sick man hobbles up": "un homme arrive, boitillant", "Sickness": "Maladie", "traps are more effective with bait.": "les pi\u00e8ges sont plus efficace avec des app\u00e2ts", "the compass points northeast.": "le boussole pointe vers le nord est.", "there is nothing else here.": "il n'y a rien d'autre ici.", "the walls are scorched from an old battle.": "les murs sont cribl\u00e9s d'impacts suite \u00e0 des combats finis depuis longtemps.", "learned to fight quite effectively without weapons": "apprendre \u00e0 se battre de fa\u00e7on efficace sans arme", "water": "eau", "Outside": "Dehors", "the nest of a large animal lies at the back of the cave.": "le nid d'un grand animal se trouve au fond de la cave.", "an old case is wedged behind a rock, covered in a thick layer of dust.": "une vieille valise est pos\u00e9e contre un rocher. elle est recouverte d'une \u00e9paisse couche de poussi\u00e8re.", "hp: {0}/{1}": "vie: {0}/{1}", "A Deserted Town": "Une ville d\u00e9serte", "they must be here for a reason.": "ils ne doivent pas \u00eatre l\u00e0 sans raison.", "with a little effort, it might fly again.": "Avec quelques efforts, \u00e7a pourrait revoler.", "hunter": "chasseur", "the sound of gunfire carries on the wind.": "un bruit d'arme \u00e0 feu est port\u00e9 par le vent.", "might be things worth having still inside.": "il y reste peut \u00eatre des choses de valeurs \u00e0 l'int\u00e9rieur.", "An Old House": "Une vieille maison", "well armed men charge out of the forest, firing into the crowd.": "des hommes arm\u00e9s surgissent hors de la foret et tirent sur tout ce qui bouge.", "strange bird": "oiseau \u00e9trange", "large prints lead away, into the forest.": "de larges empruntes vont vers la for\u00eat.", "cask": "tonneau", "a tribe of elderly squatters is camped out in this ward.": "une tribue de vieux squatters campe dans ce quartier.", "Sulphur Mine": "Mine de souffre", "app store.": "app store", "a sickness is spreading through the village.": "le village est contamin\u00e9 par une maladie", "blast": "tirer (lazer)", "the towers that haven't crumbled jut from the landscape like the ribcage of some ancient beast.": "les tours qui ne se sont pas effondr\u00e9es ressemblent \u00e0 une cage thoracique d'une b\u00eate pr\u00e9historique.", "go twice as far without drinking": "aller deux fois plus loin sans boire", "sulphur miner": "mineur de souffre", "the place has been swept clean by scavengers.": "cet endroit \u00e0 \u00e9t\u00e9 completement nettoy\u00e9 par des pillards.", "some wood is missing.": "du bois a disparu.", "not enough iron": "fer insuffisant", "stores": "entrep\u00f4t", "picking the bones finds some useful trinkets.": "en fouillant dans les ossements, on trouve quelques babioles qui pourraient \u00eatre utiles.", "A Ruined City": "Une ville en ruine", "inside, the remains of its victims are everywhere.": "a l'int\u00e9rieur, les restes de ses victimes sont partout.", "the room is {0}": "la pi\u00e8ce est {0}", "save this.": "sauvegarder.", "builder stokes the fire": "L'ouvrier attise le feu", "export or import save data, for backing up": "exporter ou importer vos donn\u00e9es de sauvegarde", "the shivering man is dead": "l'homme tremblant est mort.", "the rest bury them.": "ils sont enterr\u00e9s par les survivants.", "the point is made. in the next few days, the missing supplies are returned.": "le message est pass\u00e9. Les biens manquant sont rendus dans les jours qui suivent.", "a second soldier joins the fight.": "un deuxi\u00e8me soldat rejoint le combat.", "a few belongings rest against the walls.": "quelques objets sont pos\u00e9s contre les murs.", "dodge attacks more effectively": "esquiver les attaques de fa\u00e7on plus efficace", "something's causing a commotion a ways down the road.": "quelque chose s'agite en bas de la route.", "only dust and stains remain.": "seul reste quelques marques ainsi qu'un peu de poussi\u00e8re.", "engine:": "moteur:", "ignore them": "les ignorer", "meat": "viande", "tannery": "tannerie", "run": "courir", "craft:": "fabriquer:", "a beast charges out of a ransacked classroom.": "un b\u00eate sort d'une salle de classe saccag\u00e9e et charge.", "leave town": "quitter la ville", "land blows more often": "mieux reconna\u00eetre les mouvements", "the thirst becomes unbearable": "la soif devient insupportable", "a second soldier opens fire.": "un deuxi\u00e8me soldat ouvre le feu.", "learn scouting": "apprendre la reconnaissance", "some traps have been destroyed": "des pi\u00e8ges ont \u00e9t\u00e9 d\u00e9truits", "someone has locked and barricaded the door to this operating theatre.": "quelqu'un \u00e0 ferm\u00e9 et barricad\u00e9 la porte de cette salle d'op\u00e9ration.", "the sickness is cured in time.": "la maladie est soign\u00e9 \u00e0 temps.", "leave city": "quitter la cit\u00e9", "a green cross barely visible behind grimy windows.": "une croix verte est a peine visible derri\u00e8re des rideaux d\u00e9pareill\u00e9s.", "take:": "prendre:", "a sound comes from the tunnel, just ahead.": "un bruit vient du tunnel, droit devant.", "scattered teeth": "des dents", "the old compass is dented and dusty, but it looks to work.": "la vieille boussole est ab\u00eem\u00e9e et rouill\u00e9e, mais elle semble encore fonctionner", "A Shivering Man": "Un homme tremblant", "give 500": "en donner 500", "lob": "lancer grenade", "still a few drops of water in the old well.": "il reste un peu d'eau dans le puit.", "feral terror": "terreur sauvage", "an old wanderer arrives.": "un vieux vagabond arrive.", "a shack stands at the center of the village.": "une cabane se trouve au centre du village.", "a large man attacks, waving a bayonet.": "un homme costaud attaque avec une ba\u00efonnette. ", "not enough coal": "charbon insuffisant", "asks for any spare furs to keep him warm at night.": "il demande quelques morceaux de fourrure pour lui tenir chaud la nuit.", "a weathered family takes up in one of the huts.": "une famille \u00e9puis\u00e9e s'intalle dans une cabane.", "the people back away, avoiding eye contact.": "les gens reculent, \u00e9vitant de croiser le regard.", "the path leads to an abandoned mine": "le chemin m\u00e8ne \u00e0 une mine abandonn\u00e9e", "a panicked scavenger bursts through the door, screaming.": "un pillard paniqu\u00e9 sort pr\u00e9cipitament en hurlant.", "tannery goes up quick, on the edge of the village": "au bord du village, la tannerie se construit vite", "Thermosphere": "Thermosph\u00e8re", "the familiar curves of a wanderer vessel rise up out of the dust and ash. ": "la courbe famili\u00e8re d'un vaisseau de vagabond apparait derri\u00e8re la poussi\u00e8re et la cendre.", "freezing": "gel\u00e9e", "a startled beast defends its home": "Une b\u00eate effray\u00e9e d\u00e9fend son territoire", "bait": "app\u00e2t", "the torch sputters and dies in the damp air": "la torche cr\u00e9pite une derni\u00e8re fois et s\u2019\u00e9teint dans l'air humide.", "not far from the village lies a large beast, its fur matted with blood.": "pas loin du village g\u00eet une b\u00eate agonisante, sa fourrure pleine de sang.", "save.": "sauvegarder.", "cancel": "annuler", "rifle": "fusil", "in exchange, the wanderer offers his wisdom.": "en \u00e9change, il offrira un peu de sa sagesse.", "the compass points northwest.": "le boussole pointe vers le nord ouest.", "boxer": "boxeur", "The Beggar": "Le mendiant", "a few items are scattered on the ground.": "quelques objets trainent sur le sol.", "builder just shivers": "L'ouvri\u00e8re \u00e0 trop froid", "tattered cloth": "un tas de chiffons", "no": "non", "learned to look ahead": "vous savez regarder plus loin", "the footsteps stop.": "les bruits de pas s'arr\u00eatent.", "only a few die.": "seuls quelques uns meurent.", "the steel is strong, and the blade true.": "l'acier est r\u00e9sistant, et la larme magnifique", "the house has been ransacked.": "la maison \u00e0 \u00e9t\u00e9 saccag\u00e9e.", "a shot rings out, from somewhere in the long grass": "un tir retenti, quelque part dans les hautes herbes", "some good stuff woven into its nest.": "il y'a des choses int\u00e9ressantes dans sont nid.", "the beggar expresses his thanks.": "le mendiant vous remercie chaleureusement.", "wood": "bois", "put the save code here.": "copier le code ici.", "faces, darkened by soot and blood, stare out from crooked huts.": "dans des cabanes d\u00e9labr\u00e9es, des visages noirs de suie et de sang, observent", "a wanderer arrives with an empty cart. says if she leaves with furs, she'll be back with more.": "une vagabonde arrive avec une charrette vide. elle dit que si elle peut emmener des fourrures, elle en ram\u00e8nera encore plus.", "the torchlight casts a flickering glow down the hallway.": "la torche projete des ombres dansantes le long du couloir.", "the old man had a small cache of interesting items.": "le vieille homme avait une cachette contenant des objets int\u00e9r\u00e9ssants.", "something's in there.": "il y'a quelque chose \u00e0 l\u2019int\u00e9rieur.", "punches do even more damage.": "les coups de points font plus de d\u00e9gats", "black powder and bullets, like the old days.": "de la poudre noir et des balles, comme a l'\u00e9poque.", "go home": "rentrer", "turn her away": "la renvoyer", "learned to swing weapons with force": "vous savez manier vos armes avec plus de force", "a soldier opens fire from across the desert": "un soldat ouvre feu dans le desert", "martial artist": "ma\u00eetre d'un art martial", "trap": "pi\u00e8ge", "a stranger arrives in the night": "un \u00e9tranger arrive durant la nuit", "not enough teeth": "dent insuffisante", "steel's stronger than iron": "l'acier est plus dur que le fer", "Stratosphere": "Stratosph\u00e8re", "eye for an eye seems fair.": "\u0153il pour \u0153il, dent pour dent, cela semble \u00e9quitable.", "rucksack": "sac \u00e0 dos", "5 medicine": "5 m\u00e9dicaments", "A Lonely Hut": "Une cabane solitaire", "Export / Import": "Exporter/Importer", "builder says the villagers could make steel, given the tools": "l'ouvri\u00e8re dit qu'avec les bon outils, les villageois pourraient fabriquer de l'acier", "Wanderer": "Vagabond", "A Gaunt Man": "Un homme d\u00e9charn\u00e9", "A Feral Terror": "Une terreur sauvage", "trapper": "trappeur", "iron's stronger than leather": "le fer est plus dur que le cuir", "A Forgotten Battlefield": "Un champ de bataille oubli\u00e9", "charcutier": "boucher", "smokehouse": "fumoir", "some weird glowing boxes he picked up on his travels.": "d'\u00e9trange boites lumineuses qu'il a ramass\u00e9 durant ses voyages.", "not much here.": "pas grand chose ici.", "Coal Mine": "Mine de charbon", "the young settler was carrying a canvas sack.": "le jeune portait un sac.", "evasion": "esquive", "not enough wood": "bois insuffisant", "armoury's done, welcoming back the weapons of the past.": "l'armurerie est finie, r\u00e9cup\u00e9rant avec plaisir les armes d'un temps pass\u00e9.", "can't tell what left it here.": "impossible de savoir ce qui \u00e0 fait \u00e7a.", "soldier": "soldat", "Iron Mine": "Mine :de fer", "A Large Village": "Un grand village", "the wood is running out": "il n'y a bient\u00f4t plus de bois", "the shell of a burned out car blocks the entrance.": "les restes d'une voiture brul\u00e9e bloquent l'entr\u00e9e.", "shivering man": "homme tremblant", "steel sword": "\u00e9p\u00e9e en acier", "a madman attacks, screeching.": "un fou attaque un hurlant.", "a wall of gnarled trees rises from the dust. their branches twist into a skeletal canopy overhead.": "un mur d'arbres noueaux sorte de la poussi\u00e8re. leurs branches se tordant pour former une canop\u00e9 squelettique.", "builder's not sure she's to be trusted.": "l'ouvri\u00e8re ne lui fait pas confiance.", "the grass thrashes wildly as a huge lizard pushes through": "l'herbe bouge bizarrement et un \u00e9norme l\u00e9zard surgit", "the trees yield to dry grass. the yellowed brush rustles in the wind.": "quelques arbres entour\u00e9s d'herbes s\u00e8ches et jauni, bruissant sous le vent", "precise": "pr\u00e9cision", "not enough fur": "fourrure insuffisante", "soldiers patrol the perimeter, rifles slung over their shoulders.": "des soldats patrouillent dans le p\u00e9rim\u00e8tre, fusils pos\u00e9s sur leurs \u00e9paules.", "melee weapons deal more damage": "les armes de m\u00eal\u00e9s font plus de d\u00e9g\u00e2ts", "a small basket of food is hidden under a park bench, with a note attached.": "un petit panier de nourriture est cach\u00e9 sous un banc. il y'a une note dessus.", "coal": "charbon", "go twice as far without eating": "aller deux fois plus loin sans manger", "the compass points ": "la boussole montre :", "the villagers haul a filthy man out of the store room.": "les villageois trainent un homme louche hors de l'entrep\u00f4t.", "more voices can be heard ahead.": "quelques voies semblent venir de devant.", "leaves some scraps of cloth behind.": "il laisse quelques vieux chiffons derri\u00e8re lui.", "a thief is caught": "un voleur est attrap\u00e9", "a scavenger waits just inside the door.": "un pillard attend de l'autre cot\u00e9 de la porte.", "the tracks disappear after just a few minutes.": "les empruntes disparaissent apr\u00e8s quelques minutes.", "behind the door, a deformed figure awakes and attacks.": "derri\u00e8re la porte, une forme d\u00e9figur\u00e9e se r\u00e9veille et attaque.", "the mine is now safe for workers.": "la mine est maintenant s\u00fbre pour les mineurs.", "the scavenger is dead": "le voleur est mort.", "the fight is short and bloody, but the beasts are repelled.": "le combat est bref et sanglant, mais les b\u00eates sont repouss\u00e9es.", "builder says she can make traps to catch any creatures might still be alive out there": "l'ouvri\u00e8re dit qu'elle peut fabriquer des pi\u00e8ges pour attraper des animaux qui pourraient \u00eatre toujours vivant dehors", "give 50": "donner 50", "not enough steel": "acier insuffisant", "the air is filled with dust, driven relentlessly by the hard winds.": "l'air est plein de poussi\u00e8re, d\u00e9plac\u00e9 par des vents secs implacables.", "steelworker": "sid\u00e9rurgiste", "A Crashed Starship": "Un vaisseau spatial \u00e9cras\u00e9", "the stench of rot and death fills the operating theatres.": "le bloc op\u00e9ratoire empeste une odeur de pourriture et de mort.", "barbarian": "barbare", "see farther": "voir plus loin", "investigate": "enqu\u00eater", "the soldier steps out from between the buildings, rifle raised.": "le soldat apparait entre deux immeubles, fusil \u00e0 l'\u00e9paule.", "warm": "douce", "empty corridors.": "des couloirs vides.", "the sounds stop.": "le bruit s\u2019arr\u00eate.", "the lizard is dead": "le l\u00e9zard est mort", "check traps": "v\u00e9rifier les pi\u00e8ges", "swing": "coup d'\u00e9p\u00e9e (fer)", "a swarm of rats rushes up the tunnel.": "une meute de rats d\u00e9boule du tunnel.", "the ground is littered with small scales": "le sol est jonch\u00e9 de petites \u00e9cailles", "a gaunt man approaches, a crazed look in his eye": "un homme d\u00e9charn\u00e9 approche, un regard d\u00e9ment dans ses yeux", "the convoy can haul mostly everything": "le convoi peut transporter presque tout", "broken streetlights stand, rusting. light hasn't graced this place in a long time.": "les r\u00e9verb\u00e8res sont cass\u00e9s et rouill\u00e9s. Cet endroit est d\u00e9sert depuis longtemps.", "this spear's not elegant, but it's pretty good at stabbing": "cette lance n'est pas tr\u00e8s jolie, mais elle est tr\u00e8s bonne pour frapper", "his time here, now, is his penance.": "sa pr\u00e9sence ici est sa p\u00e9nitence.", "a grizzled soldier attacks, waving a bayonet.": "un soldat grisonnant attaque \u00e0 la ba\u00efonnette.", "explore": "explorer", "waterskin": "gourde", "a beggar arrives.": "un mendiant arrive.", "The Master": "Le ma\u00eetre", "gather wood": "ramasser du bois", "looks like a camp of sorts up ahead.": "quelque chose ressemblant \u00e0 un campement devant.", "Ship": "Vaisseau", "take": "prendre", "a wanderer arrives with an empty cart. says if he leaves with wood, he'll be back with more.": "un vagabond arrive avec une charrette vide. il dit que s'il peut emmener du bois, il en ram\u00e8nera encore plus.", "forest": "foret", "the military presence has been cleared.": "la pr\u00e9sence militaire a \u00e9t\u00e9 n\u00e9ttoy\u00e9e.", "a large creature attacks, claws freshly bloodied": "Une grande cr\u00e9ature attaque, les griffes d\u00e9goulinante de sang", "the tentacular horror is defeated.": "l'horreur tentaculaire est vaincue.", "A Barren World": "Un monde st\u00e9rile", "a cave lizard attacks": "un l\u00e9zard attaque", "learned to predict their movement": "vous savez pr\u00e9dire leurs mouvement", "can't tell what they're up to.": "impossible de comprendre ce qui se dit.", "the compass points southwest.": "la boussole pointe vers le sud ouest.", "supplies:": "\u00e9quipement:", "somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.": "quelque part au dessus du nuage de d\u00e9bris s'en va le vaisseau du vagabond. Assez de temps pass\u00e9 sur ce morceau de caillou.", "a large shanty town sprawls across the streets.": "un grand bidonville s'\u00e9tend le long des rues.", "turn him away": "le renvoyer", " and ": " et ", "the remaining settlers flee from the violence, their belongings forgotten.": "les derniers habitants fuient la violence, laissant derri\u00e8re eux tout leurs biens.", "lodge": "relais de chasse", "the strange bird is dead": "l'\u00e9trange oiseau est mort.", "safer here": "c'est plus s\u00fbr ici", "through the walls, shuffling noises can be heard.": "a travers le murs, on peut entendre quelques bruits \u00e9touff\u00e9s ", "a nomad shuffles into view, laden with makeshift bags bound with rough twine.": "un nomade appara\u00eet, charg\u00e9 d'un sac de fortune ferm\u00e9 avec une corde rudimentaire.", "the sniper is dead": "le sniper est mort", "go inside": "entrer", "A Dark Room": "Une pi\u00e8ce sombre", "iron sword": "\u00e9p\u00e9e en fer", "A Huge Lizard": "Un \u00e9norme l\u00e9zard", "the small settlement has clearly been burning a while.": "la petite colonie br\u00fble visiblement depuis quelques temps.", "embark": "partir", "something's in the store room": "il y'a quelque chose dans l'entrep\u00f4t", "the compass points east.": "la boussole pointe vers l'est.", "stab": "coup de lance", "rotting reeds rise out of the swampy earth.": "des racines pourrissantes ressortent des mar\u00e9cages.", "the traps contain ": "les pi\u00e8ges contiennent ", "they took what they came for, and left.": "ils ont pris ce pour quoi ils \u00e9taient venus, puis sont repartis.", "there's nothing else here.": "il ny'a rien d'autre ici.", "the ground is littered with scraps of cloth": "des chiffons sont \u00e9parpill\u00e9s au sol", "now the nomads have a place to set up shop, they might stick around a while": "maintenant que les nomades ont un endroit pour faire du commerce, ils resteront ici quelques temps", "steel": "acier", "i armour": "armure fer", "The Nomad": "Le nomade", "import": "importer", "a shame to let what he'd found go to waste.": "ce serait une honte de gacher ce qu'il avait trouv\u00e9.", "the man swallows the medicine eagerly": "l'homme avale le m\u00e9dicament avidement", "the world fades": "le monde s\u2019efface", "descend": "descendre", "A Destroyed Village": "Un village d\u00e9truit", "light fire": "allumer le feu", "the meat has run out": "il n'y a plus de viande", "learned to be where they're not": "vous savez \u00eatre l\u00e0 o\u00f9 ils ne sont pas", "compass": "boussole", "the grasses thin. soon, only dust remains.": "l'herbe se rar\u00e9fie. Il ne reste bient\u00f4t plus qu'une terre poussi\u00e9reuse.", "the villagers retreat to mourn the dead.": "les villageois rentrent et vont pleurer leurs morts", "the days are spent with burials.": "les enterrements s\u2019encha\u00eenent durant des jours.", "a destroyed village lies in the dust.": "Des ruines d'un village recouvert de poussi\u00e8res.", "a swamp festers in the stagnant air.": "un mar\u00e9cage empeste.", "rusted chainlink is pulled across an alleyway.": "une chaine rouill\u00e9e bloque l'entr\u00e9e de l'all\u00e9e.", "close": "fermer", "armoury": "armurerie", "the plague is kept from spreading.": "La peste ne se propage plus.", "lucky that the natives can't work the mechanisms.": "heureusement que les natifs ne peuvent pas en comprendre le fonctionnement.", "the stranger is standing by the fire. she says she can help. says she builds things.": "l'\u00e9trang\u00e8re se tient pr\u00eat du feu. elle dit qu'elle peut aider. elle dit qu'elle sait construire des choses.", "A Crashed Ship": "Un vaisseau \u00e9cras\u00e9", "as soon as the door is open a little bit, hundreds of tentacles erupt.": "d\u00e8s que la porte est entre ouverte, des centaines de tentacules surgissent.", "Export": "Exporter", "unfathomable destruction to fuel wanderer hungers.": "mais il \u00e0 \u00e9chou\u00e9 et la men\u00e9 \u00e0 sa perte.", "a man hobbles up, coughing.": "un homme arrive. boitillant et toussant.", "this is irreversible.": "Il n'y a pas de retour en arri\u00e8re possible.", "Plague": "La peste", "the owner stands by, stoic.": "le propri\u00e9taire attend, sto\u00efque.", "ambushed on the street.": "une embuscade dans la rue.", "an overturned caravan is spread across the pockmarked street.": "une caravane est renvers\u00e9e sur une route d\u00e9j\u00e0 bien abim\u00e9e.", "A Man-Eater": "Un mangeur d'homme", "always worked before, at least.": "du moins, \u00e7a fonctionnait comme \u00e7a avant.", "got it": "compris", "flickering": "vacille", "a man joins the fight": "Une personne rejoint le combat", "a frail man stands defiantly, blocking the path.": "un homme fr\u00eale se tien debout, bloquant le chemin avec un air de d\u00e9fi.", "worth killing for, it seems.": "il semblerait que ce soit suffisant pour justifier un meurtre", "a squatter stands firmly in the doorway of a small hut.": "un squatter se tient fermement devant l'entr\u00e9e d'une petite cabane.", "hut": "cabane", "A Destroyed Village": "Un village d\u00e9truit", "or migrating computers": "pour sauver votre partie ou changer d'ordinateur", "The Sulphur Mine": "La mine de souffre", "an old iron mine sits here, tools abandoned and left to rust.": "ici se trouve une vieille mine de fer, les outils abandonn\u00e9s, bon pour rouiller.", "roaring": "br\u00fble", "punch twice as fast, and with even more force": "frapper deux fois plus vite, et avec plus de force", "a beggar arrives": "un mendiant arrive", "the metallic tang of wanderer afterburner hangs in the air.": "une odeur m\u00e9tallique flotte dans l'air.", "rot's been to work on it, and some of the pieces are missing.": "le corps est en pleine d\u00e9composition et il en manque une partie.", "builder says she can make a cart for carrying wood": "l\u2019ouvri\u00e8re dit qu'elle peut construire un charrette pour ramasser du bois", "a man stands over a dead wanderer. notices he's not alone.": "un homme se tien debout \u00e0 cot\u00e9 du cadavre d'un vagabond. Il n'est pas seul.", "strange scales": "des \u00e9cailles \u00e9tranges", "a huge hole is cut deep into the earth, evidence of the past harvest.": "un trou \u00e9norme \u00e0 \u00e9t\u00e9 d\u00e9coup\u00e9 dans la terre, une preuve d'une activit\u00e9 pass\u00e9e.", "strips of meat hang drying by the side of the street.": " des morceaux de viandes sechent sur le bord de la route.", "Troposphere": "Troposph\u00e8re", "scavengers must have gotten to this place already.": "les pillards ont d\u00e9j\u00e0 du trouver cet endroit.", "bleached bones are strewn about the entrance. many, deeply scored with jagged grooves.": "des os compl\u00e8tement blancs sont \u00e9parpill\u00e9s autour de l'entr\u00e9e. Nombre d'entre eux portent des traces de dents.", "nothing": "rien", "squeeze": "se serrer", "buy map": "acheter une carte", "not enough alien alloy": "pas assez de carburant extra-terrestre", "teeth": "dent", "vague shapes move, just out of sight.": "une forme indistincte s'\u00e9loigne dans l'ombre.", "the town's booming. word does get around.": "la ville s'agrandie, le mot se passe.", "the wood has run out": "il n'y a plus de bois", "Share": "Partager", "the forest is silent.": "la foret est silencieuse", "hot": "chaude", "the cave narrows a few feet in.": "la grotte se r\u00e9tr\u00e9cit apr\u00e8s quelques pas \u00e0 l'int\u00e9rieur.", "A Damp Cave": "Une cave humide", "linger": "s'attarder", "dead": "est \u00e9teint", "export": "exporter", "torch": "torche", "A Dusty Path": "Un chemin poussi\u00e9reux", "the scout says she's been all over.": "l'\u00e9claireuse dit qu'elle a \u00e9t\u00e9 partout.", "enegy cell": "chargeur energie", "upgrade engine": "am\u00e9liorer le moteur", "bullets": "balles", "the stranger shivers, and mumbles quietly. her words are unintelligible.": "l'\u00e9trang\u00e8re tremble, marmonne quelques mots. ses mots sont inintelligibles.", "gatherer": "ramasseur", "through the large gymnasium doors, footsteps can be heard.": "on peut entendre des bruits de pas \u00e0 travers les grandes portes du gymnase.", "pockets": "poches", "he speaks of once leading the great fleets to fresh worlds.": "il raconte qu'il fut un temps ou il menait la grande flotte en qu\u00eate d'un monde meilleur.", "the walls are moist and moss-covered": "les murs sont humides et recouverts de moisissures", "desert rat": "rat du d\u00e9sert", "buy compass": "acheter une boussole", "the barrens break at a sea of dying grass, swaying in the arid breeze.": "la lande s'arrete au profit d'une herbe morte parcourue par une brise s\u00e8che.", "bits of meat": "des morceaux de viande", "scavenger had a small camp in the school.": "le vagabond avait install\u00e9 un petit campement dans l'\u00e9cole.", "lizard": "l\u00e9zard", "the only hope is a quick death.": "le seul espoir est une mort rapide.", "tanner": "tanneur", "the man expresses his thanks and hobbles off.": "l'homme vous remercie et repart, boitillant.", "the trees are gone. parched earth and blowing dust are poor replacements.": "il n'y a plus d'arbre. la terre dess\u00e9ch\u00e9e et l'air emplis de poussi\u00e8re ne compensent pas leurs disparitions.", "Space": "L'\u00c9space", "the earth here is split, as if bearing an ancient wound": "\u00e0 cet endroit, la terre s'ouvre en deux, comme une ancienne blessure", "the light from the fire spills from the windows, out into the dark": "la lumi\u00e8re du feu se repend \u00e0 travers la a fen\u00eatre, dehors dans la nuit", "reinforce hull": "renforcer les bouclier", "trees loom on the horizon. grasses gradually yield to a forest floor of dry branches and fallen leaves.": "des arbres se dessinent \u00e0 l'horizon. l'herbe dispara\u00eet peu \u00e0 peu au profit d'une foret dont le sol est recouvert de feuilles mortes.", "the compass points west.": "le boussole pointe vers l'ouest", "A Modest Village": "Un village", "The Village": "Le village", "inside the hut, a child cries.": "\u00e0 l'int\u00e9rieur de la cabane, un enfant pleur.", "all the work of a previous generation is here.": "tout le travail d'une ancienne g\u00e9n\u00e9ration est l\u00e0.", "laser rifle": "fusil lazer", "if the code is invalid, all data will be lost.": "si le code est incorrect, toutes les donn\u00e9es seront perdues.", "trading post": "comptoir", "after a skirmish they are driven away, but not without losses.": "ils sont repouss\u00e9s apr\u00e8s une escarmouche, mais pas sans pertes.", "water:{0}": "eau:{0}", "Mesosphere": "M\u00e9sosph\u00e8re", "where the windows of the schoolhouse aren't shattered, they're blackened with soot.": "les quelques fen\u00eatres de l'\u00e9cole qui n'ont pas \u00e9t\u00e9 bris\u00e9es sont recouvertes de suie.", "learned how to ignore the hunger": "vous savez ignorer la faim", "the compass points southeast.": "la boussole pointe vers le sud est", "a crudely made charm": "un charme rudimentaire", "punch": "coup de poing", "the town lies abandoned, its citizens long dead": "la ville est totalement abandonn\u00e9e. ses citoyens mort depuis longtemps", "Ready to Leave?": "Pr\u00eat \u00e0 partir ?", "fires burn in the courtyard beyond.": "un feu br\u00fble dans une cour derri\u00e8re.", "say his folk have been skimming the supplies.": "ils disent que cet homme \u00e0 vol\u00e9 des provisions.", "1 medicine": "1 m\u00e9dicament", "coal miner": "mineur de charbon", "no more room for huts.": "il n'y a plus de place pour des cabanes.", "gaunt man": "homme d\u00e9charn\u00e9", "An Old Starship": "Un ancien vaisseau spatial", "the sickness spreads through the village.": "la maladie se repend dans le village.", "he begs for medicine.": "il supplie pour quelques m\u00e9dicaments.", "a torch to keep the dark away": "une torche pour repousser la nuit", "workshop's finally ready. builder's excited to get to it": "l'atelier est enfin pr\u00eat. L'ouvri\u00e8re est impatiente de s'y mettre", "A Beast Attack": "Une attaque de b\u00eate", "this waterskin'll hold a bit of water, at least": "cette gourde retiendra un peu d'eau, au moins", "some of the traps have been torn apart.": "des pi\u00e8ges ont \u00e9t\u00e9 mis en pi\u00e8ces", "none": "aucune", "the torch goes out": "la torche s\u2019\u00e9teint", "the house is abandoned, but not yet picked over.": "la maison est abandonn\u00e9e, mais elle n'a pas encore \u00e9t\u00e9 visit\u00e9e.", "collected scraps spread across the floor like they fell from heaven.": "des petits tas de d\u00e9chets sont \u00e9parpill\u00e9s sur le sol, comme s'ils \u00e9taient tomb\u00e9s du ciel.", "the iron mine is clear of dangers": "la mine de fer est s\u00fbre.", "this old mine is not abandoned": "cette vieille mine n'est pas abandonn\u00e9e", "beneath the wanderer's rags, clutched in one of its many hands, a glint of steel.": "sous quelques chiffons du vagabond, serr\u00e9e dans une main, un petit morceau d'acier.", "stoke fire": "attiser le feu", "cold": "froide", "Restart?": "Recommencer ?", "villagers could help hunt, given the means": "les villageois pourraient aider pour la chasse, si on leur donne les moyens", "fur": "fourrure", "someone had been stockpiling loot here.": "quelqu'un a stock\u00e9 plein de choses dedans.", "more traps to catch more creatures": "plus de pi\u00e8ges pour attraper plus d'animaux", "an old wanderer sits inside, in a seeming trance.": "\u00e0 l'int\u00e9rieur, un vieux vagabond est assis. il \u00e0 l'air en trance.", "a battered highway sign stands guard at the entrance to this once-great city.": "un panneau bossel\u00e9 tien toujours \u00e0 l'entr\u00e9e de ce qui fut autrefois une grande ville.", "can't see what's inside.": "impossible de voir ce qu'il y'a \u00e0 l'int\u00e9rieur.", "builder says it'd be useful to have a steady source of bullets": "l'ouvri\u00e8re dit que \u00e7a pourrait \u00eatre int\u00e9ressant d'avoir une source d'approvisionnement constante en munitions", "a beast, wilder than imagining, erupts out of the foliage": "une b\u00eate inimaginable surgit des feuillages", "the beast is dead.": "la b\u00eate est morte.", "medicine is needed immediately.": "des m\u00e9dicaments sont n\u00e9cessaires imm\u00e9diatement.", "thrust": "ba\u00efonnette", "perks:": "avantages:", "better avoid conflict in the wild": "mieux \u00e9viter les conflits dans un environnement hostile", "water tank": "r\u00e9servoir d'eau", "{0} per {1}s": "{0} /{1}s", "the snarling beast is dead": "la b\u00eate grognante est morte.", "buy teeth": "acheter des dents", "Exosphere": "Exosph\u00e8re", "alien alloy": "alliage extraterrestre", "leave": "partir", "workshop": "atelier", "the old tower seems mostly intact.": "la vieille tour \u00e0 l'air globalement intacte."}); diff --git a/mobileWarning.html b/mobileWarning.html index 97314f648..cf06a9b3f 100644 --- a/mobileWarning.html +++ b/mobileWarning.html @@ -1,34 +1,34 @@ - - - - A Dark Room - - - -
- -
- - A Dark Room isn't really mobile-friendly, and it requires arrow keys.
- Sorry about that!
-

- Of course you can play anyway, but it probably won't work!

- A Dark Room is now native on iOS! Get it on the App Store. -
-
- - + + + + A Dark Room + + + +
+ +
+ + A Dark Room isn't really mobile-friendly, and it requires arrow keys.
+ Sorry about that!
+

+ Of course you can play anyway, but it probably won't work!

+ A Dark Room is now native on iOS! Get it on the App Store. +
+
+ + diff --git a/script/Button.js b/script/Button.js index 6df7d0aba..b0e80c164 100644 --- a/script/Button.js +++ b/script/Button.js @@ -1,86 +1,86 @@ -var Button = { - Button: function(options) { - if(typeof options.cooldown == 'number') { - this.data_cooldown = options.cooldown; - } - this.data_remaining = 0; - if(typeof options.click == 'function') { - this.data_handler = options.click; - } - - var el = $('
') - .attr('id', typeof(options.id) != 'undefined' ? options.id : "BTN_" + Engine.getGuid()) - .addClass('button') - .text(typeof(options.text) != 'undefined' ? options.text : "button") - .click(function() { - if(!$(this).hasClass('disabled')) { - Button.cooldown($(this)); - $(this).data("handler")($(this)); - } - }) - .data("handler", typeof options.click == 'function' ? options.click : function() { Engine.log("click"); }) - .data("remaining", 0) - .data("cooldown", typeof options.cooldown == 'number' ? options.cooldown : 0); - - el.append($("
").addClass('cooldown')); - - if(options.cost) { - var ttPos = options.ttPos ? options.ttPos : "bottom right"; - var costTooltip = $('
').addClass('tooltip ' + ttPos); - for(var k in options.cost) { - $("
").addClass('row_key').text(_(k)).appendTo(costTooltip); - $("
").addClass('row_val').text(options.cost[k]).appendTo(costTooltip); - } - if(costTooltip.children().length > 0) { - costTooltip.appendTo(el); - } - } - - if(options.width) { - el.css('width', options.width); - } - - return el; - }, - - setDisabled: function(btn, disabled) { - if(btn) { - if(!disabled && !btn.data('onCooldown')) { - btn.removeClass('disabled'); - } else if(disabled) { - btn.addClass('disabled'); - } - btn.data('disabled', disabled); - } - }, - - isDisabled: function(btn) { - if(btn) { - return btn.data('disabled') === true; - } - return false; - }, - - cooldown: function(btn) { - var cd = btn.data("cooldown"); - if(cd > 0) { - $('div.cooldown', btn).stop(true, true).width("100%").animate({width: '0%'}, cd * 1000, 'linear', function() { - var b = $(this).closest('.button'); - b.data('onCooldown', false); - if(!b.data('disabled')) { - b.removeClass('disabled'); - } - }); - btn.addClass('disabled'); - btn.data('onCooldown', true); - } - }, - - clearCooldown: function(btn) { - $('div.cooldown', btn).stop(true, true); - btn.data('onCooldown', false); - if(!btn.data('disabled')) { - btn.removeClass('disabled'); - } - } +var Button = { + Button: function(options) { + if(typeof options.cooldown == 'number') { + this.data_cooldown = options.cooldown; + } + this.data_remaining = 0; + if(typeof options.click == 'function') { + this.data_handler = options.click; + } + + var el = $('
') + .attr('id', typeof(options.id) != 'undefined' ? options.id : "BTN_" + Engine.getGuid()) + .addClass('button') + .text(typeof(options.text) != 'undefined' ? options.text : "button") + .click(function() { + if(!$(this).hasClass('disabled')) { + Button.cooldown($(this)); + $(this).data("handler")($(this)); + } + }) + .data("handler", typeof options.click == 'function' ? options.click : function() { Engine.log("click"); }) + .data("remaining", 0) + .data("cooldown", typeof options.cooldown == 'number' ? options.cooldown : 0); + + el.append($("
").addClass('cooldown')); + + if(options.cost) { + var ttPos = options.ttPos ? options.ttPos : "bottom right"; + var costTooltip = $('
').addClass('tooltip ' + ttPos); + for(var k in options.cost) { + $("
").addClass('row_key').text(_(k)).appendTo(costTooltip); + $("
").addClass('row_val').text(options.cost[k]).appendTo(costTooltip); + } + if(costTooltip.children().length > 0) { + costTooltip.appendTo(el); + } + } + + if(options.width) { + el.css('width', options.width); + } + + return el; + }, + + setDisabled: function(btn, disabled) { + if(btn) { + if(!disabled && !btn.data('onCooldown')) { + btn.removeClass('disabled'); + } else if(disabled) { + btn.addClass('disabled'); + } + btn.data('disabled', disabled); + } + }, + + isDisabled: function(btn) { + if(btn) { + return btn.data('disabled') === true; + } + return false; + }, + + cooldown: function(btn) { + var cd = btn.data("cooldown"); + if(cd > 0) { + $('div.cooldown', btn).stop(true, true).width("100%").animate({width: '0%'}, cd * 1000, 'linear', function() { + var b = $(this).closest('.button'); + b.data('onCooldown', false); + if(!b.data('disabled')) { + b.removeClass('disabled'); + } + }); + btn.addClass('disabled'); + btn.data('onCooldown', true); + } + }, + + clearCooldown: function(btn) { + $('div.cooldown', btn).stop(true, true); + btn.data('onCooldown', false); + if(!btn.data('disabled')) { + btn.removeClass('disabled'); + } + } }; \ No newline at end of file diff --git a/script/dropbox.js b/script/dropbox.js index 1cbb118cb..82f4d7223 100644 --- a/script/dropbox.js +++ b/script/dropbox.js @@ -1,362 +1,362 @@ -(function (Engine, Events, Dropbox, $) { - - /** - * Module that enables a save of the gamestate to the dropbox datastore - * @see https://www.dropbox.com/developers/datastore - * - * The dropbox datastore (dbds) connector lets you save your data to your own dropbox datastore - * without jamming files to it. - * - * This connector uses the game engines own base64 encoder. - */ - - 'use strict'; - - if (!Engine) { return false; } // Game Engine not available - if (!Dropbox) { return false; } // Dropbox Connector not available - - var DropboxConnector = { - - options: { - log: false, - key: 'q7vyvfsakyfmp3o', - table: 'adarkroom' - }, - - client: false, - table: false, - dropboxAccount: false, - savegameKey: false, - savegames: {0: null, 1: null, 2: null, 3: null, 4: null}, - - init: function (options) { - this.options = $.extend( - this.options, - options - ); - - this._log = this.options.log; - - this.client = new Dropbox.Client({key: DropboxConnector.options.key}); - this.connectToDropbox(false); - - return this; - }, - - startDropbox: function () { - if (!DropboxConnector.client || !DropboxConnector.table) { - DropboxConnector.startDropboxConnectEvent(); - } else { - DropboxConnector.startDropboxImportEvent(); - } - }, - - /** - * ****** - * Events - * ****** - */ - - startDropboxConnectEvent: function () { - Events.startEvent({ - title: _('Dropbox connection'), - scenes: { - start: { - text: [_('connect game to dropbox local storage')], - buttons: { - 'connect': { - text: _('connect'), - nextScene: 'end', - onChoose: function () { - DropboxConnector.connectToDropbox(DropboxConnector.startDropboxImportEvent); - } - }, - 'cancel': { - text: _('cancel'), - nextScene: 'end' - } - } - } - } - }); - }, - - startDropboxImportEvent: function () { - Events.startEvent({ - title: _('Dropbox Export / Import'), - scenes: { - start: { - text: [_('export or import save data to dropbox datastorage'), - _('your are connected to dropbox with account / email ') + DropboxConnector.dropboxAccount], - buttons: { - 'save': { - text: _('save'), - nextScene: {1: 'saveToSlot'} - }, - 'load': { - text: _('load'), - nextScene: {1: 'loadFromSlot'}, - onChoose: DropboxConnector.loadGamesFromDropbox - }, - 'signout': { - text: _('signout'), - nextScene: 'end', - onChoose: DropboxConnector.signout - }, - 'cancel': { - text: _('cancel'), - nextScene: 'end' - } - } - }, - saveToSlot: { - text: [_('choose one slot to save to')], - buttons: (function () { - var buttons = {}; - - $.each(DropboxConnector.savegames, function (n, savegame) { - buttons['savegame' + n] = { - text: _('save to slot') + n + ' ' + (savegame ? DropboxConnector.prepareSaveDate(savegame.get('timestamp')) : 'empty'), - nextScene: 'end', - onChoose: function () { - DropboxConnector.log('Save to slot ' + n + ' initiated'); - // timeout prevents error due to fade out animation of the previous event - window.setTimeout(function () { - DropboxConnector.log('Save to slot ' + n); - DropboxConnector.saveGameToDropbox(n, DropboxConnector.savedtoDropboxEvent); - }, 1000); - } - }; - }); - - buttons.cancel = { - text: _('cancel'), - nextScene: 'end' - }; - - return buttons; - }()) - }, - loadFromSlot: { - text: [_('choose one slot to load from')], - buttons: (function () { - var buttons = {}; - - $.each(DropboxConnector.savegames, function (n, savegame) { - if (savegame) { - buttons['savegame' + n] = { - text: _('load from slot') + n + ' ' + DropboxConnector.prepareSaveDate(savegame.get('timestamp')), - nextScene: 'end', - onChoose: function () { - DropboxConnector.log('Load from slot ' + n + ' initiated'); - // timeout prevents error due to fade out animation of the previous event - window.setTimeout(function () { - DropboxConnector.log('Load from slot ' + n); - DropboxConnector.loadGameFromDropbox(n); - }, 1000); - } - }; - } - }); - - buttons.cancel = { - text: _('cancel'), - nextScene: 'end' - }; - - return buttons; - }()) - } - } - }); - }, - - savedtoDropboxEvent: function (success) { - Events.startEvent({ - title: _('Dropbox Export / Import'), - scenes: { - start: { - text: success ? [_('successfully saved to dropbox datastorage')] : - [_('error while saving to dropbox datastorage')], - buttons: { - 'ok': { - text: _('ok'), - nextScene: 'end' - } - } - } - } - }); - }, - - /** - * *************** - * functional code - * *************** - */ - - /** - * Initiate dropbox connection - * - * @param interactive - * @param callback - */ - connectToDropbox: function (interactive, callback) { - - DropboxConnector.log('start dropbox'); - - var client = this.client; - - client.authenticate({interactive: interactive}, function (error) { - if (error) { - DropboxConnector.log('Dropbox Authentication error: ' + error); - } - }); - - if (client.isAuthenticated()) { - - var datastoreManager = client.getDatastoreManager(); - datastoreManager.openDefaultDatastore(function (error, datastore) { - if (error) { - DropboxConnector.log('Error opening default datastore: ' + error); - } else { - DropboxConnector.table = datastore.getTable(DropboxConnector.options.table); - DropboxConnector.loadGamesFromDropbox(); - - DropboxConnector.log(DropboxConnector.client.credentials()); - - DropboxConnector.client.getAccountInfo({}, function (error, info) { - if (!error) { - DropboxConnector.dropboxAccount = info.email; - } - }); - - DropboxConnector.log("Got savegames", DropboxConnector.savegames); - - if (typeof callback === "function") { - callback.call(DropboxConnector.table); - } - } - }); - } else { - DropboxConnector.log('Not connected to dropbox.'); - } - }, - - /** - * Requests your savegames fom dbds - * - * @returns {*} - */ - loadGamesFromDropbox: function () { - var savegames = DropboxConnector.savegames; - - $.each(savegames, function (n) { - var results = DropboxConnector.table.query({savegameId: DropboxConnector.prepareSavegameID(n)}); - savegames[n] = results[0]; - }); - - return savegames; - }, - - /** - * Imports a gamestate of a given slotnumber to your game - * - * @param slotnumber - */ - loadGameFromDropbox: function (slotnumber) { - - var table = DropboxConnector.table; - var id = DropboxConnector.prepareSavegameID(slotnumber); - var results = table.query({savegameId: id}); - var record = results[0]; - - if (record && record.get('gameState')) { - Engine.import64(record.get('gameState')); - } - }, - - /** - * Saves a gamestate to a given slot in dbds - * - * @param slotnumber - * @param callback - */ - saveGameToDropbox: function (slotnumber, callback) { - - var table = DropboxConnector.table; - var record = null; - var success = false; - var id = DropboxConnector.prepareSavegameID(slotnumber); - - var saveGame = { - gameState: Engine.generateExport64(), - timestamp: new Date().getTime() - }; - - if (DropboxConnector.savegames[slotnumber]) { // slot aleady used -> overwrite - record = DropboxConnector.savegames[slotnumber]; - try { - record.update(saveGame); - DropboxConnector.log("Updated savegame ", slotnumber); - success = true; - } catch (e) { - success = false; - } - - } else { - saveGame.savegameId = id; - try { - record = table.insert(saveGame); - DropboxConnector.log("Inserted savegame ", record.getId()); - success = true; - } catch (e) { - success = false; - } - } - if (typeof callback === "function") { - callback(success); - } - }, - - /** - * Terminates the connection to your db account - */ - signout: function () { - DropboxConnector.client.signOut({}, function (error) { - if (error) { - alert('Error while logout from dropbox'); - } else { - alert('Successfully signed out.'); - DropboxConnector.client = null; - DropboxConnector.savegames = null; - DropboxConnector.dropboxAccount = null; - } - }); - }, - - /** - * ************** - * Helper methods - * ************** - */ - - prepareSavegameID: function (slotnumber) { - return 'adarkroom_savegame_' + slotnumber; - }, - - prepareSaveDate: function (timestamp) { - var date = new Date(timestamp); - return date.toLocaleDateString() + ' ' + date.toLocaleTimeString(); - }, - - log: function () { - if (this._log) { - console.log(arguments); - } - } - }; - - Engine.Dropbox = DropboxConnector; - +(function (Engine, Events, Dropbox, $) { + + /** + * Module that enables a save of the gamestate to the dropbox datastore + * @see https://www.dropbox.com/developers/datastore + * + * The dropbox datastore (dbds) connector lets you save your data to your own dropbox datastore + * without jamming files to it. + * + * This connector uses the game engines own base64 encoder. + */ + + 'use strict'; + + if (!Engine) { return false; } // Game Engine not available + if (!Dropbox) { return false; } // Dropbox Connector not available + + var DropboxConnector = { + + options: { + log: false, + key: 'q7vyvfsakyfmp3o', + table: 'adarkroom' + }, + + client: false, + table: false, + dropboxAccount: false, + savegameKey: false, + savegames: {0: null, 1: null, 2: null, 3: null, 4: null}, + + init: function (options) { + this.options = $.extend( + this.options, + options + ); + + this._log = this.options.log; + + this.client = new Dropbox.Client({key: DropboxConnector.options.key}); + this.connectToDropbox(false); + + return this; + }, + + startDropbox: function () { + if (!DropboxConnector.client || !DropboxConnector.table) { + DropboxConnector.startDropboxConnectEvent(); + } else { + DropboxConnector.startDropboxImportEvent(); + } + }, + + /** + * ****** + * Events + * ****** + */ + + startDropboxConnectEvent: function () { + Events.startEvent({ + title: _('Dropbox connection'), + scenes: { + start: { + text: [_('connect game to dropbox local storage')], + buttons: { + 'connect': { + text: _('connect'), + nextScene: 'end', + onChoose: function () { + DropboxConnector.connectToDropbox(DropboxConnector.startDropboxImportEvent); + } + }, + 'cancel': { + text: _('cancel'), + nextScene: 'end' + } + } + } + } + }); + }, + + startDropboxImportEvent: function () { + Events.startEvent({ + title: _('Dropbox Export / Import'), + scenes: { + start: { + text: [_('export or import save data to dropbox datastorage'), + _('your are connected to dropbox with account / email ') + DropboxConnector.dropboxAccount], + buttons: { + 'save': { + text: _('save'), + nextScene: {1: 'saveToSlot'} + }, + 'load': { + text: _('load'), + nextScene: {1: 'loadFromSlot'}, + onChoose: DropboxConnector.loadGamesFromDropbox + }, + 'signout': { + text: _('signout'), + nextScene: 'end', + onChoose: DropboxConnector.signout + }, + 'cancel': { + text: _('cancel'), + nextScene: 'end' + } + } + }, + saveToSlot: { + text: [_('choose one slot to save to')], + buttons: (function () { + var buttons = {}; + + $.each(DropboxConnector.savegames, function (n, savegame) { + buttons['savegame' + n] = { + text: _('save to slot') + n + ' ' + (savegame ? DropboxConnector.prepareSaveDate(savegame.get('timestamp')) : 'empty'), + nextScene: 'end', + onChoose: function () { + DropboxConnector.log('Save to slot ' + n + ' initiated'); + // timeout prevents error due to fade out animation of the previous event + window.setTimeout(function () { + DropboxConnector.log('Save to slot ' + n); + DropboxConnector.saveGameToDropbox(n, DropboxConnector.savedtoDropboxEvent); + }, 1000); + } + }; + }); + + buttons.cancel = { + text: _('cancel'), + nextScene: 'end' + }; + + return buttons; + }()) + }, + loadFromSlot: { + text: [_('choose one slot to load from')], + buttons: (function () { + var buttons = {}; + + $.each(DropboxConnector.savegames, function (n, savegame) { + if (savegame) { + buttons['savegame' + n] = { + text: _('load from slot') + n + ' ' + DropboxConnector.prepareSaveDate(savegame.get('timestamp')), + nextScene: 'end', + onChoose: function () { + DropboxConnector.log('Load from slot ' + n + ' initiated'); + // timeout prevents error due to fade out animation of the previous event + window.setTimeout(function () { + DropboxConnector.log('Load from slot ' + n); + DropboxConnector.loadGameFromDropbox(n); + }, 1000); + } + }; + } + }); + + buttons.cancel = { + text: _('cancel'), + nextScene: 'end' + }; + + return buttons; + }()) + } + } + }); + }, + + savedtoDropboxEvent: function (success) { + Events.startEvent({ + title: _('Dropbox Export / Import'), + scenes: { + start: { + text: success ? [_('successfully saved to dropbox datastorage')] : + [_('error while saving to dropbox datastorage')], + buttons: { + 'ok': { + text: _('ok'), + nextScene: 'end' + } + } + } + } + }); + }, + + /** + * *************** + * functional code + * *************** + */ + + /** + * Initiate dropbox connection + * + * @param interactive + * @param callback + */ + connectToDropbox: function (interactive, callback) { + + DropboxConnector.log('start dropbox'); + + var client = this.client; + + client.authenticate({interactive: interactive}, function (error) { + if (error) { + DropboxConnector.log('Dropbox Authentication error: ' + error); + } + }); + + if (client.isAuthenticated()) { + + var datastoreManager = client.getDatastoreManager(); + datastoreManager.openDefaultDatastore(function (error, datastore) { + if (error) { + DropboxConnector.log('Error opening default datastore: ' + error); + } else { + DropboxConnector.table = datastore.getTable(DropboxConnector.options.table); + DropboxConnector.loadGamesFromDropbox(); + + DropboxConnector.log(DropboxConnector.client.credentials()); + + DropboxConnector.client.getAccountInfo({}, function (error, info) { + if (!error) { + DropboxConnector.dropboxAccount = info.email; + } + }); + + DropboxConnector.log("Got savegames", DropboxConnector.savegames); + + if (typeof callback === "function") { + callback.call(DropboxConnector.table); + } + } + }); + } else { + DropboxConnector.log('Not connected to dropbox.'); + } + }, + + /** + * Requests your savegames fom dbds + * + * @returns {*} + */ + loadGamesFromDropbox: function () { + var savegames = DropboxConnector.savegames; + + $.each(savegames, function (n) { + var results = DropboxConnector.table.query({savegameId: DropboxConnector.prepareSavegameID(n)}); + savegames[n] = results[0]; + }); + + return savegames; + }, + + /** + * Imports a gamestate of a given slotnumber to your game + * + * @param slotnumber + */ + loadGameFromDropbox: function (slotnumber) { + + var table = DropboxConnector.table; + var id = DropboxConnector.prepareSavegameID(slotnumber); + var results = table.query({savegameId: id}); + var record = results[0]; + + if (record && record.get('gameState')) { + Engine.import64(record.get('gameState')); + } + }, + + /** + * Saves a gamestate to a given slot in dbds + * + * @param slotnumber + * @param callback + */ + saveGameToDropbox: function (slotnumber, callback) { + + var table = DropboxConnector.table; + var record = null; + var success = false; + var id = DropboxConnector.prepareSavegameID(slotnumber); + + var saveGame = { + gameState: Engine.generateExport64(), + timestamp: new Date().getTime() + }; + + if (DropboxConnector.savegames[slotnumber]) { // slot aleady used -> overwrite + record = DropboxConnector.savegames[slotnumber]; + try { + record.update(saveGame); + DropboxConnector.log("Updated savegame ", slotnumber); + success = true; + } catch (e) { + success = false; + } + + } else { + saveGame.savegameId = id; + try { + record = table.insert(saveGame); + DropboxConnector.log("Inserted savegame ", record.getId()); + success = true; + } catch (e) { + success = false; + } + } + if (typeof callback === "function") { + callback(success); + } + }, + + /** + * Terminates the connection to your db account + */ + signout: function () { + DropboxConnector.client.signOut({}, function (error) { + if (error) { + alert('Error while logout from dropbox'); + } else { + alert('Successfully signed out.'); + DropboxConnector.client = null; + DropboxConnector.savegames = null; + DropboxConnector.dropboxAccount = null; + } + }); + }, + + /** + * ************** + * Helper methods + * ************** + */ + + prepareSavegameID: function (slotnumber) { + return 'adarkroom_savegame_' + slotnumber; + }, + + prepareSaveDate: function (timestamp) { + var date = new Date(timestamp); + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString(); + }, + + log: function () { + if (this._log) { + console.log(arguments); + } + } + }; + + Engine.Dropbox = DropboxConnector; + })(Engine, Events, Dropbox, jQuery); \ No newline at end of file diff --git a/script/engine.js b/script/engine.js index 1e527aeb0..145fdc317 100644 --- a/script/engine.js +++ b/script/engine.js @@ -605,30 +605,42 @@ switch(e.which) { case 38: // Up case 87: + if(Engine.activeModule == Outside || Engine.activeModule == Path) { + Engine.activeModule.scrollSidebar('up'); + } Engine.log('up'); break; case 40: // Down case 83: + if (Engine.activeModule == Outside || Engine.activeModule == Path) { + Engine.activeModule.scrollSidebar('down'); + } Engine.log('down'); break; case 37: // Left case 65: if(Engine.activeModule == Ship && Path.tab) Engine.travelTo(Path); - else if(Engine.activeModule == Path && Outside.tab) + else if(Engine.activeModule == Path && Outside.tab){ + Engine.activeModule.scrollSidebar('left', true); Engine.travelTo(Outside); - else if(Engine.activeModule == Outside && Room.tab) + }else if(Engine.activeModule == Outside && Room.tab){ + Engine.activeModule.scrollSidebar('left', true); Engine.travelTo(Room); + } Engine.log('left'); break; case 39: // Right case 68: if(Engine.activeModule == Room && Outside.tab) Engine.travelTo(Outside); - else if(Engine.activeModule == Outside && Path.tab) + else if(Engine.activeModule == Outside && Path.tab){ + Engine.activeModule.scrollSidebar('right', true); Engine.travelTo(Path); - else if(Engine.activeModule == Path && Ship.tab) + }else if(Engine.activeModule == Path && Ship.tab){ + Engine.activeModule.scrollSidebar('right', true); Engine.travelTo(Ship); + } Engine.log('right'); break; } @@ -718,6 +730,33 @@ })(); +function inView(dir, elem){ + + var scTop = $('#main').offset().top; + var scBot = scTop + $('#main').height(); + + var elTop = elem.offset().top; + var elBot = elTop + elem.height(); + + if( dir == 'up' ){ + // STOP MOVING IF BOTTOM OF ELEMENT IS VISIBLE IN SCREEN + return ( elBot < scBot ); + }else if( dir == 'down' ){ + return ( elTop > scTop ); + }else{ + return ( ( elBot <= scBot ) && ( elTop >= scTop ) ); + } + +} + +function scrollByX(elem, x){ + + var elTop = parseInt( elem.css('top'), 10 ); + elem.css( 'top', ( elTop + x ) + "px" ); + +} + + //create jQuery Callbacks() to handle object events $.Dispatch = function( id ) { var callbacks, topic = id && Engine.topics[ id ]; diff --git a/script/events/encounters.js b/script/events/encounters.js index df89ac034..a5aca7892 100644 --- a/script/events/encounters.js +++ b/script/events/encounters.js @@ -1,400 +1,400 @@ -/** - * Events that can occur when wandering around the world - **/ -Events.Encounters = [ - /* Tier 1 */ - { /* Snarling Beast */ - title: _('A Snarling Beast'), - isAvailable: function() { - return World.getDistance() <= 10 && World.getTerrain() == World.TILE.FOREST; - }, - scenes: { - 'start': { - combat: true, - enemy: 'snarling beast', - enemyName: _('snarling beast'), - deathMessage: _('the snarling beast is dead'), - chara: 'B', - damage: 1, - hit: 0.8, - attackDelay: 1, - health: 5, - loot: { - 'fur': { - min: 1, - max: 3, - chance: 1 - }, - 'meat': { - min: 1, - max: 3, - chance: 1 - }, - 'teeth': { - min: 1, - max: 3, - chance: 0.8 - } - }, - notification: _('a snarling beast leaps out of the underbrush') - } - } - }, - { /* Gaunt Man */ - title: _('A Gaunt Man'), - isAvailable: function() { - return World.getDistance() <= 10 && World.getTerrain() == World.TILE.BARRENS; - }, - scenes: { - 'start': { - combat: true, - enemy: 'gaunt man', - enemyName: _('gaunt man'), - deathMessage: _('the gaunt man is dead'), - chara: 'G', - damage: 2, - hit: 0.8, - attackDelay: 2, - health: 6, - loot: { - 'cloth': { - min: 1, - max: 3, - chance: 0.8 - }, - 'teeth': { - min: 1, - max: 2, - chance: 0.8 - }, - 'leather': { - min: 1, - max: 2, - chance: 0.5 - } - }, - notification: _('a gaunt man approaches, a crazed look in his eye') - } - } - }, - { /* Strange Bird */ - title: _('A Strange Bird'), - isAvailable: function() { - return World.getDistance() <= 10 && World.getTerrain() == World.TILE.FIELD; - }, - scenes: { - 'start': { - combat: true, - enemy: 'strange bird', - enemyName: _('strange bird'), - deathMessage: _('the strange bird is dead'), - chara: 'B', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 4, - loot: { - 'scales': { - min: 1, - max: 3, - chance: 0.8 - }, - 'teeth': { - min: 1, - max: 2, - chance: 0.5 - }, - 'meat': { - min: 1, - max: 3, - chance: 0.8 - } - }, - notification: _('a strange looking bird speeds across the plains') - } - } - }, - /* Tier 2*/ - { /* Shivering Man */ - title: _('A Shivering Man'), - isAvailable: function() { - return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.BARRENS; - }, - scenes: { - 'start': { - combat: true, - enemy: 'shivering man', - enemyName: _('shivering man'), - deathMessage: _('the shivering man is dead'), - chara: 'S', - damage: 5, - hit: 0.5, - attackDelay: 1, - health: 20, - loot: { - 'cloth': { - min: 1, - max: 1, - chance: 0.2 - }, - 'teeth': { - min: 1, - max: 2, - chance: 0.8 - }, - 'leather': { - min: 1, - max: 1, - chance: 0.2 - }, - 'medicine': { - min: 1, - max: 3, - chance: 0.7 - } - }, - notification: _('a shivering man approaches and attacks with surprising strength') - } - } - }, - { /* Man-eater */ - title: _('A Man-Eater'), - isAvailable: function() { - return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.FOREST; - }, - scenes: { - 'start': { - combat: true, - enemy: 'man-eater', - enemyName: _('man-eater'), - deathMessage: _('the man-eater is dead'), - chara: 'E', - damage: 3, - hit: 0.8, - attackDelay: 1, - health: 25, - loot: { - 'fur': { - min: 5, - max: 10, - chance: 1 - }, - 'meat': { - min: 5, - max: 10, - chance: 1 - }, - 'teeth': { - min: 5, - max: 10, - chance: 0.8 - } - }, - notification: _('a large creature attacks, claws freshly bloodied') - } - } - }, - { /* Scavenger */ - title: _('A Scavenger'), - isAvailable: function() { - return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.BARRENS; - }, - scenes: { - 'start': { - combat: true, - enemy: 'scavenger', - enemyName: _('scavenger'), - deathMessage: _('the scavenger is dead'), - chara: 'S', - damage: 4, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - 'leather': { - min: 5, - max: 10, - chance: 0.8 - }, - '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') - } - } - }, - { /* Huge Lizard */ - title: _('A Huge Lizard'), - isAvailable: function() { - return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.FIELD; - }, - scenes: { - 'start': { - combat: true, - enemy: 'lizard', - enemyName: _('lizard'), - deathMessage: _('the lizard is dead'), - chara: 'L', - damage: 5, - hit: 0.8, - attackDelay: 2, - health: 20, - loot: { - 'scales': { - min: 5, - max: 10, - chance: 0.8 - }, - 'teeth': { - min: 5, - max: 10, - chance: 0.5 - }, - 'meat': { - min: 5, - max: 10, - chance: 0.8 - } - }, - notification: _('the grass thrashes wildly as a huge lizard pushes through') - } - } - }, - /* Tier 3*/ - { /* Feral Terror */ - title: _('A Feral Terror'), - isAvailable: function() { - return World.getDistance() > 20 && World.getTerrain() == World.TILE.FOREST; - }, - scenes: { - 'start': { - combat: true, - enemy: 'feral terror', - enemyName: _('feral terror'), - deathMessage: _('the feral terror is dead'), - chara: 'F', - damage: 6, - hit: 0.8, - attackDelay: 1, - health: 45, - loot: { - 'fur': { - min: 5, - max: 10, - chance: 1 - }, - 'meat': { - min: 5, - max: 10, - chance: 1 - }, - 'teeth': { - min: 5, - max: 10, - chance: 0.8 - } - }, - notification: _('a beast, wilder than imagining, erupts out of the foliage') - } - } - }, - { /* Soldier */ - title: _('A Soldier'), - isAvailable: function() { - return World.getDistance() > 20 && World.getTerrain() == World.TILE.BARRENS; - }, - scenes: { - 'start': { - combat: true, - enemy: 'soldier', - enemyName: _('soldier'), - deathMessage: _('the soldier is dead'), - ranged: true, - chara: 'D', - damage: 8, - hit: 0.8, - attackDelay: 2, - health: 50, - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - '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') - } - } - }, - { /* Sniper */ - title: _('A Sniper'), - isAvailable: function() { - return World.getDistance() > 20 && World.getTerrain() == World.TILE.FIELD; - }, - scenes: { - 'start': { - combat: true, - enemy: 'sniper', - enemyName: _('sniper'), - deathMessage: _('the sniper is dead'), - chara: 'S', - damage: 15, - hit: 0.8, - attackDelay: 4, - health: 30, - ranged: true, - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - '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') - } - } - } -]; +/** + * Events that can occur when wandering around the world + **/ +Events.Encounters = [ + /* Tier 1 */ + { /* Snarling Beast */ + title: _('A Snarling Beast'), + isAvailable: function() { + return World.getDistance() <= 10 && World.getTerrain() == World.TILE.FOREST; + }, + scenes: { + 'start': { + combat: true, + enemy: 'snarling beast', + enemyName: _('snarling beast'), + deathMessage: _('the snarling beast is dead'), + chara: 'B', + damage: 1, + hit: 0.8, + attackDelay: 1, + health: 5, + loot: { + 'fur': { + min: 1, + max: 3, + chance: 1 + }, + 'meat': { + min: 1, + max: 3, + chance: 1 + }, + 'teeth': { + min: 1, + max: 3, + chance: 0.8 + } + }, + notification: _('a snarling beast leaps out of the underbrush') + } + } + }, + { /* Gaunt Man */ + title: _('A Gaunt Man'), + isAvailable: function() { + return World.getDistance() <= 10 && World.getTerrain() == World.TILE.BARRENS; + }, + scenes: { + 'start': { + combat: true, + enemy: 'gaunt man', + enemyName: _('gaunt man'), + deathMessage: _('the gaunt man is dead'), + chara: 'G', + damage: 2, + hit: 0.8, + attackDelay: 2, + health: 6, + loot: { + 'cloth': { + min: 1, + max: 3, + chance: 0.8 + }, + 'teeth': { + min: 1, + max: 2, + chance: 0.8 + }, + 'leather': { + min: 1, + max: 2, + chance: 0.5 + } + }, + notification: _('a gaunt man approaches, a crazed look in his eye') + } + } + }, + { /* Strange Bird */ + title: _('A Strange Bird'), + isAvailable: function() { + return World.getDistance() <= 10 && World.getTerrain() == World.TILE.FIELD; + }, + scenes: { + 'start': { + combat: true, + enemy: 'strange bird', + enemyName: _('strange bird'), + deathMessage: _('the strange bird is dead'), + chara: 'B', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 4, + loot: { + 'scales': { + min: 1, + max: 3, + chance: 0.8 + }, + 'teeth': { + min: 1, + max: 2, + chance: 0.5 + }, + 'meat': { + min: 1, + max: 3, + chance: 0.8 + } + }, + notification: _('a strange looking bird speeds across the plains') + } + } + }, + /* Tier 2*/ + { /* Shivering Man */ + title: _('A Shivering Man'), + isAvailable: function() { + return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.BARRENS; + }, + scenes: { + 'start': { + combat: true, + enemy: 'shivering man', + enemyName: _('shivering man'), + deathMessage: _('the shivering man is dead'), + chara: 'S', + damage: 5, + hit: 0.5, + attackDelay: 1, + health: 20, + loot: { + 'cloth': { + min: 1, + max: 1, + chance: 0.2 + }, + 'teeth': { + min: 1, + max: 2, + chance: 0.8 + }, + 'leather': { + min: 1, + max: 1, + chance: 0.2 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.7 + } + }, + notification: _('a shivering man approaches and attacks with surprising strength') + } + } + }, + { /* Man-eater */ + title: _('A Man-Eater'), + isAvailable: function() { + return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.FOREST; + }, + scenes: { + 'start': { + combat: true, + enemy: 'man-eater', + enemyName: _('man-eater'), + deathMessage: _('the man-eater is dead'), + chara: 'E', + damage: 3, + hit: 0.8, + attackDelay: 1, + health: 25, + loot: { + 'fur': { + min: 5, + max: 10, + chance: 1 + }, + 'meat': { + min: 5, + max: 10, + chance: 1 + }, + 'teeth': { + min: 5, + max: 10, + chance: 0.8 + } + }, + notification: _('a large creature attacks, claws freshly bloodied') + } + } + }, + { /* Scavenger */ + title: _('A Scavenger'), + isAvailable: function() { + return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.BARRENS; + }, + scenes: { + 'start': { + combat: true, + enemy: 'scavenger', + enemyName: _('scavenger'), + deathMessage: _('the scavenger is dead'), + chara: 'S', + damage: 4, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + 'leather': { + min: 5, + max: 10, + chance: 0.8 + }, + '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') + } + } + }, + { /* Huge Lizard */ + title: _('A Huge Lizard'), + isAvailable: function() { + return World.getDistance() > 10 && World.getDistance() <= 20 && World.getTerrain() == World.TILE.FIELD; + }, + scenes: { + 'start': { + combat: true, + enemy: 'lizard', + enemyName: _('lizard'), + deathMessage: _('the lizard is dead'), + chara: 'L', + damage: 5, + hit: 0.8, + attackDelay: 2, + health: 20, + loot: { + 'scales': { + min: 5, + max: 10, + chance: 0.8 + }, + 'teeth': { + min: 5, + max: 10, + chance: 0.5 + }, + 'meat': { + min: 5, + max: 10, + chance: 0.8 + } + }, + notification: _('the grass thrashes wildly as a huge lizard pushes through') + } + } + }, + /* Tier 3*/ + { /* Feral Terror */ + title: _('A Feral Terror'), + isAvailable: function() { + return World.getDistance() > 20 && World.getTerrain() == World.TILE.FOREST; + }, + scenes: { + 'start': { + combat: true, + enemy: 'feral terror', + enemyName: _('feral terror'), + deathMessage: _('the feral terror is dead'), + chara: 'F', + damage: 6, + hit: 0.8, + attackDelay: 1, + health: 45, + loot: { + 'fur': { + min: 5, + max: 10, + chance: 1 + }, + 'meat': { + min: 5, + max: 10, + chance: 1 + }, + 'teeth': { + min: 5, + max: 10, + chance: 0.8 + } + }, + notification: _('a beast, wilder than imagining, erupts out of the foliage') + } + } + }, + { /* Soldier */ + title: _('A Soldier'), + isAvailable: function() { + return World.getDistance() > 20 && World.getTerrain() == World.TILE.BARRENS; + }, + scenes: { + 'start': { + combat: true, + enemy: 'soldier', + enemyName: _('soldier'), + deathMessage: _('the soldier is dead'), + ranged: true, + chara: 'D', + damage: 8, + hit: 0.8, + attackDelay: 2, + health: 50, + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + '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') + } + } + }, + { /* Sniper */ + title: _('A Sniper'), + isAvailable: function() { + return World.getDistance() > 20 && World.getTerrain() == World.TILE.FIELD; + }, + scenes: { + 'start': { + combat: true, + enemy: 'sniper', + enemyName: _('sniper'), + deathMessage: _('the sniper is dead'), + chara: 'S', + damage: 15, + hit: 0.8, + attackDelay: 4, + health: 30, + ranged: true, + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + '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/global.js b/script/events/global.js index 87ad42131..ff6e662d2 100644 --- a/script/events/global.js +++ b/script/events/global.js @@ -1,66 +1,66 @@ -/** - * Events that can occur when any module is active (Except World. It's special.) - **/ -Events.Global = [ - { /* The Thief */ - title: _('The Thief'), - isAvailable: function() { - return (Engine.activeModule == Room || Engine.activeModule == Outside) && $SM.get('game.thieves') == 1; - }, - scenes: { - 'start': { - text: [ - _('the villagers haul a filthy man out of the store room.'), - _("say his folk have been skimming the supplies."), - _('say he should be strung up as an example.') - ], - notification: _('a thief is caught'), - blink: true, - buttons: { - 'kill': { - text: _('hang him'), - nextScene: {1: 'hang'} - }, - 'spare': { - text: _('spare him'), - nextScene: {1: 'spare'} - } - } - }, - 'hang': { - text: [ - _('the villagers hang the thief high in front of the store room.'), - _('the point is made. in the next few days, the missing supplies are returned.') - ], - onLoad: function() { - $SM.set('game.thieves', 2); - $SM.remove('income.thieves'); - $SM.addM('stores', $SM.get('game.stolen')); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'spare': { - text: [ - _("the man says he's grateful. says he won't come around any more."), - _("shares what he knows about sneaking before he goes.") - ], - onLoad: function() { - $SM.set('game.thieves', 2); - $SM.remove('income.thieves'); - $SM.addPerk('stealthy'); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - } - } - } -]; +/** + * Events that can occur when any module is active (Except World. It's special.) + **/ +Events.Global = [ + { /* The Thief */ + title: _('The Thief'), + isAvailable: function() { + return (Engine.activeModule == Room || Engine.activeModule == Outside) && $SM.get('game.thieves') == 1; + }, + scenes: { + 'start': { + text: [ + _('the villagers haul a filthy man out of the store room.'), + _("say his folk have been skimming the supplies."), + _('say he should be strung up as an example.') + ], + notification: _('a thief is caught'), + blink: true, + buttons: { + 'kill': { + text: _('hang him'), + nextScene: {1: 'hang'} + }, + 'spare': { + text: _('spare him'), + nextScene: {1: 'spare'} + } + } + }, + 'hang': { + text: [ + _('the villagers hang the thief high in front of the store room.'), + _('the point is made. in the next few days, the missing supplies are returned.') + ], + onLoad: function() { + $SM.set('game.thieves', 2); + $SM.remove('income.thieves'); + $SM.addM('stores', $SM.get('game.stolen')); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'spare': { + text: [ + _("the man says he's grateful. says he won't come around any more."), + _("shares what he knows about sneaking before he goes.") + ], + onLoad: function() { + $SM.set('game.thieves', 2); + $SM.remove('income.thieves'); + $SM.addPerk('stealthy'); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + } + } + } +]; diff --git a/script/events/setpieces.js b/script/events/setpieces.js index 066cfa848..2480b6792 100644 --- a/script/events/setpieces.js +++ b/script/events/setpieces.js @@ -1,3574 +1,3574 @@ -/** - * Events that only occur at specific times. Launched manually. - **/ -Events.Setpieces = { - "outpost": { /* Friendly Outpost */ - title: _('An Outpost'), - scenes: { - 'start': { - text: [ - _('a safe place in the wilds.') - ], - notification: _('a safe place in the wilds.'), - loot: { - 'cured meat': { - min: 5, - max: 10, - chance: 1 - } - }, - onLoad: function() { - World.useOutpost(); - }, - buttons: { - 'leave': { - text: _('leave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - } - } - }, - "swamp": { /* Swamp */ - title: _('A Murky Swamp'), - scenes: { - 'start': { - text: [ - _('rotting reeds rise out of the swampy earth.'), - _('a lone frog sits in the muck, silently.') - ], - notification: _('a swamp festers in the stagnant air.'), - buttons: { - 'enter': { - text: _('enter'), - nextScene: {1: 'cabin'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'cabin': { - text: [ - _('deep in the swamp is a moss-covered cabin.'), - _('an old wanderer sits inside, in a seeming trance.') - ], - buttons: { - 'talk': { - cost: {'charm': 1}, - text: _('talk'), - nextScene: {1: 'talk'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'talk': { - text: [ - _('the wanderer takes the charm and nods slowly.'), - _('he speaks of once leading the great fleets to fresh worlds.'), - _('unfathomable destruction to fuel wanderer hungers.'), - _('his time here, now, is his penance.') - ], - onLoad: function() { - $SM.addPerk('gastronome'); - World.markVisited(World.curPos[0], World.curPos[1]); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - } - } - }, - "cave": { /* Cave */ - title: _('A Damp Cave'), - scenes: { - 'start': { - text: [ - _('the mouth of the cave is wide and dark.'), - _("can't see what's inside.") - ], - notification: _('the earth here is split, as if bearing an ancient wound'), - buttons: { - 'enter': { - text: _('go inside'), - cost: { torch: 1 }, - nextScene: {0.3: 'a1', 0.6: 'a2', 1: 'a3'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - - 'a1': { - combat: true, - enemy: 'beast', - chara: 'B', - damage: 1, - hit: 0.8, - attackDelay: 1, - health: 5, - notification: _('a startled beast defends its home'), - loot: { - 'fur': { - min: 1, - max: 10, - chance: 1 - }, - 'teeth': { - min: 1, - max: 5, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'b1', 1: 'b2'} - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'a2': { - text: [ - _('the cave narrows a few feet in.'), - _("the walls are moist and moss-covered") - ], - buttons: { - 'continue': { - text: _('squeeze'), - nextScene: {0.5: 'b2', 1: 'b3'} - }, - 'leave': { - text: _('leave cave'), - nextScene: 'end' - } - } - }, - 'a3': { - text: [ - _('the remains of an old camp sits just inside the cave.'), - _('bedrolls, torn and blackened, lay beneath a thin layer of dust.') - ], - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 1 - }, - 'torch': { - min: 1, - max: 5, - chance: 0.5 - }, - 'leather': { - min: 1, - max: 5, - chance: 0.3 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'b3', 1: 'b4'} - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b1': { - text: [ - _('the body of a wanderer lies in a small cavern.'), - _("rot's been to work on it, and some of the pieces are missing."), - /// TRANSLATORS : 'it' is a rotting wanderer's body - _("can't tell what left it here.") - ], - loot: { - 'iron sword': { - min: 1, - max: 1, - chance: 1 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'torch': { - min: 1, - max: 3, - chance: 0.5 - }, - 'medicine': { - min: 1, - max: 2, - chance: 0.1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'c1' } - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b2': { - text: [ - _('the torch sputters and dies in the damp air'), - _('the darkness is absolute') - ], - notification: _('the torch goes out'), - buttons: { - 'continue': { - text: _('continue'), - cost: {'torch': 1}, - nextScene: { 1: 'c1' } - }, - 'leave': { - text: _('leave cave'), - nextScene: 'end' - } - } - }, - 'b3': { - combat: true, - enemy: 'beast', - chara: 'B', - damage: 1, - hit: 0.8, - attackDelay: 1, - health: 5, - notification: _('a startled beast defends its home'), - loot: { - 'fur': { - min: 1, - max: 3, - chance: 1 - }, - 'teeth': { - min: 1, - max: 2, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'c2'} - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b4': { - combat: true, - enemy: 'cave lizard', - chara: 'L', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 6, - notification: _('a cave lizard attacks'), - loot: { - 'scales': { - min: 1, - max: 3, - chance: 1 - }, - 'teeth': { - min: 1, - max: 2, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'c2'} - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c1': { - combat: true, - enemy: 'beast', - chara: 'B', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 10, - notification: _('a large beast charges out of the dark'), - loot: { - 'fur': { - min: 1, - max: 3, - chance: 1 - }, - 'teeth': { - min: 1, - max: 3, - chance: 1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end1', 1: 'end2'} - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c2': { - combat: true, - enemy: 'lizard', - chara: 'L', - damage: 4, - hit: 0.8, - attackDelay: 2, - health: 10, - notification: _('a giant lizard shambles forward'), - loot: { - 'scales': { - min: 1, - max: 3, - chance: 1 - }, - 'teeth': { - min: 1, - max: 3, - chance: 1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.7: 'end2', 1: 'end3'} - }, - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end1': { - text: [ - _('the nest of a large animal lies at the back of the cave.') - ], - onLoad: function() { - World.clearDungeon(); - }, - loot: { - 'meat': { - min: 5, - max: 10, - chance: 1 - }, - 'fur': { - min: 5, - max: 10, - chance: 1 - }, - 'scales': { - min: 5, - max: 10, - chance: 1 - }, - 'teeth': { - min: 5, - max: 10, - chance: 1 - }, - 'cloth': { - min: 5, - max: 10, - chance: 0.5 - } - }, - buttons: { - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end2': { - text: [ - _('a small supply cache is hidden at the back of the cave.') - ], - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 1 - }, - 'leather': { - min: 5, - max: 10, - chance: 1 - }, - 'iron': { - min: 5, - max: 10, - chance: 1 - }, - 'cured meat': { - min: 5, - max: 10, - chance: 1 - }, - 'steel': { - min: 5, - max: 10, - chance: 0.5 - }, - 'bolas': { - min: 1, - max: 3, - chance: 0.3 - }, - 'medicine': { - min: 1, - max: 4, - chance: 0.15 - } - }, - onLoad: function() { - World.clearDungeon(); - }, - buttons: { - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end3': { - text: [ - _('an old case is wedged behind a rock, covered in a thick layer of dust.') - ], - loot: { - 'steel sword': { - min: 1, - max: 1, - chance: 1 - }, - 'bolas': { - min: 1, - max: 3, - chance: 0.5 - }, - 'medicine': { - min: 1, - max: 3, - chance: 0.3 - } - }, - onLoad: function() { - World.clearDungeon(); - }, - buttons: { - 'leave': { - text: _('leave cave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - } - } - }, - "town": { /* Town */ - title: _('A Deserted Town'), - scenes: { - 'start': { - text: [ - _('a small suburb lays ahead, empty houses scorched and peeling.'), - _("broken streetlights stand, rusting. light hasn't graced this place in a long time.") - ], - notification: _("the town lies abandoned, its citizens long dead"), - buttons: { - 'enter': { - text: _('explore'), - nextScene: {0.3: 'a1', 0.7: 'a3', 1: 'a2'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - - 'a1': { - text: [ - _("where the windows of the schoolhouse aren't shattered, they're blackened with soot."), - _('the double doors creak endlessly in the wind.') - ], - buttons: { - 'enter': { - text: _('enter'), - nextScene: {0.5: 'b1', 1: 'b2'}, - cost: {torch: 1} - }, - 'leave': { - text: _('leave town'), - nextScene: 'end' - } - } - }, - - 'a2': { - combat: true, - enemy: 'thug', - chara: 'T', - damage: 4, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - 'leather': { - min: 5, - max: 10, - chance: 0.8 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.5 - } - }, - notification: _('ambushed on the street.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'b3', 1: 'b4'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'a3': { - text: [ - _("a squat building up ahead."), - _('a green cross barely visible behind grimy windows.') - ], - buttons: { - 'enter': { - text: _('enter'), - nextScene: {0.5: 'b5', 1: 'end5'}, - cost: {torch: 1} - }, - 'leave': { - text: _('leave town'), - nextScene: 'end' - } - } - }, - 'b1': { - text: [ - _('a small cache of supplies is tucked inside a rusting locker.') - ], - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 1 - }, - 'torch': { - min: 1, - max: 3, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.3 - }, - 'medicine': { - min: 1, - max: 3, - chance: 0.05 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c1', 1: 'c2'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b2': { - combat: true, - enemy: 'scavenger', - chara: 'S', - damage: 4, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - 'leather': { - min: 5, - max: 10, - chance: 0.8 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.5 - } - }, - notification: _('a scavenger waits just inside the door.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c2', 1: 'c3'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b3': { - combat: true, - enemy: 'beast', - chara: 'B', - damage: 3, - hit: 0.8, - attackDelay: 1, - health: 25, - loot: { - 'teeth': { - min: 1, - max: 5, - chance: 1 - }, - 'fur': { - min: 5, - max: 10, - chance: 1 - } - }, - notification: _('a beast stands alone in an overgrown park.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c4', 1: 'c5'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b4': { - text: [ - _('an overturned caravan is spread across the pockmarked street.'), - _("it's been picked over by scavengers, but there's still some things worth taking.") - ], - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'torch': { - min: 1, - max: 3, - chance: 0.5 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.3 - }, - 'medicine': { - min: 1, - max: 3, - chance: 0.1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c5', 1: 'c6' } - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b5': { - combat: true, - enemy: 'madman', - chara: '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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.3: 'end5', 1: 'end6'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c1': { - combat: true, - enemy: 'thug', - chara: 'T', - damage: 4, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - 'leather': { - min: 5, - max: 10, - chance: 0.8 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.5 - } - }, - notification: _('a thug moves out of the shadows.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'd1'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c2': { - combat: true, - enemy: 'beast', - chara: 'B', - damage: 3, - hit: 0.8, - attackDelay: 1, - health: 25, - loot: { - 'teeth': { - min: 1, - max: 5, - chance: 1 - }, - 'fur': { - min: 5, - max: 10, - chance: 1 - } - }, - notification: _('a beast charges out of a ransacked classroom.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'd1'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c3': { - text: [ - _('through the large gymnasium doors, footsteps can be heard.'), - _('the torchlight casts a flickering glow down the hallway.'), - _('the footsteps stop.') - ], - buttons: { - 'continue': { - text: _('enter'), - nextScene: {1: 'd1'} - }, - 'leave': { - text: _('leave town'), - nextScene: 'end' - } - } - }, - 'c4': { - combat: true, - enemy: 'beast', - chara: 'B', - damage: 4, - hit: 0.8, - attackDelay: 1, - health: 25, - loot: { - 'teeth': { - min: 1, - max: 5, - chance: 1 - }, - 'fur': { - min: 5, - max: 10, - chance: 1 - } - }, - notification: _('another beast, draw by the noise, leaps out of a copse of trees.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'd2'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c5': { - text: [ - _("something's causing a commotion a ways down the road."), - _("a fight, maybe.") - ], - buttons: { - 'continue': { - text: _('continue'), - nextScene: {1: 'd2'} - }, - 'leave': { - text: _('leave town'), - nextScene: 'end' - } - } - }, - 'c6': { - text: [ - _('a small basket of food is hidden under a park bench, with a note attached.'), - _("can't read the words.") - ], - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'd2'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'd1': { - combat: true, - enemy: 'scavenger', - chara: 'S', - damage: 5, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 1 - }, - 'leather': { - min: 5, - max: 10, - chance: 0.8 - }, - 'steel sword': { - min: 1, - max: 1, - chance: 0.5 - } - }, - notification: _('a panicked scavenger bursts through the door, screaming.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end1', 1: 'end2'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'd2': { - combat: true, - enemy: 'vigilante', - chara: 'V', - damage: 6, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 1 - }, - 'leather': { - min: 5, - max: 10, - chance: 0.8 - }, - 'steel sword': { - min: 1, - max: 1, - chance: 0.5 - } - }, - notification: _("a man stands over a dead wanderer. notices he's not alone."), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end3', 1: 'end4'} - }, - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end1': { - text: [ - _('scavenger had a small camp in the school.'), - _('collected scraps spread across the floor like they fell from heaven.') - ], - onLoad: function() { - World.clearDungeon(); - }, - loot: { - 'steel sword': { - min: 1, - max: 1, - chance: 1 - }, - 'steel': { - min: 5, - max: 10, - chance: 1 - }, - 'cured meat': { - min: 5, - max: 10, - chance: 1 - }, - 'bolas': { - min: 1, - max: 5, - chance: 0.5 - }, - 'medicine': { - min: 1, - max: 2, - chance: 0.3 - } - }, - buttons: { - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end2': { - text: [ - _("scavenger'd been looking for supplies in here, it seems."), - _("a shame to let what he'd found go to waste.") - ], - onLoad: function() { - World.clearDungeon(); - }, - loot: { - 'coal': { - min: 5, - max: 10, - chance: 1 - }, - 'cured meat': { - min: 5, - max: 10, - chance: 1 - }, - 'leather': { - min: 5, - max: 10, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end3': { - text: [ - _("beneath the wanderer's rags, clutched in one of its many hands, a glint of steel."), - _("worth killing for, it seems.") - ], - onLoad: function() { - World.clearDungeon(); - }, - loot: { - 'rifle': { - min: 1, - max: 1, - chance: 1 - }, - 'bullets': { - min: 1, - max: 5, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end4': { - text: [ - _("eye for an eye seems fair."), - _("always worked before, at least."), - _("picking the bones finds some useful trinkets.") - ], - onLoad: function() { - World.clearDungeon(); - }, - loot: { - 'cured meat': { - min: 5, - max: 10, - chance: 1 - }, - 'iron': { - min: 5, - max: 10, - chance: 1 - }, - 'torch': { - min: 1, - max: 5, - chance: 1 - }, - 'bolas': { - min: 1, - max: 5, - chance: 0.5 - }, - 'medicine': { - min: 1, - max: 2, - chance: 0.1 - } - }, - buttons: { - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end5': { - text: [ - _('some medicine abandoned in the drawers.') - ], - onLoad: function() { - World.clearDungeon(); - }, - loot: { - 'medicine': { - min: 2, - max: 5, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave town'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'end6': { - text: [ - _('the clinic has been ransacked.'), - _('only dust and stains remain.') - ], - onLoad: function() { - World.clearDungeon(); - }, - buttons: { - 'leave': { - text: _('leave town'), - - nextScene: 'end' - } - } - } - } - }, - "city": { /* City */ - title: _('A Ruined City'), - scenes: { - 'start': { - text: [ - _('a battered highway sign stands guard at the entrance to this once-great city.'), - _("the towers that haven't crumbled jut from the landscape like the ribcage of some ancient beast."), - _('might be things worth having still inside.') - ], - notification: _("the towers of a decaying city dominate the skyline"), - buttons: { - 'enter': { - text: _('explore'), - nextScene: {0.2: 'a1', 0.5: 'a2', 0.8: 'a3', 1: 'a4'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'a1': { - text:[ - _('the streets are empty.'), - _('the air is filled with dust, driven relentlessly by the hard winds.') - ], - buttons: { - 'continue': { - text: _('continue'), - nextScene: {0.5: 'b1', 1: 'b2'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - 'a2': { - text:[ - _('orange traffic cones are set across the street, faded and cracked.'), - _('lights flash through the alleys between buildings.') - ], - buttons: { - 'continue': { - text: _('continue'), - nextScene: {0.5: 'b3', 1: 'b4'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - 'a3': { - text: [ - _('a large shanty town sprawls across the streets.'), - _('faces, darkened by soot and blood, stare out from crooked huts.') - ], - buttons: { - 'continue': { - text: _('continue'), - nextScene: {0.5: 'b5', 1: 'b6'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - '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.'), - _('the shell of a burned out car blocks the entrance.'), - _('most of the windows at ground level are busted anyway.') - ], - buttons: { - 'enter': { - text: _('enter'), - nextScene: {0.5: 'c1', 1: 'c2'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - 'b2': { - combat: true, - notification: _('a huge lizard scrambles up out of the darkness of an old metro station.'), - enemy: 'lizard', - chara: 'L', - damage: 5, - hit: 0.8, - attackDelay: 2, - health: 20, - loot: { - 'scales': { - min: 5, - max: 10, - chance: 0.8 - }, - 'teeth': { - min: 5, - max: 10, - chance: 0.5 - }, - 'meat': { - min: 5, - max: 10, - chance: 0.8 - } - }, - buttons: { - 'descend': { - text: _('descend'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c2', 1: 'c3'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b3': { - notification: _('the shot echoes in the empty street.'), - combat: true, - enemy: 'sniper', - chara: 'S', - damage: 15, - hit: 0.8, - attackDelay: 4, - health: 30, - ranged: true, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c4', 1: 'c5'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b4': { - notification: _('the soldier steps out from between the buildings, rifle raised.'), - combat: true, - enemy: 'soldier', - ranged: true, - chara: 'D', - damage: 8, - hit: 0.8, - attackDelay: 2, - health: 50, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c5', 1: 'c6'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b5': { - notification: _('a frail man stands defiantly, blocking the path.'), - combat: true, - enemy: 'frail man', - chara: 'M', - damage: 1, - hit: 0.8, - attackDelay: 2, - health: 10, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - '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': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'c7', 1: 'c8'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'b6': { - text: [ - _('nothing but downcast eyes.'), - _('the people here were broken a long time ago.') - ], - buttons: { - 'continue': { - text: _('continue'), - nextScene: {0.5: 'c8', 1: 'c9'} - }, - 'leave': { - text: _('leave city'), - 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', - chara: '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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.3: 'c13', 0.7: 'c11', 1: 'end15'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'c1': { - notification: _('a thug is waiting on the other side of the wall.'), - combat: true, - enemy: 'thug', - chara: 'T', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 30, - loot: { - 'steel sword': { - min: 1, - max: 1, - chance: 0.5 - }, - 'cured meat': { - min: 1, - max: 3, - chance: 0.5 - }, - 'cloth': { - min: 1, - max: 5, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'd1', 1: 'd2'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'c2': { - notification: _('a snarling beast jumps out from behind a car.'), - combat: true, - enemy: 'beast', - chara: 'B', - damage: 2, - hit: 0.8, - attackDelay: 1, - health: 30, - loot: { - 'meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'fur': { - min: 1, - max: 5, - chance: 0.8 - }, - 'teeth': { - min: 1, - max: 5, - chance: 0.5 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'd2'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'c3': { - text: [ - _('street above the subway platform is blown away.'), - _('lets some light down into the dusty haze.'), - _('a sound comes from the tunnel, just ahead.') - ], - buttons: { - 'enter': { - text: _('investigate'), - cost: { 'torch': 1 }, - nextScene: {0.5: 'd2', 1: 'd3'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - - 'c4': { - text: [ - _('looks like a camp of sorts up ahead.'), - /// TRANSLATORS : chainlink is a type of metal fence. - _('rusted chainlink is pulled across an alleyway.'), - _('fires burn in the courtyard beyond.') - ], - buttons: { - 'enter': { - text: _('continue'), - nextScene: {0.5: 'd4', 1: 'd5'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - - 'c5': { - text: [ - _('more voices can be heard ahead.'), - _('they must be here for a reason.') - ], - buttons: { - 'enter': { - text: _('continue'), - nextScene: {1: 'd5'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - - 'c6': { - text: [ - _('the sound of gunfire carries on the wind.'), - _('the street ahead glows with firelight.') - ], - buttons: { - 'enter': { - text: _('continue'), - nextScene: {0.5: 'd5', 1: 'd6'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - - 'c7': { - text: [ - /// TRANSLATORS : squatters occupy abandoned dwellings they don't own. - _('more squatters are crowding around now.'), - _('someone throws a stone.') - ], - buttons: { - 'enter': { - text: _('continue'), - nextScene: {0.5: 'd7', 1: 'd8'} - }, - 'leave': { - text: _('leave city'), - nextScene: 'end' - } - } - }, - - 'c8': { - text: [ - _('an improvised shop is set up on the sidewalk.'), - _('the owner stands by, stoic.') - ], - loot: { - 'steel sword': { - min: 1, - max: 1, - chance: 0.8 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.5 - }, - 'bullets': { - min: 1, - max: 8, - chance: 0.25 - }, - 'alien alloy': { - min: 1, - max: 1, - chance: 0.01 - }, - 'medicine': { - min: 1, - max: 4, - chance: 0.5 - } - }, - buttons: { - 'enter': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'd8'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'c9': { - text: [ - _('strips of meat hang drying by the side of the street.'), - _('the people back away, avoiding eye contact.') - ], - loot: { - 'cured meat': { - min: 5, - max: 10, - chance: 1 - } - }, - buttons: { - 'enter': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'd8', 1: 'd9'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - '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, - chara: '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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'end10' } - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'c12': { - notification: _('a pack of lizards rounds the corner.'), - combat: true, - enemy: 'lizards', - plural: true, - chara: '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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'end10' } - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - 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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 0.5: 'end10', 1: 'end11' } - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd1': { - notification: _('a large bird nests at the top of the stairs.'), - combat: true, - enemy: 'bird', - chara: 'B', - damage: 5, - hit: 0.7, - attackDelay: 1, - health: 45, - loot: { - 'meat': { - min: 5, - max: 10, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end1', 1: 'end2'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd2': { - text: [ - _("the debris is denser here."), - _("maybe some useful stuff in the rubble.") - ], - loot: { - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'steel': { - min: 1, - max: 10, - chance: 0.8 - }, - 'alien alloy': { - min: 1, - max: 1, - chance: 0.01 - }, - 'cloth': { - min: 1, - max: 10, - chance: 1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'end2'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd3': { - notification: _('a swarm of rats rushes up the tunnel.'), - combat: true, - enemy: 'rats', - plural: true, - chara: 'RRR', - damage: 1, - hit: 0.8, - attackDelay: 0.25, - health: 60, - loot: { - 'fur': { - min: 5, - max: 10, - chance: 0.8 - }, - 'teeth': { - min: 5, - max: 10, - chance: 0.5 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end2', 1: 'end3'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd4': { - notification: _('a large man attacks, waving a bayonet.'), - combat: true, - enemy: 'veteran', - chara: 'V', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 45, - loot: { - 'bayonet': { - min: 1, - max: 1, - chance: 0.5 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end4', 1: 'end5'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd5': { - notification: _('a second soldier opens fire.'), - combat: true, - enemy: 'soldier', - ranged: true, - chara: 'D', - damage: 8, - hit: 0.8, - attackDelay: 2, - health: 50, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'end5'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd6': { - notification: _('a masked soldier rounds the corner, gun drawn'), - combat: true, - enemy: 'commando', - chara: 'C', - ranged: true, - damage: 3, - hit: 0.9, - attackDelay: 2, - health: 55, - loot: { - 'rifle': { - min: 1, - max: 1, - chance: 0.5 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.8 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end5', 1: 'end6'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd7': { - notification: _('the crowd surges forward.'), - combat: true, - enemy: 'squatters', - plural: true, - chara: 'SSS', - damage: 2, - hit: 0.7, - attackDelay: 0.5, - health: 40, - loot: { - 'cloth': { - min: 1, - max: 5, - chance: 0.8 - }, - 'teeth': { - min: 1, - max: 5, - chance: 0.5 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end7', 1: 'end8'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd8': { - notification: _('a youth lashes out with a tree branch.'), - combat: true, - enemy: 'youth', - chara: 'Y', - damage: 2, - hit: 0.7, - attackDelay: 1, - health: 45, - loot: { - 'cloth': { - min: 1, - max: 5, - chance: 0.8 - }, - 'teeth': { - min: 1, - max: 5, - chance: 0.5 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'end8'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd9': { - notification: _('a squatter stands firmly in the doorway of a small hut.'), - combat: true, - enemy: 'squatter', - chara: 'S', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 20, - loot: { - 'cloth': { - min: 1, - max: 5, - chance: 0.8 - }, - 'teeth': { - min: 1, - max: 5, - chance: 0.5 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {0.5: 'end8', 1: 'end9'} - }, - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'd10': { - notification: _('behind the door, a deformed figure awakes and attacks.'), - combat: true, - enemy: 'deformed', - chara: '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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'end14'} - } - } - }, - - 'd11': { - notification: _('as soon as the door is open a little bit, hundreds of tentacles erupt.'), - combat: true, - enemy: 'tentacles', - plural: true, - chara: 'TTT', - damage: 2, - hit: 0.6, - attackDelay: 0.5, - health: 60, - loot: { - 'meat': { - min: 10, - max: 20, - chance: 1 - } - }, - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: {1: 'end13'} - } - } - }, - - 'end1': { - text: [ - _('bird must have liked shiney things.'), - _('some good stuff woven into its nest.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - bullets: { - min: 5, - max: 10, - chance: 0.8 - }, - bolas: { - min: 1, - max: 5, - chance: 0.5 - }, - 'alien alloy': { - min: 1, - max: 1, - chance: 0.5 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end2': { - text: [ - _('not much here.'), - _('scavengers must have gotten to this place already.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - torch: { - min: 1, - max: 5, - chance: 0.8 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.5 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end3': { - text: [ - /// TRANSLATORS : a platform in the subway - _('the tunnel opens up at another platform.'), - _('the walls are scorched from an old battle.'), - _('bodies and supplies from both sides litter the ground.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - rifle: { - min: 1, - max: 1, - chance: 0.8 - }, - bullets: { - min: 1, - max: 5, - chance: 0.8 - }, - 'laser rifle': { - min: 1, - max: 1, - chance: 0.3 - }, - 'energy cell': { - min: 1, - max: 5, - chance: 0.3 - }, - 'alien alloy': { - min: 1, - max: 1, - chance: 0.3 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end4': { - text: [ - _('the small military outpost is well supplied.'), - _('arms and munitions, relics from the war, are neatly arranged on the store-room floor.'), - _('just as deadly now as they were then.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - rifle: { - min: 1, - max: 1, - chance: 1 - }, - bullets: { - min: 1, - max: 10, - chance: 1 - }, - grenade: { - min: 1, - max: 5, - chance: 0.8 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end5': { - text: [ - _('searching the bodies yields a few supplies.'), - _('more soldiers will be on their way.'), - _('time to move on.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - rifle: { - min: 1, - max: 1, - chance: 1 - }, - bullets: { - min: 1, - max: 10, - chance: 1 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'medicine': { - min: 1, - max: 4, - chance: 0.1 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end6': { - text: [ - _('the small settlement has clearly been burning a while.'), - _('the bodies of the wanderers that lived here are still visible in the flames.'), - _("still time to rescue a few supplies.") - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - 'laser rifle': { - min: 1, - max: 1, - chance: 0.5 - }, - 'energy cell': { - min: 1, - max: 5, - chance: 0.5 - }, - 'cured meat': { - min: 1, - max: 10, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end7': { - text: [ - _('the remaining settlers flee from the violence, their belongings forgotten.'), - _("there's not much, but some useful things can still be found.") - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - 'steel sword': { - min: 1, - max: 1, - chance: 0.8 - }, - 'energy cell': { - min: 1, - max: 5, - chance: 0.5 - }, - 'cured meat': { - min: 1, - max: 10, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end8': { - text: [ - _('the young settler was carrying a canvas sack.'), - _("it contains travelling gear, and a few trinkets."), - _("there's nothing else here.") - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - 'steel sword': { - min: 1, - max: 1, - chance: 0.8 - }, - 'bolas': { - min: 1, - max: 5, - chance: 0.5 - }, - 'cured meat': { - min: 1, - max: 10, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end9': { - text: [ - _('inside the hut, a child cries.'), - _("a few belongings rest against the walls."), - _("there's nothing else here.") - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.cityCleared', true); - }, - loot: { - 'rifle': { - min: 1, - max: 1, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.8 - }, - 'bolas': { - min: 1, - max: 5, - chance: 0.5 - }, - 'alien alloy': { - min: 1, - max: 1, - chance: 0.2 - } - }, - buttons: { - 'leave': { - text: _('leave city'), - cooldown: Events._LEAVE_COOLDOWN, - 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(); - $SM.set('game.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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end11': { - text: [ - _('a pristine medicine cabinet at the end of a hallway.'), - _("the rest of the hospital is empty.") - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end12': { - text: [ - _('someone had been stockpiling loot here.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end13': { - text: [ - _('the tentacular horror is defeated.'), - _('inside, the remains of its victims are everywhere.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end14': { - text: [ - /// TRANSLATORS : warped means extremely disfigured. - _('the warped man lies dead.'), - _('the operating theatre has a lot of curious equipment.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - - 'end15': { - text: [ - _('the old man had a small cache of interesting items.') - ], - onLoad: function() { - World.clearDungeon(); - $SM.set('game.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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - } - } - }, - "house": { /* Abandoned House */ - title: _('An Old House'), - scenes: { - 'start': { - text: [ - _('an old house remains here, once white siding yellowed and peeling.'), - _('the door hangs open.') - ], - notification: _('the remains of an old house stand as a monument to simpler times'), - buttons: { - 'enter': { - text: _('go inside'), - nextScene: { 0.25: 'medicine', 0.5: 'supplies', 1: 'occupied' } - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'supplies': { - text: [ - _('the house is abandoned, but not yet picked over.'), - _('still a few drops of water in the old well.') - ], - onLoad: function() { - World.markVisited(World.curPos[0], World.curPos[1]); - World.setWater(World.getMaxWater()); - Notifications.notify(null, _('water replenished')); - }, - loot: { - 'cured meat': { - min: 1, - max: 10, - chance: 0.8 - }, - 'leather': { - min: 1, - max: 10, - chance: 0.2 - }, - 'cloth': { - min: 1, - max: 10, - chance: 0.5 - } - }, - buttons: { - 'leave': { - text: _('leave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'medicine': { - 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'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'occupied': { - combat: true, - enemy: 'squatter', - chara: 'S', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 10, - notification: _('a man charges down the hall, a rusty blade in his hand'), - onLoad: function() { - World.markVisited(World.curPos[0], World.curPos[1]); - }, - loot: { - 'cured meat': { - min: 1, - max: 10, - chance: 0.8 - }, - 'leather': { - min: 1, - max: 10, - chance: 0.2 - }, - 'cloth': { - min: 1, - max: 10, - chance: 0.5 - } - }, - buttons: { - 'leave': { - text: _('leave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - } - } - }, - "battlefield": { /* Discovering an old battlefield */ - title: _('A Forgotten Battlefield'), - scenes: { - 'start': { - text: [ - _('a battle was fought here, long ago.'), - _('battered technology from both sides lays dormant on the blasted landscape.') - ], - onLoad: function() { - World.markVisited(World.curPos[0], World.curPos[1]); - }, - loot: { - 'rifle': { - min: 1, - max: 3, - chance: 0.5 - }, - 'bullets': { - min: 5, - max: 20, - chance: 0.8 - }, - 'laser rifle': { - min: 1, - max: 3, - chance: 0.3 - }, - 'energy cell': { - min: 5, - max: 10, - chance: 0.5 - }, - 'grenade': { - min: 1, - max: 5, - chance: 0.5 - }, - 'alien alloy': { - min: 1, - max: 1, - chance: 0.3 - } - }, - buttons: { - 'leave': { - text: _('leave'), - - nextScene: 'end' - } - } - } - } - }, - "borehole": { /* Admiring a huge borehole */ - title: _('A Huge Borehole'), - scenes: { - 'start': { - text: [ - _('a huge hole is cut deep into the earth, evidence of the past harvest.'), - _('they took what they came for, and left.'), - _('castoff from the mammoth drills can still be found by the edges of the precipice.') - ], - onLoad: function() { - World.markVisited(World.curPos[0], World.curPos[1]); - }, - loot: { - 'alien alloy': { - min: 1, - max: 3, - chance: 1 - } - }, - buttons: { - 'leave': { - text: _('leave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - } - } - }, - "ship": { /* Finding a way off this rock */ - title: _('A Crashed Ship'), - scenes: { - 'start': { - onLoad: function() { - World.markVisited(World.curPos[0], World.curPos[1]); - World.drawRoad(); - World.state.ship = true; - }, - text: [ - _('the familiar curves of a wanderer vessel rise up out of the dust and ash. '), - _("lucky that the natives can't work the mechanisms."), - _('with a little effort, it might fly again.') - ], - buttons: { - 'leavel': { - text: _('salvage'), - nextScene: 'end' - } - } - } - } - }, - "sulphurmine": { /* Clearing the Sulphur Mine */ - title: _('The Sulphur Mine'), - scenes: { - 'start': { - text: [ - _("the military is already set up at the mine's entrance."), - _('soldiers patrol the perimeter, rifles slung over their shoulders.') - ], - notification: _('a military perimeter is set up around the mine.'), - buttons: { - 'attack': { - text: _('attack'), - nextScene: {1: 'a1'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'a1': { - combat: true, - enemy: 'soldier', - ranged: true, - chara: 'D', - damage: 8, - hit: 0.8, - attackDelay: 2, - health: 50, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } - }, - notification: _('a soldier, alerted, opens fire.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'a2' } - }, - 'run': { - text: _('run'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'a2': { - combat: true, - enemy: 'soldier', - ranged: true, - chara: 'D', - damage: 8, - hit: 0.8, - attackDelay: 2, - health: 50, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'bullets': { - min: 1, - max: 5, - chance: 0.5 - }, - 'rifle': { - min: 1, - max: 1, - chance: 0.2 - } - }, - notification: _('a second soldier joins the fight.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'a3' } - }, - 'run': { - text: _('run'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'a3': { - combat: true, - enemy: 'veteran', - chara: 'V', - damage: 10, - hit: 0.8, - attackDelay: 2, - health: 65, - loot: { - 'bayonet': { - min: 1, - max: 1, - chance: 0.5 - }, - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - } - }, - notification: _('a grizzled soldier attacks, waving a bayonet.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'cleared' } - } - } - }, - 'cleared': { - text: [ - _('the military presence has been cleared.'), - _('the mine is now safe for workers.') - ], - notification: _('the sulphur mine is clear of dangers'), - onLoad: function() { - World.drawRoad(); - World.state.sulphurmine = true; - World.markVisited(World.curPos[0], World.curPos[1]); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - } - } - }, - "coalmine": { /* Clearing the Coal Mine */ - title: _('The Coal Mine'), - scenes: { - 'start': { - text: [ - _('camp fires burn by the entrance to the mine.'), - _('men mill about, weapons at the ready.') - ], - notification: _('this old mine is not abandoned'), - buttons: { - 'attack': { - text: _('attack'), - nextScene: {1: 'a1'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'a1': { - combat: true, - enemy: 'man', - chara: 'M', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 10, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'cloth': { - min: 1, - max: 5, - chance: 0.8 - } - }, - notification: _('a man joins the fight'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'a2' } - }, - 'run': { - text: _('run'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'a2': { - combat: true, - enemy: 'man', - chara: 'M', - damage: 3, - hit: 0.8, - attackDelay: 2, - health: 10, - loot: { - 'cured meat': { - min: 1, - max: 5, - chance: 0.8 - }, - 'cloth': { - min: 1, - max: 5, - chance: 0.8 - } - }, - notification: _('a man joins the fight'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'a3' } - }, - 'run': { - text: _('run'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: 'end' - } - } - }, - 'a3': { - combat: true, - enemy: 'chief', - chara: 'C', - damage: 5, - hit: 0.8, - attackDelay: 2, - health: 20, - loot: { - 'cured meat': { - min: 5, - max: 10, - chance: 1 - }, - 'cloth': { - min: 5, - max: 10, - chance: 0.8 - }, - 'iron': { - min: 1, - max: 5, - chance: 0.8 - } - }, - notification: _('only the chief remains.'), - buttons: { - 'continue': { - text: _('continue'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'cleared' } - } - } - }, - 'cleared': { - text: [ - _('the camp is still, save for the crackling of the fires.'), - _('the mine is now safe for workers.') - ], - notification: _('the coal mine is clear of dangers'), - onLoad: function() { - World.drawRoad(); - World.state.coalmine = true; - World.markVisited(World.curPos[0], World.curPos[1]); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - } - } - }, - "ironmine": { /* Clearing the Iron Mine */ - title: _('The Iron Mine'), - scenes: { - 'start': { - text: [ - _('an old iron mine sits here, tools abandoned and left to rust.'), - _('bleached bones are strewn about the entrance. many, deeply scored with jagged grooves.'), - _('feral howls echo out of the darkness.') - ], - notification: _('the path leads to an abandoned mine'), - buttons: { - 'enter': { - text: _('go inside'), - nextScene: { 1: 'enter' }, - cost: { 'torch': 1 } - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'enter': { - combat: true, - enemy: 'beastly matriarch', - chara: 'M', - damage: 4, - hit: 0.8, - attackDelay: 2, - health: 10, - loot: { - 'teeth': { - min: 5, - max: 10, - chance: 1 - }, - 'scales': { - min: 5, - max: 10, - chance: 0.8 - }, - 'cloth': { - min: 5, - max: 10, - chance: 0.5 - } - }, - notification: _('a large creature lunges, muscles rippling in the torchlight'), - buttons: { - 'leave': { - text: _('leave'), - cooldown: Events._LEAVE_COOLDOWN, - nextScene: { 1: 'cleared' } - } - } - }, - 'cleared': { - text: [ - _('the beast is dead.'), - _('the mine is now safe for workers.') - ], - notification: _('the iron mine is clear of dangers'), - onLoad: function() { - World.drawRoad(); - World.state.ironmine = true; - World.markVisited(World.curPos[0], World.curPos[1]); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - } - } - }, - - "cache": { /* Cache - contains some of supplies from previous game */ - title: _('A Destroyed Village'), - scenes: { - 'start': { - text: [ - _('a destroyed village lies in the dust.'), - _('charred bodies litter the ground.') - ], - /// TRANSLATORS : tang = strong metallic smell, wanderer afterburner = ship's engines - notification: _('the metallic tang of wanderer afterburner hangs in the air.'), - buttons: { - 'enter': { - text: _('enter'), - nextScene: {1: 'underground'} - }, - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - }, - 'underground': { - text: [ - _('a shack stands at the center of the village.'), - _('there are still supplies inside.') - ], - buttons: { - 'take': { - text: _('take'), - nextScene: {1: 'exit'} - } - } - }, - 'exit': { - text: [ - _('all the work of a previous generation is here.'), - _('ripe for the picking.') - ], - onLoad: function() { - World.markVisited(World.curPos[0], World.curPos[1]); - Prestige.collectStores(); - }, - buttons: { - 'leave': { - text: _('leave'), - nextScene: 'end' - } - } - } - } - } -}; +/** + * Events that only occur at specific times. Launched manually. + **/ +Events.Setpieces = { + "outpost": { /* Friendly Outpost */ + title: _('An Outpost'), + scenes: { + 'start': { + text: [ + _('a safe place in the wilds.') + ], + notification: _('a safe place in the wilds.'), + loot: { + 'cured meat': { + min: 5, + max: 10, + chance: 1 + } + }, + onLoad: function() { + World.useOutpost(); + }, + buttons: { + 'leave': { + text: _('leave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + } + } + }, + "swamp": { /* Swamp */ + title: _('A Murky Swamp'), + scenes: { + 'start': { + text: [ + _('rotting reeds rise out of the swampy earth.'), + _('a lone frog sits in the muck, silently.') + ], + notification: _('a swamp festers in the stagnant air.'), + buttons: { + 'enter': { + text: _('enter'), + nextScene: {1: 'cabin'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'cabin': { + text: [ + _('deep in the swamp is a moss-covered cabin.'), + _('an old wanderer sits inside, in a seeming trance.') + ], + buttons: { + 'talk': { + cost: {'charm': 1}, + text: _('talk'), + nextScene: {1: 'talk'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'talk': { + text: [ + _('the wanderer takes the charm and nods slowly.'), + _('he speaks of once leading the great fleets to fresh worlds.'), + _('unfathomable destruction to fuel wanderer hungers.'), + _('his time here, now, is his penance.') + ], + onLoad: function() { + $SM.addPerk('gastronome'); + World.markVisited(World.curPos[0], World.curPos[1]); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + } + } + }, + "cave": { /* Cave */ + title: _('A Damp Cave'), + scenes: { + 'start': { + text: [ + _('the mouth of the cave is wide and dark.'), + _("can't see what's inside.") + ], + notification: _('the earth here is split, as if bearing an ancient wound'), + buttons: { + 'enter': { + text: _('go inside'), + cost: { torch: 1 }, + nextScene: {0.3: 'a1', 0.6: 'a2', 1: 'a3'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + + 'a1': { + combat: true, + enemy: 'beast', + chara: 'B', + damage: 1, + hit: 0.8, + attackDelay: 1, + health: 5, + notification: _('a startled beast defends its home'), + loot: { + 'fur': { + min: 1, + max: 10, + chance: 1 + }, + 'teeth': { + min: 1, + max: 5, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'b1', 1: 'b2'} + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'a2': { + text: [ + _('the cave narrows a few feet in.'), + _("the walls are moist and moss-covered") + ], + buttons: { + 'continue': { + text: _('squeeze'), + nextScene: {0.5: 'b2', 1: 'b3'} + }, + 'leave': { + text: _('leave cave'), + nextScene: 'end' + } + } + }, + 'a3': { + text: [ + _('the remains of an old camp sits just inside the cave.'), + _('bedrolls, torn and blackened, lay beneath a thin layer of dust.') + ], + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 1 + }, + 'torch': { + min: 1, + max: 5, + chance: 0.5 + }, + 'leather': { + min: 1, + max: 5, + chance: 0.3 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'b3', 1: 'b4'} + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b1': { + text: [ + _('the body of a wanderer lies in a small cavern.'), + _("rot's been to work on it, and some of the pieces are missing."), + /// TRANSLATORS : 'it' is a rotting wanderer's body + _("can't tell what left it here.") + ], + loot: { + 'iron sword': { + min: 1, + max: 1, + chance: 1 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'torch': { + min: 1, + max: 3, + chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'c1' } + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b2': { + text: [ + _('the torch sputters and dies in the damp air'), + _('the darkness is absolute') + ], + notification: _('the torch goes out'), + buttons: { + 'continue': { + text: _('continue'), + cost: {'torch': 1}, + nextScene: { 1: 'c1' } + }, + 'leave': { + text: _('leave cave'), + nextScene: 'end' + } + } + }, + 'b3': { + combat: true, + enemy: 'beast', + chara: 'B', + damage: 1, + hit: 0.8, + attackDelay: 1, + health: 5, + notification: _('a startled beast defends its home'), + loot: { + 'fur': { + min: 1, + max: 3, + chance: 1 + }, + 'teeth': { + min: 1, + max: 2, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'c2'} + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b4': { + combat: true, + enemy: 'cave lizard', + chara: 'L', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 6, + notification: _('a cave lizard attacks'), + loot: { + 'scales': { + min: 1, + max: 3, + chance: 1 + }, + 'teeth': { + min: 1, + max: 2, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'c2'} + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c1': { + combat: true, + enemy: 'beast', + chara: 'B', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 10, + notification: _('a large beast charges out of the dark'), + loot: { + 'fur': { + min: 1, + max: 3, + chance: 1 + }, + 'teeth': { + min: 1, + max: 3, + chance: 1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end1', 1: 'end2'} + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c2': { + combat: true, + enemy: 'lizard', + chara: 'L', + damage: 4, + hit: 0.8, + attackDelay: 2, + health: 10, + notification: _('a giant lizard shambles forward'), + loot: { + 'scales': { + min: 1, + max: 3, + chance: 1 + }, + 'teeth': { + min: 1, + max: 3, + chance: 1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.7: 'end2', 1: 'end3'} + }, + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end1': { + text: [ + _('the nest of a large animal lies at the back of the cave.') + ], + onLoad: function() { + World.clearDungeon(); + }, + loot: { + 'meat': { + min: 5, + max: 10, + chance: 1 + }, + 'fur': { + min: 5, + max: 10, + chance: 1 + }, + 'scales': { + min: 5, + max: 10, + chance: 1 + }, + 'teeth': { + min: 5, + max: 10, + chance: 1 + }, + 'cloth': { + min: 5, + max: 10, + chance: 0.5 + } + }, + buttons: { + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end2': { + text: [ + _('a small supply cache is hidden at the back of the cave.') + ], + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 1 + }, + 'leather': { + min: 5, + max: 10, + chance: 1 + }, + 'iron': { + min: 5, + max: 10, + chance: 1 + }, + 'cured meat': { + min: 5, + max: 10, + chance: 1 + }, + 'steel': { + min: 5, + max: 10, + chance: 0.5 + }, + 'bolas': { + min: 1, + max: 3, + chance: 0.3 + }, + 'medicine': { + min: 1, + max: 4, + chance: 0.15 + } + }, + onLoad: function() { + World.clearDungeon(); + }, + buttons: { + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end3': { + text: [ + _('an old case is wedged behind a rock, covered in a thick layer of dust.') + ], + loot: { + 'steel sword': { + min: 1, + max: 1, + chance: 1 + }, + 'bolas': { + min: 1, + max: 3, + chance: 0.5 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.3 + } + }, + onLoad: function() { + World.clearDungeon(); + }, + buttons: { + 'leave': { + text: _('leave cave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + } + } + }, + "town": { /* Town */ + title: _('A Deserted Town'), + scenes: { + 'start': { + text: [ + _('a small suburb lays ahead, empty houses scorched and peeling.'), + _("broken streetlights stand, rusting. light hasn't graced this place in a long time.") + ], + notification: _("the town lies abandoned, its citizens long dead"), + buttons: { + 'enter': { + text: _('explore'), + nextScene: {0.3: 'a1', 0.7: 'a3', 1: 'a2'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + + 'a1': { + text: [ + _("where the windows of the schoolhouse aren't shattered, they're blackened with soot."), + _('the double doors creak endlessly in the wind.') + ], + buttons: { + 'enter': { + text: _('enter'), + nextScene: {0.5: 'b1', 1: 'b2'}, + cost: {torch: 1} + }, + 'leave': { + text: _('leave town'), + nextScene: 'end' + } + } + }, + + 'a2': { + combat: true, + enemy: 'thug', + chara: 'T', + damage: 4, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + 'leather': { + min: 5, + max: 10, + chance: 0.8 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.5 + } + }, + notification: _('ambushed on the street.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'b3', 1: 'b4'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'a3': { + text: [ + _("a squat building up ahead."), + _('a green cross barely visible behind grimy windows.') + ], + buttons: { + 'enter': { + text: _('enter'), + nextScene: {0.5: 'b5', 1: 'end5'}, + cost: {torch: 1} + }, + 'leave': { + text: _('leave town'), + nextScene: 'end' + } + } + }, + 'b1': { + text: [ + _('a small cache of supplies is tucked inside a rusting locker.') + ], + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 1 + }, + 'torch': { + min: 1, + max: 3, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.3 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.05 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c1', 1: 'c2'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b2': { + combat: true, + enemy: 'scavenger', + chara: 'S', + damage: 4, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + 'leather': { + min: 5, + max: 10, + chance: 0.8 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.5 + } + }, + notification: _('a scavenger waits just inside the door.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c2', 1: 'c3'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b3': { + combat: true, + enemy: 'beast', + chara: 'B', + damage: 3, + hit: 0.8, + attackDelay: 1, + health: 25, + loot: { + 'teeth': { + min: 1, + max: 5, + chance: 1 + }, + 'fur': { + min: 5, + max: 10, + chance: 1 + } + }, + notification: _('a beast stands alone in an overgrown park.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c4', 1: 'c5'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b4': { + text: [ + _('an overturned caravan is spread across the pockmarked street.'), + _("it's been picked over by scavengers, but there's still some things worth taking.") + ], + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'torch': { + min: 1, + max: 3, + chance: 0.5 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.3 + }, + 'medicine': { + min: 1, + max: 3, + chance: 0.1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c5', 1: 'c6' } + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b5': { + combat: true, + enemy: 'madman', + chara: '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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.3: 'end5', 1: 'end6'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c1': { + combat: true, + enemy: 'thug', + chara: 'T', + damage: 4, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + 'leather': { + min: 5, + max: 10, + chance: 0.8 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.5 + } + }, + notification: _('a thug moves out of the shadows.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'd1'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c2': { + combat: true, + enemy: 'beast', + chara: 'B', + damage: 3, + hit: 0.8, + attackDelay: 1, + health: 25, + loot: { + 'teeth': { + min: 1, + max: 5, + chance: 1 + }, + 'fur': { + min: 5, + max: 10, + chance: 1 + } + }, + notification: _('a beast charges out of a ransacked classroom.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'd1'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c3': { + text: [ + _('through the large gymnasium doors, footsteps can be heard.'), + _('the torchlight casts a flickering glow down the hallway.'), + _('the footsteps stop.') + ], + buttons: { + 'continue': { + text: _('enter'), + nextScene: {1: 'd1'} + }, + 'leave': { + text: _('leave town'), + nextScene: 'end' + } + } + }, + 'c4': { + combat: true, + enemy: 'beast', + chara: 'B', + damage: 4, + hit: 0.8, + attackDelay: 1, + health: 25, + loot: { + 'teeth': { + min: 1, + max: 5, + chance: 1 + }, + 'fur': { + min: 5, + max: 10, + chance: 1 + } + }, + notification: _('another beast, draw by the noise, leaps out of a copse of trees.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'd2'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c5': { + text: [ + _("something's causing a commotion a ways down the road."), + _("a fight, maybe.") + ], + buttons: { + 'continue': { + text: _('continue'), + nextScene: {1: 'd2'} + }, + 'leave': { + text: _('leave town'), + nextScene: 'end' + } + } + }, + 'c6': { + text: [ + _('a small basket of food is hidden under a park bench, with a note attached.'), + _("can't read the words.") + ], + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'd2'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'd1': { + combat: true, + enemy: 'scavenger', + chara: 'S', + damage: 5, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 1 + }, + 'leather': { + min: 5, + max: 10, + chance: 0.8 + }, + 'steel sword': { + min: 1, + max: 1, + chance: 0.5 + } + }, + notification: _('a panicked scavenger bursts through the door, screaming.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end1', 1: 'end2'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'd2': { + combat: true, + enemy: 'vigilante', + chara: 'V', + damage: 6, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 1 + }, + 'leather': { + min: 5, + max: 10, + chance: 0.8 + }, + 'steel sword': { + min: 1, + max: 1, + chance: 0.5 + } + }, + notification: _("a man stands over a dead wanderer. notices he's not alone."), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end3', 1: 'end4'} + }, + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end1': { + text: [ + _('scavenger had a small camp in the school.'), + _('collected scraps spread across the floor like they fell from heaven.') + ], + onLoad: function() { + World.clearDungeon(); + }, + loot: { + 'steel sword': { + min: 1, + max: 1, + chance: 1 + }, + 'steel': { + min: 5, + max: 10, + chance: 1 + }, + 'cured meat': { + min: 5, + max: 10, + chance: 1 + }, + 'bolas': { + min: 1, + max: 5, + chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.3 + } + }, + buttons: { + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end2': { + text: [ + _("scavenger'd been looking for supplies in here, it seems."), + _("a shame to let what he'd found go to waste.") + ], + onLoad: function() { + World.clearDungeon(); + }, + loot: { + 'coal': { + min: 5, + max: 10, + chance: 1 + }, + 'cured meat': { + min: 5, + max: 10, + chance: 1 + }, + 'leather': { + min: 5, + max: 10, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end3': { + text: [ + _("beneath the wanderer's rags, clutched in one of its many hands, a glint of steel."), + _("worth killing for, it seems.") + ], + onLoad: function() { + World.clearDungeon(); + }, + loot: { + 'rifle': { + min: 1, + max: 1, + chance: 1 + }, + 'bullets': { + min: 1, + max: 5, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end4': { + text: [ + _("eye for an eye seems fair."), + _("always worked before, at least."), + _("picking the bones finds some useful trinkets.") + ], + onLoad: function() { + World.clearDungeon(); + }, + loot: { + 'cured meat': { + min: 5, + max: 10, + chance: 1 + }, + 'iron': { + min: 5, + max: 10, + chance: 1 + }, + 'torch': { + min: 1, + max: 5, + chance: 1 + }, + 'bolas': { + min: 1, + max: 5, + chance: 0.5 + }, + 'medicine': { + min: 1, + max: 2, + chance: 0.1 + } + }, + buttons: { + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end5': { + text: [ + _('some medicine abandoned in the drawers.') + ], + onLoad: function() { + World.clearDungeon(); + }, + loot: { + 'medicine': { + min: 2, + max: 5, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave town'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'end6': { + text: [ + _('the clinic has been ransacked.'), + _('only dust and stains remain.') + ], + onLoad: function() { + World.clearDungeon(); + }, + buttons: { + 'leave': { + text: _('leave town'), + + nextScene: 'end' + } + } + } + } + }, + "city": { /* City */ + title: _('A Ruined City'), + scenes: { + 'start': { + text: [ + _('a battered highway sign stands guard at the entrance to this once-great city.'), + _("the towers that haven't crumbled jut from the landscape like the ribcage of some ancient beast."), + _('might be things worth having still inside.') + ], + notification: _("the towers of a decaying city dominate the skyline"), + buttons: { + 'enter': { + text: _('explore'), + nextScene: {0.2: 'a1', 0.5: 'a2', 0.8: 'a3', 1: 'a4'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'a1': { + text:[ + _('the streets are empty.'), + _('the air is filled with dust, driven relentlessly by the hard winds.') + ], + buttons: { + 'continue': { + text: _('continue'), + nextScene: {0.5: 'b1', 1: 'b2'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + 'a2': { + text:[ + _('orange traffic cones are set across the street, faded and cracked.'), + _('lights flash through the alleys between buildings.') + ], + buttons: { + 'continue': { + text: _('continue'), + nextScene: {0.5: 'b3', 1: 'b4'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + 'a3': { + text: [ + _('a large shanty town sprawls across the streets.'), + _('faces, darkened by soot and blood, stare out from crooked huts.') + ], + buttons: { + 'continue': { + text: _('continue'), + nextScene: {0.5: 'b5', 1: 'b6'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + '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.'), + _('the shell of a burned out car blocks the entrance.'), + _('most of the windows at ground level are busted anyway.') + ], + buttons: { + 'enter': { + text: _('enter'), + nextScene: {0.5: 'c1', 1: 'c2'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + 'b2': { + combat: true, + notification: _('a huge lizard scrambles up out of the darkness of an old metro station.'), + enemy: 'lizard', + chara: 'L', + damage: 5, + hit: 0.8, + attackDelay: 2, + health: 20, + loot: { + 'scales': { + min: 5, + max: 10, + chance: 0.8 + }, + 'teeth': { + min: 5, + max: 10, + chance: 0.5 + }, + 'meat': { + min: 5, + max: 10, + chance: 0.8 + } + }, + buttons: { + 'descend': { + text: _('descend'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c2', 1: 'c3'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b3': { + notification: _('the shot echoes in the empty street.'), + combat: true, + enemy: 'sniper', + chara: 'S', + damage: 15, + hit: 0.8, + attackDelay: 4, + health: 30, + ranged: true, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c4', 1: 'c5'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b4': { + notification: _('the soldier steps out from between the buildings, rifle raised.'), + combat: true, + enemy: 'soldier', + ranged: true, + chara: 'D', + damage: 8, + hit: 0.8, + attackDelay: 2, + health: 50, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c5', 1: 'c6'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b5': { + notification: _('a frail man stands defiantly, blocking the path.'), + combat: true, + enemy: 'frail man', + chara: 'M', + damage: 1, + hit: 0.8, + attackDelay: 2, + health: 10, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + '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': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'c7', 1: 'c8'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'b6': { + text: [ + _('nothing but downcast eyes.'), + _('the people here were broken a long time ago.') + ], + buttons: { + 'continue': { + text: _('continue'), + nextScene: {0.5: 'c8', 1: 'c9'} + }, + 'leave': { + text: _('leave city'), + 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', + chara: '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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.3: 'c13', 0.7: 'c11', 1: 'end15'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'c1': { + notification: _('a thug is waiting on the other side of the wall.'), + combat: true, + enemy: 'thug', + chara: 'T', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 30, + loot: { + 'steel sword': { + min: 1, + max: 1, + chance: 0.5 + }, + 'cured meat': { + min: 1, + max: 3, + chance: 0.5 + }, + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'd1', 1: 'd2'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'c2': { + notification: _('a snarling beast jumps out from behind a car.'), + combat: true, + enemy: 'beast', + chara: 'B', + damage: 2, + hit: 0.8, + attackDelay: 1, + health: 30, + loot: { + 'meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'fur': { + min: 1, + max: 5, + chance: 0.8 + }, + 'teeth': { + min: 1, + max: 5, + chance: 0.5 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'd2'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'c3': { + text: [ + _('street above the subway platform is blown away.'), + _('lets some light down into the dusty haze.'), + _('a sound comes from the tunnel, just ahead.') + ], + buttons: { + 'enter': { + text: _('investigate'), + cost: { 'torch': 1 }, + nextScene: {0.5: 'd2', 1: 'd3'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + + 'c4': { + text: [ + _('looks like a camp of sorts up ahead.'), + /// TRANSLATORS : chainlink is a type of metal fence. + _('rusted chainlink is pulled across an alleyway.'), + _('fires burn in the courtyard beyond.') + ], + buttons: { + 'enter': { + text: _('continue'), + nextScene: {0.5: 'd4', 1: 'd5'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + + 'c5': { + text: [ + _('more voices can be heard ahead.'), + _('they must be here for a reason.') + ], + buttons: { + 'enter': { + text: _('continue'), + nextScene: {1: 'd5'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + + 'c6': { + text: [ + _('the sound of gunfire carries on the wind.'), + _('the street ahead glows with firelight.') + ], + buttons: { + 'enter': { + text: _('continue'), + nextScene: {0.5: 'd5', 1: 'd6'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + + 'c7': { + text: [ + /// TRANSLATORS : squatters occupy abandoned dwellings they don't own. + _('more squatters are crowding around now.'), + _('someone throws a stone.') + ], + buttons: { + 'enter': { + text: _('continue'), + nextScene: {0.5: 'd7', 1: 'd8'} + }, + 'leave': { + text: _('leave city'), + nextScene: 'end' + } + } + }, + + 'c8': { + text: [ + _('an improvised shop is set up on the sidewalk.'), + _('the owner stands by, stoic.') + ], + loot: { + 'steel sword': { + min: 1, + max: 1, + chance: 0.8 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.5 + }, + 'bullets': { + min: 1, + max: 8, + chance: 0.25 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.01 + }, + 'medicine': { + min: 1, + max: 4, + chance: 0.5 + } + }, + buttons: { + 'enter': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'd8'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'c9': { + text: [ + _('strips of meat hang drying by the side of the street.'), + _('the people back away, avoiding eye contact.') + ], + loot: { + 'cured meat': { + min: 5, + max: 10, + chance: 1 + } + }, + buttons: { + 'enter': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'd8', 1: 'd9'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + '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, + chara: '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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'end10' } + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'c12': { + notification: _('a pack of lizards rounds the corner.'), + combat: true, + enemy: 'lizards', + plural: true, + chara: '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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'end10' } + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + 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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 0.5: 'end10', 1: 'end11' } + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd1': { + notification: _('a large bird nests at the top of the stairs.'), + combat: true, + enemy: 'bird', + chara: 'B', + damage: 5, + hit: 0.7, + attackDelay: 1, + health: 45, + loot: { + 'meat': { + min: 5, + max: 10, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end1', 1: 'end2'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd2': { + text: [ + _("the debris is denser here."), + _("maybe some useful stuff in the rubble.") + ], + loot: { + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'steel': { + min: 1, + max: 10, + chance: 0.8 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.01 + }, + 'cloth': { + min: 1, + max: 10, + chance: 1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'end2'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd3': { + notification: _('a swarm of rats rushes up the tunnel.'), + combat: true, + enemy: 'rats', + plural: true, + chara: 'RRR', + damage: 1, + hit: 0.8, + attackDelay: 0.25, + health: 60, + loot: { + 'fur': { + min: 5, + max: 10, + chance: 0.8 + }, + 'teeth': { + min: 5, + max: 10, + chance: 0.5 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end2', 1: 'end3'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd4': { + notification: _('a large man attacks, waving a bayonet.'), + combat: true, + enemy: 'veteran', + chara: 'V', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 45, + loot: { + 'bayonet': { + min: 1, + max: 1, + chance: 0.5 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end4', 1: 'end5'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd5': { + notification: _('a second soldier opens fire.'), + combat: true, + enemy: 'soldier', + ranged: true, + chara: 'D', + damage: 8, + hit: 0.8, + attackDelay: 2, + health: 50, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'end5'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd6': { + notification: _('a masked soldier rounds the corner, gun drawn'), + combat: true, + enemy: 'commando', + chara: 'C', + ranged: true, + damage: 3, + hit: 0.9, + attackDelay: 2, + health: 55, + loot: { + 'rifle': { + min: 1, + max: 1, + chance: 0.5 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.8 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end5', 1: 'end6'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd7': { + notification: _('the crowd surges forward.'), + combat: true, + enemy: 'squatters', + plural: true, + chara: 'SSS', + damage: 2, + hit: 0.7, + attackDelay: 0.5, + health: 40, + loot: { + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + }, + 'teeth': { + min: 1, + max: 5, + chance: 0.5 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end7', 1: 'end8'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd8': { + notification: _('a youth lashes out with a tree branch.'), + combat: true, + enemy: 'youth', + chara: 'Y', + damage: 2, + hit: 0.7, + attackDelay: 1, + health: 45, + loot: { + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + }, + 'teeth': { + min: 1, + max: 5, + chance: 0.5 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'end8'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd9': { + notification: _('a squatter stands firmly in the doorway of a small hut.'), + combat: true, + enemy: 'squatter', + chara: 'S', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 20, + loot: { + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + }, + 'teeth': { + min: 1, + max: 5, + chance: 0.5 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {0.5: 'end8', 1: 'end9'} + }, + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'd10': { + notification: _('behind the door, a deformed figure awakes and attacks.'), + combat: true, + enemy: 'deformed', + chara: '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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'end14'} + } + } + }, + + 'd11': { + notification: _('as soon as the door is open a little bit, hundreds of tentacles erupt.'), + combat: true, + enemy: 'tentacles', + plural: true, + chara: 'TTT', + damage: 2, + hit: 0.6, + attackDelay: 0.5, + health: 60, + loot: { + 'meat': { + min: 10, + max: 20, + chance: 1 + } + }, + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: {1: 'end13'} + } + } + }, + + 'end1': { + text: [ + _('bird must have liked shiney things.'), + _('some good stuff woven into its nest.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + bullets: { + min: 5, + max: 10, + chance: 0.8 + }, + bolas: { + min: 1, + max: 5, + chance: 0.5 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.5 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end2': { + text: [ + _('not much here.'), + _('scavengers must have gotten to this place already.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + torch: { + min: 1, + max: 5, + chance: 0.8 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.5 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end3': { + text: [ + /// TRANSLATORS : a platform in the subway + _('the tunnel opens up at another platform.'), + _('the walls are scorched from an old battle.'), + _('bodies and supplies from both sides litter the ground.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + rifle: { + min: 1, + max: 1, + chance: 0.8 + }, + bullets: { + min: 1, + max: 5, + chance: 0.8 + }, + 'laser rifle': { + min: 1, + max: 1, + chance: 0.3 + }, + 'energy cell': { + min: 1, + max: 5, + chance: 0.3 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.3 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end4': { + text: [ + _('the small military outpost is well supplied.'), + _('arms and munitions, relics from the war, are neatly arranged on the store-room floor.'), + _('just as deadly now as they were then.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + rifle: { + min: 1, + max: 1, + chance: 1 + }, + bullets: { + min: 1, + max: 10, + chance: 1 + }, + grenade: { + min: 1, + max: 5, + chance: 0.8 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end5': { + text: [ + _('searching the bodies yields a few supplies.'), + _('more soldiers will be on their way.'), + _('time to move on.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + rifle: { + min: 1, + max: 1, + chance: 1 + }, + bullets: { + min: 1, + max: 10, + chance: 1 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'medicine': { + min: 1, + max: 4, + chance: 0.1 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end6': { + text: [ + _('the small settlement has clearly been burning a while.'), + _('the bodies of the wanderers that lived here are still visible in the flames.'), + _("still time to rescue a few supplies.") + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + 'laser rifle': { + min: 1, + max: 1, + chance: 0.5 + }, + 'energy cell': { + min: 1, + max: 5, + chance: 0.5 + }, + 'cured meat': { + min: 1, + max: 10, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end7': { + text: [ + _('the remaining settlers flee from the violence, their belongings forgotten.'), + _("there's not much, but some useful things can still be found.") + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + 'steel sword': { + min: 1, + max: 1, + chance: 0.8 + }, + 'energy cell': { + min: 1, + max: 5, + chance: 0.5 + }, + 'cured meat': { + min: 1, + max: 10, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end8': { + text: [ + _('the young settler was carrying a canvas sack.'), + _("it contains travelling gear, and a few trinkets."), + _("there's nothing else here.") + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + 'steel sword': { + min: 1, + max: 1, + chance: 0.8 + }, + 'bolas': { + min: 1, + max: 5, + chance: 0.5 + }, + 'cured meat': { + min: 1, + max: 10, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end9': { + text: [ + _('inside the hut, a child cries.'), + _("a few belongings rest against the walls."), + _("there's nothing else here.") + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.cityCleared', true); + }, + loot: { + 'rifle': { + min: 1, + max: 1, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.8 + }, + 'bolas': { + min: 1, + max: 5, + chance: 0.5 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.2 + } + }, + buttons: { + 'leave': { + text: _('leave city'), + cooldown: Events._LEAVE_COOLDOWN, + 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(); + $SM.set('game.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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end11': { + text: [ + _('a pristine medicine cabinet at the end of a hallway.'), + _("the rest of the hospital is empty.") + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end12': { + text: [ + _('someone had been stockpiling loot here.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end13': { + text: [ + _('the tentacular horror is defeated.'), + _('inside, the remains of its victims are everywhere.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end14': { + text: [ + /// TRANSLATORS : warped means extremely disfigured. + _('the warped man lies dead.'), + _('the operating theatre has a lot of curious equipment.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + + 'end15': { + text: [ + _('the old man had a small cache of interesting items.') + ], + onLoad: function() { + World.clearDungeon(); + $SM.set('game.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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + } + } + }, + "house": { /* Abandoned House */ + title: _('An Old House'), + scenes: { + 'start': { + text: [ + _('an old house remains here, once white siding yellowed and peeling.'), + _('the door hangs open.') + ], + notification: _('the remains of an old house stand as a monument to simpler times'), + buttons: { + 'enter': { + text: _('go inside'), + nextScene: { 0.25: 'medicine', 0.5: 'supplies', 1: 'occupied' } + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'supplies': { + text: [ + _('the house is abandoned, but not yet picked over.'), + _('still a few drops of water in the old well.') + ], + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + World.setWater(World.getMaxWater()); + Notifications.notify(null, _('water replenished')); + }, + loot: { + 'cured meat': { + min: 1, + max: 10, + chance: 0.8 + }, + 'leather': { + min: 1, + max: 10, + chance: 0.2 + }, + 'cloth': { + min: 1, + max: 10, + chance: 0.5 + } + }, + buttons: { + 'leave': { + text: _('leave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'medicine': { + 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'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'occupied': { + combat: true, + enemy: 'squatter', + chara: 'S', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 10, + notification: _('a man charges down the hall, a rusty blade in his hand'), + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + }, + loot: { + 'cured meat': { + min: 1, + max: 10, + chance: 0.8 + }, + 'leather': { + min: 1, + max: 10, + chance: 0.2 + }, + 'cloth': { + min: 1, + max: 10, + chance: 0.5 + } + }, + buttons: { + 'leave': { + text: _('leave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + } + } + }, + "battlefield": { /* Discovering an old battlefield */ + title: _('A Forgotten Battlefield'), + scenes: { + 'start': { + text: [ + _('a battle was fought here, long ago.'), + _('battered technology from both sides lays dormant on the blasted landscape.') + ], + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + }, + loot: { + 'rifle': { + min: 1, + max: 3, + chance: 0.5 + }, + 'bullets': { + min: 5, + max: 20, + chance: 0.8 + }, + 'laser rifle': { + min: 1, + max: 3, + chance: 0.3 + }, + 'energy cell': { + min: 5, + max: 10, + chance: 0.5 + }, + 'grenade': { + min: 1, + max: 5, + chance: 0.5 + }, + 'alien alloy': { + min: 1, + max: 1, + chance: 0.3 + } + }, + buttons: { + 'leave': { + text: _('leave'), + + nextScene: 'end' + } + } + } + } + }, + "borehole": { /* Admiring a huge borehole */ + title: _('A Huge Borehole'), + scenes: { + 'start': { + text: [ + _('a huge hole is cut deep into the earth, evidence of the past harvest.'), + _('they took what they came for, and left.'), + _('castoff from the mammoth drills can still be found by the edges of the precipice.') + ], + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + }, + loot: { + 'alien alloy': { + min: 1, + max: 3, + chance: 1 + } + }, + buttons: { + 'leave': { + text: _('leave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + } + } + }, + "ship": { /* Finding a way off this rock */ + title: _('A Crashed Ship'), + scenes: { + 'start': { + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + World.drawRoad(); + World.state.ship = true; + }, + text: [ + _('the familiar curves of a wanderer vessel rise up out of the dust and ash. '), + _("lucky that the natives can't work the mechanisms."), + _('with a little effort, it might fly again.') + ], + buttons: { + 'leavel': { + text: _('salvage'), + nextScene: 'end' + } + } + } + } + }, + "sulphurmine": { /* Clearing the Sulphur Mine */ + title: _('The Sulphur Mine'), + scenes: { + 'start': { + text: [ + _("the military is already set up at the mine's entrance."), + _('soldiers patrol the perimeter, rifles slung over their shoulders.') + ], + notification: _('a military perimeter is set up around the mine.'), + buttons: { + 'attack': { + text: _('attack'), + nextScene: {1: 'a1'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'a1': { + combat: true, + enemy: 'soldier', + ranged: true, + chara: 'D', + damage: 8, + hit: 0.8, + attackDelay: 2, + health: 50, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + } + }, + notification: _('a soldier, alerted, opens fire.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'a2' } + }, + 'run': { + text: _('run'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'a2': { + combat: true, + enemy: 'soldier', + ranged: true, + chara: 'D', + damage: 8, + hit: 0.8, + attackDelay: 2, + health: 50, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'bullets': { + min: 1, + max: 5, + chance: 0.5 + }, + 'rifle': { + min: 1, + max: 1, + chance: 0.2 + } + }, + notification: _('a second soldier joins the fight.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'a3' } + }, + 'run': { + text: _('run'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'a3': { + combat: true, + enemy: 'veteran', + chara: 'V', + damage: 10, + hit: 0.8, + attackDelay: 2, + health: 65, + loot: { + 'bayonet': { + min: 1, + max: 1, + chance: 0.5 + }, + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + } + }, + notification: _('a grizzled soldier attacks, waving a bayonet.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'cleared' } + } + } + }, + 'cleared': { + text: [ + _('the military presence has been cleared.'), + _('the mine is now safe for workers.') + ], + notification: _('the sulphur mine is clear of dangers'), + onLoad: function() { + World.drawRoad(); + World.state.sulphurmine = true; + World.markVisited(World.curPos[0], World.curPos[1]); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + } + } + }, + "coalmine": { /* Clearing the Coal Mine */ + title: _('The Coal Mine'), + scenes: { + 'start': { + text: [ + _('camp fires burn by the entrance to the mine.'), + _('men mill about, weapons at the ready.') + ], + notification: _('this old mine is not abandoned'), + buttons: { + 'attack': { + text: _('attack'), + nextScene: {1: 'a1'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'a1': { + combat: true, + enemy: 'man', + chara: 'M', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 10, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + } + }, + notification: _('a man joins the fight'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'a2' } + }, + 'run': { + text: _('run'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'a2': { + combat: true, + enemy: 'man', + chara: 'M', + damage: 3, + hit: 0.8, + attackDelay: 2, + health: 10, + loot: { + 'cured meat': { + min: 1, + max: 5, + chance: 0.8 + }, + 'cloth': { + min: 1, + max: 5, + chance: 0.8 + } + }, + notification: _('a man joins the fight'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'a3' } + }, + 'run': { + text: _('run'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: 'end' + } + } + }, + 'a3': { + combat: true, + enemy: 'chief', + chara: 'C', + damage: 5, + hit: 0.8, + attackDelay: 2, + health: 20, + loot: { + 'cured meat': { + min: 5, + max: 10, + chance: 1 + }, + 'cloth': { + min: 5, + max: 10, + chance: 0.8 + }, + 'iron': { + min: 1, + max: 5, + chance: 0.8 + } + }, + notification: _('only the chief remains.'), + buttons: { + 'continue': { + text: _('continue'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'cleared' } + } + } + }, + 'cleared': { + text: [ + _('the camp is still, save for the crackling of the fires.'), + _('the mine is now safe for workers.') + ], + notification: _('the coal mine is clear of dangers'), + onLoad: function() { + World.drawRoad(); + World.state.coalmine = true; + World.markVisited(World.curPos[0], World.curPos[1]); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + } + } + }, + "ironmine": { /* Clearing the Iron Mine */ + title: _('The Iron Mine'), + scenes: { + 'start': { + text: [ + _('an old iron mine sits here, tools abandoned and left to rust.'), + _('bleached bones are strewn about the entrance. many, deeply scored with jagged grooves.'), + _('feral howls echo out of the darkness.') + ], + notification: _('the path leads to an abandoned mine'), + buttons: { + 'enter': { + text: _('go inside'), + nextScene: { 1: 'enter' }, + cost: { 'torch': 1 } + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'enter': { + combat: true, + enemy: 'beastly matriarch', + chara: 'M', + damage: 4, + hit: 0.8, + attackDelay: 2, + health: 10, + loot: { + 'teeth': { + min: 5, + max: 10, + chance: 1 + }, + 'scales': { + min: 5, + max: 10, + chance: 0.8 + }, + 'cloth': { + min: 5, + max: 10, + chance: 0.5 + } + }, + notification: _('a large creature lunges, muscles rippling in the torchlight'), + buttons: { + 'leave': { + text: _('leave'), + cooldown: Events._LEAVE_COOLDOWN, + nextScene: { 1: 'cleared' } + } + } + }, + 'cleared': { + text: [ + _('the beast is dead.'), + _('the mine is now safe for workers.') + ], + notification: _('the iron mine is clear of dangers'), + onLoad: function() { + World.drawRoad(); + World.state.ironmine = true; + World.markVisited(World.curPos[0], World.curPos[1]); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + } + } + }, + + "cache": { /* Cache - contains some of supplies from previous game */ + title: _('A Destroyed Village'), + scenes: { + 'start': { + text: [ + _('a destroyed village lies in the dust.'), + _('charred bodies litter the ground.') + ], + /// TRANSLATORS : tang = strong metallic smell, wanderer afterburner = ship's engines + notification: _('the metallic tang of wanderer afterburner hangs in the air.'), + buttons: { + 'enter': { + text: _('enter'), + nextScene: {1: 'underground'} + }, + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + }, + 'underground': { + text: [ + _('a shack stands at the center of the village.'), + _('there are still supplies inside.') + ], + buttons: { + 'take': { + text: _('take'), + nextScene: {1: 'exit'} + } + } + }, + 'exit': { + text: [ + _('all the work of a previous generation is here.'), + _('ripe for the picking.') + ], + onLoad: function() { + World.markVisited(World.curPos[0], World.curPos[1]); + Prestige.collectStores(); + }, + buttons: { + 'leave': { + text: _('leave'), + nextScene: 'end' + } + } + } + } + } +}; diff --git a/script/header.js b/script/header.js index 8cf8cec92..b1f42c1c4 100644 --- a/script/header.js +++ b/script/header.js @@ -1,28 +1,28 @@ -/** - * Module that takes care of header buttons - */ -var Header = { - - init: function(options) { - this.options = $.extend( - this.options, - options - ); - }, - - options: {}, // Nothing for now - - canTravel: function() { - return $('div#header div.headerButton').length > 1; - }, - - addLocation: function(text, id, module) { - return $('
').attr('id', "location_" + id) - .addClass('headerButton') - .text(text).click(function() { - if(Header.canTravel()) { - Engine.travelTo(module); - } - }).appendTo($('div#header')); - } +/** + * Module that takes care of header buttons + */ +var Header = { + + init: function(options) { + this.options = $.extend( + this.options, + options + ); + }, + + options: {}, // Nothing for now + + canTravel: function() { + return $('div#header div.headerButton').length > 1; + }, + + addLocation: function(text, id, module) { + return $('
').attr('id', "location_" + id) + .addClass('headerButton') + .text(text).click(function() { + if(Header.canTravel()) { + Engine.travelTo(module); + } + }).appendTo($('div#header')); + } }; \ No newline at end of file diff --git a/script/outside.js b/script/outside.js index 0ee34252a..6f59805e8 100644 --- a/script/outside.js +++ b/script/outside.js @@ -4,6 +4,7 @@ var Outside = { name: _("Outside"), + _STORES_OFFSET: 0, _GATHER_DELAY: 60, _TRAPS_DELAY: 90, _POP_DELAY: [0.5, 3], @@ -439,7 +440,7 @@ var Outside = { this.setTitle(); if(!ignoreStores && Engine.activeModule === Outside && village.children().length > 1) { - $('#storesContainer').css({top: village.height() + 26 + 'px'}); + $('#storesContainer').css({top: village.height() + 26 + Outside._STORES_OFFSET + 'px'}); } }, @@ -610,6 +611,38 @@ var Outside = { Outside.updateVillage(); Outside.updateWorkersView(); Outside.updateVillageIncome(); + }; + }, + + scrollSidebar: function(direction, reset) { + + if( typeof reset != "undefined" ){ + $('#village').css('top', '0px'); + $('#storesContainer').css('top', '224px'); + Outside._STORES_OFFSET = 0; + return false; + } + + var momentum = 10; + + // If they hit up, we scroll everything down + if( direction == 'up' ) + momentum = momentum * -1; + + /* Let's stop scrolling if the top or bottom bound is in the viewport, based on direction */ + if( direction == 'down' && inView( direction, $('#village') ) ){ + + return false; + + }else if( direction == 'up' && inView( direction, $('#storesContainer') ) ){ + + return false; + } + + scrollByX( $('#village'), momentum ); + scrollByX( $('#storesContainer'), momentum ); + Outside._STORES_OFFSET += momentum; + } }; diff --git a/script/path.js b/script/path.js index bb73f093a..d9a8c4abe 100644 --- a/script/path.js +++ b/script/path.js @@ -1,7 +1,7 @@ var Path = { DEFAULT_BAG_SPACE: 10, - + _STORES_OFFSET: 0, // Everything not in this list weighs 1 Weight: { 'bone spear': 2, @@ -116,7 +116,7 @@ var Path = { } if(!ignoreStores && Engine.activeModule === Path) { - $('#storesContainer').css({top: perks.height() + 26 + 'px'}); + $('#storesContainer').css({top: perks.height() + 26 + Path._STORES_OFFSET + 'px'}); } } }, @@ -312,6 +312,36 @@ var Path = { handleStateUpdates: function(e){ if(e.category == 'character' && e.stateName.indexOf('character.perks') === 0 && Engine.activeModule == Path){ Path.updatePerks(); + }; + }, + + scrollSidebar: function(direction, reset){ + + if( typeof reset != "undefined" ){ + $('#perks').css('top', '0px'); + $('#storesContainer').css('top', '206px'); + Path._STORES_OFFSET = 0; + return; + } + + var momentum = 10; + + if( direction == 'up' ) + momentum = momentum * -1 + + if( direction == 'down' && inView( direction, $('#perks') ) ){ + + return false; + + }else if( direction == 'up' && inView( direction, $('#storesContainer') ) ){ + + return false; + } + + scrollByX( $('#perks'), momentum ); + scrollByX( $('#storesContainer'), momentum ); + Path._STORES_OFFSET += momentum; + } }; diff --git a/script/ship.js b/script/ship.js index 3c6c006e5..3edc570fe 100644 --- a/script/ship.js +++ b/script/ship.js @@ -1,174 +1,174 @@ -/** - * Module that registers the starship! - */ -var Ship = { - LIFTOFF_COOLDOWN: 120, - ALLOY_PER_HULL: 1, - ALLOY_PER_THRUSTER: 1, - BASE_HULL: 0, - BASE_THRUSTERS: 1, - - name: _("Ship"), - init: function(options) { - this.options = $.extend( - this.options, - options - ); - - if(!$SM.get('features.location.spaceShip')) { - $SM.set('features.location.spaceShip', true); - $SM.setM('game.spaceShip', { - hull: Ship.BASE_HULL, - thrusters: Ship.BASE_THRUSTERS - }); - } - - // Create the Ship tab - this.tab = Header.addLocation(_("An Old Starship"), "ship", Ship); - - // Create the Ship panel - this.panel = $('
').attr('id', "shipPanel") - .addClass('location') - .appendTo('div#locationSlider'); - - Engine.updateSlider(); - - // Draw the hull label - var hullRow = $('
').attr('id', 'hullRow').appendTo('div#shipPanel'); - $('
').addClass('row_key').text(_('hull:')).appendTo(hullRow); - $('
').addClass('row_val').text($SM.get('game.spaceShip.hull')).appendTo(hullRow); - $('
').addClass('clear').appendTo(hullRow); - - // Draw the thrusters label - var engineRow = $('
').attr('id', 'engineRow').appendTo('div#shipPanel'); - $('
').addClass('row_key').text(_('engine:')).appendTo(engineRow); - $('
').addClass('row_val').text($SM.get('game.spaceShip.thrusters')).appendTo(engineRow); - $('
').addClass('clear').appendTo(engineRow); - - // Draw the reinforce button - new Button.Button({ - id: 'reinforceButton', - text: _('reinforce hull'), - click: Ship.reinforceHull, - width: '100px', - cost: {'alien alloy': Ship.ALLOY_PER_HULL} - }).appendTo('div#shipPanel'); - - // Draw the engine button - new Button.Button({ - id: 'engineButton', - text: _('upgrade engine'), - click: Ship.upgradeEngine, - width: '100px', - cost: {'alien alloy': Ship.ALLOY_PER_THRUSTER} - }).appendTo('div#shipPanel'); - - // Draw the lift off button - var b = new Button.Button({ - id: 'liftoffButton', - text: _('lift off'), - click: Ship.checkLiftOff, - width: '100px', - cooldown: Ship.LIFTOFF_COOLDOWN - }).appendTo('div#shipPanel'); - - if($SM.get('game.spaceShip.hull') <= 0) { - Button.setDisabled(b, true); - } - - // Init Space - Space.init(); - - //subscribe to stateUpdates - $.Dispatch('stateUpdate').subscribe(Ship.handleStateUpdates); - }, - - options: {}, // Nothing for now - - onArrival: function(transition_diff) { - Ship.setTitle(); - if(!$SM.get('game.spaceShip.seenShip')) { - Notifications.notify(Ship, _('somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.')); - $SM.set('game.spaceShip.seenShip', true); - } - - Engine.moveStoresView(null, transition_diff); - }, - - setTitle: function() { - if(Engine.activeModule == this) { - document.title = "An Old Starship"; - } - }, - - reinforceHull: function() { - if($SM.get('stores["alien alloy"]', true) < Ship.ALLOY_PER_HULL) { - Notifications.notify(Ship, _("not enough alien alloy")); - return false; - } - $SM.add('stores["alien alloy"]', -Ship.ALLOY_PER_HULL); - $SM.add('game.spaceShip.hull', 1); - if($SM.get('game.spaceShip.hull') > 0) { - Button.setDisabled($('#liftoffButton', Ship.panel), false); - } - $('#hullRow .row_val', Ship.panel).text($SM.get('game.spaceShip.hull')); - }, - - upgradeEngine: function() { - if($SM.get('stores["alien alloy"]', true) < Ship.ALLOY_PER_THRUSTER) { - Notifications.notify(Ship, _("not enough alien alloy")); - return false; - } - $SM.add('stores["alien alloy"]', -Ship.ALLOY_PER_THRUSTER); - $SM.add('game.spaceShip.thrusters', 1); - $('#engineRow .row_val', Ship.panel).text($SM.get('game.spaceShip.thrusters')); - }, - - getMaxHull: function() { - return $SM.get('game.spaceShip.hull'); - }, - - checkLiftOff: function() { - if(!$SM.get('game.spaceShip.seenWarning')) { - Events.startEvent({ - title: _('Ready to Leave?'), - scenes: { - 'start': { - text: [ - _("time to get out of this place. won't be coming back.") - ], - buttons: { - 'fly': { - text: _('lift off'), - onChoose: function() { - $SM.set('game.spaceShip.seenWarning', true); - Ship.liftOff(); - }, - nextScene: 'end' - }, - 'wait': { - text: _('linger'), - onChoose: function() { - Button.clearCooldown($('#liftoffButton')); - }, - nextScene: 'end' - } - } - } - } - }); - } else { - Ship.liftOff(); - } - }, - - liftOff: function () { - $('#outerSlider').animate({top: '700px'}, 300); - Space.onArrival(); - Engine.activeModule = Space; - }, - - handleStateUpdates: function(e){ - - } +/** + * Module that registers the starship! + */ +var Ship = { + LIFTOFF_COOLDOWN: 120, + ALLOY_PER_HULL: 1, + ALLOY_PER_THRUSTER: 1, + BASE_HULL: 0, + BASE_THRUSTERS: 1, + + name: _("Ship"), + init: function(options) { + this.options = $.extend( + this.options, + options + ); + + if(!$SM.get('features.location.spaceShip')) { + $SM.set('features.location.spaceShip', true); + $SM.setM('game.spaceShip', { + hull: Ship.BASE_HULL, + thrusters: Ship.BASE_THRUSTERS + }); + } + + // Create the Ship tab + this.tab = Header.addLocation(_("An Old Starship"), "ship", Ship); + + // Create the Ship panel + this.panel = $('
').attr('id', "shipPanel") + .addClass('location') + .appendTo('div#locationSlider'); + + Engine.updateSlider(); + + // Draw the hull label + var hullRow = $('
').attr('id', 'hullRow').appendTo('div#shipPanel'); + $('
').addClass('row_key').text(_('hull:')).appendTo(hullRow); + $('
').addClass('row_val').text($SM.get('game.spaceShip.hull')).appendTo(hullRow); + $('
').addClass('clear').appendTo(hullRow); + + // Draw the thrusters label + var engineRow = $('
').attr('id', 'engineRow').appendTo('div#shipPanel'); + $('
').addClass('row_key').text(_('engine:')).appendTo(engineRow); + $('
').addClass('row_val').text($SM.get('game.spaceShip.thrusters')).appendTo(engineRow); + $('
').addClass('clear').appendTo(engineRow); + + // Draw the reinforce button + new Button.Button({ + id: 'reinforceButton', + text: _('reinforce hull'), + click: Ship.reinforceHull, + width: '100px', + cost: {'alien alloy': Ship.ALLOY_PER_HULL} + }).appendTo('div#shipPanel'); + + // Draw the engine button + new Button.Button({ + id: 'engineButton', + text: _('upgrade engine'), + click: Ship.upgradeEngine, + width: '100px', + cost: {'alien alloy': Ship.ALLOY_PER_THRUSTER} + }).appendTo('div#shipPanel'); + + // Draw the lift off button + var b = new Button.Button({ + id: 'liftoffButton', + text: _('lift off'), + click: Ship.checkLiftOff, + width: '100px', + cooldown: Ship.LIFTOFF_COOLDOWN + }).appendTo('div#shipPanel'); + + if($SM.get('game.spaceShip.hull') <= 0) { + Button.setDisabled(b, true); + } + + // Init Space + Space.init(); + + //subscribe to stateUpdates + $.Dispatch('stateUpdate').subscribe(Ship.handleStateUpdates); + }, + + options: {}, // Nothing for now + + onArrival: function(transition_diff) { + Ship.setTitle(); + if(!$SM.get('game.spaceShip.seenShip')) { + Notifications.notify(Ship, _('somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.')); + $SM.set('game.spaceShip.seenShip', true); + } + + Engine.moveStoresView(null, transition_diff); + }, + + setTitle: function() { + if(Engine.activeModule == this) { + document.title = "An Old Starship"; + } + }, + + reinforceHull: function() { + if($SM.get('stores["alien alloy"]', true) < Ship.ALLOY_PER_HULL) { + Notifications.notify(Ship, _("not enough alien alloy")); + return false; + } + $SM.add('stores["alien alloy"]', -Ship.ALLOY_PER_HULL); + $SM.add('game.spaceShip.hull', 1); + if($SM.get('game.spaceShip.hull') > 0) { + Button.setDisabled($('#liftoffButton', Ship.panel), false); + } + $('#hullRow .row_val', Ship.panel).text($SM.get('game.spaceShip.hull')); + }, + + upgradeEngine: function() { + if($SM.get('stores["alien alloy"]', true) < Ship.ALLOY_PER_THRUSTER) { + Notifications.notify(Ship, _("not enough alien alloy")); + return false; + } + $SM.add('stores["alien alloy"]', -Ship.ALLOY_PER_THRUSTER); + $SM.add('game.spaceShip.thrusters', 1); + $('#engineRow .row_val', Ship.panel).text($SM.get('game.spaceShip.thrusters')); + }, + + getMaxHull: function() { + return $SM.get('game.spaceShip.hull'); + }, + + checkLiftOff: function() { + if(!$SM.get('game.spaceShip.seenWarning')) { + Events.startEvent({ + title: _('Ready to Leave?'), + scenes: { + 'start': { + text: [ + _("time to get out of this place. won't be coming back.") + ], + buttons: { + 'fly': { + text: _('lift off'), + onChoose: function() { + $SM.set('game.spaceShip.seenWarning', true); + Ship.liftOff(); + }, + nextScene: 'end' + }, + 'wait': { + text: _('linger'), + onChoose: function() { + Button.clearCooldown($('#liftoffButton')); + }, + nextScene: 'end' + } + } + } + } + }); + } else { + Ship.liftOff(); + } + }, + + liftOff: function () { + $('#outerSlider').animate({top: '700px'}, 300); + Space.onArrival(); + Engine.activeModule = Space; + }, + + handleStateUpdates: function(e){ + + } }; \ No newline at end of file