void FlyingEyeSpell::Update() { const GameInstant now = g_gameTime.now(); const GameDuration framediff3 = now - m_lastupdate; eyeball.floating = std::sin((m_lastupdate - m_timcreation) / GameDurationMs(1000)); eyeball.floating *= 10.f; if(m_lastupdate - m_timcreation <= GameDurationMs(3000)) { eyeball.exist = long((m_lastupdate - m_timcreation) / GameDurationMs(30)); eyeball.size = Vec3f(1.f - float(eyeball.exist) * 0.01f); eyeball.angle.setYaw(eyeball.angle.getYaw() + toMsf(framediff3) * 0.6f); } else { eyeball.exist = 2; } m_lastupdate = now; Entity * io = entities.player(); if(io->obj->fastaccess.primary_attach != ActionPoint()) { Vec3f pos = actionPointPosition(io->obj, io->obj->fastaccess.primary_attach); FlyingEyeSpellUpdateHand(pos, m_light1); } if(io->obj->fastaccess.left_attach != ActionPoint()) { Vec3f pos = actionPointPosition(io->obj, io->obj->fastaccess.left_attach); FlyingEyeSpellUpdateHand(pos, m_light2); } }
static float GetTimeBetweenKeyFrames(EERIE_ANIM * ea, long f1, long f2) { if(!ea || f1 < 0 || f1 > ea->nb_key_frames - 1 || f2 < 0 || f2 > ea->nb_key_frames - 1) return 0; AnimationDuration time = AnimationDuration_ZERO; for(long kk = f1 + 1; kk <= f2; kk++) { time += ea->frames[kk].time; } return toMsf(time); }
/*! * \brief Main Procedure to draw an animated object * * \param eobj main object data * \param eanim Animation data * \param time Time increment to current animation in Ms * \param io Referrence to Interactive Object (NULL if no IO) */ void PrepareAnim(AnimLayer & layer, AnimationDuration time, Entity *io) { if(layer.flags & EA_PAUSED) time = AnimationDuration_ZERO; if(io && (io->ioflags & IO_FREEZESCRIPT)) time = AnimationDuration_ZERO; if(layer.altidx_cur >= layer.cur_anim->alt_nb) layer.altidx_cur = 0; if(!(layer.flags & EA_EXCONTROL)) layer.ctime += time; layer.flags &= ~EA_ANIMEND; AnimationDuration animTime = layer.cur_anim->anims[layer.altidx_cur]->anim_time; if(layer.ctime > animTime) { if(layer.flags & EA_STOPEND) { layer.ctime = animTime; } AnimationDuration lost = layer.ctime - animTime; if((layer.flags & EA_LOOP) || (io && ((layer.cur_anim == io->anims[ANIM_WALK]) || (layer.cur_anim == io->anims[ANIM_WALK2]) || (layer.cur_anim == io->anims[ANIM_WALK3]) || (layer.cur_anim == io->anims[ANIM_RUN]) || (layer.cur_anim == io->anims[ANIM_RUN2]) || (layer.cur_anim == io->anims[ANIM_RUN3]))) ) { if(!layer.next_anim) { layer.ctime = AnimationDuration(layer.ctime.t % animTime.t); if(io) FinishAnim(io, layer.cur_anim); } else { if(io) { FinishAnim(io, layer.cur_anim); if(io->animBlend.lastanimtime != ArxInstant_ZERO) AcquireLastAnim(io); else io->animBlend.lastanimtime = ArxInstantMs(1); } layer.cur_anim = layer.next_anim; layer.altidx_cur = ANIM_GetAltIdx(layer.next_anim, layer.altidx_cur); layer.next_anim = NULL; ResetAnim(layer); layer.ctime = lost; layer.flags = layer.nextflags; layer.flags &= ~EA_ANIMEND; } } else { if(io && layer.next_anim) { FinishAnim(io, layer.cur_anim); if (io->animBlend.lastanimtime != ArxInstant_ZERO) AcquireLastAnim(io); else io->animBlend.lastanimtime = ArxInstant(1); layer.cur_anim = layer.next_anim; layer.altidx_cur = ANIM_GetAltIdx(layer.next_anim, layer.altidx_cur); layer.next_anim = NULL; ResetAnim(layer); layer.ctime = lost; layer.flags = layer.nextflags; layer.flags &= ~EA_ANIMEND; } else { layer.flags |= EA_ANIMEND; layer.ctime = layer.cur_anim->anims[layer.altidx_cur]->anim_time; } } } if (!layer.cur_anim) return; AnimationDuration tim; if(layer.flags & EA_REVERSE) tim = animTime - layer.ctime; else tim = layer.ctime; EERIE_ANIM * anim = layer.cur_anim->anims[layer.altidx_cur]; layer.currentFrame = anim->nb_key_frames - 2; layer.currentInterpolation = 1.f; for(long i = 1; i < anim->nb_key_frames; i++) { AnimationDuration tcf = anim->frames[i - 1].time; AnimationDuration tnf = anim->frames[i].time; if(tcf == tnf) return; if((tim < tnf && tim >= tcf) || (i == anim->nb_key_frames - 1 && tim == tnf)) { long fr = i - 1; tim -= tcf; float pour = toMsf(tim) / toMsf(tnf - tcf); // Frame Sound Management if(!(layer.flags & EA_ANIMEND) && time != AnimationDuration_ZERO && (anim->frames[fr].sample != -1) && (layer.lastframe != fr)) { Vec3f * position = io ? &io->pos : NULL; if(layer.lastframe < fr && layer.lastframe != -1) { for(long n = layer.lastframe + 1; n <= fr; n++) ARX_SOUND_PlayAnim(anim->frames[n].sample, position); } else { ARX_SOUND_PlayAnim(anim->frames[fr].sample, position); } } // Frame Flags Management if(!(layer.flags & EA_ANIMEND) && time != AnimationDuration_ZERO && (anim->frames[fr].stepSound) && (layer.lastframe != fr)) { if(io && io != entities.player()) { if(layer.lastframe < fr && layer.lastframe != -1) { for(long n = layer.lastframe + 1; n <= fr; n++) { if(anim->frames[n].stepSound) ARX_NPC_NeedStepSound(io, io->pos); } } else if(anim->frames[fr].stepSound) ARX_NPC_NeedStepSound(io, io->pos); } } // Memorize this frame as lastframe. layer.lastframe = fr; layer.currentFrame = fr; layer.currentInterpolation = pour; break; } } }