more switches
[dd2d.git] / data / scripts / d2dplayer.dacs
blob550574786755a3fb950852216849b484c1cf2955
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   }
275   if (me.atm > 0) --me.atm;
276   if (getPlayerButtons(me.plrnum)&PLK_FIRE) {
277     if (me.atm <= 0) {
278       me.atm = 4;
279       me.target = actorSpawn("switch", "DummyPressActor", me.x, me.y-12, ACTOR_DIR_LEFT);
280       me.target.atm = 2; // 1: act; 0: die
281     }
282   }
286 void dumpSt (int st) {
287   write("st:");
288   if (st == 0) { writeln(" NONE"); return; }
289   if (st&Z_HITWALL) write(" Z_HITWALL");
290   if (st&Z_HITCEIL) write(" Z_HITCEIL");
291   if (st&Z_HITLAND) write(" Z_HITLAND");
292   if (st&Z_FALLOUT) write(" Z_FALLOUT");
293   if (st&Z_INWATER) write(" Z_INWATER");
294   if (st&Z_HITWATER) write(" Z_HITWATER");
295   if (st&Z_HITAIR) write(" Z_HITAIR");
296   if (st&Z_BLOCK) write(" Z_BLOCK");
297   writeln;
301 void jump (Actor me, int st) {
302   if (Z_canbreathe(me.x, me.y, me.radius, me.height)) {
303     if (me.air < PL_AIR) me.air = PL_AIR;
304   } else {
305     if (--me.air < -9) {
306       me.air = 0;
307       //!PL_hit(me, 10, -3, HIT_WATER);
308     } else if ((me.air&31) == 0) {
309       //!FX_bubble(me.x, me.y-20, 0, 0, 5);
310     }
311   }
312   /*
313   if (!p_ghost && ISKEY(KB_JUMP)) {
314     if (p_fly) {
315       me.yv = -PL_FLYUP;
316     } else {
317       if (Z_canstand(OBJT_PLAYER, me.x, me.y, me.radius)) me.yv = -PL_JUMP;
318       else if (st&Z_INWATER) me.yv = -PL_SWUP;
319     }
320   }
321   */
322   //writeln("0: me.yv=", me.yv);
323   if (getPlayerButtons(me.plrnum)&PLK_JUMP) {
324     if (Z_canstand(me.x, me.y, me.radius)) {
325       me.yv = -PL_JUMP;
326     } else {
327       if (st&Z_INWATER) me.yv = -PL_SWUP;
328     }
329   }
330   //writeln("1: me.yv=", me.yv);
334 void godown (Actor me) {
335   /*
336   if (ISKEY(KB_DOWN) && ISKEY(KB_UP)) {
337     //fprintf(stderr, "trying to go down\n");
338     if (Z_cangodown(OBJT_PLAYER, me.x, me.y, me.radius)) {
339       //fprintf(stderr, "going down\n");
340       me.y += 2;
341     }
342   }
343   */
347 void PL_act (Actor me) {
348   int st;
349   //if (me.plrnum != 1) return;
351   auto btn = getPlayerButtons(me.plrnum);
352   if (me.plrnum != 1) btn = 0;
353   //writeln("left: ", (btn&PLK_LEFT), "; right: ", (btn&PLK_RIGHT));
355   //if ((btn&PLK_DOWN) && p_ghost) me.yv = 4;
356   //if ((btn&PLK_UP) && p_ghost) me.yv = -4;
358   if (--me.aitime < 0) me.aitime = 0;
360   //SW_press(me.x, me.y, me.radius, me.height, 4|me.keys, me.id);
362   //if (!me.suit && (g_time&15) == 0) PL_hit(me, Z_getacid(me.x, me.y, me.radius, me.height), -3, HIT_SOME);
364   if (me.plrstate != PLST_FALL && me.plrstate != PLST_PLOUT) {
365     st = Z_moveobj(me);
366     //writeln("st=", st);
367     //dumpSt(st);
368     if ((st&Z_FALLOUT) && me.y >= FLDH*CELH+50) {
369       writeln(" FALLING!");
370       switch (me.plrstate) {
371         case PLST_DEAD:
372         case PLST_MESS:
373         case PLST_DIE:
374         case PLST_SLOP:
375           me.s = 5;
376           break;
377         default:
378           //me.s = Z_sound(snd[10], 128);
379           me.s = 64; //???
380           //if (g_dm) --me.frag;
381           break;
382       }
383       me.plrstate = PLST_FALL;
384     }
385   } else {
386     st = 0;
387   }
389   //if (p_ghost) { me.yv = me.vy = 0; }
391   if (st&Z_HITWATER) Z_splash(me, PL_RAD+PL_HT, st);
393   //!if ((me.f&PLF_FIRE) && me.fire != 2) me.f &= ~PLF_FIRE;
395   // look up/down
396   if ((btn&(PLK_UP|PLK_DOWN)) != (PLK_UP|PLK_DOWN)) {
397     if (btn&PLK_UP) {
398       //me.f |= PLF_UP;
399       me.looky -= 5;
400     } else if (btn&PLK_DOWN) {
401       //me.f &= ~PLF_UP;
402       //me.f |= PLF_DOWN;
403       me.looky += 5;
404     } else {
405       //me.f &= ~(PLF_UP|PLF_DOWN);
406       me.looky = Z_dec(me.looky, 5);
407     }
408   }
410   //!if ((btn&PLK_USE)) SW_press(me.x, me.y, me.radius, me.height, 1|me.keys, me.id);
412   /*
413   if (me.fire) --me.fire;
414   if (me.cwpn) --me.cwpn;
415   if (me.csnd) --me.csnd;
416   if (me.invl) --me.invl;
417   if (me.suit) --me.suit;
418   */
420   switch (me.plrstate) {
421     case PLST_DIE:
422       me.height = 7;
423       //!if (!dieanim[++me.s]) { me.plrstate = PLST_DEAD; MN_killedp(); }
424       me.xv = Z_dec(me.xv, 1);
425       break;
426     case PLST_SLOP:
427       me.height = 6;
428       //!if (!slopanim[++me.s]) { me.plrstate = PLST_MESS; MN_killedp(); }
429       me.xv = Z_dec(me.xv, 1);
430       break;
431     case PLST_GO:
432       /*
433       chgwpn(me);
434       fire(me);
435       */
436       me.jump(st);
437       me.godown();
439       //!if (p_fly) SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 128);
441       if ((me.s += abs(me.xv)/2) >= 24) me.s %= 24;
443       if (!(btn&(PLK_LEFT|PLK_RIGHT))) {
444         if (me.xv) me.xv = Z_dec(me.xv, 1); else me.plrstate = PLST_STAND;
445         break;
446       }
448       if (me.xv < PL_RUN && (btn&PLK_RIGHT)) {
449         me.xv += PL_RUN>>3;
450         me.dir = 1;
451       } else if (PL_RUN > 8) {
452         //!SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 32);
453       }
454       //
455       if (me.xv > -PL_RUN && (btn&PLK_LEFT)) {
456         me.xv -= PL_RUN>>3;
457         me.dir = 0;
458       } else if (PL_RUN > 8) {
459         //!SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 32);
460       }
461       break;
462     case PLST_STAND:
463       /*
464       chgwpn(me);
465       fire(me);
466       */
467       me.jump(st);
468       me.godown();
470       //!if (p_fly) SMK_gas(me.x, me.y-2, 2, 3, me.xv+me.vx, me.yv+me.vy, 128);
472       if ((btn&(PLK_LEFT|PLK_RIGHT)) != (PLK_LEFT|PLK_RIGHT)) {
473         if (btn&PLK_LEFT) {
474           me.plrstate = PLST_GO;
475           me.s = 0;
476           me.dir = 0;
477         } else if (btn&PLK_RIGHT) {
478           me.plrstate = PLST_GO;
479           me.s = 0;
480           me.dir = 1;
481         }
482       }
483       break;
484     case PLST_DEAD:
485     case PLST_MESS:
486     case PLST_PLOUT:
487       me.xv = Z_dec(me.xv, 1);
488       /*respawn
489       for (int f = 0; f < PLK_MAX; ++f) {
490         if (ISKEYX(me, f)) {
491           if (me.plrstate != PLST_PLOUT) MN_spawn_deadpl(&me. me.color, (me.plrstate == PLST_MESS ? 1 : 0));
492           PL_restore(me);
493           if (g_dm) { G_respawn_player(me); break; }
494           if (g_plrcount == 1) {
495             if (--me.lives == 0) {
496               G_start();
497               break;
498             } else {
499               me.x = dm_pos[0].x;
500               me.y = dm_pos[0].y;
501               me.dir = dm_pos[0].dir;
502             }
503           }
504           //
505           if (me.id == -1) {
506             me.x = dm_pos[0].x;
507             me.y = dm_pos[0].y;
508             me.dir = dm_pos[0].dir;
509           } else {
510             me.x = dm_pos[1].x;
511             me.y = dm_pos[1].y;
512             me.dir = dm_pos[1].dir;
513           }
514         }
515       }
516       */
517       break;
518     case PLST_FALL:
519       if (--me.s <= 0) me.plrstate = PLST_PLOUT;
520       break;
521     default:
522   }
527 void PL_draw (Actor me) {
528   int s, w, wx, wy;
529   //static const int wytab[] = {-1, -2, -1, 0};
531   s = 'A';
532   w = 0;
533   wx = wy = 0;
534   switch (me.plrstate) {
535     case PLST_STAND:
536       /*
537       if (me.f&PLF_FIRE) {
538         s = standspr(p)+1;
539         w = wpnspr(p)+1;
540       } else if (me.pain) {
541         s = 'G';
542         w = 'A';
543         wx = (me.d ? 2 : -2);
544         wy = 1;
545       } else {
546         s = standspr(p);
547         w = wpnspr(p);
548       }
549       */
550       break;
551     case PLST_DEAD:
552       //s = 'N';
553       //break;
554       return;
555     case PLST_MESS:
556       //s = 'W';
557       //break;
558       return;
559     case PLST_GO:
560       if (me.pain) {
561         s = 'G';
562         w = 'A';
563         wx = (me.d ? 2 : -2);
564         wy = 1;
565       } else {
566         s = goanim[me.s/8];
567         w = (me.f&PLF_FIRE ? 'B' : 'A');
568         wx = (me.d ? 2 : -2);
569         wy = 1+wytab[s-'A'];
570       }
571       break;
572     case PLST_DIE:
573       //s = dieanim[me.s];
574       //break;
575       return;
576     case PLST_SLOP:
577       //s = slopanim[me.s];
578       //break;
579       return;
580     case PLST_PLOUT:
581       //s = 0;
582       //break;
583       return;
584   }
585   if (me.wpn == PWPN_FIST) w = 0;
586   if (w) Z_drawspr(me.o.x+wx, me.o.y+wy, &wpn[me.wpn&0x7f][w-'A'], me.d);
587   if (s) Z_drawmanspr(me.o.x, me.o.y, &spr[(s-'A')*2+me.d], sprd[(s-'A')*2+me.d], me.color);