DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦b0d317f0c⟧ TextFile

    Length: 5671 (0x1627)
    Types: TextFile
    Names: »read_teleg.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Gb/read_teleg.c« 

TextFile

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