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

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[]>();
}
}
}