diff --git a/autoloads/game.gd b/autoloads/game.gd index 51c5275..3c07606 100644 --- a/autoloads/game.gd +++ b/autoloads/game.gd @@ -189,6 +189,9 @@ func clear_collectibles() -> void: func save(): if marathon_mode: return + + var new_super := Save.current_file.is_super_player() + # get level's save data object var save_id = LevelData.levels[current_level].save_id var save_data: Save.LevelSaveData = Save.current_file.levels[save_id] @@ -215,6 +218,9 @@ func save(): # add to playtime Save.current_file.play_time += time + if new_super and Save.current_file.is_super_player(): + Save.current_file.palette = "super_player" + # save the file Save.current_file.save_to_file() @@ -223,6 +229,9 @@ func save(): func save_boss() -> void: if marathon_mode: return + + var new_super := not Save.current_file.is_super_player() + var save_id = LevelData.levels[current_level].save_id var save_data: Save.LevelSaveData = Save.current_file.levels[save_id] @@ -230,6 +239,10 @@ func save_boss() -> void: save_data.completed = true Save.current_file.play_time += time + + if new_super and Save.current_file.is_super_player(): + Save.current_file.palette = "super_player" + Save.current_file.save_to_file() diff --git a/autoloads/save.gd b/autoloads/save.gd index ba7706b..a865cb4 100644 --- a/autoloads/save.gd +++ b/autoloads/save.gd @@ -118,6 +118,9 @@ class SaveFile: total += level.deaths return total + func is_super_player() -> bool: + return get_total_shards() >= 72 and levels["boss3"].completed + # loads data from the file at `path` func load_from_file() -> void: var file = ConfigFile.new() diff --git a/export_presets.cfg b/export_presets.cfg index ec6ccdd..7a3e24a 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -50,7 +50,7 @@ custom_features="" export_filter="all_resources" include_filter="ngio.ini" exclude_filter="" -export_path="build/linux/Hero Mark 2.x86_64" +export_path="build/linux/Revolution 2083.x86_64" script_export_mode=1 script_encryption_key="" diff --git a/graphics/player/palettes/super_player.tex b/graphics/player/palettes/super_player.tex new file mode 100644 index 0000000..1a1dc28 Binary files /dev/null and b/graphics/player/palettes/super_player.tex differ diff --git a/menus/file_select_panel.gd b/menus/file_select_panel.gd index a2259c6..8061fe3 100644 --- a/menus/file_select_panel.gd +++ b/menus/file_select_panel.gd @@ -62,6 +62,10 @@ func refresh(): $"%Difficulty".text = Game.DIFFICULTY_NAMES[file.difficulty] var palette = load("res://graphics/player/palettes/%s.tex" % file.palette) $"%Palette".material.set_shader_param("palette", palette) + if file.palette == "super_player": + $"%Sparkles".visible = true + else: + $"%Sparkles".visible = false else: file = null $FileExists.visible = false diff --git a/menus/file_select_panel.tscn b/menus/file_select_panel.tscn index db17c96..3be64d2 100644 --- a/menus/file_select_panel.tscn +++ b/menus/file_select_panel.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=2] +[gd_scene load_steps=15 format=2] [ext_resource path="res://shaders/recolor_border.shader" type="Shader" id=1] [ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=2] @@ -10,6 +10,8 @@ [ext_resource path="res://graphics/player/sg_idle.png" type="Texture" id=8] [ext_resource path="res://graphics/player/palettes/default.tex" type="Texture" id=9] [ext_resource path="res://objects/enemy/death_particles.tscn" type="PackedScene" id=10] +[ext_resource path="res://scripts/randomize_particle_start.gd" type="Script" id=11] +[ext_resource path="res://graphics/particles/shine.png" type="Texture" id=12] [sub_resource type="ShaderMaterial" id=1] resource_local_to_scene = true @@ -18,6 +20,9 @@ shader_param/border_color = Color( 0, 0, 0, 1 ) shader_param/border_corners = true shader_param/palette = ExtResource( 9 ) +[sub_resource type="Curve" id=2] +_data = [ Vector2( 0, 0 ), 0.0, 0.100639, 0, 0, Vector2( 0.158257, 1 ), 7.51724, -6.83592, 0, 0, Vector2( 0.31422, 0 ), 0.0, 0.0, 0, 0 ] + [node name="Panel" type="Panel"] margin_right = 72.0 margin_bottom = 88.0 @@ -72,6 +77,25 @@ margin_bottom = 48.0 texture = ExtResource( 8 ) stretch_mode = 4 +[node name="Sparkles" type="CPUParticles2D" parent="FileExists/Palette"] +unique_name_in_owner = true +visible = false +light_mask = 0 +position = Vector2( 10, 16 ) +amount = 2 +lifetime = 2.0 +texture = ExtResource( 12 ) +emission_shape = 2 +emission_rect_extents = Vector2( 4, 10 ) +gravity = Vector2( 0, 0 ) +angular_velocity = 720.0 +angular_velocity_random = 1.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_curve = SubResource( 2 ) +color = Color( 1, 0.972549, 0.52549, 1 ) +script = ExtResource( 11 ) + [node name="ShardCounter" type="Label" parent="FileExists"] unique_name_in_owner = true margin_left = 43.0 diff --git a/menus/level_select_scholar.gd b/menus/level_select_scholar.gd index 5dc5ae8..40885a3 100644 --- a/menus/level_select_scholar.gd +++ b/menus/level_select_scholar.gd @@ -41,6 +41,8 @@ func _ready() -> void: Audio.play_music(music) var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) player_sprite.material.set_shader_param("palette", palette) + if Game.current_palette == "super_player": + $"%Sparkles".visible = true $ShardCount.text = "%02d" % Save.current_file.get_total_shards() Fade.fade_in(Options.transition_speed_secs) # set initial offset diff --git a/menus/level_select_scholar.tscn b/menus/level_select_scholar.tscn index 89e32eb..f5907f2 100644 --- a/menus/level_select_scholar.tscn +++ b/menus/level_select_scholar.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=45 format=2] +[gd_scene load_steps=48 format=2] [ext_resource path="res://menus/level_select_scholar.gd" type="Script" id=1] [ext_resource path="res://graphics/level_select/world_map.png" type="Texture" id=2] @@ -19,6 +19,8 @@ [ext_resource path="res://shaders/recolor.tres" type="Shader" id=17] [ext_resource path="res://objects/hud/options_screen_scholar.tscn" type="PackedScene" id=18] [ext_resource path="res://objects/hud/menu_sounds.tscn" type="PackedScene" id=19] +[ext_resource path="res://scripts/randomize_particle_start.gd" type="Script" id=20] +[ext_resource path="res://graphics/particles/shine.png" type="Texture" id=21] [sub_resource type="CanvasItemMaterial" id=9] particles_animation = true @@ -35,6 +37,9 @@ _data = { shader = ExtResource( 17 ) shader_param/palette = ExtResource( 16 ) +[sub_resource type="Curve" id=27] +_data = [ Vector2( 0, 0 ), 0.0, 0.100639, 0, 0, Vector2( 0.158257, 1 ), 7.51724, -6.83592, 0, 0, Vector2( 0.31422, 0 ), 0.0, 0.0, 0, 0 ] + [sub_resource type="ShaderMaterial" id=2] shader = ExtResource( 7 ) shader_param/speed = Vector2( 4, 0 ) @@ -964,6 +969,24 @@ material = SubResource( 15 ) position = Vector2( 0, -2 ) texture = ExtResource( 3 ) +[node name="Sparkles" type="CPUParticles2D" parent="LevelPath/PlayerPosition/PlayerSprite"] +unique_name_in_owner = true +visible = false +light_mask = 0 +amount = 1 +lifetime = 2.0 +texture = ExtResource( 21 ) +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +gravity = Vector2( 0, 0 ) +angular_velocity = 720.0 +angular_velocity_random = 1.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_curve = SubResource( 27 ) +color = Color( 0.996078, 1, 0.760784, 1 ) +script = ExtResource( 20 ) + [node name="hills" type="PathFollow2D" parent="LevelPath"] position = Vector2( 61, 140 ) rotation = 1.04814 diff --git a/menus/palette_select.gd b/menus/palette_select.gd index 65d053d..f2ed40d 100644 --- a/menus/palette_select.gd +++ b/menus/palette_select.gd @@ -15,6 +15,10 @@ onready var sg: AnimatedSprite = $SG func _ready() -> void: assert(titles.size() == palettes.size(), "titles and palettes arrays are not same size") + if Save.current_file.is_super_player(): + palettes.append(preload("res://graphics/player/palettes/super_player.tex")) + titles.append("Super Player") + for i in palettes.size(): var id = palettes[i].resource_path.get_file().get_basename() if id == Save.current_file.palette: @@ -41,5 +45,9 @@ func _input(event: InputEvent) -> void: sg.material.set_shader_param("palette", palettes[current_palette]) $"%PaletteTitle".text = titles[current_palette] Game.current_palette = palettes[current_palette].resource_path.get_file().get_basename() + if Game.current_palette == "super_player": + $"%Sparkles".visible = true + else: + $"%Sparkles".visible = false Save.current_file.palette = Game.current_palette Save.current_file.save_to_file() diff --git a/menus/palette_select.tscn b/menus/palette_select.tscn index 0b294b1..75f46d8 100644 --- a/menus/palette_select.tscn +++ b/menus/palette_select.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=47 format=2] +[gd_scene load_steps=51 format=2] [ext_resource path="res://shaders/ska_plane.gdshader" type="Shader" id=1] [ext_resource path="res://ui/theme.tres" type="Theme" id=2] @@ -37,6 +37,9 @@ [ext_resource path="res://graphics/player/palettes/nightrunner.tex" type="Texture" id=35] [ext_resource path="res://graphics/player/palettes/typhoon.tex" type="Texture" id=36] [ext_resource path="res://objects/hud/menu_sounds.tscn" type="PackedScene" id=37] +[ext_resource path="res://scripts/randomize_particle_start.gd" type="Script" id=38] +[ext_resource path="res://graphics/particles/shine.png" type="Texture" id=39] +[ext_resource path="res://graphics/player/palettes/super_player.tex" type="Texture" id=40] [sub_resource type="ShaderMaterial" id=1] shader = ExtResource( 1 ) @@ -52,7 +55,7 @@ shader_param/uv_transform = Transform2D( 0.5, -0.5, 0.5, 1, 0, 0 ) shader = ExtResource( 4 ) shader_param/border_color = Color( 0, 0, 0, 1 ) shader_param/border_corners = true -shader_param/palette = ExtResource( 18 ) +shader_param/palette = ExtResource( 40 ) [sub_resource type="AtlasTexture" id=5] atlas = ExtResource( 10 ) @@ -78,6 +81,9 @@ animations = [ { "speed": 10.0 } ] +[sub_resource type="Curve" id=10] +_data = [ Vector2( 0, 0 ), 0.0, 0.100639, 0, 0, Vector2( 0.158257, 1 ), 7.51724, -6.83592, 0, 0, Vector2( 0.31422, 0 ), 0.0, 0.0, 0, 0 ] + [sub_resource type="ShaderMaterial" id=3] shader = ExtResource( 8 ) shader_param/speed = Vector2( 4, 0 ) @@ -156,8 +162,27 @@ material = SubResource( 2 ) position = Vector2( 128, 128 ) scale = Vector2( 3, 3 ) frames = SubResource( 9 ) +frame = 2 playing = true +[node name="Sparkles" type="CPUParticles2D" parent="SG"] +unique_name_in_owner = true +light_mask = 0 +position = Vector2( 0, 6.33333 ) +amount = 2 +lifetime = 2.0 +texture = ExtResource( 39 ) +emission_shape = 2 +emission_rect_extents = Vector2( 4, 10 ) +gravity = Vector2( 0, 0 ) +angular_velocity = 720.0 +angular_velocity_random = 1.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_curve = SubResource( 10 ) +color = Color( 1, 0.972549, 0.52549, 1 ) +script = ExtResource( 38 ) + [node name="CenterContainer" type="CenterContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 diff --git a/objects/collectibles/key.tscn b/objects/collectibles/key.tscn index 3bec256..41cc04b 100644 --- a/objects/collectibles/key.tscn +++ b/objects/collectibles/key.tscn @@ -76,7 +76,6 @@ material = SubResource( 7 ) position = Vector2( 0, -1 ) frames = SubResource( 5 ) animation = "key" -frame = 5 playing = true centered = false diff --git a/objects/player/player.gd b/objects/player/player.gd index 540c742..7c6c2ad 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -75,6 +75,8 @@ func _ready() -> void: sprite.material.set_shader_param("palette", palette) $"%CFox".material.set_shader_param("palette", palette) $"%DissolveParticles".material.set_shader_param("palette", palette) + if Game.current_palette == "super_player": + $"%Sparkles".visible = true # death handling Game.respawn_point = global_position diff --git a/objects/player/player.tscn b/objects/player/player.tscn index df769ac..b51552d 100644 --- a/objects/player/player.tscn +++ b/objects/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=49 format=2] +[gd_scene load_steps=52 format=2] [ext_resource path="res://objects/player/player.gd" type="Script" id=1] [ext_resource path="res://graphics/player/sg_zap.png" type="Texture" id=2] @@ -14,6 +14,8 @@ [ext_resource path="res://graphics/player/palettes/default.tex" type="Texture" id=12] [ext_resource path="res://shaders/electricity.gdshader" type="Shader" id=13] [ext_resource path="res://graphics/player/sg.png" type="Texture" id=14] +[ext_resource path="res://scripts/randomize_particle_start.gd" type="Script" id=15] +[ext_resource path="res://graphics/particles/shine.png" type="Texture" id=16] [ext_resource path="res://graphics/particles/dust.png" type="Texture" id=18] [ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=25] @@ -23,6 +25,9 @@ shader_param/border_color = Color( 0, 0, 0, 1 ) shader_param/border_corners = true shader_param/palette = ExtResource( 12 ) +[sub_resource type="Curve" id=34] +_data = [ Vector2( 0, 0 ), 0.0, 0.100639, 0, 0, Vector2( 0.158257, 1 ), 7.51724, -6.83592, 0, 0, Vector2( 0.31422, 0 ), 0.0, 0.0, 0, 0 ] + [sub_resource type="ShaderMaterial" id=32] shader = ExtResource( 13 ) shader_param/arc_speed = 4.0 @@ -890,6 +895,24 @@ offset = Vector2( 0, -6 ) hframes = 8 vframes = 20 +[node name="Sparkles" type="CPUParticles2D" parent="Graphics/Sprite"] +unique_name_in_owner = true +visible = false +light_mask = 0 +amount = 2 +lifetime = 2.0 +texture = ExtResource( 16 ) +emission_shape = 2 +emission_rect_extents = Vector2( 4, 10 ) +gravity = Vector2( 0, 0 ) +angular_velocity = 720.0 +angular_velocity_random = 1.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_curve = SubResource( 34 ) +color = Color( 1, 0.972549, 0.52549, 1 ) +script = ExtResource( 15 ) + [node name="ZapSprite" type="AnimatedSprite" parent="Graphics"] visible = false material = SubResource( 32 ) @@ -982,6 +1005,7 @@ shape = SubResource( 2 ) [node name="Hitbox" type="Area2D" parent="." groups=["player_hitbox"]] unique_name_in_owner = true +visible = false collision_layer = 11 collision_mask = 32 @@ -1508,8 +1532,8 @@ align = 1 [connection signal="state_entered" from="StateChart/Root/Movement/Grounded/Shooting" to="." method="_on_Shooting_state_entered"] [connection signal="state_entered" from="StateChart/Root/Movement/Grounded/Pushing" to="." method="_on_Pushing_state_entered"] [connection signal="state_physics_processing" from="StateChart/Root/Movement/Grounded/Pushing" to="." method="_process_pushing"] -[connection signal="state_entered" from="StateChart/Root/Movement/Airborne" to="." method="reset_fall_speed"] [connection signal="state_entered" from="StateChart/Root/Movement/Airborne" to="." method="_on_Airborne_state_entered"] +[connection signal="state_entered" from="StateChart/Root/Movement/Airborne" to="." method="reset_fall_speed"] [connection signal="state_physics_processing" from="StateChart/Root/Movement/Airborne" to="." method="_process_gravity"] [connection signal="state_physics_processing" from="StateChart/Root/Movement/Airborne/Jump" to="." method="_process_horizontal_movement"] [connection signal="state_physics_processing" from="StateChart/Root/Movement/Airborne/Jump" to="." method="_process_jump"] @@ -1534,8 +1558,8 @@ align = 1 [connection signal="state_entered" from="StateChart/Root/Movement/Teleporting" to="." method="_on_Inactive_state_entered"] [connection signal="state_entered" from="StateChart/Root/Movement/Teleporting" to="." method="_on_Teleporting_state_entered"] [connection signal="state_exited" from="StateChart/Root/Movement/Teleporting" to="." method="_on_Inactive_state_exited"] -[connection signal="state_entered" from="StateChart/Root/Movement/Appearing" to="." method="_on_Appearing_state_entered"] [connection signal="state_entered" from="StateChart/Root/Movement/Appearing" to="." method="_on_Inactive_state_entered"] +[connection signal="state_entered" from="StateChart/Root/Movement/Appearing" to="." method="_on_Appearing_state_entered"] [connection signal="state_exited" from="StateChart/Root/Movement/Appearing" to="." method="_on_Inactive_state_exited"] [connection signal="state_entered" from="StateChart/Root/Health/Respawn" to="." method="_on_Respawn_state_entered"] [connection signal="state_entered" from="StateChart/Root/Health/Dead" to="." method="_on_Dead_state_entered"]