diff --git a/autoloads/debug.gd b/autoloads/debug.gd index 506845c..9356838 100644 --- a/autoloads/debug.gd +++ b/autoloads/debug.gd @@ -38,9 +38,9 @@ func _physics_process(delta): if not nodes.empty(): var player = nodes[0] var mouse_position = SceneManager.viewport.get_mouse_position() / SceneManager.viewport_container.rect_scale - mouse_position.x = clamp(mouse_position.x, 8.0, Game.resolution.x - 8.0) - mouse_position.y = clamp(mouse_position.y, 8.0, Game.resolution.y - 8.0) - var world_position = mouse_position + Game.current_sector * Game.resolution + mouse_position.x = clamp(mouse_position.x, 8.0, Game.RESOLUTION.x - 8.0) + mouse_position.y = clamp(mouse_position.y, 8.0, Game.RESOLUTION.y - 8.0) + var world_position = mouse_position + Game.current_sector * Game.RESOLUTION player.position = world_position # Game.get_map().get_node("Player").position = get_viewport().get_mouse_position() diff --git a/autoloads/game.gd b/autoloads/game.gd index 5ab7b1e..9454855 100644 --- a/autoloads/game.gd +++ b/autoloads/game.gd @@ -1,5 +1,7 @@ extends Node + +## difficulty levels enum Difficulty { SWEET, # slower enemies, infinite lives SALTY, # normal enemies, infinite lives @@ -7,51 +9,57 @@ enum Difficulty { PUNGENT, # faster enemies, 3 lives } -enum Bonuses { - Collection_Bonus, - Time_Bonus, - Life_Bonus, - Perfect_Bonus -} -const DIFFICULTY_NAMES = ["Sweet","Salty","Spicy","Pungent"] +## resolution the game renders at +const RESOLUTION := Vector2(256,192) +const DIFFICULTY_NAMES := ["Sweet","Salty","Spicy","Pungent"] -var resolution = Vector2(256,192) -var current_sector = Vector2(0,0) -#Onreadys -#Collectibles -var keys = 0 -var stars = [false,false,false,false,false] -var shards = 0 -var arrows = 0 -var score = 0 -var final_score = 0 -var high_score = 0 -var bonuses = [0,0,0,0] -var lives = 2 -var deaths = 0 -var time = 0.0 -#Objects -const block_text = preload("res://objects/hud/blocktext.tscn") -const pause_screen = preload("res://objects/hud/pause_screen.tscn") -#Game info -var respawn_point = Vector2(32,166) #Respawn point -var current_level = 0 #Current level being played -var current_file = 1 #Current save file -var shards_collected = [false,false,false,false,false,false,false,false,false,false] -var is_marathon_mode = false + +#== collectibles ==# +var keys: int = 0 # collected keys +## which stars are collected +var stars_collected := [false,false,false,false,false] +var stars : int setget , _get_stars # total stars +## which stars are collected +var shards_collected := [false,false,false,false,false,false,false,false] +## how many shards collected +var shards: int setget , _get_shards # total shards +var arrows: int = 0 # current arrows +#== stats ==# +var lives: int = 2 +var deaths: int = 0 +var time: float = 0.0 +#== score ==# +var score: int = 0 +var collection_bonus: int = 0 +var time_bonus: int = 0 +var life_bonus: int = 0 +var perfect_bonus: int = 0 +var final_score: int = 0 +#== state ==# +var current_sector := Vector2.ZERO +var respawn_point := Vector2(32,166) +var current_level: int = 0 var difficulty: int = Difficulty.SPICY setget _set_difficulty var enemy_speed_factor: float = 1.0 # multiplier of enemy speed -var is_easy_mode = false # whether to do easy-specific behaviors -var easy_mode_speed_factor = 0.75 # DEPRECATED: speed enemies go in easy mode -var use_lives = false -var can_pause = true -var current_palette = "default" +var is_easy_mode: bool = false # whether to do easy-specific behaviors +var use_lives: bool = false +var can_pause: bool = true +var current_palette: String = "default" + func _ready(): pause_mode = Node.PAUSE_MODE_PROCESS +func _get_stars() -> int: + return stars_collected.count(true) + + +func _get_shards() -> int: + return shards_collected.count(true) + + # stuff to change when setting difficulty func _set_difficulty(value: int) -> void: difficulty = value @@ -81,14 +89,50 @@ func instance_node(node:PackedScene,x:float,y:float,parent): #Get position in sectors func get_sector(pos): - return (pos / resolution).floor() + return (pos / RESOLUTION).floor() #Return the current Map func get_map(): return get_tree().get_nodes_in_group("map")[0] + +## tally up scores +func tally_scores() -> void: + var map = get_map() + # collection bonus + if keys >= 50: + collection_bonus += 500 + if keys >= 5: + collection_bonus += 500 + # 100% collection + if keys >= 50 and shards >= 5: + collection_bonus += 250 + shards_collected[5] = true + # 100% time bonus + if time < map.target_time_100: + time_bonus = max(2500 - 2500 * int(time / map.target_time_100), 0) + shards_collected[6] = true + else: + # any% time bonus + if time < map.target_time_any: + time_bonus = max(2500 - 2500 * int(time / map.target_time_any), 0) + shards_collected[6] = true + # life bonus + if deaths == 0: + life_bonus = 500 + shards_collected[7] = true + elif deaths == 1: + life_bonus = 1500 + # perfect bonus + if shards_collected[5] and shards_collected[6] and shards_collected[7]: + perfect_bonus += 1000 + # final score + final_score = score + collection_bonus + time_bonus + life_bonus + perfect_bonus + Game.save() + + #Go to new map -func change_map(map: PackedScene): +func change_map(map: PackedScene) -> void: get_tree().paused = true can_pause = false Fade.fade_out(0.4) @@ -105,15 +149,21 @@ func change_map(map: PackedScene): SceneManager.current_scene = map.instance() #Clear data -func clear_collectibles(): - score = 0 +func clear_collectibles() -> void: + # collectibles keys = 0 - stars = [false,false,false,false,false] - shards = 0 - shards_collected = [false,false,false,false,false,false,false,false,false,false] + stars_collected.fill(false) + shards_collected.fill(false) arrows = 0 lives = 2 deaths = 0 + # score + score = 0 + collection_bonus = 0 + time_bonus = 0 + life_bonus = 0 + perfect_bonus = 0 + final_score = 0 #Save func save(): @@ -126,7 +176,7 @@ func save(): save_data.score_100 = max(save_data.score_100, final_score) save_data.time_100 = min(save_data.time_100, time) else: - save_data.score_any = max(save_data.score_100, final_score) + save_data.score_any = max(save_data.score_any, final_score) save_data.time_any = min(save_data.time_any, time) # set shards @@ -158,11 +208,10 @@ func timeify(input): #Restart level func restart_level(): - if score > high_score: high_score = score score = 0 keys = 0 - stars = [false,false,false,false,false] - shards = 0 + stars_collected.fill(false) + shards_collected.fill(false) arrows = 0 lives = 2 Audio.ac_climb.stop() diff --git a/maps/map.gd b/maps/map.gd index e5e4b62..d43b6da 100644 --- a/maps/map.gd +++ b/maps/map.gd @@ -1,4 +1,7 @@ extends Node2D + +const PauseScreen := preload("res://objects/hud/pause_screen.tscn") + export var target_time_any = 0 export var target_time_100 = 0 export (AudioStream) var music @@ -16,12 +19,14 @@ func _ready(): Fade.connect("fade_finished", get_tree(), "set_pause", [false], CONNECT_ONESHOT) Fade.connect("fade_finished", Game, "set", ["can_pause", true], CONNECT_ONESHOT) Audio.play_music(music) + Game.time = 0.0 func _physics_process(delta): + Game.time += delta if Debug.entry == false && Game.can_pause: #Pause if Input.is_action_just_pressed("pause") && !get_tree().paused: - var pause = Game.pause_screen.instance() + var pause = PauseScreen.instance() if lore_entries != null && !lore_entries.empty(): var entry = lore_entries[randi() % lore_entries.size()] pause.lore_entry = entry diff --git a/maps/station.gd b/maps/station.gd index 6e2c912..9ac633d 100644 --- a/maps/station.gd +++ b/maps/station.gd @@ -1,6 +1,6 @@ extends "res://maps/map.gd" -var acab_shard_has_been_collected = false +var acab_shard_has_been_collected: bool = false func _physics_process(delta): ._physics_process(delta) @@ -8,6 +8,5 @@ func _physics_process(delta): if !acab_shard_has_been_collected: Audio.play_shard_sound() Game.score += 500 - Game.shards += 1 Game.shards_collected[0] = true acab_shard_has_been_collected = true diff --git a/menus/results.gd b/menus/results.gd index d144d48..9cfab7a 100644 --- a/menus/results.gd +++ b/menus/results.gd @@ -1,16 +1,28 @@ -extends Node2D +extends Node -# Declare member variables here. Examples: -# var a = 2 -# var b = "text" +onready var shards: Node2D = $Shards +onready var collection_bonus: Sprite = $Bonuses/CollectionBonus +onready var time_bonus: Sprite = $Bonuses/TimeBonus +onready var life_bonus: Sprite = $Bonuses/LifeBonus +onready var perfect_bonus: Sprite = $Bonuses/PerfectBonus +onready var final_score: Label = $FinalScore -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. +func _ready() -> void: + # tween for sequencing + var tween = create_tween() + # fill in shard names + var level: LevelEntry = LevelData.levels[Game.current_level] + for i in 5: + var shard = shards.get_child(i) + shard.get_node("Title").text = level.shard_titles[i] + # shard collect animations + tween.tween_interval(0.5) + if Game.shards_collected[i]: + tween.tween_callback(shard, "collect") - -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass +func _physics_process(delta: float) -> void: + if Input.is_action_just_released("ui_accept"): + Game.clear_collectibles() + SceneManager.change_scene(preload("res://menus/level_select_scholar.tscn").instance()) diff --git a/menus/results.tscn b/menus/results.tscn index 1d676a2..9707a8f 100644 --- a/menus/results.tscn +++ b/menus/results.tscn @@ -1,6 +1,5 @@ -[gd_scene load_steps=25 format=2] +[gd_scene load_steps=17 format=2] -[ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=1] [ext_resource path="res://shaders/ska_plane.gdshader" type="Shader" id=2] [ext_resource path="res://graphics/collectibles/shard.png" type="Texture" id=3] [ext_resource path="res://graphics/hud/results.png" type="Texture" id=4] @@ -11,8 +10,8 @@ [ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=9] [ext_resource path="res://ui/theme.tres" type="Theme" id=10] [ext_resource path="res://ui/arrow_figure_8.tres" type="Material" id=11] -[ext_resource path="res://menus/shard_results.tscn" type="PackedScene" id=12] [ext_resource path="res://menus/results.gd" type="Script" id=13] +[ext_resource path="res://menus/results_icon.tscn" type="PackedScene" id=14] [sub_resource type="ShaderMaterial" id=5] shader = ExtResource( 2 ) @@ -24,114 +23,10 @@ shader_param/cycle_speed = Vector2( 12, 0 ) shader_param/cycle_alternation = Vector2( 2, 0 ) shader_param/uv_transform = Transform2D( 1, 1, 0, 1, 0, 0 ) -[sub_resource type="ShaderMaterial" id=6] -shader = ExtResource( 1 ) -shader_param/border_color = Color( 0, 0, 0, 1 ) -shader_param/border_corners = false - -[sub_resource type="ShaderMaterial" id=7] -shader = ExtResource( 1 ) -shader_param/border_color = Color( 0, 0, 0, 1 ) -shader_param/border_corners = false - -[sub_resource type="ShaderMaterial" id=8] -shader = ExtResource( 1 ) -shader_param/border_color = Color( 0, 0, 0, 1 ) -shader_param/border_corners = false - -[sub_resource type="Animation" id=9] -resource_name = "Collect" -step = 0.5 -tracks/0/type = "value" -tracks/0/path = NodePath("Sprite:scale") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 0.15, 0.3, 0.375, 1 ), -"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), -"update": 0, -"values": [ Vector2( 0, 0 ), Vector2( 1, 1 ), Vector2( 1.3, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ] -} -tracks/1/type = "value" -tracks/1/path = NodePath("CollectedParticle:emitting") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ true ] -} - -[sub_resource type="ShaderMaterial" id=10] -shader = ExtResource( 1 ) -shader_param/border_color = Color( 0, 0, 0, 1 ) -shader_param/border_corners = false - -[sub_resource type="Animation" id=11] -resource_name = "Collect" -step = 0.5 -tracks/0/type = "value" -tracks/0/path = NodePath("Sprite:scale") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 0.15, 0.3, 0.375, 1 ), -"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), -"update": 0, -"values": [ Vector2( 0, 0 ), Vector2( 1, 1 ), Vector2( 1.3, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ] -} -tracks/1/type = "value" -tracks/1/path = NodePath("CollectedParticle:emitting") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ true ] -} - -[sub_resource type="ShaderMaterial" id=12] -shader = ExtResource( 1 ) -shader_param/border_color = Color( 0, 0, 0, 1 ) -shader_param/border_corners = false - -[sub_resource type="Animation" id=13] -resource_name = "Collect" -step = 0.5 -tracks/0/type = "value" -tracks/0/path = NodePath("Sprite:scale") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/keys = { -"times": PoolRealArray( 0, 0.15, 0.3, 0.375, 1 ), -"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), -"update": 0, -"values": [ Vector2( 0, 0 ), Vector2( 1, 1 ), Vector2( 1.3, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ] -} -tracks/1/type = "value" -tracks/1/path = NodePath("CollectedParticle:emitting") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ true ] -} +[sub_resource type="Gradient" id=2] +interpolation_mode = 2 +offsets = PoolRealArray( 0, 0.734694, 1 ) +colors = PoolColorArray( 0.576471, 0.980392, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 ) [sub_resource type="Animation" id=3] resource_name = "New Anim" @@ -142,7 +37,7 @@ loop = true resource_name = "results" length = 50.0 tracks/0/type = "value" -tracks/0/path = NodePath("ShardSprites/ShardTitle1:visible") +tracks/0/path = NodePath("Shards/Shard1/Title:visible") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/imported = false @@ -154,7 +49,7 @@ tracks/0/keys = { "values": [ false ] } tracks/1/type = "value" -tracks/1/path = NodePath("ShardSprites/ShardTitle2:visible") +tracks/1/path = NodePath("Shards/Shard2/Title:visible") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/imported = false @@ -166,7 +61,7 @@ tracks/1/keys = { "values": [ false ] } tracks/2/type = "value" -tracks/2/path = NodePath("ShardSprites/ShardTitle3:visible") +tracks/2/path = NodePath("Shards/Shard3/Title:visible") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/imported = false @@ -178,7 +73,7 @@ tracks/2/keys = { "values": [ false ] } tracks/3/type = "value" -tracks/3/path = NodePath("ShardSprites/ShardTitle4:visible") +tracks/3/path = NodePath("Score:visible") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/imported = false @@ -190,7 +85,7 @@ tracks/3/keys = { "values": [ false ] } tracks/4/type = "value" -tracks/4/path = NodePath("ShardSprites/ShardTitle5:visible") +tracks/4/path = NodePath("Bonuses/CollectionBonus/CollectionBonusText:visible") tracks/4/interp = 1 tracks/4/loop_wrap = true tracks/4/imported = false @@ -202,7 +97,7 @@ tracks/4/keys = { "values": [ false ] } tracks/5/type = "value" -tracks/5/path = NodePath("Score:visible") +tracks/5/path = NodePath("Bonuses/TimeBonus/TimeBonusText:visible") tracks/5/interp = 1 tracks/5/loop_wrap = true tracks/5/imported = false @@ -214,7 +109,7 @@ tracks/5/keys = { "values": [ false ] } tracks/6/type = "value" -tracks/6/path = NodePath("BonusSprites/CollectionBonusText:visible") +tracks/6/path = NodePath("Bonuses/LifeBonus/LifeBonusText:visible") tracks/6/interp = 1 tracks/6/loop_wrap = true tracks/6/imported = false @@ -226,7 +121,7 @@ tracks/6/keys = { "values": [ false ] } tracks/7/type = "value" -tracks/7/path = NodePath("BonusSprites/TimeBonusText:visible") +tracks/7/path = NodePath("Bonuses/PerfectBonus/PerfectBonusText:visible") tracks/7/interp = 1 tracks/7/loop_wrap = true tracks/7/imported = false @@ -238,7 +133,7 @@ tracks/7/keys = { "values": [ false ] } tracks/8/type = "value" -tracks/8/path = NodePath("BonusSprites/LifeBonusText:visible") +tracks/8/path = NodePath("FinalScore:visible") tracks/8/interp = 1 tracks/8/loop_wrap = true tracks/8/imported = false @@ -249,142 +144,186 @@ tracks/8/keys = { "update": 1, "values": [ false ] } -tracks/9/type = "value" -tracks/9/path = NodePath("BonusSprites/PerfectBonusText:visible") -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": [ false ] -} -tracks/10/type = "value" -tracks/10/path = NodePath("Final Score:visible") -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": 1, -"values": [ false ] -} -[node name="Results" type="Node2D"] +[node name="Results" type="Node"] script = ExtResource( 13 ) -[node name="ColorRect" type="ColorRect" parent="."] +[node name="Background" type="ColorRect" parent="."] material = SubResource( 5 ) -margin_right = 256.0 -margin_bottom = 192.0 +anchor_right = 1.0 +anchor_bottom = 1.0 __meta__ = { "_edit_lock_": true } -[node name="ShardSprites" type="Node2D" parent="."] -position = Vector2( 0, -10 ) +[node name="Shards" type="Node2D" parent="."] -[node name="Empty1" type="Sprite" parent="ShardSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 6 ) -position = Vector2( 24, 24 ) +[node name="Shard1" parent="Shards" instance=ExtResource( 14 )] +position = Vector2( 24, 14 ) texture = ExtResource( 3 ) -[node name="Empty2" type="Sprite" parent="ShardSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 6 ) -position = Vector2( 24, 40 ) -texture = ExtResource( 3 ) - -[node name="Empty3" type="Sprite" parent="ShardSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 6 ) -position = Vector2( 24, 56 ) -texture = ExtResource( 3 ) - -[node name="Empty4" type="Sprite" parent="ShardSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 6 ) -position = Vector2( 24, 72 ) -texture = ExtResource( 3 ) - -[node name="Empty5" type="Sprite" parent="ShardSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 6 ) -position = Vector2( 24, 88 ) -texture = ExtResource( 3 ) - -[node name="Shard" parent="ShardSprites" instance=ExtResource( 12 )] -position = Vector2( 23, 23 ) - -[node name="Shard2" parent="ShardSprites" instance=ExtResource( 12 )] -position = Vector2( 23, 39 ) - -[node name="Shard3" parent="ShardSprites" instance=ExtResource( 12 )] -position = Vector2( 23, 55 ) - -[node name="Shard4" parent="ShardSprites" instance=ExtResource( 12 )] -position = Vector2( 23, 71 ) - -[node name="Shard5" parent="ShardSprites" instance=ExtResource( 12 )] -position = Vector2( 23, 87 ) - -[node name="ShardTitle1" type="Label" parent="ShardSprites"] -visible = false +[node name="Title" type="Label" parent="Shards/Shard1"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 18.0 -margin_right = 200.0 -margin_bottom = 32.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "AAAAAAAAAAAAAAAAAAAAAAAA" -[node name="ShardTitle2" type="Label" parent="ShardSprites"] -visible = false +[node name="CollectedParticles" type="CPUParticles2D" parent="Shards/Shard1"] +pause_mode = 2 +emitting = false +amount = 64 +one_shot = true +explosiveness = 1.0 +local_coords = false +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +direction = Vector2( 0, -1 ) +spread = 180.0 +gravity = Vector2( 0, 150 ) +initial_velocity = 250.0 +initial_velocity_random = 0.9 +damping = 2.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_random = 1.0 +color_ramp = SubResource( 2 ) + +[node name="Shard2" parent="Shards" instance=ExtResource( 14 )] +position = Vector2( 24, 30 ) +texture = ExtResource( 3 ) + +[node name="Title" type="Label" parent="Shards/Shard2"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 34.0 -margin_right = 200.0 -margin_bottom = 48.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "AAAAAAAAAAAAAAAAAAAAAAAA" -[node name="ShardTitle3" type="Label" parent="ShardSprites"] -visible = false +[node name="CollectedParticles" type="CPUParticles2D" parent="Shards/Shard2"] +pause_mode = 2 +emitting = false +amount = 64 +one_shot = true +explosiveness = 1.0 +local_coords = false +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +direction = Vector2( 0, -1 ) +spread = 180.0 +gravity = Vector2( 0, 150 ) +initial_velocity = 250.0 +initial_velocity_random = 0.9 +damping = 2.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_random = 1.0 +color_ramp = SubResource( 2 ) + +[node name="Shard3" parent="Shards" instance=ExtResource( 14 )] +position = Vector2( 24, 46 ) +texture = ExtResource( 3 ) + +[node name="Title" type="Label" parent="Shards/Shard3"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 50.0 -margin_right = 200.0 -margin_bottom = 64.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "AAAAAAAAAAAAAAAAAAAAAAAA" -[node name="ShardTitle4" type="Label" parent="ShardSprites"] -visible = false +[node name="CollectedParticle" type="CPUParticles2D" parent="Shards/Shard3"] +pause_mode = 2 +emitting = false +amount = 64 +one_shot = true +explosiveness = 1.0 +local_coords = false +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +direction = Vector2( 0, -1 ) +spread = 180.0 +gravity = Vector2( 0, 150 ) +initial_velocity = 250.0 +initial_velocity_random = 0.9 +damping = 2.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_random = 1.0 +color_ramp = SubResource( 2 ) + +[node name="Shard4" parent="Shards" instance=ExtResource( 14 )] +position = Vector2( 24, 62 ) +texture = ExtResource( 3 ) + +[node name="Title" type="Label" parent="Shards/Shard4"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 66.0 -margin_right = 200.0 -margin_bottom = 80.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "AAAAAAAAAAAAAAAAAAAAAAAA" -[node name="ShardTitle5" type="Label" parent="ShardSprites"] -visible = false +[node name="CollectedParticle" type="CPUParticles2D" parent="Shards/Shard4"] +pause_mode = 2 +emitting = false +amount = 64 +one_shot = true +explosiveness = 1.0 +local_coords = false +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +direction = Vector2( 0, -1 ) +spread = 180.0 +gravity = Vector2( 0, 150 ) +initial_velocity = 250.0 +initial_velocity_random = 0.9 +damping = 2.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_random = 1.0 +color_ramp = SubResource( 2 ) + +[node name="Shard5" parent="Shards" instance=ExtResource( 14 )] +position = Vector2( 24, 78 ) +texture = ExtResource( 3 ) + +[node name="Title" type="Label" parent="Shards/Shard5"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 82.0 -margin_right = 200.0 -margin_bottom = 96.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "AAAAAAAAAAAAAAAAAAAAAAAA" +[node name="CollectedParticle" type="CPUParticles2D" parent="Shards/Shard5"] +pause_mode = 2 +emitting = false +amount = 64 +one_shot = true +explosiveness = 1.0 +local_coords = false +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +direction = Vector2( 0, -1 ) +spread = 180.0 +gravity = Vector2( 0, 150 ) +initial_velocity = 250.0 +initial_velocity_random = 0.9 +damping = 2.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_random = 1.0 +color_ramp = SubResource( 2 ) + [node name="Score" type="Label" parent="."] -visible = false material = ExtResource( 9 ) margin_top = 93.0 margin_right = 256.0 @@ -393,112 +332,62 @@ theme = ExtResource( 10 ) text = "Score: 0000000" align = 1 -[node name="BonusSprites" type="Node2D" parent="."] +[node name="Bonuses" type="Node2D" parent="."] position = Vector2( 0, 6 ) -[node name="CollectionBonusEmpty" type="Sprite" parent="BonusSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 7 ) +[node name="CollectionBonus" parent="Bonuses" instance=ExtResource( 14 )] position = Vector2( 24, 112 ) texture = ExtResource( 7 ) -[node name="CollectionBonus" parent="BonusSprites" instance=ExtResource( 12 )] -position = Vector2( 24, 112 ) - -[node name="Sprite" parent="BonusSprites/CollectionBonus" index="0"] -position = Vector2( 0, 0 ) -texture = ExtResource( 7 ) - -[node name="CollectionBonusText" type="Label" parent="BonusSprites"] -visible = false +[node name="CollectionBonusText" type="Label" parent="Bonuses/CollectionBonus"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 106.0 -margin_right = 200.0 -margin_bottom = 120.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "Collection Bonus" -[node name="TimeBonusEmpty" type="Sprite" parent="BonusSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 8 ) +[node name="TimeBonus" parent="Bonuses" instance=ExtResource( 14 )] position = Vector2( 24, 128 ) texture = ExtResource( 8 ) -[node name="TimeBonus" parent="BonusSprites" instance=ExtResource( 12 )] -position = Vector2( 24, 128 ) - -[node name="Sprite" parent="BonusSprites/TimeBonus" index="0"] -position = Vector2( 0, 0 ) -texture = ExtResource( 8 ) - -[node name="AnimationPlayer" parent="BonusSprites/TimeBonus" index="1"] -anims/Collect = SubResource( 9 ) - -[node name="TimeBonusText" type="Label" parent="BonusSprites"] -visible = false +[node name="TimeBonusText" type="Label" parent="Bonuses/TimeBonus"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 122.0 -margin_right = 200.0 -margin_bottom = 136.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "Time Bonus" -[node name="LifeBonusEmpty" type="Sprite" parent="BonusSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 10 ) +[node name="LifeBonus" parent="Bonuses" instance=ExtResource( 14 )] position = Vector2( 24, 144 ) texture = ExtResource( 6 ) -[node name="LifeBonus" parent="BonusSprites" instance=ExtResource( 12 )] -position = Vector2( 24, 144 ) - -[node name="Sprite" parent="BonusSprites/LifeBonus" index="0"] -position = Vector2( 0, 0 ) -texture = ExtResource( 6 ) - -[node name="AnimationPlayer" parent="BonusSprites/LifeBonus" index="1"] -anims/Collect = SubResource( 11 ) - -[node name="LifeBonusText" type="Label" parent="BonusSprites"] -visible = false +[node name="LifeBonusText" type="Label" parent="Bonuses/LifeBonus"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 138.0 -margin_right = 200.0 -margin_bottom = 152.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "Life Bonus" -[node name="PerfectBonusEmpty" type="Sprite" parent="BonusSprites"] -modulate = Color( 0, 0, 0, 1 ) -material = SubResource( 12 ) +[node name="PerfectBonus" parent="Bonuses" instance=ExtResource( 14 )] position = Vector2( 24, 160 ) texture = ExtResource( 5 ) -[node name="PerfectBonus" parent="BonusSprites" instance=ExtResource( 12 )] -position = Vector2( 24, 160 ) - -[node name="Sprite" parent="BonusSprites/PerfectBonus" index="0"] -position = Vector2( 0, 0 ) -texture = ExtResource( 5 ) - -[node name="AnimationPlayer" parent="BonusSprites/PerfectBonus" index="1"] -anims/Collect = SubResource( 13 ) - -[node name="PerfectBonusText" type="Label" parent="BonusSprites"] -visible = false +[node name="PerfectBonusText" type="Label" parent="Bonuses/PerfectBonus"] material = ExtResource( 9 ) -margin_left = 32.0 -margin_top = 154.0 -margin_right = 200.0 -margin_bottom = 168.0 +margin_left = 8.0 +margin_top = -6.0 +margin_right = 176.0 +margin_bottom = 8.0 theme = ExtResource( 10 ) text = "Perfect Bonus" -[node name="Final Score" type="Label" parent="."] -visible = false +[node name="FinalScore" type="Label" parent="."] material = ExtResource( 9 ) margin_top = 178.0 margin_right = 256.0 @@ -507,18 +396,12 @@ theme = ExtResource( 10 ) text = "Final score: 123456789" align = 1 +[node name="Results" type="Sprite" parent="."] +material = ExtResource( 11 ) +position = Vector2( 232, 80 ) +texture = ExtResource( 4 ) + [node name="AnimationPlayer" type="AnimationPlayer" parent="."] autoplay = "New Anim" "anims/New Anim" = SubResource( 3 ) anims/results = SubResource( 4 ) - -[node name="Results" type="Sprite" parent="."] -material = ExtResource( 11 ) -position = Vector2( 232, 80 ) -scale = Vector2( 1, 0.679105 ) -texture = ExtResource( 4 ) - -[editable path="BonusSprites/CollectionBonus"] -[editable path="BonusSprites/TimeBonus"] -[editable path="BonusSprites/LifeBonus"] -[editable path="BonusSprites/PerfectBonus"] diff --git a/menus/results_icon.gd b/menus/results_icon.gd new file mode 100644 index 0000000..cedcf78 --- /dev/null +++ b/menus/results_icon.gd @@ -0,0 +1,16 @@ +extends Sprite + + +onready var filled_sprite = $FilledSprite +onready var animation_player = $AnimationPlayer + + +func _ready() -> void: + filled_sprite.texture = texture + + +func collect() -> void: + animation_player.play("collect") + for child in get_children(): + if child is CPUParticles2D: + child.emitting = true diff --git a/menus/results_icon.tscn b/menus/results_icon.tscn new file mode 100644 index 0000000..0ee1c5e --- /dev/null +++ b/menus/results_icon.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=1] +[ext_resource path="res://menus/results_icon.gd" type="Script" id=3] + +[sub_resource type="ShaderMaterial" id=4] +shader = ExtResource( 1 ) +shader_param/border_color = Color( 0, 0, 0, 1 ) +shader_param/border_corners = false + +[sub_resource type="Animation" id=3] +resource_name = "collect" +step = 0.5 +tracks/0/type = "value" +tracks/0/path = NodePath("FilledSprite:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.375, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( 1, 1 ), Vector2( 1.3, 1.3 ), Vector2( 1, 1 ), Vector2( 1, 1 ) ] +} + +[node name="ResultsIcon" type="Sprite"] +self_modulate = Color( 0, 0, 0, 1 ) +material = SubResource( 4 ) +script = ExtResource( 3 ) + +[node name="FilledSprite" type="Sprite" parent="."] +use_parent_material = true +scale = Vector2( 1e-05, 1e-05 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/collect = SubResource( 3 ) diff --git a/menus/shard_results.tscn b/menus/shard_results.tscn index d5318fa..9fda7d7 100644 --- a/menus/shard_results.tscn +++ b/menus/shard_results.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=1] -[ext_resource path="res://objects/player/player_death_particles.tscn" type="PackedScene" id=2] [ext_resource path="res://graphics/collectibles/shard.png" type="Texture" id=3] [sub_resource type="ShaderMaterial" id=1] @@ -70,11 +69,11 @@ offsets = PoolRealArray( 0, 0.734694, 1 ) colors = PoolColorArray( 0.576471, 0.980392, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 ) [node name="Shard" type="Node2D"] -visible = false [node name="Sprite" type="Sprite" parent="."] material = SubResource( 1 ) position = Vector2( 1, 1 ) +scale = Vector2( 1e-05, 1e-05 ) texture = ExtResource( 3 ) [node name="AnimationPlayer" type="AnimationPlayer" parent="."] @@ -82,13 +81,22 @@ autoplay = "Miss" anims/Collect = SubResource( 3 ) anims/Miss = SubResource( 4 ) -[node name="CollectedParticle" parent="." instance=ExtResource( 2 )] +[node name="CollectedParticle" type="CPUParticles2D" parent="."] +pause_mode = 2 +emitting = false amount = 64 -lifetime = 1.0 +one_shot = true explosiveness = 1.0 -texture = null +local_coords = false +emission_shape = 2 +emission_rect_extents = Vector2( 4, 4 ) +direction = Vector2( 0, -1 ) +spread = 180.0 gravity = Vector2( 0, 150 ) initial_velocity = 250.0 -scale_amount = 1.0 -scale_amount_curve = null +initial_velocity_random = 0.9 +damping = 2.0 +angle = 720.0 +angle_random = 1.0 +scale_amount_random = 1.0 color_ramp = SubResource( 2 ) diff --git a/objects/camera.gd b/objects/camera.gd index 62c0979..a263db7 100644 --- a/objects/camera.gd +++ b/objects/camera.gd @@ -18,12 +18,12 @@ func _process(delta): else: var current_sector = Game.get_sector(player.global_position + Vector2(0.0, 1.0)) if scroll_h && current_sector.x != last_sector.x: - position.x = current_sector.x * Game.resolution.x + position.x = current_sector.x * Game.RESOLUTION.x if respawn_h: var offset = Vector2(8.0 * sign(current_sector.x - last_sector.x), 0.0) Game.respawn_point = player.global_position last_sector.x = current_sector.x if scroll_v && current_sector.y != last_sector.y: - position.y = current_sector.y * Game.resolution.y + position.y = current_sector.y * Game.RESOLUTION.y last_sector.y = current_sector.y Game.current_sector = last_sector diff --git a/objects/collectibles/shard.gd b/objects/collectibles/shard.gd index 70837a4..3776cab 100644 --- a/objects/collectibles/shard.gd +++ b/objects/collectibles/shard.gd @@ -16,6 +16,5 @@ func _on_Area2D_body_entered(body): emit_signal("collected",number) Audio.play_shard_sound() Game.score += 500 - Game.shards += 1 Game.shards_collected[number] = true queue_free() diff --git a/objects/collectibles/star.gd b/objects/collectibles/star.gd index e075c98..877f977 100644 --- a/objects/collectibles/star.gd +++ b/objects/collectibles/star.gd @@ -31,11 +31,10 @@ func _on_Area2D_body_entered(body): if body.is_in_group("player"): Audio.play_sound(Audio.a_star,Audio.ac_collectible) Game.score += 100 - Game.stars[color] = true + Game.stars_collected[color] = true #5 Star reward - if Game.stars[0] && Game.stars[1] && Game.stars[2] && Game.stars[3] && Game.stars[4]: + if Game.stars == 5: Audio.play_shard_sound() - Game.shards += 1 Game.shards_collected[4] = true Game.score += 500 queue_free() diff --git a/objects/enemy/squig.gd b/objects/enemy/squig.gd index 4057401..05923fa 100644 --- a/objects/enemy/squig.gd +++ b/objects/enemy/squig.gd @@ -40,7 +40,7 @@ func _physics_process(delta: float) -> void: velocity.y = speed global_position += velocity * delta - var sector_rect = Rect2(home_sector * Game.resolution, Game.resolution) + var sector_rect = Rect2(home_sector * Game.RESOLUTION, Game.RESOLUTION) # disable hitbox at edge of screen var global_hitbox_clip = hitbox_clip @@ -74,7 +74,7 @@ func _physics_process(delta: float) -> void: # clip to inside of home sector var rid = get_canvas_item() - var rect = Rect2(to_local(home_sector * Game.resolution), Game.resolution) + var rect = Rect2(to_local(home_sector * Game.RESOLUTION), Game.RESOLUTION) VisualServer.canvas_item_set_custom_rect(rid, true, rect) VisualServer.canvas_item_set_clip(rid, true) diff --git a/objects/environment/exit/exit.gd b/objects/environment/exit/exit.gd index 2a6a674..535fff3 100644 --- a/objects/environment/exit/exit.gd +++ b/objects/environment/exit/exit.gd @@ -16,34 +16,6 @@ func _physics_process(delta): func _on_Area2D_area_entered(area): if area.is_in_group("player_hitbox"): - #BONUSES - Game.final_score = Game.score - Game.bonuses = [0,0,0,0] - #Collection bonus - if Game.keys == 50: Game.Bonuses.Collection_Bonus += 500 - if Game.shards == 5: Game.Bonuses.Collection_Bonus += 500 - if Game.keys == 50 && Game.shards == 5: - Game.Bonuses.Collection_Bonus += 250 - Game.shards_collected[5] = true - #Time bonus - if Game.keys == 50 && Game.shards == 5: - if Game.time < map.target_time_100: - Game.Bonuses.Time_Bonus += max(2500 - 2500 * int(Game.time / map.target_time_100), 0) - Game.shards_collected[6] = true - else: - if Game.time < map.target_time_any: - Game.Bonuses.Time_Bonus += max(2500 - 2500 * int(Game.time / map.target_time_any), 0) - Game.shards_collected[6] = true - #Life bonus - if Game.lives == 1: Game.Bonuses.Life_Bonus += 500 - if Game.lives == 2: - Game.Bonuses.Life_Bonus += 1500 - Game.shards_collected[7] = true - #Perfect bonus - if Game.lives == 2 && Game.keys == 50 && Game.shards == 5 && Game.time < map.target_time_100: - Game.Bonuses.Perfect_Bonus += 1000 - for bonus in Game.bonuses: - Game.final_score += bonus - if Game.final_score > Game.high_final_score: Game.high_final_score = Game.final_score - Game.save() - Game.change_map(load("res://maps/level_select.tscn")) + Game.tally_scores() + SceneManager.change_scene(preload("res://menus/results.tscn").instance()) +# Game.change_map(load("res://maps/level_select.tscn")) diff --git a/objects/hud/hud.gd b/objects/hud/hud.gd index 6409041..3b50fe4 100644 --- a/objects/hud/hud.gd +++ b/objects/hud/hud.gd @@ -54,11 +54,11 @@ func _physics_process(delta): #Shard Counter shard_counter.text = str(Game.shards) #Star Counter - red_star.visible = Game.stars[0] - yellow_star.visible = Game.stars[1] - green_star.visible = Game.stars[2] - blue_star.visible = Game.stars[3] - magenta_star.visible = Game.stars[4] + red_star.visible = Game.stars_collected[0] + yellow_star.visible = Game.stars_collected[1] + green_star.visible = Game.stars_collected[2] + blue_star.visible = Game.stars_collected[3] + magenta_star.visible = Game.stars_collected[4] #Score Counter score_counter.text = "%05d" % Game.score #Arrow Counter @@ -74,8 +74,6 @@ func _physics_process(delta): lives_counter.modulate = bonus_color else: lives_counter.modulate = Color.white - #High counter - high_counter.text = str("HIGH:") + str("%06d" % Game.high_score) ##Timer Game.time += delta time_counter.text = Game.timeify(Game.time) diff --git a/objects/player/arrow_projectile.gd b/objects/player/arrow_projectile.gd index 05b8dab..1cf9aa3 100644 --- a/objects/player/arrow_projectile.gd +++ b/objects/player/arrow_projectile.gd @@ -1,22 +1,30 @@ extends Node2D + +# "block" graphic +const BlockText := preload("res://objects/hud/blocktext.tscn") + + # speed to fly at -export var speed = 240.0 +export var speed: float = 240.0 # group to kill -export var target_group = "enemy_hitbox" +export var target_group: String = "enemy_hitbox" # direction to fly -export var direction = 1.0 +export var direction: float = 1.0 # whether or not it frees on wall collision -export var breaks_on_wall = true +export var breaks_on_wall: float = true + #Edge to check culling, if this edge is offscreen, delete the arrow -onready var cull_edge = Vector2(5 * direction,0) -onready var initial_sector = Game.current_sector +onready var cull_edge := Vector2(5.0 * direction, 0.0) +onready var initial_sector: Vector2 = Game.current_sector + func _ready(): #Flip depending on direction scale.x = direction + func _physics_process(delta): #Move in right direction position.x += speed * direction * delta @@ -25,6 +33,7 @@ func _physics_process(delta): _persist_trail() queue_free() + #Wall Collision func _on_Hitbox_body_entered(body): if breaks_on_wall: @@ -33,6 +42,7 @@ func _on_Hitbox_body_entered(body): _persist_trail() queue_free() + # kill entity if in target group func _on_Hitbox_area_entered(area): # block if collided area is in "blocks_arrow" group @@ -41,7 +51,7 @@ func _on_Hitbox_area_entered(area): # create block text and return if blocked if area.is_in_group("blocks_arrow"): var pos = target.global_position - Game.instance_node(Game.block_text, pos.x, pos.y, target.get_parent()) + Game.instance_node(BlockText, pos.x, pos.y, target.get_parent()) _make_sparks() else: # kill targeted node @@ -56,6 +66,7 @@ func _on_Hitbox_area_entered(area): _persist_trail() queue_free() + func _persist_trail(): # don't do this twice to prevent crash if not is_queued_for_deletion(): @@ -68,6 +79,7 @@ func _persist_trail(): # free particles once they have gone through their lifetime get_tree().create_timer(particles.lifetime, false).connect("timeout", particles, "queue_free") + func _make_sparks(): # don't do this twice to prevent crash if not is_queued_for_deletion():