home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char sccsid[] = "@(#)master.c 1.1 92/05/28 SMI" ;
- /* from master.c 1.2 88/10/19 SMI */
- #endif
-
- /*
- * Copyright (c) 1986 by Sun Microsystems, Inc.
- */
-
- /*
- * This is the stuff handled by the master.
- */
-
-
-
- #include <stdio.h>
- #include <sys/time.h>
-
- #include "dstar.h"
- #include "object_types.h"
- #include "netio.h"
-
-
-
- extern int debug_level ;
-
-
-
-
-
-
- /****
- * get free entry in object list
- ****/
-
-
- static int
- get_free_object()
- {
- register int id ;
- register Object *object ;
-
- id = 0;
- object = &objects[0] ;
- for(;;)
- {
- if(object->class == OBJ_EMPTY)
- return(id) ;
- else if(++id >= MAX_PLAYERS)
- return(-1) ;
- else
- ++object ;
- }
- }
-
-
-
-
- /****
- *
- * tell somebody about all the players in the game
- *
- ****/
-
- static
- send_lists(id)
- int id ;
- {
- register int i ;
- register Object *object ;
-
-
- object = &objects[0] ;
- for(i=0; i < MAX_PLAYERS; ++i)
- {
- if(object->class != OBJ_EMPTY && object->id != id)
- send_status(object) ;
- ++object ;
- }
- }
-
-
-
-
-
-
-
-
- poll_player(player)
- register Object *player ;
- {
- Net_are_you_there poll_msg ;
-
- if(Now.tv_sec - player->last_rep.tv_sec > 60)
- {
- /* He's dead Jim. You grab his tricorder, I'll get his wallet */
- net_remove_player(player->id) ;
- }
- else if(Now.tv_sec - player->last_rep.tv_sec > 30)
- {
- /* where is it? */
- net_start_message( player ) ;
- poll_msg.type = NET_ARE_YOU_THERE ;
- poll_msg.len = sizeof(Net_are_you_there) ;
- poll_msg.id = Me->id ;
- poll_msg.sequence = ++sequence_number ;
- poll_msg.his_id = player->id ;
- add_message(&poll_msg, sizeof(poll_msg)) ;
- }
- }
-
-
-
-
-
- net_poll()
- {
- register Object *object ;
- int count ;
- Net_died died_msg ;
- int iret ;
-
- if(Me->net_status == UNKNOWN)
- {
- become_master() ;
- #ifdef DEBUG
- if(status_display)
- status_update() ;
- #endif DEBUG
- return ;
- }
-
-
-
-
-
-
- if(Me->net_status != MASTER)
- {
- #ifdef DEBUG
- if(status_display)
- status_update() ;
- #endif DEBUG
- if( poll_master )
- poll_player(&objects[master_id]) ;
- return ;
- }
-
-
-
-
- object = &objects[0] ;
- for(count = MAX_PLAYERS; count--; )
- {
- if(object != Me &&
- (object->class == OBJ_PLAYER ||
- (object->class == OBJ_MISSILE && object->team != Me->id)) )
- poll_player( object ) ;
- ++object ;
- }
-
-
- /* finally, re-sync static objects */
-
- net_start_message( NULL ) ;
- object = &objects[0] ;
- for(count = MAX_PLAYERS; count--; )
- {
- if( object->class == OBJ_STATIC )
- send_status( object ) ;
- ++object ;
- }
-
- #ifdef DEBUG
- if(status_display)
- status_update() ;
- #endif DEBUG
- }
-
-
-
-
-
- /*
- * MASTER DUTY HANDLERS:
- *
- * become_master() - initialize extra duty functions
- *
- */
-
-
-
-
-
- become_master()
- {
- register Object *object ;
-
-
- puts("No other players, waiting...") ;
-
- Me->id = 0 ;
-
- special_welcome() ;
-
- /* put static objects into database */
-
- create_planet(get_free_object()) ;
- create_monolith(get_free_object()) ;
-
- #ifdef DEBUG
- if(debug_level >= 1)
- dump_lists() ;
- #endif DEBUG
-
- rehash_netlists() ;
- }
-
-
-
-
-
-
-
- take_over()
- {
- register Object *object ;
-
-
- #ifdef DEBUG
- printf("taking over as master\n") ;
- #endif DEBUG
-
- if( objects[0].class == OBJ_EMPTY )
- {
- net_rename(0) ;
- Me = &objects[0] ;
- }
-
- else if( &objects[0] == Me )
- Me->id = 0 ;
-
- #ifdef DEBUG
- if(debug_level >= 1)
- dump_lists() ;
- #endif DEBUG
-
- rehash_netlists() ;
- net_flush() ;
- }
-
-
-
-
-
-
-
-
-
-
-
- /*
- * INPUT MESSAGE HANDLING:
- *
- * add_new_player(...) - handle NET_JOINING
- *
- * new_missile(header) - handle NET_REQUEST_MISSILE
- *
- */
-
-
-
-
-
-
- /****
- * add player to database (master only)
- * inform all players of this player's presence
- * inform this player of all other players
- * inform all slave daemons of this player's presence
- ****/
-
-
- add_new_player(id,name,address,sequence,class)
- int id ;
- char *name ;
- struct sockaddr_in *address ;
- int sequence ;
- Object_Class class ;
- {
- int i ;
- register Object *object ;
- extern fptr fighter_vector[VECTOR_LENGTH],
- missile_vector[VECTOR_LENGTH],
- static_vector[VECTOR_LENGTH] ;
- Net_welcome w_msg ;
-
- if(id == -1)
- id = get_free_object() ;
-
- if(id != -1)
- {
- object = &objects[id] ;
- object->id = id ;
- strncpy(object->name, name, NAMELEN) ;
- object->team = (game_type == GAME_FREE ? id : id%2) ;
- object->score = 0 ;
- object->class = class ;
- object->status = OBJ_SLEEPING ;
- object->flags = 0 ;
- object->target = NULL ;
- object->description = -1 ;
- object->address = *address ;
- object->sequence = sequence ;
- object->last_rep = Now ;
- object->net_addr = inet_netof(object->address.sin_addr) ;
- object->net_status = SLAVE ;
- switch(class)
- {
- case OBJ_PLAYER:
- printf("new player: %d, %s\n",id,name) ;
- bcopy(fighter_vector,object->f_vector,sizeof(fighter_vector)) ;
- break ;
- case OBJ_MISSILE:
- bcopy(missile_vector,object->f_vector,sizeof(missile_vector)) ;
- break ;
- case OBJ_STATIC:
- printf("new object: %d, %s\n",id,name) ;
- bcopy(static_vector,object->f_vector,sizeof(static_vector)) ;
- break ;
- }
-
- need_rehash = 1 ;
- special_add_player(object) ;
-
- /* tell player about all players */
-
- w_msg.type = NET_WELCOME ;
- w_msg.len = sizeof(w_msg) ;
- w_msg.id = Me->id ;
- w_msg.sequence = ++sequence_number ;
- w_msg.player_id = id ;
- w_msg.team = (game_type == GAME_FREE ? id : id%2) ;
- w_msg.game_type = game_type ;
-
- net_start_message( object ) ;
- add_message(&w_msg, sizeof(w_msg)) ;
- send_lists(object->id) ;
- }
- else
- {
- printf("too many players, %s is being ignored\n",name) ;
- }
-
- #ifdef DEBUG
- if(status_display)
- status_update() ;
- if(debug_level >= 1)
- dump_lists() ;
- #endif DEBUG
- }
-
-
-
-
-
-
-
- new_missile(header)
- register Net_request_missile *header ;
- {
- register Object *missile, *owner ;
- Net_missile outmsg ;
- int id, get_free_object() ;
- extern fptr missile_vector[VECTOR_LENGTH] ;
-
- owner = &objects[header->id] ;
- id = get_free_object() ;
- if(id >= 0)
- {
- missile = &objects[id] ;
- missile->id = id ;
- strncpy(missile->name, "missileX", NAMELEN) ;
- missile->team = owner->id ;
- missile->score = 0 ;
- missile->class = OBJ_MISSILE ;
- missile->status = OBJ_SLEEPING ;
- missile->flags = 0 ;
- missile->target = NULL ;
- missile->description = -1 ;
- missile->address = owner->address ;
- missile->last_rep = Now ;
- missile->net_status = SLAVE ;
- bcopy(missile_vector, missile->f_vector, sizeof(missile->f_vector)) ;
-
- if(header->id != Me->id)
- {
- outmsg.type = NET_MISSILE ;
- outmsg.len = sizeof(Net_missile) ;
- outmsg.id = Me->id ;
- outmsg.sequence = ++sequence_number ;
- outmsg.missile_id = id ;
- net_start_message( owner ) ;
- add_message(&outmsg, sizeof(outmsg)) ;
- special_add_player(missile) ;
- }
- else
- missile_armed(id) ;
- }
- else
- {
- printf("too many players, missile from %s is being ignored\n",
- owner->name) ;
- }
-
- #ifdef DEBUG
- if(status_display)
- status_update() ;
- #endif DEBUG
- }
-