Do not mark the help topic as the last search.
[mp-5.x.git] / mp_toys.mpsl
blob38c7a63496027d918e1b955a996f2a5896b35619
1 /*
3     Minimum Profit 5.x
4     A Programmer's Text Editor
6     Useless things.
8     Copyright (C) 1991-2009 Angel Ortega <angel@triptico.com>
10     This program is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     as published by the Free Software Foundation; either version 2
13     of the License, or (at your option) any later version.
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24     http://www.triptico.com
28 sub mp.maze(doc, keycode)
30         local tx = mp.window.tx;
31         local ty = mp.window.ty;
33         if (doc == NULL)
34                 doc = mp.open('<maze>');
36         local maze = doc.maze;
38         if (maze == NULL || maze.tx != tx || maze.ty != ty) {
39                 /* new or changed: rebuild everything */
40                 maze = {};
41                 maze.tx = tx;
42                 maze.ty = ty;
43                 doc.maze = maze;
45                 /* ensure odd size */
46                 if (!(tx & 1))
47                         tx--;
48                 if (!(ty & 1))
49                         ty--;
51                 /* init */
52                 maze.map = map(
53             [1 .. ty],
54             sub {
55                 map(
56                     [1 .. tx],
57                     sub { '#'; }
58                 );
59             }
60         );
62                 /* build */
63                 local x = 1;
64                 local y = 1;
65                 local stack = [];
67                 while (1) {
68                         local d = [];
70                         /* clear */
71                         maze.map[y][x] = ' ';
73                         foreach (t, [[0, -1], [1, 0], [0, 1], [-1, 0]]) {
74                                 /* can space be opened? */
75                                 local ny = y + t[0] * 2;
76                                 local nx = x + t[1] * 2;
78                                 if (nx > 0 && ny > 0 && maze.map[ny][nx] eq '#')
79                                         push(d, t);
80                         }
82                         if (size(d)) {
83                                 /* more than one way? stack this position */
84                                 if (size(d) > 1)
85                                         push(stack, [y, x]);
87                                 /* pick one direction at random and move there */
88                                 local m = d[random(size(d))];
90                                 y += m[0];
91                                 x += m[1];
93                                 maze.map[y][x] = ' ';
95                                 y += m[0];
96                                 x += m[1];
97                         }
98                         else {
99                                 /* no way from here: pop previous position */
100                                 if ((d = pop(stack)) == NULL)
101                                         break;
103                                 y = d[0];
104                                 x = d[1];
105                         }
106                 }
108                 maze.x = 1 + random(tx / 2) * 2;
109                 maze.y = 1 + random(ty / 2) * 2;
111                 maze.map[maze.y][maze.x] = '@';
113                 x = 1 + random(tx / 2) * 2;
114                 y = 1 + random(ty / 2) * 2;
116                 maze.map[y][x] = 'X';
118                 doc.keypress = sub(d, k) { mp.maze(d, k); };
120                 doc.paint = sub(d) { map(d.maze.map, sub(e) { [8, join(e)];}); };
121         }
123         local x = maze.x;
124         local y = maze.y;
126         maze.map[y][x] = ' ';
128         if (keycode eq 'cursor-up')
129                 y--;
130         if (keycode eq 'cursor-down')
131                 y++;
132         if (keycode eq 'cursor-left')
133                 x--;
134         if (keycode eq 'cursor-right')
135                 x++;
137         if (maze.map[y][x] eq 'X') {
138                 mp.alert("You won!");
139                 doc.maze = NULL;
140                 return mp.maze(doc);
141         }
143         if (maze.map[y][x] eq ' ') {
144                 maze.x = x;
145                 maze.y = y;
146         }
148         maze.map[maze.y][maze.x] = '@';
150         return doc;