Esempio n. 1
0
    public IEnumerator StepRoutine(OrthoDir dir, bool applyOffset = false)
    {
        facing = dir;
        Vector2Int offset  = parent.OffsetForTiles(dir);
        Vector3    startPx = parent.positionPx;

        targetPx = parent.TileToWorldCoords(parent.position);
        if (targetPx.y == startPx.y || GetComponent <MapEvent3D>() == null || !useJumps)
        {
            yield return(parent.LinearStepRoutine(dir));
        }
        else if (targetPx.y > startPx.y)
        {
            float duration = (targetPx - startPx).magnitude / parent.CalcTilesPerSecond() / 2.0f * JumpHeightUpMult;
            yield return(JumpRoutine(startPx, targetPx, duration));

            overrideBodySprite = FrameBySlot(0, facing.Ordinal()); // "prone" frame
            yield return(CoUtils.Wait(1.0f / parent.CalcTilesPerSecond() / 2.0f));

            overrideBodySprite = null;
        }
        else
        {
            // jump down routine
            float elapsed      = 0.0f;
            float walkRatio    = 0.65f;
            float walkDuration = walkRatio / parent.CalcTilesPerSecond();
            while (true)
            {
                float t = elapsed / walkDuration;
                elapsed += Time.deltaTime;
                parent.transform.position = new Vector3(
                    startPx.x + t * (targetPx.x - startPx.x) * walkRatio,
                    startPx.y,
                    startPx.z + t * (targetPx.z - startPx.z) * walkRatio);
                if (elapsed >= walkDuration)
                {
                    break;
                }
                yield return(null);
            }
            float dy           = targetPx.y - startPx.y;
            float jumpDuration = Mathf.Sqrt(dy / Gravity) * JumpHeightDownMult;
            bool  isBigDrop    = dy <= -1.0f;
            yield return(JumpRoutine(parent.transform.position, targetPx, jumpDuration, isBigDrop));

            if (isBigDrop)
            {
                overrideBodySprite = FrameBySlot(2, facing.Ordinal()); // "prone" frame
                yield return(CoUtils.Wait(JumpHeightDownMult / parent.CalcTilesPerSecond() / 2.0f));

                overrideBodySprite = null;
            }
        }
    }
Esempio n. 2
0
    // Update is called once per frame
    void Update()
    {
        MapEvent avatar = Global.Instance().Maps.avatar.GetComponent <MapEvent>();
        OrthoDir facing = parent.GetComponent <MapEvent>().DirectionTo(avatar);
        int      y      = facing.Ordinal();
        int      x      = Mathf.FloorToInt(parent.moveTime * CharaEvent.StepsPerSecond) % 4;

        if (x == 3)
        {
            x = 1;
        }
        if (!parent.stepping)
        {
            x = 1;
        }
        string name = CharaEvent.NameForFrame("ghoul_head", x, y);

        GetComponent <SpriteRenderer>().sprite = spritesByName[name];

        float val = 0.0f;

        for (int i = 0; i < AmortizedCount; i += 1)
        {
            val += amort[i];
            if (i == 0)
            {
                amort[i] = Global.Instance().Audio.GetWaveSource().GetLowBand();
            }
            else
            {
                amort[i] = amort[i - 1];
            }
        }
        val /= AmortizedCount;
        GetComponent <SpriteRenderer>().color = new Color(val, val, val, GetComponent <SpriteRenderer>().color.a);
    }
Esempio n. 3
0
 public Sprite FrameBySlot(int x, OrthoDir facing)
 {
     return(FrameByExplicitSlot(x, facing.Ordinal()));
 }