First round of changes from Stas Sergeev.
[super-star-trek.git] / battle.c
1 #include "sst.h"\r
2 \r
3 void doshield(int i) {\r
4         int key;\r
5         enum {NONE, SHUP, SHDN, NRG} action = NONE;\r
6 \r
7         ididit = 0;\r
8 \r
9         if (i == 2) action = SHUP;\r
10         else {\r
11                 key = scan();\r
12                 if (key == IHALPHA) {\r
13                         if (isit("transfer"))\r
14                                 action = NRG;\r
15                         else {\r
16                                 chew();\r
17                                 if (game.damage[DSHIELD]) {\r
18                                         prout("Shields damaged and down.");\r
19                                         return;\r
20                                 }\r
21                                 if (isit("up"))\r
22                                         action = SHUP;\r
23                                 else if (isit("down"))\r
24                                         action = SHDN;\r
25                         }\r
26                 }\r
27                 if (action==NONE) {\r
28                         proutn("Do you wish to change shield energy? ");\r
29                         if (ja()) {\r
30                                 proutn("Energy to transfer to shields- ");\r
31                                 action = NRG;\r
32                         }\r
33                         else if (game.damage[DSHIELD]) {\r
34                                 prout("Shields damaged and down.");\r
35                                 return;\r
36                         }\r
37                         else if (shldup) {\r
38                                 proutn("Shields are up. Do you want them down? ");\r
39                                 if (ja()) action = SHDN;\r
40                                 else {\r
41                                         chew();\r
42                                         return;\r
43                                 }\r
44                         }\r
45                         else {\r
46                                 proutn("Shields are down. Do you want them up? ");\r
47                                 if (ja()) action = SHUP;\r
48                                 else {\r
49                                         chew();\r
50                                         return;\r
51                                 }\r
52                         }\r
53                 }\r
54         }\r
55         switch (action) {\r
56                 case SHUP: /* raise shields */\r
57                         if (shldup) {\r
58                                 prout("Shields already up.");\r
59                                 return;\r
60                         }\r
61                         shldup = 1;\r
62                         shldchg = 1;\r
63                         if (condit != IHDOCKED) energy -= 50.0;\r
64                         prout("Shields raised.");\r
65                         if (energy <= 0) {\r
66                                 skip(1);\r
67                                 prout("Shields raising uses up last of energy.");\r
68                                 finish(FNRG);\r
69                                 return;\r
70                         }\r
71                         ididit=1;\r
72                         return;\r
73                 case SHDN:\r
74                         if (shldup==0) {\r
75                                 prout("Shields already down.");\r
76                                 return;\r
77                         }\r
78                         shldup=0;\r
79                         shldchg=1;\r
80                         prout("Shields lowered.");\r
81                         ididit=1;\r
82                         return;\r
83                 case NRG:\r
84                         while (scan() != IHREAL) {\r
85                                 chew();\r
86                                 proutn("Energy to transfer to shields- ");\r
87                         }\r
88                         chew();\r
89                         if (aaitem==0) return;\r
90                         if (aaitem > energy) {\r
91                                 prout("Insufficient ship energy.");\r
92                                 return;\r
93                         }\r
94                         ididit = 1;\r
95                         if (shield+aaitem >= inshld) {\r
96                                 prout("Shield energy maximized.");\r
97                                 if (shield+aaitem > inshld) {\r
98                                         prout("Excess energy requested returned to ship energy");\r
99                                 }\r
100                                 energy -= inshld-shield;\r
101                                 shield = inshld;\r
102                                 return;\r
103                         }\r
104                         if (aaitem < 0.0 && energy-aaitem > inenrg) {\r
105                                 /* Prevent shield drain loophole */\r
106                                 skip(1);\r
107                                 prout("Engineering to bridge--");\r
108                                 prout("  Scott here. Power circuit problem, Captain.");\r
109                                 prout("  I can't drain the shields.");\r
110                                 ididit = 0;\r
111                                 return;\r
112                         }\r
113                         if (shield+aaitem < 0) {\r
114                                 prout("All shield energy transferred to ship.");\r
115                                 energy += shield;\r
116                                 shield = 0.0;\r
117                                 return;\r
118                         }\r
119                         proutn("Scotty- \"");\r
120                         if (aaitem > 0)\r
121                                 prout("Transferring energy to shields.\"");\r
122                         else\r
123                                 prout("Draining energy from shields.\"");\r
124                         shield += aaitem;\r
125                         energy -= aaitem;\r
126                         return;\r
127                 case NONE:;     /* avoid gcc warning */\r
128         }\r
129 }\r
130 \r
131 void ram(int ibumpd, int ienm, int ix, int iy) {\r
132         double type = 1.0, extradm;\r
133         int icas, l;\r
134         \r
135         prouts("***RED ALERT!  RED ALERT!");\r
136         skip(1);\r
137         prout("***COLLISION IMMINENT.");\r
138         skip(2);\r
139         proutn("***");\r
140         crmshp();\r
141         switch (ienm) {\r
142                 case IHR: type = 1.5; break;\r
143                 case IHC: type = 2.0; break;\r
144                 case IHS: type = 2.5; break;\r
145                 case IHT: type = 0.5; break;\r
146                 case IHQUEST: type = 4.0; break;\r
147         }\r
148         proutn(ibumpd ? " rammed by " : " rams ");\r
149         crmena(0, ienm, 2, ix, iy);\r
150         if (ibumpd) proutn(" (original position)");\r
151         skip(1);\r
152         deadkl(ix, iy, ienm, sectx, secty);\r
153         proutn("***");\r
154         crmshp();\r
155         prout(" heavily damaged.");\r
156         icas = 10.0+20.0*Rand();\r
157         prout("***Sickbay reports %d casualties", icas);\r
158         casual += icas;\r
159         for (l=1; l <= NDEVICES; l++) {\r
160                 if (l == DDRAY) continue; // Don't damage deathray \r
161                 if (game.damage[l] < 0) continue;\r
162                 extradm = (10.0*type*Rand()+1.0)*damfac;\r
163                 game.damage[l] += Time + extradm; /* Damage for at least time of travel! */\r
164         }\r
165         shldup = 0;\r
166         if (game.state.remkl) {\r
167                 pause_game(2);\r
168                 dreprt();\r
169         }\r
170         else finish(FWON);\r
171         return;\r
172 }\r
173 \r
174 void torpedo(double course, double r, int inx, int iny, double *hit) {\r
175         int l, iquad, ix, iy,  jx, jy, shoved=0, ll;\r
176         double ac=course + 0.25*r;\r
177         double angle = (15.0-ac)*0.5235988;\r
178         double bullseye = (15.0 - course)*0.5235988;\r
179         double deltax=-sin(angle), deltay=cos(angle), x=inx, y=iny, bigger;\r
180         double ang, temp, xx, yy, kp, h1;\r
181 \r
182         bigger = fabs(deltax);\r
183         if (fabs(deltay) > bigger) bigger = fabs(deltay);\r
184         deltax /= bigger;\r
185         deltay /= bigger;\r
186 \r
187         /* Loop to move a single torpedo */\r
188         for (l=1; l <= 15; l++) {\r
189                 x += deltax;\r
190                 ix = x + 0.5;\r
191                 if (ix < 1 || ix > 10) break;\r
192                 y += deltay;\r
193                 iy = y + 0.5;\r
194                 if (iy < 1 || iy > 10) break;\r
195                 if (l==4 || l==9) skip(1);\r
196                 proutn("%d - %d   ", (int)x, (int)y);\r
197                 iquad=game.quad[ix][iy];\r
198                 if (iquad==IHDOT) continue;\r
199                 /* hit something */\r
200                 skip(1);\r
201                 switch(iquad) {\r
202                         case IHE: /* Hit our ship */\r
203                         case IHF:\r
204                                 skip(1);\r
205                                 proutn("Torpedo hits ");\r
206                                 crmshp();\r
207                                 prout(".");\r
208                                 *hit = 700.0 + 100.0*Rand() -\r
209                                            1000.0*sqrt(square(ix-inx)+square(iy-iny))*\r
210                                            fabs(sin(bullseye-angle));\r
211                                 *hit = fabs(*hit);\r
212                                 newcnd(); /* undock */\r
213                                 /* We may be displaced. */\r
214                                 if (landed==1 || condit==IHDOCKED) return; /* Cheat if on a planet */\r
215                                 ang = angle + 2.5*(Rand()-0.5);\r
216                                 temp = fabs(sin(ang));\r
217                                 if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));\r
218                                 xx = -sin(ang)/temp;\r
219                                 yy = cos(ang)/temp;\r
220                                 jx=ix+xx+0.5;\r
221                                 jy=iy+yy+0.5;\r
222                                 if (jx<1 || jx>10 || jy<1 ||jy > 10) return;\r
223                                 if (game.quad[jx][jy]==IHBLANK) {\r
224                                         finish(FHOLE);\r
225                                         return;\r
226                                 }\r
227                                 if (game.quad[jx][jy]!=IHDOT) {\r
228                                         /* can't move into object */\r
229                                         return;\r
230                                 }\r
231                                 sectx = jx;\r
232                                 secty = jy;\r
233                                 crmshp();\r
234                                 shoved = 1;\r
235                                 break;\r
236                                           \r
237                         case IHC: /* Hit a commander */\r
238                         case IHS:\r
239                                 if (Rand() <= 0.05) {\r
240                                         crmena(1, iquad, 2, ix, iy);\r
241                                         prout(" uses anti-photon device;");\r
242                                         prout("   torpedo neutralized.");\r
243                                         return;\r
244                                 }\r
245                         case IHR: /* Hit a regular enemy */\r
246                         case IHK:\r
247                                 /* find the enemy */\r
248                                 for (ll=1; ll <= nenhere; ll++)\r
249                                         if (ix==game.kx[ll] && iy==game.ky[ll]) break;\r
250                                 kp = fabs(game.kpower[ll]);\r
251                                 h1 = 700.0 + 100.0*Rand() -\r
252                                          1000.0*sqrt(square(ix-inx)+square(iy-iny))*\r
253                                          fabs(sin(bullseye-angle));\r
254                                 h1 = fabs(h1);\r
255                                 if (kp < h1) h1 = kp;\r
256                                 game.kpower[ll] -= (game.kpower[ll]<0 ? -h1 : h1);\r
257                                 if (game.kpower[ll] == 0) {\r
258                                         deadkl(ix, iy, iquad, ix, iy);\r
259                                         return;\r
260                                 }\r
261                                 crmena(1, iquad, 2, ix, iy);\r
262                                 /* If enemy damaged but not destroyed, try to displace */\r
263                                 ang = angle + 2.5*(Rand()-0.5);\r
264                                 temp = fabs(sin(ang));\r
265                                 if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));\r
266                                 xx = -sin(ang)/temp;\r
267                                 yy = cos(ang)/temp;\r
268                                 jx=ix+xx+0.5;\r
269                                 jy=iy+yy+0.5;\r
270                                 if (jx<1 || jx>10 || jy<1 ||jy > 10) {\r
271                                         prout(" damaged but not destroyed.");\r
272                                         return;\r
273                                 }\r
274                                 if (game.quad[jx][jy]==IHBLANK) {\r
275                                         prout(" buffeted into black hole.");\r
276                                         deadkl(ix, iy, iquad, jx, jy);\r
277                                         return;\r
278                                 }\r
279                                 if (game.quad[jx][jy]!=IHDOT) {\r
280                                         /* can't move into object */\r
281                                         prout(" damaged but not destroyed.");\r
282                                         return;\r
283                                 }\r
284                                 proutn(" damaged--");\r
285                                 game.kx[ll] = jx;\r
286                                 game.ky[ll] = jy;\r
287                                 shoved = 1;\r
288                                 break;\r
289                         case IHB: /* Hit a base */\r
290                                 skip(1);\r
291                                 prout("***STARBASE DESTROYED..");\r
292                                 if (game.starch[quadx][quady] < 0) game.starch[quadx][quady] = 0;\r
293                                 for (ll=1; ll<=game.state.rembase; ll++) {\r
294                                         if (game.state.baseqx[ll]==quadx && game.state.baseqy[ll]==quady) {\r
295                                                 game.state.baseqx[ll]=game.state.baseqx[game.state.rembase];\r
296                                                 game.state.baseqy[ll]=game.state.baseqy[game.state.rembase];\r
297                                                 break;\r
298                                         }\r
299                                 }\r
300                                 game.quad[ix][iy]=IHDOT;\r
301                                 game.state.rembase--;\r
302                                 basex=basey=0;\r
303                                 game.state.galaxy[quadx][quady] -= 10;\r
304                                 game.state.basekl++;\r
305                                 newcnd();\r
306                                 return;\r
307                         case IHP: /* Hit a planet */\r
308                                 crmena(1, iquad, 2, ix, iy);\r
309                                 prout(" destroyed.");\r
310                                 game.state.nplankl++;\r
311                                 game.state.newstuf[quadx][quady] -= 1;\r
312                                 DESTROY(&game.state.plnets[iplnet]);\r
313                                 iplnet = 0;\r
314                                 plnetx = plnety = 0;\r
315                                 game.quad[ix][iy] = IHDOT;\r
316                                 if (landed==1) {\r
317                                         /* captain parishes on planet */\r
318                                         finish(FDPLANET);\r
319                                 }\r
320                                 return;\r
321                         case IHSTAR: /* Hit a star */\r
322                                 if (Rand() > 0.10) {\r
323                                         nova(ix, iy);\r
324                                         return;\r
325                                 }\r
326                                 crmena(1, IHSTAR, 2, ix, iy);\r
327                                 prout(" unaffected by photon blast.");\r
328                                 return;\r
329                         case IHQUEST: /* Hit a thingy */\r
330                             if (Rand()>0.7) {   // Used to be certain death \r
331                                 skip(1);\r
332                                 prouts("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!");\r
333                                 skip(1);\r
334                                 prouts("    HACK!     HACK!    HACK!        *CHOKE!*  ");\r
335                                 skip(1);\r
336                                 proutn("Mr. Spock-");\r
337                                 prouts("  \"Fascinating!\"");\r
338                                 skip(1);\r
339                                 deadkl(ix, iy, iquad, ix, iy);\r
340                             } else {\r
341                                 /*\r
342                                  * Stas Sergeev added the possibility that\r
343                                  * you can shove the Thingy.\r
344                                  */\r
345                                 iqengry=1;\r
346                                 shoved=1;\r
347                             }\r
348                             return;\r
349                         case IHBLANK: /* Black hole */\r
350                                 skip(1);\r
351                                 crmena(1, IHBLANK, 2, ix, iy);\r
352                                 prout(" swallows torpedo.");\r
353                                 return;\r
354                         case IHWEB: /* hit the web */\r
355                                 skip(1);\r
356                                 prout("***Torpedo absorbed by Tholian web.");\r
357                                 return;\r
358                         case IHT:  /* Hit a Tholian */\r
359                                 h1 = 700.0 + 100.0*Rand() -\r
360                                          1000.0*sqrt(square(ix-inx)+square(iy-iny))*\r
361                                          fabs(sin(bullseye-angle));\r
362                                 h1 = fabs(h1);\r
363                                 if (h1 >= 600) {\r
364                                         prout(" destroyed.");\r
365                                         game.quad[ix][iy] = IHDOT;\r
366                                         ithere = 0;\r
367                                         ithx = ithy = 0;\r
368                                         return;\r
369                                 }\r
370                                 skip(1);\r
371                                 crmena(1, IHT, 2, ix, iy);\r
372                                 if (Rand() > 0.05) {\r
373                                         prout(" survives photon blast.");\r
374                                         return;\r
375                                 }\r
376                                 prout(" disappears.");\r
377                                 game.quad[ix][iy] = IHWEB;\r
378                                 ithere = ithx = ithy = 0;\r
379                                 nenhere--;\r
380                                 {\r
381                                         int dum, my;\r
382                                         dropin(IHBLANK, &dum, &my);\r
383                                 }\r
384                                 return;\r
385                                         \r
386                         default: /* Problem! */\r
387                                 skip(1);\r
388                                 proutn("Don't know how to handle collision with ");\r
389                                 crmena(1, iquad, 2, ix, iy);\r
390                                 skip(1);\r
391                                 return;\r
392                 }\r
393                 break;\r
394         }\r
395         if (shoved) {\r
396                 game.quad[jx][jy]=iquad;\r
397                 game.quad[ix][iy]=IHDOT;\r
398                 prout(" displaced by blast to %s ", cramlc(sector, jx, jy));\r
399                 for (ll=1; ll<=nenhere; ll++)\r
400                         game.kdist[ll] = game.kavgd[ll] = sqrt(square(sectx-game.kx[ll])+square(secty-game.ky[ll]));\r
401                 sortkl();\r
402                 return;\r
403         }\r
404         skip(1);\r
405         prout("Torpedo missed.");\r
406         return;\r
407 }\r
408 \r
409 static void fry(double hit) {\r
410         double ncrit, extradm;\r
411         int ktr=1, l, ll, j, cdam[NDEVICES+1], crptr;\r
412 \r
413         /* a critical hit occured */\r
414         if (hit < (275.0-25.0*skill)*(1.0+0.5*Rand())) return;\r
415 \r
416         ncrit = 1.0 + hit/(500.0+100.0*Rand());\r
417         proutn("***CRITICAL HIT--");\r
418         /* Select devices and cause damage */\r
419         for (l = 1; l <= ncrit && l <= NDEVICES; l++) {\r
420                 do {\r
421                         j = NDEVICES*Rand()+1.0;\r
422                         /* Cheat to prevent shuttle damage unless on ship */\r
423                 } while (game.damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) ||\r
424                                  j == DDRAY);\r
425                 cdam[l] = j;\r
426                 extradm = (hit*damfac)/(ncrit*(75.0+25.0*Rand()));\r
427                 game.damage[j] += extradm;\r
428                 if (l > 1) {\r
429                         for (ll=2; ll<=l && j != cdam[ll-1]; ll++) ;\r
430                         if (ll<=l) continue;\r
431                         ktr += 1;\r
432                         if (ktr==3) skip(1);\r
433                         proutn(" and ");\r
434                 }\r
435                 proutn(device[j]);\r
436         }\r
437         prout(" damaged.");\r
438         if (game.damage[DSHIELD] && shldup) {\r
439                 prout("***Shields knocked down.");\r
440                 shldup=0;\r
441         }\r
442 }\r
443 \r
444 void attack(int k) {\r
445         /* k == 0 forces use of phasers in an attack */\r
446         int percent, ihurt=0, l, i=0, jx, jy, iquad, itflag;\r
447         int atackd = 0, attempt = 0;\r
448         double hit;\r
449         double pfac, dustfac, hitmax=0.0, hittot=0.0, chgfac=1.0, r;\r
450 \r
451         iattak = 1;\r
452         if (alldone) return;\r
453 #ifdef DEBUG\r
454         if (idebug) prout("ATTACK!");\r
455 #endif\r
456 \r
457         if (ithere) movetho();\r
458 \r
459         if (neutz) { /* The one chance not to be attacked */\r
460                 neutz = 0;\r
461                 return;\r
462         }\r
463         if ((((comhere || ishere) && (justin == 0)) || skill == 5)&&(k!=0)) movcom();\r
464         if (nenhere==0 || (nenhere==1 && iqhere && iqengry==0)) return;\r
465         pfac = 1.0/inshld;\r
466         if (shldchg == 1) chgfac = 0.25+0.5*Rand();\r
467         skip(1);\r
468         if (skill <= 2) i = 2;\r
469         for (l=1; l <= nenhere; l++) {\r
470                 if (game.kpower[l] < 0) continue;       /* too weak to attack */\r
471                 /* compute hit strength and diminsh shield power */\r
472                 r = Rand();\r
473                 /* Increase chance of photon torpedos if docked or enemy energy low */\r
474                 if (condit == IHDOCKED) r *= 0.25;\r
475                 if (game.kpower[l] < 500) r *= 0.25; \r
476                 jx = game.kx[l];\r
477                 jy = game.ky[l];\r
478                 iquad = game.quad[jx][jy];\r
479                 if (iquad==IHT || (iquad==IHQUEST && !iqengry)) continue;\r
480                 itflag = (iquad == IHK && r > 0.0005) || k == 0 ||\r
481                         (iquad==IHC && r > 0.015) ||\r
482                         (iquad==IHR && r > 0.3) ||\r
483                         (iquad==IHS && r > 0.07) ||\r
484                         (iquad==IHQUEST && r > 0.05);\r
485                 if (itflag) {\r
486                         /* Enemy uses phasers */\r
487                         if (condit == IHDOCKED) continue; /* Don't waste the effort! */\r
488                         attempt = 1; /* Attempt to attack */\r
489                         dustfac = 0.8+0.05*Rand();\r
490                         hit = game.kpower[l]*pow(dustfac,game.kavgd[l]);\r
491                         game.kpower[l] *= 0.75;\r
492                 }\r
493                 else { /* Enemy used photon torpedo */\r
494                         double course = 1.90985*atan2((double)secty-jy, (double)jx-sectx);\r
495                         hit = 0;\r
496                         proutn("***TORPEDO INCOMING");\r
497                         if (game.damage[DSRSENS] <= 0.0) {\r
498                                 proutn(" From ");\r
499                                 crmena(0, iquad, i, jx, jy);\r
500                         }\r
501                         attempt = 1;\r
502                         prout("  ");\r
503                         r = (Rand()+Rand())*0.5 -0.5;\r
504                         r += 0.002*game.kpower[l]*r;\r
505                         torpedo(course, r, jx, jy, &hit);\r
506                         if (game.state.remkl==0) finish(FWON); /* Klingons did themselves in! */\r
507                         if (game.state.galaxy[quadx][quady] == 1000 ||\r
508                                 alldone) return; /* Supernova or finished */\r
509                         if (hit == 0) continue;\r
510                 }\r
511                 if (shldup != 0 || shldchg != 0 || condit==IHDOCKED) {\r
512                         /* shields will take hits */\r
513                         double absorb, hitsh, propor = pfac*shield*(condit==IHDOCKED ? 2.1 : 1.0);\r
514                         if(propor < 0.1) propor = 0.1;\r
515                         hitsh = propor*chgfac*hit+1.0;\r
516                         atackd=1;\r
517                         absorb = 0.8*hitsh;\r
518                         if (absorb > shield) absorb = shield;\r
519                         shield -= absorb;\r
520                         hit -= hitsh;\r
521                         if (propor > 0.1 && hit < 0.005*energy) continue;\r
522                 }\r
523                 /* It's a hit -- print out hit size */\r
524                 atackd = 1; /* We weren't going to check casualties, etc. if\r
525                                shields were down for some strange reason. This\r
526                                            doesn't make any sense, so I've fixed it */\r
527                 ihurt = 1;\r
528                 proutn("%d unit hit", (int)hit);\r
529                 if ((game.damage[DSRSENS] > 0 && itflag) || skill <= 2) {\r
530                         proutn(" on the ");\r
531                         crmshp();\r
532                 }\r
533                 if (game.damage[DSRSENS] <= 0.0 && itflag) {\r
534                         proutn(" from ");\r
535                         crmena(0, iquad, i, jx, jy);\r
536                 }\r
537                 skip(1);\r
538                 /* Decide if hit is critical */\r
539                 if (hit > hitmax) hitmax = hit;\r
540                 hittot += hit;\r
541                 fry(hit);\r
542                 prout("Hit %g energy %g", hit, energy);\r
543                 energy -= hit;\r
544         }\r
545         if (energy <= 0) {\r
546                 /* Returning home upon your shield, not with it... */\r
547                 finish(FBATTLE);\r
548                 return;\r
549         }\r
550         if (attempt == 0 && condit == IHDOCKED)\r
551                 prout("***Enemies decide against attacking your ship.");\r
552         if (atackd == 0) return;\r
553         percent = 100.0*pfac*shield+0.5;\r
554         if (ihurt==0) {\r
555                 /* Shields fully protect ship */\r
556                 proutn("Enemy attack reduces shield strength to ");\r
557         }\r
558         else {\r
559                 /* Print message if starship suffered hit(s) */\r
560                 skip(1);\r
561                 proutn("Energy left %2d    shields ", (int)energy);\r
562                 if (shldup) proutn("up ");\r
563                 else if (game.damage[DSHIELD] == 0) proutn("down ");\r
564                 else proutn("damaged, ");\r
565         }\r
566         prout("%d%%,   torpedoes left %d", percent, torps);\r
567         /* Check if anyone was hurt */\r
568         if (hitmax >= 200 || hittot >= 500) {\r
569                 int icas= hittot*Rand()*0.015;\r
570                 if (icas >= 2) {\r
571                         skip(1);\r
572                         prout("Mc Coy-  \"Sickbay to bridge.  We suffered %d casualties", icas);\r
573                         prout("   in that last attack.\"");\r
574                         casual += icas;\r
575                 }\r
576         }\r
577         /* After attack, reset average distance to enemies */\r
578         for (l = 1; l <= nenhere; l++)\r
579                 game.kavgd[l] = game.kdist[l];\r
580         sortkl();\r
581         return;\r
582 }\r
583                 \r
584 void deadkl(int ix, int iy, int type, int ixx, int iyy) {\r
585         /* Added ixx and iyy allow enemy to "move" before dying */\r
586 \r
587         int i,j;\r
588         \r
589         crmena(1, type, 2, ixx, iyy);\r
590         /* Decide what kind of enemy it is and update approriately */\r
591         if (type == IHR) {\r
592                 /* chalk up a Romulan */\r
593                 game.state.newstuf[quadx][quady] -= 10;\r
594                 irhere--;\r
595                 game.state.nromkl++;\r
596                 game.state.nromrem--;\r
597         }\r
598         else if (type == IHT) {\r
599                 /* Killed a Tholian */\r
600                 ithere = 0;\r
601         }\r
602         else if (type == IHQUEST) {\r
603                 /* Killed a Thingy */\r
604              iqhere=iqengry=thingx=thingy=0;\r
605         }\r
606         else {\r
607                 /* Some type of a Klingon */\r
608                 game.state.galaxy[quadx][quady] -= 100;\r
609                 klhere--;\r
610                 game.state.remkl--;\r
611                 switch (type) {\r
612                         case IHC:\r
613                                 comhere = 0;\r
614                                 for (i=1; i<=game.state.remcom; i++)\r
615                                         if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;\r
616                                 game.state.cx[i] = game.state.cx[game.state.remcom];\r
617                                 game.state.cy[i] = game.state.cy[game.state.remcom];\r
618                                 game.state.cx[game.state.remcom] = 0;\r
619                                 game.state.cy[game.state.remcom] = 0;\r
620                                 game.state.remcom--;\r
621                                 game.future[FTBEAM] = 1e30;\r
622                                 if (game.state.remcom != 0)\r
623                                         game.future[FTBEAM] = game.state.date + expran(1.0*incom/game.state.remcom);\r
624                                 game.state.killc++;\r
625                                 break;\r
626                         case IHK:\r
627                                 game.state.killk++;\r
628                                 break;\r
629                         case IHS:\r
630                                 game.state.nscrem = ishere = game.state.isx = game.state.isy = isatb = iscate = 0;\r
631                                 game.state.nsckill = 1;\r
632                                 game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;\r
633                                 break;\r
634                 }\r
635         }\r
636 \r
637         /* For each kind of enemy, finish message to player */\r
638         prout(" destroyed.");\r
639         game.quad[ix][iy] = IHDOT;\r
640         if (game.state.remkl==0) return;\r
641 \r
642         game.state.remtime = game.state.remres/(game.state.remkl + 4*game.state.remcom);\r
643 \r
644         /* Remove enemy ship from arrays describing local conditions */\r
645         if (game.future[FCDBAS] < 1e30 && batx==quadx && baty==quady && type==IHC)\r
646             game.future[FCDBAS] = 1e30;\r
647         for (i=1; i<=nenhere; i++)\r
648                 if (game.kx[i]==ix && game.ky[i]==iy) break;\r
649         nenhere--;\r
650         if (i <= nenhere)  {\r
651                 for (j=i; j<=nenhere; j++) {\r
652                         game.kx[j] = game.kx[j+1];\r
653                         game.ky[j] = game.ky[j+1];\r
654                         game.kpower[j] = game.kpower[j+1];\r
655                         game.kavgd[j] = game.kdist[j] = game.kdist[j+1];\r
656                 }\r
657         }\r
658         game.kx[nenhere+1] = 0;\r
659         game.ky[nenhere+1] = 0;\r
660         game.kdist[nenhere+1] = 0;\r
661         game.kavgd[nenhere+1] = 0;\r
662         game.kpower[nenhere+1] = 0;\r
663         return;\r
664 }\r
665 \r
666 static int targetcheck(double x, double y, double *course) {\r
667         double deltx, delty;\r
668         /* Return TRUE if target is invalid */\r
669         if (x < 1.0 || x > 10.0 || y < 1.0 || y > 10.0) {\r
670                 huh();\r
671                 return 1;\r
672         }\r
673         deltx = 0.1*(y - secty);\r
674         delty = 0.1*(sectx - x);\r
675         if (deltx==0 && delty== 0) {\r
676                 skip(1);\r
677                 prout("Spock-  \"Bridge to sickbay.  Dr. McCoy,");\r
678                 prout("  I recommend an immediate review of");\r
679                 prout("  the Captain's psychological profile.\"");\r
680                 chew();\r
681                 return 1;\r
682         }\r
683         *course = 1.90985932*atan2(deltx, delty);\r
684         return 0;\r
685 }\r
686 \r
687 void photon(void) {\r
688         double targ[4][3], course[4];\r
689         double r, dummy;\r
690         int key, n, i, osuabor;\r
691 \r
692         ididit = 0;\r
693 \r
694         if (game.damage[DPHOTON]) {\r
695                 prout("Photon tubes damaged.");\r
696                 chew();\r
697                 return;\r
698         }\r
699         if (torps == 0) {\r
700                 prout("No torpedoes left.");\r
701                 chew();\r
702                 return;\r
703         }\r
704         key = scan();\r
705         for (;;) {\r
706                 if (key == IHALPHA) {\r
707                         huh();\r
708                         return;\r
709                 }\r
710                 else if (key == IHEOL) {\r
711                         prout("%d torpedoes left.", torps);\r
712                         proutn("Number of torpedoes to fire- ");\r
713                         key = scan();\r
714                 }\r
715                 else /* key == IHREAL */ {\r
716                         n = aaitem + 0.5;\r
717                         if (n <= 0) { /* abort command */\r
718                                 chew();\r
719                                 return;\r
720                         }\r
721                         if (n > 3) {\r
722                                 chew();\r
723                                 prout("Maximum of 3 torpedoes per burst.");\r
724                                 key = IHEOL;\r
725                                 return;\r
726                         }\r
727                         if (n <= torps) break;\r
728                         chew();\r
729                         key = IHEOL;\r
730                 }\r
731         }\r
732         for (i = 1; i <= n; i++) {\r
733                 key = scan();\r
734                 if (i==1 && key == IHEOL) {\r
735                         break;  /* we will try prompting */\r
736                 }\r
737                 if (i==2 && key == IHEOL) {\r
738                         /* direct all torpedoes at one target */\r
739                         while (i <= n) {\r
740                                 targ[i][1] = targ[1][1];\r
741                                 targ[i][2] = targ[1][2];\r
742                                 course[i] = course[1];\r
743                                 i++;\r
744                         }\r
745                         break;\r
746                 }\r
747                 if (key != IHREAL) {\r
748                         huh();\r
749                         return;\r
750                 }\r
751                 targ[i][1] = aaitem;\r
752                 key = scan();\r
753                 if (key != IHREAL) {\r
754                         huh();\r
755                         return;\r
756                 }\r
757                 targ[i][2] = aaitem;\r
758                 if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;\r
759         }\r
760         chew();\r
761         if (i == 1 && key == IHEOL) {\r
762                 /* prompt for each one */\r
763                 for (i = 1; i <= n; i++) {\r
764                     proutn("Target sector for torpedo number %d- ", i);\r
765                         key = scan();\r
766                         if (key != IHREAL) {\r
767                                 huh();\r
768                                 return;\r
769                         }\r
770                         targ[i][1] = aaitem;\r
771                         key = scan();\r
772                         if (key != IHREAL) {\r
773                                 huh();\r
774                                 return;\r
775                         }\r
776                         targ[i][2] = aaitem;\r
777                         chew();\r
778                         if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;\r
779                 }\r
780         }\r
781         ididit = 1;\r
782         /* Loop for moving <n> torpedoes */\r
783         osuabor = 0;\r
784         for (i = 1; i <= n && !osuabor; i++) {\r
785                 if (condit != IHDOCKED) torps--;\r
786                 r = (Rand()+Rand())*0.5 -0.5;\r
787                 if (fabs(r) >= 0.47) {\r
788                         /* misfire! */\r
789                         r = (Rand()+1.2) * r;\r
790                         if (n>1) {\r
791                             prouts("***TORPEDO NUMBER %d MISFIRES", i);\r
792                         }\r
793                         else prouts("***TORPEDO MISFIRES.");\r
794                         skip(1);\r
795                         if (i < n)\r
796                                 prout("  Remainder of burst aborted.");\r
797                         osuabor=1;\r
798                         if (Rand() <= 0.2) {\r
799                                 prout("***Photon tubes damaged by misfire.");\r
800                                 game.damage[DPHOTON] = damfac*(1.0+2.0*Rand());\r
801                                 break;\r
802                         }\r
803                 }\r
804                 if (shldup != 0 || condit == IHDOCKED) r *= 1.0 + 0.0001*shield;\r
805                 if (n != 1) {\r
806                         skip(1);\r
807                         proutn("Track for torpedo number %d-  ", i);\r
808                 }\r
809                 else {\r
810                         skip(1);\r
811                         proutn("Torpedo track- ");\r
812                 }\r
813                 torpedo(course[i], r, sectx, secty, &dummy);\r
814                 if (alldone || game.state.galaxy[quadx][quady]==1000) return;\r
815         }\r
816         if (game.state.remkl==0) finish(FWON);\r
817 }\r
818 \r
819         \r
820 \r
821 static void overheat(double rpow) {\r
822         if (rpow > 1500) {\r
823                 double chekbrn = (rpow-1500.)*0.00038;\r
824                 if (Rand() <= chekbrn) {\r
825                         prout("Weapons officer Sulu-  \"Phasers overheated, sir.\"");\r
826                         game.damage[DPHASER] = damfac*(1.0 + Rand()) * (1.0+chekbrn);\r
827                 }\r
828         }\r
829 }\r
830 \r
831 static int checkshctrl(double rpow) {\r
832         double hit;\r
833         int icas;\r
834         \r
835         skip(1);\r
836         if (Rand() < .998) {\r
837                 prout("Shields lowered.");\r
838                 return 0;\r
839         }\r
840         /* Something bad has happened */\r
841         prouts("***RED ALERT!  RED ALERT!");\r
842         skip(2);\r
843         hit = rpow*shield/inshld;\r
844         energy -= rpow+hit*0.8;\r
845         shield -= hit*0.2;\r
846         if (energy <= 0.0) {\r
847                 prouts("Sulu-  \"Captain! Shield malf***********************\"");\r
848                 skip(1);\r
849                 stars();\r
850                 finish(FPHASER);\r
851                 return 1;\r
852         }\r
853         prouts("Sulu-  \"Captain! Shield malfunction! Phaser fire contained!\"");\r
854         skip(2);\r
855         prout("Lt. Uhura-  \"Sir, all decks reporting damage.\"");\r
856         icas = hit*Rand()*0.012;\r
857         skip(1);\r
858         fry(0.8*hit);\r
859         if (icas) {\r
860                 skip(1);\r
861                 prout("McCoy to bridge- \"Severe radiation burns, Jim.");\r
862                 prout("  %d casualties so far.\"", icas);\r
863                 casual -= icas;\r
864         }\r
865         skip(1);\r
866         prout("Phaser energy dispersed by shields.");\r
867         prout("Enemy unaffected.");\r
868         overheat(rpow);\r
869         return 1;\r
870 }\r
871         \r
872 \r
873 void phasers(void) {\r
874         double hits[21], rpow, extra, powrem, over, temp;\r
875         int kz = 0, k=1, i; /* Cheating inhibitor */\r
876         int ifast=0, no=0, ipoop=1, msgflag = 1;\r
877         enum {NOTSET, MANUAL, FORCEMAN, AUTOMATIC} automode = NOTSET;\r
878         int key=0;\r
879 \r
880         skip(1);\r
881         /* SR sensors and Computer */\r
882         if (game.damage[DSRSENS]+game.damage[DCOMPTR] > 0) ipoop = 0;\r
883         if (condit == IHDOCKED) {\r
884                 prout("Phasers can't be fired through base shields.");\r
885                 chew();\r
886                 return;\r
887         }\r
888         if (game.damage[DPHASER] != 0) {\r
889                 prout("Phaser control damaged.");\r
890                 chew();\r
891                 return;\r
892         }\r
893         if (shldup) {\r
894                 if (game.damage[DSHCTRL]) {\r
895                         prout("High speed shield control damaged.");\r
896                         chew();\r
897                         return;\r
898                 }\r
899                 if (energy <= 200.0) {\r
900                         prout("Insufficient energy to activate high-speed shield control.");\r
901                         chew();\r
902                         return;\r
903                 }\r
904                 prout("Weapons Officer Sulu-  \"High-speed shield control enabled, sir.\"");\r
905                 ifast = 1;\r
906                 \r
907         }\r
908         ididit = 1;\r
909         /* Original code so convoluted, I re-did it all */\r
910         while (automode==NOTSET) {\r
911                 key=scan();\r
912                 if (key == IHALPHA) {\r
913                         if (isit("manual")) {\r
914                                 if (nenhere==0) {\r
915                                         prout("There is no enemy present to select.");\r
916                                         chew();\r
917                                         key = IHEOL;\r
918                                         automode=AUTOMATIC;\r
919                                 }\r
920                                 else {\r
921                                         automode = MANUAL;\r
922                                         key = scan();\r
923                                 }\r
924                         }\r
925                         else if (isit("automatic")) {\r
926                                 if ((!ipoop) && nenhere != 0) {\r
927                                         automode = FORCEMAN;\r
928                                 }\r
929                                 else {\r
930                                         if (nenhere==0)\r
931                                                 prout("Energy will be expended into space.");\r
932                                         automode = AUTOMATIC;\r
933                                         key = scan();\r
934                                 }\r
935                         }\r
936                         else if (isit("no")) {\r
937                                 no = 1;\r
938                         }\r
939                         else {\r
940                                 huh();\r
941                                 ididit = 0;\r
942                                 return;\r
943                         }\r
944                 }\r
945                 else if (key == IHREAL) {\r
946                         if (nenhere==0) {\r
947                                 prout("Energy will be expended into space.");\r
948                                 automode = AUTOMATIC;\r
949                         }\r
950                         else if (!ipoop)\r
951                                 automode = FORCEMAN;\r
952                         else\r
953                                 automode = AUTOMATIC;\r
954                 }\r
955                 else {\r
956                         /* IHEOL */\r
957                         if (nenhere==0) {\r
958                                 prout("Energy will be expended into space.");\r
959                                 automode = AUTOMATIC;\r
960                         }\r
961                         else if (!ipoop)\r
962                                 automode = FORCEMAN;\r
963                         else \r
964                         proutn("Manual or automatic? ");\r
965                 }\r
966         }\r
967                                 \r
968         switch (automode) {\r
969                 case AUTOMATIC:\r
970                         if (key == IHALPHA && isit("no")) {\r
971                                 no = 1;\r
972                                 key = scan();\r
973                         }\r
974                         if (key != IHREAL && nenhere != 0) {\r
975                                 prout("Phasers locked on target. Energy available: %.2f", ifast?energy-200.0:energy);\r
976                         }\r
977                         do {\r
978                                 while (key != IHREAL) {\r
979                                         chew();\r
980                                         proutn("Units to fire=");\r
981                                         key = scan();\r
982                                 }\r
983                                 rpow = aaitem;\r
984                                 if (rpow >= (ifast?energy-200:energy)) {\r
985                                     proutn("Energy available= %.2f",\r
986                                         ifast?energy-200:energy);\r
987                                         skip(1);\r
988                                         key = IHEOL;\r
989                                 }\r
990                         } while (rpow >= (ifast?energy-200:energy));\r
991                         if (rpow<=0) {\r
992                                 /* chicken out */\r
993                                 ididit = 0;\r
994                                 chew();\r
995                                 return;\r
996                         }\r
997                         if ((key=scan()) == IHALPHA && isit("no")) {\r
998                                 no = 1;\r
999                         }\r
1000                         if (ifast) {\r
1001                                 energy -= 200; /* Go and do it! */\r
1002                                 if (checkshctrl(rpow)) return;\r
1003                         }\r
1004                         chew();\r
1005                         energy -= rpow;\r
1006                         extra = rpow;\r
1007                         if (nenhere) {\r
1008                                 extra = 0.0;\r
1009                                 powrem = rpow;\r
1010                                 for (i = 1; i <= nenhere; i++) {\r
1011                                         hits[i] = 0.0;\r
1012                                         if (powrem <= 0) continue;\r
1013                                         hits[i] = fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]));\r
1014                                         over = (0.01 + 0.05*Rand())*hits[i];\r
1015                                         temp = powrem;\r
1016                                         powrem -= hits[i] + over;\r
1017                                         if (powrem <= 0 && temp < hits[i]) hits[i] = temp;\r
1018                                         if (powrem <= 0) over = 0.0;\r
1019                                         extra += over;\r
1020                                 }\r
1021                                 if (powrem > 0.0) extra += powrem;\r
1022                                 hittem(hits);\r
1023                         }\r
1024                         if (extra > 0 && alldone == 0) {\r
1025                                 if (ithere) {\r
1026                                         proutn("*** Tholian web absorbs ");\r
1027                                         if (nenhere>0) proutn("excess ");\r
1028                                         prout("phaser energy.");\r
1029                                 }\r
1030                                 else {\r
1031                                         prout("%d expended on empty space.", (int)extra);\r
1032                                 }\r
1033                         }\r
1034                         break;\r
1035 \r
1036                 case FORCEMAN:\r
1037                         chew();\r
1038                         key = IHEOL;\r
1039                         if (game.damage[DCOMPTR]!=0)\r
1040                                 prout("Battle comuter damaged, manual file only.");\r
1041                         else {\r
1042                                 skip(1);\r
1043                                 prouts("---WORKING---");\r
1044                                 skip(1);\r
1045                                 prout("Short-range-sensors-damaged");\r
1046                                 prout("Insufficient-data-for-automatic-phaser-fire");\r
1047                                 prout("Manual-fire-must-be-used");\r
1048                                 skip(1);\r
1049                         }\r
1050                 case MANUAL:\r
1051                         rpow = 0.0;\r
1052                         for (k = 1; k <= nenhere;) {\r
1053                                 int ii = game.kx[k], jj = game.ky[k];\r
1054                                 int ienm = game.quad[ii][jj];\r
1055                                 if (msgflag) {\r
1056                                         proutn("Energy available= %.2f",\r
1057                                                energy-.006-(ifast?200:0));\r
1058                                         skip(1);\r
1059                                         msgflag = 0;\r
1060                                         rpow = 0.0;\r
1061                                 }\r
1062                                 if (game.damage[DSRSENS] && !(abs(sectx-ii) < 2 && abs(secty-jj) < 2) &&\r
1063                                         (ienm == IHC || ienm == IHS)) {\r
1064                                         cramen(ienm);\r
1065                                         prout(" can't be located without short range scan.");\r
1066                                         chew();\r
1067                                         key = IHEOL;\r
1068                                         hits[k] = 0; /* prevent overflow -- thanks to Alexei Voitenko */\r
1069                                         k++;\r
1070                                         continue;\r
1071                                 }\r
1072                                 if (key == IHEOL) {\r
1073                                         chew();\r
1074                                         if (ipoop && k > kz) {\r
1075                                                 int irec=(fabs(game.kpower[k])/(PHASEFAC*pow(0.9,game.kdist[k])))*\r
1076                                                                  (1.01+0.05*Rand()) + 1.0;\r
1077                                                 kz = k;\r
1078                                                 proutn("(%d)", irec);\r
1079                                         }\r
1080                                         proutn("units to fire at ");\r
1081                                         crmena(0, ienm, 2, ii, jj);\r
1082                                         proutn("-  ");\r
1083                                         key = scan();\r
1084                                 }\r
1085                                 if (key == IHALPHA && isit("no")) {\r
1086                                         no = 1;\r
1087                                         key = scan();\r
1088                                         continue;\r
1089                                         }\r
1090                                 if (key == IHALPHA) {\r
1091                                         huh();\r
1092                                         ididit = 0;\r
1093                                         return;\r
1094                                 }\r
1095                                 if (key == IHEOL) {\r
1096                                         if (k==1) { /* Let me say I'm baffled by this */\r
1097                                                 msgflag = 1;\r
1098                                         }\r
1099                                         continue;\r
1100                                 }\r
1101                                 if (aaitem < 0) {\r
1102                                         /* abort out */\r
1103                                         chew();\r
1104                                         return;\r
1105                                 }\r
1106                                 hits[k] = aaitem;\r
1107                                 rpow += aaitem;\r
1108                                 /* If total requested is too much, inform and start over */\r
1109                                 \r
1110                                 if (rpow >= (ifast?energy-200:energy)) {\r
1111                                         prout("Available energy exceeded -- try again.");\r
1112                                         chew();\r
1113                                         key = IHEOL;\r
1114                                         k = 1;\r
1115                                         msgflag = 1;\r
1116                                         continue;\r
1117                                 }\r
1118                                 key = scan(); /* scan for next value */\r
1119                                 k++;\r
1120                         }\r
1121                         if (rpow == 0.0) {\r
1122                                 /* zero energy -- abort */\r
1123                                 ididit = 0;\r
1124                                 chew();\r
1125                                 return;\r
1126                         }\r
1127                         if (key == IHALPHA && isit("no")) {\r
1128                                 no = 1;\r
1129                         }\r
1130                         energy -= rpow;\r
1131                         chew();\r
1132                         if (ifast) {\r
1133                                 energy -= 200.0;\r
1134                                 if (checkshctrl(rpow)) return;\r
1135                         }\r
1136                         hittem(hits);\r
1137                         ididit=1;\r
1138         }\r
1139         /* Say shield raised or malfunction, if necessary */\r
1140         if (alldone) return;\r
1141         if (ifast) {\r
1142                 skip(1);\r
1143                 if (no == 0) {\r
1144                         if (Rand() >= 0.99) {\r
1145                                 prout("Sulu-  \"Sir, the high-speed shield control has malfunctioned . . .");\r
1146                                 prouts("         CLICK   CLICK   POP  . . .");\r
1147                                 prout(" No  response, sir!");\r
1148                                 shldup = 0;\r
1149                         }\r
1150                         else\r
1151                                 prout("Shields raised.");\r
1152                 }\r
1153                 else\r
1154                         shldup = 0;\r
1155         }\r
1156         overheat(rpow);\r
1157 }\r
1158 \r
1159 void hittem(double *hits) {\r
1160         double kp, kpow, wham, hit, dustfac, kpini;\r
1161         int nenhr2=nenhere, k=1, kk=1, ii, jj, ienm;\r
1162 \r
1163         skip(1);\r
1164 \r
1165         for (; k <= nenhr2; k++, kk++) {\r
1166                 if ((wham = hits[k])==0) continue;\r
1167                 dustfac = 0.9 + 0.01*Rand();\r
1168                 hit = wham*pow(dustfac,game.kdist[kk]);\r
1169                 kpini = game.kpower[kk];\r
1170                 kp = fabs(kpini);\r
1171                 if (PHASEFAC*hit < kp) kp = PHASEFAC*hit;\r
1172                 game.kpower[kk] -= (game.kpower[kk] < 0 ? -kp: kp);\r
1173                 kpow = game.kpower[kk];\r
1174                 ii = game.kx[kk];\r
1175                 jj = game.ky[kk];\r
1176                 if (hit > 0.005) {\r
1177                         proutn("%d unit hit on ", (int)hit);\r
1178                 }\r
1179                 else\r
1180                         proutn("Very small hit on ");\r
1181                 ienm = game.quad[ii][jj];\r
1182                 if (ienm==IHQUEST) iqengry=1;\r
1183                 crmena(0,ienm,2,ii,jj);\r
1184                 skip(1);\r
1185                 if (kpow == 0) {\r
1186                         deadkl(ii, jj, ienm, ii, jj);\r
1187                         if (game.state.remkl==0) finish(FWON);\r
1188                         if (alldone) return;\r
1189                         kk--; /* don't do the increment */\r
1190                 }\r
1191                 else /* decide whether or not to emasculate klingon */\r
1192                         if (kpow > 0 && Rand() >= 0.9 &&\r
1193                                 kpow <= ((0.4 + 0.4*Rand())*kpini)) {\r
1194                                 prout("***Mr. Spock-  \"Captain, the vessel at ",\r
1195                                         cramlc(sector,ii,jj));\r
1196                                 prout("   has just lost its firepower.\"");\r
1197                                 game.kpower[kk] = -kpow;\r
1198                         }\r
1199         }\r
1200         return;\r
1201 }\r
1202 \r