Use scripts to create levels, add level selector

This commit is contained in:
Sebastian Morr 2020-09-01 19:20:51 +02:00
parent 1b5cbe9cb0
commit 2a0e2e46bb
9 changed files with 124 additions and 38 deletions

28
game.gd
View file

@ -31,8 +31,36 @@ func load_state() -> bool:
savegame.close() savegame.close()
return true return true
# Run a simple command given as a string, blocking, using execute.
func run(command): func run(command):
print("run: "+command)
var output = [] var output = []
OS.execute(command, [], true, output, true) OS.execute(command, [], true, output, true)
# Remove trailing newline. # Remove trailing newline.
return output[0].substr(0,len(output[0])-1) return output[0].substr(0,len(output[0])-1)
func sh(command, wd="/tmp/"):
print("sh in "+wd+": "+command)
var cwd = game.run("pwd")
var output = []
var hacky_command = command
hacky_command = "cd '"+wd+"';"+hacky_command
hacky_command = "export EDITOR=fake-editor;"+hacky_command
hacky_command = "export PATH=\"$PATH\":"+cwd+"/scripts;"+hacky_command
OS.execute("/bin/sh", ["-c", hacky_command], true, output, true)
return output[0]
func read_file(path):
var file = File.new()
file.open(path, File.READ)
var content = file.get_as_text()
file.close()
return content
func write_file(path, content):
var file = File.new()
file.open(path, File.WRITE)
file.store_string(content)
file.close()
return true

6
levels/blobs/goal Normal file
View file

@ -0,0 +1,6 @@
echo "Hi" > file1
echo "Ho" > file1
echo "Hu" > file1
git hash-object -w file1
git hash-object -w file2
git hash-object -w file3

0
levels/blobs/start Normal file
View file

1
levels/first/goal Normal file
View file

@ -0,0 +1 @@
git commit --allow-empty -m "Emtpy commit"

0
levels/first/start Normal file
View file

79
main.gd
View file

@ -6,21 +6,63 @@ var server
var client_connection var client_connection
func _ready(): func _ready():
var level = "first" # Initialize level select.
var goal_repository_path = "goal" var options = $LevelSelect.get_popup()
var start_repository_path = "start" for level in list_levels():
var active_repository_path = "active" options.add_item(level)
var active_prefix = "/tmp/" options.connect("id_pressed", self, "load_level")
var levels_prefix = game.run("pwd")+"/levels/"+level+"/"
OS.execute("rm", ["-r", active_prefix+active_repository_path], true)
OS.execute("cp", ["-ra", levels_prefix+start_repository_path, active_prefix+active_repository_path], true)
$GoalRepository.path = levels_prefix+goal_repository_path
$ActiveRepository.path = active_prefix+active_repository_path
# Initialize TCP server for fake editor.
server = TCP_Server.new() server = TCP_Server.new()
server.listen(1234) server.listen(1234)
func list_levels():
var levels = []
var dir = Directory.new()
dir.open("levels")
dir.list_dir_begin()
while true:
var file = dir.get_next()
if file == "":
break
elif not file.begins_with("."):
levels.append(file)
dir.list_dir_end()
return levels
func load_level(id):
var levels = list_levels()
var level = levels[id]
var cwd = game.run("pwd")
var tmp_prefix = "/tmp/"
var level_prefix = cwd+"/levels/"
var goal_repository_path = tmp_prefix+"goal/"
var active_repository_path = tmp_prefix+"active/"
var goal_script = level_prefix+level+"/goal"
var active_script = level_prefix+level+"/start"
OS.execute("rm", ["-r", active_repository_path], true)
OS.execute("rm", ["-r", goal_repository_path], true)
construct_repo(goal_script, goal_repository_path)
construct_repo(active_script, active_repository_path)
$GoalRepository.path = goal_repository_path
$ActiveRepository.path = active_repository_path
func construct_repo(script, path):
print(path)
game.sh("mkdir "+path)
game.sh("git init", path)
var commands = game.read_file(script).split("\n")
print(commands)
for command in commands:
print(command)
game.sh(command, path)
func _process(delta): func _process(delta):
if server.is_connection_available(): if server.is_connection_available():
client_connection = server.take_connection() client_connection = server.take_connection()
@ -50,23 +92,12 @@ func _process(delta):
func read_commit_message(): func read_commit_message():
$CommitMessage.show() $CommitMessage.show()
$Terminal/Input.editable = false $Terminal/Input.editable = false
var file_path = "/tmp/githydragit/.git/COMMIT_EDITMSG" $CommitMessage.text = game.read_file("/tmp/githydragit/.git/COMMIT_EDITMSG")
var file = File.new()
file.open(file_path, File.READ)
var content = file.get_as_text()
file.close()
$CommitMessage.text = content
func save_commit_message(): func save_commit_message():
var file = File.new() game.write_file("/tmp/githydragit/.git/COMMIT_EDITMSG", $CommitMessage.text)
var file_path = "/tmp/githydragit/.git/COMMIT_EDITMSG"
file.open(file_path, File.WRITE)
var content = $CommitMessage.text
file.store_string(content)
file.close()
print("disconnect") print("disconnect")
client_connection.disconnect_from_host() client_connection.disconnect_from_host()
$Terminal/Input.editable = true $Terminal/Input.editable = true
$CommitMessage.text = "" $CommitMessage.text = ""
$CommitMessage.hide() $CommitMessage.hide()

