diff --git a/js/Makefile b/js/Makefile index c44e263..ddef670 100644 --- a/js/Makefile +++ b/js/Makefile @@ -6,10 +6,11 @@ MAPS+=$(wildcard ../maps/contest?.map ../maps/contest10.map) MAPS+=$(wildcard ../maps/ems*.map) MAPS+=../maps/pacman.map ../maps/pacman2.map -all: maps.js sprites.png +all: maps.js sprites.png gui.min.js mine.min.js maps.min.js -maps.js: mapsToJson.js $(MAPS) - ./mapsToJson.js $(MAPS) > maps.js +maps.js: FORCE + ./mapsToJson.js $(MAPS) > maps.js.new + @if test ! -e maps.js || ! diff maps.js maps.js.new > /dev/null; then echo "new maps"; mv maps.js.new maps.js; else rm maps.js.new; fi SPRITES=earth.png empty.png lambda.png liftclosed.png liftopen.png robot.png rock.png wall.png SPRITES+=$(wildcard trampoline?.png) @@ -22,10 +23,16 @@ sprites.png: $(SPRITES) optipng -o9 tmp_sprites1.png mv tmp_sprites1.png sprites.png +gui.min.js: gui.js + yui-compressor --type js --charset utf-8 -o $@ $< + +mine.min.js: mine.js + yui-compressor --type js --charset utf-8 -o $@ $< + +maps.min.js: maps.js + yui-compressor --type js --charset utf-8 -o $@ $< + clean: rm -f maps.js sprites.png -.PHONY: all clean - -# just build it everytime -.PHONY: maps.js +.PHONY: all clean FORCE diff --git a/js/gui.min.js b/js/gui.min.js new file mode 100644 index 0000000..27cd526 --- /dev/null +++ b/js/gui.min.js @@ -0,0 +1 @@ +var mineGui_mine=false,mineGui_curmap,mineGui_curndx,mineGui_moves="";var mineGui_movesBackup=[];var mineGui_customNdx=1;var mineGui_canvas=true;var mineGui_imgSources={sprites:"sprites.png"};var mineGui_spriteOffset={R:5,"#":7,"*":6,"\\":2,L:3,O:4,".":0," ":1,A:8,B:9,C:10,D:11,E:12,F:13,G:14,H:15,I:16,"1":17,"2":18,"3":19,"4":20,"5":21,"6":22,"7":23,"8":24,"9":25};var mineGui_images={};var mineGui_imagesNeed=0;function mineGui_loadImg(b,c){var a;++mineGui_imagesNeed;mineGui_images[b]=a=new Image();a.onload=function(){if(0==--mineGui_imagesNeed){mineGui_show()}};a.src=c}function mineGui_start(){var b=document.getElementById("mineGui");var e=document.getElementById("mineGui_selectMap");var c=document.getElementById("mineGui_moves");var a=document.getElementById("mineGui_data");var f={L:1,U:1,R:1,D:1,A:1,W:1};var d;document.getElementById("mineGui_addData").onclick=mineGui_addCustomMap;e.onchange=function(){var l=e.options[e.selectedIndex].text;mineGui_setMap(mineMaps[l],e.selectedIndex);e.blur()};var g=function(){if(c.value==mineGui_moves){return}mineGui_moves="";var k=c.value.toUpperCase(),l;for(l=0;l0){e.selectedIndex--;e.onchange()}break;case 34:if(e.selectedIndex+10){document.getElementById("mineGui_mineMapWater").textContent=b.splice(-c).join("\n")}else{document.getElementById("mineGui_mineMapWater").textContent=""}document.getElementById("mineGui_mineMapDry").textContent=b.join("\n");document.getElementById("mineGui_moves").value=mineGui_moves;var a="";switch(mineGui_mine.state){case Mine.ALIVE:a="Still mining";break;case Mine.LOST:a="Robot broken - "+mineGui_mine.reason;break;case Mine.ABORTED:a="Aborted";break;case Mine.WON:a="Won - "+mineGui_mine.reason;break}document.getElementById("mineGui_meta").textContent=mineGui_mine.metaText();document.getElementById("mineGui_state").textContent=a;document.getElementById("mineGui_score").textContent=mineGui_mine.score;document.getElementById("mineGui_scoreMoves").textContent=mineGui_mine.moves;document.getElementById("mineGui_scoreLambdas").textContent=mineGui_mine.found_lambdas;document.getElementById("mineGui_belowWater").textContent=mineGui_mine.moves_below_water}; \ No newline at end of file diff --git a/js/index.html b/js/index.html index e350630..1661094 100644 --- a/js/index.html +++ b/js/index.html @@ -1,7 +1,7 @@ - - - + + + ICFP Contest 2012 Simulator

