about summary refs log tree commit diff stats
path: root/apworld/client/run_from_source.tscn
blob: 59a914d995af91c3f6796442fe427c3f94a571ff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[gd_scene load_steps=11 format=2]

[sub_resource id=2 type="GDScript"]
script/source = "extends Node2D


func _ready():
	var args = OS.get_cmdline_user_args()
	var source_path = args[0]

	var runtime_script = ResourceLoader.load(\"%s/source_runtime.gd\" % source_path)
	var runtime = runtime_script.new(source_path)
	runtime.name = \"Runtime\"

	global.add_child(runtime)

	runtime.load_script_as_scene.call_deferred(\"settings_screen.gd\", \"settings_screen\")

"

[node name="loader" type="Node2D"]
script = SubResource( 2 )
#008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include "godot_processor.h"

#include <filesystem>
#include <iostream>
#include <memory>
#include <set>

#include "structs.h"
#include "util/godot_scene.h"

namespace com::fourisland::lingo2_archipelago {

namespace {

static const std::set<std::string> kImportantNodeTypes = {
    "res://objects/nodes/panel.tscn", "res://objects/nodes/worldport.tscn",
    "res://objects/nodes/keyHolder.tscn",
    "res://objects/nodes/collectable.tscn"};

class GodotProcessor {
 public:
  GodotProcessor(const std::string& repodir, CollectedInfo& info)
      : repodir_(repodir), info_(info) {}

  void Run() {
    for (auto& [map_name, map_info] : info_.maps) {
      ProcessMap(map_name, map_info);
    }
  }

  void ProcessMap(const std::string& map_name, MapInfo& map_info) {
    std::filesystem::path scene_path = std::filesystem::path(repodir_) /
                                       "objects" / "scenes" /
                                       (map_name + ".tscn");
    std::string scene_path_str = scene_path.string();
    std::cout << "Processing " << scene_path_str << std::endl;

    GodotScene scene = ReadGodotSceneFromFile(scene_path_str);
    for (const GodotNode& node : scene.GetNodes()) {
      ProcessMapNode(scene, node, map_info);
    }
  }

  void ProcessMapNode(const GodotScene& scene, const GodotNode& node,
                      MapInfo& map_info) {
    if (std::holds_alternative<GodotExtResourceRef>(node.instance_type)) {
      const GodotExtResourceRef& ext_resource_ref =
          std::get<GodotExtResourceRef>(node.instance_type);
      const GodotExtResource* ext_resource =
          scene.GetExtResource(ext_resource_ref.id);

      if (ext_resource != nullptr &&
          (kImportantNodeTypes.count(ext_resource->path) ||
           ext_resource->path.starts_with("res://objects/meshes/paintings/"))) {
        map_info.game_nodes[node.GetPath()].defined = true;
      }
    }
  }

 private:
  std::string repodir_;
  CollectedInfo& info_;
};

}  // namespace

void ProcessGodotData(const std::string& repodir, CollectedInfo& info) {
  GodotProcessor godot_processor(repodir, info);
  godot_processor.Run();
}

}  // namespace com::fourisland::lingo2_archipelago