|
|
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 r
Length: 3648 (0xe40)
Types: TextFile
Names: »remove.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/remove.c«
/*
* Spacewar - remove (nicely) an object from the universe (crft, torp, aln)
* fixes (*)lhit,atck,dock,hom,auto
* aliens are relocated (as if removed and replaced) when removed
* torps are NOT removed if firing crft/aln removed
* torps report a miss if fired at crft/torp/aln removed
*
* 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 "crft.h"
#include "obj.h"
#include "torp.h"
#include "flds.h"
#include "aln.h"
VOID remove(prmv)
idxptr prmv;
{
struct universe *puniv=univlst+MAXUNIVERSE;
struct aln *paln;
struct crft *pcrft;
int i;
struct torp *ptorp;
#ifdef DEBUG
DBG("remove(#%d/'%c/%c')\n",prmv.ip_ptr-univlst,prmv.ip_ptr->uv_type,
prmv.ip_ptr->uv_pctr);
#endif
while (--puniv >= univlst) {
if (!puniv->uv_type) continue;
/*if (puniv == prmv.ip_ptr) continue;???*/
switch(puniv->uv_type) {
case 'A':
paln = puniv->uv_ptr.uv_aln;
if (paln->al_lhit.ip_ptr == prmv.ip_ptr) {
paln->al_lhit.ip_ptr = NULL;
paln->al_aeval = 0;
}
if (paln->al_atck.ip_ptr == prmv.ip_ptr) {
paln->al_atck.ip_ptr = NULL;
paln->al_dly = 0;
}
break;
case 'P':
pcrft = puniv->uv_ptr.uv_crft;
if (pcrft->cr_dock.ip_ptr == prmv.ip_ptr) {
pcrft->cr_dock.ip_ptr = NULL;
pcrft->cr_scrn[7][15] = '?';
}
for (i=0;i < MHOM;++i)
if (pcrft->cr_hom[i].ip_ptr == prmv.ip_ptr) {
pcrft->cr_hom[i].ip_ptr = NULL;
biton(pcrft->cr_chng,BIT_HOMCHAN+i);
}
if (pcrft->cr_auto.ip_ptr == prmv.ip_ptr) {
pcrft->cr_auto.ip_ptr = NULL;
biton(pcrft->cr_chng,BIT_AUTOFFWD);
}
if (pcrft->cr_lhit.ip_ptr == prmv.ip_ptr)
pcrft->cr_lhit.ip_ptr = NULL;
break;
case 'T':
ptorp = puniv->uv_ptr.uv_torp;
if (ptorp->tp_lhit.ip_ptr == prmv.ip_ptr)
ptorp->tp_lhit.ip_ptr = NULL;
if (ptorp->tp_fby.ip_ptr == prmv.ip_ptr) {
/**** don't remove (hee hee hee)****/
/****idxptr xrmv; ****/
/****xrmv.ip_ptr = puniv; ****/
/****remove(xrmv); ****/
/****continue; ****/
ptorp->tp_fby.ip_ptr = NULL;
}
if (ptorp->tp_aim.ip_ptr == prmv.ip_ptr) {
if (ptorp->tp_fby.ip_ptr &&
ptorp->tp_fby.ip_ptr->uv_type == 'P') {
pcrft = ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
output(pcrft->cr_lgn,'B',0,0);
setrpt(pcrft);
rpt(pcrft,"Torpedo missed - target went away");
fnshrpt(pcrft,1);
}
remove(ptorp->tp_univ);
continue;
}
break;
}
}
/* relocate rather than remove aliens */
if (prmv.ip_ptr->uv_type == 'A') {
paln = prmv.ip_ptr->uv_ptr.uv_aln;
/* zero out velocity, thrust, attack variables, subsystem damage */
vinit(paln->al_vel);
vinit(paln->al_thr);
paln->al_dly = 0;
paln->al_lhit.ip_ptr = NULL;
paln->al_atck.ip_ptr = NULL;
paln->al_aeval = 0;
for (i=0;i<MSYS;++i)
paln->al_sys[i].s_dmg = 0;
prmv.ip_ptr->uv_mass = 0;
/* relocate */
for (i=0;i<3;++i)
paln->al_pstn[i] = MUL(paln->al_pstn[i],-2.);
vchngd(paln->al_univ.ip_ptr);
/* actually remove the object */
} else {
if (prmv.ip_ptr->uv_type == 'T')
binit((char *)prmv.ip_ptr->uv_ptr.uv_torp,sizeof(struct torp));
else if (prmv.ip_ptr->uv_type == 'P')
binit((char *)prmv.ip_ptr->uv_ptr.uv_crft,sizeof(struct crft));
vrmv(prmv.ip_ptr);
binit((char *)prmv.ip_ptr,sizeof(*prmv.ip_ptr));
}
#ifdef DEBUG
VDBG("remove return\n");
#endif
}