411 lines
24 KiB
C#
411 lines
24 KiB
C#
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using Godot;
|
|
using Godot.Bridge;
|
|
using Godot.Collections;
|
|
using Godot.NativeInterop;
|
|
|
|
[ScriptPath("res://Scripts/Entities/NPC.cs")]
|
|
public class NPC : Entity, Interacteable
|
|
{
|
|
public new class MethodName : Entity.MethodName
|
|
{
|
|
public new static readonly StringName _EnterTree = "_EnterTree";
|
|
|
|
public new static readonly StringName _Process = "_Process";
|
|
|
|
public static readonly StringName Interact = "Interact";
|
|
|
|
public static readonly StringName GetNext = "GetNext";
|
|
|
|
public static readonly StringName OnTriggerEnter = "OnTriggerEnter";
|
|
|
|
public static readonly StringName OnTriggerExit = "OnTriggerExit";
|
|
}
|
|
|
|
public new class PropertyName : Entity.PropertyName
|
|
{
|
|
public static readonly StringName spawn = "spawn";
|
|
|
|
public static readonly StringName despawn = "despawn";
|
|
|
|
public static readonly StringName neededVar = "neededVar";
|
|
|
|
public static readonly StringName neededCapture = "neededCapture";
|
|
|
|
public static readonly StringName radius = "radius";
|
|
|
|
public static readonly StringName behaviours = "behaviours";
|
|
|
|
public static readonly StringName current = "current";
|
|
|
|
public static readonly StringName playerIn = "playerIn";
|
|
}
|
|
|
|
public new class SignalName : Entity.SignalName
|
|
{
|
|
}
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public Array<SaveFile.Flags> spawn;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public Array<SaveFile.Flags> despawn;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public int[] neededVar;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public IDs neededCapture = IDs.None;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public Area2D radius;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
public IBehaviour[] behaviours;
|
|
|
|
public IBehaviour current;
|
|
|
|
private bool playerIn;
|
|
|
|
public override void _EnterTree()
|
|
{
|
|
if ((spawn != null && spawn.Count != 0 && !SaveFile.HasFlags(spawn)) || (despawn != null && despawn.Count != 0 && SaveFile.HasFlags(despawn)) || (neededCapture != IDs.None && !SaveFile.current.apprehended.Contains(neededCapture)))
|
|
{
|
|
QueueFree();
|
|
return;
|
|
}
|
|
base._EnterTree();
|
|
IBehaviour[] array = behaviours;
|
|
if (array != null && array.Length != 0)
|
|
{
|
|
for (int i = 0; i < behaviours.Length; i++)
|
|
{
|
|
behaviours[i].parent = this;
|
|
}
|
|
}
|
|
Room.current.entities.Add(this);
|
|
if (radius != null)
|
|
{
|
|
radius.Monitorable = false;
|
|
radius.BodyEntered += OnTriggerEnter;
|
|
radius.BodyExited += OnTriggerExit;
|
|
}
|
|
}
|
|
|
|
public override void _Process(double delta)
|
|
{
|
|
base._Process(delta);
|
|
if (!TextSystem.instance.Visible && (Main.inEvent == null || Main.inEvent.done) && !IsQueuedForDeletion())
|
|
{
|
|
if (current == null)
|
|
{
|
|
GetNext(IBehaviour.Triggers.Always);
|
|
}
|
|
else
|
|
{
|
|
current.Do();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Interact()
|
|
{
|
|
GetNext(IBehaviour.Triggers.Interact);
|
|
}
|
|
|
|
private void GetNext(IBehaviour.Triggers trigger)
|
|
{
|
|
if (behaviours == null || behaviours.Length == 0)
|
|
{
|
|
if (trigger == IBehaviour.Triggers.Interact)
|
|
{
|
|
Player.instance.canInput = true;
|
|
}
|
|
return;
|
|
}
|
|
for (int num = behaviours.Length - 1; num >= 0; num--)
|
|
{
|
|
if (behaviours[num].trigger == trigger && SaveFile.CanDo(behaviours[num].needs, behaviours[num].limit))
|
|
{
|
|
current = behaviours[num];
|
|
behaviours[num].Do();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnTriggerEnter(Node other)
|
|
{
|
|
if (other is Player)
|
|
{
|
|
GetNext(IBehaviour.Triggers.Range);
|
|
}
|
|
}
|
|
|
|
private void OnTriggerExit(Node other)
|
|
{
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
internal new static List<MethodInfo> GetGodotMethodList()
|
|
{
|
|
return new List<MethodInfo>(6)
|
|
{
|
|
new MethodInfo(MethodName._EnterTree, 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.Interact, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, null, null),
|
|
new MethodInfo(MethodName.GetNext, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, new List<PropertyInfo>
|
|
{
|
|
new PropertyInfo(Variant.Type.Int, "trigger", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false)
|
|
}, null),
|
|
new MethodInfo(MethodName.OnTriggerEnter, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, new List<PropertyInfo>
|
|
{
|
|
new PropertyInfo(Variant.Type.Object, "other", PropertyHint.None, "", PropertyUsageFlags.Default, new StringName("Node"), exported: false)
|
|
}, null),
|
|
new MethodInfo(MethodName.OnTriggerExit, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal, new List<PropertyInfo>
|
|
{
|
|
new PropertyInfo(Variant.Type.Object, "other", PropertyHint.None, "", PropertyUsageFlags.Default, new StringName("Node"), exported: false)
|
|
}, 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._Process && args.Count == 1)
|
|
{
|
|
_Process(VariantUtils.ConvertTo<double>(in args[0]));
|
|
ret = default(godot_variant);
|
|
return true;
|
|
}
|
|
if (method == MethodName.Interact && args.Count == 0)
|
|
{
|
|
Interact();
|
|
ret = default(godot_variant);
|
|
return true;
|
|
}
|
|
if (method == MethodName.GetNext && args.Count == 1)
|
|
{
|
|
GetNext(VariantUtils.ConvertTo<IBehaviour.Triggers>(in args[0]));
|
|
ret = default(godot_variant);
|
|
return true;
|
|
}
|
|
if (method == MethodName.OnTriggerEnter && args.Count == 1)
|
|
{
|
|
OnTriggerEnter(VariantUtils.ConvertTo<Node>(in args[0]));
|
|
ret = default(godot_variant);
|
|
return true;
|
|
}
|
|
if (method == MethodName.OnTriggerExit && args.Count == 1)
|
|
{
|
|
OnTriggerExit(VariantUtils.ConvertTo<Node>(in args[0]));
|
|
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._Process)
|
|
{
|
|
return true;
|
|
}
|
|
if (method == MethodName.Interact)
|
|
{
|
|
return true;
|
|
}
|
|
if (method == MethodName.GetNext)
|
|
{
|
|
return true;
|
|
}
|
|
if (method == MethodName.OnTriggerEnter)
|
|
{
|
|
return true;
|
|
}
|
|
if (method == MethodName.OnTriggerExit)
|
|
{
|
|
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.spawn)
|
|
{
|
|
spawn = VariantUtils.ConvertToArray<SaveFile.Flags>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.despawn)
|
|
{
|
|
despawn = VariantUtils.ConvertToArray<SaveFile.Flags>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.neededVar)
|
|
{
|
|
neededVar = VariantUtils.ConvertTo<int[]>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.neededCapture)
|
|
{
|
|
neededCapture = VariantUtils.ConvertTo<IDs>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.radius)
|
|
{
|
|
radius = VariantUtils.ConvertTo<Area2D>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.behaviours)
|
|
{
|
|
behaviours = VariantUtils.ConvertToSystemArrayOfGodotObject<IBehaviour>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.current)
|
|
{
|
|
current = VariantUtils.ConvertTo<IBehaviour>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.playerIn)
|
|
{
|
|
playerIn = 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.spawn)
|
|
{
|
|
value = VariantUtils.CreateFromArray(spawn);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.despawn)
|
|
{
|
|
value = VariantUtils.CreateFromArray(despawn);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.neededVar)
|
|
{
|
|
value = VariantUtils.CreateFrom(in neededVar);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.neededCapture)
|
|
{
|
|
value = VariantUtils.CreateFrom(in neededCapture);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.radius)
|
|
{
|
|
value = VariantUtils.CreateFrom(in radius);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.behaviours)
|
|
{
|
|
GodotObject[] array = behaviours;
|
|
value = VariantUtils.CreateFromSystemArrayOfGodotObject(array);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.current)
|
|
{
|
|
value = VariantUtils.CreateFrom(in current);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.playerIn)
|
|
{
|
|
value = VariantUtils.CreateFrom(in playerIn);
|
|
return true;
|
|
}
|
|
return base.GetGodotClassPropertyValue(in name, out value);
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
internal new static List<PropertyInfo> GetGodotPropertyList()
|
|
{
|
|
return new List<PropertyInfo>
|
|
{
|
|
new PropertyInfo(Variant.Type.Array, PropertyName.spawn, 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.Array, PropertyName.despawn, 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.PackedInt32Array, PropertyName.neededVar, PropertyHint.None, "", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
|
|
new PropertyInfo(Variant.Type.Int, PropertyName.neededCapture, PropertyHint.Enum, "None:-1,Clover:0,Kanako:1,Martlet:2,Ceroba:3,Chujin:4,Starlo:5,Ed:6,Mooch:7,Moray:8,Ace:9,Dina:10,Mo:11,Axis:12,June:13,Melody:14,Dalv:15,TestEnemy:16,Penceller:17,Eraserhead:18,Bearing:19,Pennilton:20,BellBoss:21,Necklace:22,Mopper:23,Warden:24,BackpackDarkner:25,KeychainDarkner:26,JacketDarkner:27,MP3Darkner:28,PenGuy:29,UNUSED:30,FoxBoss:31,CarDarkner:32,BBallDarkner:33,ThumbtackDarkner:34,CoinDarkner:35,Decibat:36,Virgil:37,Kangaroo:38,Cat:39,Pyramid:40,Mirror:41,Scroll:42,Fly:43,PencilLizard:44,AntKid:45,TinfoilLizard:46,HorseGirl:47,DeerGirl:48,TravellerM:49,TravellerF:50,RichGuy:51,RichWoman:52,Aunt:53,Snake:54,Cactus:55,TechGuy:56,Golem:57,StarloBrother:58,StarloDad:59,StarloMom:60,GreenBear:61,RadDude:62,Dunebud:63,Horse:64,PyramidBug:65,Doctor:66,BlueTriangle:67,TallAntlerGirl:68,BlueFire:69,CursorMan:70,IceCreamGuy:71,DemonGuy:72,Squid:73,Bunny:74,KidR:75,KidB:76,KidG:77,MuscleGuy:78,SadGirl:79,SittingGuy:80,MagmaBug:81,CloakAntlerGirl:82,CactusGirl:83,FortuneTeller:84,EyeballGuy:85,MailWhale:86,Gizmo:87,Mocha:88,Britz:89,Violetta:90,Rosa:91,Pedla:92,Conner:93,Gearzerd:94,Toaster:95,Capacitor:96,Stapler:97,BigAxis:98,Wrench:99,RedLetter:100,Batter:101,BunBun:102,Drill:103,Toaster2:104,LegoGreen:105,LegoPink:106,LegoBlue:107,LegoOrange:108,LegoBull:109,KanakoPC:110,RangerRed:111,RangerGreen:112,RangerBlue:113,CameraMan:114,Ruler:115,BlueFireGuy:116,MinerGF:117,SmokerMiner:118,HatMinerGuy:119,GemMinerGuy:120,HappyMinerGirl:121,TeaBull:122,MorayDad:123,MorayMom:124,SittingBunnyGuy:125,ElevatorMinerGuy:126,NervousGirl:127,Blackjack:128", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
|
|
new PropertyInfo(Variant.Type.Object, PropertyName.radius, PropertyHint.NodeType, "Area2D", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
|
|
new PropertyInfo(Variant.Type.Array, PropertyName.behaviours, PropertyHint.TypeString, "24/17:IBehaviour", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
|
|
new PropertyInfo(Variant.Type.Object, PropertyName.current, PropertyHint.None, "", PropertyUsageFlags.ScriptVariable, exported: false),
|
|
new PropertyInfo(Variant.Type.Bool, PropertyName.playerIn, PropertyHint.None, "", PropertyUsageFlags.ScriptVariable, exported: false)
|
|
};
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
protected override void SaveGodotObjectData(GodotSerializationInfo info)
|
|
{
|
|
base.SaveGodotObjectData(info);
|
|
info.AddProperty(PropertyName.spawn, Variant.CreateFrom(spawn));
|
|
info.AddProperty(PropertyName.despawn, Variant.CreateFrom(despawn));
|
|
info.AddProperty(PropertyName.neededVar, Variant.From(in neededVar));
|
|
info.AddProperty(PropertyName.neededCapture, Variant.From(in neededCapture));
|
|
info.AddProperty(PropertyName.radius, Variant.From(in radius));
|
|
StringName name = PropertyName.behaviours;
|
|
GodotObject[] array = behaviours;
|
|
info.AddProperty(name, Variant.CreateFrom(array));
|
|
info.AddProperty(PropertyName.current, Variant.From(in current));
|
|
info.AddProperty(PropertyName.playerIn, Variant.From(in playerIn));
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
protected override void RestoreGodotObjectData(GodotSerializationInfo info)
|
|
{
|
|
base.RestoreGodotObjectData(info);
|
|
if (info.TryGetProperty(PropertyName.spawn, out var value))
|
|
{
|
|
spawn = value.AsGodotArray<SaveFile.Flags>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.despawn, out var value2))
|
|
{
|
|
despawn = value2.AsGodotArray<SaveFile.Flags>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.neededVar, out var value3))
|
|
{
|
|
neededVar = value3.As<int[]>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.neededCapture, out var value4))
|
|
{
|
|
neededCapture = value4.As<IDs>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.radius, out var value5))
|
|
{
|
|
radius = value5.As<Area2D>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.behaviours, out var value6))
|
|
{
|
|
behaviours = value6.AsGodotObjectArray<IBehaviour>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.current, out var value7))
|
|
{
|
|
current = value7.As<IBehaviour>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.playerIn, out var value8))
|
|
{
|
|
playerIn = value8.As<bool>();
|
|
}
|
|
}
|
|
}
|