Compare commits

...

173 Commits

Author SHA1 Message Date
Suzanne Soy
640b0c53bd IPFS ignore file for serving over IPFS 2023-11-16 20:11:40 +00:00
Suzanne Soy
b5d8f58861 v2.052 2023-11-16 20:11:40 +00:00
Trixter9994
6b06e7ef3d
v2.021 beta
Reverting version since this thing needs serious debugging before the website works again.
2021-09-21 12:14:04 -04:00
Trixter9994
8e084b5e1c
v2.021 beta 2021-09-21 12:09:33 -04:00
Trixter9994
74074e91ff
v2.031 2021-09-20 13:28:07 -04:00
Trixter9994
fa158c25a3
v2.031 2021-09-20 13:24:04 -04:00
Trixter9994
9de2d66b9d
v2.031 2021-09-20 13:21:13 -04:00
Trixter9994
2df3fbbf82
Update README.md 2021-09-20 12:32:24 -04:00
Trixter9994
6d2656e9c6
v2.021 beta 2021-09-20 12:15:14 -04:00
Trixter9994
af00e56609
v2.021 beta 2021-09-20 12:12:46 -04:00
Trixter9994
d9aed86cf4
v2.021 beta 2021-09-20 10:59:27 -04:00
Trixter9994
38da13af5e
v2.021 beta 2021-09-14 11:34:48 -04:00
Trixter9994
d307ac3229
v2.021 beta 2021-09-14 11:31:41 -04:00
Trixter9994
5ad486a526
v2.021 beta 2021-09-14 11:22:09 -04:00
Trixter9994
57da20d223
v2.031 2021-09-14 11:18:25 -04:00
Trixter9994
cd2da708c6
v2.031 2021-09-14 11:14:41 -04:00
Trixter9994
6cdf0238a8
v2.031 2021-09-14 11:10:09 -04:00
Trixter9994
15cde9a429
v2.031 2021-09-14 11:05:49 -04:00
Alex Trix
611818a198
v2.021 beta
Finally fixed all my mistakes.
2019-10-04 17:25:40 -04:00
Alex Trix
5508b83cc9
Delete u-4n0qyriQwlOrhSvowK_l52_wFZXMf8lvg.woff 2019-10-04 17:20:18 -04:00
Alex Trix
faeac3ed6d
Delete u-4n0qyriQwlOrhSvowK_l52_wFZWMf8.woff 2019-10-04 17:20:08 -04:00
Alex Trix
b418f79507
Delete u-4n0qyriQwlOrhSvowK_l52_wFZVsf8lvg.woff 2019-10-04 17:19:58 -04:00
Alex Trix
6e7bb4533c
Delete u-4n0qyriQwlOrhSvowK_l52_wFZVcf8lvg.woff 2019-10-04 17:19:45 -04:00
Alex Trix
d711acc5e7
Delete u-4n0qyriQwlOrhSvowK_l52_wFZV8f8lvg.woff 2019-10-04 17:19:35 -04:00
Alex Trix
b9bf7e8ab5
Delete favicon.ico 2019-10-04 17:19:07 -04:00
Alex Trix
9d0ca36b81
v2.019 beta 2019-10-04 17:12:00 -04:00
Alex Trix
147fc36acc
v2.019 beta 2019-10-04 17:11:24 -04:00
Alex Trix
8eab5c9d75
v2.016 beta 2019-10-04 17:10:19 -04:00
Alex Trix
10b1a56df5
v2.019 beta 2019-10-04 17:09:47 -04:00
Alex Trix
435e60e77d
v2.019 beta 2019-10-04 17:08:15 -04:00
Alex Trix
af12ffaba4
v2.019 beta 2019-10-04 17:07:27 -04:00
Alex Trix
c5fe0a8f9d
Legacy 2019-10-04 17:06:44 -04:00
Alex Trix
8f57128ba2
Legacy 2019-10-04 17:05:35 -04:00
Alex Trix
8c26178900
Delete css.css 2019-10-04 17:04:46 -04:00
Alex Trix
95b91c125b
Moved css 2019-10-04 17:04:23 -04:00
Alex Trix
8be5054913
v2.021 beta 2019-10-04 17:03:13 -04:00
Trixter9994
8cbc2f1ecb renamed images 2019-10-04 16:56:18 -04:00
Alex Trix
f09163f521
v2.021 beta
Edited html
2019-10-04 16:51:09 -04:00
Trixter9994
a27d4f50a2 renamed img 2019-10-04 16:41:35 -04:00
Alex Trix
0a69d7ea77
v2.021 beta
Re added original.
2019-10-03 23:20:51 -04:00
Alex Trix
927c0cca4d
Delete adsbygoogle.js 2019-10-03 23:12:48 -04:00
Alex Trix
132657d003
v2.021 beta (modified) 2019-10-03 23:09:04 -04:00
Alex Trix
a684bd6c58
Deleted dependency. 2019-10-03 23:05:26 -04:00
Alex Trix
99345b6997
v2.021 beta (modified)
Ortiel dependency deleted.
2019-10-03 23:03:53 -04:00
Alex Trix
b791002171
Delete renamedummy.xyz 2019-10-03 12:51:27 -04:00
Alex Trix
149304d94c
v2.021 beta
Renamed img to images.
2019-10-03 12:50:58 -04:00
Alex Trix
c133f6bed7
v2.021 beta (modified)
Modified to remove http https switching feature for the website to work.
2019-10-03 12:47:36 -04:00
Alex Trix
ec72aeb1b4 Delete CNAME 2019-10-03 11:48:33 -04:00
Alex Trix
e66e83c5c1 Create CNAME 2019-10-03 11:46:34 -04:00
Alex Trix
6d8f80627c
Undo Mistakes 2019-10-03 11:14:42 -04:00
Alex Trix
28a11ff346
v2.021 beta
For the love of god work.
2019-10-03 11:11:07 -04:00
Alex Trix
b5f1467a5b
v2.021 beta
Attempting to fix a lot of problems
2019-10-03 10:49:54 -04:00
Alex Trix
45ba38df00
v2.021 beta
Dear god work
2019-10-03 09:06:50 -04:00
Alex Trix
9f49a99d05
v2.021 beta
Removed ads
2019-10-02 23:28:21 -04:00
Alex Trix
c243c473d7
v2.021 beta
Added Cookieconsent.
2019-10-02 23:26:31 -04:00
Alex Trix
3375618fdc
v2.021 beta
Added add file to prevent game freezing.
2019-10-02 23:24:48 -04:00
Alex Trix
60abcbb787
v2.021 beta
Uploaded favicon.
2019-10-02 23:22:50 -04:00
Alex Trix
09c34a395d
v2.021 beta
Deleted dummy
2019-10-02 16:10:55 -04:00
Alex Trix
8e4f0d4c5f
Update README.md 2019-10-02 16:10:00 -04:00
Alex Trix
75a2e70a01
v2.021 beta
Uploaded fonts
2019-10-02 16:08:58 -04:00
Alex Trix
4ff8668f99
Dummy Folder 2019-10-02 16:08:08 -04:00
Alex Trix
0b262f3aa1
v2.019 beta
Organized File.
2019-10-02 16:05:40 -04:00
Alex Trix
f43566d1d7
v2.016 beta
Organized File.
2019-10-02 16:04:51 -04:00
Alex Trix
7c8f854d35
v2.019 beta
Organized file.
2019-10-02 16:03:29 -04:00
Alex Trix
53dd360a38
v2.021 beta
Organized file.
2019-10-02 16:02:36 -04:00
Alex Trix
7560066cdd
Legacy
Organized legacy file.
2019-10-02 16:01:11 -04:00
Alex Trix
d336ba6550
Legacy
Organized legacy file.
2019-10-02 16:00:00 -04:00
Alex Trix
5c275bcefa
v2.021 beta
Organized file.
2019-10-02 15:58:23 -04:00
Alex Trix
072a81fe34
v2.021 beta
Organized File.
2019-10-02 14:04:17 -04:00
Alex Trix
eb61ced480
v2.021 beta
Updated to be correct.
2019-10-02 13:56:25 -04:00
Alex Trix
90ecff291c
v2.021 beta
Apparently this exists now.
2019-10-02 13:47:29 -04:00
Alex Trix
c25be4a52f
v2.021
Organized File
2019-10-02 13:46:09 -04:00
Alex Trix
1d10b66c5e
v2.021 beta
Holy crap orteil organized their files into folders.
2019-10-02 13:44:09 -04:00
Alex Trix
c8c36a6df2
v2.021 beta
Holy crap orteil organized their code into FOLDERS.
2019-10-02 13:42:38 -04:00
Alex Trix
6e910c7641
v2.021 beta
Updated css
2019-10-02 13:39:04 -04:00
Alex Trix
22687aa350
v2.021 beta
Added new building.
2019-10-02 13:34:00 -04:00
Alex Trix
b4c846af66
Deleted v2.019 beta 2019-10-02 13:33:07 -04:00
Alex Trix
9c1ceff633
v2.021 beta 2019-10-02 13:30:24 -04:00
Alex Trix
241ee6590a
Commented on questions 2019-09-09 08:27:21 -04:00
Alex Trix
531cf3deee
2.019 beta
Re updated to 2.019 beta after some experimentation.
2019-09-09 00:43:29 -04:00
Alex Trix
3ea59386f1
v2.018 beta 2019-09-09 00:37:12 -04:00
Alex Trix
2d2cc67eaa
Updated icons to 2.019 2019-09-07 20:47:37 -04:00
Alex Trix
14083f2820
Updated to 2.019 2019-09-07 20:44:45 -04:00
Alex Trix
4abeaebf8d
Update index.html 2019-09-07 20:42:17 -04:00
Alex Trix
cd9cbec732
Update README.md 2019-09-07 20:36:08 -04:00
Alex Trix
db4a429863
Delete icons.png 2019-09-07 20:34:46 -04:00
Alex Trix
a8586e25c3
Added soul 2019-09-07 20:34:22 -04:00
Alex Trix
ee5d25e017
Commited die 2019-09-07 20:32:29 -04:00
Alex Trix
62577ab533
Updated to 2.019 2019-09-07 20:02:49 -04:00
Alex Trix
ace81d4065
Updated to 2.019 2019-09-07 19:35:52 -04:00
Alex Trix
c0946853f4
Updated to 2.019 2019-09-07 19:24:29 -04:00
Alex Trix
960fa4fb32
Updated to 2.019 2019-09-07 19:23:33 -04:00
Alex Trix
800481cfd5
Updated to 2.019 2019-09-07 19:22:03 -04:00
Alex Trix
f476e76f64
Add files via upload 2019-01-08 12:27:32 -05:00
Alex Trix
d555f5a198
Delete dragon (1).png 2019-01-08 12:26:54 -05:00
Alex Trix
0058a857d7
Delete dragon.png 2019-01-08 12:25:56 -05:00
Alex Trix
6c44731739
Praying this works 2019-01-08 12:25:35 -05:00
Alex Trix
25b8f932f4
Add files via upload 2019-01-08 12:22:46 -05:00
Alex Trix
88f41c611c
Added life 2018-12-15 19:06:30 -05:00
Alex Trix
d9d8e7c0c0
Added Fractal and more farming 2018-12-14 16:11:04 -05:00
Alex Trix
0e8ccd369b
Created life 2018-12-13 19:54:33 -05:00
Alex Trix
f950d05bcc
Delete buildings.png 2018-12-13 19:53:45 -05:00
Alex Trix
4d7b4f635e
Add files via upload 2018-12-09 15:40:13 -05:00
Alex Trix
b2fb0fc5e1
Delete icons.png 2018-12-09 15:39:51 -05:00
Alex Trix
5ae29ae1af
Cleaned up blood 2018-12-09 14:52:28 -05:00
Alex Trix
be948fe684
Deleted evidence 2018-12-09 14:51:51 -05:00
Alex Trix
f3c10c3027
Update README.md 2018-12-09 10:48:47 -05:00
Alex Trix
a493bdfdd4
Update README.md 2018-12-08 14:53:09 -05:00
Trixter9994
8c16dfe08e
Add files via upload 2018-12-08 00:03:22 -05:00
Trixter9994
e8f0cfd316
Add files via upload 2018-12-08 00:01:44 -05:00
Trixter9994
ec34cf924c
Add files via upload 2018-12-07 23:59:34 -05:00
Trixter9994
0de568da4f
Add files via upload 2018-12-07 23:57:41 -05:00
Trixter9994
cafbe36a0e
Add files via upload 2018-12-07 23:54:31 -05:00
Trixter9994
ff5bcafb3b
Delete squish3.mp3 2018-12-07 23:52:46 -05:00
Trixter9994
1f5eef0066
Delete spirit.mp3 2018-12-07 23:52:34 -05:00
Trixter9994
2f808b69e7
Delete smallTick.mp3 2018-12-07 23:52:27 -05:00
Trixter9994
0806f5ab72
Delete shimmerClick.mp3 2018-12-07 23:52:19 -05:00
Trixter9994
155bea6436
Delete sell4.mp3 2018-12-07 23:52:11 -05:00
Trixter9994
8cba953383
Delete sell3.mp3 2018-12-07 23:52:03 -05:00
Trixter9994
7f8523004b
Delete sell1.mp3 2018-12-07 23:51:55 -05:00
Trixter9994
5b2819f291
Delete pop3.mp3 2018-12-07 23:51:48 -05:00
Trixter9994
6c9eb07002
Delete pop2.mp3 2018-12-07 23:51:39 -05:00
Trixter9994
4cbdc1e405
Delete page.mp3 2018-12-07 23:51:32 -05:00
Trixter9994
0217710f11
Delete switch.mp3 2018-12-07 23:51:24 -05:00
Trixter9994
92ac9dfe02
Delete jingleClick.mp3 2018-12-07 23:51:16 -05:00
Trixter9994
146835140b
Delete spellFail.mp3 2018-12-07 23:51:05 -05:00
Trixter9994
8cfe02d1d4
Delete sell2.mp3 2018-12-07 23:50:57 -05:00
Trixter9994
12326f60e0
Delete squish1.mp3 2018-12-07 23:50:49 -05:00
Trixter9994
4ccc9b87f3
Delete spell.mp3 2018-12-07 23:50:39 -05:00
Trixter9994
9356741125
Delete squish2.mp3 2018-12-07 23:50:31 -05:00
Trixter9994
a8914a4417
Delete squish4.mp3 2018-12-07 23:50:16 -05:00
Trixter9994
635728cdff
Delete levelPrestige.mp3 2018-12-07 23:50:08 -05:00
Trixter9994
a7e11c868f
Delete jingle.mp3 2018-12-07 23:49:59 -05:00
Trixter9994
90a23e3a04
Delete cymbalRev.mp3 2018-12-07 23:49:49 -05:00
Trixter9994
85cdae5a51
Delete cymbalCrash.mp3 2018-12-07 23:49:40 -05:00
Trixter9994
22357d5c94
Delete swooshIn.mp3 2018-12-07 23:49:32 -05:00
Trixter9994
e851447b5c
Delete cookieBreak.mp3 2018-12-07 23:49:22 -05:00
Trixter9994
e2b2ddde0c
Delete clickb7.mp3 2018-12-07 23:49:15 -05:00
Trixter9994
cb17f38a8d
Delete clickb6.mp3 2018-12-07 23:49:06 -05:00
Trixter9994
fec712e0d8
Delete clickb5.mp3 2018-12-07 23:48:33 -05:00
Trixter9994
89c22cd3f5
Delete clickb4.mp3 2018-12-07 23:48:25 -05:00
Trixter9994
bd096c6bd8
Delete clickb3.mp3 2018-12-07 23:48:15 -05:00
Trixter9994
663048a372
Delete clickb2.mp3 2018-12-07 23:48:08 -05:00
Trixter9994
29f63cf868
Delete clickb1.mp3 2018-12-07 23:47:59 -05:00
Trixter9994
3e336d1d8c
Delete smallCymbalCrash.mp3 2018-12-07 23:47:50 -05:00
Trixter9994
798ac67711
Delete pop1.mp3 2018-12-07 23:47:29 -05:00
Trixter9994
3103b55207
Delete press.mp3 2018-12-07 23:47:21 -05:00
Trixter9994
5cece70830
Delete clickOn.mp3 2018-12-07 23:47:12 -05:00
Trixter9994
0ed246134d
Delete clickOff.mp3 2018-12-07 23:47:02 -05:00
Trixter9994
e173c1acc1
Delete click6.mp3 2018-12-07 23:46:51 -05:00
Trixter9994
ce1255e8bd
Delete swooshOut.mp3 2018-12-07 23:46:36 -05:00
Trixter9994
d4a09c6459
Delete click5.mp3 2018-12-07 23:46:13 -05:00
Trixter9994
8d0faefe39
Delete thud.mp3 2018-12-07 23:43:45 -05:00
Trixter9994
76f118fafe
Delete click4.mp3 2018-12-07 23:43:36 -05:00
Trixter9994
da06f8a946
Delete click3.mp3 2018-12-07 23:43:26 -05:00
Trixter9994
7edc3ca03a
Delete click7.mp3 2018-12-07 23:43:09 -05:00
Trixter9994
c0c3b03023
Delete tick.mp3 2018-12-07 23:42:56 -05:00
Trixter9994
7f68cda81f
Delete upgrade.mp3 2018-12-07 23:42:41 -05:00
Trixter9994
9781e7640b
Delete click2.mp3 2018-12-07 23:42:28 -05:00
Trixter9994
e6bf175949
Delete click1.mp3 2018-12-07 23:42:15 -05:00
Trixter9994
d840bb85ca
Delete choir.mp3 2018-12-07 23:42:03 -05:00
Trixter9994
00cec9b06f
Delete chime.mp3 2018-12-07 23:41:53 -05:00
Trixter9994
7be16461e0
Delete charging.mp3 2018-12-07 23:41:40 -05:00
Trixter9994
895bbaa252
Add files via upload 2018-12-07 23:40:27 -05:00
Trixter9994
6c229c1b28
Create test 2018-12-07 23:39:10 -05:00
Trixter9994
d53069e6bf
Add files via upload 2018-12-07 23:38:22 -05:00
Trixter9994
eb1737f6db
Add files via upload 2018-12-07 23:36:44 -05:00
Trixter9994
d120d07efa
Create test 2018-12-07 23:33:57 -05:00
Trixter9994
be5561847f
Add files via upload 2018-12-07 23:32:36 -05:00
Trixter9994
5404ae6ee5
Add files via upload 2018-12-07 23:31:50 -05:00
Trixter9994
7a020f58cd
Add files via upload 2018-12-07 23:30:50 -05:00
Trixter9994
28b707c0a6
Add files via upload 2018-12-07 23:30:27 -05:00
Trixter9994
0d3bc31024
Create README.md 2018-12-07 23:29:51 -05:00
426 changed files with 71135 additions and 2174 deletions

