templates

This commit is contained in:
Rendo 2025-07-16 18:19:25 +05:00
commit d52d4be5ff
7 changed files with 421 additions and 60 deletions

View file

@ -5,9 +5,10 @@ using Godot.Collections;
[Tool] [Tool]
public partial class AdventureLevelResource : Resource public partial class AdventureLevelResource : Resource
{ {
[Export] public float startSun; [Export] public float startSun = 50;
//[Export] public Array<Conditions> conditions; //[Export] public Array<Conditions> conditions;
[Export(PropertyHint.Range,"0,1,0.01")] public float wavePercentage; [Export(PropertyHint.Range,"0,1,0.01")] public float wavePercentage;
[Export] public float standardWaveDelay; [Export] public float standardWaveDelay;
[Export] public float initialWaveDelay;
[Export] public Array<WaveData> waves; [Export] public Array<WaveData> waves;
} }

View file

@ -0,0 +1,58 @@
[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=18 format=3 uid="uid://br3364jty1j0i"]
[ext_resource type="Script" uid="uid://bximdujbkj2n4" path="res://addons/pvzadventure/AdventureLevelResource.cs" id="1_qb1ge"]
[ext_resource type="Script" uid="uid://cw7yc3i2lgcja" path="res://addons/pvzadventure/WaveEvent.cs" id="2_8aewt"]
[ext_resource type="Script" uid="uid://7rptlb5qr3b6" path="res://addons/pvzadventure/WaveData.cs" id="3_hlq35"]
[ext_resource type="Script" uid="uid://dl12rj75tk2qi" path="res://addons/pvzadventure/RowSpawn.cs" id="4_8miqm"]
[ext_resource type="Script" uid="uid://cqxj7o8hdm82n" path="res://scripts/resources/ZombieResource.cs" id="5_8miqm"]
[ext_resource type="Resource" uid="uid://dkhjlu7u0vny6" path="res://resources/zombies/buckethead.tres" id="6_s62qb"]
[ext_resource type="Resource" uid="uid://nceohd32fkxk" path="res://resources/zombies/conehead.tres" id="7_yvl2y"]
[ext_resource type="Resource" uid="uid://buvacn56kyy2p" path="res://resources/zombies/basic.tres" id="8_ulhin"]
[ext_resource type="Resource" uid="uid://c38vfdw5b60xw" path="res://resources/zombies/hobo.tres" id="9_ulhin"]
[sub_resource type="Resource" id="Resource_yvl2y"]
script = ExtResource("4_8miqm")
zombies = Array[ExtResource("5_8miqm")]([null, null, ExtResource("6_s62qb"), null, null])
[sub_resource type="Resource" id="Resource_s62qb"]
script = ExtResource("3_hlq35")
zombiesOrdered = Array[ExtResource("4_8miqm")]([SubResource("Resource_yvl2y")])
events = Array[ExtResource("2_8aewt")]([])
customWaveDelay = 0.0
[sub_resource type="Resource" id="Resource_cafd0"]
script = ExtResource("4_8miqm")
zombies = Array[ExtResource("5_8miqm")]([null, ExtResource("7_yvl2y"), null, ExtResource("7_yvl2y"), null])
[sub_resource type="Resource" id="Resource_y8rkm"]
script = ExtResource("4_8miqm")
zombies = Array[ExtResource("5_8miqm")]([ExtResource("8_ulhin"), null, ExtResource("8_ulhin"), null, ExtResource("8_ulhin")])
[sub_resource type="Resource" id="Resource_ulhin"]
script = ExtResource("3_hlq35")
zombiesOrdered = Array[ExtResource("4_8miqm")]([SubResource("Resource_cafd0"), SubResource("Resource_y8rkm")])
events = Array[ExtResource("2_8aewt")]([])
customWaveDelay = 0.0
[sub_resource type="Resource" id="Resource_n6yt3"]
script = ExtResource("4_8miqm")
zombies = Array[ExtResource("5_8miqm")]([null, ExtResource("9_ulhin"), ExtResource("9_ulhin"), ExtResource("9_ulhin"), null])
[sub_resource type="Resource" id="Resource_8h2xm"]
script = ExtResource("4_8miqm")
zombies = Array[ExtResource("5_8miqm")]([ExtResource("8_ulhin"), ExtResource("7_yvl2y"), ExtResource("6_s62qb"), ExtResource("7_yvl2y"), ExtResource("8_ulhin")])
[sub_resource type="Resource" id="Resource_dbrq5"]
script = ExtResource("3_hlq35")
zombiesOrdered = Array[ExtResource("4_8miqm")]([SubResource("Resource_n6yt3"), SubResource("Resource_8h2xm")])
events = Array[ExtResource("2_8aewt")]([])
customWaveDelay = 0.0
[resource]
script = ExtResource("1_qb1ge")
startSun = 50.0
wavePercentage = 0.5
standardWaveDelay = 8.0
initialWaveDelay = 0.0
waves = [SubResource("Resource_s62qb"), SubResource("Resource_ulhin"), SubResource("Resource_dbrq5")]
metadata/_custom_type_script = "uid://bximdujbkj2n4"

