- var d = {};
- d.l = keys[65] || keys[37]; d.r = keys[68] || keys[39];
- d.u = keys[87] || keys[38]; d.d = keys[83] || keys[40];
- if ( d.l ) hero.direct(0).run(); if ( d.r ) hero.direct(4).run();
- if ( d.u ) hero.direct(2).run(); if ( d.d ) hero.direct(6).run();
- if ( d.u && d.l ) hero.direct(1).run();
- if ( d.u && d.r ) hero.direct(3).run();
- if ( d.d && d.l ) hero.direct(7).run();
- if ( d.d && d.r ) hero.direct(5).run();
- if ( ! (d.l || d.r || d.u || d.d) ) hero.stance();
+ // facing directions, indexed by OR of key press combinations
+ const dir = [ -1, 0, 4, -1, 2, 1, 3, 2, 6, 7, 5, 6, -1, 0, 4, -1 ];
+ // translation speed and direction, indexed by facing direction of movement
+ const trans = [ [-1.4,0], [-1,-1], [0,-1.4], [1,-1], [1.4,0], [1,1], [0,1.4], [-1,1] ];
+ var k = 0;
+
+ // OR of direction key presses
+ k += (keys[kbdmap.left] || keys[kbdmap.altleft]) ? 1 : 0;
+ k += (keys[kbdmap.right] || keys[kbdmap.altright]) ? 2 : 0;
+ k += (keys[kbdmap.up] || keys[kbdmap.altup]) ? 4 : 0;
+ k += (keys[kbdmap.down] || keys[kbdmap.altdown]) ? 8 : 0;
+
+ if (~dir[k]) {
+ hero.direct(dir[k]).run();
+ translate(trans[dir[k]][0], trans[dir[k]][1]);
+ } else hero.stance();