0
.ipfsignore Normal file
View File

871
DungeonGen.js Normal file
View File

@ -0,0 +1,871 @@
/*
Orteil's crappy dungeon generation library, 2013
Unfinished and buggy, use at your own risk (please credit)
http://orteil.dashnet.org
Rough process (might or might not be what actually happens) :
1 make a room in the middle
2 pick one of its walls (not corners)
3 select a free tile on the other side of that wall
4 iteratively expand the selection in one (corridors) or two (rooms) directions, stopping when we meet a wall or when we're above the size threshold
5 compute that selection into a room
6 add decorations to the room (pillars, water) but only on the center tiles, as to leave free passages (sprinkle destructible decorations anywhere)
7 take a random floor tile in the room and repeat step 4, but don't stop at the walls of this room (this creates branching) - repeat about 5 times for interesting shapes
8 add those branches to the room
9 carve the room into the map, and set the initially selected wall as a door - set the new room's parent to the previous room, and add it to its parent's children
10 repeat step 2 with any free wall on the map until the amount of tiles dug is above the desired fill ratio
Note : I should probably switch the rendering to canvas to allow stuff like occlusion shadows and lights
*/
if (1==1 || undefined==Math.seedrandom)
{
//seeded random function, courtesy of http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html
(function(a,b,c,d,e,f){function k(a){var b,c=a.length,e=this,f=0,g=e.i=e.j=0,h=e.S=[];for(c||(a=[c++]);d>f;)h[f]=f++;for(f=0;d>f;f++)h[f]=h[g=j&g+a[f%c]+(b=h[f])],h[g]=b;(e.g=function(a){for(var b,c=0,f=e.i,g=e.j,h=e.S;a--;)b=h[f=j&f+1],c=c*d+h[j&(h[f]=h[g=j&g+b])+(h[g]=b)];return e.i=f,e.j=g,c})(d)}function l(a,b){var e,c=[],d=(typeof a)[0];if(b&&"o"==d)for(e in a)try{c.push(l(a[e],b-1))}catch(f){}return c.length?c:"s"==d?a:a+"\0"}function m(a,b){for(var d,c=a+"",e=0;c.length>e;)b[j&e]=j&(d^=19*b[j&e])+c.charCodeAt(e++);return o(b)}function n(c){try{return a.crypto.getRandomValues(c=new Uint8Array(d)),o(c)}catch(e){return[+new Date,a,a.navigator.plugins,a.screen,o(b)]}}function o(a){return String.fromCharCode.apply(0,a)}var g=c.pow(d,e),h=c.pow(2,f),i=2*h,j=d-1;c.seedrandom=function(a,f){var j=[],p=m(l(f?[a,o(b)]:0 in arguments?a:n(),3),j),q=new k(j);return m(o(q.S),b),c.random=function(){for(var a=q.g(e),b=g,c=0;h>a;)a=(a+c)*d,b*=d,c=q.g(1);for(;a>=i;)a/=2,b/=2,c>>>=1;return(a+c)/b},p},m(c.random(),b)})(this,[],Math,256,6,52);
}
if (1==1 || undefined==choose) {function choose(arr) {if (arr.length==0) return 0; else return arr[Math.floor(Math.random()*arr.length)];}}
var DungeonGen=function()
{
var TILE_EMPTY=0;//solid
var TILE_LIMIT=-100;//can't build anything here; edges of map
var TILE_FLOOR_EDGE=100;
var TILE_FLOOR_CENTER=110;
var TILE_DOOR=200;
var TILE_PILLAR=300;//not just pillars, could be any type of repetitive decoration
var TILE_WATER=400;
var TILE_WALL=500;
var TILE_WALL_CORNER=510;
var TILE_ENTRANCE=250;
var TILE_EXIT=260;
var colors=[];
colors[TILE_EMPTY]='000';
colors[TILE_LIMIT]='900';
colors[TILE_FLOOR_EDGE]='ffc';
colors[TILE_FLOOR_CENTER]='ff9';
colors[TILE_DOOR]='f9f';
colors[TILE_PILLAR]='990';
colors[TILE_WATER]='99f';
colors[TILE_WALL]='960';
colors[TILE_WALL_CORNER]='630';
colors[TILE_ENTRANCE]='f9f';
colors[TILE_EXIT]='f9f';
var rand=function(a,b){return Math.floor(Math.random()*(b-a+1)+a);}//return random value between a and b
var Patterns=[];
this.Pattern=function(name,func)
{
this.name=name;
this.func=func;
Patterns.push(this);
}
new this.Pattern('Pillars',function(x,y,room)
{
if ((x+room.x)%2==0 && (y+room.y)%2==0 && Math.random()<0.8) return TILE_PILLAR;
return 0;
});
new this.Pattern('Large pillars',function(x,y,room)
{
if ((x+room.x)%3<2 && (y+room.y)%3<2 && Math.random()<0.8) return TILE_PILLAR;
return 0;
});
new this.Pattern('Sparse pillars',function(x,y,room)
{
if ((x+room.x)%3==0 && (y+room.y)%3==0 && Math.random()<0.8) return TILE_PILLAR;
return 0;
});
new this.Pattern('Lines',function(x,y,room)
{
if (room.x%2==0) if ((x+room.x)%2==0 && Math.random()<0.98) return TILE_PILLAR;
if (room.x%2==1) if ((y+room.y)%2==0 && Math.random()<0.98) return TILE_PILLAR;
return 0;
});
var getRandomPattern=function()
{return choose(Patterns);}
var defaultGenerator=function(me)
{
me.roomSize=10;
me.corridorSize=5;
me.fillRatio=1/3;
me.corridorRatio=0.2;
me.pillarRatio=0.2;
me.waterRatio=0;
me.branching=4;
me.sizeVariance=0.2;
me.fillRatio=0.1+Math.random()*0.4;
me.roomSize=Math.ceil(rand(5,15)*me.fillRatio*2);
me.corridorSize=Math.ceil(rand(1,7)*me.fillRatio*2);
me.corridorRatio=Math.random()*0.8+0.1;
me.pillarRatio=Math.random()*0.5+0.5;
me.waterRatio=Math.pow(Math.random(),2);
me.branching=Math.floor(Math.random()*6);
me.sizeVariance=Math.random();
}
this.Map=function(w,h,seed,params)
{
//create a new map
//leave the seed out for a random seed
//params is an object that contains custom parameters as defined in defaultGenerator
//example : MyMap=new DungeonGen.Map(30,30,MySeed,{waterRatio:0.8}); (80 percent of the rooms will contain water)
if (undefined!=seed) this.seed=seed; else {Math.seedrandom();this.seed=Math.random();}
Math.seedrandom(this.seed);
this.seedState=Math.random;
this.w=w||20;
this.h=h||20;
this.roomsAreHidden=0;
this.rooms=[];
this.freeWalls=[];//all walls that would be a good spot for a door
this.freeTiles=[];//all passable floor tiles
this.doors=[];
this.tiles=this.w*this.h;
this.tilesDug=0;
this.digs=0;//amount of digging steps
this.stuck=0;//how many times we ran into a problem; stop digging if we get too many of these
this.data=[];//fill the map with 0
for (var x=0;x<this.w;x++)
{
this.data[x]=[];
for (var y=0;y<this.h;y++)
{
this.data[x][y]=[TILE_EMPTY,-1,0];//data is stored as [tile system type,room id,tile displayed type] (-1 is no room)
if (x==0 || y==0 || x==this.w-1 || y==this.h-1) this.data[x][y]=[TILE_LIMIT,-1,0];
}
}
defaultGenerator(this);
if (params)
{
for (var i in params)
{
this[i]=params[i];
}
}
Math.seedrandom();
}
this.Map.prototype.getType=function(x,y){return this.data[x][y][0];}
this.Map.prototype.getRoom=function(x,y){if (this.data[x][y][1]!=-1) return this.rooms[this.data[x][y][1]]; else return -1;}
this.Map.prototype.getTile=function(x,y){return this.rooms[this.data[x][y][2]];}
this.Map.prototype.isWall=function(x,y)
{
var n=0;
for (var i in this.freeWalls){if (this.freeWalls[i][0]==x && this.freeWalls[i][1]==y) return n; else n++;}
return -1;
}
this.Map.prototype.isFloor=function(x,y)
{
var n=0;
for (var i in this.freeTiles){if (this.freeTiles[i][0]==x && this.freeTiles[i][1]==y) return n; else n++;}
return -1;
}
this.Map.prototype.removeFreeTile=function(x,y)
{
this.freeTiles.splice(this.isFloor(x,y),1);
}
this.Map.prototype.fill=function(what)
{
//fill with something (either a set value, or a function that takes the map, a position X and a position Y as arguments)
//NOTE : this also resets the rooms!
//example : MyMap.fill(function(m,x,y){return Math.floor((Math.random());});
//...will fill the map with 0s and 1s
var func=0;
if (typeof(what)=='function') func=1;
for (var x=0;x<this.w;x++){for (var y=0;y<this.h;y++){
if (func) this.data[x][y]=[what(this,x,y),-1,0]; else this.data[x][y]=[what,-1,0];
}}
this.rooms=[];
}
this.Map.prototype.fillZone=function(X,Y,W,H,what)
{
//just plain fill a rectangle
for (var x=X;x<X+W;x++){for (var y=Y;y<Y+H;y++){
this.data[x][y][0]=what;
}}
}
this.Map.prototype.getRoomTile=function(room,x,y)
{
var n=0;
for (var i in room.tiles) {if (room.tiles[i].x==x && room.tiles[i].y==y) return n; else n++;}
return -1;
}
this.Map.prototype.getFloorTileInRoom=function(room)
{
var tiles=[];
for (var i in room.tiles) {if (room.tiles[i].type==TILE_FLOOR_EDGE || room.tiles[i].type==TILE_FLOOR_CENTER) tiles.push(room.tiles[i]);}
return choose(tiles);
}
this.Map.prototype.canPlaceRoom=function(rx,ry,rw,rh)
{
if (rx<2 || ry<2 || rx+rw>=this.w-1 || ry+rh>=this.h-1) return false;
for (var x=rx;x<rx+rw;x++)
{
for (var y=ry;y<ry+rh;y++)
{
var tile=this.getType(x,y);
var room=this.getRoom(x,y);
if (tile==TILE_LIMIT) return false;
if (room!=-1) return false;
}
}
return true;
}
this.Map.prototype.setRoomTile=function(room,x,y,tile)
{
//var mapTile=this.getType(x,y);
var oldTile=this.getRoomTile(room,x,y);
var oldTileType=oldTile!=-1?room.tiles[oldTile].type:-1;
if (oldTile!=-1 && (
//(tile!=TILE_FLOOR_EDGE && tile!=TILE_FLOOR_CENTER) ||// && (oldTileType!=TILE_FLOOR_EDGE && oldTileType!=TILE_FLOOR_CENTER)) ||
//(tile!=TILE_FLOOR_EDGE && tile!=TILE_FLOOR_CENTER && (oldTileType!=TILE_FLOOR_EDGE && oldTileType!=TILE_FLOOR_CENTER)) ||
(tile==TILE_WALL || tile==TILE_WALL_CORNER) ||//don't place a wall over an existing room
(tile==TILE_FLOOR_EDGE && oldTileType==TILE_FLOOR_CENTER)//don't place an edge floor over a center floor
)) {return false;}
else
{
if (oldTile!=-1) room.tiles.splice(oldTile,1);
room.tiles.push({x:x,y:y,type:tile,score:0});
if ((tile==TILE_FLOOR_EDGE || tile==TILE_FLOOR_CENTER) && (oldTileType!=TILE_FLOOR_EDGE && oldTileType!=TILE_FLOOR_CENTER)) room.freeTiles++;
else if (tile!=TILE_FLOOR_EDGE && tile!=TILE_FLOOR_CENTER && (oldTileType==TILE_FLOOR_EDGE || oldTileType==TILE_FLOOR_CENTER)) room.freeTiles--;
return true;
}
}
this.Map.prototype.expandRoom=function(room,rx,ry,rw,rh)
{
var x=0;var y=0;
//floor
for (var x=rx;x<rx+rw;x++){for (var y=ry;y<ry+rh;y++){
this.setRoomTile(room,x,y,TILE_FLOOR_EDGE);
}}
for (var x=rx+1;x<rx+rw-1;x++){for (var y=ry+1;y<ry+rh-1;y++){
this.setRoomTile(room,x,y,TILE_FLOOR_CENTER);
}}
//walls
y=ry-1;
for (var x=rx;x<rx+rw;x++){
this.setRoomTile(room,x,y,TILE_WALL);
}
y=ry+rh;
for (var x=rx;x<rx+rw;x++){
this.setRoomTile(room,x,y,TILE_WALL);
}
x=rx-1;
for (var y=ry;y<ry+rh;y++){
this.setRoomTile(room,x,y,TILE_WALL);
}
x=rx+rw;
for (var y=ry;y<ry+rh;y++){
this.setRoomTile(room,x,y,TILE_WALL);
}
//corners
x=rx-1;y=ry-1;
this.setRoomTile(room,x,y,TILE_WALL_CORNER);
x=rx+rw;y=ry-1;
this.setRoomTile(room,x,y,TILE_WALL_CORNER);
x=rx-1;y=ry+rh;
this.setRoomTile(room,x,y,TILE_WALL_CORNER);
x=rx+rw;y=ry+rh;
this.setRoomTile(room,x,y,TILE_WALL_CORNER);
//decoration
var water=Math.random()<this.waterRatio?1:0;
var pattern=Math.random()<this.pillarRatio?getRandomPattern():0;
for (var x=rx;x<rx+rw;x++){for (var y=ry;y<ry+rh;y++){
if (room.tiles[this.getRoomTile(room,x,y)].type==TILE_FLOOR_CENTER)
{
var tile=0;
if (water!=0) tile=TILE_WATER;
if (pattern!=0)
{
tile=pattern.func(x,y,room)||tile;
}
if (tile!=0) this.setRoomTile(room,x,y,tile);
}
}}
}
this.Map.prototype.newRoom=function(x,y,w,h,parent)
{
//create a new abstract room, ready to be carved
var room={};
room.id=this.rooms.length;
room.w=w;//||rand(2,this.roomSize);
room.h=h;//||rand(2,this.roomSize);
room.x=x||rand(1,this.w-room.w-1);
room.y=y||rand(1,this.h-room.h-1);
room.tiles=[];
room.freeTiles=0;
room.parent=parent?parent:-1;
room.children=[];
room.gen=0;
room.door=0;
room.corridor=Math.random()<this.corridorRatio?1:0;
room.hidden=this.roomsAreHidden;//if 1, don't draw
//if (room.parent!=-1) room.corridor=!room.parent.corridor;//alternate rooms and corridors
return room;
}
this.Map.prototype.planRoom=function(room)
{
var branches=this.branching+1;
var forcedExpansions=[];
var w=room.w;
var h=room.h;
while (w>0 && h>0)
{
if (w>0) {forcedExpansions.push(1,3);w--;}
if (h>0) {forcedExpansions.push(2,4);h--;}
}
for (var i=0;i<branches;i++)
{
var steps=0;
var expansions=[];
if (!room.corridor)
{
expansions=[1,2,3,4];
steps=this.roomSize;
}
else
{
expansions=choose([[1,3],[2,4]]);
steps=this.corridorSize;
}
steps=Math.max(room.w+room.h,Math.ceil(steps*(1-Math.random()*this.sizeVariance)));
if (room.tiles.length==0) {var rx=room.x;var ry=room.y;var rw=1;var rh=1;}
else {var randomTile=this.getFloorTileInRoom(room);var rx=randomTile.x;var ry=randomTile.y;var rw=1;var rh=1;}
for (var ii=0;ii<steps;ii++)
{
if (expansions.length==0) break;
var xd=0;var yd=0;var wd=0;var hd=0;
var side=choose(expansions);
if (forcedExpansions.length>0) side=forcedExpansions[0];
if (side==1) {xd=-1;wd=1;}
else if (side==2) {yd=-1;hd=1;}
else if (side==3) {wd=1;}
else if (side==4) {hd=1;}
if (this.canPlaceRoom(rx+xd,ry+yd,rw+wd,rh+hd)) {rx+=xd;ry+=yd;rw+=wd;rh+=hd;} else expansions.splice(expansions.indexOf(side),1);
if (forcedExpansions.length>0) forcedExpansions.splice(0,1);
}
if (rw>1 || rh>1)
{
this.expandRoom(room,rx,ry,rw,rh);
}
}
}
this.Map.prototype.carve=function(room)
{
//carve a room into the map
for (var i in room.tiles)
{
var thisTile=room.tiles[i];
var x=thisTile.x;var y=thisTile.y;
var myType=this.data[x][y][0];
var type=thisTile.type;
if ((type==TILE_WALL || type==TILE_WALL_CORNER) && this.isWall(x,y)!=-1) {this.freeWalls.splice(this.isWall(x,y),1);}
if (this.data[x][y][1]!=-1 && (type==TILE_WALL || type==TILE_WALL_CORNER)) {}
else
{
if (this.data[x][y][1]==-1) this.tilesDug++;
this.data[x][y]=[thisTile.type,room.id,0];
if (x>1 && y>1 && x<this.w-2 && y<this.h-2 && type==TILE_WALL) this.freeWalls.push([x,y]);
if (type==TILE_FLOOR_EDGE || type==TILE_FLOOR_CENTER) this.freeTiles.push([x,y]);
}
var pos=[x,y];
}
this.rooms[room.id]=room;
}
this.Map.prototype.newRandomRoom=function(params)
{
var success=1;
params=params||{};//params is an object such as {corridor:1}
var door=choose(this.freeWalls);//select a free wall to use as a door
if (!door) {success=0;}
else
{
//this.data[door[0]][door[1]][0]=TILE_LIMIT;//not door
var parentRoom=this.getRoom(door[0],door[1]);
var sides=[];//select a free side of that door
if (this.getType(door[0]-1,door[1])==TILE_EMPTY) sides.push([-1,0]);
if (this.getType(door[0]+1,door[1])==TILE_EMPTY) sides.push([1,0]);
if (this.getType(door[0],door[1]-1)==TILE_EMPTY) sides.push([0,-1]);
if (this.getType(door[0],door[1]+1)==TILE_EMPTY) sides.push([0,1]);
var side=choose(sides);
if (!side) {success=0;this.freeWalls.splice(this.isWall(door[0],door[1]),1);}
else
{
var room=this.newRoom(door[0]+side[0],door[1]+side[1],0,0,parentRoom);//try a new room from this spot
for (var i in params)
{
room[i]=params[i];
}
this.planRoom(room);
if (room.tiles.length>0 && room.freeTiles>0)//we got a decent room
{
this.carve(room);
this.data[door[0]][door[1]][0]=TILE_DOOR;//place door
room.door=[door[0],door[1]];
this.data[door[0]][door[1]][1]=room.id;//set ID
this.freeWalls.splice(this.isWall(door[0],door[1]),1);//the door isn't a wall anymore
this.doors.push([door[0],door[1],room]);
//remove free tiles on either side of the door
if (this.isFloor(door[0]+side[0],door[1]+side[1])!=-1) this.removeFreeTile(door[0]+side[0],door[1]+side[1]);
if (this.isFloor(door[0]-side[0],door[1]-side[1])!=-1) this.removeFreeTile(door[0]-side[0],door[1]-side[1]);
room.parent=parentRoom;
parentRoom.children.push(room);
room.gen=parentRoom.gen+1;
}
else//not a good spot; remove this tile from the list of walls
{
this.freeWalls.splice(this.isWall(door[0],door[1]),1);
success=0;
}
}
}
if (success) return room;
else return 0;
}
this.Map.prototype.getRandomSpotInRoom=function(room)
{
var listOfTiles=[];
for (var i in room.tiles)
{
if ((room.tiles[i].type==TILE_FLOOR_EDGE || room.tiles[i].type==TILE_FLOOR_CENTER) && this.isFloor(room.tiles[i].x,room.tiles[i].y)!=-1)
{
listOfTiles.push(room.tiles[i]);
}
}
if (listOfTiles.length==0) return -1;
return choose(listOfTiles);
}
this.Map.prototype.getBestSpotInRoom=function(room)
{
var highest=-1;
var listOfHighest=[];
for (var i in room.tiles)
{
if ((room.tiles[i].type==TILE_FLOOR_EDGE || room.tiles[i].type==TILE_FLOOR_CENTER) && this.isFloor(room.tiles[i].x,room.tiles[i].y)!=-1)
{
if (room.tiles[i].score>highest)
{
listOfHighest=[];
highest=room.tiles[i].score;
listOfHighest.push(room.tiles[i]);
}
else if (room.tiles[i].score==highest)
{
listOfHighest.push(room.tiles[i]);
}
}
}
if (listOfHighest.length==0) return -1;
return choose(listOfHighest);
}
this.Map.prototype.getEarliestRoom=function()
{
return this.rooms[0];
}
this.Map.prototype.getDeepestRoom=function()
{
var deepest=0;
var deepestRoom=this.rooms[0];
for (var i in this.rooms)
{
if ((this.rooms[i].gen+Math.sqrt(this.rooms[i].freeTiles)*0.05)>=deepest && this.rooms[i].corridor==0 && this.rooms[i].freeTiles>4) {deepest=(this.rooms[i].gen+Math.sqrt(this.rooms[i].freeTiles)*0.05);deepestRoom=this.rooms[i];}
}
return deepestRoom;
}
this.Map.prototype.dig=function()
{
//one step in which we try to carve new stuff
//returns 0 when we couldn't dig this step, 1 when we could, and 2 when the digging is complete
Math.random=this.seedState;
var badDig=0;
if (this.digs==0)//first dig : build a starting room in the middle of the map
{
var w=rand(3,7);
var h=rand(3,7);
var room=this.newRoom(Math.floor(this.w/2-w/2),Math.floor(this.h/2-h/2),w,h);
room.corridor=0;
this.planRoom(room);
this.carve(room);
}
else
{
if (this.newRandomRoom()==0) badDig++;
}
if (badDig>0) this.stuck++;
this.digs++;
var finished=0;
if (this.tilesDug>=this.tiles*this.fillRatio) finished=1;
if (this.stuck>100) finished=1;
if (finished==1)//last touch : try to add a whole room at the end
{
for (var i=0;i<10;i++)
{
var newRoom=this.newRandomRoom({corridor:0,w:rand(3,7),h:rand(3,7)});
if (newRoom!=0 && newRoom.freeTiles>15) break;
}
}
Math.seedrandom();
if (finished==1) return 1; else if (badDig>0) return -1; else return 0;
}
this.Map.prototype.finish=function()
{
//touch up the map : add pillars in corners etc
/*
//set paths
for (var i in this.rooms)
{
var me=this.rooms[i];
if (me.door!=0)
{
var doors=[];
doors.push(me.door);
for (var ii in me.children)
{
if (me.children[ii].door!=0) doors.push(me.children[ii].door);
}
for (var ii in doors)
{
this.data[doors[ii][0]][doors[ii][1]][0]=TILE_LIMIT;
//ideally we should run agents that step from each door to the next
}
}
}
*/
for (var i in this.rooms)
{
var pillars=Math.random()<this.pillarRatio;
for (var ii in this.rooms[i].tiles)
{
var x=this.rooms[i].tiles[ii].x;
var y=this.rooms[i].tiles[ii].y;
var me=this.data[x][y][0];
var x1=this.data[x-1][y][0];
var x2=this.data[x+1][y][0];
var y1=this.data[x][y-1][0];
var y2=this.data[x][y+1][0];
var xy1=this.data[x-1][y-1][0];
var xy2=this.data[x+1][y-1][0];
var xy3=this.data[x-1][y+1][0];
var xy4=this.data[x+1][y+1][0];
var walls=0;
if ((x1==TILE_WALL||x1==TILE_WALL_CORNER)) walls++;
if ((y1==TILE_WALL||y1==TILE_WALL_CORNER)) walls++;
if ((x2==TILE_WALL||x2==TILE_WALL_CORNER)) walls++;
if ((y2==TILE_WALL||y2==TILE_WALL_CORNER)) walls++;
if ((xy1==TILE_WALL||xy1==TILE_WALL_CORNER)) walls++;
if ((xy2==TILE_WALL||xy2==TILE_WALL_CORNER)) walls++;
if ((xy3==TILE_WALL||xy3==TILE_WALL_CORNER)) walls++;
if ((xy4==TILE_WALL||xy4==TILE_WALL_CORNER)) walls++;
var floors=0;
if ((x1==TILE_FLOOR_CENTER||x1==TILE_FLOOR_EDGE)) floors++;
if ((y1==TILE_FLOOR_CENTER||y1==TILE_FLOOR_EDGE)) floors++;
if ((x2==TILE_FLOOR_CENTER||x2==TILE_FLOOR_EDGE)) floors++;
if ((y2==TILE_FLOOR_CENTER||y2==TILE_FLOOR_EDGE)) floors++;
if ((xy1==TILE_FLOOR_CENTER||xy1==TILE_FLOOR_EDGE)) floors++;
if ((xy2==TILE_FLOOR_CENTER||xy2==TILE_FLOOR_EDGE)) floors++;
if ((xy3==TILE_FLOOR_CENTER||xy3==TILE_FLOOR_EDGE)) floors++;
if ((xy4==TILE_FLOOR_CENTER||xy4==TILE_FLOOR_EDGE)) floors++;
var complete=0;
if (walls+floors==8) complete=1;
var angle=0;
if (complete)
{
var top=0;
var left=0;
var right=0;
var bottom=0;
if ((xy1==TILE_WALL||xy1==TILE_WALL_CORNER) && (y1==TILE_WALL||y1==TILE_WALL_CORNER) && (xy2==TILE_WALL||xy2==TILE_WALL_CORNER)) top=1;
else if ((xy1==TILE_FLOOR_CENTER||xy1==TILE_FLOOR_EDGE) && (y1==TILE_FLOOR_CENTER||y1==TILE_FLOOR_EDGE) && (xy2==TILE_FLOOR_CENTER||xy2==TILE_FLOOR_EDGE)) top=-1;
if ((xy2==TILE_WALL||xy2==TILE_WALL_CORNER) && (x2==TILE_WALL||x2==TILE_WALL_CORNER) && (xy4==TILE_WALL||xy4==TILE_WALL_CORNER)) right=1;
else if ((xy2==TILE_FLOOR_CENTER||xy2==TILE_FLOOR_EDGE) && (x2==TILE_FLOOR_CENTER||x2==TILE_FLOOR_EDGE) && (xy4==TILE_FLOOR_CENTER||xy4==TILE_FLOOR_EDGE)) right=-1;
if ((xy1==TILE_WALL||xy1==TILE_WALL_CORNER) && (x1==TILE_WALL||x1==TILE_WALL_CORNER) && (xy3==TILE_WALL||xy3==TILE_WALL_CORNER)) left=1;
else if ((xy1==TILE_FLOOR_CENTER||xy1==TILE_FLOOR_EDGE) && (x1==TILE_FLOOR_CENTER||x1==TILE_FLOOR_EDGE) && (xy3==TILE_FLOOR_CENTER||xy3==TILE_FLOOR_EDGE)) left=-1;
if ((xy3==TILE_WALL||xy3==TILE_WALL_CORNER) && (y2==TILE_WALL||y2==TILE_WALL_CORNER) && (xy4==TILE_WALL||xy4==TILE_WALL_CORNER)) bottom=1;
else if ((xy3==TILE_FLOOR_CENTER||xy3==TILE_FLOOR_EDGE) && (y2==TILE_FLOOR_CENTER||y2==TILE_FLOOR_EDGE) && (xy4==TILE_FLOOR_CENTER||xy4==TILE_FLOOR_EDGE)) bottom=-1;
if ((top==1 && bottom==-1) || (top==-1 && bottom==1) || (left==1 && right==-1) || (left==-1 && right==1)) angle=1;
}
if (pillars && Math.random()<0.8 && this.rooms[i].freeTiles>4)
{
if ((angle==1 || (complete && walls==7)) && me==TILE_FLOOR_EDGE && x1!=TILE_DOOR && x2!=TILE_DOOR && y1!=TILE_DOOR && y2!=TILE_DOOR)
{
this.data[x][y][0]=TILE_PILLAR;
me=TILE_PILLAR;
this.removeFreeTile(x,y);
this.rooms[i].freeTiles--;
}
}
//calculate score (for placing items and exits)
if (top==1 || bottom==1 || left==1 || right==1)
{
this.rooms[i].tiles[ii].score+=2;
}
if (walls>5 || floors>5)
{
this.rooms[i].tiles[ii].score+=1;
}
if (walls==7 || floors==8)
{
this.rooms[i].tiles[ii].score+=5;
}
if ((me!=TILE_FLOOR_CENTER && me!=TILE_FLOOR_EDGE) || x1==TILE_DOOR || x2==TILE_DOOR || y1==TILE_DOOR || y2==TILE_DOOR) this.rooms[i].tiles[ii].score=-1;
}
}
//carve entrance and exit
var entrance=this.getBestSpotInRoom(this.getEarliestRoom());
this.data[entrance.x][entrance.y][0]=TILE_ENTRANCE;
this.entrance=[entrance.x,entrance.y];
entrance.score=0;
this.removeFreeTile(entrance.x,entrance.y);
var exit=this.getBestSpotInRoom(this.getDeepestRoom());
this.data[exit.x][exit.y][0]=TILE_EXIT;
this.exit=[exit.x,exit.y];
this.removeFreeTile(exit.x,exit.y);
exit.score=0;
/*
for (var i in this.doors)//remove door tiles (to add later; replace the tiles by entities that delete themselves when opened)
{
this.data[this.doors[i][0]][this.doors[i][1]][0]=TILE_FLOOR_EDGE;
}
*/
}
this.Map.prototype.isObstacle=function(x,y)
{
var free=[TILE_FLOOR_EDGE,TILE_FLOOR_CENTER,TILE_DOOR,TILE_ENTRANCE,TILE_EXIT];
for (var i in free)
{
if (this.data[x][y][0]==free[i]) return 0;
}
return 1;
}
var joinTile=function(map,x,y,joinWith)
{
//for the tile at x,y, return 2 if it joins with its horizontal neighbors, 3 if it joins with its vertical neighbors, 1 if it joins with either both or neither.
//joinWith contains the tile types that count as joinable, in addition to this tile. (don't add the tested tile to joinWith!)
var p=1;
var me=map.data[x][y][0];
var x1=map.data[x-1][y][0];
var x2=map.data[x+1][y][0];
var y1=map.data[x][y-1][0];
var y2=map.data[x][y+1][0];
joinWith.push(me);
var joinsX=0;
for (var i in joinWith)
{
if (x1==joinWith[i]) joinsX++;
if (x2==joinWith[i]) joinsX++;
}
var joinsY=0;
for (var i in joinWith)
{
if (y1==joinWith[i]) joinsY++;
if (y2==joinWith[i]) joinsY++;
}
if (joinsX==2 && joinsY==2) p=1;
else if (joinsX==2) p=2;
else if (joinsY==2) p=3;
return p;
}
this.Map.prototype.getPic=function(x,y)
{
//return a position [x,y] in the tiles (as 0, 1, 2...) for the tile on the map at position x,y
if (Tiles[this.data[x][y][2]])
{
if (Tiles[this.data[x][y][2]].joinType=='join')
{
var thisPic=Tiles[this.data[x][y][2]].pic;
thisPic=[thisPic[0],thisPic[1]];//why is this even necessary?
var joinWith=[];
if (this.data[x][y][0]==TILE_WALL) joinWith.push(TILE_WALL_CORNER);
else if (this.data[x][y][0]==TILE_DOOR) joinWith.push(TILE_WALL,TILE_WALL_CORNER);
thisPic[0]+=joinTile(this,x,y,joinWith)-1;
return thisPic;
}
else if (Tiles[this.data[x][y][2]].joinType=='random3')
{
var thisPic=Tiles[this.data[x][y][2]].pic;
thisPic=[thisPic[0],thisPic[1]];
thisPic[0]+=Math.floor(Math.random()*3);
return thisPic;
}
return Tiles[this.data[x][y][2]].pic;
}
return [0,0];
}
var Tiles=[];
var TilesByName=[];
this.Tile=function(name,pic,joinType)
{
this.name=name;
this.pic=pic;
this.joinType=joinType||'none';
this.id=Tiles.length;
Tiles[this.id]=this;
TilesByName[this.name]=this;
}
new this.Tile('void',[0,0]);
this.loadTiles=function(tiles)
{
for (var i in tiles)
{
var name=tiles[i][0];
var pic=tiles[i][1];
var joinType=tiles[i][2];
new this.Tile(name,pic,joinType);
}
}
var computeTile=function(tile,tiles,value,name)
{
if (tile==value && tiles[name]) return TilesByName[tiles[name]];
return 0;
}
this.Map.prototype.assignTiles=function(room,tiles)
{
//set the displayed tiles for this room
for (var i in room.tiles)
{
var type=Tiles[0];
var me=room.tiles[i];
var tile=this.data[me.x][me.y][0];
type=computeTile(tile,tiles,TILE_WALL_CORNER,'wall corner')||type;
type=computeTile(tile,tiles,TILE_WALL,'wall')||type;
type=computeTile(tile,tiles,TILE_FLOOR_EDGE,'floor edges')||type;
type=computeTile(tile,tiles,TILE_FLOOR_CENTER,'floor')||type;
type=computeTile(tile,tiles,TILE_PILLAR,'pillar')||type;
type=computeTile(tile,tiles,TILE_DOOR,'door')||type;
type=computeTile(tile,tiles,TILE_WATER,'water')||type;
type=computeTile(tile,tiles,TILE_ENTRANCE,'entrance')||type;
type=computeTile(tile,tiles,TILE_EXIT,'exit')||type;
this.data[me.x][me.y][2]=type.id;
}
}
this.Map.prototype.draw=function(size)
{
//return a string containing a rough visual representation of the map
var str='';
var size=size||10;
for (var y=0;y<this.h;y++){for (var x=0;x<this.w;x++){
var text='';
if (this.isFloor(x,y)!=-1) text='o';
if (this.isWall(x,y)!=-1) text+='x';
var room=this.getRoom(x,y);
var opacity=Math.max(0.1,1-(this.getRoom(x,y).gen/10));
var title=room.freeTiles;//this.data[x][y][0].toString();
text='';
str+='<div style="opacity:'+opacity+';width:'+size+'px;height:'+size+'px;position:absolute;left:'+(x*size)+'px;top:'+(y*size)+'px;display:block;padding:0px;margin:0px;background:#'+colors[this.data[x][y][0]]+';color:#999;" title="'+title+'">'+text+'</div>';
}
str+='<br>';
}
str='<div style="position:relative;width:'+(this.w*size)+'px;height:'+(this.h*size)+'px;background:#000;font-family:Courier;font-size:'+size+'px;float:left;margin:10px;">'+str+'</div>';
return str;
}
this.Map.prototype.drawDetailed=function()
{
//return a string containing a rough visual representation of the map (with graphics)
var str='';
var size=16;
for (var y=0;y<this.h;y++){for (var x=0;x<this.w;x++){
var room=this.getRoom(x,y);
//var opacity=Math.max(0.1,room.tiles[this.getRoomTile(room,x,y)].score);
var opacity=1;
var title='void';
if (room!=-1)
{
opacity=Math.max(0.1,1-room.gen/5);
if (this.data[x][y][0]==TILE_ENTRANCE || this.data[x][y][0]==TILE_EXIT) opacity=1;
title=(room.corridor?'corridor':'room')+' '+room.id+' | depth : '+room.gen+' | children : '+room.children.length;
}
var pic=this.getPic(x,y);
str+='<div style="opacity:'+opacity+';width:'+size+'px;height:'+size+'px;position:absolute;left:'+(x*size)+'px;top:'+(y*size)+'px;display:block;padding:0px;margin:0px;background:#'+colors[this.data[x][y][0]]+' url(img/dungeonTiles.png) '+(-pic[0]*16)+'px '+(-pic[1]*16)+'px;color:#999;" title="'+title+'"></div>';
}
str+='<br>';
}
str='<div style="box-shadow:0px 0px 12px 6px #00061b;position:relative;width:'+(this.w*size)+'px;height:'+(this.h*size)+'px;background:#00061b;font-family:Courier;font-size:'+size+'px;float:left;margin:10px;">'+str+'</div>';
return str;
}
this.Map.prototype.getStr=function()
{
//return a string containing the map with tile graphics, ready to be pasted in a wrapper
var str='';
var size=16;
for (var y=0;y<this.h;y++){for (var x=0;x<this.w;x++){
var room=this.getRoom(x,y);
//var opacity=Math.max(0.1,room.tiles[this.getRoomTile(room,x,y)].score);
var opacity=1;
var title='void';
var pic=this.getPic(x,y);
if (room!=-1)
{
/*
opacity=Math.max(0.1,1-room.gen/5);
if (room.hidden) opacity=0;
if (this.data[x][y][0]==TILE_ENTRANCE || this.data[x][y][0]==TILE_EXIT) opacity=1;
*/
if (room.hidden) pic=[0,0];
title=(room.corridor?'corridor':'room')+' '+room.id+' | depth : '+room.gen+' | children : '+room.children.length;
}
str+='<div style="opacity:'+opacity+';width:'+size+'px;height:'+size+'px;position:absolute;left:'+(x*size)+'px;top:'+(y*size)+'px;display:block;padding:0px;margin:0px;background:#'+colors[this.data[x][y][0]]+' url(img/dungeonTiles.png) '+(-pic[0]*16)+'px '+(-pic[1]*16)+'px;color:#999;" title="'+title+'"></div>';
}
str+='<br>';
}
return str;
}
}

