home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume4 / spacewar / part04 / upddmg.c < prev    next >
C/C++ Source or Header  |  1988-05-31  |  5KB  |  191 lines

  1. /*
  2.  * Spacewar - update damage from hull damage and do damage control
  3.  *          hull %dmg>=60 more damage, >=80 destroys
  4.  *          works for both crfts and alns
  5.  *          works for torp dmg >= 100
  6.  *
  7.  * Copyright 1985 obo Systems, Inc.
  8.  * Copyright 1985 Dan Rosenblatt
  9.  */
  10.  
  11. #include "spacewar.h"
  12. #ifndef VMS
  13. #include <sys/types.h>
  14. #else /* BSD SYSIII SYSV */
  15. #include <types.h>
  16. #endif /* VMS */
  17. #include "universe.h"
  18. #include "sys.h"
  19. #include "login.h"
  20. #include "crft.h"
  21. #include "build.h"
  22. #include "aln.h"
  23. #include "flds.h"
  24. #include "obj.h"
  25. #include "torp.h"
  26.  
  27. VOID upddmg()
  28. {
  29.     struct universe *puniv;
  30.     register struct sys *psys,*pdmgcon;
  31.     register struct crft *pcrft,*phit;
  32.     struct aln *paln;
  33.     struct torp *ptorp;
  34.     struct login *plogin;
  35.     int i;
  36.  
  37. #ifdef DEBUG
  38.     DBG("upddmg()\n");
  39. #endif
  40.  
  41.     for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
  42.  
  43.         /**********/
  44.         /* set up */
  45.         /**********/
  46.         switch(puniv->uv_type) {
  47.         case 'A':
  48.             paln = puniv->uv_ptr.uv_aln;
  49.             if (paln->al_lhit.ip_ptr &&
  50.             paln->al_lhit.ip_ptr->uv_type == 'P')
  51.             phit = paln->al_lhit.ip_ptr->uv_ptr.uv_crft;
  52.             else
  53.             phit = NULL;
  54.             psys = paln->al_sys;
  55.             pcrft = NULL;
  56.             break;
  57.         case 'P':
  58.             pcrft = puniv->uv_ptr.uv_crft;
  59.             if (pcrft->cr_lhit.ip_ptr &&
  60.             pcrft->cr_lhit.ip_ptr->uv_type == 'P')
  61.             phit = pcrft->cr_lhit.ip_ptr->uv_ptr.uv_crft;
  62.             else
  63.             phit = NULL;
  64.             psys = pcrft->cr_sys;
  65.             paln = NULL;
  66.             break;
  67.         case 'T':
  68.             ptorp = puniv->uv_ptr.uv_torp;
  69.             if (ptorp->tp_dmg >= 100) {
  70.  
  71.             /* hit by a player, credit and report destruction */
  72.             if (ptorp->tp_lhit.ip_ptr &&
  73.             ptorp->tp_lhit.ip_ptr->uv_type == 'P') {
  74.                 phit = ptorp->tp_lhit.ip_ptr->uv_ptr.uv_crft;
  75.                 phit->cr_pnts += 200;
  76.                 output(phit->cr_lgn,'B',0,0);
  77.                 setrpt(phit);
  78.                 rpt(phit,"Torpedo destroyed by you");
  79.                 fnshrpt(phit,1);
  80.             }
  81.  
  82.             /* report destroyed torpedo to firing player */
  83.             if (ptorp->tp_fby.ip_ptr &&
  84.             ptorp->tp_fby.ip_ptr->uv_type == 'P') {
  85.                 phit = ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
  86.                 output(phit->cr_lgn,'B',0,0);
  87.                 setrpt(phit);
  88.                 rpt(phit,"Your torpedo destroyed");
  89.                 fnshrpt(phit,1);
  90.             }
  91.  
  92.             /* remove torpedo */
  93.             remove(ptorp->tp_univ);
  94.             }
  95.             continue;
  96.         default:
  97.             continue;
  98.         }
  99.  
  100.         /*******************************/
  101.         /* hull damage >= 80% destroys */
  102.         /*******************************/
  103.         if (psys[HULL].s_dmg >= 80) {
  104.  
  105.         /* alien */
  106.         if (paln) {
  107.  
  108.             /* hit by another player, credit and report destruction */
  109.             if (phit) {
  110.             phit->cr_kill += 1;
  111.             output(phit->cr_lgn,'B',0,0);
  112.             setrpt(phit);
  113.             rpt(phit,"Alien destroyed by you");
  114.             fnshrpt(phit,1);
  115.             }
  116.             remove(paln->al_univ);
  117.  
  118.         /* craft */
  119.         } else {
  120.             pcrft->cr_dock.ip_ptr = NULL; /* assure destruction */
  121.             pcrft->cr_sens[1] = 1; /* assure destruction */
  122.             unplay(plogin=pcrft->cr_lgn); /* *pcrft gets zeroed out */
  123.             output(plogin,'E',0,0);
  124.             output(plogin,'B',0,0);
  125.             output(plogin,'C',0,"You are destroyed (hull broke up)\n");
  126.             output(plogin,'C',0,PROMPT);
  127.             output(plogin,0,0,0);
  128.         }
  129.  
  130.         /**************************************************************/
  131.         /* hull damage >= 60% causes gradual damage to all subsystems */
  132.         /**************************************************************/
  133.         } else if (psys[HULL].s_dmg >= 60) 
  134.         damage(NULL,puniv,1.,DIV(FLOAT(RANDOM(100)),69000.),
  135.         "Hull damage >=60%");
  136.  
  137.         /******************/
  138.         /* damage control */
  139.         /******************/
  140.         pdmgcon = psys + DMGCON;
  141.  
  142.         /* only if damage control subsystem is present */
  143.         if (pdmgcon->s_cap) {
  144.  
  145.         /* not fixing a specific system */
  146.         if (!pdmgcon->s_lvl) {
  147.  
  148.             /* reduce damage by 1% for randomly chosen subsystems */
  149.             for (i=pdmgcon->s_pct*(100-pdmgcon->s_dmg)/1500+1;i-- > 0;) {
  150.             pdmgcon = psys + RANDOM(MSYS);
  151.             if (pdmgcon->s_dmg <= 0 || pdmgcon->s_dmg == 45)
  152.                 continue;  /* already as low as it can go */
  153.             pdmgcon->s_dmg -= 1;
  154.             if (pcrft)
  155.                 biton(pcrft->cr_chng,
  156.                 BIT_SDMG+(pdmgcon-psys)*flds[FLD_SDMG].f_grpw);
  157.             if (pdmgcon == psys)
  158.                 puniv->uv_mass = pdmgcon->s_dmg;
  159.             }
  160.         
  161.         /* fixing a specific system */
  162.         } else {
  163.             i = pdmgcon->s_pct*(100-pdmgcon->s_dmg)/1500 + 1;
  164.             i = (i*2)/3; /* diminishing returns */
  165.             pdmgcon = psys + pdmgcon->s_lvl - 1;
  166.             if (pdmgcon->s_cap) { /* only if subsystem is present */
  167.                 if (pdmgcon->s_dmg > 0 && pdmgcon->s_dmg != 45 && i) {
  168.                 pdmgcon->s_dmg -= i;
  169.                 biton(pcrft->cr_chng,
  170.                 BIT_SDMG+(pdmgcon-psys)*flds[FLD_SDMG].f_grpw);
  171.                 if (pdmgcon->s_dmg < 0)
  172.                 pdmgcon->s_dmg = 0;
  173.                 if (pdmgcon->s_dmg < 45 && pdmgcon->s_dmg+i > 45)
  174.                 pdmgcon->s_dmg = 45;
  175.             } else { /* can't be fixed any further */
  176.                 psys[DMGCON].s_lvl = NULL;
  177.                 biton(pcrft->cr_chng,
  178.                 BIT_SLEVEL+DMGCON*flds[FLD_SLEVEL].f_grpw);
  179.             }
  180.             if (pdmgcon == psys)
  181.                 puniv->uv_mass = pdmgcon->s_dmg;
  182.             }
  183.         }
  184.         }
  185.     }
  186.  
  187. #ifdef DEBUG
  188.     VDBG("upddmg return\n");
  189. #endif
  190. }
  191.