mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 00:57:44 -04:00
[goalc] add a build system (#704)
* add first attempt at build system * fix stupid bug * try again
This commit is contained in:
parent
77667d9185
commit
ef011f4fe8
|
@ -72,7 +72,8 @@ Interpreter::Interpreter() {
|
||||||
{"string-ref", &Interpreter::eval_string_ref},
|
{"string-ref", &Interpreter::eval_string_ref},
|
||||||
{"string-length", &Interpreter::eval_string_length},
|
{"string-length", &Interpreter::eval_string_length},
|
||||||
{"string-append", &Interpreter::eval_string_append},
|
{"string-append", &Interpreter::eval_string_append},
|
||||||
{"ash", &Interpreter::eval_ash}};
|
{"ash", &Interpreter::eval_ash},
|
||||||
|
{"symbol->string", &Interpreter::eval_symbol_to_string}};
|
||||||
|
|
||||||
string_to_type = {{"empty-list", ObjectType::EMPTY_LIST},
|
string_to_type = {{"empty-list", ObjectType::EMPTY_LIST},
|
||||||
{"integer", ObjectType::INTEGER},
|
{"integer", ObjectType::INTEGER},
|
||||||
|
@ -90,6 +91,17 @@ Interpreter::Interpreter() {
|
||||||
load_goos_library();
|
load_goos_library();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Add a user defined special form. The given function will be called with unevaluated arguments.
|
||||||
|
* Lookup from these forms occurs after special/builtin, but before any env lookups.
|
||||||
|
*/
|
||||||
|
void Interpreter::register_form(
|
||||||
|
const std::string& name,
|
||||||
|
const std::function<
|
||||||
|
Object(const Object&, Arguments&, const std::shared_ptr<EnvironmentObject>&)>& form) {
|
||||||
|
m_custom_forms[name] = form;
|
||||||
|
}
|
||||||
|
|
||||||
Interpreter::~Interpreter() {
|
Interpreter::~Interpreter() {
|
||||||
// There are some circular references that prevent shared_ptrs from cleaning up if we
|
// There are some circular references that prevent shared_ptrs from cleaning up if we
|
||||||
// don't do this.
|
// don't do this.
|
||||||
|
@ -191,6 +203,19 @@ bool Interpreter::get_global_variable_by_name(const std::string& name, Object* d
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the variable to the value. Overwrites an existing value, or creates a new global.
|
||||||
|
*/
|
||||||
|
void Interpreter::set_global_variable_by_name(const std::string& name, const Object& value) {
|
||||||
|
auto sym = SymbolObject::make_new(reader.symbolTable, name).as_symbol();
|
||||||
|
global_environment.as_env()->vars[sym] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Interpreter::set_global_variable_to_symbol(const std::string& name, const std::string& value) {
|
||||||
|
auto sym = SymbolObject::make_new(reader.symbolTable, value);
|
||||||
|
set_global_variable_by_name(name, sym);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Get arguments being passed to a form. Don't evaluate them. There are two modes, "varargs" and
|
* Get arguments being passed to a form. Don't evaluate them. There are two modes, "varargs" and
|
||||||
* "not varargs". With varargs enabled, any number of unnamed and named arguments can be given.
|
* "not varargs". With varargs enabled, any number of unnamed and named arguments can be given.
|
||||||
|
@ -525,6 +550,13 @@ Object Interpreter::eval_pair(const Object& obj, const std::shared_ptr<Environme
|
||||||
return ((*this).*(kv_b->second))(obj, args, env);
|
return ((*this).*(kv_b->second))(obj, args, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try custom forms next
|
||||||
|
auto kv_u = m_custom_forms.find(head_sym->name);
|
||||||
|
if (kv_u != m_custom_forms.end()) {
|
||||||
|
Arguments args = get_args(obj, rest, make_varargs());
|
||||||
|
return (kv_u->second)(obj, args, env);
|
||||||
|
}
|
||||||
|
|
||||||
// try macros next
|
// try macros next
|
||||||
Object macro_obj;
|
Object macro_obj;
|
||||||
if (try_symbol_lookup(head, env, ¯o_obj) && macro_obj.is_macro()) {
|
if (try_symbol_lookup(head, env, ¯o_obj) && macro_obj.is_macro()) {
|
||||||
|
@ -1586,10 +1618,17 @@ Object Interpreter::eval_ash(const Object& form,
|
||||||
if (sa >= 0 && sa < 64) {
|
if (sa >= 0 && sa < 64) {
|
||||||
return Object::make_integer(val << sa);
|
return Object::make_integer(val << sa);
|
||||||
} else if (sa > -64) {
|
} else if (sa > -64) {
|
||||||
return Object::make_integer(val >> sa);
|
return Object::make_integer(val >> -sa);
|
||||||
} else {
|
} else {
|
||||||
throw_eval_error(form, fmt::format("Shift amount {} is out of range", sa));
|
throw_eval_error(form, fmt::format("Shift amount {} is out of range", sa));
|
||||||
return EmptyListObject::make_new();
|
return EmptyListObject::make_new();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object Interpreter::eval_symbol_to_string(const Object& form,
|
||||||
|
Arguments& args,
|
||||||
|
const std::shared_ptr<EnvironmentObject>&) {
|
||||||
|
vararg_check(form, args, {ObjectType::SYMBOL}, {});
|
||||||
|
return StringObject::make_new(args.unnamed.at(0).as_symbol()->name);
|
||||||
|
}
|
||||||
} // namespace goos
|
} // namespace goos
|
||||||
|
|
|
@ -19,6 +19,8 @@ class Interpreter {
|
||||||
void throw_eval_error(const Object& o, const std::string& err);
|
void throw_eval_error(const Object& o, const std::string& err);
|
||||||
Object eval_with_rewind(const Object& obj, const std::shared_ptr<EnvironmentObject>& env);
|
Object eval_with_rewind(const Object& obj, const std::shared_ptr<EnvironmentObject>& env);
|
||||||
bool get_global_variable_by_name(const std::string& name, Object* dest);
|
bool get_global_variable_by_name(const std::string& name, Object* dest);
|
||||||
|
void set_global_variable_by_name(const std::string& name, const Object& value);
|
||||||
|
void set_global_variable_to_symbol(const std::string& name, const std::string& value);
|
||||||
Object eval(Object obj, const std::shared_ptr<EnvironmentObject>& env);
|
Object eval(Object obj, const std::shared_ptr<EnvironmentObject>& env);
|
||||||
Object intern(const std::string& name);
|
Object intern(const std::string& name);
|
||||||
void disable_printfs();
|
void disable_printfs();
|
||||||
|
@ -36,6 +38,12 @@ class Interpreter {
|
||||||
const std::shared_ptr<EnvironmentObject>& env);
|
const std::shared_ptr<EnvironmentObject>& env);
|
||||||
bool truthy(const Object& o);
|
bool truthy(const Object& o);
|
||||||
|
|
||||||
|
void register_form(
|
||||||
|
const std::string& name,
|
||||||
|
const std::function<
|
||||||
|
Object(const Object&, Arguments&, const std::shared_ptr<EnvironmentObject>&)>& form);
|
||||||
|
void eval_args(Arguments* args, const std::shared_ptr<EnvironmentObject>& env);
|
||||||
|
|
||||||
Reader reader;
|
Reader reader;
|
||||||
Object global_environment;
|
Object global_environment;
|
||||||
Object goal_env;
|
Object goal_env;
|
||||||
|
@ -59,7 +67,6 @@ class Interpreter {
|
||||||
const std::unordered_map<std::string, std::pair<bool, std::optional<ObjectType>>>& named);
|
const std::unordered_map<std::string, std::pair<bool, std::optional<ObjectType>>>& named);
|
||||||
|
|
||||||
Object eval_pair(const Object& o, const std::shared_ptr<EnvironmentObject>& env);
|
Object eval_pair(const Object& o, const std::shared_ptr<EnvironmentObject>& env);
|
||||||
void eval_args(Arguments* args, const std::shared_ptr<EnvironmentObject>& env);
|
|
||||||
ArgumentSpec parse_arg_spec(const Object& form, Object& rest);
|
ArgumentSpec parse_arg_spec(const Object& form, Object& rest);
|
||||||
|
|
||||||
Object quasiquote_helper(const Object& form, const std::shared_ptr<EnvironmentObject>& env);
|
Object quasiquote_helper(const Object& form, const std::shared_ptr<EnvironmentObject>& env);
|
||||||
|
@ -198,6 +205,9 @@ class Interpreter {
|
||||||
Object eval_ash(const Object& form,
|
Object eval_ash(const Object& form,
|
||||||
Arguments& args,
|
Arguments& args,
|
||||||
const std::shared_ptr<EnvironmentObject>& env);
|
const std::shared_ptr<EnvironmentObject>& env);
|
||||||
|
Object eval_symbol_to_string(const Object& form,
|
||||||
|
Arguments& args,
|
||||||
|
const std::shared_ptr<EnvironmentObject>& env);
|
||||||
|
|
||||||
// specials
|
// specials
|
||||||
Object eval_define(const Object& form,
|
Object eval_define(const Object& form,
|
||||||
|
@ -239,6 +249,11 @@ class Interpreter {
|
||||||
Arguments& args,
|
Arguments& args,
|
||||||
const std::shared_ptr<EnvironmentObject>& env)>
|
const std::shared_ptr<EnvironmentObject>& env)>
|
||||||
builtin_forms;
|
builtin_forms;
|
||||||
|
|
||||||
|
std::unordered_map<
|
||||||
|
std::string,
|
||||||
|
std::function<Object(const Object&, Arguments&, const std::shared_ptr<EnvironmentObject>&)>>
|
||||||
|
m_custom_forms;
|
||||||
std::unordered_map<std::string,
|
std::unordered_map<std::string,
|
||||||
Object (Interpreter::*)(const Object& form,
|
Object (Interpreter::*)(const Object& form,
|
||||||
const Object& rest,
|
const Object& rest,
|
||||||
|
|
|
@ -580,6 +580,7 @@ std::string ObjectFileDB::process_tpages() {
|
||||||
|
|
||||||
if (tpage_dir_count == 0) {
|
if (tpage_dir_count == 0) {
|
||||||
lg::warn("Did not find tpage-dir.");
|
lg::warn("Did not find tpage-dir.");
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
lg::info("Processed {} / {} textures {:.2f}% in {:.2f} ms", success, total,
|
lg::info("Processed {} / {} textures {:.2f}% in {:.2f} ms", success, total,
|
||||||
|
@ -612,6 +613,9 @@ std::string ObjectFileDB::process_game_text_files() {
|
||||||
lg::info("Processed {} text files ({} strings, {} characters) in {:.2f} ms", file_count,
|
lg::info("Processed {} text files ({} strings, {} characters) in {:.2f} ms", file_count,
|
||||||
string_count, char_count, timer.getMs());
|
string_count, char_count, timer.getMs());
|
||||||
|
|
||||||
|
if (text_by_language_by_id.empty()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
return write_game_text(text_by_language_by_id);
|
return write_game_text(text_by_language_by_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
"hexdump_code": false,
|
"hexdump_code": false,
|
||||||
"hexdump_data": false,
|
"hexdump_data": false,
|
||||||
// dump raw obj files
|
// dump raw obj files
|
||||||
"dump_objs": false,
|
"dump_objs": true,
|
||||||
// print control flow graph
|
// print control flow graph
|
||||||
"print_cfgs": false,
|
"print_cfgs": false,
|
||||||
|
|
||||||
|
|
|
@ -100,17 +100,23 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
if (config.process_game_text) {
|
if (config.process_game_text) {
|
||||||
auto result = db.process_game_text_files();
|
auto result = db.process_game_text_files();
|
||||||
file_util::write_text_file(file_util::get_file_path({"assets", "game_text.txt"}), result);
|
if (!result.empty()) {
|
||||||
|
file_util::write_text_file(file_util::get_file_path({"assets", "game_text.txt"}), result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.process_tpages) {
|
if (config.process_tpages) {
|
||||||
auto result = db.process_tpages();
|
auto result = db.process_tpages();
|
||||||
file_util::write_text_file(file_util::get_file_path({"assets", "tpage-dir.txt"}), result);
|
if (!result.empty()) {
|
||||||
|
file_util::write_text_file(file_util::get_file_path({"assets", "tpage-dir.txt"}), result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.process_game_count) {
|
if (config.process_game_count) {
|
||||||
auto result = db.process_game_count_file();
|
auto result = db.process_game_count_file();
|
||||||
file_util::write_text_file(file_util::get_file_path({"assets", "game_count.txt"}), result);
|
if (!result.empty()) {
|
||||||
|
file_util::write_text_file(file_util::get_file_path({"assets", "game_count.txt"}), result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lg::info("Disassembly has completed successfully.");
|
lg::info("Disassembly has completed successfully.");
|
||||||
|
|
|
@ -54,7 +54,7 @@ void Loop(std::function<bool()> f) {
|
||||||
// exit if display window was closed
|
// exit if display window was closed
|
||||||
if (glfwWindowShouldClose(Display::display)) {
|
if (glfwWindowShouldClose(Display::display)) {
|
||||||
// Display::KillDisplay(Display::display);
|
// Display::KillDisplay(Display::display);
|
||||||
MasterExit = 1;
|
MasterExit = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
295
goal_src/dgos/engine.gd
Normal file
295
goal_src/dgos/engine.gd
Normal file
|
@ -0,0 +1,295 @@
|
||||||
|
("ENGINE.CGO"
|
||||||
|
("types-h.o" "types-h")
|
||||||
|
("vu1-macros.o" "vu1-macros")
|
||||||
|
|
||||||
|
;; the "math" section
|
||||||
|
("math.o" "math")
|
||||||
|
("vector-h.o" "vector-h")
|
||||||
|
("gravity-h.o" "gravity-h")
|
||||||
|
("bounding-box-h.o" "bounding-box-h")
|
||||||
|
("matrix-h.o" "matrix-h")
|
||||||
|
("quaternion-h.o" "quaternion-h")
|
||||||
|
("euler-h.o" "euler-h")
|
||||||
|
("transform-h.o" "transform-h")
|
||||||
|
("geometry-h.o" "geometry-h")
|
||||||
|
("trigonometry-h.o" "trigonometry-h")
|
||||||
|
("transformq-h.o" "transformq-h")
|
||||||
|
("bounding-box.o" "bounding-box")
|
||||||
|
("matrix.o" "matrix")
|
||||||
|
("transform.o" "transform")
|
||||||
|
("quaternion.o" "quaternion")
|
||||||
|
("euler.o" "euler")
|
||||||
|
("geometry.o" "geometry")
|
||||||
|
("trigonometry.o" "trigonometry")
|
||||||
|
|
||||||
|
|
||||||
|
("gsound-h.o" "gsound-h")
|
||||||
|
("timer-h.o" "timer-h")
|
||||||
|
("timer.o" "timer")
|
||||||
|
("vif-h.o" "vif-h")
|
||||||
|
("dma-h.o" "dma-h")
|
||||||
|
("video-h.o" "video-h")
|
||||||
|
("vu1-user-h.o" "vu1-user-h")
|
||||||
|
("dma.o" "dma")
|
||||||
|
("dma-buffer.o" "dma-buffer")
|
||||||
|
("dma-bucket.o" "dma-bucket")
|
||||||
|
("dma-disasm.o" "dma-disasm")
|
||||||
|
("pad.o" "pad")
|
||||||
|
("gs.o" "gs")
|
||||||
|
("display-h.o" "display-h")
|
||||||
|
("vector.o" "vector")
|
||||||
|
("file-io.o" "file-io")
|
||||||
|
("loader-h.o" "loader-h")
|
||||||
|
("texture-h.o" "texture-h")
|
||||||
|
("level-h.o" "level-h")
|
||||||
|
("math-camera-h.o" "math-camera-h")
|
||||||
|
("math-camera.o" "math-camera")
|
||||||
|
("font-h.o" "font-h")
|
||||||
|
("decomp-h.o" "decomp-h")
|
||||||
|
("display.o" "display")
|
||||||
|
("connect.o" "connect")
|
||||||
|
("text-h.o" "text-h")
|
||||||
|
("settings-h.o" "settings-h")
|
||||||
|
("capture.o" "capture")
|
||||||
|
("memory-usage-h.o" "memory-usage-h")
|
||||||
|
("texture.o" "texture")
|
||||||
|
("main-h.o" "main-h")
|
||||||
|
("mspace-h.o" "mspace-h")
|
||||||
|
("drawable-h.o" "drawable-h")
|
||||||
|
("drawable-group-h.o" "drawable-group-h")
|
||||||
|
("drawable-inline-array-h.o" "drawable-inline-array-h")
|
||||||
|
("draw-node-h.o" "draw-node-h")
|
||||||
|
("drawable-tree-h.o" "drawable-tree-h")
|
||||||
|
("drawable-actor-h.o" "drawable-actor-h")
|
||||||
|
("drawable-ambient-h.o" "drawable-ambient-h")
|
||||||
|
("game-task-h.o" "game-task-h")
|
||||||
|
("hint-control-h.o" "hint-control-h")
|
||||||
|
("generic-h.o" "generic-h")
|
||||||
|
("lights-h.o" "lights-h")
|
||||||
|
("ocean-h.o" "ocean-h")
|
||||||
|
("ocean-trans-tables.o" "ocean-trans-tables")
|
||||||
|
("ocean-tables.o" "ocean-tables")
|
||||||
|
("ocean-frames.o" "ocean-frames")
|
||||||
|
("sky-h.o" "sky-h")
|
||||||
|
("mood-h.o" "mood-h")
|
||||||
|
("time-of-day-h.o" "time-of-day-h")
|
||||||
|
("art-h.o" "art-h")
|
||||||
|
("generic-vu1-h.o" "generic-vu1-h")
|
||||||
|
("merc-h.o" "merc-h")
|
||||||
|
("generic-merc-h.o" "generic-merc-h")
|
||||||
|
("generic-tie-h.o" "generic-tie-h")
|
||||||
|
("generic-work-h.o" "generic-work-h")
|
||||||
|
("shadow-cpu-h.o" "shadow-cpu-h")
|
||||||
|
("shadow-vu1-h.o" "shadow-vu1-h")
|
||||||
|
("memcard-h.o" "memcard-h")
|
||||||
|
("game-info-h.o" "game-info-h")
|
||||||
|
("wind-h.o" "wind-h")
|
||||||
|
("prototype-h.o" "prototype-h")
|
||||||
|
("joint-h.o" "joint-h")
|
||||||
|
("bones-h.o" "bones-h")
|
||||||
|
("engines.o" "engines")
|
||||||
|
("res-h.o" "res-h")
|
||||||
|
("res.o" "res")
|
||||||
|
("lights.o" "lights")
|
||||||
|
("dynamics-h.o" "dynamics-h")
|
||||||
|
("surface-h.o" "surface-h")
|
||||||
|
("pat-h.o" "pat-h")
|
||||||
|
("fact-h.o" "fact-h")
|
||||||
|
("aligner-h.o" "aligner-h")
|
||||||
|
("game-h.o" "game-h")
|
||||||
|
("generic-obs-h.o" "generic-obs-h")
|
||||||
|
("pov-camera-h.o" "pov-camera-h")
|
||||||
|
("sync-info-h.o" "sync-info-h")
|
||||||
|
("smush-control-h.o" "smush-control-h")
|
||||||
|
("trajectory-h.o" "trajectory-h")
|
||||||
|
("debug-h.o" "debug-h")
|
||||||
|
("joint-mod-h.o" "joint-mod-h")
|
||||||
|
("collide-func-h.o" "collide-func-h")
|
||||||
|
("collide-mesh-h.o" "collide-mesh-h")
|
||||||
|
("collide-shape-h.o" "collide-shape-h")
|
||||||
|
("collide-target-h.o" "collide-target-h")
|
||||||
|
("collide-touch-h.o" "collide-touch-h")
|
||||||
|
("collide-edge-grab-h.o" "collide-edge-grab-h")
|
||||||
|
("process-drawable-h.o" "process-drawable-h")
|
||||||
|
("effect-control-h.o" "effect-control-h")
|
||||||
|
("collide-frag-h.o" "collide-frag-h")
|
||||||
|
("projectiles-h.o" "projectiles-h")
|
||||||
|
("target-h.o" "target-h")
|
||||||
|
("depth-cue-h.o" "depth-cue-h")
|
||||||
|
("stats-h.o" "stats-h")
|
||||||
|
("bsp-h.o" "bsp-h")
|
||||||
|
("collide-cache-h.o" "collide-cache-h")
|
||||||
|
("collide-h.o" "collide-h")
|
||||||
|
("shrubbery-h.o" "shrubbery-h")
|
||||||
|
("tie-h.o" "tie-h")
|
||||||
|
("tfrag-h.o" "tfrag-h")
|
||||||
|
("background-h.o" "background-h")
|
||||||
|
("subdivide-h.o" "subdivide-h")
|
||||||
|
("entity-h.o" "entity-h")
|
||||||
|
("sprite-h.o" "sprite-h")
|
||||||
|
("shadow-h.o" "shadow-h")
|
||||||
|
("eye-h.o" "eye-h")
|
||||||
|
("sparticle-launcher-h.o" "sparticle-launcher-h")
|
||||||
|
("sparticle-h.o" "sparticle-h")
|
||||||
|
("actor-link-h.o" "actor-link-h")
|
||||||
|
("camera-h.o" "camera-h")
|
||||||
|
("cam-debug-h.o" "cam-debug-h")
|
||||||
|
("cam-interface-h.o" "cam-interface-h")
|
||||||
|
("cam-update-h.o" "cam-update-h")
|
||||||
|
("assert-h.o" "assert-h")
|
||||||
|
("hud-h.o" "hud-h")
|
||||||
|
("progress-h.o" "progress-h")
|
||||||
|
("rpc-h.o" "rpc-h")
|
||||||
|
("path-h.o" "path-h")
|
||||||
|
("navigate-h.o" "navigate-h")
|
||||||
|
("load-dgo.o" "load-dgo")
|
||||||
|
("ramdisk.o" "ramdisk")
|
||||||
|
("gsound.o" "gsound")
|
||||||
|
("transformq.o" "transformq")
|
||||||
|
("collide-func.o" "collide-func")
|
||||||
|
("joint.o" "joint")
|
||||||
|
("cylinder.o" "cylinder")
|
||||||
|
("wind.o" "wind")
|
||||||
|
("bsp.o" "bsp")
|
||||||
|
("subdivide.o" "subdivide")
|
||||||
|
("sprite.o" "sprite")
|
||||||
|
("sprite-distort.o" "sprite-distort")
|
||||||
|
("debug-sphere.o" "debug-sphere")
|
||||||
|
("debug.o" "debug")
|
||||||
|
("merc-vu1.o" "merc-vu1")
|
||||||
|
("merc-blend-shape.o" "merc-blend-shape")
|
||||||
|
("merc.o" "merc")
|
||||||
|
("ripple.o" "ripple")
|
||||||
|
("bones.o" "bones")
|
||||||
|
("generic-vu0.o" "generic-vu0")
|
||||||
|
("generic.o" "generic")
|
||||||
|
("generic-vu1.o" "generic-vu1")
|
||||||
|
("generic-effect.o" "generic-effect")
|
||||||
|
("generic-merc.o" "generic-merc")
|
||||||
|
("generic-tie.o" "generic-tie")
|
||||||
|
("shadow-cpu.o" "shadow-cpu")
|
||||||
|
("shadow-vu1.o" "shadow-vu1")
|
||||||
|
("depth-cue.o" "depth-cue")
|
||||||
|
("font.o" "font")
|
||||||
|
("decomp.o" "decomp")
|
||||||
|
("background.o" "background")
|
||||||
|
("draw-node.o" "draw-node")
|
||||||
|
("shrubbery.o" "shrubbery")
|
||||||
|
("shrub-work.o" "shrub-work")
|
||||||
|
("tfrag-near.o" "tfrag-near")
|
||||||
|
("tfrag.o" "tfrag")
|
||||||
|
("tfrag-methods.o" "tfrag-methods")
|
||||||
|
("tfrag-work.o" "tfrag-work")
|
||||||
|
("tie.o" "tie")
|
||||||
|
("tie-near.o" "tie-near")
|
||||||
|
("tie-work.o" "tie-work")
|
||||||
|
("tie-methods.o" "tie-methods")
|
||||||
|
("sync-info.o" "sync-info")
|
||||||
|
("trajectory.o" "trajectory")
|
||||||
|
("sparticle-launcher.o" "sparticle-launcher")
|
||||||
|
("sparticle.o" "sparticle")
|
||||||
|
("entity-table.o" "entity-table")
|
||||||
|
("loader.o" "loader")
|
||||||
|
("task-control-h.o" "task-control-h")
|
||||||
|
("game-info.o" "game-info")
|
||||||
|
("game-save.o" "game-save")
|
||||||
|
("settings.o" "settings")
|
||||||
|
("mood-tables.o" "mood-tables")
|
||||||
|
("mood.o" "mood")
|
||||||
|
("weather-part.o" "weather-part")
|
||||||
|
("time-of-day.o" "time-of-day")
|
||||||
|
("sky-utils.o" "sky-utils")
|
||||||
|
("sky.o" "sky")
|
||||||
|
("sky-tng.o" "sky-tng")
|
||||||
|
("load-boundary-h.o" "load-boundary-h")
|
||||||
|
("load-boundary.o" "load-boundary")
|
||||||
|
("load-boundary-data.o" "load-boundary-data")
|
||||||
|
("level-info.o" "level-info")
|
||||||
|
("level.o" "level")
|
||||||
|
("text.o" "text")
|
||||||
|
("collide-probe.o" "collide-probe")
|
||||||
|
("collide-frag.o" "collide-frag")
|
||||||
|
("collide-mesh.o" "collide-mesh")
|
||||||
|
("collide-touch.o" "collide-touch")
|
||||||
|
("collide-edge-grab.o" "collide-edge-grab")
|
||||||
|
("collide-shape.o" "collide-shape")
|
||||||
|
("collide-shape-rider.o" "collide-shape-rider")
|
||||||
|
("collide.o" "collide")
|
||||||
|
("collide-planes.o" "collide-planes")
|
||||||
|
("merc-death.o" "merc-death")
|
||||||
|
("water-h.o" "water-h")
|
||||||
|
("camera.o" "camera")
|
||||||
|
("cam-interface.o" "cam-interface")
|
||||||
|
("cam-master.o" "cam-master")
|
||||||
|
("cam-states.o" "cam-states")
|
||||||
|
("cam-states-dbg.o" "cam-states-dbg")
|
||||||
|
("cam-combiner.o" "cam-combiner")
|
||||||
|
("cam-update.o" "cam-update")
|
||||||
|
("vol-h.o" "vol-h")
|
||||||
|
("cam-layout.o" "cam-layout")
|
||||||
|
("cam-debug.o" "cam-debug")
|
||||||
|
("cam-start.o" "cam-start")
|
||||||
|
("process-drawable.o" "process-drawable")
|
||||||
|
("hint-control.o" "hint-control")
|
||||||
|
("ambient.o" "ambient")
|
||||||
|
("assert.o" "assert")
|
||||||
|
("generic-obs.o" "generic-obs")
|
||||||
|
("target-util.o" "target-util")
|
||||||
|
("target-part.o" "target-part")
|
||||||
|
("collide-reaction-target.o" "collide-reaction-target")
|
||||||
|
("logic-target.o" "logic-target")
|
||||||
|
("sidekick.o" "sidekick")
|
||||||
|
("voicebox.o" "voicebox")
|
||||||
|
("target-handler.o" "target-handler")
|
||||||
|
("target.o" "target")
|
||||||
|
("target2.o" "target2")
|
||||||
|
("target-death.o" "target-death")
|
||||||
|
("menu.o" "menu")
|
||||||
|
("drawable.o" "drawable")
|
||||||
|
("drawable-group.o" "drawable-group")
|
||||||
|
("drawable-inline-array.o" "drawable-inline-array")
|
||||||
|
("drawable-tree.o" "drawable-tree")
|
||||||
|
("prototype.o" "prototype")
|
||||||
|
("main-collide.o" "main-collide")
|
||||||
|
("video.o" "video")
|
||||||
|
("main.o" "main")
|
||||||
|
("collide-cache.o" "collide-cache")
|
||||||
|
("relocate.o" "relocate")
|
||||||
|
("memory-usage.o" "memory-usage")
|
||||||
|
("entity.o" "entity")
|
||||||
|
("path.o" "path")
|
||||||
|
("vol.o" "vol")
|
||||||
|
("navigate.o" "navigate")
|
||||||
|
("aligner.o" "aligner")
|
||||||
|
("effect-control.o" "effect-control")
|
||||||
|
("water.o" "water")
|
||||||
|
("collectables-part.o" "collectables-part")
|
||||||
|
("collectables.o" "collectables")
|
||||||
|
("task-control.o" "task-control")
|
||||||
|
("process-taskable.o" "process-taskable")
|
||||||
|
("pov-camera.o" "pov-camera")
|
||||||
|
("powerups.o" "powerups")
|
||||||
|
("crates.o" "crates")
|
||||||
|
("hud.o" "hud")
|
||||||
|
("hud-classes.o" "hud-classes")
|
||||||
|
("progress-static.o" "progress-static")
|
||||||
|
("progress-part.o" "progress-part")
|
||||||
|
("progress-draw.o" "progress-draw")
|
||||||
|
("progress.o" "progress")
|
||||||
|
("credits.o" "credits")
|
||||||
|
("projectiles.o" "projectiles")
|
||||||
|
("ocean.o" "ocean")
|
||||||
|
("ocean-vu0.o" "ocean-vu0")
|
||||||
|
("ocean-texture.o" "ocean-texture")
|
||||||
|
("ocean-mid.o" "ocean-mid")
|
||||||
|
("ocean-transition.o" "ocean-transition")
|
||||||
|
("ocean-near.o" "ocean-near")
|
||||||
|
("shadow.o" "shadow")
|
||||||
|
("eye.o" "eye")
|
||||||
|
("glist-h.o" "glist-h")
|
||||||
|
("glist.o" "glist")
|
||||||
|
("anim-tester.o" "anim-tester")
|
||||||
|
("viewer.o" "viewer")
|
||||||
|
("part-tester.o" "part-tester")
|
||||||
|
("default-menu.o" "default-menu")
|
||||||
|
)
|
330
goal_src/dgos/game.gd
Normal file
330
goal_src/dgos/game.gd
Normal file
|
@ -0,0 +1,330 @@
|
||||||
|
("GAME.CGO"
|
||||||
|
("types-h.o" "types-h")
|
||||||
|
("vu1-macros.o" "vu1-macros")
|
||||||
|
("math.o" "math")
|
||||||
|
("vector-h.o" "vector-h")
|
||||||
|
("gravity-h.o" "gravity-h")
|
||||||
|
("bounding-box-h.o" "bounding-box-h")
|
||||||
|
("matrix-h.o" "matrix-h")
|
||||||
|
("quaternion-h.o" "quaternion-h")
|
||||||
|
("euler-h.o" "euler-h")
|
||||||
|
("transform-h.o" "transform-h")
|
||||||
|
("geometry-h.o" "geometry-h")
|
||||||
|
("trigonometry-h.o" "trigonometry-h")
|
||||||
|
("transformq-h.o" "transformq-h")
|
||||||
|
("bounding-box.o" "bounding-box")
|
||||||
|
("matrix.o" "matrix")
|
||||||
|
("transform.o" "transform")
|
||||||
|
("quaternion.o" "quaternion")
|
||||||
|
("euler.o" "euler")
|
||||||
|
("geometry.o" "geometry")
|
||||||
|
("trigonometry.o" "trigonometry")
|
||||||
|
("gsound-h.o" "gsound-h")
|
||||||
|
("timer-h.o" "timer-h")
|
||||||
|
("timer.o" "timer")
|
||||||
|
("vif-h.o" "vif-h")
|
||||||
|
("dma-h.o" "dma-h")
|
||||||
|
("video-h.o" "video-h")
|
||||||
|
("vu1-user-h.o" "vu1-user-h")
|
||||||
|
("dma.o" "dma")
|
||||||
|
("dma-buffer.o" "dma-buffer")
|
||||||
|
("dma-bucket.o" "dma-bucket")
|
||||||
|
("dma-disasm.o" "dma-disasm")
|
||||||
|
("pad.o" "pad")
|
||||||
|
("gs.o" "gs")
|
||||||
|
("display-h.o" "display-h")
|
||||||
|
("vector.o" "vector")
|
||||||
|
("file-io.o" "file-io")
|
||||||
|
("loader-h.o" "loader-h")
|
||||||
|
("texture-h.o" "texture-h")
|
||||||
|
("level-h.o" "level-h")
|
||||||
|
("math-camera-h.o" "math-camera-h")
|
||||||
|
("math-camera.o" "math-camera")
|
||||||
|
("font-h.o" "font-h")
|
||||||
|
("decomp-h.o" "decomp-h")
|
||||||
|
("display.o" "display")
|
||||||
|
("connect.o" "connect")
|
||||||
|
("text-h.o" "text-h")
|
||||||
|
("settings-h.o" "settings-h")
|
||||||
|
("capture.o" "capture")
|
||||||
|
("memory-usage-h.o" "memory-usage-h")
|
||||||
|
("texture.o" "texture")
|
||||||
|
("main-h.o" "main-h")
|
||||||
|
("mspace-h.o" "mspace-h")
|
||||||
|
("drawable-h.o" "drawable-h")
|
||||||
|
("drawable-group-h.o" "drawable-group-h")
|
||||||
|
("drawable-inline-array-h.o" "drawable-inline-array-h")
|
||||||
|
("draw-node-h.o" "draw-node-h")
|
||||||
|
("drawable-tree-h.o" "drawable-tree-h")
|
||||||
|
("drawable-actor-h.o" "drawable-actor-h")
|
||||||
|
("drawable-ambient-h.o" "drawable-ambient-h")
|
||||||
|
("game-task-h.o" "game-task-h")
|
||||||
|
("hint-control-h.o" "hint-control-h")
|
||||||
|
("generic-h.o" "generic-h")
|
||||||
|
("lights-h.o" "lights-h")
|
||||||
|
("ocean-h.o" "ocean-h")
|
||||||
|
("ocean-trans-tables.o" "ocean-trans-tables")
|
||||||
|
("ocean-tables.o" "ocean-tables")
|
||||||
|
("ocean-frames.o" "ocean-frames")
|
||||||
|
("sky-h.o" "sky-h")
|
||||||
|
("mood-h.o" "mood-h")
|
||||||
|
("time-of-day-h.o" "time-of-day-h")
|
||||||
|
("art-h.o" "art-h")
|
||||||
|
("generic-vu1-h.o" "generic-vu1-h")
|
||||||
|
("merc-h.o" "merc-h")
|
||||||
|
("generic-merc-h.o" "generic-merc-h")
|
||||||
|
("generic-tie-h.o" "generic-tie-h")
|
||||||
|
("generic-work-h.o" "generic-work-h")
|
||||||
|
("shadow-cpu-h.o" "shadow-cpu-h")
|
||||||
|
("shadow-vu1-h.o" "shadow-vu1-h")
|
||||||
|
("memcard-h.o" "memcard-h")
|
||||||
|
("game-info-h.o" "game-info-h")
|
||||||
|
("wind-h.o" "wind-h")
|
||||||
|
("prototype-h.o" "prototype-h")
|
||||||
|
("joint-h.o" "joint-h")
|
||||||
|
("bones-h.o" "bones-h")
|
||||||
|
("engines.o" "engines")
|
||||||
|
("res-h.o" "res-h")
|
||||||
|
("res.o" "res")
|
||||||
|
("lights.o" "lights")
|
||||||
|
("dynamics-h.o" "dynamics-h")
|
||||||
|
("surface-h.o" "surface-h")
|
||||||
|
("pat-h.o" "pat-h")
|
||||||
|
("fact-h.o" "fact-h")
|
||||||
|
("aligner-h.o" "aligner-h")
|
||||||
|
("game-h.o" "game-h")
|
||||||
|
("generic-obs-h.o" "generic-obs-h")
|
||||||
|
("pov-camera-h.o" "pov-camera-h")
|
||||||
|
("sync-info-h.o" "sync-info-h")
|
||||||
|
("smush-control-h.o" "smush-control-h")
|
||||||
|
("trajectory-h.o" "trajectory-h")
|
||||||
|
("debug-h.o" "debug-h")
|
||||||
|
("joint-mod-h.o" "joint-mod-h")
|
||||||
|
("collide-func-h.o" "collide-func-h")
|
||||||
|
("collide-mesh-h.o" "collide-mesh-h")
|
||||||
|
("collide-shape-h.o" "collide-shape-h")
|
||||||
|
("collide-target-h.o" "collide-target-h")
|
||||||
|
("collide-touch-h.o" "collide-touch-h")
|
||||||
|
("collide-edge-grab-h.o" "collide-edge-grab-h")
|
||||||
|
("process-drawable-h.o" "process-drawable-h")
|
||||||
|
("effect-control-h.o" "effect-control-h")
|
||||||
|
("collide-frag-h.o" "collide-frag-h")
|
||||||
|
("projectiles-h.o" "projectiles-h")
|
||||||
|
("target-h.o" "target-h")
|
||||||
|
("depth-cue-h.o" "depth-cue-h")
|
||||||
|
("stats-h.o" "stats-h")
|
||||||
|
("bsp-h.o" "bsp-h")
|
||||||
|
("collide-cache-h.o" "collide-cache-h")
|
||||||
|
("collide-h.o" "collide-h")
|
||||||
|
("shrubbery-h.o" "shrubbery-h")
|
||||||
|
("tie-h.o" "tie-h")
|
||||||
|
("tfrag-h.o" "tfrag-h")
|
||||||
|
("background-h.o" "background-h")
|
||||||
|
("subdivide-h.o" "subdivide-h")
|
||||||
|
("entity-h.o" "entity-h")
|
||||||
|
("sprite-h.o" "sprite-h")
|
||||||
|
("shadow-h.o" "shadow-h")
|
||||||
|
("eye-h.o" "eye-h")
|
||||||
|
("sparticle-launcher-h.o" "sparticle-launcher-h")
|
||||||
|
("sparticle-h.o" "sparticle-h")
|
||||||
|
("actor-link-h.o" "actor-link-h")
|
||||||
|
("camera-h.o" "camera-h")
|
||||||
|
("cam-debug-h.o" "cam-debug-h")
|
||||||
|
("cam-interface-h.o" "cam-interface-h")
|
||||||
|
("cam-update-h.o" "cam-update-h")
|
||||||
|
("assert-h.o" "assert-h")
|
||||||
|
("hud-h.o" "hud-h")
|
||||||
|
("progress-h.o" "progress-h")
|
||||||
|
("rpc-h.o" "rpc-h")
|
||||||
|
("path-h.o" "path-h")
|
||||||
|
("navigate-h.o" "navigate-h")
|
||||||
|
("load-dgo.o" "load-dgo")
|
||||||
|
("ramdisk.o" "ramdisk")
|
||||||
|
("gsound.o" "gsound")
|
||||||
|
("transformq.o" "transformq")
|
||||||
|
("collide-func.o" "collide-func")
|
||||||
|
("joint.o" "joint")
|
||||||
|
("cylinder.o" "cylinder")
|
||||||
|
("wind.o" "wind")
|
||||||
|
("bsp.o" "bsp")
|
||||||
|
("subdivide.o" "subdivide")
|
||||||
|
("sprite.o" "sprite")
|
||||||
|
("sprite-distort.o" "sprite-distort")
|
||||||
|
("debug-sphere.o" "debug-sphere")
|
||||||
|
("debug.o" "debug")
|
||||||
|
("merc-vu1.o" "merc-vu1")
|
||||||
|
("merc-blend-shape.o" "merc-blend-shape")
|
||||||
|
("merc.o" "merc")
|
||||||
|
("ripple.o" "ripple")
|
||||||
|
("bones.o" "bones")
|
||||||
|
("generic-vu0.o" "generic-vu0")
|
||||||
|
("generic.o" "generic")
|
||||||
|
("generic-vu1.o" "generic-vu1")
|
||||||
|
("generic-effect.o" "generic-effect")
|
||||||
|
("generic-merc.o" "generic-merc")
|
||||||
|
("generic-tie.o" "generic-tie")
|
||||||
|
("shadow-cpu.o" "shadow-cpu")
|
||||||
|
("shadow-vu1.o" "shadow-vu1")
|
||||||
|
("depth-cue.o" "depth-cue")
|
||||||
|
("font.o" "font")
|
||||||
|
("decomp.o" "decomp")
|
||||||
|
("background.o" "background")
|
||||||
|
("draw-node.o" "draw-node")
|
||||||
|
("shrubbery.o" "shrubbery")
|
||||||
|
("shrub-work.o" "shrub-work")
|
||||||
|
("tfrag-near.o" "tfrag-near")
|
||||||
|
("tfrag.o" "tfrag")
|
||||||
|
("tfrag-methods.o" "tfrag-methods")
|
||||||
|
("tfrag-work.o" "tfrag-work")
|
||||||
|
("tie.o" "tie")
|
||||||
|
("tie-near.o" "tie-near")
|
||||||
|
("tie-work.o" "tie-work")
|
||||||
|
("tie-methods.o" "tie-methods")
|
||||||
|
("sync-info.o" "sync-info")
|
||||||
|
("trajectory.o" "trajectory")
|
||||||
|
("sparticle-launcher.o" "sparticle-launcher")
|
||||||
|
("sparticle.o" "sparticle")
|
||||||
|
("entity-table.o" "entity-table")
|
||||||
|
("loader.o" "loader")
|
||||||
|
("task-control-h.o" "task-control-h")
|
||||||
|
("game-info.o" "game-info")
|
||||||
|
("game-save.o" "game-save")
|
||||||
|
("settings.o" "settings")
|
||||||
|
("mood-tables.o" "mood-tables")
|
||||||
|
("mood.o" "mood")
|
||||||
|
("weather-part.o" "weather-part")
|
||||||
|
("time-of-day.o" "time-of-day")
|
||||||
|
("sky-utils.o" "sky-utils")
|
||||||
|
("sky.o" "sky")
|
||||||
|
("sky-tng.o" "sky-tng")
|
||||||
|
("load-boundary-h.o" "load-boundary-h")
|
||||||
|
("load-boundary.o" "load-boundary")
|
||||||
|
("load-boundary-data.o" "load-boundary-data")
|
||||||
|
("level-info.o" "level-info")
|
||||||
|
("level.o" "level")
|
||||||
|
("text.o" "text")
|
||||||
|
("collide-probe.o" "collide-probe")
|
||||||
|
("collide-frag.o" "collide-frag")
|
||||||
|
("collide-mesh.o" "collide-mesh")
|
||||||
|
("collide-touch.o" "collide-touch")
|
||||||
|
("collide-edge-grab.o" "collide-edge-grab")
|
||||||
|
("collide-shape.o" "collide-shape")
|
||||||
|
("collide-shape-rider.o" "collide-shape-rider")
|
||||||
|
("collide.o" "collide")
|
||||||
|
("collide-planes.o" "collide-planes")
|
||||||
|
("merc-death.o" "merc-death")
|
||||||
|
("water-h.o" "water-h")
|
||||||
|
("camera.o" "camera")
|
||||||
|
("cam-interface.o" "cam-interface")
|
||||||
|
("cam-master.o" "cam-master")
|
||||||
|
("cam-states.o" "cam-states")
|
||||||
|
("cam-states-dbg.o" "cam-states-dbg")
|
||||||
|
("cam-combiner.o" "cam-combiner")
|
||||||
|
("cam-update.o" "cam-update")
|
||||||
|
("vol-h.o" "vol-h")
|
||||||
|
("cam-layout.o" "cam-layout")
|
||||||
|
("cam-debug.o" "cam-debug")
|
||||||
|
("cam-start.o" "cam-start")
|
||||||
|
("process-drawable.o" "process-drawable")
|
||||||
|
("hint-control.o" "hint-control")
|
||||||
|
("ambient.o" "ambient")
|
||||||
|
("assert.o" "assert")
|
||||||
|
("generic-obs.o" "generic-obs")
|
||||||
|
("target-util.o" "target-util")
|
||||||
|
("target-part.o" "target-part")
|
||||||
|
("collide-reaction-target.o" "collide-reaction-target")
|
||||||
|
("logic-target.o" "logic-target")
|
||||||
|
("sidekick.o" "sidekick")
|
||||||
|
("voicebox.o" "voicebox")
|
||||||
|
("target-handler.o" "target-handler")
|
||||||
|
("target.o" "target")
|
||||||
|
("target2.o" "target2")
|
||||||
|
("target-death.o" "target-death")
|
||||||
|
("menu.o" "menu")
|
||||||
|
("drawable.o" "drawable")
|
||||||
|
("drawable-group.o" "drawable-group")
|
||||||
|
("drawable-inline-array.o" "drawable-inline-array")
|
||||||
|
("drawable-tree.o" "drawable-tree")
|
||||||
|
("prototype.o" "prototype")
|
||||||
|
("main-collide.o" "main-collide")
|
||||||
|
("video.o" "video")
|
||||||
|
("main.o" "main")
|
||||||
|
("collide-cache.o" "collide-cache")
|
||||||
|
("relocate.o" "relocate")
|
||||||
|
("memory-usage.o" "memory-usage")
|
||||||
|
("entity.o" "entity")
|
||||||
|
("path.o" "path")
|
||||||
|
("vol.o" "vol")
|
||||||
|
("navigate.o" "navigate")
|
||||||
|
("aligner.o" "aligner")
|
||||||
|
("effect-control.o" "effect-control")
|
||||||
|
("water.o" "water")
|
||||||
|
("collectables-part.o" "collectables-part")
|
||||||
|
("collectables.o" "collectables")
|
||||||
|
("task-control.o" "task-control")
|
||||||
|
("process-taskable.o" "process-taskable")
|
||||||
|
("pov-camera.o" "pov-camera")
|
||||||
|
("powerups.o" "powerups")
|
||||||
|
("crates.o" "crates")
|
||||||
|
("hud.o" "hud")
|
||||||
|
("hud-classes.o" "hud-classes")
|
||||||
|
("progress-static.o" "progress-static")
|
||||||
|
("progress-part.o" "progress-part")
|
||||||
|
("progress-draw.o" "progress-draw")
|
||||||
|
("progress.o" "progress")
|
||||||
|
("credits.o" "credits")
|
||||||
|
("projectiles.o" "projectiles")
|
||||||
|
("ocean.o" "ocean")
|
||||||
|
("ocean-vu0.o" "ocean-vu0")
|
||||||
|
("ocean-texture.o" "ocean-texture")
|
||||||
|
("ocean-mid.o" "ocean-mid")
|
||||||
|
("ocean-transition.o" "ocean-transition")
|
||||||
|
("ocean-near.o" "ocean-near")
|
||||||
|
("shadow.o" "shadow")
|
||||||
|
("eye.o" "eye")
|
||||||
|
("glist-h.o" "glist-h")
|
||||||
|
("glist.o" "glist")
|
||||||
|
("anim-tester.o" "anim-tester")
|
||||||
|
("viewer.o" "viewer")
|
||||||
|
("part-tester.o" "part-tester")
|
||||||
|
("default-menu.o" "default-menu")
|
||||||
|
("dir-tpages.go" "dir-tpages")
|
||||||
|
("tpage-463.go" "tpage-463")
|
||||||
|
("tpage-2.go" "tpage-2")
|
||||||
|
("tpage-880.go" "tpage-880")
|
||||||
|
("tpage-256.go" "tpage-256")
|
||||||
|
("tpage-1278.go" "tpage-1278")
|
||||||
|
("texture-upload.o" "texture-upload")
|
||||||
|
("tpage-1032.go" "tpage-1032")
|
||||||
|
("tpage-62.go" "tpage-62")
|
||||||
|
("tpage-1532.go" "tpage-1532")
|
||||||
|
("fuel-cell-ag.go" "fuel-cell")
|
||||||
|
("money-ag.go" "money")
|
||||||
|
("buzzer-ag.go" "buzzer")
|
||||||
|
("ecovalve-ag-ART-GAME.go" "ecovalve")
|
||||||
|
("crate-ag.go" "crate")
|
||||||
|
("speaker-ag.go" "speaker")
|
||||||
|
("fuelcell-naked-ag.go" "fuelcell-naked")
|
||||||
|
("eichar-ag.go" "eichar")
|
||||||
|
("sidekick-ag.go" "sidekick")
|
||||||
|
("deathcam-ag.go" "deathcam")
|
||||||
|
("game-cnt.go" "game-cnt")
|
||||||
|
("rigid-body-h.o" "rigid-body-h")
|
||||||
|
("water-anim.o" "water-anim")
|
||||||
|
("dark-eco-pool.o" "dark-eco-pool")
|
||||||
|
("rigid-body.o" "rigid-body")
|
||||||
|
("nav-enemy-h.o" "nav-enemy-h")
|
||||||
|
("nav-enemy.o" "nav-enemy")
|
||||||
|
("baseplat.o" "baseplat")
|
||||||
|
("basebutton.o" "basebutton")
|
||||||
|
("tippy.o" "tippy")
|
||||||
|
("joint-exploder.o" "joint-exploder")
|
||||||
|
("babak.o" "babak")
|
||||||
|
("sharkey.o" "sharkey")
|
||||||
|
("orb-cache.o" "orb-cache")
|
||||||
|
("plat.o" "plat")
|
||||||
|
("plat-button.o" "plat-button")
|
||||||
|
("plat-eco.o" "plat-eco")
|
||||||
|
("ropebridge.o" "ropebridge")
|
||||||
|
("ticky.o" "ticky")
|
||||||
|
)
|
10
goal_src/dgos/kernel.gd
Normal file
10
goal_src/dgos/kernel.gd
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
("KERNEL.CGO"
|
||||||
|
("gcommon.o" "gcommon")
|
||||||
|
("gstring-h.o" "gstring-h")
|
||||||
|
("gkernel-h.o" "gkernel-h")
|
||||||
|
("gkernel.o" "gkernel")
|
||||||
|
("pskernel.o" "pskernel")
|
||||||
|
("gstring.o" "gstring")
|
||||||
|
("dgo-h.o" "dgo-h")
|
||||||
|
("gstate.o" "gstate")
|
||||||
|
)
|
57
goal_src/dgos/vi1.gd
Normal file
57
goal_src/dgos/vi1.gd
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
("VI1.DGO"
|
||||||
|
("villagep-obs.o" "villagep-obs")
|
||||||
|
("oracle.o" "oracle")
|
||||||
|
("farmer.o" "farmer")
|
||||||
|
("explorer.o" "explorer")
|
||||||
|
("assistant.o" "assistant")
|
||||||
|
("sage.o" "sage")
|
||||||
|
("yakow.o" "yakow")
|
||||||
|
("village-obs-VI1.o" "village-obs")
|
||||||
|
("fishermans-boat.o" "fishermans-boat")
|
||||||
|
("village1-part.o" "village1-part")
|
||||||
|
("village1-part2.o" "village1-part2")
|
||||||
|
("sequence-a-village1.o" "sequence-a-village1")
|
||||||
|
("tpage-398.go" "tpage-398")
|
||||||
|
("tpage-400.go" "tpage-400")
|
||||||
|
("tpage-399.go" "tpage-399")
|
||||||
|
("tpage-401.go" "tpage-401")
|
||||||
|
("tpage-1470.go" "tpage-1470")
|
||||||
|
("assistant-ag.go" "assistant")
|
||||||
|
("evilplant-ag.go" "evilplant")
|
||||||
|
("explorer-ag.go" "explorer")
|
||||||
|
("farmer-ag.go" "farmer")
|
||||||
|
("fishermans-boat-ag.go" "fishermans-boat")
|
||||||
|
("hutlamp-ag.go" "hutlamp")
|
||||||
|
("mayorgears-ag.go" "mayorgears")
|
||||||
|
("medres-beach-ag.go" "medres-beach")
|
||||||
|
("medres-beach1-ag.go" "medres-beach1")
|
||||||
|
("medres-beach2-ag.go" "medres-beach2")
|
||||||
|
("medres-beach3-ag.go" "medres-beach3")
|
||||||
|
("medres-jungle-ag.go" "medres-jungle")
|
||||||
|
("medres-jungle1-ag.go" "medres-jungle1")
|
||||||
|
("medres-jungle2-ag.go" "medres-jungle2")
|
||||||
|
("medres-misty-ag.go" "medres-misty")
|
||||||
|
("medres-training-ag.go" "medres-training")
|
||||||
|
("medres-village11-ag.go" "medres-village11")
|
||||||
|
("medres-village12-ag.go" "medres-village12")
|
||||||
|
("medres-village13-ag.go" "medres-village13")
|
||||||
|
("oracle-ag-VI1.go" "oracle")
|
||||||
|
("orb-cache-top-ag-VI1.go" "orb-cache-top")
|
||||||
|
("reflector-middle-ag.go" "reflector-middle")
|
||||||
|
("revcycle-ag.go" "revcycle")
|
||||||
|
("revcycleprop-ag.go" "revcycleprop")
|
||||||
|
("ropebridge-32-ag.go" "ropebridge-32")
|
||||||
|
("sage-ag.go" "sage")
|
||||||
|
("sagesail-ag.go" "sagesail")
|
||||||
|
("sharkey-ag-VI1.go" "sharkey")
|
||||||
|
("villa-starfish-ag.go" "villa-starfish")
|
||||||
|
("village-cam-ag-VI1.go" "village-cam")
|
||||||
|
("village1cam-ag.go" "village1cam")
|
||||||
|
("warp-gate-switch-ag-VI1-VI3.go" "warp-gate-switch")
|
||||||
|
("warpgate-ag.go" "warpgate")
|
||||||
|
("water-anim-village1-ag.go" "water-anim-village1")
|
||||||
|
("windmill-sail-ag.go" "windmill-sail")
|
||||||
|
("windspinner-ag.go" "windspinner")
|
||||||
|
("yakow-ag.go" "yakow")
|
||||||
|
("village1-vis.go" "village1-vis")
|
||||||
|
)
|
|
@ -189,6 +189,8 @@
|
||||||
(s3-1 s2-1 (-> *temp-string* data) load-status heap 0)
|
(s3-1 s2-1 (-> *temp-string* data) load-status heap 0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
(format 0 "loaded text ~A~%" *common-text*)
|
||||||
|
(format 0 "~A~%" (lookup-text! *common-text* (game-text-id continue-without-saving) #f))
|
||||||
)
|
)
|
||||||
(if (<= (the-as int (-> curr-text value)) 0)
|
(if (<= (the-as int (-> curr-text value)) 0)
|
||||||
(set! (-> curr-text value) (the-as object #f))
|
(set! (-> curr-text value) (the-as object #f))
|
||||||
|
@ -196,6 +198,7 @@
|
||||||
)
|
)
|
||||||
(set! v0-2 0)
|
(set! v0-2 0)
|
||||||
(label cfg-27)
|
(label cfg-27)
|
||||||
|
|
||||||
v0-2
|
v0-2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
626
goal_src/game.gp
Normal file
626
goal_src/game.gp
Normal file
|
@ -0,0 +1,626 @@
|
||||||
|
;;-*-Lisp-*-
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Jak 1 Project File
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; This file sets up the OpenGOAL build system for Jak 1.
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Build system macros
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; use defmacro to define goos macros.
|
||||||
|
(define defmacro defsmacro)
|
||||||
|
(define defun desfun)
|
||||||
|
|
||||||
|
(defun gc-file->o-file (filename)
|
||||||
|
"Get the name of the object file for the given GOAL (*.gc) source file."
|
||||||
|
(string-append "out/obj/" (stem filename) ".o")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro goal-src (src-file &rest deps)
|
||||||
|
"Add a GOAL source file with the given dependencies"
|
||||||
|
`(defstep :in ,(string-append "goal_src/" src-file)
|
||||||
|
;; use goal compiler
|
||||||
|
:tool 'goalc
|
||||||
|
;; will output the obj file
|
||||||
|
:out '(,(gc-file->o-file src-file))
|
||||||
|
;; dependencies are the obj files
|
||||||
|
:dep '(,@(apply gc-file->o-file deps))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defun make-src-sequence-elt (current previous prefix)
|
||||||
|
"Helper for goal-src-sequence"
|
||||||
|
`(defstep :in ,(string-append "goal_src/" prefix current)
|
||||||
|
:tool 'goalc
|
||||||
|
:out '(,(gc-file->o-file current))
|
||||||
|
:dep '(#|"iso/KERNEL.CGO"|#
|
||||||
|
,(gc-file->o-file previous))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro goal-src-sequence (prefix &key (deps '()) &rest sequence)
|
||||||
|
"Add a sequence of GOAL files (each depending on the previous) in the given directory,
|
||||||
|
with all depending on the given deps."
|
||||||
|
(let* ((first-thing `(goal-src ,(string-append prefix (first sequence)) ,@deps))
|
||||||
|
(result (cons first-thing '()))
|
||||||
|
(iter result))
|
||||||
|
|
||||||
|
(let ((prev (first sequence))
|
||||||
|
(in-iter (rest sequence)))
|
||||||
|
|
||||||
|
(while (not (null? in-iter))
|
||||||
|
;; (fmt #t "{} dep on {}\n" (first in-iter) prev)
|
||||||
|
(let ((next (make-src-sequence-elt (first in-iter) prev prefix)))
|
||||||
|
(set-cdr! iter (cons next '()))
|
||||||
|
(set! iter (cdr iter))
|
||||||
|
)
|
||||||
|
|
||||||
|
(set! prev (car in-iter))
|
||||||
|
(set! in-iter (cdr in-iter))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
`(begin ,@result)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro cgo (output-name desc-file-name &rest objs)
|
||||||
|
"Add a CGO with the given output name (in out/iso) and input name (in goal_src/dgos)"
|
||||||
|
`(defstep :in ,(string-append "goal_src/dgos/" desc-file-name)
|
||||||
|
:tool 'dgo
|
||||||
|
:out '(,(string-append "out/iso/" output-name))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defun tpage-name (id)
|
||||||
|
(fmt #f "tpage-{}.go" id)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro copy-texture (tpage-id)
|
||||||
|
`(defstep :in ,(string-append "decompiler_out/raw_obj/" (tpage-name tpage-id))
|
||||||
|
:tool 'copy
|
||||||
|
:out '(,(string-append "out/obj/" (tpage-name tpage-id)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro copy-textures (&rest ids)
|
||||||
|
`(begin
|
||||||
|
,@(apply (lambda (x) `(copy-texture ,x)) ids)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro copy-go (name)
|
||||||
|
`(defstep :in ,(string-append "decompiler_out/raw_obj/" name ".go")
|
||||||
|
:tool 'copy
|
||||||
|
:out '(,(string-append "out/obj/" name ".go"))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro copy-gos (&rest gos)
|
||||||
|
`(begin
|
||||||
|
,@(apply (lambda (x) `(copy-go ,x)) gos)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro group (name &rest stuff)
|
||||||
|
`(defstep :in ""
|
||||||
|
:tool 'group
|
||||||
|
:out '(,(string-append "GROUP:" name))
|
||||||
|
:dep '(,@stuff))
|
||||||
|
)
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; CGO's
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
(cgo "KERNEL.CGO" "kernel.gd")
|
||||||
|
(cgo "ENGINE.CGO" "engine.gd")
|
||||||
|
(cgo "GAME.CGO" "game.gd")
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
;; GOAL Kernel
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; These are set up with proper dependencies
|
||||||
|
|
||||||
|
(goal-src "kernel/gcommon.gc")
|
||||||
|
(goal-src "kernel/gstring-h.gc")
|
||||||
|
(goal-src "kernel/gkernel-h.gc"
|
||||||
|
"gcommon"
|
||||||
|
"gstring-h")
|
||||||
|
(goal-src "kernel/gkernel.gc"
|
||||||
|
"gkernel-h")
|
||||||
|
(goal-src "kernel/pskernel.gc"
|
||||||
|
"gcommon"
|
||||||
|
"gkernel-h")
|
||||||
|
(goal-src "kernel/gstring.gc"
|
||||||
|
"gcommon"
|
||||||
|
"gstring-h")
|
||||||
|
(goal-src "kernel/dgo-h.gc")
|
||||||
|
(goal-src "kernel/gstate.gc"
|
||||||
|
"gkernel")
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Weird special things
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; The tpage directory
|
||||||
|
(defstep :in "assets/tpage-dir.txt"
|
||||||
|
:tool 'tpage-dir
|
||||||
|
:out '("out/obj/dir-tpages.go")
|
||||||
|
)
|
||||||
|
|
||||||
|
;; the count file.
|
||||||
|
(defstep :in "assets/game_count.txt"
|
||||||
|
:tool 'game-cnt
|
||||||
|
:out '("out/obj/game-cnt.go")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Textures (Common)
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(copy-textures 463 2 880 256 1278 1032 62 1532)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Art (Common)
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(copy-gos
|
||||||
|
"fuel-cell-ag"
|
||||||
|
"money-ag"
|
||||||
|
"buzzer-ag"
|
||||||
|
"ecovalve-ag-ART-GAME"
|
||||||
|
"crate-ag"
|
||||||
|
"speaker-ag"
|
||||||
|
"fuelcell-naked-ag"
|
||||||
|
"eichar-ag"
|
||||||
|
"sidekick-ag"
|
||||||
|
"deathcam-ag"
|
||||||
|
)
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Text
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defstep :in "assets/game_text.txt"
|
||||||
|
:tool 'text
|
||||||
|
:out '("out/iso/0COMMON.TXT"
|
||||||
|
"out/iso/1COMMON.TXT"
|
||||||
|
"out/iso/2COMMON.TXT"
|
||||||
|
"out/iso/3COMMON.TXT"
|
||||||
|
"out/iso/4COMMON.TXT"
|
||||||
|
"out/iso/5COMMON.TXT"
|
||||||
|
"out/iso/6COMMON.TXT")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ISO Group
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; the iso group is a group of files required to boot.
|
||||||
|
|
||||||
|
(group "iso"
|
||||||
|
"out/iso/0COMMON.TXT"
|
||||||
|
"out/iso/KERNEL.CGO"
|
||||||
|
"out/iso/GAME.CGO"
|
||||||
|
"out/iso/VI1.DGO"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Village 1
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; the definition for the DGO file.
|
||||||
|
(cgo "VI1.DGO"
|
||||||
|
"vi1.gd"
|
||||||
|
)
|
||||||
|
|
||||||
|
;; the code
|
||||||
|
(goal-src-sequence
|
||||||
|
"levels/"
|
||||||
|
:deps ;; no idea what these depend on, make it depend on the whole engine
|
||||||
|
("out/obj/default-menu.o")
|
||||||
|
|
||||||
|
"village_common/villagep-obs.gc"
|
||||||
|
"village_common/oracle.gc"
|
||||||
|
"village1/farmer.gc"
|
||||||
|
"village1/explorer.gc"
|
||||||
|
"village1/assistant.gc"
|
||||||
|
"village1/sage.gc"
|
||||||
|
"village1/yakow.gc"
|
||||||
|
"village1/village-obs-VI1.gc"
|
||||||
|
"village1/fishermans-boat.gc"
|
||||||
|
"village1/village1-part.gc"
|
||||||
|
"village1/village1-part2.gc"
|
||||||
|
"village1/sequence-a-village1.gc"
|
||||||
|
)
|
||||||
|
|
||||||
|
;; the textures
|
||||||
|
(copy-textures 398 400 399 401 1470)
|
||||||
|
|
||||||
|
;; the art
|
||||||
|
(copy-gos
|
||||||
|
"assistant-ag"
|
||||||
|
"evilplant-ag"
|
||||||
|
"explorer-ag"
|
||||||
|
"farmer-ag"
|
||||||
|
"fishermans-boat-ag"
|
||||||
|
"hutlamp-ag"
|
||||||
|
"mayorgears-ag"
|
||||||
|
"medres-beach-ag"
|
||||||
|
"medres-beach1-ag"
|
||||||
|
"medres-beach2-ag"
|
||||||
|
"medres-beach3-ag"
|
||||||
|
"medres-jungle-ag"
|
||||||
|
"medres-jungle1-ag"
|
||||||
|
"medres-jungle2-ag"
|
||||||
|
"medres-misty-ag"
|
||||||
|
"medres-training-ag"
|
||||||
|
"medres-village11-ag"
|
||||||
|
"medres-village12-ag"
|
||||||
|
"medres-village13-ag"
|
||||||
|
"oracle-ag-VI1"
|
||||||
|
"orb-cache-top-ag-VI1"
|
||||||
|
"reflector-middle-ag"
|
||||||
|
"revcycle-ag"
|
||||||
|
"revcycleprop-ag"
|
||||||
|
"ropebridge-32-ag"
|
||||||
|
"sage-ag"
|
||||||
|
"sagesail-ag"
|
||||||
|
"sharkey-ag-VI1"
|
||||||
|
"villa-starfish-ag"
|
||||||
|
"village-cam-ag-VI1"
|
||||||
|
"village1cam-ag"
|
||||||
|
"warp-gate-switch-ag-VI1-VI3"
|
||||||
|
"warpgate-ag"
|
||||||
|
"water-anim-village1-ag"
|
||||||
|
"windmill-sail-ag"
|
||||||
|
"windspinner-ag"
|
||||||
|
"yakow-ag"
|
||||||
|
"village1-vis"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Game Engine Code
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; We don't know the actual dependencies, but the build
|
||||||
|
;; order is a possibly ordering, and the goal-src-sequence
|
||||||
|
;; will force these to always build in this order.
|
||||||
|
|
||||||
|
(goal-src-sequence
|
||||||
|
;; prefix
|
||||||
|
"engine/"
|
||||||
|
|
||||||
|
:deps
|
||||||
|
("out/obj/gcommon.o"
|
||||||
|
"out/obj/gstate.o"
|
||||||
|
"out/obj/gstring.o"
|
||||||
|
"out/obj/gkernel.o"
|
||||||
|
)
|
||||||
|
|
||||||
|
;; sources
|
||||||
|
"util/types-h.gc"
|
||||||
|
"ps2/vu1-macros.gc"
|
||||||
|
"math/math.gc"
|
||||||
|
"math/vector-h.gc"
|
||||||
|
"physics/gravity-h.gc"
|
||||||
|
"geometry/bounding-box-h.gc"
|
||||||
|
"math/matrix-h.gc"
|
||||||
|
"math/quaternion-h.gc"
|
||||||
|
"math/euler-h.gc"
|
||||||
|
"math/transform-h.gc"
|
||||||
|
"geometry/geometry-h.gc"
|
||||||
|
"math/trigonometry-h.gc"
|
||||||
|
"math/transformq-h.gc"
|
||||||
|
"geometry/bounding-box.gc"
|
||||||
|
"math/matrix.gc"
|
||||||
|
"math/transform.gc"
|
||||||
|
"math/quaternion.gc"
|
||||||
|
"math/euler.gc"
|
||||||
|
"geometry/geometry.gc"
|
||||||
|
"math/trigonometry.gc"
|
||||||
|
"sound/gsound-h.gc"
|
||||||
|
"ps2/timer-h.gc"
|
||||||
|
"ps2/timer.gc"
|
||||||
|
"ps2/vif-h.gc"
|
||||||
|
"dma/dma-h.gc"
|
||||||
|
"gfx/hw/video-h.gc"
|
||||||
|
"gfx/hw/vu1-user-h.gc"
|
||||||
|
"dma/dma.gc"
|
||||||
|
"dma/dma-buffer.gc"
|
||||||
|
"dma/dma-bucket.gc"
|
||||||
|
"dma/dma-disasm.gc"
|
||||||
|
"ps2/pad.gc"
|
||||||
|
"gfx/hw/gs.gc"
|
||||||
|
"gfx/hw/display-h.gc"
|
||||||
|
"math/vector.gc"
|
||||||
|
"load/file-io.gc"
|
||||||
|
"load/loader-h.gc"
|
||||||
|
"gfx/texture-h.gc"
|
||||||
|
"level/level-h.gc"
|
||||||
|
"camera/math-camera-h.gc"
|
||||||
|
"camera/math-camera.gc"
|
||||||
|
"gfx/font-h.gc"
|
||||||
|
"gfx/decomp-h.gc"
|
||||||
|
"gfx/hw/display.gc"
|
||||||
|
"engine/connect.gc"
|
||||||
|
"ui/text-h.gc"
|
||||||
|
"game/settings-h.gc"
|
||||||
|
"gfx/capture.gc"
|
||||||
|
"debug/memory-usage-h.gc"
|
||||||
|
"gfx/texture.gc"
|
||||||
|
"game/main-h.gc"
|
||||||
|
"anim/mspace-h.gc"
|
||||||
|
"draw/drawable-h.gc"
|
||||||
|
"draw/drawable-group-h.gc"
|
||||||
|
"draw/drawable-inline-array-h.gc"
|
||||||
|
"draw/draw-node-h.gc"
|
||||||
|
"draw/drawable-tree-h.gc"
|
||||||
|
"draw/drawable-actor-h.gc"
|
||||||
|
"draw/drawable-ambient-h.gc"
|
||||||
|
"game/task/game-task-h.gc"
|
||||||
|
"game/task/hint-control-h.gc"
|
||||||
|
"gfx/generic/generic-h.gc"
|
||||||
|
"gfx/lights-h.gc"
|
||||||
|
"gfx/ocean/ocean-h.gc"
|
||||||
|
"gfx/ocean/ocean-trans-tables.gc"
|
||||||
|
"gfx/ocean/ocean-tables.gc"
|
||||||
|
"gfx/ocean/ocean-frames.gc"
|
||||||
|
"gfx/sky/sky-h.gc"
|
||||||
|
"gfx/mood-h.gc"
|
||||||
|
"gfx/time-of-day-h.gc"
|
||||||
|
"data/art-h.gc"
|
||||||
|
"gfx/generic/generic-vu1-h.gc"
|
||||||
|
"gfx/merc/merc-h.gc"
|
||||||
|
"gfx/merc/generic-merc-h.gc"
|
||||||
|
"gfx/tie/generic-tie-h.gc"
|
||||||
|
"gfx/generic/generic-work-h.gc"
|
||||||
|
"gfx/shadow/shadow-cpu-h.gc"
|
||||||
|
"gfx/shadow/shadow-vu1-h.gc"
|
||||||
|
"ps2/memcard-h.gc"
|
||||||
|
"game/game-info-h.gc"
|
||||||
|
"gfx/wind-h.gc"
|
||||||
|
"gfx/tie/prototype-h.gc"
|
||||||
|
"anim/joint-h.gc"
|
||||||
|
"anim/bones-h.gc"
|
||||||
|
"engine/engines.gc"
|
||||||
|
"data/res-h.gc"
|
||||||
|
"data/res.gc"
|
||||||
|
"gfx/lights.gc"
|
||||||
|
"physics/dynamics-h.gc"
|
||||||
|
"target/surface-h.gc"
|
||||||
|
"target/pat-h.gc"
|
||||||
|
"game/fact-h.gc"
|
||||||
|
"anim/aligner-h.gc"
|
||||||
|
"game/game-h.gc"
|
||||||
|
"game/generic-obs-h.gc"
|
||||||
|
"camera/pov-camera-h.gc"
|
||||||
|
"util/sync-info-h.gc"
|
||||||
|
"util/smush-control-h.gc"
|
||||||
|
"physics/trajectory-h.gc"
|
||||||
|
"debug/debug-h.gc"
|
||||||
|
"target/joint-mod-h.gc"
|
||||||
|
"collide/collide-func-h.gc"
|
||||||
|
"collide/collide-mesh-h.gc"
|
||||||
|
"collide/collide-shape-h.gc"
|
||||||
|
"collide/collide-target-h.gc"
|
||||||
|
"collide/collide-touch-h.gc"
|
||||||
|
"collide/collide-edge-grab-h.gc"
|
||||||
|
"draw/process-drawable-h.gc"
|
||||||
|
"game/effect-control-h.gc"
|
||||||
|
"collide/collide-frag-h.gc"
|
||||||
|
"game/projectiles-h.gc"
|
||||||
|
"target/target-h.gc"
|
||||||
|
"gfx/depth-cue-h.gc"
|
||||||
|
"debug/stats-h.gc"
|
||||||
|
"gfx/vis/bsp-h.gc"
|
||||||
|
"collide/collide-cache-h.gc"
|
||||||
|
"collide/collide-h.gc"
|
||||||
|
"gfx/shrub/shrubbery-h.gc"
|
||||||
|
"gfx/tie/tie-h.gc"
|
||||||
|
"gfx/tfrag/tfrag-h.gc"
|
||||||
|
"gfx/background-h.gc"
|
||||||
|
"gfx/tfrag/subdivide-h.gc"
|
||||||
|
"entity/entity-h.gc"
|
||||||
|
"gfx/sprite/sprite-h.gc"
|
||||||
|
"gfx/shadow/shadow-h.gc"
|
||||||
|
"gfx/eye-h.gc"
|
||||||
|
"sparticle/sparticle-launcher-h.gc"
|
||||||
|
"sparticle/sparticle-h.gc"
|
||||||
|
"entity/actor-link-h.gc"
|
||||||
|
"camera/camera-h.gc"
|
||||||
|
"camera/cam-debug-h.gc"
|
||||||
|
"camera/cam-interface-h.gc"
|
||||||
|
"camera/cam-update-h.gc"
|
||||||
|
"debug/assert-h.gc"
|
||||||
|
"ui/hud-h.gc"
|
||||||
|
"ui/progress-h.gc"
|
||||||
|
"ps2/rpc-h.gc"
|
||||||
|
"nav/path-h.gc"
|
||||||
|
"nav/navigate-h.gc"
|
||||||
|
"load/load-dgo.gc"
|
||||||
|
"load/ramdisk.gc"
|
||||||
|
"sound/gsound.gc"
|
||||||
|
"math/transformq.gc"
|
||||||
|
"collide/collide-func.gc"
|
||||||
|
"anim/joint.gc"
|
||||||
|
"geometry/cylinder.gc"
|
||||||
|
"gfx/wind.gc"
|
||||||
|
"gfx/vis/bsp.gc"
|
||||||
|
"gfx/tfrag/subdivide.gc"
|
||||||
|
"gfx/sprite/sprite.gc"
|
||||||
|
"gfx/sprite/sprite-distort.gc"
|
||||||
|
"debug/debug-sphere.gc"
|
||||||
|
"debug/debug.gc"
|
||||||
|
"gfx/merc/merc-vu1.gc"
|
||||||
|
"gfx/merc/merc-blend-shape.gc"
|
||||||
|
"gfx/merc/merc.gc"
|
||||||
|
"gfx/ripple.gc"
|
||||||
|
"anim/bones.gc"
|
||||||
|
"gfx/generic/generic-vu0.gc"
|
||||||
|
"gfx/generic/generic.gc"
|
||||||
|
"gfx/generic/generic-vu1.gc"
|
||||||
|
"gfx/generic/generic-effect.gc"
|
||||||
|
"gfx/generic/generic-merc.gc"
|
||||||
|
"gfx/generic/generic-tie.gc"
|
||||||
|
"gfx/shadow/shadow-cpu.gc"
|
||||||
|
"gfx/shadow/shadow-vu1.gc"
|
||||||
|
"gfx/depth-cue.gc"
|
||||||
|
"gfx/font.gc"
|
||||||
|
"load/decomp.gc"
|
||||||
|
"gfx/background.gc"
|
||||||
|
"draw/draw-node.gc"
|
||||||
|
"gfx/shrub/shrubbery.gc"
|
||||||
|
"gfx/shrub/shrub-work.gc"
|
||||||
|
"gfx/tfrag/tfrag-near.gc"
|
||||||
|
"gfx/tfrag/tfrag.gc"
|
||||||
|
"gfx/tfrag/tfrag-methods.gc"
|
||||||
|
"gfx/tfrag/tfrag-work.gc"
|
||||||
|
"gfx/tie/tie.gc"
|
||||||
|
"gfx/tie/tie-near.gc"
|
||||||
|
"gfx/tie/tie-work.gc"
|
||||||
|
"gfx/tie/tie-methods.gc"
|
||||||
|
"util/sync-info.gc"
|
||||||
|
"physics/trajectory.gc"
|
||||||
|
"sparticle/sparticle-launcher.gc"
|
||||||
|
"sparticle/sparticle.gc"
|
||||||
|
"entity/entity-table.gc"
|
||||||
|
"load/loader.gc"
|
||||||
|
"game/task/task-control-h.gc"
|
||||||
|
"game/game-info.gc"
|
||||||
|
"game/game-save.gc"
|
||||||
|
"game/settings.gc"
|
||||||
|
"ambient/mood-tables.gc"
|
||||||
|
"ambient/mood.gc"
|
||||||
|
"ambient/weather-part.gc"
|
||||||
|
"gfx/time-of-day.gc"
|
||||||
|
"gfx/sky/sky-utils.gc"
|
||||||
|
"gfx/sky/sky.gc"
|
||||||
|
"gfx/sky/sky-tng.gc"
|
||||||
|
"level/load-boundary-h.gc"
|
||||||
|
"level/load-boundary.gc"
|
||||||
|
"level/load-boundary-data.gc"
|
||||||
|
"level/level-info.gc"
|
||||||
|
"level/level.gc"
|
||||||
|
"ui/text.gc"
|
||||||
|
"collide/collide-probe.gc"
|
||||||
|
"collide/collide-frag.gc"
|
||||||
|
"collide/collide-mesh.gc"
|
||||||
|
"collide/collide-touch.gc"
|
||||||
|
"collide/collide-edge-grab.gc"
|
||||||
|
"collide/collide-shape.gc"
|
||||||
|
"collide/collide-shape-rider.gc"
|
||||||
|
"collide/collide.gc"
|
||||||
|
"collide/collide-planes.gc"
|
||||||
|
"gfx/merc/merc-death.gc"
|
||||||
|
"gfx/water/water-h.gc"
|
||||||
|
"camera/camera.gc"
|
||||||
|
"camera/cam-interface.gc"
|
||||||
|
"camera/cam-master.gc"
|
||||||
|
"camera/cam-states.gc"
|
||||||
|
"camera/cam-states-dbg.gc"
|
||||||
|
"camera/cam-combiner.gc"
|
||||||
|
"camera/cam-update.gc"
|
||||||
|
"geometry/vol-h.gc"
|
||||||
|
"camera/cam-layout.gc"
|
||||||
|
"camera/cam-debug.gc"
|
||||||
|
"camera/cam-start.gc"
|
||||||
|
"draw/process-drawable.gc"
|
||||||
|
"game/task/hint-control.gc"
|
||||||
|
"ambient/ambient.gc"
|
||||||
|
"debug/assert.gc"
|
||||||
|
"game/generic-obs.gc"
|
||||||
|
"target/target-util.gc"
|
||||||
|
"target/target-part.gc"
|
||||||
|
"collide/collide-reaction-target.gc"
|
||||||
|
"target/logic-target.gc"
|
||||||
|
"target/sidekick.gc"
|
||||||
|
"game/voicebox.gc"
|
||||||
|
"target/target-handler.gc"
|
||||||
|
"target/target.gc"
|
||||||
|
"target/target2.gc"
|
||||||
|
"target/target-death.gc"
|
||||||
|
"debug/menu.gc"
|
||||||
|
"draw/drawable.gc"
|
||||||
|
"draw/drawable-group.gc"
|
||||||
|
"draw/drawable-inline-array.gc"
|
||||||
|
"draw/drawable-tree.gc"
|
||||||
|
"gfx/tie/prototype.gc"
|
||||||
|
"collide/main-collide.gc"
|
||||||
|
"game/video.gc"
|
||||||
|
"game/main.gc"
|
||||||
|
"collide/collide-cache.gc"
|
||||||
|
"entity/relocate.gc"
|
||||||
|
"debug/memory-usage.gc"
|
||||||
|
"entity/entity.gc"
|
||||||
|
"nav/path.gc"
|
||||||
|
"geometry/vol.gc"
|
||||||
|
"nav/navigate.gc"
|
||||||
|
"anim/aligner.gc"
|
||||||
|
"game/effect-control.gc"
|
||||||
|
"gfx/water/water.gc"
|
||||||
|
"game/collectables-part.gc"
|
||||||
|
"game/collectables.gc"
|
||||||
|
"game/task/task-control.gc"
|
||||||
|
"game/task/process-taskable.gc"
|
||||||
|
"camera/pov-camera.gc"
|
||||||
|
"game/powerups.gc"
|
||||||
|
"game/crates.gc"
|
||||||
|
"ui/hud.gc"
|
||||||
|
"ui/hud-classes.gc"
|
||||||
|
"ui/progress/progress-static.gc"
|
||||||
|
"ui/progress/progress-part.gc"
|
||||||
|
"ui/progress/progress-draw.gc"
|
||||||
|
"ui/progress/progress.gc"
|
||||||
|
"ui/credits.gc"
|
||||||
|
"game/projectiles.gc"
|
||||||
|
"gfx/ocean/ocean.gc"
|
||||||
|
"gfx/ocean/ocean-vu0.gc"
|
||||||
|
"gfx/ocean/ocean-texture.gc"
|
||||||
|
"gfx/ocean/ocean-mid.gc"
|
||||||
|
"gfx/ocean/ocean-transition.gc"
|
||||||
|
"gfx/ocean/ocean-near.gc"
|
||||||
|
"gfx/shadow/shadow.gc"
|
||||||
|
"gfx/eye.gc"
|
||||||
|
"util/glist-h.gc"
|
||||||
|
"util/glist.gc"
|
||||||
|
"debug/anim-tester.gc"
|
||||||
|
"debug/viewer.gc"
|
||||||
|
"debug/part-tester.gc"
|
||||||
|
"debug/default-menu.gc"
|
||||||
|
)
|
||||||
|
|
||||||
|
(goal-src-sequence
|
||||||
|
"levels/common/"
|
||||||
|
:deps ("out/obj/default-menu.o")
|
||||||
|
"texture-upload.gc"
|
||||||
|
"rigid-body-h.gc"
|
||||||
|
"water-anim.gc"
|
||||||
|
"dark-eco-pool.gc"
|
||||||
|
"rigid-body.gc"
|
||||||
|
"nav-enemy-h.gc"
|
||||||
|
"nav-enemy.gc"
|
||||||
|
"baseplat.gc"
|
||||||
|
"basebutton.gc"
|
||||||
|
"tippy.gc"
|
||||||
|
"joint-exploder.gc"
|
||||||
|
"babak.gc"
|
||||||
|
"sharkey.gc"
|
||||||
|
"orb-cache.gc"
|
||||||
|
"plat.gc"
|
||||||
|
"plat-button.gc"
|
||||||
|
"plat-eco.gc"
|
||||||
|
"ropebridge.gc"
|
||||||
|
"ticky.gc"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
|
@ -625,3 +625,33 @@
|
||||||
(defmacro fake-asm (asm-name &rest args)
|
(defmacro fake-asm (asm-name &rest args)
|
||||||
`(defmacro ,asm-name (,@args) `(none))
|
`(defmacro ,asm-name (,@args) `(none))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Build System
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defmacro makeo (object-name &rest flags)
|
||||||
|
"Make the given object. Can use a string, or not."
|
||||||
|
`(make ,(string-append
|
||||||
|
"out/obj/"
|
||||||
|
(if (string? object-name) object-name (symbol->string object-name))
|
||||||
|
".o"
|
||||||
|
)
|
||||||
|
,@flags)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro make-cgo (file)
|
||||||
|
`(make ,(string-append "out/iso/" file ".CGO"))
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro make-dgo (file)
|
||||||
|
`(make ,(string-append "out/iso/" file ".DGO"))
|
||||||
|
)
|
||||||
|
|
||||||
|
(defmacro make-group (name &key (verbose #f) &key (force #f))
|
||||||
|
`(make ,(string-append "GROUP:" name) :verbose ,verbose :force ,force)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; load the default project
|
||||||
|
(load-project "goal_src/game.gp")
|
||||||
|
|
|
@ -34,6 +34,9 @@ add_library(compiler
|
||||||
debugger/DebugInfo.cpp
|
debugger/DebugInfo.cpp
|
||||||
listener/Listener.cpp
|
listener/Listener.cpp
|
||||||
listener/MemoryMap.cpp
|
listener/MemoryMap.cpp
|
||||||
|
make/MakeSystem.cpp
|
||||||
|
make/Tool.cpp
|
||||||
|
make/Tools.cpp
|
||||||
regalloc/IRegister.cpp
|
regalloc/IRegister.cpp
|
||||||
regalloc/Allocator.cpp
|
regalloc/Allocator.cpp
|
||||||
regalloc/allocate.cpp
|
regalloc/allocate.cpp
|
||||||
|
@ -42,15 +45,15 @@ add_library(compiler
|
||||||
|
|
||||||
target_link_libraries(compiler common Zydis)
|
target_link_libraries(compiler common Zydis)
|
||||||
|
|
||||||
if(WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(compiler mman)
|
target_link_libraries(compiler mman)
|
||||||
endif()
|
endif ()
|
||||||
|
|
||||||
if(UNIX)
|
if (UNIX)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
|
||||||
elseif(WIN32)
|
elseif (WIN32)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2")
|
||||||
endif()
|
endif ()
|
||||||
|
|
||||||
add_executable(goalc main.cpp)
|
add_executable(goalc main.cpp)
|
||||||
target_link_libraries(goalc common Zydis compiler)
|
target_link_libraries(goalc common Zydis compiler)
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
#include "Compiler.h"
|
#include "Compiler.h"
|
||||||
#include "common/link_types.h"
|
|
||||||
#include "IR.h"
|
|
||||||
#include "goalc/regalloc/allocate.h"
|
|
||||||
#include "third-party/fmt/core.h"
|
|
||||||
#include "CompilerException.h"
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include "CompilerException.h"
|
||||||
|
#include "IR.h"
|
||||||
|
#include "common/link_types.h"
|
||||||
|
#include "goalc/make/Tools.h"
|
||||||
|
#include "goalc/regalloc/allocate.h"
|
||||||
|
#include "third-party/fmt/core.h"
|
||||||
|
|
||||||
using namespace goos;
|
using namespace goos;
|
||||||
|
|
||||||
|
@ -16,7 +17,10 @@ Compiler::Compiler(std::unique_ptr<ReplWrapper> repl)
|
||||||
m_global_env = std::make_unique<GlobalEnv>();
|
m_global_env = std::make_unique<GlobalEnv>();
|
||||||
m_none = std::make_unique<None>(m_ts.make_typespec("none"));
|
m_none = std::make_unique<None>(m_ts.make_typespec("none"));
|
||||||
|
|
||||||
// compile GOAL library
|
// let the build system run us
|
||||||
|
m_make.add_tool(std::make_shared<CompilerTool>(this));
|
||||||
|
|
||||||
|
// load GOAL library
|
||||||
Object library_code = m_goos.reader.read_from_file({"goal_src", "goal-lib.gc"});
|
Object library_code = m_goos.reader.read_from_file({"goal_src", "goal-lib.gc"});
|
||||||
compile_object_file("goal-lib", library_code, false);
|
compile_object_file("goal-lib", library_code, false);
|
||||||
|
|
||||||
|
@ -410,3 +414,7 @@ void Compiler::typecheck_reg_type_allow_false(const goos::Object& form,
|
||||||
}
|
}
|
||||||
typecheck(form, expected, coerce_to_reg_type(actual->type()), error_message);
|
typecheck(form, expected, coerce_to_reg_type(actual->type()), error_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Compiler::knows_object_file(const std::string& name) {
|
||||||
|
return m_debugger.knows_object(name);
|
||||||
|
}
|
|
@ -2,19 +2,22 @@
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include "common/type_system/TypeSystem.h"
|
|
||||||
#include "Env.h"
|
#include "third-party/fmt/color.h"
|
||||||
#include "goalc/listener/Listener.h"
|
#include "third-party/fmt/core.h"
|
||||||
|
|
||||||
#include "common/goos/Interpreter.h"
|
#include "common/goos/Interpreter.h"
|
||||||
|
#include "common/goos/ReplUtils.h"
|
||||||
|
#include "common/type_system/TypeSystem.h"
|
||||||
|
#include "goalc/compiler/CompilerException.h"
|
||||||
|
#include "goalc/compiler/CompilerSettings.h"
|
||||||
|
#include "goalc/compiler/Env.h"
|
||||||
#include "goalc/compiler/IR.h"
|
#include "goalc/compiler/IR.h"
|
||||||
|
#include "goalc/compiler/SymbolInfo.h"
|
||||||
#include "goalc/debugger/Debugger.h"
|
#include "goalc/debugger/Debugger.h"
|
||||||
#include "goalc/emitter/Register.h"
|
#include "goalc/emitter/Register.h"
|
||||||
#include "CompilerSettings.h"
|
#include "goalc/listener/Listener.h"
|
||||||
#include "third-party/fmt/core.h"
|
#include "goalc/make/MakeSystem.h"
|
||||||
#include "third-party/fmt/color.h"
|
|
||||||
#include "CompilerException.h"
|
|
||||||
#include "goalc/compiler/SymbolInfo.h"
|
|
||||||
#include "common/goos/ReplUtils.h"
|
|
||||||
|
|
||||||
enum MathMode { MATH_INT, MATH_BINT, MATH_FLOAT, MATH_INVALID };
|
enum MathMode { MATH_INT, MATH_BINT, MATH_FLOAT, MATH_INVALID };
|
||||||
|
|
||||||
|
@ -56,8 +59,26 @@ class Compiler {
|
||||||
void repl_coloring(std::string const& str,
|
void repl_coloring(std::string const& str,
|
||||||
Replxx::colors_t& colors,
|
Replxx::colors_t& colors,
|
||||||
std::vector<std::pair<std::string, Replxx::Color>> const& user_data);
|
std::vector<std::pair<std::string, Replxx::Color>> const& user_data);
|
||||||
|
bool knows_object_file(const std::string& name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
TypeSystem m_ts;
|
||||||
|
std::unique_ptr<GlobalEnv> m_global_env = nullptr;
|
||||||
|
std::unique_ptr<None> m_none = nullptr;
|
||||||
|
bool m_want_exit = false;
|
||||||
|
bool m_want_reload = false;
|
||||||
|
listener::Listener m_listener;
|
||||||
|
Debugger m_debugger;
|
||||||
|
goos::Interpreter m_goos;
|
||||||
|
std::unordered_map<std::string, TypeSpec> m_symbol_types;
|
||||||
|
std::unordered_map<std::shared_ptr<goos::SymbolObject>, goos::Object> m_global_constants;
|
||||||
|
std::unordered_map<std::shared_ptr<goos::SymbolObject>, LambdaVal*> m_inlineable_functions;
|
||||||
|
CompilerSettings m_settings;
|
||||||
|
bool m_throw_on_define_extern_redefinition = false;
|
||||||
|
SymbolInfoMap m_symbol_info;
|
||||||
|
std::unique_ptr<ReplWrapper> m_repl;
|
||||||
|
MakeSystem m_make;
|
||||||
|
|
||||||
std::set<std::string> lookup_symbol_infos_starting_with(const std::string& prefix) const;
|
std::set<std::string> lookup_symbol_infos_starting_with(const std::string& prefix) const;
|
||||||
std::vector<SymbolInfo>* lookup_exact_name_info(const std::string& name) const;
|
std::vector<SymbolInfo>* lookup_exact_name_info(const std::string& name) const;
|
||||||
bool get_true_or_false(const goos::Object& form, const goos::Object& boolean);
|
bool get_true_or_false(const goos::Object& form, const goos::Object& boolean);
|
||||||
|
@ -223,22 +244,6 @@ class Compiler {
|
||||||
|
|
||||||
std::string make_symbol_info_description(const SymbolInfo& info);
|
std::string make_symbol_info_description(const SymbolInfo& info);
|
||||||
|
|
||||||
TypeSystem m_ts;
|
|
||||||
std::unique_ptr<GlobalEnv> m_global_env = nullptr;
|
|
||||||
std::unique_ptr<None> m_none = nullptr;
|
|
||||||
bool m_want_exit = false;
|
|
||||||
bool m_want_reload = false;
|
|
||||||
listener::Listener m_listener;
|
|
||||||
Debugger m_debugger;
|
|
||||||
goos::Interpreter m_goos;
|
|
||||||
std::unordered_map<std::string, TypeSpec> m_symbol_types;
|
|
||||||
std::unordered_map<std::shared_ptr<goos::SymbolObject>, goos::Object> m_global_constants;
|
|
||||||
std::unordered_map<std::shared_ptr<goos::SymbolObject>, LambdaVal*> m_inlineable_functions;
|
|
||||||
CompilerSettings m_settings;
|
|
||||||
bool m_throw_on_define_extern_redefinition = false;
|
|
||||||
SymbolInfoMap m_symbol_info;
|
|
||||||
std::unique_ptr<ReplWrapper> m_repl;
|
|
||||||
|
|
||||||
MathMode get_math_mode(const TypeSpec& ts);
|
MathMode get_math_mode(const TypeSpec& ts);
|
||||||
bool is_number(const TypeSpec& ts);
|
bool is_number(const TypeSpec& ts);
|
||||||
bool is_float(const TypeSpec& ts);
|
bool is_float(const TypeSpec& ts);
|
||||||
|
@ -492,6 +497,8 @@ class Compiler {
|
||||||
Val* compile_add_macro_to_autocomplete(const goos::Object& form,
|
Val* compile_add_macro_to_autocomplete(const goos::Object& form,
|
||||||
const goos::Object& rest,
|
const goos::Object& rest,
|
||||||
Env* env);
|
Env* env);
|
||||||
|
Val* compile_load_project(const goos::Object& form, const goos::Object& rest, Env* env);
|
||||||
|
Val* compile_make(const goos::Object& form, const goos::Object& rest, Env* env);
|
||||||
|
|
||||||
// ControlFlow
|
// ControlFlow
|
||||||
Condition compile_condition(const goos::Object& condition, Env* env, bool invert);
|
Condition compile_condition(const goos::Object& condition, Env* env, bool invert);
|
||||||
|
|
|
@ -128,6 +128,8 @@ const std::unordered_map<
|
||||||
{"get-info", &Compiler::compile_get_info},
|
{"get-info", &Compiler::compile_get_info},
|
||||||
{"autocomplete", &Compiler::compile_autocomplete},
|
{"autocomplete", &Compiler::compile_autocomplete},
|
||||||
{"add-macro-to-autocomplete", &Compiler::compile_add_macro_to_autocomplete},
|
{"add-macro-to-autocomplete", &Compiler::compile_add_macro_to_autocomplete},
|
||||||
|
{"load-project", &Compiler::compile_load_project},
|
||||||
|
{"make", &Compiler::compile_make},
|
||||||
|
|
||||||
// CONDITIONAL COMPILATION
|
// CONDITIONAL COMPILATION
|
||||||
{"#cond", &Compiler::compile_gscond},
|
{"#cond", &Compiler::compile_gscond},
|
||||||
|
|
|
@ -4,18 +4,19 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include "goalc/compiler/Compiler.h"
|
|
||||||
#include "goalc/compiler/IR.h"
|
|
||||||
#include "common/util/Timer.h"
|
|
||||||
#include "common/util/DgoWriter.h"
|
|
||||||
#include "common/util/FileUtil.h"
|
|
||||||
#include "goalc/data_compiler/game_text.h"
|
|
||||||
#include "goalc/data_compiler/game_count.h"
|
|
||||||
#include "goalc/data_compiler/dir_tpages.h"
|
|
||||||
#include "common/goos/ReplUtils.h"
|
|
||||||
#include <regex>
|
#include <regex>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
|
|
||||||
|
#include "common/goos/ReplUtils.h"
|
||||||
|
#include "common/util/DgoWriter.h"
|
||||||
|
#include "common/util/FileUtil.h"
|
||||||
|
#include "common/util/Timer.h"
|
||||||
|
#include "goalc/compiler/Compiler.h"
|
||||||
|
#include "goalc/compiler/IR.h"
|
||||||
|
#include "goalc/data_compiler/dir_tpages.h"
|
||||||
|
#include "goalc/data_compiler/game_count.h"
|
||||||
|
#include "goalc/data_compiler/game_text.h"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Exit the compiler. Disconnects the listener and tells the target to reset itself.
|
* Exit the compiler. Disconnects the listener and tells the target to reset itself.
|
||||||
* Will actually exit the next time the REPL runs.
|
* Will actually exit the next time the REPL runs.
|
||||||
|
@ -90,6 +91,7 @@ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& re
|
||||||
bool write = false;
|
bool write = false;
|
||||||
bool no_code = false;
|
bool no_code = false;
|
||||||
bool disassemble = false;
|
bool disassemble = false;
|
||||||
|
bool no_time_prints = false;
|
||||||
|
|
||||||
std::vector<std::pair<std::string, double>> timing;
|
std::vector<std::pair<std::string, double>> timing;
|
||||||
Timer total_timer;
|
Timer total_timer;
|
||||||
|
@ -120,6 +122,8 @@ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& re
|
||||||
} else if (setting == ":disassemble") {
|
} else if (setting == ":disassemble") {
|
||||||
disassemble = true;
|
disassemble = true;
|
||||||
last_was_disasm = true;
|
last_was_disasm = true;
|
||||||
|
} else if (setting == ":no-time-prints") {
|
||||||
|
no_time_prints = true;
|
||||||
} else {
|
} else {
|
||||||
throw_compiler_error(form, "The option {} was not recognized for asm-file.", setting);
|
throw_compiler_error(form, "The option {} was not recognized for asm-file.", setting);
|
||||||
}
|
}
|
||||||
|
@ -208,7 +212,7 @@ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& re
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else {
|
} else {
|
||||||
auto total_time = total_timer.getMs();
|
auto total_time = total_timer.getMs();
|
||||||
if (total_time > 10.0 && color) {
|
if (total_time > 10.0 && color && !no_time_prints) {
|
||||||
fmt::print("[ASM-FILE] {} took {:.2f} ms\n", obj_file_name, total_time);
|
fmt::print("[ASM-FILE] {} took {:.2f} ms\n", obj_file_name, total_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -574,4 +578,30 @@ std::vector<SymbolInfo>* Compiler::lookup_exact_name_info(const std::string& nam
|
||||||
} else {
|
} else {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Val* Compiler::compile_load_project(const goos::Object& form, const goos::Object& rest, Env*) {
|
||||||
|
auto args = get_va(form, rest);
|
||||||
|
va_check(form, args, {goos::ObjectType::STRING}, {});
|
||||||
|
m_make.load_project_file(args.unnamed.at(0).as_string()->data);
|
||||||
|
return get_none();
|
||||||
|
}
|
||||||
|
|
||||||
|
Val* Compiler::compile_make(const goos::Object& form, const goos::Object& rest, Env*) {
|
||||||
|
auto args = get_va(form, rest);
|
||||||
|
va_check(form, args, {goos::ObjectType::STRING},
|
||||||
|
{{"force", {false, {goos::ObjectType::SYMBOL}}},
|
||||||
|
{"verbose", {false, {goos::ObjectType::SYMBOL}}}});
|
||||||
|
bool force = false;
|
||||||
|
if (args.has_named("force")) {
|
||||||
|
force = get_true_or_false(form, args.get_named("force"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool verbose = false;
|
||||||
|
if (args.has_named("verbose")) {
|
||||||
|
verbose = get_true_or_false(form, args.get_named("verbose"));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_make.make(args.unnamed.at(0).as_string()->data, force, verbose);
|
||||||
|
return get_none();
|
||||||
}
|
}
|
|
@ -8,8 +8,6 @@
|
||||||
void compile_dir_tpages(const std::string& filename) {
|
void compile_dir_tpages(const std::string& filename) {
|
||||||
std::vector<int> lengths;
|
std::vector<int> lengths;
|
||||||
|
|
||||||
printf("[Build tpage dir] %s\n", filename.c_str());
|
|
||||||
|
|
||||||
goos::Reader reader;
|
goos::Reader reader;
|
||||||
auto code = reader.read_from_file({filename});
|
auto code = reader.read_from_file({filename});
|
||||||
std::string err;
|
std::string err;
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#include "game_count.h"
|
#include "game_count.h"
|
||||||
|
|
||||||
void compile_game_count(const std::string& filename) {
|
void compile_game_count(const std::string& filename) {
|
||||||
printf("[Build Game Count] %s\n", filename.c_str());
|
|
||||||
struct Count {
|
struct Count {
|
||||||
int buzzer;
|
int buzzer;
|
||||||
int money;
|
int money;
|
||||||
|
|
|
@ -4,15 +4,15 @@
|
||||||
* Uses xdbg functions to debug an OpenGOAL target.
|
* Uses xdbg functions to debug an OpenGOAL target.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "goalc/emitter/Register.h"
|
|
||||||
#include "common/util/assert.h"
|
|
||||||
#include "Debugger.h"
|
#include "Debugger.h"
|
||||||
#include "common/util/Timer.h"
|
|
||||||
#include "common/goal_constants.h"
|
#include "common/goal_constants.h"
|
||||||
#include "common/symbols.h"
|
#include "common/symbols.h"
|
||||||
#include "third-party/fmt/core.h"
|
#include "common/util/Timer.h"
|
||||||
|
#include "common/util/assert.h"
|
||||||
#include "goalc/debugger/disassemble.h"
|
#include "goalc/debugger/disassemble.h"
|
||||||
|
#include "goalc/emitter/Register.h"
|
||||||
#include "goalc/listener/Listener.h"
|
#include "goalc/listener/Listener.h"
|
||||||
|
#include "third-party/fmt/core.h"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Is the target halted? If we don't know or aren't connected, returns false.
|
* Is the target halted? If we don't know or aren't connected, returns false.
|
||||||
|
@ -751,4 +751,8 @@ DebugInfo& Debugger::get_debug_info_for_object(const std::string& object_name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_debug_info.insert(std::make_pair(object_name, DebugInfo(object_name))).first->second;
|
return m_debug_info.insert(std::make_pair(object_name, DebugInfo(object_name))).first->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Debugger::knows_object(const std::string& object_name) const {
|
||||||
|
return m_debug_info.find(object_name) != m_debug_info.end();
|
||||||
}
|
}
|
|
@ -6,16 +6,16 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <thread>
|
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
#include <cstring>
|
||||||
|
#include <mutex>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
#include <thread>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include "DebugInfo.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/cross_os_debug/xdbg.h"
|
#include "common/cross_os_debug/xdbg.h"
|
||||||
#include "goalc/listener/MemoryMap.h"
|
#include "goalc/listener/MemoryMap.h"
|
||||||
#include "DebugInfo.h"
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
namespace listener {
|
namespace listener {
|
||||||
class Listener;
|
class Listener;
|
||||||
|
@ -92,6 +92,7 @@ class Debugger {
|
||||||
|
|
||||||
InstructionPointerInfo get_rip_info(u64 x86_rip);
|
InstructionPointerInfo get_rip_info(u64 x86_rip);
|
||||||
DebugInfo& get_debug_info_for_object(const std::string& object_name);
|
DebugInfo& get_debug_info_for_object(const std::string& object_name);
|
||||||
|
bool knows_object(const std::string& object_name) const;
|
||||||
const InstructionPointerInfo& get_cached_break_info() { return m_break_info; }
|
const InstructionPointerInfo& get_cached_break_info() { return m_break_info; }
|
||||||
std::string get_info_about_addr(u32 addr);
|
std::string get_info_about_addr(u32 addr);
|
||||||
Disassembly disassemble_at_rip(const InstructionPointerInfo& info);
|
Disassembly disassemble_at_rip(const InstructionPointerInfo& info);
|
||||||
|
|
|
@ -48,7 +48,7 @@ int main(int argc, char** argv) {
|
||||||
// Init REPL
|
// Init REPL
|
||||||
// the compiler may throw an exception if it fails to load its standard library.
|
// the compiler may throw an exception if it fails to load its standard library.
|
||||||
try {
|
try {
|
||||||
std::unique_ptr<Compiler> compiler = std::make_unique<Compiler>();
|
std::unique_ptr<Compiler> compiler;
|
||||||
if (argument.empty()) {
|
if (argument.empty()) {
|
||||||
ReplStatus status = ReplStatus::WANT_RELOAD;
|
ReplStatus status = ReplStatus::WANT_RELOAD;
|
||||||
while (status == ReplStatus::WANT_RELOAD) {
|
while (status == ReplStatus::WANT_RELOAD) {
|
||||||
|
@ -59,6 +59,7 @@ int main(int argc, char** argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
compiler = std::make_unique<Compiler>();
|
||||||
compiler->run_front_end_on_string(argument);
|
compiler->run_front_end_on_string(argument);
|
||||||
}
|
}
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
|
|
328
goalc/make/MakeSystem.cpp
Normal file
328
goalc/make/MakeSystem.cpp
Normal file
|
@ -0,0 +1,328 @@
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
#include "MakeSystem.h"
|
||||||
|
|
||||||
|
#include "third-party/fmt/color.h"
|
||||||
|
#include "third-party/fmt/core.h"
|
||||||
|
|
||||||
|
#include "common/goos/ParseHelpers.h"
|
||||||
|
#include "common/util/Timer.h"
|
||||||
|
|
||||||
|
#include "goalc/make/Tools.h"
|
||||||
|
|
||||||
|
std::string MakeStep::print() const {
|
||||||
|
std::string result = fmt::format("Tool {} with input \"{}\" and deps:\n ", tool, input);
|
||||||
|
for (auto& dep : deps) {
|
||||||
|
result += dep;
|
||||||
|
result += '\n';
|
||||||
|
result += ' ';
|
||||||
|
}
|
||||||
|
result.pop_back();
|
||||||
|
|
||||||
|
result += fmt::format("will produce outputs:\n ");
|
||||||
|
for (auto& o : outputs) {
|
||||||
|
result += o;
|
||||||
|
result += '\n';
|
||||||
|
result += ' ';
|
||||||
|
}
|
||||||
|
result.pop_back();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
MakeSystem::MakeSystem() {
|
||||||
|
m_goos.register_form("defstep", [=](const goos::Object& obj, goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env) {
|
||||||
|
return handle_defstep(obj, args, env);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_goos.register_form("basename", [=](const goos::Object& obj, goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env) {
|
||||||
|
return handle_basename(obj, args, env);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_goos.register_form("stem", [=](const goos::Object& obj, goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env) {
|
||||||
|
return handle_stem(obj, args, env);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_goos.set_global_variable_to_symbol("ASSETS", "#t");
|
||||||
|
|
||||||
|
add_tool<DgoTool>();
|
||||||
|
add_tool<TpageDirTool>();
|
||||||
|
add_tool<CopyTool>();
|
||||||
|
add_tool<GameCntTool>();
|
||||||
|
add_tool<TextTool>();
|
||||||
|
add_tool<GroupTool>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Load a project file, clearing any project info previously loaded.
|
||||||
|
*/
|
||||||
|
void MakeSystem::load_project_file(const std::string& file_path) {
|
||||||
|
Timer timer;
|
||||||
|
// clear the previous project
|
||||||
|
clear_project();
|
||||||
|
// read the file
|
||||||
|
auto data = m_goos.reader.read_from_file({file_path});
|
||||||
|
// interpret it, which will call various handlers.
|
||||||
|
m_goos.eval(data, m_goos.global_environment.as_env());
|
||||||
|
}
|
||||||
|
|
||||||
|
goos::Object MakeSystem::handle_defstep(const goos::Object& form,
|
||||||
|
goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env) {
|
||||||
|
m_goos.eval_args(&args, env);
|
||||||
|
va_check(form, args, {},
|
||||||
|
{{"out", {true, {goos::ObjectType::PAIR}}},
|
||||||
|
{"tool", {true, {goos::ObjectType::SYMBOL}}},
|
||||||
|
{"in", {false, {goos::ObjectType::STRING}}},
|
||||||
|
{"dep", {false, {}}}});
|
||||||
|
|
||||||
|
auto step = std::make_shared<MakeStep>();
|
||||||
|
|
||||||
|
goos::for_each_in_list(args.get_named("out"), [&](const goos::Object& obj) {
|
||||||
|
step->outputs.push_back(obj.as_string()->data);
|
||||||
|
});
|
||||||
|
|
||||||
|
step->tool = args.get_named("tool").as_symbol()->name;
|
||||||
|
|
||||||
|
if (m_tools.find(step->tool) == m_tools.end()) {
|
||||||
|
throw std::runtime_error(fmt::format("The tool {} is unknown.", step->tool));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.has_named("in")) {
|
||||||
|
step->input = args.get_named("in").as_string()->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.has_named("dep")) {
|
||||||
|
goos::for_each_in_list(args.get_named("dep"), [&](const goos::Object& obj) {
|
||||||
|
step->deps.push_back(obj.as_string()->data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& output : step->outputs) {
|
||||||
|
auto existing = m_output_to_step.find(output);
|
||||||
|
if (existing != m_output_to_step.end()) {
|
||||||
|
throw std::runtime_error(fmt::format("There are multiple ways to make output {}:\n{}\n{}\n",
|
||||||
|
output, step->print(), existing->second->print()));
|
||||||
|
}
|
||||||
|
m_output_to_step.insert({output, step});
|
||||||
|
}
|
||||||
|
|
||||||
|
return goos::EmptyListObject::make_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Fully clear the state of the project.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void MakeSystem::clear_project() {
|
||||||
|
m_output_to_step.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MakeSystem::va_check(
|
||||||
|
const goos::Object& form,
|
||||||
|
const goos::Arguments& args,
|
||||||
|
const std::vector<std::optional<goos::ObjectType>>& unnamed,
|
||||||
|
const std::unordered_map<std::string, std::pair<bool, std::optional<goos::ObjectType>>>&
|
||||||
|
named) {
|
||||||
|
std::string err;
|
||||||
|
if (!goos::va_check(args, unnamed, named, &err)) {
|
||||||
|
m_goos.throw_eval_error(form, err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
goos::Object MakeSystem::handle_basename(const goos::Object& form,
|
||||||
|
goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env) {
|
||||||
|
m_goos.eval_args(&args, env);
|
||||||
|
va_check(form, args, {goos::ObjectType::STRING}, {});
|
||||||
|
std::filesystem::path input(args.unnamed.at(0).as_string()->data);
|
||||||
|
|
||||||
|
return goos::StringObject::make_new(input.filename().u8string());
|
||||||
|
}
|
||||||
|
|
||||||
|
goos::Object MakeSystem::handle_stem(const goos::Object& form,
|
||||||
|
goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env) {
|
||||||
|
m_goos.eval_args(&args, env);
|
||||||
|
va_check(form, args, {goos::ObjectType::STRING}, {});
|
||||||
|
std::filesystem::path input(args.unnamed.at(0).as_string()->data);
|
||||||
|
|
||||||
|
return goos::StringObject::make_new(input.stem().u8string());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MakeSystem::get_dependencies(const std::string& master_target,
|
||||||
|
const std::string& output,
|
||||||
|
std::vector<std::string>* result,
|
||||||
|
std::unordered_set<std::string>* result_set) const {
|
||||||
|
if (result_set->find(output) != result_set->end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& rule_it = m_output_to_step.find(output);
|
||||||
|
if (rule_it == m_output_to_step.end()) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
fmt::format("No rule to make {}, required for {}\n", output, master_target));
|
||||||
|
}
|
||||||
|
|
||||||
|
// what deps do we need?
|
||||||
|
for (auto& dep : rule_it->second->deps) {
|
||||||
|
get_dependencies(master_target, dep, result, result_set);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& rule = rule_it->second;
|
||||||
|
for (auto& dep : m_tools.at(rule->tool)
|
||||||
|
->get_additional_dependencies({rule->input, rule->deps, rule->outputs})) {
|
||||||
|
get_dependencies(master_target, dep, result, result_set);
|
||||||
|
}
|
||||||
|
|
||||||
|
result->push_back(output);
|
||||||
|
for (auto& op : rule->outputs) {
|
||||||
|
result_set->insert(op);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> MakeSystem::get_dependencies(const std::string& target) const {
|
||||||
|
Timer timer;
|
||||||
|
|
||||||
|
std::vector<std::string> result;
|
||||||
|
std::unordered_set<std::string> added_deps;
|
||||||
|
|
||||||
|
get_dependencies(target, target, &result, &added_deps);
|
||||||
|
|
||||||
|
fmt::print("Successfully found all {} dependencies for target in {:.3f}s\n", result.size(),
|
||||||
|
timer.getSeconds());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MakeSystem::add_tool(std::shared_ptr<Tool> tool) {
|
||||||
|
auto& name = tool->name();
|
||||||
|
assert(m_tools.find(name) == m_tools.end());
|
||||||
|
m_tools[name] = tool;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> MakeSystem::filter_dependencies(const std::vector<std::string>& all_deps) {
|
||||||
|
Timer timer;
|
||||||
|
std::vector<std::string> result;
|
||||||
|
std::unordered_set<std::string> stale_deps;
|
||||||
|
|
||||||
|
std::unordered_set<std::string> compiler_sym_needed;
|
||||||
|
|
||||||
|
for (auto& to_make : all_deps) {
|
||||||
|
auto& rule = m_output_to_step.at(to_make);
|
||||||
|
auto& tool = m_tools.at(rule->tool);
|
||||||
|
|
||||||
|
bool added = false;
|
||||||
|
|
||||||
|
if (tool->needs_run({rule->input, rule->deps, rule->outputs})) {
|
||||||
|
result.push_back(to_make);
|
||||||
|
stale_deps.insert(to_make);
|
||||||
|
added = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!added) {
|
||||||
|
// check transitive dependencies
|
||||||
|
for (auto& dep : rule->deps) {
|
||||||
|
if (stale_deps.find(dep) != stale_deps.end()) {
|
||||||
|
result.push_back(to_make);
|
||||||
|
stale_deps.insert(to_make);
|
||||||
|
added = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!added) {
|
||||||
|
// check transitive dependencies
|
||||||
|
for (auto& dep :
|
||||||
|
tool->get_additional_dependencies({rule->input, rule->deps, rule->outputs})) {
|
||||||
|
if (stale_deps.find(dep) != stale_deps.end()) {
|
||||||
|
result.push_back(to_make);
|
||||||
|
stale_deps.insert(to_make);
|
||||||
|
added = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt::print("Found that {} of {} targets do need rebuilding in {:.3f}s\n", result.size(),
|
||||||
|
all_deps.size(), timer.getSeconds());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void print_input(const std::string& in, char end) {
|
||||||
|
if (in.length() > 70) {
|
||||||
|
fmt::print("{}...{}", in.substr(0, 70 - 3), end);
|
||||||
|
} else {
|
||||||
|
fmt::print("{}{}{}", in, std::string(70 - in.length(), ' '), end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
bool MakeSystem::make(const std::string& target, bool force, bool verbose) {
|
||||||
|
auto deps = get_dependencies(target);
|
||||||
|
// fmt::print("All deps:\n");
|
||||||
|
// for (auto& dep : deps) {
|
||||||
|
// fmt::print("{}\n", dep);
|
||||||
|
// }
|
||||||
|
if (!force) {
|
||||||
|
deps = filter_dependencies(deps);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt::print("Filt deps:\n");
|
||||||
|
// for (auto& dep : filtered_deps) {
|
||||||
|
// fmt::print("{}\n", dep);
|
||||||
|
// }
|
||||||
|
|
||||||
|
Timer make_timer;
|
||||||
|
fmt::print("Building {} targets...\n", deps.size());
|
||||||
|
int i = 0;
|
||||||
|
for (auto& to_make : deps) {
|
||||||
|
Timer step_timer;
|
||||||
|
auto& rule = m_output_to_step.at(to_make);
|
||||||
|
auto& tool = m_tools.at(rule->tool);
|
||||||
|
int percent = (100.0 * (1 + (i++)) / (deps.size())) + 0.5;
|
||||||
|
if (verbose) {
|
||||||
|
fmt::print("[{:3d}%] [{:8s}] {}\n", percent, tool->name(), rule->input);
|
||||||
|
} else {
|
||||||
|
fmt::print("[{:3d}%] [{:8s}] ", percent, tool->name());
|
||||||
|
print_input(rule->input, '\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
try {
|
||||||
|
success = tool->run({rule->input, rule->deps, rule->outputs});
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
fmt::print("\n");
|
||||||
|
fmt::print("Error: {}\n", e.what());
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
fmt::print("Build failed on {}.\n", rule->input);
|
||||||
|
throw std::runtime_error("Build failed.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
|
if (step_timer.getSeconds() > 0.05) {
|
||||||
|
fmt::print(fg(fmt::color::yellow), " {:.3f}\n", step_timer.getSeconds());
|
||||||
|
} else {
|
||||||
|
fmt::print(" {:.3f}\n", step_timer.getSeconds());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (step_timer.getSeconds() > 0.05) {
|
||||||
|
fmt::print("[{:3d}%] [{:8s}] ", percent, tool->name());
|
||||||
|
fmt::print(fg(fmt::color::yellow), "{:.3f} ", step_timer.getSeconds());
|
||||||
|
print_input(rule->input, '\n');
|
||||||
|
} else {
|
||||||
|
fmt::print("[{:3d}%] [{:8s}] {:.3f} ", percent, tool->name(), step_timer.getSeconds());
|
||||||
|
print_input(rule->input, '\r');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt::print("\nSuccessfully built all {} targets in {:.3f}s\n", deps.size(),
|
||||||
|
make_timer.getSeconds());
|
||||||
|
return true;
|
||||||
|
}
|
61
goalc/make/MakeSystem.h
Normal file
61
goalc/make/MakeSystem.h
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/goos/Interpreter.h"
|
||||||
|
#include "goalc/make/Tool.h"
|
||||||
|
|
||||||
|
struct MakeStep {
|
||||||
|
std::string input;
|
||||||
|
std::vector<std::string> deps, outputs;
|
||||||
|
std::string tool;
|
||||||
|
|
||||||
|
std::string print() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MakeSystem {
|
||||||
|
public:
|
||||||
|
MakeSystem();
|
||||||
|
void load_project_file(const std::string& file_path);
|
||||||
|
|
||||||
|
goos::Object handle_defstep(const goos::Object& obj,
|
||||||
|
goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env);
|
||||||
|
|
||||||
|
goos::Object handle_basename(const goos::Object& obj,
|
||||||
|
goos::Arguments& args,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env);
|
||||||
|
|
||||||
|
goos::Object handle_stem(const goos::Object& obj,
|
||||||
|
goos::Arguments&,
|
||||||
|
const std::shared_ptr<goos::EnvironmentObject>& env);
|
||||||
|
|
||||||
|
std::vector<std::string> get_dependencies(const std::string& target) const;
|
||||||
|
std::vector<std::string> filter_dependencies(const std::vector<std::string>& all_deps);
|
||||||
|
|
||||||
|
bool make(const std::string& target, bool force, bool verbose);
|
||||||
|
|
||||||
|
void add_tool(std::shared_ptr<Tool> tool);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void add_tool() {
|
||||||
|
add_tool(std::make_shared<T>());
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_project();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void va_check(const goos::Object& form,
|
||||||
|
const goos::Arguments& args,
|
||||||
|
const std::vector<std::optional<goos::ObjectType>>& unnamed,
|
||||||
|
const std::unordered_map<std::string,
|
||||||
|
std::pair<bool, std::optional<goos::ObjectType>>>& named);
|
||||||
|
|
||||||
|
void get_dependencies(const std::string& master_target,
|
||||||
|
const std::string& output,
|
||||||
|
std::vector<std::string>* result_order,
|
||||||
|
std::unordered_set<std::string>* result_set) const;
|
||||||
|
|
||||||
|
goos::Interpreter m_goos;
|
||||||
|
|
||||||
|
std::unordered_map<std::string, std::shared_ptr<MakeStep>> m_output_to_step;
|
||||||
|
std::unordered_map<std::string, std::shared_ptr<Tool>> m_tools;
|
||||||
|
};
|
59
goalc/make/Tool.cpp
Normal file
59
goalc/make/Tool.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
|
#include "third-party/fmt/core.h"
|
||||||
|
|
||||||
|
#include "Tool.h"
|
||||||
|
#include "common/util/FileUtil.h"
|
||||||
|
|
||||||
|
Tool::Tool(const std::string& name) : m_name(name) {}
|
||||||
|
|
||||||
|
bool Tool::needs_run(const ToolInput& task) {
|
||||||
|
// for this to return false, all outputs need to be newer than all inputs.
|
||||||
|
|
||||||
|
auto in_file = std::filesystem::path(file_util::get_file_path({task.input}));
|
||||||
|
|
||||||
|
if (!std::filesystem::exists(in_file)) {
|
||||||
|
throw std::runtime_error(fmt::format("Input file {} does not exist.", task.input));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto newest_input = std::filesystem::last_write_time(in_file);
|
||||||
|
for (auto& dep : task.deps) {
|
||||||
|
auto dep_path = std::filesystem::path(file_util::get_file_path({dep}));
|
||||||
|
if (std::filesystem::exists(dep_path)) {
|
||||||
|
auto dep_time = std::filesystem::last_write_time(dep_path);
|
||||||
|
if (dep_time > newest_input) {
|
||||||
|
newest_input = dep_time;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true; // don't have a dep.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& dep : get_additional_dependencies(task)) {
|
||||||
|
auto dep_path = std::filesystem::path(file_util::get_file_path({dep}));
|
||||||
|
if (std::filesystem::exists(dep_path)) {
|
||||||
|
auto dep_time = std::filesystem::last_write_time(dep_path);
|
||||||
|
if (dep_time > newest_input) {
|
||||||
|
newest_input = dep_time;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true; // don't have a dep.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& out : task.output) {
|
||||||
|
auto out_path = std::filesystem::path(file_util::get_file_path({out}));
|
||||||
|
if (std::filesystem::exists(out_path)) {
|
||||||
|
auto out_time = std::filesystem::last_write_time(out_path);
|
||||||
|
if (out_time < newest_input) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true; // don't have a dep.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
25
goalc/make/Tool.h
Normal file
25
goalc/make/Tool.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct ToolInput {
|
||||||
|
std::string& input; // the input file
|
||||||
|
std::vector<std::string>& deps; // explicit dependencies
|
||||||
|
std::vector<std::string>& output; // produced output files.
|
||||||
|
};
|
||||||
|
|
||||||
|
class Tool {
|
||||||
|
public:
|
||||||
|
Tool(const std::string& name);
|
||||||
|
virtual bool run(const ToolInput& task) = 0;
|
||||||
|
virtual std::vector<std::string> get_additional_dependencies(const ToolInput&) { return {}; }
|
||||||
|
virtual bool needs_run(const ToolInput& task);
|
||||||
|
virtual ~Tool() = default;
|
||||||
|
|
||||||
|
const std::string& name() const { return m_name; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_name;
|
||||||
|
};
|
121
goalc/make/Tools.cpp
Normal file
121
goalc/make/Tools.cpp
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
|
||||||
|
|
||||||
|
#include "Tools.h"
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
#include "goalc/compiler/Compiler.h"
|
||||||
|
#include "common/goos/ParseHelpers.h"
|
||||||
|
#include "common/util/DgoWriter.h"
|
||||||
|
#include "common/util/FileUtil.h"
|
||||||
|
#include "third-party/fmt/core.h"
|
||||||
|
#include "goalc/data_compiler/dir_tpages.h"
|
||||||
|
#include "goalc/data_compiler/game_count.h"
|
||||||
|
#include "goalc/data_compiler/game_text.h"
|
||||||
|
|
||||||
|
CompilerTool::CompilerTool(Compiler* compiler) : Tool("goalc"), m_compiler(compiler) {}
|
||||||
|
|
||||||
|
bool CompilerTool::needs_run(const ToolInput& task) {
|
||||||
|
if (!m_compiler->knows_object_file(std::filesystem::path(task.input).stem().u8string())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Tool::needs_run(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CompilerTool::run(const ToolInput& task) {
|
||||||
|
// todo check inputs
|
||||||
|
try {
|
||||||
|
m_compiler->run_front_end_on_string(
|
||||||
|
fmt::format("(asm-file \"{}\" :no-time-prints :color :write)", task.input));
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
fmt::print("Compilation failed: {}\n", e.what());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
DgoDescription parse_desc_file(const std::string& filename, goos::Reader& reader) {
|
||||||
|
auto dgo_desc = reader.read_from_file({filename}).as_pair()->cdr;
|
||||||
|
if (goos::list_length(dgo_desc) != 1) {
|
||||||
|
throw std::runtime_error("Invalid DGO description - got too many lists");
|
||||||
|
}
|
||||||
|
auto dgo = dgo_desc.as_pair()->car;
|
||||||
|
|
||||||
|
DgoDescription desc;
|
||||||
|
auto first = dgo.as_pair()->car;
|
||||||
|
desc.dgo_name = first.as_string()->data;
|
||||||
|
auto dgo_rest = dgo.as_pair()->cdr;
|
||||||
|
|
||||||
|
for_each_in_list(dgo_rest, [&](const goos::Object& entry) {
|
||||||
|
goos::Arguments e_arg;
|
||||||
|
std::string err;
|
||||||
|
if (!goos::get_va(entry, &err, &e_arg)) {
|
||||||
|
throw std::runtime_error(fmt::format("Invalid DGO description: {}\n", err));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!goos::va_check(e_arg, {goos::ObjectType::STRING, goos::ObjectType::STRING}, {}, &err)) {
|
||||||
|
throw std::runtime_error(fmt::format("Invalid DGO description: {}\n", err));
|
||||||
|
}
|
||||||
|
DgoDescription::DgoEntry o;
|
||||||
|
o.file_name = e_arg.unnamed.at(0).as_string()->data;
|
||||||
|
o.name_in_dgo = e_arg.unnamed.at(1).as_string()->data;
|
||||||
|
desc.entries.push_back(o);
|
||||||
|
});
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
DgoTool::DgoTool() : Tool("dgo") {}
|
||||||
|
|
||||||
|
bool DgoTool::run(const ToolInput& task) {
|
||||||
|
auto desc = parse_desc_file(task.input, m_reader);
|
||||||
|
build_dgo(desc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> DgoTool::get_additional_dependencies(const ToolInput& task) {
|
||||||
|
std::vector<std::string> result;
|
||||||
|
auto desc = parse_desc_file(task.input, m_reader);
|
||||||
|
for (auto& x : desc.entries) {
|
||||||
|
result.push_back(fmt::format("out/obj/{}", x.file_name));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
TpageDirTool::TpageDirTool() : Tool("tpage-dir") {}
|
||||||
|
|
||||||
|
bool TpageDirTool::run(const ToolInput& task) {
|
||||||
|
compile_dir_tpages(task.input);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyTool::CopyTool() : Tool("copy") {}
|
||||||
|
|
||||||
|
bool CopyTool::run(const ToolInput& task) {
|
||||||
|
for (auto& out : task.output) {
|
||||||
|
std::filesystem::copy(std::filesystem::path(file_util::get_file_path({task.input})),
|
||||||
|
std::filesystem::path(file_util::get_file_path({out})),
|
||||||
|
std::filesystem::copy_options::overwrite_existing);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameCntTool::GameCntTool() : Tool("game-cnt") {}
|
||||||
|
|
||||||
|
bool GameCntTool::run(const ToolInput& task) {
|
||||||
|
compile_game_count(task.input);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TextTool::TextTool() : Tool("text") {}
|
||||||
|
|
||||||
|
bool TextTool::run(const ToolInput& task) {
|
||||||
|
compile_game_text(task.input);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupTool::GroupTool() : Tool("group") {}
|
||||||
|
|
||||||
|
bool GroupTool::run(const ToolInput&) {
|
||||||
|
return true;
|
||||||
|
}
|
57
goalc/make/Tools.h
Normal file
57
goalc/make/Tools.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "goalc/make/Tool.h"
|
||||||
|
#include "common/goos/Reader.h"
|
||||||
|
|
||||||
|
class Compiler;
|
||||||
|
|
||||||
|
class CompilerTool : public Tool {
|
||||||
|
public:
|
||||||
|
CompilerTool(Compiler* compiler);
|
||||||
|
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
bool needs_run(const ToolInput& task) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Compiler* m_compiler = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DgoTool : public Tool {
|
||||||
|
public:
|
||||||
|
DgoTool();
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
std::vector<std::string> get_additional_dependencies(const ToolInput&) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
goos::Reader m_reader;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TpageDirTool : public Tool {
|
||||||
|
public:
|
||||||
|
TpageDirTool();
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CopyTool : public Tool {
|
||||||
|
public:
|
||||||
|
CopyTool();
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GameCntTool : public Tool {
|
||||||
|
public:
|
||||||
|
GameCntTool();
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TextTool : public Tool {
|
||||||
|
public:
|
||||||
|
TextTool();
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GroupTool : public Tool {
|
||||||
|
public:
|
||||||
|
GroupTool();
|
||||||
|
bool run(const ToolInput& task) override;
|
||||||
|
};
|
|
@ -99,6 +99,8 @@
|
||||||
;; set up indentation for GOAL keywords
|
;; set up indentation for GOAL keywords
|
||||||
(put 'with-pp 'common-lisp-indent-function 0)
|
(put 'with-pp 'common-lisp-indent-function 0)
|
||||||
(put 'while 'common-lisp-indent-function 1)
|
(put 'while 'common-lisp-indent-function 1)
|
||||||
|
(put 'goal-src 'common-lisp-indent-function 1)
|
||||||
|
(put 'engine-src 'common-lisp-indent-function 1)
|
||||||
(put 'rlet 'common-lisp-indent-function 1)
|
(put 'rlet 'common-lisp-indent-function 1)
|
||||||
(put 'until 'common-lisp-indent-function 1)
|
(put 'until 'common-lisp-indent-function 1)
|
||||||
(put 'countdown 'common-lisp-indent-function 1)
|
(put 'countdown 'common-lisp-indent-function 1)
|
||||||
|
|
|
@ -47,15 +47,12 @@ echo " ================ Running offline decompiler tests..."
|
||||||
echo " ================ Decompiling..."
|
echo " ================ Decompiling..."
|
||||||
../scripts/shell/decomp.sh
|
../scripts/shell/decomp.sh
|
||||||
|
|
||||||
echo " ================ Building assets..."
|
echo " ================ Building project..."
|
||||||
../scripts/shell/gc.sh -cmd \(build-data\)
|
../scripts/shell/gc.sh -cmd \(make-group\ \"iso\"\)
|
||||||
|
|
||||||
echo " ================ Checking assets..."
|
echo " ================ Checking assets..."
|
||||||
../scripts/shell/check.sh
|
../scripts/shell/check.sh
|
||||||
|
|
||||||
echo " ================ Building game..."
|
|
||||||
../scripts/shell/gc.sh -cmd \(build-game\)
|
|
||||||
|
|
||||||
echo " ================ Booting game..."
|
echo " ================ Booting game..."
|
||||||
../scripts/shell/boot_game.sh
|
../scripts/shell/boot_game.sh
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,10 @@ std::vector<std::string> get_test_pass_string(const std::string& name, int count
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
TEST_F(WithGameTests, MakeSystem) {
|
||||||
|
compiler.run_front_end_on_string("(make \"out/iso/ENGINE.CGO\")");
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(WithGameTests, ReturnConstant) {
|
TEST_F(WithGameTests, ReturnConstant) {
|
||||||
runner.run_static_test(env, testCategory, "defun-return-constant.static.gc", {"12\n"});
|
runner.run_static_test(env, testCategory, "defun-return-constant.static.gc", {"12\n"});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1319,3 +1319,17 @@ TEST(GoosBuiltins, Error) {
|
||||||
Interpreter i;
|
Interpreter i;
|
||||||
EXPECT_ANY_THROW(e(i, "(error \"hi\")"));
|
EXPECT_ANY_THROW(e(i, "(error \"hi\")"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(GoosBuiltins, Ash) {
|
||||||
|
Interpreter i;
|
||||||
|
EXPECT_EQ(e(i, "(ash 3 2)"), "12");
|
||||||
|
EXPECT_EQ(e(i, "(ash 3 -1)"), "1");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(GoosBuiltins, StringUtils) {
|
||||||
|
Interpreter i;
|
||||||
|
EXPECT_EQ(e(i, "(string-ref \"test\" 2)"), "#\\s");
|
||||||
|
EXPECT_EQ(e(i, "(string-length \"test\")"), "4");
|
||||||
|
EXPECT_EQ(e(i, "(string-append \"hello\" \" \" \"world\")"), "\"hello world\"");
|
||||||
|
EXPECT_EQ(e(i, "(symbol->string 'test)"), "\"test\"");
|
||||||
|
}
|
Loading…
Reference in a new issue