we can go to level 2 now!
[dd2d.git] / data / scripts / d2dplayer.dacs
blob09c80deebbbd0e2aa13982e643aee3c326febd63
1 module d2dplayer is "monster" "Player";
3 import apiActor;
4 import aiMonster;
5 import apiMap;
6 import apiMove;
7 import stdlib;
9 public field(Actor) uint plrstate;
10 public field(Actor) int air;
12 public field(Actor) int looky;
14 field(Actor) uint aitime; // something connected with BFG shot
16 const PL_JUMP = 10;
17 const PL_RUN = 8; // 24 for "formula1"
19 const PL_RAD = 8;
20 const PL_HT  = 26;
22 const PL_SWUP  = 4;
23 const PL_FLYUP = 4;
25 const PL_AIR      = 360;
26 const PL_AQUA_AIR = 1091;
29 // setup actor animations
30 public void initializeAnim () {
31   // stand
32   animClearFrames("monster", "Player", "stand");
33   animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
34   //animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "sprites/monsters/player/play_a1_a2.vga"); // shooting down
35   //animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "sprites/monsters/player/playx1x2.vga"); // aiming up
36   //animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "sprites/monsters/player/playy1y2.vga"); // shooting up
37   //animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "sprites/monsters/player/playz1z2.vga"); // aiming down up
38   //animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "monsters/man/graphics/attack/playf1f2.vga"); // shooting forward
39   //animAddFrame("monster", "Player", "stand", ACTOR_DIR_LEFT, "monsters/man/graphics/pain/playg1g2.vga");
40   animAddFrame("monster", "Player", "stand", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
43   // sleep
44   animClearFrames("monster", "Player", "sleep");
45   // left
46   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
47   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
48   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
49   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
50   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
51   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
52   // right
53   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
54   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
55   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
56   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
57   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
58   animAddFrame("monster", "Player", "sleep", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
59   // go
60   animClearFrames("monster", "Player", "go");
61   // left
62   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
63   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/go/playc1c2.vga");
64   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/go/playd1d2.vga");
65   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playa1a2.vga");
66   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playb1b2.vga");
67   animAddFrame("monster", "Player", "go", ACTOR_DIR_LEFT, "monsters/man/graphics/go/playd1d2.vga");
68   // right
69   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
70   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/go/playc1c2_mirrored.vga");
71   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/go/playd1d2_mirrored.vga");
72   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playa1a2_mirrored.vga");
73   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playb1b2_mirrored.vga");
74   animAddFrame("monster", "Player", "go", ACTOR_DIR_RIGHT, "monsters/man/graphics/go/playd1d2_mirrored.vga");
75   // pain
76   animClearFrames("monster", "Player", "pain");
77   // left
78   animAddFrame("monster", "Player", "pain", ACTOR_DIR_LEFT, "monsters/man/graphics/pain/playg1g2.vga");
79   // right
80   animAddFrame("monster", "Player", "pain", ACTOR_DIR_RIGHT, "monsters/man/graphics/pain/playg1g2_mirrored.vga");
81   // wait
82   animClearFrames("monster", "Player", "wait");
83   // left
84   animAddFrame("monster", "Player", "wait", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
85   // right
86   animAddFrame("monster", "Player", "wait", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
87   // attack
88   animClearFrames("monster", "Player", "attack");
89   // left
90   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
91   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
92   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
93   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/shared/playe1e2.vga");
94   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/attack/playf1f2.vga");
95   animAddFrame("monster", "Player", "attack", ACTOR_DIR_LEFT, "monsters/man/graphics/attack/playf1f2.vga");
96   // right
97   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
98   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
99   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
100   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/shared/playe1e2_mirrored.vga");
101   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/attack/playf1f2_mirrored.vga");
102   animAddFrame("monster", "Player", "attack", ACTOR_DIR_RIGHT, "monsters/man/graphics/attack/playf1f2_mirrored.vga");
103   // die
104   animClearFrames("monster", "Player", "die");
105   // left
106   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
107   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
108   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
109   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playh0.vga");
110   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
111   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
112   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
113   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playi0.vga");
114   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
115   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
116   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
117   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playj0.vga");
118   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
119   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
120   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
121   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playk0.vga");
122   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
123   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
124   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
125   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playl0.vga");
126   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
127   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
128   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
129   animAddFrame("monster", "Player", "die", ACTOR_DIR_LEFT, "monsters/man/graphics/die/playm0.vga");
130   // right
131   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
132   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
133   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
134   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playh0.vga");
135   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
136   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
137   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
138   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playi0.vga");
139   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
140   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
141   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
142   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playj0.vga");
143   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
144   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
145   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
146   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playk0.vga");
147   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
148   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
149   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
150   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playl0.vga");
151   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
152   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
153   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
154   animAddFrame("monster", "Player", "die", ACTOR_DIR_RIGHT, "monsters/man/graphics/die/playm0.vga");
155   // slop
156   animClearFrames("monster", "Player", "slop");
157   // left
158   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playo0.vga");
159   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playo0.vga");
160   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playp0.vga");
161   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playp0.vga");
162   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playq0.vga");
163   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playq0.vga");
164   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playr0.vga");
165   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playr0.vga");
166   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/plays0.vga");
167   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/plays0.vga");
168   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playt0.vga");
169   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playt0.vga");
170   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playu0.vga");
171   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playu0.vga");
172   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playv0.vga");
173   animAddFrame("monster", "Player", "slop", ACTOR_DIR_LEFT, "monsters/man/graphics/slop/playv0.vga");
174   // right
175   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playo0.vga");
176   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playo0.vga");
177   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playp0.vga");
178   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playp0.vga");
179   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playq0.vga");
180   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playq0.vga");
181   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playr0.vga");
182   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playr0.vga");
183   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/plays0.vga");
184   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/plays0.vga");
185   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playt0.vga");
186   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playt0.vga");
187   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playu0.vga");
188   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playu0.vga");
189   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playv0.vga");
190   animAddFrame("monster", "Player", "slop", ACTOR_DIR_RIGHT, "monsters/man/graphics/slop/playv0.vga");
191   // dead
192   animClearFrames("monster", "Player", "dead");
193   // left
194   animAddFrame("monster", "Player", "dead", ACTOR_DIR_LEFT, "monsters/man/graphics/dead/playn0.vga");
195   // right
196   animAddFrame("monster", "Player", "dead", ACTOR_DIR_RIGHT, "monsters/man/graphics/dead/playn0.vga");
197   // mess
198   animClearFrames("monster", "Player", "mess");
199   // left
200   animAddFrame("monster", "Player", "mess", ACTOR_DIR_LEFT, "monsters/man/graphics/mess/playw0.vga");
201   // right
202   animAddFrame("monster", "Player", "mess", ACTOR_DIR_RIGHT, "monsters/man/graphics/mess/playw0.vga");
207 // change actor animation
208 public void setAnim (Actor me, string state) {
209   me.animidx = 0;
210   switch (state) {
211     case "sleep": me.animname = "sleep"; me.animstr = "AAABBB"; break;
212     case "go": me.animname = "go"; me.animstr = "ACDABD"; break;
213     case "pain": me.animname = "pain"; me.animstr = "G"; break;
214     case "wait": me.animname = "wait"; me.animstr = "E"; break;
215     case "attack": me.animname = "attack"; me.animstr = "EEEEFF"; break;
216     case "die": me.animname = "die"; me.animstr = "HHHHIIIIJJJJKKKKLLLLMMMM"; break;
217     case "slop": me.animname = "slop"; me.animstr = "OOPPQQRRSSTTUUVV"; break;
218     case "dead": me.animname = "dead"; me.animstr = "N"; break;
219     case "mess": me.animname = "mess"; me.animstr = "W"; break;
220     case "run": me.animname = "go"; me.animstr = "ACDABD"; break;
221     case "climb": me.animname = "go"; me.animstr = "ACDABD"; break;
222     case "runout": me.animname = "go"; me.animstr = "ACDABD"; break;
223     case "shoot": me.animname = "attack"; me.animstr = "EEEEFF"; break;
224     case "revive": me.animname = "revive"; me.animstr = "MMMMLLLLKKKKJJJJIIIIHHHH"; break;
225     default: me.animname = "sleep"; me.animstr = "AAABBB"; break;
226   }
227   me.actorSetAnimation(state);
231 // setup actor properties
232 public void initialize (Actor me) {
233   // `classname` and `classtype` will be set by the engine
234   //me.classname = "Player";
235   //me.classtype = "monster";
236   me.radius = 8;
237   me.height = 26;
238   me.hitpoints = me.life = 400;
239   me.painin = 70;
240   me.xvel = 8;
241   me.yvel = 10;
242   me.slophit = 30;
243   me.painout = 50;
244   me.angertime = 90;
245   me.plrstate = PLST_STAND;
246   me.aitime = 0;
247   me.air = PL_AIR;
248   //me.setAnim("sleep");
249   me.setAnim("stand");
250   // add attached light
251   me.attLightXOfs = 0;
252   me.attLightYOfs = -12;
253   me.attachedLightColorless(96, 44);
254   // flags
255   me.flags |= AF_NOANIMATE;
259 // thinker
260 public void think (Actor me) {
261   //monsterThink(me);
262   //writeln("canstand: ", Z_canstand(me.x, me.y, me.radius));
263   //writeln("cangodown: ", Z_cangodown(me.x, me.y, me.radius));
264   //if (((st = Z_moveobj(&me.o))&Z_FALLOUT) && me.y >= FLDH*CELH+50) {
265   //int st = Z_moveobj(me); dumpSt(st); writeln(st);
266   PL_act(me);
267   // fix level view
268   if (me.plrnum == 1) {
269     int tiltHeight = getMapViewHeight()/4;
270     int vy = me.looky;
271     if (vy < -tiltHeight) vy = -tiltHeight; else if (vy > tiltHeight) vy = tiltHeight;
272     me.looky = vy;
273     setMapViewPos(me.x, me.y+vy);
274   }
278 void dumpSt (int st) {
279   write("st:");
280   if (st == 0) { writeln(" NONE"); return; }
281   if (st&Z_HITWALL) write(" Z_HITWALL");
282   if (st&Z_HITCEIL) write(" Z_HITCEIL");
283   if (st&Z_HITLAND) write(" Z_HITLAND");
284   if (st&Z_FALLOUT) write(" Z_FALLOUT");
285   if (st&Z_INWATER) write(" Z_INWATER");
286   if (st&Z_HITWATER) write(" Z_HITWATER");
287   if (st&Z_HITAIR) write(" Z_HITAIR");
288   if (st&Z_BLOCK) write(" Z_BLOCK");
289   writeln;
293 void jump (Actor me, int st) {
294   if (Z_canbreathe(me.x, me.y, me.radius, me.height)) {
295     if (me.air < PL_AIR) me.air = PL_AIR;
296   } else {
297     if (--me.air < -9) {
298       me.air = 0;
299       //!PL_hit(me, 10, -3, HIT_WATER);
300     } else if ((me.air&31) == 0) {
301       //!FX_bubble(me.x, me.y-20, 0, 0, 5);
302     }
303   }
304   /*
305   if (!p_ghost && ISKEY(KB_JUMP)) {
306     if (p_fly) {
307       me.yv = -PL_FLYUP;
308     } else {
309       if (Z_canstand(OBJT_PLAYER, me.x, me.y, me.radius)) me.yv = -PL_JUMP;
310       else if (st&Z_INWATER) me.yv = -PL_SWUP;
311     }
312   }
313   */
314   //writeln("0: me.yv=", me.yv);
315   if (getPlayerButtons(me.plrnum)&PLK_JUMP) {
316     if (Z_canstand(me.x, me.y, me.radius)) {
317       me.yv = -PL_JUMP;
318     } else {
319       if (st&Z_INWATER) me.yv = -PL_SWUP;
320     }
321   }
322   //writeln("1: me.yv=", me.yv);
326 void godown (Actor me) {
327   /*
328   if (ISKEY(KB_DOWN) && ISKEY(KB_UP)) {
329     //fprintf(stderr, "trying to go down\n");
330     if (Z_cangodown(OBJT_PLAYER, me.x, me.y, me.radius)) {
331       //fprintf(stderr, "going down\n");
332       me.y += 2;
333     }
334   }
335   */
339 void PL_act (Actor me) {
340   int st;
341   //if (me.plrnum != 1) return;
343   auto btn = getPlayerButtons(me.plrnum);
344   if (me.plrnum != 1) btn = 0;
345   //writeln("left: ", (btn&PLK_LEFT), "; right: ", (btn&PLK_RIGHT));
347   //if ((btn&PLK_DOWN) && p_ghost) me.yv = 4;
348   //if ((btn&PLK_UP) && p_ghost) me.yv = -4;
350   if (--me.aitime < 0) me.aitime = 0;
352   //SW_press(me.x, me.y, me.radius, me.height, 4|me.keys, me.id);
354   //if (!me.suit && (g_time&15) == 0) PL_hit(me, Z_getacid(me.x, me.y, me.radius, me.height), -3, HIT_SOME);
356   if (me.plrstate != PLST_FALL && me.plrstate != PLST_PLOUT) {
357     st = Z_moveobj(me);
358     //writeln("st=", st);
359     //dumpSt(st);
360     if ((st&Z_FALLOUT) && me.y >= FLDH*CELH+50) {
361       writeln(" FALLING!");
362       switch (me.plrstate) {
363         case PLST_DEAD:
364         case PLST_MESS:
365         case PLST_DIE:
366         case PLST_SLOP:
367           me.s = 5;
368           break;
369         default:
370           //me.s = Z_sound(snd[10], 128);
371           me.s = 64; //???
372           //if (g_dm) --me.frag;
373           break;
374       }
375       me.plrstate = PLST_FALL;
376     }
377   } else {
378     st = 0;
379   }
381   //if (p_ghost) { me.yv = me.vy = 0; }
383   if (st&Z_HITWATER) Z_splash(me, PL_RAD+PL_HT, st);
385   //!if ((me.f&PLF_FIRE) && me.fire != 2) me.f &= ~PLF_FIRE;
387   // look up/down
388   if ((btn&(PLK_UP|PLK_DOWN)) != (PLK_UP|PLK_DOWN)) {
389     if (btn&PLK_UP) {
390       //me.f |= PLF_UP;
391       me.looky -= 5;
392     } else if (btn&PLK_DOWN) {
393       //me.f &= ~PLF_UP;
394       //me.f |= PLF_DOWN;
395       me.looky += 5;
396     } else {
397       //me.f &= ~(PLF_UP|PLF_DOWN);
398       me.looky = Z_dec(me.looky, 5);
399     }
400   }
402   //!if ((btn&PLK_USE)) SW_press(me.x, me.y, me.radius, me.height, 1|me.keys, me.id);
404   /*
405   if (me.fire) --me.fire;
406   if (me.cwpn) --me.cwpn;
407   if (me.csnd) --me.csnd;
408   if (me.invl) --me.invl;
409   if (me.suit) --me.suit;
410   */
412   switch (me.plrstate) {
413     case PLST_DIE:
414       me.height = 7;
415       //!if (!dieanim[++me.s]) { me.plrstate = PLST_DEAD; MN_killedp(); }
416       me.xv = Z_dec(me.xv, 1);
417       break;
418     case PLST_SLOP:
419       me.height = 6;
420       //!if (!slopanim[++me.s]) { me.plrstate = PLST_MESS; MN_killedp(); }
421       me.xv = Z_dec(me.xv, 1);
422       break;
423     case PLST_GO:
424       /*
425       chgwpn(me);
426       fire(me);
427       */
428       me.jump(st);
429       me.godown();
431       //!if (p_fly) SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 128);
433       if ((me.s += abs(me.xv)/2) >= 24) me.s %= 24;
435       if (!(btn&(PLK_LEFT|PLK_RIGHT))) {
436         if (me.xv) me.xv = Z_dec(me.xv, 1); else me.plrstate = PLST_STAND;
437         break;
438       }
440       if (me.xv < PL_RUN && (btn&PLK_RIGHT)) {
441         me.xv += PL_RUN>>3;
442         me.dir = 1;
443       } else if (PL_RUN > 8) {
444         //!SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 32);
445       }
446       //
447       if (me.xv > -PL_RUN && (btn&PLK_LEFT)) {
448         me.xv -= PL_RUN>>3;
449         me.dir = 0;
450       } else if (PL_RUN > 8) {
451         //!SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 32);
452       }
453       break;
454     case PLST_STAND:
455       /*
456       chgwpn(me);
457       fire(me);
458       */
459       me.jump(st);
460       me.godown();
462       //!if (p_fly) SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 128);
464       if ((btn&(PLK_LEFT|PLK_RIGHT)) != (PLK_LEFT|PLK_RIGHT)) {
465         if (btn&PLK_LEFT) {
466           me.plrstate = PLST_GO;
467           me.s = 0;
468           me.dir = 0;
469         } else if (btn&PLK_RIGHT) {
470           me.plrstate = PLST_GO;
471           me.s = 0;
472           me.dir = 1;
473         }
474       }
475       break;
476     case PLST_DEAD:
477     case PLST_MESS:
478     case PLST_PLOUT:
479       me.xv = Z_dec(me.xv, 1);
480       /*respawn
481       for (int f = 0; f < PLK_MAX; ++f) {
482         if (ISKEYX(me, f)) {
483           if (me.plrstate != PLST_PLOUT) MN_spawn_deadpl(&me. me.color, (me.plrstate == PLST_MESS ? 1 : 0));
484           PL_restore(me);
485           if (g_dm) { G_respawn_player(me); break; }
486           if (g_plrcount == 1) {
487             if (--me.lives == 0) {
488               G_start();
489               break;
490             } else {
491               me.x = dm_pos[0].x;
492               me.y = dm_pos[0].y;
493               me.dir = dm_pos[0].dir;
494             }
495           }
496           //
497           if (me.id == -1) {
498             me.x = dm_pos[0].x;
499             me.y = dm_pos[0].y;
500             me.dir = dm_pos[0].dir;
501           } else {
502             me.x = dm_pos[1].x;
503             me.y = dm_pos[1].y;
504             me.dir = dm_pos[1].dir;
505           }
506         }
507       }
508       */
509       break;
510     case PLST_FALL:
511       if (--me.s <= 0) me.plrstate = PLST_PLOUT;
512       break;
513     default:
514   }
519 void PL_draw (Actor me) {
520   int s, w, wx, wy;
521   //static const int wytab[] = {-1, -2, -1, 0};
523   s = 'A';
524   w = 0;
525   wx = wy = 0;
526   switch (me.plrstate) {
527     case PLST_STAND:
528       /*
529       if (me.f&PLF_FIRE) {
530         s = standspr(p)+1;
531         w = wpnspr(p)+1;
532       } else if (me.pain) {
533         s = 'G';
534         w = 'A';
535         wx = (me.d ? 2 : -2);
536         wy = 1;
537       } else {
538         s = standspr(p);
539         w = wpnspr(p);
540       }
541       */
542       break;
543     case PLST_DEAD:
544       //s = 'N';
545       //break;
546       return;
547     case PLST_MESS:
548       //s = 'W';
549       //break;
550       return;
551     case PLST_GO:
552       if (me.pain) {
553         s = 'G';
554         w = 'A';
555         wx = (me.d ? 2 : -2);
556         wy = 1;
557       } else {
558         s = goanim[me.s/8];
559         w = (me.f&PLF_FIRE ? 'B' : 'A');
560         wx = (me.d ? 2 : -2);
561         wy = 1+wytab[s-'A'];
562       }
563       break;
564     case PLST_DIE:
565       //s = dieanim[me.s];
566       //break;
567       return;
568     case PLST_SLOP:
569       //s = slopanim[me.s];
570       //break;
571       return;
572     case PLST_PLOUT:
573       //s = 0;
574       //break;
575       return;
576   }
577   if (me.wpn == PWPN_FIST) w = 0;
578   if (w) Z_drawspr(me.o.x+wx, me.o.y+wy, &wpn[me.wpn&0x7f][w-'A'], me.d);
579   if (s) Z_drawmanspr(me.o.x, me.o.y, &spr[(s-'A')*2+me.d], sprd[(s-'A')*2+me.d], me.color);