server-1.12/plugins/common/plugin_common.c

1833 lines
49 KiB
C

/*****************************************************************************/
/* 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 <plugin_common.h>
#include <assert.h>
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