|
|
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 t
Length: 9649 (0x25b1)
Types: TextFile
Names: »tk.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Abermud/tk.c«
/*
* AberMUD II C
* This game systems, its code scenario and design
* are (C) 1987/88 Alan Cox,Jim Finnis,Richard Acott
*
* This file holds the basic communications routines
*/
#include "kernel.h"
#ifdef RCSID
static char RCS[] =
"$Header: tk.c,v 1.1 89/03/13 09:37:53 rsalz Exp $";
#endif /* RCSID */
static void
vcpy(dest, source, len)
register int *dest;
register int *source;
register int len;
{
while (--len >= 0)
*dest++ = *source++;
}
mstoout(block)
int *block;
{
/* Print appropriate stuff from data block */
if (debug_mode)
bprintf("\n<%d>", block[1]);
if (block[1] < -3)
gamrcv(block);
else
bprintf("%s", (char *)&block[2]);
}
sendamsg(name)
char *name;
{
char prmpt[32];
char work[200];
char w2[200];
for ( ; ; ) {
pbfr();
strcpy(prmpt, "\r");
if (pvis(mynum))
strcat(prmpt, "(");
if (debug_mode)
strcat(prmpt, "#");
if (aliased)
strcat(prmpt, "@");
strcat(prmpt, prm_str);
switch (convflg) {
case 0:
break;
case 1:
prmpt[strlen(prmpt) - 1] = 0;
strcat(prmpt, "\"");
break;
case 2:
prmpt[strlen(prmpt) - 1] = 0;
strcat(prmpt, "*");
break;
default:
prmpt[strlen(prmpt) - 1] = 0;
strcat(prmpt, "?");
}
if (pvis(mynum))
strcat(prmpt, ")");
pbfr();
sprintf(work, GAMENAME, name);
sig_alon();
key_input(prmpt, 80);
sig_aloff();
strcpy(work, key_buff);
strcat(sysbuf, "\001l");
strcat(sysbuf, work);
strcat(sysbuf, "\n\001");
openworld();
rte();
closeworld();
if (convflg && EQ(work, "**"))
convflg = 0;
else
break;
}
if (!EMPTY(work)) {
if (work[0] == '\"') {
strcpy(w2, work);
sprintf(work, "say %s", w2 + 1);
}
if (!EQ(work, "*") && work[0] == '*')
work[0] = 32;
else if (convflg) {
strcpy(w2, work);
if (convflg == 1)
sprintf(work, "say %s", w2);
else
sprintf(work, "tss %s", w2);
}
}
if (curmode == 1)
gamecom(work);
else if ((!EQ(work, ".Q") && !EQ(work, ".q")) && !EMPTY(work))
(void)special(work, name);
if (fighting > -1) {
if (EMPTY(pname(fighting))) {
in_fight = 0;
fighting = -1;
setpfighting(mynum, -1);
}
if (ploc(fighting) != ploc(mynum)) {
in_fight = 0;
fighting = -1;
setpfighting(mynum, -1);
}
}
if (in_fight)
in_fight -= 1;
return EQ(work, ".Q") || EQ(work, ".q");
}
send2(block)
int *block;
{
FILE *unit;
int number;
int inpbk[128];
if (spawned)
return;
if ((unit = openworld()) == NULL) {
loseme();
crapup("\nAberMUD: FILE_ACCESS : Access failed\n");
}
sec_read(unit, inpbk, 0, 64);
number = 2 * inpbk[1] - inpbk[0];
inpbk[1]++;
sec_write(unit, block, number, 128);
sec_write(unit, inpbk, 0, 64);
if (number >= 199)
cleanup(inpbk);
if (number >= 199)
longwthr();
}
readamsg(channel, block, num)
FILE *channel;
int *block;
int num;
{
int buff[64], actnum;
sec_read(channel, buff, 0, 64);
actnum = num * 2 - buff[0];
sec_read(channel, block, actnum, 128);
}
rte()
{
FILE *unit;
int too, ct, block[128];
if (spawned)
return;
if ((unit = openworld()) == NULL)
crapup("AberMUD: FILE_ACCESS : Access failed\n");
fl_com = unit;
if (cms == -1)
cms = findend(unit);
too = findend(unit);
if (cms < findstart(unit) / 2) {
loseme();
crapup("\nYouve been off so long that you have been disconnected\n");
}
for (ct = cms; ct < too; ct++) {
readamsg(unit, block, ct);
mstoout(block);
}
cms = ct;
update();
eorte();
rdes = 0;
tdes = 0;
vdes = 0;
}
findstart(unit)
FILE *unit;
{
int bk[2];
sec_read(unit, bk, 0, 1);
return bk[0];
}
findend(unit)
FILE *unit;
{
int bk[3];
sec_read(unit, bk, 0, 2);
return bk[1];
}
talker(name)
char *name;
{
makebfr();
cms = -1;
putmeon(name);
if (openworld() == NULL)
crapup("Sorry AberMUD is currently unavailable");
if (mynum == -1)
printf("\nSorry AberMUD is full at the moment\n");
strcpy(globme, name);
rte();
closeworld();
cms = -1;
special(".g", name);
if (shimge[1] && my_lev < shimge[1]) {
loseme();
crapup("Sorry The Game Has Been Closed To You - Try Later");
}
i_setup = 1;
while (1) {
pbfr();
sendamsg(name);
if (rd_qd)
rte();
rd_qd = 0;
closeworld();
pbfr();
}
}
cleanup(inpbk)
int *inpbk;
{
int *bk;
FILE *unit;
unit = openworld();
bk = NEW(int, 1280);
sec_read(unit, bk, 101, 1280);
sec_write(unit, bk, 1, 1280);
sec_read(unit, bk, 121, 1280);
sec_write(unit, bk, 21, 1280);
sec_read(unit, bk, 141, 1280);
sec_write(unit, bk, 41, 1280);
sec_read(unit, bk, 161, 1280);
sec_write(unit, bk, 61, 1280);
sec_read(unit, bk, 181, 1280);
sec_write(unit, bk, 81, 1280);
free((char *)bk);
inpbk[0] += 100;
sec_write(unit, inpbk, 0, 64);
revise(inpbk[0]);
}
special(string, name)
char *string, *name;
{
char bk[128];
char xx[128];
char xy[128];
strcpy(bk, string);
lowercase(bk);
if (bk[0] != '.')
return 0;
switch (bk[1]) {
case 'g':
curmode = 1;
curch = -5;
initme();
openworld();
setpstr(mynum, my_str);
setplev(mynum, my_lev);
if (my_lev < 10)
setpvis(mynum, 0);
else if (ptstflg(mynum, 9))
setpvis(mynum, (my_lev > 9999) ? 9999 : 10);
setpwpn(mynum, -1);
setpsexall(mynum, my_sex);
setphelping(mynum, -1);
setpscore(mynum, my_sco);
my_sex = my_sex & 1;
if (EQ(globme, "Fazz"))
strcpy(prm_str, "*----*");
else
fetchprmpt(my_lev);
sprintf(xy, "\001s%s\001%s has entered the game\n\001", name, name);
sprintf(xx, "\001s%s\001[ %s[%s] has entered the game ]\n\001", name, name, localname);
sendsys(name, name, -10113, ploc(mynum), xx);
if (my_lev > 9) {
if (shimge[1]) {
bprintf("The Game is currently %s locked\n", shimge[1] > 99 ? "ARCHWIZARD" : "WIZARD");
}
}
if (shimge[0])
bprintf("Everything is peaceful.\n");
rte();
if (randperc() > 50)
trapch(-5);
else {
curch = -183;
trapch(-183);
}
sendsys(name, name, -10000, ploc(mynum), xy);
break;
default:
printf("\nUnknown . option\n");
}
return 1;
}
broad(mesg)
char *mesg;
{
char bk2[256];
int block[128];
strcpy(bk2, mesg);
block[1] = -1;
vcpy(&block[2], (int *)bk2, 126);
rd_qd = 1;
send2(block);
}
split(block, nam1, nam2, work, luser)
int *block;
char *nam1;
char *nam2;
char *work;
char *luser;
{
char q[40];
int wkblock[128];
vcpy(wkblock, &block[2], 126);
vcpy((int *)work, &block[64], 64);
GetFields((char *)(block + 2), nam1, nam2);
strcpy(q, nam1);
return EQ(lowercase(q), lowercase(luser));
}
trapch(chan)
int chan;
{
openworld();
setploc(mynum, chan);
lookin(chan);
}
putmeon(name)
char *name;
{
int ct;
iamon = 0;
openworld();
while (fpbns(name) != -1) {
if (!op(name))
crapup("You are already on the system...");
strcat(name, "2"); /* In case 1 crashes */
}
for (ct = 0; ct < MAXUSERS; ct++)
if (EMPTY(pname(ct)))
break;
if (ct == MAXUSERS) {
mynum = -1;
return;
}
strcpy(pname(ct), name);
setploc(ct, curch);
setppos(ct, -1);
setplev(ct, 1);
setpvis(ct, 0);
setpstr(ct, -1);
setpwpn(ct, -1);
setpsex(ct, 0);
setpfighting(ct, -1);
mynum = ct;
iamon = 1;
}
loseme()
{
char bk[128];
if (aliased)
return;
if (mynum == -1)
return;
/* No interruptions while you are busy dying */
sig_aloff();
iamon = 0;
/* THIS BIT IS A CRITICAL SECTION - A USER TOTALLY CRASHING HERE WILL
* GET STUCK ON THE USERLIST FOR ABOUT 2 MINUTES OR SO */
i_setup = 0;
strcpy(bk, pname(mynum));
lowercase(bk);
openworld();
if (EQ(lowercase(globme), bk)) {
dumpitems();
if (plev(mynum) > 9 && shimge[1])
bprintf("\nDon't forget the game is locked....\n");
if (pvis(mynum) < 10000) {
sprintf(bk, "[%s has departed from AberMUD II]\n", pname(mynum));
if (!EMPTY(pname(mynum)))
sendsys(pname(mynum), pname(mynum), -10113, 0, bk);
}
setpfighting(mynum, -1);
if (!zapped)
saveme();
pname(mynum)[0] = 0;
}
chksnp();
/* We rely on world locking to assure noone nicks our place when we
* leave before we save */
closeworld();
}
update()
{
int xp;
if ((xp = cms - lasup) < 0)
xp = -xp;
if (xp >= 10) {
(void)openworld();
setppos(mynum, cms);
lasup = cms;
}
}
revise(cutoff)
int cutoff;
{
char mess[128];
int ct;
(void)openworld();
for (ct = 0; ct < 16; ct++) {
if (pname(ct)[0] && ppos(ct) < cutoff / 2 && ppos(ct) != -2) {
sprintf(mess, "%s%s", pname(ct), " has been timed out\n");
broad(mess);
dumpstuff(ct, ploc(ct));
pname(ct)[0] = 0;
}
}
}
lookin(room)
int room; /* Lords ???? */
{
brmode = (ptstflg(mynum, 8)) ? 1 : 0;
if (ail_blind) {
bprintf("You are blind... you can't see a thing!\n");
onlook();
}
else {
if (plev(mynum) > 9)
showname(room);
if (isdark()) {
bprintf("It is dark\n");
onlook();
return;
}
bprintf("%s\n", sdesc(ploc(mynum)));
}
if (*ldesc(ploc(mynum)) == '#') {
if (plev(mynum) < 10) {
bprintf("%s\n", ldesc(ploc(mynum)) + 1);
loseme();
crapup("You seem to have died....");
}
else
bprintf("[DEATH ROOM]\n");
}
if (!brmode && !ail_blind)
bprintf("%s", ldesc(ploc(mynum)));
if (!ail_blind) {
lisobs();
if (curmode == 1)
lispeople();
}
bprintf("\n");
onlook();
}