mud/lib/secure/sefun/rooms.c
2020-09-06 05:43:07 -07:00

157 lines
4.9 KiB
C

#include <daemons.h>
#include <lib.h>
string namen, ret;
int reload_room(object ob){
string name;
object *stuff;
name=base_name(ob);
stuff = deep_inventory(ob);
foreach(object item in stuff){
object *int_inv = ({});
int_inv = filter(containers(item), (: interactive($1) :));
if(!sizeof(int_inv) && !interactive(item)) item->eventDestruct();
}
ob->eventDestruct();
load_object(name);
return 1;
}
int query_night_light(object ob){
string file;
string filename = base_name(ob)+".c";
namen = filename;
if(file_size(filename) < 1) return -1;
file = unguarded( (: read_file(namen) :) );
if(strsrch(file,"SetNightLight") != -1) return 1;
else return 0;
}
int query_day_light(object ob){
string filename = base_name(ob)+".c";
if(file_size(filename) < 1) return -1;
if(strsrch(read_file(filename),"SetDayLight") != -1) return 1;
else return 0;
}
int query_ambient_light(object ob){
string filename = base_name(ob)+".c";
if(file_size(filename) < 1) return -1;
if(strsrch(read_file(filename),"SetAmbientLight") != -1) return 1;
else return 0;
}
varargs string opposite_dir(string str, int article){
int classic;
switch(str){
case "north" : ret = "south";classic = 1;break;
case "south" : ret = "north";classic = 1;break;
case "east" : ret = "west";classic = 1;break;
case "west" : ret = "east";classic = 1;break;
case "northeast" : ret = "southwest";classic = 1;break;
case "northwest" : ret = "southeast";classic = 1;break;
case "southeast" : ret = "northwest";classic = 1;break;
case "southwest" : ret = "northeast";classic = 1;break;
case "up" : ret = (article ? "below" : "down");break;
case "down" : ret = (article ? "above" : "up");break;
case "fore" : ret = "aft";break;
case "aft" : ret = "fore";break;
case "port" : ret = "starboard";break;
case "starboard" : ret = "port";break;
case "+y" : ret = "-y";break;
case "-y" : ret = "+y";break;
case "+x" : ret = "-x";break;
case "-x" : ret = "+x";break;
case "+z" : ret = "-z";break;
case "-z" : ret = "+z";break;
case "+x+y" : ret = "-x-y";break;
case "-x-y" : ret = "+x+y";break;
case "+x-y" : ret = "-x+y";break;
case "-x+y" : ret = "+x-y";break;
case "+x+z" : ret = "-x-z";break;
case "-x-z" : ret = "+x+z";break;
case "+x-z" : ret = "-x+z";break;
case "-x+z" : ret = "+x-z";break;
case "+y+z" : ret = "-y-z";break;
case "-y-z" : ret = "+y+z";break;
case "+y-z" : ret = "-y+z";break;
case "-y+z" : ret = "+y-z";break;
case "+x+y-z" : ret = "-x-y+z";break;
case "+x+y+z" : ret = "-x-y-z";break;
case "-x-y-z" : ret = "+x+y+z";break;
case "-x-y+z" : ret = "+x+y-z";break;
case "+x-y-z" : ret = "-x+y+z";break;
case "+x-y+z" : ret = "-x+y-z";break;
case "-x+y-z" : ret = "+x-y+z";break;
case "-x+y+z" : ret = "+x-y-z";break;
default : ret = "";break;
}
if(article){
if(classic) return "the "+ret;
}
return ret;
}
varargs mixed coordinates(object ob, string type){
mixed ret;
object env;
if(!ob) return;
if(!(ret = ROOMS_D->GetCoordinates(ob))){
if(env = room_environment(ob)){
ret = ROOMS_D->GetCoordinates(env);
}
}
return ret;
}
mixed calculate_coordinates(string str, int x, int y, int z, string type){
mixed ret, str_ret = ({});
switch(str){
case "north" : ret = ({ x, y+1, z });break;
case "south" : ret = ({ x, y-1, z });break;
case "east" : ret = ({ x+1, y, z });break;
case "west" : ret = ({ x-1, y, z });break;
case "northeast" : ret = ({ x+1, y+1, z });break;
case "northwest" : ret = ({ x-1, y+1, z });break;
case "southeast" : ret = ({ x+1, y-1, z });break;
case "southwest" : ret = ({ x-1, y-1, z });break;
case "up" : ret = ({ x, y, z+1 });break;
case "down" : ret = ({ x, y, z-1 });break;
default: ret = ({ x, y, z }); break;
}
if(type != "string") return ret;
foreach(int element in ret){
str_ret += ({ itoa(element) });
}
return implode(str_ret, ",");
}
object room_environment(object ob){
foreach(object element in containers(ob)){
if(inherits(LIB_ROOM, element)){
return element;
}
}
return 0;
}
varargs int bearing(int x1, int y1, int x2, int y2, int reverse){
float inter = (reverse ? (y1 - y2) : (y2 - y1));
float mark = (reverse ? (x1 - x2) : (x2 - x1));
float range = sqrt(pow(mark, 2) + pow(inter, 2));
int corr, ret;
if(x1 == x2 && y1 == y2) return -1;
corr = ((mark >= 0) ? 0 : 180);
ret = (acos(to_float(corr ? -inter : inter)/range) * (180/3.141592)) + corr;
return ret;
}