|
|
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: 5671 (0x1627)
Types: TextFile
Names: »read_teleg.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Gb/read_teleg.c«
/*
** Galactic Bloodshed (Robert Chansky, smq@b)
** read.c -- (try to) read telegrams
** the first byte in each telegram is the sending player #, or 254
** to denote autoreport. then the time sent, then the message itself,
** terminated by TELEG_DELIM.
*/
#include "vars.h"
#include "races.h"
#include "ships.h"
#include <curses.h>
#include <ctype.h>
#include <signal.h>
#include <setjmp.h>
#include <strings.h>
#include <errno.h>
extern jmp_buf main_jenv;
FILE *fopen(), *teleg_read_fd;
char telegram_file[50];
int teleg_read_pdata;
teleg_read(APcount, argn,args)
int APcount;
int argn;
char args[MAXARGS][COMMANDSIZE];
{
int quit=0,noprt=0,altered=0,t, j, i, z, c, teleg_read_handler();
char cmd='\0', tgrams[MAX_TELEGRAMS][TELEGRAM_SIZE];
planettype *p;
teleg_read_pdata = NEUTRAL_FD;
signal(SIGINT, teleg_read_handler);
printf("Interstellar Communication O/S ver %s Ready.\n",VERS);
printf("reading %s\n",telegram_file);
if ( (teleg_read_fd = fopen( telegram_file, "r" ))==NULL ) {
perror("teleg_read.c");
teleg_read_handler();
}
/* read in all telegrams */
i = 0;
while ( (tgrams[i][0]=fgetc(teleg_read_fd))!=EOF) { /* sending player # */
/* get text of message */
if (fscanf(teleg_read_fd, TELEG_NDELIM, &(tgrams[i++][1]) )!=1)
printf("Bad teleread.\n");
if ((t=fgetc(teleg_read_fd))!=TELEG_DELIM)
printf("uhoh! '%c' not found! '%c'\n",TELEG_DELIM,t);
/* get rid of '~' */
if (i>=MAX_TELEGRAMS) {
i = 1; /* recycle telegs (should be i=0?)*/
printf("No more than %d msgs can be seen.\n",MAX_TELEGRAMS);
}
}
fclose(teleg_read_fd);
printf("\nMessages: %d\n",i);
if (i==0)
return;
/* print out messages */
tty_on();
t = 0;
while (t<i && !quit) {
if (noprt)
noprt = 0;
else if (tgrams[t][1]!='\0') {
printf("Message #%d received ",t+1);
if (tgrams[t][0]==TELEG_PLAYER_AUTO)
printf("via autoreport");
else
printf("from player #%2d",tgrams[t][0]);
printf(" On %.25sSubject: ", &tgrams[t][1] );
teleg_report( &tgrams[t][26], tgrams[t][0]);
}
printf("%d:(br tdmq?) ",t+1);
cmd = getchr();
putchr('\n');
switch(cmd) {
case ' ': /* goto next message */
case '\n':
break;
case 'r':
t--; /* will be incr next */
break;
case 'b':
if (t>0)
t -= 2; /* back one */
else
t--;
break;
case 'd':
if (tgrams[t][1]=='\0') {
printf("Message unavailable.\n");
noprt = 1;
break;
}
tgrams[t][1] = '\0';
printf("\n--flushed--\n");
altered = 1;
break;
case 't':
if (tgrams[t][1]=='\0') {
printf("Message unavailable.\n");
noprt = 1;
break;
}
if (Dir.level!=LEVEL_PLAN) {
printf("Scope must be a planet.\n");
noprt = 1;
break;
}
if (Race->translate[tgrams[t][0]] == 100 ||
tgrams[t][0]==Playernum ||
tgrams[t][0]==TELEG_PLAYER_AUTO) {
printf("There is no need to do that.\n");
noprt = 1;
break;
}
/*if (!enufAP(Stars[Dir.snum]->AP, TELEG_TRANS_APCOST) ) {
noprt = 1;
break;
}*/
/*deductAPs(TELEG_TRANS_APCOST, Dir.snum, 0);*/
openpdata(&teleg_read_pdata);
getplanet(teleg_read_pdata, &p, Stars[Dir.snum]->planetpos[Dir.pnum]);
printf("\nresource cost: %d\n",TELEG_TRANS_RPCOST);
if (p->info[Playernum-1].resource < TELEG_TRANS_RPCOST) {
printf("Not enough resources in stock.\n");
close(teleg_read_pdata);
noprt = 1;
break;
}
p->info[Playernum-1].resource -= TELEG_TRANS_RPCOST;
putplanet(teleg_read_pdata,p, Stars[Dir.snum]->planetpos[Dir.pnum]);
close(teleg_read_pdata);
j = Race->translate[tgrams[t][0]];
Race->translate[tgrams[t][0]] +=
round_rand( (100.0 - j) * TELEG_TRANS_AMT);
putrace(Race);
printf("Translation modifier was %d%%, now %d%%.\n", j,
Race->translate[tgrams[t][0]]);
sleep(1);
t--;
break;
case 'q':
quit = 1;
break;
case 'm':
printf("\nTranslation modifiers:\nPlayer : mod\n");
for (i=0; i<= MAXPLAYERS /*toprace*/ ; i++)
printf("%3d : %02d%%\n", i, Race->translate[i]);
noprt = 1;
t--;
break;
case '?':
printf("\n\n r -- reread message\n b -- go back one message\n ' '-- goto next message\n d -- delete message\n m -- print translation modifiers\n q -- quit telegram\n\n");
t--;
noprt = 1;
break;
default:
printf("\n'%c': Bad command.\n", cmd);
t--;
noprt = 1;
break;
}
t++;
}
putchr('\n');
tty_off();
if (altered) {
if (!fork()) {
teleg_read_fd = fopen( telegram_file, "w+" ); /* trunc file */
for (t=0; t<i; t++)
if (tgrams[t][1] != '\0' ) {
fprintf(teleg_read_fd,"%s%c",&tgrams[t][0],
TELEG_DELIM);
}
fclose(telegram_file);
exit();
}
}
}
teleg_report(t, from)
register char *t,from;
{
register int trans_perc, prob;
/* TELEG_PLAYER_AUTO means autoreport */
trans_perc = (from == TELEG_PLAYER_AUTO) ? 100 : Race->translate[from];
/* telegrams begin w/ whitespace character */
do {
if (isspace(*t)) {
/* probability of translation of this word ==following char*/
prob = *((t++)+1);
}
/*printf("(%d)",prob);*/
/* print the word, if it's translateable */
if (prob <= trans_perc) {
while ( !isspace(*(++t)) && *t!='\0')
putchr(*t);
} else {
while ( !isspace(*(++t)) && *t!='\0')
;
printf("%s",UNTRANS_MSG);
}
if (isspace(*t))
putchr(*t); /* *t==\n or ' ' */
} while (*(t+1)!='\0');
putchr('\n');
}
teleg_read_handler(sig, code, scp)
int sig,code;
struct sigcontext *scp;
{
fclose(teleg_read_fd);
close(teleg_read_pdata);
longjmp(main_jenv,1);
}