View file

@ -1,36 +0,0 @@
[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=7 format=3 uid="uid://bx1wnrgickeyd"]
[ext_resource type="Script" uid="uid://bximdujbkj2n4" path="res://addons/pvzadventure/AdventureLevelResource.cs" id="1_ed2ji"]
[ext_resource type="Script" uid="uid://7rptlb5qr3b6" path="res://addons/pvzadventure/WaveData.cs" id="2_46l53"]
[sub_resource type="Resource" id="Resource_46l53"]
script = ExtResource("2_46l53")
zombiesOrdered = null
spawns = null
customWaveDelay = 0.0
[sub_resource type="Resource" id="Resource_yo1i5"]
script = ExtResource("2_46l53")
zombiesOrdered = null
spawns = null
customWaveDelay = 0.0
[sub_resource type="Resource" id="Resource_xqi0a"]
script = ExtResource("2_46l53")
zombiesOrdered = null
spawns = null
customWaveDelay = 0.0
[sub_resource type="Resource" id="Resource_ak572"]
script = ExtResource("2_46l53")
zombiesOrdered = null
spawns = null
customWaveDelay = 0.0
[resource]
script = ExtResource("1_ed2ji")
startSun = 0.0
wavePercentage = 0.0
standardWaveDelay = 0.0
waves = [SubResource("Resource_46l53"), SubResource("Resource_yo1i5"), SubResource("Resource_xqi0a"), SubResource("Resource_ak572")]
metadata/_custom_type_script = "uid://bximdujbkj2n4"

View file

@ -1,10 +0,0 @@
[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=2 format=3 uid="uid://cc1jjkslvh8bq"]
[ext_resource type="Script" uid="uid://bximdujbkj2n4" path="res://addons/pvzadventure/AdventureLevelResource.cs" id="1_db8ej"]
[resource]
script = ExtResource("1_db8ej")
startSun = 0.0
wavePercentage = 0.0
standardWaveDelay = 0.0
waves = []

View file

