195 lines
5.1 KiB
C#
195 lines
5.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using Godot;
|
|
using Godot.Bridge;
|
|
using Godot.NativeInterop;
|
|
|
|
[ScriptPath("res://Scripts/Events/Fountain.cs")]
|
|
public partial class Fountain : Sprite2D
|
|
{
|
|
[Export(PropertyHint.None, "")]
|
|
private Sprite2D soul;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private AnimationPlayer mainAnim;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private AnimationPlayer colors;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private AnimationPlayer soulAnim;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private AnimationPlayer scrolling;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private Node2D[] partyPos;
|
|
|
|
private static Fountain instance;
|
|
|
|
private readonly StringName matProperty = "shader_parameter/motion";
|
|
|
|
public override void _Ready()
|
|
{
|
|
instance = this;
|
|
}
|
|
|
|
private static Vector2[] SetPartyPos()
|
|
{
|
|
List<Vector2> list = new List<Vector2>();
|
|
Party.UpdateFollowerEntities();
|
|
for (int i = 0; i < SaveFile.current.activeParty.Count; i++)
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.GlobalPosition = instance.partyPos[i].GlobalPosition + Vector2.Down * 100f;
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.anim.Play("FountainMove");
|
|
list.Add(Party.party[SaveFile.current.activeParty[i]].oEntity.GlobalPosition);
|
|
}
|
|
return list.ToArray();
|
|
}
|
|
|
|
private static IEnumerator MoveParty(Vector2[] pos)
|
|
{
|
|
float a = 0f;
|
|
for (float b = 250f; a <= b + 1f; a += Main.deltaTime)
|
|
{
|
|
for (int i = 0; i < SaveFile.current.activeParty.Count; i++)
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.GlobalPosition = pos[i].Lerp(instance.partyPos[i].GlobalPosition, a / b);
|
|
}
|
|
yield return null;
|
|
}
|
|
for (int j = 0; j < SaveFile.current.activeParty.Count; j++)
|
|
{
|
|
Party.party[SaveFile.current.activeParty[j]].oEntity.anim.Stop();
|
|
}
|
|
}
|
|
|
|
public static IEnumerator SchoolDW()
|
|
{
|
|
Audio.ChangeMusic(null);
|
|
CameraController.Transition(Main.colorClearB);
|
|
yield return null;
|
|
CameraController.Transition(Main.colorBlack, 30f);
|
|
while (!CameraController.transitionRoutine.done)
|
|
{
|
|
yield return null;
|
|
}
|
|
yield return null;
|
|
Room.LoadRoom(Room.IDs.FountainRoom, reparent: true);
|
|
yield return null;
|
|
CameraController.Transition(Main.colorClearB, 120f);
|
|
Room.current.DoMusic();
|
|
Coroutine c = Coroutine.Start(MoveParty(SetPartyPos()));
|
|
while (!c.done)
|
|
{
|
|
yield return null;
|
|
}
|
|
float a;
|
|
for (a = 0f; a < 60f; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
TextSystem.GetText("SchoolFountainDiag");
|
|
while (TextSystem.instance.Visible)
|
|
{
|
|
yield return null;
|
|
}
|
|
Player.instance.anim.Play();
|
|
a = 0f;
|
|
for (float b = 180f; a < b; a += Main.deltaTime)
|
|
{
|
|
Player.instance.GlobalPosition = instance.partyPos[0].GlobalPosition.Lerp(instance.partyPos[3].GlobalPosition, a / b);
|
|
yield return null;
|
|
}
|
|
Player.instance.anim.Stop();
|
|
for (float b = 0f; b < 60f; b += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
TextSystem.GetText("FountainSoul");
|
|
while (TextSystem.instance.Visible)
|
|
{
|
|
yield return null;
|
|
}
|
|
c = Coroutine.Start(instance.FountainClose());
|
|
while (!c.done)
|
|
{
|
|
yield return null;
|
|
}
|
|
Room.LoadRoom(Room.IDs.SchoolCloset, reparent: true);
|
|
yield return null;
|
|
Main.inEvent = Coroutine.Start(LWDay1Events.ClosetPostDWEvent());
|
|
}
|
|
|
|
private IEnumerator FountainClose()
|
|
{
|
|
Audio.ChangeMusic(Room.current.music[1]);
|
|
soul.GlobalPosition = Player.instance.GlobalPosition + Vector2.Up * 16f;
|
|
soul.Visible = true;
|
|
((Node2D)Main.Particle("SoulSplit", Vector2.Zero, null, soul)).Scale *= 1.5f;
|
|
Audio.PlaySound("snd_great_shine.ogg");
|
|
float a;
|
|
for (a = 0f; a < 60f; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
Vector2 p = soul.GlobalPosition;
|
|
Vector2 t = new Vector2(0f, -120f);
|
|
a = 0f;
|
|
float b;
|
|
for (b = 400f; a < b; a += Main.deltaTime)
|
|
{
|
|
soul.GlobalPosition = p.Lerp(t, a / b);
|
|
yield return null;
|
|
}
|
|
colors.Pause();
|
|
b = 0f;
|
|
for (a = 150f; b < a; b += Main.deltaTime)
|
|
{
|
|
mainAnim.SpeedScale = Mathf.Lerp(mainAnim.SpeedScale, 0f, Main.deltaTime * 0.025f);
|
|
scrolling.SpeedScale = Mathf.Lerp(scrolling.SpeedScale, 0f, Main.deltaTime * 0.025f);
|
|
Room.current.Modulate = Room.current.Modulate.Lerp(Main.colorWhite, Main.deltaTime * 0.025f);
|
|
yield return null;
|
|
}
|
|
for (a = 0f; a < 50f; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
Audio.PlaySound("snd_revival.ogg");
|
|
soulAnim.Play("Soul");
|
|
a = 0f;
|
|
for (b = 100f; a < b; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
Color c = soul.SelfModulate;
|
|
b = 0f;
|
|
for (a = 160f; b < a; b += Main.deltaTime)
|
|
{
|
|
soul.SelfModulate = c.Lerp(Main.colorClear, b / a);
|
|
yield return null;
|
|
}
|
|
SaveFile.current.flags.Remove(SaveFile.Flags.IsInDW);
|
|
Party.UpdateFollowerEntities();
|
|
for (int i = 0; i < SaveFile.current.activeParty.Count; i++)
|
|
{
|
|
Party.party[i].AddBonus();
|
|
Party.party[i].LV++;
|
|
Party.party[i].oEntity.animMod = Entity.AnimMods.None;
|
|
}
|
|
Party.LookAt(Vector2.Down);
|
|
CameraController.Transition(Main.colorBlack, 300f);
|
|
while (!CameraController.transitionRoutine.done)
|
|
{
|
|
yield return null;
|
|
}
|
|
a = 0f;
|
|
for (b = 60f; a < b; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
}
|
|
|
|
}
|