/*****************************************************************************/ /* Crossfire Plugin Interface Common Parts */ /* Version: 2.0beta8 (also known as "Alexander") */ /* Contact: yann.chachkoff@myrealbox.com */ /*****************************************************************************/ /* The CPICP are the various functions of the server that can be used by all */ /* plugins. It is recommended that plugins do not call the server-provided */ /* functions directly, but instead use the wrappers provided here by the */ /* CPICP interface. By doing so, various validity checks can be performed */ /* by CPICP, protecting the server from potential nasty effects of passing */ /* it wrong parameter values. */ /*****************************************************************************/ /* That code is placed under the GNU General Public Licence (GPL) */ /* (C)2001-2005 by Chachkoff Yann (Feel free to deliver your complaints) */ /*****************************************************************************/ /* CrossFire, A Multiplayer game for X-windows */ /* */ /* Copyright (C) 2000 Mark Wedel */ /* Copyright (C) 1992 Frank Tore Johansen */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /*****************************************************************************/ #include #include static f_plug_api cfapiSystem_add_string = NULL; static f_plug_api cfapiSystem_find_string = NULL; static f_plug_api cfapiSystem_register_global_event = NULL; static f_plug_api cfapiSystem_remove_string = NULL; static f_plug_api cfapiSystem_unregister_global_event = NULL; static f_plug_api cfapiSystem_strdup_local = NULL; static f_plug_api cfapiSystem_find_animation = NULL; static f_plug_api cfapiSystem_find_face = NULL; static f_plug_api cfapiSystem_log = NULL; static f_plug_api cfapiSystem_get_time = NULL; static f_plug_api cfapiSystem_timer_create = NULL; static f_plug_api cfapiSystem_timer_destroy = NULL; static f_plug_api cfapiSystem_directory = NULL; static f_plug_api cfapiSystem_re_cmp = NULL; static f_plug_api cfapiObject_get_property = NULL; static f_plug_api cfapiObject_set_property = NULL; static f_plug_api cfapiObject_apply = NULL; static f_plug_api cfapiObject_identify = NULL; static f_plug_api cfapiObject_describe = NULL; static f_plug_api cfapiObject_drain = NULL; static f_plug_api cfapiObject_fix = NULL; static f_plug_api cfapiObject_give_skill = NULL; static f_plug_api cfapiObject_transmute = NULL; static f_plug_api cfapiObject_remove = NULL; static f_plug_api cfapiObject_delete = NULL; static f_plug_api cfapiObject_clone = NULL; static f_plug_api cfapiObject_find = NULL; static f_plug_api cfapiObject_create = NULL; static f_plug_api cfapiObject_insert = NULL; static f_plug_api cfapiObject_split = NULL; static f_plug_api cfapiObject_merge = NULL; static f_plug_api cfapiObject_distance = NULL; static f_plug_api cfapiObject_update = NULL; static f_plug_api cfapiObject_clear = NULL; static f_plug_api cfapiObject_reset = NULL; static f_plug_api cfapiCheck_inventory = NULL; static f_plug_api cfapiObject_activate_rune = NULL; static f_plug_api cfapiObject_check_trigger = NULL; static f_plug_api cfapiObject_query_money = NULL; static f_plug_api cfapiObject_query_cost = NULL; static f_plug_api cfapiObject_cast = NULL; static f_plug_api cfapiObject_learn_spell = NULL; static f_plug_api cfapiObject_forget_spell = NULL; static f_plug_api cfapiObject_check_spell = NULL; static f_plug_api cfapiObject_pay_amount = NULL; static f_plug_api cfapiObject_pay_item = NULL; static f_plug_api cfapiObject_transfer = NULL; static f_plug_api cfapiObject_find_archetype_inside = NULL; static f_plug_api cfapiObject_out_of_map = NULL; static f_plug_api cfapiObject_drop = NULL; static f_plug_api cfapiObject_change_abil = NULL; static f_plug_api cfapiObject_say = NULL; static f_plug_api cfapiMap_get_property = NULL; static f_plug_api cfapiMap_set_property = NULL; static f_plug_api cfapiMap_get_map = NULL; static f_plug_api cfapiMap_message = NULL; static f_plug_api cfapiMap_get_object_at = NULL; static f_plug_api cfapiMap_present_arch_by_name = NULL; static f_plug_api cfapiMap_create_path = NULL; static f_plug_api cfapiMap_has_been_loaded = NULL; static f_plug_api cfapiMap_change_light = NULL; static f_plug_api cfapiMap_trigger_connected = NULL; static f_plug_api cfapiPlayer_find = NULL; static f_plug_api cfapiPlayer_message = NULL; static f_plug_api cfapiPlayer_send_inventory = NULL; static f_plug_api cfapiObject_teleport = NULL; static f_plug_api cfapiObject_pickup = NULL; static f_plug_api cfapiObject_get_key = NULL; static f_plug_api cfapiObject_set_key = NULL; static f_plug_api cfapiObject_move = NULL; static f_plug_api cfapiObject_apply_below = NULL; static f_plug_api cfapiArchetype_get_property = NULL; static f_plug_api cfapiParty_get_property = NULL; static f_plug_api cfapiRegion_get_property = NULL; static f_plug_api cfapiPlayer_can_pay = NULL; static f_plug_api cfapiFriendlylist_get_next = NULL; static f_plug_api cfapiSet_random_map_variable = NULL; static f_plug_api cfapiGenerate_random_map = NULL; static f_plug_api cfapiObject_change_exp = NULL; static f_plug_api cfapiSystem_get_month_name = NULL; static f_plug_api cfapiSystem_get_season_name = NULL; static f_plug_api cfapiSystem_get_weekday_name = NULL; static f_plug_api cfapiSystem_get_periodofday_name = NULL; static f_plug_api cfapiObject_user_event = NULL; #define GET_HOOK(x, y, z) { \ getHooks(&z, 1, y, &x); \ if (z != CFAPI_FUNC) { \ printf("unable to find hook %s!\n", y); \ return 0; \ } \ } int cf_init_plugin(f_plug_api getHooks) { int z; GET_HOOK(cfapiSystem_strdup_local, "cfapi_system_strdup_local", z); GET_HOOK(cfapiSystem_add_string, "cfapi_system_add_string", z); GET_HOOK(cfapiSystem_register_global_event, "cfapi_system_register_global_event", z); GET_HOOK(cfapiSystem_remove_string, "cfapi_system_remove_string", z); GET_HOOK(cfapiSystem_directory, "cfapi_system_directory", z); GET_HOOK(cfapiSystem_unregister_global_event, "cfapi_system_unregister_global_event", z); GET_HOOK(cfapiSystem_find_animation, "cfapi_system_find_animation", z); GET_HOOK(cfapiSystem_find_face, "cfapi_system_find_face", z); GET_HOOK(cfapiSystem_re_cmp, "cfapi_system_re_cmp", z); GET_HOOK(cfapiObject_get_property, "cfapi_object_get_property", z); GET_HOOK(cfapiObject_set_property, "cfapi_object_set_property", z); GET_HOOK(cfapiObject_apply, "cfapi_object_apply", z); GET_HOOK(cfapiObject_identify, "cfapi_object_identify", z); GET_HOOK(cfapiObject_describe, "cfapi_object_describe", z); GET_HOOK(cfapiObject_drain, "cfapi_object_drain", z); GET_HOOK(cfapiObject_fix, "cfapi_object_fix", z); GET_HOOK(cfapiObject_give_skill, "cfapi_object_give_skill", z); GET_HOOK(cfapiObject_transmute, "cfapi_object_transmute", z); GET_HOOK(cfapiObject_remove, "cfapi_object_remove", z); GET_HOOK(cfapiObject_delete, "cfapi_object_delete", z); GET_HOOK(cfapiObject_clone, "cfapi_object_clone", z); GET_HOOK(cfapiObject_find, "cfapi_object_find", z); GET_HOOK(cfapiObject_create, "cfapi_object_create", z); GET_HOOK(cfapiObject_insert, "cfapi_object_insert", z); GET_HOOK(cfapiObject_split, "cfapi_object_split", z); GET_HOOK(cfapiObject_merge, "cfapi_object_merge", z); GET_HOOK(cfapiObject_distance, "cfapi_object_distance", z); GET_HOOK(cfapiObject_update, "cfapi_object_update", z); GET_HOOK(cfapiObject_clear, "cfapi_object_clear", z); GET_HOOK(cfapiObject_reset, "cfapi_object_reset", z); GET_HOOK(cfapiObject_activate_rune, "cfapi_object_spring_trap", z); GET_HOOK(cfapiObject_check_trigger, "cfapi_object_check_trigger", z); GET_HOOK(cfapiObject_query_money, "cfapi_object_query_money", z); GET_HOOK(cfapiObject_query_cost, "cfapi_object_query_cost", z); GET_HOOK(cfapiObject_cast, "cfapi_object_cast", z); GET_HOOK(cfapiObject_learn_spell, "cfapi_object_learn_spell", z); GET_HOOK(cfapiObject_forget_spell, "cfapi_object_forget_spell", z); GET_HOOK(cfapiObject_check_spell, "cfapi_object_check_spell", z); GET_HOOK(cfapiObject_pay_amount, "cfapi_object_pay_amount", z); GET_HOOK(cfapiObject_pay_item, "cfapi_object_pay_item", z); GET_HOOK(cfapiObject_transfer, "cfapi_object_transfer", z); GET_HOOK(cfapiObject_find_archetype_inside, "cfapi_object_find_archetype_inside", z); GET_HOOK(cfapiObject_remove, "cfapi_object_remove", z); GET_HOOK(cfapiObject_delete, "cfapi_object_delete", z); GET_HOOK(cfapiObject_out_of_map, "cfapi_map_out_of_map", z); GET_HOOK(cfapiObject_drop, "cfapi_object_drop", z); GET_HOOK(cfapiObject_change_abil, "cfapi_object_change_abil", z); GET_HOOK(cfapiObject_say, "cfapi_object_say", z); GET_HOOK(cfapiMap_create_path, "cfapi_map_create_path", z); GET_HOOK(cfapiMap_get_property, "cfapi_map_get_property", z); GET_HOOK(cfapiMap_set_property, "cfapi_map_set_property", z); GET_HOOK(cfapiMap_get_map, "cfapi_map_get_map", z); GET_HOOK(cfapiMap_message, "cfapi_map_message", z); GET_HOOK(cfapiMap_get_object_at, "cfapi_map_get_object_at", z); GET_HOOK(cfapiMap_present_arch_by_name, "cfapi_map_present_arch_by_name", z); GET_HOOK(cfapiMap_change_light, "cfapi_map_change_light", z); GET_HOOK(cfapiMap_has_been_loaded, "cfapi_map_has_been_loaded", z); GET_HOOK(cfapiMap_trigger_connected, "cfapi_map_trigger_connected", z); GET_HOOK(cfapiPlayer_find, "cfapi_player_find", z); GET_HOOK(cfapiPlayer_message, "cfapi_player_message", z); GET_HOOK(cfapiObject_teleport, "cfapi_object_teleport", z); GET_HOOK(cfapiObject_pickup, "cfapi_object_pickup", z); GET_HOOK(cfapiObject_get_key, "cfapi_object_get_key", z); GET_HOOK(cfapiObject_set_key, "cfapi_object_set_key", z); GET_HOOK(cfapiObject_move, "cfapi_object_move", z); GET_HOOK(cfapiObject_apply_below, "cfapi_object_apply_below", z); GET_HOOK(cfapiArchetype_get_property, "cfapi_archetype_get_property", z); GET_HOOK(cfapiParty_get_property, "cfapi_party_get_property", z); GET_HOOK(cfapiRegion_get_property, "cfapi_region_get_property", z); GET_HOOK(cfapiPlayer_can_pay, "cfapi_player_can_pay", z); GET_HOOK(cfapiSystem_log, "cfapi_log", z); GET_HOOK(cfapiSystem_get_time, "cfapi_system_get_time", z); GET_HOOK(cfapiSystem_timer_create, "cfapi_system_timer_create", z); GET_HOOK(cfapiSystem_timer_destroy, "cfapi_system_timer_destroy", z); GET_HOOK(cfapiFriendlylist_get_next, "cfapi_friendlylist_get_next", z); GET_HOOK(cfapiSet_random_map_variable, "cfapi_set_random_map_variable", z); GET_HOOK(cfapiGenerate_random_map, "cfapi_generate_random_map", z); GET_HOOK(cfapiObject_change_exp, "cfapi_object_change_exp", z); GET_HOOK(cfapiSystem_get_season_name, "cfapi_system_get_season_name", z); GET_HOOK(cfapiSystem_get_month_name, "cfapi_system_get_month_name", z); GET_HOOK(cfapiSystem_get_weekday_name, "cfapi_system_get_weekday_name", z); GET_HOOK(cfapiSystem_get_periodofday_name, "cfapi_system_get_periodofday_name", z); GET_HOOK(cfapiObject_user_event, "cfapi_object_user_event", z); GET_HOOK(cfapiSystem_find_string, "cfapi_system_find_string", z); return 1; } /* Should get replaced by tons of more explicit wrappers */ /*void *cf_map_get_property(mapstruct *map, int propcode) { int type; return cfapiMap_get_property(&type, propcode, map); }*/ int cf_map_get_int_property(mapstruct *map, int property) { int type, value; cfapiMap_get_property(&type, map, property, &value); assert(type == CFAPI_INT); return value; } int cf_object_user_event(object *op, object *activator, object *third, const char *message, int fix) { int type, value; cfapiObject_user_event(&type, op, activator, third, message, fix, &value); assert(type == CFAPI_INT); return value; } sstring cf_map_get_sstring_property(mapstruct *map, int propcode) { int type; sstring value; cfapiMap_get_property(&type, map, propcode, &value); assert(type == CFAPI_SSTRING); return value; } mapstruct *cf_map_get_map_property(mapstruct *map, int propcode) { int type; mapstruct *value; cfapiMap_get_property(&type, map, propcode, &value); assert(type == CFAPI_PMAP); return value; } region *cf_map_get_region_property(mapstruct *map, int propcode) { int type; region *value; cfapiMap_get_property(&type, map, propcode, &value); assert(type == CFAPI_PREGION); return value; } /* Should get replaced by tons of more explicit wrappers */ void cf_map_set_int_property(mapstruct *map, int propcode, int value) { int type; cfapiMap_set_property(&type, map, propcode, value); assert(type == CFAPI_INT); } void cf_map_set_string_property(mapstruct *map, int propcode, const char *value) { int type; cfapiMap_set_property(&type, map, propcode, value); assert(type == CFAPI_STRING); } /* Should get replaced by tons of more explicit wrappers */ sint16 cf_object_get_resistance(object *op, int rtype) { int type; sint16 resist; cfapiObject_get_property(&type, op, CFAPI_OBJECT_PROP_RESIST, rtype, &resist); assert(type == CFAPI_INT16); return resist; } void cf_object_set_resistance(object *op, int rtype, sint16 value) { int type; cfapiObject_set_property(&type, op, CFAPI_OBJECT_PROP_RESIST, rtype, value); assert(type == CFAPI_INT16); } /* Should get replaced by tons of more explicit wrappers */ void cf_object_set_int_property(object *op, int propcode, int value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_INT); } int cf_object_get_int_property(object *op, int propcode) { int type, value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_INT); return value; } long cf_object_get_long_property(object *op, long propcode) { int type; long value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_LONG); return value; } void cf_object_set_movetype_property(object *op, int propcode, MoveType value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_MOVETYPE); } MoveType cf_object_get_movetype_property(object *op, int propcode) { int type; MoveType value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_MOVETYPE); return value; } object *cf_object_get_object_property(object *op, int propcode) { int type; object *value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_POBJECT); return value; } mapstruct *cf_object_get_map_property(object *op, int propcode) { int type; mapstruct *value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_PMAP); return value; } sint64 cf_object_get_int64_property(object *op, int propcode) { int type; sint64 value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_SINT64); return value; } /* Should get replaced by tons of more explicit wrappers */ void cf_object_set_long_property(object *op, int propcode, long value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_LONG); } void cf_object_set_float_property(object *op, int propcode, float value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_FLOAT); } void cf_object_set_int64_property(object *op, int propcode, sint64 value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_SINT64); } float cf_object_get_float_property(object *op, int propcode) { int type; float value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_FLOAT); return value; } archetype *cf_object_get_archetype_property(object *op, int propcode) { int type; archetype *value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_PARCH); return value; } partylist *cf_object_get_partylist_property(object *op, int propcode) { int type; partylist *value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_PPARTY); return value; } double cf_object_get_double_property(object *op, int propcode) { int type; double value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_DOUBLE); return value; } sstring cf_object_get_sstring_property(object *op, int propcode) { int type; sstring value; cfapiObject_get_property(&type, op, propcode, &value); assert(type == CFAPI_SSTRING); return value; } char *cf_object_get_string_property(object *op, int propcode, char *buf, int size) { int type; cfapiObject_get_property(&type, op, propcode, buf, size); assert(type == CFAPI_STRING); return buf; } /* Should get replaced by tons of more explicit wrappers */ void cf_object_set_string_property(object *op, int propcode, const char *value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_STRING); } void cf_object_set_object_property(object *op, int propcode, object *value) { int type; cfapiObject_set_property(&type, op, propcode, value); assert(type == CFAPI_POBJECT); } /** * Wrapper for change_exp(). * @copydoc change_exp(). */ void cf_object_change_exp(object *op, sint64 exp, const char *skill_name, int flag) { int type; cfapiObject_change_exp(&type, op, exp, skill_name && strlen(skill_name) > 0 ? skill_name : NULL, flag); assert(type == CFAPI_NONE); } int cf_player_move(player *pl, int dir) { int type, ret; cfapiObject_move(&type, 1, pl, dir, &ret); assert(type == CFAPI_INT); return ret; } int cf_object_move(object *op, int dir, object*originator) { int type, ret; cfapiObject_move(&type, 0, op, dir, originator, &ret); assert(type == CFAPI_INT); return ret; } /** * Wrapper for manual_apply(). * @copydoc manual_apply() */ int cf_object_apply(object *op, object *tmp, int aflag) { int type, ret; cfapiObject_apply(&type, op, tmp, aflag, &ret); return ret; } /** * Wrapper for player_apply_below(). * @copydoc player_apply_below() */ void cf_object_apply_below(object *pl) { int type; cfapiObject_apply_below(&type, pl); } /** * Wrapper for remove_ob(). * @copydoc remove_ob() */ void cf_object_remove(object *op) { int type; cfapiObject_remove(&type, op); } /** * Wrapper for free_object(). * @copydoc free_object() */ void cf_object_free(object *ob) { int type; cfapiObject_delete(&type, ob); } /** * Kinda wrapper for present_arch_in_ob(). */ object *cf_object_present_archname_inside(object *op, char *whatstr) { int type; object *value; cfapiObject_find_archetype_inside(&type, op, whatstr, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for transfer_ob(). * @copydoc transfer_ob() */ int cf_object_transfer(object *op, int x, int y, int randomly, object *originator) { int type, value; cfapiObject_transfer(&type, op, 0, x, y, randomly, originator, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for move_to(). * @copydoc move_to() */ int cf_object_move_to(object *op, int x, int y) { int type, value; cfapiObject_transfer(&type, op, 2, x, y, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for insert_ob_in_map_at(). * @copydoc insert_ob_in_map_at(). */ object *cf_object_change_map(object *op, mapstruct *m, object *originator, int flag, int x, int y) { int type; object *value; cfapiObject_transfer(&type, op, 1, m, originator, flag, x, y, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for GET_MAP_OB(). * @copydoc GET_MAP_OB() */ object *cf_map_get_object_at(mapstruct *m, int x, int y) { int type; object *value; cfapiMap_get_object_at(&type, m, x, y, &value); assert(type == CFAPI_POBJECT); return value; } /** * Partial wrapper for ext_info_map(). * @todo add missing parameters. */ void cf_map_message(mapstruct *m, const char *msg, int color) { int type; cfapiMap_message(&type, m, msg, color); } /** * Clone an object. * @param op * what to clone. * @param clonetype * - 0 means to clone through object_create_clone(). * - 1 means to clone through copy_object(). * @return * clone. */ object *cf_object_clone(object *op, int clonetype) { int type; object *value; cfapiObject_clone(&type, op, clonetype, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for pay_for_item(). * @copydoc pay_for_item(). */ int cf_object_pay_item(object *op, object *pl) { int type, value; cfapiObject_pay_item(&type, op, pl, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for pay_for_amount(). * @copydoc pay_for_amount(). */ int cf_object_pay_amount(object *pl, uint64 to_pay) { int type, value; cfapiObject_pay_amount(&type, pl, to_pay, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for cast_spell(). * @copydoc cast_spell(). */ int cf_object_cast_spell(object *op, object *caster, int dir, object *spell_ob, char *stringarg) { int type, value; cfapiObject_cast(&type, op, caster, dir, spell_ob, stringarg, &value); assert(type == CFAPI_INT); return value; } /** * Should there be a difference nowadays between that and cast_spell ? * @todo * either totally remove or replace by cf_object_cast_spell(). */ int cf_object_cast_ability(object *caster, object *ctoo, int dir, object *sp, char *flags) { int type, value; cfapiObject_cast(&type, caster, ctoo, dir, sp, flags, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for do_learn_spell(). * @copydoc do_learn_spell(). */ void cf_object_learn_spell(object *op, object *spell, int special_prayer) { int type; cfapiObject_learn_spell(&type, op, spell, special_prayer); assert(type == CFAPI_NONE); } /** * Wrapper for do_forget_spell(), except takes an object, not a string. * @todo * make coherent with do_forget_spell() (string instead of ob). */ void cf_object_forget_spell(object *op, object *sp) { int type; cfapiObject_forget_spell(&type, op, sp); } /** * Wrapper for check_spell_known(). * @copydoc check_spell_known() */ object *cf_object_check_for_spell(object *op, const char *name) { int type; object *value; cfapiObject_check_spell(&type, op, name, &value); assert(type == CFAPI_POBJECT); return value; } void cf_player_message(object *op, char *txt, int flags) { int type; cfapiPlayer_message(&type, flags, 0, op, txt); assert(type == CFAPI_NONE); } /** * Wrapper for find_player_partial_name(). * @copydoc find_player_partial_name(). */ player *cf_player_find(const char *plname) { int type; player *value; cfapiPlayer_find(&type, plname, &value); assert(type == CFAPI_PPLAYER); return value; } sstring cf_player_get_title(object *op) { int type; sstring value; cfapiObject_get_property(&type, op, CFAPI_PLAYER_PROP_TITLE, &value); assert(type == CFAPI_SSTRING); return value; } void cf_player_set_title(object *op, const char *title) { int type; cfapiObject_set_property(&type, op, CFAPI_PLAYER_PROP_TITLE, title); } sstring cf_player_get_ip(object *op) { int type; sstring value; cfapiObject_get_property(&type, op, CFAPI_PLAYER_PROP_IP, &value); assert(type == CFAPI_SSTRING); return value; } object *cf_player_get_marked_item(object *op) { int type; object *value; cfapiObject_get_property(&type, op, CFAPI_PLAYER_PROP_MARKED_ITEM, &value); assert(type == CFAPI_POBJECT); return value; } void cf_player_set_marked_item(object *op, object *ob) { int type; cfapiObject_set_property(&type, op, CFAPI_PLAYER_PROP_MARKED_ITEM, ob); } partylist *cf_player_get_party(object *op) { return cf_object_get_partylist_property(op, CFAPI_PLAYER_PROP_PARTY); } void cf_player_set_party(object *op, partylist *party) { int type; cfapiObject_set_property(&type, op, CFAPI_PLAYER_PROP_PARTY, party); } /** * Wrapper for can_pay(). * @copydoc can_pay(). */ int cf_player_can_pay(object *pl) { int type, value; cfapiPlayer_can_pay(&type, pl, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for ready_map_name(). * @copydoc ready_map_name() */ mapstruct *cf_map_get_map(const char *name, int flags) { int type; mapstruct *ret; cfapiMap_get_map(&type, 1, name, flags, &ret); assert(type == CFAPI_PMAP); return ret; } /** * Wrapper for get_empty_map(). * @copydoc get_empty_map(). */ mapstruct *cf_get_empty_map(int sizex, int sizey) { int type; mapstruct *ret; cfapiMap_get_map(&type, 0, sizex, sizey, &ret); assert(type == CFAPI_PMAP); return ret; } /** * Wrapper for has_been_loaded(). * @copydoc has_been_loaded() */ mapstruct *cf_map_has_been_loaded(const char *name) { int type; mapstruct *ret; cfapiMap_has_been_loaded(&type, name, &ret); assert(type == CFAPI_PMAP); return ret; } /** * Gives access to ::first_map. * @return * ::first_map. */ mapstruct *cf_map_get_first(void) { return cf_map_get_map_property(NULL, CFAPI_MAP_PROP_NEXT); } /** * Wrapper for query_money(). * @copydoc query_money(). */ int cf_object_query_money(const object *op) { int type, value; cfapiObject_query_money(&type, op, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for query_cost(). * @copydoc query_cost(). */ int cf_object_query_cost(const object *tmp, object *who, int flag) { int type, value; cfapiObject_query_cost(&type, tmp, who, flag, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for spring_trap(). * @copydoc spring_trap(). */ void cf_spring_trap(object *trap, object *victim) { int type; if (trap) cfapiObject_activate_rune(&type, trap, victim); } /** * Wrapper for check_trigger(). * @copydoc check_trigger(). */ int cf_object_check_trigger(object *op, object *cause) { int type, value; cfapiObject_check_trigger(&type, op, cause, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for trigger_connected(). * @copydoc trigger_connected(). */ void cf_map_trigger_connected(objectlink *ol, object *cause, int state) { int type; cfapiMap_trigger_connected(&type, ol, cause, state); assert(type == CFAPI_NONE); } int cf_object_out_of_map(object *op, int x, int y) { int type, value; cfapiObject_out_of_map(&type, op->map, x, y, &value); assert(type == CFAPI_INT); return value; } void cf_object_drop(object *op, object *author) { int type; cfapiObject_drop(&type, op, author); } void cf_object_say(object *op, char *msg) { int type, value; cfapiObject_say(&type, op, msg, &value); assert(type == CFAPI_INT); } object *cf_object_insert_object(object *op, object *container) { int type; object *value; cfapiObject_insert(&type, op, 3, container, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for create_pathname(). * @copydoc create_pathname() */ char *cf_get_maps_directory(const char *name, char *buf, int size) { int type; cfapiMap_create_path(&type, 0, name, buf, size); assert(type == CFAPI_STRING); return buf; } /** * Wrapper for get_object(). * @copydoc get_object(). */ object *cf_create_object(void) { int type; object *value; cfapiObject_create(&type, 0, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for create_archetype() and create_archetype_by_object_name(). */ object *cf_create_object_by_name(const char *name) { int type; object *value; cfapiObject_create(&type, 1, name, &value); assert(type == CFAPI_POBJECT); return value; } void cf_system_register_global_event(int event, const char *name, f_plug_api hook) { int type; cfapiSystem_register_global_event(&type, event, name, hook); assert(type == CFAPI_NONE); } void cf_system_unregister_global_event(int event, const char *name) { int type; cfapiSystem_unregister_global_event(&type, event, name); assert(type == CFAPI_NONE); } /** * Gets a directory Crossfire uses. * @param id * what directory to return: * -# @copydoc Settings::mapdir * -# @copydoc Settings::uniquedir * -# @copydoc Settings::tmpdir * -# @copydoc Settings::confdir * -# @copydoc Settings::localdir * -# @copydoc Settings::playerdir * -# @copydoc Settings::datadir * @return * directory. Must not be altered. NULL if invalid value. */ const char *cf_get_directory(int id) { int type; const char *ret; cfapiSystem_directory(&type, id, &ret); assert(type == CFAPI_STRING); return ret; } /** * Wrapper for re_cmp(). * @copydoc re_cmp() */ const char *cf_re_cmp(const char *str, const char *regexp) { int type; const char *result; cfapiSystem_re_cmp(&type, str, regexp, &result); assert(type == CFAPI_STRING); return result; } /** * Wrapper for fix_object(). * @copydoc fix_object() */ void cf_fix_object(object *op) { int type; if (op) cfapiObject_fix(&type, op); } /** * Wrapper for add_string(). * @copydoc add_string() */ sstring cf_add_string(const char *str) { int type; sstring ret; if (!str) return NULL; cfapiSystem_add_string(&type, str, &ret); assert(type == CFAPI_SSTRING); return ret; } /** * Wrapper for free_string(). * @copydoc free_string() */ void cf_free_string(sstring str) { int type; if (str) cfapiSystem_remove_string(&type, str); } sstring cf_find_string(const char *str) { int type; sstring ret; if (!str) return NULL; cfapiSystem_find_string(&type, str, &ret); assert(type == CFAPI_SSTRING); return ret; } char *cf_query_name(object *ob, char *name, int size) { int type; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_NAME, name, size); assert(type == CFAPI_STRING); return name; } sstring cf_query_name_pl(object *ob) { int type; sstring value; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_NAME_PLURAL, &value); assert(type == CFAPI_SSTRING); return value; } char *cf_query_base_name(object *ob, int plural, char *name, int size) { int type; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_BASE_NAME, name, size); assert(type == CFAPI_STRING); return name; } sstring cf_object_get_msg(object *ob) { int type; sstring value; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_MESSAGE, &value); assert(type == CFAPI_SSTRING); return value; } void cf_object_set_weight(object *ob, int weight) { int type; cfapiObject_set_property(&type, ob, CFAPI_OBJECT_PROP_WEIGHT, weight); assert(type == CFAPI_INT); } void cf_object_set_weight_limit(object *ob, int weight_limit) { int type; cfapiObject_set_property(&type, ob, CFAPI_OBJECT_PROP_WEIGHT_LIMIT, weight_limit); assert(type == CFAPI_INT); } int cf_object_get_weight(object *ob) { int type, weight; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_WEIGHT, &weight); assert(type == CFAPI_INT); return weight; } int cf_object_get_weight_limit(object *ob) { int type, limit; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_WEIGHT_LIMIT, &limit); assert(type == CFAPI_INT); return limit; } /** * @return -1=nrof is invalid, 0=nrof is ok# */ int cf_object_set_nrof(object *ob, int nrof) { int type; if (nrof < 0) return -1; cfapiObject_set_property(&type, ob, CFAPI_OBJECT_PROP_NROF, nrof); return 0; } int cf_object_get_nrof(object *ob) { int type, nrof; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_NROF, &nrof); return nrof; } int cf_object_get_flag(object *ob, int flag) { int type; int rv; cfapiObject_get_property(&type, ob, CFAPI_OBJECT_PROP_FLAGS, flag, &rv); if (rv != 0) return 1; else return 0; } void cf_object_set_flag(object *ob, int flag, int value) { int type; cfapiObject_set_property(&type, ob, CFAPI_OBJECT_PROP_FLAGS, flag, value ? 1 : 0); } /** * Wrapper for insert_ob_in_ob(). * @copydoc insert_ob_in_ob(). */ object *cf_object_insert_in_ob(object *op, object *where) { int type; object *value; if (!cf_object_get_flag(op, FLAG_REMOVED)) { cfapiObject_remove(&type, op); } cfapiObject_insert(&type, op, 3, where, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for insert_ob_in_map(). * @copydoc insert_ob_in_map(). */ object *cf_map_insert_object_there(object *op, mapstruct *m, object *originator, int flag) { int type; object *value; cfapiObject_insert(&type, op, 1, m, originator, flag, &value); assert(type == CFAPI_POBJECT); return value; } /** * Wrapper for insert_ob_in_map_at(). * @todo * merge/replace with cf_object_change_map */ object *cf_map_insert_object(mapstruct *where, object *op, int x, int y) { int type; object *value; cfapiObject_insert(&type, op, 0, where, NULL, 0 , x, y, &value); assert(type == CFAPI_POBJECT); return value; } int cf_object_teleport(object *op, mapstruct *map, int x, int y) { int type, value; cfapiObject_teleport(&type, op, map, x, y, &value); assert(type == CFAPI_INT); return value; } /** * Kinda wrapper for arch_present(). */ object *cf_map_present_arch_by_name(const char *str, mapstruct *map, int nx, int ny) { int type; object *value; cfapiMap_present_arch_by_name(&type, str, map, nx, ny, &value); assert(type == CFAPI_POBJECT); return value; } int cf_map_get_difficulty(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_DIFFICULTY); } int cf_map_get_reset_time(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_RESET_TIME); } int cf_map_get_reset_timeout(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_RESET_TIMEOUT); } int cf_map_get_players(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_PLAYERS); } int cf_map_get_darkness(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_DARKNESS); } int cf_map_get_width(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_WIDTH); } int cf_map_get_height(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_HEIGHT); } int cf_map_get_enter_x(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_ENTER_X); } int cf_map_get_enter_y(mapstruct *map) { return cf_map_get_int_property(map, CFAPI_MAP_PROP_ENTER_Y); } /** * Wrapper for change_map_light(). * @copydoc change_map_light(). */ int cf_map_change_light(mapstruct *m, int change) { int type, value; cfapiMap_change_light(&type, m, change, &value); assert(type == CFAPI_INT); return value; } void cf_object_update(object *op, int flags) { int type; cfapiObject_update(&type, op, flags); } void cf_object_pickup(object *op, object *what) { int type; cfapiObject_pickup(&type, op, what); assert(type == CFAPI_NONE); } /** * Wrapper for strdup_local(). * * @copydoc strdup_local(). */ char *cf_strdup_local(const char *str) { int type; char *dup; if (str == NULL) return NULL; cfapiSystem_strdup_local(&type, str, &dup); assert(type == CFAPI_STRING); return dup; } /** * Wrapper for get_map_flags(). * @copydoc get_map_flags() */ int cf_map_get_flags(mapstruct *oldmap, mapstruct **newmap, sint16 x, sint16 y, sint16 *nx, sint16 *ny) { int type, value; cfapiMap_get_property(&type, oldmap, CFAPI_MAP_PROP_FLAGS, newmap, x, y, nx, ny, &value); assert(type == CFAPI_INT); return value; } /** * Wrapper for set_random_map_variable(). * @copydoc set_random_map_variable() */ int cf_random_map_set_variable(RMParms *rp, const char *buf) { int type, ret; cfapiSet_random_map_variable(&type, rp, buf, &ret); assert(type == CFAPI_INT); return ret; } /** * Wrapper for generate_random_map(). * @copydoc generate_random_map() */ mapstruct *cf_random_map_generate(const char *OutFileName, RMParms *RP, char **use_layout) { int type; mapstruct *map; cfapiGenerate_random_map(&type, OutFileName, RP, use_layout, &map); assert(type == CFAPI_PMAP); return map; } /** * Wrapper for find_animation(). * @copydoc find_animation(). */ int cf_find_animation(const char *name) { int type, anim; cfapiSystem_find_animation(&type, name, &anim); assert(type == CFAPI_INT); return anim; } /** * Wrapper for find_face(). * @copydoc find_face(). */ int cf_find_face(const char *name, int error) { int type, anim; cfapiSystem_find_face(&type, name, error, &anim); assert(type == CFAPI_INT); return anim; } /** * Wrapper for LOG(). * @copydoc LOG(). */ void cf_log(LogLevel logLevel, const char *format, ...) { int type; /* Copied from common/logger.c */ char buf[20480]; /* This needs to be really really big - larger than any other buffer, since that buffer may need to be put in this one. */ va_list ap; va_start(ap, format); buf[0] = '\0'; vsprintf(buf, format, ap); va_end(ap); cfapiSystem_log(&type, logLevel, buf); assert(type == CFAPI_NONE); } /** * Wrapper for LOG() that * uses directly a buffer, without format */ void cf_log_plain(LogLevel logLevel, const char *message) { int type; cfapiSystem_log(&type, logLevel, message); assert(type == CFAPI_NONE); } void cf_get_time(timeofday_t *tod) { int type; cfapiSystem_get_time(&type, tod); assert(type == CFAPI_NONE); } const char *cf_get_season_name(int index) { int type; char *result; cfapiSystem_get_season_name(&type, index, &result); assert(type == CFAPI_STRING); return result; } const char *cf_get_month_name(int index) { int type; char *result; cfapiSystem_get_month_name(&type, index, &result); assert(type == CFAPI_STRING); return result; } const char *cf_get_weekday_name(int index) { int type; char *result; cfapiSystem_get_weekday_name(&type, index, &result); assert(type == CFAPI_STRING); return result; } const char *cf_get_periodofday_name(int index) { int type; char *result; cfapiSystem_get_periodofday_name(&type, index, &result); assert(type == CFAPI_STRING); return result; } /** * Creates a timer, equivalent of calling cftimer_create(). * * @param ob * ::object that will get called. Should handle ::EVENT_TIMER. * @param delay * delay, seconds or ticks. * @param mode * timer mode, ::TIMER_MODE_SECONDS or ::TIMER_MODE_CYCLES * @return * timer identifier, or one of ::TIMER_ERR_ID, ::TIMER_ERR_OBJ or ::TIMER_ERR_MODE */ int cf_timer_create(object *ob, long delay, int mode) { int type, timer; cfapiSystem_timer_create(&type, ob, delay, mode, &timer); assert(type == CFAPI_INT); return timer; } /** * Destroys specified timer, equivalent of calling cftimer_destroy(). * * @param id * timer to destroy * @return * ::TIMER_ERR_ID if invalid id, ::TIMER_ERR_NONE else. */ int cf_timer_destroy(int id) { int type, code; cfapiSystem_timer_destroy(&type, id, &code); assert(type == CFAPI_INT); return code; } /** * Gets value for specified key, equivalent of get_ob_key_value(). * @param op * ::object for which we search a key. * @param keyname * key to look for. Not required to be a shared string. * @return * value (shared string), or NULL if not found. */ const char *cf_object_get_key(object *op, const char *keyname) { int type; const char *value; cfapiObject_get_key(&type, op, keyname, &value); assert(type == CFAPI_SSTRING); return value; } /** * Sets a value for specified key, equivalent to set_ob_key_value(). * @param op * ::object which will contain the key/value * @param keyname * key * @param value * value * @param add_key * if 0, key is only updated if it exists, else it's updated or added. * @return * TRUE or FALSE. */ int cf_object_set_key(object *op, const char *keyname, const char *value, int add_key) { int type, ret; cfapiObject_set_key(&type, op, keyname, value, add_key, &ret); assert(type == CFAPI_INT); return ret; } /** * Wrapper for change_abil(). * @copydoc change_abil(). */ int cf_object_change_abil(object *op, object *tmp) { int type, ret; cfapiObject_change_abil(&type, op, tmp, &ret); assert(type == CFAPI_INT); return ret; } /* Archetype-related functions */ /** * Get first archetype. * @return * first archetype in the archetype list. */ archetype *cf_archetype_get_first(void) { int type; archetype *value; cfapiArchetype_get_property(&type, NULL, CFAPI_ARCH_PROP_NEXT, &value); assert(type == CFAPI_PARCH); return value; } /** * Get archetype's name. * @param arch * archetype, mustn't be NULL. * @return * archetype's name. */ sstring cf_archetype_get_name(archetype *arch) { int type; sstring name; cfapiArchetype_get_property(&type, arch, CFAPI_ARCH_PROP_NAME, &name); assert(type == CFAPI_SSTRING); return name; } /** * Get next archetype in linked list. * @param arch * archetype for which we want the next. Can be NULL, in which case it is equivalent * to calling cf_archetype_get_first(). * @return * next archetype. */ archetype *cf_archetype_get_next(archetype *arch) { int type; archetype *value; cfapiArchetype_get_property(&type, arch, CFAPI_ARCH_PROP_NEXT, &value); assert(type == CFAPI_PARCH); return value; } /** * Get next part of archetype. * @param arch * archetype, mustn't be NULL. * @return * archetype's more field. */ archetype *cf_archetype_get_more(archetype *arch) { int type; archetype *value; cfapiArchetype_get_property(&type, arch, CFAPI_ARCH_PROP_MORE, &value); assert(type == CFAPI_PARCH); return value; } /** * Get head of archetype. * @param arch * archetype, mustn't be NULL. * @return * archetype's head field. */ archetype *cf_archetype_get_head(archetype *arch) { int type; archetype *value; cfapiArchetype_get_property(&type, arch, CFAPI_ARCH_PROP_HEAD, &value); assert(type == CFAPI_PARCH); return value; } /** * Get clone of archetype. * @param arch * archetype, mustn't be NULL. * @return * archetype's clone. Will never be NULL. */ object *cf_archetype_get_clone(archetype *arch) { int type; object *value; cfapiArchetype_get_property(&type, arch, CFAPI_ARCH_PROP_CLONE, &value); assert(type == CFAPI_POBJECT); return value; } /* Party-related functions */ /** * Get first party. * @return * first party in partylist. */ partylist *cf_party_get_first(void) { int type; partylist *value; cfapiParty_get_property(&type, NULL, CFAPI_PARTY_PROP_NEXT, &value); assert(type == CFAPI_PPARTY); return value; } /** * @param party * party, mustn't be NULL. * @return * party's name. */ const char *cf_party_get_name(partylist *party) { int type; sstring value; cfapiParty_get_property(&type, party, CFAPI_PARTY_PROP_NAME, &value); assert(type == CFAPI_SSTRING); return value; } /** * Get next party in party list. * @param party * party, can be NULL in which case behaves like cf_party_get_first(). * @return * party's next field. */ partylist *cf_party_get_next(partylist *party) { int type; partylist *value; cfapiParty_get_property(&type, party, CFAPI_PARTY_PROP_NEXT, &value); assert(type == CFAPI_PPARTY); return value; } /** * Get party's password. * @param party * party, mustn't be NULL. * @return * party's password field. */ const char *cf_party_get_password(partylist *party) { int type; sstring value; cfapiParty_get_property(&type, party, CFAPI_PARTY_PROP_PASSWORD, &value); assert(type == CFAPI_SSTRING); return value; } /** * Get first player in party. * @param party * party, mustn't be NULL. * @return * party's first player. */ player *cf_party_get_first_player(partylist *party) { int type; player *value; cfapiParty_get_property(&type, party, CFAPI_PARTY_PROP_PLAYER, NULL, &value); assert(type == CFAPI_PPLAYER); return value; } /** * Get next player in party. * @param party * party, mustn't be NULL. * @param op * player we want the next of. Can be NULL, in this case behaves like cf_party_get_first_player(). * @return * party's name. */ player *cf_party_get_next_player(partylist *party, player *op) { int type; player *value; cfapiParty_get_property(&type, party, CFAPI_PARTY_PROP_PLAYER, op, &value); assert(type == CFAPI_PPLAYER); return value; } /** * Get first region in region list. * @return * first region. */ region *cf_region_get_first(void) { int type; region *value; cfapiRegion_get_property(&type, NULL, CFAPI_REGION_PROP_NEXT, &value); assert(type == CFAPI_PREGION); return value; } /** * Get name of region. * @param reg * region. Mustn't be NULL. * @return * region's name. */ const char *cf_region_get_name(region *reg) { int type; sstring value; cfapiRegion_get_property(&type, reg, CFAPI_REGION_PROP_NAME, &value); assert(type == CFAPI_SSTRING); return value; } /** * Get next region in region list. * @param reg * region. Can be NULL in which case equivalent of cf_region_get_first(). * @return * next region. */ region *cf_region_get_next(region *reg) { int type; region *value; cfapiRegion_get_property(&type, reg, CFAPI_REGION_PROP_NEXT, &value); assert(type == CFAPI_PREGION); return value; } /** * Get parent of region. * @param reg * region. Mustn't be NULL. * @return * region's parent. */ region *cf_region_get_parent(region *reg) { int type; region *value; cfapiRegion_get_property(&type, reg, CFAPI_REGION_PROP_PARENT, &value); assert(type == CFAPI_PREGION); return value; } /** * Get longname of region. * @param reg * region. Mustn't be NULL. * @return * region's longname. */ const char *cf_region_get_longname(region *reg) { int type; sstring value; cfapiRegion_get_property(&type, reg, CFAPI_REGION_PROP_LONGNAME, &value); assert(type == CFAPI_SSTRING); return value; } /** * Get message of region. * @param reg * region. Mustn't be NULL. * @return * region's message. */ const char *cf_region_get_message(region *reg) { int type; sstring value; cfapiRegion_get_property(&type, reg, CFAPI_REGION_PROP_MESSAGE, &value); assert(type == CFAPI_SSTRING); return value; } /* Friendlylist functions. */ /** * Get first object on friendly list. * @return * first object on friendly list. */ object *cf_friendlylist_get_first(void) { int type; object *value; cfapiFriendlylist_get_next(&type, NULL, &value); assert(type == CFAPI_POBJECT); return value; } /** * Get next object on friendly list. * @param ob * object we want the next of. If NULL then equivalent of cf_friendlylist_get_first(). * @return * next object. */ object *cf_friendlylist_get_next(object *ob) { int type; object *value; cfapiFriendlylist_get_next(&type, ob, &value); assert(type == CFAPI_POBJECT); return value; } #ifdef WIN32 int gettimeofday(struct timeval *time_Info, struct timezone *timezone_Info) { /* Get the time, if they want it */ if (time_Info != NULL) { time_Info->tv_sec = time(NULL); time_Info->tv_usec = timeGetTime()*1000; } /* Get the timezone, if they want it */ if (timezone_Info != NULL) { _tzset(); timezone_Info->tz_minuteswest = _timezone; timezone_Info->tz_dsttime = _daylight; } /* And return */ return 0; } #endif