Example #1
0
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);
}
Example #4
0
/**
 * 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;
}