2025-05-03 20:36:17 +08:00

269 lines
12 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using Godot;
using Godot.Bridge;
using Godot.NativeInterop;
[ScriptPath("res://Scripts/Events/MagicDoor.cs")]
public class MagicDoor : Sprite2D
{
public new class MethodName : Sprite2D.MethodName
{
public new static readonly StringName _EnterTree = "_EnterTree";
public static readonly StringName Interact = "Interact";
}
public new class PropertyName : Sprite2D.PropertyName
{
public static readonly StringName smoke = "smoke";
public static readonly StringName neededFlag = "neededFlag";
public static readonly StringName names = "names";
}
public new class SignalName : Sprite2D.SignalName
{
}
[Export(PropertyHint.None, "")]
private Node2D smoke;
[Export(PropertyHint.None, "")]
private SaveFile.Flags neededFlag;
private string[] names;
private List<Room.IDs> targets = new List<Room.IDs> { Room.IDs.DarkPrisonRight };
private List<Vector2> pos = new List<Vector2>
{
new Vector2(280f, -220f)
};
public override void _EnterTree()
{
if (!SaveFile.HasFlag(neededFlag))
{
smoke.Visible = false;
base.Frame = 2;
}
else
{
base.Frame = 0;
smoke.Visible = true;
}
}
public void Interact()
{
if (!SaveFile.HasFlag(neededFlag))
{
TextSystem.GetText("MagicDoorInactive");
return;
}
names = FileAccess.Open(Texts.textFolder + "/WarpDoor.txt", FileAccess.ModeFlags.Read).GetAsText(skipCr: true).Split('\n');
for (int i = 0; i < names.Length; i++)
{
names[i] = names[i].Replace("@", "\n");
}
List<string> list = new List<string> { names[0] };
if (!SaveFile.HasFlag(SaveFile.Flags.Day1End))
{
list.Add(names[1]);
targets.Add(Room.IDs.SchoolDWLake);
pos.Add(new Vector2(449f, 261f));
}
else if (!SaveFile.HasFlag(SaveFile.Flags.Day2End))
{
list.Add(names[2]);
targets.Add(Room.IDs.ChujinDWOverview);
pos.Add(new Vector2(544f, 202f));
if (SaveFile.current.values[5] >= 23)
{
list.Add(names[3]);
targets.Add(Room.IDs.ChujinDWUpstairsBalloons);
pos.Add(new Vector2(206f, -120f));
}
}
Main.inEvent = Coroutine.Start(Event(list.ToArray()));
}
private IEnumerator Event(string[] p)
{
TextSystem.SingleText(Texts.mainDiag["MagicDoorPrompt"][0].text, null, null, p);
while (TextSystem.instance.Visible)
{
yield return null;
}
if (Room.current.id == targets[TextSystem.lastPrompt])
{
TextSystem.GetText("MagicDoorAlready");
while (TextSystem.instance.Visible)
{
yield return null;
}
yield break;
}
SaveFile.AddFlag(SaveFile.Flags.KanakoTalkAfterTutorial);
SaveFile.AddFlag(SaveFile.Flags.WarpDoorFirst);
base.Frame = 1;
Audio.PlaySound("snd_dooropen_ch1.wav");
TextSystem.GetText("MagicDoorWarp");
while (TextSystem.instance.Visible)
{
yield return null;
}
Audio.PlaySound("snd_doorclose_ch1.wav");
CameraController.Transition(Main.colorBlack);
Audio.music.Stop();
for (float a = 0f; a < 30f; a += Main.deltaTime)
{
yield return null;
}
Party.Reparent(Main.instance);
Room.LoadRoom(targets[TextSystem.lastPrompt]);
yield return null;
Party.Reparent(Room.current);
Player.instance.GlobalPosition = pos[TextSystem.lastPrompt];
Player.instance.direction = Entity.Direction.South;
Player.instance.UpdateAnim(force: true);
Party.TeleportFollowers();
for (float a = 0f; a < 30f; a += Main.deltaTime)
{
yield return null;
}
Audio.PlaySound("snd_dooropen_ch1.wav");
CameraController.Transition(Main.colorClearB, 30f);
Room.current.DoMusic();
while (!CameraController.transitionRoutine.done)
{
yield return null;
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
internal static List<MethodInfo> GetGodotMethodList()
{
return new List<MethodInfo>(2)
{
new MethodInfo(MethodName._EnterTree, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, null, null),
new MethodInfo(MethodName.Interact, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, null, null)
};
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override bool InvokeGodotClassMethod(in godot_string_name method, NativeVariantPtrArgs args, out godot_variant ret)
{
if (method == MethodName._EnterTree && args.Count == 0)
{
_EnterTree();
ret = default(godot_variant);
return true;
}
if (method == MethodName.Interact && args.Count == 0)
{
Interact();
ret = default(godot_variant);
return true;
}
return base.InvokeGodotClassMethod(in method, args, out ret);
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override bool HasGodotClassMethod(in godot_string_name method)
{
if (method == MethodName._EnterTree)
{
return true;
}
if (method == MethodName.Interact)
{
return true;
}
return base.HasGodotClassMethod(in method);
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override bool SetGodotClassPropertyValue(in godot_string_name name, in godot_variant value)
{
if (name == PropertyName.smoke)
{
smoke = VariantUtils.ConvertTo<Node2D>(in value);
return true;
}
if (name == PropertyName.neededFlag)
{
neededFlag = VariantUtils.ConvertTo<SaveFile.Flags>(in value);
return true;
}
if (name == PropertyName.names)
{
names = VariantUtils.ConvertTo<string[]>(in value);
return true;
}
return base.SetGodotClassPropertyValue(in name, in value);
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override bool GetGodotClassPropertyValue(in godot_string_name name, out godot_variant value)
{
if (name == PropertyName.smoke)
{
value = VariantUtils.CreateFrom(in smoke);
return true;
}
if (name == PropertyName.neededFlag)
{
value = VariantUtils.CreateFrom(in neededFlag);
return true;
}
if (name == PropertyName.names)
{
value = VariantUtils.CreateFrom(in names);
return true;
}
return base.GetGodotClassPropertyValue(in name, out value);
}
[EditorBrowsable(EditorBrowsableState.Never)]
internal static List<PropertyInfo> GetGodotPropertyList()
{
return new List<PropertyInfo>
{
new PropertyInfo(Variant.Type.Object, PropertyName.smoke, PropertyHint.NodeType, "Node2D", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Int, PropertyName.neededFlag, PropertyHint.Enum, "NULL:99999,HasNecklace:-10,PartySplit:-9,FullStorage:-8,FullWeapon:-7,FullArmor:-6,FullLInv:-5,FullDInv:-4,SpareMore:-3,FightMore:-2,None:-1,IsInDW:0,KanakoFollowing:1,AxisFollowing:2,StephFollowing:3,JuneFollowing:4,SawKetsukaneWindow:5,AxisCutoutKanako:6,Day1End:7,Day2End:8,Day3End:9,Day4End:10,Day5End:11,Day6End:12,CerobaDay1Talk:13,IntroEvent:14,WeirdStart:15,FirstCrateGate:16,FirstPuzzleSign:17,FirstDW1Chest:18,SavedKanakoCh1:19,ApprehendTutorial:20,KanakoFirstDWTalk:21,KanakoRoomAfterRescueTalk:22,SecondDW1Chest:23,EnemyAfterKanako1:24,EnemyAfterKanako2:25,EnemyAfterKanako3:26,FreedFromJail:27,MossChecked:28,AteMoss:29,KanakoCommentsOnMoss:30,PrisonTriedCrack:31,DisagreedWardenFirstTalk:32,WardenExposited:33,KanakoBearTalk:34,DarkPrisonRightTalk:35,DarkPrisonSouthTalk:36,BearingDefeated:37,WeaponTalk:38,KanakoTalkAfterTutorial:39,DidApprehendTutorial:40,KanakoLakeTalk:41,MoneyChestLake:42,PenniltonFought:43,PenniltonCaught:44,LuncherFought:45,LuncherCaught:46,BearingFought:47,BearingCaught:48,BackpackFirstTalk:49,RubbermanTalk:50,KanakoTownDiag:51,KanakoPhoneEvent:52,ChestBridgeRoom:53,KanakoLandscapeDiag:54,PencellerSidePath:55,EraserSidePath:56,PencellerSidePath2:57,ChestBridgeRoom2:58,WardenApprehendRegular:59,PeniltonDEAD:60,LuncherDEAD:61,BearingDEAD:62,KanakoMemoryGameRoomBefore:63,KanakoMemoryGameInProgress:64,KanakoMemoryGameRoomAfter:65,KanakoPostPennyWeird:66,KanakoPostPennyNormal:67,MP3DarknerTalk:68,BeatMemoryGame:69,YellowPaintEvent:70,MemoryGameWin:71,PenGuyFirstTalk:72,KanakoLakeWeird:73,BearingFortFirstPuzzle:74,KanakoTalkBFortFirstPRoom:75,BFortTrashCan:76,KanakoGateNote:77,KanakoGateEvent:78,BearingFortMainGate:79,BearingFortUpRoomLock:80,MopperMainHall1:81,MopperMainHall2:82,PencellerMainHall:83,WeirdedOnce:84,BearFortLeftMinigame:85,BBallTalk1:86,BBallTalk2:87,BBallPlayedOnce:88,BBallKanakoTalk1:89,BBallKanakoTalk2:90,BBallKanakoTalk3:91,KanakoWeirdTalkBreakRoom:92,KanakoTalkBreakRoom:93,MopperBigCorridor1:94,MopperBigCorridor2:95,MopperBigCorridor3:96,MopperBigCorridor4:97,KanakoTalkFortBigCorridor:98,KanakoWarningBeforeBear:99,KanakoTalkBearPrison:100,KanakoWarningBeforeFountain:101,BearFortTreasureRoom:102,BearFortGotTreasure:103,BearFortTreasureTalk:104,BearTreasureChest1:105,BearTreasureChest2:106,BearTreasureChest3:107,BearFortTreasureInvFull:108,BearTreasureLost:109,KanakoTalkTreasurePost:110,NightTime:111,SchoolFountainSealed:112,FoxFirstTalk:113,FoxDefeated:114,FoxFullInvSpare:115,FoxFullInvDefeat:116,FoxGotItem:117,PenGuyReturn:118,SchoolCheckedLock:119,MagicDoorActive:120,WardenTalkEndDay1:121,WardenInnocentTalk:122,DinaDay1Talk:123,VirgilDay1:124,AfterDinnerDay1:125,MartletHouseCheckD1:126,IgnoredCerobaCallD1:127,FirstKetsuShopEvent:128,CerobaTalkChujinDoor:129,KanakoDiscussDay1:130,ListenedToCCDay1:131,ReturnedNecklace:132,GaveLetterMartlet:133,LuncherDisappear:134,StarloDay1:135,VirgilDay1Weird:136,VirgilDay1Rejected:137,NicePenceller:138,BearingSpareItem:139,BearingSpared:140,KanakoTalkPostBearingF:141,PenGuyPrison:142,KanakoTalkNorthPrisonTalk:143,KanakoApprehendTalk:144,MoochTalkD1:145,AnnoyedDecibat:146,MartEventDay2:147,MailWhaleDay2:148,KanakoEventDay2:149,SchoolRecessDay2:150,JuneRecessDay2:151,MelodyEventDay2:152,RedLetterDay2:153,EnterDarkJailDay2:154,WardenTalkDay2:155,PostWardenOutDWTalkDay2:156,CerobaEventDay2:157,FridgeDay2:158,Day2KanakoRoomCheck:159,KanakoRedLetterDWEntTalk:160,AxisEvent:161,AxisFirstTalk:162,AxisTalkSlide:163,DW2Overview:164,DW2MagicDoor:165,LockLightWorldPortal:166,WardenRobotopiaTalk:167,Gizzard1:168,Gizzard2:169,ChestDW2_1:170,FirstPuzzleDW2:171,Gizzard3:172,KanakoTalkWaterGun:173,Puzzle2_DW2:174,ChestDW2_2:175,DW2Room2Stapler:176,DW2Room2Wrench:177,DW2Room2Gear:178,DW2PlanTalk:179,DW2TownTVEvent:180,Puzzle3_DW2:181,FactoryMainEnemyLeft:182,FactoryMainEnemyRight:183,FactoryPuzzle1:184,FactoryPuzzle2:185,AxisPuzzleTalk:186,EnemyBeforeFactory:187,FactoryRightPuzzle1:188,TalkFactoryRight:189,ChestFactoryRight:190,FactoryRightEnemy:191,ChestFactoryLeft:192,ChestFactoryLeft2:193,TalkFactoryLeft:194,FactoryLeftEnemy1:195,FactoryLeftEnemy2:196,FactoryFirstSwitch:197,ClawTalk:198,TramEvent:199,AxisTrashEvent:200,AxisSoloTalk:201,AxisTrashTreasure:202,PuzzleChujinDWTrash:203,AxisTrashPuzzleTalk:204,AxisHandGet:205,FirstUpstairsTalk:206,UpstairsOverview:207,BunBunEvent1:208,BunBunEvent2:209,KanakoFountainTalk:210,KanakoTosterTalk:211,UpstairsGreenChest:212,UpstairsTalk2:213,RangerEvent:214,RangerTalk:215,RangerBlueBalloon:216,ArchiveChestOutside:217,ArchivesPC:218,PenGuyTalkDay2:219,ChujinShopTalk:220,PenGuyRestRoom:221,SchoolJokeDuoD2:222,BBallPity1:223,BBallPity2:224,BBallPitied:225,BellCrusherPity:226,BBallChestOpen:227,EnemyAfterKanako4:228,EnemyAfterKanako5:229,EnemyAfterKanako6:230,AfterKanakoBridgeOpen:231,PedlaHospitalD1:232,KTalkPrisonRightBD:233,WarpDoorFirst:234,BenchTSouth:235,BenchTMain:236,BenchDW2Archive:237,KanakoFishFirstTalk:238,FishGuyFirstTalk:239,FishGuyTaskDay2:240,PedlaHospitalD2:241,StarloDadDay2:242,ViolettaD2:243,BlackjackD2:244,MochaEventD1:245,StarloEventD2:246,RobaDay2Early:247", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.PackedStringArray, PropertyName.names, PropertyHint.None, "", PropertyUsageFlags.ScriptVariable, exported: false)
};
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void SaveGodotObjectData(GodotSerializationInfo info)
{
base.SaveGodotObjectData(info);
info.AddProperty(PropertyName.smoke, Variant.From(in smoke));
info.AddProperty(PropertyName.neededFlag, Variant.From(in neededFlag));
info.AddProperty(PropertyName.names, Variant.From(in names));
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void RestoreGodotObjectData(GodotSerializationInfo info)
{
base.RestoreGodotObjectData(info);
if (info.TryGetProperty(PropertyName.smoke, out var value))
{
smoke = value.As<Node2D>();
}
if (info.TryGetProperty(PropertyName.neededFlag, out var value2))
{
neededFlag = value2.As<SaveFile.Flags>();
}
if (info.TryGetProperty(PropertyName.names, out var value3))
{
names = value3.As<string[]>();
}
}
}