|
|
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 s
Length: 6276 (0x1884)
Types: TextFile
Names: »scrn.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/scrn.c«
/*
* Spacewar - (play) screen output stuff
*
* 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 "login.h"
#include "flds.h"
#include "sys.h"
#include "crft.h"
#include "build.h"
#include "aln.h"
#include "obj.h"
#include "torp.h"
static VOID dofld();
extern long gametime;
VOID background(pcrft)
struct crft *pcrft;
{
static struct {
char bg_row,bg_col,*bg_str;
} bg[]={
{0, 0, "-------DIRECTION-------"},
{2, 0, "--------POSITION-------"},
{4, 0, "--------VELOCITY-------"},
{7, 0, "ANGLE"},
{7, 6, "---DST---"},
{7, 16, "SEE"},
{7, 20, "BAD"},
{10, 0, "---------HOMING--------"},
{11, 0, "#1:"},
{12, 0, "#2:"},
{13, 0, "#3:"},
{11, 12, "#4:"},
{12, 12, "#5:"},
{13, 12, "#6:"},
{15, 0, "RADIO:"},
{0, 59, "SYSTEM"},
{0, 69, "LEVEL"},
{0, 75, "%DMG"}
};
int i;
register struct flddesc *pfld;
for (pfld=flds+FLD_BACKGROUND,i=0;i < sizeof(bg)/sizeof(bg[0]);++i) {
pfld->f_row = bg[i].bg_row;
pfld->f_col = bg[i].bg_col;
output(pcrft->cr_lgn,'L',FLD_BACKGROUND,bg[i].bg_str);
}
}
VOID nums(pcrft)
register struct crft *pcrft;
{
int i,j;
struct sys *psys;
/* direction */
dofld(pcrft,FLD_DIR1,0,BIT_DIR1,DIV(pcrft->cr_dir[1],DEGTORAD));
dofld(pcrft,FLD_DIR2,0,BIT_DIR2,DIV(pcrft->cr_dir[2],DEGTORAD));
if (pcrft->cr_ffwd)
dofld(pcrft,FLD_AUTOFFWD,0,BIT_AUTOFFWD,"FFWD");
else if (pcrft->cr_auto.ip_ptr)
dofld(pcrft,FLD_AUTOFFWD,0,BIT_AUTOFFWD,"AUTO");
else
dofld(pcrft,FLD_AUTOFFWD,0,BIT_AUTOFFWD,"");
/* position */
dofld(pcrft,FLD_PN1,0,BIT_PN1,pcrft->cr_pstn[0]);
dofld(pcrft,FLD_PN2,0,BIT_PN2,pcrft->cr_pstn[1]);
dofld(pcrft,FLD_PN3,0,BIT_PN3,pcrft->cr_pstn[2]);
/* velocity */
dofld(pcrft,FLD_VEL1,0,BIT_VEL1,pcrft->cr_vel[0]);
dofld(pcrft,FLD_VEL2,0,BIT_VEL2,pcrft->cr_vel[1]);
dofld(pcrft,FLD_VEL3,0,BIT_VEL3,pcrft->cr_vel[2]);
/* viewscreen attributes */
dofld(pcrft,FLD_VANGL,0,BIT_VANGL,DIV(pcrft->cr_vang,DEGTORAD));
dofld(pcrft,FLD_VDIST,0,BIT_VDIST,pcrft->cr_vdst);
/* sensors */
dofld(pcrft,FLD_SSEE,0,BIT_SSEE,pcrft->cr_sens[0]);
dofld(pcrft,FLD_SBAD,0,BIT_SBAD,pcrft->cr_sens[1]);
/* homing */
for (i=0;i < MHOM;++i)
if (pcrft->cr_hom[i].ip_ptr)
dofld(pcrft,FLD_HOMCHAN+i,0,BIT_HOMCHAN+i,pcrft->cr_hdst[i]);
else {
char *savfmt;
struct flddesc *pfld=flds+(FLD_HOMCHAN+i);
savfmt = pfld->f_fmt;
pfld->f_fmt = "%-7.7s";
dofld(pcrft,FLD_HOMCHAN+i,0,BIT_HOMCHAN+i,"");
pfld->f_fmt = savfmt;
}
/* subsystems */
for (j=0,psys=pcrft->cr_sys,i=0;i < MSYS;++psys,++i) {
if (!psys->s_cap) continue; /* not in this craft */
dofld(pcrft,FLD_SNAME,i,BIT_SNAME,++j,subsysnam[i]);
dofld(pcrft,FLD_SLEVEL,i,BIT_SLEVEL,psys->s_lvl);
dofld(pcrft,FLD_SDMG,i,BIT_SDMG,psys->s_dmg);
}
/* time */
output(pcrft->cr_lgn,'H',FLD_TIME,gametime);
}
/*VARARGS4*/
static VOID dofld(pcrft,fld,grp,bit,val1,val2,val3,val4)
struct crft *pcrft;
int fld,grp,bit;
int val1,val2,val3,val4;
{
extern int nabit();
bit += grp * flds[fld].f_grpw;
if (nabit(pcrft->cr_chng,bit)) {
output(pcrft->cr_lgn,'H',(grp<<8)|fld,val1,val2,val3,val4);
bitoff(pcrft->cr_chng,bit);
}
}
VOID view(pcrft)
register struct crft *pcrft;
{
char vnew[15][31],buf[31+1];
double vdst[15][31],tmpdst,tmpvec[3],hlfvang;
dsplcmnt tmpdspl;
long ldst;
int row,col,savrow,savcol;
register struct universe *puniv;
static char vinit[]="\
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\
@@@@@@@@ | @@@@@@@@\
@@@@@ | @@@@@\
@@@ | @@@\
@@ | @@\
@ | @\
@ | @\
@-------------- --------------@\
@ | @\
@ | @\
@@ | @@\
@@@ | @@@\
@@@@@ | @@@@@\
@@@@@@@@ | @@@@@@@@\
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\
";
/* init to 'nothing there' */
bcopy((char *)vnew,vinit,sizeof(vnew));
binit((char *)vdst,sizeof(vdst));
savrow = flds[FLD_VIEWSCREEN].f_row;
savcol = flds[FLD_VIEWSCREEN].f_col;
/* special case: draw entire viewscreen */
if (pcrft->cr_scrn[0][0] == NULL) {
buf[31] = NULL;
bcopy((char *)pcrft->cr_scrn,vinit,sizeof(pcrft->cr_scrn));
for (row=0;row < 15;++row) {
bcopy(buf,pcrft->cr_scrn[row],31);
flds[FLD_VIEWSCREEN].f_row = savrow + row;
output(pcrft->cr_lgn,'L',FLD_VIEWSCREEN,buf);
}
}
/* every object except own ship */
for (puniv=univlst;puniv < univlst+MAXUNIVERSE;++puniv) {
if (!puniv->uv_type) continue;
if (puniv->uv_ptr.uv_crft == pcrft) continue;
/* translate and rotate to center viewscreen on */
/* z-axis then see if its within cone of vision */
/*vdiff(puniv->uv_pstn,pcrft->cr_pstn,tmpvec);*/
tmpdspl = vdisp(puniv,pcrft->cr_lgn->ln_play.ip_ptr,'v');
vecmul(/*tmpvec*/tmpdspl.vec,pcrft->cr_rmat,tmpvec);
rttosp(tmpvec,tmpvec);
hlfvang = DIV(pcrft->cr_vang,2.);
if (SUB(hlfvang,tmpvec[2]) >= 0.) {
/* determine where it shows on viewscreen */
/* closer object wins if they coincide */
tmpdst = tmpvec[0];
if (tmpdst == 0.) tmpdst = -1.;
tmpvec[0] = DIV(tmpvec[2],hlfvang);
tmpvec[2] = DIV(PI,2.);
sptort(tmpvec,tmpvec);
row = INT(MUL(tmpvec[1],7.)) + 7;
col = INT(MUL(tmpvec[0],15.)) + 15;
if (vdst[row][col] == 0. || SUB(vdst[row][col],tmpdst) > 0.) {
vdst[row][col] = tmpdst;
ldst = INT(tmpdst);
if (ldst <= pcrft->cr_vdst)
vnew[row][col] = puniv->uv_pctr;
else if (ldst <= 5000)
vnew[row][col] = '.';
else
vdst[row][col] = 0.;
}
}
}
/* correct actual viewscreen (only put out differences) */
buf[1] = NULL;
for (row=0;row < 15;++row) {
for (col=0;col < 31;++col) {
if (pcrft->cr_scrn[row][col] != vnew[row][col]) {
flds[FLD_VIEWSCREEN].f_row = savrow + row;
flds[FLD_VIEWSCREEN].f_col = savcol + col;
buf[0] = pcrft->cr_scrn[row][col] = vnew[row][col];
output(pcrft->cr_lgn,(vdst[row][col] <= 0.) ? 'L' : 'H',
FLD_VIEWSCREEN,buf);
}
}
}
flds[FLD_VIEWSCREEN].f_row = savrow;
flds[FLD_VIEWSCREEN].f_col = savcol;
}