oh-my-git/scenes/main.gd

229 lines
6.9 KiB
GDScript3
Raw Normal View History

extends Control
2020-03-18 15:23:38 +01:00
2020-03-18 20:03:17 +01:00
var dragged = null
2023-09-06 16:04:23 +02:00
@onready var terminal = $Rows/Controls/Terminal
@onready var input = terminal.input
@onready var output = terminal.output
@onready var repositories_node = $Rows/Columns/Repositories
var repositories = {}
2023-09-06 16:04:23 +02:00
@onready var next_level_button = $Menu/NextLevelButton
@onready var level_name = $Rows/Columns/RightSide/LevelInfo/LevelPanel/LevelName
@onready var level_description = $Rows/Columns/RightSide/LevelInfo/LevelPanel/Text/LevelDescription
@onready var level_congrats = $Rows/Columns/RightSide/LevelInfo/LevelPanel/Text/LevelCongrats
@onready var cards = $Rows/Controls/Cards
@onready var file_browser = $Rows/Columns/RightSide/FileBrowser
@onready var goals = $Rows/Columns/RightSide/LevelInfo/LevelPanel/Goals
2020-09-01 21:25:24 +02:00
var _hint_server
var _hint_client_connection
2020-03-18 15:23:38 +01:00
func _ready():
2023-09-06 16:04:23 +02:00
_hint_server = TCPServer.new()
_hint_server.listen(1235)
var args = helpers.parse_args()
if args.has("sandbox"):
2023-09-06 16:04:23 +02:00
var err = get_tree().change_scene_to_file("res://scenes/sandbox.tscn")
if err != OK:
helpers.crash("Could not change to sandbox scene")
return
2020-09-04 14:57:37 +02:00
# Initialize level select.
2021-01-19 11:13:40 +01:00
# level_select.connect("item_selected", self, "load_level")
# repopulate_levels()
# level_select.select(game.current_level)
2020-09-04 14:57:37 +02:00
2021-01-19 11:13:40 +01:00
# # Initialize chapter select.
# chapter_select.connect("item_selected", self, "load_chapter")
# repopulate_chapters()
# chapter_select.select(game.current_chapter)
2020-09-28 18:40:41 +02:00
# Load current level.
load_level(game.current_level)
2020-09-04 14:57:37 +02:00
input.grab_focus()
func _process(delta):
if _hint_server.is_connection_available():
_hint_client_connection = _hint_server.take_connection()
var length = _hint_client_connection.get_u32()
var message = _hint_client_connection.get_string(length)
game.notify(message)
# if game.used_cards:
# $Menu/CLIBadge.impossible = true
2021-02-18 15:45:39 +01:00
# Magic height number to fix a weird rescaling bug that affected
# the Rows height.
2023-09-06 16:04:23 +02:00
$Rows.size.y = 1064
2020-09-28 18:40:41 +02:00
func load_chapter(id):
game.current_chapter = id
load_level(0)
2020-09-28 18:40:41 +02:00
2020-09-29 19:40:17 +02:00
func load_level(level_id):
next_level_button.hide()
level_congrats.hide()
level_description.show()
game.current_level = level_id
2021-01-21 15:08:59 +01:00
game.used_cards = false
2020-09-04 14:57:37 +02:00
AudioServer.set_bus_mute(AudioServer.get_bus_index("SFX"), true)
levels.chapters[game.current_chapter].levels[game.current_level].construct()
2020-09-29 19:40:17 +02:00
var level = levels.chapters[game.current_chapter].levels[game.current_level]
2023-09-06 16:04:23 +02:00
level_description.text = level.description[0]
level_congrats.text = level.congrats
level_name.text = level.title
var slug = levels.chapters[game.current_chapter].slug + "/" + level.slug
$Menu/CLIBadge.active = slug in game.state["cli_badge"]
$Menu/CLIBadge.sparkling = false
#if levels.chapters[game.current_chapter].levels[game.current_level].cards.size() == 0:
# cards.redraw_all_cards()
#else:
cards.draw(levels.chapters[game.current_chapter].levels[game.current_level].cards)
2020-09-04 14:57:37 +02:00
for r in repositories_node.get_children():
r.queue_free()
repositories = {}
var repo_names = level.repos.keys()
2023-09-06 16:04:23 +02:00
repo_names.reverse()
for r in repo_names:
var repo = level.repos[r]
2023-09-06 16:04:23 +02:00
var new_repo = preload("res://scenes/repository.tscn").instantiate()
new_repo.path = repo.path
new_repo.label = repo.slug
new_repo.size_flags_horizontal = SIZE_EXPAND_FILL
new_repo.size_flags_vertical = SIZE_EXPAND_FILL
2020-10-27 17:38:41 +01:00
if new_repo.label == "yours":
file_browser.repository = new_repo
2020-10-27 17:32:41 +01:00
file_browser.update()
repositories_node.add_child(new_repo)
repositories[r] = new_repo
2020-10-12 19:00:51 +02:00
terminal.repository = repositories[repo_names[repo_names.size()-1]]
terminal.clear()
2023-09-06 16:04:23 +02:00
terminal.find_child("TextEditor").close()
2021-01-13 16:26:48 +01:00
update_repos()
2020-12-22 12:44:07 +01:00
# Unmute the audio after a while, so that player can hear pop sounds for
# nodes they create.
var t = Timer.new()
t.wait_time = 1
add_child(t)
t.start()
2023-09-06 16:04:23 +02:00
await t.timeout
AudioServer.set_bus_mute(AudioServer.get_bus_index("SFX"), false)
# FIXME: Need to clean these up when switching levels somehow.
2020-10-29 16:17:04 +01:00
2021-01-19 11:13:40 +01:00
# chapter_select.select(game.current_chapter)
# level_select.select(game.current_level)
#game.notify("These are your cards!", cards)
2020-09-13 21:55:24 +02:00
func reload_level():
cards.load_card_store()
levels.reload()
load_level(game.current_level)
2020-09-13 21:55:24 +02:00
func load_next_level():
game.current_level += 1
if game.current_level >= levels.chapters[game.current_chapter].levels.size():
back()
else:
load_level(game.current_level)
2020-09-10 12:03:46 +02:00
2020-12-22 12:44:07 +01:00
func show_win_status(win_states):
var all_won = true
var win_text = "\n\n"
for child in goals.get_children():
child.queue_free()
2020-12-22 12:44:07 +01:00
for state in win_states:
var b = Label.new()
b.text = state
2023-09-06 16:04:23 +02:00
#b.align = HALIGN_LEFT ToDo align fix
var bg = StyleBoxFlat.new()
if win_states[state]:
bg.bg_color = Color(0.1, 0.5, 0.1)
else:
bg.bg_color = Color(0.5, 0.1, 0.1)
bg.corner_radius_bottom_left = 8
bg.corner_radius_bottom_right = 8
bg.corner_radius_top_left = 8
bg.corner_radius_top_right = 8
bg.content_margin_bottom = 8
bg.content_margin_top = 8
bg.content_margin_left = 8
bg.content_margin_right = 8
2023-09-06 16:04:23 +02:00
b.set("theme_override_styles/normal", bg)
#b.connect("pressed", self, "load", [chapter_id, level_id])
#var slug = chapter.slug + "/" + level.slug
goals.add_child(b)
2023-09-06 16:04:23 +02:00
b.autowrap_mode = TextServer.AUTOWRAP_ARBITRARY
2020-12-22 12:44:07 +01:00
if not win_states[state]:
all_won = false
var level = levels.chapters[game.current_chapter].levels[game.current_level]
2023-09-06 16:04:23 +02:00
level_description.text = level.description[0] + win_text
2020-12-22 17:53:16 +01:00
for i in range(1,level.tipp_level+1):
2023-09-06 16:04:23 +02:00
level_description.text += level.description[i]
2020-12-22 12:44:07 +01:00
if not level_congrats.visible and all_won and win_states.size() > 0:
2020-10-22 16:19:22 +02:00
next_level_button.show()
level_description.hide()
level_congrats.show()
$SuccessSound.play()
2021-01-07 11:36:11 +01:00
var slug = levels.chapters[game.current_chapter].slug + "/" + level.slug
if not slug in game.state["solved_levels"]:
game.state["solved_levels"].push_back(slug)
game.save_state()
2021-01-21 15:08:59 +01:00
if not game.used_cards and not slug in game.state["cli_badge"]:
game.state["cli_badge"].push_back(slug)
game.save_state()
$Menu/CLIBadge.active = true
2021-01-21 15:08:59 +01:00
$Menu/CLIBadge.sparkling = true
2021-01-19 11:13:40 +01:00
#func repopulate_levels():
# levels.reload()
# level_select.clear()
# for level in levels.chapters[game.current_chapter].levels:
# level_select.add_item(level.title)
# level_select.select(game.current_level)
2020-09-28 18:40:41 +02:00
2021-01-19 11:13:40 +01:00
#func repopulate_chapters():
# levels.reload()
# chapter_select.clear()
# for c in levels.chapters:
# chapter_select.add_item(c.slug)
# chapter_select.select(game.current_chapter)
func update_repos():
var win_states = levels.chapters[game.current_chapter].levels[game.current_level].check_win()
2020-12-22 17:52:15 +01:00
show_win_status(win_states)
for r in repositories:
var repo = repositories[r]
repo.update_everything()
2020-10-27 17:32:41 +01:00
file_browser.update()
input.grab_focus()
2020-10-14 14:52:29 +02:00
func toggle_cards():
cards.visible = not cards.visible
2020-12-22 17:53:16 +01:00
func new_tip():
var level = levels.chapters[game.current_chapter].levels[game.current_level]
2020-12-22 17:53:16 +01:00
if level.description.size() - 1 > level.tipp_level :
level.tipp_level += 1
2023-09-06 16:04:23 +02:00
level_description.text += level.description[level.tipp_level]
func back():
2023-09-06 16:04:23 +02:00
get_tree().change_scene_to_file("res://scenes/level_select.tscn")