|
|
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 p
Length: 7450 (0x1d1a)
Types: TextFile
Names: »plinit.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/plinit.c«
/*
* Spacewar - routine to initialize a player into the universe
* - terminal type
* - craft name
* - craft structure and universe entry
*
* Copyright 1985 obo Systems, Inc.
* Copyright 1985 Dan Rosenblatt
*/
#ifndef VMS
#include <sys/types.h>
#include <dbm.h>
#else /* BSD SYSIII SYSV */
#include <types.h>
#include "dbm.h"
#endif /* VMS */
#include "spacewar.h"
#include "universe.h"
#include "login.h"
#include "sys.h"
#include "crft.h"
#include "obj.h"
#include "aln.h"
#include "torp.h"
#include "build.h"
extern char *malloc(),*tgetstr(),*lckmsg();
extern int numpling;
int plinit(plogin)
register struct login *plogin;
{
char trmbuf[2048],trmcap[128],*ptrmcap,*pcm,*pcl,*pce,*pso,*pse;
char buf[80+1],*s,*so,*se;
register struct universe *puniv;
register struct crft *pcrft;
struct crftkey getcrkey;
struct crft getcrdat;
struct syskey getskey;
datum dbmkey,dbmdata;
int i;
#ifdef DEBUG
DBG("plinit(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
#endif
if (!strcmp(plogin->ln_input,".")) goto noplay;
/********************/
/* no terminal type */
/********************/
if (!plogin->ln_term) {
/* get terminal type from user input */
if (!plogin->ln_input[0]) {
getterm: output(plogin,'C',0,"\nWhat (termcap) terminal type>");
output(plogin,0,0,0);
#ifdef DEBUG
VDBG("plinit return\n");
#endif
return(0);
}
plogin->ln_rvslh = 0;
switch(plogin->ln_input[0]) {
case '.':
so = "so"; se = "se";
plogin->ln_rvslh = 1;
strcpy(plogin->ln_input,plogin->ln_input+1);
break;
case ',':
so = "us"; se = "ue";
strcpy(plogin->ln_input,plogin->ln_input+1);
break;
case ';':
so = "us"; se = "ue";
plogin->ln_rvslh = 1;
strcpy(plogin->ln_input,plogin->ln_input+1);
break;
default:
so = "so"; se = "se";
break;
}
if (tgetent(trmbuf,plogin->ln_input) != 1) goto getterm;
/* get necessary capabilities */
ptrmcap = trmcap;
if (!(pcm=tgetstr("cm",&ptrmcap)) ||
!(pcl=tgetstr("cl",&ptrmcap)) ||
!(pce=tgetstr("ce",&ptrmcap)) ||
!(pso=tgetstr(so,&ptrmcap)) ||
!(pse=tgetstr(se,&ptrmcap))) {
output(plogin,'C',0,
"\nMissing minimum necessary terminal capabilities\n");
goto noplay;
}
/* save terminal type and capabilities */
if (!(plogin->ln_term = malloc((unsigned)strlen(plogin->ln_input)+1)) ||
!(plogin->ln_tcm = malloc((unsigned)strlen(pcm)+1)) ||
!(plogin->ln_tcl = malloc((unsigned)strlen(pcl)+1)) ||
!(plogin->ln_tce = malloc((unsigned)strlen(pce)+1)) ||
!(plogin->ln_tso = malloc((unsigned)strlen(pso)+1)) ||
!(plogin->ln_tse = malloc((unsigned)strlen(pse)+1))) {
perror("plinit: out of memory for termcaps");
plogin->ln_term = NULL;
plogin->ln_tcm = NULL;
plogin->ln_tcl = NULL;
plogin->ln_tce = NULL;
plogin->ln_tso = NULL;
plogin->ln_tse = NULL;
goto noplay;
}
strcpy(plogin->ln_term,plogin->ln_input);
plogin->ln_input[0] = NULL;
strcpy(plogin->ln_tcm,pcm);
strcpy(plogin->ln_tcl,pcl);
strcpy(plogin->ln_tce,pce);
strcpy(plogin->ln_tso,pso);
strcpy(plogin->ln_tse,pse);
}
/*********/
/* craft */
/*********/
/* prompt for ship name */
if (!plogin->ln_input[0]) {
output(plogin,'C',0,"\nWhat ship>");
output(plogin,0,0,0);
#ifdef DEBUG
VDBG("plinit return\n");
#endif
return(0);
}
/* get craft */
plogin->ln_input[sizeof(plogin->ln_crft)-1] = NULL;
binit((char *)&getcrkey,sizeof(getcrkey));
getcrkey.cr_crftkey = CRAFT;
strcpy(getcrkey.cr_plyr,plogin->ln_name);
strcpy(getcrkey.cr_name,plogin->ln_input);
dbmkey.dptr = (char *)&getcrkey;
dbmkey.dsize = sizeof(getcrkey);
dbmdata = fetch(dbmkey);
if (!dbmdata.dptr) {
sprintf(buf,"\n'%s' - no such ship\n",plogin->ln_input);
output(plogin,'C',0,buf);
goto noplay;
}
binit((char *)&getcrdat,sizeof(getcrdat));
bcopy((char *)&getcrdat,dbmdata.dptr,dbmdata.dsize);
/* must have a hull */
if (!getcrdat.cr_htyp) {
sprintf(buf,"\n'%s' - has no hull\n",plogin->ln_input);
output(plogin,'C',0,buf);
goto noplay;
}
/* must be room in the universe */
for (puniv=univlst+MAXOBJ+MAXALN;puniv < univlst+MAXUNIVERSE;++puniv)
if (!puniv->uv_type)
break;
if (puniv >= univlst+MAXUNIVERSE) {
output(plogin,'C',0,"\nSorry, the universe is temporarily full\n");
goto noplay;
}
/* must not be locked */
if (s=lckmsg()) {
output(plogin,'C',0,"\n");
output(plogin,'C',0,s);
output(plogin,'C',0,"\n");
goto noplay;
}
/**********************************/
/* put player/craft into universe */
/**********************************/
/* fill in craft data */
pcrft = crftlst + (plogin - loginlst); /* 1to1 correspondence */
*pcrft = getcrdat;
/* if first time playing, pick a pstn near the object */
if (pcrft->cr_dock.ip_ofst == -1) {
pcrft->cr_dock.ip_ptr = NULL;
i = RANDOM(MAXOBJ-1) + 1; /* 1:MAXOBJ-1 */
vcopy(pcrft->cr_pstn,univlst[i].uv_pstn);
pcrft->cr_pstn[0] =
ADD(pcrft->cr_pstn[0],FLOAT(RANDOM(2000)+500));
pcrft->cr_pstn[1] =
ADD(pcrft->cr_pstn[1],FLOAT(RANDOM(2000)+500));
pcrft->cr_vang = DIV(PI,4.);
pcrft->cr_vdst =
INT(DIV(VANGVDST,SQUARE(pcrft->cr_vang)));
/* point so that facing the object */
vdiff(univlst[i].uv_pstn,pcrft->cr_pstn,pcrft->cr_dir);
rttosp(pcrft->cr_dir,pcrft->cr_dir);
/* previously docked with a non-object; pstn remains the same */
} else if (pcrft->cr_dock.ip_ofst >= MAXOBJ ||
pcrft->cr_dock.ip_ofst <= 0) {
pcrft->cr_dock.ip_ptr = NULL;
/* prevsiously docked with an object; pstn shifts to object */
} else if (pcrft->cr_dock.ip_ofst) {
pcrft->cr_dock.ip_ptr = univlst + pcrft->cr_dock.ip_ofst;
vcopy(pcrft->cr_pstn,pcrft->cr_dock.ip_ptr->uv_pstn);
}
/* turn off inappropriate homing/autopilot */
if (pcrft->cr_auto.ip_ofst >= MAXOBJ || pcrft->cr_auto.ip_ofst <= 0)
pcrft->cr_auto.ip_ptr = NULL;
else
pcrft->cr_auto.ip_ptr = univlst + pcrft->cr_auto.ip_ofst;
for (i=0;i < MHOM;++i) {
if (pcrft->cr_hom[i].ip_ofst >= MAXOBJ || pcrft->cr_hom[i].ip_ofst <= 0)
pcrft->cr_hom[i].ip_ptr = NULL;
else
pcrft->cr_hom[i].ip_ptr = univlst + pcrft->cr_hom[i].ip_ofst;
}
/* normalize direction and do rotation matrix */
fixdir(pcrft);
/* get all subsystems */
binit((char *)&getskey,sizeof(getskey));
getskey.s_syskey = SUBSYS;
strcpy(getskey.s_plyr,plogin->ln_name);
strcpy(getskey.s_crft,getcrkey.cr_name);
dbmkey.dptr = (char *)&getskey;
dbmkey.dsize = sizeof(getskey);
for (i=0;i < MSYS;++i) {
getskey.s_type = i;
dbmdata = fetch(dbmkey);
if (dbmdata.dptr)
bcopy((char *)(pcrft->cr_sys+i),dbmdata.dptr,dbmdata.dsize);
}
/* et al */
pcrft->cr_lgn = plogin;
pcrft->cr_lhit.ip_ptr = NULL;
plogin->ln_iomode = 's';
strcpy(plogin->ln_crft,getcrkey.cr_name);
plogin->ln_play.ip_ptr = puniv;
puniv->uv_type = 'P';
puniv->uv_pctr = pcrft->cr_htyp + '0';
puniv->uv_pstn = pcrft->cr_pstn;
puniv->uv_mass = pcrft->cr_sys[HULL].s_dmg;
puniv->uv_rad = 1;
puniv->uv_ptr.uv_crft = pcrft;
pcrft->cr_univ.ip_ptr = puniv;
/* first player must start universe update */
if (!numpling++) firstplyr();
#ifdef DEBUG
VDBG("plinit return\n");
#endif
return(1);
noplay: plogin->ln_stat = NULL;
output(plogin,'C',0,PROMPT);
output(plogin,0,0,0);
#ifdef DEBUG
VDBG("plinit return\n");
#endif
return(0);
}