1#
2#   Copyright <=2011 by Simon Huggenberger
3#   Maintenance modifications 2011,2014 by the cuyo developers
4#
5#   This program is free software; you can redistribute it and/or modify
6#   it under the terms of the GNU General Public License as published by
7#   the Free Software Foundation; either version 2 of the License, or
8#   (at your option) any later version.
9#
10#   This program is distributed in the hope that it will be useful,
11#   but WITHOUT ANY WARRANTY; without even the implied warranty of
12#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13#   GNU General Public License for more details.
14#
15#   You should have received a copy of the GNU General Public License
16#   along with this program; if not, write to the Free Software
17#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18#
19# The above notices apply to this file and to:
20#   spBlinky.xpm[.gz], spClyde.xpm[.gz], spEyes.xpm[.gz], spGhost.xpm[.gz],
21#   spInkey.xpm[.gz], spLabyrinth.xpm[.gz], spPacman10.xpm[.gz],
22#   spPacman11.xpm[.gz], spPacman2.xpm[.gz], spPacman3.xpm[.gz],
23#   spPacman4.xpm[.gz], spPacman5.xpm[.gz], spPacman6.xpm[.gz],
24#   spPacman7.xpm[.gz], spPacman8.xpm[.gz], spPacman9.xpm[.gz],
25#   spPacman.xpm[.gz], spPfeil.xpm[.gz], spPinky.xpm[.gz]
26#
27
28
29Pacman={
30  name="Pacman"
31  author="Simon"
32  numexplode=3
33  numexplode1=3
34  chaingrass=1
35  pics=spUp,spRight,spDown,spLeft,spLife
36  bgcolor=0,0,0
37  topcolor=0,0,191
38  toptime=50
39  startpic=spLabyrinth
40  startdist="GMGKMGKMGM","FFDOJDOJFF","DNGPKKPMHJ","KPJFQIFDPK",
41	"GLKNGMHKLM","DKKLJDLKKJ"
42  greypic=ilTuer.xpm
43  textcolor=127,255,255
44  topoverlap=0
45  description="Wanna play Pacman?"
46
47# schnellere 180er-Wende
48# halbe Kekse entfernen
49# gefangener Geist/ ausbrechender Geist
50# version "andert Labyrinth
51# individuelle Verfolgung
52# schnellere Animation
53# Wiederauferstehung Pacmans
54
55  <<
56  var pacman,ghost,blinky,clyde,inkey,pinky;
57  var keks,move,chmove,pac_x,pac_y;
58  var wayo,wayr,wayu,wayl,ways;
59
60  global = {
61    switch {pacman<10 -> 0,0,0,0,0,0,1,0,0,0,0,0,0,2;
62	    => {0; pacman = 11},{0; pacman = 0},0,0,0,0,0,0,0,0,0,0,0,0,0;};
63    move = file;
64    switch {1:200 -> keks = 1;};
65    switch {move==2 -> {
66      switch {blinky==1..32 -> blinky -= 1;};
67      switch {pinky==1..32 -> pinky -= 1;};
68      switch {inkey==1..32 -> inkey -= 1;};
69      switch {clyde==1..32 -> clyde -= 1;};
70      switch {keks==1..16 -> keks -= 1;};
71    };};
72    switch {move>=1 && pacman==1..9 -> pacman += 1;}
73  };
74
75  spLabyrinth.init = {
76    pacman@ = 11;
77    switch {version!=16 -> {keks = 1; ways = version};
78      -> {ways = 2; wayr = 1; keks = 16; keks@(1,0) = 0};
79    };
80    switch {version%2==1 -> wayo = 1;};
81    switch {version%4>=2 -> {wayr = 1; keks += 2};};
82    switch {version%8>=4 -> {wayu = 1; keks += 4};};
83    switch {version%16>=8 -> wayl = 1;};
84    switch {(loc_x==0 || loc_x==9)&&(loc_y==16 || loc_y==19) -> keks+=7;};
85  };
86
87  spLife.init = kind = rnd(5);
88
89  spUp.turn = kind = spRight;
90  spRight.turn = kind = spDown;
91  spDown.turn = kind = spLeft;
92  spLeft.turn = kind = spUp;
93
94  labstart =
95    switch {
96      keks@(0,0)==16 -> {pinky = 10; inkey = 12};
97      keks@(-1,0)==16 -> {pinky = 14; clyde = 12};
98      keks@(0,-1)==16 -> pacman = 10;
99      keks@(-1,-1)==16 -> pacman = 14;
100      keks@(0,1)==16 -> blinky = 10;
101      keks@(-1,1)==16 -> blinky = 14;
102    }
103  ;
104
105  labmove = {
106    switch {
107      move%2==0 -> A;
108      move%8>=4 -> B;
109      -> C;
110    };
111    switch {
112      move==9..16 -> pos += 3;
113      move==17..24 -> pos += 6;
114      move>=25 -> pos += 9;
115    };
116    switch {
117      move%8==3..5 -> *;
118      move==6..7 || move==9..10  -> {qu = Q_TL_TR; *; qu = Q_BL_BR; *};
119      move==1..2 || move==14..15  -> {qu = Q_TR_TL; *; qu = Q_BR_BL; *};
120      move==22..23 || move==25..26 -> {qu = Q_BL_TL; *; qu = Q_BR_TR; *};
121      move==17..18 || move==30..31  -> {qu = Q_TL_BL; *; qu = Q_TR_BR; *};
122    };
123    switch {move@>=1 -> move += 1;};
124    qu = Q_ALL
125  };
126
127  labmov = {labmove; switch {move@==1 -> move -= 1;}};
128
129  labvom = {
130    switch {
131      move<=16 -> {move = 16-move; labmove; move = 16-move};
132      -> {move = 48-move; labmove; move = 48-move};
133    };
134    switch {move@>=1 -> move += move@;}
135  };
136
137  wandmove = {
138    switch {
139      ways==0 -> move@(0,0) = move;
140      ways==1 -> move = 20;
141      ways==2 -> move = 4;
142      ways==3 -> switch {1:2 -> move = 20; -> move = 4;};
143      ways==4 -> move = 28;
144      ways==5 -> switch {1:2 -> move = 20; -> move = 28;};
145      ways==6 -> switch {1:2 -> move = 4; -> move = 28;};
146      ways==7 -> switch {1:3 -> move = 20; 1:2 -> move = 4; -> move = 28;};
147      ways==8 -> move = 12;
148      ways==9 -> switch {1:2 -> move = 20; -> move = 12;};
149      ways==10 -> switch {1:2 -> move = 4; -> move = 12;};
150      ways==11 -> switch {1:3 -> move = 20; 1:2 -> move = 4; -> move = 12;};
151      ways==12 -> switch {1:2 -> move = 28; -> move = 12;};
152      ways==13 -> switch {1:3 -> move = 20; 1:2 -> move = 28; -> move = 12;};
153      ways==14 -> switch {1:3 -> move = 4; 1:2 -> move = 28; -> move = 12;};
154      ways==15 -> switch {1:4 -> move = 20; 1:3 -> move = 4;
155		          1:2 -> move = 28; -> move = 12;};
156    };
157  };
158
159  labwand = {
160    switch {
161      move@>=1 && move==4 && wayr==0  -> wandmove;
162      move@>=1 && move==12 && wayl==0  -> wandmove;
163      move@>=1 && move==20 && wayo==0  -> wandmove;
164      move@>=1 && move==28 && wayu==0  -> wandmove;
165    };
166  };
167
168  fressen = {
169    keks -= 8;
170    switch {blinky@!=33 -> blinky@ = 32;};
171    switch {pinky@!=33 -> pinky@ = 32;};
172    switch {inkey@!=33 -> inkey@ = 32;};
173    switch {clyde@!=33 -> clyde@ = 32;};
174  };
175
176  labkoll = {
177    switch {pacman>=move -> chmove=pacman; -> {chmove=move; move=pacman};};
178    switch {move==9..23 -> move = 32-move;};
179    switch {chmove==9..23 -> chmove = 32-chmove;};
180    switch {move>16 -> move -= 16;};
181    switch {chmove>16 -> chmove -= 16;};
182    switch {(chmove-move<=2 && move-chmove<=2) ||
183	    (chmove==10..14 && move==3..5) ||
184	    (chmove==11..13 && move==2..6) ->
185      switch {ghost==0 && blinky@==1..32 -> blinky@ = 33;
186              ghost==0 && blinky@==0 -> pacman@ = 1;};
187    }
188  };
189
190  labpacman = {
191    switch {pacman@>=1 -> file = pacman@+7; -> 1;};
192    move = pacman; labmove; pacman = move;
193    switch {move@>=1 -> {
194      switch {
195        pacman==6 ->
196          switch {loc_x==9 -> pacman@(-9,0) = 2; -> pacman@(1,0) = 2;};
197        pacman==14 ->
198          switch {loc_x==0 -> pacman@(9,0) = 10; -> pacman@(-1,0) = 10;};
199        pacman==22 -> pacman@(0,-1) = 18;
200        pacman==30 -> pacman@(0,1) = 26;
201      };
202      switch {
203        wayr==0 && pacman==5 -> pacman -= 1;
204        wayl==0 && pacman==13 -> pacman -= 1;
205        wayo==0 && pacman==21 -> pacman -= 1;
206        wayu==0 && pacman==29 -> pacman -= 1;
207	pacman@>=1 -> pacman -= 1;
208      };
209      switch {pacman%8==4 => {
210        switch {
211	  chmove@==1 && wayo==1 -> {pacman = 20; chmove@ = 0};
212	  chmove@==2 && wayr==1 -> {pacman = 4; chmove@ = 0};
213	  chmove@==3 && wayu==1 -> {pacman = 28; chmove@ = 0};
214	  chmove@==4 && wayl==1 -> {pacman = 12; chmove@ = 0};
215	};
216	switch {keks%2==1 -> keks -= 1; keks==8..14 => fressen;}
217      };};
218      switch {keks%4>=2 && (pacman==7 || pacman==11) -> keks -= 2;};
219      switch {keks%8>=4 && (pacman==19 || pacman==31) -> keks -= 4;};
220      switch {pacman%8==2..5 -> {
221        pac_x@ = loc_x; pac_y@ = loc_y;
222	switch {pacman@==0 -> {
223	  switch {blinky%8!=0 -> {ghost = 0; move = blinky; labkoll};};
224	  switch {clyde%8!=0 -> {ghost = 3; move = clyde; labkoll};}
225	};}
226      };}
227    };}
228  };
229
230  labfollow = {
231    switch {
232      move<=16 -> {
233        switch {
234	  1:2 && move==4 && loc_x<=pac_x@ -> ;
235	  1:2 && move==12 && loc_x>=pac_x@ -> ;
236	  wayo==1 && loc_y>=pac_y@ -> move = 20;
237	  wayu==1 && loc_y<=pac_y@ -> move = 28;
238	};
239      };
240      -> {
241        switch {
242	  1:2 && move==20 && loc_y>=pac_y@ -> ;
243	  1:2 && move==28 && loc_y<=pac_y@ -> ;
244	  wayr==1 && loc_x<=pac_x@ -> move = 4;
245	  wayl==1 && loc_x>=pac_x@ -> move = 12;
246	};
247      };
248    };
249  };
250
251  labturn = {
252    switch {
253      move==4 && wayl==1 -> {ways -= 8; wandmove; ways += 8};
254      move==12 && wayr==1 -> {ways -= 2; wandmove; ways += 2};
255      move==20 && wayu==1 -> {ways -= 4; wandmove; ways += 4};
256      move==28 && wayo==1 -> {ways -= 1; wandmove; ways += 1};
257    };
258  };
259
260  labghost = {
261    switch {
262      move%8==4 && (move@==2 || (move@==1 && file>=3)) -> {
263        switch {
264	  2:3 -> labfollow;
265	  -> labturn;
266	};
267        labwand;
268      };
269    };
270    switch {
271      file==2 -> switch {move%16>=9 -> labvom; -> labmov;};
272      file==1 -> {2; switch {move%16<=8 -> labvom; -> labmov;};};
273      -> labmove;
274    }
275  };
276
277  labblinky = {
278    switch {
279      blinky@==2..10 && blinky@%2==0 -> 1;
280      blinky@==1..32 -> 2;
281      blinky@==33 -> 3;
282      -> 4;
283    };
284    move = blinky; labghost; blinky = move;
285    switch {move@>=1 -> switch {
286      blinky==5 ->
287        switch {loc_x==9 -> blinky@(-9,0) = 1; -> blinky@(1,0) = 1;};
288      blinky==13 ->
289        switch {loc_x==0 -> blinky@(9,0) = 9; -> blinky@(-1,0) = 9;};
290      blinky==21 -> blinky@(0,-1) = 17;
291      blinky==29 -> blinky@(0,1) = 25;
292    };}
293  };
294
295  labpinky = {
296    5;
297    switch {pinky%8!=0 -> {move = pinky; labghost; pinky = move};};
298    switch {move@>=1 -> switch {
299      pinky==5 ->
300        switch {loc_x==9 -> pinky@(-9,0) = 1; -> pinky@(1,0) = 1;};
301      pinky==13 ->
302        switch {loc_x==0 -> pinky@(9,0) = 9; -> pinky@(-1,0) = 9;};
303      pinky==21 -> pinky@(0,-1) = 17;
304      pinky==29 -> pinky@(0,1) = 25;
305    };}
306  };
307
308  labinkey = {
309    6;
310    switch {inkey%8!=0 -> {move = inkey; labghost; inkey = move};};
311    switch {move@>=1 -> switch {
312      inkey==5 ->
313        switch {loc_x==9 -> inkey@(-9,0) = 1; -> inkey@(1,0) = 1;};
314      inkey==13 ->
315        switch {loc_x==0 -> inkey@(9,0) = 9; -> inkey@(-1,0) = 9;};
316      inkey==21 -> inkey@(0,-1) = 17;
317      inkey==29 -> inkey@(0,1) = 25;
318    };}
319  };
320
321  labclyde = {
322    7;
323    switch {clyde%8!=0 -> {move = clyde; labghost; clyde = move};};
324    switch {move@>=1 -> switch {
325      clyde==5 ->
326        switch {loc_x==9 -> clyde@(-9,0) = 1; -> clyde@(1,0) = 1;};
327      clyde==13 ->
328        switch {loc_x==0 -> clyde@(9,0) = 9; -> clyde@(-1,0) = 9;};
329      clyde==21 -> clyde@(0,-1) = 17;
330      clyde==29 -> clyde@(0,1) = 25;
331    };}
332  };
333
334  pfeil = {
335    schema4;
336    switch {
337      move==1 -> E;
338      move==2 -> F;
339      move==3 -> G;
340      move==4 -> H;
341    };
342    switch {
343      move==5 -> switch {1:50 => R,R,R,R,R,R,R; -> Q;};
344      turn==1 -> pos += 4;
345      turn==2 -> pos += 8;
346    };
347    switch {
348      size>=3 => {1;{chmove@ = move; A},B,C,D,E,F,G,{H; kind@(0,0) = nothing}};
349    };
350    *
351  };
352
353  >>
354
355  spPacman = {
356    pics = spPacman.xpm
357    <<
358    spPacman = {
359      A;
360      switch {??1????? -> {qu = Q_TL_TR; *; qu = Q_BL_BR; *};};
361      switch {??????1? -> {qu = Q_TR_TL; *; qu = Q_BR_BL; *};};
362      qu = Q_ALL; *
363    };
364    >>
365  }
366
367  spLabyrinth = {
368    pics = spLabyrinth.xpm, spPacman.xpm, spGhost.xpm, spEyes.xpm,
369	   spBlinky.xpm, spPinky.xpm, spInkey.xpm, spClyde.xpm,
370	   spPacman2.xpm, spPacman3.xpm, spPacman4.xpm, spPacman5.xpm,
371	   spPacman6.xpm, spPacman7.xpm, spPacman8.xpm, spPacman9.xpm,
372	   spPacman10.xpm, spPacman11.xpm
373    <<
374    spLabyrinth = {
375      if informational
376      -> A*
377      else {
378        switch {
379          wayo==1 -> {
380	    switch {0??????? -> {wayo = 0; ways -= 1};};
381	    switch {wayl==1 -> D; -> C;};
382	    qu = Q_TL;*;
383	    switch {wayr==1 -> D; -> C;};
384	    qu = Q_TR;*;
385	  };
386	  -> {
387	    switch {wayu@(0,-1)==1 && 1??????? -> {wayo = 1; ways += 1};};
388	    switch {wayl==1 -> B; -> A;};
389	    qu = Q_TL;*;
390	    switch {wayr==1 -> B; -> A;};
391	    qu = Q_TR;*;
392	  };
393        };
394        switch {
395          wayu==1 -> {
396	    switch {????0??? -> {wayu = 0; ways -= 4};};
397	    switch {wayl==1 -> D; -> C;};
398	    qu = Q_BL;*;
399	    switch {wayr==1 -> D; -> C;};
400	    qu = Q_BR;*;
401	  };
402	  -> {
403	    switch {wayo@(0,1)==1 && ????1??? -> {wayu = 1; ways += 4};};
404	    switch {wayl==1 -> B; -> A;};
405	    qu = Q_BL;*;
406	    switch {wayr==1 -> B; -> A;};
407	    qu = Q_BR;*;
408	  };
409        };
410        switch {wayr==0 ->
411          switch {wayl@(1,0)==1 || wayl@(-9,0)==1 -> {wayr = 1; ways += 2};};};
412        switch {wayl==0 ->
413          switch {wayr@(-1,0)==1 || wayr@(9,0)==1 -> {wayl = 1; ways += 8};};};
414        switch {wayr==1 && ??0????? && kind@(-9,0)!=spLabyrinth ->
415          {wayr = 0; ways -= 2};};
416        switch {wayl==1 && ??????0? && kind@(9,0)!=spLabyrinth ->
417          {wayl = 0; ways -= 8};};
418        qu = Q_ALL;
419        switch {keks@(0,0)%2==1 -> {keks@=1; E*};};
420        switch {keks@(0,0)%4>=2 -> {keks@=1; qu=Q_TL_TR;E*; qu=Q_BL_BR;E*};};
421        switch {keks@(-1,0)%4>=2 -> {keks@=1; qu=Q_TR_TL;E*; qu=Q_BR_BL;E*};};
422        switch {keks@(0,0)%8>=4 -> {keks@=1; qu=Q_TL_BL;E*; qu=Q_TR_BR;E*};};
423        switch {keks@(0,-1)%8>=4 -> {keks@=1; qu=Q_BL_TL;E*; qu=Q_BR_TR;E*};};
424        switch {keks@(0,0)==16 -> {qu=Q_TR_TR;F*};};
425        switch {keks@(-1,0)==16 -> {qu=Q_TL_TL;F*};};
426        switch {keks@(0,1)==16 -> {qu=Q_BR_BR;F*};};
427        switch {keks@(-1,1)==16 -> {qu=Q_BL_BL;F*};};
428        qu = Q_ALL;
429        switch {keks==8..14 => {keks@=1;I,I,J,K,K,J;*};};
430        switch {
431          pacman@<=10 -> {
432            switch {blinky%8!=0 -> labblinky;};
433	    switch {pinky%8!=0 -> labpinky;};
434	    switch {inkey%8!=0 -> labinkey;};
435	    switch {clyde%8!=0 -> labclyde;};
436	    switch {pacman%8!=0 -> labpacman;}};
437	  -> {pacman=0; blinky=0; pinky=0; inkey=0; clyde=0; labstart};
438        }
439      }
440    };
441    >>
442  }
443
444  spUp = {
445    pics = spPfeil.xpm, explosion.xpm
446    <<
447    spUp = {move = 1; pfeil};
448    >>
449  }
450
451  spRight = {
452    pics = spPfeil.xpm, explosion.xpm
453    <<
454    spRight = {move = 2; pfeil};
455    >>
456  }
457
458  spDown = {
459    pics = spPfeil.xpm, explosion.xpm
460    <<
461    spDown = {move = 3; pfeil};
462    >>
463  }
464
465  spLeft = {
466    pics = spPfeil.xpm, explosion.xpm
467    <<
468    spLeft = {move = 4; pfeil};
469    >>
470  }
471
472  spLife = {
473    pics = spPfeil.xpm, explosion.xpm
474    <<
475    spLife = {move = 5; pfeil;
476                #switch {loc_x==9 -> Z*;}
477                # Ich verstehe nicht, was die vorige Zeile machen sollte...
478                # ausser einen Fehler bewirken. Hab sie mal auskommentiert. -Immi
479             };
480    >>
481  }
482
483
484}
485