567 Commits

Author SHA1 Message Date
pacharan ea38d220d1 Update and rename string.js to strings.js 2016-01-10 21:23:58 -05:00
Blake Grotewold 9a0a764cb5 Merge pull request #453 from pacharan/patch-2
Create main.css
2016-01-10 18:09:30 -05:00
pacharan 201961c12e Create main.css 2016-01-11 05:10:05 +07:00
Blake Grotewold 23796cb36e Merge branch 'pr/447' 2015-12-30 03:29:14 -06:00
Blake Grotewold 49f6cd5255 Merge branch 'master' into pr/447 2015-12-30 03:28:52 -06:00
Blake Grotewold 99c57da055 update adarkroom.pot 2015-12-30 03:28:41 -06:00
Blake Grotewold b28c8583c6 Merge pull request #450 from miratcan/master
Added missing Turkish translations, fixed wrong lines.
2015-12-30 03:25:58 -06:00
Blake Grotewold 0f73054faf Add Thai to README 2015-12-30 03:25:03 -06:00
Blake Grotewold 2ebae56dc5 Merge pull request #451 from pacharan/master
Thai translation.
2015-12-30 03:23:25 -06:00
pacharan e0b1d3800a add Thai translation 2015-12-26 23:38:01 +07:00
Blake Grotewold 9943c4c568 add confirm hyper
lets the user know what hyper mode is, and confirms turning it on.
Updates .pot to match current source.
2015-12-22 16:41:10 -06:00
pacharan 2c2436e63e add Thai translation 2015-12-21 13:46:11 +07:00
pacharan 92e7ef83af add Thai translation 2015-12-21 13:44:17 +07:00
Mirat Can Bayrak 7df8efb380 Added missing Turkish translations. 2015-12-20 14:14:58 +02:00
Sang-gi Lee 0db5bf3dec Update Korean translation 2015-12-11 16:40:24 +09:00
Michael Townsend c66d484627 Added import/export tracking 2015-12-04 10:57:16 -05:00
Michael Townsend 78bf47bfa1 Merge pull request #445 from satakieli/patch-3
Update strings.po / fixed Swedish translation
2015-11-10 10:17:33 -05:00
Continuities fba203cea1 conversion tweaks 2015-11-09 18:36:55 -05:00
Anna Robbins 3ef2b22e99 Update strings.po
Proofed and updated up until line 450
2015-10-28 16:06:10 +01:00
Blake Grotewold 3849f7871f Merge pull request #444 from tom76kimo/patch-1
Update link of Traditional Chinese
2015-10-23 01:05:34 -04:00
Tom Wu d5e317836a Update link of Traditional Chinese
The link should be `zh_tw`
2015-10-23 11:45:02 +08:00
Michael Townsend ecd391ff6a Merge pull request #442 from uasi/ja-fix-typo
Fix typo in Japanese translation
2015-10-10 10:51:31 -04:00
Tomoki Aonuma bad5e58cc9 Fix typo in Japanese translation 2015-10-10 23:44:47 +09:00
Michael Townsend da289ea1d7 Update main.css 2015-10-05 12:41:46 -04:00
Akai Alonkai 55b5c3e1e7 Removed background-color for config lists.
Background colors for unordered list in options were set to match body.
This created a problem during and after the space game when the body and
text were inverted, but the ul was not. See Issue #432.

Tried this via Chrome's dev tools while at the effected screen in dark
theme, and it seemed to work.
2015-09-22 10:47:50 -04:00
Blake Grotewold 0f243637a1 Merge pull request #435 from TwistedAkai/master
Made fur gambling return fur.
2015-09-20 16:36:40 -04:00
Akai Alonkai 95057c9704 Made fur gambling return fur.
Function was paying out in wood, not fur, contrary to notification text.
2015-09-20 16:32:54 -04:00
Michael Townsend b533f86d2a Merge pull request #433 from ngosang/spanish_translation
Update Spanish translation
2015-09-18 09:54:43 -04:00
ngosang b700c4b9f5 Update Spanish translation 2015-09-17 23:57:38 +02:00
Michael Townsend 6670a9ce09 Merge pull request #431 from ngosang/test2
Update all strings.js
2015-09-17 16:52:52 -04:00
ngosang b5db2b558d Update all strings.js 2015-09-03 10:03:31 +02:00
Michael Townsend 94fea5a3a8 Merge pull request #429 from bdorer/master
de: updated German language files
2015-08-18 22:13:32 -04:00
Michael Townsend 4626961286 Merge pull request #428 from JeanAraujo/master
Update PT-BR Translation
2015-08-18 22:13:11 -04:00
bdorer1 5aa5748ddd de: updated German language files 2015-08-19 00:08:22 +02:00
Jean Araujo 066a34b125 Update strings.js 2015-08-12 14:29:20 -03:00
Jean Araujo 75324a5240 Update strings.po 2015-08-12 14:28:18 -03:00
Continuities a0b343246c Code style 2015-08-02 11:40:27 -04:00
Michael Townsend 64f6797c3e Merge pull request #425 from Sebring/master
Showing total in stores tooltip - Issue #170
2015-08-02 11:36:57 -04:00
Sebring 1e37f45530 Display time delay on total row in tooltip 2015-07-29 20:08:09 +02:00
Sebring 100ff277ff Styles for total in tooltip 2015-07-29 16:59:16 +02:00
Sebring fea54cd97f Add total to tooltip 2015-07-29 16:57:26 +02:00
Blake Grotewold 95cf44c2f2 Fix removeBranch function definition 2015-07-25 20:23:35 -04:00
Blake Grotewold 3cbb049a7e Update Russian and French translation .js files 2015-07-24 22:18:32 -04:00
Ricky Chandra e504e79cd0 Add Indonesian translation 2015-07-24 22:10:34 -04:00
Yuki Usagi 075ac8934e Add Traditional Chinese
Consolidation of 97bb59e f177db4 35eff47 51197a3

