void set_thing_draw(struct Thing *thing, long anim, long speed, long scale, char a5, char start_frame, unsigned char draw_class) { unsigned long i; thing->anim_sprite = convert_td_iso(anim); thing->field_50 &= 0x03; thing->field_50 |= (draw_class << 2); thing->field_49 = keepersprite_frames(thing->anim_sprite); if (speed != -1) { thing->field_3E = speed; } if (scale != -1) { thing->sprite_size = scale; } if (a5 != -1) { set_flag_byte(&thing->field_4F, TF4F_Unknown40, a5); } if (start_frame == -2) { i = keepersprite_frames(thing->anim_sprite) - 1; thing->field_48 = i; thing->field_40 = i << 8; } else if (start_frame == -1) { i = ACTION_RANDOM(thing->field_49); thing->field_48 = i; thing->field_40 = i << 8; } else { i = start_frame; thing->field_48 = i; thing->field_40 = i << 8; } }
long creature_add_lair_to_room(struct Thing *creatng, struct Room *room) { struct Thing *lairtng; if (!room_has_enough_free_capacity_for_creature(room, creatng)) return 0; //return _DK_creature_add_lair_to_room(thing, room); // Make sure we don't already have a lair on that position lairtng = find_creature_lair_at_subtile(creatng->mappos.x.stl.num, creatng->mappos.y.stl.num, 0); if (!thing_is_invalid(lairtng)) return 0; struct CreatureStats *crstat; struct CreatureControl *cctrl; crstat = creature_stats_get_from_thing(creatng); cctrl = creature_control_get_from_thing(creatng); room->content_per_model[creatng->model]++; room->used_capacity += crstat->lair_size; if ((cctrl->lair_room_id > 0) && (cctrl->lairtng_idx > 0)) { struct Room *room; room = room_get(cctrl->lair_room_id); creature_remove_lair_from_room(creatng, room); } cctrl->lair_room_id = room->index; // Create the lair thing struct CreatureData *crdata; struct Coord3d pos; pos.x.val = creatng->mappos.x.val; pos.y.val = creatng->mappos.y.val; pos.z.val = creatng->mappos.z.val; crdata = creature_data_get_from_thing(creatng); lairtng = create_object(&pos, crdata->field_1, creatng->owner, -1); if (thing_is_invalid(lairtng)) { ERRORLOG("Could not create lair totem"); remove_thing_from_mapwho(creatng); place_thing_in_mapwho(creatng); return 1; // Return that so we won't try to redo the action over and over } lairtng->mappos.z.val = get_thing_height_at(lairtng, &lairtng->mappos); // Associate creature with the lair cctrl->lairtng_idx = lairtng->index; lairtng->word_13 = creatng->index; lairtng->word_15 = 1; // Lair size depends on creature level lairtng->word_17 = 300 * cctrl->explevel / 20 + 300; lairtng->field_52 = ACTION_RANDOM(0x800); struct Objects *objdat; unsigned long i; objdat = get_objects_data_for_thing(lairtng); i = convert_td_iso(objdat->field_5); set_thing_draw(lairtng, i, objdat->field_7, lairtng->word_15, 0, -1, objdat->field_11); thing_play_sample(creatng, 158, NORMAL_PITCH, 0, 3, 1, 2, FULL_LOUDNESS); create_effect(&pos, imp_spangle_effects[creatng->owner], creatng->owner); anger_set_creature_anger(creatng, 0, AngR_NoLair); remove_thing_from_mapwho(creatng); place_thing_in_mapwho(creatng); return 1; }
TbBool update_creature_anim_td(struct Thing *thing, long speed, long td_idx) { unsigned long i; i = convert_td_iso(td_idx); if (i != thing->anim_sprite) { set_thing_draw(thing, i, speed, -1, -1, 0, 2); return true; } return false; }
unsigned long get_creature_anim(struct Thing *thing, unsigned short seq_idx) { unsigned long idx; idx = get_creature_model_graphics(thing->model, seq_idx); return convert_td_iso(idx); }