Esempio n. 1
0
void ARX_SPEECH_Add(const std::string & text) {

    if(text.empty())
        return;

    ArxInstant now = arxtime.now();
    if(now == ArxInstant_ZERO) {
        now = ArxInstantMs(1);
    }

    if(speech[MAX_SPEECH - 1].timecreation != ArxInstant_ZERO) {
        ARX_SPEECH_MoveUp();
    }

    for(size_t i = 0; i < MAX_SPEECH; i++) {

        if(speech[i].timecreation != ArxInstant_ZERO)
            continue;

        // Sets creation time
        speech[i].timecreation = now;
        speech[i].duration = ArxDurationMs(2000 + text.length() * 60);
        speech[i].text = text;
        return;
    }

    LogInfo << "Failed to add speech: " << text;
}
Esempio n. 2
0
/*!
 * \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;
		}
	}
}