// /std/player.c -- Vincent's Hollow Project.

#include <daemons.h>
#include <wizlev.h>
#include <files.h>
#include "/std/player/eval.h"
#include "/std/logic/status.h"	/* should be errors.h ? */

#define	LOGIN	"/etc/news/login/"	
#define START 	"/room/inns/inn"

inherit "/std/living";
inherit "/std/prop/2player";
inherit "/std/player/alias";
inherit "/std/player/announce";
inherit "/std/player/ask_for_money";
inherit "/std/player/autoload";
inherit "/std/player/half_skills";
inherit "/std/player/hours";
inherit "/std/player/more";
inherit "/std/player/save";
inherit "/std/player/showsc";
inherit "/std/player/title";
inherit "/std/player/zaway";

static string 	*login_news_files;	
static int	size, count;
static int 	autosave,idlewarn;
static int	  reallyon;

string value_real_name;

void setup_cont();
void init_weight();

//
// Let us create the player object!
//

void 
create() 
{
	int i;
	object *list;

	living::create();
	if(file_name(this_object()) == "/std/player")
		set_prop("!cleanup");

	// Actions defined in player.c (not handled by bin daemon).
	add_action("quit","quit");
}

// 
// Functions called from setup_ob & etc.  Put before the function so that
// as little prototypings need to be done.
//

void 
heart_beat() 
{
	living::heart_beat();
	if(!interactive(this_object())) {
		stop_heart_beat();
		master()->add_netdead(query_real_name());
	}
	if(interactive() && !query_wiz() && query_idle(this_object())>500) {
		if(!idlewarn) {
			tell_object(this_object(),
			"IDLE WARNING: You may be kicked off for idling.\n");
			idlewarn=1;
		}
		if(query_idle(this_object())>600) {
			if(idlewarn<2) {
				tell_object(this_object(),
				"IDLE WARNING: No action for last 10 min.\n"+
				"IDLE WARNING: At 15 min. you may be kicked off.\n");
				idlewarn=2;
			}
			if(query_idle(this_object())>900) {
				tell_object(this_object(),
				"The Gamedriver forces you to quit 'cuz of idling.\n");
				force_me("save");
				force_me("quit");
			}
		}
	}
	if(this_object()->query_wiz()) return;
	autosave++;
	if(autosave>900) {
	tell_object(this_object(),
		"The Gamedriver autosaves your present state of mind.\n");
	force_me("save");
	autosave=0;
	}
}

/*************************************************************************
 *
 *  Initialization routines
 */

void 
init_wiz() 
{
	string dir;

	set_wiz((int)MOIRA->init_user(query_real_name(),"level"));
	if(!query_wiz()) return;
	enable_wizard();
	set_sponsor((string)MOIRA->init_user(query_real_name(),"sponsor"));
	dir = "/w/"+query_real_name();
	if(file_size(dir)!=-2) dir = "/open";
	set_path(dir);
	if(!query_env("HOME"))
	set_env("HOME",dir);
}

string query_mvis()
{
return "";
}

void 
init_env() 
{
	if(!query_min())
	set_env("MIN", "arrives");
	if(!query_mout())
	set_env("MOUT", "leaves");
	if(!query_mmin())
	set_env("MMIN", "steps out of a sudden break in space");
	if(!query_mmout())
	set_env("MMOUT", "steps through a sudden break in space");
	if(!query_mvis())
	set_env("MVIS", "appears in a puff of smoke.\n");
}

void 
goto_start() 
{
	string file;

	if(this_player()->query_tot_exp() < 1)
	{
		move("/room/special/giverace");
		return;
	}
	if("/room/jail/jail"->check_in_jail(this_player()->query_real_name()))
	{
		move("/room/jail/jail");
		return;
	}
	if(this_player()->query_dead())
	{
		move("/room/death/boatto");
		return;
	}
	if(query_login_point())
	{
		file = query_login_point();
	}
	else
	{
		if(query_wiz())
		{
			file = "/w/"+query_real_name()+"/workroom.c";
			if(file_size(file) <= 0)
			file = START;
		}
		else
		{
			if(!query_class())
			file = "/room/special/givestat";
			else
			file = START;
		}
	}
	move(file);
}

void 
get_start_objects() 
{
	object ob;
}

void
start_actions()
{
	force_me("look");
}

//
// Called from /bin/adm/login.c object.
//

void 
setup_ob() 
{
	set_heart_beat(1);
	set_name((string)KERBEROS_D->query_name(this_object()));
	value_real_name=query_name();
	if(!query_short()) 
		set_short(capitalize(query_real_name()));
	init_env();
	init_aliases();
	init_weight();
	init_wiz();
	set_lit(time());
	set_ip(query_ip_name(this_object()));
	write("\n");

	get_start_objects();
	load_aloads();

	/* A little Post-setup ensurances - Sunnywiz */
	update_stat_mod();
	update_realm_mod();

	goto_start();
	say(query_cap_name()+" appears in a sudden whirlwind.\n");

	start_actions();
}

//
// Actions defined for player.c object.
//

int 
quit() 
{
	string file;

	save_aloads(); /* no! no! no! */
	save_player(query_real_name());
	write("A sudden gale sweeps you back into reality.\n");
	say("A sudden gale swept "+query_cap_name()+" back into reality.\n");
	if (reallyon)
	   announce(1);

	call_out("remove",1);
	return 1;
}

//
// Misc. util functions.
//

string 
process_input(string arg) 
{
	return arg;
}

// User-definable prompt.

void catch_tell(string str) { receive(str); }

int query_ghost() { return query_dead(); }

string query_long() { return query_title_name()+"\n"+living::query_long(); }

int query_player() { return 1; }

status id(string s) 
{
	if(s == query_name()) return 1;
	return 0;
}

void 
init_weight()
{
	int i, tot;

	for(i = 0; i < sizeof(val_coins); i++)
	tot += val_coins[i];
	add_weight(tot);
}

int 
switchdevel() 
{ 
	"/bin/adm/switchdevel"->switchdevel_request(this_object());
	return 1;
}

void 
write_prompt() 
{
	object env;

	if(!query_prompt())
	if(query_wiz())
		set_prompt("> ");
	else
		set_prompt("=> ");
	switch (query_prompt()) {
	case "generic":		write("> "); return;
	case "path":		write(query_path()+" > "); return;
	case "time":		write(extract(ctime(time()),11,18)+" > ");
				return;
	case "environment":	env = environment(this_player());
				if(!env)
					write("no env > ");
				else
					write(file_name(env)+" > ");
				return;
	}
	write(query_prompt()+" ");
}

// EOF.