Mercurial > ~darius > hgwebdir.cgi > paradise_server
diff src/tourny.c @ 8:0836fb919dfa
First entry of Paradise Server 2.9 patch 10 Beta
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tourny.c Sat Dec 06 04:37:05 1997 +0000 @@ -0,0 +1,602 @@ +/*-------------------------------------------------------------------------- +NETREK II -- Paradise + +Permission to use, copy, modify, and distribute this software and its +documentation, or any derivative works thereof, for any NON-COMMERCIAL +purpose and without fee is hereby granted, provided that this copyright +notice appear in all copies. No representations are made about the +suitability of this software for any purpose. This software is provided +"as is" without express or implied warranty. + + Xtrek Copyright 1986 Chris Guthrie + Netrek (Xtrek II) Copyright 1989 Kevin P. Smith + Scott Silvey + Paradise II (Netrek II) Copyright 1993 Larry Denys + Kurt Olsen + Brandon Gillespie +--------------------------------------------------------------------------*/ + +#include "config.h" +#ifdef LEAGUE_SUPPORT +#include <stdio.h> +#include <stdlib.h> + +#include "defs.h" +#include "struct.h" +#include "shmem.h" +#include "data.h" + +#define TLOGNAME "/tmp/tourney.log" +#define MAXTIME 120 + +FILE *tlog = NULL; +/* int tournymode = 0; */ + +#define TOURNEYMODE (status2->league > 2) + +void endtourn(); +void starttourn(); + + +#ifndef IRIX +extern int fprintf(); +#endif +extern int fclose(); +extern void pmessage(); +extern void explode_everyone(); +extern void endgame_effects(); + +void +opentlog() +{ + tlog = fopen(TLOGNAME, "a"); + if (tlog == NULL) + fprintf(stderr, "Could not open the tournament logfile"); + else + { +#ifdef SYSV + setvbuf(tlog, NULL, _IOLBF, BUFSIZ); +#else + setlinebuf(tlog); +#endif + fprintf(tlog, "\n\n\n\nOPENING TOURNAMENT LOG\n\n"); + } +} + +/* + * Return a string identifying the player and his ship. Uses a ring of + * buffers so that it can be used multiple times in a printf + */ +char * +id_player(p) + struct player *p; +{ + static char bufs[16][80]; + static int ring = 0; + int count; + + ring++; + count = sizeof(bufs) / sizeof(*bufs); + if (ring >= count) + ring = 0; + + sprintf(bufs[ring], "%s <%s> %c%c", twoletters(p), + p->p_name, p->p_ship.s_desig1, p->p_ship.s_desig2); + + return bufs[ring]; +} + +/* + * Return a string identifying the player and his ship. Uses a ring of + * buffers so that it can be used multiple times in a printf + */ +char * +id_planet(p) + struct planet *p; +{ + static char bufs[16][80]; + static int ring = 0; + int count; + + ring++; + count = sizeof(bufs) / sizeof(*bufs); + if (ring >= count) + ring = 0; + + sprintf(bufs[ring], "#%d [%s] %s", p->pl_no, p->pl_name, + teams[p->pl_owner].shortname); + + return bufs[ring]; +} + + +/* + * List of player related actions + * + */ + +enum player_status_e status_cache[MAXPLAYER]; +enum ship_types_e ship_cache[MAXPLAYER]; + +void +tlog_refit(pl) + struct player *pl; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + /* we have to print the OLD ship type he was flying */ + fprintf(tlog, "%ld\trefit %s <%s> %c%c %dt\n", status->clock, + twoletters(pl), pl->p_name, + shipvals[ship_cache[pl->p_no]].s_desig1, + shipvals[ship_cache[pl->p_no]].s_desig2, + pl->p_updates); + + ship_cache[pl->p_no] = pl->p_ship.s_type; +} + +/* + * player was killed by player. call before erasing armies + */ +void +tlog_plkill(victim, killer1, killer2) + struct player *victim; + struct player *killer1; + struct player *killer2; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tkill %s+%da,%dt,%.2fk by %s&%s\n", + status->clock, + id_player(victim), victim->p_armies, victim->p_updates, + victim->p_kills, + killer1 ? id_player(killer1) : "_", killer2 ? id_player(killer2) : "_"); + + status_cache[victim->p_no] = victim->p_status; +} + +/* + * player changed status from ALIVE to something else without telling us. + * call before erasing armies + */ +void +tlog_plquit(victim) + struct player *victim; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tquit %s+%da,%dt,%.2fk\n", + status->clock, + id_player(victim), victim->p_armies, victim->p_updates, + victim->p_kills); + + status_cache[victim->p_no] = victim->p_status; +} + +/* + * player was killed by planet. call before erasing armies + */ +void +tlog_plankill(victim, killer1, killer2) + struct player *victim; + struct planet *killer1; + struct player *killer2; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tkill %s+%da by %s&%s\n", + status->clock, id_player(victim), victim->p_armies, + id_planet(killer1), killer2 ? id_player(killer2) : "_"); + status_cache[victim->p_no] = victim->p_status; +} + +/* + * planet was destroyed call before changing owner to IND + */ +void +tlog_plandest(pl, killer) + struct planet *pl; + struct player *killer; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tpl_destroy %s by %s\n", status->clock, id_planet(pl), + id_player(killer)); +} + +/* + * planet was taken call after changing owner + */ +void +tlog_plantake(pl, killer) + struct planet *pl; + struct player *killer; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tpl_take %s by %s\n", status->clock, id_planet(pl), + id_player(killer)); +} + +/* + * planet was abandoned call before changing owner + */ +void +tlog_planaban(pl, killer) + struct planet *pl; + struct player *killer; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tpl_aban %s by %s\n", status->clock, id_planet(pl), + id_player(killer)); +} + +void +tlog_jsassist(js) + struct player *js; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tjsassist %s\n", status->clock, id_player(js)); +} + +/* call before transferring the army */ +void +tlog_beamup(pl, carrier) + struct planet *pl; + struct player *carrier; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tbeamup %s from %s@%da\n", status->clock, + id_player(carrier), id_planet(pl), pl->pl_armies); +} + +/* call after transferring the army */ +void +tlog_beamdown(pl, carrier) + struct planet *pl; + struct player *carrier; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tbeamdown %s to %s@%da\n", status->clock, + id_player(carrier), id_planet(pl), pl->pl_armies); +} + +/* call before transferring the army */ +void +tlog_Bbeamup(base, carrier) + struct player *base; + struct player *carrier; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\txfer %s from %s\n", status->clock, id_player(carrier), + id_player(base)); +} + +/* call after transferring the army */ +void +tlog_Bbeamdown(base, carrier) + struct player *base; + struct player *carrier; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\txfer %s to %s\n", status->clock, id_player(carrier), + id_player(base)); +} + +/* call after destroying armies */ +void +tlog_bomb(pl, killer, narmies) + struct planet *pl; + struct player *killer; + int narmies; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + if (!narmies) + return; + + fprintf(tlog, "%ld\tbomb %s by %s (%da)\n", status->clock, + id_planet(pl), id_player(killer), narmies); +} + +void +tlog_bres(pl, killer, resource) + struct planet *pl; + struct player *killer; + char *resource; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tresbomb %s (%s) by %s\n", status->clock, + id_planet(pl), resource, id_player(killer)); +} + + +/* + * non-player action stuff + * + */ + +/* call before popping */ +void +tlog_pop(pl, narmies) + struct planet *pl; + int narmies; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tpoparmies %s %+da\n", status->clock, + id_planet(pl), narmies); +} + +void +tlog_res(pl, resource) + struct planet *pl; + char *resource; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\tresgrow %s (%s)\n", status->clock, + id_planet(pl), resource); +} + +/* call before changing owner */ +void +tlog_revolt(pl) + struct planet *pl; +{ + if (!TOURNEYMODE) + return; + if (!tlog) + return; + + fprintf(tlog, "%ld\trevolt %s\n", status->clock, id_planet(pl)); +} + +void +scan_for_unexpected_tourny_events() +{ + int i; + for (i = 0; i < MAXPLAYER; i++) + { + struct player *p = &players[i]; + if (status_cache[i] != PALIVE) + { + status_cache[i] = p->p_status; + ship_cache[i] = -1; + continue; + } + + if (p->p_status != PALIVE) + { + tlog_plquit(p, 0, 0); + status_cache[i] = p->p_status; + } + else if (ship_cache[i] < 0) + { + ship_cache[i] = p->p_ship.s_type; + } + else if (ship_cache[i] != p->p_ship.s_type) + { + tlog_refit(p); + } + } +} + +/* + * end of T log procs + * + */ + + +void +closetlog() +{ + if (tlog != NULL) + { + fprintf(tlog, "\n\nCLOSING TOURNAMENT LOG\n\n\n\n"); + fclose(tlog); + } + tlog = NULL; +} + + +void +tlog_all() +{ + int i; + struct planet *pl; + + if (!tlog) + return; + + fprintf(tlog, "The time is: %ld ----------------\n", status->clock); + for (i = 0, pl = &planets[i]; i < NUMPLANETS; i++, pl++) + fprintf(tlog, "Planet: %s %x %s -- armies %d\n", pl->pl_name, + pl->pl_flags, teams[pl->pl_owner].shortname, pl->pl_armies); +} + +void +tlog_conquerline(line) + char *line; +{ + if (!tlog) + return; + + fprintf(tlog, "C:\t%s\n", line); +} + + + + + +void +udtourny() +{ + int trem; + char buf[120]; + if (!status2->league) + return; + + /* server is configured for league play */ + + if (status2->league == 1) + return; /* we're still prepping */ + + trem = --status2->leagueticksleft; + + + switch (status2->league) + { + case 2: /* the 1-minute pre tourney warm up. */ + if (trem == SECONDS(5)) + pmessage("5 seconds to tournament start", -1, MALL, UMPIRE); + else if (trem == SECONDS(2)) + pmessage("Hold on to your hats. Everybody dies!", -1, MALL, UMPIRE); + else if (trem <= 0) + { + starttourn(); + } + break; + + case 3: /* full-on T-mode */ + + buf[0] = 0; + if (trem % MINUTES(20) == 0 || + (trem < MINUTES(20) && 0 == trem % MINUTES(5)) || + (trem < MINUTES(5) && 0 == trem % MINUTES(1))) + { + sprintf(buf, "There are %d minutes remaining in regulation play", + trem / MINUTES(1)); + } + else if (trem < MINUTES(1) && 0 == trem % SECONDS(10)) + { + sprintf(buf, "There are %d seconds remaining in regulation play", + trem / SECONDS(1)); + } + if (buf[0]) + pmessage(buf, -1, MALL, UMPIRE); + if (trem <= 0) + /* maybe go into overtime */ + endtourn(); + break; + case 4: + /* overtime, not implemented */ + break; + } +} + + + +void +starttourn() +{ + int i, j; + struct planet *pl; + char s[80]; + + opentlog(); + for (i = 0, pl = &planets[i]; i < NUMPLANETS; i++, pl++) + { + for (j = 0; j < MAXTEAM + 1; j++) + { + pl->pl_tinfo[j].timestamp = 0; + /* doesn't work? */ + pl->pl_hinfo = (PL_TYPE(*pl) == PLSTAR) ? ALLTEAM : pl->pl_owner; + } + } + status->clock = 0; + + explode_everyone(KTOURNSTART, 0); + + tlog_all(); + + + status2->league++; + status2->leagueticksleft = MINUTES(configvals->regulation_minutes); + + /* version team names configured time date */ + pmessage(" ", 0, MALL, UMPIRE); + sprintf(s, "Timer started -- %d minutes remaining", + status2->leagueticksleft / MINUTES(1)); + pmessage(s, 0, MALL, UMPIRE); + pmessage(" ", 0, MALL, UMPIRE); +} + + +void +endtourn() +{ + pmessage(" ", 0, MALL, UMPIRE); + pmessage("Time is done", 0, MALL, UMPIRE); + pmessage(" ", 0, MALL, UMPIRE); + + /* print damage assesments */ + endgame_effects(1 << status2->home.index, 1 << status2->away.index, -1); + + scan_for_unexpected_tourny_events(); + + tlog_all(); + + closetlog(); + + /* conquer */ + + status2->league = 1; + + /* we should shut the game off here (status->gameup=0) */ +} +#endif