Date: Wednesday January 7, 2004 @ 20:42
Author: unbelver
Update of /home/netrek/cvsroot/Vanilla/ntserv
In directory swashbuckler.real-time.com:/var/tmp/cvs-serv14253/ntserv
Modified Files:
daemonII.c
Log Message:
Added in Psychosis' hockey code running on puck.psychosis.net.
Disabled by default, but useful to keep in the main tree. 3
differences.
PUCK_FIRST: Puck process runs first on each update. Mainly for shots
on edge of shot range. Puck isn't pressored out before puck notices
that it is shot.
FO_BIAS: non-scoring team, or team that's more than 5 goals behind
get faceoff advantage. Advantage settable with FACEOFF_HELP.
SITOUT_HURTS: Normally a sitout puts you within 5 points of exploding
to avoid cheating. Undefine this and sitout won't hurt.
--Carlos V.
****************************************
Index: Vanilla/ntserv/daemonII.c
diff -u Vanilla/ntserv/daemonII.c:1.39 Vanilla/ntserv/daemonII.c:1.40
--- Vanilla/ntserv/daemonII.c:1.39 Mon Jul 7 17:19:55 2003
+++ Vanilla/ntserv/daemonII.c Wed Jan 7 20:42:20 2004
@@ -36,6 +36,22 @@
#include <sys/stat.h>
#endif
+#ifdef PUCK_FIRST
+#include <sys/sem.h>
+/* this is from a semctl man page */
+#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
+/* union semun is defined by including <sys/sem.h> */
+#else /*__GNU_LIBRARY__ && !__SEM_SEMUN_UNDEFINED */
+/* according to X/OPEN we have to define it ourselves */
+union semun {
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
+ unsigned short int *array; /* array for GETALL, SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+ };
+#endif /*__GNU_LIBRARY__ && !__SEM_SEMUN_UNDEFINED */
+#endif /*PUCK_FIRST*/
+
#define fuse(X) ((ticks % (X)) == 0)
#define TOURNEXTENSION 15 /* Tmode gone for 15 seconds 8/26/91 TC */
#define NotTmode(X) (!(status->tourn) && ((X - tourntimestamp)/10 > TOURNEXTENSION))
@@ -112,6 +128,13 @@
extern void solicit(int force);
extern void pmove(void);
+#ifdef PUCK_FIRST
+static void signal_puck(void);
+static int pucksem_id;
+static union semun pucksem_arg;
+static struct sembuf pucksem_op[1];
+#endif /*PUCK_FIRST*/
+
static int debug = 0;
static int ticks = 0;
static int tourntimestamp = 0; /* ticks since last Tmode 8/2/91 TC */
@@ -245,6 +268,21 @@
if (start_robot) fork_robot(start_robot);
+#ifdef PUCK_FIRST
+ if ((pucksem_id = semget(PUCK_FIRST, 1, 0600 | IPC_CREAT)) != -1 ||
+ (pucksem_id = semget(PUCK_FIRST, 1, 0600)) != -1)
+ {
+ pucksem_arg.val = 0;
+ pucksem_op[0].sem_num = 0;
+ pucksem_op[0].sem_op = -1;
+ pucksem_op[0].sem_flg = 0;
+ }
+ else
+ {
+ ERROR(1,("Unable to get puck semaphore."));
+ }
+#endif /*PUCK_FIRST*/
+
(void) SIGNAL(SIGALRM, move);
udt.it_interval.tv_sec = 0;
udt.it_interval.tv_usec = reality;
@@ -590,6 +628,14 @@
oldtourn=0;
status->tourn=0;
}
+
+#ifdef PUCK_FIRST
+ /* The placement of signal_puck before udplayers() is key. If udplayers()
+ happens first the puck can be pushed out of range of a valid shot,
+ among other things. */
+ signal_puck();
+#endif /*PUCK_FIRST */
+
if (fuse(PLAYERFUSE)) {
udplayers();
}
@@ -822,6 +868,8 @@
ERROR(4,("%s: ship in POUTFIT too long (of=%d,wd=%d)\n",
j->p_mapchars, outfitdelay, j->p_whydead));
+ fflush(stdout);
+
/* Force the player out of the game */
saveplayer(j);
if (j->p_process > 1) {
@@ -3429,6 +3477,12 @@
if (!removemem())
ERROR(1,("exitDaemon: cannot removed shared memory segment"));
+#ifdef PUCK_FIRST
+ if(pucksem_id != -1)
+ if (semctl(pucksem_id, 0, IPC_RMID, pucksem_arg) == -1)
+ ERROR(1,("exitDaemon: cannot remove puck semaphore"));
+#endif /*PUCK_FIRST*/
+
switch(sig){
case SIGSEGV:
case SIGBUS:
@@ -4358,6 +4412,52 @@
}
}
#endif
+#ifdef PUCK_FIRST
+void do_nuttin (int sig) { }
+
+/* This has [should have] the daemon wait until the puck has finished by
+ waiting on a semaphore. Error logging is not entirely useful.
+*/
+static void signal_puck(void)
+{
+ int i;
+ struct player *j;
+ int puckwait = 0;
+
+ for (i = 0, j = players; i < MAXPLAYER; i++, j++)
+ if (j->p_status != PFREE && j->w_queue == QU_ROBOT &&
+ strcmp(j->p_name, "Puck") == 0)
+ {
+ /* Set semaphore to 0 in case there are multiple pucks. Yuck. */
+ if (pucksem_id != -1 &&
+ semctl(pucksem_id, 0, SETVAL, pucksem_arg) == -1)
+ {
+ perror("signal_puck semctl");
+ pucksem_id = -1;
+ /* are there any errors that would 'fix themselves?' */
+ }
+ if (kill(j->p_process, SIGALRM) < 0)
+ {
+ if (errno == ESRCH)
+ {
+ ERROR(1,("daemonII/signal_puck: slot %d missing\n", i));
+ freeslot(j);
+ }
+ }
+ else if (pucksem_id != -1)
+ {
+ puckwait = 1;
+ }
+ }
+
+ if (puckwait)
+ {
+ SIGNAL(SIGALRM, do_nuttin);
+ semop(pucksem_id, pucksem_op, 1);
+ SIGNAL(SIGALRM, SIG_IGN);
+ }
+}
+#endif /*PUCK_FIRST*/
/*
* The minor problem here is that the only client update speeds that
@@ -4378,6 +4478,14 @@
continue;
if (j->p_process <= 1)
continue;
+
+#ifdef PUCK_FIRST
+ if (j->p_status != PFREE && j->w_queue == QU_ROBOT &&
+ strcmp(j->p_name, "Puck") == 0)
+ {
+ continue;
+ }
+#endif /*PUCK_FIRST*/
t = j->p_timerdelay;
if (!t) /* paranoia */
_______________________________________________
vanilla-devel mailing list
vanilla-devel at us.netrek.org
https://mailman.real-time.com/mailman/listinfo/vanilla-devel