|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 7076 (0x1ba4)
Types: TextFile
Names: »updmov.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/updmov.c«
/*
* Spacewar - updates movement of non-objects
* from rocket thrust
* from gravity
* checks and carries out crashing into objects
* docked crfts are updated
*
* Copyright 1985 obo Systems, Inc.
* Copyright 1985 Dan Rosenblatt
*/
#include "spacewar.h"
#ifndef VMS
#include <sys/types.h>
#else /* BSD SYSIII SYSV */
#include <types.h>
#endif /* VMS */
#include "universe.h"
#include "sys.h"
#include "login.h"
#include "obj.h"
#include "crft.h"
#include "aln.h"
#include "torp.h"
#include "build.h"
#include "flds.h"
extern double vlen();
VOID updmov()
{
register struct universe *puniv,*pobj;
register struct sys *psys;
double *ppstn,*pvel,*pthr;
double accel[3],ftmp,tmpvec[3];
char *pchng;
long l,m,sub;
register int i;
dsplcmnt tmpdspl;
#ifdef DEBUG
DBG("updmov()\n");
#endif
for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
/**********/
/* set up */
/**********/
ppstn = puniv->uv_pstn;
sub = 0L;
switch(puniv->uv_type) {
case 'A':
pvel = puniv->uv_ptr.uv_aln->al_vel;
pthr = puniv->uv_ptr.uv_aln->al_thr;
psys = puniv->uv_ptr.uv_aln->al_sys;
pchng = NULL;
break;
case 'P':
if (puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) continue;
pvel = puniv->uv_ptr.uv_crft->cr_vel;
pthr = puniv->uv_ptr.uv_crft->cr_thr;
psys = puniv->uv_ptr.uv_crft->cr_sys;
pchng = puniv->uv_ptr.uv_crft->cr_chng;
break;
case 'T':
pvel = puniv->uv_ptr.uv_torp->tp_vel;
pthr = puniv->uv_ptr.uv_torp->tp_thr;
psys = NULL;
pchng = NULL;
break;
default:
continue;
}
/***********************************/
/* acceleration from rocket thrust */
/***********************************/
rttosp(pthr,accel);
if (accel[0] != 0.) {
l = INT(accel[0]);
/* limited by how much fuel is available and maximum */
/* acceleration (reduced by damage to rockets) */
if (psys && psys[ROCKETS].s_cap) {
if (l > psys[ROCKETS].s_lvl) {
sub += l - psys[ROCKETS].s_lvl;
l = psys[ROCKETS].s_lvl;
}
m = psys[ROCKETS].s_cap;
m *= 100L - psys[ROCKETS].s_dmg;
m /= 100L;
if (l > m) {
sub += l - m;
l = m;
}
}
/* limited by maximum hull acceleration */
if (psys && l > psys[HULL].s_cap) {
sub += l - psys[HULL].s_cap;
l = psys[HULL].s_cap;
} else if (puniv->uv_type == 'T' && l > MAXTTHR) {
sub += l - MAXTTHR;
l = MAXTTHR;
}
/* reduce fuel (only for Players) */
if (l && psys && psys[ROCKETS].s_cap) {
if (pchng) {
psys[ROCKETS].s_lvl -= l;
biton(pchng,BIT_SLEVEL+ROCKETS*flds[FLD_SLEVEL].f_grpw);
}
}
/* reduce thrust */
accel[0] = SUB(accel[0],FLOAT(sub));
sptort(accel,accel);
for (i=0;i<3;++i) {
pthr[i] = SUB(pthr[i],accel[i]);
/* close enough to zero to be zero */
if ((ftmp=pthr[i]) < 0.) ftmp = NEG(ftmp);
if (SUB(ftmp,1.) < 0.) pthr[i] = 0.;
}
}
/*****************************/
/* acceleration from gravity */
/*****************************/
if (!pchng || !puniv->uv_ptr.uv_crft->cr_plvl)
for (pobj=univlst+MAXOBJ;pobj-- > univlst;) {
/* vector and distance to object */
/*vdiff(pobj->uv_pstn,ppstn,tmpvec);*/
/*ftmp = vlen(tmpvec);*/
tmpdspl = vdisp(pobj,puniv,'b');
ftmp = tmpdspl.dst;
/* crash */
if ((l = INT(ftmp)) < 2*(pobj->uv_rad+1)) {
struct crft *pcrft;
if (puniv->uv_type == 'T') {
if (puniv->uv_ptr.uv_torp->tp_fby.ip_ptr &&
puniv->uv_ptr.uv_torp->
tp_fby.ip_ptr->uv_type == 'P') {
setrpt(pcrft=puniv->uv_ptr.uv_torp->
tp_fby.ip_ptr->uv_ptr.uv_crft);
output(pcrft->cr_lgn,'B',0,0);
rpt(pcrft,"Your torpedo crashed");
fnshrpt(pcrft,1);
}
if (puniv->uv_ptr.uv_torp->tp_lhit.ip_ptr &&
puniv->uv_ptr.uv_torp->
tp_lhit.ip_ptr->uv_type == 'P') {
setrpt(pcrft=puniv->uv_ptr.uv_torp->
tp_lhit.ip_ptr->uv_ptr.uv_crft);
output(pcrft->cr_lgn,'B',0,0);
rpt(pcrft,"Torpedo destroyed by you (crashed)");
fnshrpt(pcrft,1);
}
} else if (puniv->uv_type == 'A') {
if (puniv->uv_ptr.uv_aln->al_lhit.ip_ptr &&
puniv->uv_ptr.uv_aln->
al_lhit.ip_ptr->uv_type == 'P') {
setrpt(pcrft=puniv->uv_ptr.uv_aln->
al_lhit.ip_ptr->uv_ptr.uv_crft);
output(pcrft->cr_lgn,'B',0,0);
rpt(pcrft,"Alien destroyed by you (crashed)");
fnshrpt(pcrft,1);
}
}
if (pchng) {
struct login *plgn;
pcrft = puniv->uv_ptr.uv_crft;
pcrft->cr_dock.ip_ptr = NULL; /* assure destruc. */
pcrft->cr_sens[1] = 1; /* assure destruction */
unplay(plgn=pcrft->cr_lgn);
output(plgn,'B',0,0);
output(plgn,'E',0,0);
output(plgn,'C',0,"You have crashed");
output(plgn,'C',0,PROMPT);
output(plgn,0,0,0);
} else {
idxptr prmv;
prmv.ip_ptr = puniv;
remove(prmv);
}
goto nxtuobj;
}
/* acceleration from gravity */
if (l < 250L) { /* cube root of 10*greatest_mass_object */
ftmp = CUBE(ftmp);
for (i=0;i<3;++i)
accel[i] = ADD(accel[i],
DIV(MUL(pobj->uv_mass,tmpdspl.vec[i]),ftmp));
}
}
/* show acceleration if Player */
if (pchng)
if ((l=INT(vlen(accel))) != psys[HULL].s_lvl) {
psys[HULL].s_lvl = l;
biton(pchng,BIT_SLEVEL+HULL*flds[FLD_SLEVEL].f_grpw);
}
/*******************************************/
/* position and velocity from acceleration */
/*******************************************/
for (i=0;i<3;++i) {
/* close enough to zero to be zero */
if ((ftmp=accel[i]) < 0.) ftmp = NEG(ftmp);
if (SUB(ftmp,.1) < 0.) accel[i] = 0.;
ftmp = ADD(ADD(ppstn[i],pvel[i]),DIV(accel[i],2.));
if (pchng && INT(ftmp) != INT(ppstn[i]))
biton(pchng,BIT_PN1+i);
ppstn[i] = ftmp;
ftmp = ADD(pvel[i],accel[i]);
if (pchng && INT(MUL(ftmp,50.)) != INT(MUL(pvel[i],50.)))
biton(pchng,BIT_VEL1+i);
pvel[i] = ftmp;
/* close enough to zero to be zero */
if (ftmp < 0.) ftmp = NEG(ftmp);
if (SUB(ftmp,.1) < 0.) pvel[i] = 0.;
}
vchngd(puniv);
nxtuobj:;
}
/**********/
/* docked */
/**********/
for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
if (puniv->uv_type != 'P') continue;
pvel = puniv->uv_ptr.uv_crft->cr_vel;
if (pobj = puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) {
/*vdiff(pobj->uv_pstn,puniv->uv_pstn,tmpvec);*/
tmpdspl = vdisp(pobj,puniv,'v');
vcopy(tmpvec,tmpdspl.vec);
for (i=0;i<3;++i) {
/* close enough to zero to be zero */
if ((ftmp=tmpvec[i]) < 0.) ftmp = NEG(ftmp);
if (SUB(ftmp,.1) < 0.) tmpvec[i] = 0.;
if (INT(MUL(tmpvec[i],50.)) != INT(MUL(pvel[i],50.)))
biton(puniv->uv_ptr.uv_crft->cr_chng,BIT_VEL1+i);
pvel[i] = tmpvec[i];
if (INT(pobj->uv_pstn[i]) != INT(puniv->uv_pstn[i]))
biton(puniv->uv_ptr.uv_crft->cr_chng,BIT_PN1+i);
puniv->uv_pstn[i] = pobj->uv_pstn[i];
}
vchngd(puniv);
}
}
#ifdef DEBUG
VDBG("updmov return\n");
#endif
}