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