|
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); }