From 6716656e296a506a87566c05456b415171917d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Sat, 14 Jul 2012 13:13:48 +0200 Subject: [PATCH] key event fixes, add canvas mode (default) --- js/earth.png | Bin 0 -> 219 bytes js/empty.png | Bin 0 -> 73 bytes js/gui.js | 131 +++++++++++++++++++++++++++++++++++----------- js/index.html | 7 +-- js/lambda.png | Bin 0 -> 592 bytes js/liftclosed.png | Bin 0 -> 603 bytes js/liftopen.png | Bin 0 -> 558 bytes js/robot.png | Bin 0 -> 621 bytes js/rock.png | Bin 0 -> 741 bytes js/wall.png | Bin 0 -> 722 bytes 10 files changed, 105 insertions(+), 33 deletions(-) create mode 100644 js/earth.png create mode 100644 js/empty.png create mode 100644 js/lambda.png create mode 100644 js/liftclosed.png create mode 100644 js/liftopen.png create mode 100644 js/robot.png create mode 100644 js/rock.png create mode 100644 js/wall.png diff --git a/js/earth.png b/js/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..c20f0cda8a4ef706687295283b723ce2cae5b192 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|i#%N%Lp096y=cgH*nopI;HqR( zFLThdZ$W$is}^(=E^&EvVA4T3tCH7E7o2}_e5_c%dM0DTDx=M-m>Om(CS5*hY|Uw0YKk`(OZP}+7)ATV^doWMtmK8eNZGjH0Q|GlsO&;R!Me;zV(CDqPT TT=@Aj(6tPnu6{1-oD!M<)X7?_ literal 0 HcmV?d00001 diff --git a/js/empty.png b/js/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..04206c63f03448272f5b0b9c7eadbe016e062f17 GIT binary patch literal 73 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFCSJY5_^G|nd{NU$zW5IMlWz%0PP Um@zT;Fi?)c)78&qol`;+0L$hM)&Kwi literal 0 HcmV?d00001 diff --git a/js/gui.js b/js/gui.js index fe59612..5573ff8 100644 --- a/js/gui.js +++ b/js/gui.js @@ -1,28 +1,31 @@ var mineGui_mine, mineGui_curmap, mineGui_curndx, mineGui_moves = ""; var mineGui_movesBackup = []; var mineGui_customNdx = 1; +var mineGui_canvas = true; -function mineGui_addCustomMap() { - var map = document.getElementById("mineGui_data").value; - var mine; - var selMap = document.getElementById("mineGui_selectMap"); - document.getElementById("mineGui_addDataResult").textContent = ""; - try { - mine = new Mine(map); - } catch (e) { - document.getElementById("mineGui_addDataResult").textContent = "Adding map failed: " + e; - return; - } - mineMaps["custom" + mineGui_customNdx] = map; - var entry = document.createElement("option"); - entry.textContent = "custom" + mineGui_customNdx; - selMap.appendChild(entry); - mineGui_customNdx++; +var mineGui_imgSources = { + 'R': 'robot.png', + '#': 'wall.png', + '*': 'rock.png', + '\\': 'lambda.png', + 'L': 'liftclosed.png', + 'O': 'liftopen.png', + '.': 'earth.png', + ' ': 'empty.png' +}; +var mineGui_images = {}; +var mineGui_imagesNeed = 0; - window.setTimeout(function() { - selMap.selectedIndex = selMap.options.length - 1; - selMap.onchange(); - }, 0); +function mineGui_loadImg(key, src) { + var img; + ++mineGui_imagesNeed; + mineGui_images[key] = img = new Image(); + img.onload = function() { + if (0 == --mineGui_imagesNeed) { + mineGui_show(); + } + }; + img.src = src; } function mineGui_start() { @@ -31,6 +34,7 @@ function mineGui_start() { var inpMoves = document.getElementById("mineGui_moves"); var customMapInput = document.getElementById("mineGui_data") var validMoves = {L:1,U:1,R:1,D:1,A:1,W:1}; + var k; document.getElementById("mineGui_addData").onclick = mineGui_addCustomMap; selMap.onchange = function() { var k = selMap.options[selMap.selectedIndex].text; @@ -54,21 +58,30 @@ function mineGui_start() { inpMoves.onpaste = delayInpValidate; inpMoves.onkeypress = delayInpValidate; document.body.onkeydown = function (event) { -// console.log("body", event, event.type); +// console.log("body", event); +// console.log("isChar", event.isChar, +// "; char '"+String.fromCharCode(event.charCode)+ +// "'; key '"+String.fromCharCode(event.keyCode)+"'") if (document.activeElement === customMapInput) return; if (event.ctrlKey || event.altKey || event.metaKey) return; var handled = true; - var cmd = String.fromCharCode(event.charCode || event.keyCode).toUpperCase(); + + // ascii keys are reported as uppercase ascii code + var cmd = String.fromCharCode(event.keyCode); if (validMoves[cmd]) { mineGui_move(cmd); } else if (cmd == 'C') { // clear mineGui_moves = ""; mineGui_updateMine(); - } else if (event.keyCode == 8 || event.charCode == 8) { - // backspace -> undo + } else if (cmd == 'T') { // toggle text/canvas + mineGui_canvas = !mineGui_canvas; + console.log("canvas show", mineGui_canvas); + mineGui_show(); + } else switch (event.keyCode) { + case 8: // backspace -> undo mineGui_moves = mineGui_moves.slice(0,-1); mineGui_updateMine(); - } else switch (event.keyCode) { + break; case 33: // page up if (selMap.selectedIndex > 0) { selMap.selectedIndex--; @@ -82,16 +95,16 @@ function mineGui_start() { } break; case 37: // left - mineGui_move('L'); + if (mineGui_mine.validMove('L')) mineGui_move('L'); break; case 38: // up - mineGui_move('U'); + if (mineGui_mine.validMove('U')) mineGui_move('U'); break; case 39: // right - mineGui_move('R'); + if (mineGui_mine.validMove('R')) mineGui_move('R'); break; case 40: // down - mineGui_move('D'); + if (mineGui_mine.validMove('D')) mineGui_move('D'); break; default: handled = false; @@ -103,6 +116,11 @@ function mineGui_start() { return true; } }; + for (k in mineGui_imgSources) { + if (mineGui_imgSources.hasOwnProperty(k)) { + mineGui_loadImg(k, mineGui_imgSources[k]); + } + } for (k in mineMaps) { if (mineMaps.hasOwnProperty(k)) { var entry = document.createElement("option"); @@ -115,6 +133,29 @@ function mineGui_start() { selMap.onchange(); } +function mineGui_addCustomMap() { + var map = document.getElementById("mineGui_data").value; + var mine; + var selMap = document.getElementById("mineGui_selectMap"); + document.getElementById("mineGui_addDataResult").textContent = ""; + try { + mine = new Mine(map); + } catch (e) { + document.getElementById("mineGui_addDataResult").textContent = "Adding map failed: " + e; + return; + } + mineMaps["custom" + mineGui_customNdx] = map; + var entry = document.createElement("option"); + entry.textContent = "custom" + mineGui_customNdx; + selMap.appendChild(entry); + mineGui_customNdx++; + + window.setTimeout(function() { + selMap.selectedIndex = selMap.options.length - 1; + selMap.onchange(); + }, 0); +} + function mineGui_move(cmd) { for (i = 0; i < cmd.length; ++i) { if (mineGui_mine.state != Mine.ALIVE) break; @@ -149,12 +190,42 @@ function mineGui_updateMine() { function mineGui_show() { var waterLevel = Math.max(mineGui_mine.meta.Water, 0); var map = mineGui_mine.toString().split(/\n/); + var canv = document.getElementById("mineGui_mineCanvas"); + var mapNode = document.getElementById("mineGui_mineMap"); + if (mineGui_canvas && 0 == mineGui_imagesNeed) { + canv.style.display = ''; + canv.style.visibility = 'visible'; + mapNode.style.display = 'none'; + mapNode.style.visibility = 'hidden'; + canv.width = 16*mineGui_mine.width; + canv.height = 16*mineGui_mine.height; + var ctx = canv.getContext("2d"); + ctx.globalAlpha=1.0; + ctx.fillStyle = "black"; + ctx.fillRect(0,0,canv.width, canv.height); + for (var y = 0; y < mineGui_mine.height; ++y) { + for (var x = 0; x < mineGui_mine.width; ++x) { + ctx.drawImage(mineGui_images[map[y][x]],16*x,16*y); + } + } + ctx.fillStyle = "#0000FF"; + ctx.globalAlpha = 0.3; + y = 16*(mineGui_mine.height - waterLevel); + ctx.fillRect(0,y,canv.width, canv.height-y); + } else { + canv.style.display = 'none'; + canv.style.visibility = 'hidden'; + mapNode.style.display = ''; + mapNode.style.visibility = 'visible'; + } + if (waterLevel > 0) { document.getElementById("mineGui_mineMapWater").textContent = map.splice(-waterLevel).join("\n"); } else { document.getElementById("mineGui_mineMapWater").textContent = ""; } - document.getElementById("mineGui_mineMap").textContent = map.join("\n"); + document.getElementById("mineGui_mineMapDry").textContent = map.join("\n"); + document.getElementById("mineGui_moves").value = mineGui_moves; var state = ""; switch (mineGui_mine.state) { diff --git a/js/index.html b/js/index.html index 3336f5b..e350630 100644 --- a/js/index.html +++ b/js/index.html @@ -7,6 +7,7 @@

