#include #include #include #include #include #include #include #include "dynamite.h" BOOL checkDynamite (struct dynamitesemaphore ** ); void mainLoop (struct dynamitesemaphore *); void doAI (struct dynamitesemaphore *); LONG thisbotnum int main (void) { struct dynamitesemaphore *dynasema; srand (time(NULL)); if ( FALSE == checkDynamite (&dynasema) ) { puts ("*** DynAMIte not running!"); return EXIT_FAILURE; } /* some information */ printf ("Number of clients: %Ld\n",dynasema->opencnt); /* enter main loop */ mainLoop (dynasema); /* decrease opencount to tell dynamite that you no longer need the semaphore. dynamite will remove the semaphore only if opencnt is 0 at the end */ ObtainSemaphore(&dynasema->sema); /* reset direction */ dynasema->walk=DIR_NONE; /* set botinfo entry back to 0 */ dynasema->botinfo[thisbotnum]=NULL; dynasema->opencnt--; ReleaseSemaphore(&dynasema->sema); return EXIT_SUCCESS; } BOOL checkDynamite (struct dynamitesemaphore ** dynasema ) { Forbid(); /* try to find the semaphore */ if (*dynasema = (struct dynamitesemaphore *)FindSemaphore ("dynAMIte.0") { /* increase opencount to tell dynamite that you are using the semaphore. dynamite will remove semaphore only if opencnt is 0 at its end */ ++ dynasema->opencnt; thisbotnum = dynasema->opencnt; /* set botinfo string */ dynasema->botinfo[dynasema->opencnt]=(char*)"dynamite sample bot v1.0 - doing nothing useful" } Permit(); if ( NULL == *dynasema ) return FALSE; return TRUE; } void mainLoop (struct dynamitesemaphore * dynasema) { struct player *ourplayer; BOOL done = FALSE, delay; while (FALSE == done) { if (CheckSignal (SIGBREAKF_CTRL_C)) done = TRUE; else { delay = TRUE; ObtainSemaphore (&dynasema->sema); if (dynasema->quit) { /* dynamite wants to quit, so we do dynamite a favour */ printf ("dynAMIte is about to quit...\n"); done = TRUE; } else { /* if a game is running */ if (dynasema->gamerunning>=GAME_GAME) { /* and player is no observer */ if (dynasema->thisplayer < 8) { delay = FALSE; ourplayer = dynasema->players[dynasema->thisplayer]; /* and our player is alive */ if (ourplayer->dead) doAI (dynasema); } } } ReleaseSemaphore (&dynasema->sema); if (delay) { /* no game is running */ /* do a small delay to let the cpu do other things :( */ Delay (10); } } } } void doAI (struct dynamitesemaphore * dynasema) { dynasema->walk = rand() % DIR_UP+1; }