Files
deltarune-yellow-translation/Scripts-new/PuzzleGate.cs
2025-05-03 20:36:17 +08:00

509 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using Godot;
using Godot.Bridge;
using Godot.Collections;
using Godot.NativeInterop;
[ScriptPath("res://Scripts/Puzzles/PuzzleGate.cs")]
public class PuzzleGate : StaticBody2D, IPuzzle
{
[Signal]
public delegate void GateOpenEventHandler();
public new class MethodName : StaticBody2D.MethodName
{
public new static readonly StringName _EnterTree = "_EnterTree";
public static readonly StringName Active = "Active";
public static readonly StringName Deactivate = "Deactivate";
public new static readonly StringName _Process = "_Process";
public static readonly StringName CheckLinked = "CheckLinked";
}
public new class PropertyName : StaticBody2D.PropertyName
{
public static readonly StringName active = "active";
public static readonly StringName sprite = "sprite";
public static readonly StringName tex = "tex";
public static readonly StringName linked = "linked";
public static readonly StringName onlyOnce = "onlyOnce";
public static readonly StringName shakeOnCompletion = "shakeOnCompletion";
public static readonly StringName flags = "flags";
public static readonly StringName collider = "collider";
public static readonly StringName activeSound = "activeSound";
public static readonly StringName overrideState = "overrideState";
}
public new class SignalName : StaticBody2D.SignalName
{
public static readonly StringName GateOpen = "GateOpen";
}
[Export(PropertyHint.None, "")]
private Sprite2D[] sprite;
[Export(PropertyHint.None, "")]
private Texture2D[] tex;
[Export(PropertyHint.None, "")]
private Node[] linked;
[Export(PropertyHint.None, "")]
private bool onlyOnce = true;
[Export(PropertyHint.None, "")]
private bool shakeOnCompletion = true;
[Export(PropertyHint.None, "")]
private Array<SaveFile.Flags> flags;
[Export(PropertyHint.None, "")]
private CollisionShape2D collider;
[Export(PropertyHint.None, "")]
private AudioStream activeSound;
private IPuzzle[] linkedp;
public bool overrideState;
private GateOpenEventHandler backing_GateOpen;
public bool active { get; set; }
public event GateOpenEventHandler GateOpen
{
add
{
backing_GateOpen = (GateOpenEventHandler)Delegate.Combine(backing_GateOpen, value);
}
remove
{
backing_GateOpen = (GateOpenEventHandler)Delegate.Remove(backing_GateOpen, value);
}
}
public override void _EnterTree()
{
linkedp = new IPuzzle[linked.Length];
for (int i = 0; i < linked.Length; i++)
{
linkedp[i] = (IPuzzle)linked[i];
}
Array<SaveFile.Flags> array = flags;
if (array != null && array.Count > 0 && SaveFile.HasFlags(flags))
{
Active(doEffects: false);
}
base.CollisionLayer = 524289u;
}
public void Active(bool doEffects = true)
{
active = true;
for (int i = 0; i < sprite.Length; i++)
{
Sprite2D obj = sprite[i];
Texture2D[] array = tex;
obj.Texture = ((array != null && array.Length != 0) ? tex[1] : null);
}
collider?.SetDeferred("disabled", true);
if (!doEffects)
{
return;
}
if (shakeOnCompletion)
{
CameraController.Shake(15f, 2f);
}
if (activeSound != null)
{
Audio.PlaySound(activeSound);
}
Array<SaveFile.Flags> array2 = flags;
if (array2 != null && array2.Count > 0)
{
for (int j = 0; j < flags.Count; j++)
{
SaveFile.AddFlag(flags[j]);
}
}
EmitSignal(SignalName.GateOpen);
}
public void Deactivate()
{
active = false;
collider?.SetDeferred("disabled", false);
for (int i = 0; i < sprite.Length; i++)
{
sprite[i].Texture = tex[0];
}
Party.MoveAndSlide(delayed: true);
}
public override void _Process(double delta)
{
if (!active)
{
if (CheckLinked() || overrideState)
{
Active();
}
}
else if (!onlyOnce && !CheckLinked() && !overrideState)
{
Deactivate();
}
}
private bool CheckLinked()
{
for (int i = 0; i < linkedp.Length; i++)
{
if (!linkedp[i].active)
{
return false;
}
}
return true;
}
[EditorBrowsable(EditorBrowsableState.Never)]
internal static List<MethodInfo> GetGodotMethodList()
{
return new List<MethodInfo>(5)
{
new MethodInfo(MethodName._EnterTree, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, null, null),
new MethodInfo(MethodName.Active, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, new List<PropertyInfo>
{
new PropertyInfo(Variant.Type.Bool, "doEffects", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false)
}, null),
new MethodInfo(MethodName.Deactivate, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, null, null),
new MethodInfo(MethodName._Process, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, new List<PropertyInfo>
{
new PropertyInfo(Variant.Type.Float, "delta", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false)
}, null),
new MethodInfo(MethodName.CheckLinked, new PropertyInfo(Variant.Type.Bool, "", 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.Active && args.Count == 1)
{
Active(VariantUtils.ConvertTo<bool>(in args[0]));
ret = default(godot_variant);
return true;
}
if (method == MethodName.Deactivate && args.Count == 0)
{
Deactivate();
ret = default(godot_variant);
return true;
}
if (method == MethodName._Process && args.Count == 1)
{
_Process(VariantUtils.ConvertTo<double>(in args[0]));
ret = default(godot_variant);
return true;
}
if (method == MethodName.CheckLinked && args.Count == 0)
{
ret = VariantUtils.CreateFrom<bool>(CheckLinked());
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.Active)
{
return true;
}
if (method == MethodName.Deactivate)
{
return true;
}
if (method == MethodName._Process)
{
return true;
}
if (method == MethodName.CheckLinked)
{
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.active)
{
active = VariantUtils.ConvertTo<bool>(in value);
return true;
}
if (name == PropertyName.sprite)
{
sprite = VariantUtils.ConvertToSystemArrayOfGodotObject<Sprite2D>(in value);
return true;
}
if (name == PropertyName.tex)
{
tex = VariantUtils.ConvertToSystemArrayOfGodotObject<Texture2D>(in value);
return true;
}
if (name == PropertyName.linked)
{
linked = VariantUtils.ConvertToSystemArrayOfGodotObject<Node>(in value);
return true;
}
if (name == PropertyName.onlyOnce)
{
onlyOnce = VariantUtils.ConvertTo<bool>(in value);
return true;
}
if (name == PropertyName.shakeOnCompletion)
{
shakeOnCompletion = VariantUtils.ConvertTo<bool>(in value);
return true;
}
if (name == PropertyName.flags)
{
flags = VariantUtils.ConvertToArray<SaveFile.Flags>(in value);
return true;
}
if (name == PropertyName.collider)
{
collider = VariantUtils.ConvertTo<CollisionShape2D>(in value);
return true;
}
if (name == PropertyName.activeSound)
{
activeSound = VariantUtils.ConvertTo<AudioStream>(in value);
return true;
}
if (name == PropertyName.overrideState)
{
overrideState = VariantUtils.ConvertTo<bool>(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.active)
{
value = VariantUtils.CreateFrom<bool>(active);
return true;
}
if (name == PropertyName.sprite)
{
GodotObject[] array = sprite;
value = VariantUtils.CreateFromSystemArrayOfGodotObject(array);
return true;
}
if (name == PropertyName.tex)
{
GodotObject[] array = tex;
value = VariantUtils.CreateFromSystemArrayOfGodotObject(array);
return true;
}
if (name == PropertyName.linked)
{
GodotObject[] array = linked;
value = VariantUtils.CreateFromSystemArrayOfGodotObject(array);
return true;
}
if (name == PropertyName.onlyOnce)
{
value = VariantUtils.CreateFrom(in onlyOnce);
return true;
}
if (name == PropertyName.shakeOnCompletion)
{
value = VariantUtils.CreateFrom(in shakeOnCompletion);
return true;
}
if (name == PropertyName.flags)
{
value = VariantUtils.CreateFromArray(flags);
return true;
}
if (name == PropertyName.collider)
{
value = VariantUtils.CreateFrom(in collider);
return true;
}
if (name == PropertyName.activeSound)
{
value = VariantUtils.CreateFrom(in activeSound);
return true;
}
if (name == PropertyName.overrideState)
{
value = VariantUtils.CreateFrom(in overrideState);
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.Array, PropertyName.sprite, PropertyHint.TypeString, "24/34:Sprite2D", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Array, PropertyName.tex, PropertyHint.TypeString, "24/17:Texture2D", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Array, PropertyName.linked, PropertyHint.TypeString, "24/34:Node", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Bool, PropertyName.onlyOnce, PropertyHint.None, "", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Bool, PropertyName.shakeOnCompletion, PropertyHint.None, "", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Array, PropertyName.flags, PropertyHint.TypeString, "2/2: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.Object, PropertyName.collider, PropertyHint.NodeType, "CollisionShape2D", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Object, PropertyName.activeSound, PropertyHint.ResourceType, "AudioStream", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
new PropertyInfo(Variant.Type.Bool, PropertyName.active, PropertyHint.None, "", PropertyUsageFlags.ScriptVariable, exported: false),
new PropertyInfo(Variant.Type.Bool, PropertyName.overrideState, PropertyHint.None, "", PropertyUsageFlags.ScriptVariable, exported: false)
};
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void SaveGodotObjectData(GodotSerializationInfo info)
{
base.SaveGodotObjectData(info);
info.AddProperty(PropertyName.active, Variant.From<bool>(active));
StringName name = PropertyName.sprite;
GodotObject[] array = sprite;
info.AddProperty(name, Variant.CreateFrom(array));
StringName name2 = PropertyName.tex;
array = tex;
info.AddProperty(name2, Variant.CreateFrom(array));
StringName name3 = PropertyName.linked;
array = linked;
info.AddProperty(name3, Variant.CreateFrom(array));
info.AddProperty(PropertyName.onlyOnce, Variant.From(in onlyOnce));
info.AddProperty(PropertyName.shakeOnCompletion, Variant.From(in shakeOnCompletion));
info.AddProperty(PropertyName.flags, Variant.CreateFrom(flags));
info.AddProperty(PropertyName.collider, Variant.From(in collider));
info.AddProperty(PropertyName.activeSound, Variant.From(in activeSound));
info.AddProperty(PropertyName.overrideState, Variant.From(in overrideState));
info.AddSignalEventDelegate(SignalName.GateOpen, backing_GateOpen);
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void RestoreGodotObjectData(GodotSerializationInfo info)
{
base.RestoreGodotObjectData(info);
if (info.TryGetProperty(PropertyName.active, out var value))
{
active = value.As<bool>();
}
if (info.TryGetProperty(PropertyName.sprite, out var value2))
{
sprite = value2.AsGodotObjectArray<Sprite2D>();
}
if (info.TryGetProperty(PropertyName.tex, out var value3))
{
tex = value3.AsGodotObjectArray<Texture2D>();
}
if (info.TryGetProperty(PropertyName.linked, out var value4))
{
linked = value4.AsGodotObjectArray<Node>();
}
if (info.TryGetProperty(PropertyName.onlyOnce, out var value5))
{
onlyOnce = value5.As<bool>();
}
if (info.TryGetProperty(PropertyName.shakeOnCompletion, out var value6))
{
shakeOnCompletion = value6.As<bool>();
}
if (info.TryGetProperty(PropertyName.flags, out var value7))
{
flags = value7.AsGodotArray<SaveFile.Flags>();
}
if (info.TryGetProperty(PropertyName.collider, out var value8))
{
collider = value8.As<CollisionShape2D>();
}
if (info.TryGetProperty(PropertyName.activeSound, out var value9))
{
activeSound = value9.As<AudioStream>();
}
if (info.TryGetProperty(PropertyName.overrideState, out var value10))
{
overrideState = value10.As<bool>();
}
if (info.TryGetSignalEventDelegate<GateOpenEventHandler>(SignalName.GateOpen, out var value11))
{
backing_GateOpen = value11;
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
internal static List<MethodInfo> GetGodotSignalList()
{
return new List<MethodInfo>(1)
{
new MethodInfo(SignalName.GateOpen, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, null, null)
};
}
protected void EmitSignalGateOpen()
{
EmitSignal(SignalName.GateOpen);
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void RaiseGodotClassSignalCallbacks(in godot_string_name signal, NativeVariantPtrArgs args)
{
if (signal == SignalName.GateOpen && args.Count == 0)
{
backing_GateOpen?.Invoke();
}
else
{
base.RaiseGodotClassSignalCallbacks(in signal, args);
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
protected override bool HasGodotClassSignal(in godot_string_name signal)
{
if (signal == SignalName.GateOpen)
{
return true;
}
return base.HasGodotClassSignal(in signal);
}
}