doomer can walk, jump and swim now, via scripting! ;-)
[dd2d.git] / data / scripts / d2dplayer.dacs
blob03d12517ce386ba9ce39242b3c9f7a62717563d9
1 module d2dplayer is "monster" "Player";
3 import actor;
4 import actorai;
5 import mapapi;
6 import moveapi;
7 import stdlib;
9 public field(Actor) uint plrnum;
10 public field(Actor) uint plrstate;
11 public field(Actor) int air;
13 field(Actor) uint aitime; // something connected with BFG shot
15 const PL_JUMP = 10;
16 const PL_RUN = 8; // 24 for "formula1"
18 const PL_RAD = 8;
19 const PL_HT  = 26;
21 const PL_SWUP  = 4;
22 const PL_FLYUP = 4;
24 const PL_AIR      = 360;
25 const PL_AQUA_AIR = 1091;
28 // setup actor animations
29 public void initializeAnim () {
30   // sleep
31   animClearFrames("monster", "Player", "sleep");
32   // left
33   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
34   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
35   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
36   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
37   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
38   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
39   // right
40   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
41   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
42   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
43   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
44   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
45   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
46   // go
47   animClearFrames("monster", "Player", "go");
48   // left
49   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
50   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/go/playc1c2.vga");
51   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/go/playd1d2.vga");
52   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
53   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
54   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/go/playd1d2.vga");
55   // right
56   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
57   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/go/playc1c2_mirrored.vga");
58   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/go/playd1d2_mirrored.vga");
59   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
60   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
61   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/go/playd1d2_mirrored.vga");
62   // pain
63   animClearFrames("monster", "Player", "pain");
64   // left
65   animAddFrame("monster", "Player", "pain", ACTOR_DIR_LEFT, "monsters/man/graphics/pain/playg1g2.vga");
66   // right
67   animAddFrame("monster", "Player", "pain", ACTOR_DIR_RIGHT, "monsters/man/graphics/pain/playg1g2_mirrored.vga");
68   // wait
69   animClearFrames("monster", "Player", "wait");
70   // left
71   animAddFrame("monster", "Player", "wait", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
72   // right
73   animAddFrame("monster", "Player", "wait", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
74   // attack
75   animClearFrames("monster", "Player", "attack");
76   // left
77   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
78   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
79   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
80   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
81   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/attack/playf1f2.vga");
82   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/attack/playf1f2.vga");
83   // right
84   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
85   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
86   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
87   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
88   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/attack/playf1f2_mirrored.vga");
89   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/attack/playf1f2_mirrored.vga");
90   // die
91   animClearFrames("monster", "Player", "die");
92   // left
93   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
94   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
95   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
96   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
97   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
98   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
99   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
100   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
101   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
102   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
103   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
104   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
105   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
106   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
107   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
108   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
109   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
110   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
111   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
112   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
113   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
114   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
115   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
116   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
117   // right
118   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
119   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
120   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
121   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
122   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
123   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
124   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
125   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
126   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
127   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
128   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
129   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
130   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
131   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
132   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
133   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
134   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
135   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
136   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
137   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
138   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
139   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
140   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
141   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
142   // slop
143   animClearFrames("monster", "Player", "slop");
144   // left
145   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playo0.vga");
146   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playo0.vga");
147   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playp0.vga");
148   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playp0.vga");
149   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playq0.vga");
150   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playq0.vga");
151   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playr0.vga");
152   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playr0.vga");
153   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/plays0.vga");
154   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/plays0.vga");
155   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playt0.vga");
156   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playt0.vga");
157   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playu0.vga");
158   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playu0.vga");
159   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playv0.vga");
160   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playv0.vga");
161   // right
162   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playo0.vga");
163   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playo0.vga");
164   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playp0.vga");
165   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playp0.vga");
166   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playq0.vga");
167   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playq0.vga");
168   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playr0.vga");
169   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playr0.vga");
170   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/plays0.vga");
171   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/plays0.vga");
172   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playt0.vga");
173   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playt0.vga");
174   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playu0.vga");
175   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playu0.vga");
176   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playv0.vga");
177   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playv0.vga");
178   // dead
179   animClearFrames("monster", "Player", "dead");
180   // left
181   animAddFrame("monster", "Player", "dead", ACTOR_DIR_LEFT, "monsters/man/graphics/dead/playn0.vga");
182   // right
183   animAddFrame("monster", "Player", "dead", ACTOR_DIR_RIGHT, "monsters/man/graphics/dead/playn0.vga");
184   // mess
185   animClearFrames("monster", "Player", "mess");
186   // left
187   animAddFrame("monster", "Player", "mess", ACTOR_DIR_LEFT, "monsters/man/graphics/mess/playw0.vga");
188   // right
189   animAddFrame("monster", "Player", "mess", ACTOR_DIR_RIGHT, "monsters/man/graphics/mess/playw0.vga");
193 // change actor animation
194 public void setAnim (Actor me, string state) {
195   me.animidx = 0;
196   switch (state) {
197     case "sleep": me.animname = "sleep"; me.animstr = "AAABBB"; break;
198     case "go": me.animname = "go"; me.animstr = "ACDABD"; break;
199     case "pain": me.animname = "pain"; me.animstr = "G"; break;
200     case "wait": me.animname = "wait"; me.animstr = "E"; break;
201     case "attack": me.animname = "attack"; me.animstr = "EEEEFF"; break;
202     case "die": me.animname = "die"; me.animstr = "HHHHIIIIJJJJKKKKLLLLMMMM"; break;
203     case "slop": me.animname = "slop"; me.animstr = "OOPPQQRRSSTTUUVV"; break;
204     case "dead": me.animname = "dead"; me.animstr = "N"; break;
205     case "mess": me.animname = "mess"; me.animstr = "W"; break;
206     case "run": me.animname = "go"; me.animstr = "ACDABD"; break;
207     case "climb": me.animname = "go"; me.animstr = "ACDABD"; break;
208     case "runout": me.animname = "go"; me.animstr = "ACDABD"; break;
209     case "shoot": me.animname = "attack"; me.animstr = "EEEEFF"; break;
210     case "revive": me.animname = "revive"; me.animstr = "MMMMLLLLKKKKJJJJIIIIHHHH"; break;
211     default: me.animname = "sleep"; me.animstr = "AAABBB"; break;
212   }
213   me.actorSetAnimation(state);
217 // setup actor properties
218 public void initialize (Actor me) {
219   // `classname` and `classtype` will be set by the engine
220   //me.classname = "Player";
221   //me.classtype = "monster";
222   me.radius = 8;
223   me.height = 26;
224   me.hitpoints = me.life = 400;
225   me.painin = 70;
226   me.xvel = 8;
227   me.yvel = 10;
228   me.slophit = 30;
229   me.painout = 50;
230   me.angertime = 90;
231   me.plrstate = PLST_STAND;
232   me.aitime = 0;
233   me.air = PL_AIR;
234   me.setAnim("sleep");
238 // thinker
239 public void think (Actor me) {
240   //monsterThink(me);
241   //writeln("canstand: ", Z_canstand(me.x, me.y, me.radius));
242   //writeln("cangodown: ", Z_cangodown(me.x, me.y, me.radius));
243   //if (((st = Z_moveobj(&me.o))&Z_FALLOUT) && me.y >= FLDH*CELH+50) {
244   //int st = Z_moveobj(me); dumpSt(st); writeln(st);
245   PL_act(me);
249 void dumpSt (int st) {
250   write("st:");
251   if (st == 0) { writeln(" NONE"); return; }
252   if (st&Z_HITWALL) write(" Z_HITWALL");
253   if (st&Z_HITCEIL) write(" Z_HITCEIL");
254   if (st&Z_HITLAND) write(" Z_HITLAND");
255   if (st&Z_FALLOUT) write(" Z_FALLOUT");
256   if (st&Z_INWATER) write(" Z_INWATER");
257   if (st&Z_HITWATER) write(" Z_HITWATER");
258   if (st&Z_HITAIR) write(" Z_HITAIR");
259   if (st&Z_BLOCK) write(" Z_BLOCK");
260   writeln;
264 void jump (Actor me, int st) {
265   if (Z_canbreathe(me.x, me.y, me.radius, me.height)) {
266     if (me.air < PL_AIR) me.air = PL_AIR;
267   } else {
268     if (--me.air < -9) {
269       me.air = 0;
270       //!PL_hit(me, 10, -3, HIT_WATER);
271     } else if ((me.air&31) == 0) {
272       //!FX_bubble(me.x, me.y-20, 0, 0, 5);
273     }
274   }
275   /*
276   if (!p_ghost && ISKEY(KB_JUMP)) {
277     if (p_fly) {
278       me.yv = -PL_FLYUP;
279     } else {
280       if (Z_canstand(OBJT_PLAYER, me.x, me.y, me.radius)) me.yv = -PL_JUMP;
281       else if (st&Z_INWATER) me.yv = -PL_SWUP;
282     }
283   }
284   */
285   //writeln("0: me.yv=", me.yv);
286   if (getPlayerButtons(me.plrnum)&PLK_JUMP) {
287     if (Z_canstand(me.x, me.y, me.radius)) {
288       me.yv = -PL_JUMP;
289     } else {
290       if (st&Z_INWATER) me.yv = -PL_SWUP;
291     }
292   }
293   //writeln("1: me.yv=", me.yv);
297 void godown (Actor me) {
298   /*
299   if (ISKEY(KB_DOWN) && ISKEY(KB_UP)) {
300     //fprintf(stderr, "trying to go down\n");
301     if (Z_cangodown(OBJT_PLAYER, me.x, me.y, me.radius)) {
302       //fprintf(stderr, "going down\n");
303       me.y += 2;
304     }
305   }
306   */
310 void PL_act (Actor me) {
311   int st;
312   if (me.plrnum != 0) return;
314   auto btn = getPlayerButtons(me.plrnum);
315   //writeln("left: ", (btn&PLK_LEFT), "; right: ", (btn&PLK_RIGHT));
317   //if ((btn&PLK_DOWN) && p_ghost) me.yv = 4;
318   //if ((btn&PLK_UP) && p_ghost) me.yv = -4;
320   if (--me.aitime < 0) me.aitime = 0;
322   //SW_press(me.x, me.y, me.radius, me.height, 4|me.keys, me.id);
324   //if (!me.suit && (g_time&15) == 0) PL_hit(me, Z_getacid(me.x, me.y, me.radius, me.height), -3, HIT_SOME);
326   if (me.plrstate != PLST_FALL && me.plrstate != PLST_PLOUT) {
327     st = Z_moveobj(me);
328     //writeln("st=", st);
329     //dumpSt(st);
330     if ((st&Z_FALLOUT) && me.y >= FLDH*CELH+50) {
331       writeln(" FALLING!");
332       switch (me.plrstate) {
333         case PLST_DEAD:
334         case PLST_MESS:
335         case PLST_DIE:
336         case PLST_SLOP:
337           me.s = 5;
338           break;
339         default:
340           //me.s = Z_sound(snd[10], 128);
341           me.s = 64; //???
342           //if (g_dm) --me.frag;
343           break;
344       }
345       me.plrstate = PLST_FALL;
346     }
347   } else {
348     st = 0;
349   }
351   //if (p_ghost) { me.yv = me.vy = 0; }
353   //!if (st&Z_HITWATER) Z_splash(me, PL_RAD+PL_HT);
354   //!if ((me.f&PLF_FIRE) && me.fire != 2) me.f &= ~PLF_FIRE;
356   /*
357   if ((btn&PLK_UP)) {
358     me.f |= PLF_UP;
359     me.looky -= 5;
360   } else if ((btn&PLK_DOWN)) {
361     me.f &= ~PLF_UP;
362     me.f |= PLF_DOWN;
363     me.looky += 5;
364   } else {
365     me.f &= ~(PLF_UP|PLF_DOWN);
366     me.looky = Z_dec(me.looky, 5);
367   }
368   */
370   //!if ((btn&PLK_USE)) SW_press(me.x, me.y, me.radius, me.height, 1|me.keys, me.id);
372   /*
373   if (me.fire) --me.fire;
374   if (me.cwpn) --me.cwpn;
375   if (me.csnd) --me.csnd;
376   if (me.invl) --me.invl;
377   if (me.suit) --me.suit;
378   */
380   switch (me.plrstate) {
381     case PLST_DIE:
382       me.height = 7;
383       //!if (!dieanim[++me.s]) { me.plrstate = PLST_DEAD; MN_killedp(); }
384       me.xv = Z_dec(me.xv, 1);
385       break;
386     case PLST_SLOP:
387       me.height = 6;
388       //!if (!slopanim[++me.s]) { me.plrstate = PLST_MESS; MN_killedp(); }
389       me.xv = Z_dec(me.xv, 1);
390       break;
391     case PLST_GO:
392       /*
393       chgwpn(me);
394       fire(me);
395       */
396       me.jump(st);
397       me.godown();
399       //!if (p_fly) SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 128);
401       if ((me.s += abs(me.xv)/2) >= 24) me.s %= 24;
403       if (!(btn&(PLK_LEFT|PLK_RIGHT))) {
404         if (me.xv) me.xv = Z_dec(me.xv, 1); else me.plrstate = PLST_STAND;
405         break;
406       }
408       if (me.xv < PL_RUN && (btn&PLK_RIGHT)) {
409         me.xv += PL_RUN>>3;
410         me.dir = 1;
411       } else if (PL_RUN > 8) {
412         //!SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 32);
413       }
414       //
415       if (me.xv > -PL_RUN && (btn&PLK_LEFT)) {
416         me.xv -= PL_RUN>>3;
417         me.dir = 0;
418       } else if (PL_RUN > 8) {
419         //!SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 32);
420       }
421       break;
422     case PLST_STAND:
423       /*
424       chgwpn(me);
425       fire(me);
426       */
427       me.jump(st);
428       me.godown();
430       //!if (p_fly) SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 128);
432       if ((btn&(PLK_LEFT|PLK_RIGHT)) != (PLK_LEFT|PLK_RIGHT)) {
433         if (btn&PLK_LEFT) {
434           me.plrstate = PLST_GO;
435           me.s = 0;
436           me.dir = 0;
437         } else if (btn&PLK_RIGHT) {
438           me.plrstate = PLST_GO;
439           me.s = 0;
440           me.dir = 1;
441         }
442       }
443       break;
444     case PLST_DEAD:
445     case PLST_MESS:
446     case PLST_PLOUT:
447       me.xv = Z_dec(me.xv, 1);
448       /*respawn
449       for (int f = 0; f < PLK_MAX; ++f) {
450         if (ISKEYX(me, f)) {
451           if (me.plrstate != PLST_PLOUT) MN_spawn_deadpl(&me. me.color, (me.plrstate == PLST_MESS ? 1 : 0));
452           PL_restore(me);
453           if (g_dm) { G_respawn_player(me); break; }
454           if (g_plrcount == 1) {
455             if (--me.lives == 0) {
456               G_start();
457               break;
458             } else {
459               me.x = dm_pos[0].x;
460               me.y = dm_pos[0].y;
461               me.dir = dm_pos[0].dir;
462             }
463           }
464           //
465           if (me.id == -1) {
466             me.x = dm_pos[0].x;
467             me.y = dm_pos[0].y;
468             me.dir = dm_pos[0].dir;
469           } else {
470             me.x = dm_pos[1].x;
471             me.y = dm_pos[1].y;
472             me.dir = dm_pos[1].dir;
473           }
474         }
475       }
476       */
477       break;
478     case PLST_FALL:
479       if (--me.s <= 0) me.plrstate = PLST_PLOUT;
480       break;
481     default:
482   }