/* $Header: player.c,v 1.1 90/04/14 14:56:48 lachesis Exp $
 * $Log:    player.c,v $
 * Revision 1.1  90/04/14  14:56:48  lachesis
 * Initial revision
 *
 */
#include "copyright.h"

#include "os.h"
#include "db.h"
#include "config.h"
#include "hashtab.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 (db[player].sp.player.password
    && *db[player].sp.player.password
    && strcmp (db[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 */
  db[player].name = alloc_string (name);
  db[player].location = PLAYER_START;   /* home */
  PUSH (player, db[PLAYER_START].contents);
  db[player].flags = TYPE_PLAYER;
  db[player].sp.player.home = PLAYER_START;
  db[player].sp.player.password = alloc_string (password);
  db[player].sp.player.actions = NOTHING;
  db[player].sp.player.pennies = 0;
  add_player (player);

  return player;
}

void do_password (dbref player, const char *old, const char *newobj)
{
  if (!db[player].sp.player.password ||
    strcmp (old, db[player].sp.player.password)) {
    notify (player, "Sorry");
  } else if (!ok_password (newobj)) {
    notify (player, "Bad new password.");
  } else {
    free ((void *) db[player].sp.player.password);
    db[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 (db[who].name, player_list, PLAYER_HASH_SIZE);
  return;
}

void add_player (dbref who)
{
  hash_data hd;

  hd.dbval = who;
  if (add_hash (db[who].name, hd, player_list, PLAYER_HASH_SIZE) == NULL)
    panic ("Out of memory");
  else
    return;
}