mud/lib/daemon/types.c
2020-09-06 05:43:07 -07:00

137 lines
3.6 KiB
C

#include <lib.h>
#include <save.h>
#include <armor_types.h>
#include <body_types.h>
#include <boobytraps.h>
#include <build_types.h>
#include <damage_types.h>
#include <graphics.h>
#include <meal_types.h>
#include <message_class.h>
#include <mouth_types.h>
#include <position.h>
#include <respiration_types.h>
#include <size_types.h>
#include <terrain_types.h>
#include <vendor_types.h>
#include <assessment.h>
#include <climb.h>
#include <jump.h>
#include <magic.h>
#include <medium.h>
#include <motion.h>
#include <rounds.h>
#include <soul.h>
#include <talk_type.h>
#include <vision.h>
#include <parser_error.h>
inherit LIB_DAEMON;
string *types = ({ "vendor_types", "terrain_types", "size_types",
"respiration_types", "position", "mouth_types", "message_class",
"meal_types", "graphics", "damage_types", "build_types",
"boobytraps", "body_types", "armor_types" });
string *configs = ({ "assessment", "climb", "jump",
"magic", "medium", "motion", "rounds",
"soul", "talk_type", "vision", "parser_error" });
mapping Types = ([]);
int eventReadTypes();
int eventReadConfigs();
static void create() {
::create();
SetSaveFile(SAVE_TYPES);
if(!Types) Types = ([]);
call_out((: eventReadTypes :), 10);
call_out((: eventReadConfigs :), 10);
}
int eventReadTypes(){
if(!Types) Types = ([]);
foreach(string file in types){
string *tmp_arr;
string tmp,s1,s2,s3,s4;
int d1,d2,d3, i, j;
if(!Types[file]) Types[file] = ([]);
tmp = read_file("/include/"+file+".h");
if(!tmp) tmp = read_file("/secure/include/"+file+".h");
tmp_arr = explode(tmp,"\n");
foreach(string line in tmp_arr){
i = sscanf(line,"#define %s (%s<<%s)",s1,s2,s3,s4);
if( i != 4) j = sscanf(line,"#define %s (%s<<%s)",s1,s2,s3);
if(i != 4 && j != 3) continue;
s1 = trim(s1);
s2 = trim(s2);
s3 = trim(s3);
d1 = atoi(s2);
d2 = atoi(s3);
d3 = ( d1 << d2 );
Types[file][d3] = s1;
}
}
eventSave();
return 1;
}
int eventReadConfigs(){
if(!Types) Types = ([]);
foreach(string file in configs){
string *tmp_arr;
string tmp,s1,s2,s3;
int d1, i, j;
if(!Types[file]) Types[file] = ([]);
tmp = read_file("/include/"+file+".h");
if(!tmp) tmp = read_file("/secure/include/"+file+".h");
tmp_arr = explode(tmp,"\n");
foreach(string line in tmp_arr){
line = trim(line);
i = sscanf(line,"#define %s %s %s)",s1,s2,s3);
if( i != 3) j = sscanf(line,"#define %s %s",s1,s2);
if(i != 3 && j != 2) continue;
s1 = trim(s1);
s2 = trim(s2);
d1 = atoi(s2);
Types[file][d1] = s1;
}
}
eventSave();
return 1;
}
varargs mixed GetTypes(string str){
if(!str) return Types + ([]);
if(Types[str]) return Types[str] + ([]);
else return 0;
}
mixed eventCalculateTypes(string typename, int type){
string *ret_arr = ({});
string ret = "";
foreach(string canonical_name in keys(Types)){
if(grepp(canonical_name, typename)){
typename = canonical_name;
break;
}
}
if(!Types[typename]) return 0;
if(member_array(typename,types) != -1){
foreach(int key, string val in Types[typename]){
if(type & key) ret_arr += ({ Types[typename][key] });
}
return ret_arr;
}
foreach(int key, string val in Types[typename]){
if(type == key) ret = Types[typename][key];
}
return ret;
}