Constant z_space 0; Constant z_wall 1; Constant z_spot 2; Constant z_ware 3; Constant z_warespot 4; Constant z_me 5; Constant z_mespot 6; Constant h_left 0; Constant h_right 1; Constant h_up 2; Constant h_down 3; Constant h_left_p 4; Constant h_right_p 5; Constant h_up_p 6; Constant h_down_p 7; Global _dbw; [ _D ch; print (char) ch; _dbw++; if (_dbw % 11 == 10) if (60 <= _dbw) { new_line; _dbw = 0; } else { print " "; _dbw++; } ]; [ _L ch j; if (~~ch) ch = '-'; for (j = 8: j < screen_width: j++) { print (char) ch; } new_line; ]; [ H_Direction histchar; return histchar & 3; ]; [ H_IsPush histchar; return histchar & 4; ]; [ H_MakePush histchar; return histchar | 4; ]; [ H_DirToXOFS histchar; switch (histchar) { h_left: return -1; h_right: return 1; h_up: return 0; h_down: return 0; } ]; [ H_DirToYOFS histchar; switch (histchar) { h_left: return 0; h_right: return 0; h_up: return -1; h_down: return 1; } ]; [ Expand4by6ZData loadbuf len data dest i o c; o = 0; for (i = 3: i < len: i++) { c = loadbuf->i; if ('a' <= c && c <= 'x') { data = (c - 'a') % 4; c = 1 + (c - 'a') / 4; while (0 < c--) { ThreePut(dest, o, data); o++; } } else if (('y' == c) || ('z' == c)) { ThreePut(dest, o, c + ('e'-'a'-'y')); o++; } } ]; [ Expand4by6YData loadbuf len data dest i o c nl; nl = o = 0; for (i = 3: i < len: i++) { c = loadbuf->i; if ((c < 'a') || ('z' < c)) continue; if (nl) { ThreePut(dest, o, c -'a'); o++; nl = 0; } else { if ('a' <= c && c <= 'x') { data = (c - 'a') % 4; c = 1 + (c - 'a') / 4; while (0 < c--) { ThreePut(dest, o, data); o++; } } else if ('y' == c) { ThreePut(dest, o, c + ('e'-'a'-'y')); o++; } else if ('z' == c) nl = 1; } } ]; [ Expand2PackData loadbuf len data dest i o c l cnt; o = 0; for (i = 2: i < len: i++) { c = loadbuf->i; if (c == 'y' or 'z') { if (l < 4) cnt = 4; else cnt = 2; if (c == 'z') cnt = cnt + cnt; while (0 < cnt--) { ThreePut(dest, o, l); o++; } continue; } c = c - 'a'; if (0 <= c && c < 16) { ThreePut(dest, o, c/4); o++; ThreePut(dest, o, c%4); o++; l = c%4; } else { c = c - 16; if (0 <= c && c < 8) { ThreePut(dest, o, c); o++; l = c; } } } ]; [ ExpandBuiltinData loadbuf len data dest i o c lc; i = data.print_to_array(loadbuf); if (i ~= len) { print "^^OOPS! i is ", i, " and len is ", len, "^^"; } len = len + 2; if (loadbuf->2 == 'z') return Expand4by6ZData(loadbuf, len, data, dest); if (loadbuf->2 == 'y') return Expand4by6YData(loadbuf, len, data, dest); if ('a'+16 <= loadbuf->2) return Expand2PackData(loadbuf, len, data, dest); ! Basic RLE decoding o = 0; for (i = 2: i < len: i++) { c = loadbuf->i; if ('a' <= c && c <= 'h') { lc = c; ThreePut(dest, o, lc-'a'); o++; } else if ('i' <= c && c <= 'z') { ThreePut(dest, o, lc-'a'); o++; ThreePut(dest, o, lc-'a'); o++; while ('i' < c) { ThreePut(dest, o, lc-'a'); o++; c--; } } } ]; ! Functions for LevelSet_Data and Solution_Data access. ! Get various aspects of a level. [ _LS_Width w; return w; ]; [ _LS_Height w h; w=w; return h; ]; [ _LS_BytesNeededForExpand w h len data; w=h+data; return len+2; ]; [ _LS_BytesNeeded w h len data; len=data; return ThreeNeed(w*h); ]; [ LS_Width id; return _LS_Data(id, _LS_Width); ]; [ LS_Height id; return _LS_Data(id, _LS_Height); ]; [ LS_BytesNeededForExpand id; return _LS_Data(id, _LS_BytesNeededForExpand); ]; [ LS_BytesNeeded id; return _LS_Data(id, _LS_BytesNeeded); ]; [ _SO_Move move push len data credit; push=len+data+credit; return move; ]; [ _SO_Push move push len data credit; move=len+data+credit; return push; ]; [ _SO_Credits move push len data cid; move=push+len+data; if (cid) return Credits(cid); return cid; ]; [ SO_Move set lvl kind; return Solution_Data(set, lvl, kind, _SO_Move); ]; [ SO_Push set lvl kind; return Solution_Data(set, lvl, kind, _SO_Push); ]; [ SO_Credits set lvl kind; return Solution_Data(set, lvl, kind, _SO_Credits); ];