Ejemplo n.º 1
0
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;
    }
}
Ejemplo n.º 2
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;
            }
        }
    }
}