/* Attempt to pick specified team & ship */
static int
teamRequest(int team, int ship)
{
    int     lastTime;

    extern int lastTeamReq;

    if (!playback)
	lastTeamReq = team;
    pickOk = -1;
    sendTeamReq(team, ship);
    lastTime = time(NULL);
    while (pickOk == -1) {
	if (lastTime + 3 < time(NULL)) {
	    sendTeamReq(team, ship);
	    lastTime = time(NULL);
	}
	socketPause(0, 20000);
	readFromServer();
	if (isServerDead()) {
	    printf("Whoops!  We've been ghostbusted!\n");
	    printf("Pray for a miracle!\n");

	    /* UDP fail-safe */
	    commMode = commModeReq = COMM_TCP;
	    commSwitchTimeout = 0;
	    if (udpSock >= 0)
		closeUdpConn();
	    if (udpWin) {
		udprefresh(UDP_CURRENT);
		udprefresh(UDP_STATUS);
	    }
	    connectToServer(nextSocket);
	    printf("Yea!  We've been resurrected!\n");
	    pickOk = 0;
	    break;
	}
    }

    if (pickOk) {
	me->p_status = PALIVE;	/* we got a ship.  We must be alive */
	timeBank[T_SHIP] = time(NULL);
    }
    return (pickOk);
}
Example #2
0
checkpassword(void)
/* Check dude's password. If he is ok, move to state ST_DONE. */
{
  char   *s;

  sendLoginReq(tempname, password1, login, 0);
  loginAccept = -1;
  while (loginAccept == -1)
    {
      socketPause();
      readFromServer(NULL);
      if (isServerDead())
  {
    printf("Server is hosed.\n");

#ifdef AUTOKEY
    if (autoKey)
      W_AutoRepeatOn();
#endif

    terminate(0);
  }
    }
  if (loginAccept == 0)
    {
      if (!autolog)
  {
    s = "Bad password!";
    W_WriteText(w, 100, 100, textColor, s, strlen(s), W_BoldFont);
    (void) W_EventsPending();
    sleep(3);
    W_ClearWindow(w);
  }
      else
  noautologin();
      *tempname = 0;
      state = ST_GETNAME;
      return;
    }
  STRNCPY(me->p_name, tempname, sizeof(tempname));
  keeppeace = (me->p_stats.st_flags / ST_KEEPPEACE) & 1;
  state = ST_DONE;
}
Example #3
0
getname(char *defname, char *defpasswd)

