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

  1. /*
  2.  * Spacewar - update energy subsystems (solar, antm, dilith, shield, warp)
  3.  *          works for both aliens and crafts
  4.  *
  5.  * Copyright 1985 obo Systems, Inc.
  6.  * Copyright 1985 Dan Rosenblatt
  7.  */
  8.  
  9. #include "spacewar.h"
  10. #ifndef VMS
  11. #include <sys/types.h>
  12. #else /* BSD SYSIII SYSV */
  13. #include <types.h>
  14. #endif /* VMS */
  15. #include "universe.h"
  16. #include "login.h"
  17. #include "sys.h"
  18. #include "obj.h"
  19. #include "aln.h"
  20. #include "crft.h"
  21. #include "build.h"
  22. #include "flds.h"
  23. #include "torp.h"
  24.  
  25. static long prtlvl(),strlvl();
  26.  
  27. VOID updsys()
  28. {
  29.     register struct universe *puniv;
  30.     register struct obj *pobj;
  31.     register struct sys *psys,*psh;
  32.     char *pchng;
  33.     double vdist(),ftmp;
  34.     long i,elvl;
  35.     dsplcmnt tmpdspl;
  36.  
  37. #ifdef DEBUG
  38.     DBG("updsys()\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.             psys = puniv->uv_ptr.uv_aln->al_sys;
  49.             pchng = NULL;
  50.             break;
  51.         case 'P':
  52.             psys = puniv->uv_ptr.uv_crft->cr_sys;
  53.             pchng = puniv->uv_ptr.uv_crft->cr_chng;
  54.             break;
  55.         default:
  56.             continue;
  57.         }
  58.         elvl = 0L;
  59.  
  60.         /****************/
  61.         /* solar energy */
  62.         /****************/
  63.         if (psys[SOLARE].s_cap) {
  64.         for (i=0,pobj=objlst+MAXOBJ;pobj-- > objlst;) {
  65.             if (pobj->oj_rep != '*') continue;
  66.             /*ftmp = vdist(univlst[pobj-objlst].uv_pstn,puniv->uv_pstn);*/
  67.             tmpdspl = vdisp(&univlst[pobj-objlst],puniv,'d');
  68.             ftmp = tmpdspl.dst;
  69.             i += INT(DIV(1.e9,SQUARE(ftmp)));
  70.         }
  71.         elvl += strlvl(psys,SOLARE,prtlvl(psys,SOLARE,i),pchng);
  72.         }
  73.  
  74.         /*********************/
  75.         /* antimatter energy */
  76.         /*********************/
  77.         if (i=psys[ANTME].s_cap)
  78.         elvl += strlvl(psys,ANTME,prtlvl(psys,ANTME,i),pchng);
  79.  
  80.         /* dilithium storage - increase from solar and antimatter    */
  81.         /* no dilithium ==> energy flow but no storage        */
  82.         /* shields consume energy - reduce shields if not enough    */
  83.         /* remaining gets stored into dilithium (if present)    */
  84.         if (psys[DILITH].s_cap)
  85.         elvl += psys[DILITH].s_lvl;
  86.         if ((psh=psys+SHIELDS)->s_cap) {
  87.  
  88.         /* alien shields to 75+hulldamage+? if */
  89.         /* attacking otherwise 25+hulldamage   */
  90.         if (!pchng) {
  91.             psh->s_lvl = 25 + puniv->uv_mass;
  92.             if (puniv->uv_ptr.uv_aln->al_atck.ip_ptr)
  93.             psh->s_lvl += 50 + puniv->uv_ptr.uv_aln->al_aeval/20;
  94.             if (psh->s_lvl > 100) psh->s_lvl = 100;
  95.         }
  96.  
  97.         /* energy required to maintain shields (gag awful !@#$%^&) */
  98.         /* capacity reduced by %level and %subsystem, again reduced*/
  99.         /* by some type of squaring of %damage; keep reducing lvl  */
  100.         /* until energy required does not exceed energy available  */
  101.         for (;;) {
  102.             i = psh->s_cap;
  103.             i *= psh->s_pct;
  104.             i *= psh->s_lvl;
  105.             i /= (100L*100L);
  106.             i *= 10201L;
  107.             i /= 10201L + (psh->s_dmg-202L)*psh->s_dmg;
  108.             if (i <= elvl) break;
  109.             psh->s_lvl -= 1;
  110.             if (pchng)
  111.             biton(pchng,BIT_SLEVEL+SHIELDS*flds[FLD_SLEVEL].f_grpw);
  112.         }
  113.         elvl -= i;
  114.         }
  115.         if (psys[DILITH].s_cap)
  116.         strlvl(psys,DILITH,elvl,pchng);
  117.  
  118.         /***************/
  119.         /* warp energy */
  120.         /***************/
  121.         if (psys[WARP].s_cap) {
  122.         int savpct=psys[WARP].s_pct,savdmg=psys[WARP].s_dmg;
  123.         i = psys[WARP].s_cap;
  124.         i *= psys[WARP].s_pct;
  125.         i /= 100L*100L*2L;
  126.         i += psys[WARP].s_lvl;
  127.  
  128.         /* maximum level (capacity) unaffected by %lvl or %dmg */
  129.         psys[WARP].s_pct = 100;
  130.         psys[WARP].s_dmg = 0;
  131.         strlvl(psys,WARP,i,pchng);
  132.         psys[WARP].s_pct = savpct;
  133.         psys[WARP].s_dmg = savdmg;
  134.         }
  135.     }
  136.  
  137. #ifdef DEBUG
  138.     VDBG("updsys return\n");
  139. #endif
  140. }
  141.  
  142. /* pro-rate level for %, %dmg */
  143. static long prtlvl(psys,isys,lvl)
  144. register struct sys *psys;
  145. int isys;
  146. long lvl;
  147. {
  148.     psys += isys;
  149.     if (psys->s_cap) {
  150.         lvl = (lvl*psys->s_pct)/100;
  151.         lvl = (lvl*(100-psys->s_dmg))/100;
  152.     } else
  153.         lvl = 0L;
  154.     return(lvl);
  155. }
  156.  
  157. /* limit lvl to capacity (capacity reduced by %dmg) */
  158. /* store new level and indicate if changed        */
  159. static long strlvl(psys,isys,lvl,pchng)
  160. struct sys *psys;
  161. int isys;
  162. long lvl;
  163. char *pchng;
  164. {
  165.     long maxcap;
  166.  
  167.     psys += isys;
  168.     if (psys->s_cap) {
  169.         maxcap = psys->s_cap;
  170.         maxcap *= psys->s_pct;
  171.         maxcap *= 100L-psys->s_dmg;
  172.         maxcap /= 100L*100L;
  173.         if (lvl > maxcap)
  174.         lvl = maxcap;
  175.         if (lvl != psys->s_lvl) {
  176.         psys->s_lvl = lvl;
  177.         if (pchng)
  178.             biton(pchng,BIT_SLEVEL+isys*flds[FLD_SLEVEL].f_grpw);
  179.         }
  180.     } else
  181.         lvl = 0L;
  182.     return(lvl);
  183. }
  184.