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; } } }
// 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); }
public Sprite FrameBySlot(int x, OrthoDir facing) { return(FrameByExplicitSlot(x, facing.Ordinal())); }