00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00050 #include <stdarg.h>
00051 #include <assert.h>
00052
00053 #include <cfrhg.h>
00054 #ifndef __CEXTRACT__
00055 #include <cfrhg_proto.h>
00056 #endif
00057
00059 typedef struct house_zone_struct {
00060 const char *mappath;
00061 const char *monsterstyle;
00062 } house_zone_struct;
00063
00065 static const house_zone_struct zones[] = {
00066
00067 { "/world/world_104_115", "city" },
00068 { "/world/world_105_115", "city" },
00069 { "/world/world_104_116", "city" },
00070 { "/world/world_105_116", "city" },
00071
00072 { "/world/world_122_116", "city" },
00073 { "/world/world_121_116", "city" },
00074 { "/world/world_122_117", "city" },
00075 { "/world/world_121_117", "city" },
00076 { NULL, NULL }
00077 };
00078
00086 static const house_zone_struct *get_map_zone(const mapstruct *map) {
00087 int zone;
00088
00089 for (zone = 0; zones[zone].mappath != NULL; zone++) {
00090 if (strcmp(zones[zone].mappath, map->path) == 0)
00091 return &zones[zone];
00092 }
00093
00094 return NULL;
00095 }
00096
00104 static int is_suitable_exit(object *exit) {
00105 assert(exit);
00106
00107 if (cf_object_get_int_property(exit, CFAPI_OBJECT_PROP_TYPE) != EXIT)
00108 return 0;
00109 if (cf_object_get_sstring_property(exit, CFAPI_OBJECT_PROP_SLAYING) || cf_object_get_sstring_property(exit, CFAPI_OBJECT_PROP_MESSAGE))
00110 return 0;
00111
00112 return 1;
00113 }
00114
00124 static int get_exit_seed(const object *exit, const mapstruct *map) {
00125 char r[500];
00126 int seed = 0, len, w = 0;
00127
00128 snprintf(r, sizeof(r), "%s!%d,%d*%s", exit->arch->name, exit->x, exit->y, map->path);
00129
00130 len = strlen(r)-1;
00131 while (len >= 0) {
00132 seed ^= ((int)r[len])<<w;
00133 w += 8;
00134 w = w%32;
00135 len--;
00136 }
00137
00138 return seed;
00139 }
00140
00150 static void add_exit_to_item(object *exit, const house_zone_struct *zone, const mapstruct *map) {
00151 char params[MAX_BUF];
00152
00153 assert(exit);
00154 assert(zone);
00155
00156 snprintf(params, sizeof(params), "layoutstyle onion\n"
00157 "floorstyle indoor\n"
00158 "wallstyle wooden\n"
00159 "monsterstyle %s\n"
00160 "dungeon_level 1\n"
00161 "dungeon_depth 1\n"
00162 "decorstyle furniture\n"
00163 "random_seed %d\n",
00164 zone->monsterstyle,
00165 get_exit_seed(exit, map));
00166
00167 cf_object_set_string_property(exit, CFAPI_OBJECT_PROP_SLAYING, "/!");
00168 cf_object_set_string_property(exit, CFAPI_OBJECT_PROP_MESSAGE, params);
00169 }
00170
00176 static void add_exits_to_map(const mapstruct *map) {
00177 int x, y;
00178 object *item;
00179 const house_zone_struct *zone = get_map_zone(map);
00180
00181 if (!zone)
00182 return;
00183
00184 for (x = 0; x < MAP_WIDTH(map); x++) {
00185 for (y = 0; y < MAP_HEIGHT(map); y++) {
00186 item = GET_MAP_OB(map, x, y);
00187 while (item) {
00188 if (is_suitable_exit(item))
00189 add_exit_to_item(item, zone, map);
00190
00191 item = item->above;
00192 }
00193 }
00194 }
00195 }
00196
00204 CF_PLUGIN void *cfrhg_globalEventListener(int *type, ...) {
00205 va_list args;
00206 static int rv = 0;
00207 mapstruct *map;
00208 int code;
00209
00210 va_start(args, type);
00211 code = va_arg(args, int);
00212
00213 rv = 0;
00214
00215 switch (code) {
00216 case EVENT_MAPLOAD:
00217 map = va_arg(args, mapstruct *);
00218 add_exits_to_map(map);
00219 break;
00220 }
00221 va_end(args);
00222
00223 return &rv;
00224 }
00225
00233 CF_PLUGIN void *eventListener(int *type, ...) {
00234 return NULL;
00235 }
00236
00246 CF_PLUGIN int initPlugin(const char *iversion, f_plug_api gethooksptr) {
00247 cf_init_plugin(gethooksptr);
00248
00249 cf_log(llevDebug, PLUGIN_VERSION " init\n");
00250
00251 return 0;
00252 }
00253
00261 CF_PLUGIN void *getPluginProperty(int *type, ...) {
00262 va_list args;
00263 const char *propname;
00264 int size;
00265 char *buf;
00266
00267 va_start(args, type);
00268 propname = va_arg(args, const char *);
00269
00270 if (!strcmp(propname, "Identification")) {
00271 buf = va_arg(args, char *);
00272 size = va_arg(args, int);
00273 va_end(args);
00274 snprintf(buf, size, PLUGIN_NAME);
00275 return NULL;
00276 } else if (!strcmp(propname, "FullName")) {
00277 buf = va_arg(args, char *);
00278 size = va_arg(args, int);
00279 va_end(args);
00280 snprintf(buf, size, PLUGIN_VERSION);
00281 return NULL;
00282 }
00283 va_end(args);
00284 return NULL;
00285 }
00286
00296 CF_PLUGIN int cfrhg_runPluginCommand(object *op, char *params) {
00297 return -1;
00298 }
00299
00305 CF_PLUGIN int postInitPlugin(void) {
00306 cf_log(llevDebug, PLUGIN_VERSION " post init\n");
00307
00308 cf_system_register_global_event(EVENT_MAPLOAD, PLUGIN_NAME, cfrhg_globalEventListener);
00309
00310 return 0;
00311 }
00312
00318 CF_PLUGIN int closePlugin(void) {
00319 cf_log(llevDebug, PLUGIN_VERSION " closing\n");
00320 return 0;
00321 }