@ -1,31 +1,362 @@
[gd_scene load_steps=6 format=3 uid="uid://dd3yegl1xo44m"] [gd_scene load_steps=26 format=3 uid="uid://dd3yegl1xo44m"]
[ext_resource type="Script" uid="uid://bndu1h5kgcde8" path="res://scripts/level/RuntimeLevelData.cs" id="1_31ltw"] [ext_resource type="Script" uid="uid://bndu1h5kgcde8" path="res://scripts/level/RuntimeLevelData.cs" id="1_31ltw"]
[ext_resource type="Script" uid="uid://bso32xkw738sy" path="res://scripts/level/PoolContainer.cs" id="2_s5sti"]
[ext_resource type="PackedScene" uid="uid://devn21c7luf45" path="res://scenes/level components/field_controller.tscn" id="2_w4oj7"] [ext_resource type="PackedScene" uid="uid://devn21c7luf45" path="res://scenes/level components/field_controller.tscn" id="2_w4oj7"]
[ext_resource type="PackedScene" uid="uid://cg8713v6c5w15" path="res://scenes/level components/pools.tscn" id="3_r1g7l"] [ext_resource type="Script" uid="uid://blpu7t8tf6277" path="res://scripts/particles/FallFloor.cs" id="3_4bmqp"]
[ext_resource type="PackedScene" uid="uid://dpxxjfd5lv5sv" path="res://scenes/gui/choose_your_seeds.tscn" id="3_xy2c6"] [ext_resource type="PackedScene" uid="uid://dpxxjfd5lv5sv" path="res://scenes/gui/choose_your_seeds.tscn" id="3_xy2c6"]
[ext_resource type="PackedScene" uid="uid://cfnmspei3k4p7" path="res://scenes/gui/runtime_gui.tscn" id="4_okro4"] [ext_resource type="PackedScene" uid="uid://cfnmspei3k4p7" path="res://scenes/gui/runtime_gui.tscn" id="4_okro4"]
[ext_resource type="PackedScene" uid="uid://fm471x22n8kr" path="res://scenes/gui/pause_menu.tscn" id="6_4bmqp"]
[ext_resource type="Texture2D" uid="uid://bt0slphfqhhab" path="res://assets/sprites/atlases/brain.tres" id="7_482ps"]
[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="8_jg5t3"]
[ext_resource type="Script" uid="uid://btqwxelqxheh3" path="res://scripts/gui/RestartButton.cs" id="9_2ybed"]
[ext_resource type="Script" uid="uid://dpdpv2oyxdna7" path="res://scripts/gui/ExitButton.cs" id="10_nvbnq"]
[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="11_p133p"]
[ext_resource type="AudioStream" uid="uid://bdx83fokp6kha" path="res://assets/audio/sfx/buttonclick.mp3" id="12_6gkho"]
[ext_resource type="Script" uid="uid://c0ov2bq5er0gh" path="res://scripts/plants/LoseZone.cs" id="13_0x4ji"]
[ext_resource type="Script" uid="uid://cslqjdd5wq4rc" path="res://scripts/level/SunSpawner.cs" id="14_y72yf"]
[ext_resource type="PackedScene" uid="uid://bpekho7leatr5" path="res://scenes/sun.tscn" id="15_7v6ps"]
[ext_resource type="PackedScene" uid="uid://jm7wm08d2mi7" path="res://scenes/level components/right_boundary_marker.tscn" id="16_s7icd"]
[ext_resource type="PackedScene" uid="uid://plc2gus4ppds" path="res://scenes/level components/left_boundary_marker.tscn" id="17_8qqc4"]
[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_482ps"]
distance = -9.0
[sub_resource type="Animation" id="Animation_r81g1"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Fade:self_modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Fade/Brainz:self_modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Fade:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("VBoxContainer:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("VBoxContainer:modulate")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 1)]
}
[sub_resource type="Animation" id="Animation_h1ksq"]
resource_name = "fade"
length = 4.0
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Fade:self_modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Fade/Brainz:self_modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.6, 2.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Fade:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.0333333),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("VBoxContainer:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.0333333),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("VBoxContainer:modulate")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 2.96667, 4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_pb02i"]
_data = {
&"RESET": SubResource("Animation_r81g1"),
&"fade": SubResource("Animation_h1ksq")
}
[sub_resource type="AtlasTexture" id="AtlasTexture_y5tw7"]
atlas = ExtResource("8_jg5t3")
region = Rect2(255, 221, 118, 20)
[sub_resource type="AtlasTexture" id="AtlasTexture_i7rp7"]
atlas = ExtResource("8_jg5t3")
region = Rect2(194, 221, 61, 20)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_xsaqy"]
size = Vector2(244, 399)
[node name="level_template" type="Node2D"] [node name="level_template" type="Node2D"]
[node name="Camera2D" type="Camera2D" parent="."] [node name="MainAnimationPlayer" type="AnimationPlayer" parent="."]
[node name="RuntimeLevelData" type="Node" parent="."] [node name="Data" type="Node" parent="."]
script = ExtResource("1_31ltw") script = ExtResource("1_31ltw")
SunCount = 50.0
[node name="Pools" parent="." instance=ExtResource("3_r1g7l")] [node name="Camera2D" type="Camera2D" parent="."]
position = Vector2(481, 200)
[node name="GameUserInterface" type="CanvasLayer" parent="."] [node name="Pools" type="Node2D" parent="." node_paths=PackedStringArray("Zombies", "Plants", "Projectiles", "Structures", "Particles")]
layer = 10 script = ExtResource("2_s5sti")
Zombies = NodePath("Zombies")
Plants = NodePath("Plants")
Projectiles = NodePath("Projectiles")
Structures = NodePath("Structures")
Particles = NodePath("Particles")
[node name="ChooseYourSeeds" parent="GameUserInterface" instance=ExtResource("3_xy2c6")] [node name="Zombies" type="Node2D" parent="Pools"]
z_index = 3
y_sort_enabled = true
[node name="Plants" type="Node2D" parent="Pools"]
z_index = 1
y_sort_enabled = true
[node name="Projectiles" type="Node2D" parent="Pools"]
z_index = 4
y_sort_enabled = true
[node name="Structures" type="Node2D" parent="Pools"]
z_index = 2
y_sort_enabled = true
[node name="Particles" type="Node2D" parent="Pools"]
z_index = 5
[node name="Lines" type="Node2D" parent="."]
script = ExtResource("3_4bmqp")
[node name="Floor" type="StaticBody2D" parent="Lines"]
position = Vector2(528, 247)
collision_layer = 64
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Lines/Floor"]
shape = SubResource("WorldBoundaryShape2D_482ps")
[node name="Floor2" type="StaticBody2D" parent="Lines"]
position = Vector2(528, 306)
collision_layer = 64
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Lines/Floor2"]
shape = SubResource("WorldBoundaryShape2D_482ps")
[node name="Floor3" type="StaticBody2D" parent="Lines"]
position = Vector2(528, 367)
collision_layer = 64
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Lines/Floor3"]
shape = SubResource("WorldBoundaryShape2D_482ps")
[node name="Floor4" type="StaticBody2D" parent="Lines"]
position = Vector2(528, 183)
collision_layer = 64
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Lines/Floor4"]
shape = SubResource("WorldBoundaryShape2D_482ps")
[node name="Floor5" type="StaticBody2D" parent="Lines"]
position = Vector2(528, 132)
collision_layer = 64
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Lines/Floor5"]
shape = SubResource("WorldBoundaryShape2D_482ps")
[node name="Background" type="CanvasLayer" parent="."]
layer = -2
follow_viewport_enabled = true
[node name="HUD" type="CanvasLayer" parent="."]
layer = -1
[node name="RuntimeGUI" parent="HUD" instance=ExtResource("4_okro4")]
metadata/_edit_lock_ = true metadata/_edit_lock_ = true
[node name="RuntimeGUI" parent="GameUserInterface" instance=ExtResource("4_okro4")] [node name="Overlay" type="CanvasLayer" parent="."]
[node name="OverlayGameobjects" type="CanvasLayer" parent="."]
layer = 6 layer = 6
follow_viewport_enabled = true
[node name="FieldController" parent="OverlayGameobjects" instance=ExtResource("2_w4oj7")] [node name="FieldController" parent="Overlay" instance=ExtResource("2_w4oj7")]
[node name="MainAnimationPlayer" type="AnimationPlayer" parent="."] [node name="GUI" type="CanvasLayer" parent="."]
layer = 10
[node name="ChooseYourSeeds" parent="GUI" instance=ExtResource("3_xy2c6")]
metadata/_edit_lock_ = true
[node name="PauseMenu" parent="GUI" instance=ExtResource("6_4bmqp")]
visible = false
[node name="GameOverScreen" type="CanvasLayer" parent="."]
process_mode = 3
layer = 11
[node name="Fade" type="ColorRect" parent="GameOverScreen"]
visible = false
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 1)
[node name="Brainz" type="TextureRect" parent="GameOverScreen/Fade"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 141.0
offset_top = 146.0
offset_right = -143.0
offset_bottom = -137.0
grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("7_482ps")
[node name="AnimationPlayer" type="AnimationPlayer" parent="GameOverScreen"]
libraries = {
&"": SubResource("AnimationLibrary_pb02i")
}
[node name="VBoxContainer" type="VBoxContainer" parent="GameOverScreen"]
visible = false
offset_left = 230.0
offset_top = 273.0
offset_right = 372.0
offset_bottom = 365.0
[node name="RestartButton" type="Button" parent="GameOverScreen/VBoxContainer"]
layout_mode = 2
icon = SubResource("AtlasTexture_y5tw7")
icon_alignment = 1
script = ExtResource("9_2ybed")
[node name="ExitButton" type="Button" parent="GameOverScreen/VBoxContainer"]
layout_mode = 2
icon = SubResource("AtlasTexture_i7rp7")
icon_alignment = 1
script = ExtResource("10_nvbnq")
[node name="TapPlayer" type="Node" parent="GameOverScreen/VBoxContainer"]
script = ExtResource("11_p133p")
audioStream = ExtResource("12_6gkho")
channel = "button"
metadata/_custom_type_script = "uid://c36bj8u7jghc7"
[node name="GameOverZombie" type="CanvasLayer" parent="."]
process_mode = 3
layer = 12
follow_viewport_enabled = true
[node name="LoseZone" type="Node2D" parent="GameOverZombie"]
script = ExtResource("13_0x4ji")
[node name="Hitbox" type="Area2D" parent="GameOverZombie/LoseZone"]
collision_layer = 2
[node name="CollisionShape2D" type="CollisionShape2D" parent="GameOverZombie/LoseZone/Hitbox"]
position = Vector2(122, 199.5)
shape = SubResource("RectangleShape2D_xsaqy")
[node name="SunSpawner" type="Node" parent="."]
script = ExtResource("14_y72yf")
SunScene = ExtResource("15_7v6ps")
[node name="Timer" type="Timer" parent="SunSpawner"]
wait_time = 10.0
autostart = true
[node name="right_boundary_marker" parent="." instance=ExtResource("16_s7icd")]
position = Vector2(755, 376)
[node name="LeftBoundaryMarker" parent="." instance=ExtResource("17_8qqc4")]
position = Vector2(305, 76)
[connection signal="pressed" from="GameOverScreen/VBoxContainer/RestartButton" to="GameOverScreen/VBoxContainer/TapPlayer" method="Play"]
[connection signal="pressed" from="GameOverScreen/VBoxContainer/ExitButton" to="GameOverScreen/VBoxContainer/TapPlayer" method="Play"]
[connection signal="timeout" from="SunSpawner/Timer" to="SunSpawner" method="Spawn"]

View file

@ -0,0 +1,15 @@
[gd_scene load_steps=4 format=3 uid="uid://bu0dh5ct387xu"]
[ext_resource type="PackedScene" uid="uid://dd3yegl1xo44m" path="res://scenes/templates/level_template.tscn" id="1_vdv3d"]
[ext_resource type="Resource" uid="uid://br3364jty1j0i" path="res://resources/levels/test_level_for_execution.tres" id="2_bpfdr"]
[ext_resource type="Texture2D" uid="uid://b0tb2hjum40aw" path="res://assets/sprites/background_summer.png" id="3_lsqv3"]
[node name="StandardPlayersHouse" instance=ExtResource("1_vdv3d")]
[node name="Data" parent="." index="1"]
levelResource = ExtResource("2_bpfdr")
[node name="Background" type="Sprite2D" parent="Background" index="0"]
position = Vector2(500, 200)
texture = ExtResource("3_lsqv3")
metadata/_edit_lock_ = true

View file

@ -16,6 +16,8 @@ public partial class RuntimeLevelData : Node
[Export] [Export]
public float SunCount { get; private set; } = 0; public float SunCount { get; private set; } = 0;
[Export]
public AdventureLevelResource levelResource;
public event Action<LevelStates> OnLevelStateChanged; public event Action<LevelStates> OnLevelStateChanged;
public static RuntimeLevelData Instance { get; private set; } public static RuntimeLevelData Instance { get; private set; }