296 lines
13 KiB
C#
296 lines
13 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using Godot;
|
|
using Godot.Bridge;
|
|
using Godot.NativeInterop;
|
|
|
|
[ScriptPath("res://Scripts/Envirioment/Bench.cs")]
|
|
public class Bench : Area2D, Interacteable
|
|
{
|
|
public new class MethodName : Area2D.MethodName
|
|
{
|
|
public new static readonly StringName _EnterTree = "_EnterTree";
|
|
|
|
public static readonly StringName Interact = "Interact";
|
|
|
|
public static readonly StringName PartyAnim = "PartyAnim";
|
|
}
|
|
|
|
public new class PropertyName : Area2D.PropertyName
|
|
{
|
|
public static readonly StringName flag = "flag";
|
|
|
|
public static readonly StringName sound = "sound";
|
|
|
|
public static readonly StringName volume = "volume";
|
|
|
|
public static readonly StringName pos = "pos";
|
|
}
|
|
|
|
public new class SignalName : Area2D.SignalName
|
|
{
|
|
}
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private SaveFile.Flags flag = SaveFile.Flags.None;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private AudioStream sound;
|
|
|
|
[Export(PropertyHint.None, "")]
|
|
private float volume = 0.7f;
|
|
|
|
private Vector2[] pos;
|
|
|
|
public override void _EnterTree()
|
|
{
|
|
pos = new Vector2[GetChildCount() - 1];
|
|
for (int i = 0; i < pos.Length; i++)
|
|
{
|
|
pos[i] = GetChild<Node2D>(i + 1).GlobalPosition;
|
|
}
|
|
}
|
|
|
|
public void Interact()
|
|
{
|
|
if (Player.instance.GlobalPosition.Y > base.GlobalPosition.Y)
|
|
{
|
|
Main.inEvent = Coroutine.Start(SitEvent());
|
|
}
|
|
else
|
|
{
|
|
Player.instance.canInput = true;
|
|
}
|
|
}
|
|
|
|
private IEnumerator SitEvent()
|
|
{
|
|
AudioStream m = Audio.music.Stream;
|
|
Party.ChangeCollider(state: false);
|
|
Audio.FadeSound(Audio.music, 1f);
|
|
Party.MoveTo(pos, 0.5f, align: true, Entity.Direction.South);
|
|
while (!Party.IsStopped())
|
|
{
|
|
yield return null;
|
|
}
|
|
Party.UpdateFollowerEntities();
|
|
PartyAnim();
|
|
if (sound != null)
|
|
{
|
|
Audio.ChangeMusic(sound, 0.5f, volume);
|
|
}
|
|
for (float a = 0f; a < 60f; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
while (!Input.IsActionJustPressed(Main.keys[4]))
|
|
{
|
|
yield return null;
|
|
}
|
|
Audio.FadeSound(Audio.music, 0.5f);
|
|
for (float a = 0f; a < 30f; a += Main.deltaTime)
|
|
{
|
|
yield return null;
|
|
}
|
|
Audio.ChangeMusic(m);
|
|
Party.LookAt(Entity.Direction.South);
|
|
Party.UpdateAnim();
|
|
Party.ChangeCollider(state: true);
|
|
Player.instance.ResetFollowStep();
|
|
yield return null;
|
|
}
|
|
|
|
private static void PartyAnim()
|
|
{
|
|
for (int i = 0; i < SaveFile.current.activeParty.Count; i++)
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.sprite.FlipH = false;
|
|
Entity.IDs id = Party.party[SaveFile.current.activeParty[i]].oEntity.id;
|
|
if (id != Entity.IDs.Clover)
|
|
{
|
|
if (id == Entity.IDs.Axis)
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.anim.Play("TramSit");
|
|
continue;
|
|
}
|
|
}
|
|
else if (Player.instance.animMod == Entity.AnimMods.Hat)
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.anim.Play("SitBenchHat");
|
|
continue;
|
|
}
|
|
if (SaveFile.HasFlag(SaveFile.Flags.IsInDW))
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.anim.Play("SitBenchDW");
|
|
}
|
|
else
|
|
{
|
|
Party.party[SaveFile.current.activeParty[i]].oEntity.anim.Play("SitBench");
|
|
}
|
|
}
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
internal static List<MethodInfo> GetGodotMethodList()
|
|
{
|
|
return new List<MethodInfo>(3)
|
|
{
|
|
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),
|
|
new MethodInfo(MethodName.PartyAnim, new PropertyInfo(Variant.Type.Nil, "", PropertyHint.None, "", PropertyUsageFlags.Default, exported: false), MethodFlags.Normal | MethodFlags.Static, 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;
|
|
}
|
|
if (method == MethodName.PartyAnim && args.Count == 0)
|
|
{
|
|
PartyAnim();
|
|
ret = default(godot_variant);
|
|
return true;
|
|
}
|
|
return base.InvokeGodotClassMethod(in method, args, out ret);
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
internal static bool InvokeGodotClassStaticMethod(in godot_string_name method, NativeVariantPtrArgs args, out godot_variant ret)
|
|
{
|
|
if (method == MethodName.PartyAnim && args.Count == 0)
|
|
{
|
|
PartyAnim();
|
|
ret = default(godot_variant);
|
|
return true;
|
|
}
|
|
ret = default(godot_variant);
|
|
return false;
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
protected override bool HasGodotClassMethod(in godot_string_name method)
|
|
{
|
|
if (method == MethodName._EnterTree)
|
|
{
|
|
return true;
|
|
}
|
|
if (method == MethodName.Interact)
|
|
{
|
|
return true;
|
|
}
|
|
if (method == MethodName.PartyAnim)
|
|
{
|
|
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.flag)
|
|
{
|
|
flag = VariantUtils.ConvertTo<SaveFile.Flags>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.sound)
|
|
{
|
|
sound = VariantUtils.ConvertTo<AudioStream>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.volume)
|
|
{
|
|
volume = VariantUtils.ConvertTo<float>(in value);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.pos)
|
|
{
|
|
pos = VariantUtils.ConvertTo<Vector2[]>(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.flag)
|
|
{
|
|
value = VariantUtils.CreateFrom(in flag);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.sound)
|
|
{
|
|
value = VariantUtils.CreateFrom(in sound);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.volume)
|
|
{
|
|
value = VariantUtils.CreateFrom(in volume);
|
|
return true;
|
|
}
|
|
if (name == PropertyName.pos)
|
|
{
|
|
value = VariantUtils.CreateFrom(in pos);
|
|
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.Int, PropertyName.flag, 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.Object, PropertyName.sound, PropertyHint.ResourceType, "AudioStream", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
|
|
new PropertyInfo(Variant.Type.Float, PropertyName.volume, PropertyHint.None, "", PropertyUsageFlags.Default | PropertyUsageFlags.ScriptVariable, exported: true),
|
|
new PropertyInfo(Variant.Type.PackedVector2Array, PropertyName.pos, PropertyHint.None, "", PropertyUsageFlags.ScriptVariable, exported: false)
|
|
};
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
protected override void SaveGodotObjectData(GodotSerializationInfo info)
|
|
{
|
|
base.SaveGodotObjectData(info);
|
|
info.AddProperty(PropertyName.flag, Variant.From(in flag));
|
|
info.AddProperty(PropertyName.sound, Variant.From(in sound));
|
|
info.AddProperty(PropertyName.volume, Variant.From(in volume));
|
|
info.AddProperty(PropertyName.pos, Variant.From(in pos));
|
|
}
|
|
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
protected override void RestoreGodotObjectData(GodotSerializationInfo info)
|
|
{
|
|
base.RestoreGodotObjectData(info);
|
|
if (info.TryGetProperty(PropertyName.flag, out var value))
|
|
{
|
|
flag = value.As<SaveFile.Flags>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.sound, out var value2))
|
|
{
|
|
sound = value2.As<AudioStream>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.volume, out var value3))
|
|
{
|
|
volume = value3.As<float>();
|
|
}
|
|
if (info.TryGetProperty(PropertyName.pos, out var value4))
|
|
{
|
|
pos = value4.As<Vector2[]>();
|
|
}
|
|
}
|
|
}
|