#include "jump_include"
#include "jump_inc_pattern"

// ? Spark VFX helper - run on dummy placeable
void Jump_ApplySparkFromSelf()
{
    location lLoc = GetLocation(OBJECT_SELF);
    vector vPos = GetPositionFromLocation(lLoc);
    vPos.z += 0.5;

    location lVFX = Location(GetAreaFromLocation(lLoc), vPos, GetFacingFromLocation(lLoc));
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(118), lVFX); // VFX_COM_SPARKS_PARRY

    DestroyObject(OBJECT_SELF, 0.1); // Clean up dummy
}

// ? Cookie trail
void Jump_CookieCrumbleTrail(int iInterval = 20, float fDelay = 0.02, float fSparkDelay = 1.0, float fCookieDuration = 2.0)
{
    float fDistanceLocal = GetDistanceBetweenLocations(lPC, lTarget);
    float fSkip = fDistanceLocal / IntToFloat(iInterval);
    float fDSkip = 0.0;
    float fIncrement = 0.0;
    float fFacing = GetFacing(oPC);

    int i, j;
    for (i = 0; i < iInterval; i++)
    {
        fIncrement += fSkip;
        fDSkip += fDelay;

        vector vBase = GetPositionFromLocation(GenerateNewLocationFromLocation(lPC, fIncrement, fFacing, 0.0));

        for (j = 0; j < 3; j++) // 3 cookies per step
        {
            float fOffsetX = (IntToFloat(Random(1000)) / 1000.0) * 1.5 - 0.75;
            float fOffsetY = (IntToFloat(Random(1000)) / 1000.0) * 1.5 - 0.75;

            vector vCookie = Vector(vBase.x + fOffsetX, vBase.y + fOffsetY, vBase.z);
            location lDrop = Location(oArea, vCookie, fFacing);

            // ? Spawn cookie (lasts 2s)
            DelayCommand(fDSkip, Jump_SpawnPlaceableDeleyable("cas_cookieplc", lDrop, fCookieDuration));

            // ? Spawn invisible dummy at cookie location
            object oSparkDummy = CreateObject(OBJECT_TYPE_PLACEABLE, "bcs_invis", lDrop);

            // ? Delay spark by 1s after the cookie appears
            DelayCommand(fDSkip + fSparkDelay, ExecuteScript("cas_jumpcookie", oSparkDummy));
        }
    }
}

// ? Main
void main()
{
    // ? If this is a delayed spark execution
    if (GetTag(OBJECT_SELF) == "bcs_invis")
    {
        Jump_ApplySparkFromSelf();
        return;
    }

    // ? Normal jumper call
    float fDelay = 1.0;
    int bTurnToTarget = TRUE;

    if (ActivateJumper(fDelay, bTurnToTarget))
    {
        // VFX 1596 at start and end points
        DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(1596), lPC));
        DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(1596), lTarget));

        // ? Cookie trail
        Jump_CookieCrumbleTrail(); // Uses default timings
    }
}
