# include <config.h>
# include "/dgd/lib/privilege.h"
object *usr; /* user array just before a swapout */
/*
* NAME: initialize
* DESCRIPTION: called once at game startup
*/
static void initialize()
{
string *castles, castle;
int i, sz, t;
send_message("\nLoading init file room/init_file\n");
castles = explode(read_file("/room/init_file"), "\n");
for (i = 0, sz = sizeof(castles); i < sz; i++) {
castle = castles[i];
if (strlen(castle) != 0 && castle[0] != '#') {
send_message("Preloading: " + castle);
t = time();
if (castle[strlen(castle) - 2 ..] == ".c") {
castle = castle[0 .. strlen(castle) - 3];
}
if (catch(call_other(castle, "???")) == 0) {
send_message(" " + (time() - t) + ".0\n");
}
}
}
send_message("Setting up ipc.\n");
call_out("swapswap", 900);
}
/*
* NAME: swapswap()
* DESCRIPTION: swap out all objects
*/
static void swapswap()
{
call_out("swapswap", 900);
usr = 0;
swapout();
}
/*
* NAME: set_users()
* DESCRIPTION: keep a copy of the users array
*/
void set_users()
{
if (PRIVILEGED()) {
usr = users();
}
}
/*
* NAME: restored()
* DESCRIPTION: re-initialize the system after a restore
*/
static void restored()
{
int i, sz;
if (usr != 0) {
for (i = 0, sz = sizeof(usr); i < sz; i++) {
catch(usr[i]->force_close());
}
}
usr = 0;
send_message("\nState restored.\nSetting up ipc.\n");
}
/*
* NAME: path_ed_read()
* DESCRIPTION: handle an editor read path
*/
string path_ed_read(object obj, string path)
{
if (path != "" && path[0] != '/') {
path = "/" + this_user()->query_player()->query_path() + "/" + path;
}
return this_user()->query_player()->valid_read(path);
}
/*
* NAME: path_ed_write()
* DESCRIPTION: handle an editor write path
*/
string path_ed_write(object obj, string path)
{
if (path != "" && path[0] != '/') {
path = "/" + this_user()->query_player()->query_path() + "/" + path;
}
return this_user()->query_player()->valid_write(path);
}
/*
* NAME: path_object()
* DESCRIPTION: translate an object path
*/
string path_object(object obj, string path)
{
int i;
if (sscanf(path, "../%*s") != 0 || sscanf(path, "%*s/../%*s") != 0) {
error("Illegal path");
}
if ((i=strlen(path)) >= 2 && path[i - 2 ..] == ".c") {
return path[0 .. i - 3];
}
return path;
}
/*
* NAME: path_inherit()
* DESCRIPTION: translate an inherit path
*/
string path_inherit(string file, string path)
{
return path_object(0, path);
}
/*
* NAME: path_include()
* DESCRIPTION: translate an include path
*/
string path_include(string file, string path)
{
if (path[0] != '/') {
return file + "/../" + path;
}
return path;
}
/*
* NAME: compile_object()
* DESCRIPTION: (not) used for virtual objects
*/
static object compile_object(string file)
{
return 0;
}
/*
* NAME: recompile()
* DESCRIPTION: (not) used to recompile objects
*/
static void recompile(object obj)
{
}
/*
* NAME: connect()
* DESCRIPTION: return a player object
*/
static object connect()
{
object user, player;
GLOBAL->set_this_player(0);
user = clone_object(USER);
player = MASTER->connect();
user->set_player(player);
player->_F_user(user);
return user;
}
/*
* NAME: log_error()
* DESCRIPTION: log a runtime error
*/
static void log_error(string error, int caught)
{
mixed **trace;
string progname, objname, function, str;
int i, sz, line, len;
object player;
if (caught) {
return;
}
send_message(error + "\n");
trace = call_trace();
if ((sz=sizeof(trace) - 1) != 0) {
for (i = 0; i < sz; i++) {
progname = trace[i][1];
function = trace[i][2];
if (progname == AUTO && strlen(function) > 3) {
switch (function[0 .. 2]) {
case "bad":
progname = trace[i - 1][1];
function = trace[i - 1][2];
case "_F_":
case "_Q_":
continue;
default:
break;
}
}
objname = trace[i][0];
line = trace[i][3];
if (line == 0) {
str = " ";
} else {
str = " " + line;
str = str[strlen(str) - 4 ..];
}
str += " " + function + " ";
len = strlen(function);
if (len < 17) {
str += " "[len ..];
}
str += " " + progname;
if (progname != objname) {
len = strlen(progname);
if (len < strlen(objname) && progname == objname[.. len - 1]) {
str += " (" + objname[len ..] + ")";
} else {
str += " (" + objname + ")";
}
}
send_message(str + "\n");
}
player = GLOBAL->query_this_player();
if (player != 0 && function_object("valid_player", player) == PLAYER &&
player->_Q_user() != 0) {
if (player->query_level() < 21) {
player->catch_tell("Your significant mind notices the fabric " +
"of space.\n");
} else {
player->catch_tell(error + "\nObject: " + objname +
", program: " + progname + ", line " +
line + "\n");
}
}
}
}
/*
* NAME: compile_log()
* DESCRIPTION: return the name of a compile time error log
*/
string compile_log(string file)
{
string *path;
path = explode(file, "/");
if (path[0] == "players") {
return "/log/" + path[1];
}
return "/log/log";
}
/*
* NAME: start_shut_down()
* DESCRIPTION: start shutting down the game
*/
void start_shut_down()
{
if (PRIVILEGED()) {
remove_call_out("do_shutdown");
call_out("do_shutdown", 1);
}
}
/*
* NAME: do_shutdown()
* DESCRIPTION: actually shut down the game
*/
static void do_shutdown()
{
object *u;
int i;
u = users();
for (i = 0; i < sizeof(u); i++) {
u[i]->catch_tell("Deegeedee shouts: Mud shutting down immediately.\n");
}
for (i = 0; i < sizeof(u); i++) {
GLOBAL->set_this_player(u[i]);
catch(u[i]->quit());
}
send_message("Shutdown.\n");
shutdown();
}