6
README.md Normal file
View File

@ -0,0 +1,6 @@
# Cookie-Clicker-Source-Code
2.052 source code for... educational purposes... <br>
Download and Extract to delete free time. Or just use the website. <br> <br>
Do not worry, I will be updating this to be up to date with the current Cookie Clicker version. <br>
<!-- Well guess what, 2.021 came out... what happened to 2.020?? -->
Credits obviously go Orteil, visit the official website here: http://orteil.dashnet.org/cookieclicker/

6
ajax.js Normal file
View File

@ -0,0 +1,6 @@
function ajax(url,callback){
var ajaxRequest;
try{ajaxRequest = new XMLHttpRequest();} catch (e){try{ajaxRequest=new ActiveXObject('Msxml2.XMLHTTP');} catch (e) {try{ajaxRequest=new ActiveXObject('Microsoft.XMLHTTP');} catch (e){alert("Something broke!");return false;}}}
if (callback){ajaxRequest.onreadystatechange=function(){if(ajaxRequest.readyState==4){callback(ajaxRequest.responseText);}}}
ajaxRequest.open('GET',url+'&nocache='+(new Date().getTime()),true);ajaxRequest.send(null);
}

142
base64.js Normal file
View File

@ -0,0 +1,142 @@
/**
*
* 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;
}
}

1136
dungeons.js Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
img/BGgarden.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
img/BGgrimoire.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
img/BGmarket.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
img/BGpantheon.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
img/alchemylab.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

BIN
img/alteredGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

BIN
img/alternateGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
img/antiGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

BIN
img/antimattercondenser.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 B

BIN
img/aqworldsbanner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
img/ascendBox.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
img/ascendInfo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
img/ascendSlot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
img/ascendWisp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
img/ascendedBakingPod.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
img/bank.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

BIN
img/bankBackground.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
img/bankGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

BIN
img/bgBW.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
img/bgBlack.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
img/bgBlue.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
img/bgCandy.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
img/bgChoco.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
img/bgChocoDark.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
img/bgCoarse.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
img/bgFoil.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

BIN
img/bgGold.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
img/bgMint.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
img/bgMoney.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
img/bgMoneyChart.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
img/bgPaint.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
img/bgPink.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
img/bgPurple.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
img/bgRed.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
img/bgSilver.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
img/bgSky.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
img/bgSnowy.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
img/bgSpectrum.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
img/bgStars.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

BIN
img/bgWhite.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
img/bgYellowBlue.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
img/blackGradient.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

BIN
img/blackGradientLeft.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

BIN
img/bracketPanelLeftS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/bracketPanelRightS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/brainyGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
img/brokenCookie.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
img/brokenCookieHalo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
img/brownStripes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/buildings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
img/bunnies.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
img/bunnyGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

BIN
img/buttonTile.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
img/caramelWave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
img/chancemaker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
img/chocolateMilkWave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
img/clayBG.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
img/cloneGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

BIN
img/contract.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
img/control.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
img/cookieShadow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
img/cookieShower1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
img/cookieShower2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
img/cookieShower3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
img/cortex.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
img/cortexBackground.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
img/cosmicGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

BIN
img/cursor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

BIN
img/darkNoise.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
img/darkNoise.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
img/darkNoiseTopBar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
img/dashnetLogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
img/discord.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/dragon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
img/dragonBG.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
img/dragonFrame.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
img/dungeonDot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
img/dungeonFactory.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
img/dungeonFoes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1010 B

BIN
img/dungeonHeroes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
img/dungeonIcons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
img/dungeonItems.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/dungeonMapFactory.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
img/dungeonOverlay.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
img/dungeonPictos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
img/dungeonTiles.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
img/easterEggs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
img/elfGrandma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

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