diff --git a/audio/music/rumble_revolution_intro.ogg b/audio/music/rumble_revolution_intro.ogg new file mode 100644 index 0000000..e03b86d Binary files /dev/null and b/audio/music/rumble_revolution_intro.ogg differ diff --git a/audio/music/rumble_revolution_intro.ogg.import b/audio/music/rumble_revolution_intro.ogg.import new file mode 100644 index 0000000..6a48b5b --- /dev/null +++ b/audio/music/rumble_revolution_intro.ogg.import @@ -0,0 +1,15 @@ +[remap] + +importer="ogg_vorbis" +type="AudioStreamOGGVorbis" +path="res://.import/rumble_revolution_intro.ogg-cb37ff1dd71c64fd16566b212babca20.oggstr" + +[deps] + +source_file="res://audio/music/rumble_revolution_intro.ogg" +dest_files=[ "res://.import/rumble_revolution_intro.ogg-cb37ff1dd71c64fd16566b212babca20.oggstr" ] + +[params] + +loop=false +loop_offset=0 diff --git a/audio/sounds/gun_cock.ogg b/audio/sounds/gun_cock.ogg new file mode 100644 index 0000000..0b40a9c Binary files /dev/null and b/audio/sounds/gun_cock.ogg differ diff --git a/audio/sounds/gun_cock.ogg.import b/audio/sounds/gun_cock.ogg.import new file mode 100644 index 0000000..8e19965 --- /dev/null +++ b/audio/sounds/gun_cock.ogg.import @@ -0,0 +1,15 @@ +[remap] + +importer="ogg_vorbis" +type="AudioStreamOGGVorbis" +path="res://.import/gun_cock.ogg-e3270054d952c50d489fc1e0bd7a71d1.oggstr" + +[deps] + +source_file="res://audio/sounds/gun_cock.ogg" +dest_files=[ "res://.import/gun_cock.ogg-e3270054d952c50d489fc1e0bd7a71d1.oggstr" ] + +[params] + +loop=false +loop_offset=0 diff --git a/audio/sounds/resolve.ogg b/audio/sounds/resolve.ogg new file mode 100644 index 0000000..8c7ca04 Binary files /dev/null and b/audio/sounds/resolve.ogg differ diff --git a/audio/sounds/resolve.ogg.import b/audio/sounds/resolve.ogg.import new file mode 100644 index 0000000..8948903 --- /dev/null +++ b/audio/sounds/resolve.ogg.import @@ -0,0 +1,15 @@ +[remap] + +importer="ogg_vorbis" +type="AudioStreamOGGVorbis" +path="res://.import/resolve.ogg-36be71144d2911079a46c9c668920ec6.oggstr" + +[deps] + +source_file="res://audio/sounds/resolve.ogg" +dest_files=[ "res://.import/resolve.ogg-36be71144d2911079a46c9c668920ec6.oggstr" ] + +[params] + +loop=false +loop_offset=0 diff --git a/audio/sounds/shard_expel.ogg b/audio/sounds/shard_expel.ogg index ecd54fa..f587096 100644 Binary files a/audio/sounds/shard_expel.ogg and b/audio/sounds/shard_expel.ogg differ diff --git a/autoloads/audio.gd b/autoloads/audio.gd index f3314ef..80b4707 100644 --- a/autoloads/audio.gd +++ b/autoloads/audio.gd @@ -62,6 +62,7 @@ const a_copsquash2 = preload("res://audio/sounds/cop_splat.ogg") const a_fami_transform = preload("res://audio/sounds/fami_transform.ogg") const a_ominous = preload("res://audio/sounds/ominous.ogg") const a_bullet_casing = preload("res://audio/sounds/shell.ogg") +const a_gun_cock = preload("res://audio/sounds/gun_cock.ogg") var loop_section = null var has_looped = false diff --git a/cutscenes/ending_future.tscn b/cutscenes/ending_future.tscn index 27220e4..779d18c 100644 --- a/cutscenes/ending_future.tscn +++ b/cutscenes/ending_future.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=16 format=2] +[gd_scene load_steps=15 format=2] [ext_resource path="res://ui/theme.tres" type="Theme" id=1] [ext_resource path="res://tilesets/t_grass.tres" type="TileSet" id=2] [ext_resource path="res://shaders/ska_plane.gdshader" type="Shader" id=3] -[ext_resource path="res://audio/sounds/intro_voiceover.ogg" type="AudioStream" id=4] [ext_resource path="res://graphics/backgrounds/hills.png" type="Texture" id=5] [ext_resource path="res://graphics/npc/msx_future.png" type="Texture" id=6] [ext_resource path="res://graphics/npc/speccy_future.png" type="Texture" id=7] @@ -67,25 +66,29 @@ material = ExtResource( 11 ) margin_left = 8.0 margin_top = 192.0 margin_right = 248.0 -margin_bottom = 1086.0 +margin_bottom = 1281.0 theme = ExtResource( 1 ) text = "And so with Fami and all the other corruptive forces of the world taken out, a new future is born. The Shards had -turned Fami into Famira, one of the most powerful beings in the entire universe, a monster only bested by SG's +turned Fami into Super Famira, one of the most powerful beings in the entire universe, a monster only bested by SG's heroic courage. SG and the other freedom fighters realized that kind of power should not be able to rest in the hands of anyone, and so a year later, the heroes collected the shards again and sent them to planet x, never to be found again. -a few years after that, SG and their friends created a utopia where everyone shares resources and works together to support each other, -a future without coercive hierarchies or money. +9 years later, on the tenth anniversary of fami's death, SG and the other freedom fighters meet up for a picnic in +celebration of his defeat. -It took the work of many people to establish this utopia, and it +Many things have changed since 2083. Fami's oppressive goverment has crumbled, what was once a totalitarian virginia has now +become a peaceful group of villages living on the landmass known as \"Genesis Island\". + +Much of the world's problems are a thing of the past. The world no longer revolves around money and power. +Instead everyone works together to the best of their ability to support each other and share resources. + +It took the work of many people to create this future, and it takes everyone's contributions to keep it alive. -It's thanks to everyone that the world is saved, not only SG, but their friends as well, and you, the player! - 10 years after Fami died, SG and the other freedom fighters meet up for a picnic in celebration of his defeat. @@ -97,7 +100,9 @@ Lastly, SG adopted a kid named SMS, who is taken care of by SG as well as other friends they've made from their village. SMS looks up to SG and wishes to be a hero one day. Of course, keeping the utopia alive is still important and there are still smaller problems to fix, but hopefully everyone will continue -to live in a world without the need for heroes to defeat great evils." +to live in a world without the need for heroes to defeat great evils. + +It's thanks to everyone that the world is saved, not only SG, but their friends as well, and you, the player!" align = 1 autowrap = true @@ -107,7 +112,6 @@ anims/RESET = SubResource( 2 ) anims/scroll = SubResource( 3 ) [node name="VoiceOver" type="AudioStreamPlayer" parent="."] -stream = ExtResource( 4 ) [node name="TimeskipScene" type="Node2D" parent="."] z_index = -1 diff --git a/cutscenes/fami_cutscene.gd b/cutscenes/fami_cutscene.gd index 2fe27ec..fcb724a 100644 --- a/cutscenes/fami_cutscene.gd +++ b/cutscenes/fami_cutscene.gd @@ -23,6 +23,8 @@ func _physics_process(delta: float) -> void: func _input(event: InputEvent) -> void: if event.is_action_pressed("jump") and animation_player.current_animation_position < (cutscene_skip - Options.transition_speed_secs * 2.0): skip_cutscene() + if event.is_action_pressed("debug_2"): + animation_player.seek(60) func skip_cutscene() -> void: Fade.fade_out(Options.transition_speed_secs) @@ -39,6 +41,12 @@ func kill_cop() -> void: add_child(splatter) $Cop.queue_free() +func stop_music(): + Audio.ac_music.playing = false + +func play_rumble_intro(): + Audio.play_music(load("res://audio/music/rumble_revolution_intro.ogg")) + func _notification(what: int) -> void: match what: NOTIFICATION_WM_FOCUS_OUT: diff --git a/cutscenes/fami_cutscene.tscn b/cutscenes/fami_cutscene.tscn index 9e7c615..c49eaa8 100644 --- a/cutscenes/fami_cutscene.tscn +++ b/cutscenes/fami_cutscene.tscn @@ -1,11 +1,11 @@ -[gd_scene load_steps=45 format=2] +[gd_scene load_steps=46 format=2] [ext_resource path="res://shaders/recolor_border.shader" type="Shader" id=1] [ext_resource path="res://graphics/player/palettes/default.tex" type="Texture" id=2] [ext_resource path="res://ui/theme.tres" type="Theme" id=3] [ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=4] [ext_resource path="res://scripts/sg_palette.gd" type="Script" id=5] -[ext_resource path="res://graphics/player/sg_idle.png" type="Texture" id=6] +[ext_resource path="res://graphics/player/sg.png" type="Texture" id=6] [ext_resource path="res://tilesets/t_station.tres" type="TileSet" id=7] [ext_resource path="res://tilesets/t_laboratory.tres" type="TileSet" id=8] [ext_resource path="res://graphics/npc/fami_human.png" type="Texture" id=9] @@ -22,12 +22,7 @@ [ext_resource path="res://audio/sounds/absorb_shard.ogg" type="AudioStream" id=20] [ext_resource path="res://audio/sounds/shard_expel.ogg" type="AudioStream" id=21] [ext_resource path="res://audio/sounds/shard_float.ogg" type="AudioStream" id=22] - -[sub_resource type="ShaderMaterial" id=1] -shader = ExtResource( 1 ) -shader_param/border_color = Color( 0, 0, 0, 1 ) -shader_param/border_corners = true -shader_param/palette = ExtResource( 2 ) +[ext_resource path="res://audio/sounds/gun_cock.ogg" type="AudioStream" id=23] [sub_resource type="AtlasTexture" id=17] atlas = ExtResource( 18 ) @@ -97,6 +92,12 @@ animations = [ { "speed": 5.0 } ] +[sub_resource type="ShaderMaterial" id=1] +shader = ExtResource( 1 ) +shader_param/border_color = Color( 0, 0, 0, 1 ) +shader_param/border_corners = true +shader_param/palette = ExtResource( 2 ) + [sub_resource type="Animation" id=16] length = 0.001 tracks/0/type = "value" @@ -183,11 +184,58 @@ tracks/6/keys = { "update": 0, "values": [ Vector2( 160, 167 ) ] } +tracks/7/type = "value" +tracks/7/path = NodePath("SgIdle:frame_coords") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("SgIdle:flip_h") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("FamiHuman:animation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ "idle" ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Cop:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -8, 169 ) ] +} [sub_resource type="Animation" id=2] resource_name = "cutscene" length = 93.0 -step = 0.25 tracks/0/type = "value" tracks/0/path = NodePath("Label:text") tracks/0/interp = 1 @@ -268,7 +316,7 @@ tracks/6/loop_wrap = true tracks/6/imported = false tracks/6/enabled = true tracks/6/keys = { -"times": PoolRealArray( 0.5, 64.75, 69.75 ), +"times": PoolRealArray( 0.5, 65.5, 70.75 ), "transitions": PoolRealArray( 1, 1, 1 ), "update": 1, "values": [ false, true, false ] @@ -342,7 +390,7 @@ tracks/12/loop_wrap = true tracks/12/imported = false tracks/12/enabled = true tracks/12/keys = { -"times": PoolRealArray( 0, 64.75 ), +"times": PoolRealArray( 0, 65.5 ), "transitions": PoolRealArray( 1, 1 ), "update": 1, "values": [ false, true ] @@ -359,6 +407,59 @@ tracks/13/keys = { "update": 1, "values": [ false, true ] } +tracks/14/type = "value" +tracks/14/path = NodePath("SgIdle:frame_coords") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 2.6, 2.7, 2.8, 8, 8.1, 8.2, 12.4, 12.5, 13, 17.1092, 17.2092, 18.3092, 25.8, 25.9, 27.9, 36.6, 36.7, 38.7, 41.4, 41.8, 42.2, 42.6, 44.3, 45, 45.5, 46, 46.5, 47.2, 47.7, 48.2, 48.8, 49.5, 50, 50.5, 51, 51.7, 52.2, 52.7, 53.3, 54, 54.5, 55, 55.5, 56.2, 56.7, 57.2, 57.8, 58.5, 59, 59.5, 60.2, 60.8, 61, 61.5, 61.6, 64.25, 71.75, 71.85, 71.975, 72.125, 73, 73.1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03526, 1, 1, 1.03526, 1, 1.03526, 1, 1.03526, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ Vector2( 0, 0 ), Vector2( 0, 0 ), Vector2( 1, 12 ), Vector2( 0, 12 ), Vector2( 0, 0 ), Vector2( 1, 12 ), Vector2( 0, 12 ), Vector2( 0, 0 ), Vector2( 1, 12 ), Vector2( 0, 12 ), Vector2( 0, 0 ), Vector2( 1, 12 ), Vector2( 0, 12 ), Vector2( 0, 0 ), Vector2( 1, 12 ), Vector2( 0, 19 ), Vector2( 0, 19 ), Vector2( 1, 12 ), Vector2( 0, 19 ), Vector2( 1, 12 ), Vector2( 0, 19 ), Vector2( 1, 12 ), Vector2( 0, 19 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 1, 18 ), Vector2( 2, 18 ), Vector2( 3, 18 ), Vector2( 0, 18 ), Vector2( 0, 17 ), Vector2( 0, 0 ), Vector2( 0, 16 ), Vector2( 0, 0 ), Vector2( 0, 17 ), Vector2( 1, 12 ), Vector2( 0, 12 ), Vector2( 1, 12 ), Vector2( 0, 12 ), Vector2( 0, 16 ), Vector2( 0, 0 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("SgIdle:flip_h") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 61.5, 61.6, 73 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ false, false, true, false ] +} +tracks/16/type = "method" +tracks/16/path = NodePath(".") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 64.25, 65.5 ), +"transitions": PoolRealArray( 1, 1 ), +"values": [ { +"args": [ ], +"method": "stop_music" +}, { +"args": [ ], +"method": "play_rumble_intro" +} ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("GunCock:playing") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( -0.1, 60.5 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ false, true ] +} [sub_resource type="ShaderMaterial" id=8] shader = ExtResource( 12 ) @@ -431,20 +532,23 @@ align = 1 valign = 1 autowrap = true -[node name="SgIdle" type="Sprite" parent="."] -material = SubResource( 1 ) -position = Vector2( 96, 169 ) -texture = ExtResource( 6 ) -script = ExtResource( 5 ) - [node name="FamiHuman" type="AnimatedSprite" parent="."] material = ExtResource( 19 ) position = Vector2( 160, 167 ) -scale = Vector2( -1, 1 ) +rotation = 3.14159 +scale = Vector2( 1, -1 ) frames = SubResource( 7 ) animation = "idle" playing = true +[node name="SgIdle" type="Sprite" parent="."] +material = SubResource( 1 ) +position = Vector2( 97, 163 ) +texture = ExtResource( 6 ) +hframes = 8 +vframes = 20 +script = ExtResource( 5 ) + [node name="FamiVoice" type="AudioStreamPlayer" parent="."] stream = ExtResource( 11 ) @@ -458,7 +562,8 @@ anims/cutscene = SubResource( 2 ) material = SubResource( 8 ) position = Vector2( -8, 169 ) frames = SubResource( 13 ) -animation = "gun" +animation = "walk" +frame = 3 playing = true [node name="ShardParticles" type="CPUParticles2D" parent="."] @@ -496,3 +601,7 @@ volume_db = -10.0 [node name="ShardExpel" type="AudioStreamPlayer" parent="."] stream = ExtResource( 21 ) volume_db = -10.0 + +[node name="GunCock" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 23 ) +volume_db = -10.0 diff --git a/graphics/player/sg.png b/graphics/player/sg.png index 56bfbf0..88aaab2 100644 Binary files a/graphics/player/sg.png and b/graphics/player/sg.png differ diff --git a/objects/player/player.tscn b/objects/player/player.tscn index de30453..70d033d 100644 --- a/objects/player/player.tscn +++ b/objects/player/player.tscn @@ -683,7 +683,7 @@ position = Vector2( 0, -10 ) texture = ExtResource( 14 ) offset = Vector2( 0, -6 ) hframes = 8 -vframes = 16 +vframes = 20 [node name="DissolveParticles" type="CPUParticles2D" parent="Graphics"] unique_name_in_owner = true @@ -1302,8 +1302,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"]