Closes #421
2015-07-24 22:05:45 -04:00
Blake Grotewold 4159febc77 Merge pull request #422 from TeddyBear06/patch-1
Update strings.po
2015-07-24 21:38:11 -04:00
Blake Grotewold e23550c1a0 Merge pull request #419 from Anwinz/patch-2
Update strings.po
2015-07-24 21:36:49 -04:00
Ludovic 98682e1b24 Update strings.po
Fix some typos mistakes.
2015-07-22 17:34:57 +02:00
Anwinz 62ad16e4b8 Update strings.po 2015-07-07 21:49:53 +03:00
Andrea Rendine 65d7cfd784 Hyper-proof cooldown state
Kept the distinction between "argument" time and script time. I called the latter "time" instead of "milliseconds" because, well, it's just tenth of seconds.
Residual timeout is always stored in "nominal" time, not adjusted by hyper. I.e. if a button has a nominal timeout of 60 seconds and half cooldown had expired on reload, residual is stored as 300. In cooldown, Engine.setInterval makes the time flow with double speed
2015-06-29 12:49:57 -04:00
ekgr a923c1c0bd Added a Greek translation 2015-06-28 18:05:56 -04:00
Masaki KOBAYASHI ed837f3aec fix typo 2015-06-28 14:56:31 -04:00
Andrea Rendine 03fae08ff2 Compass relocation
This commit carries some changes.
* the compass is now a "special" item, not "good". It allows a different placing
* Store block is now divided into 2 parts. All the script is adapted to make room for it, including empty block check and insert animation for the new #store children divs
** Above: stackable storable items (resources), whose tooltip shows updated income/consumption rates
** Below: special storable items. As of now, it only contains the compass. Special block has a special style, with some distance from resources block if that one exists.
* Compass row has an empty tooltip which is filled in by World
2015-06-28 14:27:37 -04:00
Andrea Rendine 7208b845b1 Take all, take everything, leave if possible
Multiple fixes:
1. take all of a kind
2. take everything
3. if possible, leave
4. drop menu on hover
5. Same item not shown as drop option
2015-06-27 02:13:14 -04:00
Andrea Rendine da0d39b579 Check for delayed events
This triggers onload for all those events whose (possible) reward is registered with a time delay.
2015-06-27 01:43:09 -04:00
Andrea Rendine cb717b41d0 function for fire hut event and more
Effect of hut fire is associated with new Outside method .destroyHuts().
2015-06-27 00:44:26 -04:00
Blake Grotewold 09c070adfa Make tooltips in Lights off not so black 2015-06-27 00:42:23 -04:00
Andrea Rendine 358fe5fbcc Restore navigation property
Instead of a timed method to restore lx/rx navigation, a property will be set to true. In that case, the keyup method will not be executed, but it will restore navigation for further use.
2015-06-27 00:26:41 -04:00
wmassingham f94cfe2590 disable tab navigation during events (fixes #403) depends on @AndySky21's branch world-to-path 2015-06-27 00:26:40 -04:00
Andrea Rendine 08bd1c7caf Single letter representations for enemies
R wild animals (beast, birds, lizards, rats)
T mutated creatures (includes giant lizards)
E human enemies (old men, scavengers, thugs and squatters)
D armed human enemies (includes vigilantes, soldiers, snipers, commandos, veterans and chiefs)
2015-06-27 00:26:40 -04:00
SVS 1d2f95b561 Change the enemy labels 2015-06-27 00:26:40 -04:00
Andrea Rendine daf5de3973 Property for tab navigation
Added Engine.tabNavigation property. When true, it enables keyboard navigation to/from tabs. It is disabled on world and enabled some milliseconds after Path.onArrival(), so that when player returns s/he finds him/herself on Path tab instead of navigating.
2015-06-27 00:26:40 -04:00
Andrea Rendine 64a02c162c Modified command destination for save
Export dialog replaces selection dialog, rather than overlapping it.
Closing it exits the panel and returns to current game.
Aborting Import dialog returns the player to the selection screen, so that s/he can save before trying to load.
2015-06-26 23:49:30 -04:00
Andrea Rendine c4535c029a Alphabetical order for workers
I had missed this completely. Workers are listed in alphabetical order in English. Now they are ordered in other languages too.

Alphabetical order for outfit
2015-06-26 23:42:11 -04:00
Blake Grotewold 7babe5d102 Clean up Available Lanaguges
In my never ending fight against the readme. This is my next iteration
2015-06-26 23:30:46 -04:00
Andrea Rendine 92f7cf683e Unified legend
Legends on boxes and lists are currently added via CSS and as stylesheets cannot be localised, translated strings rely upon an additional inline CSS.
This commit inserts localised legends as "data-legend" attributes on proper elements, and then this attribute is shown by stylesheet rule content: attr(data-legend). No need of localisation script and more compact CSS rules.
2015-06-26 22:10:02 -04:00
Andrea Rendine 93649307f6 Non-overlapping up/down buttons
Fixed dimensions and margins for up/down arrows.
2015-06-26 21:54:41 -04:00
Andrea Rendine 8306f155f1 Notifications for outside events
As said in #363, there are almost no notifications for outside events.
I took a little liberty to suggest new sentences. Inspired by the game atmosphere and the double notification for Hut Fire, wrote lines for events and possible outcomes.
they're associated to buttons where there are no outcome scenes.
2015-06-26 21:31:20 -04:00
Blake Grotewold 4fed30380f Merge pull request #414 from ekgr/master
Changed size of languages menu (issue#413)
2015-06-21 13:44:14 -04:00
ekgr 4724aaf6e3 Changed size of languages menu
The Portuguese (brazil) option was too long and wrapping around to the next line, appearing right over the next language in the menu. Increased the width to accommodate in one line. Also increased the max height as the last language option wasn't visible. The menu can take one more language before needing to increase the height.
2015-06-21 17:25:47 +02:00
Blake Grotewold d5bbca90a4 Merge pull request #412 from JMRedford/patch-1
Change Plague events to take half of population.
2015-06-14 22:44:15 -04:00
John Redford ee591ca218 Update outside.js
Changed sickness event to kill up to half of the villagers instead of up to 20.
2015-06-14 00:47:08 -05:00
mac craig 612d247709 Create contributing.md
Creation of the contributing.md file to set rules and guidelines for future or current contributors.
Let me know if you want me to set out some basic contributing guidelines, or if the owner has anything in mind.

See the links below for information on contributing.md
https://github.com/blog/1184-contributing-guidelines
https://guides.github.com/activities/contributing-to-open-source/
2015-06-13 17:33:33 -04:00
Blake Grotewold 2d207e55c1 Update Brazilian Portuguese
Change from fall to drop.
2015-06-13 17:27:19 -04:00
Luan Haddad d4d4cec489 Add Brazilian Portuguese (pt_BR) 2015-06-10 19:50:42 -04:00
Blake Grotewold 5dbe98f0f1 Merge pull request #406 from derwilly/master
updated string.po
2015-06-08 15:38:58 -04:00
Ferdinand S. 8d38513798 updated string.po
fixed typo in line 875. "villeicht" -> "vielleicht"
2015-06-05 18:06:01 +02:00
Blake Grotewold 84577047a6 Merge pull request #391 from AndySky21/ship-title
Ship tab title
2015-05-29 10:12:08 -04:00
Blake Grotewold c611fcea8c Merge pull request #394 from youknowone/master
Update localization for ko
2015-05-27 14:35:39 -04:00
Andrea Rendine f219b3288f Single letter representations for enemies
R wild animals (beast, birds, lizards, rats)
T mutated creatures (includes giant lizards)
E human enemies (old men, scavengers, thugs and squatters)
D armed human enemies (includes vigilantes, soldiers, snipers, commandos, veterans and chiefs)
2015-05-27 14:28:12 -04:00
SVS 8d3b313e9c Change the enemy labels 2015-05-27 14:25:21 -04:00
Andrea Rendine 77bff9c289 Update IT Save translation 2015-05-27 13:06:48 -04:00
Jeong YunWon 4824b0a847 Update localization for ko 2015-05-23 00:52:57 +09:00
Andrea Rendine acca5806b5 Ship title
Browser "title" is not translated when Ship tab is active.
2015-05-18 23:15:18 +02:00
Andrea Rendine c158f35b82 Merge pull request #10 from doublespeakgames/master
Update 2015-05-18
2015-05-18 17:24:32 +02:00
Andrea Rendine de705e4a5e Load event before anything else
An event could produce different notifications or rewards according to different outcomes of the event itself (e.g. a negative event impacting on buildings and/or villagers, or a wanderer leaving items of some specific kind), but the notification is generated before the onLoad() call.
I'd say that this is the best action order:
1. event action
2. event notification
3. event reward (and possible additional notifications due to that)
2015-05-13 12:08:00 -04:00
Andrea Rendine ebf5e6934e Correct DOM positions for village, store, perks box
I noticed a minor glitch with the Village box position in the DOM. As it is appended to the Outside panel, it can end up after the Wood gather button or after the Traps check. It depends on whether the latter exists or not.
I changed it a little. Now it is "prepended" (thanks jQuery!), so it's always before any other content in the panel.
It would mind e.g. for CSS consistency, as you could decide to use a style for sibling buttons and it wouldn't work unless the box is placed before or after (not between) them.

For consistency with Outside box placement issue, stores are prepended to the Room panel, as first content in the DOM tree.

For consistency with Outside box placement issue, perks are prepended to the Path panel, as first content in the DOM tree.
2015-05-13 12:01:32 -04:00
Andrea Rendine 94936f118d Stores visibility outside room
A z-index CSS property on #stores now allows it to remain on top of the tabs layers, so that hovering always works.
2015-05-13 11:50:54 -04:00
Travis Weston 8c368d363a Add take all button 2015-05-13 11:35:25 -04:00
Andrea Rendine 8f8425deb5 Merge pull request #7 from doublespeakgames/master
Update 2015-05-11
2015-05-11 19:05:50 +02:00
Blake Grotewold 66054c2825 Merge pull request #373 from youknowone/l10n-ko
more localization + fix errors +  quality work for ko
2015-05-11 10:40:59 -04:00
Blake Grotewold 95a3b68e12 Add background color to language select menu
This helps readability when language box overflows stores box
2015-05-11 10:40:11 -04:00
Blake Grotewold 9f8fa6c121 Update RU string.js 2015-05-11 10:31:11 -04:00
Дмитрий Свечников 6a9647c364 Fix some RU tranlations 2015-05-11 10:21:19 -04:00
Andrea Rendine fb13f6e808 Notification before reward
Noticed when buying the compass.
I found it weird that *first* the compass points and *then* it appears in good condition.
Now event notification precedes event reward, and it should be corrected.
2015-05-11 10:16:43 -04:00
Andrea Rendine 288f738a71 Merge pull request #6 from doublespeakgames/master
Add missing Hyper Mode pieces
2015-05-11 15:12:38 +02:00
Blake Grotewold 7fd474d3c0 Add missing Hyper Mode pieces
Some code was missing from the Hyper Mode feature addition. This
completes the use of `Engine.setTimeout` and adds doubleTime check in
button cooldowns.

Closes #374
2015-05-10 18:14:13 -04:00
Jeong YunWon dd17e716a8 more localization + fix errors + quality work for ko 2015-05-09 18:01:22 +09:00
Andrea Rendine 7cda58f947 Merge pull request #5 from doublespeakgames/master
Update 2015-05-08
2015-05-08 18:50:10 +02:00
Blake Grotewold 9cb94cb9c0 Add new KO string.js 2015-05-08 08:28:23 -04:00
Blake Grotewold 65f3d449de Merge pull request #369 from youknowone/master
Fix a lot of errors in ko translation
2015-05-08 08:21:11 -04:00
Andrea Rendine aef4bfb4e4 Add hut fire title and update IT translations for fire title and leave
Added translation for Fire title to template
Added Italian translation for Fire title

Leave

Translation of "leave" sounded like the player were abandoning something on the ground, which is correct only sometimes.
Fixed
2015-05-08 08:15:12 -04:00
Jeong YunWon 23b26b8ca1 Fix a lot of errors in ko translation 2015-05-08 13:51:28 +09:00
Andrea Rendine aa2e24e559 Merge pull request #4 from doublespeakgames/master
Update 2015-05-07
2015-05-08 00:13:37 +02:00
Blake Grotewold 3f71fe1f8b Merge pull request #365 from wxfskylove/master
Updated Chinese translation
2015-05-07 08:26:45 -04:00
Skylove e315839d41 Updated translation
Add hut fire event translation.
2015-05-07 14:20:54 +08:00
Andrea Rendine ad8e32ee56 Shortening IT translations
Shortened translations for bolas and lodge, so the button has a single line.
2015-05-06 15:47:28 -04:00
Andrea Rendine 714dd65982 Merge pull request #3 from doublespeakgames/master
Update 2015-05-06
2015-05-06 20:45:56 +02:00
Blake Grotewold 3b261c5dbf Merge pull request #357 from apricote/master
Fix #335
2015-05-05 10:39:02 -04:00
Julian Tölle 5f58372579 Added whitespace for traps in german translation
Even though the .po file contains the correct whitespace in the german
translation for the messages ('the traps contain [...] ' and ' and '),
they were not present in the .js file.
2015-05-05 16:32:44 +02:00
Andrea Rendine d6b5ffc0ad Merge pull request #2 from doublespeakgames/master
Update 2015-05-04
2015-05-04 16:21:08 +02:00
Michael Townsend 33e1da6137 Merge pull request #343 from AndySky21/hut-fire
Hut fire Italian translation
2015-05-04 09:52:13 -04:00
Michael Townsend 4e5a5fd7d3 Merge pull request #350 from AndySky21/pot-doc
Commentary
2015-05-04 09:51:39 -04:00
Blake Grotewold fba2dfb680 Merge pull request #348 from AndySky21/Readme-lang-table
Languages table
2015-05-03 22:13:45 -04:00
nicholas_pellizer 8320156f42 Hyper mode and LightsOff is now stored in the State 2015-05-03 22:09:49 -04:00
Andrea Rendine 56aaf55b72 Merge pull request #1 from doublespeakgames/master
Update
2015-05-01 14:18:07 +02:00
Andrea Rendine 644b975a37 Bait fix
Bait doesn't need plural in english but in other languages the plural could be used (in mine, for example).
2015-05-01 00:24:19 +02:00
Andrea Rendine 97021aa62d Commentary
Added comments for:
 - troublesome context
 - verbs/nouns trouble (english is quite full of homographs, you know)
 - commands and buttons (they want imperative)
 - battle buttons (attack => weapon)
 - counters and strings with references
 - strings with relevant leading/trailing spaces
 - acronyms and short forms
 - troublesome genders (A Mysterious Wander issue)
2015-05-01 00:16:12 +02:00
Andrea Rendine d458b1cd2b Impersonal verbs, translation fix and bait
See po file
2015-04-30 22:44:29 +02:00
Andrea Rendine d3c51746c7 Bait fix
Plural like scales and teeth
2015-04-30 22:42:34 +02:00
Andrea Rendine 6a0c6f6763 Impersonal verbs
Now all notifications starting with "learned" or similar direct but impersonal forms have been fixed with impersonal Italian forms.
Even more translation corrections here and there.
Note 1: A Mysterious Wanderer has been translated with plural. It refers to both the male wanderer craving for wood, and the female wanderer looting your fur. In italian the gender must be specified, so the notification with either male or female form cannot be chosen. Plural avoids confusion, just suggesting that either event has happened.
Note 2: This translation contains the text related to hut fire event (still missing).
2015-04-30 22:16:01 +02:00
Michael Townsend f85b8fdf7e Merge pull request #349 from AndySky21/patch-1
Fixed variable name
2015-04-30 11:38:42 -04:00
Michael Townsend d2bd08dcb1 Merge pull request #345 from AndySky21/stores-az-sorting
Stores alphabetical sorting
2015-04-30 11:38:12 -04:00
Andrea Rendine f0e0548116 Var
Working ina hurry is bad.
2015-04-30 17:27:50 +02:00
Andrea Rendine 4efebe4f66 Var
Working in a hurry is bad.
2015-04-30 17:26:56 +02:00
Andrea Rendine 4efb22b890 Fixed variable name
Actually in this case "name" is used in a function and is not necessary for lookups, but I think that if future changes to both room.js and outside.js occur, authors will appreciate consistency in scripts (also fixes indentation in comments).
2015-04-30 17:11:24 +02:00
Andrea Rendine dca3faa2f9 Fixed variable name
"k" still refers to the English string, while "lk" carries the translated value.
2015-04-30 16:57:18 +02:00
Michael Townsend 5c37074c2d Merge pull request #346 from AndySky21/buildings-az-sorting
Buildings alphabetical sorting
2015-04-30 09:45:26 -04:00
Michael Townsend c725b58c1a Merge pull request #344 from AndySky21/hut-fire-pot
Added hut fire event original strings
2015-04-30 09:42:01 -04:00
Michael Townsend 42c81cd5db Merge pull request #342 from AndySky21/It-fix
Italian translation fix
2015-04-30 09:41:01 -04:00
Michael Townsend d30b4e2ff7 Merge pull request #347 from AndySky21/income-on-load
Correct jobs incomes on load
2015-04-30 09:39:22 -04:00
Andrea Rendine c2f8ac89fa Correct jobs incomes on load
Currently, when a game is loaded, job production/consumption rates in tooltips are shown based on the unit, rather than multiplied by the employed village number. Incomes are then corrected when the numbers change.
With the initial call of updateVillageIncome() function, the correct numbers are displayed when the game is opened and loaded.
2015-04-30 00:01:36 +02:00
Andrea Rendine 9c1ebecda7 Buildings alphabetical sorting
The bulk of this small change was to sort buildings by alphabetical order according to translated names, instead of english strings.
This meant removing the ID splitting as well as hyphen/space replacing, as the ID is not considered for the test.
Also changed:
1. line 366: as the original english string is no longer necessary in the iteration, "name" takes the value of translated string. "name" is then used for alphabetical comparison (as before) with the right value.
2. line 378: removed the test on curPrev variable. Items already listed have been placed in alphabetical order, so there is no need to check whether each item actually follows value of control variable.
2015-04-29 23:52:58 +02:00
Andrea Rendine 8042414be7 Stores alphabetical sorting
The bulk of this small change was to sort stores by alphabetical order according to translated names, instead of english strings.
This meant removing the ID splitting as well as hyphen/space replacing, as the ID is not considered for the test.
Also changed:
1. line 800: as the original english string is no longer necessary in the iteration, k takes the value of translated string. k is then used for alphabetical comparison (as before) with the right value.
2. line 816: removed the test on curPrev variable. Items already listed have been placed in alphabetical order, so there is no need to check whether each item actually follows value of control variable.
2015-04-29 23:43:43 +02:00
Andrea Rendine fc089c808c Added hut fire event original strings
Although there was a previous commit referring to it, in POT file the strings related to "hut fire event" were not present.
I added them at the end of the file, with reference to original positions in Outside.js.
2015-04-29 23:19:34 +02:00
Andrea Rendine e65a8e7c5a Hut fire event added for real
Hut fire event strings added for further development
2015-04-29 23:12:32 +02:00
Andrea Rendine 425ce30ceb Hut fire event added for real
A previous commit referred to "Hut fire event", but the strings were not available.
Now they have been inserted.
2015-04-29 23:06:34 +02:00
Andrea Rendine 4dd0af9f01 Typo fix 2015-04-29 23:03:16 +02:00
Andrea Rendine d4312385d4 Italian translation fix.
Original for documentation.
2015-04-29 23:01:39 +02:00
Andrea Rendine a1092170c7 Italian translation fix.
Sentences corrected for length and sense.
2015-04-29 22:59:12 +02:00
Andrea Rendine 31c4d3a816 Languages table
Changed table using markup in order to correct the divided heading cell.
2015-04-29 22:52:30 +02:00
Arnaud Panapadeatchy c3f7b620f5 Fix French translation 2015-04-25 12:01:23 -04:00
Arnaud Panapadeatchy 0c2dc6c905 Add more French translations 2015-04-24 09:40:35 -04:00
Michael Townsend 3cc2b708cb Merge pull request #328 from cjhooker/bigger-quantity-adjust-buttons
Make quantity-adjust buttons bigger
2015-04-18 19:40:26 -04:00
Chris Hooker 165f2d1dd0 Make quantity-adjust buttons bigger 2015-04-18 15:10:13 -04:00
Michael Townsend 909894cb50 Update engine.js 2015-04-16 10:17:59 -04:00
Michael Townsend 1abb3588e6 Update index.html 2015-04-16 10:17:20 -04:00
Michael Townsend 446811b638 Update README.md 2015-04-16 10:13:33 -04:00
Michael Townsend 16f2e1f118 Merge pull request #327 from codeskull/master
Typo (ru)
2015-03-23 10:03:35 -04:00
Cyril 614df477a0 Typo 2015-03-23 11:45:34 +03:00
Blake Grotewold dfe9f19565 Update so that linguist reads ADR as JS 2015-03-18 16:04:34 -04:00
Michael Townsend 9361913bea Merge pull request #241 from jwvg0425/patch-2
I have no way of verifying this text, so I'm just gonna trust you!
2015-03-10 10:48:30 -04:00
Nam Hyeon Uk ae0f146008 Fixing Text
Fixing some text
2015-03-10 14:02:33 +09:00
Michael Townsend c1182fdb47 Merge pull request #240 from jwvg0425/patch-1
mistranslation
2015-03-09 09:53:49 -04:00
Michael Townsend 0fa44cfc55 Merge pull request #239 from fabrice31/master
French: Fixing texts + Complete translations
2015-03-07 00:40:35 -05:00
Nam Hyeon Uk 7d8367d407 mistranslation
I think "{0} per {1}s" means "{0} per {1}seconds". maybe that's a mistranslation.
2015-03-07 13:25:30 +09:00
Fabrice Bournisien 67571851b1 French: Fixing texts + Complete translations 2015-03-04 22:37:33 +01:00
Blake Grotewold 0bd474d2fd Merge pull request #238 from hano/master
Typo
2015-03-02 13:46:54 -05:00
hano c9900d7b91 Typo 2015-03-02 14:10:53 +01:00
Sebastian Korotkiewicz 2e7ccccf40 new readme
Closes #167
2015-02-25 11:36:01 -05:00
Blake Grotewold f998c270da Merge anubisthejackle:issue115
Closes #115
Closes #224
2015-02-14 17:14:22 -05:00
Blake Grotewold 5fcd897b17 Merge pull request #230 from anubisthejackle/issue229
Fix negative gatherers
2015-02-12 12:52:09 -05:00
Travis Weston 7333d03dbb Use Outside.killVillagers to kill villagers 2015-02-12 12:45:27 -05:00
Travis Weston 6ee6470972 Merging updates 2015-02-11 18:55:27 -05:00
Travis Weston 340851a99d Updated against suggestions 2015-02-11 18:21:08 -05:00
Michael Townsend 7c978f4f15 Merge pull request #226 from Continuities/convensions
Add convention pieces. jshintrc and gitattributes
2015-02-10 10:59:53 -05:00
Blake Grotewold 06b281fd3c Remove explicit line endings 2015-02-10 10:57:10 -05:00
Blake Grotewold eee2bffaf0 Add convention pieces. jshintrc and gitattributes 2015-02-10 09:59:00 -05:00
Travis Weston f2b8ad6268 Merge remote-tracking branch 'upstream/master' into issue115
Conflicts:
	script/outside.js
	script/path.js
2015-02-10 07:11:10 -05:00
Blake Grotewold c87541b8b9 Merge pull request #222 from anubisthejackle/issue80 2015-02-09 19:37:10 -05:00
Travis Weston 6e044292ae Add in doubleTime capabilities
Add hyper / classic to menu
2015-02-09 19:31:24 -05:00
Blake Grotewold 5d921d9464 Merge pull request #204 from rgravina/188_fix_jshint_warnings 2015-02-09 19:25:08 -05:00
Robert Gravina 67b3c7fb7e Low-risk fixes suggested by JSHint. 2015-02-09 19:20:29 -05:00
Blake Grotewold afe1230691 Merge pull request #225 from anubisthejackle/master
Limit Fire event to only Outside module
2015-02-09 11:06:19 -05:00
Travis Weston 25b2fbfa5f Limit Fire event to only Outside module 2015-02-08 22:33:18 -05:00
Travis Weston 8010597e44 Add hut fire event.
Closes #35
2015-02-08 11:23:32 -05:00
Michael Townsend 0334219d9f Merge pull request #219 from voldedore/add_new_lang_vi
Translation: Vietnamese
2015-02-07 19:13:50 -05:00
Travis Weston 2d3daa572d Move movement functions to Engine. Create scrollable Path sidebar 2015-02-07 14:00:32 -05:00
vinh v 619ee8c2cb Vietnamese translation: css mod
larger button because of long text.

.button{width: 100px !important;}
-->
.button{width: 120px !important;}
2015-02-07 19:17:52 +01:00
Blake Grotewold fca371f8d8 Merge pull request #223 from yuanyelele/master
update adarkroom.pot and zh_cn translation
2015-02-07 13:12:29 -05:00
Travis Weston 3d00ed3c40 Add scrolling via keyboard 2015-02-07 11:19:37 -05:00
vinh v 9bc9f5d055 Vietnamese translation: Capitalization fixed 2015-02-07 17:05:24 +01:00
袁野 518b47b483 update zh_cn translation
Signed-off-by: 袁野 <yuanyelele@gmail.com>
2015-02-07 22:49:36 +08:00
袁野 ba1b914e1d update translation template adarkroom.pot
Signed-off-by: 袁野 <yuanyelele@gmail.com>
2015-02-07 20:24:56 +08:00
Travis Weston 29932a96f3 Merge pull request #1 from anubisthejackle/issue35
Remove ^M from file because to heck with them.
2015-02-06 16:04:51 -05:00
Travis Weston 5fcdf29601 Remove ^M from file because to heck with them. 2015-02-06 16:02:37 -05:00
vinh v e3da87ed56 Translation: Vietnamese (fix some words) 2015-02-06 00:21:17 +01:00
vinh v ed5a0ea080 Translation: Vietnamese 2015-02-05 23:47:03 +01:00
Blake Grotewold 7f59e166de change bokmål to just norsk, until we must specify 2015-02-03 14:30:54 -05:00
jangerhard 3b4383f9b3 Translation: Norsk 2015-02-03 14:30:07 -05:00
Michael Townsend a119d5e655 Merge pull request #216 from garykrige/master
Update scoring.js
2015-01-28 15:05:43 -05:00
Gary Krige 6f2a705479 Update scoring.js
Fix verbose code
2015-01-28 21:58:36 +02:00
Blake Grotewold 48b15c1c5d Merge pull request #212 from crafteverywhere/patch-1
Corrections to the previous Chinese translations.
2015-01-18 20:36:28 -05:00
crafteverywhere 2e6cc87357 Update strings.js 2015-01-18 17:18:38 +08:00
crafteverywhere 4adce0f2d9 Corrections to the previous Chinese translations. 2015-01-18 16:10:58 +08:00
Blake Grotewold fd2181a104 Merge pull request #203 from MtCedarNet/Japanese-translation
Japanese translation
2015-01-06 23:37:52 -05:00
Alex Liebscher 5d12670979 Prevent negative HP
Closes #201
2015-01-05 01:38:35 -05:00
Blake Grotewold 516afb6037 Merge branch 'pr/205' 2015-01-05 01:02:33 -05:00
mac craig 6e43c06ff2 Add English as an "Available Language"
Added English in the available languages chart, since technically English is a playable language.
2015-01-05 00:58:30 -05:00
MtCedarNet 6774cdbac4 Improved Japanese translations. 2015-01-04 23:48:04 +09:00
MtCedarNet 464cfab7ac Change language name 'Japan' to 'Japanese'. 2015-01-04 23:46:40 +09:00
Blake Grotewold 94fdcc7463 Add buy medicine button to plague event.
Because there is a serious need for medicine, the price
is raised with this button. I felt like it should be even
higher but this will do for now.

Closes #199
2015-01-03 09:40:16 -05:00
Blake Grotewold dbd2adf9f8 add Github to menu bar
People should know that this great game is something
they can contribute to.

Closes #198
2015-01-03 09:26:48 -05:00
Blake Grotewold 1b04fa2086 Remove big TODO in engine
This was actually completed in #50 and was never removed.

Closes #45
2015-01-03 09:12:56 -05:00
Blake Grotewold 2efa9f1667 Merge pull request #196 from rgravina/162_save_path_outfit
Include state of Path outfit in save game
2014-12-24 10:27:40 -06:00
Robert Gravina 72a83d48dd Save the state of the path outfit in the State object.
Load the state when initialising the path screen. When embarking, make sure to clear the state. On arrival, update the saved state.

This enables save/load of the path state in the save game if it occurs before leaving.
2014-12-25 00:06:37 +09:00
Blake Grotewold 4201652e8f transfer Japanese strings.js 2014-12-08 15:39:30 -05:00
Blake Grotewold 073ef28a08 Correct Portuguese ISO 629-1 code. 2014-12-08 15:35:04 -05:00
Blake Grotewold 4a2c2934b2 Correct Japanese ISO 639-1 code 2014-12-08 15:33:21 -05:00
Michael Townsend a65210a169 Merge branch 'erica-scott-James_BRANCH' 2014-12-07 17:14:10 -05:00
Michael Townsend d93d2fdff9 fixing merge conflicts 2014-12-07 17:12:46 -05:00
jat023 efe8120ed3 Update language menu system 2014-11-28 10:39:40 -08:00
jat023 ad79b3ad43 New Menu style (Table format) 2014-11-28 10:37:45 -08:00
jat023 9b40c995c2 Merge branch 'EricaBranch' into James_BRANCH
Conflicts:
	README.md
2014-11-28 10:36:11 -08:00
erica-scott 327a9a1a37 Actual Finished Language display 2014-11-28 10:35:35 -08:00
erica-scott d1d81b8dd0 Finished New Language Display Idea 2014-11-28 10:33:26 -08:00
erica-scott 3b66bb69f5 Testing Language Display2 2014-11-28 10:31:58 -08:00
erica-scott 9b88143608 Testing Language Display 2014-11-28 10:26:54 -08:00
erica-scott 0030b1360f More Edits 2014-11-28 10:22:22 -08:00
erica-scott fc545204e3 Edit Language Display 2014-11-28 10:19:57 -08:00
erica-scott 170719f5b3 Trying new way to display languages 2014-11-28 10:16:51 -08:00
jat023 fb61ba1586 Updated lang.js
Added italian and japanese to javascript pop up menu in game
2014-11-28 10:14:29 -08:00
jat023 506ff9dc98 finished japanese translation 2014-11-28 09:45:49 -08:00
jat023 be3b8bbb47 Re 2014-11-28 09:40:11 -08:00
jat023 3e174a6140 renamed pg.js to strings.js 2014-11-28 09:31:55 -08:00
jat023 4e6faa8923 quotations fix in lang.jk 2014-11-28 09:29:54 -08:00
jat023 25e00f8607 Deleted unneeded files
removed cs_simplified files
updated README.md and langs.js to include pg files
2014-11-28 09:21:28 -08:00
jat023 9b500b3c5b Conversion and Translation.txt updates
Converted portugese strings.po into .js file
2014-11-26 13:39:44 -08:00
Blake Grotewold 76098f2b59 Merge branch 'pr/193' 2014-11-22 23:45:44 -07:00
Fengyang Gao 6603199060 fix minor bugs in SM 2014-11-23 10:48:26 +08:00
erica-scott 67bbe15771 Portuguese Translation Complete 2014-11-21 14:28:23 -08:00
erica-scott 7961ad6ea3 Starting Portuguese Translation 2014-11-21 09:44:09 -08:00
Blake Grotewold e7bd841d39 Add underscore to language query string regex. 2014-11-21 12:04:01 -05:00
Blake Grotewold 1dafbae5eb Correct Korean ISO 639-1 code. 2014-11-21 12:01:25 -05:00
Blake Grotewold 66c7b3e76d Update Chinese (Simplified) ISO 639-1 code 2014-11-21 11:57:00 -05:00
erica-scott d678b1933c Translation Complete 2014-11-20 13:41:06 -08:00
Blake Grotewold 94d1388b1d Prestige shouldn't contain decimals
Corrects issue of Prestige containing decimals and Infinity

Closes #69
2014-11-19 23:28:13 -06:00
erica-scott c9d7b0c007 50% Done Translation 2014-11-19 13:53:11 -08:00
erica-scott 3ca45188e5 1/3 Translation Done 2014-11-18 17:12:32 -08:00
jat023 21852088ec Started translation for Simplified Chinese
The translation is pretty basic; you just need to get Poedit and open
up the film that I have already started. After that you just translate
the lines.
I may look into reviewing some of the documentation later.
2014-11-18 12:15:41 -08:00
Michael Townsend 8284026853 Merge pull request #189 from gaofy/master
show selection color when export/import
2014-11-16 21:41:49 -05:00
Fengyang Gao ba285032f5 show selection color in textarea
Currently, you have no idea whether the text in "Export / Import" is
selected since the background is transparent.
2014-11-16 15:16:07 +08:00
Andrea Rendine 68da61e8cf Improve Italian translations
Fixed some terms for better meaning and fitting in blocks
Added note about Run as Administrator for po2js
2014-11-13 12:37:43 -05:00
Blake Grotewold 33d3dbc6a3 Merge pull request #186 from anubisthejackle/git-ignore
Add .swp to gitignore
2014-11-13 10:12:44 -05:00
Travis Weston 8a036ca1e7 Add .swp to gitignore 2014-11-12 11:54:52 -05:00
Blake Grotewold 93ffadb189 flake8 and pep257 po2js.py 2014-11-11 08:52:09 -05:00
Blake Grotewold 01f15f41f1 Correct Italian capitalization errors.
ADR doesn’t use capitalization for its storytelling.
2014-11-11 08:46:05 -05:00
AndySky21 d1f18a399c Update strings.js
debug typo fix: space after _("the traps contain")
2014-11-11 08:27:23 -05:00
AndySky21 e33da9d9e6 Italiano: Add Translations
Closes #180
Closes #153
2014-11-10 18:46:15 -05:00
Michael Townsend 940a19c68b Merge pull request #179 from AndySky21/patch-3
Update README.md
2014-11-10 16:53:27 -05:00
AndySky21 295cad1a91 Update README.md
Added Italian
2014-11-10 22:52:26 +01:00
Michael Townsend fd89dbc200 Merge pull request #178 from AndySky21/patch-2
Update translation.txt
2014-11-10 16:51:16 -05:00
AndySky21 1749b08c15 Update translation.txt
integration to Windows howto + typo fix
2014-11-10 22:50:19 +01:00
Michael Townsend 64e193666d Merge pull request #177 from ThiloVoigt555/german_translation_update
German translation update
2014-11-10 13:28:49 -05:00
ThiloVoigt555 6c97b90d85 Updated German translation 2014-11-10 19:22:03 +01:00
strollhy ea2415650b Update language for Chinese
Fix/Correct Chinese translations for the game. Making them more
accurate.

Closes #173
2014-11-09 17:52:33 -05:00
Blake Grotewold 6b3c651036 Merge pull request #175 from AndySky21/patch-1
Update translation documentation
2014-11-09 08:44:53 -05:00
AndySky21 d15536614d Update translation.txt
correction: the folders' name are lang/{language_code}
2014-11-09 14:36:17 +01:00
ThiloVoigt555 ba5bb193aa Added some new translator comments about whitespaces 2014-11-06 16:07:59 +01:00
Michael Townsend 97b4024382 Merge pull request #172 from Continuities/language-select-fix
Fix cross-browser support for language select
2014-10-28 16:38:17 -04:00
Blake Grotewold dc7afcbd75 Fix cross-browser support for language select
This fixes cross-browser support for the language select box by
replacing it with a custom menu box.
2014-10-28 16:30:57 -04:00
ThiloVoigt555 b512153d73 Add TRANSLATORS comments
This will better help the translators as they complete the difficult task
of taking one language and finding commonality in another.

Closes #165
Closes #161
2014-10-28 10:15:09 -04:00
Olexandr Nesterenko b3e094694b Add 'not enough sulfer' and 'bayonet' to localization 2014-10-28 09:58:14 -04:00
Blake Grotewold 6de6b3f746 Merge pull request #169 from sungwoncho/master
Korean: Add translation
2014-10-27 14:34:05 -04:00
Sung Won Cho 08c07e1e3c Add Korean translation 2014-10-25 19:33:50 +11:00
Michael Townsend 7711b2a1cc Merge pull request #166 from honzi/master
Alphabetize language links
2014-10-17 21:10:12 -04:00
Jan Hořava 93962c71e4 Alphabetize language links 2014-10-17 17:17:51 -07:00
Blake Grotewold 94c91b564b Merge pull request #163 from ThiloVoigt555/code-cleanup-translation
Add strings.js file for german.
2014-10-09 08:25:15 -04:00
ThiloVoigt555 40b3ef3a8b Added the missing strings.js file for german. 2014-10-09 12:37:27 +02:00
ThiloVoigt55 fbf8707f81 German: Add Translation 2014-10-08 19:39:08 -04:00
Blake Grotewold b249db27fd Merge pull request #157 from Continuities/language-init-bug
Change temp and fire to take from value not text for i18n
2014-10-06 09:40:36 -04:00
Blake Grotewold 7e1ac332ac Change temp and fire to take from value not text for i18n
This change fixes the issue of the game using the text from the saved
fire and temperature states. Clean up of the game store should be done
before next release to just save fire and temperature values only in
`game.fire` and `game.temperature` respectively.
2014-10-03 09:57:17 -04:00
Blake Grotewold 3203f490fc Add Turkish to README
This adds a link to Turkish translation on README and fixes an issue
with lang.js where a merge conflict was squashed into a rebase.
2014-10-03 09:38:20 -04:00
Volkan Ongun 23a6376b9b Turkish: Add Translation
This adds the Turkish translations to the game.

Closes #145
2014-10-02 09:19:18 -04:00
Björn Bohman 89c2270cc8 Swedish: Add translation
This adds the Swedish translation to the game.

Closes #152
2014-10-02 09:06:59 -04:00
Björn Bohman 9070ae049b Translation Template: Add .pot file for better translation workflow
This completes the workflow for creating and editing translations.

Closes #154
2014-10-02 08:58:01 -04:00
Blake Grotewold bef697a6fd Merge pull request #151 from honzi/css-formatting
Improve CSS formatting consistency
2014-09-25 11:17:57 -04:00
Honza Horava bf7563755d Improve CSS formatting consistency 2014-09-24 12:09:58 -07:00
Blake Grotewold 6266f87c1d Merge pull request #150 from burunduk/master
Add -moz-selection for firefox
2014-09-24 10:30:37 -04:00
Olexandr Nesterenko 0126032a2c Add -moz-selection for firefox 2014-09-24 10:32:29 +03:00
Michael Townsend b6c8eb5e57 Merge pull request #148 from ferrybig/fixincorrectindention
Changed lines with 4 spaces to tab since not everyone uses a tab size of...
2014-09-22 14:59:21 -04:00
ferrybig f16e303bc4 Changed lines with 4 spaces to tab since not everyone uses a tab size of 4. 2014-09-22 20:51:09 +02:00
Blake Grotewold e4eb334e8a Merge pull request #147 from S-anasol/patch-1
Add missing curly to ship.js
2014-09-20 08:57:04 -05:00
Alex 442d6254dc missing curly 2014-09-20 16:32:40 +04:00
Michael Townsend 22c91819ab Merge pull request #146 from modInfo/translation
Polish translation
2014-09-10 10:10:52 -04:00
Sebastian Korotkiewicz bdfc2cb09c Polish translation 2014-09-06 13:48:15 +02:00
Michael Townsend 84bf0e285d Merge pull request #144 from burunduk/master
Fix translation
2014-09-02 09:34:53 -04:00
Olexandr Nesterenko 45a6a871df Add new strings 2014-09-02 09:11:52 +03:00
Olexandr Nesterenko 50ba59a5c6 Add «not enough meat» and fix my «compass» commit. 2014-09-02 09:01:00 +03:00
Olexandr Nesterenko 8fddd1717c Remove unused localization string 2014-09-01 17:57:02 +03:00
Olexandr Nesterenko e58089b95c Add some strings 2014-09-01 07:35:18 +03:00
Blake Grotewold 98ae663e9b Add Russian and Ukrainian to readme
This adds links to the translations and cleans up the readme some more.
2014-08-30 21:39:16 -04:00
Michael Townsend 70515d9975 Merge pull request #141 from burunduk/master
Add Ukrainian translation.
2014-08-30 17:35:58 -04:00
Michael Townsend 151ccca8e2 Merge pull request #142 from burunduk/new-string
Add new strings to localization
2014-08-30 17:35:23 -04:00
Michael Townsend 01b5661b0a Merge pull request #143 from socram8888/master
Fix some strings in the Spanish localization
2014-08-30 17:23:04 -04:00
Marcos Vives Del Sol 54d835b788 Fix typo in ES 2014-08-30 23:16:47 +02:00
Marcos Vives Del Sol d7a92707c7 Replace "constructora" with "manitas" in ES localization 2014-08-30 16:26:23 +02:00
Marcos Vives Del Sol ff7d59c88c Replace "trampa" with "trampero" for "trapper" in the Spanish localization 2014-08-30 16:14:51 +02:00
Marcos Vives Del Sol 236f74707f Replace "sulfuro" with the more common word "azufre" in the Spanish localization 2014-08-30 16:13:19 +02:00
Marcos Vives Del Sol c3c095717f Replace "compás" with "brújula" in the Spanish localization 2014-08-30 16:12:08 +02:00
Olexandr Nesterenko 2f66d79856 Fix «the compass points ...» localization 2014-08-29 09:24:19 +03:00
Olexandr Nesterenko 9d25f0f736 Fix 'energy cell'. 2014-08-28 18:18:52 +03:00
Olexandr Nesterenko 0928274a77 Fix some strings. 2014-08-28 17:59:00 +03:00
Olexandr Nesterenko 2db4e209d5 Add 'sulphur' to localization.js 2014-08-28 17:42:21 +03:00
Olexandr Nesterenko 39e00a804f Fix some strings 2014-08-26 17:06:08 +03:00
Olexandr Nesterenko 465c636b5d Add new strings to localization 2014-08-26 16:57:25 +03:00
Olexandr Nesterenko 2b558a5c5e Add some strings. 2014-08-26 13:40:05 +03:00
Olexandr Nesterenko d059dc5a36 Update string.po 2014-08-25 22:30:54 +03:00
Olexandr Nesterenko 06e696fe59 Add some strings 2014-08-25 18:03:26 +03:00
Olexandr Nesterenko c78a4d9915 Remove and exclude *.mo files. 2014-08-25 11:26:27 +03:00
Olexandr Nesterenko d485ef84f8 Init ukrainian translation 2014-08-25 11:21:42 +03:00
Michael Townsend a2753511d4 Merge pull request #138 from calebjessie/master
Lighten up disabled button color to be more obvious.
2014-08-21 16:20:36 -04:00
Caleb Jessie fe60eb3d05 Lighten up disabled button color to be more obvious. 2014-08-21 16:12:56 -04:00
Blake Grotewold b57bbfa83d Merge pull request #132 from danapczynski/fix_inventory_bug
Fixes bug where player could take unavailable items onto dusty path
2014-08-18 01:22:07 -04:00
Blake Grotewold 956d0fe62f Merge pull request #134 from SnoUweR/translation
Add Russian translation
2014-08-18 01:19:04 -04:00
Michael Townsend 3852fbebb6 Prevent user from modifying the displayed export code 2014-08-13 19:25:42 -04:00
Michael Townsend b18134f331 Properly pass non-arrow keydown events 2014-08-13 14:16:19 -04:00
SnoUweR 889f855c8a first version of russian localization 2014-08-06 03:50:59 +08:00
Dan Apczynski 41592e79c7 Fixed bug where player could take unavailable items onto dusty path 2014-08-03 01:49:49 -07:00
Michael Townsend bc368511c6 Merge pull request #128 from Continuities/readme-update
Cleaning up the README
2014-07-29 18:50:28 -04:00
Blake Grotewold 23d177517d Cleaning up the README
Since the addition of the l11n features, I think having other translations repos displayed is unnecessary and just clutters a short, clean readme.
2014-07-29 18:48:40 -04:00
Michael Townsend 79fff84f67 Merge branch 'title-blink' 2014-07-29 18:24:20 -04:00
Michael Townsend 20539fdd18 Merge branch 'master' into title-blink 2014-07-29 18:20:10 -04:00
skj3gg e1f3d31dea Add variable for blink interval and remove unnecessary type checking
Cleans up global variable that was introduced in favor of a variable in
Events. Removes type checking from conditionals and instead sets
BLINK_INTERVAL variable to false when stopped.
2014-07-28 13:42:11 -04:00
Michael Townsend 5ceac11e53 merge leave cooldowns 2014-07-26 11:42:50 -04:00
Michael Townsend cc3cdb72fe Merge branch 'leaving-event-cooldown' 2014-07-26 11:40:01 -04:00
Michael Townsend 5bc0578862 Merge branch 'master' into leaving-event-cooldown 2014-07-26 11:31:30 -04:00
Michael Townsend 4118c84e68 Merge pull request #127 from TonyLambregts/master
stop creating income without enough resources
2014-07-26 11:08:47 -04:00
Tony Lambregts 08277b33ae Let thieves Steal. 2014-07-24 21:38:02 -06:00
skj3gg 79e765eb08 Blink only happens on specified events
Now event objects must have a blink flag if they want to use the title
blink. For starters, this is only global, outside, and room events.
2014-07-24 12:00:51 -04:00
Tony Lambregts 0087da9b5e stop creating income without enough resources
Fix issue where there worker created income without enough resources
available.
2014-07-23 19:00:36 -06:00
Blake Grotewold d6a6a7a000 Add title blinking on events
When there is an event, blink the title so that a user can know when an
event happens, even if they aren't on that tab. From discussion in #121
2014-07-23 02:43:06 -04:00
Blake Grotewold 8ceb9488aa Add cooldown when leaving events
Adding this cooldown prevents users from accidently clicking leave or
continue before they have a chance to eat or collect loot.  This was
originally brought up in and resolves #8. May be of interest to #122 as
well
2014-07-23 02:02:05 -04:00
Blake Grotewold f3d8fe71b4 Update langs.js 2014-07-23 00:15:09 -04:00
Blake Grotewold 22a110de26 Merge pull request #123 from PaolaFalcon/SpanishTranslation
Spanish translation, latin american version
2014-07-23 00:14:14 -04:00
Paola Falcon cac2c8eda6 Revert "Added entry to langs.js"
This reverts commit f8883d49f1.
2014-07-22 10:15:40 -05:00
Paola Falcon 12d79bdb1e Revert "Commented japanese entry"
This reverts commit b0a226f842.
2014-07-22 10:15:29 -05:00
Paola Falcon b0a226f842 Commented japanese entry 2014-07-21 09:32:30 -05:00
Paola Falcon f8883d49f1 Added entry to langs.js 2014-07-21 09:25:40 -05:00
Paola Falcon 10bd9fc980 Spanish translation, latin american version 2014-07-18 17:09:22 -05:00
Michael Townsend ca0ccb4ef8 Fixed broken import event 2014-07-18 15:58:58 -04:00
Michael Townsend 2ba2812a8b Merge pull request #120 from anubisthejackle/make-nomad-buy-buttons-reactivate
Fixing issue where buttons would not update when Wandering Nomad was act...
2014-07-17 22:49:23 -04:00
Travis Weston 82edff18b4 Fixing issue where buttons would not update when Wandering Nomad was active as referenced in Issue #108 2014-07-17 21:53:54 -04:00
Blake Grotewold 0f9ceda729 Merge pull request #102 from anubisthejackle/whitespace-fixes
Covert whitespace to tabs as per coding standard
2014-07-17 19:25:45 -04:00
Michael Townsend ef5c226fe2 Merge pull request #119 from anubisthejackle/gh-pages
Creates Github Pages
2014-07-17 18:21:04 -04:00
Michael Townsend 35b7926ed0 Merge pull request #113 from Continuities/fire-state
Add fire and temperature to State.game
2014-07-17 17:35:32 -04:00
Travis Weston a25b5b7acd Changed GH Pages link in readme 2014-07-17 16:47:18 -04:00
Travis Weston 64a37d8593 Added github pages link in README.md 2014-07-17 16:23:37 -04:00
Travis Weston 33e9772a1a Fixing whitespace conformity on engine.js 2014-07-16 23:45:48 -04:00
Travis Weston d164d1d466 Merge branch 'master' into whitespace-fixes 2014-07-16 23:32:13 -04:00
Blake Grotewold 1bb62e3a56 Merge pull request #117 from anubisthejackle/fix-path-stores-animation
Fixed issue where path stores animation would not run.
2014-07-16 22:02:29 -04:00
Travis Weston da53de1ed2 Fixed issue where path stores animation would not run. 2014-07-16 21:53:11 -04:00
Michael c5a7113161 Disabling dropbox support until ADR is hosted on HTTPS (if ever). 2014-07-16 19:09:04 -04:00
Michael 1ec7ae22f9 Removing JP translation from the list until it is complete. 2014-07-16 19:02:49 -04:00
Michael 4fd756d83d Merge branch 'master' of https://github.com/Continuities/adarkroom.git 2014-07-16 18:59:39 -04:00
Michael 0f78bae1cc Merge pull request 104 - Dropbox connector. 2014-07-16 18:57:50 -04:00
Blake Grotewold 185e4c3c86 Fix the room is fire.
Typo of the game.temerature.text instead of game.fire.text
2014-07-16 18:57:34 -04:00
Michael Townsend bf0b8979ac Merge pull request #112 from anubisthejackle/make-menu-stick
Fixed issue where menu would float away from bottom of the page if moved...
2014-07-16 18:37:43 -04:00
Blake Grotewold eb5b008225 Add fire and temperature to State.game
Adding fire and temperature to game state will allow persistence of the
fire and temp on reloads.
2014-07-15 23:52:33 -04:00
Travis Weston 00e57a4bfa Fixed issue where menu would float away from bottom of the page if moved and scrolled. (References Issue #109) 2014-07-15 23:23:33 -04:00
slicer2k 66ba9d9a65 load js files in right order. 2014-07-15 07:50:30 +02:00
slicer2k f56e9678b0 uncommented GA 2014-07-14 23:08:28 +02:00
slicer2k faf5ec9353 JSLinted 2014-07-14 23:07:17 +02:00
Travis Weston 5c6e36f5fa Fixing unclosed curly bracket in engine.js 2014-07-14 10:47:26 -04:00
Jens Neuber aca23d6043 Connection to the dropbox datastore api
-> this is the first attempt, improvements welcome :)
2014-07-13 19:45:53 +02:00
Travis Weston d351e4c815 Merge remote-tracking branch 'upstream/master'
Conflicts:
	script/engine.js
	script/localization.js
2014-07-13 12:52:29 -04:00
Travis Weston 42ed1cea1f Fixing whitespace conformity in base64.js 2014-07-13 12:26:36 -04:00
Travis Weston 216c51b44b Fixing whitespace conformity in setpieces.js 2014-07-13 12:22:16 -04:00
Travis Weston 2d0fccaf1c Fixed whitespace conformity in room.js 2014-07-13 11:52:19 -04:00
Travis Weston 991bf7e764 Fixing whitespace conformity in outside.js 2014-07-13 11:43:19 -04:00
Travis Weston 6e90a79c5f Fixing whitespace conformity in global.js 2014-07-13 11:34:35 -04:00
Travis Weston c91bf1d20a Fixing whitespace conformity in encounters.js 2014-07-13 11:32:07 -04:00
Travis Weston 4bb126c205 Fixing minor whitespace conformity in state_manager.js, fixed whitespace conformity in world.js 2014-07-13 11:26:21 -04:00
Travis Weston 674d44f6a8 Fixing whitespace conformity in space.js 2014-07-13 11:24:44 -04:00
Travis Weston 249b8742ff Fixed whitespace conformity in room.js 2014-07-13 11:21:34 -04:00
Travis Weston b402008769 Fixed whitespace conformity in path.js 2014-07-13 11:20:17 -04:00
Travis Weston 53c9dc715b Fixed whitespace conformity in outside.js 2014-07-13 11:18:33 -04:00
Travis Weston 6e3b3a8b10 Fixed whitespace conformity in localization.js 2014-07-13 00:56:35 -04:00
Travis Weston 4b079a22f1 Fixed whitespace conformity in events.js 2014-07-13 00:49:38 -04:00
Travis Weston 8cf3ab3dc9 Fixing whitespace conformity in Engine.js 2014-07-12 23:40:15 -04:00
Michael Townsend 4f82e33f7c Merge pull request #101 from anubisthejackle/fix-memory-usage
Fixed a memory usage issue when using system over long periods or with l...
2014-07-12 22:47:37 -04:00
Travis Weston b7a2c29aa0 Fixed a memory usage issue when using system over long periods or with large numbers of notifications. Now, notifications that fall outside the notification gradient are automatically removed 2014-07-12 20:09:36 -04:00
Michael Townsend 54dd2955ea Merge pull request #100 from TrevorBramble/bugfix-langs-declaration
add missing comma to langs definition
2014-07-11 20:37:50 -04:00
Trevor Bramble 15751ec8fb replace single space indents with tabs (style conformance) 2014-07-11 17:34:24 -07:00
Trevor Bramble e444378fd5 add missing comma to langs definition 2014-07-11 17:32:19 -07:00
Michael Townsend 5f4df5bbeb Merge pull request #98 from Nutzchannel/master
Possible Japanese support?
2014-06-28 16:23:26 -04:00
Nutzchannel c660e9cdd5 2169 2014-06-26 15:42:25 -04:00
Nutzchannel bc4688652b got to line 2129 2014-06-25 20:48:12 -04:00
Nutzchannel 28b5118be7 got to line 1880 on new file 2014-06-25 18:49:28 -04:00
Nutzchannel 6c415f7fd4 Button size in main.css 2014-06-25 14:52:31 -04:00
Nutzchannel 39945e5f4c Added Japanese folder 2014-06-25 14:51:10 -04:00
Nutzchannel 45cd119f9c Start for a Japanese translation
More language support
2014-06-25 14:45:33 -04:00
Michael Townsend 96f2b89704 Merge pull request #97 from grotr/master
Make keydown return true unless arrow key
2014-06-19 09:47:55 -04:00
Blake Grotewold b26fafe599 Make keydown return true unless arrow key 2014-06-19 09:33:35 -04:00
Michael Townsend 272495281c Merge pull request #96 from burunduk/master
Fix string
2014-06-19 09:17:29 -04:00
Olexandr Nesterenko 7fb0ae8f02 Fix string 2014-06-19 10:18:56 +03:00
Michael Townsend a9dcbc338b Merge pull request #94 from grotr/master
Fix French "not enough cloth" translation
2014-06-15 16:12:05 -04:00
Blake Grotewold 5d2bc3ebac Fix French "not enough cloth" translation 2014-06-14 22:55:31 -04:00
Michael Townsend 230017ba58 Merge pull request #89 from grotr/master
Add Engine.autoSelect and add to Engine.export64
2014-06-06 12:05:09 -04:00
Blake Grotewold 17f902e65c Add Engine.autoSelect and add to Engine.export64 2014-06-06 11:59:46 -04:00
Michael Townsend 4d0b838fdb Merge pull request #85 from lilj/master
Chinese Translation po file is coming
2014-06-02 10:05:27 -04:00
lilj e3b2763911 2014-05-31 12:15:53 +08:00
lilj 5ad15330d5 2014-05-31 12:04:45 +08:00
lilj f5be58a306 Add Simple Chinese Translation 2014-05-31 11:56:09 +08:00
lilj 523fb6a90e Update engine.js 2014-05-31 10:22:56 +08:00
Michael Townsend ff9694ebf8 Merge pull request #84 from lilj/master
hope more translation will coming soon!
2014-05-30 10:24:03 -04:00
lilj 87b1fd2d5c Update engine.js 2014-05-30 12:19:24 +08:00
lilj b4fa432e04 Update langs.js 2014-05-30 12:17:42 +08:00
lilj 17ae094fef Update README.md 2014-05-29 21:26:48 +08:00
lilj 3a0176217f Update engine.js
auto load langs from lang config file.
2014-05-29 18:03:13 +08:00
lilj 962ca4ccd6 Update engine.js
Auto load lang menu from config file
2014-05-29 17:53:48 +08:00
lilj 99d949906a Update index.html
Load langs config.
2014-05-29 17:43:14 +08:00
lilj 88fe373ea6 Create langs.js
Langs config
2014-05-29 17:41:18 +08:00
lilj 1a033dac57 Update localization.js
Add some missing localization items.
2014-05-29 17:36:33 +08:00
Michael ec9d83f6bc Removed a capital letter in the FR translation 2014-05-19 13:42:30 -04:00
Michael b7d539abbb Slight styling issues on language menu option 2014-05-19 13:27:21 -04:00
Michael 81d8129f0f Styling on the language dropdown 2014-05-19 13:15:46 -04:00
Michael c6ccad177a Fixed localized CSS. 2014-05-19 12:48:37 -04:00
Michael 88f9d3fc3b Merge branch 'vanadar-master' 2014-05-19 12:44:54 -04:00
Michael 957dbdf0e5 merged 2014-05-19 12:44:30 -04:00
Michael 4043658907 Merge branch 'master' of https://github.com/Continuities/adarkroom.git 2014-05-19 11:48:47 -04:00
Michael 2ca0a7a948 Expand import dialog to a textarea 2014-05-19 11:48:40 -04:00
Vanadar 09b5f3aba1 add switch language button 2014-05-19 11:49:46 +02:00
Michael Townsend 72a0380456 Update README.md 2014-05-15 09:35:08 -04:00
Michael a925349a13 Fixed bug #79 2014-04-23 22:24:27 -04:00
Michael Townsend 4963fda7e8 Merge pull request #77 from grotr/master
Add disableSelection to stop highlighting
2014-04-02 18:55:35 -04:00
Blake Grotewold e4b56f64c1 Create enableSelection function, Make selection available during export 2014-04-02 00:22:30 -05:00
Blake Grotewold a0aa2eaab9 Add disableSelection to stop highlighting 2014-04-01 19:25:59 -05:00
vanadar 1f52094384 vetements -> chiffons 2014-02-28 20:44:55 +01:00
vanadar 1cb7e85383 amélioration des traductions 2014-02-09 13:13:05 +01:00
vanadar cfaeb51603 corrections sur des traductions 2014-02-08 16:02:08 +01:00
vanadar cc2f374143 fin des trads, un peu de ménage & de doc 2014-02-08 14:13:59 +01:00
Vanadar 5dd42bcc4d correction css 2014-02-07 18:30:29 +01:00
Vanadar c7ad5384f4 suite des trads 2014-02-07 18:26:03 +01:00
Vanadar 71ee298e50 suite des traductions 2014-02-06 18:36:14 +01:00
Vanadar 7ac28eeb1a suites des trads 2014-02-05 17:06:30 +01:00
vanadar 989c6b4cfc Lib & fichiers de trad 2014-02-04 22:28:29 +01:00
vanadar f986e0323e Start trad fr 2014-02-04 22:27:00 +01:00
Michael Townsend 8ad2f82fd0 Merge pull request #73 from WillHuxtable/master
Removed annoying blue selection color. Now it is transparent
2014-01-03 06:45:21 -08:00
Will Huxtable 7f0bd94dab Removed annoying blue highlight color. Now it is transparent 2014-01-03 10:28:11 +00:00
Michael b583721581 Actually fixed the bug I thought I fixed ages ago. Turns out saving at
outposts is a stupid idea!
2013-11-26 11:36:51 -05:00
Michael Townsend b4eab29125 Merge pull request #68 from coolbeans7/master
Update setpieces.js
2013-11-17 09:45:17 -08:00
coolbeans7 e1df9e9e75 Update setpieces.js
Corrected typo - much => must
2013-11-15 15:03:20 -08:00
Michael Townsend 333b0b75e0 Merge pull request #67 from grotr/master
Updates README to not use rawgithub
2013-11-15 10:26:36 -08:00
Blake Grotewold 9daca0b6ee Updates README to not use rawgithub 2013-11-15 11:32:16 -06:00
Michael 1a5157dac4 Incremented version 2013-11-14 21:35:54 -05:00
Michael 36c75529ff Merge branch 'master' of https://github.com/Continuities/adarkroom.git 2013-11-14 21:33:40 -05:00
Michael 16824386eb Use a textarea instead of a prompt for export to prevent truncation in
Chrome.
2013-11-14 21:33:14 -05:00
Michael Townsend dcb4f67f8d Merge pull request #66 from grotr/master
Add reverse color scheme.
2013-11-14 11:46:39 -08:00
Blake Grotewold c78689f2c7 Add reverse color scheme. 2013-11-14 12:29:27 -06:00
Michael! c27430f29e A few small tweaks, and added link to the iOS app. 2013-11-13 22:18:27 -05:00
Michael 52974eaa96 Added link to the ADR iOS app on the Mobile Warning splash page. 2013-11-09 21:43:08 -05:00
Michael Townsend 9ae4ea53d9 Merge pull request #63 from Vermilingua/fallbackjquery
Cleaned up the scars from the merge, and added the working fallback
2013-11-03 09:46:51 -08:00
Vermilingua d78fd6acc0 added fallback, without merge scars 2013-11-03 08:45:42 +11:00
Vermilingua 918e4fa782 tidied 2013-11-03 08:42:33 +11:00
Michael ebee3be4d1 Sometimes I'm dumb. 2013-11-01 23:03:50 -04:00
Michael 994f01c78c Some refactoring and some bug fixes. 2013-11-01 23:00:51 -04:00
Michael Townsend d8f6e73c6b Merge pull request #59 from Vermilingua/scoring
added scoring system
2013-11-01 14:17:45 -07:00
Vermilingua e60abd0153 end screen looks nicer 2013-11-01 23:12:06 +11:00
Vermilingua d7fc109554 made store collection routine in SM, and updated everything to suit 2013-11-01 17:01:21 +11:00
Vermilingua a68f58e648 scoring system 100% complete 2013-11-01 16:35:20 +11:00
Vermilingua 3b3755cda9 started scoring system, yet to be populated 2013-11-01 16:35:19 +11:00
Michael Townsend a19643517a Update prestige.js
Null check in Prestige.load
2013-10-31 14:37:19 -04:00
Michael Townsend c738342bad Update world.js
Only add the cache if there is prestige data
2013-10-31 14:36:03 -04:00
Michael Townsend f5847f66ba Update engine.js 2013-10-30 18:20:32 -04:00
Michael Townsend de9f88dfab Merge pull request #60 from Vermilingua/save-fix
Save fix
2013-10-30 15:20:11 -07:00
Vermilingua 2c31e4ecda strips nonwords, spaces, and newlines from both the input and output 2013-10-31 07:17:41 +11:00
Michael a24d492681 Fixed a bug with the page title. 2013-10-29 18:39:00 -04:00
Michael 5d07c76577 Incremented version 2013-10-29 18:07:17 -04:00
Michael b230d0586a Disallow medicine events before medicine has been discovered. 2013-10-29 18:06:40 -04:00
Michael Townsend a96e9c55c2 Update world.js 2013-10-29 15:54:25 -04:00
Vermilingua 55c93772db should fix the issue, maybe 2013-10-29 18:33:07 +11:00
Michael 363119717e Added cancel button to the save dialog. 2013-10-17 17:48:48 -04:00
Michael Townsend 701baf86d7 Merge pull request #58 from Vermilingua/importexport
Routine to migrate/backup saves
2013-10-17 06:08:36 -07:00
Vermilingua dc706c21fe added importing and exporting saves with base64 2013-10-17 22:46:33 +11:00
Michael 1ffe8f8aeb A bit of cleanup. 2013-10-16 17:45:41 -04:00
Michael Townsend a895a35939 Merge pull request #57 from Vermilingua/prestige
Prestige System
2013-10-16 14:31:33 -07:00
Vermilingua 83bf266a29 prestige system now absolutely complete 2013-10-16 21:43:40 +11:00
Vermilingua f952b4def1 completed save/load 2013-10-16 21:43:14 +11:00
Vermilingua 1be4d5edc5 started backup/loading mechanic 2013-10-16 21:43:12 +11:00
Vermilingua acc04d0780 set down framework, storage/map gen/etc. 2013-10-16 21:41:47 +11:00
Michael Townsend 63a6d98ffe Merge pull request #55 from Vermilingua/forest
Forest now fits the scene
2013-10-15 07:40:32 -07:00
Vermilingua 36b9cf2142 made the forest suit more 2013-10-15 20:09:28 +11:00
Michael 95faa0ba75 Merge branch 'master' of https://github.com/Continuities/adarkroom.git 2013-10-13 18:53:19 -04:00
Michael 22e480a80b Ignore Eclipse settings. 2013-10-13 18:52:43 -04:00
Michael Townsend 25cae71067 Merge pull request #54 from Vermilingua/warnings
Made the warnings look nicer, and added the as-of-yet mostly unused logo
2013-10-12 10:20:58 -07:00
Vermilingua f6e95850da added safari/opera and got better logos 2013-10-12 13:40:47 +11:00
Vermilingua a89bf8ee8b nicened the warnings 2013-10-12 13:30:30 +11:00
Michael 5ebbefac91 Modified comment text 2013-10-11 17:24:41 -04:00
Michael 084bf15811 Little bug in keynav code. 2013-10-11 16:24:37 -04:00
Michael dde477aade Some general code cleanup. 2013-10-10 20:53:53 -04:00
Michael Townsend fbdc84dcf1 Merge pull request #52 from Bleyddyn/master
Arrow Keys and stores update fix
2013-10-10 17:12:30 -07:00
Andrew Salamon 5f5ff3701e Fixed a problem where the stores view wasn't updating. 2013-10-09 15:32:05 -07:00
Andrew Salamon 5d482f856e Added support for switching from room to outside to path using the arrow keys. 2013-10-09 15:31:43 -07:00
Michael Townsend 30e7a06a44 Merge pull request #50 from LucidCrux/state_manager_2
State manager 2
2013-08-18 19:08:53 -07:00
LucidCrux bb84eafca6 re-enable jQuery from google 2013-07-27 18:12:00 -06:00
LucidCrux f704a2137f turned off debug 2013-07-27 17:22:25 -06:00
LucidCrux 6561e88f9f lots of bugfixes
- bugfix Engine.startThieves call changed to $SM call
- bugfix $SM.remove not deleting state
- bugfix workaround for empty string when creating states
     For some reason splitting "state.sub.sub2["sub3"]" will result in
     empty strings whereas "state.sub.sub2[\'sub3\']" didn't. Maybe a
     javascript regex quirk?

     Had to add a loop to remove '' from the split string array.
- modified collectIncome so that only one update event fires for the 
  whole function, no event if no income was added.
- modified updateBuildButtons so that buttons would show up if the
  building had already been built.
     changed check to be wood != undefined

     Also changed room to display store values of 0 instead of removing 
     the row. It was distracting to have the values shift up and down 
     when tightly managing a resource. If you haven't seen a resource 
     yet, it still doesn't show up.
2013-07-27 17:21:30 -06:00
LucidCrux 36011b5b15 set version to 1.3, add code to update State from 1.2 to 1.3 2013-07-27 12:49:03 -06:00
LucidCrux a8c6790d84 bugfix set ship,world location to true on init 2013-07-27 12:25:15 -06:00
LucidCrux 99800f1abd refactor Outside to use $SM + Room bugfix, \' to "
Refactoring of Outside.js to take better advantage of $SM and simplify
the code.

Includes a small bug fix to Room update handler

Also changed instances of escaped single quote (\') to double (") for
readability and simplicity.

====state changes====
//these were changed for the opposite reason the Room states were. These
seem like states that other locations and events may very well want to
interact with and possibly alter themselves
game.outside.buildings >> game.buildings 
game.outside.population >> game.population
game.outside.workders >> game.workers


====functions removed====
Outside.numBuilding // just a $SM.get, no shortcut really needed since
Outside.numBuilding is a pretty long name
Outside.getPopulation // same here
Outside.addBuilding // just an add
Outside.addBuildings // just addM, but wasn't even actually used


====functions refactored====
Outside.killVillagers //moved updates to handler
Outside.updateWorkersView //added local to reduce gets
Outside.increasePopulation //updates moved to handler
Outside.increaseWorker // updates moved to handler
Outside.decreaseWorkder // updates moved to handler
2013-07-26 19:21:12 -06:00
LucidCrux f4d2e8deae change to property Room.fire, Room.temperature, Room.buttons
Changed these States into properties of room. They are only ever
accessed by Room and there is no real reason to save them. By not
saving the state each time, it also makes the the player start out in
'a dark room' on every load. Rather fitting I think, and gives the fire
a little bit more purpose if you have to rewarm the builder.
2013-07-25 21:05:43 -06:00
LucidCrux 99d57efdc1 bug fix Outside.init > set features.location.outside to true 2013-07-25 20:33:04 -06:00
LucidCrux 2e3f8abd3f add $SM.setget, refactor Room to better use $SM
game.room.builder >> game.builder.level

setget is mainly for use in local copies of states, useful for keeping
code cleaner and less redundant while maintaining set/get of states by
the $SM

====functions refactored====
Room.unlockForext //remove update calls
Room.buy //remove update calls
Room.build //remove update calls
Room.cooFire //added locals to reduce gets
Room.adjustTemp //added locals to reduce gets
Room.updateBuilderState //added local to reduce gets
Room.craftUnlocked //Room unlock is always going to be true, don't need
to check parents to avoid errors anymore
Room.buyUnlocked //Room unlock is always going to be true, don't need to
check parents to avoid errors anymore
2013-07-25 20:31:30 -06:00
LucidCrux f4520bce91 speed up and bug fix 2013-07-25 02:00:41 -06:00
LucidCrux 766d3879c7 Merge remote-tracking branch 'origin/master' into state_manager_2
Conflicts:
	script/events.js
2013-07-24 21:01:59 -06:00
LucidCrux 2018ca3ae8 create and configure callback handlers for state updates
add $.Dispatch to handle object events
add subscribe calls to files
update SM fireUpdate to use new Dispatch

There are some NaN issues right now, no time to bug hunt right now, it
does kind of function though
2013-07-24 18:33:06 -06:00
LucidCrux dee7cbb9b3 refactor Engine.js for use with $SM
====functions removed====
//I just removed these because most were simpler or at least equal as
	direct $SM get/set/add calls, I realize the store ones are kind of
	subjective since calls were about equal, but oh well. If someone
	really 	feels we need the shortcut/named functions for manipulating
	stores specifically, it shouldn't be crazy to reimplement in $SM 
Engine.setStore >> $SM.set
Engine.setStores >> $SM.setM
Engine.addStore >> $SM.add
Engine.addStores >> $SM.addM
Engine.getStore >> $SM.get(requestZero = true)
Engine.storeAvailable >> $SM.get;
Engine.removeIncome >> $SM.remove //updates moved to handler


====functions moved====
//Any moved function I felt was more directly related to States or
	didn't belong where it was
Engine.addPerk > $SM.addPerk //kept function for now because of notify
	call inside, 'deep' state
Engine.hasPerk > $SM.hasPerk //kept function because of 'deep' state
	name
Engine.setIncome > $SM.setIncome //kept because it has internal logic
**Engine.getIncome > $SM.getIncome //**easily removable with
	Outside.updateVillageIncome refactor
Engine.openPath > Path.openPath //Since I'm refactoring anyways
Engine.addStolen > $SM.addStolen //internal logic
Engine.startThieves > $SM.startThieves //not sure $SM is a better place,
	but Engine should be nice and clean by the end of this, handling
	only engine mechanics
Engine.num > $SM.num //after Outside refacter, this is basically just a
	fancy $SM.get
Engine.upgradeState > $SM.updateOldState


====functions refactored====
$SM.addPerk; //updates moved to event handler, no check/create new perk
$SM.hasPerk; //don't need to check exist and ==true
$SM.collectIncome //removed changed check, update calls now handled by
	'stateUpdate' event listening
$SM.addStolen //fix to set stolen items in case a partial steal happens
$SM.startThieves //updates in handler
$SM.updateOldState //use $SM calls, add placeholder for updating to post
$SM state when more finalized 


====functions affected (by removed)====
Engine.init (Engine.getStore, Engine.storeAvailable)
Engine.collectIncome (Engine.addStores)
Engine.num (Engine.getStore)
Engine.travelTo (Engine.storeAvailable)

Room.init (Engine.getStore)
Room.unlockForest (Engine.setStore)
Room.lightFire (Engine.setStore, Engine.getStore, Engine.storeAvailable)
Room.stokeFire (Engine.setStore, Engine.getStore, Engine.storeAvailable)
Room.coolFire (Engine.setStore)
Room.buy (Engine.setStores, Engine.addStore, Engine.getStore)
Room.build (Engine.setStores, Engine.getStore)
Room.craftUnlocked (Engine.getStore, Engine.storeAvailable)
Room.buyUnlocked (Engine.storeAvailable)
Room.updateButton (Engine.storeAvailable)

Outside.gatherWood (Engine.addStores)
Outside.checkTraps (Engine.addStores, Engine.getStore)
Outside.updateVillage (Engine.getStore)

Path.embark (Engine.addStore)
Path.getCapacity (Engine.getStore)
Path.updateOutfitting (Engine.getStore)
Path.createOutfittingRow (Engine.getStore)
Path.increaseSupply (Engine.getStore)

World.goHome (Engine.addStore)
World.updateSupplies (Engine.getStore)
World.checkDanger (Engine.getStore)
World.getMaxHealth (Engine.getStore)
World.getMaxWater (Engine.getStore)

Ship.reinforceHull (Engine.addStore, Engine.getStore)
Ship.upgradeEngine (Engine.addStore, Engine.getStore)

Events.loadScene (Engine.addStores)
Events.updateButtons (Engine.getStore)
Events.buttonClick (Engine.getStore)

Events.Global (Engine.addStores, Engine.removeIncome)
Events.Room (Engine.addStore, Engine.addStores, Engine.getStore,
Engine.storeAvailable)
2013-07-24 17:41:36 -06:00
Michael Townsend 03867cae60 Merge pull request #47 from Yeow-Meng/master
IE<8 Fixes:
2013-07-23 21:09:24 -07:00
Steve Hayes 253f946dbd IE<8 Fixes: Removed trailing commas in string literals and renamed variable char to chara 2013-07-23 23:54:06 -04:00
LucidCrux db4a346d21 create StateManager, change all State calls to managed calls
Introduced state_manager.js almost all State gets/sets are now run
through the manager (alias $SM). For now it was a simple, mostly
straightforward replacement of calls. This means that there are
redundancies and a lot of now unneeded code for things the SM will
handle. However, since I had trouble with making those changes as well
as introducing the manager all at once my first attempt, I am taking the
wiser approach and making "one change" at a time like I should have
instead of being too sure of myself.

At this point, it seems to work, but there may be bugs I didn't catch.
There was also no attempt made to update old saves to work with this. In
theory, it shouldn't be too hard. (included is a list of all state
changes)

TODO:
Save Update.
Refactor: a lot, many many redundancies now.
Refactor: "location centric" to "global centric".
Relocate all calls to different update functions to event listeners
where possible.

======================================================

The changes to State are as follows:

.room (exists) > features.location.room
.room > game.room
.room.builder > game.room.builder
.room.temperature > game.room.temperature
.room.fire > game.room.fire
.room.buttons > game.room.buttons

.outside (exists) > features.location.outside
.outside > game.outside
.outside.population > game.outside.population
.outside.buildings > game.outside.buildings
.outside.workers > game.outside.workers
.outside.seenForest > game.outside.seenForest

.world (exists) > features.location.world
.world > game.world
.world.map > game.world.map
.world.mask > game.world.mask
.starved > character.starved
.dehydrated > character.dehydrated

.ship (exists) > featuers.location.spaceShip
.ship > game.spaceShip
.ship.hull > game.spaceShip.hull
.ship.thrusters > game.spaceShip.thrusters
.ship.seenWarning > game.spaceShip.seenWarning
.ship.seenShip > game.spaceShip.seenShip

.punches > character.punches
.perks > character.perks

.thieves > game.thieves
.stolen > game.stolen
.cityCleared > game.cityCleared

.stores > stores
.income > income
2013-07-23 01:24:47 -06:00
Michael Townsend 1b1088db4f Merge pull request #44 from Zarkonnen/medicine
Fixed issue #42 by fixing wrong city exploration setpiece data.
2013-07-17 06:23:09 -07:00
Zarkonnen 7bf744e386 Fixed issue #42 by fixing wrong city exploration setpiece data. 2013-07-17 09:56:31 +02:00
Michael Townsend 252b731666 Merge pull request #39 from toofarapart/improved_item_dropping
events.js: Item dropping improvements
2013-07-15 08:43:47 -07:00
Michael Townsend d296ea4db9 Merge pull request #38 from Zarkonnen/laser_rifle_fix
Laser rifles are now listed as weapons, fixing issue #37.
2013-07-15 08:40:29 -07:00
Matt Rasmus e80fc4d286 events.js: Item dropping improvements
Item drop menu no longer disappears after clicking to drop something.
2013-07-13 17:00:57 -07:00
Zarkonnen 25f1fff6a1 Laser rifles are now listed as weapons, fixing issue #37. 2013-07-13 21:42:15 +02:00
Michael Townsend 77cac86076 Merge pull request #32 from toofarapart/all_villagers_killed_bug
All villagers killed bug
2013-07-10 19:51:36 -07:00
Matt Rasmus 22b850f1c0 outside.js: Fix incorrect display of workers.
Fixed an issue where the workers view would break temporarily if all the villagers were killed.
2013-07-10 17:56:15 -07:00
Michael Townsend 93f8e52e1f Merge pull request #30 from Zarkonnen/medicine
Medicine
2013-07-10 12:07:05 -07:00
Zarkonnen 3515cbf75f Removed mentions of "you". 2013-07-10 20:50:42 +02:00
Michael Townsend 8cb64ad3d8 Merge pull request #29 from Cogito/roadDrawing
Road drawing improvements
2013-07-10 10:57:13 -07:00
Zarkonnen d4034fe244 Fixed hospital never occurring in city. 2013-07-10 15:10:43 +02:00
Zarkonnen bb953de92b Finished first version of medicine feature. 2013-07-10 12:53:28 +02:00
Andrew Ardill 255bdd68fc world.js: Improve road drawing algorithm
Instead of drawing an 'L' shape road to the village, find the closest road,
outpost or village and draw the road to it. Care is taken to ensure that a
road is drawn if you are standing on top of an outpost, as the outpost may be
created before the tile it stands on is connected to the road network.
2013-07-10 20:52:18 +10:00
Andrew Ardill 26b955fee8 world.js: Increase functionality of getDistance
Allow passing 'from' and 'to' positions to getDistance to find the distance
between them.
2013-07-10 20:52:18 +10:00
Andrew Ardill c4afe143a9 world.js: Introduce World.VILLAGE_POS
This constant gets reused in a few places, so extract it out. Work will be
required to migrate existing code away from hard coding World.RADIUS in places
where we are talking about the village location.
2013-07-10 20:52:18 +10:00
Andrew Ardill b97f5d9914 world.js: Introduce function to copy positions 2013-07-10 20:52:17 +10:00
Michael Townsend 05fef5664d Merge pull request #27 from toofarapart/fade_to_black
(SPOILERS) A nice fade to black...
2013-07-09 19:47:45 -07:00
Michael Townsend f56697d9d0 Merge pull request #25 from toofarapart/persistent_stores_view
Stores panel now persists on all non-world/non-space views.
2013-07-08 14:25:20 -07:00
Matt Rasmus eaf2fcdfbb Keep showing the weapons panel while in the Path screen. 2013-07-08 13:58:16 -07:00
Matt Rasmus de2ad91053 Weapons panel hides when not in Room. 2013-07-08 13:10:49 -07:00
Michael Townsend b8dd1125d4 Merge pull request #21 from Zarkonnen/master
Converted zero/max buttons to +-10 buttons
2013-07-08 12:45:01 -07:00
Zarkonnen 4334f36e57 Bugfixes. 2013-07-08 21:39:28 +02:00
Michael Townsend ea0aff072f Merge pull request #28 from toofarapart/disappearing_restart_fix
(SPOILERS) Fixed a bug in which the share/restart buttons disappeared...
2013-07-08 11:55:56 -07:00
Zarkonnen 4641b0b145 Initial medicine implementation. Needs more events. 2013-07-08 19:16:16 +02:00
Matt Rasmus 0b6144660f Fixed a bug in which the share/restart buttons would disappear in certain situations. 2013-07-07 13:25:30 -07:00
Matt Rasmus 4326b2aa2a Game fades to black at the end, and stays that way until the player clicks restart. 2013-07-07 11:41:51 -07:00
Michael Townsend 54cea31db9 Merge pull request #26 from dhutty/patch-1
spelling
2013-07-07 09:09:42 -07:00
Michael Townsend 53ff72d218 Merge pull request #24 from jvantuyl/master
a grammar fix
2013-07-07 09:07:38 -07:00
dhutty aeedc5d10c spelling 2013-07-07 10:18:59 -04:00
Matt Rasmus 8dabee851d Stores panel now persists on all non-world/non-space views. 2013-07-06 14:56:27 -07:00
Jayson Vantuyl 536f09dce3 a grammar fix
"bundle of sticks", not "bundle of stick"
2013-07-06 13:53:33 -07:00
Michael Townsend 12258689e8 Merge pull request #22 from engstrom/master
Moved EatMeatButton to beginning of combat UI
2013-07-06 09:53:24 -07:00
Michael Townsend 95fddcbb2c Merge pull request #20 from evilDave/swipes
Added swipe support
2013-07-06 09:51:54 -07:00
Michael Townsend 79c0185e7e Merge pull request #23 from jvantuyl/master
Minor Spelling Fix
2013-07-06 09:50:29 -07:00
Jayson Vantuyl b14ad39c5a minor spelling fix 2013-07-05 23:43:43 -07:00
engstrom fa655aef1c Moved EatMeatButton to beginning of combat UI 2013-07-05 18:41:22 -06:00
Michael Townsend 1aaabed944 Merge pull request #18 from Erid/patch-1
Changed browser's img alt text
2013-07-05 06:43:47 -07:00
Michael Townsend e83dcd3945 Merge pull request #17 from engstrom/patch-1
Formatting the readme
2013-07-05 06:43:16 -07:00
David Clark e9679b3f26 Add swipe support. Modules can implement swipeLeft (etc). Swipes control movement in the World module (map). 2013-07-05 22:36:49 +10:00
Zarkonnen ae044376db Converted min/max buttons to +-10 buttons. Also made code shorter. 2013-07-05 13:47:23 +02:00
Elías Balioceda Fernández b1af589d53 Changed browser's img alt text
Just a minor fix
2013-07-04 21:39:55 -06:00
Dustin Engstrom 555a924fb0 Formatting the readme 2013-07-04 18:42:55 -06:00
Michael Townsend 7f1efd4ad2 Update LICENSE.md
Switched from GPLv3 to MPLv2
2013-07-04 15:21:49 -04:00
Michael Townsend 98719ccf0c Merge pull request #13 from Zarkonnen/master
Max/zero buttons
2013-07-04 07:50:07 -07:00
Michael Townsend 6a7df4d17c Fixed non-combat meat eating 2013-07-04 07:28:19 -07:00
Zarkonnen 6d99cb7c3a Added max/zero buttons to worker assignment and expedition supply packing to prevent eg having to click 50x to fill food supplies. 2013-07-04 16:15:29 +02:00
Michael Townsend cab220a5ac Merge pull request #10 from dmnd/master
Add an 'eat meat' button to the loot screen
2013-07-04 06:59:09 -07:00
Michael Townsend 242ef7f0b9 Merge pull request #7 from Cogito/moveInterface
Improve movement interface to allow click events
2013-07-04 06:55:50 -07:00
Michael Townsend 8743b16e09 Merge pull request #9 from Starefossen/patch-2
Adds link to play game online
2013-07-04 06:51:26 -07:00
Desmond Brand a86c61aaf0 Add an 'eat meat' button to the loot screen
When I played this, I would often madly try to click the 'eat meat' button
after I won a fight, only to have the 'leave' button appear in its place,
causing me to lose my chance at both healing and looting.

This patch adds an 'eat meat' button to the loot screen to avoid this UI
problem.
2013-07-04 02:56:54 -07:00
Hans Kristian Flaatten 2c8e410eab Adds link to play game online 2013-07-04 11:17:04 +02:00
Andrew Ardill 6fb7f248f7 world.js: Trigger movement with clicks on the map
Clicking on the map in different quadrants will move you in that direction.
Clicks are measured relative to the centre of the current location centre of
the map. Click above the player to move up, click below to move down etc.

This should enable better gameplay on touch devices.
2013-07-04 16:13:30 +10:00
Andrew Ardill d0a171e95b world.js: Refactor move commands out of keyDown
In order to better handle move commands, refactor them out of the keyDown
event handler. This will enable using other input methods to trigger a move
command, such as mouse clicks or touch events.
2013-07-04 14:49:21 +10:00
Michael Townsend 9327358008 Merge pull request #1 from daturkel/patch-1
Added a note to mobileWarning about arrow keys
2013-07-03 10:46:45 -07:00
Dan Turkel a37bb40c81 Added a note to mobileWarning about arrow keys
An HN commenter noted that he ignored the mobilewarning and tried the game and found it worked. That is, until he got to the Embark stage and found himself arrow key-less. This warning is slightly more verbose to avoid similar situations.
2013-07-03 13:44:45 -04:00
116 changed files with 78357 additions and 9826 deletions
+12
View File
@@ -0,0 +1,12 @@
# Default
* text=auto
# Binary files so don't modify
*.ico binary
*.png binary
*.jpg binary
*.xlsx binary
# Hide vendor and translation files from language statistics
lang/* linguist-documentation
lib/* linguist-vendored
+4
View File
@@ -0,0 +1,4 @@
/.settings
*.TODO
*.mo
*.swp
+5
View File
@@ -0,0 +1,5 @@
{
"eqnull": true,
"sub": true,
"multistr": true
}
+17 -11
View File
@@ -1,11 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>A Dark Room</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
</natures>
</projectDescription>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>A Dark Room</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
</projectDescription>
+345 -161
View File
@@ -1,189 +1,373 @@
GNU GENERAL PUBLIC LICENSE
Mozilla Public License Version 2.0
==================================
Version 3, 29 June 2007
1. Definitions
--------------
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
The GNU General Public License is a free, copyleft license for software and other kinds of works.
1.3. "Contribution"
means Covered Software of a particular Contributor.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
1.5. "Incompatible With Secondary Licenses"
means
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
1.8. "License"
means this document.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS
0. Definitions.
1.10. "Modifications"
means any of the following:
“This License” refers to version 3 of the GNU General Public License.
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
(b) any new file in Source Code Form that contains any Covered
Software.
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
A “covered work” means either the unmodified Program or a work based on the Program.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
2. License Grants and Conditions
--------------------------------
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
1. Source Code.
2.1. Grants
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
2.2. Effective Date
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
The Corresponding Source for a work in source code form is that same work.
2. Basic Permissions.
2.3. Limitations on Grant Scope
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
7. Additional Terms.
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
11. Patents.
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
+42 -3
View File
@@ -1,4 +1,43 @@
adarkroom
=========
A Dark Room
===========
> "awake. head throbbing. vision blurry. come light the fire."
A Dark Room - A Minimalist Text Adventure
a minimalist text adventure game for your browser
[Click to play](http://adarkroom.doublespeakgames.com)
<table>
<tr><th colspan=4>Available Languages</tr>
<tr>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=zh_cn">Chinese (Simplified)</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=zh_tw">Chinese (Traditional)</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=en">English</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=fr">French</a></td>
</tr><tr>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=de">German</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=el">Greek</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=id">Indonesian</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=it">Italian</a></td>
</tr><tr>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=ja">Japanese</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=ko">Korean</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=nb">Norwegian</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=pl">Polish</a></td>
</tr><tr>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=pt">Portuguese</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=pt_br">Portuguese (Brazil)</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=ru">Russian</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=es">Spanish</a></td>
</tr><tr>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=sv">Swedish</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=th">Thai</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=tr">Turkish</a></td>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=uk">Ukrainian</a></td>
</tr><tr>
<td><a href="http://adarkroom.doublespeakgames.com/?lang=vi">Vietnamese</a></td>
</tr>
</table>
or play the latest on [GitHub](http://doublespeakgames.github.io/adarkroom)
[![app store](http://i.imgur.com/M6jlJQH.png)](https://itunes.apple.com/us/app/a-dark-room/id736683061)
+42 -26
View File
@@ -1,27 +1,43 @@
<!doctype html>
<html>
<head>
<title>A Dark Room</title>
<style>
div {
width: 960px;
margin: auto;
text-align: center;
margin-top: 100px;
}
</style>
</head>
<body>
<div>
<strong>
A Dark Room makes use of HTML5 and CSS3, which your current browser does not appear to support.<br/>
Please update your browser for the best experience:<br/>
</strong>
<a href='http://www.mozilla.org/en-US/firefox/new/'><img src='img/firefox.png' alt='Firefox' /></a>
<a href='https://www.google.com/intl/en/chrome/browser/'><img src='img/chrome.png' alt='Firefox' /></a>
<a href='http://windows.microsoft.com/en-CA/internet-explorer/download-ie'><img src='img/ie.png' alt='Firefox' /></a>
<br/><br/>
Or you can <a href='index.html?ignorebrowser=true'>play anyway</a>, but it probably won't work!
</div>
</body>
<!doctype html>
<html>
<head>
<title>A Dark Room</title>
<style>
body {
background-color: #000000;
color: #FFFFFF;
}
a {
color: #FFFFFF;
}
div {
width: 960px;
margin: auto;
text-align: center;
margin-top: 20px;
}
.browser {
width:102.4px;
height:102.4px;
}
</style>
</head>
<body>
<center>
<img src="img/Logo1.jpg" />
<div>
<strong>
A Dark Room makes use of HTML5 and CSS3, which your current browser does not appear to support.<br/>
Please <a href="http://browsehappy.com">update your browser</a> for the best experience:<br/>
</strong>
<a href='http://www.mozilla.org/en-US/firefox/new/'><img class="browser" src='img/firefox.png' alt='Firefox' title='Firefox' /></a>
<a href='https://www.google.com/intl/en/chrome/browser/'><img class="browser" src='img/chrome.png' alt='Chrome' title='Chrome' /></a>
<a href='http://windows.microsoft.com/en-CA/internet-explorer/download-ie'><img class="browser" src='img/ie.png' alt='Internet Explorer' title='Internet Explorer' /></a>
<a href='http://www.opera.com/computer'><img class="browser" src='img/opera.png' alt='Opera' title='Opera' /></a>
<a href='http://www.apple.com/safari/'><img class="browser" src='img/safari.png' alt='Safari' title='Safari' /></a>
<br/><br/>
Or you can <a href='index.html?ignorebrowser=true'>play anyway</a>, but it probably won't work!
</div>
</center>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
Contributing to A Dark Room
===========
Hello and welcome, contributors both new, and old.
Like most projects on GitHub, A Dark Room is open source, and thrives off contributions from members of the community. We appreciate any pull requests or issues that you may open in the project, no matter the size.
<br><hr>
Before contributing to the project, there are a few things you should look over to ensure your contribution is done correctly.
Most of the projects code is written in JavaScript. We would prefer all submitted JavaScript be [JSHint](http://jshint.com/) compliant.
> "JSHint is a community-driven tool to detect errors and potential problems in JavaScript code and to enforce your team's coding conventions."
<br><br><br>
Before opening a new issue, try to check the projects [issues](https://github.com/doublespeakgames/adarkroom/issues) or [wiki](https://github.com/doublespeakgames/adarkroom/wiki).
Doing so will help prevent needless double issues.
<br>Most of the time you will be able to find what you are looking for in one of those places. If not, please open an issue and describe your problem with as much detail as possible.
Lastly, be nice, patient, open to new ideas, and have some fun!
+182
View File
@@ -0,0 +1,182 @@
body {
background-color: #272823;
color: #EEE;
}
div.headerButton {
border-left: 1px solid #EEE;
}
div#notifyGradient {
background-color: #272823;
background: -webkit-linear-gradient( rgba(39, 40, 35, 0) 0%, rgba(39, 40, 35, 1) 100% );
background: linear-gradient( rgba(39, 40, 35, 0) 0%, rgba(39, 40, 35, 1) 100% );
filter: alpha( Opacity=0, FinishOpacity=100, Style=1, StartX=0, StartY=0, FinishX=0, FinishY=500 );
}
div#saveNotify {
background: #272823;
}
.eventPanel:before {
background-color: #272823;
}
.eventTitle:after {
background-color: #272823;
}
div.tooltip {
background-color: #171813;
border: 1px solid black;
box-shadow: -1px 3px 2px #111;
}
div#population {
background-color: #272823;
}
div#village:before {
background: #272823;
}
div#village {
border: 1px solid #EEE;
}
div#stores:before {
background: #272823;
}
div#stores {
border: 1px solid #EEE;
}
div#weapons:before {
background: #272823;
}
div#weapons {
border: 1px solid #EEE;
}
div#bagspace {
background-color: #272823;
}
div#outfitting:before {
background: #272823;
}
div#perks {
border: 1px solid #EEE;
}
div#perks:before {
background-color: #272823;
}
div#outfitting {
border: 1px solid #EEE;
}
#bagspace-world {
border: 1px solid #EEE;
}
div.supplyItem {
border: 1px solid #EEE;
}
#backpackTitle {
background-color: #272823;
}
#backpackSpace {
background-color: #272823;
}
#healthCounter {
background-color: #272823;
}
#map {
border: 1px solid #EEE;
}
#map .landmark {
color: #EEE;
}
#dropMenu {
background: none repeat scroll 0 0 #272823;
box-shadow: -1px 3px 2px #111;
}
div.button {
border: 1px solid #EEE;
}
div.button.disabled, div.button.disabled:hover {
border-color: #444;
color: #444;
}
.upBtn:after, .upManyBtn:after {
border-color: transparent transparent #272823;
}
.upBtn:before, .upManyBtn:before {
border-color: transparent transparent #EEE;
}
.upBtn.disabled:before, .upManyBtn.disabled:before {
border-color: transparent transparent #555;
}
.dnBtn:after, .dnManyBtn:after {
border-color: #272823 transparent transparent;
}
.dnBtn:before, .dnManyBtn:before {
border-color: #EEE transparent transparent;
}
.dnBtn.disabled:before, .dnManyBtn.disabled:before {
border-color: #555 transparent transparent;
}
body.noMask .eventTitle {
background-color: #EEE;
color: #272823;
}
body.noMask .eventTitle:after {
background-color: #EEE;
}
body.noMask .eventPanel {
background-color: #EEE;
}
body.noMask #description {
color: #272823;
}
body.noMask #buttons > .button {
border: 1px solid #272823;
color: #272823;
}
#stars > div, #starsBack > div {
color: black;
}
.endGame {
color:#272823;
}
#theEnd {
color: #272823;
}
+603 -497
View File
File diff suppressed because it is too large Load Diff
+60 -64
View File
@@ -1,64 +1,60 @@
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: attr(data-legend);
left: 8px;
top: -13px;
}
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;
}
+59 -66
View File
@@ -1,66 +1,59 @@
#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 ,div#perks:before {
content: attr(data-legend);
position: absolute;
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.perkRow {
position: relative;
}
div.perkRow .row_key {
float: none;
}
+60 -79
View File
@@ -1,79 +1,60 @@
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, div#craftBtns:before, div#buyBtns:before {
content: attr(data-legend);
position: relative;
top: -5px;
}
div#craftBtns {
position: absolute;
top: 50px;
left: 150px;
}
div#buyBtns {
position: absolute;
top: 50px;
left: 300px;
}
div#storesContainer {
position: absolute;
top: 0px;
right: 0px;
}
div#stores:before, div#weapons:before {
position: absolute;
background: white;
content: attr(data-legend);
left: 8px;
top: -13px;
}
div#stores {
position: relative;
z-index:10;
border: 1px solid black;
cursor: default;
padding: 5px 10px;
width: 200px;
}
div.storeRow {
position: relative;
}
div#weapons {
margin-top: 15px;
position: relative;
right: 0px;
border: 1px solid black;
cursor: default;
padding: 5px 10px;
width: 200px;
}
+8 -7
View File
@@ -1,7 +1,8 @@
div#hullRow {
width: 70px;
}
div#engineRow {
width: 70px;
margin-bottom: 20px;
div#hullRow {
width: 70px;
}
div#engineRow {
width: 70px;
margin-bottom: 20px;
}
+154 -134
View File
@@ -1,134 +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;
}
@-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;
}
.endGameOption {
font-size: 32px;
cursor: pointer;
}
.endGameOption:hover {
text-decoration: underline;
}
+73 -73
View File
@@ -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;
}
+4 -4
View File
@@ -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
+137
View File
@@ -0,0 +1,137 @@
HOW TO TRANSLATE
=====================================================================
** NOTE TO DEVELOPERS **:
All strings sent to the page must go through the javascript function _() which will translate it. So please if you add new strings, wrap them with _('') function.
If you want to add some strings in the css (using content), please edit /script/localization.js too.
Thank you :)
ADDING A NEW LANGUAGE
=====================================================================
Required tools:
ubuntu:
apt-get install gettext
apt-get install poedit
apt-get install python
windows:
http://poedit.net/
https://www.python.org/download/windows/
mac:
http://poedit.net
https://www.python.org/downloads/mac-osx/
Steps:
1) Create a new directory lang/{new_language_code}
2) Download the file adarkroom.pot in the lang folder as translation template
3) Create the new po file:
ubuntu:
msginit --locale {locale for new language eg: en_US} -i lang/adarkroom.pot -o lang/{new_language}/strings.po
windows:
- open application interface > File > New... > [select language for translation] > Save as... > lang/{new_language_code}/strings.po
- [update from POT file] > select lang/adarkroom.pot
4) Copy lang/main.css to lang/{new_language}
5) Open lang/{new_language}/strings.po with a software poedit
6) Translate ...
7) Keep translating ...
8) Finished? Sure?
9) Use the python script (/tools/po2js.py) to convert the po file to a js file
run from command line/terminal:
python tools/po2js.py lang/{new_language}/strings.po
Note:
make sure to have polib module installed or the command line/terminal will give you an error
polib can be downloaded and installed via the command line/terminal from the python website
on windows it could be necessary to run the command prompt as Administrator
Win Vista/7: start > right-click on command prompt > Run as Administrator
Win 8: File panel > mouse over Command prompt > click on Run command prompt as Administrator
10) Edit README.md and add the following string: [{new_language_name}](http://adarkroom.doublespeakgames.com/?lang={new_language_code})
11) Edit lang/langs.js and add the new language
Note: If your sentence are too big and you need to update some css, overload it in /lang/{new_language}/main.css
UPDATE TEMPLATE FILE
=====================================================================
When new content or changes in the code introduce new strings, the file lang/adarkroom.pot must be updated.
Required tools:
ubuntu:
apt-get install python3-babel
windows & mac:
poedit
Steps:
ubuntu:
pybabel extract -F babel.cfg -c "TRANSLATORS" script > lang/adarkroom.pot
windows:
use poedit
Use menu "Cataloge"-> "New Catalog from POT file..."
UPDATE LANGUAGE AFTER UPDATE
=====================================================================
Required tools:
ubuntu:
* gettext
windows & mac:
* poedit
- ubuntu:
msgmerge -U lang/{language}/strings.po lang/adarkroom.pot
windows:
Open lang/{language}strings.po in poedit
Use menu "Cataloge"-> "Update from POT file..."
OR
After "SETUP POEDIT"
Use menu "Cataloge"-> "Update from source"
- Edit in poedit as in "ADD A NEW LANGUAGE"
SETUP POEDIT
=====================================================================
To update from source without pot file need:
- Create new parser:
File > Preferences > Parsers > New
Language:
JS
List of extension:
*.js
Parser command:
xgettext --language=JavaScript --force-po --add-comments=TRANSLATORS -o %o %C %K %F
Item in Keyword List:
-k%k
Item in input files list:
%f
Source code charset:
--from-code=%c
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 119 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 191 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 20 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

+112 -77
View File
@@ -1,77 +1,112 @@
<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/CreativeWork">
<head>
<!--
A Dark Room (v1.2)
==================
A minimalist text adventure by Michael Townsend.
Inspired by Candy Box (http://candies.aniwey.net/)
Please don't steal me.
-->
<title>A Dark Room</title>
<meta itemprop="description" name="description" property="og:description" content="A minimalist text adventure">
<meta itemprop="image" property="og:image" content="img/adr.png" />
<meta itemprop="name" property="og:title" content="A Dark Room" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="image_src" href="img/adr.png" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="lib/jquery.color-2.1.2.min.js"></script>
<script src="script/Button.js"></script>
<script src="script/engine.js"></script>
<script src="script/header.js"></script>
<script src="script/notifications.js"></script>
<script src="script/events.js"></script>
<script src="script/room.js"></script>
<script src="script/outside.js"></script>
<script src="script/world.js"></script>
<script src="script/path.js"></script>
<script src="script/ship.js"></script>
<script src="script/space.js"></script>
<!-- Event modules -->
<script src="script/events/global.js"></script>
<script src="script/events/room.js"></script>
<script src="script/events/outside.js"></script>
<script src="script/events/encounters.js"></script>
<script src="script/events/setpieces.js"></script>
<script type='text/javascript'>
var oldIE = false;
</script>
<!-- [if lt IE 9]>
<script type="text/javascript">oldIE = true;</script>
<![endif]-->
<link rel="stylesheet" type="text/css" href="css/main.css" />
<link rel="stylesheet" type="text/css" href="css/room.css" />
<link rel="stylesheet" type="text/css" href="css/outside.css" />
<link rel="stylesheet" type="text/css" href="css/path.css" />
<link rel="stylesheet" type="text/css" href="css/world.css" />
<link rel="stylesheet" type="text/css" href="css/ship.css" />
<link rel="stylesheet" type="text/css" href="css/space.css" />
<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-41314886-1', 'doublespeakgames.com');
ga('send', 'pageview');
</script>
</head>
<body>
<div id="wrapper">
<div id="saveNotify">saved.</div>
<div id="content">
<div id="outerSlider">
<div id="main">
<div id="header"></div>
</div>
</div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/CreativeWork">
<head>
<meta charset="UTF-8"/>
<!--
A Dark Room (v1.4)
==================
A minimalist text adventure by Michael Townsend and all his friends.
Inspired by Candy Box (http://candies.aniwey.net/)
Contribute on GitHub! (https://github.com/doublespeakgames/adarkroom/)
-->
<title>A Dark Room</title>
<meta itemprop="description" name="description" property="og:description" content="A minimalist text adventure">
<meta itemprop="image" property="og:image" content="img/adr.png" />
<meta itemprop="name" property="og:title" content="A Dark Room" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="image_src" href="img/adr.png" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="https://www.dropbox.com/static/api/dropbox-datastores-1.1-latest.js" type="text/javascript"></script>
<script>
if(!window.jQuery) {
document.write('<script src="lib/jquery.min.js"><\/script>')
}
</script>
<script src="lib/jquery.color-2.1.2.min.js"></script>
<script src="lib/jquery.event.move.js"></script>
<script src="lib/jquery.event.swipe.js"></script>
<script src="lib/base64.js"></script>
<script src="lib/translate.js"></script>
<script src="lang/langs.js"></script>
<script>
// try to read "lang" param's from url
var lang = decodeURIComponent((new RegExp('[?|&]lang=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
// if no language requested, try to read it from local storage
if(!lang){
try {
lang = localStorage.lang;
} catch(e) {}
}
// if a language different than english requested, load all translations
if(lang && lang != 'en'){
document.write('<script src="lang/'+lang+'/strings.js"><\/script>');
document.write('<link rel="stylesheet" type="text/css" href="lang/'+lang+'/main.css" \/>');
}
</script>
<script src="script/Button.js"></script>
<script src="script/engine.js"></script>
<script src="script/state_manager.js"></script>
<script src="script/header.js"></script>
<script src="script/notifications.js"></script>
<script src="script/events.js"></script>
<script src="script/dropbox.js"></script>
<script src="script/room.js"></script>
<script src="script/outside.js"></script>
<script src="script/world.js"></script>
<script src="script/path.js"></script>
<script src="script/ship.js"></script>
<script src="script/space.js"></script>
<script src="script/prestige.js"></script>
<script src="script/scoring.js"></script>
<!-- Event modules -->
<script src="script/events/global.js"></script>
<script src="script/events/room.js"></script>
<script src="script/events/outside.js"></script>
<script src="script/events/encounters.js"></script>
<script src="script/events/setpieces.js"></script>
<script type='text/javascript'>
var oldIE = false;
</script>
<!--[if lt IE 9]>
<script type="text/javascript">oldIE = true;</script>
<![endif]-->
<link rel="stylesheet" type="text/css" href="css/main.css" />
<link rel="stylesheet" type="text/css" href="css/room.css" />
<link rel="stylesheet" type="text/css" href="css/outside.css" />
<link rel="stylesheet" type="text/css" href="css/path.css" />
<link rel="stylesheet" type="text/css" href="css/world.css" />
<link rel="stylesheet" type="text/css" href="css/ship.css" />
<link rel="stylesheet" type="text/css" href="css/space.css" />
<script src="script/localization.js"></script>
<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','http://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-41314886-1', 'doublespeakgames.com');
ga('send', 'pageview');
</script>
</head>
<body>
<div id="wrapper">
<div id="saveNotify"><script>document.write(_("saved."));</script></div>
<div id="content">
<div id="outerSlider">
<div id="main">
<div id="header"></div>
</div>
</div>
</div>
</div>
</body>
</html>
+3253
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
[javascript: **.js]
extract_messages = _
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3357
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3392
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3264
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+2413
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3468
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3308
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3173
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3265
View File
File diff suppressed because it is too large Load Diff
+23
View File
@@ -0,0 +1,23 @@
var langs = {
'de':'deutsch',
'el':'ελληνικά',
'en':'english',
'es':'español',
'fr':'français',
'id':'bahasa indonesia',
'it':'italiano',
'ja':'日本語',
'ko':'한국어',
'nb':'norsk',
'pl':'polski',
'pt':'português',
'pt_br':'português (brasil)',
'ru':'русский',
'sv':'svenska',
'th':'ไทย',
'tr':'türkçe',
'uk':'українська',
'vi':'tiếng việt',
'zh_cn':'简体中文',
'zh_tw':'繁體中文'
};
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3185
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+3098
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3217
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
.button .tooltip {width: 120px !important;}
#workers {width: 180px !important;}
#hullRow {width: 90px !important;}
#engineRow {width: 90px !important;}
File diff suppressed because one or more lines are too long
+2962
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+2344
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 120px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
+307
View File
@@ -0,0 +1,307 @@
_.setTranslation({"water tank": "ถังน้ำ", "all":"ทุกอย่าง",
"use meds": "ใช้ยา", "Fire": "ไฟไหม้","a fire rampages through one of the huts, destroying it.":"ไฟไหม้ออกจากห้อง ลุกลามและเผาทำลายกระท่อมหลังหนึ่งในหมู่บ้าน",
"all residents in the hut perished in the fire.": "ทุกคนที่อาศัยในบ้านหลังนั้นเสียชีวิตในเปลวไฟ", "mourn":"ไว้อาลัย", "nothing to take":"ไม่มีอะไรให้เก็บ",
"the room is {0}": "ในห้อง {0}", "take everything":"เก็บทุกอย่าง",
"punch twice as fast, and with even more force": "ต่อยด้วยความรวดเร็วเป็นสองเท่า และรุนแรงมากยิ่งขึ้นไปอีก", "a fire has started": "เกิดไฟไหม้",
"some villagers have died": "ชาวบ้านบางส่วนเสียชีวิตในเปลวไฟ",
"charm": "เครื่องราง", "The Nomad": "ผู้เร่ร่อน",
"more traps won't help now": "มีกับดักมากไปกว่านี้ก็คงไม่ช่วยอะไรแล้ว",
"only a few die.": "มีไม่กี่คนเท่านั้นที่เสียชีวิต", "total": "รวม",
"the compass points east": "เข็มทิศชี้ไปทางตะวันออก",
"the bodies of the wanderers that lived here are still visible in the flames.": "ยังคงเห็นร่างของผู้ดินทางที่อาศัยอยู่ที่นี่ในเปลวไฟ",
"the walls are scorched from an old battle.": "กำแพงถูกเผาทำลาย เป็นสัญลักษณ์ของการต่อสู้ในอดีต","there was a beast. it's dead now": "มีสัตว์ร้ายในป่า เราสังหารมันลงแล้ว",
"convoy": "ผู้คุ้มกัน", "buy medicine": "ซื้อยา",
"not enough fur": "มีขนสัตว์ไม่เพียงพอ",
"a masked soldier rounds the corner, gun drawn": "ทหารใต้หน้ากากปรากฏตัวขึ้นในมุมหนึ่ง ปืนชี้มาตรงหน้า",
"a huge hole is cut deep into the earth, evidence of the past harvest.": "หลุมขนาดใหญ่ตัดลึกลงไปในหน้าดิน ร่องรอยของการเก็บเกี่ยวในครั้งก่อน",
"it puts up little resistance before the knife.": "มันไม่สู้คมมีดมากนัก",
"the body of a wanderer lies in a small cavern.": "ร่างของผู้เดินทางทอดกายอยู่ในโพรงหลุม",
"a shivering man approaches and attacks with surprising strength": "ชายตัวสั่นเทิมโจนเข้ามา และโจมตีด้วยความรุนแรงอย่างไม่น่าเชื่อ",
"steel's stronger than iron": "เหล็กกล้าแข็งแกร่งกว่าเหล็กทั่ว ๆ ไป",
"A Strange Bird": "นกประหลาด",
"not enough alien alloy": "มีโลหะต่างดาวไม่เพียงพอ", "not enough wood": "มีไม้ไม่เพียงพอ", "street above the subway platform is blown away.": "พื้นถนนเหนือทางรถไฟใต้ดึงถูกระเบิดออกไป",
"the soldier is dead": "ทหารเสียชีวิต",
"error while saving to dropbox datastorage": "มีอะไรบางอย่างผิดพลาดกับการเก็บข้อมูลใน dropbox",
"the footsteps stop.": "เสียงฝีเท้าสงบลง",
"sniper": "พลซุ่มยิง",
"the coal mine is clear of dangers": "เหมืองถ่านหินปลอดภัยสำหรับคนงานแล้ว",
"the warped man lies dead.": "คนวิปริตได้ตายลงแล้ว",
"something's in the store room": "มีอะไรบางอย่างอยู่ในห้องเก็บของ",
"unfathomable destruction to fuel wanderer hungers.": "การทำลายอย่างไม่สิ้นสุดที่เต็มเห็นความกระหายหยากของผู้เดินทาง",
"embark": "ออกเดินทาง", "scout": "ผู้สำรวจ", "facebook": "facebook",
"the trees yield to dry grass. the yellowed brush rustles in the wind.": "ต้นไม้หายไปจากบริเวณ เหลือแต่ผืนหญ้าแห้ง พุ่มไม้สีเหลืองเสียดสีกันเองตามสายลม",
"save.": "save.", "total score: {0}": "คะแนนรวม: {0}",
"learned to make the most of food": "เรียนรู้การกินอาหารอย่างคุ้มค่า",
"blast": "ยิงลำแสง",
"the sky is grey and the wind blows relentlessly": "ท้องฟ้าเป็นสีเทา ลมพัดกระหน่ำแรง",
"supplies:": "เสบียง:", "the feral terror is dead": "อสูรจรจัดถูกสังหาร",
"the tracks disappear after just a few minutes.": "รอยเท้าหายไปหลังจากตามได้ไม่นานนัก",
"a safe place in the wilds.": "ที่หลบภัยกลางถิ่นกันดาร", "fur": "ขนสัตว์",
"beneath the wanderer's rags, clutched in one of its many hands, a glint of steel.": "มีประกายแสงของโลหะอยู่ใต้ผ้าคลุม มันถูกกอดกุมเอาไว้โดยมือทั้งหลายของผู้เดินทาง",
"buy scales": "ซื้อเกล็ดประหลาด", "mild": "เริ่มอุ่น",
"the hunting lodge stands in the forest, a ways out of town": "ซุ้มพรานถูกสร้างขึ้น ไกลออกไปจากตัวเมือง",
"leave": "ออก", "the convoy can haul mostly everything": "ผู้คุ้มกันสามารถช่วยขนของได้แทบทุกอย่าง",
"learned to strike faster without weapons": "เรียนรู้ที่จะจู่โจมได้เร็วขึ้นโดยไม่ใช้อาวุธ",
"an old house remains here, once white siding yellowed and peeling.": "บ้านหลังเก่ากรุตั้งอยู่ที่นี่ สภาพทรุดโทรมเกินบูรณะ",
"ignore them": "เพิกเฉยเสีย",
"willing to talk about it, for a price.": "ยินที่ที่จะพูดคุยเรื่องดังกล่าว ด้วยราคาที่สมเหตุสมผล",
"a beast, wilder than imagining, erupts out of the foliage": "สัตว์อสูรหน้าตาผิดเพี้ยนเกินจินตนาการโจนตัวออกมาจากสุมทุมพุ่มไม้",
"go home": "กลับบ้าน", "the soldier steps out from between the buildings, rifle raised.": "ทหารก้าวเท้าออกมาจากตรอก ยกปืนขึ้นประทับบ่า",
"force": "พลัง", "the rickety cart will carry more wood from the forest": "รถเข็นจะช่วยให้เก็บไม้จากป่าได้มากขึ้น",
"a ragged stranger stumbles through the door and collapses in the corner": "คนแปลกหน้าในเศษผ้าคลุมเก่า ๆ เดินเข้ามาทางประตูและล้มลงตรงมุมห้อง",
"not enough leather": "มีหนังฟอกไม่เพียงพอ", "the fight is short and bloody, but the beasts are repelled.": "การต่อสู้เป็นไปอย่างรวดเร็วและดุเดือด สัตว์ประหลาดถูกขับไล่ไปได้", "the wood is running out": "ไม้ฟืนเริ่มเหลือน้อยลงเต็มที่", "restart.": "restart.",
"rot's been to work on it, and some of the pieces are missing.": "ดูเหมือนมันจะเริ่มผุพัง และมีหลายชิ้นส่วนที่ยังขาดหายไป",
"workshop's finally ready. builder's excited to get to it": "โรงงานถูกตั้งขึ้นในที่สุด ผู้สร้างดูจะดีใจกว่าใครเพื่อนเป็นพิเศษ",
"a trading post would make commerce easier": "ท่าสินค้าจะทำให้การซื้อขายงายขึ้นมาก", "not enough steel": "มีเหล็กกล้าไม่พอ",
"perks:": "ความสามารถพิเศษ:", "the torch goes out": "คบไฟมอดลง", "saved.": "saved.",
"after a skirmish they are driven away, but not without losses.": "หลังจากการปะทะ พวกมันก็ถูกขับไล่ออกไป แต่ก็ด้วยราคาที่เจ็บปวด",
"the military is already set up at the mine's entrance.": "ดูเหมือนว่ากองทหารได้ตั้งค่ายอยู่หน้าเหมืองมาสักพักแล้ว",
"tannery goes up quick, on the edge of the village": "โรงฟอกหนังถูกตั้งไว้ที่ปลายของหมู่บ้าน",
"learned to fight quite effectively without weapons": "เรียนรู้ที่จะต่อสู้เมื่อไม่มีอาวุธ",
"charred bodies litter the ground.": "ซากศพไหม้เกรียมกระจัดกระจายตามพื้น",
"someone throws a stone.": "มีใครบางคนโยนก้อนหินมา",
"leaves a pile of small teeth behind.": "ทิ้งกองเขี้ยวประหลาดเอาไว้",
"leave city": "ออกจากเมือง", "not enough scales": "มีเกล็ดไม่เพียงพอ",
"someone has locked and barricaded the door to this operating theatre.": "ใครบางคนได้ลั่นกลอนและตั้งเครื่องกีดขวางอยู่ทั่วโรงละคร",
"leave cave": "ออกจากถ้ำ", "hp: {0}/{1}": "hp: {0}/{1}",
"a lone frog sits in the muck, silently.": "กบตัวใหญ่นั่งอยู่ในตมเงียบ ๆ ",
"the steel is strong, and the blade true.": "โลหะแข็งแรงดี และใบดาบก็คมกริบ",
"a shame to let what he'd found go to waste.": "คงไม่ดีถ้าจะให้ของที่เขาอุตส่าห์เหลือไว้มาทิ้งไว้เสียเปล่า",
"learned how to ignore the hunger": "เรียนรู้ที่จะเพิกเฉยต่อความหิวโหย",
"punch": "ชก", "water": "น้ำ", "desert rat": "ชาวทะเลทราย", "explore": "สำรวจ",
"a pack of snarling beasts pours out of the trees.": "ฝูงสัตว์ร้ายโถมออกมาจากต้นไม้รอบ ๆ ",
"punches do even more damage.": "กำปั้นสร้างความเสียหายให้กับศัตรูมากยิ่งขึ้น", "roaring": "ลุกโชติช่วง", "gatherer": "คนเก็บฟืน",
"the people back away, avoiding eye contact.": "ผู้คนค่อย ๆ ถอยออกไป พยายามหลบสายตา",
"A Huge Borehole": "หลุมอุกกาบาตยักษ์",
"a bundle of sticks lies just beyond the threshold, wrapped in coarse furs.": "มีกิ่งไม้วางอยู่ที่เชิงประตู พันไว้ด้วยขนสัตว์",
"builder says she could make finer things, if she had the tools": "ผู้สร้างบอกว่าเธอสามารถสร้างของที่ประณีตกว่านี้ก็ได้ ถ้าเธอมีอุปกรณ์ครบ",
"soldier": "ทหาร", "learn scouting": "เรียนรู้วิชาสำรวจ", "share.": "share.", "choose one slot to save to": "เลือกช่องที่ต้องการบันทึก.",
"A Murky Swamp": "บึง", "iron sword": "ดาบเหล็ก", "builder says she can make traps to catch any creatures might still be alive out there": "ผู้สร้างบอกว่าเธอน่าจะประกอบกับดักง่าย ๆ ไว้จับสัตว์ที่อาจจะอยู่ข้างนอกนั่นได้",
"the grasses thin. soon, only dust remains.": "หญ้าเริ่มบางลงจากบริเวณ เหลือเพียงแต่ฝุ่นทราย",
"a shot rings out, from somewhere in the long grass": "เสียงปืนดังขึ้นจากบางแห่งในพงหญ้า",
"a wall of gnarled trees rises from the dust. their branches twist into a skeletal canopy overhead.": "ถึงชายป่า ต้นไม้บิดเบี้ยวแทงขึ้นมาจากพื้นฝุ่น กิ่งใบประกอบกันเหมือนซี่โครงน่าขยะแขยง", "gather wood": "เก็บไม้",
"with a little effort, it might fly again.": "คงต้องทุ่มแรงนิดหน่อยถ้าจะให้มันบินขึ้นอีกครั้ง",
"A Scavenger": "คนเก็บขยะ", "picking the bones finds some useful trinkets.": "เจอของเล็ก ๆ น้อย ๆ ที่น่าจะเอามาใช้งานได้ในโครงกระดูก",
"the shell of an abandoned hospital looms ahead.": "ศากโรงพยาบาลร้างอยู่ตรงหน้า",
"the villagers hang the thief high in front of the store room.": "ชาวบ้านแขวนคอพวกโจรเหนือขื่อห้องเก้บของ",
"eye for an eye seems fair.": "ตาต่อตา ฟันต่อฟัน คงจะยุติธรรมที่สุดแล้ว", "an old man bursts through a door, wielding a scalpel.": "ชายชราโจนออกมาจากประตู ในมือถือมีดผ่าตัด", "1 medicine": "1 ยารักษา", "the small military outpost is well supplied.": "ป้อมทหารเล็ก ๆ ดูเหมือนจะมีจุเสบียงไว้เต็มที่",
"the clinic has been ransacked.": "คลินิกถูกรื้อค้นจนทั่ว", "drop:": "drop:",
"leaves some scraps of cloth behind.": "ทิ้งเศษผ้าเอาไว้เล็กน้อย", "are you sure?": "คุณแน่ใจหรือไม่?",
"charcutier": "คนตากเนื้อ", "a military perimeter is set up around the mine.": "ค่ายทหารถูกสร้างขึ้น ล้อมรอบด้วยกับระเบิด",
"trading post": "ท่าสินค้า", "a wanderer arrives with an empty cart. says if she leaves with furs, she'll be back with more.": "ผู้เดินทางมาเยี่ยมเยือนพร้อมกับรถเข็น เธอบอกว่าถ้าเธอมีขนสัตว์ให้ยืมสักหน่อย เธอจะเอากลับมาคืนด้วยจำนวนที่มากขึ้น", "in exchange, the wanderer offers his wisdom.": "เพื่อเป็นการแลกเปลี่ยน ผู้เดินทางเสนอความรู้ของเขาเป็นการตอบแทน", "sulphur miner": "เหมืองกำมะถัน",
"a small basket of food is hidden under a park bench, with a note attached.": "ตะกร้าอาหารถูกซ่อนอยู่ใต้เก้าอี้ในสวนสาธารณะ พร้อมกับข้อความสั้น ๆ", "warm": "อุ่น", "the sound of gunfire carries on the wind.": "เสียงยิงปืนดังขึ้นมาตามสายลม", "stoke fire": "เติมฟืน", "lift off": "ปล่อยยาน",
"shoot": "ยิงปืน", "none": "ไม่มี", "leave town": "ออกจากเมือง", "most of the windows at ground level are busted anyway.": "หน้าต่างชั้นล่างถูกพังออกมา",
"a strange looking bird speeds across the plains": "นกหน้าตาประหลาดโฉบมาตามทุ่งราบ", "linger": "รออยู่ต่อ", "take": "เก็บ", "connect game to dropbox local storage": "เชื่อมต่อเกมเข้ากับ dropbox", "strange bird": "นกประหลาด", "if the code is invalid, all data will be lost.": "ถ้าใส่รหัสผิดพลาด ข้อมูลทั้งหมดจะหลายไป", "A Feral Terror": "อสูรจรจัด", "can't see what's inside.": "มองไม่เห็นว่าข้างในมีอะไร", "a large beast charges out of the dark": "สัตว์ตัวใหญ่โจนออกมาจากความมืด", "salvage": "รื้อของ", "grenade": "ระเบิดมือ",
"the stranger in the corner stops shivering. her breathing calms.": "คนแปลกหน้าที่มุมห้องหยุดสั่นลง เธอเริ่มหายใจอย่างสงบ",
"a small suburb lays ahead, empty houses scorched and peeling.": "หมู่บ้านชานเมืองเล็ก ๆ อยู่ตรงหน้า มีร่องรอยของการถูกเผาและทำลาย",
"a wanderer arrives with an empty cart. says if he leaves with wood, he'll be back with more.": "ผู้เดินทางมาเยี่ยมเยือนพร้อมกับรถเข็น เขาบอกว่าถ้าเขามีไม้ให้ยืมสักหน่อย เขาจะเอากลับมาคืนด้วยจำนวนที่มากขึ้น", "gaunt man": "คนผอมแห้ง",
"a squat building up ahead.": "มีอาคารขนาดย่อม ๆ อยู่ข้างหน้า",
"a thug moves out of the shadows.": "นักเลงโผล่ออกมาจากเงามืด", "An Outpost": "ค่าย",
"there's not much, but some useful things can still be found.": "พบของมีประโยชน์บางอย่าง แม้จะไม่มากนักก็ตาม", " and ": " และ ",
"an improvised shop is set up on the sidewalk.": "เพิงร้านค้าเล็ก ๆ ถูกตั้งขึ้นข้างทาง", "cured meat": "เนื้อแห้ง",
"builder puts up a hut, out in the forest. says word will get around.": "ผู้สร้างตั้งกระท่อมเล็ก ๆ ที่ชายป่า เธอบอกว่าข่าวเรื่องที่พักจะกระจายออกไป",
"learned how not to be seen": "เรียนรู้ที่จะไม่ถูกมองเห็น", "punches do more damage": "หมัดสร้างความเสียหายมากขึน",
"some traps have been destroyed": "กับดักบางส่วนถูกทำลาย", "castoff from the mammoth drills can still be found by the edges of the precipice.": "พบชิ้นโลหะประหลาดในกระบอกสว่านขนาดใหญ่", "well armed men charge out of the forest, firing into the crowd.": "กลุ่มคนติดอาวุธอย่างดีระดมเข้ามาจากทางป่าและยิงเข้ามา", "deep in the swamp is a moss-covered cabin.": "ลึกเข้าไปในบึง กระท่อมเล็ก ๆ ตั้งอยู่โดดเดี่ยว",
"app store.": "app store.", "An Old Starship": "ยานอวกาศเก่า", "ignore it": "เพิกเฉยเสีย", "hot": "ร้อน",
"upgrade engine": "เสริมเครื่องยนต์", "forest": "ป่า", "give 500": "ให้ไป 500", "A Dark Room": "ห้องมืด", "a battle was fought here, long ago.": "มีการต่อสู้ในบริเวณนี้เมื่อนานมาแล้ว", "builder says leather could be useful. says the villagers could make it.": "ผู้สร้างบอกว่าหนังฟอกน่าจะมีประโยชน์ พวกชาวบ้านน่าจะทำกันได้", "craft:": "สร้าง:", "Iron&nbsp;Mine": "เหมืองเหล็ก", "coal mine": "เหมืองถ่านหิน", "bits of meat": "เศษเนื้อ","safer here.":"ทีนี่ปลอดภัยดี",
"scavengers must have gotten to this place already.": "พวกเก็บซากคงเข้ามารื้อที่นี่ไปแล้ว",
"the remains of an old camp sits just inside the cave.": "มีเศษซากของค่ายพักแรมเก่า ๆ ในถ้ำ", "The&nbsp;Village": "หมู่บ้าน", "snarling beast": "สัตว์ร้าย", "soldiers patrol the perimeter, rifles slung over their shoulders.": "ทหารลาดตระเวนอยู่ในบริเวณนี้ ปืนยาวสะพายพาดบ่า",
"a swarm of rats rushes up the tunnel.": "ฝูงของหนูโจนเข้ามาจากโพรง",
"faces, darkened by soot and blood, stare out from crooked huts.": "ใบหน้าที่เปื้อนคราบเลือดและดินโคลนมองออกมาจากกระท่อม",
"strange noises can be heard through the walls": "เสียงประหลาดลอดผ่านเข้ามาทางกำแพง", "coal": "ถ่านหิน",
"Stratosphere": "Stratosphere", "man-eater": "อสูรกินคน", "can't tell what they're up to.": "ไม่รู้เหมือนกันว่าพวกนั้นต้องการอะไร",
"enter": "เข้าไป", "a destroyed village lies in the dust.": "หมู่บ้านที่ถูกเผาทำลายจมลงในกองเถ้า", "Ship": "ยาน",
"better avoid conflict in the wild": "คงจะต้องหลีกเลี่ยงการต่อสู้ในป่า", "talk": "พูดคุย", "another beast, draw by the noise, leaps out of a copse of trees.": "สัตว์ป่าอีกตัวที่ถูกดึงดูดมาด้วยเสียง โจนออกมาจากโคนต้นไม้", "A Soldier": "ทหาร",
"the man expresses his thanks and hobbles off.": "ชายคนนั้นแสดงท่าทางขอบคุณก่อนจะเดินกะโผลกกะเผลกออกไป",
"battered technology from both sides lays dormant on the blasted landscape.": "อาวุธผุพังจากทั้งสองฝ่ายวางอยู่นิ่ง ๆ บนผืนดินแห้งกร้าว",
"the villagers haul a filthy man out of the store room.": "ชาวบ้านขนชายท่าทางสกปรกออกมาจากห้องเก็บของ", "strips of meat are hung up to dry in this ward.": "แผ่นเนื้อจะถูกตากไว้ที่นี่", "the familiar curves of a wanderer vessel rise up out of the dust and ash. ": "ยานหน้าตาคุ้นเคยของผู้เดินทางผุดขึ้นมาจากกองเถ้าและฝุ่น", "all the work of a previous generation is here.": "การก่อสร้างของรุ่นก่อน ๆ นั้นอยู่ที่นี่", "cold": "หนาวเย็น", "the iron mine is clear of dangers": "เหมืองเหล็กปลอดภัยแล้ว", "the military presence has been cleared.": "กองทหารถูกเก็บกวาดจากบริเวณ", "A&nbsp;Crashed&nbsp;Starship": "ซากยานอวกาศ", "the fire is {0}": "ไฟ {0}", "A Lonely Hut": "กระท่อมเดียวดาย", "buy teeth": "ซื้อเขี้ยว",
"a small supply cache is hidden at the back of the cave.": "กล่องเก็บของเล็ก ๆ ถูกซ่อนไว้ที่ปลายถ้ำ",
"iron's stronger than leather": "เหล็กทนทานกว่าหนังสัตว์", "bedrolls, torn and blackened, lay beneath a thin layer of dust.": "มีถุงนอนฉีกขาดและไหม้เกรียม วางอยู่ใต้ชั้นบาง ๆ ของฝุ่น", "dodge attacks more effectively": "หลบการโจมตีได้ดีขั้น", "hull: ": "เกราะหุ้ม:",
"a madman attacks, screeching.": "ชายคุ้มคลั่งโจนเข้ามาโจมตี กรีดร้องเสียงดัง", "thieves": "โจร",
"the towers that haven't crumbled jut from the landscape like the ribcage of some ancient beast.": "หอคอยที่ไม่ได้ล้มลง สร้างภาพทิวทัศน์เหมือนซี่โครงของสัตว์ยักษ์โบราณ", "lights off.": "lights off.", "someone had been stockpiling loot here.": "ใครบางคนเอาสมบัติของตนมาเก็บไว้ที่นี่",
"learned to look ahead": "เรียนรู้ที่จะมองให้ไกลออกไป", "the mine is now safe for workers.": "เหมืองปลอดภัยสำหรับคนงานแล้ว",
"Coal&nbsp;Mine": "เหมืองถ่าน", "empty corridors.": "ระเบียงว่างเปล่า", "save to slot": "ช่องบันทึก",
"the owner stands by, stoic.": "เจ้าของที่ยืนอยู่นิ่ง ๆ อย่างสุขุม", "hunter": "พราน", "strips of meat hang drying by the side of the street.": "แผ่นเนื้อถูกวางตากไว้ข้างทางเดิน", "more squatters are crowding around now.": "คนจรจัดเริ่มรวมตัวกันมารอบ ๆ ",
"some weird glowing boxes he picked up on his travels.": "กล่องเรื่องแสงหน้าตาประหลาดที่เขาเก้บมาได้ระหว่างเดินทาง",
"a panicked scavenger bursts through the door, screaming.": "คนเก็บเศษซากโจนเข้ามาจากประตู กรีดร้องเสียงดัง", "give 50": "ให้ไป 50",
"wagon": "เกวียน", "An&nbsp;Old&nbsp;House": "บ้านเก่า", "a soldier, alerted, opens fire.": "ทหารรู้สึกถึงผู้บุกรุก ทาบปืนพร้อมยิงทันที",
"meat": "เนื้อ", "the tunnel opens up at another platform.": "โพรงเปิดขึ้นมาจากอีกเพิงหนึ่ง", "a terrible plague is fast spreading through the village.": "โรคระบาดกระจายไปอย่างรวดเร็วทั่วหมู่บ้าน", "the gaunt man is dead": "ชายผอมแห้งเสียชีวิต", "bone spear": "หอกกระดูก", "trap": "กับดัก",
"the street ahead glows with firelight.": "ถนนตรงหน้าสว่างไสวไปด้วยเปลวไฟ", "armourer": "ช่างอาวุธ",
"a large shanty town sprawls across the streets.": "เมืองสลัมขนาดใหญ่แผ่ไปทั่วถนน",
"the shell of a burned out car blocks the entrance.": "โครงของซากรถไม้ ๆ ปิดทางเข้าเอาไว้",
"a small group arrives, all dust and bones.": "กลุ่มคนเล็ก ๆ เดินทางมาถึง ผอมแห้งหิวโซ", "A&nbsp;Ruined&nbsp;City": "ซากเมือง",
"weight": "น้ำหนัก", "torch": "คบไฟ", "The Thief": "โจร", "not enough cloth": "มีเศษผ้าไม่เพียงพอ",
"a youth lashes out with a tree branch.": "เด็กหนุ่มคนหนึ่งโจนออกมาพร้อมกิ่งไม้",
"the rest of the hospital is empty.": "ที่อื่น ๆ ในโรงพยาบาลนั้นว่างเปล่า", "connect": "เชื่อมต่อ",
"learned to be where they're not": "เรียนรู้ที่จะหลบหลีกอันตราย", "go twice as far without eating": "เดินทางได้ไกลขึ้นโดยไม่กินอาหาร",
"scavenger'd been looking for supplies in here, it seems.": "ดูเหมือนพวกเก็บซากขยะจะเคยเข้ามาหาของที่นี่",
"there's nothing else here.": "ไม่มีอะไรอยู่เลย", "the plague is kept from spreading.": "โรคระบาดถูกหยุดไว้ได้",
"the cask holds enough water for longer expeditions": "กระบอกน้ำเก็บน้ำไว้ได้สำหรับการเดินทางระยะยาว",
"check traps": "ตรวจดูกับดัก", "Plague": "โรคระบาด", "medicine": "ยา", "the old man had a small cache of interesting items.": "ชายแก่มีของที่น่าสนใจติดตัวมาด้วย", "tannery": "โรงฟอกหนัง", "lob": "ขว้างระเบิด", "no more room for huts.": "ไม่มีที่สำหรับกระท่อมแล้ว", "a plague afflicts the village":"เกิดโรคร้ายขึ้นในหมู่บ้าน",
"they took what they came for, and left.": "พวกมันมาเอาของที่พวกมันมองหา แล้วก็จากไป",
"through the large gymnasium doors, footsteps can be heard.": "ได้ยินเสียงฝีเท้าผ่านประตูของโรงยิม","epidemic is eradicated eventually":"โรคร้ายได้หยุดลงในที่สุด",
"a large creature attacks, claws freshly bloodied": "สัตว์ประหลาดขนาดใหญ่เข้ามาโจมตี กรงเล็บของมันยังคงเปื้อนเลือดสด ๆ อยู่",
"a green cross barely visible behind grimy windows.": "มองผ่านหน้าต่างเปรอะฝุ่น มองเห็นเพียงกางเขนสีเขียวจาง ๆ ",
"a sick man hobbles up": "ชายทางทางป่วยกระเพลกเข้ามา", "An&nbsp;Abandoned&nbsp;Town": "เมืองร้าง", "cart": "รถเข็น",
"might be things worth having still inside.": "อาจจะยังมีของมีค่าอยู่ข้างใน", "the wood has run out": "ฟืนเริ่มเหลือน้อยเต้มที่",
"The Master": "ผู้สั่งสอน", "thrust": "เสียบ", "water replenished": "น้ำถูกเติมจนเต็ม", "a soldier opens fire from across the desert": "ทหารยิงปืนเข้ามาใส่จากอีกฟากของเนินทราย", "go twice as far without drinking": "เดินทางได้ไกลขึ้นโดยไม่ดื่มน้ำ",
"the tentacular horror is defeated.": "ปราบสัตว์ประหลาดหนวดยาวลงได้", "an overturned caravan is spread across the pockmarked street.": "คาราวานสินค้าคว่ำลงบนถนน", "the villagers retreat to mourn the dead.": "ชาวบ้านล่าถอยกลับมาเพื่อทำพิธีให้กับผู้ตาย",
"A Modest Village": "หมู่บ้านทั่วไป", "A Damp Cave": "ถ้ำชื้นแฉะ", "swing": "ฟาด", "alien alloy": "โลหะต่างดาว", "export or import save data, for backing up": "ส่งหรือรับข้อมูลเกม สำหรับการเก็บรักษา", "smokehouse": "โรงรมเนื้อ", "vague shapes move, just out of sight.": "ร่างราง ๆ เคลื่อนไหวออกไปจากสายตา", "Wanderer": "ผู้เดินทาง", "the earth here is split, as if bearing an ancient wound": "แผ่นดินตรงนี้แยกออก ราวกับว่าเป็นแผลเปิดจากกาลก่อน", "the compass points southeast": "เข็มทิศชี้ไปยังตะวันออกเฉียงใต้", "barbarian": "คนเถื่อน", "the wanderer leaves, cart loaded with furs": "ผู้เดินทางจากไปด้วยรถเข็มที่เต็มไปด้วยขนสัตว์", "there are still supplies inside.": "ยังมีของบางอย่างหลงเหลืออยู่ข้างใน", "traps are more effective with bait.": "กับดักจะมีผลลัพท์ดียิ่งขึ้นเมื่อมีเหยื่อล่อ", "rusted chainlink is pulled across an alleyway.": "โซ่เกรอสนิมถูกลากผ่านตรอกทางเดิน", "a sickness is spreading through the village.": "โรคประหลาดเริ่มแพร่ไปในหมู่บ้าน", "tangle": "รวบตัว", "miss": "พลาดเป้า",
"the meat has run out": "ไม่มีเนื้อเหลืออยู่แล้ว",
"a beast charges out of a ransacked classroom.": "สัตว์ป่าโจนออกมาจากห้องเรียน",
"lucky that the natives can't work the mechanisms.": "โชคดีที่พวกพื้นเมืองไม่สามารถใช้เครื่องยนต์กลไกเหล่านี้ได้", "A&nbsp;Murky&nbsp;Swamp": "บึง",
"just as deadly now as they were then.": "อันตรายเหมือนอย่างที่เคยเป็นเมื่อก่อน", "builder just shivers": "ผู้สร้างเริ่มรู้สึกเย็น", "a second soldier joins the fight.": "ทหารคนที่สองเข้ามาเสริมกำลัง", "attack": "โจมตี", "go inside": "เข้าไปข้างใน",
"turn her away": "ไล่เธอไป", "dropbox.": "dropbox.", "reinforce hull": "เสริมเกราะหุ้ม", "not enough wood to get the fire going": "มีไม้ไม่พอสำหรับต่อไฟ",
"a stranger arrives in the night": "คนแปลกหน้าเข้ามาอาศัยในเวลาค่ำ", "hut": "กระท่อม", "trapper": "ผู้ดักสัตว์", "a battered highway sign stands guard at the entrance to this once-great city.": "ป้ายบอกทางตั้งตระหง่านอยู่หน้าเมืองใหญ่ที่เคยรุ่งเรืองแห่งนี้", "rifle": "ปืนยาว", "sulphur": "กำมะถัน", "steel": "เหล็กกล้า",
"the stranger is standing by the fire. she says she can help. says she builds things.": "หญิงสาวแปลกหน้านั่งอยู่ข้างกองไฟ เธอบอกว่าเธอสามารถช่วยสร้างสิ่งต่าง ๆ ได้",
"the sickness is cured in time.": "โรคร้ายได้รับการรักษาทันเวลา",
"the only hope is a quick death.": "ความหวังเดียวคือการตายอย่างไม่ทรมาน",
"score for this game: {0}": "คะแนนในรอบนี้: {0}", "the lizard is dead": "กิ้งกาถูกสังหาร", "iron": "เหล็ก", "fires burn in the courtyard beyond.": "ไฟลุกท่วมในสนามตรงหน้า", "builder": "ผู้สร้าง",
"a large creature lunges, muscles rippling in the torchlight": "สัตว์ร้ายตัวใหญ่โจนออกมา กล้ามเนื้อและผิวหนังของมันสะท้อนแสงจากคบไฟ", "something's causing a commotion a ways down the road.": "มีเสียงดังเอะอะมาจากฝั่งหนึ่งของถนน", "the stranger shivers, and mumbles quietly. her words are unintelligible.": "หญิงแปลกหน้าตัวสั่นเทิม กระซิบกระซาบอะไรบางอย่างไม่เป็นภาษา", "A Firelit Room": "ห้องแสงไฟ",
"some wood is missing.": "ไม้บางส่วนหายไป", "The Beggar": "ขอทาน", "Troposphere": "Troposphere", "ripe for the picking.": "พร้อมให้เก็บเกี่ยว", "A&nbsp;Destroyed&nbsp;Village": "ซากหมู่บ้าน", "coal miner": "เหมืองถ่าน", "not enough teeth": "มีเขี้ยวไม่เพียงพอ", "all he has are some scales.": "เชามีเพียงแค่เกล็ดประหลาดติดตัวเท่านั้น",
"learned to predict their movement": "เรียนรู้ที่จะคาดการณ์การเคลื่อนไหวศัตรูล่วงหน้า",
"the nights are rent with screams.": "คำคืนนั้นเต็มไปด้วยเสียงร้องโหยหวน", "the scavenger is dead": "คนเก็บขยะถูกสังหาร", "a nomad shuffles into view, laden with makeshift bags bound with rough twine.": "ผู้เร่ร่อนเดินทางมายังที่พักพร้อมกับถุงหนังขนาดใหญ่มัดด้วยเชือกหยาบ ๆ ",
"a convoy lurches in, equal parts worry and hope.": "ผู้คุ้มกันโจนเข้ามาอย่างกล้า ๆ กลัว ๆ", "the map uncovers a bit of the world": "แผนที่เปิดเผยบางส่วนของดินแดน",
"the shot echoes in the empty street.": "เสียงปืนดังลั่นขึ้นบนถนนร้าง", "the sounds stop.": "เสียงนั้นหยุดลง", "rucksack": "ถุงหนัง", "the towers of a decaying city dominate the skyline": "ตึกสูงของเมืองที่ผุพังปรากฏขึ้นที่ขอบฟ้า",
"lights on.": "lights on.",
"a torch to keep the dark away": "คบไฟใช้ขับไล่ความมืด",
"some good stuff woven into its nest.": "มีของดีหลาย ๆ อย่างพันเกี่ยวเป็นรังของมันขึ้นมา", "starvation sets in": "ความหิวโหยเริ่มคุกคามเข้ามา",
"the sniper is dead": "สังหารพลซุ่มยิงสำเร็จ", "nothing": "ไม่มีอะไร",
"say his folk have been skimming the supplies.": "บอกว่าคนของเขากำลังพยายามหาเครื่องใช้และเสบียง", "Restart?": "เริ่มเกมใหม่?", "this is irreversible.": "การกระทำนี้ไม่สามารถย้อนกลับได้",
"the town's booming. word does get around.": "เมืองเริ่มคึกคักขึ้นมาก ผู้คนบอกกันปากต่อปากถึงเมืองนี้", "Dropbox connection": "เชื่อมต่อกับ Dropbox",
"arms and munitions, relics from the war, are neatly arranged on the store-room floor.": "อาวุธยุทโธปกรณ์สำหรับสงคราม ถูกวางอย่างประณีตในห้องเก็บของ",
"iron miner": "เหมืองเหล็ก", "give 100": "ให้ไป 100",
"Export": "Export", "the operating theatre has a lot of curious equipment.": "โรงละครมีของหลายอย่างที่น่าสนใจอย่างมาก", "A Sniper": "พลซุ่มยิง",
"the mysterious wanderer returns, cart piled high with wood.": "ผู้เดินทางลึกลับกลับมาที่นี่ รถเข็นพูนสูงไปด้วยไม้", "a snarling beast jumps out from behind a car.": "สัตว์ร้ายกระโดดออกมาจากหลังซากรถ", "precise": "ความแม่นยำ",
"looks like a camp of sorts up ahead.": "ดูเหมือนจะมีค่ายอะไรสักอย่างข้างหน้า", "bait": "เหยื่อล่อ", "The Sulphur Mine": "เหมืองกำมะถัน", "stunned": "มึนงง",
"a thief is caught": "โจรถูกจับไว้ได้", "a beggar arrives.": "ขอทานเดินทางมายังที่พัก",
"the strange bird is dead": "สังหารนกประหลาด", "*** EVENT ***": "*** เหตุการณ์พิเศษ ***", "the grass thrashes wildly as a huge lizard pushes through": "พงหญ้าเหวี่ยงไปมาอย่างรวดเร็วเมื่อกิ้งก่ายักษ์โจนออกมา", "medicine is needed immediately.": "ต้องการยาอย่างเร่งด่วน", "A Crashed Ship": "ซากยาน",
"the town lies abandoned, its citizens long dead": "เมืองถูกทิ้งร้าง ประชากรคงเสียชีวิตกันหมดแล้ว", "give 1 medicine": "ให้ยาไป 1",
"the old compass is dented and dusty, but it looks to work.": "เข็มทิศเก่ามีหน้าปัดเบี้ยวและขึ้นสนิม แต่ยังดูเหมือนจะใช้งานได้อยู่", "wood": "ไม้",
"A Forgotten Battlefield": "สนามรบที่ถูกลืม",
"the trees are gone. parched earth and blowing dust are poor replacements.": "ต้นไม้หายไปจากสายตา พื้นดินแห้งผากและลมพัดแรงเข้ามาแทนที่",
"lodge": "ซุ้มพราน", "the debris is denser here.": "ซากปรักหักพังเริ่มกีดขวางทางมากขึ้นในบริเวณนี้", "a scout stops for the night": "ผู้สำรวจแวะมาพักที่นี่", "a gunshot rings through the trees.": "เสียงปืนลังลั่นทั่วท้องถนน",
"pop ": "ประชากร ", "somewhere above the debris cloud, the wanderer fleet hovers. been on this rock too long.": "บนท้องฟ้า ยานลำหนึ่งของผู้เดินทางลอยขึ้นไป ดูเหมือนเราจะอยู่บนหินโง่ ๆ นี่นานไปเสียแล้ว", "iron mine": "เหมืองเหล็ก", "freezing": "หนาวเหน็บ",
"the world fades": "สิ่งรอบ ๆ ตัวเริ่มจางลงช้า ๆ", "some of the traps have been torn apart.": "กับดักส่วนหนึ่งถูกทำลาย", "not enough iron": "มีเหล็กไม่พอ",
"compass": "เข็มทิศ", "successfully saved to dropbox datastorage": "บันทึกลงใน dropbox สำเร็จ",
"builder says it'd be useful to have a steady source of bullets": "ผู้สร้างบอกว่าถ้าเราสามารถผลิตกระสุนได้เองก็คงจะดี", "a mysterious wanderer arrives": "ผู้เดินทางลึกลับปรากฏตัวขึ้น", "An Old House": "บ้านเก่า ๆ",
"bleached bones are strewn about the entrance. many, deeply scored with jagged grooves.": "โครงกระดูกกองเรี่ยรายหน้าทางเข้า บางชิ้นมีร่องรอยของการขูดขีดอย่างชัดเจน",
"as soon as the door is open a little bit, hundreds of tentacles erupt.": "เมื่อเปิดประตูออก หนวดประหลาดก็พุ่งส่วนออกมาทันที", "leather": "หนังฟอก",
"a sound comes from the tunnel, just ahead.": "มีเสียงอะไรบางอย่างดังมาจากข้างในของโพรง",
"investigate": "ตรวจดู", "the cave narrows a few feet in.": "ถ้ำเริ่มแคบลงเมื่อเดินลึกเข้าไป", "sword is sharp. good protection out in the wilds.": "ดาบมีคม เหมาะสำหรับการป้องกันตัวในป่า", "orange traffic cones are set across the street, faded and cracked.": "มีกรวยจลาจรอู่ข้างถนน สีของมันเลือนไปเกือบหมด",
"a large man attacks, waving a bayonet.": "ชายร่างใหญ่เข้ามาโจมตี เหวี่ยงดาบปลายปืนไปมา",
"the air is filled with dust, driven relentlessly by the hard winds.": "ละอองฝุ่งปนเปื้อนในอากาศ พัดไหวไปมาตามลม", "A&nbsp;Damp&nbsp;Cave": "ถ้าชื้นแฉะ",
"a gaunt man approaches, a crazed look in his eye": "ชายร่างผอมเกร็งวิ่งเข้ามา มีแววตาของความบ้าคลั่ง", "A Military Raid": "กองทหารโจมตี",
"the walls are moist and moss-covered": "ผนังมีน้ำไหลแลลชื้น ปกคลุมด้วยมอส",
"a giant lizard shambles forward": "กิ้งก่ายักษ์คืบคลานเข้ามา", "close": "ปิด",
"some medicine abandoned in the drawers.": "มียาเล็กน้อยถูกทิ้งไว้ในตู้",
"strange scales": "เกล็ดประหลาด", "bayonet": "ดาบปลายปืน",
"learned to throw punches with purpose": "เรียนรู้ที่จะต่อยอย่างมีจุดมุ่งหมาย",
"a shack stands at the center of the village.": "มีเพิงไม้ตั้งอยู่กล้าหมู่บ้าน",
"spare him": "ไว้ชีวิตเขา", "he smiles warmly and asks for lodgings for the night.": "เขายิ้มให้น้อย ๆ และขออาศัยอยู่ที่นี่สักคืน", "stealthy": "ซ่อนตัว", "the sulphur mine is clear of dangers": "เหมืองกำมะถันปลอดภัยสำหรับคนงานแล้ว",
"weapons": "อาวุธ", "the man is thankful.": "ชายคนนั้นขอบคุณ",
"broken streetlights stand, rusting. light hasn't graced this place in a long time.": "เสาไฟตั้งตระหง่าน สนิมเกาะกรัง คงจะไม่มีแสงไฟแตะที่แห่งนี้อยู่นานพอดู",
"shares what he knows about sneaking before he goes.": "เขามอบความรู้เกี่ยวกับการซ่อนตัวก่อนจากไป", "import": "Import", "available": "มีอยู่",
"A Shivering Man": "คนตัวสั่น", "the rest bury them.": "ส่วนที่เหลือก็ฝั่งพวกมันไป",
"smoldering": "คุกรุ่น", "the young settler was carrying a canvas sack.": "ผู้ตั้งรกรากหอบถุงผ้าใบมาด้วย",
"the ground is littered with small teeth": "บนพื้นมีเขี้ยวเล็ก ๆ กระจัดกระจายเต็มไปหมด", "the nest of a large animal lies at the back of the cave.": "ที่สุดปลายถ้ำมีรังของสัตว์ขนาดใหญ่อยู่", "A Tiny Village": "หมู่บ้านเล็ก ๆ ", "a tribe of elderly squatters is camped out in this ward.": "ชนเผ่าที่มีแต่คนชราปักหลักอาศัยอยู่ในหอผู้ป่วยแห่งนี้", "your are connected to dropbox with account / email ": "คุณเชื่อมต่อกับ dropbox", "Mesosphere": "Mesosphere",
"agree": "ตกลง", "the double doors creak endlessly in the wind.": "ประตูเปิดแง้มออกมีเสียงออดแอดตามลม", "not much here.": "ไม่มีอะไรอยู่แถวนี้",
"got it": "เข้าใจแล้ว", "choose one slot to load from": "เลือกช่องที่ต้องการโหลดบันทึก", "a cave lizard attacks": "กิ้งก่าถ้ำเข้าจู่โจม",
"men mill about, weapons at the ready.": "ผู้คนหรี่ตรงเข้ามา ยกอาวุธขึ้นพร้อมโจมตี", "l armour": "เกราะหนัง", "steelworks": "โรงหลอมโลหะ",
"A Ruined City": "ซากเมือง", "Noises": "เสียง", "can't tell what left it here.": "ไม่รู้ว่าใครทิ้งมันเอาไว้", "trees loom on the horizon. grasses gradually yield to a forest floor of dry branches and fallen leaves.": "ต้นไม้เริ่มปรากฏให้เห็น ทุ่งหญ้ารอบ ๆ ตัวจากไป เหลือแต่พื้นบนป่าที่มีใบไม้กิ้งไม้แห้งระเกะระกะ",
"a man stands over a dead wanderer. notices he's not alone.": "ชายคนหนึ่งยืนอยู่ข้างศพของผู้เดินทาง รับรู้ได้ว่าเขาไม่ได้อยู่เพียงลำพัง", "village": "หมู่บ้าน",
"cancel": "ยกเลิก", "put the save code here.": "ใส่รหัสบันทึกลงที่นี่", "hang him": "แขวนคอเขาซะ",
"inside, the remains of its victims are everywhere.": "มีซากศพของเหยื่อที่ถูกมันสังหารระเกะระกะภายใน", "this spear's not elegant, but it's pretty good at stabbing": "หอกเล่มนี้อาจไม่สวยงามนัก แต่ถ้าใช้แทงล่ะก็เชื่อมือได้เลย", "the forest is silent.": "ในป่าเงียบสงัด", "A&nbsp;Borehole": "หลุมอุกกาบาต",
"the night is silent.": "คำคืนนี้เงียบสงัด", "never go thirsty again": "ไม่ต้องทนหิวน้ำอีกต่อไป", "a small cache of supplies is tucked inside a rusting locker.": "กล่องเสบียงถูกยัดเอาไว้ในตู้สนิมเขรอะ", "learned to love the dry air": "เรียนรู้ที่จะรักอากาศแห้ง ๆ ", "workshop": "โรงงาน",
"A Barren World": "โลกที่รกร้างว่างเปล่า", "see farther": "มองเห็นได้ไกลขึ้น", "bolas": "บ่วงบาศก์", "the ground is littered with scraps of cloth": "เศษผ้าวางกระจัดกระจายเต็มพื้น", "The Coal Mine": "เหมืองถ่านหิน", "a huge lizard scrambles up out of the darkness of an old metro station.": "กิ้งก่ายักษ์ตะกายขึ้นมาจากสถานีรถไฟใต้ดินเก่า", "more voices can be heard ahead.": "เสียงต่าง ๆ ยังคงดังอยู่ข้างหน้า",
"A Large Village": "หมู่บ้านขนาดใหญ่", "precision": "ความแม่นยำ", "A Deserted Town": "เมืองร้าง", "the sickness spreads through the village.": "ไข้หวัดกระจายไปทั่วหมู่บ้าน", "won't say from where he came, but it's clear that he's not staying.": "ไม่ยอมบอกว่าเขามาจากที่ไหน แต่ที่แน่ ๆ เขาคงอยู่ที่นี่ไม่นาน",
"the crowd surges forward.": "กลุ่มคนโถมมาข้างหน้า", "the wanderer takes the charm and nods slowly.": "ผู้เดินทางรับเครื่องรางเอาไว้แล้วผงกศีรษะช้า ๆ ",
"the mysterious wanderer returns, cart piled high with furs.": "ผู้เดินทางลึกลับกลับมาพร้อมกับรถเข็มที่พูนไปด้วยแผ่นหนัง", "armoury": "โรงอาวุธ",
"searching the bodies yields a few supplies.": "มีเสบียงติดมากับซากศพเล็กน้อย",
"the torchlight casts a flickering glow down the hallway.": "คบไฟส่องแสงราง ๆ ไปตามทางเดิน", "Export / Import": "Export / Import",
"steelworker": "ช่างโลหะ", "the man-eater is dead": "ตัวกินคนถูกสังหาร", "learned to swing weapons with force": "เรียนรู้ที่จะซัดอาวุธเต็มกำลัง",
"the remaining settlers flee from the violence, their belongings forgotten.": "ผู้ตั้งถิ่นฐานหนีไปเมื่อเห็นการปะทะ ลืมของบางอย่างเอาไว้",
"a crudely made charm": "เครื่องรางที่แกะขึ้นอย่างหยาบ ๆ ", "cask": "กระติกน้ำ", "engine:": "เครื่องยนต์",
"the streets are empty.": "ถนนว่างเปล่า", "lizard": "กิ้งก่า", "Sulphur&nbsp;Mine": "เหมืองกำมะถัน", "export or import save data to dropbox datastorage": "export หรือ import บันทึกเกมด้วย dropbox", "the house has been ransacked.": "บ้านหลังนี้ถูกรื้อค้นจนเกลี้ยง",
"a thug is waiting on the other side of the wall.": "พวกนักเลงรออยู่ในอีกฟากของกำแพง", "the metallic tang of wanderer afterburner hangs in the air.": "มีกลิ่นโลหะของเครื่องยนต์ยานผู้เดินทางลอยอยู่ในอากาศจาง ๆ ", "large prints lead away, into the forest.": "รอยเท้าขนาดใหญ่นำทางเข้าไปในป่า",
"a startled beast defends its home": "สัตว์ป่าพยายามป้องกันดินแดนของตน", "there is nothing else here.": "ไม่มีอะไรอยู่แถวนี้อีกแล้ว",
"his time here, now, is his penance.": "เวลาที่เหลือของเขา ติดอยู่ที่นี่เพื่อเป็นการสำนักบาปในอดีต", "where the windows of the schoolhouse aren't shattered, they're blackened with soot.": "จุดที่หน้าต่างของโรงเรียนไม่แตกออก ก็ถูกปกคลุมด้วยเขม่าดำ", "hull:": "เกราะหุ้ม:", "scavenger": "คนเก็บขยะ",
"unarmed master": "ปรมาจารย์หมัดเปล่า", "the man says he's grateful. says he won't come around any more.": "ชายผู้นั้นขอบคุณ และกล่าวว่าเขาจะไม่มารบกวนอีก",
"laser rifle": "ปืนเลเซอร์", "sulphur mine": "เหมืองกำมะถัน", "buy compass": "ซื้อเข็มทิศ", "buy map": "ซื้อแผนที่", "scratching noises can be heard from the store room.": "มีเสียงขีดข่วนดังขึ้นมาจากห้องเก็บของ", "steel sword": "ดาบเหล็กกล้า", "descend": "ลงไป",
"asks for any spare furs to keep him warm at night.": "ขอเศษขนสัตว์เหลือ ๆ เพื่อห่มคลายหนาวให้กับเขาเอง", "A Raucous Village": "หมู่บ้านยิ่งใหญ่",
"the beggar expresses his thanks.": "ขอทานแสดงความขอบคุณ", "carrying more means longer expeditions to the wilds": "เก็บของได้มากขึ้นหมายถึงสำรวจได้นานขึ้น", "free {0}/{1}": "ที่ว่าง {0}/{1}", "Room": "ห้อง", "a swamp festers in the stagnant air.": "บึงมีกลิ่นฉุนกึกลอยละล่องอยู่ในอากาศรอบ ๆ ", "rotting reeds rise out of the swampy earth.": "ต้นกกเน่าเปื่อยลอยคว้างอยู่กลางน้ำโคลน",
"armoury's done, welcoming back the weapons of the past.": "โรงอาวุธสร้างขึ้นอย่างสมบูรณ์ พร้อมใช้งาน", "eat meat": "กินเนื้อ",
"slow metabolism": "เผาผลาญช้า", "camp fires burn by the entrance to the mine.": "มีกองไฟอยู่หน้าทางเข้าเหมือง", "the mouth of the cave is wide and dark.": "ปากถ้ำเปิดกว้างแต่มืดสนิท", "builder's not sure he's to be trusted.": "ผู้สร้างไม่เชื่อว่าผู้มาเยือนจะไว้ใจได้", "evasion": "หลบหลีก",
"buy bait": "ซื้อเหยื่อล่อ", "a pack of lizards rounds the corner.": "ฝูงกิ้งก่าล้อมทางหนีเอาไว้", "light fire": "จุดไฟ",
"waterskin": "ถุงใส่น้ำ", "scattered teeth": "เขี้ยวที่กระจัดกระจาย", "the door hangs open.": "ประตูเปิดอ้าเอาไว้", "buy:": "ซื้อ:", "load": "load",
"track them": "ตามรอยไป", "stores": "เก็บ", "now the nomads have a place to set up shop, they might stick around a while": "ทีนี้ผู้เร่ร่อนก็มีร้านเป็นของตนเอง พวกเขาน่าจะอยู่นานขึ้น", "A Dusty Path": "เส้นทางเปรอะฝุ่น", "armour": "ชุดเกราะ", "A Man-Eater": "ตัวกินคน",
"bring your friends.": "พาเพื่อนไปด้วย", "the compass points south": "เข็มทิศชี้ไปทางทิศใต้",
"the compass points north": "เข็มทิศชี้ไปทางทิศเหนือ", "The Sick Man": "คนป่วย", "yes": "ใช่", "martial artist": "นักสู้มือเปล่า",
"the traps contain ": "ในกับดักมี : ", "the old tower seems mostly intact.": "หอคอยใหญ่ ดูภายนอกสมบูรณ์ดี", "scales": "เกล็ด",
"bird must have liked shiney things.": "พวกนกน่าจะชอบของสะท้อนแสง", "the path leads to an abandoned mine": "เส้นทางนี้นำไปสู่เหมืองร้าง",
"the compass points northeast": "เข็มทิศชี้ไปทางทิศตะวันออกเฉียงเหนือ", "the camp is still, save for the crackling of the fires.": "ค่ายเงียบสงบดี มีเพียงเสียงของเปลวไฟและฟืนเป็นครั้งคราว", "he begs for medicine.": "เขามาขอยา", "save": "บันทึก",
"this waterskin'll hold a bit of water, at least": "อย่างน้อยถุงน้ำก็ยังเก็บน้ำมากกว่าไม่มีอะไรเลย", "turn him away": "ไล่เขาไป",
"the people here were broken a long time ago.": "ผู้คนที่นี่ไม่สามารถทำอะไรได้เป็นชิ้นเป็นอันมานานมากแล้ว", "a grizzled soldier attacks, waving a bayonet.": "ทหารท่าทางดุดันพุ่งเข้ามาโจมตี โบกดาบปลายปืนไปมา", "shivering man": "คนตัวสั่น", "The Mysterious Wanderer": "ผู้เดินทางลึกลับ", "A Huge Lizard": "กิ้งก่ายักษ์",
"boxer": "นักมวย", "a man joins the fight": "ชายคนหนึ่งเข้ามาร่วมวงด้วย", "An&nbsp;Outpost": "ค่ายพักแรม", "not enough meat": "มีเนื้อไม่พอ",
"some weird metal he picked up on his travels.": "โลหะประหลาดที่เขาเก้บมาได้จากการเดินทาง", "something's in there.": "มีอะไรบางอย่างข้างใน",
"restore more health when eating": "ฟื้นฟูพลังชีวิตมากขึ้นจากอาหาร", "A Snarling Beast": "สัตว์ร้าย", "Share": "Share",
"a haze falls over the village as the steelworks fires up": "หมอกควันปกคลุมหมู่บ้าน โรงเหล็กถูกสร้างขึ้นอย่างสมบูรณ์", "a large bird nests at the top of the stairs.": "มีรังนกขนาดใหญ่อยู่บนบันได", "an old wanderer sits inside, in a seeming trance.": "ผู้เดินทางชรานั่งอยู่ข้างใน ดูเหมือนกำลังครุ่นคิดเหม่อลอย",
"builder says the villagers could make steel, given the tools": "ผู้สร้างบอกว่าชาวบ้านสามารถสร้างเหล็กได้ ถ้ามีอุปกรณ์ให้", "continue": "ไปต่อ",
"there is no more water": "ไม่มีน้ำเหลืออยู่แล้ว", "flickering": "พริ้วไหว", "only the chief remains.": "มีเพียงหัวหน้าใหญ่เท่านั้นที่เหลืออยู่",
"go back inside": "กลับเข้าไปข้างใน", "a few items are scattered on the ground.": "มีของจำนวนหนึ่งระเกะระกะบนพื้น", "save this.": "เก็บเอาไว้",
"this old mine is not abandoned": "ดูเหมือนเหมืองเก่าจะไม่รกร้างซะทีเดียว", "a fight, maybe.": "คงจะต้องสู้", "behind the door, a deformed figure awakes and attacks.": "หลังบานประตู มีร่างประหลาดตื่นขึ้นมาและเข้าจู่โจมทันที", "twitter": "twitter", "baited trap": "กับดักติดเหยื่อ", "dead": "ดับมอด",
"the torch sputters and dies in the damp air": "คบไฟค่อย ๆ ดับมอดลงจากความชื้นในอากาศ", "export": "export",
"a few belongings rest against the walls.": "ของเหลือ ๆ บางอย่างพาดไว้กับผนัง", "not far from the village lies a large beast, its fur matted with blood.": "ไม่ไกลนักจากหมู่บ้าน มีสัตว์ร้ายที่ขนเปรอะไปด้วยเลือด", "an old iron mine sits here, tools abandoned and left to rust.": "มีเหมืองเหล็กเก่าที่นี่ อุปกรณ์ต่าง ๆ ถูกทิ้งเอาไว้ให้สนิมเกาะเฉย ๆ ", "but there is a cache of medicine under the floorboards.": "แต่ว่ามีกล่องเก็บยาอยู่ใต้พื้นอีกที",
"only dust and stains remain.": "เหลือเพียงฝุ่นเกรอะและคราบสนิม", "s armour": "เกราะเหล็กกล้า", "say he should be strung up as an example.": "เขาควรถูกแขวนคอเอาไว้เพื่อไม่ให้เป็นเยี่ยงอย่าง", "collected scraps spread across the floor like they fell from heaven.": "เศษซากกระจายเต็มพื้นราวกับว่ามันร่วมมาจากฟ้า",
"the darkness is absolute": "ความมืดไม่อาจหยั่งถึง", "A Ruined Trap": "ซากกับดัก", "not enough coal": "มีถ่านหินไม่พอ",
"ambushed on the street.": "ถูกซุ่มโจมตีบนถนน", "worth killing for, it seems.": "เหมือนจะมีค่าพอที่จะยอมตายแทน", "slash": "ฟัน",
"builder says she can make a cart for carrying wood": "ผู้สร้างบอกว่าเธอสามารถสร้างรถเข็นเพื่อช่วยขนไม้ได้",
"leather's not strong. better than rags, though.": "หนังสัตว์ไม่ทนทานนัก แต่ก็ยังดีกว่าเศษผ้าเก่า ๆ", "builder stokes the fire": "ผู้ก่อสร้างเติมฟืนให้กับไฟ", "say goodbye": "บอกลา", "A Silent Forest": "ป่าเงียบงัน", "builder's not sure she's to be trusted.": "ผู้สร้างไม่เชื่อใจเธอเท่าไรนัก",
"an old case is wedged behind a rock, covered in a thick layer of dust.": "กล่องเก่า ๆ ซุกอยู่ใต้กองหิน ปกคลุมด้วยฝุ่นหนาเตอะ",
"the point is made. in the next few days, the missing supplies are returned.": "ไม่กี่วันต่อมา เสบียงก็ถูกนำมาคืนด้วยความหวาดกลัว",
"a frail man stands defiantly, blocking the path.": "ชายท่าทางผอมแห้งพยายามขวางทางเอาไว้", "the plague rips through the village.": "โรคระบาดกระจายไปทั่วหมู่บ้าน", "an old wanderer arrives.": "ผู้เดินทางชรามาถึงที่พัก", "scavenger had a small camp in the school.": "พวกเก็บขยะตั้งค่ายในโรงเรียน",
"the compass points southwest": "เข็มทิศชี้ไปทางตะวันตกเฉียงใต้", "the wanderer leaves, cart loaded with wood": "ผู้เดินทางจากได้พร้อมกับรถเข็นที่จุไปด้วยไม้",
"Dropbox Export / Import": "Dropbox Export / Import", "maybe some useful stuff in the rubble.": "อาจจะมีของมีประโยชน์ติดอยู่หลังซากปรักหักพัง",
"google+": "google+", "ok": "โอเค", "a man hobbles up, coughing.": "ชายคนหนึ่งกระเพลกเข้ามา ไอเสียงดัง", "i armour": "เกราะเหล็ก",
"The Scout": "ผู้สำรวจ", "leaves a pile of small scales behind.": "ทิ้งกองเกล็ดประหลาดเล็ก ๆ เอาไว้", "pockets": "กระเป๋า", "stab": "แทง",
"time to move on.": "ได้เวลาไปต่อแล้ว", "the ground is littered with small scales": "มีเศษเกล็ดประหลาดกระจายเต็มพื้น", "not enough ": "มีไม่พอ",
"the stench of rot and death fills the operating theatres.": "กลิ่นเน่าเสียและซากศพลอยคลุ้งในโรงละคร", "burning": "ยังคงติดอยู่", "they must be here for a reason.": "พวกมันมาที่นี่เพื่ออะไรบางอย่าง", "a nomad arrives, looking to trade": "ผู้เร่ร่อนแวะผ่านมา ต้องการแลกเปลี่ยนอะไรสักอย่าง", "black powder and bullets, like the old days.": "ดินดำและกระสุน เหมือนในวันเก่า ๆ ", "restart the game?": "ต้องการเริ่มเกมใหม่หรือไม่?", "gastronome": "นักชิม",
"load from slot": "load จากช่อง", "energy cell": "เซลล์พลังงาน", "inside the hut, a child cries.": "มีเสียงเด็กร้องไห้ในกระท่อม",
"the compass points west": "เข็มทิศชี้ไปทางตะวันตก", "always worked before, at least.": "อย่างน้อยก็ใช้ได้เมื่อก่อน", "a scavenger draws close, hoping for an easy score": "คนเก็บขยะค่อย ๆ เคลื่อนที่เข้ามา หวังจะโจมตีทีเผลอ", "Sickness": "ไข้หวัด", "still a few drops of water in the old well.": "ยังมีน้ำเหลือบ้างในบ่อ",
"build:": "สร้าง:", "feral terror": "อสูรจรจัด", "signout": "signout", "A Beast Attack": "สัตว์ป่าเข้าโจมตี",
"Ready to Leave?": "พร้อมจะไปจากที่นี่หรือยัง?", "the house is abandoned, but not yet picked over.": "บ้านถูกทิ้งร้าง แต่ยังมีของบางอยากทิ้งไว้อยู่",
"time to get out of this place. won't be coming back.": "ได้เวลาไปจากที่นี่แล้ว เราจะไม่หันหลังกลับมาอีก", "the compass points northwest": "เข็มทิศชี้ไปทางตะวันตกเฉียงเหนือ", "the thirst becomes unbearable": "ความกระหายน้ำชักเกินจะทนไหว", "a beggar arrives": "ขอทานมาถึงที่พัก",
"a beast stands alone in an overgrown park.": "สัตว์ตัวหนึ่งยืนอยู่เดียวดายท่ามกลางสวนสาธารณะที่กลายเป็นป่ารกชัฏ", "he leaves a reward.": "เขาทิ้งของขวัญเอาไว้",
"nothing but downcast eyes.": "ไม่มีอะไรเหลืออยู่นอกจากความเศร้าโศก", "the scout says she's been all over.": "ผู้สำรวจบอกว่าเธอเดินทางไปทั่วทิศบนดาวนี้",
"the small settlement has clearly been burning a while.": "ที่แห่งนี้ถูกเผาทำลายมานานพอสมควร", "cloth": "ผ้า", "a second soldier opens fire.": "ทหารคนต่อมายิงปืนเข้ามาสมทบ", "dangerous to be this far from the village without proper protection": "เรามาไกลเกินไปจากหมู่บ้าน อันตรายมากหากไม่มีเครื่องป้องกันที่ดี",
"squeeze": "เบียดเข้าไป", "a pristine medicine cabinet at the end of a hallway.": "ยาที่อยู่ในสภาพสมบูรณ์เก็บอยู่ในตู้ที่สุดทางเดิน",
"scraps of fur": "เศษขนสัตว์", "a scavenger waits just inside the door.": "คนเก็บขยะรออยู่หลังประตู",
"the wind howls outside": "ลมพัดแรงข้างนอก", "the wagon can carry a lot of supplies": "เกวียนสามารถเก็บของได้จำนวนมาก",
"A&nbsp;Battlefield": "สนามรบ", "more soldiers will be on their way.": "ทหารอีกกลุ่มกำลังจะตามมาสมทบ",
"the shivering man is dead": "คนตัวสั่นเสียชีวิต", "builder finishes the smokehouse. she looks hungry.": "สร้างโรงรมควันสำเร็จ ผู้สร้างแสดงอาการหิวอย่างชัดเจน",
"the barrens break at a sea of dying grass, swaying in the arid breeze.": "พื้นดินเริ่มกลับมามีหญ้าปกคลุมบาง ๆ พริ้วไหวตามแรงลม",
"a snarling beast leaps out of the underbrush": "สัตว์ร้ายโจนออกมาจากพงหญ้า", "the place has been swept clean by scavengers.": "ที่นี่โดนกวาดเรียบโดยพวกเก็บเศษขยะ", "A Destroyed Village": "ซากหมู่บ้าน", "land blows more often": "โจมตีถูกเป้าได้แม่นยำขึ้น", "Space": "อวกาศ",
"it's been picked over by scavengers, but there's still some things worth taking.": "ที่นี่ถูกกวาดไปโดยพวกเก็บขยะ แต่น่าจะมีอะไรเหลืออยู่บ้าง",
"Thermosphere": "Thermosphere", "5 medicine": "ยารักษา 5 ", "do nothing": "ไม่สนใจ", "A Gaunt Man": "คนผอมแห้ง",
"Outside": "ภายนอก", "the snarling beast is dead": "สัตว์ร้ายถูกสังหาร", "bodies and supplies from both sides litter the ground.": "ซากศพและเสีบยงกระจัดกระจายเต็มพื้น", "the remains of an old house stand as a monument to simpler times": "เศษซากของบ้านเก่า ๆ ตั้งตระหง่าย เป็นสักญลักษณ์ของวันเก่า ๆ",
"a squatter stands firmly in the doorway of a small hut.": "ผู้อาศัยยืนกันบานประตูของกระท่อมเล็ก ๆ ", "lights flash through the alleys between buildings.": "ไฟสว่างวาบผ่านตรอกเล็ก ๆ ข้างอาคาร", "no": "ไม่", "{0} per {1}s": "{0} ต่อ {1}วินาที", "a weathered family takes up in one of the huts.": "ครอบครัวเล็ก ๆ เข้ามาอยู่อาศัยในกระท่อม", "run": "หนี", "Exosphere": "Exosphere",
"he speaks of once leading the great fleets to fresh worlds.": "เขากล่าวว่าครั้งหนึ่งตนเคยนำกองยานของผุ้เดินทางไปสู่โลกที่อุดมสมบูรณ์",
"builder says there are more wanderers. says they'll work, too.": "ผู้สร้างบอกว่ามีผู้เดินทางอีกมากอาศัยอยู่ในดินแดนนี้ พวกเขาพร้อมจะทำงานหากมีที่พัก",
"evasive": "หลบหลีก", "an old wanderer arrives": "ผู้เดินทางชรามาถึงที่พัก", "through the walls, shuffling noises can be heard.": "มีเสียงเบา ๆ ผ่านมาทางกำแพง", "melee weapons deal more damage": "อาวุธระยะประชิดโจมตีแรงขึ้น", "the compass points ": "เข็มทิศชี้ไปยัง",
"lets some light down into the dusty haze.": "แสงส่องผ่านหมอกควันจาง ๆ ", "the man swallows the medicine eagerly": "ชายคนนั้นกินยาอย่างเร่งรีบ",
"the days are spent with burials.": "ทุกคนไว้อาลัยที่สุสานกันทั้งวัน", "more traps to catch more creatures": "กับดักมากขึ้น จับสัตว์มากขึ้น",
"a man charges down the hall, a rusty blade in his hand": "ชายคนหนึ่งวิ่งเข้ามาในโถงทางเดิน มีดขึ้นสนิมอยู่ในกำมือ",
"it contains travelling gear, and a few trinkets.": "มีอุปกรณ์การเดินทางและของเล็ก ๆ น้อย ๆ ปนอยู่", "bullets": "กระสุน",
"the light from the fire spills from the windows, out into the dark": "แสงสว่างจากกองไฟส่องออกมาจากหน้าต่าง เข้าไปในความมืดมิด",
"tell him to leave": "ไล่เขาไป", "dry brush and dead branches litter the forest floor": "กิ่งไม้และใบไม้แห้ง ๆ เกลื่อนพื้นป่าไปหมด",
"tattered cloth": "ผ้าขาด ๆ ", "can't read the words.": "อ่านอะไรไม่ออกสักคำ", "tanner": "คนฟอกหนัง",
"should cure the meat, or it'll spoil. builder says she can fix something up.": "น่าจะตากเนื้อเอาไว้บ้าง ไม่เช่นนั้นมันจะเน่าไป",
"or migrating computers": "หรือย้ายเครื่อง", "water:{0}": "น้ำ:{0}", "still time to rescue a few supplies.": "ยังมีเวลาเก้บของเล็กน้อย",
"teeth": "เขี้ยว", "villagers could help hunt, given the means": "ชาวบ้านสามารถช่วยล่าสัตว์ได้ ถ้ามีเครื่องมือ", "the beast is dead.": "ฆ่าสัตว์ป่าได้สำเร็จ",
"feral howls echo out of the darkness.": "อสูรจรจัดหอนขึ้นมาในความมืด", "The Iron Mine": "เหมืองเหล็ก", "wild beasts attack the villagers": "สัตว์ป่าโจมตีหมู่บ้าน",
"predators become prey. price is unfair": "ผู้ล่ากลับกลายเป็นเหยื่อ ความสูยเสียไม่อาจคาดเดา"
,"troops storm the village": "ทหารบุกรุกหมู่บ้าน","warefare is bloodthristy":"สงครามนองเลือด..","nothing was found":"ไม่เจออะไรเลย"
});
+3450
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+2378
View File
File diff suppressed because it is too large Load Diff
+4
View File
@@ -0,0 +1,4 @@
.button{width: 115px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
.button .tooltip {width: 125px !important;}
File diff suppressed because one or more lines are too long
+2343
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 120px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
+3193
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
.button{width: 100px !important;}
#outsidePanel .button{width: 115px !important;}
.eventPanel .button {width: 122px !important;}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+141
View File
@@ -0,0 +1,141 @@
/**
*
* Base64 encode / decode
* http://www.webtoolkit.info/
*
**/
var Base64 = {
// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
// public method for encoding
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = Base64._utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
}
return output;
},
// public method for decoding
decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = Base64._utf8_decode(output);
return output;
},
// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
},
// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while ( i < utftext.length ) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
Vendored
+23
View File
@@ -0,0 +1,23 @@
(function() {
var dfs = {"am_pm":["AM","PM"],"day_name":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"day_short":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"era":["av. J.-C.","ap. J.-C."],"era_name":["avant Jésus-Christ","après Jésus-Christ"],"month_name":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"month_short":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"order_full":"DMY","order_long":"DMY","order_medium":"DMY","order_short":"DMY"};
var nfs = {"decimal_separator":",","grouping_separator":" ","minus":"-"};
var df = {SHORT_PADDED_CENTURY:function(d){if(d){return(((d.getDate()+101)+'').substring(1)+'/'+((d.getMonth()+101)+'').substring(1)+'/'+d.getFullYear());}},SHORT:function(d){if(d){return(((d.getDate()+101)+'').substring(1)+'/'+((d.getMonth()+101)+'').substring(1)+'/'+(d.getFullYear()+'').substring(2));}},SHORT_NOYEAR:function(d){if(d){return(((d.getDate()+101)+'').substring(1)+'/'+((d.getMonth()+101)+'').substring(1));}},SHORT_NODAY:function(d){if(d){return(((d.getMonth()+101)+'').substring(1)+'/'+(d.getFullYear()+'').substring(2));}},MEDIUM:function(d){if(d){return(d.getDate()+' '+dfs.month_short[d.getMonth()]+' '+d.getFullYear());}},MEDIUM_NOYEAR:function(d){if(d){return(d.getDate()+' '+dfs.month_short[d.getMonth()]);}},MEDIUM_WEEKDAY_NOYEAR:function(d){if(d){return(dfs.day_short[d.getDay()]+' '+d.getDate()+' '+dfs.month_short[d.getMonth()]);}},LONG_NODAY:function(d){if(d){return(dfs.month_name[d.getMonth()]+' '+d.getFullYear());}},LONG:function(d){if(d){return(d.getDate()+' '+dfs.month_name[d.getMonth()]+' '+d.getFullYear());}},FULL:function(d){if(d){return(dfs.day_name[d.getDay()]+' '+d.getDate()+' '+dfs.month_name[d.getMonth()]+' '+d.getFullYear());}}};
window.icu = window.icu || new Object();
var icu = window.icu;
icu.getCountry = function() { return "" };
icu.getCountryName = function() { return "" };
icu.getDateFormat = function(formatCode) { var retVal = {}; retVal.format = df[formatCode]; return retVal; };
icu.getDateFormats = function() { return df; };
icu.getDateFormatSymbols = function() { return dfs; };
icu.getDecimalFormat = function(places) { var retVal = {}; retVal.format = function(n) { var ns = n < 0 ? Math.abs(n).toFixed(places) : n.toFixed(places); var ns2 = ns.split('.'); s = ns2[0]; var d = ns2[1]; var rgx = /(\d+)(\d{3})/;while(rgx.test(s)){s = s.replace(rgx, '$1' + nfs["grouping_separator"] + '$2');} return (n < 0 ? nfs["minus"] : "") + s + nfs["decimal_separator"] + d;}; return retVal; };
icu.getDecimalFormatSymbols = function() { return nfs; };
icu.getIntegerFormat = function() { var retVal = {}; retVal.format = function(i) { var s = i < 0 ? Math.abs(i).toString() : i.toString(); var rgx = /(\d+)(\d{3})/;while(rgx.test(s)){s = s.replace(rgx, '$1' + nfs["grouping_separator"] + '$2');} return i < 0 ? nfs["minus"] + s : s;}; return retVal; };
icu.getLanguage = function() { return "fr" };
icu.getLanguageName = function() { return "français" };
icu.getLocale = function() { return "fr" };
icu.getLocaleName = function() { return "français" };
})();
+580
View File
@@ -0,0 +1,580 @@
// jquery.event.move
//
// 1.3.1
//
// Stephen Band
//
// Triggers 'movestart', 'move' and 'moveend' events after
// mousemoves following a mousedown cross a distance threshold,
// similar to the native 'dragstart', 'drag' and 'dragend' events.
// Move events are throttled to animation frames. Move event objects
// have the properties:
//
// pageX:
// pageY: Page coordinates of pointer.
// startX:
// startY: Page coordinates of pointer at movestart.
// distX:
// distY: Distance the pointer has moved since movestart.
// deltaX:
// deltaY: Distance the finger has moved since last event.
// velocityX:
// velocityY: Average velocity over last few events.
(function (module) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], module);
} else {
// Browser globals
module(jQuery);
}
})(function(jQuery, undefined){
var // Number of pixels a pressed pointer travels before movestart
// event is fired.
threshold = 6,
add = jQuery.event.add,
remove = jQuery.event.remove,
// Just sugar, so we can have arguments in the same order as
// add and remove.
trigger = function(node, type, data) {
jQuery.event.trigger(type, data, node);
},
// Shim for requestAnimationFrame, falling back to timer. See:
// see http://paulirish.com/2011/requestanimationframe-for-smart-animating/
requestFrame = (function(){
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(fn, element){
return window.setTimeout(function(){
fn();
}, 25);
}
);
})(),
ignoreTags = {
textarea: true,
input: true,
select: true,
button: true
},
mouseevents = {
move: 'mousemove',
cancel: 'mouseup dragstart',
end: 'mouseup'
},
touchevents = {
move: 'touchmove',
cancel: 'touchend',
end: 'touchend'
};
// Constructors
function Timer(fn){
var callback = fn,
active = false,
running = false;
function trigger(time) {
if (active){
callback();
requestFrame(trigger);
running = true;
active = false;
}
else {
running = false;
}
}
this.kick = function(fn) {
active = true;
if (!running) { trigger(); }
};
this.end = function(fn) {
var cb = callback;
if (!fn) { return; }
// If the timer is not running, simply call the end callback.
if (!running) {
fn();
}
// If the timer is running, and has been kicked lately, then
// queue up the current callback and the end callback, otherwise
// just the end callback.
else {
callback = active ?
function(){ cb(); fn(); } :
fn ;
active = true;
}
};
}
// Functions
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
function preventDefault(e) {
e.preventDefault();
}
function preventIgnoreTags(e) {
// Don't prevent interaction with form elements.
if (ignoreTags[ e.target.tagName.toLowerCase() ]) { return; }
e.preventDefault();
}
function isLeftButton(e) {
// Ignore mousedowns on any button other than the left (or primary)
// mouse button, or when a modifier key is pressed.
return (e.which === 1 && !e.ctrlKey && !e.altKey);
}
function identifiedTouch(touchList, id) {
var i, l;
if (touchList.identifiedTouch) {
return touchList.identifiedTouch(id);
}
// touchList.identifiedTouch() does not exist in
// webkit yet… we must do the search ourselves...
i = -1;
l = touchList.length;
while (++i < l) {
if (touchList[i].identifier === id) {
return touchList[i];
}
}
}
function changedTouch(e, event) {
var touch = identifiedTouch(e.changedTouches, event.identifier);
// This isn't the touch you're looking for.
if (!touch) { return; }
// Chrome Android (at least) includes touches that have not
// changed in e.changedTouches. That's a bit annoying. Check
// that this touch has changed.
if (touch.pageX === event.pageX && touch.pageY === event.pageY) { return; }
return touch;
}
// Handlers that decide when the first movestart is triggered
function mousedown(e){
var data;
if (!isLeftButton(e)) { return; }
data = {
target: e.target,
startX: e.pageX,
startY: e.pageY,
timeStamp: e.timeStamp
};
add(document, mouseevents.move, mousemove, data);
add(document, mouseevents.cancel, mouseend, data);
}
function mousemove(e){
var data = e.data;
checkThreshold(e, data, e, removeMouse);
}
function mouseend(e) {
removeMouse();
}
function removeMouse() {
remove(document, mouseevents.move, mousemove);
remove(document, mouseevents.cancel, mouseend);
}
function touchstart(e) {
var touch, template;
// Don't get in the way of interaction with form elements.
if (ignoreTags[ e.target.tagName.toLowerCase() ]) { return; }
touch = e.changedTouches[0];
// iOS live updates the touch objects whereas Android gives us copies.
// That means we can't trust the touchstart object to stay the same,
// so we must copy the data. This object acts as a template for
// movestart, move and moveend event objects.
template = {
target: touch.target,
startX: touch.pageX,
startY: touch.pageY,
timeStamp: e.timeStamp,
identifier: touch.identifier
};
// Use the touch identifier as a namespace, so that we can later
// remove handlers pertaining only to this touch.
add(document, touchevents.move + '.' + touch.identifier, touchmove, template);
add(document, touchevents.cancel + '.' + touch.identifier, touchend, template);
}
function touchmove(e){
var data = e.data,
touch = changedTouch(e, data);
if (!touch) { return; }
checkThreshold(e, data, touch, removeTouch);
}
function touchend(e) {
var template = e.data,
touch = identifiedTouch(e.changedTouches, template.identifier);
if (!touch) { return; }
removeTouch(template.identifier);
}
function removeTouch(identifier) {
remove(document, '.' + identifier, touchmove);
remove(document, '.' + identifier, touchend);
}
// Logic for deciding when to trigger a movestart.
function checkThreshold(e, template, touch, fn) {
var distX = touch.pageX - template.startX,
distY = touch.pageY - template.startY;
// Do nothing if the threshold has not been crossed.
if ((distX * distX) + (distY * distY) < (threshold * threshold)) { return; }
triggerStart(e, template, touch, distX, distY, fn);
}
function handled() {
// this._handled should return false once, and after return true.
this._handled = returnTrue;
return false;
}
function flagAsHandled(e) {
e._handled();
}
function triggerStart(e, template, touch, distX, distY, fn) {
var node = template.target,
touches, time;
touches = e.targetTouches;
time = e.timeStamp - template.timeStamp;
// Create a movestart object with some special properties that
// are passed only to the movestart handlers.
template.type = 'movestart';
template.distX = distX;
template.distY = distY;
template.deltaX = distX;
template.deltaY = distY;
template.pageX = touch.pageX;
template.pageY = touch.pageY;
template.velocityX = distX / time;
template.velocityY = distY / time;
template.targetTouches = touches;
template.finger = touches ?
touches.length :
1 ;
// The _handled method is fired to tell the default movestart
// handler that one of the move events is bound.
template._handled = handled;
// Pass the touchmove event so it can be prevented if or when
// movestart is handled.
template._preventTouchmoveDefault = function() {
e.preventDefault();
};
// Trigger the movestart event.
trigger(template.target, template);
// Unbind handlers that tracked the touch or mouse up till now.
fn(template.identifier);
}
// Handlers that control what happens following a movestart
function activeMousemove(e) {
var event = e.data.event,
timer = e.data.timer;
updateEvent(event, e, e.timeStamp, timer);
}
function activeMouseend(e) {
var event = e.data.event,
timer = e.data.timer;
removeActiveMouse();
endEvent(event, timer, function() {
// Unbind the click suppressor, waiting until after mouseup
// has been handled.
setTimeout(function(){
remove(event.target, 'click', returnFalse);
}, 0);
});
}
function removeActiveMouse(event) {
remove(document, mouseevents.move, activeMousemove);
remove(document, mouseevents.end, activeMouseend);
}
function activeTouchmove(e) {
var event = e.data.event,
timer = e.data.timer,
touch = changedTouch(e, event);
if (!touch) { return; }
// Stop the interface from gesturing
e.preventDefault();
event.targetTouches = e.targetTouches;
updateEvent(event, touch, e.timeStamp, timer);
}
function activeTouchend(e) {
var event = e.data.event,
timer = e.data.timer,
touch = identifiedTouch(e.changedTouches, event.identifier);
// This isn't the touch you're looking for.
if (!touch) { return; }
removeActiveTouch(event);
endEvent(event, timer);
}
function removeActiveTouch(event) {
remove(document, '.' + event.identifier, activeTouchmove);
remove(document, '.' + event.identifier, activeTouchend);
}
// Logic for triggering move and moveend events
function updateEvent(event, touch, timeStamp, timer) {
var time = timeStamp - event.timeStamp;
event.type = 'move';
event.distX = touch.pageX - event.startX;
event.distY = touch.pageY - event.startY;
event.deltaX = touch.pageX - event.pageX;
event.deltaY = touch.pageY - event.pageY;
// Average the velocity of the last few events using a decay
// curve to even out spurious jumps in values.
event.velocityX = 0.3 * event.velocityX + 0.7 * event.deltaX / time;
event.velocityY = 0.3 * event.velocityY + 0.7 * event.deltaY / time;
event.pageX = touch.pageX;
event.pageY = touch.pageY;
timer.kick();
}
function endEvent(event, timer, fn) {
timer.end(function(){
event.type = 'moveend';
trigger(event.target, event);
return fn && fn();
});
}
// jQuery special event definition
function setup(data, namespaces, eventHandle) {
// Stop the node from being dragged
//add(this, 'dragstart.move drag.move', preventDefault);
// Prevent text selection and touch interface scrolling
//add(this, 'mousedown.move', preventIgnoreTags);
// Tell movestart default handler that we've handled this
add(this, 'movestart.move', flagAsHandled);
// Don't bind to the DOM. For speed.
return true;
}
function teardown(namespaces) {
remove(this, 'dragstart drag', preventDefault);
remove(this, 'mousedown touchstart', preventIgnoreTags);
remove(this, 'movestart', flagAsHandled);
// Don't bind to the DOM. For speed.
return true;
}
function addMethod(handleObj) {
// We're not interested in preventing defaults for handlers that
// come from internal move or moveend bindings
if (handleObj.namespace === "move" || handleObj.namespace === "moveend") {
return;
}
// Stop the node from being dragged
add(this, 'dragstart.' + handleObj.guid + ' drag.' + handleObj.guid, preventDefault, undefined, handleObj.selector);
// Prevent text selection and touch interface scrolling
add(this, 'mousedown.' + handleObj.guid, preventIgnoreTags, undefined, handleObj.selector);
}
function removeMethod(handleObj) {
if (handleObj.namespace === "move" || handleObj.namespace === "moveend") {
return;
}
remove(this, 'dragstart.' + handleObj.guid + ' drag.' + handleObj.guid);
remove(this, 'mousedown.' + handleObj.guid);
}
jQuery.event.special.movestart = {
setup: setup,
teardown: teardown,
add: addMethod,
remove: removeMethod,
_default: function(e) {
var template, data;
// If no move events were bound to any ancestors of this
// target, high tail it out of here.
if (!e._handled()) { return; }
template = {
target: e.target,
startX: e.startX,
startY: e.startY,
pageX: e.pageX,
pageY: e.pageY,
distX: e.distX,
distY: e.distY,
deltaX: e.deltaX,
deltaY: e.deltaY,
velocityX: e.velocityX,
velocityY: e.velocityY,
timeStamp: e.timeStamp,
identifier: e.identifier,
targetTouches: e.targetTouches,
finger: e.finger
};
data = {
event: template,
timer: new Timer(function(time){
trigger(e.target, template);
})
};
if (e.identifier === undefined) {
// We're dealing with a mouse
// Stop clicks from propagating during a move
add(e.target, 'click', returnFalse);
add(document, mouseevents.move, activeMousemove, data);
add(document, mouseevents.end, activeMouseend, data);
}
else {
// We're dealing with a touch. Stop touchmove doing
// anything defaulty.
e._preventTouchmoveDefault();
add(document, touchevents.move + '.' + e.identifier, activeTouchmove, data);
add(document, touchevents.end + '.' + e.identifier, activeTouchend, data);
}
}
};
jQuery.event.special.move = {
setup: function() {
// Bind a noop to movestart. Why? It's the movestart
// setup that decides whether other move events are fired.
add(this, 'movestart.move', jQuery.noop);
},
teardown: function() {
remove(this, 'movestart.move', jQuery.noop);
}
};
jQuery.event.special.moveend = {
setup: function() {
// Bind a noop to movestart. Why? It's the movestart
// setup that decides whether other move events are fired.
add(this, 'movestart.moveend', jQuery.noop);
},
teardown: function() {
remove(this, 'movestart.moveend', jQuery.noop);
}
};
add(document, 'mousedown.move', mousedown);
add(document, 'touchstart.move', touchstart);
// Make jQuery copy touch event properties over to the jQuery event
// object, if they are not already listed. But only do the ones we
// really need. IE7/8 do not have Array#indexOf(), but nor do they
// have touch events, so let's assume we can ignore them.
if (typeof Array.prototype.indexOf === 'function') {
(function(jQuery, undefined){
var props = ["changedTouches", "targetTouches"],
l = props.length;
while (l--) {
if (jQuery.event.props.indexOf(props[l]) === -1) {
jQuery.event.props.push(props[l]);
}
}
})(jQuery);
};
});
+130
View File
@@ -0,0 +1,130 @@
// jQuery.event.swipe
// 0.5
// Stephen Band
// Dependencies
// jQuery.event.move 1.2
// One of swipeleft, swiperight, swipeup or swipedown is triggered on
// moveend, when the move has covered a threshold ratio of the dimension
// of the target node, or has gone really fast. Threshold and velocity
// sensitivity changed with:
//
// jQuery.event.special.swipe.settings.threshold
// jQuery.event.special.swipe.settings.sensitivity
(function (module) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], module);
} else {
// Browser globals
module(jQuery);
}
})(function(jQuery, undefined){
var add = jQuery.event.add,
remove = jQuery.event.remove,
// Just sugar, so we can have arguments in the same order as
// add and remove.
trigger = function(node, type, data) {
jQuery.event.trigger(type, data, node);
},
settings = {
// Ratio of distance over target finger must travel to be
// considered a swipe.
threshold: 0.4,
// Faster fingers can travel shorter distances to be considered
// swipes. 'sensitivity' controls how much. Bigger is shorter.
sensitivity: 6
};
function moveend(e) {
var w, h, event;
w = e.target.offsetWidth;
h = e.target.offsetHeight;
// Copy over some useful properties from the move event
event = {
distX: e.distX,
distY: e.distY,
velocityX: e.velocityX,
velocityY: e.velocityY,
finger: e.finger
};
// Find out which of the four directions was swiped
if (e.distX > e.distY) {
if (e.distX > -e.distY) {
if (e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) {
event.type = 'swiperight';
trigger(e.currentTarget, event);
}
}
else {
if (-e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) {
event.type = 'swipeup';
trigger(e.currentTarget, event);
}
}
}
else {
if (e.distX > -e.distY) {
if (e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) {
event.type = 'swipedown';
trigger(e.currentTarget, event);
}
}
else {
if (-e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) {
event.type = 'swipeleft';
trigger(e.currentTarget, event);
}
}
}
}
function getData(node) {
var data = jQuery.data(node, 'event_swipe');
if (!data) {
data = { count: 0 };
jQuery.data(node, 'event_swipe', data);
}
return data;
}
jQuery.event.special.swipe =
jQuery.event.special.swipeleft =
jQuery.event.special.swiperight =
jQuery.event.special.swipeup =
jQuery.event.special.swipedown = {
setup: function( data, namespaces, eventHandle ) {
var data = getData(this);
// If another swipe event is already setup, don't setup again.
if (data.count++ > 0) { return; }
add(this, 'moveend', moveend);
return true;
},
teardown: function() {
var data = getData(this);
// If another swipe event is still setup, don't teardown.
if (--data.count > 0) { return; }
remove(this, 'moveend', moveend);
return true;
},
settings: settings
};
});
+6
View File
File diff suppressed because one or more lines are too long
+86
View File
@@ -0,0 +1,86 @@
(function() {
var translate = function(text)
{
var xlate = translateLookup(text);
if (typeof xlate == "function")
{
xlate = xlate.apply(this, arguments);
}
else if (arguments.length > 1)
{
var aps = Array.prototype.slice;
var args = aps.call( arguments, 1 );
xlate = formatter(xlate, args);
}
return xlate;
};
// I want it available explicity as well as via the object
translate.translate = translate;
//from https://gist.github.com/776196 via http://davedash.com/2010/11/19/pythonic-string-formatting-in-javascript/
var defaultFormatter = (function() {
var re = /\{([^}]+)\}/g;
return function(s, args) {
return s.replace(re, function(_, match){ return args[match]; });
};
}());
var formatter = defaultFormatter;
translate.setFormatter = function(newFormatter)
{
formatter = newFormatter;
};
translate.format = function()
{
var aps = Array.prototype.slice;
var s = arguments[0];
var args = aps.call( arguments, 1 );
return formatter(s, args);
};
var dynoTrans = null;
translate.setDynamicTranslator = function(newDynoTrans)
{
dynoTrans = newDynoTrans;
};
var translation = null;
translate.setTranslation = function(newTranslation)
{
translation = newTranslation;
};
function translateLookup(target)
{
if (translation == null || target == null)
{
return target;
}
if (target in translation == false)
{
if (dynoTrans != null)
{
return dynoTrans(target);
}
return target;
}
var result = translation[target];
if (result == null)
{
return target;
}
return result;
};
window._ = translate;
})();
+34 -23
View File
@@ -1,23 +1,34 @@
<!doctype html>
<html>
<head>
<title>A Dark Room</title>
<style>
div {
width: 960px;
margin: auto;
text-align: center;
margin-top: 100px;
}
</style>
</head>
<body>
<div>
<strong>
A Dark Room isn't really mobile-friendly<br/>
Sorry about that!<br/>
</strong><br/>
Of course you can <a href='index.html?ignorebrowser=true'>play anyway</a>, but it probably won't work!
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>A Dark Room</title>
<style>
body {
background-color: #000000;
color: #FFFFFF;
}
a {
color: #FFFFFF;
}
div {
width: 960px;
margin: auto;
text-align: center;
margin-top: 20px;
}
</style>
</head>
<body>
<center>
<img src="img/Logo1.jpg" />
<div>
<strong>
A Dark Room isn't really mobile-friendly, and it requires arrow keys.<br/>
Sorry about that!<br/>
</strong><br/>
Of course you can <a href='index.html?ignorebrowser=true'>play anyway</a>, but it probably won't work!<br/><br/>
A Dark Room is now native on iOS! Get it on the <a href="https://itunes.apple.com/app/apple-store/id736683061?pt=2073437&ct=mobilesplash&mt=8">App Store</a>.
</div>
</center>
</body>
</html>
+124 -86
View File
@@ -1,86 +1,124 @@
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 = $('<div>')
.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($("<div>").addClass('cooldown'));
if(options.cost) {
var ttPos = options.ttPos ? options.ttPos : "bottom right";
var costTooltip = $('<div>').addClass('tooltip ' + ttPos);
for(var k in options.cost) {
$("<div>").addClass('row_key').text(k).appendTo(costTooltip);
$("<div>").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 = $('<div>')
.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($("<div>").addClass('cooldown'));
// waiting for expiry of residual cooldown detected in state
Button.cooldown(el, 'state');
if(options.cost) {
var ttPos = options.ttPos ? options.ttPos : "bottom right";
var costTooltip = $('<div>').addClass('tooltip ' + ttPos);
for(var k in options.cost) {
$("<div>").addClass('row_key').text(_(k)).appendTo(costTooltip);
$("<div>").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;
},
saveCooldown: true,
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, option) {
var cd = btn.data("cooldown");
var id = 'cooldown.'+ btn.attr('id');
if(cd > 0) {
// param "start" takes value from cooldown time if not specified
var start, left;
switch(option){
// a switch will allow for several uses of cooldown function
case 'state':
if(!$SM.get(id)){
return;
}
start = Math.min($SM.get(id), cd);
left = (start / cd).toFixed(4);
break;
default:
start = cd;
left = 1;
}
Button.clearCooldown(btn);
if(Button.saveCooldown){
$SM.set(id,start);
// residual value is measured in seconds
// saves program performance
btn.data('countdown', Engine.setInterval(function(){
$SM.set(id, $SM.get(id, true) - 0.5, true);
},500));
}
var time = start;
if (Engine.options.doubleTime){
time /= 2;
}
$('div.cooldown', btn).width(left * 100 +"%").animate({width: '0%'}, time * 1000, 'linear', function() {
Button.clearCooldown(btn, true);
});
btn.addClass('disabled');
btn.data('onCooldown', true);
}
},
clearCooldown: function(btn, ended) {
var ended = ended || false;
if(!ended){
$('div.cooldown', btn).stop(true, true);
}
btn.data('onCooldown', false);
if(btn.data('countdown')){
window.clearInterval(btn.data('countdown'));
$SM.remove('cooldown.'+ btn.attr('id'));
btn.removeData('countdown');
}
if(!btn.data('disabled')) {
btn.removeClass('disabled');
}
}
};
+362
View File
@@ -0,0 +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
Engine.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
Engine.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);
+835 -550
View File
File diff suppressed because it is too large Load Diff
+1050 -735
View File
File diff suppressed because it is too large Load Diff
+400 -325
View File
@@ -1,325 +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',
char: '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',
char: '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',
char: '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*/
{ /* 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',
char: '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',
char: '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
}
},
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',
char: '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',
char: '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',
ranged: true,
char: '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
}
},
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',
char: '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
}
},
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: 'R',
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: 'E',
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: 'R',
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: 'E',
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: 'T',
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: 'E',
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: 'T',
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: 'T',
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: 'D',
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')
}
}
}
];
+66 -65
View File
@@ -1,65 +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) && State.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',
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() {
State.thieves = 2;
Engine.removeIncome('thieves');
Engine.addStores(State.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() {
State.thieves = 2;
Engine.removeIncome('thieves');
Engine.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'
}
}
}
}
}
];

Some files were not shown because too many files have changed in this diff Show More