|
|
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: 3248 (0xcb0)
Types: TextFile
Names: »unplay.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/unplay.c«
/*
* Spacewar - remove a player from the universe
* update/destroy the ship
*
* 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 "plyr.h"
#include "login.h"
#include "sys.h"
#include "crft.h"
VOID unplay(plogin)
register struct login *plogin;
{
register struct crft *pcrft;
struct crft *pcrft2;
struct sys *psys;
struct crftkey getcrkey;
struct syskey getskey;
struct plyrkey getplkey;
struct plyr getpldat;
datum dbmkey,dbmdata;
int i;
extern int numpling;
#ifdef DEBUG
DBG("unplay(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
#endif
/* privileged or docked with an object or nothing bad nearby */
pcrft = plogin->ln_play.ip_ptr->uv_ptr.uv_crft;
if (pcrft->cr_plvl || (pcrft->cr_dock.ip_ptr &&
pcrft->cr_dock.ip_ptr->uv_type == 'O') || pcrft->cr_sens[1] == 0)
crftupdate(plogin);
/* destroy; report and give credit if due to another player */
else {
/* delete craft and subsystems from database */
binit((char *)&getcrkey,sizeof(getcrkey));
getcrkey.cr_crftkey = CRAFT;
strcpy(getcrkey.cr_plyr,plogin->ln_name);
strcpy(getcrkey.cr_name,plogin->ln_crft);
dbmkey.dptr = (char *)&getcrkey;
dbmkey.dsize = sizeof(getcrkey);
if (delete(dbmkey))
perror("unplay: can't delete crft");
binit((char *)&getskey,sizeof(getskey));
getskey.s_syskey = SUBSYS;
strcpy(getskey.s_plyr,plogin->ln_name);
strcpy(getskey.s_crft,plogin->ln_crft);
dbmkey.dptr = (char *)&getskey;
dbmkey.dsize = sizeof(getskey);
for (psys=pcrft->cr_sys,i=0;i < MSYS;++psys,++i) {
if (!psys->s_cap) continue; /* not in this craft */
getskey.s_type = i;
if (delete(dbmkey))
perror("unplay: can't delete sys");
}
/* update player losing craft */
binit((char *)&getplkey,sizeof(getplkey));
getplkey.pl_plyrkey = PLYR;
strcpy(getplkey.pl_name,plogin->ln_name);
dbmkey.dptr = (char *)&getplkey;
dbmkey.dsize = sizeof(getplkey);
dbmdata = fetch(dbmkey);
if (dbmdata.dptr) {
bcopy((char *)&getpldat,dbmdata.dptr,sizeof(getpldat));
getpldat.pl_slst += 1;
getpldat.pl_klst += pcrft->cr_kill;
getpldat.pl_plst += pcrft->cr_pnts;
getpldat.pl_tlst += pcrft->cr_time;
dbmdata.dptr = (char *)&getpldat;
dbmdata.dsize = sizeof(getpldat);
if (store(dbmkey,dbmdata))
perror("unplay: can't update plyr");
} else
perror("unplay: can't fetch plyr");
/* report destruction and credit destroyer */
if (pcrft->cr_lhit.ip_ptr && pcrft->cr_lhit.ip_ptr->uv_type == 'P') {
pcrft2 = pcrft->cr_lhit.ip_ptr->uv_ptr.uv_crft;
pcrft2->cr_kill += 1;
output(pcrft2->cr_lgn,'B',0,0);
setrpt(pcrft2);
rpt(pcrft2,"Ship destroyed by you");
fnshrpt(pcrft2,1);
}
}
/* remove craft from universe */
remove(plogin->ln_play);
if (--numpling < 0) numpling = 0;
/* put player back to command mode */
plogin->ln_iomode = NULL;
plogin->ln_crft[0] = NULL;
plogin->ln_play.ip_ptr = NULL;
plogin->ln_stat = NULL;
plogin->ln_substat = NULL;
#ifdef DEBUG
VDBG("unplay return\n");
#endif
}