struct Thing *get_creature_in_training_room_which_could_accept_partner(struct Room *room, struct Thing *partnertng) { struct CreatureControl *cctrl; struct Thing *thing; unsigned long k; long i; TRACE_THING(partnertng); i = room->creatures_list; k = 0; while (i != 0) { thing = thing_get(i); TRACE_THING(thing); cctrl = creature_control_get_from_thing(thing); if (!creature_control_exists(cctrl)) { ERRORLOG("Jump to invalid creature %d detected",(int)i); break; } i = cctrl->next_in_room; // Per creature code if (thing != partnertng) { if ( (get_creature_state_besides_move(thing) == CrSt_Training) && (cctrl->training.partner_idx == 0) ) { if (get_room_thing_is_on(thing) == room) { return thing; } else { WARNLOG("The %s pretends to be in room but it's not.",thing_model_name(thing)); } } } // Per creature code ends k++; if (k > THINGS_COUNT) { ERRORLOG("Infinite loop detected when sweeping creatures list"); break; } } return INVALID_THING; }
struct Thing *find_prisoner_for_thing(struct Thing *creatng) { struct CreatureControl *cctrl; struct Thing *thing; unsigned long k; long i; TRACE_THING(creatng); struct Room *room; room = INVALID_ROOM; if (!is_neutral_thing(creatng)) { room = find_nearest_room_for_thing_with_used_capacity(creatng, creatng->owner, RoK_PRISON, NavRtF_Default, 1); } if (room_exists(room)) { i = room->creatures_list; } else { i = 0; } struct Thing *out_creatng; long out_delay; out_creatng = INVALID_THING; out_delay = LONG_MAX; k = 0; while (i != 0) { thing = thing_get(i); TRACE_THING(thing); cctrl = creature_control_get_from_thing(thing); if (!creature_control_exists(cctrl)) { ERRORLOG("Jump to invalid creature %ld detected",i); break; } i = cctrl->next_in_room; // Per creature code long dist, durt; dist = get_2d_box_distance(&creatng->mappos, &thing->mappos); if (out_delay < 0) { // If we have a victim which isn't frozen, accept only other unfrozen creatures if ((dist <= LONG_MAX) && !creature_affected_by_spell(thing, SplK_Freeze)) { out_creatng = thing; out_delay = -1; } } else if (creature_affected_by_spell(thing, SplK_Freeze)) { // If the victim is frozen, select one which will unfreeze sooner durt = get_spell_duration_left_on_thing(thing, SplK_Freeze); if ((durt > 0) && (out_delay > durt)) { out_creatng = thing; out_delay = durt; } } else { // Found first unfrozen victim - change out_delay to mark thet we no longer want frozen ones out_creatng = thing; out_delay = -1; } // Per creature code ends k++; if (k > THINGS_COUNT) { ERRORLOG("Infinite loop detected when sweeping creatures list"); break; } } return out_creatng; }
TbBool creature_control_exists_in_thing(const struct Thing *thing) { return creature_control_exists(creature_control_get_from_thing(thing)); }