diff --git a/assets/bodies/dummy/meta.json b/assets/bodies/dummy/meta.json new file mode 100644 index 00000000..dd0d0177 --- /dev/null +++ b/assets/bodies/dummy/meta.json @@ -0,0 +1,4 @@ +{ + "height": 1, + "offset": {"x": 0, "y": -32} +} diff --git a/assets/bodies/eye/meta.json b/assets/bodies/eye/meta.json new file mode 100644 index 00000000..dd0d0177 --- /dev/null +++ b/assets/bodies/eye/meta.json @@ -0,0 +1,4 @@ +{ + "height": 1, + "offset": {"x": 0, "y": -32} +} diff --git a/assets/bodies/froggy/meta.json b/assets/bodies/froggy/meta.json new file mode 100644 index 00000000..4431b652 --- /dev/null +++ b/assets/bodies/froggy/meta.json @@ -0,0 +1,4 @@ +{ + "height": 0, + "offset": {"x": 0, "y": -32} +} diff --git a/assets/bodies/hero/meta.json b/assets/bodies/hero/meta.json new file mode 100644 index 00000000..dd0d0177 --- /dev/null +++ b/assets/bodies/hero/meta.json @@ -0,0 +1,4 @@ +{ + "height": 1, + "offset": {"x": 0, "y": -32} +} diff --git a/assets/bodies/slime/meta.json b/assets/bodies/slime/meta.json new file mode 100644 index 00000000..4431b652 --- /dev/null +++ b/assets/bodies/slime/meta.json @@ -0,0 +1,4 @@ +{ + "height": 0, + "offset": {"x": 0, "y": -32} +} diff --git a/assets/bodies/thief/meta.json b/assets/bodies/thief/meta.json new file mode 100644 index 00000000..dd0d0177 --- /dev/null +++ b/assets/bodies/thief/meta.json @@ -0,0 +1,4 @@ +{ + "height": 1, + "offset": {"x": 0, "y": -32} +} diff --git a/assets/menu_cursor.ase b/assets/menu_cursor.ase new file mode 100644 index 00000000..90893f5c Binary files /dev/null and b/assets/menu_cursor.ase differ diff --git a/assets/menu_cursor.png b/assets/menu_cursor.png new file mode 100644 index 00000000..bdcd0309 Binary files /dev/null and b/assets/menu_cursor.png differ diff --git a/components/bodyview.gd b/components/bodyview.gd index e2359828..1b081851 100644 --- a/components/bodyview.gd +++ b/components/bodyview.gd @@ -2,6 +2,14 @@ extends Node2D const BodyViewScene = preload("res://components/bodyview.tscn") +const IO = preload("res://components/util/io.gd") + +const LEFT = false +const RIGHT = true + +const LIFEBAR_HEIGHT_SMALL = Vector2(-16, -48) +const LIFEBAR_HEIGHT_MEDIUM = Vector2(-16, -64) +const LIFEBAR_HEIGHT_TALL = Vector2(-16, -80) var body @@ -9,36 +17,66 @@ onready var sprite = get_node("Sprite") onready var animation = get_node("Sprite/Animation") onready var lifebar = get_node("Sprite/LifeBar") onready var hl_indicator = get_node("Highlight") +var dir = LEFT +var metadata = {} export(bool) var highlight = false static func create(body): - var bodyview = BodyViewScene.instance() - bodyview.body = body - return bodyview + var bodyview = BodyViewScene.instance() + bodyview.body = body + return bodyview func _ready(): - sprite.set_texture(load("res://assets/bodies/" + body.type + "/idle.png")) - animation.play("idle") - set_process(true) + metadata.parse_json(IO.get_file_as_text("res://assets/bodies/" + body.type + "/meta.json")) + sprite.set_texture(load("res://assets/bodies/" + body.type + "/idle.png")) + animation.play("idle") + init_metadata() + set_process(true) + +func init_metadata(): + # this function gets the bodyview's metadata in json and applies it to the bodyview's nodes. + if metadata.has("height"): + if metadata.height == 0: + get_node("Sprite/LifeBar").set_pos(LIFEBAR_HEIGHT_SMALL) + elif metadata.height == 1: + get_node("Sprite/LifeBar").set_pos(LIFEBAR_HEIGHT_MEDIUM) + elif metadata.height == 2: + get_node("Sprite/LifeBar").set_pos(LIFEBAR_HEIGHT_TALL) + if metadata.has("offset"): + get_node("Sprite").set_offset(Vector2(metadata.offset.x, metadata.offset.y)) func highlight(): - highlight = true - update_hl() + highlight = true + update_hl() func unhighlight(): - highlight = false - update_hl() + highlight = false + update_hl() func set_hl_color(color): - get_node("Highlight").set_modulate(color) + get_node("Highlight").set_modulate(color) func update_hl(): - if highlight: - get_node("Highlight").show() - else: - get_node("Highlight").hide() + if highlight: + get_node("Highlight").show() + else: + get_node("Highlight").hide() + +func set_dir(current_pos, new_pos): + var dir_vec = new_pos - current_pos + if dir_vec.x - dir_vec.y < 0: + turn_left() + else: + turn_right() + +func turn_right(): + dir = RIGHT + +func turn_left(): + dir = LEFT func _process(delta): - set_pos(get_parent().map_to_world(body.pos) + Vector2(0, 16 - 1)) - lifebar.set_value(body.get_hp_percent()) + set_pos(get_parent().map_to_world(body.pos) + Vector2(0, 16 - 1)) + lifebar.set_value(body.get_hp_percent()) + sprite.set_flip_h(dir) diff --git a/components/bodyview.tscn b/components/bodyview.tscn index 463d8850..6db9be39 100644 --- a/components/bodyview.tscn +++ b/components/bodyview.tscn @@ -58,9 +58,9 @@ focus/stop_mouse = true size_flags/horizontal = 2 size_flags/vertical = 0 margin/left = 48.0 -margin/top = -0.84375 +margin/top = -0.833333 margin/right = -80.0 -margin/bottom = 113.0 +margin/bottom = 112.0 custom_styles/fg = SubResource( 1 ) range/min = 0.0 range/max = 100.0 diff --git a/components/controller/default_controller.gd b/components/controller/default_controller.gd index 4794b55b..76a1c40f 100644 --- a/components/controller/default_controller.gd +++ b/components/controller/default_controller.gd @@ -58,7 +58,7 @@ func consume_input_key(event): return func event_cancel(): - get_node("/root/captains_log").finish() + get_node("/root/database").finish() get_tree().quit() func event_toggle_fullscreen(): diff --git a/components/controller/main_controller.gd b/components/controller/main_controller.gd index 23f039dc..45829ca4 100644 --- a/components/controller/main_controller.gd +++ b/components/controller/main_controller.gd @@ -8,8 +8,12 @@ var hand var display_popup var upgrades_popup +func _ready(): + self.disable() + func event_save(): - get_node("/root/captains_log/scene_manager").close_route() + get_node("/root/database/scene_manager").close_route() + self.disable() func event_idle(): player.add_action(Action.Idle.new()) @@ -41,13 +45,14 @@ func set_player_map(player, hand): self.hand = hand display_popup = get_node("../CardDisplay") upgrades_popup = get_node("../UpgradesDisplay") + call_deferred("enable") func event_next_sector(): player.add_action(Action.ChangeSector.new(1)) func event_create_slime(): var map = get_node("../../map") - var monsters = get_node("/root/captains_log/monsters").get_children() + var monsters = get_node("/root/database/monsters").get_children() monsters[randi()%monsters.size()].create(map, map.get_random_free_pos()) func event_display_card(): diff --git a/components/controller/menu_controller.gd b/components/controller/menu_controller.gd new file mode 100644 index 00000000..28cbae04 --- /dev/null +++ b/components/controller/menu_controller.gd @@ -0,0 +1,51 @@ + +extends "res://components/controller/default_controller.gd" + +const COLOR_SELECTED = Color(234.0/255,166.0/255,81.0/255) +const COLOR_UNSELECTED = Color(1,1,1) + +var choice +var choice_list_size +var cursor +var saves_node + +onready var menu = get_parent() + +func _ready(): + choice = 1 # default to new route choice + self.disable() + +func setup(): + saves_node = menu.saves_node + cursor = saves_node.get_node("cursor") + cursor.show() + choice_list_size = saves_node.get_child_count() - 1 + self.enable() + self.update_choice() + +func update_choice(): + # updates cursor position + # should play a sfx eventually too + cursor.set_pos(Vector2(-32, ((choice-1) * 32) - 4)) + print(saves_node.get_child(choice)) + for btn in saves_node.get_children(): + if btn != cursor: + if btn == saves_node.get_child(choice): + btn.add_color_override("font_color", COLOR_SELECTED) + else: + btn.add_color_override("font_color", COLOR_UNSELECTED) + +func event_up(): + choice = ((choice + choice_list_size - 2) % choice_list_size) + 1 + update_choice() + +func event_down(): + choice = (choice % choice_list_size) + 1 + update_choice() + +func event_select(): + var selection = saves_node.get_child(choice) + assert(selection != cursor) # redundant check yay + self.disable() + cursor.hide() + selection.emit_signal("selected") diff --git a/components/theme/wilokai.tres b/components/theme/wilokai.tres index 7c54d87e..9fef9fa4 100644 --- a/components/theme/wilokai.tres +++ b/components/theme/wilokai.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=7 format=1] +[gd_resource type="Theme" load_steps=6 format=1] [ext_resource path="res://assets/fonts/PressStart2P-8pt.fnt" type="BitmapFont" id=1] @@ -30,24 +30,17 @@ content_margin/right = -1.0 content_margin/top = -1.0 content_margin/bottom = -1.0 -[sub_resource type="StyleBoxEmpty" id=5] - -content_margin/left = -1.0 -content_margin/right = -1.0 -content_margin/top = -1.0 -content_margin/bottom = -1.0 - [resource] -Button/colors/font_color = Color( 0.678431, 0.513726, 0.313726, 1 ) +Button/colors/font_color = Color( 1, 1, 1, 1 ) Button/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) -Button/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) -Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) -Button/constants/hseparation = 2 +Button/colors/font_color_hover = Color( 0.917969, 0.651098, 0.319138, 1 ) +Button/colors/font_color_pressed = Color( 0.882353, 0.623529, 0.305882, 0.960784 ) +Button/constants/hseparation = 8 Button/fonts/font = ExtResource( 1 ) Button/styles/disabled = SubResource( 1 ) -Button/styles/focus = SubResource( 2 ) -Button/styles/hover = SubResource( 3 ) -Button/styles/normal = SubResource( 4 ) -Button/styles/pressed = SubResource( 5 ) +Button/styles/focus = null +Button/styles/hover = SubResource( 2 ) +Button/styles/normal = SubResource( 3 ) +Button/styles/pressed = SubResource( 4 ) diff --git a/components/ui/save-button.tscn b/components/ui/save-button.tscn index efa37d25..0bd7bb4f 100644 --- a/components/ui/save-button.tscn +++ b/components/ui/save-button.tscn @@ -1,17 +1,28 @@ -[gd_scene load_steps=2 format=1] +[gd_scene load_steps=3 format=1] -[ext_resource path="res://assets/fonts/PressStart2P-small.fnt" type="Font" id=1] +[ext_resource path="res://assets/fonts/PressStart2P-small.fnt" type="BitmapFont" id=1] -[node name="menu_button" type="Button"] +[sub_resource type="GDScript" id=1] -margin/right = 12.0 -margin/bottom = 19.0 +script/source = "\nextends Label\n\nsignal selected(info)\n" + +[node name="menu_button" type="Label"] + +rect/min_size = Vector2( 0, 28 ) focus/ignore_mouse = false focus/stop_mouse = true size_flags/horizontal = 2 size_flags/vertical = 2 +margin/left = 0.0 +margin/top = 0.0 +margin/right = 256.0 +margin/bottom = 35.0 custom_fonts/font = ExtResource( 1 ) -toggle_mode = false -flat = false +text = "load file" +valign = 1 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = 1 +script/script = SubResource( 1 ) diff --git a/components/util/io.gd b/components/util/io.gd new file mode 100644 index 00000000..e79896c4 --- /dev/null +++ b/components/util/io.gd @@ -0,0 +1,10 @@ + +extends Object + +static func get_file_as_text(filepath): + var datafile = File.new() + var datatext + datafile.open(filepath, File.READ) + datatext = datafile.get_as_text() + datafile.close() + return datatext diff --git a/components/util/mapgen/map_generator.gd b/components/util/mapgen/map_generator.gd index 29f71f96..fb181bbc 100644 --- a/components/util/mapgen/map_generator.gd +++ b/components/util/mapgen/map_generator.gd @@ -27,8 +27,8 @@ var PIPELINE = [ func _ready(): pass -func generate_map(id,w,h): +func generate_map(w,h,assembler): var map = MapGrid.new(w,h, Step.WALL) for step in PIPELINE: map = map.apply_step(step) - return map.export_scene(id) + return map.export_scene(assembler) diff --git a/components/util/mapgen/map_grid.gd b/components/util/mapgen/map_grid.gd index bff2b881..d4525f87 100644 --- a/components/util/mapgen/map_grid.gd +++ b/components/util/mapgen/map_grid.gd @@ -30,13 +30,16 @@ func set_tile(i, j, value): func apply_step(step): return step.apply(map_, width_, height_) -func export_scene(id): - var map_node = MapScene.create(id, width_, height_) - var floors = map_node.get_node("floors") - var walls = map_node.get_node("walls") +func export_scene(assembler): + var floors = [] + var walls = [] + floors.resize(width_ * height_) + walls.resize(width_ * height_) for i in range(width_): for j in range(height_): - walls.set_cell(j, i, map_[i][j]) - if map_[i][j] != Step.WALL: - floors.set_cell(j, i, 0) - return map_node + walls[i*width_ + j] = map_[j][i] + if map_[j][i] != Step.WALL: + floors[i*width_ + j] = 0 + else: + floors[i*width_ + j] = -1 + assembler.set_sector_map(floors, walls, width_, height_) diff --git a/components/util/mapgen/route_assembler.gd b/components/util/mapgen/route_assembler.gd new file mode 100644 index 00000000..0ef5d3e2 --- /dev/null +++ b/components/util/mapgen/route_assembler.gd @@ -0,0 +1,80 @@ + +const Actor = preload("res://model/actor.gd") + +var route_data_ +var current_sector_ +var current_body_ +var current_actor_ + +var next_sector_id_ = 0 +var next_body_id_ = 0 +var next_actor_id_ = 0 + +func _init(id): + route_data_ = {} + route_data_.id = id + route_data_.sectors = [] + route_data_.player_actor_id = -1 + route_data_.current_sector = -1 + +func get_route_data(): + return route_data_ + +func new_sector(): + current_sector_ = {} + current_sector_.id = next_sector_id_ + next_sector_id_ += 1 + current_sector_.bodies = [] + current_sector_.actors = [] + route_data_.sectors.append(current_sector_) + +func set_sector_map(floors, walls, width, height): + current_sector_.width = width + current_sector_.height = height + current_sector_.floors = floors + current_sector_.walls = walls + +func new_body(type, hp, absorption, pos): + current_body_ = {} + current_body_.id = next_body_id_ + next_body_id_ += 1 + current_body_.type = type + current_body_.damage = 0 + current_body_.hp = hp + current_body_.absorption = absorption + if pos != null: + current_body_.pos = [pos.x, pos.y] + else: + ## random empty position + var width = current_sector_.width + var height = current_sector_.height + var walls = current_sector_.walls + var pos = Vector2(1 + randi()%(width-2), 1+ randi()%(height-2)) + while (walls[pos.x*width + pos.y] != -1): + pos = Vector2(1 + randi()%(width-2), 1 + randi()%(height-2)) + current_body_.pos = pos + current_sector_.bodies.append(current_body_) + +func new_actor(name, speed): + current_actor_ = {} + current_actor_.id = next_actor_id_ + next_actor_id_ += 1 + current_actor_.name = name + current_actor_.drawcooldown = Actor.DRAW_TIME + current_actor_.cooldown = Actor.BASE_COOLDOWN/speed + current_actor_.speed = speed + current_actor_.body_id = current_body_.id + current_actor_.hand = [] + current_actor_.deck = [] + current_actor_.upgrades = [] + current_actor_.ai_modules = [] + current_sector_.actors.append(current_actor_) + +func add_to_actor_deck(card_id): + current_actor_.deck.append(card_id) + +func make_sector_current(): + route_data_.current_sector = current_sector_.id + +func make_actor_player(): + route_data_.player_actor_id = current_actor_.id diff --git a/components/util/scene_manager.gd b/components/util/scene_manager.gd index a952ae52..57f7371a 100644 --- a/components/util/scene_manager.gd +++ b/components/util/scene_manager.gd @@ -1,7 +1,7 @@ extends Node -onready var caplog = get_parent() +onready var database = get_parent() onready var menu = get_node("/root/menu") func replace_scene(parent, oldscene, newscene): @@ -15,7 +15,7 @@ func _deferred_replace_scene(parent, oldscene, newscene): parent.add_child(newscene) func close_route(): - caplog.save_route() + database.save_route() var route = get_node("/root/route") route.close_current_sector() route.queue_free() @@ -26,6 +26,6 @@ func destroy_route(): var route = get_node("/root/route") route.close_current_sector() route.queue_free() - caplog.erase_route(route.id) + database.erase_route(route.id) get_tree().set_current_scene(menu) menu.start() \ No newline at end of file diff --git a/components/util/transition.gd b/components/util/transition.gd new file mode 100644 index 00000000..5c2591d0 --- /dev/null +++ b/components/util/transition.gd @@ -0,0 +1,52 @@ + +extends Node2D + +const BLACK = Color(42.0/255, 26.0/255, 31.0/255, 1.0) +const INVISIBLE_BLACK = Color(42.0/255, 26.0/255, 31.0/255, 0) + +onready var tween = get_node("tween") +onready var overlay = get_node("overlay") + +signal begin_fadeout() +signal end_fadeout() +signal begin_fadein() +signal end_fadein() + +func configure_fadeout(begin_node, begin_callback, end_node, end_callback): + connect("begin_fadeout", begin_node, begin_callback, [], CONNECT_ONESHOT) + connect("end_fadeout", end_node, end_callback, [], CONNECT_ONESHOT) + +func configure_fadein(begin_node, begin_callback, end_node, end_callback): + connect("begin_fadein", begin_node, begin_callback, [], CONNECT_ONESHOT) + connect("end_fadein", end_node, end_callback, [], CONNECT_ONESHOT) + +func fade_to_black(seconds): + emit_signal("begin_fadeout") + print("fading start!") + tween.interpolate_method(overlay, "set_color", INVISIBLE_BLACK, BLACK, seconds, Tween.TRANS_QUAD, Tween.EASE_OUT, 0) + tween.start() + yield(tween, "tween_complete") + emit_signal("end_fadeout") + print("fading end!") + +func unfade_from_black(seconds): + emit_signal("begin_fadein") + print("unfading start!") + tween.interpolate_method(overlay, "set_color", BLACK, INVISIBLE_BLACK, seconds, Tween.TRANS_QUAD, Tween.EASE_IN, 0) + tween.start() + yield(tween, "tween_complete") + emit_signal("end_fadein") + print("unfading end!") + +func create_viewport_sized_polygon(): + var viewport_rect_pos = get_viewport().get_visible_rect().pos + var viewport_rect_size = get_viewport().get_visible_rect().size + var polygon_shape = [ viewport_rect_pos, + viewport_rect_pos + Vector2(viewport_rect_size.x, 0), + viewport_rect_pos + viewport_rect_size, + viewport_rect_pos + Vector2(0, viewport_rect_size.y) ] + return polygon_shape + +func _ready(): + overlay.set_polygon(create_viewport_sized_polygon()) + overlay.set_color(BLACK) diff --git a/components/util/transition.tscn b/components/util/transition.tscn new file mode 100644 index 00000000..7a16eb26 --- /dev/null +++ b/components/util/transition.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=2 format=1] + +[ext_resource path="res://components/util/transition.gd" type="Script" id=1] + +[node name="transition" type="Node2D"] + +transform/pos = Vector2( 0, 7 ) +z/z = 100 +script/script = ExtResource( 1 ) + +[node name="tween" type="Tween" parent="."] + +playback/process_mode = 1 +playback/active = false +playback/repeat = false +playback/speed = 1.0 + +[node name="overlay" type="Polygon2D" parent="."] + +polygon = Vector2Array( 0, 0, 640, 0, 640, 480, 0, 480 ) +uv = Vector2Array( ) +color = Color( 0.164706, 0.101961, 0.121569, 1 ) +vertex_colors = ColorArray( ) +offset = Vector2( 0, 0 ) +texture/texture = null +texture/offset = Vector2( 0, 0 ) +texture/scale = Vector2( 1, 1 ) +texture/rotation = 0.0 +invert/enable = false +invert/border = 100.0 + + diff --git a/test.save b/docs/test.save similarity index 100% rename from test.save rename to docs/test.save diff --git a/test2.save b/docs/test2.save similarity index 100% rename from test2.save rename to docs/test2.save diff --git a/engine.cfg b/engine.cfg index e9a8c375..d5f26e4f 100644 --- a/engine.cfg +++ b/engine.cfg @@ -8,7 +8,9 @@ icon="icon.png" [autoload] sector="*res://scenes/main.tscn" -captains_log="*res://model/captains_log.tscn" +database="*res://model/database.tscn" +loading="*res://scenes/loading.tscn" +transition="*res://components/util/transition.tscn" [display] @@ -44,4 +46,5 @@ ui_idle=[key(Period)] [render] +thread_model=2 default_clear_color=#ff2a1a1f diff --git a/game/database/meta.gd b/game/database/meta.gd new file mode 100644 index 00000000..9d9643be --- /dev/null +++ b/game/database/meta.gd @@ -0,0 +1,10 @@ + +extends Node + +export var major = 0 +export var minor = 0 +export var patch = 0 +export(String, "unstable", "alpha", "beta", "rc", "stable") var status = "unstable" + +func get_version_str(): + return var2str(major) + "." + var2str(minor) + "." + var2str(patch) + "-" + status diff --git a/model/actor.gd b/model/actor.gd index 376944e1..143d76ad 100644 --- a/model/actor.gd +++ b/model/actor.gd @@ -11,6 +11,7 @@ const ATTR_TECH = 2 const ATTR_MAX = 3 const DRAW_TIME = 120 +const BASE_COOLDOWN = 100 const HAND_MAX = 5 const ACC_CONSUME = 10 @@ -234,14 +235,15 @@ static func serialize_card_array(cards_db, card_array): array_data.append(get_card_id(cards_db, card)) return array_data -func serialize(): +func serialize(db): var sector = get_parent().get_parent() var actor_data = {} actor_data["name"] = char_name actor_data["cooldown"] = cooldown actor_data["drawcooldown"] = draw_cooldown - var cards_db = get_node("/root/captains_log/cards") + var cards_db = db.get_node("cards") + printt("cards_db", cards_db) if weapon != null: actor_data["weapon"] = get_card_id(cards_db, weapon) @@ -271,12 +273,12 @@ static func unserialize_card_array(cards_db, actor_property, card_array): for card_id in card_array: actor_property.append(load_card(cards_db, card_id)) -static func unserialize(data, root): +static func unserialize(data, db): var actor = new(data["name"]) actor.cooldown = data["cooldown"] actor.draw_cooldown = data["drawcooldown"] - var cards_db = root.get_node("captains_log/cards") + var cards_db = db.get_node("cards") print("data=", data) diff --git a/model/body.gd b/model/body.gd index 53b4f4e7..09938af8 100644 --- a/model/body.gd +++ b/model/body.gd @@ -9,6 +9,7 @@ var damage var absorption = 0 signal damage_taken(amount, source) +signal moved(current_pos, new_pos) func _init(id, the_type, the_pos, the_hp).(id): type = the_type diff --git a/model/captains_log.gd b/model/captains_log.gd deleted file mode 100644 index 1a5a7613..00000000 --- a/model/captains_log.gd +++ /dev/null @@ -1,61 +0,0 @@ - -extends Node - -const RouteScene = preload("res://model/route.tscn") - -const Route = preload("res://model/route.gd") -const Actor = preload("res://model/actor.gd") -const Body = preload("res://model/body.gd") - -onready var map_generator = get_node("map_generator") -onready var profile = get_node("profile") - -func get_profile(): - return profile - -func erase_route(id): - profile.erase_journal(id) - -func create_route(): - var route = RouteScene.instance() - route.id = profile.find_free_route_id() - profile.add_journal(route.id) - var w = 64 - var h = 64 - var map_node = map_generator.generate_map(1,w,h) - route.get_node("sectors").add_child(map_node) - route.current_sector = map_node - map_node.show() - var player = Actor.new("hero") - var cards_db = get_node("/root/captains_log/cards") - for i in range(20): - var aux = i % cards_db.get_child_count() - var card = Actor.Card.new(cards_db.get_child(aux)) - player.deck.append(card) - route.player = player - get_node("/root/sector").set_player(player) - var player_body = Body.new(1, "hero", map_node.get_random_free_pos(), 10) - map_node.add_body(player_body) - map_node.add_actor(player_body, player) - get_parent().add_child(route) - -func load_route(id): - var file = profile.get_journal_file_reader(id) - assert(file != null) - var route = Route.load_from_file(id, file, get_tree().get_root()) - file.close() - get_node("/root/sector").set_player(route.player) - get_parent().call_deferred("add_child", route) - -func save_route(): - var route = get_node("/root/route") - var file = profile.get_journal_file_writer(route.id) - assert(file != null) - route.save_to_file(file) - file.close() - -func finish(): - if get_node("/root/").has_node("route"): - save_route() - profile.save() - get_tree().quit() diff --git a/model/cards/card_entity.gd b/model/cards/card_entity.gd index b2de7439..05b64f65 100644 --- a/model/cards/card_entity.gd +++ b/model/cards/card_entity.gd @@ -9,7 +9,7 @@ class CARD_ATTRIBUTE: const TECH = 2 export(int, "ATHLETICS", "ARCANE", "TECH") var card_attribute = 0 -export(String) var description = "a card" +export(String, MULTILINE) var description = "a card" export(int) var time_cost = 50 func get_time_cost(): diff --git a/model/database.gd b/model/database.gd new file mode 100644 index 00000000..2c567c63 --- /dev/null +++ b/model/database.gd @@ -0,0 +1,68 @@ + +extends Node + +const RouteScene = preload("res://model/route.tscn") +const RouteAssembler = preload("res://components/util/mapgen/route_assembler.gd") + +const Route = preload("res://model/route.gd") +const Actor = preload("res://model/actor.gd") +const Body = preload("res://model/body.gd") + +onready var loading = get_node("/root/loading") +onready var map_generator = get_node("map_generator") +onready var profile = get_node("profile") + +func get_profile(): + return profile + +func erase_route(id): + profile.erase_journal(id) + +func create_route(): + var route_id = profile.find_free_route_id() + var assembler = RouteAssembler.new(route_id) + profile.add_journal(route_id) + assembler.new_sector() + var w = 64 + var h = 64 + map_generator.generate_map(w, h, assembler) + assembler.make_sector_current() + assembler.new_body("hero", 10, 0, null) + assembler.new_actor("hero", 10) + var cards_db = get_node("cards") + for i in range(20): + var card_id = i % cards_db.get_child_count() + assembler.add_to_actor_deck(card_id) + assembler.make_actor_player() + do_load_route(assembler.get_route_data()) + +func load_route(id): + var file = profile.get_journal_file_reader(id) + assert(file != null) + var data = {} + data.parse_json(file.get_as_text()) + file.close() + do_load_route(data) + +func do_load_route(route_data): + var route = Route.unserialize(route_data, self) + get_node("/root/sector").set_player(route.player) + get_parent().call_deferred("add_child", route) + loading.end() + +func save_route(): + var route = get_node("/root/route") + do_save_route(route, route.player) + +func do_save_route(route, player): + var file = profile.get_journal_file_writer(route.id) + assert(file != null) + file.store_string(route.serialize(self, player).to_json()) + file.close() + print("SAVED") + +func finish(): + if get_node("/root/").has_node("route"): + save_route() + profile.save() + get_tree().quit() diff --git a/model/captains_log.tscn b/model/database.tscn similarity index 84% rename from model/captains_log.tscn rename to model/database.tscn index b584bd47..31ae811d 100644 --- a/model/captains_log.tscn +++ b/model/database.tscn @@ -1,108 +1,119 @@ -[gd_scene load_steps=20 format=1] - -[ext_resource path="res://model/captains_log.gd" type="Script" id=1] -[ext_resource path="res://components/util/id_server.gd" type="Script" id=2] -[ext_resource path="res://components/monster.tscn" type="PackedScene" id=3] -[ext_resource path="res://model/ai/wander.gd" type="Script" id=4] -[ext_resource path="res://model/ai/defensive.gd" type="Script" id=5] -[ext_resource path="res://components/util/card_list.gd" type="Script" id=6] -[ext_resource path="res://model/cards/heal.gd" type="Script" id=7] -[ext_resource path="res://model/cards/teleport.gd" type="Script" id=8] -[ext_resource path="res://model/cards/arcane_bolt.gd" type="Script" id=9] -[ext_resource path="res://model/cards/card_item_weapon.gd" type="Script" id=10] -[ext_resource path="res://model/cards/card_item_armory.gd" type="Script" id=11] -[ext_resource path="res://model/cards/card_item_accessory.gd" type="Script" id=12] -[ext_resource path="res://model/cards/card_upgrade.gd" type="Script" id=13] -[ext_resource path="res://model/cards/counter.gd" type="Script" id=14] -[ext_resource path="res://model/cards/fireball.gd" type="Script" id=15] -[ext_resource path="res://model/cards/laser_beam.gd" type="Script" id=16] -[ext_resource path="res://components/util/mapgen/map_generator.gd" type="Script" id=17] -[ext_resource path="res://components/util/scene_manager.gd" type="Script" id=18] -[ext_resource path="res://components/persist/profile_persist.gd" type="Script" id=19] - -[node name="captains_log" type="Node"] +[gd_scene load_steps=21 format=1] + +[ext_resource path="res://model/database.gd" type="Script" id=1] +[ext_resource path="res://game/database/meta.gd" type="Script" id=2] +[ext_resource path="res://components/util/id_server.gd" type="Script" id=3] +[ext_resource path="res://components/monster.tscn" type="PackedScene" id=4] +[ext_resource path="res://model/ai/wander.gd" type="Script" id=5] +[ext_resource path="res://model/ai/defensive.gd" type="Script" id=6] +[ext_resource path="res://components/util/card_list.gd" type="Script" id=7] +[ext_resource path="res://model/cards/heal.gd" type="Script" id=8] +[ext_resource path="res://model/cards/teleport.gd" type="Script" id=9] +[ext_resource path="res://model/cards/arcane_bolt.gd" type="Script" id=10] +[ext_resource path="res://model/cards/card_item_weapon.gd" type="Script" id=11] +[ext_resource path="res://model/cards/card_item_armory.gd" type="Script" id=12] +[ext_resource path="res://model/cards/card_item_accessory.gd" type="Script" id=13] +[ext_resource path="res://model/cards/card_upgrade.gd" type="Script" id=14] +[ext_resource path="res://model/cards/counter.gd" type="Script" id=15] +[ext_resource path="res://model/cards/fireball.gd" type="Script" id=16] +[ext_resource path="res://model/cards/laser_beam.gd" type="Script" id=17] +[ext_resource path="res://components/util/mapgen/map_generator.gd" type="Script" id=18] +[ext_resource path="res://components/util/scene_manager.gd" type="Script" id=19] +[ext_resource path="res://components/persist/profile_persist.gd" type="Script" id=20] + +[node name="database" type="Node"] script/script = ExtResource( 1 ) -[node name="id_server" type="Node" parent="."] +[node name="Meta" type="Node" parent="."] script/script = ExtResource( 2 ) +major = 0 +minor = 0 +patch = 2 +status = "stable" + +[node name="id_server" type="Node" parent="."] + +script/script = ExtResource( 3 ) [node name="monsters" type="Node" parent="."] -[node name="Slime" parent="monsters" instance=ExtResource( 3 )] +editor/display_folded = true + +[node name="Slime" parent="monsters" instance=ExtResource( 4 )] body_type = "slime" [node name="wander" type="Node" parent="monsters/Slime/ai_modules"] -script/script = ExtResource( 4 ) +script/script = ExtResource( 5 ) chance = 0.3 [node name="defensive" type="Node" parent="monsters/Slime/ai_modules"] -script/script = ExtResource( 5 ) +script/script = ExtResource( 6 ) chance = 1.0 -[node name="Floating Eye" parent="monsters" instance=ExtResource( 3 )] +[node name="Floating Eye" parent="monsters" instance=ExtResource( 4 )] body_hp = 15 body_type = "eye" [node name="defensive" type="Node" parent="monsters/Floating Eye/ai_modules"] -script/script = ExtResource( 5 ) +script/script = ExtResource( 6 ) chance = 1 -[node name="Thief" parent="monsters" instance=ExtResource( 3 )] +[node name="Thief" parent="monsters" instance=ExtResource( 4 )] body_hp = 25 body_type = "thief" [node name="wander" type="Node" parent="monsters/Thief/ai_modules"] -script/script = ExtResource( 4 ) +script/script = ExtResource( 5 ) chance = 1 -[node name="Giant Toad" parent="monsters" instance=ExtResource( 3 )] +[node name="Giant Toad" parent="monsters" instance=ExtResource( 4 )] body_hp = 20 body_type = "froggy" [node name="wander" type="Node" parent="monsters/Giant Toad/ai_modules"] -script/script = ExtResource( 4 ) +script/script = ExtResource( 5 ) chance = 1 [node name="cards" type="Node" parent="."] editor/display_folded = true -script/script = ExtResource( 6 ) +script/script = ExtResource( 7 ) [node name="Heal" type="Node" parent="cards"] -script/script = ExtResource( 7 ) +script/script = ExtResource( 8 ) card_attribute = 0 description = "This skill heals the player" time_cost = 20 [node name="Teleport" type="Node" parent="cards"] -script/script = ExtResource( 8 ) +script/script = ExtResource( 9 ) card_attribute = 0 description = "This skill teleport the player" time_cost = 50 [node name="Arcane Bolt" type="Node" parent="cards"] -script/script = ExtResource( 9 ) +script/script = ExtResource( 10 ) card_attribute = 1 description = "This skill unleashes a bolt of arcane power" time_cost = 50 [node name="Iron Pipe" type="Node" parent="cards"] -script/script = ExtResource( 10 ) +script/script = ExtResource( 11 ) card_attribute = 0 description = "Weapon Iron Pipe" time_cost = 10 @@ -112,7 +123,7 @@ damage_expression = "$2d6 + $ATH" [node name="Combat Suit" type="Node" parent="cards"] -script/script = ExtResource( 11 ) +script/script = ExtResource( 12 ) card_attribute = 0 description = "a card" time_cost = 50 @@ -122,7 +133,7 @@ absorption = 3 [node name="Concentration Ring" type="Node" parent="cards"] -script/script = ExtResource( 12 ) +script/script = ExtResource( 13 ) card_attribute = 1 description = "Double the draw rate" time_cost = 50 @@ -133,7 +144,7 @@ finish_effect_expression = "actor.set_draw_rate_bonus_multiplier(1)" [node name="Strong Grip" type="Node" parent="cards"] -script/script = ExtResource( 13 ) +script/script = ExtResource( 14 ) card_attribute = 0 description = "+3 ATH" time_cost = 50 @@ -143,7 +154,7 @@ static_value = 0 [node name="Mind Focus" type="Node" parent="cards"] -script/script = ExtResource( 13 ) +script/script = ExtResource( 14 ) card_attribute = 1 description = "+3 ARC" time_cost = 50 @@ -153,7 +164,7 @@ static_value = 0 [node name="Guidorizzi Tome" type="Node" parent="cards"] -script/script = ExtResource( 13 ) +script/script = ExtResource( 14 ) card_attribute = 2 description = "+3 TECH" time_cost = 50 @@ -163,7 +174,7 @@ static_value = 0 [node name="Adrenaline Dose" type="Node" parent="cards"] -script/script = ExtResource( 13 ) +script/script = ExtResource( 14 ) card_attribute = 0 description = "+1 ATH, +5 SPD" time_cost = 50 @@ -173,7 +184,7 @@ static_value = 5 [node name="Counter" type="Node" parent="cards"] -script/script = ExtResource( 14 ) +script/script = ExtResource( 15 ) card_attribute = 2 description = "Whenever you are hit, counter with 2d4 damage." time_cost = 50 @@ -183,29 +194,29 @@ static_value = 0 [node name="Fireball" type="Node" parent="cards"] -script/script = ExtResource( 15 ) +script/script = ExtResource( 16 ) card_attribute = 0 description = "a card" time_cost = 50 [node name="Laser Beam" type="Node" parent="cards"] -script/script = ExtResource( 16 ) +script/script = ExtResource( 17 ) card_attribute = 0 description = "Shoots a powerful laser beam" time_cost = 50 [node name="map_generator" type="Node" parent="."] -script/script = ExtResource( 17 ) +script/script = ExtResource( 18 ) [node name="scene_manager" type="Node" parent="."] -script/script = ExtResource( 18 ) +script/script = ExtResource( 19 ) [node name="profile" type="Node" parent="."] -script/script = ExtResource( 19 ) +script/script = ExtResource( 20 ) [editable path="monsters/Slime"] diff --git a/model/route.gd b/model/route.gd index a8830559..5ca7da73 100644 --- a/model/route.gd +++ b/model/route.gd @@ -27,17 +27,12 @@ static func get_player_name_from_file(file): sector_data = sector return sector_data["actors"][int(data["player_actor_id"])]["name"] -static func load_from_file(id, file, root): +static func unserialize(data, db): var route = RouteScene.instance() - route.id = id - # Open file - var data = {} - # Parse to json - var text = file.get_as_text() - data.parse_json(text) + route.id = data.id var sectors = data["sectors"] for sector_data in sectors: - route.get_node("sectors").add_child(Map.unserialize(sector_data, root)) + route.get_node("sectors").add_child(Map.unserialize(sector_data, db)) # Set current sector route.current_sector = route.find_sector(data["current_sector"]) route.current_sector.show() @@ -47,20 +42,22 @@ static func load_from_file(id, file, root): route.current_sector.find_body_view(player_body).highlight() return route -func save_to_file(file): +func serialize(db, player): var data = {} + data.id = id data["sectors"] = [] data["current_sector"] = current_sector.id # Group sectors into a single array var sectors = [current_sector] for sector in get_node("sectors").get_children(): + print("KOTOARISHIMASU") sectors.append(sector) var sectors_data = [] var player_actor_id = -1 data["sectors"] = sectors_data # Serialize sectors for sector in sectors: - var sector_data = sector.serialize() + var sector_data = sector.serialize(db) sectors_data.append(sector_data) var i = 0 for actor_data in sector_data["actors"]: @@ -69,7 +66,7 @@ func save_to_file(file): break i += 1 data["player_actor_id"] = player_actor_id - file.store_string(data.to_json()) + return data func _init(): print("route created") diff --git a/out.save b/out.save deleted file mode 100644 index e69de29b..00000000 diff --git a/scenes/loading.gd b/scenes/loading.gd new file mode 100644 index 00000000..800c39ca --- /dev/null +++ b/scenes/loading.gd @@ -0,0 +1,11 @@ + +extends Node2D + +func _ready(): + hide() + +func start(): + show() + +func end(): + hide() diff --git a/scenes/loading.tscn b/scenes/loading.tscn new file mode 100644 index 00000000..91b1ed50 --- /dev/null +++ b/scenes/loading.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=4 format=1] + +[ext_resource path="res://scenes/loading.gd" type="Script" id=1] +[ext_resource path="res://assets/fonts/PressStart2P-small.fnt" type="BitmapFont" id=2] +[ext_resource path="res://assets/fonts/PressStart2P-tiny.fnt" type="BitmapFont" id=3] + +[node name="loading" type="Node2D"] + +script/script = ExtResource( 1 ) + +[node name="background" type="Polygon2D" parent="."] + +transform/pos = Vector2( 0, 3 ) +polygon = Vector2Array( 0, 0, 640, 0, 640, 480, 0, 480 ) +uv = Vector2Array( ) +color = Color( 0.164706, 0.101961, 0.121569, 1 ) +vertex_colors = ColorArray( ) +offset = Vector2( 0, 0 ) +texture/texture = null +texture/offset = Vector2( 0, 0 ) +texture/scale = Vector2( 1, 1 ) +texture/rotation = 0.0 +invert/enable = false +invert/border = 100.0 + +[node name="loading" type="Label" parent="."] + +focus/ignore_mouse = true +focus/stop_mouse = true +size_flags/horizontal = 2 +size_flags/vertical = 0 +margin/left = 64.0 +margin/top = 352.0 +margin/right = 384.0 +margin/bottom = 400.0 +custom_fonts/font = ExtResource( 2 ) +text = "Loading" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="please wait" type="Label" parent="."] + +focus/ignore_mouse = true +focus/stop_mouse = true +size_flags/horizontal = 2 +size_flags/vertical = 0 +margin/left = 64.0 +margin/top = 384.0 +margin/right = 384.0 +margin/bottom = 400.0 +custom_fonts/font = ExtResource( 3 ) +text = "please wait" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + + diff --git a/scenes/main.gd b/scenes/main.gd index 302aca4e..92c07904 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -17,7 +17,7 @@ func _init(): print("sector created") func _ready(): - #get_node("/root/captains_log").start() + #get_node("/root/database").start() print("sector ready") func set_player(the_player): diff --git a/scenes/main.tscn b/scenes/main.tscn index e9ba66f2..f216bff8 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -50,7 +50,6 @@ scale = Vector2( 1, 1 ) [node name="UI_hook" type="Node2D" parent="HUD"] -editor/display_folded = true transform/pos = Vector2( 32, 320 ) __meta__ = { "_edit_lock_":true } diff --git a/scenes/map.gd b/scenes/map.gd index 3dea009e..914cfdad 100644 --- a/scenes/map.gd +++ b/scenes/map.gd @@ -69,6 +69,7 @@ func add_body(body): if body.type != "hero": bodyview.set_hl_color(Color(1.0, .1, .2, .3)) get_node("walls").add_child(bodyview) + body.connect("moved", bodyview, "set_dir") func remove_body(body): bodies.erase(body) @@ -109,6 +110,7 @@ func move_actor(actor, new_pos): move_body(actor_bodies[actor], new_pos) func move_body(body, new_pos): + body.emit_signal("moved", Vector2(body.pos.x, body.pos.y), new_pos) body.pos = new_pos func get_actor_body(actor): @@ -131,11 +133,11 @@ func check_dead_bodies(): if body.is_dead(): var actor = get_body_actor(body) if actor == get_parent().player: - get_node("/root/captains_log/scene_manager").call_deferred("destroy_route") + get_node("/root/database/scene_manager").call_deferred("destroy_route") else: remove_actor(actor) -func serialize(): +func serialize(db): # Store sector general data var sector_data = {} sector_data["id"] = id @@ -167,11 +169,11 @@ func serialize(): # Store actors var actors = [] for actor in actor_bodies: - actors.append(actor.serialize()) + actors.append(actor.serialize(db)) sector_data["actors"] = actors return sector_data -static func unserialize(data, root): +static func unserialize(data, db): # Parse sector var map = create(data["id"], data["width"], data["height"]) # General sector info @@ -194,6 +196,6 @@ static func unserialize(data, root): # Parse actors var actors = data["actors"] for actor_data in actors: - var actor = Actor.unserialize(actor_data, root) + var actor = Actor.unserialize(actor_data, db) map.add_actor(Identifiable.find(map.bodies, actor_data["body_id"]), actor) return map diff --git a/scenes/menu.gd b/scenes/menu.gd index ab9cd04f..16b8b154 100644 --- a/scenes/menu.gd +++ b/scenes/menu.gd @@ -5,9 +5,12 @@ const MenuButton = preload("res://components/ui/save-button.tscn") const Route = preload("res://model/route.gd") +onready var loading = get_node("/root/loading") +onready var transition = get_node("/root/transition") onready var saves_node = get_node("saves") -onready var caplog = get_node("/root/captains_log") -onready var profile = caplog.get_profile() +onready var controller = get_node("controller") +onready var database = get_node("/root/database") +onready var profile = database.get_profile() func _ready(): start() @@ -18,23 +21,33 @@ func start(): var char_name = profile.get_player_name(route_id) var button = MenuButton.instance() button.set_text(char_name) - button.connect("pressed", self, "_on_load_game", [route_id]) + button.connect("selected", self, "_on_load_game_selected", [route_id]) saves_node.add_child(button) - set_process_input(true) show() + transition.connect("end_fadein", controller, "setup", [], CONNECT_ONESHOT) + transition.unfade_from_black(.5) func stop(): + hide() + loading.start() for button in saves_node.get_children(): - if button.get_name() != "new_game": + if button.get_name() != "new_game" and button.get_name() != "cursor": button.queue_free() - set_process_input(false) - hide() - -func _on_new_game(): - caplog.create_route() - stop() -func _on_load_game(save_id): - stop() - caplog.load_route(save_id) +func transition_out(database_action, file): + transition.connect("end_fadeout", self, "stop", [], CONNECT_ONESHOT) + transition.connect("end_fadeout", transition, "unfade_from_black", [.5], CONNECT_ONESHOT) + if not file: + transition.connect("end_fadein", database, database_action, [], CONNECT_ONESHOT) + else: + transition.connect("end_fadein", database, database_action, [file], CONNECT_ONESHOT) + transition.fade_to_black(.5) + +func _on_new_game_selected(): + print("new game selected!") + transition_out("create_route", false) + +func _on_load_game_selected(save_id): + print("load game selected!") + transition_out("load_route", save_id) get_tree().set_current_scene(get_node("/root/sector")) diff --git a/scenes/menu.tscn b/scenes/menu.tscn index 4a481484..f36e73f6 100644 --- a/scenes/menu.tscn +++ b/scenes/menu.tscn @@ -1,10 +1,28 @@ -[gd_scene load_steps=6 format=1] +[gd_scene load_steps=10 format=1] [ext_resource path="res://components/theme/wilokai.tres" type="Theme" id=1] [ext_resource path="res://scenes/menu.gd" type="Script" id=2] [ext_resource path="res://assets/fonts/PressStart2P.fnt" type="BitmapFont" id=3] -[ext_resource path="res://assets/fonts/PressStart2P-small.fnt" type="BitmapFont" id=4] -[ext_resource path="res://components/controller/default_controller.gd" type="Script" id=5] +[ext_resource path="res://assets/menu_cursor.png" type="Texture" id=4] +[ext_resource path="res://components/ui/save-button.tscn" type="PackedScene" id=5] +[ext_resource path="res://components/controller/menu_controller.gd" type="Script" id=6] +[ext_resource path="res://assets/fonts/PressStart2P-tiny.fnt" type="BitmapFont" id=7] + +[sub_resource type="Animation" id=1] + +resource/name = "idle" +length = 0.6 +loop = true +step = 0.15 +tracks/0/type = "value" +tracks/0/path = NodePath(".:offset") +tracks/0/interp = 1 +tracks/0/imported = false +tracks/0/keys = { "times":FloatArray( 0, 0.1, 0.3, 0.45 ), "transitions":FloatArray( 1, 1, 1, 1 ), "update":0, "values":[ Vector2( 0, 14 ), Vector2( 2, 16 ), Vector2( 0, 18 ), Vector2( -2, 16 ) ] } + +[sub_resource type="GDScript" id=2] + +script/source = "\nextends Label\n\nonready var meta = get_node(\"/root/database/Meta\")\n\nfunc _ready():\n\tset_text(meta.get_version_str())\n\n\n" [node name="menu" type="Control"] @@ -20,24 +38,25 @@ margin/top = 0.0 margin/right = 0.0 margin/bottom = 0.0 script/script = ExtResource( 2 ) +__meta__ = { "_edit_lock_":true } [node name="Title" type="Label" parent="."] anchor/right = 1 anchor/bottom = 1 +rect/scale = Vector2( 0.5, 0.5 ) focus/ignore_mouse = true focus/stop_mouse = true size_flags/horizontal = 2 size_flags/vertical = 0 -margin/left = 32.0 -margin/top = 128.0 -margin/right = 32.0 -margin/bottom = 256.0 +margin/left = 96.0 +margin/top = 176.0 +margin/right = -32.0 +margin/bottom = 208.0 custom_fonts/font = ExtResource( 3 ) -custom_colors/font_color = Color( 0.686275, 0.627451, 0.376471, 1 ) -text = "Backdoor" -align = 1 -valign = 1 +custom_colors/font_color = Color( 1, 1, 1, 1 ) +text = "backdoor" +valign = 2 percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 @@ -50,35 +69,64 @@ focus/ignore_mouse = false focus/stop_mouse = false size_flags/horizontal = 2 size_flags/vertical = 2 -margin/left = 128.0 +margin/left = 96.0 margin/top = 256.0 -margin/right = 128.0 +margin/right = 160.0 margin/bottom = 32.0 alignment = 0 -__meta__ = { "_edit_lock_":true } -[node name="new_game" type="Button" parent="saves"] +[node name="cursor" type="Sprite" parent="saves"] + +visibility/visible = false +transform/pos = Vector2( -32, -4 ) +texture = ExtResource( 4 ) +offset = Vector2( 0, 14 ) +modulate = Color( 0.917647, 0.65098, 0.317647, 1 ) + +[node name="animation" type="AnimationPlayer" parent="saves/cursor"] + +playback/process_mode = 1 +playback/default_blend_time = 0.0 +root/root = NodePath("..") +anims/idle = SubResource( 1 ) +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "idle" + +[node name="new_game" parent="saves" instance=ExtResource( 5 )] -focus/ignore_mouse = false -focus/stop_mouse = true -size_flags/horizontal = 2 -size_flags/vertical = 2 -margin/left = 0.0 -margin/top = 0.0 margin/right = 384.0 -margin/bottom = 16.0 -custom_fonts/font = ExtResource( 4 ) -toggle_mode = false -enabled_focus_mode = 2 -shortcut = null -text = "New route" -flat = false -__meta__ = { "_edit_lock_":true } +margin/bottom = 28.0 +text = "new route" + +[node name="controller" type="Node" parent="."] -[node name="Controller" type="Node" parent="."] +script/script = ExtResource( 6 ) -script/script = ExtResource( 5 ) +[node name="VersionTag" type="Label" parent="."] + +anchor/left = 1 +anchor/top = 1 +anchor/right = 1 +anchor/bottom = 1 +focus/ignore_mouse = true +focus/stop_mouse = true +size_flags/horizontal = 2 +size_flags/vertical = 0 +margin/left = 160.0 +margin/top = 14.0 +margin/right = 2.0 +margin/bottom = 2.0 +custom_fonts/font = ExtResource( 7 ) +text = "x.y.z-unstable" +align = 2 +valign = 1 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 +script/script = SubResource( 2 ) -[connection signal="pressed" from="saves/new_game" to="." method="_on_new_game"] +[connection signal="selected" from="saves/new_game" to="." method="_on_new_game_selected"]