Compare commits
567 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ea38d220d1 | |||
| 9a0a764cb5 | |||
| 201961c12e | |||
| 23796cb36e | |||
| 49f6cd5255 | |||
| 99c57da055 | |||
| b28c8583c6 | |||
| 0f73054faf | |||
| 2ebae56dc5 | |||
| e0b1d3800a | |||
| 9943c4c568 | |||
| 2c2436e63e | |||
| 92e7ef83af | |||
| 7df8efb380 | |||
| 0db5bf3dec | |||
| c66d484627 | |||
| 78bf47bfa1 | |||
| fba203cea1 | |||
| 3ef2b22e99 | |||
| 3849f7871f | |||
| d5e317836a | |||
| ecd391ff6a | |||
| bad5e58cc9 | |||
| da289ea1d7 | |||
| 55b5c3e1e7 | |||
| 0f243637a1 | |||
| 95057c9704 | |||
| b533f86d2a | |||
| b700c4b9f5 | |||
| 6670a9ce09 | |||
| b5db2b558d | |||
| 94fea5a3a8 | |||
| 4626961286 | |||
| 5aa5748ddd | |||
| 066a34b125 | |||
| 75324a5240 | |||
| a0b343246c | |||
| 64f6797c3e | |||
| 1e37f45530 | |||
| 100ff277ff | |||
| fea54cd97f | |||
| 95cf44c2f2 | |||
| 3cbb049a7e | |||
| e504e79cd0 | |||
| 075ac8934e | |||
| 4159febc77 | |||
| e23550c1a0 | |||
| 98682e1b24 | |||
| 62ad16e4b8 | |||
| 65d7cfd784 | |||
| a923c1c0bd | |||
| ed837f3aec | |||
| 03fae08ff2 | |||
| 7208b845b1 | |||
| da0d39b579 | |||
| cb717b41d0 | |||
| 09c070adfa | |||
| 358fe5fbcc | |||
| f94cfe2590 | |||
| 08bd1c7caf | |||
| 1d2f95b561 | |||
| daf5de3973 | |||
| 64a02c162c | |||
| c4535c029a | |||
| 7babe5d102 | |||
| 92f7cf683e | |||
| 93649307f6 | |||
| 8306f155f1 | |||
| 4fed30380f | |||
| 4724aaf6e3 | |||
| d5bbca90a4 | |||
| ee591ca218 | |||
| 612d247709 | |||
| 2d207e55c1 | |||
| d4d4cec489 | |||
| 5dbe98f0f1 | |||
| 8d38513798 | |||
| 84577047a6 | |||
| c611fcea8c | |||
| f219b3288f | |||
| 8d3b313e9c | |||
| 77bff9c289 | |||
| 4824b0a847 | |||
| acca5806b5 | |||
| c158f35b82 | |||
| de705e4a5e | |||
| ebf5e6934e | |||
| 94936f118d | |||
| 8c368d363a | |||
| 8f8425deb5 | |||
| 66054c2825 | |||
| 95a3b68e12 | |||
| 9f8fa6c121 | |||
| 6a9647c364 | |||
| fb13f6e808 | |||
| 288f738a71 | |||
| 7fd474d3c0 | |||
| dd17e716a8 | |||
| 7cda58f947 | |||
| 9cb94cb9c0 | |||
| 65f3d449de | |||
| aef4bfb4e4 | |||
| 23b26b8ca1 | |||
| aa2e24e559 | |||
| 3f71fe1f8b | |||
| e315839d41 | |||
| ad8e32ee56 | |||
| 714dd65982 | |||
| 3b261c5dbf | |||
| 5f58372579 | |||
| d6b5ffc0ad | |||
| 33e1da6137 | |||
| 4e5a5fd7d3 | |||
| fba2dfb680 | |||
| 8320156f42 | |||
| 56aaf55b72 | |||
| 644b975a37 | |||
| 97021aa62d | |||
| d458b1cd2b | |||
| d3c51746c7 | |||
| 6a0c6f6763 | |||
| f85b8fdf7e | |||
| d2bd08dcb1 | |||
| f0e0548116 | |||
| 4efebe4f66 | |||
| 4efb22b890 | |||
| dca3faa2f9 | |||
| 5c37074c2d | |||
| c725b58c1a | |||
| 42c81cd5db | |||
| d30b4e2ff7 | |||
| c2f8ac89fa | |||
| 9c1ebecda7 | |||
| 8042414be7 | |||
| fc089c808c | |||
| e65a8e7c5a | |||
| 425ce30ceb | |||
| 4dd0af9f01 | |||
| d4312385d4 | |||
| a1092170c7 | |||
| 31c4d3a816 | |||
| c3f7b620f5 | |||
| 0c2dc6c905 | |||
| 3cc2b708cb | |||
| 165f2d1dd0 | |||
| 909894cb50 | |||
| 1abb3588e6 | |||
| 446811b638 | |||
| 16f2e1f118 | |||
| 614df477a0 | |||
| dfe9f19565 | |||
| 9361913bea | |||
| ae0f146008 | |||
| c1182fdb47 | |||
| 0fa44cfc55 | |||
| 7d8367d407 | |||
| 67571851b1 | |||
| 0bd474d2fd | |||
| c9900d7b91 | |||
| 2e7ccccf40 | |||
| f998c270da | |||
| 5fcd897b17 | |||
| 7333d03dbb | |||
| 6ee6470972 | |||
| 340851a99d | |||
| 7c978f4f15 | |||
| 06b281fd3c | |||
| eee2bffaf0 | |||
| f2b8ad6268 | |||
| c87541b8b9 | |||
| 6e044292ae | |||
| 5d921d9464 | |||
| 67b3c7fb7e | |||
| afe1230691 | |||
| 25b2fbfa5f | |||
| 8010597e44 | |||
| 0334219d9f | |||
| 2d3daa572d | |||
| 619ee8c2cb | |||
| fca371f8d8 | |||
| 3d00ed3c40 | |||
| 9bc9f5d055 | |||
| 518b47b483 | |||
| ba1b914e1d | |||
| 29932a96f3 | |||
| 5fcdf29601 | |||
| e3da87ed56 | |||
| ed5a0ea080 | |||
| 7f59e166de | |||
| 3b4383f9b3 | |||
| a119d5e655 | |||
| 6f2a705479 | |||
| 48b15c1c5d | |||
| 2e6cc87357 | |||
| 4adce0f2d9 | |||
| fd2181a104 | |||
| 5d12670979 | |||
| 516afb6037 | |||
| 6e43c06ff2 | |||
| 6774cdbac4 | |||
| 464cfab7ac | |||
| 94fdcc7463 | |||
| dbd2adf9f8 | |||
| 1b04fa2086 | |||
| 2efa9f1667 | |||
| 72a83d48dd | |||
| 4201652e8f | |||
| 073ef28a08 | |||
| 4a2c2934b2 | |||
| a65210a169 | |||
| d93d2fdff9 | |||
| efe8120ed3 | |||
| ad79b3ad43 | |||
| 9b40c995c2 | |||
| 327a9a1a37 | |||
| d1d81b8dd0 | |||
| 3b66bb69f5 | |||
| 9b88143608 | |||
| 0030b1360f | |||
| fc545204e3 | |||
| 170719f5b3 | |||
| fb61ba1586 | |||
| 506ff9dc98 | |||
| be3b8bbb47 | |||
| 3e174a6140 | |||
| 4e6faa8923 | |||
| 25e00f8607 | |||
| 9b500b3c5b | |||
| 76098f2b59 | |||
| 6603199060 | |||
| 67bbe15771 | |||
| 7961ad6ea3 | |||
| e7bd841d39 | |||
| 1dafbae5eb | |||
| 66c7b3e76d | |||
| d678b1933c | |||
| 94d1388b1d | |||
| c9d7b0c007 | |||
| 3ca45188e5 | |||
| 21852088ec | |||
| 8284026853 | |||
| ba285032f5 | |||
| 68da61e8cf | |||
| 33d3dbc6a3 | |||
| 8a036ca1e7 | |||
| 93ffadb189 | |||
| 01f15f41f1 | |||
| d1f18a399c | |||
| e33da9d9e6 | |||
| 940a19c68b | |||
| 295cad1a91 | |||
| fd89dbc200 | |||
| 1749b08c15 | |||
| 64e193666d | |||
| 6c97b90d85 | |||
| ea2415650b | |||
| 6b3c651036 | |||
| d15536614d | |||
| ba5bb193aa | |||
| 97b4024382 | |||
| dc7afcbd75 | |||
| b512153d73 | |||
| b3e094694b | |||
| 6de6b3f746 | |||
| 08c07e1e3c | |||
| 7711b2a1cc | |||
| 93962c71e4 | |||
| 94c91b564b | |||
| 40b3ef3a8b | |||
| fbf8707f81 | |||
| b249db27fd | |||
| 7e1ac332ac | |||
| 3203f490fc | |||
| 23a6376b9b | |||
| 89c2270cc8 | |||
| 9070ae049b | |||
| bef697a6fd | |||
| bf7563755d | |||
| 6266f87c1d | |||
| 0126032a2c | |||
| b6c8eb5e57 | |||
| f16e303bc4 | |||
| e4eb334e8a | |||
| 442d6254dc | |||
| 22c91819ab | |||
| bdfc2cb09c | |||
| 84bf0e285d | |||
| 45a6a871df | |||
| 50ba59a5c6 | |||
| 8fddd1717c | |||
| e58089b95c | |||
| 98ae663e9b | |||
| 70515d9975 | |||
| 151ccca8e2 | |||
| 01b5661b0a | |||
| 54d835b788 | |||
| d7a92707c7 | |||
| ff7d59c88c | |||
| 236f74707f | |||
| c3c095717f | |||
| 2f66d79856 | |||
| 9d25f0f736 | |||
| 0928274a77 | |||
| 2db4e209d5 | |||
| 39e00a804f | |||
| 465c636b5d | |||
| 2b558a5c5e | |||
| d059dc5a36 | |||
| 06e696fe59 | |||
| c78a4d9915 | |||
| d485ef84f8 | |||
| a2753511d4 | |||
| fe60eb3d05 | |||
| b57bbfa83d | |||
| 956d0fe62f | |||
| 3852fbebb6 | |||
| b18134f331 | |||
| 889f855c8a | |||
| 41592e79c7 | |||
| bc368511c6 | |||
| 23d177517d | |||
| 79fff84f67 | |||
| 20539fdd18 | |||
| e1f3d31dea | |||
| 5ceac11e53 | |||
| cc3cdb72fe | |||
| 5bc0578862 | |||
| 4118c84e68 | |||
| 08277b33ae | |||
| 79e765eb08 | |||
| 0087da9b5e | |||
| d6a6a7a000 | |||
| 8ceb9488aa | |||
| f3d8fe71b4 | |||
| 22a110de26 | |||
| cac2c8eda6 | |||
| 12d79bdb1e | |||
| b0a226f842 | |||
| f8883d49f1 | |||
| 10bd9fc980 | |||
| ca0ccb4ef8 | |||
| 2ba2812a8b | |||
| 82edff18b4 | |||
| 0f9ceda729 | |||
| ef5c226fe2 | |||
| 35b7926ed0 | |||
| a25b5b7acd | |||
| 64a37d8593 | |||
| 33e9772a1a | |||
| d164d1d466 | |||
| 1bb62e3a56 | |||
| da53de1ed2 | |||
| c5a7113161 | |||
| 1ec7ae22f9 | |||
| 4fd756d83d | |||
| 0f78bae1cc | |||
| 185e4c3c86 | |||
| bf0b8979ac | |||
| eb5b008225 | |||
| 00e57a4bfa | |||
| 66ba9d9a65 | |||
| f56e9678b0 | |||
| faf5ec9353 | |||
| 5c6e36f5fa | |||
| aca23d6043 | |||
| d351e4c815 | |||
| 42ed1cea1f | |||
| 216c51b44b | |||
| 2d0fccaf1c | |||
| 991bf7e764 | |||
| 6e90a79c5f | |||
| c91bf1d20a | |||
| 4bb126c205 | |||
| 674d44f6a8 | |||
| 249b8742ff | |||
| b402008769 | |||
| 53c9dc715b | |||
| 6e3b3a8b10 | |||
| 4b079a22f1 | |||
| 8cf3ab3dc9 | |||
| 4f82e33f7c | |||
| b7a2c29aa0 | |||
| 54dd2955ea | |||
| 15751ec8fb | |||
| e444378fd5 | |||
| 5f4df5bbeb | |||
| c660e9cdd5 | |||
| bc4688652b | |||
| 28b5118be7 | |||
| 6c415f7fd4 | |||
| 39945e5f4c | |||
| 45cd119f9c | |||
| 96f2b89704 | |||
| b26fafe599 | |||
| 272495281c | |||
| 7fb0ae8f02 | |||
| a9dcbc338b | |||
| 5d2bc3ebac | |||
| 230017ba58 | |||
| 17f902e65c | |||
| 4d0b838fdb | |||
| e3b2763911 | |||
| 5ad15330d5 | |||
| f5be58a306 | |||
| 523fb6a90e | |||
| ff9694ebf8 | |||
| 87b1fd2d5c | |||
| b4fa432e04 | |||
| 17ae094fef | |||
| 3a0176217f | |||
| 962ca4ccd6 | |||
| 99d949906a | |||
| 88fe373ea6 | |||
| 1a033dac57 | |||
| ec9d83f6bc | |||
| b7d539abbb | |||
| 81d8129f0f | |||
| c6ccad177a | |||
| 88f9d3fc3b | |||
| 957dbdf0e5 | |||
| 4043658907 | |||
| 2ca0a7a948 | |||
| 09b5f3aba1 | |||
| 72a0380456 | |||
| a925349a13 | |||
| 4963fda7e8 | |||
| e4b56f64c1 | |||
| a0aa2eaab9 | |||
| 1f52094384 | |||
| 1cb7e85383 | |||
| cfaeb51603 | |||
| cc2f374143 | |||
| 5dd42bcc4d | |||
| c7ad5384f4 | |||
| 71ee298e50 | |||
| 7ac28eeb1a | |||
| 989c6b4cfc | |||
| f986e0323e | |||
| 8ad2f82fd0 | |||
| 7f0bd94dab | |||
| b583721581 | |||
| b4eab29125 | |||
| e1df9e9e75 | |||
| 333b0b75e0 | |||
| 9daca0b6ee | |||
| 1a5157dac4 | |||
| 36c75529ff | |||
| 16824386eb | |||
| dcb4f67f8d | |||
| c78689f2c7 | |||
| c27430f29e | |||
| 52974eaa96 | |||
| 9ae4ea53d9 | |||
| d78fd6acc0 | |||
| 918e4fa782 | |||
| ebee3be4d1 | |||
| 994f01c78c | |||
| d8f6e73c6b | |||
| e60abd0153 | |||
| d7fc109554 | |||
| a68f58e648 | |||
| 3b3755cda9 | |||
| a19643517a | |||
| c738342bad | |||
| f5847f66ba | |||
| de9f88dfab | |||
| 2c31e4ecda | |||
| a24d492681 | |||
| 5d07c76577 | |||
| b230d0586a | |||
| a96e9c55c2 | |||
| 55c93772db | |||
| 363119717e | |||
| 701baf86d7 | |||
| dc706c21fe | |||
| 1ffe8f8aeb | |||
| a895a35939 | |||
| 83bf266a29 | |||
| f952b4def1 | |||
| 1be4d5edc5 | |||
| acc04d0780 | |||
| 63a6d98ffe | |||
| 36b9cf2142 | |||
| 95faa0ba75 | |||
| 22e480a80b | |||
| 25cae71067 | |||
| f6e95850da | |||
| a89bf8ee8b | |||
| 5ebbefac91 | |||
| 084bf15811 | |||
| dde477aade | |||
| fbdc84dcf1 | |||
| 5f5ff3701e | |||
| 5d482f856e | |||
| 30e7a06a44 | |||
| bb84eafca6 | |||
| f704a2137f | |||
| 6561e88f9f | |||
| 36011b5b15 | |||
| a8c6790d84 | |||
| 99800f1abd | |||
| f4d2e8deae | |||
| 99d57efdc1 | |||
| 2e3f8abd3f | |||
| f4520bce91 | |||
| 766d3879c7 | |||
| 2018ca3ae8 | |||
| dee7cbb9b3 | |||
| 03867cae60 | |||
| 253f946dbd | |||
| db4a346d21 | |||
| 1b1088db4f | |||
| 7bf744e386 | |||
| 252b731666 | |||
| d296ea4db9 | |||
| e80fc4d286 | |||
| 25f1fff6a1 | |||
| 77cac86076 | |||
| 22b850f1c0 | |||
| 93f8e52e1f | |||
| 3515cbf75f | |||
| 8cb64ad3d8 | |||
| d4034fe244 | |||
| bb953de92b | |||
| 255bdd68fc | |||
| 26b955fee8 | |||
| c4afe143a9 | |||
| b97f5d9914 | |||
| 05fef5664d | |||
| f56697d9d0 | |||
| eaf2fcdfbb | |||
| de2ad91053 | |||
| b8dd1125d4 | |||
| 4334f36e57 | |||
| ea0aff072f | |||
| 4641b0b145 | |||
| 0b6144660f | |||
| 4326b2aa2a | |||
| 54cea31db9 | |||
| 53ff72d218 | |||
| aeedc5d10c | |||
| 8dabee851d | |||
| 536f09dce3 | |||
| 12258689e8 | |||
| 95fddcbb2c | |||
| 79c0185e7e | |||
| b14ad39c5a | |||
| fa655aef1c | |||
| 1aaabed944 | |||
| e83dcd3945 | |||
| e9679b3f26 | |||
| ae044376db | |||
| b1af589d53 | |||
| 555a924fb0 | |||
| 7f1efd4ad2 | |||
| 98719ccf0c | |||
| 6a7df4d17c | |||
| 6d99cb7c3a | |||
| cab220a5ac | |||
| 242ef7f0b9 | |||
| 8743b16e09 | |||
| a86c61aaf0 | |||
| 2c8e410eab | |||
| 6fb7f248f7 | |||
| d0a171e95b | |||
| 9327358008 | |||
| a37bb40c81 |
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
/.settings
|
||||
*.TODO
|
||||
*.mo
|
||||
*.swp
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
[](https://itunes.apple.com/us/app/a-dark-room/id736683061)
|
||||
|
||||
@@ -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>
|
||||
@@ -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!
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 191 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 87 KiB |
@@ -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>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
[javascript: **.js]
|
||||
extract_messages = _
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -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':'繁體中文'
|
||||
};
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -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;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 120px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -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 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 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 Crashed 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 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 Old 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 Ruined 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 Abandoned 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 Murky 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 Destroyed 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 Damp 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 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 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 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 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":"ไม่เจออะไรเลย"
|
||||
|
||||
|
||||
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,4 @@
|
||||
.button{width: 115px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
.button .tooltip {width: 125px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 120px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.button{width: 100px !important;}
|
||||
#outsidePanel .button{width: 115px !important;}
|
||||
.eventPanel .button {width: 122px !important;}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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" };
|
||||
|
||||
})();
|
||||
@@ -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);
|
||||
};
|
||||
});
|
||||
@@ -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
|
||||
};
|
||||
});
|
||||
@@ -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;
|
||||
|
||||
})();
|
||||
@@ -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>
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
@@ -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')
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||