;- Cinematic Enumeration #CV_X #CV_Y #CV_Width #CV_Height #CV_Opacity #CV_Size #CV_End EndEnumeration Structure CineValue Value.f Easing.l EndStructure Structure CineStep Array CineValue.CineValue(#CV_End-1) Duration.l EndStructure Structure Cinematic StartTime.q StepIndex.l Duration.l Array *TargetValue.Long(#CV_End-1) Loop.b List CineStep.CineStep() EndStructure Global NewList Cinematic.Cinematic() Procedure.i NewCinematic() Protected *c.Cinematic=AddElement(Cinematic()) *c\StartTime=-1 ProcedureReturn *c EndProcedure Procedure StartCinematic(*C.Cinematic) *C\StartTime=ElapsedMilliseconds() Cinematic()\StepIndex=-1 Cinematic()\Duration=-1 EndProcedure Procedure AddCinematicStep(*c.Cinematic,Duration.l) Protected *Step.CineStep=AddElement(*c\CineStep()) *Step\Duration=Duration Protected n.l For n=0 To #CV_End-1 *Step\CineValue(n)\Value=-1 Next ProcedureReturn *Step EndProcedure Procedure FreeCinematicStep(*c.Cinematic) ClearList(*c\CineStep()) EndProcedure Procedure AddCinematicValue(*c.Cinematic,ValueIndex.l,*Value) *c\TargetValue(ValueIndex)=*Value EndProcedure Procedure AddCinematicStepValue(*Step.CineStep,ValueIndex.l,Value.f,Easing.l) *Step\CineValue(ValueIndex)\Value=Value *Step\CineValue(ValueIndex)\Easing=Easing EndProcedure Procedure RenderCinematics() Protected *Start.CineStep Protected *Target.CineStep Protected CurrentPos.CineStep Protected ElapsedTime.q Protected n.l ForEach Cinematic() If Cinematic()\StartTime<>-1 ElapsedTime=ElapsedMilliseconds()-Cinematic()\StartTime If ElapsedTime>Cinematic()\Duration Cinematic()\StepIndex=Cinematic()\StepIndex+1 Cinematic()\StartTime=ElapsedMilliseconds() ElapsedTime=0 EndIf If Cinematic()\StepIndex>=0 And Cinematic()\StepIndex