ICFP Contest 2012 Simulator

diff --git a/js/maps.min.js b/js/maps.min.js new file mode 100644 index 0000000..c237635 --- /dev/null +++ b/js/maps.min.js @@ -0,0 +1 @@ +var mineMaps={trampoline1:"############\n#..*.R..*..#\n#..A....B..######\n#....2.. ..#\\\\\\C#\n#......* *.#\\\\\\1#\n########L########\n\nTrampoline A targets 1\nTrampoline B targets 1\nTrampoline C targets 2\n",trampoline2:" ######\n #....#\n #.**.#\n #.**.#\n #.**.#\n######.\\\\.######\n#**....*.......#\n#\\\\....L\\\\\\....#\n#A......*****..#\n######R.....###########\n ###.....*.....\\\\\\#\n #\\\\\\\\#..1...\\\\\\#\n #\\\\\\\\#......\\\\\\#\n ################\n\nTrampoline A targets 1\n",trampoline3:"#######################################\n#****................#..1...\\\\\\\\\\\\\\B..#\n#R.......##############################\n#.. ..................................#\n#.. ........ \\ ......#\n#.. .*. ....**.*...#....... ..........#\n#.. ... ....\\\\\\\\...#.A..... ..........#\n#.. ... ....\\ .....#....... * \\\\..#\n#.. ... ....\\......#....... ..........#\n#.. ... ....\\......#....... ..........#\n#.. ... ...........#................**#\n#..\\\\\\\\\\...........#................\\\\#\n########### ############## ############\n#...*.................................#\n#....*.................. ......#\n#... .*....*.............. ..... .....#\n#....*2*........########.. ..... .....L\n#...*...*.......#\\\\\\#..... ...*.......#\n#.....\\\\\\.......#\\\\\\#....**..***......#\n#.... .......#\\\\\\#*................#\n#...............#\\\\\\#*...**...*.......#\n#...............#.....................#\n###### ############## ### #######\n#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\#\n#######################################\n\nTrampoline A targets 1\nTrampoline B targets 2\n\n",flood1:"###########\n#....R....#\n#.*******.#\n#.\\\\\\\\\\\\\\.#\n#. .#\n#..*\\\\\\*..#\n#.#*\\\\\\*#.#\n#########L#\n\nWater 1\nFlooding 8 \nWaterproof 5\nHighscore 945\n",flood2:"#######\n#..***#\n#..\\\\\\#\n#...**#\n#.*.*\\#\nLR....#\n#######\n\nFlooding 5\nWaterproof 3\nHighscore 281\n",flood3:"############\n#..........#\n#.....*....#\n#..\\\\\\\\\\\\..#\n#. ....#\n#..\\\\\\\\\\\\\\.#\n#..\\.. .#\n#..\\.. ....#\n#..... ..* #\n#..### ### #\n#...R#\\#\\\\.#\n######L#####\n\nWaterproof 10 \nFlooding 10\nWater 2\nHighscore 1303\n",flood4:"########################\n#.....................\\#\n#......*\\ ...........#\n#......*... ......* ...#\n#.. \\\\... .*..... ...#\n#.. ....... ....... ...#\n#.. ....... .\\\\.... ...# ######\n#. .... .....\\...# #\\\\\\\\#\n#\\\\\\......... .........# #....#\n########### R ########*#####\n #.......... ........***\\\\\\#\n #.......... ............**#\n #.......... ......... *.*\\#\n #....\\\\.... ....\\\\..... ..L\n #.....................****#\n #........\\*...............#\n #........... .........#\n #.........................#\n ###########################\n\nWater 1\nFlooding 20\nWaterproof 10\nHighscore 1592\n",flood5:"#########\n#.*..#\\.#\n#.\\..#\\.L\n#.R .##.#\n#.\\ ...#\n#..\\ ..#\n#...\\ ##\n#....\\ \\#\n#########\n\nWater 2\nFlooding 11\nWaterproof 5\nHighscore 575\n",contest1:"######\n#. *R#\n# \\.#\n#\\ * #\nL .\\#\n######\n\nHighscore 212\n",contest2:"#######\n#..***#\n#..\\\\\\#\n#...**#\n#.*.*\\#\nLR....#\n#######\n\nHighscore 281\n",contest3:"########\n#..R...#\n#..*...#\n#..#...#\n#.\\.\\..L\n####**.#\n#\\.....#\n#\\..* .#\n########\n\nHighscore 275\n",contest4:"#########\n#.*..#\\.#\n#.\\..#\\.L\n#.R .##.#\n#.\\ ...#\n#..\\ ..#\n#...\\ ##\n#....\\ \\#\n#########\n\nHighscore 575\n",contest5:"############\n#..........#\n#.....*....#\n#..\\\\\\\\\\\\..#\n#. ....#\n#..\\\\\\\\\\\\\\.#\n#..\\.. .#\n#..\\.. ....#\n#..... ..* #\n#..### ### #\n#...R#\\#\\\\.#\n######L#####\n\nHighscore 1303\n",contest6:"###############\n#\\\\\\.......** #\n#\\\\#.#####...##\n#\\\\#.....*##. #\n#\\#####\\...## #\n#\\......####* #\n#\\.######* #.\\#\n#\\.#. *...##.##\n#\\##. .. *...#\n#\\...... L#.#.#\n###########.#.#\n#\\..........#.#\n##.##########.#\n#R.#\\.........#\n###############\n\nHighscore 1177\n",contest7:" #######\n ## *#\n ##R *##\n ##\\\\\\\\##\n ##....##\n ##..\\ . ##\n ## . L . ##\n ##\\\\\\# #\\\\\\\\##\n ###### #######\n\nHighscore 869\n",contest8:"##############\n#\\\\... ......#\n###.#. ...*..#\n #.#. ... ..#\n### #. \\ ..#\n#. .#..... **#######\n#.#\\#..... ..\\\\\\*. #\n#*\\\\#.###. ####\\\\\\ #\n#\\\\.#. ...## \\ #\n#\\#.#..... ....# \\ # \n###.#..... ....# ##\n#\\\\.#..... ....#\\ # \n########.. ..###*####\n#......... .........#\n#......... ....***..#\n#..\\\\\\\\\\ # ####.....#\n#........*R..\\\\\\ .#\n##########L##########\n\nHighscore 1973\n",contest9:" #L#######\n #*** \\\\ #\n #\\\\\\ .. #\n#########.## ##########\n#.......\\ ..........* .#\n#*******\\......#....#\\\\ .#\n###\\.\\\\\\...**..#....... *#\n#*****\\\\ .\\\\..## #\\.#\n######### .... ##########\n # #\n ####*#### \n #.......#\n######### \\\\\\\\*##########\n#*\\\\ **# *..*\\ \\\\\\\\\\#\n#.\\**\\*** .....**.# \\\\##\\#\n#\\R...... .\\\\.. \\\\\\\\\\#\n##########################\n\nHighscore 3093\n",contest10:"#############################\n#..........................\\#\n#..\\\\###...#.... ###.#\n#..\\*\\\\\\.. #.... ..##\\\\..\\#.#\n#..\\*\\.... #.... ..#\\#....#.#\n#...\\###.. #.... ....#....#.#\n#... ..... ..... .####......#\n#\\\\. #.... .......#\n#... #..#. .....*\\ ##.......#\n#.#....... ...#.. ....######\n#. ...#... ...#.\\ ....#..* #\n##........ ...#.. #....#.#\\\\#\n#.....*... .....*\\#\\\\.....*.#\n#.***.* .......*\\****.....#.#\n#.\\\\\\.. ................ .#\n#.##### .###### ##### #\n#....\\\\.................... #\n#....****...#.##.....\\\\\\\\..\\#\n#....\\\\\\\\...#.........*....\\#\n#....\\\\\\\\...#.\\\\. #\\###.\\#\n#.... ..#.... ...#\\\\\\\\. #\n#........ ..#.... ...#..... #\n#........ ........#R#\n###########################L#\n\nHighscore 3634\n",ems1:"#######\n#L\\\\\\##\n##* ##\n##* ##\n##* ##\n##* ##\n##* ##\n##* ##\n##* ##\n##* ##\n##* ##\n## ##\n## ##\n##R ##\n## # ##\n#\\ # \\#\n## # ##\n## # ##\n## # ##\n## # ##\n#######\n\nAuthor ems_ (irc)\nHighscore 334\n",ems2:"#########\n###***###\n###***###\n###***###\n###***###\n###***###\n###***###\n# .**\\\\#\n# # #*#\\#\n# # #*#\\#\n# # #*#\\#\n# # #*#\\#\n# # #*#\\#\n# .#\\#\n### **#\n### R \\\\#\n### #L#\n### ###\n### ###\n### ###\n### ###\n### ###\n### ###\n#########\n\nAuthor ems_ (irc)\nHighscore 691\n",ems3:"################\n#\\.****####\\#*##\n#\\.\\\\\\\\.***...##\n##*####.#*###..#\n#\\.R....#...##\\#\n#\\ ####...#.#*.#\n#\\ **######.#..#\n##...\\\\\\\\\\\\...##\n#L.##########.##\n################\n\nAuthor ems_ (irc)\nHighscore 1199\n",ems3v2:"################\n#\\.****####\\#*##\n#\\.\\\\\\\\.***...##\n##*####.#*###..#\n#\\.R....#...##\\#\n#\\ ####...#.#*.#\n#\\ **######.#..#\n##...\\\\\\\\\\\\...##\n#L.#\\########.##\n################\n\nAuthor ems_ (irc)\nHighscore 1272\n",ems4:"#########\n#* L#\n#\\ #\n#\\\\ #\n##\\\\ #\n###\\\\ #\n####\\\\ #\n#####\\\\ #\n####### #\n# #*#*# #\n# * * #\n# #*#*# #\n# * * #\n# #*#*# #\n# R* * #\n# #*#*# #\n# * * #\n# #*#*# #\n# * * #\n# #*#*# #\n# * * #\n###*#*#.#\n#\\. . #\\#\n### # ###\n### # ###\n## # ##\n## # ##\n## # ##\n## # ##\n## # ##\n#########\n\nAuthor ems_ (irc)\nHighscore 908\n",ems5:"###################\n#************* ##\n##***********# * ##\n###*********##.*.##\n####*******####*###\n#####*****#####*###\n######***######*###\n#######*#######*###\n###### * ######*###\n#\\ . #*###\n#\\ \\ #*###\n#\\ ** #*###\n#\\ ## #*###\n#\\ #*###\n#\\ \\ \\ #*###\n#\\ ** ** #*###\n#\\ ## ## #*###\n#\\ #*###\n#\\ \\ \\ \\ #*###\n#R ** ** ** #*\\##\n#### ## ## ## #*###\n###L . ##\n#### ## ## ## ## #\n### # ## # # #\n### # ## # # #\n### # ## # # #\n###################\n\nAuthor ems_ (irc)\nHighscore 897\n",ems5v2:"###################\n#************* ##\n##***********# * ##\n###*********##.*.##\n####*******####*###\n#####*****#####*###\n######***######*###\n#######*#######*###\n###### * ######*###\n#\\ . #*###\n#\\ \\ #*###\n#\\ ** #*###\n#\\ ## #*###\n#\\ #*###\n#\\ \\ \\ #*###\n#\\ ** ** #*###\n#\\ ## ## #*###\n#\\ #*###\n#\\ \\ \\ \\ #*###\n#R ** ** ** #*\\##\n#### ## ## ## #*###\n#### . ##\n#### ## ## ## ## ##\n## ## # # # #\n## * L# #\\ # # *#\n## ## # \\ # ## #\n## #### # \\# \\# #\n###################\n\nAuthor ems_ (irc)\nHighscore 1238\n",ems6:"###########################\n#............R............#\n#.####.######L######.####.#\n#.####.#*#########*#.####.#\n#.####..\\#*******#\\..####.#\n#.######..\\\\\\\\\\\\\\..######.#\n#.####*######.######*####.#\n#.####\\.....#.#.....\\####.#\n#......####.#.#.####....#.#\n#####.#***#.#.#.#***#.#.#.#\n#......\\\\\\..#.#..\\\\\\..#.#.#\n#.#########*****#####.#.#.#\n#..........\\\\\\\\\\......#...#\n###########################\n\nAuthor ems_ (irc)\nWater 7\nWaterproof 42\nHighscore 1414\n",pacman:"###########################\n#............#............#\n#.####.#####.#.#####.####.#\n#\\# #.# #.#.# #.# #\\#\n#.####.#####.#.#####.####.#\n#.........................#\n#.####.#.#########.#.####.#\n#......#.....#.....#......#\n######.#####.#.#####.######\n #.# #.#\n######.# #### #### #.######\nL . # # . **\n######.# ######### #.######\n #.# #.#\n######.# ######### #.######\n#............#............#\n#.####.#####.#.#####.####.#\n#\\...#. R .#...\\#\n####.#.#.#########.#.#.####\n#......#.....#.....#......#\n#.##########.#.##########.#\n#.........................#\n###########################\n\nAuthor newsham (www.thenewsh.com/~newsham/x/pacman.map)\nHighscore 191\n",pacman2:"###########################\n#\\\\\\\\\\\\\\\\\\\\\\\\#\\\\\\\\\\\\\\\\\\\\\\\\#\n#\\####\\#####\\#\\#####\\####\\#\n#.# #\\# #\\#\\# #\\# #.#\n#\\####\\#####\\#\\#####\\####\\#\n#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\#\n#\\####\\#\\#########\\#\\####\\#\n#\\\\\\\\\\\\#\\\\\\\\\\#\\\\\\\\\\#\\\\\\\\\\\\#\n######\\#####\\#\\#####\\######\n #\\# #\\#\n######\\# #### #### #\\######\nL \\ # # \\ **\n######\\# ######### #\\######\n #\\# #\\#\n######\\# ######### #\\######\n#\\\\\\\\\\\\\\\\\\\\\\\\#\\\\\\\\\\\\\\\\\\\\\\\\#\n#\\####\\#####\\#\\#####\\####\\#\n#.\\\\\\#\\ R \\#\\\\\\.#\n####\\#\\#\\#########\\#\\#\\####\n#\\\\\\\\\\\\#\\\\\\\\\\#\\\\\\\\\\#\\\\\\\\\\\\#\n#\\##########\\#\\##########\\#\n#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\#\n###########################\n\nHighscore 15039\n"};if(typeof exports!=="undefined"){exports.maps=mineMaps}; \ No newline at end of file diff --git a/js/mine.min.js b/js/mine.min.js new file mode 100644 index 0000000..48dcf2a --- /dev/null +++ b/js/mine.min.js @@ -0,0 +1 @@ +var Mine=function(){var b=0,f=1,a=2,d=3;function e(g,h){return new Array(h+1).join(g)}function c(g){this.parse(g)}c.ALIVE=b;c.LOST=f;c.ABORTED=a;c.WON=d;c.prototype.parse=function(g){var o,k,h,n,j,m,p;this.orig_map=g;o=g.split(/\r\n?|\r?\n/);h=0;n=o.length;for(k=0;k="A"&&p[m]<="I"){if(this.trampoline.sources[p[m]]){throw"Can have only one trampoline "+p[m]}this.trampoline.sources[p[m]]={x:m,y:k,target:false};this.trampoline.fromSources}else{if(p[m]>="1"&&p[m]<="9"){if(this.trampoline.targets[p[m]]){throw"Can have only one trampoline target "+p[m]}this.trampoline.targets[p[m]]={x:m,y:k,sources:[]}}else{throw"Invalid character in map: '"+p[m]+"'"}}break}}}if(this.robot===false){throw"Need a robot"}this.meta={};for(k=0;k"I"){throw"Invalid trampoline source '"+l[1]+"'"}if(l[3].length!=1||l[3]<"1"||l[3]>"9"){throw"Invalid trampoline target '"+l[3]+"'"}if(!this.trampoline.sources[l[1]]){throw"Trampoline "+l[1]+" not defined"}if(!this.trampoline.targets[l[3]]){throw"Trampoline target "+l[3]+" not defined"}if(this.trampoline.sources[l[1]].target){throw"Trampoline "+l[1]+" already has a target"}this.trampoline.sources[l[1]].target=l[3];this.trampoline.targets[l[3]].sources.push(l[1]);break;default:this.meta[l[0]]=l.splice(1).join(" ");break}}for(k in this.trampoline.sources){if(this.trampoline.sources.hasOwnProperty(k)){if(!this.trampoline.sources[k].target){throw"Trampoline "+k+" has no target"}}}for(k in this.trampoline.targets){if(this.trampoline.targets.hasOwnProperty(k)){if(0==this.trampoline.targets[k].sources.length){throw"Trampoline target "+k+" has no sources"}}}this.water_level=this.water.level;this.state=b};c.prototype.get=function(g,h){if(g<0||h<0||g>=this.width||h>=this.height){return"#"}return this.map[h][g]};c.prototype.validMove=function(g){if(this.state!=b){return false}var i,h;g=g.toUpperCase();switch(g){case"L":case"R":i=(g=="L"?-1:1);if(this.robot.x+i<0){return false}if(this.robot.x+i>=this.width){return false}h=this.map[this.robot.y][this.robot.x+i];switch(h){case"#":return false;case" ":case".":case"\\":return true;case"L":return false;case"O":return true;case"*":if(this.robot.x+2*i<0){return false}if(this.robot.x+2*i>=this.width){return false}if(" "==this.map[this.robot.y][this.robot.x+2*i]){return true}default:if(this.trampoline.sources.hasOwnProperty(h)){return true}break}break;case"U":case"D":i=(g=="D"?-1:1);if(this.robot.y+i<0){return false}if(this.robot.y+i>=this.height){return false}h=this.map[this.robot.y+i][this.robot.x];switch(h){case"#":return false;case" ":case".":case"\\":return true;case"L":return false;case"O":return true;case"*":return false;default:if(this.trampoline.sources.hasOwnProperty(h)){return true}break}break;case"W":case"A":return true}return false};c.prototype.move=function(i){if(this.state!=b){return false}var h,j,p,o;i=i.toUpperCase();if(this.validMove(i)){switch(i.toUpperCase()){case"L":case"R":h=(i=="L"?-1:1);this.map[this.robot.y][this.robot.x]=" ";j=this.map[this.robot.y][this.robot.x+h];switch(j){case"*":this.map[this.robot.y][this.robot.x+2*h]="*";break;case"\\":this.lambdas--;this.found_lambdas++;break;case"O":this._foundLift();break;default:if(this.trampoline.sources.hasOwnProperty(j)){p=this.trampoline.sources[j];o=this.trampoline.targets[p.target];for(h=0;hthis.water.proof){this._drown()}}else{this.moves_below_water=0}if(this.water.flooding>0&&0==(this.moves%this.water.flooding)){++this.water_level}switch(this.state){case f:this.score=25*this.found_lambdas-this.moves;break;case d:this.score=75*this.found_lambdas-this.moves;break;case b:case a:this.score=50*this.found_lambdas-this.moves;break}};c.prototype._drown=function(){if(this.state