diff --git a/control.tscn b/control.tscn index abd6879..767fd50 100644 --- a/control.tscn +++ b/control.tscn @@ -2,7 +2,7 @@ [ext_resource path="res://scripts/scaling.gd" type="Script" id=1] [ext_resource path="res://graphics/borders/prideborder.png" type="Texture" id=2] -[ext_resource path="res://maps/canopy.tscn" type="PackedScene" id=3] +[ext_resource path="res://maps/level_select.tscn" type="PackedScene" id=3] [ext_resource path="res://scripts/crt.gdshader" type="Shader" id=4] [ext_resource path="res://scripts/theme.tres" type="Theme" id=5] @@ -48,7 +48,7 @@ size = Vector2( 256, 192 ) handle_input_locally = false render_target_update_mode = 3 -[node name="Map" parent="ViewportContainer/Viewport" instance=ExtResource( 3 )] +[node name="LevelSelect" parent="ViewportContainer/Viewport" instance=ExtResource( 3 )] [node name="CheatLayer" type="CanvasLayer" parent="ViewportContainer/Viewport"] layer = 127 diff --git a/game.gd b/game.gd index a86cd09..a811efb 100644 --- a/game.gd +++ b/game.gd @@ -44,6 +44,9 @@ 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] +func _ready(): + Save.load_file(current_file) + #Instances a node func instance_node(node:PackedScene,x:float,y:float,parent): var Instance = node.instance() @@ -80,25 +83,20 @@ func clear_collectibles(): #Save func save(): - var save = ConfigFile.new() - save.load(str("user://file") + str(Game.current_file) + str(".pr")) - if Game.shards == 5 && Game.golds == 50: - save.set_value(str(current_level),"100% High Score",Game.score) - save.set_value(str(current_level),"100% Time",Game.time) - else: - save.set_value(str(current_level),"Any% High Score",Game.score) - save.set_value(str(current_level),"Any% Time",Game.time) - if Game.shards_collected[0] == true: save.set_value(str(current_level),"Shard0",Game.shards_collected[0]) - if Game.shards_collected[1] == true: save.set_value(str(current_level),"Shard1",Game.shards_collected[1]) - if Game.shards_collected[2] == true: save.set_value(str(current_level),"Shard2",Game.shards_collected[2]) - if Game.shards_collected[3] == true: save.set_value(str(current_level),"Shard3",Game.shards_collected[3]) - if Game.shards_collected[4] == true: save.set_value(str(current_level),"Shard4",Game.shards_collected[4]) - if Game.shards_collected[5] == true: save.set_value(str(current_level),"Shard5",Game.shards_collected[5]) - if Game.shards_collected[6] == true: save.set_value(str(current_level),"Shard6",Game.shards_collected[6]) - if Game.shards_collected[7] == true: save.set_value(str(current_level),"Shard7",Game.shards_collected[7]) - if Game.shards_collected[8] == true: save.set_value(str(current_level),"Shard8",Game.shards_collected[8]) - if Game.shards_collected[9] == true: save.set_value(str(current_level),"Shard9",Game.shards_collected[9]) - save.save(str("user://file") + str(current_file) + str(".pr")) + var save_id = LevelData.levels[current_level].save_id + var save_data = Save.get_level_data(save_id) + var is_100 = shards >= 5 && golds >= 50 + # set score and time depending on completion + if score > save_data["score_100" if is_100 else "score_any"]: + Save.set_score(save_id, score, is_100) + if time < save_data["time_100" if is_100 else "time_any"]: + Save.set_time(save_id, time, is_100) + # set shards + for i in 8: + if shards_collected[i]: + Save.set_shard_collected(save_id, i, true) + # save file + Save.save_file(current_file) #Convert seconds into M:SS:MS func timeify(input): diff --git a/level_data.gd b/level_data.gd new file mode 100644 index 0000000..6885e00 --- /dev/null +++ b/level_data.gd @@ -0,0 +1,15 @@ +tool +extends Node + +export var levels = [] setget set_levels + +func set_levels(value): + levels = value + for i in levels.size(): + if !levels[i]: + levels[i] = LevelEntry.new() + levels[i].resource_name = "New Entry" + +func _ready(): + if !Engine.editor_hint: + print(levels[0].title) diff --git a/level_data.tscn b/level_data.tscn new file mode 100644 index 0000000..633b790 --- /dev/null +++ b/level_data.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://level_data.gd" type="Script" id=1] +[ext_resource path="res://maps/map01.tscn" type="PackedScene" id=2] +[ext_resource path="res://maps/canopy.tscn" type="PackedScene" id=3] +[ext_resource path="res://maps/cave.tscn" type="PackedScene" id=4] +[ext_resource path="res://scripts/level_entry.gd" type="Script" id=5] + +[sub_resource type="Resource" id=1] +resource_name = "Verdant Hills" +script = ExtResource( 5 ) +title = "Verdant Hills" +shard_titles = [ "Climb the Big Vine", "Next to the Lone Tree", "Slime's Treasure", "The Snake Pit", "5 Rainbow Stars", "Collection Bonus", "Time Bonus", "Life Bonus" ] +save_id = "hills" +scene = ExtResource( 2 ) + +[sub_resource type="Resource" id=2] +resource_name = "Shady Canopy" +script = ExtResource( 5 ) +title = "Shady Canopy" +shard_titles = [ "Archer and His Friend", "Thirsty Spiders", "Spider's Den", "Dancing Above the Pond", "5 Rainbow Stars", "Collection Bonus", "Time Bonus", "Life Bonus" ] +save_id = "canopy" +scene = ExtResource( 3 ) + +[sub_resource type="Resource" id=3] +resource_name = "Blue Ray Cavern" +script = ExtResource( 5 ) +title = "Blue Ray Cavern" +shard_titles = [ "Star-Crossed Lovers", "The Snail Cave", "Members Only!", "Over-Head Obstacle Course", "5 Rainbow Stars", "Collection Bonus", "Time Bonus", "Life Bonus" ] +save_id = "cave" +scene = ExtResource( 4 ) + +[node name="LevelData" type="Node"] +script = ExtResource( 1 ) +levels = [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ) ] diff --git a/maps/canopy.tscn b/maps/canopy.tscn index a829216..3f5a91a 100644 --- a/maps/canopy.tscn +++ b/maps/canopy.tscn @@ -29,7 +29,6 @@ extents = Vector2( 4, 128 ) [node name="Map" type="Node2D" groups=["map"]] pause_mode = 1 script = ExtResource( 2 ) -save_location = 2 music = ExtResource( 22 ) [node name="Camera2D" parent="." instance=ExtResource( 1 )] diff --git a/maps/cave.tscn b/maps/cave.tscn index b8ed034..18786ea 100644 --- a/maps/cave.tscn +++ b/maps/cave.tscn @@ -31,7 +31,6 @@ extents = Vector2( 4, 96 ) [node name="Map2" type="Node2D" groups=["map"]] pause_mode = 1 script = ExtResource( 11 ) -save_location = 2 music = ExtResource( 12 ) [node name="Camera2D" parent="." instance=ExtResource( 6 )] diff --git a/maps/level_select.gd b/maps/level_select.gd index 6e20f24..0ed67b6 100644 --- a/maps/level_select.gd +++ b/maps/level_select.gd @@ -1,27 +1,25 @@ extends Node2D ##Onreadys -onready var levels = preload("res://maps/leveldata/levels.tres") +#onready var levels = preload("res://maps/leveldata/levels.tres") onready var title = $Title onready var shard_title = $ShardTitle onready var shard_arrow = $ShardArrow -onready var high_score = $HighScore onready var high_score_any = $HighScoreAny onready var high_score_100 = $HighScore100 -onready var golds = $Golds onready var levelarrow_up = $LevelArrowUp onready var levelarrow_down = $LevelArrowDown #Shards -onready var shard0 = $ShardGraphics/Shard -onready var shard1 = $ShardGraphics/Shard2 -onready var shard2 = $ShardGraphics/Shard3 -onready var shard3 = $ShardGraphics/Shard4 -onready var shard4 = $ShardGraphics/Shard5 -onready var shard5 = $ShardGraphics/Shard6 -onready var shard6 = $ShardGraphics/Shard7 -onready var shard7 = $ShardGraphics/Shard8 -onready var shard8 = $ShardGraphics/Shard9 -onready var shard9 = $ShardGraphics/Shard10 +onready var shards = [ + $ShardGraphics/Shard, + $ShardGraphics/Shard2, + $ShardGraphics/Shard3, + $ShardGraphics/Shard4, + $ShardGraphics/Shard5, + $ShardGraphics/Shard6, + $ShardGraphics/Shard7, + $ShardGraphics/Shard8 +] ##Runtime var save = 0 var current_level = 0 @@ -29,20 +27,24 @@ var current_shard = 0 # Called when the node enters the scene tree for the first time. func _ready(): - change_current_level(1) + change_current_level(0) + Game.ac_music.stop() func _physics_process(delta): if Input.is_action_just_pressed("ui_up"): change_current_level(-1) if Input.is_action_just_pressed("ui_down"): change_current_level(1) if Input.is_action_just_pressed("ui_left"): change_current_shard(-1) if Input.is_action_just_pressed("ui_right"): change_current_shard(1) + # get current level's data + var level = LevelData.levels[current_level] #Draw level title - title.text = levels.level[current_level].level_title + title.text = level.title #Draw Shard Title - shard_title.text = levels.level[current_level].shard_title[current_shard] + shard_title.text = level.shard_titles[current_shard] #Select level if Input.is_action_just_pressed("jump"): - Game.change_map(levels.level[current_level].scene) + Game.current_level = current_level + Game.change_map(level.scene) func change_current_shard(amount): if current_shard + amount != -1 && current_shard + amount != 8: #Check if in range @@ -51,13 +53,13 @@ func change_current_shard(amount): func change_current_level(amount): #Change level - if current_level + amount != 0 && current_level + amount != levels.level.size(): #Check if in range + if current_level + amount >= 0 && current_level + amount < LevelData.levels.size(): #Check if in range current_level += amount #Show arrows or don't - if current_level == 1: + if current_level == 0: levelarrow_up.visible = false levelarrow_down.visible = true - elif current_level == levels.level.size() - 1: + elif current_level == LevelData.levels.size() - 1: levelarrow_up.visible = true levelarrow_down.visible = false else: @@ -67,23 +69,18 @@ func change_current_level(amount): current_shard = 0 shard_arrow.position.x = 76 #Load new data - var save = ConfigFile.new() - save.load(str("user://file") + str(Game.current_file) + str(".pr")) - var str_level = str(current_level) - #Draw score and golds -# high_score.text = str("%04d" % save.get_value(str_level,"High Score",0)) -# golds.text = str("%02d" % save.get_value(str_level,"Golds",0)) - #Draw High Scores - high_score_any.text = "Any%\n" + str("%05d" % save.get_value(str_level,"Any% High Score",0)) + "\n" + str(Game.timeify(save.get_value(str_level,"Any% Time",0))) - high_score_100.text = "100%\n" + str("%05d" % save.get_value(str_level,"100% High Score",0)) + "\n" + str(Game.timeify(save.get_value(str_level,"100% Time",0))) - #Draw shards collected - shard0.visible = save.get_value(str_level,"Shard0",false) - shard1.visible = save.get_value(str_level,"Shard1",false) - shard2.visible = save.get_value(str_level,"Shard2",false) - shard3.visible = save.get_value(str_level,"Shard3",false) - shard4.visible = save.get_value(str_level,"Shard4",false) - shard5.visible = save.get_value(str_level,"Shard5",false) - shard6.visible = save.get_value(str_level,"Shard6",false) - shard7.visible = save.get_value(str_level,"Shard7",false) - shard8.visible = save.get_value(str_level,"Shard8",false) - shard9.visible = save.get_value(str_level,"Shard9",false) + var save_id = LevelData.levels[current_level].save_id + var save_data = Save.get_level_data(save_id) + # set any% scores + high_score_any.text = "Any%%\n%05d\n%s" % [ + save_data.score_any, + Game.timeify(save_data.time_any) + ] + # set 100% scores + high_score_100.text = "100%%\n%05d\n%s" % [ + save_data.score_100, + Game.timeify(save_data.time_100) + ] + # set collected shards + for i in 8: + shards[i].visible = save_data.shards[i] diff --git a/maps/level_select.tscn b/maps/level_select.tscn index 0ee33d0..f3d3ad5 100644 --- a/maps/level_select.tscn +++ b/maps/level_select.tscn @@ -46,16 +46,6 @@ text = "test text " align = 1 -[node name="Golds" type="Label" parent="."] -visible = false -margin_left = 120.0 -margin_top = 88.0 -margin_right = 136.0 -margin_bottom = 108.0 -theme = ExtResource( 1 ) -text = "00" -align = 1 - [node name="HighScoreText" type="Label" parent="."] margin_left = 56.0 margin_top = 62.0 @@ -91,16 +81,6 @@ text = "100% " align = 1 -[node name="HighScore" type="Label" parent="."] -visible = false -margin_left = 56.0 -margin_top = 76.0 -margin_right = 200.0 -margin_bottom = 108.0 -theme = ExtResource( 1 ) -text = "000000" -align = 1 - [node name="ShardTitle" type="Label" parent="."] margin_left = 43.0 margin_top = 130.0 @@ -177,37 +157,37 @@ position = Vector2( 196, 118 ) texture = ExtResource( 8 ) [node name="Shard" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 71, 115 ) [node name="Shard2" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 86, 115 ) [node name="Shard3" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 101, 115 ) [node name="Shard4" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 116, 115 ) [node name="Shard5" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 131, 115 ) [node name="Shard6" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 146, 115 ) [node name="Shard7" parent="ShardGraphics" instance=ExtResource( 9 )] +visible = false position = Vector2( 161, 115 ) [node name="Shard8" parent="ShardGraphics" instance=ExtResource( 9 )] -position = Vector2( 176, 115 ) - -[node name="Shard9" parent="ShardGraphics" instance=ExtResource( 9 )] visible = false position = Vector2( 176, 115 ) -[node name="Shard10" parent="ShardGraphics" instance=ExtResource( 9 )] -visible = false -position = Vector2( 191, 115 ) - [node name="Gold" parent="." instance=ExtResource( 5 )] visible = false position = Vector2( 111, 91 ) diff --git a/maps/map.gd b/maps/map.gd index d820bba..08f671c 100644 --- a/maps/map.gd +++ b/maps/map.gd @@ -1,7 +1,6 @@ extends Node2D export var target_time_any = 0 export var target_time_100 = 0 -export var save_location = 0 export (AudioStream) var music #Bonuses @@ -11,7 +10,6 @@ var collectible_bonus = false func _ready(): Game.play_sound(music,Game.ac_music) - Game.current_level = save_location func _physics_process(delta): if Game.golds == 50 && Game.shards == 5: diff --git a/maps/map01.tscn b/maps/map01.tscn index 027771c..8bf9b9c 100644 --- a/maps/map01.tscn +++ b/maps/map01.tscn @@ -29,7 +29,6 @@ pause_mode = 1 script = ExtResource( 18 ) target_time_any = 70 target_time_100 = 180 -save_location = 1 music = ExtResource( 19 ) [node name="Camera2D" parent="." instance=ExtResource( 8 )] diff --git a/project.godot b/project.godot index c45cab1..45820f4 100644 --- a/project.godot +++ b/project.godot @@ -8,6 +8,16 @@ config_version=4 +_global_script_classes=[ { +"base": "Resource", +"class": "LevelEntry", +"language": "GDScript", +"path": "res://scripts/level_entry.gd" +} ] +_global_script_class_icons={ +"LevelEntry": "" +} + [application] config/name="Hero Mark 2" @@ -18,6 +28,8 @@ config/icon="res://icon.png" Game="*res://game.tscn" Debug="*res://objects/debug.tscn" +LevelData="*res://level_data.tscn" +Save="*res://scripts/save.gd" [display] diff --git a/scripts/level_entry.gd b/scripts/level_entry.gd new file mode 100644 index 0000000..3b82c14 --- /dev/null +++ b/scripts/level_entry.gd @@ -0,0 +1,17 @@ +tool +class_name LevelEntry +extends Resource + +export var title = "" setget set_title +export var shard_titles = [ + "", "", "", "", + "5 Rainbow Stars", + "Collection Bonus", + "Time Bonus", + "Life Bonus"] +export var save_id = "" +export (PackedScene) var scene + +func set_title(value): + title = value + resource_name = value diff --git a/scripts/save.gd b/scripts/save.gd new file mode 100644 index 0000000..964bf87 --- /dev/null +++ b/scripts/save.gd @@ -0,0 +1,35 @@ +extends Node + +var file + +func load_file(file_number): + var new_file = ConfigFile.new() + new_file.load("user://file%d.pr" % file_number) + file = new_file + +func get_level_data(save_id): + var shards = [] + shards.resize(8) + for i in 8: + shards[i] = file.get_value(save_id, "shard_%d" % i, false) + return { + # any% score and time + score_any = file.get_value(save_id, "score_any", 0), + time_any = file.get_value(save_id, "time_any", 0), + # 100% score and time + score_100 = file.get_value(save_id, "score_100", 0), + time_100 = file.get_value(save_id, "time_100", 0), + shards = shards + } + +func set_shard_collected(save_id, index, collected = true): + file.set_value(save_id, "shard_%d" % index, collected) + +func set_score(save_id, score, is_100 = false): + file.set_value(save_id, "score_100" if is_100 else "score_any", int(score)) + +func set_time(save_id, time, is_100 = false): + file.set_value(save_id, "time_100" if is_100 else "time_any", float(time)) + +func save_file(file_number): + file.save("user://file%d.pr" % file_number)