/* Let person identify themselves from w */
{
  register char ch;
  int     secondsLeft = 199, laststate;
  char    tempstr[40];
  LONG    lasttime;
  char   *namptr, *passptr;
  register int j;
  struct timeval timeout;
  fd_set  readfds;

  autolog = (*defpasswd && *defname) ? 1 : 0;

  MZERO(mystats, sizeof(struct stats));

  mystats->st_tticks = 1;
  for (j = 0; j < 95; j++)
    {
      mystats->st_keymap[j] = j + 32;
      mystats->st_keymap[j + 96] = j + 32 + 96;

#ifdef MOUSE_AS_SHIFT
      mystats->st_keymap[j + 192] = j + 32;
      mystats->st_keymap[j + 288] = j + 32;
      mystats->st_keymap[j + 384] = j + 32;
#endif
    }
  mystats->st_keymap[95] = 0;
  mystats->st_flags = ST_MAPMODE + ST_NAMEMODE + ST_SHOWSHIELDS +
      ST_KEEPPEACE + ST_SHOWLOCAL * 2 + ST_SHOWGLOBAL * 2;

  lasttime = time(NULL);

  if (ghoststart)
    return;

  tempname[0] = '\0';
  password1[0] = '\0';
  password2[0] = '\0';

  laststate = state = ST_GETNAME;
  displayStartup(defname);
  while (1)
    {
      handleWEvents(defname);

      if (!autolog)
  {

#ifndef HAVE_WIN32
    W_FullScreen(baseWin);
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
#else
    /* Since we don't have a socket to check on Win32 for windowing *
     * system events, we set the timeout to zero and effectively poll.
     * * Yes, I could do the correct thing and call *
     * WaitForMultipleObjects() etc. but I don't feel like it */
    timeout.tv_sec = 0;
    timeout.tv_usec = 100000;
#endif

    FD_ZERO(&readfds);
    FD_SET(sock, &readfds);
    if (udpSock >= 0)
      FD_SET(udpSock, &readfds);

#ifndef HAVE_WIN32
    FD_SET(W_Socket(), &readfds);
#endif

    if (SELECT(32, &readfds, 0, 0, &timeout) < 0)
      {
        perror("select");
        continue;
      }

    if (FD_ISSET(sock, &readfds)
        || (udpSock >= 0 && FD_ISSET(udpSock, &readfds)))
      readFromServer(&readfds);

#ifndef HAVE_WIN32
    if (FD_ISSET(W_Socket(), &readfds))
#else
    if (W_EventsPending())
#endif

      handleWEvents(defname);
  }
      else
  {
    readFromServer(&readfds);
  }

      if (isServerDead())
  {
    printf("Shit, we were ghostbusted\n");

#ifdef HAVE_XPM
    W_GalacticBgd(GHOST_PIX);
#endif

#ifdef AUTOKEY
    if (autoKey)
      W_AutoRepeatOn();
#endif

    terminate(0);
  }

      if (time(0) != lasttime)
  {
    lasttime++;
    secondsLeft--;
    showreadme();
    if (!autolog)
      {
        sprintf(tempstr, "Seconds to go: %d ", secondsLeft);
        W_WriteText(w, 100, 400, textColor, tempstr, strlen(tempstr),
        W_RegularFont);
      }
    if (secondsLeft == 0)
      {
        me->p_status = PFREE;
        printf("Timed Out.\n");

#ifdef AUTOKEY
        if (autoKey)
    W_AutoRepeatOn();
#endif

        terminate(0);
      }
  }
      if (state == ST_DONE)
  {
    W_ClearWindow(w);
    W_ClearWindow(mapw);
    return;
  }
      if (autolog)
  {
    switch (state)
      {
      case ST_GETNAME:
        tempname[0] = '\0';
        ch = 13;
        j = 0;
        break;

      case ST_GETPASS:
      case ST_MAKEPASS1:
      case ST_MAKEPASS2:
        ch = defpasswd[j++];
        if (ch == '\0')
    {
      j = 0;
      ch = 13;
    }
        break;

      default:
        break;
      }

    loginproced(ch, defname);

  }

      laststate = state;
    }
}
Example #4
0
loaddude(void)
{
  char    ppwd[16];

  STRNCPY(ppwd, "\0\0\0", 4);
  if (strncmp(tempname, "Guest", 5) == 0 || strncmp(tempname, "guest", 5) == 0)
    {
      loginAccept = -1;
      sendLoginReq(tempname, ppwd, login, 0);
      state = ST_DONE;
      me->p_pos = -1;
      me->p_stats.st_tticks = 1;     /* prevent overflow */
      STRNCPY(me->p_name, tempname, sizeof(tempname));
      while (loginAccept == -1)
  {
    socketPause();
    readFromServer(NULL);
    if (isServerDead())
      {
        printf("Server is hosed.\n");

#ifdef AUTOKEY
        if (autoKey)
    W_AutoRepeatOn();
#endif

        terminate(0);
      }
  }
      if (loginAccept == 0)
  {
    char *s = "Server refuses guest login, use another name.";
    W_WriteText(w, 100, 70, textColor, s, strlen(s), W_BoldFont);
    (void) W_EventsPending();
    sleep(3);
    W_ClearWindow(w);
    state = ST_GETNAME;
    *tempname = 0;
#ifdef AUTOKEY
    if (autoKey)
      W_AutoRepeatOn();
#endif
  }
      return;
    }
  /* Ask about the user */
  loginAccept = -1;
  sendLoginReq(tempname, ppwd, login, 1);
  while (loginAccept == -1)
    {
      socketPause();
      readFromServer(NULL);
      if (isServerDead())
  {
    printf("Server is hosed.\n");

#ifdef AUTOKEY
    if (autoKey)
      W_AutoRepeatOn();
#endif

    terminate(0);
  }
    }
  *password1 = *password2 = 0;
  if (loginAccept == 0)
    {
      state = ST_MAKEPASS1;
    }
  else
    {
      state = ST_GETPASS;
    }
}
Example #5
0
findslot(void)
{
  int     oldcount = -1;
  W_Window waitWin, qwin, countWin, motdButtonWin;

  W_Window motdWin;
  extern int MaxMotdLine;
  int     WaitMotdLine = 0;
  int     mapMotd = booleanDefault("showMotd", 1);
  W_Event event;


  /* Wait for some kind of indication about in/not in */
  while (queuePos == -1)
    {
      socketPause();
      if (isServerDead())
  {

#if defined(SOUND) && !defined(HAVE_SDL)
    Exit_Sound();
#endif

    printf("Shit!  Ghostbusted!\n");
    terminate(0);
  }
      readFromServer(NULL);
      if (me != NULL)
  {
    /* We are in! */
    ANNOUNCESOCKET;
    return (me->p_no);
  }
    }

  /* We have to wait.  Make appropriate windows, etc... */

  waitWin = W_MakeWindow("wait", 0, 0, WAITWIDTH, WAITHEIGHT, NULL, 2,
       foreColor);
  countWin = W_MakeWindow("count", WAITWIDTH / 3, WAITTITLE, WAITWIDTH / 3,
        WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor);
  qwin = W_MakeWindow("waitquit", 0, WAITTITLE, WAITWIDTH / 3,
          WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor);
  motdButtonWin = W_MakeWindow("motdbutton", 2 * WAITWIDTH / 3, WAITTITLE,
           WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin,
             1, foreColor);
  W_MapWindow(waitWin);
  W_MapWindow(countWin);
  W_MapWindow(motdButtonWin);
  W_MapWindow(qwin);
  if (mapMotd)
    {
      motdWin = W_MakeWindow("waitmotd", 1, WAITWIDTH + 1, TWINSIDE,
           TWINSIDE, 0, 2, foreColor);
      W_MapWindow(motdWin);
      showMotd(motdWin, WaitMotdLine);
    }

  for (;;)
    {
      socketPause();
      readFromServer(NULL);
      if (isServerDead())
  {

#if defined(SOUND) && !defined(HAVE_SDL)
    Exit_Sound();
#endif

    printf("Damn, We've been ghostbusted!\n");
    terminate(0);
  }
      while (W_EventsPending())
  {
    W_NextEvent(&event);
    switch ((int) event.type)
      {
      case W_EV_BUTTON:
      case W_EV_KEY:
        if (mapMotd && event.Window == motdWin)
    {
      if (event.key == ' ' || event.key == 'q')
        {
          W_DestroyWindow(motdWin);
          mapMotd = !mapMotd;
        }
      else
        {
          if (event.key == 'b')
      {
        WaitMotdLine -= 28;
        WaitMotdLine = MAX(WaitMotdLine, 0);
      }
          else
      {
        WaitMotdLine += 28;
        /* scroll to start if it goes over */
        if (WaitMotdLine > MaxMotdLine)
          WaitMotdLine = 0;
      }
          W_ClearWindow(motdWin);
          showMotd(motdWin, WaitMotdLine);
          break;
        }
    }
        else if (event.Window == motdButtonWin)
    {
      if (mapMotd)
        {
          W_DestroyWindow(motdWin);
        }
      else
        {
          motdWin = W_MakeWindow("waitmotd", 1, WAITWIDTH + 1,
               TWINSIDE, TWINSIDE, 0, 2,
               foreColor);
          W_MapWindow(motdWin);
          showMotd(motdWin, WaitMotdLine);
        }
      mapMotd = !mapMotd;
    }
        else if (event.Window == qwin)
    {

#if defined(SOUND) && !defined(HAVE_SDL)
      Exit_Sound();
#endif

      printf("OK, bye!\n");
      terminate(0);
    }
        break;
      case W_EV_EXPOSE:
        if (event.Window == waitWin)
    {
      mapWaitWin(waitWin);
    }
        else if (event.Window == motdWin)
    {
      showMotd(motdWin, WaitMotdLine);
    }
        else if (event.Window == qwin)
    {
      mapWaitQuit(qwin);
    }
        else if (event.Window == countWin)
    {
      mapWaitCount(waitWin, countWin, queuePos);
    }
        else if (event.Window == motdButtonWin)
    {
      mapWaitMotdButton(motdButtonWin);
    }
        break;
      default:
        break;
      }
  }
      if (queuePos != oldcount)
  {
    mapWaitCount(waitWin, countWin, queuePos);
    oldcount = queuePos;
  }
      if (me != NULL)
  {
    W_DestroyWindow(waitWin);
    if (mapMotd)
      {
        W_DestroyWindow(motdWin);
      }
    ANNOUNCESOCKET;
    W_Beep();
    W_Beep();
    return (me->p_no);
  }
    }
}
Example #6
0
intrupt()
{
   static long     lastread;
   static int      prevread;
   int		   cr_time;

   /* handle torp firing */
   do_torps();
   _tcheck = 0;
keep_reading:
	;
#ifdef ATM
   if (readFromServer(pollmode)) {	/* should be 0 */
#else
   if (readFromServer()) {
#endif
      cr_time = mtime(0);

      _cycletime = cr_time - prevread;
      _serverdelay = ((double)_cycletime/100.);
      _udnonsync++;

      /* can't be less than 100 ms */
      if(_serverdelay < 1.) _serverdelay = 1.;

      if (DEBUG & DEBUG_SERVER) {
	 printf("cycletime = %dms\n", _cycletime);
	 printf("wait for input = %dms\n", cr_time - _waiting_for_input);
      }
      prevread = cr_time;

      if(_state.borg_detect)
	 borg_detect();
   } else {
      /*
       * We haven't heard from server for 3 secs... Strategy:  send a
       * useless packet to "ping" server.
       */
      /* If server is dead, just give up */
      if (isServerDead())
         exitRobot(0);
      if(!pollmode){
	 int	now = time(NULL)-3;
	 mprintf("sending wakeup packet at %s", ctime(&now));
	 sendWarReq(me->p_hostile);
      }
   }
   if (me->p_status == POUTFIT) {
      death();
   }
   if(me->p_status != PALIVE)
      goto keep_reading;
}

/* borg detect */

borg_detect()
{
   register Player		*p;
   register struct player	*j;
   int				last_speedc, last_dirc;
   register			i;

   for(i=0, p=_state.players; i < MAXPLAYER; i++,p++){
      if(!p->p || (p->p->p_status != PALIVE) || p->invisible)
	 continue;
      
      j = p->p;

      /* check for simultaneous torp & phaser but in different directions.
	 -- Very common borg maneuver */
      if(_udnonsync - p->tfire_t < 2){
	 if(p->tfire_t == p->pfire_t){
	    if(p->tfire_dir > -1){
	       if(angdist(p->tfire_dir, p->pfire_dir) > 2){
		  /*
		  printf("%s BORG %d\n", j->p_mapchars, 
		     angdist(p->tfire_dir, p->pfire_dir));
		  printf("current p: %d\n", p->bp1);
		  */
		  p->bp1 ++;
	       }
	    }
	 }
      }
      /* check for recent change in direction far away from current torp
	 or phaser fire */
      if(j->p_speed > 1){
	 if(_udnonsync - p->tfire_t < 2){
	    if(_udnonsync - p->turn_t < 2){
	       if(angdist(j->p_dir, p->tfire_t) > 64){
		  /*
		  printf("%s tfire BORG %d\n", j->p_mapchars,
		     angdist(j->p_dir, p->tfire_t));
		  */
		  p->bp2 ++;
	       }
	    }
	 }
	 if(_udnonsync - p->pfire_t < 2){
	    if(_udnonsync - p->turn_t < 2){
	       if(angdist(j->p_dir, p->pfire_t) > 64){
		  /*
		  printf("%s pfire BORG %d\n", j->p_mapchars,
		     angdist(j->p_dir, p->pfire_t));
		  */
		  p->bp3 ++;
	       }
	    }
	 }
      }
      if(p->bdc < 1.0)
	 p->borg_probability = 0.0;
      else
	 p->borg_probability = (double)(p->bp1 * 10 + p->bp2 + p->bp3)/
	    (double)p->bdc;
   }
}

/* maybe later */
#ifdef nodef
      if(_udcounter - p->tfire_t < 3){
	 
	 last_speedc = p->tfire_t - p->speed_t;
	 /* fired, then observed speed change within 5 cycles */
	 if(last_speedc < 5 && p->tfire_dir > -1){

	    /* player direction and torp fire direction greater than 64 */
	    if(angdist(j->p_dir, p->tfire_dir) > 64){
	       mprintf("speed detect\n");
	       p->borg_probability ++;
	    }
	 }
	 last_dirc = p->tfire_t - p->turn_t;
	 /* fired, then observed direction change within 5 cycles */
	 if(last_dirc < 5 && p->tfire_dir > -1){

	    /* player direction and torp fire direction greater than 64 */
	    if(angdist(j->p_dir, p->tfire_dir) > 64){
	       mprintf("direction detect\n");
	       p->borg_probability ++;
	    }
	 }
      }