TbBool creature_can_freeze_prisoners_for_player(const struct Thing *creatng, PlayerNumber plyr_idx, CreatureJob new_job) { // To freeze prisoners, our prison can't be empty struct Room *room; room = find_room_for_thing_with_used_capacity(creatng, creatng->owner, get_room_for_job(Job_FREEZE_PRISONERS), NavRtF_Default, 1); return creature_instance_is_available(creatng, CrInst_FREEZE) && !room_is_invalid(room); }
TbBool creature_move_to_using_teleport(struct Thing *thing, struct Coord3d *pos, long walk_speed) { struct CreatureControl *cctrl; short destination_valid; cctrl = creature_control_get_from_thing(thing); if (creature_instance_is_available(thing, CrInst_TELEPORT) && creature_instance_has_reset(thing, CrInst_TELEPORT) && (cctrl->instance_id == CrInst_NULL)) { // Creature can only be teleported to a revealed location destination_valid = true; if (!is_hero_thing(thing) && !is_neutral_thing(thing)) { destination_valid = subtile_revealed(pos->x.stl.num, pos->y.stl.num, thing->owner); } if (destination_valid) { // Use teleport only over large enough distances if (get_2d_box_distance(&thing->mappos, pos) > COORD_PER_STL*game.min_distance_for_teleport) { set_creature_instance(thing, CrInst_TELEPORT, 1, 0, pos); return true; } } } return false; }
long gfa_controlled_creature_has_instance(struct GuiBox *gbox, struct GuiBoxOption *goptn, long *tag) { struct PlayerInfo *player; struct Thing *thing; player = get_my_player(); if ((player->controlled_thing_idx <= 0) || (player->controlled_thing_idx >= THINGS_COUNT)) return false; thing = thing_get(player->controlled_thing_idx); return creature_instance_is_available(thing, *tag); }
/** * For position in compacted list of instances, gives instance ID from availability list. * Compacted list of instances is a list of available creature instances without holes. * @param thing * @param req_avail_pos * @return */ CrInstance creature_instance_get_available_id_for_pos(struct Thing *thing, int req_avail_pos) { struct CreatureStats *crstat; crstat = creature_stats_get_from_thing(thing); int avail_pos; avail_pos = 0; int avail_num; for (avail_num=0; avail_num < CREATURE_MAX_LEVEL; avail_num++) { CrInstance inst_id; inst_id = crstat->instance_spell[avail_num]; if (creature_instance_is_available(thing, inst_id)) { if (avail_pos == req_avail_pos) { return inst_id; } avail_pos++; } } return CrInst_NULL; }
/** * Given instance ID, returns its position in compacted list of instances. * Compacted list of instances is a list of available creature instances without holes. * @param thing * @param req_inst_id * @return */ int creature_instance_get_available_pos_for_id(struct Thing *thing, CrInstance req_inst_id) { struct CreatureStats *crstat; crstat = creature_stats_get_from_thing(thing); int avail_pos; avail_pos = 0; int avail_num; for (avail_num = 0; avail_num < CREATURE_MAX_SPELL; avail_num++) { CrInstance inst_id; inst_id = crstat->instance_spell_id[avail_num]; if (creature_instance_is_available(thing, inst_id)) { if (inst_id == req_inst_id) { return avail_pos; } avail_pos++; } } return -1; }