ICFP Contest 2012 Simulator

Links: contest page.
This simulator may or may not perform according to specs, who knows...
+
@@ -14,9 +15,9 @@ Select Map:
Moves:
-

+			

 
-			
+

 		
@@ -34,7 +35,7 @@
Help:
 (L)eft/(U)p/(R)ight/(D)own work as expected (letter and arrow keys), (A)bort and (W)ait too.
-Special keys: PageUp/PageDown for map select, Backspace for undo and (C)lear
+Special keys: PageUp/PageDown for map select, Backspace for undo, (C)lear and (T)oggle text mode
 Be careful: a reload looses all custom maps and saved moves.
 Listed highscore can be outdated.
 	
diff --git a/js/lambda.png b/js/lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..29a2e08f79b653b46341016145739bb6fa2dd28f GIT binary patch literal 592 zcmV-W0T^51^1J$gG$pWnh*$ElV{LXyN^kP@_ zgMbU(2CQH)jx;j_5P*UJR!AbvbYIm~<9n)~AP1twgJs1MQ-e1^Boj)%5!lW>vx^4#6lU!A`?9vX*zB;RgVjy@94(2Rl{Vsulmh9V=X`t9C^vG-W|<1&znc8Z*m9} z0hV$mg9B|g>gk^9F$rXbm@sIbwtBg0?yJ6wtQeN9{IBchk!Ji*TYENr(del};rp-G zS?{yd!=iuGH;3oCiT#7Wpo98~@VnpZPJbMBYT%{>k9R~cHPzhJ6m1yJJphfPZN1QR eU|Gt^4gUZih0YMNO|#4Z000081LhUGeMmYmDp`$4x^uJ*w*c;l`WDq0pa|+lz+QKQlZMcwu`_ zLwg5$02EL_gbN6;4JkC3KunuuAq&M79Vi59-g%ehu6qk|RN*qoocoYYnCPWBUG zbA0@16n6S%Beiv{OeZ%wmzXJiIP4NXzJF~xZqMKM172SA&Cb^5tLzU%)~xJYUUGVV zAMOe~*6|}--Gg12!3cUdQ&vU|GYHVZIc&f@qG#))A&4|x7bkyn8R}fEo4Vk2+exb- zl(dR!1nY7qa0ezJ0IXmPQBkLN3<5Z`ps)w~QP`T*i{8EsLRQ4lfeHd7!6L<|D{{}x z-R+-$&ZD!1`Y_-X2%a(2Fb5N|BaxgjuSz`$CDZs&y z@4$Y99x0$uzgX69^!9mD=p^`xU0n^d~9c1tu;Q#;t07*qoM6N<$g2p!dCIA2c literal 0 HcmV?d00001 diff --git a/js/robot.png b/js/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..09610567f743343ac4cbddb101be16d9d9cb73e2 GIT binary patch literal 621 zcmV-z0+RiSP)UZzmIqvtjH<$$y2_`Zjx`A5NEQ!9qB<(M4d)XAAZU5NX zdfxY!wsv0BoUzsoh|nZDjuyAwcYV~=>CFfC_a5BeTb46e zR4*+1kEeP(3I4@r0)R9BWNF(vy?{W?jdjv7DV(LiwDQ;Q-_InwuIIxWVAh@!>*k(5 zyz=!jkSmc10XCIgSUo=QM~D9K*^Tbv$&;5SPhQ^WF8ae~{^)S^_+S?{l>kDZtxVzQ zw?Fm2*BW=`^8SfTfh}Lo{FRm7-rjuY(~p)g1Ox?Dt?|6)e-94QTC?t~(|bUd|4G*8 z&fdLt?NpM5f>{*96>DrUGM8~DtW)ljyZ{(0shLZ+5Ueo_F=C85YQQnaWJ<0-e7oQH z0F2V^ee<2QQ*&@ZLyQQ5NK^|g`WEHyU!R`KD@p-~@lD$J;QG}CallNgdl9;ZHHoBz zkzqrDRBAotAnPMNkePYOr}GKks^thF`}U(Mq2@f01DPnG@+S7bRiNT7Ah1` zqT`MOARt1K=oX+vDnt~F04-Fvaf~AYi2z<2YC{Q7pa9DMpnwd`&l{fK00000NkvXX Hu0mjfTg)rR literal 0 HcmV?d00001 diff --git a/js/rock.png b/js/rock.png new file mode 100644 index 0000000000000000000000000000000000000000..c807636bf2f68d5d9d21fe46cafab304cfed3666 GIT binary patch literal 741 zcmV10L00!XqeBN{BW;!1>iOnRLv`HfYQE4?sH$_m;jZi2yQqoXxr}ZDW_Xh~>+}H}O z;6HHDE*dJZhLt+2EV?8%KK`&b^G$fB$*bZMM}|^-*(6oGD@$T%KL}d%tz;Q7QpHiwlZ< z_u~({g>+-;S>>xI%pEn<3<(23F~->)BN_xrv3|2LXb)3sNpgZYKJ zN^%W=5GsHO;v{#%(A(E;y+OwA+`YHI-&MnKWoBOII9sbb>Wf%Q0C`3QXaIR!)P3Rp z`0f7D#*4G<D3jh8$1sXF0$Snz*({HO;Q2a$mY0?w&0ZW8XR<&TJG zVvo9%`Y}16P&;x}kB2Fg}X+QxbU<~L34In820hIMDU_HDB XayT`o+(Gbf00000NkvXXu0mjfV{c$6 literal 0 HcmV?d00001 diff --git a/js/wall.png b/js/wall.png new file mode 100644 index 0000000000000000000000000000000000000000..96cb7c48d959c8392f843d06db1ef2cb00c35ab0 GIT binary patch literal 722 zcmV;@0xkWCP)Xt?kQ`zBVR(|k&Z)^MOU$0z! z_vA%O!=Gz8eSBf#c)D&WU*@B|QF*D)LTgnnjtX>G6bH}AiJU$yrVJr(jLqisSwlrC+zHuN??B?}bYda`}+ zFZHBFY`yQt&AE~CADN>&Z@uwvt_(_MO+vqb2~Vd-OwlhwKcsPpn=k&QzqBOvQNfwmM!098Jve+jHS6p)thQ}_kL-6Ml-6HU) zKa>7oCS0#i@C;SAzBnQiOGl;c=B_a*RI(fZm`=8$1rI(DuXz(b_`$h*}6f*}P zSlqDvn|0Ulu;M=Vp3+PMVCm@JgjZ5qz;TjP3QG(OgX!E64x-ErA`PP^1?QXt2yKlH zwr@8+8xm4