/* $Header: /belch_a/users/rearl/tinymuck/src/RCS/player.c,v 1.6 90/09/28 12:24:42 rearl Exp $ */ /* * $Log: player.c,v $ * Revision 1.6 90/09/28 12:24:42 rearl * Added check for NULL in add_hash(). * * Revision 1.5 90/09/18 08:01:03 rearl * Hash functions introduced for player lookup. * * Revision 1.4 90/09/16 04:42:39 rearl * Preparation code added for disk-based MUCK. * * Revision 1.3 90/08/27 03:32:10 rearl * Minor initialization stuff for newly created players. * * Revision 1.2 90/08/11 04:07:12 rearl * *** empty log message *** * * Revision 1.1 90/07/19 23:03:57 casie * Initial revision * * */ #include "copyright.h" #include "config.h" #include "db.h" #include "params.h" #include "interface.h" #include "externs.h" static hash_tab player_list[PLAYER_HASH_SIZE]; dbref lookup_player(const char *name) { hash_data *hd; if ((hd = find_hash(name, player_list, PLAYER_HASH_SIZE)) == NULL) return NOTHING; else return (hd -> dbval); } dbref connect_player(const char *name, const char *password) { dbref player; if((player = lookup_player(name)) == NOTHING) return NOTHING; if(DBFETCH(player)->sp.player.password && *DBFETCH(player)->sp.player.password && strcmp(DBFETCH(player)->sp.player.password, password)) return NOTHING; return player; } dbref create_player(const char *name, const char *password) { dbref player; if(!ok_player_name(name) || !ok_password(password)) return NOTHING; /* else he doesn't already exist, create him */ player = new_object(); /* initialize everything */ NAME(player) = alloc_string(name); DBFETCH(player)->location = PLAYER_START; /* home */ FLAGS(player) = TYPE_PLAYER; #ifdef BUILDER_ALL /* make players builders by default */ FLAGS(player) |= BUILDER; #endif /* BUILDER_ALL */ #ifdef MUCKER_ALL FLAGS(player) |= MUCKER; #endif OWNER(player) = player; DBFETCH(player)->link = PLAYER_START; DBFETCH(player)->exits = NOTHING; DBFETCH(player)->sp.player.pennies = NEW_PLAYER_PENNIES; DBFETCH(player)->sp.player.password = alloc_string(password); DBFETCH(player)->curr_prog = NOTHING; DBFETCH(player)->insert_mode = 0; DBFETCH(player)->run = 0; /* link him to PLAYER_START */ PUSH(player, DBFETCH(PLAYER_START)->contents); add_player(player); DBDIRTY(player); DBDIRTY(PLAYER_START); return player; } void do_password(dbref player, const char *old, const char *newobj) { if(!DBFETCH(player)->sp.player.password || strcmp(old, DBFETCH(player)->sp.player.password)) { notify(player, "Bad old password."); } else if(!ok_password(newobj)) { notify(player, "Bad new password."); } else { free((void *) DBFETCH(player)->sp.player.password); DBSTORE(player, sp.player.password, alloc_string(newobj)); notify(player, "Password changed."); } } void clear_players(void) { kill_hash(player_list, PLAYER_HASH_SIZE); return; } void delete_player(dbref who) { (void) free_hash(NAME(who), player_list, PLAYER_HASH_SIZE); return; } void add_player(dbref who) { hash_data hd; hd.dbval = who; if (add_hash(NAME(who), hd, player_list, PLAYER_HASH_SIZE) == NULL) panic("Out of memory."); else return; }