void process_creature_instance(struct Thing *thing) { struct CreatureControl *cctrl; struct InstanceInfo *inst_inf; SYNCDBG(19,"Starting for %s index %d instance %d",thing_model_name(thing),(int)thing->index,(int)cctrl->instance_id); TRACE_THING(thing); cctrl = creature_control_get_from_thing(thing); if (cctrl->instance_id != CrInst_NULL) { cctrl->inst_turn++; if (cctrl->inst_turn == cctrl->inst_action_turns) { inst_inf = creature_instance_info_get(cctrl->instance_id); if (inst_inf->func_cb != NULL) { SYNCDBG(18,"Executing instance %d for %s index %d.",(int)cctrl->instance_id,thing_model_name(thing),(int)thing->index); inst_inf->func_cb(thing, inst_inf->func_params); } } if (cctrl->inst_turn >= cctrl->inst_total_turns) { if (cctrl->inst_repeat) { cctrl->inst_turn--; cctrl->inst_repeat = 0; return; } cctrl->instance_use_turn[cctrl->instance_id] = game.play_gameturn; cctrl->instance_id = CrInst_NULL; } cctrl->inst_repeat = 0; } }
void update_creature_graphic_anim(struct Thing *thing) { struct CreatureControl *cctrl; struct CreatureStats *crstat; long i; TRACE_THING(thing); cctrl = creature_control_get_from_thing(thing); crstat = creature_stats_get_from_thing(thing); if ((thing->field_50 & 0x01) != 0) { thing->field_50 &= ~0x01; } else if ((thing->active_state == CrSt_CreatureHeroEntering) && (cctrl->countdown_282 >= 0)) { thing->field_4F |= TF4F_Unknown01; } else if (!creature_affected_by_spell(thing, SplK_Chicken)) { if (cctrl->instance_id != CrInst_NULL) { if (cctrl->instance_id == CrInst_TORTURED) { thing->field_4F &= ~(TF4F_Unknown20|TF4F_Unknown10); } struct InstanceInfo *inst_inf; inst_inf = creature_instance_info_get(cctrl->instance_id); update_creature_anim(thing, cctrl->instance_anim_step_turns, inst_inf->graphics_idx); } else if ((cctrl->field_B1 != 0) || creature_is_dying(thing) || creature_affected_by_spell(thing, SplK_Freeze)) { update_creature_anim(thing, 256, 8); } else if ((cctrl->stateblock_flags & CCSpl_ChickenRel) != 0) { update_creature_anim(thing, 256, 0); } else if (thing->active_state == CrSt_CreatureSlapCowers) { update_creature_anim(thing, 256, 10); } else if ((thing->active_state == CrSt_CreaturePiss) || (thing->active_state == CrSt_CreatureRoar)) { update_creature_anim(thing, 128, 4); } else if (thing->active_state == CrSt_CreatureUnconscious) { update_creature_anim(thing, 64, 16); thing->field_4F |= TF4F_Unknown40; } else if (thing->active_state == CrSt_CreatureSleep) { thing->field_4F &= ~(TF4F_Unknown20|TF4F_Unknown10); update_creature_anim(thing, 128, 12); } else if (cctrl->field_9 == 0) { update_creature_anim(thing, 256, 0); } else if (thing->field_60 < thing->mappos.z.val) { update_creature_anim(thing, 256, 0); } else if ((cctrl->dragtng_idx != 0) && (thing_get(cctrl->dragtng_idx)->state_flags & TF1_IsDragged1)) { i = (((long)cctrl->field_9) << 8) / (crstat->walking_anim_speed+1); update_creature_anim(thing, i, 2); } else if (creatures[thing->model].field_6 == 4) { update_creature_anim(thing, 256, 1); } else { i = (((long)cctrl->field_9) << 8) / (crstat->walking_anim_speed+1); if (!update_creature_anim(thing, i, 1)) { thing->field_3E = i; } } } else { thing->field_4F &= ~0x30; if (cctrl->field_9 == 0) { update_creature_anim_td(thing, 256, 820); } else if (thing->field_60 < thing->mappos.z.val) { update_creature_anim_td(thing, 256, 820); } else if (creatures[thing->model].field_6 == 4) { update_creature_anim_td(thing, 256, 819); } else { i = (((long)cctrl->field_9) << 8) / (crstat->walking_anim_speed+1); if (!update_creature_anim_td(thing, i, 819)) { thing->field_3E = i; } } } }