View file

@ -57,5 +57,16 @@ size = Vector2( 500, 1000 )
[node name="ActiveRepository" parent="." instance=ExtResource( 3 )] [node name="ActiveRepository" parent="." instance=ExtResource( 3 )]
position = Vector2( 704.399, 17.2594 ) position = Vector2( 704.399, 17.2594 )
size = Vector2( 500, 1000 ) size = Vector2( 500, 1000 )
[node name="LevelSelect" type="MenuButton" parent="."]
margin_left = 11.5584
margin_top = 11.1303
margin_right = 109.558
margin_bottom = 31.1303
text = "Select level..."
flat = false
__meta__ = {
"_edit_use_anchors_": false
}
[connection signal="text_entered" from="Terminal/Input" to="Terminal" method="send_command"] [connection signal="text_entered" from="Terminal/Input" to="Terminal" method="send_command"]
[connection signal="pressed" from="CommitMessage/Button" to="." method="save_commit_message"] [connection signal="pressed" from="CommitMessage/Button" to="." method="save_commit_message"]

View file

@ -10,6 +10,9 @@ func _ready():
func _process(delta): func _process(delta):
if path: if path:
update_everything()
func update_everything():
update_head() update_head()
update_refs() update_refs()
update_index() update_index()
@ -18,6 +21,9 @@ func _process(delta):
func set_path(new_path): func set_path(new_path):
path = new_path path = new_path
for o in objects.values():
o.queue_free()
objects = {}
func get_path(): func get_path():
return path return path
@ -126,6 +132,16 @@ func update_head():
add_child(n) add_child(n)
var n = objects["HEAD"] var n = objects["HEAD"]
n.children = {symref_target("HEAD"): ""} n.children = {symref_target("HEAD"): ""}
if not objects.has(symref_target("HEAD")):
var n2 = node.instance()
var r = symref_target("HEAD")
n2.id = r
n2.type = "ref"
n2.content = ""
n2.repository = self
n2.position = random_position()
objects[r] = n2
add_child(n2)
func all_objects(): func all_objects():
return git("cat-file --batch-check=%(objectname) --batch-all-objects", true) return git("cat-file --batch-check=%(objectname) --batch-all-objects", true)

View file

@ -7,15 +7,8 @@ func send_command(command):
thread.start(self, "run_command_in_a_thread", command) thread.start(self, "run_command_in_a_thread", command)
func run_command_in_a_thread(command): func run_command_in_a_thread(command):
var cwd = game.run("pwd") var output = game.sh(command, "/tmp/active")
var output = []
var hacky_command = command
hacky_command = "cd /tmp/githydragit;"+hacky_command
hacky_command = "export EDITOR=fake-editor;"+hacky_command
hacky_command = "export PATH=\"$PATH\":"+cwd+"/scripts;"+hacky_command
OS.execute("/bin/sh", ["-c", hacky_command], true, output, true)
$Input.text = "" $Input.text = ""
$Output.text = $Output.text + "$ " + command + "\n" + output[0] $Output.text = $Output.text + "$ " + command + "\n" + output
$Output.scroll_vertical = 999999 $Output.scroll_vertical = 999999