diff --git a/.gitignore b/.gitignore index 33fbd54c18..84bf811ae0 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,4 @@ __pycache__/ /jak1-*.json /jak2-*.json /TODO.md +unifont-15.0.03.ttf diff --git a/.vs/launch.vs.json b/.vs/launch.vs.json index 42899c18aa..d9373e069a 100644 --- a/.vs/launch.vs.json +++ b/.vs/launch.vs.json @@ -114,7 +114,7 @@ "type": "default", "project": "CMakeLists.txt", "projectTarget": "gk.exe (bin\\gk.exe)", - "name": "Game - Jak 2 - Runtime", + "name": "Game - Jak 2 - Runtime (no boot)", "args": ["-v", "--game", "jak2", "--", "-fakeiso", "-debug"] }, { @@ -124,6 +124,13 @@ "name": "Game - Jak 2 - Runtime (boot)", "args": ["-v", "--game", "jak2", "--", "-boot", "-fakeiso", "-debug"] }, + { + "type": "default", + "project": "CMakeLists.txt", + "projectTarget": "gk.exe (bin\\gk.exe)", + "name": "Game - Jak 2 - Runtime (release)", + "args": ["-v", "--game", "jak2", "--", "-boot", "-fakeiso"] + }, { "type": "default", "project": "CMakeLists.txt", diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index a2e7ac8ce4..61aa4b175b 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -53,6 +53,8 @@ add_library(common repl/util.cpp serialization/subtitles/subtitles_deser.cpp serialization/subtitles/subtitles_ser.cpp + serialization/subtitles2/subtitles2_deser.cpp + serialization/subtitles2/subtitles2_ser.cpp type_system/defenum.cpp type_system/deftype.cpp type_system/state.cpp diff --git a/common/serialization/subtitles2/subtitles2_deser.cpp b/common/serialization/subtitles2/subtitles2_deser.cpp new file mode 100644 index 0000000000..61dc03f5c0 --- /dev/null +++ b/common/serialization/subtitles2/subtitles2_deser.cpp @@ -0,0 +1,27 @@ +#include "subtitles2_deser.h" + +#include "common/log/log.h" +#include "common/util/FileUtil.h" + +#include "third-party/json.hpp" + +const std::vector locale_lookup = {"en-US", "fr-FR", "de-DE", "es-ES", + "it-IT", "jp-JP", "ko-KR", "en-GB"}; + +bool write_subtitle_db_to_files(const GameSubtitle2DB& db, const GameVersion game_version) { + try { + for (const auto& [language_id, bank] : db.m_banks) { + json data; + to_json(data, *bank); + std::string dump_path = (file_util::get_jak_project_dir() / "game" / "assets" / + version_to_game_name(game_version) / "subtitle" / + fmt::format("subtitle_{}.json", locale_lookup.at(language_id))) + .string(); + file_util::write_text_file(dump_path, data.dump(2)); + } + } catch (std::exception& ex) { + lg::error(ex.what()); + return false; + } + return true; +} diff --git a/common/serialization/subtitles2/subtitles2_deser.h b/common/serialization/subtitles2/subtitles2_deser.h new file mode 100644 index 0000000000..a1da96a0e8 --- /dev/null +++ b/common/serialization/subtitles2/subtitles2_deser.h @@ -0,0 +1,5 @@ +#pragma once + +#include "common/serialization/subtitles2/subtitles2_ser.h" + +bool write_subtitle_db_to_files(const GameSubtitle2DB& db, const GameVersion game_version); diff --git a/common/serialization/subtitles2/subtitles2_ser.cpp b/common/serialization/subtitles2/subtitles2_ser.cpp new file mode 100644 index 0000000000..18a63197b1 --- /dev/null +++ b/common/serialization/subtitles2/subtitles2_ser.cpp @@ -0,0 +1,192 @@ +#include "subtitles2_ser.h" + +#include "common/goos/ParseHelpers.h" +#include "common/goos/Reader.h" +#include "common/log/log.h" +#include "common/util/FileUtil.h" +#include "common/util/json_util.h" + +// matches enum in `subtitle2.gc` with "none" (first) and "max" (last) removed +const std::vector s_speakers_jak2 = { + "computer", + "jak", + "darkjak", + "daxter", + "samos", + "keira", + "keira-before-class-3", + "kid", + "kor", + "metalkor", + "baron", + "errol", + "torn", + "tess", + "guard", + "guard-a", + "guard-b", + "krew", + "sig", + "brutter", + "vin", + "youngsamos", + "youngsamos-before-rescue", + "pecker", + "onin", + "ashelin", + "jinx", + "mog", + "grim", + "agent", + "citizen-male", + "citizen-female", + "oracle", + "precursor", +}; + +const std::vector get_speaker_names(GameVersion version) { + switch (version) { + case GameVersion::Jak2: + return s_speakers_jak2; + break; + } + throw std::runtime_error( + fmt::format("no speakers for game version {} project", version_to_game_name(version))); +} + +void parse_subtitle2_json(GameSubtitle2DB& db, const GameSubtitle2DefinitionFile& file_info) { + // TODO - some validation + // Init Settings + std::shared_ptr bank; + try { + if (!db.bank_exists(file_info.language_id)) { + // database has no lang yet + bank = db.add_bank(std::make_shared(file_info.language_id)); + } else { + bank = db.bank_by_id(file_info.language_id); + } + bank->text_version = file_info.text_version; + bank->file_path = file_info.file_path; + // Parse the file + auto file = parse_commented_json( + file_util::read_text_file(file_util::get_jak_project_dir() / file_info.file_path), + "subtitle2_json"); + from_json(file, *bank); + } catch (std::exception& e) { + lg::error("Unable to parse subtitle json entry, couldn't successfully load files - {}", + e.what()); + throw; + } +} + +void to_json(json& j, const Subtitle2Line& obj) { + j = json{{"start", obj.start}, {"end", obj.end}, {"offscreen", obj.offscreen}, + {"merge", obj.merge}, {"speaker", obj.speaker}, {"text", obj.text}}; +} +void from_json(const json& j, Subtitle2Line& obj) { + json_deserialize_if_exists(start); + json_deserialize_if_exists(end); + json_deserialize_if_exists(offscreen); + json_deserialize_if_exists(merge); + json_deserialize_if_exists(speaker); + json_deserialize_if_exists(text); +} +void to_json(json& j, const Subtitle2Scene& obj) { + j = json{{"scene", obj.scene}}; + json lines; + for (const auto& line : obj.lines) { + json l; + to_json(l, line); + lines.push_back(l); + } + j["lines"] = obj.lines.size() == 0 ? json::array({}) : lines; +} +void from_json(const json& j, Subtitle2Scene& obj) { + json_deserialize_if_exists(scene); + for (auto& kv : j.at("lines").items()) { + auto& line = obj.lines.emplace_back(); + from_json(kv.value(), line); + } +} +void to_json(json& j, const GameSubtitle2Bank& obj) { + j = json{{"speakers", obj.speakers}, {"lang", obj.lang}}; + json scenes = json::object({}); + for (const auto& [name, scene] : obj.scenes) { + json s; + to_json(s, scene); + scenes[name] = s; + } + j["scenes"] = scenes; +} +void from_json(const json& j, GameSubtitle2Bank& obj) { + json_deserialize_if_exists(speakers); + for (auto& kv : j.at("scenes").items()) { + Subtitle2Scene scene; + from_json(kv.value(), scene); + obj.scenes[kv.key()] = scene; + } + json_deserialize_if_exists(lang); +} + +void open_subtitle2_project(const std::string& kind, + const std::string& filename, + std::vector& subtitle_files) { + goos::Reader reader; + auto& proj = reader.read_from_file({filename}).as_pair()->cdr.as_pair()->car; + if (!proj.is_pair() || !proj.as_pair()->car.is_symbol() || + proj.as_pair()->car.as_symbol()->name != kind) { + throw std::runtime_error(fmt::format("invalid {} project", kind)); + } + + goos::for_each_in_list(proj.as_pair()->cdr, [&](const goos::Object& o) { + if (o.is_pair() && o.as_pair()->cdr.is_pair()) { + auto args = o.as_pair(); + auto& action = args->car.as_symbol()->name; + args = args->cdr.as_pair(); + + if (action == "file-json") { + GameSubtitle2DefinitionFile new_file; + while (true) { + const auto& kwarg = args->car.as_symbol()->name; + args = args->cdr.as_pair(); + if (kwarg == ":language-id") { + new_file.language_id = args->car.as_int(); + } else if (kwarg == ":text-version") { + new_file.text_version = get_text_version_from_name(args->car.as_string()->data); + } else if (kwarg == ":data") { + new_file.file_path = args->car.as_string()->data; + } + if (args->cdr.is_empty_list()) { + break; + } + args = args->cdr.as_pair(); + } + subtitle_files.push_back(new_file); + } else { + throw std::runtime_error(fmt::format("unknown action {} in {} project", action, kind)); + } + } else { + throw std::runtime_error(fmt::format("invalid entry in {} project", kind)); + } + }); +} + +GameSubtitle2DB load_subtitle2_project(GameVersion game_version) { + // Load the subtitle files + GameSubtitle2DB db(game_version); + try { + goos::Reader reader; + std::vector files; + std::string subtitle_project = (file_util::get_jak_project_dir() / "game" / "assets" / + version_to_game_name(game_version) / "game_subtitle.gp") + .string(); + open_subtitle2_project("subtitle2", subtitle_project, files); + for (auto& file : files) { + parse_subtitle2_json(db, file); + } + } catch (std::runtime_error& e) { + lg::error("error loading subtitle project: {}", e.what()); + } + + return db; +} diff --git a/common/serialization/subtitles2/subtitles2_ser.h b/common/serialization/subtitles2/subtitles2_ser.h new file mode 100644 index 0000000000..62a393533f --- /dev/null +++ b/common/serialization/subtitles2/subtitles2_ser.h @@ -0,0 +1,107 @@ +#pragma once + +#include +#include + +#include "common/util/Assert.h" +#include "common/util/FileUtil.h" +#include "common/util/FontUtils.h" +#include "common/util/json_util.h" +#include "common/versions/versions.h" + +const std::vector get_speaker_names(GameVersion version); + +struct Subtitle2Line { + Subtitle2Line() {} + Subtitle2Line(float start, + float end, + const std::string& text, + const std::string& speaker, + bool offscreen, + bool merge) + : start(start), end(end), text(text), speaker(speaker), offscreen(offscreen), merge(merge) {} + + float start, end; + + std::string text; + + // name in enum. saved as int later. + std::string speaker; + + bool offscreen, merge; + + bool operator<(const Subtitle2Line& other) const { + return (start < other.start) || (start == other.start && end < other.end); + } +}; +void to_json(json& j, const Subtitle2Line& obj); +void from_json(const json& j, Subtitle2Line& obj); + +struct Subtitle2Scene { + bool scene = false; + + std::vector lines; +}; +void to_json(json& j, const Subtitle2Scene& obj); +void from_json(const json& j, Subtitle2Scene& obj); + +struct GameSubtitle2Bank { + GameSubtitle2Bank(int lang) : lang(lang) {} + + int lang; + + GameTextVersion text_version = GameTextVersion::JAK2; + std::string file_path; + + std::map speakers; + std::map scenes; + + bool scene_exists(const std::string& name) const { return scenes.find(name) != scenes.end(); } + void add_scene(const std::string& name, Subtitle2Scene& scene) { + ASSERT(!scene_exists(name)); + scenes.insert({name, scene}); + } +}; +void to_json(json& j, const GameSubtitle2Bank& obj); +void from_json(const json& j, GameSubtitle2Bank& obj); + +class GameSubtitle2DB { + public: + GameSubtitle2DB(GameVersion version) : m_version(version) {} + + const std::map>& banks() const { return m_banks; } + + bool bank_exists(int id) const { return m_banks.find(id) != m_banks.end(); } + + std::shared_ptr add_bank(std::shared_ptr bank) { + ASSERT(!bank_exists(bank->lang)); + m_banks[bank->lang] = bank; + return bank; + } + std::shared_ptr bank_by_id(int id) { + if (!bank_exists(id)) { + return nullptr; + } + return m_banks.at(id); + } + + std::map> m_banks; + std::unique_ptr m_subtitle_groups; + + GameVersion version() const { return m_version; } + + private: + GameVersion m_version; +}; + +struct GameSubtitle2DefinitionFile { + std::string file_path = ""; + int language_id = -1; + GameTextVersion text_version = GameTextVersion::JAK2; +}; + +void parse_subtitle2_json(GameSubtitle2DB& db, const GameSubtitle2DefinitionFile& file_info); +void open_subtitle2_project(const std::string& kind, + const std::string& filename, + std::vector& inputs); +GameSubtitle2DB load_subtitle2_project(GameVersion game_version); diff --git a/common/util/FontUtils.cpp b/common/util/FontUtils.cpp index 9a9b6116fa..631c072433 100644 --- a/common/util/FontUtils.cpp +++ b/common/util/FontUtils.cpp @@ -42,6 +42,10 @@ const std::string& get_text_version_name(GameTextVersion version) { throw std::runtime_error(fmt::format("invalid text version {}", fmt::underlying(version))); } +GameTextVersion get_text_version_from_name(const std::string& name) { + return sTextVerEnumMap.at(name); +} + GameTextFontBank::GameTextFontBank(GameTextVersion version, std::vector* encode_info, std::vector* replace_info, @@ -105,7 +109,7 @@ const EncodeInfo* GameTextFontBank::find_encode_to_game(const std::string& in, i } /*! - * Finds a remap info that best matches the byte sequence (is the longest match). + * Finds a remap info that best matches the character sequence (is the longest match). */ const ReplaceInfo* GameTextFontBank::find_replace_to_utf8(const std::string& in, int off) const { const ReplaceInfo* best_info = nullptr; @@ -113,14 +117,8 @@ const ReplaceInfo* GameTextFontBank::find_replace_to_utf8(const std::string& in, if (info.from.empty() || in.size() - off < info.from.size()) continue; - bool found = true; - for (int i = 0; found && i < (int)info.from.size(); ++i) { - if (in.at(i + off) != info.from.at(i)) { - found = false; - } - } - - if (found && (!best_info || info.to.length() > best_info->to.length())) { + bool found = memcmp(in.data() + off, info.from.data(), info.from.size()) == 0; + if (found && (!best_info || info.from.length() > best_info->from.length())) { best_info = &info; } } @@ -133,16 +131,10 @@ const ReplaceInfo* GameTextFontBank::find_replace_to_utf8(const std::string& in, const ReplaceInfo* GameTextFontBank::find_replace_to_game(const std::string& in, int off) const { const ReplaceInfo* best_info = nullptr; for (auto& info : *m_replace_info) { - if (info.to.length() == 0 || in.size() - off < info.to.size()) + if (info.to.empty() || in.size() - off < info.to.size()) continue; - bool found = true; - for (int i = 0; found && i < (int)info.to.length(); ++i) { - if (in.at(i + off) != info.to.at(i)) { - found = false; - } - } - + bool found = memcmp(in.data() + off, info.to.data(), info.to.size()) == 0; if (found && (!best_info || info.to.length() > best_info->to.length())) { best_info = &info; } diff --git a/common/util/FontUtils.h b/common/util/FontUtils.h index 6a4b594d83..7cd7f56986 100644 --- a/common/util/FontUtils.h +++ b/common/util/FontUtils.h @@ -30,6 +30,7 @@ enum class GameTextVersion { extern const std::unordered_map sTextVerEnumMap; const std::string& get_text_version_name(GameTextVersion version); +GameTextVersion get_text_version_from_name(const std::string& name); /*! * What bytes a set of characters (UTF-8) correspond to. You can convert to and fro. diff --git a/common/util/string_util.cpp b/common/util/string_util.cpp index 87683876d3..7b985a7d6c 100644 --- a/common/util/string_util.cpp +++ b/common/util/string_util.cpp @@ -107,6 +107,14 @@ bool replace(std::string& str, const std::string& from, const std::string& to) { return true; } +std::string lower(const std::string& str) { + std::string res; + for (auto c : str) { + res.push_back(tolower(c)); + } + return res; +} + std::string uuid() { static std::random_device dev; static std::mt19937 rng(dev()); diff --git a/common/util/string_util.h b/common/util/string_util.h index f1d24c56fe..a128852334 100644 --- a/common/util/string_util.h +++ b/common/util/string_util.h @@ -21,6 +21,7 @@ std::vector split(const ::std::string& str, char delimiter = '\n'); std::string join(const std::vector& strs, const std::string& join_with); std::vector regex_get_capture_groups(const std::string& str, const std::string& regex); bool replace(std::string& str, const std::string& from, const std::string& to); +std::string lower(const std::string& str); std::string uuid(); std::string repeat(size_t n, const std::string& str); std::string current_local_timestamp(); diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index f987aec740..f14723693f 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -13063,37 +13063,29 @@ (defenum continue-flags :type uint32 :bitfield #t - (cf0 0) - (cf1 1) - (cf2 2) - (cf3 3) - (cf4 4) - (cf5 5) - (cf6 6) - (cf7 7) - (cf8 8) - (cf9 9) - (cf10 10) - (cf11 11) - (cf12 12) - (cf13 13) - (cf14 14) - (cf15 15) - (cf16 16) - (cf17 17) - (cf18 18) - (cf19 19) - (cf20 20) - (cf21 21) - (cf22 22) - (cf23 23) - (cf24 24) - (cf25 25) - (cf26 26) - (cf27 27) - (cf28 28) - (cf29 29) - (cf30 30) + ;(continue-flag-0 0) + (scene-wait 1) + (change-continue 2) + (no-auto 3) + (no-blackout 4) + (game-start 5) + (demo-end 6) + (warp-gate 7) + (demo 8) + (intro 9) + (hero-mode 10) + (demo-movie 11) + (title 12) + (title-movie 13) + (continue-flag-14 14) + (continue-flag-15 15) + (continue-flag-16 16) + (test 17) + (record-path 18) + (pilot 19) + (pilot-dax 20) + (record-sig 21) + (indax 22) ) (deftype continue-point (basic) @@ -13367,6 +13359,7 @@ (subtitle 69) (supertitle 70) (notice-low 71) + (subtitle-pc 78) ;; custom (screen 79) (hud-upper-right 80) (hud-upper-left 81) @@ -13441,7 +13434,7 @@ (stop-str (_type_ gui-connection) int 11) (gui-control-method-12 (_type_ process gui-channel gui-action string int float sound-id) sound-id 12) (update (_type_ symbol) int 13) - (lookup-gui-connection-id (_type_ string gui-channel gui-action) int 14) + (lookup-gui-connection-id (_type_ string gui-channel gui-action) sound-id 14) (lookup-gui-connection (_type_ process gui-channel string sound-id) gui-connection 15) (set-action! (_type_ gui-action sound-id gui-channel gui-action string (function gui-connection symbol) process) int 16) (get-status (_type_ sound-id) gui-status 17) @@ -30209,7 +30202,7 @@ (define-extern entity-by-name (function string entity)) (define-extern entity-by-type (function type entity-actor)) (define-extern entity-by-aid (function uint entity)) -(define-extern entity-actor-from-level-name (function level entity-actor)) +(define-extern entity-actor-from-level-name (function symbol entity-actor)) (define-extern entity-nav-mesh-by-aid (function actor-id entity-nav-mesh)) (define-extern nav-mesh-from-res-tag (function entity symbol int nav-mesh)) (define-extern entity-by-meters (function float float float entity-actor)) @@ -30227,7 +30220,7 @@ (define-extern *pid-string* string) (define-extern debug-actor (function string none)) (define-extern draw-actor-marks (function process none)) -(define-extern init-entity (function process entity-actor process none)) +(define-extern init-entity (function process entity-actor type none)) ;; (define-extern entity-deactivate-handler function) ;; (function process entity-actor none) (define-extern check-for-rougue-process (function process int int level none)) (define-extern process-drawable-scale-from-entity! (function process-drawable entity none)) @@ -32779,7 +32772,7 @@ (enemy-flag36 36) (enemy-flag37 37) (enemy-flag38 38) - (enemy-flag39 39) + (not-frustrated 39) (enemy-flag40 40) (enemy-flag41 41) (enemy-flag42 42) @@ -36133,7 +36126,7 @@ (kick-attack () _type_ :state 158) (attack () _type_ :state 159) (die-now () _type_ :state 160) - (shoot (_type_ vector projectile-init-by-other-params int float float) none 161) + (shoot (_type_ vector projectile-init-by-other-params int int float) none 161) (crimson-guard-hover-method-162 (_type_ process-focusable) symbol 162) ) ) @@ -41516,7 +41509,7 @@ (deftype sew-scare-grunt (grunt) ((anim spool-anim :offset-assert 692) (manipy (pointer manipy) :offset-assert 696) - (spooled-sound-id uint32 :offset-assert 700) + (spooled-sound-id sound-id :offset-assert 700) (grill-actor entity-actor :offset-assert 704) ) :method-count-assert 188 @@ -46196,7 +46189,7 @@ (deftype tomb-vibe (process-drawable) ((spawn-pos vector :inline :offset-assert 208) - (pat-tbl (array handle) :offset-assert 224) ;; pattern-table + (pat-tbl (pointer int32) :offset-assert 224) ;; pattern-table (pat-count int32 :offset-assert 228) (pat-index int32 :offset-assert 232) (pat-entry-index int32 :offset-assert 236) @@ -47743,13 +47736,23 @@ ) ) +(defenum under-locking-mode + :type int64 + (want-mech) + (want-fill) + (airlock-wait) + (want-drain) + (drain) + (want-exit-mech) + ) + (deftype under-locking (process-drawable) ((id int8 :offset-assert 200) (up-y float :offset-assert 204) (down-y float :offset-assert 208) - (mode uint64 :offset-assert 216) + (mode under-locking-mode :offset-assert 216) (which-reminder? symbol :offset-assert 224) - (spooled-sound-id uint32 :offset-assert 228) + (spooled-sound-id sound-id :offset-assert 228) (draining-part sparticle-launch-control :offset-assert 232) (actor-group (pointer actor-group) :offset-assert 236) (spooled-sound-delay int32 :offset-assert 240) diff --git a/decompiler/config/jak2/ntsc_v1/type_casts.jsonc b/decompiler/config/jak2/ntsc_v1/type_casts.jsonc index bc6a61f543..6405e4ac9e 100644 --- a/decompiler/config/jak2/ntsc_v1/type_casts.jsonc +++ b/decompiler/config/jak2/ntsc_v1/type_casts.jsonc @@ -553,8 +553,7 @@ ], "print-game-text": [ [225, "v1", "float"], - [241, "v1", "float"], - [[324, 327], "v1", "dma-packet"] + [241, "v1", "float"] ], "fx-copy-buf": [ [[2, 8], "a2", "dma-packet"], diff --git a/decompiler/data/game_text.cpp b/decompiler/data/game_text.cpp index e685440880..7a145a2e44 100644 --- a/decompiler/data/game_text.cpp +++ b/decompiler/data/game_text.cpp @@ -446,44 +446,95 @@ std::string write_spool_subtitles( file_util::create_dir_if_needed(image_out); } - for (auto& [spool_name, subs] : data) { - int image_count = 0; - result += "(\"" + spool_name + "\"\n"; - for (auto& sub : subs) { - std::string temp_for_indent = fmt::format(" (({} {}) (", float_to_string(sub.start_frame), - float_to_string(sub.end_frame)); - auto indent = temp_for_indent.length(); - result += temp_for_indent; - for (int i = 0; i < 8; ++i) { - const auto& msg = sub.message[i]; - if (i > 0) { - result += "\n" + std::string(indent, ' '); + constexpr bool as_json = true; + if constexpr (as_json) { + constexpr bool dump_text = false; + constexpr int lang = 0; + // no line data + bool has_spools = false; + for (auto& [spool_name, subs] : data) { + result += " \"" + spool_name + "\": {\n"; + result += " \"scene\": true,\n"; + result += " \"lines\": [\n"; + bool has_subs = false; + for (auto& sub : subs) { + const auto& msg = sub.message[lang]; + if (msg.kind != SpoolSubtitleMessage::Kind::STRING) { + continue; } - if (msg.kind == SpoolSubtitleMessage::Kind::NIL) { - result += "#f"; + result += " {\n"; + result += " \"end\": " + float_to_string(sub.end_frame) + ",\n"; + if (dump_text) { + result += " \"merge\": false,\n"; } else { - result += "("; - if (msg.kind == SpoolSubtitleMessage::Kind::IMAGE) { - auto img_name = fmt::format("{}-{}-{}.png", spool_name, i, image_count++); - result += "image " + img_name; - if (dump_images) { - std::vector rgba_out; - rgba_out.resize(msg.w * msg.h); - for (int px = 0; px < (int)rgba_out.size(); ++px) { - int idx = px & 1 ? msg.data[px / 2] >> 4 : msg.data[px / 2] & 0xf; - rgba_out.at(px) = msg.palette[idx]; - } - file_util::write_rgba_png(image_out / img_name, rgba_out.data(), msg.w, msg.h); - } - } else if (msg.kind == SpoolSubtitleMessage::Kind::STRING) { - result += "\"" + msg.text + "\""; - } - result += ")"; + result += " \"merge\": true,\n"; } + result += " \"offscreen\": false,\n"; + result += " \"speaker\": \"none\",\n"; + result += " \"start\": " + float_to_string(sub.start_frame) + ",\n"; + if (dump_text) { + result += " \"text\": \"" + msg.text + "\"\n"; + } else { + result += " \"text\": \"\"\n"; + } + result += " },\n"; + has_subs = true; } - result += ")\n )\n"; + if (has_subs) { + result.pop_back(); + result.pop_back(); + result.push_back('\n'); + } + + result += " ]\n"; + result += " },\n"; + has_spools = true; + } + if (has_spools) { + result.pop_back(); + result.pop_back(); + result.push_back('\n'); + } + } else { + for (auto& [spool_name, subs] : data) { + int image_count = 0; + result += "(\"" + spool_name + "\"\n"; + for (auto& sub : subs) { + std::string temp_for_indent = fmt::format(" (({} {}) (", float_to_string(sub.start_frame), + float_to_string(sub.end_frame)); + auto indent = temp_for_indent.length(); + result += temp_for_indent; + for (int i = 0; i < 8; ++i) { + const auto& msg = sub.message[i]; + if (i > 0) { + result += "\n" + std::string(indent, ' '); + } + if (msg.kind == SpoolSubtitleMessage::Kind::NIL) { + result += "#f"; + } else { + result += "("; + if (msg.kind == SpoolSubtitleMessage::Kind::IMAGE) { + auto img_name = fmt::format("{}-{}-{}.png", spool_name, i, image_count++); + result += fmt::format("image \"{}\"", img_name); + if (dump_images) { + std::vector rgba_out; + rgba_out.resize(msg.w * msg.h); + for (int px = 0; px < (int)rgba_out.size(); ++px) { + int idx = px & 1 ? msg.data[px / 2] >> 4 : msg.data[px / 2] & 0xf; + rgba_out.at(px) = msg.palette[idx]; + } + file_util::write_rgba_png(image_out / img_name, rgba_out.data(), msg.w, msg.h); + } + } else if (msg.kind == SpoolSubtitleMessage::Kind::STRING) { + result += "\"" + msg.text + "\""; + } + result += ")"; + } + } + result += ")\n )\n"; + } + result += " )\n\n"; } - result += " )\n\n"; } return result; diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 1a373ab71b..548feb4bf6 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -213,6 +213,7 @@ set(RUNTIME_SOURCE system/vm/vm.cpp tools/filter_menu/filter_menu.cpp tools/subtitles/subtitle_editor.cpp + tools/subtitles2/subtitle2_editor.cpp ) add_subdirectory(sound) diff --git a/game/assets/fonts/LICENSE.txt b/game/assets/fonts/LICENSE.txt deleted file mode 100644 index d645695673..0000000000 --- a/game/assets/fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/game/assets/fonts/NotoSansJP-Medium.ttf b/game/assets/fonts/NotoSansJP-Medium.ttf new file mode 100644 index 0000000000..1d89aefe9c Binary files /dev/null and b/game/assets/fonts/NotoSansJP-Medium.ttf differ diff --git a/game/assets/fonts/OFL.txt b/game/assets/fonts/OFL.txt new file mode 100644 index 0000000000..5ff8c809ea --- /dev/null +++ b/game/assets/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source' + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/game/assets/fonts/Roboto-Medium.ttf b/game/assets/fonts/Roboto-Medium.ttf deleted file mode 100644 index 39c63d7461..0000000000 Binary files a/game/assets/fonts/Roboto-Medium.ttf and /dev/null differ diff --git a/game/assets/jak2/game_subtitle.gp b/game/assets/jak2/game_subtitle.gp new file mode 100644 index 0000000000..e526d900c2 --- /dev/null +++ b/game/assets/jak2/game_subtitle.gp @@ -0,0 +1,10 @@ +;; "project file" for subtitles make tool. + +(subtitle2 + (file-json :text-version "jak2" :language-id 0 + :data "game/assets/jak2/subtitle/subtitle_en-US.json") + (file-json :text-version "jak2" :language-id 5 + :data "game/assets/jak2/subtitle/subtitle_jp-JP.json") + ) + + diff --git a/game/assets/jak2/subtitle/subtitle_en-US.json b/game/assets/jak2/subtitle/subtitle_en-US.json new file mode 100644 index 0000000000..f591452213 --- /dev/null +++ b/game/assets/jak2/subtitle/subtitle_en-US.json @@ -0,0 +1,25553 @@ +{ + "lang": 0, + "scenes": { + "DSbop002": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Do you remember how to jump?" + } + ], + "scene": false + }, + "DSbop003": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Jump onto that crate to get over the barricade." + } + ], + "scene": false + }, + "DSbop004": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooh, that's a high ledge!" + }, + { + "end": 118.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 50.0, + "text": "Try jumping once, then jump again while in the air" + }, + { + "end": 149.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 119.0, + "text": "to reach that one." + } + ], + "scene": false + }, + "DSbop010": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There are lots of Krimzon Guard crates lying around" + }, + { + "end": 115.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 59.0, + "text": "for the taking. Break that crate!" + } + ], + "scene": false + }, + "DSbop011": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Good job! That crate had a health pack inside." + }, + { + "end": 155.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 79.0, + "text": "Pick it up, you'll wanna keep healthy, Jak, or uh heh..." + }, + { + "end": 189.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 156.0, + "text": "who'll do the fighting?" + } + ], + "scene": false + }, + "DSbop016": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "If you jump then dive, you'll crash down to the ground" + }, + { + "end": 128.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 71.0, + "text": "hard enough to break lots of things." + }, + { + "end": 170.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 129.0, + "text": "Breaking stuff's fun, right?" + } + ], + "scene": false + }, + "DSbop017": { + "lines": [ + { + "end": 75.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Dodge, Jak! Do your, uh... stuff." + } + ], + "scene": false + }, + "agnt001": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Hey hey, drive carefully!" + } + ], + "scene": false + }, + "agnt002": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Look out!" + } + ], + "scene": false + }, + "agnt003": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Watch it!" + } + ], + "scene": false + }, + "agnt004": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Whoa whoa whoa whoa!" + } + ], + "scene": false + }, + "agnt005": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Whoa!" + } + ], + "scene": false + }, + "agnt006": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "You're crazy!" + } + ], + "scene": false + }, + "agnt007": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Are you out of your mind!?" + } + ], + "scene": false + }, + "agnt008": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Watch out!" + } + ], + "scene": false + }, + "agnt009": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "That one hurt!" + } + ], + "scene": false + }, + "agnt010": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Stay sharp, we've got a tough part of town coming up." + } + ], + "scene": false + }, + "agnt011": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Now we're in for it!" + } + ], + "scene": false + }, + "agnt012": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "You're wasting citizens!" + } + ], + "scene": false + }, + "agnt013": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Don't hit the civvies, man!" + } + ], + "scene": false + }, + "agnt014": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "agent", + "start": 0.0, + "text": "Man, you are hitting people!" + } + ], + "scene": false + }, + "asha001": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Payback's a bitch, and I'm it." + } + ], + "scene": false + }, + "asha002": { + "lines": [ + { + "end": 81.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Watch your ass, I'm only woman on the outside." + } + ], + "scene": false + }, + "asha003": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Let me knock you down to size..." + }, + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 59.0, + "text": "Not that you have any." + } + ], + "scene": false + }, + "asha004": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Small guns don't get me going." + } + ], + "scene": false + }, + "asha005": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "That's a tiny gun..." + } + ], + "scene": false + }, + "asha006": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "You don't know who you're dealing with." + } + ], + "scene": false + }, + "asha007": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "I never said you could touch me there." + } + ], + "scene": false + }, + "asha008": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Take that!" + } + ], + "scene": false + }, + "asha009": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Here's some." + } + ], + "scene": false + }, + "asha010": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Ready for another?" + } + ], + "scene": false + }, + "asha011": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "How's that feel?" + } + ], + "scene": false + }, + "asha012": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Seems like it hurts." + } + ], + "scene": false + }, + "asha013": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Oh, that hurt." + } + ], + "scene": false + }, + "asha014": { + "lines": [ + { + "end": 11.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Ugh!" + } + ], + "scene": false + }, + "asha015": { + "lines": [ + { + "end": 9.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Ough!" + } + ], + "scene": false + }, + "asha016": { + "lines": [ + { + "end": 10.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Ah!" + } + ], + "scene": false + }, + "asha017": { + "lines": [ + { + "end": 10.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Agh!" + } + ], + "scene": false + }, + "asha018": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Hit me again and you'll lose something really valuable!" + } + ], + "scene": false + }, + "asha019": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Not smart!" + } + ], + "scene": false + }, + "asha020": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Listen, buddy, whose side are you on?" + } + ], + "scene": false + }, + "asha021": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Don't make me hurt you." + } + ], + "scene": false + }, + "asha022": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Do that again and I'll put you down." + } + ], + "scene": false + }, + "asha023": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Learn to control your gun, buddy." + } + ], + "scene": false + }, + "asha024": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Where'd you learn to fight?" + } + ], + "scene": false + }, + "asha025": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Check your targets, mister." + } + ], + "scene": false + }, + "asha026": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Don't do that again." + } + ], + "scene": false + }, + "asha027": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Maybe I should be behind you." + } + ], + "scene": false + }, + "asha028": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "I won't take that!" + } + ], + "scene": false + }, + "asha029": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Another one like that and you'll be singing soprano." + } + ], + "scene": false + }, + "asha030": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Have some back." + } + ], + "scene": false + }, + "asha031": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Don't do that again!" + } + ], + "scene": false + }, + "asha032": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Nice shooting." + } + ], + "scene": false + }, + "asha033": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Good shooting, blue boy." + } + ], + "scene": false + }, + "asha034": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Good work." + } + ], + "scene": false + }, + "asha035": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Take 'em all down!" + } + ], + "scene": false + }, + "asha036": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Let's get 'em!" + } + ], + "scene": false + }, + "asha037": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Here they come!" + } + ], + "scene": false + }, + "asha038": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "I need some help!" + } + ], + "scene": false + }, + "asha039": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Man, there are a lot of 'em!" + } + ], + "scene": false + }, + "asha040": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "More coming." + } + ], + "scene": false + }, + "asha041": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "I got him." + } + ], + "scene": false + }, + "asha042": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "More firepower!" + } + ], + "scene": false + }, + "asha043": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "One more down!" + } + ], + "scene": false + }, + "asha044": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Help me out!" + } + ], + "scene": false + }, + "asha045": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "They're out-flanking us!" + } + ], + "scene": false + }, + "asha046": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "We're surrounded!" + } + ], + "scene": false + }, + "asha047": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Shoot! Shoot!" + } + ], + "scene": false + }, + "asha048": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "It's not looking good." + } + ], + "scene": false + }, + "asha049": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Help me!" + } + ], + "scene": false + }, + "asha050": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Here's one for my father!" + } + ], + "scene": false + }, + "asha051": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Damn Metal Heads..." + } + ], + "scene": false + }, + "asha052": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Bullseye." + } + ], + "scene": false + }, + "asha053": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "There's some more of those things!" + } + ], + "scene": false + }, + "asha054": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Get 'em all!" + } + ], + "scene": false + }, + "asha055": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Ugh..." + } + ], + "scene": false + }, + "asha056": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Hm-agh..." + } + ], + "scene": false + }, + "asha057": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "Hah...agh..." + } + ], + "scene": false + }, + "asht002": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "You were right, Jak. What my father's doing is wrong." + }, + { + "end": 166.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 79.0, + "text": "I need to help fix this. If you get to the Weapons Factory," + }, + { + "end": 239.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 167.0, + "text": "maybe we can stop him. I'll meet you there." + } + ], + "scene": false + }, + "asht006": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 0.0, + "text": "I think now's the time to act." + }, + { + "end": 114.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 43.0, + "text": "The Metal Heads are so focused on attacking the city," + }, + { + "end": 168.0, + "merge": false, + "offscreen": true, + "speaker": "ashelin", + "start": 115.0, + "text": "they may have left their nest vulnerable." + }, + { + "end": 237.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 169.0, + "text": "Jak, you've got to get out to the Wasteland" + }, + { + "end": 333.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 238.0, + "text": "and breach the Nest barrier any way you can." + }, + { + "end": 422.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 334.0, + "text": "Maybe if you get inside and take out the Metal Head leader" + }, + { + "end": 500.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 423.0, + "text": "the army will collapse. It's a long shot," + }, + { + "end": 550.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 501.0, + "text": "but it might be our only chance." + } + ], + "scene": false + }, + "atoll-1-int": { + "lines": [ + { + "end": 185.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 15.0, + "text": "" + }, + { + "end": 270.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 230.0, + "text": "" + }, + { + "end": 497.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 414.0, + "text": "" + }, + { + "end": 638.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 498.0, + "text": "" + }, + { + "end": 688.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 639.0, + "text": "" + }, + { + "end": 795.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 689.0, + "text": "" + }, + { + "end": 845.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 796.0, + "text": "" + }, + { + "end": 902.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 848.0, + "text": "" + }, + { + "end": 1027.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 903.0, + "text": "" + }, + { + "end": 1156.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1036.0, + "text": "" + }, + { + "end": 1264.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1157.0, + "text": "" + }, + { + "end": 1357.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1270.0, + "text": "" + }, + { + "end": 1400.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1358.0, + "text": "" + }, + { + "end": 1520.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1401.0, + "text": "" + }, + { + "end": 1597.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1521.0, + "text": "" + }, + { + "end": 1690.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1598.0, + "text": "" + }, + { + "end": 1751.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1691.0, + "text": "" + }, + { + "end": 1851.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1752.0, + "text": "" + }, + { + "end": 1973.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1852.0, + "text": "" + }, + { + "end": 2051.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1975.0, + "text": "" + } + ], + "scene": true + }, + "atoll-1-res": { + "lines": [ + { + "end": 90.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 14.0, + "text": "" + }, + { + "end": 762.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 699.0, + "text": "" + }, + { + "end": 870.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 814.0, + "text": "" + }, + { + "end": 1004.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 920.0, + "text": "" + }, + { + "end": 1508.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1331.0, + "text": "" + } + ], + "scene": true + }, + "atoll-2-intro": { + "lines": [ + { + "end": 208.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 33.0, + "text": "" + }, + { + "end": 252.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 218.0, + "text": "" + }, + { + "end": 388.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 253.0, + "text": "" + }, + { + "end": 516.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 389.0, + "text": "" + }, + { + "end": 658.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 517.0, + "text": "" + }, + { + "end": 764.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 660.0, + "text": "" + }, + { + "end": 897.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 765.0, + "text": "" + }, + { + "end": 1039.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 898.0, + "text": "" + }, + { + "end": 1116.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1041.0, + "text": "" + }, + { + "end": 1206.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1119.0, + "text": "" + }, + { + "end": 1288.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1207.0, + "text": "" + }, + { + "end": 1380.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1289.0, + "text": "" + }, + { + "end": 1497.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1381.0, + "text": "" + }, + { + "end": 1652.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1516.0, + "text": "" + }, + { + "end": 1766.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1671.0, + "text": "" + }, + { + "end": 1908.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1774.0, + "text": "" + }, + { + "end": 1978.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1909.0, + "text": "" + }, + { + "end": 2025.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1983.0, + "text": "" + }, + { + "end": 2148.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2026.0, + "text": "" + }, + { + "end": 2176.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2150.0, + "text": "" + } + ], + "scene": true + }, + "atoll-3-intro": { + "lines": [ + { + "end": 131.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 18.0, + "text": "" + }, + { + "end": 256.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 132.0, + "text": "" + }, + { + "end": 310.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 257.0, + "text": "" + }, + { + "end": 353.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 315.0, + "text": "" + }, + { + "end": 421.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 361.0, + "text": "" + }, + { + "end": 535.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 440.0, + "text": "" + }, + { + "end": 645.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 543.0, + "text": "" + }, + { + "end": 759.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 653.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 760.0, + "text": "" + }, + { + "end": 1013.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 851.0, + "text": "" + } + ], + "scene": true + }, + "atoll-save-ashelin-res-a": { + "lines": [ + { + "end": 118.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 48.0, + "text": "" + }, + { + "end": 197.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 119.0, + "text": "" + }, + { + "end": 269.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 198.0, + "text": "" + }, + { + "end": 341.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 301.0, + "text": "" + }, + { + "end": 475.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 377.0, + "text": "" + }, + { + "end": 537.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 476.0, + "text": "" + }, + { + "end": 653.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 538.0, + "text": "" + }, + { + "end": 723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 654.0, + "text": "" + }, + { + "end": 802.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 728.0, + "text": "" + }, + { + "end": 879.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 804.0, + "text": "" + }, + { + "end": 988.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 884.0, + "text": "" + } + ], + "scene": true + }, + "atoll-save-ashelin-res-b": { + "lines": [ + { + "end": 183.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 8.0, + "text": "" + }, + { + "end": 361.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 207.0, + "text": "" + }, + { + "end": 464.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 362.0, + "text": "" + }, + { + "end": 553.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 468.0, + "text": "" + }, + { + "end": 617.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 554.0, + "text": "" + }, + { + "end": 646.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 618.0, + "text": "" + }, + { + "end": 756.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 648.0, + "text": "" + }, + { + "end": 892.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 757.0, + "text": "" + }, + { + "end": 1002.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 918.0, + "text": "" + }, + { + "end": 1073.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1003.0, + "text": "" + }, + { + "end": 1208.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1074.0, + "text": "" + }, + { + "end": 1265.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1214.0, + "text": "" + }, + { + "end": 1315.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1270.0, + "text": "" + }, + { + "end": 1459.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1359.0, + "text": "" + } + ], + "scene": true + }, + "atoll-sig-intro": { + "lines": [ + { + "end": 172.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 96.0, + "text": "" + }, + { + "end": 303.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 173.0, + "text": "" + } + ], + "scene": true + }, + "atoll-sniper-e": { + "lines": [ + { + "end": 267.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 186.0, + "text": "" + }, + { + "end": 383.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 268.0, + "text": "" + }, + { + "end": 503.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 384.0, + "text": "" + } + ], + "scene": true + }, + "bar004": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Go!" + } + ], + "scene": false + }, + "bb01fail": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 0.0, + "text": "I think you should practice more." + } + ], + "scene": false + }, + "bb01int": { + "lines": [ + { + "end": 92.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 0.0, + "text": "Jak, this is Torn. The Underground needs good drivers" + }, + { + "end": 175.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 93.0, + "text": "for our vehicle missions. Prove your skills on the" + }, + { + "end": 284.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 176.0, + "text": "ring challenge and maybe we'll let you in on the action." + } + ], + "scene": false + }, + "bb01win": { + "lines": [ + { + "end": 68.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 0.0, + "text": "Not bad, I think we can use ya." + }, + { + "end": 134.0, + "merge": false, + "offscreen": true, + "speaker": "torn", + "start": 69.0, + "text": "Here's a little reward for your effort." + } + ], + "scene": false + }, + "bf001": { + "lines": [ + { + "end": 90.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "My shield is impervious to your attacks!" + } + ], + "scene": false + }, + "bf002": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You cannot hurt me!" + } + ], + "scene": false + }, + "bf003": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Fool! Nothing can touch me!" + } + ], + "scene": false + }, + "bf004": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You're powerless!" + } + ], + "scene": false + }, + "bf005": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "There is nothing you can do!" + } + ], + "scene": false + }, + "bf006": { + "lines": [ + { + "end": 105.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "HAHAHAHAHAHA!" + } + ], + "scene": false + }, + "bf007": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "HAHAHAHA!" + } + ], + "scene": false + }, + "bf008": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Come get me!" + } + ], + "scene": false + }, + "bf009": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Come closer!" + } + ], + "scene": false + }, + "bf010": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Try me now!" + } + ], + "scene": false + }, + "bf011": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Let's make this personal!" + } + ], + "scene": false + }, + "bf012": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Surprise!" + } + ], + "scene": false + }, + "bf013": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Don't fall!" + } + ], + "scene": false + }, + "bf014": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I will crush you!" + } + ], + "scene": false + }, + "bf015": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Take this!" + } + ], + "scene": false + }, + "bf016": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Here I come!" + } + ], + "scene": false + }, + "bf017": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Why won't you die?!" + } + ], + "scene": false + }, + "bf018": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Your Dark Eco powers surprise me!" + } + ], + "scene": false + }, + "bf019": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Your arrogance will be your downfall!" + } + ], + "scene": false + }, + "bf020": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "The Stone is mine!" + } + ], + "scene": false + }, + "bf021": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Give me the Stone!" + } + ], + "scene": false + }, + "bf022": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Release it!" + } + ], + "scene": false + }, + "bf023": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I want the Stone!" + } + ], + "scene": false + }, + "bf024": { + "lines": [ + { + "end": 62.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Argh, let go!" + } + ], + "scene": false + }, + "bf025": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "It's mine!" + } + ], + "scene": false + }, + "bf026": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Try these on for size!" + } + ], + "scene": false + }, + "bf027": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Here's a little present!" + } + ], + "scene": false + }, + "bf028": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Want some more?" + } + ], + "scene": false + }, + "bf029": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I grow tired of this, now you die!" + } + ], + "scene": false + }, + "bf030": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You cannot run away from these!" + } + ], + "scene": false + }, + "bf031": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Allow me to share the pain!" + } + ], + "scene": false + }, + "bf032": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now you're mine!" + } + ], + "scene": false + }, + "bf033": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Here's some hell!" + } + ], + "scene": false + }, + "bf034": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Say good night!" + } + ], + "scene": false + }, + "bf035": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Enjoy your next life!" + } + ], + "scene": false + }, + "bf036": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "It's over!" + } + ], + "scene": false + }, + "bf037": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Burn in hell!" + } + ], + "scene": false + }, + "bf038": { + "lines": [ + { + "end": 127.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "The Stone is mine! Let me show you what it can do!" + } + ], + "scene": false + }, + "bf039": { + "lines": [ + { + "end": 108.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now you see the Stone's power in capable hands!" + } + ], + "scene": false + }, + "bf040": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "How's that for power?" + } + ], + "scene": false + }, + "bf041": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now you see!" + } + ], + "scene": false + }, + "bf042": { + "lines": [ + { + "end": 83.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I am invincible now!" + } + ], + "scene": false + }, + "bf043": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You cannot run forever!" + } + ], + "scene": false + }, + "bf044": { + "lines": [ + { + "end": 84.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I have all the power I need!" + } + ], + "scene": false + }, + "bf045": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You can't avoid this!" + } + ], + "scene": false + }, + "bf046": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Here's a little something special!" + } + ], + "scene": false + }, + "bf047": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Come to me!" + } + ], + "scene": false + }, + "bf048": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Come here!" + } + ], + "scene": false + }, + "bf049": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Let's get closer!" + } + ], + "scene": false + }, + "bf050": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Nothing can save you now!" + } + ], + "scene": false + }, + "bf051": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You're history!" + } + ], + "scene": false + }, + "bf052": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I am the city's savior, not you!" + } + ], + "scene": false + }, + "bf053": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Die!" + } + ], + "scene": false + }, + "bf054": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "It's over!" + } + ], + "scene": false + }, + "bf055": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I've got you!" + } + ], + "scene": false + }, + "bf056": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now you die!" + } + ], + "scene": false + }, + "bf057": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "NOOOOOO!" + } + ], + "scene": false + }, + "bf058": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "bf059": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "NO!" + } + ], + "scene": false + }, + "bf060": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Uorghh!" + } + ], + "scene": false + }, + "bf061": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Ahh!" + } + ], + "scene": false + }, + "bf062": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Ungh!" + } + ], + "scene": false + }, + "bf063": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Raghh!" + } + ], + "scene": false + }, + "bf064": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "We finish this now!" + } + ], + "scene": false + }, + "bf065": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Eat this!" + } + ], + "scene": false + }, + "bf066": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Stop!" + } + ], + "scene": false + }, + "bf067": { + "lines": [ + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You idiot, you're no match for me!" + } + ], + "scene": false + }, + "bf068": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Why don't you die!?" + } + ], + "scene": false + }, + "bf069": { + "lines": [ + { + "end": 60.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Give up and I'll make it painless!" + } + ], + "scene": false + }, + "bf070": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You cannot win!" + } + ], + "scene": false + }, + "bf071": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Aha!" + } + ], + "scene": false + }, + "bf072": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Haha!" + } + ], + "scene": false + }, + "bf073": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "AH!" + } + ], + "scene": false + }, + "bf074": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Urgh!" + } + ], + "scene": false + }, + "bf075": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You can do better than that!" + } + ], + "scene": false + }, + "bf076": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You're mine!" + } + ], + "scene": false + }, + "bf077": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Why won't you die!?" + } + ], + "scene": false + }, + "bf078": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I have the ultimate power!" + } + ], + "scene": false + }, + "bf079": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Die!" + } + ], + "scene": false + }, + "bf080": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Is that your best shot?" + } + ], + "scene": false + }, + "bf081": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now you die!" + } + ], + "scene": false + }, + "bf082": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Get off my tower!" + } + ], + "scene": false + }, + "bf083": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "We'll see about that!" + } + ], + "scene": false + }, + "bf084": { + "lines": [ + { + "end": 83.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You really think you have a chance?" + } + ], + "scene": false + }, + "bf085": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Fear me!" + } + ], + "scene": false + }, + "bf086": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You're nothing!" + } + ], + "scene": false + }, + "bf087": { + "lines": [ + { + "end": 79.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "My shield is now recharged!" + } + ], + "scene": false + }, + "bf088": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Try these on for size!" + } + ], + "scene": false + }, + "bf089": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I should have killed you long ago!" + } + ], + "scene": false + }, + "bf090": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Never a dull moment, eh?" + } + ], + "scene": false + }, + "bf091": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Stand still!" + } + ], + "scene": false + }, + "bf092": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Go back to wherever you came from!" + } + ], + "scene": false + }, + "bf093": { + "lines": [ + { + "end": 104.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You're both going to die by my hand!" + } + ], + "scene": false + }, + "bf094": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Come closer!" + } + ], + "scene": false + }, + "bf095": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "To the end!" + } + ], + "scene": false + }, + "bf096": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You cannot win!" + } + ], + "scene": false + }, + "bf097": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Come here!" + } + ], + "scene": false + }, + "bf098": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "ARGHHH!" + } + ], + "scene": false + }, + "bf099": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "URGHH!" + } + ], + "scene": false + }, + "bf100": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Urgh!" + } + ], + "scene": false + }, + "bf101": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Oof!" + } + ], + "scene": false + }, + "bf102": { + "lines": [ + { + "end": 62.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Noooo!" + } + ], + "scene": false + }, + "bf103": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "bf104": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Not again!" + } + ], + "scene": false + }, + "bf105": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "It can't be!" + } + ], + "scene": false + }, + "bf106": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Not this time!" + } + ], + "scene": false + }, + "bf107": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Stop!" + } + ], + "scene": false + }, + "bf108": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Damn!" + } + ], + "scene": false + }, + "bf109": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Why, you little...!" + } + ], + "scene": false + }, + "bf110": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now you've made me angry!" + } + ], + "scene": false + }, + "bf111": { + "lines": [ + { + "end": 92.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Impressive, but let's try that again!" + } + ], + "scene": false + }, + "bf112": { + "lines": [ + { + "end": 101.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "The stronger man always wins!" + } + ], + "scene": false + }, + "bf113": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Your loss was inevitable, Jak!" + } + ], + "scene": false + }, + "bf114": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You could never be a baron!" + } + ], + "scene": false + }, + "bf115": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I knew you were weak!" + } + ], + "scene": false + }, + "bf116": { + "lines": [ + { + "end": 102.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Hm, I expected more from you!" + } + ], + "scene": false + }, + "bf117": { + "lines": [ + { + "end": 86.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Losing is for the weak!" + } + ], + "scene": false + }, + "bf118": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "How pathetic!" + } + ], + "scene": false + }, + "bf119": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "That was too easy!" + } + ], + "scene": false + }, + "bf120": { + "lines": [ + { + "end": 100.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Sorry, old boy, it's just war!" + } + ], + "scene": false + }, + "bf121": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Too bad you don't have what it takes!" + } + ], + "scene": false + }, + "bf122": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "The better man won!" + } + ], + "scene": false + }, + "bf123": { + "lines": [ + { + "end": 119.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "We're similar, Jak... oh, except you're dead!" + } + ], + "scene": false + }, + "bf124": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Feel the fury of the Precursor Stone!" + } + ], + "scene": false + }, + "bf125": { + "lines": [ + { + "end": 144.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "With the Stone's power, I am invincible!" + } + ], + "scene": false + }, + "bf126": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "All will fear me now!" + } + ], + "scene": false + }, + "bf127": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Time to die!" + } + ], + "scene": false + }, + "bf128": { + "lines": [ + { + "end": 81.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "My little friends will take care of you!" + } + ], + "scene": false + }, + "bf129": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You can't run forever, Jak!" + } + ], + "scene": false + }, + "bf130": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Now I've got you!" + } + ], + "scene": false + }, + "bf131": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Surprise!" + } + ], + "scene": false + }, + "bf132": { + "lines": [ + { + "end": 121.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "I have better things to do than waste my time with you!" + } + ], + "scene": false + }, + "bf133": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "You are nothing!" + } + ], + "scene": false + }, + "bf134": { + "lines": [ + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Annoying insect, die!" + } + ], + "scene": false + }, + "bf135": { + "lines": [ + { + "end": 129.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Not bad, but let me show you what real power is!" + } + ], + "scene": false + }, + "bf136": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "baron", + "start": 0.0, + "text": "Feel this!" + } + ], + "scene": false + }, + "bru001": { + "lines": [ + { + "end": 75.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 0.0, + "text": "Great smelly breath of a goosesnake!" + }, + { + "end": 140.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 76.0, + "text": "Heroes to Lurker people you be!" + }, + { + "end": 232.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 141.0, + "text": "By now just see much happy thanks! Ruhuhuh." + }, + { + "end": 323.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 233.0, + "text": "You honorary members of Lurker tribe now." + }, + { + "end": 448.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 324.0, + "text": "We no forget - if ever you need us, we help you!" + } + ], + "scene": false + }, + "bru002": { + "lines": [ + { + "end": 110.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 0.0, + "text": "I hears you two look for a piece of Mar's shiny Seal." + }, + { + "end": 203.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 111.0, + "text": "Brutter loves shiny bright things too." + }, + { + "end": 306.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 204.0, + "text": "I have piece I thinks. It in Water Slums," + }, + { + "end": 409.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 307.0, + "text": "hanging over me hut and you free to have." + }, + { + "end": 469.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 410.0, + "text": "Gift from Brutter!" + } + ], + "scene": false + }, + "bru004": { + "lines": [ + { + "end": 129.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 0.0, + "text": "You two good! No better warrior in all Lurker tribes!" + }, + { + "end": 256.0, + "merge": false, + "offscreen": true, + "speaker": "brutter", + "start": 130.0, + "text": "You keep Seal. You love shiny things just like Brutter." + } + ], + "scene": false + }, + "castle-krew-boss-fight-intro": { + "lines": [ + { + "end": 222.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 124.0, + "text": "" + }, + { + "end": 362.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 223.0, + "text": "" + }, + { + "end": 422.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 363.0, + "text": "" + }, + { + "end": 643.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 424.0, + "text": "" + }, + { + "end": 699.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 644.0, + "text": "" + }, + { + "end": 826.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 700.0, + "text": "" + }, + { + "end": 887.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 827.0, + "text": "" + }, + { + "end": 1031.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 888.0, + "text": "" + }, + { + "end": 1075.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1032.0, + "text": "" + }, + { + "end": 1141.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1076.0, + "text": "" + }, + { + "end": 1270.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1142.0, + "text": "" + }, + { + "end": 1378.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1271.0, + "text": "" + }, + { + "end": 1472.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1401.0, + "text": "" + }, + { + "end": 1599.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1473.0, + "text": "" + }, + { + "end": 1677.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1600.0, + "text": "" + }, + { + "end": 1782.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1678.0, + "text": "" + }, + { + "end": 1873.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1783.0, + "text": "" + }, + { + "end": 1933.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1880.0, + "text": "" + } + ], + "scene": true + }, + "castle-krew-boss-fight-res": { + "lines": [ + { + "end": 130.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 87.0, + "text": "" + }, + { + "end": 162.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 133.0, + "text": "" + }, + { + "end": 432.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 173.0, + "text": "" + }, + { + "end": 573.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 440.0, + "text": "" + }, + { + "end": 617.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 597.0, + "text": "" + }, + { + "end": 681.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 659.0, + "text": "" + }, + { + "end": 819.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 759.0, + "text": "" + } + ], + "scene": true + }, + "cit001": { + "lines": [ + { + "end": 11.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Hey!" + } + ], + "scene": false + }, + "cit004": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Watch it!" + } + ], + "scene": false + }, + "cit008": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "cit010": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Argh!" + } + ], + "scene": false + }, + "cit016": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Stay away!" + } + ], + "scene": false + }, + "cit033": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Hey!" + } + ], + "scene": false + }, + "cit034": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Look out!" + } + ], + "scene": false + }, + "cit035": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Watch out!" + } + ], + "scene": false + }, + "cit046": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Go away!" + } + ], + "scene": false + }, + "cit047": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Leave me alone!" + } + ], + "scene": false + }, + "cit051": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Are you crazy?" + } + ], + "scene": false + }, + "cit053": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Are you insane?!" + } + ], + "scene": false + }, + "cit055": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Hey, that's my vehicle!" + } + ], + "scene": false + }, + "cit056": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Gimme back my vehicle!" + } + ], + "scene": false + }, + "cit057": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "What are you doing?" + } + ], + "scene": false + }, + "cit058": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Please, don't take it!" + } + ], + "scene": false + }, + "cit097": { + "lines": [ + { + "end": 10.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Ugh!" + } + ], + "scene": false + }, + "cit097a": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Aahh!" + } + ], + "scene": false + }, + "cit097b": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Aaghhh!" + } + ], + "scene": false + }, + "cit097c": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "AAAHHH!!" + } + ], + "scene": false + }, + "cit097d": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "AAHHH!" + } + ], + "scene": false + }, + "cit098": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Ahh!!" + } + ], + "scene": false + }, + "cit098a": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Urgh!" + } + ], + "scene": false + }, + "cit098b": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Ugh!" + } + ], + "scene": false + }, + "cit098c": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Ugh!" + } + ], + "scene": false + }, + "cit098d": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Ahh!" + } + ], + "scene": false + }, + "cit099": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "cit099a": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Noooo!" + } + ], + "scene": false + }, + "cit099b": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "cit099c": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "cit099d": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Nooo!" + } + ], + "scene": false + }, + "cit100": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Please!" + } + ], + "scene": false + }, + "cit100a": { + "lines": [ + { + "end": 17.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Please!" + } + ], + "scene": false + }, + "cit100b": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Please!" + } + ], + "scene": false + }, + "cit100c": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Please!" + } + ], + "scene": false + }, + "cit101": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Stop!" + } + ], + "scene": false + }, + "cit101a": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-male", + "start": 0.0, + "text": "Stop!" + } + ], + "scene": false + }, + "cit101b": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Stop!" + } + ], + "scene": false + }, + "cit101c": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Stop!" + } + ], + "scene": false + }, + "cit103": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Sound the alarm!" + } + ], + "scene": false + }, + "cit103a": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Sound the alarm!" + } + ], + "scene": false + }, + "cit104": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Guards!" + } + ], + "scene": false + }, + "cit104a": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Guards! Help us!" + } + ], + "scene": false + }, + "cit105": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Help us!" + } + ], + "scene": false + }, + "cit120": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Keep away from me!" + } + ], + "scene": false + }, + "cit120a": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Keep away from me!" + } + ], + "scene": false + }, + "cit137a": { + "lines": [ + { + "end": 17.0, + "merge": false, + "offscreen": true, + "speaker": "citizen-female", + "start": 0.0, + "text": "Wait!" + } + ], + "scene": false + }, + "city-ashelin-drop-off": { + "lines": [ + { + "end": 45.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 10.0, + "text": "" + }, + { + "end": 103.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 46.0, + "text": "" + }, + { + "end": 165.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 104.0, + "text": "" + } + ], + "scene": true + }, + "city-class-1-race-intro-a": { + "lines": [ + { + "end": 120.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 9.0, + "text": "" + }, + { + "end": 223.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 121.0, + "text": "" + }, + { + "end": 346.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 224.0, + "text": "" + }, + { + "end": 384.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 348.0, + "text": "" + }, + { + "end": 443.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 387.0, + "text": "" + }, + { + "end": 463.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 444.0, + "text": "" + }, + { + "end": 532.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 464.0, + "text": "" + }, + { + "end": 640.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 533.0, + "text": "" + }, + { + "end": 731.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 641.0, + "text": "" + }, + { + "end": 815.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 732.0, + "text": "" + }, + { + "end": 907.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 821.0, + "text": "" + }, + { + "end": 1001.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 910.0, + "text": "" + }, + { + "end": 1117.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1004.0, + "text": "" + }, + { + "end": 1231.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1122.0, + "text": "" + }, + { + "end": 1327.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1234.0, + "text": "" + }, + { + "end": 1486.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1336.0, + "text": "" + }, + { + "end": 1584.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1492.0, + "text": "" + }, + { + "end": 1616.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1589.0, + "text": "" + }, + { + "end": 1751.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1617.0, + "text": "" + }, + { + "end": 1872.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1752.0, + "text": "" + }, + { + "end": 1921.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1877.0, + "text": "" + } + ], + "scene": true + }, + "city-class-1-race-intro-b": { + "lines": [ + { + "end": 443.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 333.0, + "text": "" + }, + { + "end": 565.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 505.0, + "text": "" + }, + { + "end": 691.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 566.0, + "text": "" + }, + { + "end": 831.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 692.0, + "text": "" + }, + { + "end": 924.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 832.0, + "text": "" + }, + { + "end": 1020.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 925.0, + "text": "" + }, + { + "end": 1109.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1021.0, + "text": "" + }, + { + "end": 1150.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1120.0, + "text": "" + }, + { + "end": 1204.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1172.0, + "text": "" + } + ], + "scene": true + }, + "city-class-1-race-res": { + "lines": [ + { + "end": 242.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 80.0, + "text": "" + }, + { + "end": 444.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 255.0, + "text": "" + }, + { + "end": 621.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 445.0, + "text": "" + }, + { + "end": 655.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 622.0, + "text": "" + }, + { + "end": 676.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 658.0, + "text": "" + }, + { + "end": 753.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 681.0, + "text": "" + }, + { + "end": 845.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 754.0, + "text": "" + }, + { + "end": 1030.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 846.0, + "text": "" + }, + { + "end": 1207.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1031.0, + "text": "" + }, + { + "end": 1316.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1208.0, + "text": "" + }, + { + "end": 1340.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1330.0, + "text": "" + }, + { + "end": 1437.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1399.0, + "text": "" + }, + { + "end": 1507.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1485.0, + "text": "" + }, + { + "end": 1668.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1638.0, + "text": "" + } + ], + "scene": true + }, + "city-class-2-race-intro": { + "lines": [ + { + "end": 130.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 33.0, + "text": "" + }, + { + "end": 161.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 131.0, + "text": "" + }, + { + "end": 269.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 162.0, + "text": "" + }, + { + "end": 323.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 270.0, + "text": "" + }, + { + "end": 414.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 324.0, + "text": "" + }, + { + "end": 485.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 415.0, + "text": "" + }, + { + "end": 636.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 486.0, + "text": "" + }, + { + "end": 798.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 637.0, + "text": "" + }, + { + "end": 852.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 799.0, + "text": "" + }, + { + "end": 963.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 855.0, + "text": "" + }, + { + "end": 1107.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 965.0, + "text": "" + }, + { + "end": 1143.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1112.0, + "text": "" + }, + { + "end": 1210.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1145.0, + "text": "" + }, + { + "end": 1344.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1228.0, + "text": "" + }, + { + "end": 1384.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1348.0, + "text": "" + }, + { + "end": 1435.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1387.0, + "text": "" + }, + { + "end": 1572.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1436.0, + "text": "" + }, + { + "end": 1691.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1573.0, + "text": "" + }, + { + "end": 1758.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1693.0, + "text": "" + }, + { + "end": 1884.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1759.0, + "text": "" + }, + { + "end": 1964.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1885.0, + "text": "" + }, + { + "end": 2103.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1976.0, + "text": "" + }, + { + "end": 2226.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2113.0, + "text": "" + }, + { + "end": 2278.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2242.0, + "text": "" + }, + { + "end": 2349.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2282.0, + "text": "" + }, + { + "end": 2449.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2350.0, + "text": "" + }, + { + "end": 2488.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2455.0, + "text": "" + }, + { + "end": 2596.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2489.0, + "text": "" + }, + { + "end": 2662.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2596.0, + "text": "" + }, + { + "end": 2752.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2663.0, + "text": "" + } + ], + "scene": true + }, + "city-class-2-race-res": { + "lines": [ + { + "end": 78.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 21.0, + "text": "" + }, + { + "end": 199.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 82.0, + "text": "" + }, + { + "end": 311.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 200.0, + "text": "" + }, + { + "end": 407.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 312.0, + "text": "" + }, + { + "end": 511.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 411.0, + "text": "" + }, + { + "end": 638.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 523.0, + "text": "" + }, + { + "end": 738.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 643.0, + "text": "" + }, + { + "end": 816.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 739.0, + "text": "" + }, + { + "end": 840.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 819.0, + "text": "" + }, + { + "end": 887.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 844.0, + "text": "" + }, + { + "end": 989.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 898.0, + "text": "" + } + ], + "scene": true + }, + "city-class-3-race-intro": { + "lines": [ + { + "end": 67.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 29.0, + "text": "" + }, + { + "end": 209.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 81.0, + "text": "" + }, + { + "end": 253.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 210.0, + "text": "" + }, + { + "end": 305.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 254.0, + "text": "" + }, + { + "end": 466.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 315.0, + "text": "" + }, + { + "end": 516.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 467.0, + "text": "" + }, + { + "end": 569.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 517.0, + "text": "" + }, + { + "end": 678.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 570.0, + "text": "" + }, + { + "end": 789.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 679.0, + "text": "" + }, + { + "end": 817.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 790.0, + "text": "" + }, + { + "end": 879.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 826.0, + "text": "" + }, + { + "end": 901.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 880.0, + "text": "" + }, + { + "end": 1021.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 911.0, + "text": "" + }, + { + "end": 1111.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1022.0, + "text": "" + }, + { + "end": 1145.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1114.0, + "text": "" + }, + { + "end": 1273.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1154.0, + "text": "" + }, + { + "end": 1416.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1274.0, + "text": "" + }, + { + "end": 1546.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1421.0, + "text": "" + }, + { + "end": 1630.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1547.0, + "text": "" + }, + { + "end": 1693.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1631.0, + "text": "" + }, + { + "end": 1796.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1694.0, + "text": "" + }, + { + "end": 1892.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1797.0, + "text": "" + }, + { + "end": 1911.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1894.0, + "text": "" + }, + { + "end": 2012.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1917.0, + "text": "" + }, + { + "end": 2128.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2015.0, + "text": "" + }, + { + "end": 2236.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2129.0, + "text": "" + }, + { + "end": 2355.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2237.0, + "text": "" + }, + { + "end": 2469.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2356.0, + "text": "" + }, + { + "end": 2562.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2470.0, + "text": "" + }, + { + "end": 2670.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2563.0, + "text": "" + }, + { + "end": 2860.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2671.0, + "text": "" + }, + { + "end": 2982.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2861.0, + "text": "" + }, + { + "end": 3045.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2995.0, + "text": "" + } + ], + "scene": true + }, + "city-class-3-race-res": { + "lines": [ + { + "end": 127.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 31.0, + "text": "" + }, + { + "end": 272.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 153.0, + "text": "" + }, + { + "end": 454.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 282.0, + "text": "" + }, + { + "end": 512.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 455.0, + "text": "" + }, + { + "end": 563.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 516.0, + "text": "" + }, + { + "end": 673.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 566.0, + "text": "" + }, + { + "end": 787.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 679.0, + "text": "" + }, + { + "end": 878.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 833.0, + "text": "" + }, + { + "end": 1042.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 879.0, + "text": "" + }, + { + "end": 1109.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1043.0, + "text": "" + }, + { + "end": 1226.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1161.0, + "text": "" + }, + { + "end": 1310.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1227.0, + "text": "" + }, + { + "end": 1360.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1323.0, + "text": "" + }, + { + "end": 1487.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1361.0, + "text": "" + }, + { + "end": 1603.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1488.0, + "text": "" + }, + { + "end": 1688.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1616.0, + "text": "" + } + ], + "scene": true + }, + "city-defend-stadium-intro": { + "lines": [ + { + "end": 50.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 15.0, + "text": "" + }, + { + "end": 159.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 51.0, + "text": "" + }, + { + "end": 235.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 160.0, + "text": "" + }, + { + "end": 397.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 240.0, + "text": "" + }, + { + "end": 446.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 401.0, + "text": "" + }, + { + "end": 594.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 455.0, + "text": "" + }, + { + "end": 654.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 595.0, + "text": "" + }, + { + "end": 719.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 655.0, + "text": "" + }, + { + "end": 831.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 720.0, + "text": "" + }, + { + "end": 944.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 843.0, + "text": "" + }, + { + "end": 1075.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 945.0, + "text": "" + } + ], + "scene": true + }, + "city-defend-stadium-res": { + "lines": [ + { + "end": 68.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 32.0, + "text": "" + }, + { + "end": 182.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 93.0, + "text": "" + }, + { + "end": 321.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 206.0, + "text": "" + }, + { + "end": 392.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 329.0, + "text": "" + } + ], + "scene": true + }, + "city-destroy-guard-vehicles-intro": { + "lines": [ + { + "end": 120.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 60.0, + "text": "" + }, + { + "end": 231.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 121.0, + "text": "" + }, + { + "end": 276.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 235.0, + "text": "" + }, + { + "end": 383.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 292.0, + "text": "" + }, + { + "end": 454.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 384.0, + "text": "" + }, + { + "end": 519.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 455.0, + "text": "" + }, + { + "end": 602.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 520.0, + "text": "" + }, + { + "end": 738.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 603.0, + "text": "" + }, + { + "end": 902.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 745.0, + "text": "" + }, + { + "end": 1044.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 903.0, + "text": "" + } + ], + "scene": true + }, + "city-errol-challenge-intro": { + "lines": [ + { + "end": 124.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 60.0, + "text": "" + }, + { + "end": 208.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 127.0, + "text": "" + }, + { + "end": 357.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 210.0, + "text": "" + }, + { + "end": 535.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 373.0, + "text": "" + }, + { + "end": 577.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 540.0, + "text": "" + }, + { + "end": 690.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 581.0, + "text": "" + }, + { + "end": 773.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 707.0, + "text": "" + }, + { + "end": 855.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 792.0, + "text": "" + }, + { + "end": 982.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 870.0, + "text": "" + }, + { + "end": 1037.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 990.0, + "text": "" + }, + { + "end": 1126.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1038.0, + "text": "" + }, + { + "end": 1186.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1128.0, + "text": "" + }, + { + "end": 1286.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1220.0, + "text": "" + }, + { + "end": 1510.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1287.0, + "text": "" + }, + { + "end": 1582.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1538.0, + "text": "" + }, + { + "end": 1637.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1583.0, + "text": "" + }, + { + "end": 1680.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1638.0, + "text": "" + }, + { + "end": 1783.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1681.0, + "text": "" + }, + { + "end": 1840.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1784.0, + "text": "" + }, + { + "end": 1909.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1841.0, + "text": "" + }, + { + "end": 2065.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1910.0, + "text": "" + }, + { + "end": 2106.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2081.0, + "text": "" + } + ], + "scene": true + }, + "city-errol-challenge-res": { + "lines": [ + { + "end": 194.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 128.0, + "text": "" + }, + { + "end": 300.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 195.0, + "text": "" + }, + { + "end": 443.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 332.0, + "text": "" + } + ], + "scene": true + }, + "city-escort-kid-intro": { + "lines": [ + { + "end": 135.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 30.0, + "text": "" + }, + { + "end": 274.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 136.0, + "text": "" + }, + { + "end": 399.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 275.0, + "text": "" + }, + { + "end": 511.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 433.0, + "text": "" + }, + { + "end": 560.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 514.0, + "text": "" + }, + { + "end": 636.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 565.0, + "text": "" + }, + { + "end": 779.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 637.0, + "text": "" + }, + { + "end": 862.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 780.0, + "text": "" + }, + { + "end": 981.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 863.0, + "text": "" + }, + { + "end": 1100.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 982.0, + "text": "" + } + ], + "scene": true + }, + "city-get-dark-gun": { + "lines": [ + { + "end": 338.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 228.0, + "text": "" + } + ], + "scene": true + }, + "city-get-hoverboard": { + "lines": [ + { + "end": 152.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 58.0, + "text": "" + } + ], + "scene": true + }, + "city-help-kid-intro": { + "lines": [ + { + "end": 239.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 101.0, + "text": "" + }, + { + "end": 296.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 240.0, + "text": "" + }, + { + "end": 381.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 297.0, + "text": "" + }, + { + "end": 508.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 387.0, + "text": "" + }, + { + "end": 591.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 510.0, + "text": "" + }, + { + "end": 709.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 592.0, + "text": "" + }, + { + "end": 800.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 710.0, + "text": "" + }, + { + "end": 877.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 802.0, + "text": "" + }, + { + "end": 1050.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 878.0, + "text": "" + }, + { + "end": 1121.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1051.0, + "text": "" + }, + { + "end": 1262.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1171.0, + "text": "" + }, + { + "end": 1326.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1263.0, + "text": "" + }, + { + "end": 1469.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1342.0, + "text": "" + }, + { + "end": 1536.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1470.0, + "text": "" + }, + { + "end": 1602.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1537.0, + "text": "" + }, + { + "end": 1648.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1603.0, + "text": "" + }, + { + "end": 1789.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1650.0, + "text": "" + }, + { + "end": 1831.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1790.0, + "text": "" + }, + { + "end": 1924.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1832.0, + "text": "" + }, + { + "end": 1977.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1925.0, + "text": "" + } + ], + "scene": true + }, + "city-help-kid-resolution": { + "lines": [ + { + "end": 70.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 21.0, + "text": "" + }, + { + "end": 141.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 71.0, + "text": "" + }, + { + "end": 247.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 142.0, + "text": "" + }, + { + "end": 305.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 253.0, + "text": "" + }, + { + "end": 357.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 306.0, + "text": "" + }, + { + "end": 421.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 358.0, + "text": "" + }, + { + "end": 499.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 422.0, + "text": "" + }, + { + "end": 563.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 500.0, + "text": "" + }, + { + "end": 673.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 598.0, + "text": "" + }, + { + "end": 844.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 712.0, + "text": "" + }, + { + "end": 899.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 849.0, + "text": "" + }, + { + "end": 1027.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 906.0, + "text": "" + }, + { + "end": 1140.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1028.0, + "text": "" + }, + { + "end": 1271.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1141.0, + "text": "" + }, + { + "end": 1336.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1272.0, + "text": "" + } + ], + "scene": true + }, + "city-intercept-tanker-intro": { + "lines": [ + { + "end": 106.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 59.0, + "text": "" + }, + { + "end": 203.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 120.0, + "text": "" + }, + { + "end": 277.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 207.0, + "text": "" + }, + { + "end": 345.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 278.0, + "text": "" + }, + { + "end": 456.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 346.0, + "text": "" + }, + { + "end": 486.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 463.0, + "text": "" + }, + { + "end": 522.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 493.0, + "text": "" + }, + { + "end": 750.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 671.0, + "text": "" + }, + { + "end": 827.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 768.0, + "text": "" + }, + { + "end": 894.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 842.0, + "text": "" + } + ], + "scene": true + }, + "city-intercept-tanker-res": { + "lines": [ + { + "end": 195.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 92.0, + "text": "" + }, + { + "end": 294.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 196.0, + "text": "" + }, + { + "end": 362.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 295.0, + "text": "" + }, + { + "end": 430.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 380.0, + "text": "" + } + ], + "scene": true + }, + "city-keira-delivery-intro": { + "lines": [ + { + "end": 85.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 31.0, + "text": "" + }, + { + "end": 251.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 103.0, + "text": "" + }, + { + "end": 405.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 252.0, + "text": "" + }, + { + "end": 487.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 406.0, + "text": "" + }, + { + "end": 542.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 489.0, + "text": "" + }, + { + "end": 687.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 543.0, + "text": "" + }, + { + "end": 811.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 688.0, + "text": "" + }, + { + "end": 939.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 812.0, + "text": "" + }, + { + "end": 1071.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 940.0, + "text": "" + }, + { + "end": 1159.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1087.0, + "text": "" + }, + { + "end": 1254.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1160.0, + "text": "" + }, + { + "end": 1360.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1255.0, + "text": "" + }, + { + "end": 1445.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1361.0, + "text": "" + }, + { + "end": 1527.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1446.0, + "text": "" + }, + { + "end": 1660.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1528.0, + "text": "" + }, + { + "end": 1728.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1661.0, + "text": "" + }, + { + "end": 1862.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1729.0, + "text": "" + }, + { + "end": 1979.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1864.0, + "text": "" + }, + { + "end": 2182.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1980.0, + "text": "" + }, + { + "end": 2316.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2183.0, + "text": "" + }, + { + "end": 2398.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2317.0, + "text": "" + } + ], + "scene": true + }, + "city-keira-hover-challenge-intro": { + "lines": [ + { + "end": 132.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 22.0, + "text": "" + }, + { + "end": 229.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 140.0, + "text": "" + }, + { + "end": 324.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 230.0, + "text": "" + }, + { + "end": 450.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 325.0, + "text": "" + }, + { + "end": 515.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 453.0, + "text": "" + }, + { + "end": 645.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 516.0, + "text": "" + }, + { + "end": 686.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 646.0, + "text": "" + }, + { + "end": 791.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 687.0, + "text": "" + }, + { + "end": 898.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 792.0, + "text": "" + }, + { + "end": 1007.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 899.0, + "text": "" + } + ], + "scene": true + }, + "city-keira-hover-challenge-res": { + "lines": [ + { + "end": 110.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 60.0, + "text": "" + }, + { + "end": 177.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 112.0, + "text": "" + }, + { + "end": 323.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 178.0, + "text": "" + }, + { + "end": 360.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 324.0, + "text": "" + }, + { + "end": 472.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 367.0, + "text": "" + }, + { + "end": 536.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 488.0, + "text": "" + }, + { + "end": 633.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 537.0, + "text": "" + }, + { + "end": 689.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 637.0, + "text": "" + }, + { + "end": 744.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 699.0, + "text": "" + }, + { + "end": 802.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 748.0, + "text": "" + }, + { + "end": 876.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 804.0, + "text": "" + }, + { + "end": 983.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 881.0, + "text": "" + }, + { + "end": 1107.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 984.0, + "text": "" + }, + { + "end": 1175.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1108.0, + "text": "" + }, + { + "end": 1262.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1176.0, + "text": "" + } + ], + "scene": true + }, + "city-krew-collection-intro": { + "lines": [ + { + "end": 202.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 30.0, + "text": "" + }, + { + "end": 292.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 203.0, + "text": "" + }, + { + "end": 394.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 295.0, + "text": "" + }, + { + "end": 510.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 395.0, + "text": "" + }, + { + "end": 607.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 518.0, + "text": "" + }, + { + "end": 723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 608.0, + "text": "" + }, + { + "end": 743.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 724.0, + "text": "" + }, + { + "end": 802.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 752.0, + "text": "" + }, + { + "end": 1010.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 906.0, + "text": "" + }, + { + "end": 1128.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1011.0, + "text": "" + }, + { + "end": 1179.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1129.0, + "text": "" + }, + { + "end": 1242.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1180.0, + "text": "" + }, + { + "end": 1458.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1250.0, + "text": "" + }, + { + "end": 1554.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1462.0, + "text": "" + }, + { + "end": 1609.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1558.0, + "text": "" + }, + { + "end": 1707.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1614.0, + "text": "" + }, + { + "end": 1915.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1708.0, + "text": "" + }, + { + "end": 2084.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1916.0, + "text": "" + }, + { + "end": 2191.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2085.0, + "text": "" + }, + { + "end": 2301.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2192.0, + "text": "" + }, + { + "end": 2446.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2302.0, + "text": "" + }, + { + "end": 2664.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2447.0, + "text": "" + }, + { + "end": 2743.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2665.0, + "text": "" + }, + { + "end": 2927.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2744.0, + "text": "" + }, + { + "end": 3113.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2960.0, + "text": "" + }, + { + "end": 3253.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3114.0, + "text": "" + } + ], + "scene": true + }, + "city-krew-collection-res": { + "lines": [ + { + "end": 214.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 127.0, + "text": "" + }, + { + "end": 367.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 215.0, + "text": "" + }, + { + "end": 462.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 375.0, + "text": "" + } + ], + "scene": true + }, + "city-krew-delivery-intro": { + "lines": [ + { + "end": 176.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 13.0, + "text": "" + }, + { + "end": 245.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 180.0, + "text": "" + }, + { + "end": 389.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 246.0, + "text": "" + }, + { + "end": 536.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 401.0, + "text": "" + }, + { + "end": 711.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 537.0, + "text": "" + }, + { + "end": 826.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 712.0, + "text": "" + }, + { + "end": 990.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 827.0, + "text": "" + }, + { + "end": 1150.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 991.0, + "text": "" + }, + { + "end": 1314.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1151.0, + "text": "" + }, + { + "end": 1447.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1316.0, + "text": "" + }, + { + "end": 1571.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1448.0, + "text": "" + }, + { + "end": 1641.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1576.0, + "text": "" + }, + { + "end": 1679.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1642.0, + "text": "" + } + ], + "scene": true + }, + "city-meet-brutter-intro": { + "lines": [ + { + "end": 195.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 100.0, + "text": "" + }, + { + "end": 408.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 197.0, + "text": "" + }, + { + "end": 489.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 413.0, + "text": "" + }, + { + "end": 627.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 508.0, + "text": "" + }, + { + "end": 799.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 628.0, + "text": "" + }, + { + "end": 888.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 809.0, + "text": "" + }, + { + "end": 996.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 889.0, + "text": "" + }, + { + "end": 1105.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 997.0, + "text": "" + }, + { + "end": 1245.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1106.0, + "text": "" + }, + { + "end": 1291.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1249.0, + "text": "" + }, + { + "end": 1369.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1292.0, + "text": "" + }, + { + "end": 1463.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1388.0, + "text": "" + }, + { + "end": 1546.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1464.0, + "text": "" + }, + { + "end": 1608.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1547.0, + "text": "" + }, + { + "end": 1784.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1609.0, + "text": "" + }, + { + "end": 1848.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1785.0, + "text": "" + }, + { + "end": 1910.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1850.0, + "text": "" + }, + { + "end": 2012.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1927.0, + "text": "" + }, + { + "end": 2083.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2013.0, + "text": "" + }, + { + "end": 2152.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2084.0, + "text": "" + }, + { + "end": 2279.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2153.0, + "text": "" + } + ], + "scene": true + }, + "city-meet-brutter-res": { + "lines": [ + { + "end": 122.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 80.0, + "text": "" + }, + { + "end": 216.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 123.0, + "text": "" + }, + { + "end": 456.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 374.0, + "text": "" + }, + { + "end": 528.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 464.0, + "text": "" + }, + { + "end": 605.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 529.0, + "text": "" + } + ], + "scene": true + }, + "city-oracle-intro": { + "lines": [ + { + "end": 56.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1.0, + "text": "" + }, + { + "end": 152.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 57.0, + "text": "" + }, + { + "end": 271.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 153.0, + "text": "" + }, + { + "end": 385.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 272.0, + "text": "" + }, + { + "end": 530.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 386.0, + "text": "" + }, + { + "end": 625.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 531.0, + "text": "" + }, + { + "end": 723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 626.0, + "text": "" + } + ], + "scene": true + }, + "city-oracle-level-0": { + "lines": [ + { + "end": 339.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 220.0, + "text": "" + }, + { + "end": 440.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 340.0, + "text": "" + } + ], + "scene": true + }, + "city-oracle-level-1": { + "lines": [ + { + "end": 121.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 15.0, + "text": "" + }, + { + "end": 260.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 122.0, + "text": "" + }, + { + "end": 355.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 261.0, + "text": "" + }, + { + "end": 446.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 356.0, + "text": "" + } + ], + "scene": true + }, + "city-oracle-level-2": { + "lines": [ + { + "end": 88.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": -14.0, + "text": "" + }, + { + "end": 147.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 89.0, + "text": "" + }, + { + "end": 264.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 148.0, + "text": "" + }, + { + "end": 380.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 265.0, + "text": "" + }, + { + "end": 440.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 381.0, + "text": "" + } + ], + "scene": true + }, + "city-oracle-level-3": { + "lines": [ + { + "end": 40.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": -23.0, + "text": "" + }, + { + "end": 168.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 41.0, + "text": "" + }, + { + "end": 231.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 169.0, + "text": "" + }, + { + "end": 304.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 232.0, + "text": "" + }, + { + "end": 370.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 305.0, + "text": "" + }, + { + "end": 445.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 371.0, + "text": "" + } + ], + "scene": true + }, + "city-play-onin-game-intro": { + "lines": [ + { + "end": 110.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 10.0, + "text": "" + }, + { + "end": 270.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 111.0, + "text": "" + }, + { + "end": 411.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 271.0, + "text": "" + }, + { + "end": 494.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 420.0, + "text": "" + }, + { + "end": 619.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 495.0, + "text": "" + }, + { + "end": 699.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 627.0, + "text": "" + }, + { + "end": 849.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 700.0, + "text": "" + }, + { + "end": 941.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 850.0, + "text": "" + }, + { + "end": 1070.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 942.0, + "text": "" + } + ], + "scene": true + }, + "city-play-onin-game-res": { + "lines": [ + { + "end": 120.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 16.0, + "text": "" + }, + { + "end": 249.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 121.0, + "text": "" + }, + { + "end": 363.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 250.0, + "text": "" + }, + { + "end": 534.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 364.0, + "text": "" + }, + { + "end": 580.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 535.0, + "text": "" + }, + { + "end": 763.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 581.0, + "text": "" + }, + { + "end": 858.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 769.0, + "text": "" + }, + { + "end": 913.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 864.0, + "text": "" + }, + { + "end": 1016.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 914.0, + "text": "" + }, + { + "end": 1154.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1017.0, + "text": "" + } + ], + "scene": true + }, + "city-protect-slums-intro": { + "lines": [ + { + "end": 258.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 64.0, + "text": "" + }, + { + "end": 361.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 259.0, + "text": "" + } + ], + "scene": true + }, + "city-save-lurkers-intro": { + "lines": [ + { + "end": 127.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 64.0, + "text": "" + }, + { + "end": 266.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 128.0, + "text": "" + }, + { + "end": 369.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 269.0, + "text": "" + }, + { + "end": 450.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 374.0, + "text": "" + }, + { + "end": 570.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 451.0, + "text": "" + }, + { + "end": 675.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 571.0, + "text": "" + }, + { + "end": 826.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 676.0, + "text": "" + }, + { + "end": 888.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 832.0, + "text": "" + }, + { + "end": 989.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 898.0, + "text": "" + }, + { + "end": 1122.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 990.0, + "text": "" + }, + { + "end": 1188.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1131.0, + "text": "" + }, + { + "end": 1265.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1196.0, + "text": "" + }, + { + "end": 1404.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1276.0, + "text": "" + } + ], + "scene": true + }, + "city-shuttle-underground-intro": { + "lines": [ + { + "end": 122.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 34.0, + "text": "" + }, + { + "end": 246.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 123.0, + "text": "" + }, + { + "end": 328.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 247.0, + "text": "" + }, + { + "end": 428.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 329.0, + "text": "" + }, + { + "end": 501.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 429.0, + "text": "" + }, + { + "end": 609.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 502.0, + "text": "" + }, + { + "end": 744.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 610.0, + "text": "" + }, + { + "end": 777.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 745.0, + "text": "" + }, + { + "end": 849.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 778.0, + "text": "" + }, + { + "end": 969.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 850.0, + "text": "" + }, + { + "end": 1099.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 972.0, + "text": "" + }, + { + "end": 1162.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1101.0, + "text": "" + }, + { + "end": 1309.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1164.0, + "text": "" + }, + { + "end": 1371.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1310.0, + "text": "" + }, + { + "end": 1447.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1372.0, + "text": "" + }, + { + "end": 1508.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1448.0, + "text": "" + }, + { + "end": 1712.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1512.0, + "text": "" + }, + { + "end": 1854.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1713.0, + "text": "" + }, + { + "end": 1937.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1855.0, + "text": "" + }, + { + "end": 1973.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1938.0, + "text": "" + }, + { + "end": 2020.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1975.0, + "text": "" + }, + { + "end": 2089.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2021.0, + "text": "" + }, + { + "end": 2207.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2090.0, + "text": "" + }, + { + "end": 2302.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2208.0, + "text": "" + }, + { + "end": 2417.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2303.0, + "text": "" + } + ], + "scene": true + }, + "city-stop-bomb-bots-intro": { + "lines": [ + { + "end": 115.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 47.0, + "text": "" + }, + { + "end": 223.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 128.0, + "text": "" + }, + { + "end": 280.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 224.0, + "text": "" + }, + { + "end": 362.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 283.0, + "text": "" + }, + { + "end": 469.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 363.0, + "text": "" + }, + { + "end": 578.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 470.0, + "text": "" + }, + { + "end": 725.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 584.0, + "text": "" + }, + { + "end": 824.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 736.0, + "text": "" + }, + { + "end": 927.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 825.0, + "text": "" + }, + { + "end": 968.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 940.0, + "text": "" + } + ], + "scene": true + }, + "city-switch-on-power-intro": { + "lines": [ + { + "end": 157.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 97.0, + "text": "" + }, + { + "end": 231.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 158.0, + "text": "" + }, + { + "end": 370.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 240.0, + "text": "" + }, + { + "end": 506.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 378.0, + "text": "" + }, + { + "end": 688.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 515.0, + "text": "" + }, + { + "end": 824.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 693.0, + "text": "" + }, + { + "end": 910.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 825.0, + "text": "" + }, + { + "end": 980.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 911.0, + "text": "" + }, + { + "end": 1075.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 981.0, + "text": "" + }, + { + "end": 1166.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1076.0, + "text": "" + }, + { + "end": 1250.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1167.0, + "text": "" + }, + { + "end": 1315.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1251.0, + "text": "" + }, + { + "end": 1388.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1321.0, + "text": "" + }, + { + "end": 1501.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1399.0, + "text": "" + }, + { + "end": 1657.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1517.0, + "text": "" + }, + { + "end": 1729.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1658.0, + "text": "" + }, + { + "end": 1852.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1730.0, + "text": "" + }, + { + "end": 1890.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1853.0, + "text": "" + }, + { + "end": 1935.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1892.0, + "text": "" + }, + { + "end": 2086.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1936.0, + "text": "" + }, + { + "end": 2244.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2087.0, + "text": "" + }, + { + "end": 2328.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2245.0, + "text": "" + } + ], + "scene": true + }, + "city-whack-a-metal-intro": { + "lines": [ + { + "end": 158.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 30.0, + "text": "" + }, + { + "end": 235.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 159.0, + "text": "" + }, + { + "end": 325.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 236.0, + "text": "" + }, + { + "end": 428.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 326.0, + "text": "" + }, + { + "end": 507.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 440.0, + "text": "" + } + ], + "scene": true + }, + "city-whack-a-metal-res": { + "lines": [ + { + "end": 40.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 13.0, + "text": "" + }, + { + "end": 176.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 52.0, + "text": "" + }, + { + "end": 255.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 177.0, + "text": "" + }, + { + "end": 283.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 257.0, + "text": "" + }, + { + "end": 429.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 285.0, + "text": "" + }, + { + "end": 519.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 430.0, + "text": "" + }, + { + "end": 536.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 520.0, + "text": "" + }, + { + "end": 613.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 539.0, + "text": "" + }, + { + "end": 829.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 716.0, + "text": "" + }, + { + "end": 924.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 830.0, + "text": "" + }, + { + "end": 1056.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 925.0, + "text": "" + }, + { + "end": 1169.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1057.0, + "text": "" + }, + { + "end": 1223.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1174.0, + "text": "" + }, + { + "end": 1356.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1227.0, + "text": "" + } + ], + "scene": true + }, + "cityv001": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Leaving city safe zone." + } + ], + "scene": false + }, + "cityv002": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Leaving city at your own risk." + } + ], + "scene": false + }, + "cityv003": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Exiting city." + } + ], + "scene": false + }, + "cityv004": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Opening outer shield." + } + ], + "scene": false + }, + "cityv005": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Decontamination complete." + } + ], + "scene": false + }, + "cityv006": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Entering Haven City." + } + ], + "scene": false + }, + "cityv007": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Re-entering city." + } + ], + "scene": false + }, + "cityv008": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Welcome back." + } + ], + "scene": false + }, + "cityv009": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "It's good to see you still alive." + } + ], + "scene": false + }, + "cityv010": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Security clearance granted." + } + ], + "scene": false + }, + "cityv011": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Entrance denied. You do not have proper clearance." + } + ], + "scene": false + }, + "cityv012": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I am unable to comply." + } + ], + "scene": false + }, + "cityv013": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Please come back with proper clearance." + } + ], + "scene": false + }, + "cityv014": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Access denied." + } + ], + "scene": false + }, + "cityv015": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You need Red Clearance for this gate." + } + ], + "scene": false + }, + "cityv016": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You need Green Clearance for this gate." + } + ], + "scene": false + }, + "cityv017": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You need Yellow Clearance for this gate." + } + ], + "scene": false + }, + "cityv018": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You need Blue Clearance for this gate." + } + ], + "scene": false + }, + "cityv019": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You need Purple Clearance for this gate." + } + ], + "scene": false + }, + "cityv020": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You need special Black Clearance for this door." + } + ], + "scene": false + }, + "cityv021": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Access granted." + } + ], + "scene": false + }, + "cityv022": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Door open." + } + ], + "scene": false + }, + "cityv023": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Door closed." + } + ], + "scene": false + }, + "cityv024": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Please enter." + } + ], + "scene": false + }, + "cityv025": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Warp Gate online." + } + ], + "scene": false + }, + "cityv026": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Warning: Eco supplies low." + } + ], + "scene": false + }, + "cityv027": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Backup systems failing." + } + ], + "scene": false + }, + "cityv028": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Warning: Eco storage is below safe minimums." + } + ], + "scene": false + }, + "cityv029": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Eco Grid unstable." + } + ], + "scene": false + }, + "cityv030": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Metal Heads detected at Mining Site." + } + ], + "scene": false + }, + "cityv031": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Metal Heads detected at Drilling Site." + } + ], + "scene": false + }, + "cityv032": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Stand by for clearance." + } + ], + "scene": false + }, + "cityv033": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Have a nice day." + } + ], + "scene": false + }, + "cityv034": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Welcome." + } + ], + "scene": false + }, + "cityv035": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "This is a restricted area." + } + ], + "scene": false + }, + "cityv036": { + "lines": [ + { + "end": 104.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You are in violation of Speed Ordinance 51d, pull over." + } + ], + "scene": false + }, + "cityv037": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I have alerted the authorities." + } + ], + "scene": false + }, + "cityv038": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "This sector is closed." + } + ], + "scene": false + }, + "cityv039": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Alert: Prison escape in progress." + } + ], + "scene": false + }, + "cityv040": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Alert: City under attack." + } + ], + "scene": false + }, + "cityv041": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Metal Head attack in progress." + } + ], + "scene": false + }, + "cityv042": { + "lines": [ + { + "end": 62.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "All citizens go to safe shelters." + } + ], + "scene": false + }, + "cityv043": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Eco Grid growing unstable." + } + ], + "scene": false + }, + "cityv044": { + "lines": [ + { + "end": 96.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The Eco Grid is down. Repeat: The Eco Grid is down." + } + ], + "scene": false + }, + "cityv045": { + "lines": [ + { + "end": 85.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Red alert: City shield wall compromised." + } + ], + "scene": false + }, + "cityv046": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Unauthorized movement in sewer system." + } + ], + "scene": false + }, + "cityv047": { + "lines": [ + { + "end": 89.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "This is a restricted area. Defenses activated." + } + ], + "scene": false + }, + "cityv048": { + "lines": [ + { + "end": 75.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You are trespassing. Defenses coming online." + } + ], + "scene": false + }, + "cityv049": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I regret use of force. Systems arming." + } + ], + "scene": false + }, + "cityv050": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Trespasser neutralized." + } + ], + "scene": false + }, + "cityv051": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Suspect destroyed." + } + ], + "scene": false + }, + "cityv052": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I am authorized to use force." + } + ], + "scene": false + }, + "cityv053": { + "lines": [ + { + "end": 109.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "General alert: Riot in progress. Krimzon Guards en route." + } + ], + "scene": false + }, + "cityv054": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Surrender yourself. You are under arrest." + } + ], + "scene": false + }, + "cityv055": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "There is no escape." + } + ], + "scene": false + }, + "cityv056": { + "lines": [ + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You are in a restricted sector. This sector is on high alert." + } + ], + "scene": false + }, + "cityv057": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You are under arrest. Surrender yourself." + } + ], + "scene": false + }, + "cityv058": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "This sector is off limits." + } + ], + "scene": false + }, + "cityv061": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "All systems back online and in the green." + } + ], + "scene": false + }, + "cityv062": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The race is about to begin." + } + ], + "scene": false + }, + "cityv063": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Welcome to the city transportation system." + } + ], + "scene": false + }, + "cityv064": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You can thrust in your vehicle at any time." + } + ], + "scene": false + }, + "cityv065": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Braking will assist in vehicle control." + } + ], + "scene": false + }, + "cityv067": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Backing up is easy." + } + ], + "scene": false + }, + "cityv068": { + "lines": [ + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You can hover in one of two zones: low and high." + } + ], + "scene": false + }, + "cityv069": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Try switching hover zones." + } + ], + "scene": false + }, + "cityv070": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Switching hover zones may help avoid traffic or" + }, + { + "end": 99.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 60.0, + "text": "ground obstacles." + } + ], + "scene": false + }, + "cityv075": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Alert: Vehicle destruction imminent." + } + ], + "scene": false + }, + "cityv076": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Please drive more carefully next time." + } + ], + "scene": false + }, + "cityv077": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Thank you for using the vehicle." + } + ], + "scene": false + }, + "cityv078": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Have a nice day." + } + ], + "scene": false + }, + "cityv079": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Warning: Missile cooling systems damaged." + } + ], + "scene": false + }, + "cityv080": { + "lines": [ + { + "end": 68.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Alert: Backup cooling system failure." + }, + { + "end": 123.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 69.0, + "text": "Emergency overrides initiated." + } + ], + "scene": false + }, + "cityv081": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Missile systems at critical overload." + }, + { + "end": 105.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 59.0, + "text": "Failsafe not responding." + } + ], + "scene": false + }, + "cityv082": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Danger: Warhead detonation imminent." + }, + { + "end": 104.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 66.0, + "text": "Evacuate immediately." + } + ], + "scene": false + }, + "cityv087": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Arriving at Throne Room floor." + } + ], + "scene": false + }, + "cityv088": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Arriving at ground floor." + } + ], + "scene": false + }, + "cityv093": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You have been sentenced to termination." + } + ], + "scene": false + }, + "cityv094": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "This area is restricted." + }, + { + "end": 122.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 44.0, + "text": "Initiating termination with extreme prejudice." + } + ], + "scene": false + }, + "cityv095": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "This area open to Krimzon Guard personnel only." + } + ], + "scene": false + }, + "cityv096": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The city is on high alert." + } + ], + "scene": false + }, + "cityv097": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The city is under attack." + }, + { + "end": 106.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 37.0, + "text": "All citizens proceed to safe shelters." + } + ], + "scene": false + }, + "cityv098": { + "lines": [ + { + "end": 81.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The city is under attack. Please stay in your homes." + } + ], + "scene": false + }, + "cityv099": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Metal Head aggressors are infiltrating the system." + } + ], + "scene": false + }, + "cityv100": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Congratulations on receiving a Security Pass." + } + ], + "scene": false + }, + "cityv107": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Unauthorized use of Fortress door." + }, + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 55.0, + "text": "Activating security tank." + } + ], + "scene": false + }, + "cityv108": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Gunpod weapons coming online." + } + ], + "scene": false + }, + "cityv109": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Weapons overheating." + } + ], + "scene": false + }, + "cityv110": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Weapons inoperative. Please wait for cooling." + } + ], + "scene": false + }, + "cityv111": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Weapons back online." + } + ], + "scene": false + }, + "cityv112": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The gunpod has taken severe damage." + } + ], + "scene": false + }, + "cityv130": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "The city map is displayed in the lower right." + } + ], + "scene": false + }, + "cityv132": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Follow the icons on the map " + }, + { + "end": 85.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 35.0, + "text": "to reach important destinations." + } + ], + "scene": false + }, + "cityv134": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Intruder alert." + } + ], + "scene": false + }, + "cityv135": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Stand by." + } + ], + "scene": false + }, + "cityv146": { + "lines": [ + { + "end": 62.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I'm experiencing a circuit overload." + }, + { + "end": 124.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 63.0, + "text": "Turn on my bypass switches within the time limit" + }, + { + "end": 169.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 125.0, + "text": "and you will be rewarded." + } + ], + "scene": false + }, + "cityv147": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You failed to turn on the bypass grid in time." + }, + { + "end": 126.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 71.0, + "text": "My C-Zone circuits have overloaded." + } + ], + "scene": false + }, + "cityv148": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You successfully switched on the bypass" + }, + { + "end": 90.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 48.0, + "text": "for my circuits in time." + }, + { + "end": 127.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 91.0, + "text": "Here is a reward." + } + ], + "scene": false + }, + "cityv149": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I need emergency power for my Eco Converters." + }, + { + "end": 133.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 78.0, + "text": "Switch on all available circuits quickly" + }, + { + "end": 180.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 134.0, + "text": "to stabilize the Eco Grid." + } + ], + "scene": false + }, + "cityv150": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You didn't reach all the switches in time." + }, + { + "end": 116.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 59.0, + "text": "The Eco Grid is still unstable." + } + ], + "scene": false + }, + "cityv151": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You successfully switched on the circuits" + }, + { + "end": 102.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 48.0, + "text": "to stabilize the Eco Grid." + }, + { + "end": 136.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 103.0, + "text": "You have earned a reward." + } + ], + "scene": false + }, + "cityv152": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "I have detected a Dark Eco spill." + }, + { + "end": 102.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 57.0, + "text": "You must remove this hazard quickly" + }, + { + "end": 153.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 103.0, + "text": "before the city is contaminated." + } + ], + "scene": false + }, + "cityv153": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You did not remove all the Dark Eco quickly enough." + } + ], + "scene": false + }, + "cityv154": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You removed the Dark Eco hazard in time." + }, + { + "end": 111.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 67.0, + "text": "The city is grateful to you." + } + ], + "scene": false + }, + "cityv155": { + "lines": [ + { + "end": 94.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Sensors indicate a cluster of Blue Eco in the city." + }, + { + "end": 149.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 95.0, + "text": "Collect all eco before it dissipates" + }, + { + "end": 192.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 150.0, + "text": "and you will be rewarded." + } + ], + "scene": false + }, + "cityv156": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You did not retrieve all of the eco." + } + ], + "scene": false + }, + "cityv157": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You successfully retrieved the eco." + }, + { + "end": 91.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 55.0, + "text": "Here is your reward." + } + ], + "scene": false + }, + "cityv158": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Emergency response needed." + }, + { + "end": 108.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 53.0, + "text": "Runaway bomb bots detected and headed for" + }, + { + "end": 190.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 109.0, + "text": "populated areas. Neutralize all bomb bots" + }, + { + "end": 226.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 191.0, + "text": "before it's too late." + } + ], + "scene": false + }, + "cityv159": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You failed to neutralize the runaway bomb bots." + } + ], + "scene": false + }, + "cityv160": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You destroyed the runaway bomb bots." + }, + { + "end": 102.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 64.0, + "text": "The city thanks you." + } + ], + "scene": false + }, + "cityv161": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Get to this point in the game quickly" + }, + { + "end": 100.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 47.0, + "text": "and you will receive a prize." + } + ], + "scene": false + }, + "cityv162": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Try to find this spot." + } + ], + "scene": false + }, + "cityv163": { + "lines": [ + { + "end": 60.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Can you identify this place and get there?" + } + ], + "scene": false + }, + "cityv164": { + "lines": [ + { + "end": 89.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Make it here in the time allotted and a reward is yours." + } + ], + "scene": false + }, + "cityv165": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Find this spot for a prize." + } + ], + "scene": false + }, + "cityv166": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Get to this spot for a prize." + } + ], + "scene": false + }, + "cityv167": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Metal Heads have been detected in the gun course." + }, + { + "end": 126.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 68.0, + "text": "Neutralize them all immediately." + } + ], + "scene": false + }, + "cityv168": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You did not kill them all." + } + ], + "scene": false + }, + "cityv169": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Excellent shooting. Threat eliminated." + } + ], + "scene": false + }, + "cityv170": { + "lines": [ + { + "end": 81.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Get a high score on the JET-Board and receive a prize." + } + ], + "scene": false + }, + "cityv171": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Try for a high score and receive a prize." + } + ], + "scene": false + }, + "cityv172": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You did not achieve a high enough score." + } + ], + "scene": false + }, + "cityv173": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Congratulations, you achieved a high enough score." + } + ], + "scene": false + }, + "cityv174": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Welcome to the Stadium Central Computer." + }, + { + "end": 117.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 70.0, + "text": "Please select your challenge." + } + ], + "scene": false + }, + "cityv175": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Attention, all citizens:" + }, + { + "end": 121.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 54.0, + "text": "The Class 1 Race is about to begin." + } + ], + "scene": false + }, + "cityv176": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Attention, all citizens:" + }, + { + "end": 127.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 56.0, + "text": "The Class 2 Race is about to begin." + } + ], + "scene": false + }, + "cityv177": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Attention, all citizens:" + }, + { + "end": 127.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 55.0, + "text": "The Class 3 Race is about to begin." + } + ], + "scene": false + }, + "cityv178": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Care to try for the course record?" + } + ], + "scene": false + }, + "cityv179": { + "lines": [ + { + "end": 83.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Congratulations, you achieved the gold record." + } + ], + "scene": false + }, + "cityv180": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Congratulations, you achieved the silver record." + } + ], + "scene": false + }, + "cityv181": { + "lines": [ + { + "end": 92.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Congratulations, you achieved the bronze record." + } + ], + "scene": false + }, + "cityv182": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Care to try for a high score record?" + } + ], + "scene": false + }, + "cityv183": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Would you like to try for a high score?" + } + ], + "scene": false + }, + "cityv184": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Welcome to the Racing Time Trials." + } + ], + "scene": false + }, + "cityv185": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Would you like to race for a record time?" + } + ], + "scene": false + }, + "cityv186": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Choose your course." + } + ], + "scene": false + }, + "cityv187": { + "lines": [ + { + "end": 60.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Would you like to try for a course record?" + } + ], + "scene": false + }, + "cityv188": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Would you like to use Orbs to buy a secret?" + } + ], + "scene": false + }, + "cityv189": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You do not have enough Orbs for this secret." + } + ], + "scene": false + }, + "cityv190": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Secret activated." + } + ], + "scene": false + }, + "cityv191": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "All secrets are activated." + } + ], + "scene": false + }, + "cityv192": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Please exit the Titan Suit." + } + ], + "scene": false + }, + "cityv193": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "You must exit the Titan Suit." + } + ], + "scene": false + }, + "cityv194": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Vehicles must remain within city limits." + } + ], + "scene": false + }, + "cityv195": { + "lines": [ + { + "end": 83.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Exit denied. Enemy targets still present." + } + ], + "scene": false + }, + "cityv196": { + "lines": [ + { + "end": 89.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Exit denied. Metal Head eggs still detected." + } + ], + "scene": false + }, + "cityv197": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "computer", + "start": 0.0, + "text": "Scanners show Metal Head eggs still active." + } + ], + "scene": false + }, + "consite-find-baron-res": { + "lines": [ + { + "end": 158.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 113.0, + "text": "" + }, + { + "end": 366.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 161.0, + "text": "" + }, + { + "end": 568.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 367.0, + "text": "" + }, + { + "end": 694.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 569.0, + "text": "" + }, + { + "end": 809.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 751.0, + "text": "" + }, + { + "end": 1130.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 939.0, + "text": "" + }, + { + "end": 1345.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1131.0, + "text": "" + }, + { + "end": 1458.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1357.0, + "text": "" + }, + { + "end": 1499.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1459.0, + "text": "" + }, + { + "end": 1785.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1604.0, + "text": "" + }, + { + "end": 2006.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1821.0, + "text": "" + }, + { + "end": 2198.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2007.0, + "text": "" + }, + { + "end": 2393.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2209.0, + "text": "" + }, + { + "end": 2535.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2469.0, + "text": "" + }, + { + "end": 2675.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2553.0, + "text": "" + }, + { + "end": 2827.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2676.0, + "text": "" + }, + { + "end": 2936.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2828.0, + "text": "" + }, + { + "end": 3011.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2962.0, + "text": "" + }, + { + "end": 3110.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3013.0, + "text": "" + } + ], + "scene": true + }, + "crane-intro": { + "lines": [ + { + "end": 112.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 6.0, + "text": "" + }, + { + "end": 172.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 113.0, + "text": "" + }, + { + "end": 278.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 173.0, + "text": "" + }, + { + "end": 317.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 279.0, + "text": "" + }, + { + "end": 468.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 318.0, + "text": "" + }, + { + "end": 515.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 472.0, + "text": "" + }, + { + "end": 650.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 520.0, + "text": "" + }, + { + "end": 762.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 651.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 763.0, + "text": "" + }, + { + "end": 950.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 858.0, + "text": "" + }, + { + "end": 1072.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 951.0, + "text": "" + }, + { + "end": 1208.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1078.0, + "text": "" + }, + { + "end": 1266.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1210.0, + "text": "" + } + ], + "scene": true + }, + "dig-find-totem-intro": { + "lines": [ + { + "end": 127.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 61.0, + "text": "" + }, + { + "end": 200.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 128.0, + "text": "" + }, + { + "end": 226.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 201.0, + "text": "" + }, + { + "end": 318.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 233.0, + "text": "" + }, + { + "end": 412.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 320.0, + "text": "" + }, + { + "end": 511.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 414.0, + "text": "" + }, + { + "end": 660.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 518.0, + "text": "" + }, + { + "end": 780.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 661.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 781.0, + "text": "" + }, + { + "end": 983.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 853.0, + "text": "" + }, + { + "end": 1082.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 984.0, + "text": "" + }, + { + "end": 1198.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1083.0, + "text": "" + }, + { + "end": 1322.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1199.0, + "text": "" + }, + { + "end": 1400.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1323.0, + "text": "" + }, + { + "end": 1458.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1404.0, + "text": "" + }, + { + "end": 1608.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1460.0, + "text": "" + }, + { + "end": 1774.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1609.0, + "text": "" + }, + { + "end": 1952.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1775.0, + "text": "" + }, + { + "end": 2032.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1953.0, + "text": "" + }, + { + "end": 2173.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2037.0, + "text": "" + }, + { + "end": 2279.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2174.0, + "text": "" + }, + { + "end": 2397.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2280.0, + "text": "" + }, + { + "end": 2507.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2398.0, + "text": "" + }, + { + "end": 2607.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2508.0, + "text": "" + }, + { + "end": 2713.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2607.0, + "text": "" + }, + { + "end": 2797.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2714.0, + "text": "" + }, + { + "end": 2883.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2798.0, + "text": "" + } + ], + "scene": true + }, + "dig-find-totem-res": { + "lines": [ + { + "end": 208.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 96.0, + "text": "" + }, + { + "end": 397.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 313.0, + "text": "" + }, + { + "end": 588.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 559.0, + "text": "" + } + ], + "scene": true + }, + "dig-knock-down-scaffolding-intro": { + "lines": [ + { + "end": 114.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 52.0, + "text": "" + }, + { + "end": 254.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 145.0, + "text": "" + }, + { + "end": 321.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 277.0, + "text": "" + }, + { + "end": 526.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 352.0, + "text": "" + }, + { + "end": 587.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 535.0, + "text": "" + }, + { + "end": 708.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 612.0, + "text": "" + }, + { + "end": 902.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 709.0, + "text": "" + }, + { + "end": 1036.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 907.0, + "text": "" + }, + { + "end": 1143.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1038.0, + "text": "" + }, + { + "end": 1267.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1144.0, + "text": "" + }, + { + "end": 1387.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1268.0, + "text": "" + }, + { + "end": 1461.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1388.0, + "text": "" + }, + { + "end": 1593.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1462.0, + "text": "" + }, + { + "end": 1695.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1594.0, + "text": "" + }, + { + "end": 1832.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1696.0, + "text": "" + } + ], + "scene": true + }, + "drill-destroy-control-tower-intro": { + "lines": [ + { + "end": 129.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 34.0, + "text": "" + }, + { + "end": 245.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 130.0, + "text": "" + }, + { + "end": 416.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 246.0, + "text": "" + }, + { + "end": 497.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 417.0, + "text": "" + }, + { + "end": 580.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 504.0, + "text": "" + }, + { + "end": 611.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 583.0, + "text": "" + }, + { + "end": 659.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 613.0, + "text": "" + }, + { + "end": 826.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 663.0, + "text": "" + }, + { + "end": 992.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 827.0, + "text": "" + }, + { + "end": 1175.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1004.0, + "text": "" + }, + { + "end": 1296.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1176.0, + "text": "" + }, + { + "end": 1395.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1297.0, + "text": "" + }, + { + "end": 1544.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1396.0, + "text": "" + }, + { + "end": 1623.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1545.0, + "text": "" + }, + { + "end": 1666.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1650.0, + "text": "" + }, + { + "end": 1768.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1679.0, + "text": "" + }, + { + "end": 1887.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1769.0, + "text": "" + }, + { + "end": 2043.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1888.0, + "text": "" + } + ], + "scene": true + }, + "drill-destroy-ship-intro": { + "lines": [ + { + "end": 137.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 30.0, + "text": "" + }, + { + "end": 285.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 144.0, + "text": "" + }, + { + "end": 404.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 286.0, + "text": "" + }, + { + "end": 607.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 420.0, + "text": "" + }, + { + "end": 715.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 608.0, + "text": "" + }, + { + "end": 834.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 716.0, + "text": "" + }, + { + "end": 964.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 835.0, + "text": "" + }, + { + "end": 1049.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 969.0, + "text": "" + }, + { + "end": 1148.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1100.0, + "text": "" + }, + { + "end": 1232.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1149.0, + "text": "" + }, + { + "end": 1274.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1233.0, + "text": "" + }, + { + "end": 1388.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1284.0, + "text": "" + }, + { + "end": 1574.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1408.0, + "text": "" + }, + { + "end": 1662.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1575.0, + "text": "" + }, + { + "end": 1827.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1663.0, + "text": "" + }, + { + "end": 1957.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1828.0, + "text": "" + }, + { + "end": 2066.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1958.0, + "text": "" + } + ], + "scene": true + }, + "drill-kill-metal-heads-intro": { + "lines": [ + { + "end": 157.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 65.0, + "text": "" + }, + { + "end": 254.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 168.0, + "text": "" + }, + { + "end": 365.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 257.0, + "text": "" + }, + { + "end": 428.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 366.0, + "text": "" + }, + { + "end": 502.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 429.0, + "text": "" + }, + { + "end": 645.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 503.0, + "text": "" + }, + { + "end": 735.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 646.0, + "text": "" + }, + { + "end": 811.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 740.0, + "text": "" + }, + { + "end": 890.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 812.0, + "text": "" + }, + { + "end": 933.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 891.0, + "text": "" + }, + { + "end": 1053.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 934.0, + "text": "" + }, + { + "end": 1144.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1054.0, + "text": "" + }, + { + "end": 1226.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1147.0, + "text": "" + }, + { + "end": 1363.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1230.0, + "text": "" + }, + { + "end": 1498.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1364.0, + "text": "" + }, + { + "end": 1618.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1499.0, + "text": "" + }, + { + "end": 1824.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1619.0, + "text": "" + } + ], + "scene": true + }, + "ds001": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We gotta find the Baron, Jak." + } + ], + "scene": false + }, + "ds005": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Jak, those are Metal Heads!" + } + ], + "scene": false + }, + "ds006": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Finally, now we get to see the Shadow!" + }, + { + "end": 140.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 66.0, + "text": "What do ya gotta do around this place to get noticed?" + } + ], + "scene": false + }, + "ds012": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That must be the Ruby Key to the city." + } + ], + "scene": false + }, + "ds013": { + "lines": [ + { + "end": 81.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Statues are becoming an endangered species around here." + } + ], + "scene": false + }, + "ds014": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "So this is Mar's scary tomb, eh?" + }, + { + "end": 106.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 71.0, + "text": "Doesn't look so bad." + } + ], + "scene": false + }, + "ds016": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's bring the money back to Krew." + } + ], + "scene": false + }, + "ds017": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That must be the ammo and missile Torn told us to blow up!" + } + ], + "scene": false + }, + "ds018": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get the tank to shoot the missile!" + } + ], + "scene": false + }, + "ds019": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Break those tubes in the center." + } + ], + "scene": false + }, + "ds020": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Please tell me you remember how to roll..." + } + ], + "scene": false + }, + "ds023": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's rock!" + } + ], + "scene": false + }, + "ds024": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Here we go!" + } + ], + "scene": false + }, + "ds025": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "All right!" + } + ], + "scene": false + }, + "ds026": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah!" + } + ], + "scene": false + }, + "ds028": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oh yeah!" + } + ], + "scene": false + }, + "ds029": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's go back to the city." + } + ], + "scene": false + }, + "ds030": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I think we need to go back to the city, Jak." + } + ], + "scene": false + }, + "ds031": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's go talk to Torn." + } + ], + "scene": false + }, + "ds032": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's go back to the Underground Hideout." + } + ], + "scene": false + }, + "ds043": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You can get a longer jump by rolling into it." + } + ], + "scene": false + }, + "ds044": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Use a long jump to get across this gap." + } + ], + "scene": false + }, + "ds045": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Nice form!" + } + ], + "scene": false + }, + "ds046": { + "lines": [ + { + "end": 68.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "If you duck before you jump, you'll go higher." + }, + { + "end": 147.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 69.0, + "text": "You'll need a high jump to reach the top of this ledge, Jak." + } + ], + "scene": false + }, + "ds047": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooh, that's a high one." + }, + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 58.0, + "text": "You'll need to jump," + }, + { + "end": 143.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 80.0, + "text": "then jump again in the air to get up there." + } + ], + "scene": false + }, + "ds048": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hit 'em again, Jak!" + } + ], + "scene": false + }, + "ds049": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Do a spin kick!" + } + ], + "scene": false + }, + "ds050": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Robotank, run!" + } + ], + "scene": false + }, + "ds051": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, we should stay with Sig." + } + ], + "scene": false + }, + "ds052": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, big guy, keep close, huh?" + } + ], + "scene": false + }, + "ds053": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We're too far away from Sig." + } + ], + "scene": false + }, + "ds054": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Stick with the plan, Jak, protect Sig!" + } + ], + "scene": false + }, + "ds055": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Uh oh, where's Sig?" + } + ], + "scene": false + }, + "ds056": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Wow, what a blast!" + } + ], + "scene": false + }, + "ds057": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Sig's a good shot." + } + ], + "scene": false + }, + "ds058": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Go help Sig!" + } + ], + "scene": false + }, + "ds059": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Nice shootin', Sig!" + } + ], + "scene": false + }, + "ds060": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You're my hero!" + } + ], + "scene": false + }, + "ds061": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Uh oh, Sig's in trouble!" + } + ], + "scene": false + }, + "ds062": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There's another Metal Head going after our boy! " + }, + { + "end": 85.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 59.0, + "text": "Shoot it, shoot it!" + } + ], + "scene": false + }, + "ds063": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Keep Sig safe, Jak!" + } + ], + "scene": false + }, + "ds064": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Whoa, Sig's really getting roughed up!" + } + ], + "scene": false + }, + "ds065": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot 'em, shoot 'em!" + } + ], + "scene": false + }, + "ds066": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Sig dies, we die." + } + ], + "scene": false + }, + "ds067": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oof, we suck..." + } + ], + "scene": false + }, + "ds068": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We have to keep 'em away from Sig." + } + ], + "scene": false + }, + "ds069": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We need to find the valve to turn the water back on." + } + ], + "scene": false + }, + "ds094": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Robotank, run!" + } + ], + "scene": false + }, + "ds095": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Here comes that tank again!" + } + ], + "scene": false + }, + "ds096": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get the tank to shoot the missile!" + } + ], + "scene": false + }, + "ds099": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We need to get to the top of that tower!" + } + ], + "scene": false + }, + "ds100": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Climb the ruined tower, Jak!" + } + ], + "scene": false + }, + "ds111": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We should come back with the Titan Suit to do this path." + } + ], + "scene": false + }, + "ds112": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You've got a mechanical fist, Jak. Use it!" + } + ], + "scene": false + }, + "ds113": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Break the door!" + } + ], + "scene": false + }, + "ds114": { + "lines": [ + { + "end": 72.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "800 pound Tigorilla comin' through!" + } + ], + "scene": false + }, + "ds115": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Smashing work, Jak! Oh, that was funny." + } + ], + "scene": false + }, + "ds116": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot the platform, Jak." + } + ], + "scene": false + }, + "ds117": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We need something to get through that gate." + } + ], + "scene": false + }, + "ds118": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot the Metal Head when he moves his shield." + } + ], + "scene": false + }, + "ds119": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hit him in his stomach." + } + ], + "scene": false + }, + "ds120": { + "lines": [ + { + "end": 90.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Whoa, that path dropped like a... a rock!" + } + ], + "scene": false + }, + "ds121": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Smack the box, baby!" + } + ], + "scene": false + }, + "ds128": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Good, we're through." + } + ], + "scene": false + }, + "ds129": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot the gun, Jak!" + } + ], + "scene": false + }, + "ds143": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We're supposed to keep Krew's guys alive, Jak!" + } + ], + "scene": false + }, + "ds144": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Save 'em, Jak!" + } + ], + "scene": false + }, + "ds145": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Don't like this, Jak..." + } + ], + "scene": false + }, + "ds146": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Behind us, Jak!" + } + ], + "scene": false + }, + "ds147": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Metal Heads! Everywhere!" + } + ], + "scene": false + }, + "ds148": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Protect us, Jak! But first me." + } + ], + "scene": false + }, + "ds150": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Take a vehicle, Jak! It's faster." + } + ], + "scene": false + }, + "ds151": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Use your JET-Board!" + } + ], + "scene": false + }, + "ds152": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We got company, Jak! Lots of guards!" + } + ], + "scene": false + }, + "ds160": { + "lines": [ + { + "end": 113.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That's right, we're bad! The Precursor Stone is ours!" + } + ], + "scene": false + }, + "ds161": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There's Mar's gun, Jak! Let's go check it out." + } + ], + "scene": false + }, + "ds162": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "These Precursor Orbs are worth a lot now." + }, + { + "end": 110.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 64.0, + "text": "We might find a few hidden around," + }, + { + "end": 168.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 111.0, + "text": "or get some doing difficult tasks." + }, + { + "end": 226.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 169.0, + "text": "We'll be able to buy stuff with 'em!" + } + ], + "scene": false + }, + "ds163": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Jak, now that we have the Palace Security Pass," + }, + { + "end": 145.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 71.0, + "text": "let's go have some fun in the big man's crib!" + } + ], + "scene": false + }, + "ds164": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Back up to get out of the mech." + } + ], + "scene": false + }, + "ds165": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We're free, Jak! Thanks to me." + }, + { + "end": 123.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 67.0, + "text": "Nice to breathe some fresh air, huh?" + }, + { + "end": 200.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 124.0, + "text": "We'll get that Baron Praxis guy, alright!" + } + ], + "scene": false + }, + "ds166": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I'm not getting out of this pod" + }, + { + "end": 126.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 42.0, + "text": "'till you kill all those crazy flyin' Metal Heads!" + } + ], + "scene": false + }, + "ds167": { + "lines": [ + { + "end": 83.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I wonder why they wanted us to protect Samos' Hut." + }, + { + "end": 143.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 84.0, + "text": "Maybe now we'll get to meet the Shadow." + } + ], + "scene": false + }, + "ds168": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There's the Rift Ring!" + } + ], + "scene": false + }, + "ds173": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ahhh!" + } + ], + "scene": false + }, + "ds174": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooooh!" + } + ], + "scene": false + }, + "ds175": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Whoa-whoa-oaa-ah!" + } + ], + "scene": false + }, + "ds176": { + "lines": [ + { + "end": 11.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Whoa!" + } + ], + "scene": false + }, + "ds177": { + "lines": [ + { + "end": 8.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey!" + } + ], + "scene": false + }, + "ds178": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, watch that!" + } + ], + "scene": false + }, + "ds179": { + "lines": [ + { + "end": 10.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooh!" + } + ], + "scene": false + }, + "ds180": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oh, boy!" + } + ], + "scene": false + }, + "ds181": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Uooaaoh!" + } + ], + "scene": false + }, + "ds182": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Wow, that was close!" + } + ], + "scene": false + }, + "ds183": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oh, boy!" + } + ], + "scene": false + }, + "ds184": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yes!" + } + ], + "scene": false + }, + "ds185": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah!" + } + ], + "scene": false + }, + "ds186": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, watch it!" + } + ], + "scene": false + }, + "ds187": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "All right!" + } + ], + "scene": false + }, + "ds188": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Move over!" + } + ], + "scene": false + }, + "ds189": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Orange Lightning coming through!" + } + ], + "scene": false + }, + "ds190": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Rollin' with the homies!" + } + ], + "scene": false + }, + "ds191": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You're mine!" + } + ], + "scene": false + }, + "ds192": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There they are!" + } + ], + "scene": false + }, + "ds193": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey! Watch where you're drivin'!" + } + ], + "scene": false + }, + "ds194": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "How do I drive this thing?" + } + ], + "scene": false + }, + "ds195": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah, that's right! I'm bad!" + } + ], + "scene": false + }, + "ds196": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Outta my way!" + } + ], + "scene": false + }, + "ds197": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Outta my way!" + } + ], + "scene": false + }, + "ds198": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Move it or lose it, buddy!" + } + ], + "scene": false + }, + "ds199": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Mm... bye-bye!" + } + ], + "scene": false + }, + "ds200": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Last lap!" + } + ], + "scene": false + }, + "ds201": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Come on, come on!" + } + ], + "scene": false + }, + "ds202": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Come on, come on, come on!" + } + ], + "scene": false + }, + "ds203": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Pedal to the metal!" + } + ], + "scene": false + }, + "ds204": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooooah, I gotta catch up!" + } + ], + "scene": false + }, + "ds205": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Turn and burn, baby!" + } + ], + "scene": false + }, + "ds206": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oooh, it's gonna be close!" + } + ], + "scene": false + }, + "ds207": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Eat my dust, buddy!" + } + ], + "scene": false + }, + "ds208": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Gotcha!" + } + ], + "scene": false + }, + "ds209": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "This is my track, grandma!" + } + ], + "scene": false + }, + "ds210": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Learn to drive!" + } + ], + "scene": false + }, + "ds211": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Turn, turn!" + } + ], + "scene": false + }, + "ds212": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Step on it!" + } + ], + "scene": false + }, + "ds213": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oooh, I won, I won!" + } + ], + "scene": false + }, + "ds214": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeee, that's a good lap time." + } + ], + "scene": false + }, + "ds215": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oh, yeah! I'm rockin'!" + } + ], + "scene": false + }, + "ds216": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Another lap in the record book!" + } + ], + "scene": false + }, + "ds217": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Take a good look at my tail!" + } + ], + "scene": false + }, + "ds218": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Wahoo!" + } + ], + "scene": false + }, + "ds219": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, fang boy, hurry up and get in," + }, + { + "end": 101.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 66.0, + "text": "we'll take you to Brutter!" + } + ], + "scene": false + }, + "ds220": { + "lines": [ + { + "end": 79.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Here's your boy, Brutter! We're off to get another animal!" + } + ], + "scene": false + }, + "ds221": { + "lines": [ + { + "end": 103.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yo, animal lover, get your furry butt in the vehicle!" + } + ], + "scene": false + }, + "ds222": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Here's another beast of burden!" + } + ], + "scene": false + }, + "ds223": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "In the vehicle, buddy, we can save you!" + } + ], + "scene": false + }, + "ds224": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Another Lurker freed." + } + ], + "scene": false + }, + "ds225": { + "lines": [ + { + "end": 89.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's move, eco breath! We gotta get you to Brutter." + } + ], + "scene": false + }, + "ds226": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, Brutter! Look what the cat turkey dragged in." + } + ], + "scene": false + }, + "ds227": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Lookie what we found!" + } + ], + "scene": false + }, + "ds228": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You recognize this monster?" + } + ], + "scene": false + }, + "ds229": { + "lines": [ + { + "end": 66.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We did it! We saved them all!" + } + ], + "scene": false + }, + "ds230": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Catch the paddywagon, Jak!" + } + ], + "scene": false + }, + "ds231": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Crash the paddywagon!" + } + ], + "scene": false + }, + "ds232": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "A little more damage and we got the sucker!" + } + ], + "scene": false + }, + "ds233": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "He's smoking, Jak! Hit him again!" + } + ], + "scene": false + }, + "ds234": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That caused some damage!" + } + ], + "scene": false + }, + "ds235": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "One more like that and he's through!" + } + ], + "scene": false + }, + "ds236": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Find the next vehicle!" + } + ], + "scene": false + }, + "ds237": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yes, we took it out!" + } + ], + "scene": false + }, + "ds238": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hunt and destroy, baby!" + } + ], + "scene": false + }, + "ds239": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hit it, hit it!" + } + ], + "scene": false + }, + "ds240": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Take it out!" + } + ], + "scene": false + }, + "ds241": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Pick up the Lurker, Jak!" + } + ], + "scene": false + }, + "ds242": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get the Lurker!" + } + ], + "scene": false + }, + "ds243": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We need to pick up that Lurker back there." + } + ], + "scene": false + }, + "ds244": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Usually, I don't like to be this close to Lurkers." + } + ], + "scene": false + }, + "ds245": { + "lines": [ + { + "end": 86.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ehehe, you seem like a nice, uh... animal." + } + ], + "scene": false + }, + "ds246": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Easy, buddy. Don't bite me!" + } + ], + "scene": false + }, + "ds247": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hey, stop slobbering on me!" + } + ], + "scene": false + }, + "ds248": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "He's recharging!" + } + ], + "scene": false + }, + "ds249": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooh, we got him good that time!" + } + ], + "scene": false + }, + "ds250": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah, now he's hurtin'!" + } + ], + "scene": false + }, + "ds251": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Good shot, Jak!" + } + ], + "scene": false + }, + "ds252": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Incoming!" + } + ], + "scene": false + }, + "ds253": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah, we got him!" + } + ], + "scene": false + }, + "ds254": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Jak, hide behind the pillars when he shoots!" + } + ], + "scene": false + }, + "ds255": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "He's got the Precursor Stone!" + } + ], + "scene": false + }, + "ds256": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Kick the bomb right at him, Jak!" + } + ], + "scene": false + }, + "ds257": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That one hit him!" + } + ], + "scene": false + }, + "ds258": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Look out!" + } + ], + "scene": false + }, + "ds259": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Jump the gap!" + } + ], + "scene": false + }, + "ds260": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah, you hit him!" + } + ], + "scene": false + }, + "ds261": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "As if there wasn't enough of Krew already." + } + ], + "scene": false + }, + "ds262": { + "lines": [ + { + "end": 75.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot 'em all, Jak! We'll sort 'em out later..." + } + ], + "scene": false + }, + "ds263": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There's the real Krew! Shoot him!" + } + ], + "scene": false + }, + "ds264": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You got him!" + } + ], + "scene": false + }, + "ds265": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Watch your back, Jak!" + } + ], + "scene": false + }, + "ds266": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "They're comin' again!" + } + ], + "scene": false + }, + "ds267": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Now you've got us mad." + } + ], + "scene": false + }, + "ds268": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Good shot, Jak! The big man is hurtin' now." + } + ], + "scene": false + }, + "ds269": { + "lines": [ + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "And the challenger is down for the count!" + } + ], + "scene": false + }, + "ds270": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Keep movin', baby! He's gonna shoot!" + } + ], + "scene": false + }, + "ds271": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Wooh, here come some Metal Heads!" + } + ], + "scene": false + }, + "ds272": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Protect the kid!" + } + ], + "scene": false + }, + "ds273": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Kill all the Metal Heads!" + } + ], + "scene": false + }, + "ds274": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "More Metal Heads!" + } + ], + "scene": false + }, + "ds275": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot Kor's legs out, Jak!" + } + ], + "scene": false + }, + "ds276": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "He's down, Jak! Hit him in the head!" + } + ], + "scene": false + }, + "ds277": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Boot to the head, boot to the head!" + } + ], + "scene": false + }, + "ds278": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I think we should hide somewhere!" + } + ], + "scene": false + }, + "ds279": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Take cover before he blows!" + } + ], + "scene": false + }, + "ds280": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah, you got him good that time!" + } + ], + "scene": false + }, + "ds281": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Oh, man, now he's angry!" + } + ], + "scene": false + }, + "ds282": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get him, Jak!" + } + ], + "scene": false + }, + "ds283": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "He's gonna shoot!" + } + ], + "scene": false + }, + "ds284": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Nice hit, partner!" + } + ], + "scene": false + }, + "ds285": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That had to hurt him." + } + ], + "scene": false + }, + "ds286": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You messed with the wrong heroes, buddy!" + } + ], + "scene": false + }, + "ds287": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot him again, Jak!" + } + ], + "scene": false + }, + "ds288": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Jak, we're taking a beating!" + } + ], + "scene": false + }, + "ds289": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Stay away from the Dark Eco!" + } + ], + "scene": false + }, + "ds302": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We've almost got him, Jak!" + } + ], + "scene": false + }, + "ds303": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That's it! You did it!" + } + ], + "scene": false + }, + "ds305": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot the switch to change the coveyor belt's" + }, + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 54.0, + "text": "direction!" + } + ], + "scene": false + }, + "ds306": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You gotta shoot the switch, Jak!" + } + ], + "scene": false + }, + "ds307": { + "lines": [ + { + "end": 72.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Find the switch to change the conveyor's direction!" + } + ], + "scene": false + }, + "ds321": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Take out the turrets!" + } + ], + "scene": false + }, + "ds322": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Hit the turrets, Jak!" + } + ], + "scene": false + }, + "ds323": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Doin' some damage!" + } + ], + "scene": false + }, + "ds324": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get in the Titan Suit!" + } + ], + "scene": false + }, + "ds325": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot that ship!" + } + ], + "scene": false + }, + "ds326": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Yeah, that ship's feelin' it now!" + } + ], + "scene": false + }, + "ds327": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ooh, direct hits." + } + ], + "scene": false + }, + "ds328": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I think you hurt it that time!" + } + ], + "scene": false + }, + "ds329": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "The ship's goin' down! You did it, Jak!" + } + ], + "scene": false + }, + "ds353": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That must be the missile Torn wants us to blow up!" + } + ], + "scene": false + }, + "ds354": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Break those tubes in the center, Jak!" + } + ], + "scene": false + }, + "ds372": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Gotta ride the JET-Board on this one, Jak!" + } + ], + "scene": false + }, + "ds375": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Look out for the ray!" + } + ], + "scene": false + }, + "ds378": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We gotta break all the support cables!" + } + ], + "scene": false + }, + "ds379": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Grind on the support bases to break the cables." + } + ], + "scene": false + }, + "ds394": { + "lines": [ + { + "end": 108.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Spider! Spider! Huff... huff... I hate spiders!" + } + ], + "scene": false + }, + "ds395": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Gotta run, gotta run!" + } + ], + "scene": false + }, + "ds398": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "The first beam!" + } + ], + "scene": false + }, + "ds399": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "The second beam! The door's opening!" + } + ], + "scene": false + }, + "ds404": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There's Sig!" + } + ], + "scene": false + }, + "ds405": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get the blocks to go into the slots, Jak!" + } + ], + "scene": false + }, + "ds406": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot or kick the blocks!" + } + ], + "scene": false + }, + "ds407": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You have to get the blocks in the slots faster!" + } + ], + "scene": false + }, + "ds408": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Run, Jak!" + } + ], + "scene": false + }, + "ds409": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Keep moving!" + } + ], + "scene": false + }, + "ds410": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We gotta stay ahead of that thing!" + } + ], + "scene": false + }, + "ds439": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot all the Metal Head eggs, Jak!" + } + ], + "scene": false + }, + "ds440": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We didn't get all those nasty eggs!" + } + ], + "scene": false + }, + "ds441": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We missed some Metal Head eggs!" + } + ], + "scene": false + }, + "ds461": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We gotta jump onto the crate dangling from the crane!" + } + ], + "scene": false + }, + "ds462": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Use your hoverboard on this path!" + } + ], + "scene": false + }, + "ds463": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You can grind to cross those pipes using your" + }, + { + "end": 87.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 59.0, + "text": "hoverboard!" + } + ], + "scene": false + }, + "ds464": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ride the half-pipe to the end!" + } + ], + "scene": false + }, + "ds466": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You gotta drop a bomb into each well, Jak!" + } + ], + "scene": false + }, + "ds467": { + "lines": [ + { + "end": 68.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Use the ramp to get high enough to drop the bomb in!" + } + ], + "scene": false + }, + "ds468": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Gotta jump higher!" + } + ], + "scene": false + }, + "ds469": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Only a minute before we're toast, Jak!" + } + ], + "scene": false + }, + "ds470": { + "lines": [ + { + "end": 75.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "30 seconds left, then we go BOOM!" + } + ], + "scene": false + }, + "ds471": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Ten seconds left, Jak!" + } + ], + "scene": false + }, + "ds472": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That's one well down, five to go!" + } + ], + "scene": false + }, + "ds473": { + "lines": [ + { + "end": 58.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Two wells are history, four left!" + } + ], + "scene": false + }, + "ds474": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Three wells cut, only three to go!" + } + ], + "scene": false + }, + "ds475": { + "lines": [ + { + "end": 79.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "That's the fourth well, two bad boys left!" + } + ], + "scene": false + }, + "ds476": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You got the fifth well, only one to go!" + } + ], + "scene": false + }, + "ds477": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You got 'em all, Jak!" + } + ], + "scene": false + }, + "ds478": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "The last well is up where we rescued Vin!" + } + ], + "scene": false + }, + "ds479": { + "lines": [ + { + "end": 44.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Now he's vulnerable!" + } + ], + "scene": false + }, + "ds480": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Take him out!" + } + ], + "scene": false + }, + "ds481": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Get him while he's vulnerable!" + } + ], + "scene": false + }, + "ds482": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Here he comes..." + } + ], + "scene": false + }, + "ds483": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "How's it feel to have your pants down, Baron?" + } + ], + "scene": false + }, + "ds484": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Shoot him, shoot him!" + } + ], + "scene": false + }, + "ds485": { + "lines": [ + { + "end": 17.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Look out!" + } + ], + "scene": false + }, + "ds487": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Easy, Jak, we gotta get this guy to safety!" + } + ], + "scene": false + }, + "ds488": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We're takin' a lotta damage, buddy!" + } + ], + "scene": false + }, + "ds489": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We're gettin' our butts kicked!" + } + ], + "scene": false + }, + "ds490": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Maybe I should drive..." + } + ], + "scene": false + }, + "ds491": { + "lines": [ + { + "end": 49.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's go, wondergoon," + }, + { + "end": 108.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 50.0, + "text": "we'll take you to a safe place in the city!" + } + ], + "scene": false + }, + "ds492": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Okay, ride's over, out you go!" + } + ], + "scene": false + }, + "ds493": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "All aboard the Underground railroad!" + }, + { + "end": 125.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 68.0, + "text": "Next stop: Your new safehouse!" + } + ], + "scene": false + }, + "ds494": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I believe this is your stop!" + } + ], + "scene": false + }, + "ds495": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Daxter's Freedom Fighter Taxi Service!" + }, + { + "end": 119.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 71.0, + "text": "Hurry up, buddy, we ain't got all day." + } + ], + "scene": false + }, + "ds496": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Home free, baby!" + }, + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 35.0, + "text": "Don't forget to tell Torn how well we did!" + } + ], + "scene": false + }, + "ds497": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "You looking for a lift, fighter boy?" + } + ], + "scene": false + }, + "ds498": { + "lines": [ + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Okay, this is where you get off. So... get off." + } + ], + "scene": false + }, + "ds499": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "We did it, Jak!" + }, + { + "end": 107.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 39.0, + "text": "We got all the fighters to the new safehouses!" + } + ], + "scene": false + }, + "ds500": { + "lines": [ + { + "end": 84.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Statues are becoming an endangered species around here." + } + ], + "scene": false + }, + "ds501": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I got us a talkbox." + }, + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 41.0, + "text": "The city people use these things to communicate" + }, + { + "end": 119.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 98.0, + "text": "with each other." + } + ], + "scene": false + }, + "ds502": { + "lines": [ + { + "end": 77.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Let's go see Onin and her crazy monkey bird." + } + ], + "scene": false + }, + "ds503": { + "lines": [ + { + "end": 60.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "I think we need to go back to the city, Jak." + } + ], + "scene": false + }, + "dsek001": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Kid! Stay with him, Jak!" + } + ], + "scene": false + }, + "dsek002": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Catch up to them, Jak!" + } + ], + "scene": false + }, + "dsek003": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Where'd they go?!" + } + ], + "scene": false + }, + "dsek004": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There they go again!" + } + ], + "scene": false + }, + "dsek005": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Uh oh, here comes trouble!" + } + ], + "scene": false + }, + "dsek006": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "More guards!?" + } + ], + "scene": false + }, + "dsek007": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Kid, please! You're killin' me!" + } + ], + "scene": false + }, + "dsek008": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Here, poochie, poochie..." + } + ], + "scene": false + }, + "dsek009": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "There goes that crazy crocadog again...!" + } + ], + "scene": false + }, + "dsek010": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Chase after the Kid!" + } + ], + "scene": false + }, + "dsek011": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Keep up with the Kid!" + } + ], + "scene": false + }, + "dsek012": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Crocadog!" + } + ], + "scene": false + }, + "dsek013": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 0.0, + "text": "Phew, finally... let's get these two to Kor!" + } + ], + "scene": false + }, + "ecowells-intro": { + "lines": [ + { + "end": 133.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 46.0, + "text": "" + }, + { + "end": 344.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 134.0, + "text": "" + }, + { + "end": 394.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 350.0, + "text": "" + }, + { + "end": 466.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 397.0, + "text": "" + }, + { + "end": 623.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 467.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 662.0, + "text": "" + }, + { + "end": 976.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 892.0, + "text": "" + }, + { + "end": 1125.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 977.0, + "text": "" + }, + { + "end": 1287.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1228.0, + "text": "" + }, + { + "end": 1364.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1290.0, + "text": "" + }, + { + "end": 1469.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1412.0, + "text": "" + }, + { + "end": 1538.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1473.0, + "text": "" + }, + { + "end": 1603.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1567.0, + "text": "" + }, + { + "end": 1677.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1606.0, + "text": "" + }, + { + "end": 1723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1688.0, + "text": "" + }, + { + "end": 1869.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1789.0, + "text": "" + }, + { + "end": 2016.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1880.0, + "text": "" + }, + { + "end": 2117.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2039.0, + "text": "" + }, + { + "end": 2243.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2118.0, + "text": "" + }, + { + "end": 2335.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2261.0, + "text": "" + } + ], + "scene": true + }, + "ecowells-victory": { + "lines": [ + { + "end": 342.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 240.0, + "text": "" + } + ], + "scene": true + }, + "forest-catch-metal-heads-intro": { + "lines": [ + { + "end": 144.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 82.0, + "text": "" + }, + { + "end": 218.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 149.0, + "text": "" + }, + { + "end": 353.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 226.0, + "text": "" + }, + { + "end": 424.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 355.0, + "text": "" + }, + { + "end": 562.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 440.0, + "text": "" + }, + { + "end": 620.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 563.0, + "text": "" + }, + { + "end": 699.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 621.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 700.0, + "text": "" + }, + { + "end": 948.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 854.0, + "text": "" + }, + { + "end": 1012.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 949.0, + "text": "" + }, + { + "end": 1053.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1013.0, + "text": "" + }, + { + "end": 1176.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1055.0, + "text": "" + }, + { + "end": 1225.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1178.0, + "text": "" + }, + { + "end": 1276.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1227.0, + "text": "" + }, + { + "end": 1410.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1277.0, + "text": "" + }, + { + "end": 1517.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1411.0, + "text": "" + }, + { + "end": 1628.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1518.0, + "text": "" + }, + { + "end": 1723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1630.0, + "text": "" + }, + { + "end": 1777.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1724.0, + "text": "" + }, + { + "end": 1879.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1778.0, + "text": "" + }, + { + "end": 1990.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1880.0, + "text": "" + }, + { + "end": 2043.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1991.0, + "text": "" + }, + { + "end": 2172.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2044.0, + "text": "" + }, + { + "end": 2237.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2174.0, + "text": "" + }, + { + "end": 2389.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2238.0, + "text": "" + }, + { + "end": 2520.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2390.0, + "text": "" + }, + { + "end": 2639.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2521.0, + "text": "" + }, + { + "end": 2714.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2640.0, + "text": "" + } + ], + "scene": true + }, + "forest-hunt-camo-metal-heads-intro": { + "lines": [ + { + "end": 182.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 31.0, + "text": "" + }, + { + "end": 354.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 183.0, + "text": "" + }, + { + "end": 483.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 355.0, + "text": "" + }, + { + "end": 639.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 484.0, + "text": "" + }, + { + "end": 716.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 642.0, + "text": "" + }, + { + "end": 853.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 717.0, + "text": "" + }, + { + "end": 935.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 855.0, + "text": "" + }, + { + "end": 1002.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 943.0, + "text": "" + }, + { + "end": 1080.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1010.0, + "text": "" + }, + { + "end": 1191.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1082.0, + "text": "" + }, + { + "end": 1301.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1197.0, + "text": "" + }, + { + "end": 1410.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1302.0, + "text": "" + }, + { + "end": 1508.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1411.0, + "text": "" + }, + { + "end": 1582.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1509.0, + "text": "" + } + ], + "scene": true + }, + "forest-protect-samos-intro-a": { + "lines": [ + { + "end": 167.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 60.0, + "text": "" + }, + { + "end": 378.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 202.0, + "text": "" + }, + { + "end": 433.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 379.0, + "text": "" + }, + { + "end": 541.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 434.0, + "text": "" + }, + { + "end": 713.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 591.0, + "text": "" + }, + { + "end": 753.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 719.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 755.0, + "text": "" + }, + { + "end": 918.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 851.0, + "text": "" + }, + { + "end": 984.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 919.0, + "text": "" + }, + { + "end": 1050.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 985.0, + "text": "" + }, + { + "end": 1158.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1051.0, + "text": "" + }, + { + "end": 1210.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1175.0, + "text": "" + }, + { + "end": 1283.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1211.0, + "text": "" + }, + { + "end": 1349.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1284.0, + "text": "" + }, + { + "end": 1454.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1351.0, + "text": "" + }, + { + "end": 1504.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1455.0, + "text": "" + }, + { + "end": 1552.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1505.0, + "text": "" + }, + { + "end": 1624.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1563.0, + "text": "" + }, + { + "end": 1759.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1625.0, + "text": "" + }, + { + "end": 1906.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1760.0, + "text": "" + }, + { + "end": 1955.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1907.0, + "text": "" + } + ], + "scene": true + }, + "forest-protect-samos-intro-b": { + "lines": [ + { + "end": 152.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 60.0, + "text": "" + }, + { + "end": 293.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 153.0, + "text": "" + }, + { + "end": 398.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 298.0, + "text": "" + }, + { + "end": 435.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 410.0, + "text": "" + }, + { + "end": 490.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 450.0, + "text": "" + }, + { + "end": 520.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 492.0, + "text": "" + }, + { + "end": 579.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 521.0, + "text": "" + }, + { + "end": 672.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 580.0, + "text": "" + } + ], + "scene": true + }, + "forest-protect-samos-res": { + "lines": [ + { + "end": 98.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 38.0, + "text": "" + }, + { + "end": 224.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 99.0, + "text": "" + }, + { + "end": 302.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 225.0, + "text": "" + }, + { + "end": 448.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 303.0, + "text": "" + }, + { + "end": 582.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 449.0, + "text": "" + }, + { + "end": 742.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 583.0, + "text": "" + }, + { + "end": 808.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 743.0, + "text": "" + } + ], + "scene": true + }, + "fortress-2-intro": { + "lines": [ + { + "end": 336.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 163.0, + "text": "" + }, + { + "end": 468.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 350.0, + "text": "" + }, + { + "end": 590.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 469.0, + "text": "" + }, + { + "end": 794.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 604.0, + "text": "" + }, + { + "end": 910.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 795.0, + "text": "" + }, + { + "end": 1012.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 911.0, + "text": "" + }, + { + "end": 1112.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1013.0, + "text": "" + }, + { + "end": 1199.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1113.0, + "text": "" + }, + { + "end": 1306.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1201.0, + "text": "" + }, + { + "end": 1457.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1314.0, + "text": "" + }, + { + "end": 1604.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1468.0, + "text": "" + } + ], + "scene": true + }, + "fortress-blow-up-ammo-res-a": { + "lines": [ + { + "end": 213.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 64.0, + "text": "" + }, + { + "end": 316.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 299.0, + "text": "" + }, + { + "end": 652.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 500.0, + "text": "" + }, + { + "end": 851.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 748.0, + "text": "" + } + ], + "scene": true + }, + "fortress-blow-up-ammo-res-b": { + "lines": [ + { + "end": 814.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 702.0, + "text": "" + } + ], + "scene": true + }, + "fortress-save-friends-intro-a": { + "lines": [ + { + "end": 114.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 30.0, + "text": "" + }, + { + "end": 167.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 137.0, + "text": "" + }, + { + "end": 329.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 225.0, + "text": "" + }, + { + "end": 416.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 339.0, + "text": "" + }, + { + "end": 572.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 426.0, + "text": "" + }, + { + "end": 630.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 573.0, + "text": "" + }, + { + "end": 773.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 649.0, + "text": "" + }, + { + "end": 859.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 774.0, + "text": "" + }, + { + "end": 915.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 861.0, + "text": "" + }, + { + "end": 1016.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 917.0, + "text": "" + }, + { + "end": 1155.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1033.0, + "text": "" + }, + { + "end": 1243.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1157.0, + "text": "" + } + ], + "scene": true + }, + "fortress-save-friends-res": { + "lines": [ + { + "end": 412.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 288.0, + "text": "" + }, + { + "end": 487.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 413.0, + "text": "" + }, + { + "end": 554.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 500.0, + "text": "" + }, + { + "end": 621.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 565.0, + "text": "" + }, + { + "end": 700.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 645.0, + "text": "" + }, + { + "end": 831.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 701.0, + "text": "" + }, + { + "end": 943.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 832.0, + "text": "" + }, + { + "end": 1027.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 947.0, + "text": "" + }, + { + "end": 1080.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1028.0, + "text": "" + }, + { + "end": 1179.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1089.0, + "text": "" + }, + { + "end": 1333.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1180.0, + "text": "" + }, + { + "end": 1451.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1337.0, + "text": "" + }, + { + "end": 1528.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1461.0, + "text": "" + }, + { + "end": 1653.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1536.0, + "text": "" + }, + { + "end": 1757.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1654.0, + "text": "" + }, + { + "end": 1843.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1768.0, + "text": "" + }, + { + "end": 1925.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1844.0, + "text": "" + }, + { + "end": 2054.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1926.0, + "text": "" + }, + { + "end": 2159.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2055.0, + "text": "" + }, + { + "end": 2237.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2160.0, + "text": "" + }, + { + "end": 2289.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2238.0, + "text": "" + }, + { + "end": 2380.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2291.0, + "text": "" + } + ], + "scene": true + }, + "intro-city-square": { + "lines": [ + { + "end": 744.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 583.0, + "text": "" + }, + { + "end": 835.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 745.0, + "text": "" + }, + { + "end": 900.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 840.0, + "text": "" + }, + { + "end": 971.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 928.0, + "text": "" + }, + { + "end": 1016.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 980.0, + "text": "" + }, + { + "end": 1094.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1022.0, + "text": "" + }, + { + "end": 1189.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1139.0, + "text": "" + }, + { + "end": 1319.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1241.0, + "text": "" + } + ], + "scene": true + }, + "intro-prison": { + "lines": [ + { + "end": 437.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 311.0, + "text": "" + }, + { + "end": 576.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 449.0, + "text": "" + }, + { + "end": 704.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 588.0, + "text": "" + }, + { + "end": 771.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 705.0, + "text": "" + }, + { + "end": 917.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 772.0, + "text": "" + }, + { + "end": 998.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 919.0, + "text": "" + }, + { + "end": 1098.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 999.0, + "text": "" + }, + { + "end": 1260.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1103.0, + "text": "" + }, + { + "end": 1325.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1261.0, + "text": "" + }, + { + "end": 1420.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1326.0, + "text": "" + }, + { + "end": 1528.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1427.0, + "text": "" + }, + { + "end": 1773.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1661.0, + "text": "" + }, + { + "end": 1847.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1774.0, + "text": "" + }, + { + "end": 1910.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1848.0, + "text": "" + }, + { + "end": 2021.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1942.0, + "text": "" + }, + { + "end": 2096.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2057.0, + "text": "" + }, + { + "end": 2265.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2097.0, + "text": "" + }, + { + "end": 2424.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2266.0, + "text": "" + }, + { + "end": 2495.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2441.0, + "text": "" + }, + { + "end": 2581.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2496.0, + "text": "" + }, + { + "end": 2682.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2582.0, + "text": "" + }, + { + "end": 2753.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2683.0, + "text": "" + }, + { + "end": 2797.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2754.0, + "text": "" + }, + { + "end": 2981.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2798.0, + "text": "" + }, + { + "end": 3089.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3026.0, + "text": "" + }, + { + "end": 3269.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3114.0, + "text": "" + }, + { + "end": 3366.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3270.0, + "text": "" + }, + { + "end": 3502.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3431.0, + "text": "" + } + ], + "scene": true + }, + "intro-samos-hut": { + "lines": [ + { + "end": 135.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 26.0, + "text": "" + }, + { + "end": 300.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 136.0, + "text": "" + }, + { + "end": 447.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 301.0, + "text": "" + }, + { + "end": 638.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 448.0, + "text": "" + }, + { + "end": 766.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 639.0, + "text": "" + }, + { + "end": 967.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 819.0, + "text": "" + }, + { + "end": 1047.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 980.0, + "text": "" + }, + { + "end": 1148.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1048.0, + "text": "" + }, + { + "end": 1241.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1149.0, + "text": "" + }, + { + "end": 1339.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1250.0, + "text": "" + }, + { + "end": 1456.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1398.0, + "text": "" + }, + { + "end": 1531.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1457.0, + "text": "" + }, + { + "end": 1638.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1532.0, + "text": "" + }, + { + "end": 1722.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1649.0, + "text": "" + }, + { + "end": 1863.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1732.0, + "text": "" + }, + { + "end": 2004.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1940.0, + "text": "" + }, + { + "end": 2139.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2020.0, + "text": "" + }, + { + "end": 2469.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2420.0, + "text": "" + }, + { + "end": 2610.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2500.0, + "text": "" + }, + { + "end": 2755.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2689.0, + "text": "" + }, + { + "end": 2832.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2768.0, + "text": "" + }, + { + "end": 2967.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2902.0, + "text": "" + }, + { + "end": 3006.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2979.0, + "text": "" + }, + { + "end": 3125.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3016.0, + "text": "" + } + ], + "scene": true + }, + "intro-vortex": { + "lines": [ + { + "end": 64.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 34.0, + "text": "" + }, + { + "end": 138.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 90.0, + "text": "" + }, + { + "end": 374.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 195.0, + "text": "" + }, + { + "end": 461.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 425.0, + "text": "" + }, + { + "end": 524.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 475.0, + "text": "" + } + ], + "scene": true + }, + "jak001": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Alright!" + } + ], + "scene": false + }, + "jak002": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Yeah!" + } + ], + "scene": false + }, + "jak003": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Wooo!" + } + ], + "scene": false + }, + "jak004": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Here we go!" + } + ], + "scene": false + }, + "jak005": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Nice!" + } + ], + "scene": false + }, + "jak006": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Rock 'n roll!" + } + ], + "scene": false + }, + "jak007": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Right on!" + } + ], + "scene": false + }, + "jak008": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Cool!" + } + ], + "scene": false + }, + "jak009": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Cool!" + } + ], + "scene": false + }, + "jak010": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Oh, yeah!" + } + ], + "scene": false + }, + "jak011": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Comin' through!" + } + ], + "scene": false + }, + "jak012": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Look out!" + } + ], + "scene": false + }, + "jak013": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Last lap!" + } + ], + "scene": false + }, + "jak014": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Watch out!" + } + ], + "scene": false + }, + "jak015": { + "lines": [ + { + "end": 17.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Whoa!" + } + ], + "scene": false + }, + "jak016": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Whoa!" + } + ], + "scene": false + }, + "jak017": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Hold on, Dax!" + } + ], + "scene": false + }, + "jak018": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Hang on, Dax!" + } + ], + "scene": false + }, + "jak020": { + "lines": [ + { + "end": 59.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Whoa... oh, that was close." + } + ], + "scene": false + }, + "jak021": { + "lines": [ + { + "end": 10.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "jak022": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Not this time." + } + ], + "scene": false + }, + "jak023": { + "lines": [ + { + "end": 9.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Huargh!" + } + ], + "scene": false + }, + "jak024": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Lean, baby, lean!" + } + ], + "scene": false + }, + "jak025": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Catch him on the inside!" + } + ], + "scene": false + }, + "jak026": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "This is MY show!" + } + ], + "scene": false + }, + "jak027": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Haha, we got him!" + } + ], + "scene": false + }, + "jak028": { + "lines": [ + { + "end": 17.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Watch out!" + } + ], + "scene": false + }, + "jak029": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "You're dead, Erol!" + } + ], + "scene": false + }, + "jak030": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "See ya!" + } + ], + "scene": false + }, + "jak031": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Haha!" + } + ], + "scene": false + }, + "jak032": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Wooo!" + } + ], + "scene": false + }, + "jak033": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Last lap!" + } + ], + "scene": false + }, + "jak034": { + "lines": [ + { + "end": 13.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Later." + } + ], + "scene": false + }, + "jak035": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "We gotta catch up!" + } + ], + "scene": false + }, + "jak036": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "There he is!" + } + ], + "scene": false + }, + "jak037": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Come on, baby, show me what you got!" + } + ], + "scene": false + }, + "jak038": { + "lines": [ + { + "end": 22.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Here we go!" + } + ], + "scene": false + }, + "jak039": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Urgh!" + } + ], + "scene": false + }, + "jak040": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "I'll take this." + } + ], + "scene": false + }, + "jak041": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "I need to borrow this." + } + ], + "scene": false + }, + "jak042": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Move over, buddy!" + } + ], + "scene": false + }, + "jak044": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Outta the vehicle!" + } + ], + "scene": false + }, + "jak045": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Outta my way, buddy!" + } + ], + "scene": false + }, + "jak046": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Thanks for the lift." + } + ], + "scene": false + }, + "jak047": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Mind if I drive?" + } + ], + "scene": false + }, + "jak048": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "I like the color of this vehicle." + } + ], + "scene": false + }, + "jak049": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Mine now." + } + ], + "scene": false + }, + "jak050": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "'Scuse me, but I need this." + } + ], + "scene": false + }, + "jak051": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Take a hike, buddy!" + } + ], + "scene": false + }, + "jak052": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Try walking." + } + ], + "scene": false + }, + "jak053": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Sorry, but I'm in a hurry!" + } + ], + "scene": false + }, + "jak054": { + "lines": [ + { + "end": 20.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Gotta go!" + } + ], + "scene": false + }, + "jak055": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Get another vehicle!" + } + ], + "scene": false + }, + "jak056": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Road hog!" + } + ], + "scene": false + }, + "jak057": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Brake yourself!" + } + ], + "scene": false + }, + "jak059": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Haha, you want some?" + } + ], + "scene": false + }, + "jak060": { + "lines": [ + { + "end": 23.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Get some!" + } + ], + "scene": false + }, + "jak061": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Yeah, feel it!" + } + ], + "scene": false + }, + "jak062": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Die!" + } + ], + "scene": false + }, + "jak063": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Badass comin' through!" + } + ], + "scene": false + }, + "jak064": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Be afraid. Be very afraid." + } + ], + "scene": false + }, + "jak065": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Oooh, that's gotta hurt." + } + ], + "scene": false + }, + "jak066": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "This is payback." + } + ], + "scene": false + }, + "jak067": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "DIE, Praxis!" + } + ], + "scene": false + }, + "jak068": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "You're finished, Kor!" + } + ], + "scene": false + }, + "jak069": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "This is my town, Kor!" + } + ], + "scene": false + }, + "jak070": { + "lines": [ + { + "end": 96.0, + "merge": false, + "offscreen": true, + "speaker": "darkjak", + "start": 0.0, + "text": "Surprise... you can't kill me in my dark form." + } + ], + "scene": false + }, + "jak071": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Now you pay!" + } + ], + "scene": false + }, + "jak072": { + "lines": [ + { + "end": 95.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Go back to the past, Kor! 'Cause you're history." + } + ], + "scene": false + }, + "jak073": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "I win." + } + ], + "scene": false + }, + "jak074": { + "lines": [ + { + "end": 75.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "You should have killed me when you had the chance, Praxis." + } + ], + "scene": false + }, + "jak075": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Daxter, just shut up and watch my back." + } + ], + "scene": false + }, + "jak076": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Whatever, Daxter." + } + ], + "scene": false + }, + "jak077": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Will you stop yappin'?" + } + ], + "scene": false + }, + "jak078": { + "lines": [ + { + "end": 56.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "When you got smaller, so did your brain." + } + ], + "scene": false + }, + "jak079": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "You're on MY shoulder. YOU'RE the sidekick." + } + ], + "scene": false + }, + "jak080": { + "lines": [ + { + "end": 85.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "As long as you're on MY shoulder, keep your mouth shut." + } + ], + "scene": false + }, + "jd001": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Hey, kid! Wait! Come back!" + }, + { + "end": 111.0, + "merge": false, + "offscreen": true, + "speaker": "daxter", + "start": 80.0, + "text": "We gotta protect him!" + } + ], + "scene": false + }, + "jk001": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Wait, KID!" + } + ], + "scene": false + }, + "jk002": { + "lines": [ + { + "end": 14.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "There he goes!" + } + ], + "scene": false + }, + "jk003": { + "lines": [ + { + "end": 32.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Leave him alone!" + } + ], + "scene": false + }, + "jk004": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "KID!" + } + ], + "scene": false + }, + "jk005": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Pick on someone your own size!" + } + ], + "scene": false + }, + "jk006": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Kid, look out!" + } + ], + "scene": false + }, + "jk007": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "How do YOU like it when somebody fights back?" + } + ], + "scene": false + }, + "jk008": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Leave the kid alone!" + } + ], + "scene": false + }, + "jk009": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "He's just a kid!" + } + ], + "scene": false + }, + "jk010": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Keep away from him!" + } + ], + "scene": false + }, + "jk011": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Now you've pissed me off!" + } + ], + "scene": false + }, + "jk012": { + "lines": [ + { + "end": 28.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Eat this!" + } + ], + "scene": false + }, + "jk013": { + "lines": [ + { + "end": 21.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Back off!" + } + ], + "scene": false + }, + "jk014": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "We gotta get in the vehicle with the Kid!" + } + ], + "scene": false + }, + "jk015": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Hold on!" + } + ], + "scene": false + }, + "jk016": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Keep your head down, Kid!" + } + ], + "scene": false + }, + "jk017": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Stick with me, Kid, and you'll be safe." + } + ], + "scene": false + }, + "jk018": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Stay with me, Kid!" + } + ], + "scene": false + }, + "jk019": { + "lines": [ + { + "end": 35.0, + "merge": false, + "offscreen": true, + "speaker": "jak", + "start": 0.0, + "text": "Get in the vehicle, Dax!" + } + ], + "scene": false + }, + "kei001": { + "lines": [ + { + "end": 84.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can get on and off the JET-Board at any time." + } + ], + "scene": false + }, + "kei002": { + "lines": [ + { + "end": 60.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can jump on your JET-Board!" + } + ], + "scene": false + }, + "kei003": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Jump up on that ledge." + } + ], + "scene": false + }, + "kei004": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Try jumping up on that crate." + } + ], + "scene": false + }, + "kei005": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Jump over that obstacle." + } + ], + "scene": false + }, + "kei006": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can get a higher jump by ducking before you jump!" + } + ], + "scene": false + }, + "kei007": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Try doing a duck jump over that obstacle." + } + ], + "scene": false + }, + "kei008": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Jump and jump again a little after you've landed" + }, + { + "end": 132.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 77.0, + "text": "for an even bigger launch!" + } + ], + "scene": false + }, + "kei009": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Try getting up on that higher ledge with a boost jump!" + } + ], + "scene": false + }, + "kei010": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can spin in the air!" + } + ], + "scene": false + }, + "kei011": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Land a perfect 360 for a speed boost!" + } + ], + "scene": false + }, + "kei012": { + "lines": [ + { + "end": 31.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Nice spin!" + } + ], + "scene": false + }, + "kei013": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can land on a rail and grind across it." + } + ], + "scene": false + }, + "kei014": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Try grinding on that rail." + } + ], + "scene": false + }, + "kei016": { + "lines": [ + { + "end": 47.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can do flips while you jump!" + } + ], + "scene": false + }, + "kei017": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "You can also do tricks for fun." + } + ], + "scene": false + }, + "kei018": { + "lines": [ + { + "end": 76.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Try to put a number of moves together to get points." + } + ], + "scene": false + }, + "kei019": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Get enough points to win the challenge!" + } + ], + "scene": false + }, + "kei020": { + "lines": [ + { + "end": 69.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Not enough points! Work on your moves." + } + ], + "scene": false + }, + "kei021": { + "lines": [ + { + "end": 24.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Good job!" + } + ], + "scene": false + }, + "kei022": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Close, but not quite there." + } + ], + "scene": false + }, + "kei023": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "Try again." + } + ], + "scene": false + }, + "kei024": { + "lines": [ + { + "end": 64.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "A little more work and you just might win!" + } + ], + "scene": false + }, + "kei025": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "No good! Not enough points." + } + ], + "scene": false + }, + "kei026": { + "lines": [ + { + "end": 62.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 0.0, + "text": "The Underground said you needed some help, you won't be" + }, + { + "end": 139.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 63.0, + "text": "able to catch those Metal Heads in the Forest on foot" + }, + { + "end": 239.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 140.0, + "text": "so I've left my JET-Board at the airlock near the city exit." + }, + { + "end": 284.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 240.0, + "text": "Since you're helping the Underground," + }, + { + "end": 315.0, + "merge": false, + "offscreen": true, + "speaker": "keira-before-class-3", + "start": 285.0, + "text": "I'll even let you keep it!" + } + ], + "scene": false + }, + "kei027": { + "lines": [ + { + "end": 115.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 0.0, + "text": "Jak, this is Keira. Don't forget - I still need two artifacts" + }, + { + "end": 208.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 116.0, + "text": "to make the Rift Rider work! I need the Time Map and the" + }, + { + "end": 299.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 209.0, + "text": "Heart of Mar Energy Gem, or we're not going anywhere!" + } + ], + "scene": false + }, + "kei028": { + "lines": [ + { + "end": 84.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 0.0, + "text": "I still need those two artifacts or this pile of junk" + }, + { + "end": 172.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 85.0, + "text": "won't move one city block, much less through the Rift" + }, + { + "end": 226.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 173.0, + "text": "and back to our own time!" + }, + { + "end": 325.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 227.0, + "text": "You've got to find the Heart of Mar and the Time Map" + }, + { + "end": 367.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 326.0, + "text": "or we're stuck!" + } + ], + "scene": false + }, + "kei029": { + "lines": [ + { + "end": 78.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 0.0, + "text": "This is Keira. Thanks for getting the artifacts, guys." + }, + { + "end": 187.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 79.0, + "text": "It's strange... the Time Map had a bunch of old coordinates" + }, + { + "end": 254.0, + "merge": false, + "offscreen": true, + "speaker": "keira", + "start": 188.0, + "text": "in it. Come see me at the Stadium." + } + ], + "scene": false + }, + "krew-delivery-res": { + "lines": [ + { + "end": 191.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 66.0, + "text": "" + }, + { + "end": 229.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 194.0, + "text": "" + }, + { + "end": 307.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 230.0, + "text": "" + }, + { + "end": 593.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 454.0, + "text": "" + }, + { + "end": 799.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 596.0, + "text": "" + }, + { + "end": 1045.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 800.0, + "text": "" + }, + { + "end": 1170.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1056.0, + "text": "" + }, + { + "end": 1313.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1177.0, + "text": "" + }, + { + "end": 1540.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1324.0, + "text": "" + }, + { + "end": 1740.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1559.0, + "text": "" + }, + { + "end": 1847.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1741.0, + "text": "" + }, + { + "end": 1917.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1848.0, + "text": "" + }, + { + "end": 2070.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1928.0, + "text": "" + }, + { + "end": 2163.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2090.0, + "text": "" + }, + { + "end": 2340.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2190.0, + "text": "" + }, + { + "end": 2516.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2383.0, + "text": "" + }, + { + "end": 2692.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2517.0, + "text": "" + } + ], + "scene": true + }, + "krew001": { + "lines": [ + { + "end": 143.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Jak, this is Krew. I just talked to my racing client" + }, + { + "end": 210.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 144.0, + "text": "and she told me you were pretty good with that JET-Board" + }, + { + "end": 319.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 211.0, + "text": "of hers. My sources say a shipment of Krimzon Guard" + }, + { + "end": 419.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 320.0, + "text": "listening equipment just arrived in the Port." + }, + { + "end": 497.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 420.0, + "text": "None of us, including the Underground, want those devices" + }, + { + "end": 603.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 498.0, + "text": "up and running. It's not good for business." + }, + { + "end": 674.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 604.0, + "text": "Ride the JET-Board out into the Port" + }, + { + "end": 770.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 675.0, + "text": "and destroy every Krimzon Guard crate you find." + }, + { + "end": 837.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 771.0, + "text": "There's sure to be a defense perimeter," + }, + { + "end": 886.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 838.0, + "text": "so watch out, 'ey?" + } + ], + "scene": false + }, + "krew002": { + "lines": [ + { + "end": 114.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Excellent work, Jak. Even I am impressed." + }, + { + "end": 196.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 115.0, + "text": "I should keep unscrupulous Krimzon Guards" + }, + { + "end": 237.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 197.0, + "text": "out of our business." + }, + { + "end": 303.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 238.0, + "text": "What's the world coming to when you can't buy off" + }, + { + "end": 358.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 304.0, + "text": "a few guards with bribes?" + } + ], + "scene": false + }, + "krew003": { + "lines": [ + { + "end": 140.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Ooooh... the bedtime stories were true!" + }, + { + "end": 259.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 141.0, + "text": "The fabled Heart of Mar was hidden inside that ugly statue" + }, + { + "end": 311.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 260.0, + "text": "of the old boy." + }, + { + "end": 484.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 312.0, + "text": "Nothing fractured, nothing gained! That's my motto. Hahaha..." + }, + { + "end": 644.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 485.0, + "text": "For your loyalty, you'll find an excellent gun upgrade" + }, + { + "end": 721.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 645.0, + "text": "stashed in a crate in the Port." + } + ], + "scene": false + }, + "krew004": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "That's one turret down. Keep looking!" + } + ], + "scene": false + }, + "krew005": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Two turrets. Good work so far!" + } + ], + "scene": false + }, + "krew006": { + "lines": [ + { + "end": 119.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Three turrets gone. Nice! Keep it up!" + } + ], + "scene": false + }, + "krew007": { + "lines": [ + { + "end": 161.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Four turrets trashed. Haha... Lovely, boys! Go get 'em!" + } + ], + "scene": false + }, + "krew008": { + "lines": [ + { + "end": 100.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Five turrets down the drain! Keep going." + } + ], + "scene": false + }, + "krew009": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Six turrets out of commission." + }, + { + "end": 139.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 71.0, + "text": "Hah, I like the way you work." + } + ], + "scene": false + }, + "krew010": { + "lines": [ + { + "end": 134.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Brass work, boys! You destroyed all the turrets, eh?" + }, + { + "end": 214.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 135.0, + "text": "Now, come back to the Hip Hog." + } + ], + "scene": false + }, + "kwbf001": { + "lines": [ + { + "end": 60.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You know I can't play fair!" + }, + { + "end": 174.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 61.0, + "text": "I have a secret weapon: my duplicity field!" + }, + { + "end": 248.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 175.0, + "text": "Say hello to my little friends..." + }, + { + "end": 411.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 249.0, + "text": "Ah, multiple me! Hahahaha... How delightful." + } + ], + "scene": false + }, + "kwbf002": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Let me introduce you to my... \"crew.\"" + } + ], + "scene": false + }, + "kwbf003": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Let's dance!" + } + ], + "scene": false + }, + "kwbf004": { + "lines": [ + { + "end": 38.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You will die!" + } + ], + "scene": false + }, + "kwbf005": { + "lines": [ + { + "end": 40.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Here we come!" + } + ], + "scene": false + }, + "kwbf006": { + "lines": [ + { + "end": 101.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "My, don't my twins look stunning?" + } + ], + "scene": false + }, + "kwbf007": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You can't stop us all!" + } + ], + "scene": false + }, + "kwbf008": { + "lines": [ + { + "end": 107.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Surprise! More of me than you can handle." + } + ], + "scene": false + }, + "kwbf009": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "I've a few good men to help me." + } + ], + "scene": false + }, + "kwbf010": { + "lines": [ + { + "end": 16.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Get him!" + } + ], + "scene": false + }, + "kwbf011": { + "lines": [ + { + "end": 80.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "UARGH! Try stopping me now!" + } + ], + "scene": false + }, + "kwbf012": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You're getting lucky so far, 'ey?" + } + ], + "scene": false + }, + "kwbf013": { + "lines": [ + { + "end": 131.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "I grow weary of this. We end it now." + } + ], + "scene": false + }, + "kwbf014": { + "lines": [ + { + "end": 104.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Hm-hm, I move pretty fast for a big man, 'ey?" + } + ], + "scene": false + }, + "kwbf015": { + "lines": [ + { + "end": 106.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "I float like a butterfly and sting like a wumpbee!" + } + ], + "scene": false + }, + "kwbf016": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Urghh!" + } + ], + "scene": false + }, + "kwbf017": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Aurgh!" + } + ], + "scene": false + }, + "kwbf018": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Arghh!" + } + ], + "scene": false + }, + "kwbf019": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Urrghh!" + } + ], + "scene": false + }, + "kwbf020": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Urgh, ow!" + } + ], + "scene": false + }, + "kwbf021": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Die!" + } + ], + "scene": false + }, + "kwbf022": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Now I have you!" + } + ], + "scene": false + }, + "kwbf023": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You cannot win, Jak!" + } + ], + "scene": false + }, + "kwbf024": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Here's some pain!" + } + ], + "scene": false + }, + "kwbf025": { + "lines": [ + { + "end": 19.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "No!" + } + ], + "scene": false + }, + "kwbf026": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You're trying my patience!" + } + ], + "scene": false + }, + "kwbf027": { + "lines": [ + { + "end": 52.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Stand still!" + } + ], + "scene": false + }, + "kwbf028": { + "lines": [ + { + "end": 62.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Haha, how did that feel?" + } + ], + "scene": false + }, + "kwbf029": { + "lines": [ + { + "end": 96.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You should have walked away when you had a chance." + } + ], + "scene": false + }, + "kwbf030": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Pop this!" + } + ], + "scene": false + }, + "kwbf031": { + "lines": [ + { + "end": 67.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You can't stop the bomb, Jak!" + } + ], + "scene": false + }, + "kwbf032": { + "lines": [ + { + "end": 112.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Hahahaha, that felt good!" + } + ], + "scene": false + }, + "kwbf033": { + "lines": [ + { + "end": 79.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "I am the weapon master!" + } + ], + "scene": false + }, + "kwbf034": { + "lines": [ + { + "end": 30.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Had enough?" + } + ], + "scene": false + }, + "kwbf035": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Here we come!" + } + ], + "scene": false + }, + "kwbf036": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Dance for me, Jak!" + } + ], + "scene": false + }, + "kwbf037": { + "lines": [ + { + "end": 46.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "You can't get us all!" + } + ], + "scene": false + }, + "kwbf038": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Tag! You're it." + } + ], + "scene": false + }, + "kwbf039": { + "lines": [ + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Phew. This is a bit of a workout..." + } + ], + "scene": false + }, + "kwbf040": { + "lines": [ + { + "end": 71.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Which is the real me, Jak?" + } + ], + "scene": false + }, + "kwbf041": { + "lines": [ + { + "end": 94.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Finally... I get to put you in your place!" + } + ], + "scene": false + }, + "kwbf042": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "krew", + "start": 0.0, + "text": "Arghh! You little...!" + } + ], + "scene": false + }, + "mountain-finditems-intro": { + "lines": [ + { + "end": 130.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 71.0, + "text": "" + }, + { + "end": 150.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 138.0, + "text": "" + }, + { + "end": 300.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 156.0, + "text": "" + }, + { + "end": 408.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 353.0, + "text": "" + }, + { + "end": 534.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 409.0, + "text": "" + }, + { + "end": 599.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 535.0, + "text": "" + }, + { + "end": 872.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 729.0, + "text": "" + }, + { + "end": 955.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 873.0, + "text": "" + }, + { + "end": 997.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 956.0, + "text": "" + }, + { + "end": 1082.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1000.0, + "text": "" + }, + { + "end": 1195.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1093.0, + "text": "" + }, + { + "end": 1305.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1196.0, + "text": "" + }, + { + "end": 1436.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1306.0, + "text": "" + }, + { + "end": 1629.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1437.0, + "text": "" + }, + { + "end": 1691.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1635.0, + "text": "" + }, + { + "end": 1854.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1692.0, + "text": "" + }, + { + "end": 1901.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1857.0, + "text": "" + }, + { + "end": 2036.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1904.0, + "text": "" + }, + { + "end": 2109.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2037.0, + "text": "" + }, + { + "end": 2178.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2110.0, + "text": "" + }, + { + "end": 2246.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2179.0, + "text": "" + }, + { + "end": 2397.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2247.0, + "text": "" + }, + { + "end": 2486.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2398.0, + "text": "" + }, + { + "end": 2594.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2487.0, + "text": "" + }, + { + "end": 2672.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2595.0, + "text": "" + } + ], + "scene": true + }, + "mountain-gear-res": { + "lines": [ + { + "end": 190.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 92.0, + "text": "" + }, + { + "end": 284.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 218.0, + "text": "" + }, + { + "end": 577.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 513.0, + "text": "" + } + ], + "scene": true + }, + "mountain-lens-res": { + "lines": [ + { + "end": 108.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 69.0, + "text": "" + }, + { + "end": 205.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 178.0, + "text": "" + }, + { + "end": 272.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 207.0, + "text": "" + }, + { + "end": 337.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 309.0, + "text": "" + }, + { + "end": 420.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 351.0, + "text": "" + }, + { + "end": 614.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 421.0, + "text": "" + }, + { + "end": 663.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 615.0, + "text": "" + } + ], + "scene": true + }, + "mountain-shard-res": { + "lines": [ + { + "end": 632.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 527.0, + "text": "" + }, + { + "end": 702.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 646.0, + "text": "" + } + ], + "scene": true + }, + "nest-break-barrier-res": { + "lines": [ + { + "end": 108.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 30.0, + "text": "" + }, + { + "end": 193.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 109.0, + "text": "" + }, + { + "end": 268.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 194.0, + "text": "" + }, + { + "end": 327.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 269.0, + "text": "" + }, + { + "end": 392.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 328.0, + "text": "" + }, + { + "end": 451.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 393.0, + "text": "" + }, + { + "end": 534.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 457.0, + "text": "" + }, + { + "end": 664.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 553.0, + "text": "" + }, + { + "end": 703.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 665.0, + "text": "" + }, + { + "end": 766.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 704.0, + "text": "" + }, + { + "end": 986.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 950.0, + "text": "" + }, + { + "end": 1035.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 987.0, + "text": "" + }, + { + "end": 1140.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1036.0, + "text": "" + } + ], + "scene": true + }, + "nest-kor-boss-fight-intro-b": { + "lines": [ + { + "end": 200.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 28.0, + "text": "" + }, + { + "end": 340.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 201.0, + "text": "" + }, + { + "end": 372.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 347.0, + "text": "" + }, + { + "end": 547.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 375.0, + "text": "" + }, + { + "end": 659.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 548.0, + "text": "" + }, + { + "end": 819.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 660.0, + "text": "" + }, + { + "end": 853.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 823.0, + "text": "" + }, + { + "end": 1000.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 854.0, + "text": "" + }, + { + "end": 1049.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1001.0, + "text": "" + }, + { + "end": 1197.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1050.0, + "text": "" + }, + { + "end": 1326.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1198.0, + "text": "" + }, + { + "end": 1529.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1327.0, + "text": "" + }, + { + "end": 1584.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1530.0, + "text": "" + }, + { + "end": 1718.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1587.0, + "text": "" + }, + { + "end": 1879.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1719.0, + "text": "" + }, + { + "end": 1975.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1880.0, + "text": "" + }, + { + "end": 2092.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1976.0, + "text": "" + }, + { + "end": 2248.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2093.0, + "text": "" + }, + { + "end": 2347.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2250.0, + "text": "" + }, + { + "end": 2401.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2348.0, + "text": "" + }, + { + "end": 2448.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2404.0, + "text": "" + }, + { + "end": 2855.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2823.0, + "text": "" + } + ], + "scene": true + }, + "ora006": { + "lines": [ + { + "end": 112.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "Bring me 200 more Metal Head Skull Gems" + }, + { + "end": 196.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 113.0, + "text": "and I will show you another Dark Power." + } + ], + "scene": false + }, + "ora007": { + "lines": [ + { + "end": 81.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "Bring me 200 more Skull Gems" + }, + { + "end": 174.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 82.0, + "text": "and another power will be yours to control." + } + ], + "scene": false + }, + "ora008": { + "lines": [ + { + "end": 88.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "Bring me more Skull Gems to receive control" + }, + { + "end": 147.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 89.0, + "text": "over a Dark Power." + } + ], + "scene": false + }, + "ora009": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "You do not have enough Skull Gems." + }, + { + "end": 159.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 83.0, + "text": "Come back when you have collected more." + } + ], + "scene": false + }, + "ora010": { + "lines": [ + { + "end": 84.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "I need more Skull Gems." + } + ], + "scene": false + }, + "ora011": { + "lines": [ + { + "end": 103.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "Trust not your reliance on weapons." + } + ], + "scene": false + }, + "ora012": { + "lines": [ + { + "end": 117.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "Use only your body and brain for this challenge." + } + ], + "scene": false + }, + "ora013": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "Weapons are for the weak." + } + ], + "scene": false + }, + "ora014": { + "lines": [ + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "oracle", + "start": 0.0, + "text": "You must not use weapons in this challenge." + } + ], + "scene": false + }, + "outro-hiphog": { + "lines": [ + { + "end": 88.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 23.0, + "text": "" + }, + { + "end": 235.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 89.0, + "text": "" + }, + { + "end": 319.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 239.0, + "text": "" + }, + { + "end": 473.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 322.0, + "text": "" + }, + { + "end": 588.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 476.0, + "text": "" + }, + { + "end": 690.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 602.0, + "text": "" + }, + { + "end": 834.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 691.0, + "text": "" + }, + { + "end": 983.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 840.0, + "text": "" + }, + { + "end": 1122.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 987.0, + "text": "" + }, + { + "end": 1222.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1135.0, + "text": "" + }, + { + "end": 1339.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1253.0, + "text": "" + }, + { + "end": 1379.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1353.0, + "text": "" + }, + { + "end": 1489.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1383.0, + "text": "" + }, + { + "end": 1523.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1490.0, + "text": "" + }, + { + "end": 1574.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1525.0, + "text": "" + }, + { + "end": 1636.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1596.0, + "text": "" + }, + { + "end": 1666.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1643.0, + "text": "" + }, + { + "end": 1699.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1672.0, + "text": "" + }, + { + "end": 1774.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1702.0, + "text": "" + }, + { + "end": 1891.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1775.0, + "text": "" + }, + { + "end": 1959.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1893.0, + "text": "" + } + ], + "scene": true + }, + "outro-nest": { + "lines": [ + { + "end": 289.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 246.0, + "text": "" + }, + { + "end": 465.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 298.0, + "text": "" + }, + { + "end": 623.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 466.0, + "text": "" + }, + { + "end": 683.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 624.0, + "text": "" + }, + { + "end": 810.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 716.0, + "text": "" + }, + { + "end": 850.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 811.0, + "text": "" + }, + { + "end": 881.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 853.0, + "text": "" + }, + { + "end": 997.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 885.0, + "text": "" + }, + { + "end": 1107.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 998.0, + "text": "" + }, + { + "end": 1260.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1108.0, + "text": "" + }, + { + "end": 1357.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1264.0, + "text": "" + }, + { + "end": 1429.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1358.0, + "text": "" + }, + { + "end": 1557.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1431.0, + "text": "" + }, + { + "end": 1677.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1567.0, + "text": "" + }, + { + "end": 1800.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1678.0, + "text": "" + }, + { + "end": 1909.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1812.0, + "text": "" + }, + { + "end": 2070.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1910.0, + "text": "" + }, + { + "end": 2183.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2074.0, + "text": "" + }, + { + "end": 2239.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2184.0, + "text": "" + }, + { + "end": 2352.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2241.0, + "text": "" + }, + { + "end": 2432.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2364.0, + "text": "" + }, + { + "end": 2625.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2433.0, + "text": "" + }, + { + "end": 2743.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2693.0, + "text": "" + }, + { + "end": 2832.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2745.0, + "text": "" + }, + { + "end": 2928.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2849.0, + "text": "" + } + ], + "scene": true + }, + "outro-palace": { + "lines": [ + { + "end": 98.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 13.0, + "text": "" + }, + { + "end": 133.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 99.0, + "text": "" + }, + { + "end": 239.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 134.0, + "text": "" + }, + { + "end": 357.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 242.0, + "text": "" + }, + { + "end": 383.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 362.0, + "text": "" + }, + { + "end": 446.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 395.0, + "text": "" + }, + { + "end": 573.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 447.0, + "text": "" + }, + { + "end": 612.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 574.0, + "text": "" + }, + { + "end": 687.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 613.0, + "text": "" + }, + { + "end": 751.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 688.0, + "text": "" + }, + { + "end": 834.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 752.0, + "text": "" + }, + { + "end": 943.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 835.0, + "text": "" + }, + { + "end": 984.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 950.0, + "text": "" + } + ], + "scene": true + }, + "outro-port": { + "lines": [ + { + "end": 122.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 20.0, + "text": "" + }, + { + "end": 190.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 123.0, + "text": "" + }, + { + "end": 325.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 191.0, + "text": "" + }, + { + "end": 388.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 326.0, + "text": "" + }, + { + "end": 554.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 393.0, + "text": "" + }, + { + "end": 651.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 556.0, + "text": "" + }, + { + "end": 768.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 655.0, + "text": "" + }, + { + "end": 894.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 769.0, + "text": "" + }, + { + "end": 1066.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 896.0, + "text": "" + }, + { + "end": 1205.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1067.0, + "text": "" + }, + { + "end": 1257.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1206.0, + "text": "" + }, + { + "end": 1349.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1267.0, + "text": "" + }, + { + "end": 1466.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1350.0, + "text": "" + }, + { + "end": 1515.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1467.0, + "text": "" + }, + { + "end": 1618.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1517.0, + "text": "" + }, + { + "end": 1730.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1623.0, + "text": "" + }, + { + "end": 1858.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1732.0, + "text": "" + }, + { + "end": 1945.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1859.0, + "text": "" + }, + { + "end": 2054.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1946.0, + "text": "" + }, + { + "end": 2170.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2055.0, + "text": "" + }, + { + "end": 2231.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2171.0, + "text": "" + }, + { + "end": 2444.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2321.0, + "text": "" + } + ], + "scene": true + }, + "palace-boss-res": { + "lines": [ + { + "end": 270.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 182.0, + "text": "" + }, + { + "end": 447.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 271.0, + "text": "" + }, + { + "end": 559.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 497.0, + "text": "" + } + ], + "scene": true + }, + "palace-outside-window-res": { + "lines": [ + { + "end": 282.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 180.0, + "text": "" + }, + { + "end": 403.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 283.0, + "text": "" + }, + { + "end": 587.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 414.0, + "text": "" + }, + { + "end": 706.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 588.0, + "text": "" + }, + { + "end": 839.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 707.0, + "text": "" + }, + { + "end": 963.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 840.0, + "text": "" + }, + { + "end": 1022.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 992.0, + "text": "" + }, + { + "end": 1100.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1023.0, + "text": "" + }, + { + "end": 1134.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1101.0, + "text": "" + }, + { + "end": 1193.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1142.0, + "text": "" + }, + { + "end": 1310.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1194.0, + "text": "" + }, + { + "end": 1431.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1311.0, + "text": "" + }, + { + "end": 1589.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1456.0, + "text": "" + }, + { + "end": 1723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1590.0, + "text": "" + }, + { + "end": 1773.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1735.0, + "text": "" + }, + { + "end": 1883.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1774.0, + "text": "" + }, + { + "end": 1986.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1896.0, + "text": "" + }, + { + "end": 2117.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1994.0, + "text": "" + }, + { + "end": 2175.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2125.0, + "text": "" + }, + { + "end": 2237.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2186.0, + "text": "" + }, + { + "end": 2312.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2238.0, + "text": "" + }, + { + "end": 2373.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2313.0, + "text": "" + }, + { + "end": 2475.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2374.0, + "text": "" + }, + { + "end": 2611.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2489.0, + "text": "" + }, + { + "end": 2653.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2630.0, + "text": "" + } + ], + "scene": true + }, + "palace-outside-window-res-b": { + "lines": [ + { + "end": 193.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 115.0, + "text": "" + }, + { + "end": 349.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 194.0, + "text": "" + }, + { + "end": 466.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 350.0, + "text": "" + } + ], + "scene": true + }, + "palace-sneak-in-res": { + "lines": [ + { + "end": 88.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 49.0, + "text": "" + }, + { + "end": 130.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 93.0, + "text": "" + }, + { + "end": 161.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 135.0, + "text": "" + }, + { + "end": 246.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 162.0, + "text": "" + }, + { + "end": 289.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 247.0, + "text": "" + }, + { + "end": 385.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 290.0, + "text": "" + }, + { + "end": 466.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 386.0, + "text": "" + }, + { + "end": 586.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 474.0, + "text": "" + }, + { + "end": 614.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 587.0, + "text": "" + }, + { + "end": 737.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 629.0, + "text": "" + }, + { + "end": 813.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 752.0, + "text": "" + }, + { + "end": 918.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 832.0, + "text": "" + }, + { + "end": 992.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 924.0, + "text": "" + }, + { + "end": 1123.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 995.0, + "text": "" + }, + { + "end": 1253.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1125.0, + "text": "" + }, + { + "end": 1341.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1257.0, + "text": "" + }, + { + "end": 1394.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1342.0, + "text": "" + }, + { + "end": 1428.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1395.0, + "text": "" + }, + { + "end": 1547.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1430.0, + "text": "" + }, + { + "end": 1702.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1548.0, + "text": "" + }, + { + "end": 1732.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1712.0, + "text": "" + }, + { + "end": 1819.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1738.0, + "text": "" + }, + { + "end": 1910.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1834.0, + "text": "" + }, + { + "end": 1981.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1918.0, + "text": "" + }, + { + "end": 2053.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2025.0, + "text": "" + }, + { + "end": 2174.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2054.0, + "text": "" + }, + { + "end": 2260.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2175.0, + "text": "" + }, + { + "end": 2344.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2261.0, + "text": "" + }, + { + "end": 2405.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2345.0, + "text": "" + } + ], + "scene": true + }, + "ruins-get-to-hut-res": { + "lines": [ + { + "end": 186.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 100.0, + "text": "" + }, + { + "end": 444.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 329.0, + "text": "" + }, + { + "end": 524.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 445.0, + "text": "" + }, + { + "end": 622.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 525.0, + "text": "" + }, + { + "end": 739.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 623.0, + "text": "" + }, + { + "end": 853.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 740.0, + "text": "" + }, + { + "end": 893.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 866.0, + "text": "" + }, + { + "end": 996.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 910.0, + "text": "" + }, + { + "end": 1140.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 997.0, + "text": "" + }, + { + "end": 1214.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1156.0, + "text": "" + }, + { + "end": 1318.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1215.0, + "text": "" + }, + { + "end": 1385.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1319.0, + "text": "" + }, + { + "end": 1461.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1386.0, + "text": "" + }, + { + "end": 1524.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1462.0, + "text": "" + }, + { + "end": 1607.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1538.0, + "text": "" + } + ], + "scene": true + }, + "ruins-sacred-intro": { + "lines": [ + { + "end": 150.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 88.0, + "text": "" + }, + { + "end": 258.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 151.0, + "text": "" + }, + { + "end": 321.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 266.0, + "text": "" + }, + { + "end": 393.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 323.0, + "text": "" + }, + { + "end": 489.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 394.0, + "text": "" + }, + { + "end": 579.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 490.0, + "text": "" + }, + { + "end": 684.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 580.0, + "text": "" + }, + { + "end": 753.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 685.0, + "text": "" + }, + { + "end": 901.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 755.0, + "text": "" + }, + { + "end": 1053.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 902.0, + "text": "" + }, + { + "end": 1136.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1070.0, + "text": "" + }, + { + "end": 1234.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1137.0, + "text": "" + }, + { + "end": 1321.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1235.0, + "text": "" + } + ], + "scene": true + }, + "ruins-sacred-victory": { + "lines": [ + { + "end": 196.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 85.0, + "text": "" + }, + { + "end": 251.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 197.0, + "text": "" + }, + { + "end": 339.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 268.0, + "text": "" + }, + { + "end": 559.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 340.0, + "text": "" + } + ], + "scene": true + }, + "ruins-tower-intro": { + "lines": [ + { + "end": 207.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 60.0, + "text": "" + }, + { + "end": 286.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 220.0, + "text": "" + }, + { + "end": 441.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 300.0, + "text": "" + }, + { + "end": 572.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 442.0, + "text": "" + }, + { + "end": 611.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 578.0, + "text": "" + }, + { + "end": 685.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 626.0, + "text": "" + }, + { + "end": 835.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 700.0, + "text": "" + }, + { + "end": 976.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 855.0, + "text": "" + }, + { + "end": 1117.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 983.0, + "text": "" + }, + { + "end": 1174.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1118.0, + "text": "" + } + ], + "scene": true + }, + "ruins-tower-victory": { + "lines": [ + { + "end": 294.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 243.0, + "text": "" + }, + { + "end": 342.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 326.0, + "text": "" + }, + { + "end": 408.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 390.0, + "text": "" + }, + { + "end": 919.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 860.0, + "text": "" + } + ], + "scene": true + }, + "sewer-1-intro": { + "lines": [ + { + "end": 215.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 50.0, + "text": "" + }, + { + "end": 333.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 216.0, + "text": "" + }, + { + "end": 445.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 334.0, + "text": "" + }, + { + "end": 556.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 446.0, + "text": "" + }, + { + "end": 693.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 558.0, + "text": "" + }, + { + "end": 841.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 705.0, + "text": "" + }, + { + "end": 1090.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 842.0, + "text": "" + }, + { + "end": 1249.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1095.0, + "text": "" + }, + { + "end": 1431.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1257.0, + "text": "" + }, + { + "end": 1569.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1456.0, + "text": "" + }, + { + "end": 1801.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1584.0, + "text": "" + }, + { + "end": 1920.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1810.0, + "text": "" + }, + { + "end": 1981.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1921.0, + "text": "" + }, + { + "end": 2078.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1983.0, + "text": "" + }, + { + "end": 2134.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2079.0, + "text": "" + }, + { + "end": 2221.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2138.0, + "text": "" + }, + { + "end": 2402.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2222.0, + "text": "" + }, + { + "end": 2596.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2403.0, + "text": "" + }, + { + "end": 2854.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2597.0, + "text": "" + }, + { + "end": 2927.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2855.0, + "text": "" + }, + { + "end": 3119.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2939.0, + "text": "" + }, + { + "end": 3235.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3120.0, + "text": "" + }, + { + "end": 3438.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3236.0, + "text": "" + }, + { + "end": 3503.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3444.0, + "text": "" + }, + { + "end": 3635.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3504.0, + "text": "" + }, + { + "end": 3691.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 3636.0, + "text": "" + } + ], + "scene": true + }, + "sewer-1-res": { + "lines": [ + { + "end": 192.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 93.0, + "text": "" + }, + { + "end": 300.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 194.0, + "text": "" + }, + { + "end": 400.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 301.0, + "text": "" + }, + { + "end": 516.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 401.0, + "text": "" + }, + { + "end": 685.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 522.0, + "text": "" + }, + { + "end": 896.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 719.0, + "text": "" + }, + { + "end": 1031.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 897.0, + "text": "" + }, + { + "end": 1210.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1032.0, + "text": "" + } + ], + "scene": true + }, + "sewer-2-intro": { + "lines": [ + { + "end": 325.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 97.0, + "text": "" + }, + { + "end": 483.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 326.0, + "text": "" + }, + { + "end": 618.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 484.0, + "text": "" + }, + { + "end": 849.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 619.0, + "text": "" + }, + { + "end": 911.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 850.0, + "text": "" + }, + { + "end": 1028.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 920.0, + "text": "" + }, + { + "end": 1133.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1029.0, + "text": "" + }, + { + "end": 1299.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1134.0, + "text": "" + }, + { + "end": 1329.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1301.0, + "text": "" + }, + { + "end": 1525.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1345.0, + "text": "" + }, + { + "end": 1649.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1526.0, + "text": "" + }, + { + "end": 1773.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1650.0, + "text": "" + }, + { + "end": 1924.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1774.0, + "text": "" + }, + { + "end": 2002.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1925.0, + "text": "" + }, + { + "end": 2142.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2007.0, + "text": "" + }, + { + "end": 2320.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2143.0, + "text": "" + }, + { + "end": 2553.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2321.0, + "text": "" + }, + { + "end": 2616.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2554.0, + "text": "" + }, + { + "end": 2729.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2617.0, + "text": "" + } + ], + "scene": true + }, + "sewer-blow-up-statue-intro": { + "lines": [ + { + "end": 511.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 405.0, + "text": "" + }, + { + "end": 553.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 512.0, + "text": "" + }, + { + "end": 616.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 554.0, + "text": "" + }, + { + "end": 685.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 617.0, + "text": "" + }, + { + "end": 801.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 686.0, + "text": "" + }, + { + "end": 906.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 802.0, + "text": "" + }, + { + "end": 971.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 917.0, + "text": "" + }, + { + "end": 1057.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 972.0, + "text": "" + }, + { + "end": 1190.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1065.0, + "text": "" + }, + { + "end": 1338.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1246.0, + "text": "" + }, + { + "end": 1395.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1360.0, + "text": "" + }, + { + "end": 1464.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1396.0, + "text": "" + }, + { + "end": 1599.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1483.0, + "text": "" + }, + { + "end": 1755.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1600.0, + "text": "" + }, + { + "end": 1897.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1756.0, + "text": "" + }, + { + "end": 2081.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1910.0, + "text": "" + }, + { + "end": 2219.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2082.0, + "text": "" + }, + { + "end": 2314.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2220.0, + "text": "" + }, + { + "end": 2451.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2315.0, + "text": "" + }, + { + "end": 2523.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2452.0, + "text": "" + } + ], + "scene": true + }, + "sewer-blow-up-statue-res": { + "lines": [ + { + "end": 84.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 10.0, + "text": "" + }, + { + "end": 143.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 86.0, + "text": "" + }, + { + "end": 300.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 207.0, + "text": "" + }, + { + "end": 379.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 313.0, + "text": "" + }, + { + "end": 525.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 483.0, + "text": "" + }, + { + "end": 723.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 640.0, + "text": "" + }, + { + "end": 808.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 724.0, + "text": "" + } + ], + "scene": true + }, + "sewer-drain-res": { + "lines": [ + { + "end": 583.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 496.0, + "text": "" + }, + { + "end": 689.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 591.0, + "text": "" + }, + { + "end": 769.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 690.0, + "text": "" + }, + { + "end": 820.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 791.0, + "text": "" + } + ], + "scene": true + }, + "sewer-hosehead": { + "lines": [ + { + "end": 136.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 114.0, + "text": "" + }, + { + "end": 185.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 141.0, + "text": "" + }, + { + "end": 257.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 207.0, + "text": "" + }, + { + "end": 321.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 260.0, + "text": "" + }, + { + "end": 365.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 334.0, + "text": "" + } + ], + "scene": true + }, + "tess001": { + "lines": [ + { + "end": 107.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Hey, guys! This is Tess. Before Krew left, I saw him hide" + }, + { + "end": 180.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 108.0, + "text": "something in the game machine here. Knowing Krew," + }, + { + "end": 241.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 181.0, + "text": "it's probably something valuable." + }, + { + "end": 287.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 242.0, + "text": "You might wanna come check it out." + } + ], + "scene": false + }, + "tomb-boss-intro": { + "lines": [ + { + "end": 106.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 50.0, + "text": "" + }, + { + "end": 197.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 111.0, + "text": "" + }, + { + "end": 262.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 218.0, + "text": "" + }, + { + "end": 375.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 263.0, + "text": "" + }, + { + "end": 506.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 376.0, + "text": "" + }, + { + "end": 656.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 520.0, + "text": "" + }, + { + "end": 844.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 664.0, + "text": "" + }, + { + "end": 1001.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 845.0, + "text": "" + }, + { + "end": 1118.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1002.0, + "text": "" + }, + { + "end": 1282.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1119.0, + "text": "" + }, + { + "end": 1458.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1283.0, + "text": "" + }, + { + "end": 1601.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1459.0, + "text": "" + }, + { + "end": 1732.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1602.0, + "text": "" + }, + { + "end": 1842.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1744.0, + "text": "" + }, + { + "end": 1964.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1845.0, + "text": "" + }, + { + "end": 2069.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2009.0, + "text": "" + }, + { + "end": 2187.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2094.0, + "text": "" + }, + { + "end": 2303.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2188.0, + "text": "" + }, + { + "end": 2450.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2339.0, + "text": "" + }, + { + "end": 2557.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2451.0, + "text": "" + }, + { + "end": 2753.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2585.0, + "text": "" + } + ], + "scene": true + }, + "tomb-boss-res": { + "lines": [ + { + "end": 318.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 215.0, + "text": "" + }, + { + "end": 449.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 341.0, + "text": "" + }, + { + "end": 562.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 450.0, + "text": "" + } + ], + "scene": true + }, + "tomb-face-tests-intro": { + "lines": [ + { + "end": 176.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 35.0, + "text": "" + }, + { + "end": 280.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 178.0, + "text": "" + }, + { + "end": 389.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 281.0, + "text": "" + }, + { + "end": 572.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 390.0, + "text": "" + }, + { + "end": 637.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 574.0, + "text": "" + }, + { + "end": 743.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 638.0, + "text": "" + }, + { + "end": 831.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 744.0, + "text": "" + }, + { + "end": 884.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 832.0, + "text": "" + }, + { + "end": 1034.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 885.0, + "text": "" + }, + { + "end": 1079.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1035.0, + "text": "" + }, + { + "end": 1299.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1135.0, + "text": "" + }, + { + "end": 1439.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1300.0, + "text": "" + }, + { + "end": 1663.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1521.0, + "text": "" + }, + { + "end": 1758.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1716.0, + "text": "" + }, + { + "end": 1807.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1764.0, + "text": "" + }, + { + "end": 1911.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1810.0, + "text": "" + }, + { + "end": 2018.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1962.0, + "text": "" + }, + { + "end": 2158.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2074.0, + "text": "" + }, + { + "end": 2258.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2160.0, + "text": "" + }, + { + "end": 2302.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 2277.0, + "text": "" + } + ], + "scene": true + }, + "tomb-spider-scare": { + "lines": [ + { + "end": 309.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 273.0, + "text": "" + } + ], + "scene": true + }, + "tswm001": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You can do it, Daxter!" + } + ], + "scene": false + }, + "tswm002": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Keep going, Daxter." + } + ], + "scene": false + }, + "tswm003": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Go, go, go!" + } + ], + "scene": false + }, + "tswm004": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Wow! What an animal!" + } + ], + "scene": false + }, + "tswm005": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You got it!" + } + ], + "scene": false + }, + "tswm006": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Nice slam!" + } + ], + "scene": false + }, + "tswm007": { + "lines": [ + { + "end": 48.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Ooh ho ho, baby!" + } + ], + "scene": false + }, + "tswm008": { + "lines": [ + { + "end": 43.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Great shot, Daxter!" + } + ], + "scene": false + }, + "tswm009": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You're almost there!" + } + ], + "scene": false + }, + "tswm010": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You can win, baby!" + } + ], + "scene": false + }, + "tswm011": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "My hero!" + } + ], + "scene": false + }, + "tswm012": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Look at him go!" + } + ], + "scene": false + }, + "tswm013": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You ARE Orange Lightning!" + } + ], + "scene": false + }, + "tswm014": { + "lines": [ + { + "end": 33.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Just a few more!" + } + ], + "scene": false + }, + "tswm015": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Hit him again!" + } + ], + "scene": false + }, + "tswm016": { + "lines": [ + { + "end": 17.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Yes!" + } + ], + "scene": false + }, + "tswm017": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "That's my naughty ottsel!" + } + ], + "scene": false + }, + "tswm018": { + "lines": [ + { + "end": 13.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Oh!" + } + ], + "scene": false + }, + "tswm019": { + "lines": [ + { + "end": 37.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "That wasn't good." + } + ], + "scene": false + }, + "tswm020": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Don't hit the red ones!" + } + ], + "scene": false + }, + "tswm021": { + "lines": [ + { + "end": 18.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Ooh!" + } + ], + "scene": false + }, + "tswm022": { + "lines": [ + { + "end": 41.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "That took points away!" + } + ], + "scene": false + }, + "tswm023": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You did it!" + } + ], + "scene": false + }, + "tswm024": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Daxter, you won!" + } + ], + "scene": false + }, + "tswm025": { + "lines": [ + { + "end": 98.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Yes! You're the man! I mean... the animal." + } + ], + "scene": false + }, + "tswm026": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You beat the game, Daxter!" + } + ], + "scene": false + }, + "tswm027": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Where'd you learn to pound like that?" + } + ], + "scene": false + }, + "tswm028": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "That was amazing!" + } + ], + "scene": false + }, + "tswm029": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Pretty good for a little furball." + } + ], + "scene": false + }, + "tswm030": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Ooh... Not enough points!" + } + ], + "scene": false + }, + "tswm031": { + "lines": [ + { + "end": 57.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "No! You lost..." + } + ], + "scene": false + }, + "tswm032": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Awww... You lost again!" + } + ], + "scene": false + }, + "tswm033": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "So close!" + } + ], + "scene": false + }, + "tswm034": { + "lines": [ + { + "end": 34.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "One more time." + } + ], + "scene": false + }, + "tswm035": { + "lines": [ + { + "end": 26.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You can do it!" + } + ], + "scene": false + }, + "tswm036": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You have to try again!" + } + ], + "scene": false + }, + "tswm037": { + "lines": [ + { + "end": 61.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You have to beat the game, Daxter." + } + ], + "scene": false + }, + "tswm038": { + "lines": [ + { + "end": 25.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Try again!" + } + ], + "scene": false + }, + "tswm039": { + "lines": [ + { + "end": 50.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Ah! That was a bad one!" + } + ], + "scene": false + }, + "tswm040": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Don't hit the bad ones, Daxter." + } + ], + "scene": false + }, + "tswm041": { + "lines": [ + { + "end": 53.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You hit a bad Metal Head." + } + ], + "scene": false + }, + "tswm042": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Not again!" + } + ], + "scene": false + }, + "tswm043": { + "lines": [ + { + "end": 27.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Oh no!" + } + ], + "scene": false + }, + "tswm044": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Daxter..! You need more points!" + } + ], + "scene": false + }, + "tswm045": { + "lines": [ + { + "end": 29.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Keep going...!" + } + ], + "scene": false + }, + "tswm046": { + "lines": [ + { + "end": 87.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Oh, Daxter... did you get your whiskers singed?" + } + ], + "scene": false + }, + "tswm047": { + "lines": [ + { + "end": 42.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You're gonna score!" + } + ], + "scene": false + }, + "tswm048": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You're almost there...!" + } + ], + "scene": false + }, + "tswm049": { + "lines": [ + { + "end": 39.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Just a few more!" + } + ], + "scene": false + }, + "tswm050": { + "lines": [ + { + "end": 36.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "We have a winner!" + } + ], + "scene": false + }, + "tswm051": { + "lines": [ + { + "end": 63.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Oh! That was a bad one." + } + ], + "scene": false + }, + "tswm052": { + "lines": [ + { + "end": 54.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Don't hit the bad ones, Daxter." + } + ], + "scene": false + }, + "tswm053": { + "lines": [ + { + "end": 73.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Daxter, you hit a bad Metal Head!" + } + ], + "scene": false + }, + "tswm054": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Daxter, you won!!" + } + ], + "scene": false + }, + "tswm055": { + "lines": [ + { + "end": 51.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "You did it, fur boy!" + } + ], + "scene": false + }, + "tswm056": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "Yes!! You beat the game!" + } + ], + "scene": false + }, + "tswm057": { + "lines": [ + { + "end": 45.0, + "merge": false, + "offscreen": true, + "speaker": "tess", + "start": 0.0, + "text": "I knew you could do it." + } + ], + "scene": false + }, + "under-centipede-one": { + "lines": [ + { + "end": 148.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 63.0, + "text": "" + } + ], + "scene": true + }, + "under-centipede-three": { + "lines": [ + { + "end": 124.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 31.0, + "text": "" + } + ], + "scene": true + }, + "under-find-sig-res": { + "lines": [ + { + "end": 77.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 52.0, + "text": "" + }, + { + "end": 164.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 91.0, + "text": "" + }, + { + "end": 213.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 183.0, + "text": "" + }, + { + "end": 319.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 214.0, + "text": "" + }, + { + "end": 455.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 320.0, + "text": "" + }, + { + "end": 519.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 456.0, + "text": "" + }, + { + "end": 568.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 550.0, + "text": "" + }, + { + "end": 613.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 578.0, + "text": "" + }, + { + "end": 684.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 614.0, + "text": "" + }, + { + "end": 802.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 700.0, + "text": "" + }, + { + "end": 834.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 812.0, + "text": "" + } + ], + "scene": true + }, + "under-get-sig-out-res": { + "lines": [ + { + "end": 62.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 11.0, + "text": "" + }, + { + "end": 137.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 76.0, + "text": "" + }, + { + "end": 267.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 138.0, + "text": "" + }, + { + "end": 374.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 268.0, + "text": "" + }, + { + "end": 428.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 375.0, + "text": "" + }, + { + "end": 500.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 429.0, + "text": "" + }, + { + "end": 591.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 501.0, + "text": "" + }, + { + "end": 649.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 592.0, + "text": "" + }, + { + "end": 762.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 650.0, + "text": "" + }, + { + "end": 809.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 782.0, + "text": "" + }, + { + "end": 830.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 810.0, + "text": "" + }, + { + "end": 966.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 911.0, + "text": "" + } + ], + "scene": true + }, + "vin-rescue": { + "lines": [ + { + "end": 204.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 166.0, + "text": "" + }, + { + "end": 300.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 227.0, + "text": "" + }, + { + "end": 432.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 312.0, + "text": "" + }, + { + "end": 454.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 433.0, + "text": "" + }, + { + "end": 555.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 466.0, + "text": "" + }, + { + "end": 722.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 570.0, + "text": "" + }, + { + "end": 770.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 736.0, + "text": "" + }, + { + "end": 905.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 788.0, + "text": "" + }, + { + "end": 972.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 920.0, + "text": "" + }, + { + "end": 1069.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 997.0, + "text": "" + }, + { + "end": 1164.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1070.0, + "text": "" + } + ], + "scene": true + }, + "vin-rescue-intro": { + "lines": [ + { + "end": 122.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 19.0, + "text": "" + }, + { + "end": 163.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 124.0, + "text": "" + }, + { + "end": 272.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 164.0, + "text": "" + }, + { + "end": 364.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 273.0, + "text": "" + }, + { + "end": 501.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 365.0, + "text": "" + }, + { + "end": 577.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 502.0, + "text": "" + }, + { + "end": 693.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 583.0, + "text": "" + }, + { + "end": 810.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 697.0, + "text": "" + }, + { + "end": 856.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 837.0, + "text": "" + }, + { + "end": 1018.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 864.0, + "text": "" + }, + { + "end": 1062.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1019.0, + "text": "" + }, + { + "end": 1152.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1063.0, + "text": "" + }, + { + "end": 1239.0, + "merge": true, + "offscreen": false, + "speaker": "none", + "start": 1153.0, + "text": "" + } + ], + "scene": true + }, + "vin002": { + "lines": [ + { + "end": 91.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "Okay, the B-Zone Power Grid is back online." + }, + { + "end": 164.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 94.0, + "text": "Have fun being killed in the Palace." + } + ], + "scene": false + }, + "vin003": { + "lines": [ + { + "end": 65.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "You destroyed the last of the Metal Head eggs!" + }, + { + "end": 139.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 66.0, + "text": "That should give us a little more eco for the city." + }, + { + "end": 179.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 140.0, + "text": "Good work!" + } + ], + "scene": false + }, + "vin004": { + "lines": [ + { + "end": 68.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "You still haven't gotten all the Metal Head eggs!" + }, + { + "end": 138.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 69.0, + "text": "Make sure you get 'em all, or I'm gonna have" + }, + { + "end": 197.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 139.0, + "text": "a nervous breakdown!" + } + ], + "scene": false + }, + "vin011": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "Thank goodness you blew up those wells." + }, + { + "end": 164.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 71.0, + "text": "I sure don't want any more Metal Heads coming around here." + }, + { + "end": 238.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 165.0, + "text": "Good work, boys! I owe ya one." + } + ], + "scene": false + }, + "vin012": { + "lines": [ + { + "end": 70.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "Good work, guys! The fewer Metal Head eggs" + }, + { + "end": 159.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 71.0, + "text": "we allow to hatch, the fewer of those nasty monsters" + }, + { + "end": 198.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 160.0, + "text": "we'll have to fight!" + } + ], + "scene": false + }, + "vin013": { + "lines": [ + { + "end": 89.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "Jak... Kor..." + }, + { + "end": 161.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 90.0, + "text": "Construction... Site..." + }, + { + "end": 189.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 162.0, + "text": "Ngh..." + } + ], + "scene": false + }, + "vin014": { + "lines": [ + { + "end": 82.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "Once again you guys have saved my butt!" + }, + { + "end": 181.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 83.0, + "text": "Maybe now I'll get a raise. Or a long vacation." + }, + { + "end": 275.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 182.0, + "text": "God knows I could use one. Thanks for the help!" + } + ], + "scene": false + }, + "vin015": { + "lines": [ + { + "end": 160.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 20.0, + "text": "The shield wall is down! I repeat - the shield wall is down!" + }, + { + "end": 231.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 161.0, + "text": "Sabotage! Kor did it!" + }, + { + "end": 305.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 232.0, + "text": "I knew Metal Heads would be the end of me!" + }, + { + "end": 378.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 306.0, + "text": "OH NO! Metal Heads are at the door!!" + }, + { + "end": 425.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 379.0, + "text": "They're breaking through!!" + }, + { + "end": 560.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 426.0, + "text": "Too many of them!! Jak!!! AHHHH!!!" + } + ], + "scene": false + }, + "ys001": { + "lines": [ + { + "end": 97.0, + "merge": false, + "offscreen": true, + "speaker": "youngsamos-before-rescue", + "start": 0.0, + "text": "Excellent work, boys! Come on back to the Hideout," + }, + { + "end": 145.0, + "merge": false, + "offscreen": true, + "speaker": "youngsamos-before-rescue", + "start": 98.0, + "text": "I have another task for you." + } + ], + "scene": false + }, + "ys002": { + "lines": [ + { + "end": 55.0, + "merge": false, + "offscreen": true, + "speaker": "samos", + "start": 0.0, + "text": "Nice shooting, my boy!" + }, + { + "end": 93.0, + "merge": false, + "offscreen": true, + "speaker": "youngsamos", + "start": 56.0, + "text": "Good work, Jak!" + }, + { + "end": 153.0, + "merge": false, + "offscreen": true, + "speaker": "youngsamos", + "start": 94.0, + "text": "We'll all sleep a little easier tonight." + } + ], + "scene": false + } + }, + "speakers": { + "agent": "Agent", + "ashelin": "Ashelin", + "baron": "Baron Praxis", + "brutter": "Brutter", + "citizen-female": "Female Citizen", + "citizen-male": "Male Citizen", + "computer": "Computer", + "darkjak": "Dark Jak", + "daxter": "Daxter", + "errol": "Erol", + "grim": "Grim", + "guard": "Krimzon Guard", + "guard-a": "Guard A", + "guard-b": "Guard B", + "jak": "Jak", + "jinx": "Jinx", + "keira": "Keira", + "keira-before-class-3": "Racer", + "kid": "Kid", + "kor": "Kor", + "krew": "Krew", + "metalkor": "Metal Kor", + "mog": "Mog", + "onin": "Onin", + "oracle": "Oracle", + "pecker": "Pecker", + "precursor": "Precursor", + "samos": "Samos", + "sig": "Sig", + "tess": "Tess", + "torn": "Torn", + "vin": "Vin", + "youngsamos": "Young Samos", + "youngsamos-before-rescue": "Samos" + } +} diff --git a/game/assets/jak2/subtitle/subtitle_jp-JP.json b/game/assets/jak2/subtitle/subtitle_jp-JP.json new file mode 100644 index 0000000000..7427817483 --- /dev/null +++ b/game/assets/jak2/subtitle/subtitle_jp-JP.json @@ -0,0 +1,70 @@ +{ + "lang": 5, + "scenes": { + "vin013": { + "lines": [ + { + "end": 74.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 0.0, + "text": "ジャック...コールが..." + }, + { + "end": 154.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 75.0, + "text": "爆弾...建造...エリア..." + }, + { + "end": 189.0, + "merge": false, + "offscreen": true, + "speaker": "vin", + "start": 155.0, + "text": "フゥー..." + } + ], + "scene": false + } + }, + "speakers": { + "agent": "エイジェント", + "ashelin": "アシュリン", + "baron": "バロンプラクシス", + "brutter": "ブラッター", + "citizen-female": "女性しみん", + "citizen-male": "だん性しみん", + "computer": "コンピュータ", + "darkjak": "ダークジャック", + "daxter": "ダックスター", + "errol": "エロル", + "grim": "グリム", + "guard": "ガード", + "guard-a": "ガードA", + "guard-b": "ガードB", + "jak": "ジャック", + "jinx": "ジンクス", + "keira": "ケイラ", + "keira-before-class-3": "レーサー", + "kid": "キッド", + "kor": "コール", + "krew": "クルー", + "metalkor": "メタルコール", + "mog": "モッグ", + "onin": "オニン", + "oracle": "オラクル", + "pecker": "ペッカー", + "precursor": "プリカーソル", + "samos": "セイジィ", + "sig": "ジーグ", + "tess": "テス", + "torn": "トーン", + "vin": "ビン", + "youngsamos": "セイモス", + "youngsamos-before-rescue": "セイジィ" + } +} diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index b682127ad5..e89786b089 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -703,7 +703,16 @@ void OpenGLRenderer::render(DmaFollower dma, const RenderOptions& settings) { } if (settings.draw_subtitle_editor_window) { - m_subtitle_editor.draw_window(); + if (m_subtitle_editor == nullptr) { + m_subtitle_editor = new SubtitleEditor(); + } + m_subtitle_editor->draw_window(); + } + if (settings.draw_subtitle2_editor_window) { + if (m_subtitle2_editor == nullptr) { + m_subtitle2_editor = new Subtitle2Editor(m_version); + } + m_subtitle2_editor->draw_window(); } if (settings.draw_filters_window) { diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.h b/game/graphics/opengl_renderer/OpenGLRenderer.h index 29505a20f0..3754b9ab9b 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.h +++ b/game/graphics/opengl_renderer/OpenGLRenderer.h @@ -12,6 +12,7 @@ #include "game/graphics/opengl_renderer/opengl_utils.h" #include "game/tools/filter_menu/filter_menu.h" #include "game/tools/subtitles/subtitle_editor.h" +#include "game/tools/subtitles2/subtitle2_editor.h" struct RenderOptions { bool draw_render_debug_window = false; @@ -19,6 +20,7 @@ struct RenderOptions { bool draw_loader_window = false; bool draw_small_profiler_window = false; bool draw_subtitle_editor_window = false; + bool draw_subtitle2_editor_window = false; bool draw_filters_window = false; // internal rendering settings - The OpenGLRenderer will internally use this resolution/format. @@ -140,7 +142,8 @@ class OpenGLRenderer { SharedRenderState m_render_state; Profiler m_profiler; SmallProfiler m_small_profiler; - SubtitleEditor m_subtitle_editor; + SubtitleEditor* m_subtitle_editor = nullptr; + Subtitle2Editor* m_subtitle2_editor = nullptr; FiltersMenu m_filters_menu; std::vector> m_bucket_renderers; diff --git a/game/graphics/opengl_renderer/debug_gui.cpp b/game/graphics/opengl_renderer/debug_gui.cpp index b489a015b8..8195a5f996 100644 --- a/game/graphics/opengl_renderer/debug_gui.cpp +++ b/game/graphics/opengl_renderer/debug_gui.cpp @@ -106,6 +106,12 @@ void OpenGlDebugGui::draw(const DmaStats& dma_stats) { } if (ImGui::BeginMenu("Tools")) { + if (m_version == GameVersion::Jak1) { + ImGui::MenuItem("Subtitle Editor", nullptr, &m_subtitle_editor); + } else { + ImGui::MenuItem("Subtitle2 Editor", nullptr, &m_subtitle2_editor); + } + if (ImGui::BeginMenu("Screenshot")) { ImGui::MenuItem("Screenshot Next Frame!", nullptr, &m_want_screenshot); ImGui::InputText("File", m_screenshot_save_name, 50); @@ -127,7 +133,7 @@ void OpenGlDebugGui::draw(const DmaStats& dma_stats) { if (Gfx::g_debug_settings.alternate_style) { ImGui::applyAlternateStyle(); } else { - ImGui::StyleColorsClassic(); + ImGui::applyClassicStyle(); } } ImGui::TreePop(); diff --git a/game/graphics/opengl_renderer/debug_gui.h b/game/graphics/opengl_renderer/debug_gui.h index 7191c1274d..66262d6a05 100644 --- a/game/graphics/opengl_renderer/debug_gui.h +++ b/game/graphics/opengl_renderer/debug_gui.h @@ -7,6 +7,7 @@ #include "common/dma/dma.h" #include "common/util/Timer.h" +#include "common/versions/versions.h" class FrameTimeRecorder { public: @@ -39,12 +40,15 @@ class FrameTimeRecorder { class OpenGlDebugGui { public: + OpenGlDebugGui(GameVersion version) : m_version(version) {} + void start_frame(); void finish_frame(); void draw(const DmaStats& dma_stats); bool should_draw_render_debug() const { return master_enable && m_draw_debug; } bool should_draw_profiler() const { return master_enable && m_draw_profiler; } bool should_draw_subtitle_editor() const { return master_enable && m_subtitle_editor; } + bool should_draw_subtitle2_editor() const { return master_enable && m_subtitle2_editor; } bool should_draw_filters_menu() const { return master_enable && m_filters_menu; } bool should_draw_loader_menu() const { return master_enable && m_draw_loader; } const char* screenshot_name() const { return m_screenshot_save_name; } @@ -79,8 +83,11 @@ class OpenGlDebugGui { bool m_draw_debug = false; bool m_draw_loader = false; bool m_subtitle_editor = false; + bool m_subtitle2_editor = false; bool m_filters_menu = false; bool m_want_screenshot = false; char m_screenshot_save_name[256] = "screenshot.png"; float target_fps_input = 60.f; + + GameVersion m_version; }; diff --git a/game/graphics/pipelines/opengl.cpp b/game/graphics/pipelines/opengl.cpp index 3765c2c10b..a3281f535c 100644 --- a/game/graphics/pipelines/opengl.cpp +++ b/game/graphics/pipelines/opengl.cpp @@ -82,6 +82,7 @@ struct GraphicsData { file_util::get_jak_project_dir() / "out" / game_version_names[version] / "fr3", fr3_level_count[version])), ogl_renderer(texture_pool, loader, version), + debug_gui(version), version(version) {} }; @@ -152,7 +153,7 @@ static void init_imgui(SDL_Window* window, if (!Gfx::g_debug_settings.monospaced_font) { // TODO - add or switch to Noto since it supports the entire unicode range std::string font_path = - (file_util::get_jak_project_dir() / "game" / "assets" / "fonts" / "Roboto-Medium.ttf") + (file_util::get_jak_project_dir() / "game" / "assets" / "fonts" / "NotoSansJP-Medium.ttf") .string(); if (file_util::file_exists(font_path)) { static const ImWchar ranges[] = { @@ -163,11 +164,11 @@ static void init_imgui(SDL_Window* window, 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana 0x3131, 0x3163, // Korean alphabets 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0x4E00, 0x9FAF, // CJK Ideograms 0xA640, 0xA69F, // Cyrillic Extended-B 0xAC00, 0xD7A3, // Korean characters 0xFF00, 0xFFEF, // Half-width characters 0xFFFD, 0xFFFD, // Invalid - 0x4e00, 0x9FAF, // CJK Ideograms 0, }; io.Fonts->AddFontFromFileTTF(font_path.c_str(), Gfx::g_debug_settings.imgui_font_size, @@ -356,6 +357,7 @@ void render_game_frame(int game_width, options.draw_profiler_window = g_gfx_data->debug_gui.should_draw_profiler(); options.draw_loader_window = g_gfx_data->debug_gui.should_draw_loader_menu(); options.draw_subtitle_editor_window = g_gfx_data->debug_gui.should_draw_subtitle_editor(); + options.draw_subtitle2_editor_window = g_gfx_data->debug_gui.should_draw_subtitle2_editor(); options.draw_filters_window = g_gfx_data->debug_gui.should_draw_filters_menu(); options.save_screenshot = false; options.gpu_sync = g_gfx_data->debug_gui.should_gl_finish(); diff --git a/game/settings/settings.h b/game/settings/settings.h index 4dc88acb85..4f09c4da51 100644 --- a/game/settings/settings.h +++ b/game/settings/settings.h @@ -10,10 +10,10 @@ namespace game_settings { struct DebugSettings { DebugSettings(); - std::string version = "1.1"; + std::string version = "1.2"; bool show_imgui = false; - int imgui_font_size = 14; + int imgui_font_size = 16; bool monospaced_font = true; bool alternate_style = false; bool ignore_hide_imgui = false; diff --git a/game/tools/subtitles2/subtitle2_editor.cpp b/game/tools/subtitles2/subtitle2_editor.cpp new file mode 100644 index 0000000000..b6e88fdd11 --- /dev/null +++ b/game/tools/subtitles2/subtitle2_editor.cpp @@ -0,0 +1,436 @@ +#include "subtitle2_editor.h" + +#include + +#include "common/serialization/subtitles2/subtitles2_deser.h" +#include "common/util/FileUtil.h" +#include "common/util/json_util.h" +#include "common/util/string_util.h" + +#include "game/runtime.h" + +#include "third-party/fmt/core.h" +#include "third-party/imgui/imgui.h" +#include "third-party/imgui/imgui_stdlib.h" + +static constexpr size_t LINE_DISPLAY_MAX_LEN = 38; + +Subtitle2Editor::Subtitle2Editor(GameVersion version) + : db_loaded(true), + m_subtitle_db(load_subtitle2_project(version)), + m_repl(8182), + m_speaker_names(get_speaker_names(version)) { + m_filter = m_filter_placeholder; + m_filter_hints = m_filter_placeholder; +} + +bool Subtitle2Editor::is_scene_in_current_lang(const std::string& scene_name) { + return m_subtitle_db.m_banks.at(m_current_language)->scenes.count(scene_name) > 0; +} + +void Subtitle2Editor::repl_rebuild_text() { + // reload subtitles immediately + m_repl.eval("(reload-subtitles)"); +} + +void Subtitle2Editor::repl_play_vag(const std::string& name, bool is_scene) { + if (is_scene) { + m_repl.eval(fmt::format("(scene-find-and-play \"{}\")", name)); + } else { + m_repl.eval(fmt::format("(vag-player-play-from-name \"{}\")", name)); + } +} + +void Subtitle2Editor::draw_window() { + ImGui::Begin("Subtitle2 Editor"); + + if (!db_loaded) { + if (ImGui::Button("Load Subtitles")) { + m_subtitle_db = load_subtitle2_project(g_game_version); + db_loaded = true; + } + ImGui::End(); + return; + } + + if (ImGui::Button("Save Changes")) { + m_files_saved_successfully = + std::make_optional(write_subtitle_db_to_files(m_subtitle_db, g_game_version)); + repl_rebuild_text(); + } + if (m_files_saved_successfully.has_value()) { + ImGui::SameLine(); + if (m_files_saved_successfully.value()) { + ImGui::PushStyleColor(ImGuiCol_Text, m_success_text_color); + ImGui::Text("Saved!"); + ImGui::PopStyleColor(); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, m_error_text_color); + ImGui::Text("Error!"); + ImGui::PopStyleColor(); + } + } + + draw_edit_options(); + draw_repl_options(); + draw_speaker_options(); + + if (!m_current_scene) { + ImGui::PushStyleColor(ImGuiCol_Text, m_disabled_text_color); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, m_selected_text_color); + } + if (ImGui::TreeNode("Currently Selected Cutscene")) { + ImGui::Text("%s", m_current_scene_name.c_str()); + ImGui::SameLine(); + ImGui::Checkbox("Cutscene?", &m_current_scene->scene); + ImGui::PopStyleColor(); + if (m_current_scene) { + draw_subtitle_options(*m_current_scene, m_current_scene_name, true); + } else { + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 0, 0, 255)); + ImGui::Text("Select a Scene from Below!"); + ImGui::PopStyleColor(); + } + ImGui::TreePop(); + } else { + ImGui::PopStyleColor(); + } + + if (ImGui::TreeNode("All Cutscenes")) { + ImGui::InputText("New Scene Name", &m_new_scene_name); + ImGui::InputText("Filter", &m_filter, ImGuiInputTextFlags_::ImGuiInputTextFlags_AutoSelectAll); + if (is_scene_in_current_lang(m_new_scene_name)) { + ImGui::PushStyleColor(ImGuiCol_Text, m_error_text_color); + ImGui::Text("Scene already exists with that name, no!"); + ImGui::PopStyleColor(); + } + if (!is_scene_in_current_lang(m_new_scene_name) && !m_new_scene_name.empty()) { + if (ImGui::Button("Add Scene")) { + Subtitle2Scene new_scene; + m_subtitle_db.m_banks.at(m_current_language)->add_scene(m_new_scene_name, new_scene); + if (m_add_new_scene_as_current) { + auto& scenes = m_subtitle_db.m_banks.at(m_current_language)->scenes; + auto& scene_info = scenes.at(m_new_scene_name); + m_current_scene = &scene_info; + m_current_scene_name = m_new_scene_name; + } + m_new_scene_name = ""; + } + ImGui::SameLine(); + ImGui::Checkbox("Add as Current Scene", &m_add_new_scene_as_current); + } + + draw_all_scenes(); + ImGui::TreePop(); + } + + ImGui::End(); +} + +void Subtitle2Editor::draw_edit_options() { + if (ImGui::TreeNode("Editing Options")) { + if (ImGui::BeginCombo("Editor Language ID", + fmt::format("[{}] {}", m_subtitle_db.m_banks[m_current_language]->lang, + m_subtitle_db.m_banks[m_current_language]->file_path) + .c_str())) { + for (const auto& [key, value] : m_subtitle_db.m_banks) { + const bool isSelected = m_current_language == key; + if (ImGui::Selectable(fmt::format("[{}] {}", value->lang, value->file_path).c_str(), + isSelected)) { + m_current_language = key; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + if (ImGui::BeginCombo("Base Language ID", + fmt::format("[{}] {}", m_subtitle_db.m_banks[m_base_language]->lang, + m_subtitle_db.m_banks[m_base_language]->file_path) + .c_str())) { + for (const auto& [key, value] : m_subtitle_db.m_banks) { + const bool isSelected = m_base_language == key; + if (ImGui::Selectable(fmt::format("[{}] {}", value->lang, value->file_path).c_str(), + isSelected)) { + m_base_language = key; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + ImGui::Checkbox("Show missing cutscenes from base", &m_base_show_missing_cutscenes); + ImGui::TreePop(); + } +} + +void Subtitle2Editor::draw_repl_options() { + if (ImGui::TreeNode("REPL Options")) { + // TODO - the ReplServer should eventually be able to return statuses to make this easier: + // - Has the game been built before? + // - Is the repl connected? + ImGui::TextWrapped( + "This tool requires a REPL connected to the game, with the game built. Run the following " + "to do so:"); + ImGui::Text(" - `task repl`"); + ImGui::Text(" - `(lt)`"); + ImGui::Text(" - `(mi)`"); + ImGui::Text(" - Click Connect Below!"); + if (m_repl.is_connected()) { + ImGui::PushStyleColor(ImGuiCol_Text, m_success_text_color); + ImGui::Text("REPL Connected, should be good to go!"); + ImGui::PopStyleColor(); + } else { + if (ImGui::Button("Connect to REPL")) { + m_repl.connect(); + if (!m_repl.is_connected()) { + ImGui::PushStyleColor(ImGuiCol_Text, m_error_text_color); + ImGui::Text("Could not connect."); + ImGui::PopStyleColor(); + } + } + } + ImGui::TreePop(); + } +} + +void Subtitle2Editor::draw_speaker_options() { + if (ImGui::TreeNode("Speakers")) { + const auto bank = m_subtitle_db.m_banks[m_current_language]; + for (auto& speaker_name : m_speaker_names) { + // ImGui::SameLine(); + if (bank->speakers.count(speaker_name) == 0) { + // no speaker yet. + std::string input = ""; + ImGui::InputText(speaker_name.c_str(), &input); + if (!input.empty()) { + // speaker got filled + bank->speakers.insert({speaker_name, input}); + } + } else { + // existing speaker + std::string input = bank->speakers.at(speaker_name); + if (ImGui::InputText(speaker_name.c_str(), &input)) { + if (input.empty()) { + // speaker got deleted + bank->speakers.erase(speaker_name); + } else { + // speaker got changed + bank->speakers.at(speaker_name) = input; + } + } + } + } + ImGui::TreePop(); + } +} + +void Subtitle2Editor::draw_all_scenes(bool base_cutscenes) { + auto& scenes = + m_subtitle_db.m_banks.at(base_cutscenes ? m_base_language : m_current_language)->scenes; + std::unordered_set to_delete; + for (auto& [name, scene] : scenes) { + // Don't duplicate entries + if (base_cutscenes && is_scene_in_current_lang(name)) { + continue; + } + bool is_current_scene = m_current_scene && m_current_scene_name == name; + if ((!m_filter.empty() && m_filter != m_filter_placeholder) && + name.find(m_filter) == std::string::npos) { + continue; + } + bool color_pushed = false; + if (!base_cutscenes && is_current_scene) { + ImGui::PushStyleColor(ImGuiCol_Text, m_selected_text_color); + color_pushed = true; + } else if (base_cutscenes) { + ImGui::PushStyleColor(ImGuiCol_Text, m_disabled_text_color); + color_pushed = true; + } + + if (ImGui::TreeNode( + fmt::format("{}-{}", name, base_cutscenes ? m_base_language : m_current_language) + .c_str(), + "%s", name.c_str())) { + if (color_pushed) { + ImGui::PopStyleColor(); + } + if (!base_cutscenes && !is_current_scene) { + if (ImGui::Button("Select as Current")) { + m_current_scene = &scene; + m_current_scene_name = name; + } + } + if (base_cutscenes) { + if (ImGui::Button("Copy from Base Language")) { + m_subtitle_db.m_banks.at(m_current_language)->add_scene(name, scene); + } + } + draw_subtitle_options(scene, name); + ImGui::PushStyleColor(ImGuiCol_Button, m_warning_color); + if (ImGui::Button("Delete")) { + if (&scene == m_current_scene || name == m_current_scene_name) { + m_current_scene = nullptr; + m_current_scene_name = ""; + } + to_delete.insert(name); + } + ImGui::PopStyleColor(); + ImGui::TreePop(); + } else if (color_pushed) { + ImGui::PopStyleColor(); + } + } + for (auto& name : to_delete) { + scenes.erase(name); + } +} + +void Subtitle2Editor::draw_subtitle_options(Subtitle2Scene& scene, + const std::string& name, + bool current_scene) { + if (!m_repl.is_connected()) { + ImGui::PushStyleColor(ImGuiCol_Text, m_error_text_color); + ImGui::Text("REPL not connected, can't play!"); + ImGui::PopStyleColor(); + } else { + // Cutscenes + if (ImGui::Button("Play Scene")) { + repl_play_vag(name, scene.scene); + } + } + if (current_scene) { + draw_new_cutscene_line_form(); + } + const auto bank = m_subtitle_db.m_banks[m_current_language]; + int i = 0; + for (auto line = scene.lines.begin(); line != scene.lines.end();) { + float times[2] = {line->start, line->end}; + bool speaker_exists = bank->speakers.count(line->speaker) != 0; + auto speaker_text = !speaker_exists ? "N/A" : bank->speakers.at(line->speaker); + std::string full_line = line->text; + if (speaker_exists) { + full_line = speaker_text + ": " + full_line; + } + auto summary = fmt::format("[{} - {}] {}", line->start, line->end, full_line); + if (line->text.empty()) { + ImGui::PushStyleColor(ImGuiCol_Text, m_disabled_text_color); + } else if (line->offscreen) { + ImGui::PushStyleColor(ImGuiCol_Text, m_offscreen_text_color); + } + if (ImGui::TreeNode(fmt::format("{}", i).c_str(), "%s", summary.c_str())) { + if (line->text.empty() || line->offscreen) { + ImGui::PopStyleColor(); + } + ImGui::InputFloat2("Start and End Frame", times, "%.0f", + ImGuiInputTextFlags_::ImGuiInputTextFlags_CharsDecimal); + if (ImGui::BeginCombo("Speaker", + fmt::format("{} ({})", speaker_text.c_str(), line->speaker).c_str())) { + const bool isSelected = line->speaker == "none"; + if (ImGui::Selectable("none", isSelected)) { + line->speaker = "none"; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + for (auto& speaker_name : m_speaker_names) { + if (bank->speakers.count(speaker_name) == 0) { + continue; + } + const bool isSelected = line->speaker == speaker_name; + if (ImGui::Selectable( + fmt::format("{} ({})", bank->speakers.at(speaker_name), speaker_name).c_str(), + isSelected)) { + line->speaker = speaker_name; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + ImGui::InputText("Text", &line->text); + ImGui::Checkbox("Offscreen?", &line->offscreen); + ImGui::SameLine(); + ImGui::Checkbox("Merge text?", &line->merge); + if (scene.lines.size() > 1) { // prevent creating an empty scene + ImGui::PushStyleColor(ImGuiCol_Button, m_warning_color); + if (ImGui::Button("Delete")) { + line = scene.lines.erase(line); + ImGui::PopStyleColor(); + ImGui::TreePop(); + continue; + } + ImGui::PopStyleColor(); + } + ImGui::TreePop(); + } else if (line->text.empty() || line->offscreen) { + ImGui::PopStyleColor(); + } + line->start = times[0]; + line->end = times[1]; + i++; + line++; + } +} + +void Subtitle2Editor::draw_new_cutscene_line_form() { + auto bank = m_subtitle_db.m_banks[m_current_language]; + ImGui::InputFloat2("Start and End Frame", m_current_scene_frame, "%.0f", + ImGuiInputTextFlags_::ImGuiInputTextFlags_CharsDecimal); + const auto& speakers = bank->speakers; + if (speakers.count(m_current_scene_speaker) == 0) { + // pick whatever the first one it finds is + m_current_scene_speaker = "none"; + } + + if (ImGui::BeginCombo("Speaker", + m_current_scene_speaker == "none" + ? "none" + : fmt::format("{} ({})", speakers.at(m_current_scene_speaker), + m_current_scene_speaker) + .c_str())) { + const bool isSelected = m_current_scene_speaker == "none"; + if (ImGui::Selectable("none", isSelected)) { + m_current_scene_speaker = "none"; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + for (auto& speaker_name : m_speaker_names) { + if (speakers.count(speaker_name) == 0) { + continue; + } + const bool isSelected = m_current_scene_speaker == speaker_name; + if (ImGui::Selectable(fmt::format("{} ({})", speakers.at(speaker_name), speaker_name).c_str(), + isSelected)) { + m_current_scene_speaker = speaker_name; + } + if (isSelected) { + ImGui::SetItemDefaultFocus(); + } + } + ImGui::EndCombo(); + } + ImGui::InputText("Text", &m_current_scene_text); + ImGui::Checkbox("Offscreen?", &m_current_scene_offscreen); + ImGui::SameLine(); + ImGui::Checkbox("Merge text?", &m_current_scene_merge); + if (m_current_scene_frame[0] < 0 || m_current_scene_frame[1] < 0 || + (m_current_scene_text.empty() && !m_current_scene_merge)) { + ImGui::PushStyleColor(ImGuiCol_Text, m_error_text_color); + ImGui::Text("Can't add a new text entry with the current fields!"); + ImGui::PopStyleColor(); + } else { + if (ImGui::Button("Add Text Entry")) { + m_current_scene->lines.emplace_back(m_current_scene_frame[0], m_current_scene_frame[1], + m_current_scene_text, m_current_scene_speaker, + m_current_scene_offscreen, m_current_scene_merge); + // TODO - sorting after every insertion is slow, sort on the add scene instead + std::sort(m_current_scene->lines.begin(), m_current_scene->lines.end()); + } + } +} diff --git a/game/tools/subtitles2/subtitle2_editor.h b/game/tools/subtitles2/subtitle2_editor.h new file mode 100644 index 0000000000..2df8a7fc2c --- /dev/null +++ b/game/tools/subtitles2/subtitle2_editor.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +#include "common/repl/nrepl/ReplClient.h" +#include "common/serialization/subtitles2/subtitles2_ser.h" + +#include "third-party/imgui/imgui.h" + +// TODO Later: +// - Hints, these seem less annoying but there are a lot of them + +class Subtitle2Editor { + public: + Subtitle2Editor(GameVersion version); + void draw_window(); + + private: + void draw_edit_options(); + void draw_repl_options(); + void draw_speaker_options(); + + void draw_all_scenes(bool base_cutscenes = false); + void draw_subtitle_options(Subtitle2Scene& scene, + const std::string& name, + bool current_scene = false); + void draw_new_cutscene_line_form(); + + bool db_loaded = false; + + GameSubtitle2DB m_subtitle_db; + Subtitle2Scene* m_current_scene = nullptr; + std::string m_current_scene_name = ""; + std::string m_filter; + std::string m_filter_hints; + + ReplClient m_repl; + + float m_current_scene_frame[2] = {0, 0}; + std::string m_current_scene_text = ""; + std::string m_current_scene_speaker = ""; + bool m_current_scene_offscreen = false; + bool m_current_scene_merge = false; + bool m_add_new_scene_as_current = false; + + std::string m_new_scene_name = ""; + std::string m_new_scene_id = "0"; + + std::string m_filter_placeholder = "Filter List..."; + + std::optional m_files_saved_successfully = {}; + + int m_base_language = 0; + int m_current_language = 0; + // bool m_base_show_lines = false; + bool m_base_show_missing_cutscenes = true; + + // TODO - let the user customize these colors + ImVec4 m_normal_text_color = ImVec4(1.0f, 0.0f, 1.0f, 1.0f); + int m_selected_text_color = IM_COL32(89, 227, 225, 255); + ImVec4 m_success_text_color = ImVec4(0.0f, 1.0f, 0.0f, 1.0f); + ImVec4 m_error_text_color = ImVec4(1.0f, 0.0f, 0.0f, 1.0f); + ImVec4 m_disabled_text_color = ImVec4(1.0f, 1.0f, 1.0f, 0.7f); + ImVec4 m_warning_color = ImVec4(0.619f, 0.443f, 0.0f, 1.0f); + int m_offscreen_text_color = IM_COL32(240, 242, 102, 255); + // TODO - cycle speaker colors + + const std::vector m_speaker_names; + + void repl_rebuild_text(); + void repl_play_vag(const std::string& name, bool is_scene); + + bool is_scene_in_current_lang(const std::string& scene_name); +}; diff --git a/goal_src/goal-lib.gc b/goal_src/goal-lib.gc index 8db73458e8..52f65931b0 100644 --- a/goal_src/goal-lib.gc +++ b/goal_src/goal-lib.gc @@ -1037,6 +1037,14 @@ `(defconstant ,name (-> self draw art-group data ,idx)) ) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; built-in type stuff +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmacro string? (val) + `(type? ,val string)) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Load Project ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/goal_src/jak1/engine/debug/menu.gc b/goal_src/jak1/engine/debug/menu.gc index 139b0432dd..9acf4938fa 100644 --- a/goal_src/jak1/engine/debug/menu.gc +++ b/goal_src/jak1/engine/debug/menu.gc @@ -424,21 +424,19 @@ ;;;;;;;;;;;;;;;;;;;;;;;; (defun debug-menu-item-get-max-width ((arg0 debug-menu-item) (arg1 debug-menu)) - "Determine the width, in pixels" - (local-vars (v0-1 int)) + "Determine the width, in screen units" 0 (cond - ((= (-> arg0 type) debug-menu-item-submenu) - (set! v0-1 (+ (the int (get-string-length (-> arg0 name) (-> arg1 context font))) 16)) + ((= (-> arg0 type) debug-menu-item-submenu) + (+ (the int (get-string-length (-> arg0 name) (-> arg1 context font))) 16) + ) + ((= (-> arg0 type) debug-menu-item-var) + (the int (get-string-length (-> (the-as debug-menu-item-var arg0) display-str) (-> arg1 context font))) + ) + (else + (+ (the int (get-string-length (-> arg0 name) (-> arg1 context font))) 6) + ) ) - ((= (-> arg0 type) debug-menu-item-var) - (set! v0-1 (the int (get-string-length (-> (the-as debug-menu-item-var arg0) display-str) (-> arg1 context font)))) - ) - (else - (set! v0-1 (+ (the int (get-string-length (-> arg0 name) (-> arg1 context font))) 6)) - ) - ) - v0-1 ) (defun debug-menu-context-default-selection ((ctxt debug-menu-context) (keep-current symbol)) @@ -761,8 +759,6 @@ )) (with-dma-buffer-add-bucket ((s3-0 (-> (current-frame) debug-buf)) (bucket-id debug-no-zbuf)) - ;; NOTE: the draw-string-adv advances too far on widescreen. - ;; NOTE 2: should be fixed? (draw-string-adv (-> item name) s3-0 s5-0) (draw-string-adv "..." s3-0 s5-0) ) diff --git a/goal_src/jak1/engine/gfx/font.gc b/goal_src/jak1/engine/gfx/font.gc index d4f2f8ac5d..f4055d4385 100644 --- a/goal_src/jak1/engine/gfx/font.gc +++ b/goal_src/jak1/engine/gfx/font.gc @@ -1635,13 +1635,7 @@ ) (defun get-string-length ((arg0 string) (arg1 font-context)) - (local-vars - (v0-0 float) (a2-1 (inline-array vector)) (a2-4 (inline-array vector)) (a3-2 int) (a3-9 uint) - (a3-10 int) (t0-0 uint) (t0-1 uint) (t0-3 int) (t0-4 int) (t0-5 int) (t1-1 uint) (t1-2 uint) - (t1-3 uint) (t1-4 uint) (t1-5 uint) (t2-0 uint) (t2-2 uint) (t2-3 uint) (t2-4 uint) (t2-5 uint) - (t2-6 uint) (t2-7 uint) (t2-8 uint) (t2-9 uint) (t2-10 uint) (t2-11 uint) (t2-12 uint) - (t2-13 uint) (t2-14 uint) (t2-15 uint) (t2-16 uint) (t2-17 uint) (t3-0 uint) (t3-1 int) - ) + (local-vars (v0-0 float)) (rlet ((vf0 :class vf) (vf1 :class vf) (vf13 :class vf) @@ -1652,171 +1646,132 @@ (vf25 :class vf) (vf5 :class vf) ) - (init-vf0-vector) - (.lvf vf25 (&-> arg1 context-vec quad)) - (.lvf vf23 (&-> arg1 origin quad)) - (.lvf vf24 (&-> arg1 origin quad)) - (let ((v1-0 (-> arg1 flags-signed))) - (let ((a1-2 *video-parms*)) - (.lvf vf1 (+ (the int a1-2) 64)) - ) - (.mul.vf vf25 vf25 vf1 :mask #b11) - (.mul.vf vf23 vf23 vf1 :mask #b11) - ;; hack! fixes small font widescreen - (unless (logtest? (-> arg1 flags) (font-flags pc-hack)) - (.mul.vf vf24 vf24 vf1 :mask #b11) - ) - (let ((a1-4 *font-work*)) - (set! (-> a1-4 str-ptr) (the-as uint arg0)) - (set! (-> a1-4 flags) (the-as font-flags v1-0)) - (.mov.vf vf1 vf0) - (let ((a2-0 (logand v1-0 32))) - (nop!) - (b! (nonzero? a2-0) cfg-2 :delay (set! a2-1 *font12-table*)) - ) - (let ((a2-2 a2-1)) - (nop!) - (.lvf vf13 (&-> a1-4 size1-small quad)) - (b! #t cfg-3 :delay (.lvf vf14 (&-> a1-4 size2-small quad))) - (label cfg-2) - (nop!) - (set! a2-2 *font24-table*) - (nop!) - (.lvf vf13 (&-> a1-4 size1-large quad)) - (nop!) - (.lvf vf14 (&-> a1-4 size2-large quad)) - (label cfg-3) - (let ((a3-0 (-> (the-as (pointer uint8) arg0) 4))) - (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) - (b! (zero? a3-0) cfg-51 :delay (set! t0-0 (+ a3-0 -1))) - (b! (zero? t0-0) cfg-44 :delay (set! t0-1 (+ a3-0 -126))) - (b! (nonzero? t0-1) cfg-45 :delay (nop!)) - (set! a3-0 (-> (the-as (pointer uint8) arg0) 4)) - (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) - (let ((t0-2 0) - (t1-0 0) - ) - (b! (zero? a3-0) cfg-51 :delay (set! t2-0 (+ a3-0 -43))) - (.movz t0-3 a3-0 t2-0 t0-2) - (let ((t2-1 (+ a3-0 -45))) - (.movz t0-4 a3-0 t2-1 t0-3) - ) - (nop!) - (b! (nonzero? t0-4) cfg-14 :delay (set! t2-2 (+ a3-0 -121))) - (b! (zero? t2-2) cfg-42 :delay (set! t1-1 (+ a3-0 -89))) - (b! (zero? t1-1) cfg-42 :delay (set! t1-2 (+ a3-0 -122))) - (b! (zero? t1-2) cfg-43 :delay (set! t1-3 (+ a3-0 -90))) - (b! (zero? t1-3) cfg-43 :delay (set! t1-4 (+ a3-0 -48))) - (b! (< (the-as int t1-4) 0) cfg-45 :delay (set! t1-5 (+ a3-0 -57))) - (b! - (> (the-as int t1-5) 0) - cfg-45 - :delay - (set! t1-0 (the-as int (+ a3-0 -48))) - ) - (label cfg-14) - (set! a3-0 (-> (the-as (pointer uint8) arg0) 4)) - (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) - (b! (zero? a3-0) cfg-51 :delay (set! t2-3 (+ a3-0 -110))) - (b! (zero? t2-3) cfg-32 :delay (set! t2-4 (+ a3-0 -78))) - (b! (zero? t2-4) cfg-32 :delay (set! t2-5 (+ a3-0 -108))) - (b! (zero? t2-5) cfg-3 :delay (set! t2-6 (+ a3-0 -76))) - (b! (zero? t2-6) cfg-3 :delay (set! t2-7 (+ a3-0 -119))) - (b! (zero? t2-7) cfg-3 :delay (set! t2-8 (+ a3-0 -87))) - (b! (zero? t2-8) cfg-3 :delay (set! t2-9 (+ a3-0 -107))) - (b! (zero? t2-9) cfg-35 :delay (set! t2-10 (+ a3-0 -75))) - (b! (zero? t2-10) cfg-35 :delay (set! t2-11 (+ a3-0 -106))) - (b! (zero? t2-11) cfg-3 :delay (set! t2-12 (+ a3-0 -74))) - (b! (zero? t2-12) cfg-3 :delay (set! t2-13 (+ a3-0 -104))) - (b! (zero? t2-13) cfg-37 :delay (set! t2-14 (+ a3-0 -72))) - (b! (zero? t2-14) cfg-37 :delay (set! t2-15 (+ a3-0 -118))) - (b! (zero? t2-15) cfg-3 :delay (set! t2-16 (+ a3-0 -86))) - (b! (zero? t2-16) cfg-3 :delay (set! t2-17 (+ a3-0 -48))) - (b! (< (the-as int t2-17) 0) cfg-45 :delay (set! t3-0 (+ a3-0 -57))) - (b! (> (the-as int t3-0) 0) cfg-45 :delay (.sll t3-1 t1-0 2)) - (let ((a3-1 (+ t1-0 t3-1))) - (nop!) - (.sll a3-2 a3-1 1) - ) - (nop!) - (b! #t cfg-14 :delay (set! t1-0 (+ a3-2 t2-17))) - (label cfg-32) - (b! (nonzero? t1-0) cfg-34 :delay (set! a2-4 *font12-table*)) - (set! a2-2 a2-4) - (let ((a3-3 -33)) - (.lvf vf13 (&-> a1-4 size1-small quad)) - (nop!) - (.lvf vf14 (&-> a1-4 size2-small quad)) - (b! #t cfg-3 :delay (set! v1-0 (logand v1-0 a3-3))) - ) - (label cfg-34) - (nop!) - (set! a2-2 *font24-table*) - (nop!) - (.lvf vf13 (&-> a1-4 size1-large quad)) - (nop!) - (.lvf vf14 (&-> a1-4 size2-large quad)) - (b! #t cfg-3 :delay (set! v1-0 (logior v1-0 32))) - (label cfg-35) - (let ((a3-4 -3)) - (nop!) - (b! (zero? t1-0) cfg-3 :delay (set! v1-0 (logand v1-0 a3-4))) - ) - (b! #t cfg-3 :delay (set! v1-0 (logior v1-0 2))) - (label cfg-37) - (.mov vf1 t1-0) + (init-vf0-vector) + (.lvf vf25 (&-> arg1 context-vec quad)) + (.lvf vf23 (&-> arg1 origin quad)) + (.lvf vf24 (&-> arg1 origin quad)) + (let ((flags (-> arg1 flags)) + (work *font-work*)) + (.lvf vf1 (&-> *video-parms* relative-x-scale-reciprical)) + (.mul.vf vf25 vf25 vf1 :mask #b11) + (.mul.vf vf23 vf23 vf1 :mask #b11) + ;; hack! fixes small font widescreen + (unless (logtest? (-> arg1 flags) (font-flags pc-hack)) + (.mul.vf vf24 vf24 vf1 :mask #b11) ) - (let ((a3-5 (+ t0-4 -45))) - (b! (zero? t0-4) cfg-41 :delay (.itof.vf vf1 vf1)) - (b! (zero? a3-5) cfg-40 :delay (nop!)) - ) - (b! #t cfg-3 :delay (.add.x.vf vf23 vf23 vf1 :mask #b1)) - (label cfg-40) - (b! #t cfg-3 :delay (.sub.x.vf vf23 vf23 vf1 :mask #b1)) - (label cfg-41) - (b! #t cfg-3 :delay (.add.x.vf vf23 vf0 vf1 :mask #b1)) - (label cfg-42) - (b! #t cfg-3 :delay (.svf (&-> a1-4 save quad) vf23)) - (label cfg-43) - (b! #t cfg-3 :delay (.lvf vf23 (&-> a1-4 save quad))) - (label cfg-44) - (let ((a3-6 (-> (the-as (pointer uint8) arg0) 4))) - (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) - (nop!) - (let ((a3-7 (logand a3-6 127))) - (nop!) - (let ((a3-8 (+ a3-7 255))) - (b! #t cfg-48 :delay (.sll t0-5 a3-8 4)) + (set! (-> work str-ptr) (the-as uint arg0)) + (set! (-> work flags) flags) + (.mov.vf vf1 vf0) + (let ((kerning-table (cond + ((logtest? flags (font-flags large)) + (.lvf vf13 (&-> work size1-large quad)) + (.lvf vf14 (&-> work size2-large quad)) + *font24-table*) + (else + (.lvf vf13 (&-> work size1-small quad)) + (.lvf vf14 (&-> work size2-small quad)) + *font12-table*) + ))) + (label cfg-3) + (let ((cur-char (-> arg0 data 0))) + (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) + (if (zero? cur-char) (goto cfg-51)) + (when (= cur-char 1) + (let ((a3-6 (-> arg0 data 0))) + (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) + (set! cur-char (+ (logand a3-6 127) 255)) + (goto cfg-48) + ) + ) + (when (= cur-char #\~) + (set! cur-char (-> arg0 data 0)) + (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) + (if (zero? cur-char) (goto cfg-51)) + (when (or (= cur-char #\Y) (= cur-char #\y)) + (.svf (&-> work save quad) vf23) + (goto cfg-3)) + (when (or (= cur-char #\Z) (= cur-char #\z)) + (.lvf vf23 (&-> work save quad)) + (goto cfg-3)) + (let ((sign-char (if (or (= cur-char #\-) (= cur-char #\+)) cur-char 0)) + (arg-val 0)) + (when (or (nonzero? sign-char) + (and (>= cur-char #\0) (<= cur-char #\9))) + (label cfg-14) + (set! cur-char (-> arg0 data 0)) + (set! arg0 (the-as string (&-> (the-as (pointer uint8) arg0) 1))) + (if (zero? cur-char) (goto cfg-51)) + (case cur-char + ((#\n #\N) + (cond + ((nonzero? arg-val) + (.lvf vf13 (&-> work size1-large quad)) + (.lvf vf14 (&-> work size2-large quad)) + (set! kerning-table *font24-table*) + (logior! flags (font-flags large))) + (else + (.lvf vf13 (&-> work size1-small quad)) + (.lvf vf14 (&-> work size2-small quad)) + (set! kerning-table *font12-table*) + (logclear! flags (font-flags large))) + ) + (goto cfg-3) + ) + ((#\l #\L #\w #\W #\j #\J #\v #\V) + (goto cfg-3) + ) + ((#\k #\K) + (if (zero? arg-val) + (logclear! flags (font-flags kerning)) + (logior! flags (font-flags kerning))) + (goto cfg-3) + ) + ((#\h #\H) + (.mov vf1 arg-val) + (.itof.vf vf1 vf1) + (cond + ((zero? sign-char) + (.add.x.vf vf23 vf0 vf1 :mask #b1) + ) + ((= sign-char #\-) + (.sub.x.vf vf23 vf23 vf1 :mask #b1) + ) + (else + (.add.x.vf vf23 vf23 vf1 :mask #b1) + ) + ) + (goto cfg-3) + ) + ) + (when (and (>= cur-char #\0) (<= cur-char #\9)) + (set! arg-val (+ (* arg-val 10) (- cur-char #\0))) + (goto cfg-14) + ) + ) + ) + ) + (cond + ((and (!= cur-char 10) (!= cur-char 13)) + (label cfg-48) + (.lvf vf5 (&-> kerning-table (- cur-char 16) quad)) + (.mul.vf vf19 vf5 vf13) + (if (logtest? flags (font-flags kerning)) + (.add.w.vf vf23 vf23 vf19 :mask #b1) + (.add.w.vf vf23 vf23 vf14 :mask #b1)) + ) + (else + (.add.x.vf vf23 vf0 vf24 :mask #b1) + ) + ) + (goto cfg-3) ) - ) ) - (label cfg-45) - (nop!) - (.sll t0-5 a3-0 4) - (nop!) - (b! (= a3-0 10) cfg-47 :delay (set! a3-9 (+ a3-0 -13))) - ) - (b! (nonzero? a3-9) cfg-48 :delay (nop!)) - (label cfg-47) - (b! #t cfg-3 :delay (.add.x.vf vf23 vf0 vf24 :mask #b1)) - (label cfg-48) - (.addu a3-10 t0-5 a2-2) ) - ) - (nop!) - (.lvf vf5 (+ a3-10 -256)) - (nop!) - (.mul.vf vf19 vf5 vf13) - (b! (zero? (logand v1-0 2)) cfg-50 :delay (nop!)) + (label cfg-51) + (.sub.vf vf23 vf23 vf24) + (.mov v0-0 vf23) + v0-0 ) - (b! #t cfg-3 :delay (.add.w.vf vf23 vf23 vf19 :mask #b1)) - (label cfg-50) - (b! #t cfg-3 :delay (.add.w.vf vf23 vf23 vf14 :mask #b1)) - (label cfg-51) - (.sub.vf vf23 vf23 vf24) - (.mov v0-0 vf23) - v0-0 - ) ) (defun draw-string-xy ((str string) (buf dma-buffer) (x int) (y int) (color font-color) (flags font-flags)) diff --git a/goal_src/jak1/engine/ui/credits.gc b/goal_src/jak1/engine/ui/credits.gc index 0d9a0128c5..89f32cb07b 100644 --- a/goal_src/jak1/engine/ui/credits.gc +++ b/goal_src/jak1/engine/ui/credits.gc @@ -117,7 +117,7 @@ (disable-level-text-file-loading) (protect ((-> *pc-settings* text-language)) ;; swap language and load new text files - (set! (-> *pc-settings* text-language) (the pc-subtitle-lang (-> *setting-control* current language))) + (set! (-> *pc-settings* text-language) (the pc-language (-> *setting-control* current language))) (load-level-text-files 0))) (let ((s4-0 (+ (- arg0) (the int (* 1.5 (the float (-> *video-parms* screen-sy)))))) (gp-0 2815) diff --git a/goal_src/jak1/engine/ui/text.gc b/goal_src/jak1/engine/ui/text.gc index 492f6f2711..d1afe864e7 100644 --- a/goal_src/jak1/engine/ui/text.gc +++ b/goal_src/jak1/engine/ui/text.gc @@ -465,7 +465,7 @@ (none) ) -(defun print-game-text ((str string) (font-ctxt font-context) (opaque symbol) (alpha int) (line-height int)) +(defun print-game-text ((str string) (font-ctxt font-context) (no-draw symbol) (alpha int) (line-height int)) "Print text. Not worth commenting until we get stack variables in lets, I think" (local-vars (sv-112 float) @@ -619,7 +619,7 @@ (if (nonzero? (-> *game-text-line* data 0)) (set! sv-168 (+ sv-168 1)) ) - (when (not opaque) + (when (not no-draw) (let* ((s1-1 (-> *display* frames (-> *display* on-screen) frame global-buf)) (s2-1 (-> s1-1 base)) ) diff --git a/goal_src/jak1/game.gp b/goal_src/jak1/game.gp index 23d060c2ed..0d7f3c540b 100644 --- a/goal_src/jak1/game.gp +++ b/goal_src/jak1/game.gp @@ -403,7 +403,11 @@ (defstep :in "game/assets/jak1/game_subtitle.gp" :tool 'subtitle :out '("$OUT/iso/0SUBTIT.TXT" + "$OUT/iso/1SUBTIT.TXT" + "$OUT/iso/2SUBTIT.TXT" "$OUT/iso/3SUBTIT.TXT" + "$OUT/iso/4SUBTIT.TXT" + "$OUT/iso/5SUBTIT.TXT" "$OUT/iso/6SUBTIT.TXT") ) diff --git a/goal_src/jak1/pc/debug/default-menu-pc.gc b/goal_src/jak1/pc/debug/default-menu-pc.gc index f93ef08f54..3bee30e93c 100644 --- a/goal_src/jak1/pc/debug/default-menu-pc.gc +++ b/goal_src/jak1/pc/debug/default-menu-pc.gc @@ -429,7 +429,7 @@ ) (defun dm-subtitle-language ((blang int) (msg debug-menu-msg)) - (let ((lang (the pc-subtitle-lang (/ blang 8)))) + (let ((lang (the pc-language (/ blang 8)))) (when (= msg (debug-menu-msg press)) (set! (-> *pc-settings* subtitle-language) lang)) (= (-> *pc-settings* subtitle-language) lang) @@ -437,7 +437,7 @@ ) (defun dm-text-language ((blang int) (msg debug-menu-msg)) - (let ((lang (the pc-subtitle-lang (/ blang 8)))) + (let ((lang (the pc-language (/ blang 8)))) (when (= msg (debug-menu-msg press)) (set! (-> *pc-settings* text-language) lang)) (= (-> *pc-settings* text-language) lang) diff --git a/goal_src/jak1/pc/pckernel-common.gc b/goal_src/jak1/pc/pckernel-common.gc index 221307c5b2..9fbecc4bff 100644 --- a/goal_src/jak1/pc/pckernel-common.gc +++ b/goal_src/jak1/pc/pckernel-common.gc @@ -692,7 +692,6 @@ (("lod-force-ocean") (set! (-> obj lod-force-ocean) (file-stream-read-int file))) (("lod-force-actor") (set! (-> obj lod-force-actor) (file-stream-read-int file))) (("game-language") (set-game-language! obj (the-as language-enum (file-stream-read-int file)))) - (("text-language") (set! (-> obj text-language) (the-as pc-subtitle-lang (file-stream-read-int file)))) (("subtitle-speaker") (set! (-> obj subtitle-speaker?) (file-stream-read-symbol file))) (("ignore-controller-win-unfocused?") (set-ignore-controller-in-bg! obj (file-stream-read-symbol file))) @@ -834,7 +833,6 @@ (format file " (music-fadeout? ~A)~%" (-> obj music-fadeout?)) (format file " (hinttitles? ~A)~%" (-> obj hinttitles?)) (format file " (game-language ~D)~%" (get-game-language obj)) - (format file " (text-language ~D)~%" (-> obj text-language)) (format file " (subtitle-speaker ~A)~%" (-> obj subtitle-speaker?)) #| diff --git a/goal_src/jak1/pc/pckernel-h.gc b/goal_src/jak1/pc/pckernel-h.gc index c6b9d8c7ed..d8e3888941 100644 --- a/goal_src/jak1/pc/pckernel-h.gc +++ b/goal_src/jak1/pc/pckernel-h.gc @@ -81,39 +81,6 @@ ) -;; subtitle languages. -(defenum pc-subtitle-lang - :type uint16 - (english 0) - (french 1) - (german 2) - (spanish 3) - (italian 4) - (japanese 5) - (uk-english 6) - - ;; additional languages. - ;; these don't neccessarily have to work but I'm future-proofing a bit here, just in case. - - ;; languages that use the existing glyphs - (portuguese 7) - (finnish 8) - (swedish 9) - (danish 10) - (norwegian 11) - (dutch 12) - (br-portuguese 13) - (hungarian 14) - (catalan 15) - (icelandic 16) - - ;; jak 1 has no glyphs for korean or cyrillic. - (korean 98) ;; future-proofing here - (russian 97) ;; same thing - - (custom 100) ;; temp - ) - ;; concept arts (defenum pc-jak1-concept-art @@ -275,7 +242,6 @@ (force-actors? symbol) ;; skips vis check for actor entity (use-vis? symbol) ;; if off, don't use vis trees. this MUST be off for custom (non-cropping) aspect ratios. (hinttitles? symbol) ;; if on, non-cutscene subtitles will show up - (text-language pc-subtitle-lang) ;; language for game text (subtitle-speaker? symbol) ;; #f (force off), #t (force on), auto (on for offscreen) (first-camera-h-inverted? symbol) ;; first-person horizontal camera inverted (first-camera-v-inverted? symbol) ;; first-person vertical camera inverted @@ -535,7 +501,6 @@ "Set the default misc settings" (set! (-> obj force-actors?) #f) - (set! (-> obj text-language) (the pc-subtitle-lang (scf-get-language))) (set! (-> obj hinttitles?) #t) (set! (-> obj subtitle-speaker?) 'auto) (reset-original-camera obj) diff --git a/goal_src/jak1/pc/pckernel-impl.gc b/goal_src/jak1/pc/pckernel-impl.gc index 8c38225365..e33ffec99d 100644 --- a/goal_src/jak1/pc/pckernel-impl.gc +++ b/goal_src/jak1/pc/pckernel-impl.gc @@ -19,12 +19,40 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; pc enum for languages. this is the game's languages + custom ones. +(defenum pc-language + :type uint16 + (english 0) + (french 1) + (german 2) + (spanish 3) + (italian 4) + (japanese 5) + (uk-english 6) + ;; custom + (portuguese 7) + (finnish 8) + (swedish 9) + (danish 10) + (norwegian 11) + (dutch 12) + (br-portuguese 13) + (hungarian 14) + (catalan 15) + (icelandic 16) + (korean 17) + (russian 18) + + (custom 999) ;; temp + ) + ;; The Jak 1 version of the pc-settings object. (deftype pc-settings-jak1 (pc-settings) ( (skip-movies? symbol) ;; if on, enable cutscene skipping (subtitles? symbol) ;; if on, cutscene subtitles will show up - (subtitle-language pc-subtitle-lang) ;; language for subtitles + (text-language pc-language) ;; language for game text + (subtitle-language pc-language) ;; language for subtitles (money-starburst? symbol) ;; add a starburst to the money (extra-hud? symbol) ;; extra hud elements. ) @@ -72,18 +100,18 @@ "Set the default misc settings" ((method-of-type pc-settings reset-misc) obj) - (set! (-> obj text-language) (the pc-subtitle-lang (scf-get-language))) - (set! (-> obj subtitle-language) (the pc-subtitle-lang (scf-get-language))) + (set! (-> obj text-language) (the pc-language (scf-get-language))) + (set! (-> obj subtitle-language) (the pc-language (scf-get-language))) (set! (-> obj skip-movies?) #t) (set! (-> obj subtitles?) *debug-segment*) (cond - ((and (= *jak1-territory* GAME_TERRITORY_SCEE) (= (-> obj text-language) (pc-subtitle-lang english))) - (set! (-> obj text-language) (pc-subtitle-lang uk-english)) - ;(set! (-> obj subtitle-language) (pc-subtitle-lang uk-english)) + ((and (= *jak1-territory* GAME_TERRITORY_SCEE) (= (-> obj text-language) (pc-language english))) + (set! (-> obj text-language) (pc-language uk-english)) + ;(set! (-> obj subtitle-language) (pc-language uk-english)) ) ((= *jak1-territory* GAME_TERRITORY_SCEI) - (set! (-> obj text-language) (pc-subtitle-lang japanese)) - ;(set! (-> obj subtitle-language) (pc-subtitle-lang japanese)) + (set! (-> obj text-language) (pc-language japanese)) + ;(set! (-> obj subtitle-language) (pc-language japanese)) ) (else )) diff --git a/goal_src/jak1/pc/pckernel.gc b/goal_src/jak1/pc/pckernel.gc index 35be298399..e30f47c7ef 100644 --- a/goal_src/jak1/pc/pckernel.gc +++ b/goal_src/jak1/pc/pckernel.gc @@ -337,7 +337,8 @@ (("extra-hud?") (set! (-> obj extra-hud?) (file-stream-read-symbol file))) (("skip-movies?") (set! (-> obj skip-movies?) (file-stream-read-symbol file))) (("subtitles?") (set! (-> obj subtitles?) (file-stream-read-symbol file))) - (("subtitle-language") (set! (-> obj subtitle-language) (the-as pc-subtitle-lang (file-stream-read-int file)))) + (("subtitle-language") (set! (-> obj subtitle-language) (the-as pc-language (file-stream-read-int file)))) + (("text-language") (set! (-> obj text-language) (the-as pc-language (file-stream-read-int file)))) ) 0) @@ -350,6 +351,7 @@ (format file " (skip-movies? ~A)~%" (-> obj skip-movies?)) (format file " (subtitles? ~A)~%" (-> obj subtitles?)) (format file " (subtitle-language ~D)~%" (-> obj subtitle-language)) + (format file " (text-language ~D)~%" (-> obj text-language)) 0) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/goal_src/jak1/pc/progress-pc.gc b/goal_src/jak1/pc/progress-pc.gc index b6023a9445..151b8767cb 100644 --- a/goal_src/jak1/pc/progress-pc.gc +++ b/goal_src/jak1/pc/progress-pc.gc @@ -69,7 +69,7 @@ (deftype progress-carousell-state (structure) ((int-backup int) (symbol-backup symbol) - (subtitle-backup pc-subtitle-lang) + (subtitle-backup pc-language) (aspect-native-choice symbol) (current-carousell (array text-id)) @@ -506,7 +506,7 @@ (defmacro def-language-remap-info (name langs) - `(define ,name (quote ,(apply (lambda (x) `((the binteger (text-id ,x)) (the binteger (pc-subtitle-lang ,x)))) langs))) + `(define ,name (quote ,(apply (lambda (x) `((the binteger (text-id ,x)) (the binteger (pc-language ,x)))) langs))) ) (def-language-remap-info *language-remap-info-pc* @@ -756,10 +756,10 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun get-language-name ((lang pc-subtitle-lang)) +(defun get-language-name ((lang pc-language)) "get the text-id from a lang" (dolist (item *language-remap-info-pc*) - (when (= lang (the pc-subtitle-lang (/ (the int (cadr (car item))) 8))) + (when (= lang (the pc-language (/ (the int (cadr (car item))) 8))) (return (the text-id (/ (the int (car (car item))) 8)))) ) (text-id zero) @@ -1862,12 +1862,12 @@ ) (((game-option-type language-subtitles)) (let ((lang (assoc (the binteger (-> *subtitle-languages* (-> *progress-carousell* int-backup))) *language-remap-info-pc*))) - (set! (-> *pc-settings* subtitle-language) (the pc-subtitle-lang (/ (the int (cadr lang)) 8))) + (set! (-> *pc-settings* subtitle-language) (the pc-language (/ (the int (cadr lang)) 8))) ) ) (((game-option-type language-text)) (let ((lang (assoc (the binteger (-> *text-languages* (-> *progress-carousell* int-backup))) *language-remap-info-pc*))) - (set! (-> *pc-settings* text-language) (the pc-subtitle-lang (/ (the int (cadr lang)) 8))) + (set! (-> *pc-settings* text-language) (the pc-language (/ (the int (cadr lang)) 8))) ) (if (not (-> *progress-carousell* transition)) (load-level-text-files (-> obj display-level-index))) diff --git a/goal_src/jak1/pc/subtitle.gc b/goal_src/jak1/pc/subtitle.gc index 9468fdb09c..13f5fa2052 100644 --- a/goal_src/jak1/pc/subtitle.gc +++ b/goal_src/jak1/pc/subtitle.gc @@ -89,7 +89,7 @@ ;; the global subtitle text info bank (deftype subtitle-text-info (basic) ((length int32) - (lang pc-subtitle-lang) + (lang pc-language) (dummy int32) (data subtitle-text :inline :dynamic) ) @@ -296,7 +296,7 @@ `(begin (asm-text-file subtitle :files ("game/assets/game_subtitle.gp")) (if *subtitle-text* - (+! (-> *subtitle-text* lang) (the-as pc-subtitle-lang 1))) + (+! (-> *subtitle-text* lang) 1)) (load-level-subtitle-files 0))) (defmacro reload-text () @@ -316,7 +316,7 @@ -(defun-recursive print-game-subtitle float ((str string) (font-ctxt font-context) (opaque symbol) (alpha int) (line-height int)) +(defun-recursive print-game-subtitle float ((str string) (font-ctxt font-context) (no-draw symbol) (alpha int) (line-height int)) "Print text. Not worth commenting until we get stack variables in lets, I think" (local-vars (sv-112 float) @@ -469,7 +469,7 @@ (if (nonzero? (-> *game-text-line* data 0)) (set! sv-168 (+ sv-168 1)) ) - (when (not opaque) + (when (not no-draw) (let* ((s1-1 (-> *display* frames (-> *display* on-screen) frame global-buf)) (s2-1 (-> s1-1 base)) ) @@ -693,19 +693,20 @@ (((pc-subtitle-channel hint) (pc-subtitle-channel hint-named)) ;; hint! find it. or else. (set! (-> self hint-subtitle?) #t) - (awhen (if (= (-> self cur-channel) (pc-subtitle-channel hint-named)) - (get-scene-by-name *subtitle-text* (-> self cur-channel) (-> self spool-name)) - (get-scene-by-text-id *subtitle-text* (-> self cur-channel) (-> self text-id)) - ) - (let ((pos (subtitle-str-adjust (current-str-pos (-> *hint-semaphore* 0 sound-id))))) - ;; find closest keyframe - (dotimes (i (-> it length)) - (when (>= pos (-> it keyframes i frame)) - (set! keyframe (-> it keyframes i))) - ) - ) - ) + (let ((scene (get-scene-by-text-id *subtitle-text* (pc-subtitle-channel hint) (-> self text-id)))) + (if (not scene) + (set! scene (get-scene-by-name *subtitle-text* (pc-subtitle-channel hint-named) (-> self spool-name)))) + + (when scene + (let ((pos (subtitle-str-adjust (current-str-pos (-> *hint-semaphore* 0 sound-id))))) + ;; find closest keyframe + (dotimes (i (-> scene length)) + (when (>= pos (-> scene keyframes i frame)) + (set! keyframe (-> scene keyframes i))) + ) + ) + )) ) )) diff --git a/goal_src/jak2/dgos/engine.gd b/goal_src/jak2/dgos/engine.gd deleted file mode 100644 index e4f2ebe108..0000000000 --- a/goal_src/jak2/dgos/engine.gd +++ /dev/null @@ -1,384 +0,0 @@ -("ENGINE.CGO" - ("types-h.o" - "vu1-macros.o" - "math.o" - "vector-h.o" - "gravity-h.o" - "bounding-box-h.o" - "matrix-h.o" - "quaternion-h.o" - "euler-h.o" - "transform-h.o" - "geometry-h.o" - "trigonometry-h.o" - "transformq-h.o" - "bounding-box.o" - "matrix.o" - "transform.o" - "quaternion.o" - "euler.o" - "trigonometry.o" - "gsound-h.o" - "timer-h.o" - "vif-h.o" - "dma-h.o" - "video-h.o" - "vu1-user-h.o" - "profile-h.o" - "dma.o" - "dma-buffer.o" - "dma-bucket.o" - "dma-disasm.o" - "pckernel-h.o" ;; added - "pckernel-impl.o" ;; added - "pc-debug-common.o" ;; added - "pad.o" - "gs.o" - "display-h.o" - "geometry.o" - "timer.o" - "vector.o" - "file-io.o" - "loader-h.o" - "texture-h.o" - "texture-anim-h.o" - "lights-h.o" - "mood-h.o" - "level-h.o" - "capture-h.o" - "math-camera-h.o" - "math-camera.o" - "font-h.o" - "decomp-h.o" - "profile.o" - "display.o" - "connect.o" - "text-id-h.o" - "text-h.o" - "camera-defs-h.o" - "trail-h.o" - "minimap-h.o" - "bigmap-h.o" - "settings-h.o" - "capture.o" - "memory-usage-h.o" - "blit-displays-h.o" - "texture.o" - "main-h.o" - "mspace-h.o" - "drawable-h.o" - "drawable-group-h.o" - "drawable-inline-array-h.o" - "draw-node-h.o" - "drawable-tree-h.o" - "drawable-actor-h.o" - "region-h.o" - "traffic-h.o" - "game-task-h.o" - "task-control-h.o" - "generic-h.o" - "sky-h.o" - "ocean-h.o" - "ocean-trans-tables.o" - "ocean-tables.o" - "ocean-frames.o" - "time-of-day-h.o" - "art-h.o" - "generic-vu1-h.o" - "merc-h.o" - "generic-merc-h.o" - "generic-tie-h.o" - "generic-work-h.o" - "shadow-cpu-h.o" - "shadow-vu1-h.o" - "memcard-h.o" - "game-info-h.o" - "gui-h.o" - "ambient-h.o" - "speech-h.o" - "wind-h.o" - "prototype-h.o" - "joint-h.o" - "bones-h.o" - "foreground-h.o" - "engines.o" - "lightning-h.o" - "res-h.o" - "res.o" - "lights.o" - "dynamics-h.o" - "surface-h.o" - "pat-h.o" - "fact-h.o" - "aligner-h.o" - "penetrate-h.o" - "game-h.o" - "script-h.o" - "scene-h.o" - "sync-info-h.o" - "pov-camera-h.o" - "smush-control-h.o" - "debug-h.o" - "joint-mod-h.o" - "collide-func-h.o" - "collide-mesh-h.o" - "collide-shape-h.o" - "generic-obs-h.o" - "trajectory-h.o" - "collide-target-h.o" - "collide-touch-h.o" - "collide-edge-grab-h.o" - "process-drawable-h.o" - "process-focusable.o" - "process-taskable-h.o" - "focus.o" - "effect-control-h.o" - "collide-frag-h.o" - "collide-hash-h.o" - "chain-physics-h.o" - "projectile-h.o" - "find-nearest-h.o" - "target-h.o" - "stats-h.o" - "bsp-h.o" - "collide-cache-h.o" - "collide-h.o" - "shrubbery-h.o" - "tie-h.o" - "tfrag-h.o" - "background-h.o" - "subdivide-h.o" - "entity-h.o" - "sprite-h.o" - "simple-sprite-h.o" - "eye-h.o" - "sparticle-launcher-h.o" - "sparticle-h.o" - "actor-link-h.o" - "camera-h.o" - "cam-debug-h.o" - "cam-interface-h.o" - "cam-update-h.o" - "hud-h.o" - "progress-h.o" - "rpc-h.o" - "path-h.o" - "nav-mesh-h.o" - "nav-control-h.o" - "spatial-hash-h.o" - "actor-hash-h.o" - "load-dgo.o" - "ramdisk.o" - "gsound.o" - "transformq.o" - "collide-func.o" - "joint.o" - "joint-mod.o" - "chain-physics.o" - "cylinder.o" - "wind-work.o" - "wind.o" - "bsp.o" - "subdivide.o" - "sprite.o" - "sprite-distort.o" - "sprite-glow.o" - "debug-sphere.o" - "debug.o" - "history.o" - "merc-vu1.o" - "emerc-vu1.o" - "merc-blend-shape.o" - "merc.o" - "emerc.o" - "ripple.o" - "bones.o" - "debug-foreground.o" - "foreground.o" - "generic-vu0.o" - "generic-vu1.o" - "generic-effect.o" - "generic-merc.o" - "generic-tie.o" - "shadow-cpu.o" - "shadow-vu1.o" - "warp.o" - "texture-anim.o" - "texture-anim-funcs.o" - "texture-anim-tables.o" - "blit-displays.o" - "font-data.o" - "font.o" - "decomp.o" - "background.o" - "draw-node.o" - "shrubbery.o" - "shrub-work.o" - "tfrag-near.o" - "tfrag.o" - "tfrag-methods.o" - "tfrag-work.o" - "tie.o" - "etie-vu1.o" - "etie-near-vu1.o" - "tie-near.o" - "tie-work.o" - "tie-methods.o" - "sync-info.o" - "trajectory.o" - "sparticle-launcher.o" - "sparticle.o" - "entity-table.o" - "loader.o" - "game-info.o" - "game-task.o" - "game-save.o" - "settings.o" - "autosplit-h.o" ;; added - "autosplit.o" ;; added - "speedruns-h.o" ;; added - "speedruns.o" ;; added - "mood-tables.o" - "mood-tables2.o" - "mood.o" - "mood-funcs.o" - "mood-funcs2.o" - "weather-part.o" - "time-of-day.o" - "sky-data.o" - "sky-tng.o" - "load-state.o" - "pc-debug-methods.o" ;; added - "level-info.o" - "level.o" - "text.o" - "collide-hash.o" - "collide-probe.o" - "collide-frag.o" - "collide-mesh.o" - "collide-touch.o" - "collide-edge-grab.o" - "collide-shape.o" - "collide-shape-rider.o" - "collide.o" - ;; "collide-planes.o" - "spatial-hash.o" - "actor-hash.o" - "merc-death.o" - "water-flow.o" - "water-h.o" - "camera.o" - "cam-interface.o" - "cam-master.o" - "cam-states.o" - "cam-states-dbg.o" - "cam-combiner.o" - "cam-update.o" - "vol-h.o" - "cam-layout.o" - "cam-debug.o" - "cam-start.o" - "process-drawable.o" - "ambient.o" - "speech.o" - "region.o" - "fma-sphere.o" - "script.o" - "generic-obs.o" - "lightning.o" - "carry-h.o" - "pilot-h.o" - "gun-h.o" - "board-h.o" - "darkjak-h.o" - "target-util.o" - "target-part.o" - "gun-part.o" - "collide-reaction-target.o" - "logic-target.o" - "sidekick.o" - "effect-control.o" - "voicebox.o" - "collectables-part.o" - "debug-part.o" - "find-nearest.o" - "task-arrow.o" - "projectile.o" - "target-handler.o" - "target-anim.o" - "target.o" - "target2.o" - "target-swim.o" - "target-carry.o" - "target-darkjak.o" - "target-death.o" - "target-gun.o" - "gun-util.o" - "gun-blue-shot.o" - "gun-yellow-shot.o" - "gun-red-shot.o" - "gun-dark-shot.o" - "gun-states.o" - "board-util.o" - "target-board.o" - "board-part.o" - "board-states.o" - "mech-h.o" - "menu.o" - "drawable.o" - "drawable-group.o" - "drawable-inline-array.o" - "drawable-tree.o" - "prototype.o" - "main-collide.o" - "video.o" - "pckernel-common.o" ;; added - "pckernel.o" ;; added - "main.o" - "collide-cache.o" - "collide-debug.o" - "relocate.o" - "memory-usage.o" - "entity.o" - "path.o" - "vol.o" - "nav-mesh.o" - "nav-control.o" - "aligner.o" - "water.o" - "collectables.o" - "task-control.o" - "scene.o" - "pov-camera.o" - "powerups.o" - "crates.o" - "hud.o" - "hud-classes.o" - "progress-static.o" - "progress.o" - "progress-draw.o" - "ocean.o" - "ocean-vu0.o" - "ocean-texture.o" - "ocean-mid.o" - "ocean-transition.o" - "ocean-near.o" - "minimap.o" - "bigmap-data.o" - "bigmap.o" - "eye.o" - "glist-h.o" - "glist.o" - "anim-tester.o" - "viewer.o" - "part-tester.o" - "editable-h.o" - "editable.o" - "editable-player.o" - "mysql-nav-graph.o" - "nav-graph-editor.o" - "sampler.o" - "default-menu.o" - "anim-tester-x.o" ;; added - "default-menu-pc.o" ;; added - )) diff --git a/goal_src/jak2/dgos/game.gd b/goal_src/jak2/dgos/game.gd index c2f7ba2163..0b6c718d40 100644 --- a/goal_src/jak2/dgos/game.gd +++ b/goal_src/jak2/dgos/game.gd @@ -334,6 +334,8 @@ "video.o" "pckernel-common.o" ;; added "pckernel.o" ;; added + "subtitle2-h.o" ;; added + "subtitle2.o" ;; added "main.o" "collide-cache.o" "collide-debug.o" @@ -380,6 +382,7 @@ "sampler.o" "default-menu.o" "anim-tester-x.o" ;; added + "vag-player.o" ;; added "default-menu-pc.o" ;; added "dir-tpages.go" "tpage-11.go" diff --git a/goal_src/jak2/engine/ai/enemy-h.gc b/goal_src/jak2/engine/ai/enemy-h.gc index e835a7c00e..2eaad0b328 100644 --- a/goal_src/jak2/engine/ai/enemy-h.gc +++ b/goal_src/jak2/engine/ai/enemy-h.gc @@ -54,7 +54,7 @@ (enemy-flag36 36) (enemy-flag37 37) (enemy-flag38 38) - (enemy-flag39 39) + (not-frustrated 39) (enemy-flag40 40) (enemy-flag41 41) (enemy-flag42 42) diff --git a/goal_src/jak2/engine/ambient/ambient.gc b/goal_src/jak2/engine/ambient/ambient.gc index 25bc1ad0d9..d5c5ebb9b6 100644 --- a/goal_src/jak2/engine/ambient/ambient.gc +++ b/goal_src/jak2/engine/ambient/ambient.gc @@ -175,9 +175,11 @@ ) (play-communicator-speech! arg0) ) - (set! s2-0 (lookup-gui-connection-id *gui-control* (-> arg0 name) (-> arg0 channel) (gui-action none))) + (set! s2-0 + (the-as int (lookup-gui-connection-id *gui-control* (-> arg0 name) (-> arg0 channel) (gui-action none))) + ) (set! s2-0 (cond - ((zero? s2-0) + ((zero? (the-as sound-id s2-0)) (let ((v1-17 (process-spawn talker :init talker-init arg0 arg2 arg3 :to arg1))) (cond (v1-17 diff --git a/goal_src/jak2/engine/anim/joint-exploder.gc b/goal_src/jak2/engine/anim/joint-exploder.gc index ad652b0d1f..dd722799dd 100644 --- a/goal_src/jak2/engine/anim/joint-exploder.gc +++ b/goal_src/jak2/engine/anim/joint-exploder.gc @@ -734,7 +734,7 @@ (quaternion-copy! (-> self root quat) (-> (the-as process-drawable (-> self parent 0)) root quat)) (set! (-> self root scale quad) (-> (the-as process-drawable (-> self parent 0)) root scale quad)) (when (-> arg3 art-level) - (let ((a1-6 (entity-actor-from-level-name (the-as level (-> arg3 art-level))))) + (let ((a1-6 (entity-actor-from-level-name (-> arg3 art-level)))) (if a1-6 (process-entity-set! self a1-6) ) diff --git a/goal_src/jak2/engine/anim/joint-mod-h.gc b/goal_src/jak2/engine/anim/joint-mod-h.gc index 9891630beb..eab1d6c21a 100644 --- a/goal_src/jak2/engine/anim/joint-mod-h.gc +++ b/goal_src/jak2/engine/anim/joint-mod-h.gc @@ -643,6 +643,6 @@ (defmacro target-look-at-me! (&key trans &key (message 'nothing-special)) "make target look at a trans in self. PC PORT NOTE : added check to see if lods have been set" - `(if (and (logtest? (-> self draw status) (draw-control-status lod-set)) *target*) + `(if (and (not (logtest? (-> self draw status) (draw-control-status uninited no-draw-temp))) *target*) (look-at! (-> *target* neck) ,trans ,message self))) diff --git a/goal_src/jak2/engine/debug/default-menu.gc b/goal_src/jak2/engine/debug/default-menu.gc index d93e6b0eb3..21d0a3a9a9 100644 --- a/goal_src/jak2/engine/debug/default-menu.gc +++ b/goal_src/jak2/engine/debug/default-menu.gc @@ -2695,7 +2695,7 @@ (a0-5 arg1) ) (when (if (= a0-5 'test) - (logtest? (continue-flags cf17) (-> (the-as continue-point v1-2) flags)) + (logtest? (continue-flags test) (-> (the-as continue-point v1-2) flags)) #t ) (let ((s2-0 (method-of-type pair new)) diff --git a/goal_src/jak2/engine/debug/menu.gc b/goal_src/jak2/engine/debug/menu.gc index 5f87e5ba60..522d2d6290 100644 --- a/goal_src/jak2/engine/debug/menu.gc +++ b/goal_src/jak2/engine/debug/menu.gc @@ -471,7 +471,7 @@ (debug-menu-context-send-msg gp-0 (debug-menu-msg deactivate) (debug-menu-dest activation)) ) (set! (-> arg1 parent) arg0) - (set! (-> arg0 items) (the-as pair (append! (-> arg0 items) (cons arg1 '())))) + (set! (-> arg0 items) (the-as pair (append! (-> arg0 items) (dcons arg1 '())))) ;; changed to dcons (debug-menu-rebuild arg0) (if s4-0 (debug-menu-context-send-msg gp-0 (debug-menu-msg activate) (debug-menu-dest activation)) diff --git a/goal_src/jak2/engine/debug/viewer.gc b/goal_src/jak2/engine/debug/viewer.gc index 9166d18b79..240f221b7e 100644 --- a/goal_src/jak2/engine/debug/viewer.gc +++ b/goal_src/jak2/engine/debug/viewer.gc @@ -270,6 +270,6 @@ This commonly includes things such as: ;; WARN: Return type mismatch symbol vs object. (defun birth-viewer ((arg0 process) (arg1 entity-actor)) (set! (-> arg0 type) viewer) - (init-entity arg0 arg1 (the-as process viewer)) + (init-entity arg0 arg1 viewer) (the-as object #t) ) diff --git a/goal_src/jak2/engine/draw/drawable.gc b/goal_src/jak2/engine/draw/drawable.gc index d31c9d9075..95558b2492 100644 --- a/goal_src/jak2/engine/draw/drawable.gc +++ b/goal_src/jak2/engine/draw/drawable.gc @@ -1348,7 +1348,7 @@ (none) ) -(defun main-debug-hook () +(defun-debug main-debug-hook () "Execute the debug engine, collision renderer, and draw-instance-info." (when (not (or (= *master-mode* 'menu) (= *master-mode* 'progress))) (let ((a0-3 *col-rend*)) diff --git a/goal_src/jak2/engine/engine/connect.gc b/goal_src/jak2/engine/engine/connect.gc index fbf98e214b..dc78376ed8 100644 --- a/goal_src/jak2/engine/engine/connect.gc +++ b/goal_src/jak2/engine/engine/connect.gc @@ -314,6 +314,7 @@ A "connection" is really just a function that gets called when the engine runs, (defmethod apply-to-connections-reverse engine ((obj engine) (arg0 (function connectable none))) "Apply f to all connections, reverse order. Do not use f to remove yourself from the list." + (declare (inline)) (let ((s4-0 (-> obj alive-list-end prev0))) (while (!= s4-0 (-> obj alive-list)) (arg0 s4-0) diff --git a/goal_src/jak2/engine/entity/entity.gc b/goal_src/jak2/engine/entity/entity.gc index d2b7f886b2..403aa495aa 100644 --- a/goal_src/jak2/engine/entity/entity.gc +++ b/goal_src/jak2/engine/entity/entity.gc @@ -216,7 +216,7 @@ ) ;; WARN: Return type mismatch entity vs entity-actor. -(defun entity-actor-from-level-name ((arg0 level)) +(defun entity-actor-from-level-name ((arg0 symbol)) (let ((v0-0 (the-as entity #f))) (dotimes (s5-0 (-> *level* length)) (let ((s4-0 (-> *level* level s5-0))) @@ -1579,7 +1579,7 @@ ) ;; WARN: Return type mismatch process vs none. -(defun init-entity ((arg0 process) (arg1 entity-actor) (arg2 process)) +(defun init-entity ((arg0 process) (arg1 entity-actor) (arg2 type)) (activate arg0 *entity-pool* (res-lump-struct arg1 'name basic) (the-as pointer #x70004000)) (set! (-> arg0 entity) arg1) (set! (-> arg0 level) (-> arg1 extra level)) @@ -1605,7 +1605,7 @@ (set! (-> s4-0 type) s5-0) (and s5-0 (valid? s5-0 type (the-as string #f) #f 0) (valid? (method-of-object s4-0 init-from-entity!) function (the-as string #f) #f 0)) ) - (init-entity s4-0 obj (the-as process s5-0)) + (init-entity s4-0 obj s5-0) ) (else (when (not (birth-viewer s4-0 obj)) @@ -2229,9 +2229,15 @@ (dotimes (s1-1 s2-3) (set! sv-48 (-> s3-4 data s1-1)) (cond - ((and (#if PC_PORT (or (with-pc (and (-> *pc-settings* force-actors?) (not (let ((name (res-lump-struct (-> sv-48 entity) 'name string))) - (or (string= name "fort-entry-gate-11") - (string= name "com-airlock-outer-13")))))) + ((and (#if PC_PORT (or (with-pc (and (-> *pc-settings* force-actors?) + ;; ban specific entities + (not (let ((name (res-lump-struct (-> sv-48 entity) 'name string))) + (or (string= name "fort-entry-gate-11") + (string= name "com-airlock-outer-13") + (string= name "com-airlock-inner-41") + (string= name "under-lift-4") + (string= name "under-locking-1") + (string= name "under-locking-2")))))) (is-object-visible? s4-1 (-> sv-48 vis-id))) (is-object-visible? s4-1 (-> sv-48 vis-id))) (not (logtest? (-> sv-48 perm status) (entity-perm-status bit-9 bit-10))) diff --git a/goal_src/jak2/engine/game/game-info-h.gc b/goal_src/jak2/engine/game/game-info-h.gc index 37f8023382..bffa5de034 100644 --- a/goal_src/jak2/engine/game/game-info-h.gc +++ b/goal_src/jak2/engine/game/game-info-h.gc @@ -12,37 +12,29 @@ (defenum continue-flags :type uint32 :bitfield #t - (cf0 0) - (cf1 1) - (cf2 2) - (cf3 3) - (cf4 4) - (cf5 5) - (cf6 6) - (cf7 7) - (cf8 8) - (cf9 9) - (cf10 10) - (cf11 11) - (cf12 12) - (cf13 13) - (cf14 14) - (cf15 15) - (cf16 16) - (cf17 17) - (cf18 18) - (cf19 19) - (cf20 20) - (cf21 21) - (cf22 22) - (cf23 23) - (cf24 24) - (cf25 25) - (cf26 26) - (cf27 27) - (cf28 28) - (cf29 29) - (cf30 30) + ;(continue-flag-0 0) + (scene-wait 1) + (change-continue 2) + (no-auto 3) + (no-blackout 4) + (game-start 5) + (demo-end 6) + (warp-gate 7) + (demo 8) + (intro 9) + (hero-mode 10) + (demo-movie 11) + (title 12) + (title-movie 13) + (continue-flag-14 14) + (continue-flag-15 15) + (continue-flag-16 16) + (test 17) + (record-path 18) + (pilot 19) + (pilot-dax 20) + (record-sig 21) + (indax 22) ) ;; +++game-secrets diff --git a/goal_src/jak2/engine/game/game-info.gc b/goal_src/jak2/engine/game/game-info.gc index ee931993b7..d56928d5b5 100644 --- a/goal_src/jak2/engine/game/game-info.gc +++ b/goal_src/jak2/engine/game/game-info.gc @@ -79,7 +79,7 @@ (new 'static 'continue-point :name "default" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :w 1.0) @@ -227,7 +227,7 @@ ) ) ) - (if (and (logtest? (-> obj current-continue flags) (continue-flags cf2)) + (if (and (logtest? (-> obj current-continue flags) (continue-flags change-continue)) (and (!= (-> obj current-continue) *default-continue*) (not arg1)) ) (set! (-> obj current-continue) s5-0) @@ -1373,7 +1373,7 @@ (let ((conts (-> (the-as level-load-info (-> (the-as symbol (car levels)) value)) continues))) (while (not (null? conts)) (let ((cont (the-as continue-point (car conts)))) - (if (not (logtest? (-> cont flags) (continue-flags cf2))) + (if (not (logtest? (-> cont flags) (continue-flags change-continue))) (format #t "~S~%" (-> cont name)) ) ) diff --git a/goal_src/jak2/engine/gfx/font-h.gc b/goal_src/jak2/engine/gfx/font-h.gc index b225afaad4..ba49b415ab 100644 --- a/goal_src/jak2/engine/gfx/font-h.gc +++ b/goal_src/jak2/engine/gfx/font-h.gc @@ -722,8 +722,8 @@ (set! (-> *font-work* color-table color color (* vert 2) r) (-> rgba-red r)) (set! (-> *font-work* color-table color color (* vert 2) g) (-> rgba-green r)) (set! (-> *font-work* color-table color color (* vert 2) b) (-> rgba-blue r)) - ;; missing? - ;; (set! (-> *font-work* color-table color (1+ (* vert 2)) r) (-> rgba-red r)) + ;; NOTE : this line was missing in the original code + (set! (-> *font-work* color-table color color (1+ (* vert 2)) r) (-> rgba-red r)) (set! (-> *font-work* color-table color color (1+ (* vert 2)) g) (-> rgba-green r)) (set! (-> *font-work* color-table color color (1+ (* vert 2)) b) (-> rgba-blue r)) 0 diff --git a/goal_src/jak2/engine/level/level-info.gc b/goal_src/jak2/engine/level/level-info.gc index 54c7687c0e..9250dd515a 100644 --- a/goal_src/jak2/engine/level/level-info.gc +++ b/goal_src/jak2/engine/level/level-info.gc @@ -159,7 +159,7 @@ :continues '((new 'static 'continue-point :name "demo-start" :level 'demo - :flags (continue-flags cf8) + :flags (continue-flags demo) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -183,7 +183,7 @@ (new 'static 'continue-point :name "demo-restart" :level 'demo - :flags (continue-flags cf8) + :flags (continue-flags demo) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -230,7 +230,7 @@ (new 'static 'continue-point :name "demo-movie-end" :level 'demo - :flags (continue-flags cf11) + :flags (continue-flags demo-movie) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -254,7 +254,7 @@ (new 'static 'continue-point :name "lkiddoge-skip0" :level 'demo - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4468809.5 :y 32759.809 :z 775372.4 :w 1.0) :quat (new 'static 'vector :y -0.8818 :w -0.4715) :camera-trans (new 'static 'vector :x 4418151.0 :y 53856.258 :z 783193.3 :w 1.0) @@ -332,7 +332,7 @@ :continues '((new 'static 'continue-point :name "title-start" :level 'title - :flags (continue-flags cf12) + :flags (continue-flags title) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -356,7 +356,7 @@ (new 'static 'continue-point :name "title-restart" :level 'title - :flags (continue-flags cf12) + :flags (continue-flags title) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -380,7 +380,7 @@ (new 'static 'continue-point :name "title-movie" :level 'title - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 4349280.0 :y 54451.406 :z 960109.4 :w 1.0) @@ -404,7 +404,7 @@ (new 'static 'continue-point :name "title-movie-end" :level 'title - :flags (continue-flags cf2 cf13) + :flags (continue-flags change-continue title-movie) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -506,7 +506,7 @@ (new 'static 'continue-point :name "vinroom-face-warp" :level 'vinroom - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4589356.0 :y 104436.53 :z 4648794.0 :w 1.0) :quat (new 'static 'vector :y -0.0314 :w -0.9995) :camera-trans (new 'static 'vector :x 4588769.0 :y 125421.16 :z 4597935.5 :w 1.0) @@ -530,7 +530,7 @@ (new 'static 'continue-point :name "vinroom-face-door" :level 'vinroom - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4539276.5 :y 104448.0 :z 4540455.0 :w 1.0) :quat (new 'static 'vector :y 0.9082 :w -0.4184) :camera-trans (new 'static 'vector :x 4575779.0 :y 125541.99 :z 4576384.0 :w 1.0) @@ -554,7 +554,7 @@ (new 'static 'continue-point :name "vinroom-movie" :level 'vinroom - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4544927.5 :y 104448.0 :z 4547219.5 :w 1.0) :quat (new 'static 'vector :y 0.5579 :w 0.8298) :camera-trans (new 'static 'vector :x 4518831.0 :y 122459.75 :z 4524515.5 :w 1.0) @@ -578,7 +578,7 @@ (new 'static 'continue-point :name "vinroom-warp" :level 'vinroom - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x 4587913.0 :y 104439.805 :z 4673306.0 :w 1.0) :quat (new 'static 'vector :y -0.9985 :w 0.0533) :camera-trans (new 'static 'vector :x 4586831.5 :y 123462.86 :z 4636004.5 :w 1.0) @@ -602,7 +602,7 @@ (new 'static 'continue-point :name "vinroom-demo" :level 'vinroom - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4590761.0 :y 104436.53 :z 4592729.0 :w 1.0) :quat (new 'static 'vector :y -0.8565 :w 0.516) :camera-trans (new 'static 'vector :x 4562904.0 :y 121919.08 :z 4567433.5 :w 1.0) @@ -626,7 +626,7 @@ (new 'static 'continue-point :name "vinroom-demo-end" :level 'vinroom - :flags (continue-flags cf2 cf6) + :flags (continue-flags change-continue demo-end) :trans (new 'static 'vector :x 4590761.0 :y 104436.53 :z 4592729.0 :w 1.0) :quat (new 'static 'vector :y -0.8565 :w 0.516) :camera-trans (new 'static 'vector :x 4562904.0 :y 121919.08 :z 4567433.5 :w 1.0) @@ -706,7 +706,7 @@ :continues '((new 'static 'continue-point :name "drill1-warp" :level 'drillmid - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x -350734.34 :y 32768.0 :z 885082.1 :w 1.0) :quat (new 'static 'vector :y -0.6878 :w 0.7258) :camera-trans (new 'static 'vector :x -391860.62 :y 53180.008 :z 885485.2 :w 1.0) @@ -730,7 +730,7 @@ (new 'static 'continue-point :name "drill-warp-gunship" :level 'drillmid - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x 108875.77 :y 65527.81 :z 27369.473 :w 1.0) :quat (new 'static 'vector :y -0.7367 :w -0.6761) :camera-trans (new 'static 'vector :x 149320.5 :y 85877.15 :z 20893.287 :w 1.0) @@ -754,7 +754,7 @@ (new 'static 'continue-point :name "drillmid-checkpoint" :level 'drillmid - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 858380.7 :y 49152.0 :z -652619.75 :w 1.0) :quat (new 'static 'vector :y 0.9999 :w -0.0117) :camera-trans (new 'static 'vector :x 859736.06 :y 70317.67 :z -609632.25 :w 1.0) @@ -778,7 +778,7 @@ (new 'static 'continue-point :name "drillmid-checkpoint-b" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -700254.2 :y 49141.35 :z -849702.06 :w 1.0) :quat (new 'static 'vector :y 0.6248 :w -0.7807) :camera-trans (new 'static 'vector :x -663167.4 :y 70235.75 :z -871562.9 :w 1.0) @@ -802,7 +802,7 @@ (new 'static 'continue-point :name "drillmid-checkpoint-c" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -711355.6 :y 98293.35 :z -723961.06 :w 1.0) :quat (new 'static 'vector :y 0.9459 :w 0.3242) :camera-trans (new 'static 'vector :x -736509.1 :y 119387.34 :z -688592.9 :w 1.0) @@ -826,7 +826,7 @@ (new 'static 'continue-point :name "drillmid-ship-warp" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 675723.25 :y 98298.67 :z -740878.75 :w 1.0) :quat (new 'static 'vector :y -0.4186 :w -0.9081) :camera-trans (new 'static 'vector :x 646477.8 :y 119392.664 :z -772429.8 :w 1.0) @@ -850,7 +850,7 @@ (new 'static 'continue-point :name "drill3-warp" :level 'drillmid - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x -350734.34 :y 32768.0 :z 885082.1 :w 1.0) :quat (new 'static 'vector :y -0.6878 :w 0.7258) :camera-trans (new 'static 'vector :x -391860.62 :y 53180.008 :z 885485.2 :w 1.0) @@ -874,7 +874,7 @@ (new 'static 'continue-point :name "drill-escape" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 590609.2 :y -114696.6 :z -383934.47 :w 1.0) :quat (new 'static 'vector :y -0.1772 :w -0.9841) :camera-trans (new 'static 'vector :x 584495.94 :y -93804.95 :z -434038.78 :w 1.0) @@ -1116,7 +1116,7 @@ :continues '((new 'static 'continue-point :name "sewer-start" :level 'sewer - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 4626914.0 :y -207171.17 :z 2095240.8 :w 1.0) :quat (new 'static 'vector :x -0.0011 :y -0.7059 :z 0.0011 :w -0.7082) :camera-trans (new 'static 'vector :x 4575577.5 :y -186075.14 :z 2093692.5 :w 1.0) @@ -1140,7 +1140,7 @@ (new 'static 'continue-point :name "sewer-start-kiosk" :level 'sewer - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4609054.5 :y -207171.17 :z 2096862.0 :w 1.0) :quat (new 'static 'vector :x -0.001 :y -0.7399 :z 0.0009 :w -0.6726) :camera-trans (new 'static 'vector :x 4566007.5 :y -186076.78 :z 2096889.9 :w 1.0) @@ -1274,7 +1274,7 @@ :continues '((new 'static 'continue-point :name "sewesc-start" :level 'sewesc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 4510956.0 :y -199200.77 :z 2098181.0 :w 1.0) :quat (new 'static 'vector :y 0.6989 :w 0.7151) :camera-trans (new 'static 'vector :x 4481299.0 :y -183847.73 :z 2098697.8 :w 1.0) @@ -1298,7 +1298,7 @@ (new 'static 'continue-point :name "hal2-plant-first-bomb" :level 'sewesc - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4714868.5 :y -273857.75 :z 1846698.8 :w 1.0) :quat (new 'static 'vector :y -0.9872 :w 0.1593) :camera-trans (new 'static 'vector :x 4715987.0 :y -253211.44 :z 1895919.6 :w 1.0) @@ -1326,7 +1326,7 @@ (new 'static 'continue-point :name "hal2-go-elevator2" :level 'sewesc - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4890738.5 :y -236485.84 :z 1366747.1 :w 1.0) :quat (new 'static 'vector :y -0.0163 :w 0.9998) :camera-trans (new 'static 'vector :x 4882573.5 :y -215391.03 :z 1316146.0 :w 1.0) @@ -1358,7 +1358,7 @@ (new 'static 'continue-point :name "hal2-wall2" :level 'sewesc - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 5797019.0 :y -373470.8 :z 2002612.2 :w 1.0) :quat (new 'static 'vector :y -0.5003 :w 0.8658) :camera-trans (new 'static 'vector :x 5833251.0 :y -356394.6 :z 2001096.2 :w 1.0) @@ -1493,7 +1493,7 @@ :continues '((new 'static 'continue-point :name "tomb-start" :level 'tomba - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 788477.56 :y -131086.34 :z 4270196.5 :w 1.0) :quat (new 'static 'vector :y 0.1202 :w -0.9927) :camera-trans (new 'static 'vector :x 787632.1 :y -109991.94 :z 4227172.0 :w 1.0) @@ -1524,7 +1524,7 @@ (new 'static 'continue-point :name "tomb-water-switch" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 546954.06 :y -221173.77 :z 4443352.5 :w 1.0) :quat (new 'static 'vector :y 0.4261 :w 0.9046) :camera-trans (new 'static 'vector :x 517370.25 :y -201672.7 :z 4408801.0 :w 1.0) @@ -1548,7 +1548,7 @@ (new 'static 'continue-point :name "tomb-poles-switch" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1024811.8 :y -221145.1 :z 4446944.5 :w 1.0) :quat (new 'static 'vector :y -0.3799 :w 0.9249) :camera-trans (new 'static 'vector :x 1055031.8 :y -200876.03 :z 4409347.5 :w 1.0) @@ -1572,7 +1572,7 @@ (new 'static 'continue-point :name "tomb-poles-start" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1112014.0 :y -319493.3 :z 5235235.0 :w 1.0) :quat (new 'static 'vector :y 0.627 :w 0.7789) :camera-trans (new 'static 'vector :x 1069004.8 :y -298403.84 :z 5235391.5 :w 1.0) @@ -1596,7 +1596,7 @@ (new 'static 'continue-point :name "tomb-water-start" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 301066.25 :y -249855.6 :z 5230534.5 :w 1.0) :quat (new 'static 'vector :y 0.7382 :w -0.6745) :camera-trans (new 'static 'vector :x 343957.5 :y -228723.92 :z 5233923.5 :w 1.0) @@ -1697,7 +1697,7 @@ :continues '((new 'static 'continue-point :name "tomb-boulder-pre" :level 'tombb - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 1422869.2 :y -471039.6 :z 4741993.5 :w 1.0) :quat (new 'static 'vector :y 0.9394 :w -0.3426) :camera-trans (new 'static 'vector :x 1438060.1 :y -455063.16 :z 4770099.0 :w 1.0) @@ -1721,7 +1721,7 @@ (new 'static 'continue-point :name "tomb-boulder-end" :level 'tombb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1380638.8 :y -471055.56 :z 4636391.5 :w 1.0) :quat (new 'static 'vector :y -0.9989 :w -0.0447) :camera-trans (new 'static 'vector :x 1384123.6 :y -451303.44 :z 4682465.0 :w 1.0) @@ -1799,7 +1799,7 @@ :continues '((new 'static 'continue-point :name "tombc-midpoint" :level 'tombc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -40754.79 :y -225288.61 :z 5402507.0 :w 1.0) :quat (new 'static 'vector :y 0.9992 :w -0.0391) :camera-trans (new 'static 'vector :x -35458.664 :y -204193.8 :z 5445199.5 :w 1.0) @@ -1954,7 +1954,7 @@ :continues '((new 'static 'continue-point :name "tomb-boulder" :level 'tombe - :flags (continue-flags cf3 cf22) + :flags (continue-flags no-auto indax) :trans (new 'static 'vector :x 1434184.9 :y -471039.6 :z 4588284.5 :w 1.0) :quat (new 'static 'vector :y -0.7083 :w -0.7058) :camera-trans (new 'static 'vector :x 1475034.8 :y -450687.78 :z 4586864.0 :w 1.0) @@ -1978,7 +1978,7 @@ (new 'static 'continue-point :name "tomb-boulder-explode" :level 'tombe - :flags (continue-flags cf3 cf22) + :flags (continue-flags no-auto indax) :trans (new 'static 'vector :x 1884670.0 :y -511351.2 :z 4874090.5 :w 1.0) :quat (new 'static 'vector :y 0.1226 :w -0.9924) :camera-trans (new 'static 'vector :x 1884803.1 :y -503642.53 :z 4929176.0 :w 1.0) @@ -2002,7 +2002,7 @@ (new 'static 'continue-point :name "tomb-boulder-climb" :level 'tombe - :flags (continue-flags cf3 cf22) + :flags (continue-flags no-auto indax) :trans (new 'static 'vector :x 1628354.5 :y -593924.5 :z 5830940.0 :w 1.0) :quat (new 'static 'vector :y 0.5849 :w -0.811) :camera-trans (new 'static 'vector :x 1614351.1 :y -519260.56 :z 5832011.5 :w 1.0) @@ -2137,7 +2137,7 @@ :continues '((new 'static 'continue-point :name "tombboss-start" :level 'tombboss - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 788065.5 :y -294914.06 :z 5738845.5 :w 1.0) :quat (new 'static 'vector :y 0.1262 :w 0.9919) :camera-trans (new 'static 'vector :x 790481.3 :y -274841.2 :z 5698627.0 :w 1.0) @@ -2239,7 +2239,7 @@ :continues '((new 'static 'continue-point :name "under-start" :level 'under - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -107954.99 :y -266244.1 :z 7974990.0 :w 1.0) :quat (new 'static 'vector :y -0.8287 :w 0.5596) :camera-trans (new 'static 'vector :x -62684.773 :y -245149.28 :z 7998945.5 :w 1.0) @@ -2318,7 +2318,7 @@ :continues '((new 'static 'continue-point :name "under-airlock" :level 'underb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 247507.36 :y -265523.62 :z 7132200.0 :w 1.0) :quat (new 'static 'vector :y -0.8764 :w -0.4814) :camera-trans (new 'static 'vector :x 205734.7 :y -246507.11 :z 7122904.5 :w 1.0) @@ -2342,7 +2342,7 @@ (new 'static 'continue-point :name "cent1-path0-record-path" :level 'underb - :flags (continue-flags cf2 cf21) + :flags (continue-flags change-continue record-sig) :trans (new 'static 'vector :x -324353.22 :y -274439.78 :z 8362734.5 :w 1.0) :quat (new 'static 'vector :y 0.1254 :w -0.992) :camera-trans (new 'static 'vector :x -308162.56 :y -253848.78 :z 8316009.0 :w 1.0) @@ -2366,7 +2366,7 @@ (new 'static 'continue-point :name "cent2-path0-record-path" :level 'underb - :flags (continue-flags cf2 cf21) + :flags (continue-flags change-continue record-sig) :trans (new 'static 'vector :x -855634.3 :y -290815.6 :z 7995028.5 :w 1.0) :quat (new 'static 'vector :y 0.6088 :w 0.7933) :camera-trans (new 'static 'vector :x -899652.0 :y -269720.78 :z 7968866.5 :w 1.0) @@ -2390,7 +2390,7 @@ (new 'static 'continue-point :name "sig5-skip-to-cent2" :level 'underb - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -1036247.9 :y -290824.2 :z 8022382.0 :w 1.0) :quat (new 'static 'vector :y 0.9395 :w 0.3424) :camera-trans (new 'static 'vector :x -1064226.9 :y -261537.8 :z 8065295.0 :w 1.0) @@ -2471,7 +2471,7 @@ :continues '((new 'static 'continue-point :name "palcab-start" :level 'palcab - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 929748.56 :y 1803958.2 :z -568005.8 :w 1.0) :quat (new 'static 'vector :y -0.2346 :w -0.972) :camera-trans (new 'static 'vector :x 930469.5 :y 1825050.6 :z -611119.94 :w 1.0) @@ -2574,7 +2574,7 @@ :continues '((new 'static 'continue-point :name "palshaft-lobby" :level 'palshaft - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 598668.5 :y 69131.06 :z 2697706.0 :w 1.0) :quat (new 'static 'vector :y 0.9982 :w -0.0596) :camera-trans (new 'static 'vector :x 626226.0 :y 88880.74 :z 2734727.5 :w 1.0) @@ -2708,7 +2708,7 @@ :continues '((new 'static 'continue-point :name "palroof-throne" :level 'palroof - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 589710.56 :y 1735487.9 :z 2039465.6 :w 1.0) :quat (new 'static 'vector :y -0.452 :w 0.8919) :camera-trans (new 'static 'vector :x 622908.2 :y 1756602.4 :z 2012121.9 :w 1.0) @@ -2732,7 +2732,7 @@ (new 'static 'continue-point :name "palroof-boss" :level 'palroof - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 870794.06 :y 1671154.9 :z 2027482.4 :w 1.0) :quat (new 'static 'vector :y 0.4793 :w 0.8776) :camera-trans (new 'static 'vector :x 831816.06 :y 1693132.0 :z 2045632.9 :w 1.0) @@ -2756,7 +2756,7 @@ (new 'static 'continue-point :name "palroof-boss-victory" :level 'palroof - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1175203.4 :y 1671159.0 :z 2741709.5 :w 1.0) :quat (new 'static 'vector :y -0.7428 :w 0.6694) :camera-trans (new 'static 'vector :x 1222606.5 :y 1692250.5 :z 2761046.0 :w 1.0) @@ -2891,7 +2891,7 @@ :continues '((new 'static 'continue-point :name "throne-ashelin" :level 'throne - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 634090.3 :y 1414044.9 :z 2314699.2 :w 1.0) :quat (new 'static 'vector :y 0.9525 :w -0.3044) :camera-trans (new 'static 'vector :x 660229.75 :y 1435136.9 :z 2348906.5 :w 1.0) @@ -2915,7 +2915,7 @@ (new 'static 'continue-point :name "throne-outro" :level 'throne - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 634090.3 :y 1414044.9 :z 2314699.2 :w 1.0) :quat (new 'static 'vector :y 0.9525 :w -0.3044) :camera-trans (new 'static 'vector :x 660229.75 :y 1435136.9 :z 2348906.5 :w 1.0) @@ -3161,7 +3161,7 @@ :continues '((new 'static 'continue-point :name "palent-throne" :level 'palent - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 689051.6 :y 1413868.8 :z 2516459.5 :w 1.0) :quat (new 'static 'vector :y 0.9997 :z -0.0013 :w -0.0211) :camera-trans (new 'static 'vector :x 664995.44 :y 1434960.8 :z 2552149.5 :w 1.0) @@ -3287,7 +3287,7 @@ (new 'static 'continue-point :name "game-start" :level 'prison - :flags (continue-flags cf5) + :flags (continue-flags game-start) :trans (new 'static 'vector :x 1942413.2 :y 34479.31 :z 275525.62 :w 1.0) :quat (new 'static 'vector :y 0.4562 :w 0.8898) :camera-trans (new 'static 'vector :x 1921090.8 :y 53425.766 :z 237949.75 :w 1.0) @@ -3311,7 +3311,7 @@ (new 'static 'continue-point :name "prison-intro-start" :level 'prison - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 1942413.2 :y 34479.31 :z 275525.62 :w 1.0) :quat (new 'static 'vector :y 0.4562 :w 0.8898) :camera-trans (new 'static 'vector :x 1921090.8 :y 53425.766 :z 237949.75 :w 1.0) @@ -3522,7 +3522,7 @@ (new 'static 'continue-point :name "forexita-mid" :level 'forexita - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 3037138.0 :y 295920.03 :z 686462.2 :w 1.0) :quat (new 'static 'vector :y -0.9805 :w -0.1963) :camera-trans (new 'static 'vector :x 3038071.2 :y 317014.03 :z 729465.6 :w 1.0) @@ -3601,7 +3601,7 @@ :continues '((new 'static 'continue-point :name "forexitb-end" :level 'forexitb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2338518.2 :y 123119.62 :z 41246.31 :w 1.0) :quat (new 'static 'vector :y 0.9969 :w 0.078) :camera-trans (new 'static 'vector :x 2333426.0 :y 144214.02 :z 92192.36 :w 1.0) @@ -3625,7 +3625,7 @@ (new 'static 'continue-point :name "forexita-tube" :level 'forexitb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2698146.5 :y 245757.95 :z 169426.94 :w 1.0) :quat (new 'static 'vector :y -0.0838 :w 0.9964) :camera-trans (new 'static 'vector :x 2697397.8 :y 267042.0 :z 118417.0 :w 1.0) @@ -3782,7 +3782,7 @@ :continues '((new 'static 'continue-point :name "forrescb-mid" :level 'forrescb - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 1873107.4 :y 55606.066 :z 602671.94 :w 1.0) :quat (new 'static 'vector :y -0.6722 :w 0.7403) :camera-trans (new 'static 'vector :x 1917880.4 :y 74982.195 :z 601561.5 :w 1.0) @@ -3884,7 +3884,7 @@ (new 'static 'continue-point :name "fordumpa-midpoint" :level 'fordumpa - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 1918058.5 :y 94208.0 :z 1170815.8 :w 1.0) :quat (new 'static 'vector :y -0.7063 :w 0.7078) :camera-trans (new 'static 'vector :x 1960915.4 :y 115301.99 :z 1166747.2 :w 1.0) @@ -3964,7 +3964,7 @@ :continues '((new 'static 'continue-point :name "fordumpb-start" :level 'fordumpb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1730156.5 :y 94197.35 :z 1192282.9 :w 1.0) :quat (new 'static 'vector :y 0.297 :w -0.9548) :camera-trans (new 'static 'vector :x 1769338.5 :y 113987.99 :z 1167812.6 :w 1.0) @@ -4043,7 +4043,7 @@ :continues '((new 'static 'continue-point :name "fordumpc-start" :level 'fordumpc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2587180.8 :y 147453.95 :z 1446389.4 :w 1.0) :quat (new 'static 'vector :y -0.992 :w -0.1258) :camera-trans (new 'static 'vector :x 2593020.8 :y 168384.92 :z 1404207.9 :w 1.0) @@ -4067,7 +4067,7 @@ (new 'static 'continue-point :name "fordumpc-movie-end" :level 'fordumpc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2572884.0 :y 147681.28 :z 1454391.8 :w 1.0) :quat (new 'static 'vector :y 0.5741 :w 0.8187) :camera-trans (new 'static 'vector :x 2561296.0 :y 168775.69 :z 1412936.1 :w 1.0) @@ -4091,7 +4091,7 @@ (new 'static 'continue-point :name "fordumpc-explode-movie" :level 'fordumpc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2572884.0 :y 147681.28 :z 1454391.8 :w 1.0) :quat (new 'static 'vector :y 0.5741 :w 0.8187) :camera-trans (new 'static 'vector :x 2561296.0 :y 168775.69 :z 1412936.1 :w 1.0) @@ -4225,7 +4225,7 @@ :continues '((new 'static 'continue-point :name "strip-start" :level 'strip - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 10392208.0 :y 291383.72 :z -194403.94 :w 1.0) :quat (new 'static 'vector :y -0.7102 :w 0.7039) :camera-trans (new 'static 'vector :x 10421589.0 :y 307730.44 :z -178237.84 :w 1.0) @@ -4249,7 +4249,7 @@ (new 'static 'continue-point :name "strip-warp" :level 'strip - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x 10392208.0 :y 291383.72 :z -194403.94 :w 1.0) :quat (new 'static 'vector :y -0.7102 :w 0.7039) :camera-trans (new 'static 'vector :x 10421589.0 :y 307730.44 :z -178237.84 :w 1.0) @@ -4273,7 +4273,7 @@ (new 'static 'continue-point :name "strip-warp-2" :level 'strip - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 9677517.0 :y 368640.0 :z -174448.23 :w 1.0) :quat (new 'static 'vector :y 0.7146 :w -0.6994) :camera-trans (new 'static 'vector :x 9634240.0 :y 388288.9 :z -160018.44 :w 1.0) @@ -4297,7 +4297,7 @@ (new 'static 'continue-point :name "strip-drop-midpoint" :level 'strip - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 11098202.0 :y 469663.34 :z 371692.34 :w 1.0) :quat (new 'static 'vector :y -0.878 :w 0.4786) :camera-trans (new 'static 'vector :x 11138690.0 :y 490766.34 :z 403012.8 :w 1.0) @@ -4424,7 +4424,7 @@ (new 'static 'continue-point :name "ruins-movie" :level 'ruins - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3597612.2 :y 2788.9663 :z -898058.25 :w 1.0) :quat (new 'static 'vector :y 0.9108 :w -0.4127) :camera-trans (new 'static 'vector :x 3600432.0 :y 23778.51 :z -847371.9 :w 1.0) @@ -4448,7 +4448,7 @@ (new 'static 'continue-point :name "ruins-hut" :level 'ruins - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 4338732.0 :y 99318.99 :z -1983915.2 :w 1.0) :quat (new 'static 'vector :y 0.964 :w 0.2657) :camera-trans (new 'static 'vector :x 4320175.0 :y 120442.47 :z -1945102.8 :w 1.0) @@ -4479,7 +4479,7 @@ (new 'static 'continue-point :name "ruins-tower-end" :level 'ruins - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4631596.0 :y 188402.08 :z -991184.9 :w 1.0) :quat (new 'static 'vector :y -0.9987 :w -0.0508) :camera-trans (new 'static 'vector :x 4670624.0 :y 206847.19 :z -979009.56 :w 1.0) @@ -4615,7 +4615,7 @@ :continues '((new 'static 'continue-point :name "atoll-start" :level 'atoll - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2288109.5 :y 8801.075 :z -3452941.0 :w 1.0) :quat (new 'static 'vector :y -0.9998 :w -0.0175) :camera-trans (new 'static 'vector :x 2289175.2 :y 29895.475 :z -3401749.0 :w 1.0) @@ -4639,7 +4639,7 @@ (new 'static 'continue-point :name "atoll-airlock" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2284922.5 :y 10056.09 :z -3324549.0 :w 1.0) :quat (new 'static 'vector :y 0.9999 :w 0.0044) :camera-trans (new 'static 'vector :x 2280927.8 :y 29319.986 :z -3280357.5 :w 1.0) @@ -4663,7 +4663,7 @@ (new 'static 'continue-point :name "atoll-movie" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2288109.5 :y 8801.075 :z -3452941.0 :w 1.0) :quat (new 'static 'vector :y -0.9998 :w -0.0175) :camera-trans (new 'static 'vector :x 2289175.2 :y 29895.475 :z -3401749.0 :w 1.0) @@ -4687,7 +4687,7 @@ (new 'static 'continue-point :name "sig0-hiding-behind-blocks" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2026609.9 :y 53760.0 :z -3877329.2 :w 1.0) :quat (new 'static 'vector :y 0.6803 :w -0.7328) :camera-trans (new 'static 'vector :x 2043578.0 :y 77001.93 :z -3838212.5 :w 1.0) @@ -4711,7 +4711,7 @@ (new 'static 'continue-point :name "sig0-down-ramp" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1762283.5 :y 53711.668 :z -4027283.8 :w 1.0) :quat (new 'static 'vector :x -0.0001 :y 0.9401 :w 0.3406) :camera-trans (new 'static 'vector :x 1721253.9 :y 95286.07 :z -3956288.2 :w 1.0) @@ -4735,7 +4735,7 @@ (new 'static 'continue-point :name "sig0-charge-gun-for-sniper-c" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1552601.1 :y 53711.668 :z -4779247.5 :w 1.0) :quat (new 'static 'vector :y 0.962 :w -0.2727) :camera-trans (new 'static 'vector :x 1513808.8 :y 73827.125 :z -4806706.5 :w 1.0) @@ -4759,7 +4759,7 @@ (new 'static 'continue-point :name "sig0-cross-water" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1874199.0 :y 6223.872 :z -4438985.0 :w 1.0) :quat (new 'static 'vector :y 0.3639 :w 0.9314) :camera-trans (new 'static 'vector :x 1838270.9 :y 27303.936 :z -4475633.0 :w 1.0) @@ -4783,7 +4783,7 @@ (new 'static 'continue-point :name "sig0-show-sniper-e" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2293206.8 :y 4907.4175 :z -4265200.5 :w 1.0) :quat (new 'static 'vector :x -0.0013 :y -0.8686 :z 0.0003 :w -0.4954) :camera-trans (new 'static 'vector :x 2213943.0 :y 46524.414 :z -4285937.0 :w 1.0) @@ -4807,7 +4807,7 @@ (new 'static 'continue-point :name "atoll-battle" :level 'atoll - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1786353.6 :y 173371.8 :z -4885427.5 :w 1.0) :quat (new 'static 'vector :y 0.7184 :w 0.6955) :camera-trans (new 'static 'vector :x 1744994.2 :y 194462.92 :z -4897220.0 :w 1.0) @@ -4941,7 +4941,7 @@ :continues '((new 'static 'continue-point :name "mountain-start" :level 'mountain - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -2323968.5 :y 492110.66 :z 847190.44 :w 1.0) :quat (new 'static 'vector :y 0.7072 :w -0.7069) :camera-trans (new 'static 'vector :x -2366673.8 :y 513098.12 :z 852492.3 :w 1.0) @@ -4965,7 +4965,7 @@ (new 'static 'continue-point :name "mountain-warp-top" :level 'mountain - :flags (continue-flags cf2 cf4 cf7) + :flags (continue-flags change-continue no-blackout warp-gate) :trans (new 'static 'vector :x -2344385.0 :y 493619.2 :z 855861.7 :w 1.0) :quat (new 'static 'vector :y 0.7897 :w -0.6134) :camera-trans (new 'static 'vector :x -2395385.8 :y 514670.2 :z 853979.1 :w 1.0) @@ -5012,7 +5012,7 @@ (new 'static 'continue-point :name "mountain-warp-bottom" :level 'mountain - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x -1928867.9 :y 119072.36 :z 762851.3 :w 1.0) :quat (new 'static 'vector :y 0.1361 :w -0.9906) :camera-trans (new 'static 'vector :x -1970202.2 :y 140129.89 :z 792840.2 :w 1.0) @@ -5036,7 +5036,7 @@ (new 'static 'continue-point :name "mountain-movie" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1928867.9 :y 119072.36 :z 762851.3 :w 1.0) :quat (new 'static 'vector :y 0.1361 :w -0.9906) :camera-trans (new 'static 'vector :x -1970202.2 :y 140129.89 :z 792840.2 :w 1.0) @@ -5060,7 +5060,7 @@ (new 'static 'continue-point :name "mountain-aval" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -3678913.0 :y 242899.36 :z 547868.7 :w 1.0) :quat (new 'static 'vector :x -0.0014 :y 0.2389 :z -0.0006 :w -0.971) :camera-trans (new 'static 'vector :x -3658512.0 :y 263992.94 :z 500907.62 :w 1.0) @@ -5090,7 +5090,7 @@ (new 'static 'continue-point :name "mountain-dark-eco" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2598416.5 :y 385700.25 :z -131157.2 :w 1.0) :quat (new 'static 'vector :y 0.0011 :w -0.9999) :camera-trans (new 'static 'vector :x -2589366.2 :y 398878.72 :z -150739.77 :w 1.0) @@ -5114,7 +5114,7 @@ (new 'static 'continue-point :name "mountain-kiosk" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2389323.0 :y 495015.53 :z 963041.25 :w 1.0) :quat (new 'static 'vector :y -0.5072 :w 0.8617) :camera-trans (new 'static 'vector :x -2350041.5 :y 516124.7 :z 945515.75 :w 1.0) @@ -5138,7 +5138,7 @@ (new 'static 'continue-point :name "mountain-grind-rail" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2488779.2 :y 278519.4 :z 485033.97 :w 1.0) :quat (new 'static 'vector :y 0.7587 :w 0.6513) :camera-trans (new 'static 'vector :x -2531265.8 :y 299651.06 :z 491683.84 :w 1.0) @@ -5162,7 +5162,7 @@ (new 'static 'continue-point :name "mountain-door" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2629474.0 :y 324481.44 :z 689014.4 :w 1.0) :quat (new 'static 'vector :y 0.9621 :w -0.2726) :camera-trans (new 'static 'vector :x -2631735.8 :y 344205.72 :z 735101.3 :w 1.0) @@ -5322,7 +5322,7 @@ (new 'static 'continue-point :name "forest-tree" :level 'forest - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -2612326.8 :y 149986.92 :z 3560990.0 :w 1.0) :quat (new 'static 'vector :x 0.0001 :y 0.3242 :z -0.0013 :w 0.9459) :camera-trans (new 'static 'vector :x -2642006.0 :y 171092.78 :z 3519268.5 :w 1.0) @@ -5458,7 +5458,7 @@ :continues '((new 'static 'continue-point :name "mincan-start" :level 'mincan - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1980823.1 :y 116416.516 :z -62922.344 :w 1.0) :quat (new 'static 'vector :y -0.9607 :z -0.0014 :w -0.2775) :camera-trans (new 'static 'vector :x -2001351.5 :y 131235.44 :z -44465.766 :w 1.0) @@ -5482,7 +5482,7 @@ (new 'static 'continue-point :name "mincan-city" :level 'mincan - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -2134463.8 :y 66739.41 :z -724928.1 :w 1.0) :quat (new 'static 'vector :y 0.5441 :w 0.839) :camera-trans (new 'static 'vector :x -2155888.2 :y 87833.4 :z -762217.25 :w 1.0) @@ -5923,7 +5923,7 @@ (new 'static 'continue-point :name "ctygena-burning-bush-2" :level 'ctygena - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1549425.0 :y 32753.254 :z -805722.1 :w 1.0) :quat (new 'static 'vector :y -0.6395 :w 0.7687) :camera-trans (new 'static 'vector :x -1498315.1 :y 53847.656 :z -808805.2 :w 1.0) @@ -5947,7 +5947,7 @@ (new 'static 'continue-point :name "ctygena-burning-bush" :level 'ctygena - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -256512.4 :y 32768.0 :z -116162.15 :w 1.0) :quat (new 'static 'vector :y 0.0466 :w -0.9989) :camera-trans (new 'static 'vector :x -255002.22 :y 53861.992 :z -167339.62 :w 1.0) @@ -6028,7 +6028,7 @@ :continues '((new 'static 'continue-point :name "ctygenb-start" :level 'ctygenb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 686539.56 :y 40271.87 :z -1015174.75 :w 1.0) :quat (new 'static 'vector :x 0.0009 :y 0.6545 :z 0.0007 :w -0.756) :camera-trans (new 'static 'vector :x 647089.75 :y 59344.49 :z -1026199.94 :w 1.0) @@ -6052,7 +6052,7 @@ (new 'static 'continue-point :name "ctygenb-burning-bush" :level 'ctygenb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 685747.8 :y 32765.543 :z -1213995.9 :w 1.0) :quat (new 'static 'vector :y 0.9949 :w 0.1007) :camera-trans (new 'static 'vector :x 686984.8 :y 53859.53 :z -1162769.6 :w 1.0) @@ -6076,7 +6076,7 @@ (new 'static 'continue-point :name "ctygenb-burning-bush-2" :level 'ctygenb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1092419.1 :y 32768.0 :z -269985.38 :w 1.0) :quat (new 'static 'vector :y 0.749 :w 0.6624) :camera-trans (new 'static 'vector :x 1041223.7 :y 53868.543 :z -270698.9 :w 1.0) @@ -6157,7 +6157,7 @@ :continues '((new 'static 'continue-point :name "ctygenc-start" :level 'ctygenc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 781528.25 :y 39733.656 :z 1322450.5 :w 1.0) :quat (new 'static 'vector :y -0.9673 :w 0.2534) :camera-trans (new 'static 'vector :x 778921.56 :y 60838.707 :z 1373583.8 :w 1.0) @@ -6181,7 +6181,7 @@ (new 'static 'continue-point :name "ctygenc-burning-bush" :level 'ctygenc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 883602.25 :y 32770.047 :z 35872.36 :w 1.0) :quat (new 'static 'vector :y -0.9999 :w 0.0085) :camera-trans (new 'static 'vector :x 883981.5 :y 53224.242 :z 84615.17 :w 1.0) @@ -6205,7 +6205,7 @@ (new 'static 'continue-point :name "ctygenc-burning-bush-2" :level 'ctygenc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 141574.14 :y 32772.098 :z 1081112.6 :w 1.0) :quat (new 'static 'vector :y -0.7665 :w -0.6422) :camera-trans (new 'static 'vector :x 90349.98 :y 53866.496 :z 1080261.0 :w 1.0) @@ -6309,7 +6309,7 @@ (new 'static 'continue-point :name "ctysluma-alley" :level 'ctysluma - :flags (continue-flags cf1 cf3 cf17) + :flags (continue-flags scene-wait no-auto test) :trans (new 'static 'vector :x 4660709.0 :y 33364.38 :z 61360.54 :w 1.0) :quat (new 'static 'vector :y -0.2484 :w -0.9686) :camera-trans (new 'static 'vector :x 4635918.5 :y 54458.367 :z 26214.4 :w 1.0) @@ -6333,7 +6333,7 @@ (new 'static 'continue-point :name "ctysluma-tower-intro" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4660709.0 :y 33364.38 :z 61360.54 :w 1.0) :quat (new 'static 'vector :y -0.2484 :w -0.9686) :camera-trans (new 'static 'vector :x 4635918.5 :y 54458.367 :z 26214.4 :w 1.0) @@ -6357,7 +6357,7 @@ (new 'static 'continue-point :name "ctysluma-tower-intro-exit" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4713875.5 :y 33354.957 :z 247486.47 :w 1.0) :quat (new 'static 'vector :y -0.9986 :w 0.0522) :camera-trans (new 'static 'vector :x 4724241.5 :y 54449.355 :z 297623.97 :w 1.0) @@ -6381,7 +6381,7 @@ (new 'static 'continue-point :name "ctysluma-alley-no-hideout" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4660709.0 :y 33364.38 :z 61360.54 :w 1.0) :quat (new 'static 'vector :y -0.2484 :w -0.9686) :camera-trans (new 'static 'vector :x 4635918.5 :y 54458.367 :z 26214.4 :w 1.0) @@ -6405,7 +6405,7 @@ (new 'static 'continue-point :name "ctysluma-fort-entrance" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3200250.2 :y 26049.332 :z 926289.94 :w 1.0) :quat (new 'static 'vector :y -0.6 :w 0.7999) :camera-trans (new 'static 'vector :x 3251440.8 :y 47171.176 :z 926989.1 :w 1.0) @@ -6429,7 +6429,7 @@ (new 'static 'continue-point :name "ctysluma-fort-end" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3241306.0 :y 33350.86 :z 1429365.1 :w 1.0) :quat (new 'static 'vector :y -0.7632 :w -0.646) :camera-trans (new 'static 'vector :x 3282688.5 :y 53891.48 :z 1433176.5 :w 1.0) @@ -6453,7 +6453,7 @@ (new 'static 'continue-point :name "escort-kid-intro" :level 'ctysluma - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 4720627.5 :y 33350.453 :z 238358.53 :w 1.0) :quat (new 'static 'vector :y -0.9882 :w 0.153) :camera-trans (new 'static 'vector :x 4725391.0 :y 54444.85 :z 289359.06 :w 1.0) @@ -6477,7 +6477,7 @@ (new 'static 'continue-point :name "ctysluma-escort-retry" :level 'ctysluma - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 4701751.5 :y 33350.453 :z 196943.88 :w 1.0) :quat (new 'static 'vector :y -0.2309 :w -0.9729) :camera-trans (new 'static 'vector :x 4686596.0 :y 54444.85 :z 156687.56 :w 1.0) @@ -6501,7 +6501,7 @@ (new 'static 'continue-point :name "ctysluma-burning-bush" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3420067.8 :y 33357.414 :z 984182.4 :w 1.0) :quat (new 'static 'vector :x 0.0002 :y -0.5079 :w 0.8614) :camera-trans (new 'static 'vector :x 3465968.8 :y 53951.69 :z 1002505.0 :w 1.0) @@ -6628,7 +6628,7 @@ (new 'static 'continue-point :name "ctyslumb-burning-bush" :level 'ctyslumb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2895687.8 :y 33280.41 :z -332780.75 :w 1.0) :quat (new 'static 'vector :x 0.0002 :y 0.5948 :z -0.0003 :w 0.8038) :camera-trans (new 'static 'vector :x 2892613.8 :y 54387.508 :z -383899.25 :w 1.0) @@ -6652,7 +6652,7 @@ (new 'static 'continue-point :name "ctyslumb-burning-bush-2" :level 'ctyslumb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1747023.5 :y 32766.771 :z -249536.52 :w 1.0) :quat (new 'static 'vector :y 0.9992 :w -0.0382) :camera-trans (new 'static 'vector :x 1763576.2 :y 53857.895 :z -200809.67 :w 1.0) @@ -6733,7 +6733,7 @@ :continues '((new 'static 'continue-point :name "ctyslumc-start" :level 'ctyslumc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2453099.8 :y 32505.855 :z -2268892.8 :w 1.0) :quat (new 'static 'vector :y -0.6958 :w 0.7182) :camera-trans (new 'static 'vector :x 2468703.8 :y 53571.586 :z -2220125.5 :w 1.0) @@ -6780,7 +6780,7 @@ (new 'static 'continue-point :name "ctyslumc-seal-movie" :level 'ctyslumc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3095949.8 :y 38379.52 :z -2931103.2 :w 1.0) :quat (new 'static 'vector :y -0.1147 :w 0.9933) :camera-trans (new 'static 'vector :x 3105172.8 :y 58562.152 :z -2978129.0 :w 1.0) @@ -6804,7 +6804,7 @@ (new 'static 'continue-point :name "ctyslumc-burning-bush" :level 'ctyslumc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2201559.0 :y 32754.074 :z -2377998.0 :w 1.0) :quat (new 'static 'vector :y 0.8793 :w -0.4762) :camera-trans (new 'static 'vector :x 2230809.8 :y 53886.156 :z -2335975.5 :w 1.0) @@ -6909,7 +6909,7 @@ (new 'static 'continue-point :name "ctyport-hiphog" :level 'ctyport - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -237165.36 :y 31635.455 :z 5517031.5 :w 1.0) :quat (new 'static 'vector :y -0.9709 :w 0.239) :camera-trans (new 'static 'vector :x -213388.9 :y 52731.086 :z 5552992.5 :w 1.0) @@ -6933,7 +6933,7 @@ (new 'static 'continue-point :name "ctyport-hiphog-no-hiphog" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -263350.7 :y 31665.357 :z 5478634.5 :w 1.0) :quat (new 'static 'vector :y -0.7746 :w 0.6324) :camera-trans (new 'static 'vector :x -239528.75 :y 52765.082 :z 5523948.5 :w 1.0) @@ -6957,7 +6957,7 @@ (new 'static 'continue-point :name "ctyport-gungame" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1740270.8 :y 31670.271 :z 5416671.0 :w 1.0) :quat (new 'static 'vector :y 0.9703 :w 0.2417) :camera-trans (new 'static 'vector :x 1719776.0 :y 52764.26 :z 5463587.5 :w 1.0) @@ -7004,7 +7004,7 @@ (new 'static 'continue-point :name "ctyport-air-train" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 1526301.1 :y 31448.27 :z 7370150.5 :w 1.0) :quat (new 'static 'vector :x -0.0014 :y -0.9505 :z -0.0005 :w 0.3106) :camera-trans (new 'static 'vector :x 1511200.0 :y 50669.16 :z 7328715.0 :w 1.0) @@ -7028,7 +7028,7 @@ (new 'static 'continue-point :name "ctyport-air-train-ashelin" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 1526301.1 :y 31448.27 :z 7370150.5 :w 1.0) :quat (new 'static 'vector :x -0.0014 :y -0.9505 :z -0.0005 :w 0.3106) :camera-trans (new 'static 'vector :x 1511200.0 :y 50669.16 :z 7328715.0 :w 1.0) @@ -7075,7 +7075,7 @@ (new 'static 'continue-point :name "ctyport-errol-record-path" :level 'ctyport - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x -204202.39 :y 42518.117 :z 5517981.5 :w 1.0) :quat (new 'static 'vector :x 0.0218 :y -0.4594 :z -0.0486 :w 0.8866) :camera-trans (new 'static 'vector :x -185733.12 :y 53058.766 :z 5505444.0 :w 1.0) @@ -7099,7 +7099,7 @@ (new 'static 'continue-point :name "ctyport-race-fail" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2450949.8 :y 45615.105 :z 6574133.5 :w 1.0) :quat (new 'static 'vector :x -0.0072 :y -0.3548 :z 0.0109 :w 0.9348) :camera-trans (new 'static 'vector :x 2464248.2 :y 55870.258 :z 6559149.5 :w 1.0) @@ -7123,7 +7123,7 @@ (new 'static 'continue-point :name "ctyport-race-retry" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2519127.8 :y 31612.518 :z 6545450.0 :w 1.0) :quat (new 'static 'vector :x 0.0003 :y -0.1359 :z 0.0013 :w -0.9907) :camera-trans (new 'static 'vector :x 2552038.5 :y 50085.887 :z 6520416.0 :w 1.0) @@ -7147,7 +7147,7 @@ (new 'static 'continue-point :name "ctyport-errol-race-retry" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -237435.3 :y 31652.25 :z 5468062.0 :w 1.0) :quat (new 'static 'vector :y -0.4713 :w -0.8819) :camera-trans (new 'static 'vector :x -285678.78 :y 51959.4 :z 5466700.0 :w 1.0) @@ -7171,7 +7171,7 @@ (new 'static 'continue-point :name "ctyport-race-record-path" :level 'ctyport - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x 2491680.0 :y 44982.273 :z 6575569.5 :w 1.0) :quat (new 'static 'vector :x 0.0289 :y 0.5081 :z 0.0742 :w -0.8575) :camera-trans (new 'static 'vector :x 2511393.2 :y 56725.094 :z 6565603.5 :w 1.0) @@ -7195,7 +7195,7 @@ (new 'static 'continue-point :name "ctyport-outro" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -7219,7 +7219,7 @@ (new 'static 'continue-point :name "ctyport-outro-fireworks" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 306485.66 :y 31610.47 :z 5660605.0 :w 1.0) :quat (new 'static 'vector :y -0.0814 :w 0.9966) :camera-trans (new 'static 'vector :x 304445.03 :y 55391.848 :z 5609440.5 :w 1.0) @@ -7243,7 +7243,7 @@ (new 'static 'continue-point :name "ctyport-burning-bush-3" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2568996.8 :y 31641.6 :z 6469675.5 :w 1.0) :quat (new 'static 'vector :y 0.8877 :w 0.4602) :camera-trans (new 'static 'vector :x 2526983.0 :y 52228.098 :z 6496139.0 :w 1.0) @@ -7267,7 +7267,7 @@ (new 'static 'continue-point :name "ctyport-burning-bush" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -409080.22 :y 31759.154 :z 5577668.5 :w 1.0) :quat (new 'static 'vector :y 0.9767 :w -0.2145) :camera-trans (new 'static 'vector :x -378350.38 :y 52853.145 :z 5607808.0 :w 1.0) @@ -7403,7 +7403,7 @@ :continues '((new 'static 'continue-point :name "ctyfarma-start" :level 'ctyfarma - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1346162.8 :y 35138.355 :z 858246.4 :w 1.0) :quat (new 'static 'vector :y -0.4712 :w 0.882) :camera-trans (new 'static 'vector :x -1294963.1 :y 56245.043 :z 858741.56 :w 1.0) @@ -7427,7 +7427,7 @@ (new 'static 'continue-point :name "ctyfarma-airlock-movie" :level 'ctyfarma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1773681.9 :y 124271.82 :z 852637.3 :w 1.0) :quat (new 'static 'vector :y -0.6773 :w 0.7356) :camera-trans (new 'static 'vector :x -1739667.0 :y 142474.44 :z 861517.0 :w 1.0) @@ -7451,7 +7451,7 @@ (new 'static 'continue-point :name "ctyfarma-airlock" :level 'ctyfarma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1788942.4 :y 124271.82 :z 853132.5 :w 1.0) :quat (new 'static 'vector :x -0.0012 :y -0.7734 :z -0.001 :w 0.6339) :camera-trans (new 'static 'vector :x -1739187.0 :y 145007.4 :z 849631.6 :w 1.0) @@ -7475,7 +7475,7 @@ (new 'static 'continue-point :name "ctyfarma-burning-bush" :level 'ctyfarma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -236415.39 :y 32763.904 :z 389540.25 :w 1.0) :quat (new 'static 'vector :y 0.9803 :w 0.1972) :camera-trans (new 'static 'vector :x -258035.72 :y 53921.383 :z 436186.72 :w 1.0) @@ -7557,7 +7557,7 @@ :continues '((new 'static 'continue-point :name "ctyfarmb-start" :level 'ctyfarmb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1473722.4 :y 32758.988 :z 4695127.0 :w 1.0) :quat (new 'static 'vector :y -0.9428 :w 0.3332) :camera-trans (new 'static 'vector :x -1457872.5 :y 54232.27 :z 4735104.0 :w 1.0) @@ -7581,7 +7581,7 @@ (new 'static 'continue-point :name "ctyfarmb-burning-bush" :level 'ctyfarmb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1292948.6 :y 32763.904 :z 4407961.5 :w 1.0) :quat (new 'static 'vector :y -0.7097 :w -0.7044) :camera-trans (new 'static 'vector :x -1337764.2 :y 52156.824 :z 4405888.0 :w 1.0) @@ -7662,7 +7662,7 @@ :continues '((new 'static 'continue-point :name "ctyinda-start" :level 'ctyinda - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 3945097.8 :y 110584.625 :z 3721824.8 :w 1.0) :quat (new 'static 'vector :y 0.0533 :w 0.9985) :camera-trans (new 'static 'vector :x 3971861.0 :y 129763.734 :z 3686880.0 :w 1.0) @@ -7709,7 +7709,7 @@ (new 'static 'continue-point :name "lkiddoge-skip1" :level 'ctyinda - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4069240.5 :y 32741.785 :z 4647774.5 :w 1.0) :quat (new 'static 'vector :x 0.0001 :y -0.6735 :w -0.7391) :camera-trans (new 'static 'vector :x 4019418.0 :y 53836.188 :z 4635805.5 :w 1.0) @@ -7756,7 +7756,7 @@ (new 'static 'continue-point :name "ctyinda-burning-bush" :level 'ctyinda - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3184090.0 :y 34360.934 :z 3365469.8 :w 1.0) :quat (new 'static 'vector :y -0.9999 :w -0.0007) :camera-trans (new 'static 'vector :x 3190731.2 :y 55454.926 :z 3416230.2 :w 1.0) @@ -7837,7 +7837,7 @@ :continues '((new 'static 'continue-point :name "consite-start" :level 'consite - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2858555.0 :y 19556.352 :z 3729141.8 :w 1.0) :quat (new 'static 'vector :y -0.9948 :w 0.1013) :camera-trans (new 'static 'vector :x 2838449.2 :y 40298.086 :z 3684069.0 :w 1.0) @@ -8042,7 +8042,7 @@ (new 'static 'continue-point :name "ctyindb-intro-start" :level 'ctyindb - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 3978918.2 :y 32761.447 :z 2236849.8 :w 1.0) :quat (new 'static 'vector :y 0.9493 :w 0.3141) :camera-trans (new 'static 'vector :x 3946840.5 :y 52216.22 :z 2267846.2 :w 1.0) @@ -8066,7 +8066,7 @@ (new 'static 'continue-point :name "ctyindb-burning-bush" :level 'ctyindb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3214073.5 :y 32741.785 :z 2913456.2 :w 1.0) :quat (new 'static 'vector :y -0.535 :w 0.8448) :camera-trans (new 'static 'vector :x 3260565.0 :y 52803.176 :z 2904624.0 :w 1.0) @@ -8148,7 +8148,7 @@ :continues '((new 'static 'continue-point :name "ctymarka-brutter" :level 'ctymarka - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -439072.34 :y 32768.0 :z 1956770.6 :w 1.0) :quat (new 'static 'vector :y -0.1582 :w 0.9874) :camera-trans (new 'static 'vector :x -396247.84 :y 53861.992 :z 1952489.9 :w 1.0) @@ -8172,7 +8172,7 @@ (new 'static 'continue-point :name "ctymarka-burning-bush" :level 'ctymarka - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -730452.8 :y 32765.543 :z 3454441.5 :w 1.0) :quat (new 'static 'vector :x -0.001 :y -0.0118 :z -0.0009 :w 0.9999) :camera-trans (new 'static 'vector :x -727241.94 :y 53859.94 :z 3403332.8 :w 1.0) @@ -8254,7 +8254,7 @@ :continues '((new 'static 'continue-point :name "ctymarkb-tanker" :level 'ctymarkb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2147489.0 :y 34444.902 :z 1948003.1 :w 1.0) :quat (new 'static 'vector :y 0.2325 :w -0.9725) :camera-trans (new 'static 'vector :x 2176129.5 :y 55539.3 :z 1905562.0 :w 1.0) @@ -8278,7 +8278,7 @@ (new 'static 'continue-point :name "ctymarkb-movie-end" :level 'ctymarkb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1931610.1 :y 34406.4 :z 1769602.6 :w 1.0) :quat (new 'static 'vector :y -0.3655 :w 0.9307) :camera-trans (new 'static 'vector :x 1956000.1 :y 53861.992 :z 1734111.2 :w 1.0) @@ -8302,7 +8302,7 @@ (new 'static 'continue-point :name "ctymarkb-burning-bush" :level 'ctymarkb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2977968.2 :y 34444.902 :z 2160323.0 :w 1.0) :quat (new 'static 'vector :y -0.1398 :w -0.9901) :camera-trans (new 'static 'vector :x 2964785.5 :y 54040.574 :z 2116632.2 :w 1.0) @@ -8326,7 +8326,7 @@ (new 'static 'continue-point :name "ctymarkb-burning-bush-2" :level 'ctymarkb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2575240.5 :y 34444.902 :z 3103047.2 :w 1.0) :quat (new 'static 'vector :y 0.0787 :w 0.9968) :camera-trans (new 'static 'vector :x 2563072.0 :y 54984.293 :z 3055447.2 :w 1.0) @@ -8455,7 +8455,7 @@ (new 'static 'continue-point :name "ctypal-burning-bush" :level 'ctypal - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 377386.6 :y 65546.65 :z 1834825.8 :w 1.0) :quat (new 'static 'vector :y -0.0469 :w 0.9988) :camera-trans (new 'static 'vector :x 372478.38 :y 86293.71 :z 1785120.0 :w 1.0) @@ -8479,7 +8479,7 @@ (new 'static 'continue-point :name "ctypal-burning-bush-2" :level 'ctypal - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1236813.0 :y 32766.361 :z 3622210.2 :w 1.0) :quat (new 'static 'vector :y 0.7451 :w 0.6668) :camera-trans (new 'static 'vector :x 1185874.8 :y 53860.76 :z 3627872.8 :w 1.0) @@ -8583,7 +8583,7 @@ (new 'static 'continue-point :name "stadium-burning-bush" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1391598.4 :y 32767.59 :z -3062397.8 :w 1.0) :quat (new 'static 'vector :x -0.0002 :y 0.6685 :z -0.0001 :w -0.7436) :camera-trans (new 'static 'vector :x 1390407.6 :y 52200.242 :z -3017585.5 :w 1.0) @@ -8607,7 +8607,7 @@ (new 'static 'continue-point :name "stadium-class1-res-end-movie" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 572500.4 :y 49152.0 :z -2737227.0 :w 1.0) :quat (new 'static 'vector :y 0.4807 :z -0.0014 :w 0.8768) :camera-trans (new 'static 'vector :x 603791.75 :y 69309.234 :z -2701270.8 :w 1.0) @@ -8631,7 +8631,7 @@ (new 'static 'continue-point :name "stadium-blimp-intro" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1139318.8 :y -16393.83 :z -2717514.5 :w 1.0) :quat (new 'static 'vector :y 0.9647 :w -0.263) :camera-trans (new 'static 'vector :x 1140867.5 :y 4700.16 :z -2666331.2 :w 1.0) @@ -8655,7 +8655,7 @@ (new 'static 'continue-point :name "stadium-blimp" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1172569.2 :y -16393.83 :z -2875689.0 :w 1.0) :quat (new 'static 'vector :y 0.1113 :w -0.9937) :camera-trans (new 'static 'vector :x 1203939.4 :y 4689.92 :z -2916101.8 :w 1.0) @@ -8735,7 +8735,7 @@ :continues '((new 'static 'continue-point :name "stadiumb-start" :level 'stadiumb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 139325.44 :y 34127.87 :z -2636048.5 :w 1.0) :quat (new 'static 'vector :y -0.2687 :w -0.9632) :camera-trans (new 'static 'vector :x 105139.81 :y 54302.72 :z -2669469.0 :w 1.0) @@ -8759,7 +8759,7 @@ (new 'static 'continue-point :name "stadiumb-race-fail" :level 'stadiumb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 296361.56 :y 47104.0 :z -2499580.2 :w 1.0) :quat (new 'static 'vector :y 0.4434 :w -0.8962) :camera-trans (new 'static 'vector :x 336107.94 :y 68197.99 :z -2531864.5 :w 1.0) @@ -8783,7 +8783,7 @@ (new 'static 'continue-point :name "stadiumb-race-retry" :level 'stadiumb - :flags (continue-flags cf2 cf19) + :flags (continue-flags change-continue pilot) :trans (new 'static 'vector :x 232675.73 :y -10616.832 :z -2443733.5 :w 1.0) :quat (new 'static 'vector :y 0.3456 :w 0.9383) :camera-trans (new 'static 'vector :x 217686.02 :y 1695.744 :z -2461328.2 :w 1.0) @@ -8807,7 +8807,7 @@ (new 'static 'continue-point :name "stadiumb-race-r-retry" :level 'stadiumb - :flags (continue-flags cf2 cf19) + :flags (continue-flags change-continue pilot) :trans (new 'static 'vector :x 284379.97 :y -14743.143 :z -2426257.5 :w 1.0) :quat (new 'static 'vector :y 0.9385 :w -0.345) :camera-trans (new 'static 'vector :x 303667.2 :y -2424.0127 :z -2403514.0 :w 1.0) @@ -8831,7 +8831,7 @@ (new 'static 'continue-point :name "stadiumb-record-path" :level 'stadiumb - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x -192482.52 :y -124127.234 :z -1315588.5 :w 1.0) :quat (new 'static 'vector :x 0.0395 :y -0.9955 :z -0.0827 :w 0.0227) :camera-trans (new 'static 'vector :x -191463.02 :y -115947.11 :z -1293051.5 :w 1.0) @@ -8910,7 +8910,7 @@ :continues '((new 'static 'continue-point :name "stadiumc-start" :level 'stadiumc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 139325.44 :y 34127.87 :z -2636048.5 :w 1.0) :quat (new 'static 'vector :y -0.2687 :w -0.9632) :camera-trans (new 'static 'vector :x 105139.81 :y 54302.72 :z -2669469.0 :w 1.0) @@ -8934,7 +8934,7 @@ (new 'static 'continue-point :name "stadiumc-race-retry-pidax" :level 'stadiumc - :flags (continue-flags cf3 cf20) + :flags (continue-flags no-auto pilot-dax) :trans (new 'static 'vector :x -337180.7 :y -24649.318 :z -2695884.5 :w 1.0) :quat (new 'static 'vector :y 0.7066 :w 0.7075) :camera-trans (new 'static 'vector :x -386829.94 :y -12293.734 :z -2695941.0 :w 1.0) @@ -8958,7 +8958,7 @@ (new 'static 'continue-point :name "stadiumc-race-retry" :level 'stadiumc - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x -337180.7 :y -24649.318 :z -2695884.5 :w 1.0) :quat (new 'static 'vector :y 0.7066 :w 0.7075) :camera-trans (new 'static 'vector :x -386829.94 :y -12293.734 :z -2695941.0 :w 1.0) @@ -8982,7 +8982,7 @@ (new 'static 'continue-point :name "stadiumc-race-r-retry" :level 'stadiumc - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x -261450.55 :y -28719.924 :z -2723475.5 :w 1.0) :quat (new 'static 'vector :y -0.6995 :w 0.7146) :camera-trans (new 'static 'vector :x -210261.61 :y -16378.266 :z -2724553.0 :w 1.0) @@ -9006,7 +9006,7 @@ (new 'static 'continue-point :name "stadiumc-race-fail" :level 'stadiumc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -350173.2 :y 47088.027 :z -2750787.2 :w 1.0) :quat (new 'static 'vector :y 0.227 :w -0.9738) :camera-trans (new 'static 'vector :x -350950.6 :y 68182.42 :z -2801975.2 :w 1.0) @@ -9030,7 +9030,7 @@ (new 'static 'continue-point :name "stadiumc-record-path" :level 'stadiumc - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x 70463.484 :y -171052.64 :z -2836438.8 :w 1.0) :quat (new 'static 'vector :x 0.0448 :y 0.2377 :z -0.0047 :w -0.9702) :camera-trans (new 'static 'vector :x 80398.336 :y -160836.4 :z -2856782.2 :w 1.0) @@ -9109,7 +9109,7 @@ :continues '((new 'static 'continue-point :name "stadiumd-start" :level 'stadiumd - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 139325.44 :y 34127.87 :z -2636048.5 :w 1.0) :quat (new 'static 'vector :y -0.2687 :w -0.9632) :camera-trans (new 'static 'vector :x 105139.81 :y 54302.72 :z -2669469.0 :w 1.0) @@ -9133,7 +9133,7 @@ (new 'static 'continue-point :name "stadiumd-race-fail" :level 'stadiumd - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 79271.12 :y 47103.59 :z -2669285.5 :w 1.0) :quat (new 'static 'vector :y -0.1495 :w 0.9887) :camera-trans (new 'static 'vector :x 103847.94 :y 67127.3 :z -2709570.0 :w 1.0) @@ -9157,7 +9157,7 @@ (new 'static 'continue-point :name "stadiumd-race-retry" :level 'stadiumd - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x 18072.781 :y -19255.297 :z -2648879.0 :w 1.0) :quat (new 'static 'vector :y 0.5232 :w 0.8521) :camera-trans (new 'static 'vector :x -27583.283 :y -6946.4062 :z -2672047.8 :w 1.0) @@ -9181,7 +9181,7 @@ (new 'static 'continue-point :name "stadiumd-race-r-retry" :level 'stadiumd - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x 96944.54 :y -23309.518 :z -2578265.0 :w 1.0) :quat (new 'static 'vector :y -0.8521 :w 0.5232) :camera-trans (new 'static 'vector :x 125187.27 :y -11000.627 :z -2563945.8 :w 1.0) @@ -9205,7 +9205,7 @@ (new 'static 'continue-point :name "stadiumd-record-path" :level 'stadiumd - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x -1065634.2 :y -90913.18 :z -1832483.2 :w 1.0) :quat (new 'static 'vector :x 0.0316 :y -0.899 :z 0.0115 :w -0.4364) :camera-trans (new 'static 'vector :x -1082339.8 :y -78608.38 :z -1817219.9 :w 1.0) @@ -9283,7 +9283,7 @@ :continues '((new 'static 'continue-point :name "skatea-start" :level 'skatea - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 446888.75 :y -38911.59 :z -2322099.8 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 457174.22 :y -18563.072 :z -2274887.8 :w 1.0) @@ -9307,7 +9307,7 @@ (new 'static 'continue-point :name "skatea-training" :level 'skatea - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 497077.44 :y -38912.41 :z -2587993.0 :w 1.0) :quat (new 'static 'vector :y -0.0379 :w -0.9992) :camera-trans (new 'static 'vector :x 494938.12 :y -18720.36 :z -2635767.8 :w 1.0) @@ -9408,7 +9408,7 @@ :continues '((new 'static 'continue-point :name "garage-start-skate" :level 'garage - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 362617.25 :y 49152.0 :z -1795099.5 :w 1.0) :quat (new 'static 'vector :y -0.4053 :w 0.9141) :camera-trans (new 'static 'vector :x 402171.1 :y 70245.99 :z -1812076.1 :w 1.0) @@ -9432,7 +9432,7 @@ (new 'static 'continue-point :name "garage-start-class3" :level 'garage - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 433220.4 :y 49152.0 :z -1832372.2 :w 1.0) :quat (new 'static 'vector :y -0.9926 :w 0.1212) :camera-trans (new 'static 'vector :x 449114.53 :y 69541.07 :z -1870120.1 :w 1.0) @@ -9456,7 +9456,7 @@ (new 'static 'continue-point :name "garage-class3-movie" :level 'garage - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 433220.4 :y 49152.0 :z -1832372.2 :w 1.0) :quat (new 'static 'vector :y -0.9926 :w 0.1212) :camera-trans (new 'static 'vector :x 449114.53 :y 69541.07 :z -1870120.1 :w 1.0) @@ -10424,7 +10424,7 @@ :continues '((new 'static 'continue-point :name "onintent-start" :level 'onintent - :flags (continue-flags cf1 cf17) + :flags (continue-flags scene-wait test) :trans (new 'static 'vector :x 2918937.5 :y 34444.902 :z 3093502.2 :w 1.0) :quat (new 'static 'vector :y -0.9989 :w 0.0465) :camera-trans (new 'static 'vector :x 2921813.5 :y 55538.484 :z 3144613.5 :w 1.0) @@ -10693,7 +10693,7 @@ :continues '((new 'static 'continue-point :name "oracle-start" :level 'oracle - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2893301.2 :y 24565.35 :z -1878591.9 :w 1.0) :quat (new 'static 'vector :y -0.1552 :w -0.9878) :camera-trans (new 'static 'vector :x 2885879.0 :y 45466.83 :z -1928682.8 :w 1.0) @@ -10794,7 +10794,7 @@ (new 'static 'continue-point :name "hideout-movie" :level 'hideout - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4880597.0 :y 15103.181 :z 244580.77 :w 1.0) :quat (new 'static 'vector :y 0.7269 :w 0.6866) :camera-trans (new 'static 'vector :x 4842975.5 :y 32609.484 :z 244427.98 :w 1.0) @@ -11884,7 +11884,7 @@ (new 'static 'continue-point :name "hiphog-movie" :level 'hiphog - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -11908,7 +11908,7 @@ (new 'static 'continue-point :name "hiphog-movie-all" :level 'hiphog - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -11932,7 +11932,7 @@ (new 'static 'continue-point :name "hiphog-demo" :level 'hiphog - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -11956,7 +11956,7 @@ (new 'static 'continue-point :name "hiphog-demo-end" :level 'hiphog - :flags (continue-flags cf2 cf6) + :flags (continue-flags change-continue demo-end) :trans (new 'static 'vector :x 2284730.0 :y 8799.847 :z -3431194.2 :w 1.0) :quat (new 'static 'vector :y 0.9929 :w -0.1181) :camera-trans (new 'static 'vector :x 2282735.5 :y 26317.62 :z -3393441.5 :w 1.0) @@ -11980,7 +11980,7 @@ (new 'static 'continue-point :name "hiphog-outro" :level 'hiphog - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -12390,7 +12390,7 @@ :continues '((new 'static 'continue-point :name "gungame-start" :level 'gungame - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 1797717.2 :y 34816.0 :z 5337087.0 :w 1.0) :quat (new 'static 'vector :y -0.9956 :w 0.0932) :camera-trans (new 'static 'vector :x 1807258.4 :y 55836.67 :z 5378828.5 :w 1.0) @@ -12414,7 +12414,7 @@ (new 'static 'continue-point :name "gungame-movie" :level 'gungame - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1797717.2 :y 34816.0 :z 5337087.0 :w 1.0) :quat (new 'static 'vector :y -0.9956 :w 0.0932) :camera-trans (new 'static 'vector :x 1807258.4 :y 55836.67 :z 5378828.5 :w 1.0) @@ -12494,7 +12494,7 @@ :continues '((new 'static 'continue-point :name "dig1-start" :level 'dig1 - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 1759030.1 :y -244842.1 :z -7407948.5 :w 1.0) :quat (new 'static 'vector :y 0.8886 :w -0.4586) :camera-trans (new 'static 'vector :x 1799911.9 :y -223814.86 :z -7395168.5 :w 1.0) @@ -12604,7 +12604,7 @@ (new 'static 'continue-point :name "dig-totem" :level 'dig3a - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 772547.8 :y -57348.098 :z -7644002.5 :w 1.0) :quat (new 'static 'vector :y -0.4492 :w 0.8934) :camera-trans (new 'static 'vector :x 788845.4 :y -36243.867 :z -7683787.0 :w 1.0) @@ -12628,7 +12628,7 @@ (new 'static 'continue-point :name "dig3b-start" :level 'dig3a - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1150306.2 :y -217773.67 :z -8811749.0 :w 1.0) :quat (new 'static 'vector :y 0.7541 :w -0.6566) :camera-trans (new 'static 'vector :x 1192340.6 :y -196685.0 :z -8802656.0 :w 1.0) @@ -12807,7 +12807,7 @@ (new 'static 'continue-point :name "caspad-warp" :level 'caspad - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 1152265.0 :y 114685.13 :z -6746448.5 :w 1.0) :quat (new 'static 'vector :y 0.9282 :w 0.3719) :camera-trans (new 'static 'vector :x 1121375.9 :y 135779.12 :z -6705579.0 :w 1.0) @@ -12831,7 +12831,7 @@ (new 'static 'continue-point :name "caspad-face-castle" :level 'caspad - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 1103312.9 :y 114685.13 :z -6718415.5 :w 1.0) :quat (new 'static 'vector :y 0.7686 :w -0.6396) :camera-trans (new 'static 'vector :x 1153423.8 :y 135779.12 :z -6707907.0 :w 1.0) @@ -12912,7 +12912,7 @@ :continues '((new 'static 'continue-point :name "castle-start" :level 'castle - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 21039.924 :y 229371.9 :z -6893704.5 :w 1.0) :quat (new 'static 'vector :y 0.8039 :w -0.5946) :camera-trans (new 'static 'vector :x 72232.96 :y 250453.2 :z -6894464.0 :w 1.0) @@ -13014,7 +13014,7 @@ :continues '((new 'static 'continue-point :name "casboss-start" :level 'casboss - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1351936.0 :y 1454352.4 :z -6874412.0 :w 1.0) :quat (new 'static 'vector :y -0.7631 :w -0.6462) :camera-trans (new 'static 'vector :x -1403063.9 :y 1475443.1 :z -6877073.5 :w 1.0) @@ -13205,7 +13205,7 @@ :continues '((new 'static 'continue-point :name "village1-start" :level 'village1 - :flags (continue-flags cf1 cf17) + :flags (continue-flags scene-wait test) :trans (new 'static 'vector :x -687440.7 :y 154998.38 :z 752476.2 :w 1.0) :quat (new 'static 'vector :y 0.8595 :w 0.511) :camera-trans (new 'static 'vector :x -724766.3 :y 176109.56 :z 773868.75 :w 1.0) @@ -13229,7 +13229,7 @@ (new 'static 'continue-point :name "intro-start" :level 'village1 - :flags (continue-flags cf1 cf9) + :flags (continue-flags scene-wait intro) :trans (new 'static 'vector :x -687440.7 :y 154998.38 :z 752476.2 :w 1.0) :quat (new 'static 'vector :y 0.8595 :w 0.511) :camera-trans (new 'static 'vector :x -724766.3 :y 176109.56 :z 773868.75 :w 1.0) @@ -13253,7 +13253,7 @@ (new 'static 'continue-point :name "intro-start-hero" :level 'village1 - :flags (continue-flags cf1 cf10) + :flags (continue-flags scene-wait hero-mode) :trans (new 'static 'vector :x -687440.7 :y 154998.38 :z 752476.2 :w 1.0) :quat (new 'static 'vector :y 0.8595 :w 0.511) :camera-trans (new 'static 'vector :x -724766.3 :y 176109.56 :z 773868.75 :w 1.0) @@ -13554,7 +13554,7 @@ :continues '((new 'static 'continue-point :name "nest-start" :level 'nest - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 15416.524 :y -4361.8306 :z -400347.97 :w 1.0) :quat (new 'static 'vector :y -0.9467 :w 0.322) :camera-trans (new 'static 'vector :x 31184.486 :y 16731.75 :z -351637.9 :w 1.0) @@ -13578,7 +13578,7 @@ (new 'static 'continue-point :name "nest-warp" :level 'nest - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 52140.44 :y -4358.9634 :z -309093.16 :w 1.0) :quat (new 'static 'vector :y -0.0195 :w -0.9998) :camera-trans (new 'static 'vector :x 62153.523 :y 16219.75 :z -357362.06 :w 1.0) @@ -13625,7 +13625,7 @@ (new 'static 'continue-point :name "nest-barrier" :level 'nest - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -467713.22 :y 122876.73 :z -631910.4 :w 1.0) :quat (new 'static 'vector :y 0.0352 :w -0.9993) :camera-trans (new 'static 'vector :x -461033.88 :y 143970.3 :z -674393.7 :w 1.0) @@ -13729,7 +13729,7 @@ (new 'static 'continue-point :name "nestb-boss" :level 'nestb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 634325.0 :y 134077.23 :z -1619793.1 :w 1.0) :quat (new 'static 'vector :y -0.9292 :w -0.3694) :camera-trans (new 'static 'vector :x 606261.7 :y 153914.58 :z -1591727.8 :w 1.0) @@ -13753,7 +13753,7 @@ (new 'static 'continue-point :name "nestb-boss-pit" :level 'nestb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 690462.3 :y 84592.64 :z -1698655.0 :w 1.0) :quat (new 'static 'vector :y 0.8663 :w 0.4993) :camera-trans (new 'static 'vector :x 642789.8 :y 105517.47 :z -1715050.5 :w 1.0) @@ -13777,7 +13777,7 @@ (new 'static 'continue-point :name "nestb-outro" :level 'nestb - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 634325.0 :y 134077.23 :z -1619793.1 :w 1.0) :quat (new 'static 'vector :y -0.9292 :w -0.3694) :camera-trans (new 'static 'vector :x 606261.7 :y 153914.58 :z -1591727.8 :w 1.0) diff --git a/goal_src/jak2/engine/level/level.gc b/goal_src/jak2/engine/level/level.gc index 72a5789a7d..150379a620 100644 --- a/goal_src/jak2/engine/level/level.gc +++ b/goal_src/jak2/engine/level/level.gc @@ -27,6 +27,7 @@ into 7 sections, which might explain the weird sizes in the center. (defglobalconstant NUM_LEVEL_PAGES 146) (defglobalconstant LEVEL_PAGE_SIZE_KB 126) ;; original value (defglobalconstant LEVEL_PAGE_SIZE (* LEVEL_PAGE_SIZE_KB 1024)) ;; original value + (defglobalconstant LEVEL_HEAP_SIZE (* NUM_LEVEL_PAGES LEVEL_PAGE_SIZE)) ;(defglobalconstant DEBUG_LEVEL_HEAP_MULT 1.5) ;; level heap in debug mode is 1.5x larger (defglobalconstant DEBUG_LEVEL_HEAP_MULT 1.1) ;; we're gonna use debug mode-style heaps but we don't actually need them at 1.5x size right now @@ -955,7 +956,7 @@ into 7 sections, which might explain the weird sizes in the center. (cond ;; are we using debug sized large level? ((= (&- (-> *level* heap top) (the-as uint (-> *level* heap base))) DEBUG_LEVEL_HEAP_SIZE) - ;; if so, everything is 1.5x bigger! + ;; if so, everything is bigger! (let ((v1-44 (-> obj heap))) (set! (-> v1-44 base) (&+ (-> *level* heap base) (* DEBUG_LEVEL_PAGE_SIZE offset-in-level-heap))) (set! (-> v1-44 current) (-> v1-44 base)) @@ -1891,7 +1892,7 @@ into 7 sections, which might explain the weird sizes in the center. (load-package "common" global) ) (let ((s5-1 (if (and arg0 (not *debug-segment*)) - LEVEL_HEAP_SIZE + (#if PC_PORT DEBUG_LEVEL_HEAP_SIZE LEVEL_HEAP_SIZE) DEBUG_LEVEL_HEAP_SIZE ) ) @@ -2747,9 +2748,9 @@ into 7 sections, which might explain the weird sizes in the center. (set! (-> *setting-control* user-default sound-reverb) (-> s4-1 info sound-reverb)) #t ) - (or (-> *level* border?) (logtest? (-> *game-info* current-continue flags) (continue-flags cf2))) + (or (-> *level* border?) (logtest? (-> *game-info* current-continue flags) (continue-flags change-continue))) (or (!= (-> s4-1 name) (-> *game-info* current-continue level)) - (logtest? (-> *game-info* current-continue flags) (continue-flags cf2)) + (logtest? (-> *game-info* current-continue flags) (continue-flags change-continue)) ) (not (null? (-> s4-1 info continues))) (-> *setting-control* user-current allow-continue) @@ -2765,7 +2766,7 @@ into 7 sections, which might explain the weird sizes in the center. ) (string= (-> *game-info* current-continue name) (-> (the-as continue-point s1-0) name)) ) - (not (logtest? (-> (the-as continue-point s1-0) flags) (continue-flags cf2 cf3))) + (not (logtest? (-> (the-as continue-point s1-0) flags) (continue-flags change-continue no-auto))) ) (set! s3-0 (the-as continue-point s1-0)) (if (string= (-> *game-info* current-continue name) (-> (the-as continue-point s1-0) name)) @@ -2778,7 +2779,7 @@ into 7 sections, which might explain the weird sizes in the center. ) (label cfg-59) (if (and (the-as continue-point s3-0) - (not (logtest? (-> (the-as continue-point s3-0) flags) (continue-flags cf2 cf3))) + (not (logtest? (-> (the-as continue-point s3-0) flags) (continue-flags change-continue no-auto))) ) (set-continue! *game-info* (the-as basic s3-0) #f) ) @@ -2974,9 +2975,10 @@ into 7 sections, which might explain the weird sizes in the center. ) ) ) - (let ((v1-186 (- #x2000000 (the-as int (-> global current))))) - (if (and (not *debug-segment*) (< v1-186 #x10000)) - (format *stdcon* "~3Lglobal heap fatally low at ~DK free~%~0L" (sar v1-186 10)) + ;; pc port note : this was hardcoded to the top of EE memory (#x2000000) + (let ((v1-186 (&- (-> global top-base) (-> global current)))) + (if (and (not *debug-segment*) (< v1-186 (* 64 1024))) + (format *stdcon* "~3Lglobal heap fatally low at ~DK free~%~0L" (/ v1-186 (* 1024 1024))) ) ) diff --git a/goal_src/jak2/engine/load/loader.gc b/goal_src/jak2/engine/load/loader.gc index a9981a0d62..87262342f7 100644 --- a/goal_src/jak2/engine/load/loader.gc +++ b/goal_src/jak2/engine/load/loader.gc @@ -1140,228 +1140,13 @@ (defmethod print gui-connection ((obj gui-connection)) - (let* ((t9-0 format) - (a0-1 #t) - (a1-0 "# obj name)) - (a3-0 (-> obj anim-part)) - (t0-0 (-> obj id)) - (t1-0 (-> obj priority)) - (v1-0 (-> obj channel)) - (t2-1 (cond - ((= v1-0 (gui-channel hud-lower-left)) - "hud-lower-left" - ) - ((= v1-0 (gui-channel citizen)) - "citizen" - ) - ((= v1-0 (gui-channel ashelin)) - "ashelin" - ) - ((= v1-0 (gui-channel hud-lower-left-1)) - "hud-lower-left-1" - ) - ((= v1-0 (gui-channel message)) - "message" - ) - ((= v1-0 (gui-channel hud-middle-left)) - "hud-middle-left" - ) - ((= v1-0 (gui-channel hud-upper-center-2)) - "hud-upper-center-2" - ) - ((= v1-0 (gui-channel hud-middle-right)) - "hud-middle-right" - ) - ((= v1-0 (gui-channel subtitle)) - "subtitle" - ) - ((= v1-0 (gui-channel notice)) - "notice" - ) - ((= v1-0 (gui-channel voicebox)) - "voicebox" - ) - ((= v1-0 (gui-channel art-load-next)) - "art-load-next" - ) - ((= v1-0 (gui-channel mog)) - "mog" - ) - ((= v1-0 (gui-channel sig)) - "sig" - ) - ((= v1-0 (gui-channel hud-center-left)) - "hud-center-left" - ) - ((= v1-0 (gui-channel hud-upper-right)) - "hud-upper-right" - ) - ((= v1-0 (gui-channel hud-center-right)) - "hud-center-right" - ) - ((= v1-0 (gui-channel alert)) - "alert" - ) - ((= v1-0 (gui-channel jinx)) - "jinx" - ) - ((= v1-0 (gui-channel hud-upper-left)) - "hud-upper-left" - ) - ((= v1-0 (gui-channel query)) - "query" - ) - ((= v1-0 (gui-channel grim)) - "grim" - ) - ((= v1-0 (gui-channel kor)) - "kor" - ) - ((= v1-0 (gui-channel hud-lower-right)) - "hud-lower-right" - ) - ((= v1-0 (gui-channel screen)) - "screen" - ) - ((= v1-0 (gui-channel guard)) - "guard" - ) - ((= v1-0 (gui-channel supertitle)) - "supertitle" - ) - ((= v1-0 (gui-channel hal)) - "hal" - ) - ((= v1-0 (gui-channel hud-upper-center)) - "hud-upper-center" - ) - ((= v1-0 (gui-channel blackout)) - "blackout" - ) - ((= v1-0 (gui-channel bbush)) - "bbush" - ) - ((= v1-0 (gui-channel hud)) - "hud" - ) - ((= v1-0 (gui-channel voice)) - "voice" - ) - ((= v1-0 (gui-channel max)) - "max" - ) - ((= v1-0 (gui-channel none)) - "none" - ) - ((= v1-0 (gui-channel notice-low)) - "notice-low" - ) - ((= v1-0 (gui-channel art-load)) - "art-load" - ) - ((= v1-0 (gui-channel kid)) - "kid" - ) - ((= v1-0 (gui-channel jak)) - "jak" - ) - ((= v1-0 (gui-channel daxter)) - "daxter" - ) - ((= v1-0 (gui-channel krew)) - "krew" - ) - ((= v1-0 (gui-channel hud-lower-left-2)) - "hud-lower-left-2" - ) - ((= v1-0 (gui-channel background)) - "background" - ) - ((= v1-0 (gui-channel crocadog)) - "crocadog" - ) - ((= v1-0 (gui-channel movie)) - "movie" - ) - (else - "*unknown*" - ) - ) - ) - (v1-1 (-> obj action)) - ) - (t9-0 a0-1 a1-0 a2-0 a3-0 t0-0 t1-0 t2-1 (cond - ((= v1-1 (gui-action queue)) - "queue" - ) - ((= v1-1 (gui-action stop)) - "stop" - ) - ((= v1-1 (gui-action play)) - "play" - ) - ((= v1-1 (gui-action hide)) - "hide" - ) - ((= v1-1 (gui-action fade)) - "fade" - ) - ((= v1-1 (gui-action none)) - "none" - ) - ((= v1-1 (gui-action abort)) - "abort" - ) - ((= v1-1 (gui-action stopping)) - "stopping" - ) - ((= v1-1 (gui-action hidden)) - "hidden" - ) - ((= v1-1 (gui-action playing)) - "playing" - ) - (else - "*unknown*" - ) - ) - ) - ) - (let ((s5-0 format) - (s4-0 #t) - (s3-0 " ~6S <@ #x~A>") - (v1-3 (get-status *gui-control* (-> obj id))) - ) - (s5-0 - s4-0 - s3-0 - (cond - ((= v1-3 (gui-status ready)) - "ready" - ) - ((= v1-3 (gui-status active)) - "active" - ) - ((= v1-3 (gui-status stop)) - "stop" - ) - ((= v1-3 (gui-status unknown)) - "unknown" - ) - ((= v1-3 (gui-status hide)) - "hide" - ) - ((= v1-3 (gui-status pending)) - "pending" - ) - (else - "*unknown*" - ) - ) - obj - ) - ) + (format #t "# obj name) + (-> obj anim-part) + (-> obj id) + (-> obj priority) + (enum->string gui-channel (-> obj channel)) + (enum->string gui-action (-> obj action))) + (format #t " ~6S <@ #x~A>" (enum->string gui-status (get-status *gui-control* (-> obj id))) obj) obj ) @@ -1404,6 +1189,7 @@ (the-as gui-connection #f) ) +;; WARN: Return type mismatch int vs sound-id. (defmethod lookup-gui-connection-id gui-control ((obj gui-control) (arg0 string) (arg1 gui-channel) (arg2 gui-action)) (let ((s2-0 (the-as gui-connection (-> obj engine alive-list next0)))) (-> obj engine) @@ -1413,7 +1199,7 @@ (or (= arg2 (gui-action none)) (= arg2 (-> s2-0 action))) (or (not arg0) (string= arg0 (-> s2-0 name))) ) - (return (the-as int (-> s2-0 id))) + (return (the-as sound-id (-> s2-0 id))) ) (set! s2-0 (the-as gui-connection s1-0)) (-> obj engine) @@ -1428,11 +1214,11 @@ (or (= arg2 (gui-action none)) (= arg2 (-> s1-1 action))) (or (not arg0) (string= arg0 (-> s1-1 name))) ) - (return (the-as int (-> s1-1 id))) + (return (the-as sound-id (-> s1-1 id))) ) ) ) - 0 + (the-as sound-id 0) ) (defmethod set-falloff! gui-control ((obj gui-control) (arg0 sound-id) (arg1 symbol) (arg2 int) (arg3 int) (arg4 int)) @@ -2516,6 +2302,9 @@ ) (set! (-> gp-0 cmd 69) '((65 . wait) (71 . wait) (67 . wait) (66 . wait))) (set! (-> gp-0 cmd 70) '((65 . wait) (90 . hide) (91 . hide) (81 . hide) (80 . hide))) + ;; added this one + (set! (-> gp-0 cmd (gui-channel subtitle-pc)) '(((the binteger (gui-channel blackout)) . wait) + )) (set! (-> gp-0 cmd 80) '((64 . wait) (65 . wait) (80 . wait) (70 . wait))) (set! (-> gp-0 cmd 81) '((64 . wait) (65 . wait) (81 . wait) (70 . wait))) (set! (-> gp-0 cmd 82) '((64 . wait) (65 . wait) (67 . wait) (71 . wait) (69 . wait) (82 . wait))) diff --git a/goal_src/jak2/engine/nav/nav-enemy.gc b/goal_src/jak2/engine/nav/nav-enemy.gc index d4e0dc08d3..64373b9069 100644 --- a/goal_src/jak2/engine/nav/nav-enemy.gc +++ b/goal_src/jak2/engine/nav/nav-enemy.gc @@ -551,7 +551,7 @@ ) (set! (-> s5-0 y) 0.0) (vector-normalize! s5-0 1.0) - + ;; modified for PC, see comment near definition in collide-shape-h.gc (normalized-heading-to-quaternion! (-> obj root-override2 quat) s5-0) ) @@ -956,7 +956,7 @@ ) (defmethod nav-enemy-method-161 nav-enemy ((obj nav-enemy)) - (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag39)))) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag not-frustrated)))) (set! (-> obj frustration-time) (current-time)) (let ((v1-7 (handle->process (-> obj focus handle)))) (if v1-7 @@ -982,7 +982,7 @@ (when (>= (- (current-time) (-> obj frustration-time)) (+ (-> obj reaction-time) (-> obj enemy-info-override frustration-time)) ) - (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag39) (-> obj enemy-flags)))) + (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag not-frustrated) (-> obj enemy-flags)))) 0 ) ) @@ -1522,7 +1522,7 @@ This commonly includes things such as: (defmethod go-stare nav-enemy ((obj nav-enemy)) (let ((s5-0 (-> obj focus aware))) (cond - ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) @@ -1542,7 +1542,7 @@ This commonly includes things such as: ) (defmethod go-hostile nav-enemy ((obj nav-enemy)) - (if (or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + (if (or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) @@ -1905,7 +1905,9 @@ This commonly includes things such as: ) ) ) - (when (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (when (and (-> self enemy-info-override use-frustration) + (logtest? (enemy-flag not-frustrated) (-> self enemy-flags)) + ) (if (-> self enemy-info-override use-stop-chase) (go-virtual stop-chase) (go-stare self) @@ -2094,7 +2096,9 @@ This commonly includes things such as: ) ((= gp-0 (enemy-aware enemy-aware-3)) (if (and (get-enemy-target self) - (not (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (not (and (-> self enemy-info-override use-frustration) + (logtest? (enemy-flag not-frustrated) (-> self enemy-flags)) + ) ) (>= (- (current-time) (-> self starting-time)) (-> self reaction-time)) ) diff --git a/goal_src/jak2/engine/process-drawable/process-focusable.gc b/goal_src/jak2/engine/process-drawable/process-focusable.gc index c1c00af613..6115a2c5a4 100644 --- a/goal_src/jak2/engine/process-drawable/process-focusable.gc +++ b/goal_src/jak2/engine/process-drawable/process-focusable.gc @@ -76,8 +76,8 @@ (-> (the-as collide-shape-moving gp-0) gspot-pos) ) ((and (or (= arg0 2) (= arg0 3)) (type? gp-0 collide-shape)) - ;; PC PORT NOTE : added lod-set check so we don't use invalid bones - (if (not (logtest? (-> obj draw status) (draw-control-status lod-set))) + ;; PC PORT NOTE : added check here so we don't use invalid bones + (if (logtest? (-> obj draw status) (draw-control-status uninited)) (-> gp-0 trans) (-> gp-0 root-prim prim-core)) ) diff --git a/goal_src/jak2/engine/process-drawable/process-taskable.gc b/goal_src/jak2/engine/process-drawable/process-taskable.gc index 9176520a54..46a40a4f2c 100644 --- a/goal_src/jak2/engine/process-drawable/process-taskable.gc +++ b/goal_src/jak2/engine/process-drawable/process-taskable.gc @@ -217,7 +217,7 @@ Seen take in - `true-func` which takes no args TODO - seems fishy ) ) ;; PC PORT NOTE : added check so we don't use the wrong position for the distance check - (and (logtest? (-> self draw status) (draw-control-status lod-set)) + (and (not (logtest? (-> self draw status) (draw-control-status uninited))) (< (vector-vector-distance (target-pos 0) s5-0) f30-0)) ) ) diff --git a/goal_src/jak2/engine/scene/scene.gc b/goal_src/jak2/engine/scene/scene.gc index a13000cfe0..28a6f44bc0 100644 --- a/goal_src/jak2/engine/scene/scene.gc +++ b/goal_src/jak2/engine/scene/scene.gc @@ -673,6 +673,10 @@ ) (let ((v1-9 (-> self skel root-channel 0 frame-group))) (when v1-9 + ;; send a movie-no-subtitle message so the pc subtitle system at least knows there's a movie playing + (#when PC_PORT + (if (= (-> self type) scene-player) + (send-event (ppointer->process *subtitle2*) 'movie-no-subtitle (-> (the scene-player self) anim name) #f (ja-aframe-num 0)))) (let ((gp-0 (res-lump-struct (-> v1-9 extra) 'subtitle-range (array subtitle-range)))) (when gp-0 (let ((f30-0 (ja-aframe-num 0)) @@ -716,7 +720,12 @@ (set! (-> s2-0 origin y) (+ 1.0 (-> s2-0 origin y))) (set! (-> s2-0 color) (font-color default)) (set! (-> s2-0 flags) (font-flags shadow kerning middle left large)) - (print-game-text (the-as string s3-0) s2-0 #f 44 (bucket-id subtitle)) + (#if PC_PORT + (if (or (!= (-> self type) scene-player) + (not (send-event (ppointer->process *subtitle2*) 'movie (-> (the scene-player self) anim name) s3-0 f30-0))) + (print-game-text (the-as string s3-0) s2-0 #f 44 (bucket-id subtitle))) + + (print-game-text (the-as string s3-0) s2-0 #f 44 (bucket-id subtitle))) (gui-control-method-12 *gui-control* self @@ -952,7 +961,7 @@ (gui-action none) ) ) - (v1-167 (get-status *gui-control* (the-as sound-id a1-26))) + (v1-167 (get-status *gui-control* a1-26)) ) (not (or (= v1-167 (gui-status ready)) (= v1-167 (gui-status active)))) ) @@ -1178,7 +1187,7 @@ (let ((v1-41 (scene-player-method-24 self (-> self scene-list (-> self scene-index)) #t))) (when v1-41 (let ((a0-21 (scene-decode-continue (the-as basic (-> v1-41 load-point-obj))))) - (set! a0-24 (when (and a0-21 (logtest? (-> a0-21 flags) (continue-flags cf1))) + (set! a0-24 (when (and a0-21 (logtest? (-> a0-21 flags) (continue-flags scene-wait))) (go-virtual wait a0-24) a0-24 ) @@ -1487,7 +1496,7 @@ (defbehavior scene-player-init scene-player ((arg0 object) (arg1 symbol) (arg2 string)) "`object` arg can be an `(array scene)`, `pair of scene` or a `scene`" (process-entity-set! self (the-as entity #f)) - (stack-size-set! (-> self main-thread) 1024) ;; changed from 512 + (stack-size-set! (-> self main-thread) 768) ;; changed from 512 (set! (-> self root) (new 'process 'trsqv)) (case (rtype-of arg0) ((array) diff --git a/goal_src/jak2/engine/target/target-death.gc b/goal_src/jak2/engine/target/target-death.gc index 22f86f100e..dedc9368b9 100644 --- a/goal_src/jak2/engine/target/target-death.gc +++ b/goal_src/jak2/engine/target/target-death.gc @@ -24,7 +24,7 @@ (a3-0 (car a2-2)) ) (while (not (null? a2-2)) - (if (and v1-0 (logtest? (continue-flags cf17) (-> (the-as continue-point a3-0) flags))) + (if (and v1-0 (logtest? (continue-flags test) (-> (the-as continue-point a3-0) flags))) (return (the-as continue-point a3-0)) ) (if (= a3-0 arg0) @@ -122,12 +122,12 @@ (if (-> *art-control* reserve-buffer) (reserve-free *art-control* (-> *art-control* reserve-buffer heap)) ) - (when (logtest? (-> arg0 flags) (continue-flags cf8 cf11)) + (when (logtest? (-> arg0 flags) (continue-flags demo demo-movie)) (set! (-> ctywide memory-mode) (load-buffer-mode small-edge)) 0 ) (kill-persister *setting-control* (the-as engine-pers 'fail) 'bg-a) - (when (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (when (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (add-setting! 'bg-a 'abs 1.0 0) (set! (-> *setting-control* user-current bg-a) 1.0) ) @@ -163,7 +163,7 @@ (if (not (string= (-> arg0 name) "default")) (set! *external-cam-mode* #f) ) - (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (if (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (cam-stop) ) (suspend) @@ -229,7 +229,7 @@ (set! (-> *level* border?) s5-2) ) (set! (-> *ACTOR-bank* birth-max) 1000) - (when (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (when (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (new 'stack 'transformq) (cam-start #t) (suspend) @@ -270,7 +270,7 @@ (set! *spawn-actors* #t) (set! *teleport* #t) (set! (-> *ACTOR-bank* birth-max) 1000) - (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (if (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (set-blackout-frames (seconds 0.1)) ) (let* ((a0-94 *game-info*) @@ -290,7 +290,7 @@ (t9-53 a0-94 a1-51 #f) ) (cond - ((logtest? (-> arg0 flags) (continue-flags cf5)) + ((logtest? (-> arg0 flags) (continue-flags game-start)) (case *kernel-boot-message* (('kiosk) (let ((s5-5 (ppointer->handle (auto-save-command 'restore 0 0 *default-pool* #f)))) @@ -306,27 +306,27 @@ ) ) ) - ((logtest? (-> arg0 flags) (continue-flags cf12)) + ((logtest? (-> arg0 flags) (continue-flags title)) (go target-title #t) ) - ((logtest? (-> arg0 flags) (continue-flags cf13)) + ((logtest? (-> arg0 flags) (continue-flags title-movie)) (go target-title #f) ) - ((logtest? (-> arg0 flags) (continue-flags cf8)) + ((logtest? (-> arg0 flags) (continue-flags demo)) (go target-demo #t) ) - ((logtest? (-> arg0 flags) (continue-flags cf11)) + ((logtest? (-> arg0 flags) (continue-flags demo-movie)) (go target-demo #f) ) - ((logtest? (-> arg0 flags) (continue-flags cf9)) + ((logtest? (-> arg0 flags) (continue-flags intro)) (intro-play) ) - ((logtest? (-> arg0 flags) (continue-flags cf10)) + ((logtest? (-> arg0 flags) (continue-flags hero-mode)) (logior! (-> self game secrets) (game-secrets hero-mode)) (logior! (-> self game purchase-secrets) (game-secrets hero-mode)) (intro-play) ) - ((logtest? (-> arg0 flags) (continue-flags cf7)) + ((logtest? (-> arg0 flags) (continue-flags warp-gate)) (let ((s5-7 (current-time))) (until (>= (- (current-time) s5-7) (seconds 0.05)) (suspend) @@ -342,22 +342,22 @@ ) ) ) - ((logtest? (continue-flags cf22) (-> arg0 flags)) + ((logtest? (continue-flags indax) (-> arg0 flags)) enter-state (go target-indax-start) ) - ((logtest? (continue-flags cf18) (-> arg0 flags)) + ((logtest? (continue-flags record-path) (-> arg0 flags)) ) - ((logtest? (continue-flags cf21) (-> arg0 flags)) + ((logtest? (continue-flags record-sig) (-> arg0 flags)) (start-sig-recorder) ) - ((logtest? (continue-flags cf19 cf20) (-> arg0 flags)) + ((logtest? (continue-flags pilot pilot-dax) (-> arg0 flags)) (set! (-> self focus-status) (logior (focus-status pilot) (-> self focus-status))) (while (not (-> self mode-cache)) (suspend) ) ) - ((logtest? (-> arg0 flags) (continue-flags cf6)) + ((logtest? (-> arg0 flags) (continue-flags demo-end)) (go target-grab 'stance) ) (else diff --git a/goal_src/jak2/engine/ui/gui-h.gc b/goal_src/jak2/engine/ui/gui-h.gc index b1b60080cc..1502bcd493 100644 --- a/goal_src/jak2/engine/ui/gui-h.gc +++ b/goal_src/jak2/engine/ui/gui-h.gc @@ -53,6 +53,7 @@ (subtitle 69) (supertitle 70) (notice-low 71) + (subtitle-pc 78) ;; custom (screen 79) (hud-upper-right 80) (hud-upper-left 81) @@ -138,7 +139,7 @@ (stop-str (_type_ gui-connection) int 11) (gui-control-method-12 (_type_ process gui-channel gui-action string int float sound-id) sound-id 12) (update (_type_ symbol) int 13) - (lookup-gui-connection-id (_type_ string gui-channel gui-action) int 14) + (lookup-gui-connection-id (_type_ string gui-channel gui-action) sound-id 14) (lookup-gui-connection (_type_ process gui-channel string sound-id) gui-connection 15) (set-action! (_type_ gui-action sound-id gui-channel gui-action string (function gui-connection symbol) process) int 16) (get-status (_type_ sound-id) gui-status 17) diff --git a/goal_src/jak2/engine/ui/text.gc b/goal_src/jak2/engine/ui/text.gc index 74074140e1..eebe033f5a 100644 --- a/goal_src/jak2/engine/ui/text.gc +++ b/goal_src/jak2/engine/ui/text.gc @@ -529,25 +529,11 @@ in a single text group and file." (set! sv-64 (+ sv-64 1)) ) (when (not arg2) - (let* ((s2-1 (-> *display* frames (-> *display* on-screen) global-buf)) - (s3-1 (-> s2-1 base)) - ) + (with-dma-buffer-add-bucket ((s2-1 (-> *display* frames (-> *display* on-screen) global-buf)) + arg4 + ) (draw-string *game-text-line* s2-1 arg1) (set! (-> arg1 color) (-> *font-work* last-color)) - (let ((a3-2 (-> s2-1 base))) - (let ((v1-121 (the-as object (-> s2-1 base)))) - (set! (-> (the-as dma-packet v1-121) dma) (new 'static 'dma-tag :id (dma-tag-id next))) - (set! (-> (the-as dma-packet v1-121) vif0) (new 'static 'vif-tag)) - (set! (-> (the-as dma-packet v1-121) vif1) (new 'static 'vif-tag)) - (set! (-> s2-1 base) (&+ (the-as pointer v1-121) 16)) - ) - (dma-bucket-insert-tag - (-> *display* frames (-> *display* on-screen) bucket-group) - arg4 - s3-1 - (the-as (pointer dma-tag) a3-2) - ) - ) ) ) (set! (-> arg1 origin y) f30-2) @@ -575,6 +561,9 @@ in a single text group and file." (set! (-> arg1 origin y) sv-20) (set! (-> arg1 flags) sv-24) (set! (-> arg1 color) sv-28) + (#when PC_PORT + (if (and *debug-segment* *display-text-box*) + (draw-debug-text-box arg1))) (if (> sv-64 0) (* sv-56 (the float sv-64)) 0.0 diff --git a/goal_src/jak2/game.gp b/goal_src/jak2/game.gp index 2433540a08..b55840ee97 100644 --- a/goal_src/jak2/game.gp +++ b/goal_src/jak2/game.gp @@ -90,14 +90,13 @@ ) (hash-table-set! *file-entry-map* "dir-tpages.go" #f) -(cgo-file "engine.gd" '("$OUT/obj/gcommon.o" "$OUT/obj/gstate.o" "$OUT/obj/gstring.o" "$OUT/obj/gkernel.o")) (cgo-file "game.gd" '("$OUT/obj/gcommon.o" "$OUT/obj/gstate.o" "$OUT/obj/gstring.o" "$OUT/obj/gkernel.o")) ;; note: some of these dependencies are slightly wrong because cgo-file doesn't really handle ;; the case of a .o appearing in multiple dgos. But, if we depend on the last item in both lists, it ;; works out. -(define common-dep '("$OUT/obj/cty-guard-turret-button.o" "$OUT/obj/default-menu.o")) +(define common-dep '("$OUT/obj/cty-guard-turret-button.o" "$OUT/obj/default-menu-pc.o")) (cgo-file "cwi.gd" common-dep) (cgo-file "lmeetbrt.gd" common-dep) (cgo-file "cta.gd" common-dep) @@ -339,6 +338,11 @@ "$OUT/iso/7COMMON.TXT") ) +(defstep :in "game/assets/jak2/game_subtitle.gp" + :tool 'subtitle2 + :out '("$OUT/iso/0SUBTI2.TXT") + ) + ;;;;;;;;;;;;;;;;;;;;; ;; ISO Group ;;;;;;;;;;;;;;;;;;;;; @@ -346,6 +350,14 @@ (group-list "iso" `("$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" + "$OUT/iso/7COMMON.TXT" + "$OUT/iso/0SUBTI2.TXT" "$OUT/iso/TWEAKVAL.MUS" "$OUT/iso/VAGDIR.AYB" ,@(reverse *all-vis*) @@ -357,7 +369,16 @@ ) (group-list "text" - `("$OUT/iso/0COMMON.TXT") + `("$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" + "$OUT/iso/7COMMON.TXT" + "$OUT/iso/0SUBTI2.TXT" + ) ) ;; used for the type consistency test. @@ -366,6 +387,8 @@ ) (group "engine" + "$OUT/iso/0COMMON.TXT" + "$OUT/iso/0SUBTI2.TXT" "$OUT/iso/KERNEL.CGO" "$OUT/iso/GAME.CGO" ) diff --git a/goal_src/jak2/kernel/gkernel-h.gc b/goal_src/jak2/kernel/gkernel-h.gc index 293548a4c4..551fa564bf 100644 --- a/goal_src/jak2/kernel/gkernel-h.gc +++ b/goal_src/jak2/kernel/gkernel-h.gc @@ -675,12 +675,12 @@ (defmacro process-mask-set! (mask &rest enum-value) "Set the given bits in the process mask" - `(set! ,mask (logior ,mask (process-mask ,@enum-value))) + `(logior! ,mask (process-mask ,@enum-value)) ) (defmacro process-mask-clear! (mask &rest enum-value) "Clear the given bits in the process mask." - `(set! ,mask (logand ,mask (lognot (process-mask ,@enum-value)))) + `(logclear! ,mask (process-mask ,@enum-value)) ) (defmacro suspend () @@ -730,6 +730,23 @@ `(method-set! ,method-type ,method-id (__pc-get-mips2c ,name)) ) +(defmacro kheap-alloc (heap size) + "allocate space for a kheap" + `(let ((heap ,heap) (size ,size)) + (set! (-> heap base) (malloc 'global size)) + (set! (-> heap current) (-> heap base)) + (set! (-> heap top-base) (&+ (-> heap base) size)) + (set! (-> heap top) (-> heap top-base)) + ) + ) + +(defmacro kheap-reset (heap) + "reset the kheap, so you can use its memory again" + `(let ((heap ,heap)) + (set! (-> heap current) (-> heap base)) + ) + ) + (defmacro scratchpad-object (type &key (offset 0)) "Access an object on the scratchpad." `(the-as ,type (&+ *fake-scratchpad-data* ,offset)) diff --git a/goal_src/jak2/kernel/gkernel.gc b/goal_src/jak2/kernel/gkernel.gc index 9da2fb2bc9..38af57072e 100644 --- a/goal_src/jak2/kernel/gkernel.gc +++ b/goal_src/jak2/kernel/gkernel.gc @@ -2479,6 +2479,8 @@ ;; categories within the active pool. (change-parent (define *display-pool* (new 'global 'process-tree "display-pool")) *active-pool*) +(#when PC_PORT +(change-parent (define *pc-pool* (new 'global 'process-tree "pc-pool")) *active-pool*)) (change-parent (define *camera-pool* (new 'global 'process-tree "camera-pool")) *active-pool*) (set! (-> *camera-pool* mask) (process-mask freeze pause menu progress process-tree camera)) diff --git a/goal_src/jak2/levels/atoll/atoll-scenes.gc b/goal_src/jak2/levels/atoll/atoll-scenes.gc index a4a14a969c..c7dd985bdc 100644 --- a/goal_src/jak2/levels/atoll/atoll-scenes.gc +++ b/goal_src/jak2/levels/atoll/atoll-scenes.gc @@ -1245,7 +1245,7 @@ :end-point-obj (new 'static 'continue-point :name "atoll-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2277804.5 :y 217672.9 :z -4571725.5 :w 1.0) :quat (new 'static 'vector :y -0.9671 :w 0.2541) :camera-trans (new 'static 'vector :x 2310242.8 :y 251249.05 :z -4513428.0 :w 1.0) @@ -1651,7 +1651,7 @@ :end-point-obj (new 'static 'continue-point :name "atoll-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2277804.5 :y 217672.9 :z -4571725.5 :w 1.0) :quat (new 'static 'vector :y -0.9671 :w 0.2541) :camera-trans (new 'static 'vector :x 2310242.8 :y 251249.05 :z -4513428.0 :w 1.0) diff --git a/goal_src/jak2/levels/city/common/ctywide-scenes.gc b/goal_src/jak2/levels/city/common/ctywide-scenes.gc index b9eb01c141..d173647b70 100644 --- a/goal_src/jak2/levels/city/common/ctywide-scenes.gc +++ b/goal_src/jak2/levels/city/common/ctywide-scenes.gc @@ -624,7 +624,7 @@ :end-point-obj (new 'static 'continue-point :name "ctyslumb-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2620227.2 :y 31333.99 :z -400654.34 :w 1.0) :quat (new 'static 'vector :y 0.9997 :w -0.0234) :camera-trans (new 'static 'vector :x 2606159.8 :y 52533.656 :z -360011.78 :w 1.0) @@ -797,7 +797,7 @@ :end-point-obj (new 'static 'continue-point :name "ctyslumb-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2588147.8 :y 32754.482 :z -150693.89 :w 1.0) :quat (new 'static 'vector :x -0.0012 :y -0.9819 :z -0.0008 :w 0.1889) :camera-trans (new 'static 'vector :x 2593185.8 :y 51852.492 :z -107130.88 :w 1.0) diff --git a/goal_src/jak2/levels/city/market/east/ashelin/ctyasha-obs.gc b/goal_src/jak2/levels/city/market/east/ashelin/ctyasha-obs.gc index 570e084c9c..f0277a4368 100644 --- a/goal_src/jak2/levels/city/market/east/ashelin/ctyasha-obs.gc +++ b/goal_src/jak2/levels/city/market/east/ashelin/ctyasha-obs.gc @@ -2010,7 +2010,7 @@ This commonly includes things such as: :end-point-obj (new 'static 'continue-point :name "ctymarkb-tanker" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1928400.1 :y 34444.902 :z 1788676.5 :w 1.0) :quat (new 'static 'vector :y 0.3641 :w -0.9313) :camera-trans (new 'static 'vector :x 1960564.4 :y 55543.81 :z 1760002.0 :w 1.0) diff --git a/goal_src/jak2/levels/common/ai/bot.gc b/goal_src/jak2/levels/common/ai/bot.gc index e0f8e294d6..243a9990d2 100644 --- a/goal_src/jak2/levels/common/ai/bot.gc +++ b/goal_src/jak2/levels/common/ai/bot.gc @@ -1292,10 +1292,7 @@ If the player is too far, play a warning speech." (let ((speech (-> obj course speeches idx))) (= (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (-> speech name) (gui-channel none) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (-> speech name) (gui-channel none) (gui-action none)) ) (gui-status unknown) ) @@ -1316,10 +1313,7 @@ If the player is too far, play a warning speech." ) (nonzero? (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (the-as string #f) (the-as gui-channel channel) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (the-as string #f) (the-as gui-channel channel) (gui-action none)) ) ) ) diff --git a/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc b/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc index cb9ba574e2..afbf5d2a09 100644 --- a/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc +++ b/goal_src/jak2/levels/common/enemy/amphibian/amphibian.gc @@ -827,7 +827,7 @@ (defmethod go-stare amphibian ((obj amphibian)) (let ((s5-0 (-> obj focus aware))) (cond - ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) diff --git a/goal_src/jak2/levels/common/enemy/guards/guard-conversation.gc b/goal_src/jak2/levels/common/enemy/guards/guard-conversation.gc index e946f3cad8..ea0d6d3884 100644 --- a/goal_src/jak2/levels/common/enemy/guards/guard-conversation.gc +++ b/goal_src/jak2/levels/common/enemy/guards/guard-conversation.gc @@ -296,10 +296,7 @@ ) (if (nonzero? (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) ) ) (set! (-> self last-playing-time) (current-time)) @@ -348,10 +345,7 @@ ) (until (= (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) ) (gui-status unknown) ) diff --git a/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc b/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc index 3761d5f2e7..8ed73ca155 100644 --- a/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc +++ b/goal_src/jak2/levels/common/enemy/hover/crimson-guard-hover.gc @@ -474,7 +474,7 @@ (kick-attack () _type_ :state 158) (attack () _type_ :state 159) (die-now () _type_ :state 160) - (shoot (_type_ vector projectile-init-by-other-params int float float) none 161) + (shoot (_type_ vector projectile-init-by-other-params int int float) none 161) (crimson-guard-hover-method-162 (_type_ process-focusable) symbol 162) ) ) @@ -671,8 +671,8 @@ (set! (-> s5-0 attack-id) a0-6) ) (set! (-> s5-0 timeout) (seconds 4)) - (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) - (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + (shoot self gp-0 s5-0 9 12 1.0) + (shoot self gp-0 s5-0 11 12 -1.0) ) (sound-play "hover-fire") (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) @@ -866,8 +866,8 @@ (set! (-> s5-0 attack-id) a0-6) ) (set! (-> s5-0 timeout) (seconds 4)) - (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) - (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + (shoot self gp-0 s5-0 9 12 1.0) + (shoot self gp-0 s5-0 11 12 -1.0) ) (sound-play "hover-fire") (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) @@ -1604,7 +1604,7 @@ (arg0 vector) (arg1 projectile-init-by-other-params) (arg2 int) - (arg3 float) + (arg3 int) (arg4 float) ) (vector<-cspace! (-> arg1 pos) (-> obj node-list data arg2)) diff --git a/goal_src/jak2/levels/common/races/race-manager.gc b/goal_src/jak2/levels/common/races/race-manager.gc index 53336ba28e..df533dc5a1 100644 --- a/goal_src/jak2/levels/common/races/race-manager.gc +++ b/goal_src/jak2/levels/common/races/race-manager.gc @@ -1010,7 +1010,7 @@ (let* ((gp-0 (-> obj race-state)) (s3-0 (-> gp-0 info)) ) - (if (or (logtest? (-> s3-0 flags) 2) (logtest? (continue-flags cf19) (-> *game-info* last-continue flags))) + (if (or (logtest? (-> s3-0 flags) 2) (logtest? (continue-flags pilot) (-> *game-info* last-continue flags))) (logior! (-> gp-0 flags) 2) ) (let ((s4-0 (new 'stack-no-clear 'mystery-traffic-object-spawn-params))) @@ -1249,17 +1249,9 @@ (defmethod race-manager-method-24 race-manager ((obj race-manager)) (when (= (get-status *gui-control* (-> obj message-id)) (gui-status active)) - (let ((gp-1 (new - 'stack - 'font-context - *font-default-matrix* - 70 - 20 - 0.0 - (font-color orange) - (font-flags shadow kerning) - ) - ) + (let ((gp-1 + (new 'stack 'font-context *font-default-matrix* 70 20 0.0 (font-color orange) (font-flags shadow kerning)) + ) ) (let ((v1-4 gp-1)) (set! (-> v1-4 scale) 0.7) @@ -1285,17 +1277,9 @@ (defmethod race-manager-method-25 race-manager ((obj race-manager)) (when (= (get-status *gui-control* (-> obj message-id)) (gui-status active)) - (let ((gp-1 (new - 'stack - 'font-context - *font-default-matrix* - 70 - 20 - 0.0 - (font-color orange) - (font-flags shadow kerning) - ) - ) + (let ((gp-1 + (new 'stack 'font-context *font-default-matrix* 70 20 0.0 (font-color orange) (font-flags shadow kerning)) + ) ) (let ((v1-4 gp-1)) (set! (-> v1-4 scale) 0.7) diff --git a/goal_src/jak2/levels/common/warp-gate.gc b/goal_src/jak2/levels/common/warp-gate.gc index 4ae079da7e..cbd680c555 100644 --- a/goal_src/jak2/levels/common/warp-gate.gc +++ b/goal_src/jak2/levels/common/warp-gate.gc @@ -690,7 +690,7 @@ (ja :num! (loop!)) (ja-post) ) - (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (if (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (set-blackout-frames (seconds 0.05)) ) (start 'play arg0) diff --git a/goal_src/jak2/levels/drill_platform/ginsu.gc b/goal_src/jak2/levels/drill_platform/ginsu.gc index baacceb898..35751d43e8 100644 --- a/goal_src/jak2/levels/drill_platform/ginsu.gc +++ b/goal_src/jak2/levels/drill_platform/ginsu.gc @@ -920,7 +920,7 @@ (defmethod go-hostile ginsu ((obj ginsu)) (cond - ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) diff --git a/goal_src/jak2/levels/mars_tomb/monster-frog.gc b/goal_src/jak2/levels/mars_tomb/monster-frog.gc index 3dbbfea490..9fd55835ec 100644 --- a/goal_src/jak2/levels/mars_tomb/monster-frog.gc +++ b/goal_src/jak2/levels/mars_tomb/monster-frog.gc @@ -559,7 +559,9 @@ ) ) ) - (when (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (when (and (-> self enemy-info-override use-frustration) + (logtest? (enemy-flag not-frustrated) (-> self enemy-flags)) + ) (if (-> self enemy-info-override use-stop-chase) (go-virtual stop-chase) (go-stare self) diff --git a/goal_src/jak2/levels/mars_tomb/tomb-water.gc b/goal_src/jak2/levels/mars_tomb/tomb-water.gc index bf04fd7e5d..6ee65af3d2 100644 --- a/goal_src/jak2/levels/mars_tomb/tomb-water.gc +++ b/goal_src/jak2/levels/mars_tomb/tomb-water.gc @@ -588,7 +588,9 @@ This commonly includes things such as: ) ) (when (>= (- (current-time) (-> self state-time)) (seconds 4)) - (if (and *target* (focus-test? *target* grabbed)) + (if (and *target* (focus-test? *target* grabbed) + ;; pc port note : added this check to make the beetle button not break everything!! + (< (vector-vector-xz-distance (-> *target* control trans) (-> self root-override trans)) (meters 10))) (process-release? *target*) ) (if (and *target* @@ -1839,7 +1841,7 @@ This commonly includes things such as: (deftype tomb-vibe (process-drawable) ((spawn-pos vector :inline :offset-assert 208) - (pat-tbl (array handle) :offset-assert 224) + (pat-tbl (pointer int32) :offset-assert 224) (pat-count int32 :offset-assert 228) (pat-index int32 :offset-assert 232) (pat-entry-index int32 :offset-assert 236) @@ -1932,16 +1934,14 @@ This commonly includes things such as: (case (-> (the-as attack-info (-> event param 1)) mode) (('flop 'spin 'punch) (cond - ((and (= (-> v1-0 0) (-> (the-as (pointer int32) (+ (the-as uint (-> self pat-tbl)) (* (-> self pat-index) 4))))) - (!= (-> gp-0 0) (process->handle self)) - ) + ((and (= (-> v1-0 0) (-> self pat-tbl (-> self pat-index))) (!= (-> gp-0 0) (process->handle self))) (send-event (handle->process (-> gp-0 0)) 'interrupt) (send-event (handle->process (-> gp-0 0)) 'die) (logior! (-> self flags) 1) (go-virtual vibrate) ) (else - (set! (-> v1-0 0) (-> (the-as (pointer int32) (+ (the-as uint (-> self pat-tbl)) (* (-> self pat-index) 4))))) + (set! (-> v1-0 0) (-> self pat-tbl (-> self pat-index))) (set! (-> gp-0 0) (process->handle self)) (go-virtual vibrate) ) @@ -2071,7 +2071,7 @@ This commonly includes things such as: 'sound-tune #f 0.0 - (+ (-> (the-as (pointer int32) (+ (the-as uint (-> self pat-tbl)) (* (-> self pat-index) 4)))) 18) + (+ (-> self pat-tbl (-> self pat-index)) 18) ) (let ((gp-1 (current-time))) (until (>= (- (current-time) gp-1) (seconds 0.2)) @@ -2227,11 +2227,11 @@ This commonly includes things such as: (let ((v1-26 (res-lump-data (-> obj entity) 'vibe-pattern pointer :tag-ptr (& sv-16)))) (cond ((and v1-26 (nonzero? (-> sv-16 elt-count))) - (set! (-> obj pat-tbl) (the-as (array handle) v1-26)) + (set! (-> obj pat-tbl) (the-as (pointer int32) v1-26)) (set! (-> obj pat-count) (the-as int (-> sv-16 elt-count))) ) (else - (set! (-> obj pat-tbl) #f) + (set! (-> obj pat-tbl) (the-as (pointer int32) #f)) (set! (-> obj pat-count) 0) 0 ) diff --git a/goal_src/jak2/levels/palace/roof/palboss-scenes.gc b/goal_src/jak2/levels/palace/roof/palboss-scenes.gc index 5bcf24acd2..ec55c78f02 100644 --- a/goal_src/jak2/levels/palace/roof/palboss-scenes.gc +++ b/goal_src/jak2/levels/palace/roof/palboss-scenes.gc @@ -512,7 +512,7 @@ :load-point-obj (new 'static 'continue-point :name "palroof-boss" :level #f - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 870794.06 :y 1671154.9 :z 2027482.4 :w 1.0) :quat (new 'static 'vector :y 0.4793 :w 0.8776) :camera-trans (new 'static 'vector :x 831816.06 :y 1693132.0 :z 2045632.9 :w 1.0) diff --git a/goal_src/jak2/levels/sewer/sewer-obs2.gc b/goal_src/jak2/levels/sewer/sewer-obs2.gc index 9a12ee907e..13ca4a81a5 100644 --- a/goal_src/jak2/levels/sewer/sewer-obs2.gc +++ b/goal_src/jak2/levels/sewer/sewer-obs2.gc @@ -1428,7 +1428,7 @@ This commonly includes things such as: (deftype sew-scare-grunt (grunt) ((anim spool-anim :offset-assert 692) (manipy (pointer manipy) :offset-assert 696) - (spooled-sound-id uint32 :offset-assert 700) + (spooled-sound-id sound-id :offset-assert 700) (grill-actor entity-actor :offset-assert 704) ) :heap-base #x250 @@ -1649,10 +1649,7 @@ This commonly includes things such as: ) ) (set! (-> self spooled-sound-id) - (the-as - uint - (lookup-gui-connection-id *gui-control* (-> self anim name) (gui-channel art-load) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (-> self anim name) (gui-channel art-load) (gui-action none)) ) (none) ) @@ -1711,7 +1708,7 @@ This commonly includes things such as: (when *sound-player-enable* (let ((set-sound-param (the-as sound-rpc-set-param (get-sound-buffer-entry)))) (set! (-> set-sound-param command) (sound-command set-param)) - (set! (-> set-sound-param id) (the-as sound-id (-> self spooled-sound-id))) + (set! (-> set-sound-param id) (-> self spooled-sound-id)) (set! (-> set-sound-param params volume) (the int (* 1024.0 scale))) (let ((position (-> self root-override2 trans))) (let ((_self self)) diff --git a/goal_src/jak2/levels/sewer/sewer-scenes.gc b/goal_src/jak2/levels/sewer/sewer-scenes.gc index 9b207aaaa0..35086d916d 100644 --- a/goal_src/jak2/levels/sewer/sewer-scenes.gc +++ b/goal_src/jak2/levels/sewer/sewer-scenes.gc @@ -906,7 +906,7 @@ :end-point-obj (new 'static 'continue-point :name "sewesc-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 5541148.0 :y -363968.9 :z 2435194.5 :w 1.0) :quat (new 'static 'vector :y 0.0482 :w 0.9988) :camera-trans (new 'static 'vector :x 5518817.0 :y -344878.7 :z 2399633.5 :w 1.0) @@ -1175,7 +1175,7 @@ :end-point-obj (new 'static 'continue-point :name "sewesc-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 5608474.5 :y -363960.3 :z 1988017.4 :w 1.0) :quat (new 'static 'vector :y -0.6775 :w -0.7354) :camera-trans (new 'static 'vector :x 5562796.5 :y -344327.78 :z 1985962.4 :w 1.0) diff --git a/goal_src/jak2/levels/underport/under-scenes.gc b/goal_src/jak2/levels/underport/under-scenes.gc index 7855aae702..e0defd76a1 100644 --- a/goal_src/jak2/levels/underport/under-scenes.gc +++ b/goal_src/jak2/levels/underport/under-scenes.gc @@ -765,7 +765,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -281437.8 :y -266239.6 :z 7897175.0 :w 1.0) :quat (new 'static 'vector :y -0.0077 :w 0.9999) :camera-trans (new 'static 'vector :x -251373.16 :y -249839.2 :z 7882176.0 :w 1.0) @@ -1501,7 +1501,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -277934.5 :y -273739.38 :z 8274381.0 :w 1.0) :quat (new 'static 'vector :y 0.1135 :w -0.9935) :camera-trans (new 'static 'vector :x -251817.98 :y -252642.1 :z 8230336.0 :w 1.0) @@ -2324,7 +2324,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -912500.75 :y -274436.5 :z 8332461.5 :w 1.0) :quat (new 'static 'vector :y -0.9997 :w 0.0214) :camera-trans (new 'static 'vector :x -910896.3 :y -257269.77 :z 8368969.0 :w 1.0) @@ -2949,7 +2949,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -934223.06 :y -290824.2 :z 7948726.0 :w 1.0) :quat (new 'static 'vector :y 0.4849 :w 0.8745) :camera-trans (new 'static 'vector :x -978344.75 :y -270091.06 :z 7925256.5 :w 1.0) diff --git a/goal_src/jak2/levels/underport/underb-master.gc b/goal_src/jak2/levels/underport/underb-master.gc index ada0b29db0..a3b7991709 100644 --- a/goal_src/jak2/levels/underport/underb-master.gc +++ b/goal_src/jak2/levels/underport/underb-master.gc @@ -5,6 +5,16 @@ ;; name in dgo: underb-master ;; dgos: UNB +(defenum under-locking-mode + :type int64 + (want-mech) + (want-fill) + (airlock-wait) + (want-drain) + (drain) + (want-exit-mech) + ) + ;; DECOMP BEGINS (deftype under-warp (process-drawable) @@ -84,7 +94,6 @@ (s5-0 (new 'stack-no-clear 'vector)) (gp-0 (new 'stack-no-clear 'vector)) (f30-0 4096.0) - (ratio (- 1.0 (/ 0.5 (-> *pc-settings* aspect-ratio-scale)))) ) ;; changed for PC port: resize warp effect based on aspect ratio (let ((f0-4 (* 0.00013563369 (tan (* 0.5 (-> *math-camera* fov))) f30-0))) @@ -636,9 +645,9 @@ ((id int8 :offset-assert 200) (up-y float :offset-assert 204) (down-y float :offset-assert 208) - (mode uint64 :offset-assert 216) + (mode under-locking-mode :offset-assert 216) (which-reminder? symbol :offset-assert 224) - (spooled-sound-id uint32 :offset-assert 228) + (spooled-sound-id sound-id :offset-assert 228) (draining-part sparticle-launch-control :offset-assert 232) (actor-group (pointer actor-group) :offset-assert 236) (spooled-sound-delay int32 :offset-assert 240) @@ -721,7 +730,7 @@ (let ((a1-6 *target*)) (cond ((and a1-6 (focus-test? a1-6 mech)) - (set! (-> self mode) (the-as uint 3)) + (set! (-> self mode) (under-locking-mode want-drain)) (let ((a1-8 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-8 from) (process->ppointer self)) (set! (-> a1-8 num-params) 1) @@ -740,7 +749,7 @@ ) ) (else - (set! (-> self mode) (the-as uint 0)) + (set! (-> self mode) (under-locking-mode want-mech)) (let ((a1-9 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-9 from) (process->ppointer self)) (set! (-> a1-9 num-params) 1) @@ -781,14 +790,14 @@ (let ((v1-1 (-> self mode))) (cond ((-> event param 0) - (when (or (zero? v1-1) (= v1-1 5)) + (when (or (= v1-1 (under-locking-mode want-mech)) (= v1-1 (under-locking-mode want-exit-mech))) (let ((a0-4 *target*)) (and a0-4 (not (logtest? (focus-status mech) (-> a0-4 focus-status)))) ) ) ) (else - (or (= v1-1 2) (= v1-1 3)) + (or (= v1-1 (under-locking-mode airlock-wait)) (= v1-1 (under-locking-mode want-drain))) ) ) ) @@ -796,80 +805,78 @@ ) ) :trans (behavior () - (let ((v1-0 (-> self mode))) - (cond - ((zero? v1-0) - (let ((v1-1 *target*) - (a0-1 (-> self actor-group)) + (case (-> self mode) + (((under-locking-mode want-mech)) + (let ((v1-1 *target*) + (a0-1 (-> self actor-group)) + ) + (when (and v1-1 a0-1) + (if (and (-> a0-1 0 data 0 actor) + (focus-test? v1-1 mech) + (send-event (ppointer->process *underb-master*) 'request 'mech #t) + ) + (set! (-> self mode) (under-locking-mode want-fill)) ) - (when (and v1-1 a0-1) - (if (and (-> a0-1 0 data 0 actor) - (focus-test? v1-1 mech) - (send-event (ppointer->process *underb-master*) 'request 'mech #t) + ) + ) + ) + (((under-locking-mode want-fill)) + (if (not (logtest? (-> self actor-group 0 data 0 actor extra perm status) (entity-perm-status subtask-complete))) + (go-virtual filling) + ) + ) + (((under-locking-mode airlock-wait)) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 0) + (set! (-> a1-2 message) 'front) + (let ((t9-2 send-event-function) + (v1-24 (-> self actor-group 0 data 1 actor)) + ) + (if (not (t9-2 + (if v1-24 + (-> v1-24 extra process) + ) + a1-2 ) - (set! (-> self mode) (the-as uint 1)) - ) - ) + ) + (set! (-> self mode) (under-locking-mode want-drain)) + ) ) ) - ((= v1-0 1) - (if (not (logtest? (-> self actor-group 0 data 0 actor extra perm status) (entity-perm-status subtask-complete))) - (go-virtual filling) - ) - ) - ((= v1-0 2) - (let ((a1-2 (new 'stack-no-clear 'event-message-block))) - (set! (-> a1-2 from) (process->ppointer self)) - (set! (-> a1-2 num-params) 0) - (set! (-> a1-2 message) 'front) - (let ((t9-2 send-event-function) - (v1-24 (-> self actor-group 0 data 1 actor)) - ) - (if (not (t9-2 - (if v1-24 - (-> v1-24 extra process) - ) - a1-2 - ) - ) - (set! (-> self mode) (the-as uint 3)) - ) - ) + ) + (((under-locking-mode want-drain)) + (if (>= 20480.0 (vector-vector-xz-distance (target-pos 0) (-> self root trans))) + (set! (-> self mode) (under-locking-mode drain)) + ) + ) + (((under-locking-mode drain)) + (go-virtual draining) + ) + (((under-locking-mode want-exit-mech)) + (let ((a1-4 *target*)) + (when (or (not a1-4) (not (logtest? (focus-status mech) (-> a1-4 focus-status)))) + (set! (-> self mode) (under-locking-mode want-mech)) + 0 ) ) - ((= v1-0 3) - (if (>= 20480.0 (vector-vector-xz-distance (target-pos 0) (-> self root trans))) - (set! (-> self mode) (the-as uint 4)) - ) - ) - ((= v1-0 4) - (go-virtual draining) - ) - ((= v1-0 5) - (let ((a1-4 *target*)) - (when (or (not a1-4) (not (logtest? (focus-status mech) (-> a1-4 focus-status)))) - (set! (-> self mode) (the-as uint 0)) - 0 - ) - ) - (when (>= (- (current-time) (-> self last-reminder-time)) (seconds 9)) - (set! (-> self last-reminder-time) (current-time)) - (add-process - *gui-control* - self - (gui-channel ashelin) - (gui-action play) - (if (-> self which-reminder?) - "cityv193" - "cityv192" - ) - -99.0 - 0 - ) - (set! (-> self which-reminder?) (not (-> self which-reminder?))) + (when (>= (- (current-time) (-> self last-reminder-time)) (seconds 9)) + (set! (-> self last-reminder-time) (current-time)) + (add-process + *gui-control* + self + (gui-channel ashelin) + (gui-action play) + (if (-> self which-reminder?) + "cityv193" + "cityv192" + ) + -99.0 + 0 ) + (set! (-> self which-reminder?) (not (-> self which-reminder?))) ) - ) + ) ) (none) ) @@ -881,7 +888,7 @@ :event (-> (method-of-type under-locking active) event) :enter (behavior () (set! (-> self spooled-sound-id) - (the-as uint (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrfill" -99.0 0)) + (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrfill" -99.0 0) ) (set! (-> self state-time) 0) (set! (-> self spooled-sound-delay) (if (= (-> self id) 1) @@ -893,7 +900,7 @@ ) :trans (behavior () (when (and (zero? (-> self state-time)) - (= (get-status *gui-control* (the-as sound-id (-> self spooled-sound-id))) (gui-status ready)) + (= (get-status *gui-control* (-> self spooled-sound-id)) (gui-status ready)) ) (set! (-> self state-time) (current-time)) (set! (-> self last-reminder-time) (current-time)) @@ -905,7 +912,7 @@ (set-action! *gui-control* (gui-action play) - (the-as sound-id (-> self spooled-sound-id)) + (-> self spooled-sound-id) (gui-channel none) (gui-action none) (the-as string #f) @@ -974,7 +981,7 @@ (persist-with-delay *setting-control* 'interp-time (seconds 0.05) 'interp-time 'abs 0.0 0) (remove-setting! 'entity-name) (send-event (ppointer->process *underb-master*) 'request 'under-warp #t) - (set! (-> self mode) (the-as uint 2)) + (set! (-> self mode) (under-locking-mode airlock-wait)) (go-virtual active) ) ) @@ -991,7 +998,7 @@ :event (-> (method-of-type under-locking active) event) :enter (behavior () (set! (-> self spooled-sound-id) - (the-as uint (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrdrain" -99.0 0)) + (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrdrain" -99.0 0) ) (set! (-> self state-time) 0) 0 @@ -999,14 +1006,14 @@ ) :trans (behavior () (when (and (zero? (-> self state-time)) - (= (get-status *gui-control* (the-as sound-id (-> self spooled-sound-id))) (gui-status ready)) + (= (get-status *gui-control* (-> self spooled-sound-id)) (gui-status ready)) ) (set! (-> self state-time) (current-time)) (set! (-> self last-reminder-time) (current-time)) (set-action! *gui-control* (gui-action play) - (the-as sound-id (-> self spooled-sound-id)) + (-> self spooled-sound-id) (gui-channel none) (gui-action none) (the-as string #f) @@ -1074,7 +1081,7 @@ ) (when v1-26 (when (= (-> (the-as water-anim v1-26) root trans y) (-> self down-y)) - (set! (-> self mode) (the-as uint 5)) + (set! (-> self mode) (under-locking-mode want-exit-mech)) (send-event (ppointer->process *underb-master*) 'request 'mech #f) (set! (-> self which-reminder?) #f) (go-virtual active) @@ -1098,7 +1105,7 @@ This commonly includes things such as: - sounds" (local-vars (sv-16 res-tag)) (set! (-> obj which-reminder?) #f) - (set! (-> obj spooled-sound-id) (the-as uint 0)) + (set! (-> obj spooled-sound-id) (new 'static 'sound-id)) (set! (-> obj root) (new 'process 'trsqv)) (process-drawable-from-entity! obj arg0) (set! (-> obj id) (res-lump-value arg0 'extra-id int :time -1000000000.0)) diff --git a/goal_src/jak2/pc/debug/default-menu-pc.gc b/goal_src/jak2/pc/debug/default-menu-pc.gc index 02cb56f1b3..81a995748d 100644 --- a/goal_src/jak2/pc/debug/default-menu-pc.gc +++ b/goal_src/jak2/pc/debug/default-menu-pc.gc @@ -463,16 +463,8 @@ ) ) -;; (defun dm-subtitle-language ((blang int) (msg debug-menu-msg)) -;; (let ((lang (the pc-subtitle-lang (/ blang 8)))) -;; (when (= msg (debug-menu-msg press)) -;; (set! (-> *pc-settings* subtitle-language) lang)) -;; (= (-> *pc-settings* subtitle-language) lang) -;; ) -;; ) -;; ;; (defun dm-text-language ((blang int) (msg debug-menu-msg)) -;; (let ((lang (the pc-subtitle-lang (/ blang 8)))) +;; (let ((lang (the pc-language (/ blang 8)))) ;; (when (= msg (debug-menu-msg press)) ;; (set! (-> *pc-settings* text-language) lang)) ;; (= (-> *pc-settings* text-language) lang) @@ -712,208 +704,34 @@ ) -(defun sort-string-array ((arr (array string)) (compare-func (function string string object))) - "Sort an array, using compare-func to compare elements. - The comparison function can return either an integer or a true/false. - For integers, use a positive number to represent first > second - Ex: (sort lst -) will sort in ascending order - For booleans, you must explicitly use #t and not a truthy value. - Ex: (sort my-list (lambda ((x int) (y int)) (< x y))) will sort ascending. - NOTE: if you use an integer, don't accidentally return #t" - (let ((sorted -1)) - (while (nonzero? sorted) - (set! sorted 0) - (dotimes (i (1- (-> arr allocated-length))) - (let* ((cur (-> arr i)) - (next (-> arr (1+ i))) - (result (compare-func cur next)) - ) - (when (and (or (not result) (> (the-as int result) 0)) (!= result #t)) - (+! sorted 1) - (set! (-> arr i) next) - (set! (-> arr (1+ i)) cur) - ) - ) - ) - ) - ) - arr - ) - -(define *vag-play-menu* (the debug-menu #f)) -(define *vag-player* (the (pointer process) #f)) -(define *vagdir-names-list* (alloc-vagdir-names 'debug)) - -(defun alloc-vag-list () - "allocates and returns a boxed array with all of the vag names as strings, sorted" - (let ((list (new 'debug 'boxed-array string (the int (-> *vagdir-names-list* -1))))) - - ;; for each vag... - (dotimes (i (-> list allocated-length)) - ;; write the vag name (64 bits) into the string directly and add a null character - (set! (-> (the (pointer uint64) (-> *temp-string* data))) (-> *vagdir-names-list* i)) - (set! (-> *temp-string* data 8) 0) - - ;; copy into a new string - (set! (-> list i) (new 'debug 'string 0 *temp-string*))) - - ;; return the allocated, filled and sorted array - (sort-string-array list string<=?)) - ) - -(define *vag-list* (alloc-vag-list)) -(define *vag-max-pos-list* (the (pointer int32) (malloc 'debug (* 4 (-> *vag-list* allocated-length))))) - - -(defun dm-vag-play-pick-func ((idx int)) - (if *vag-player* - (return #f)) - (set! *vag-player* (process-spawn-function process :to *display-pool* - (lambda :behavior process ((idx int)) - - ;; restore these settings when we're done - (protect (*display-art-control* (-> *debug-menu-context* is-hidden) *gui-kick-str*) - (true! *display-art-control*) ;; force this on - (true! (-> *debug-menu-context* is-hidden)) ;; hide debug menu - (true! *gui-kick-str*) ;; force gui control to play streams - (sound-group-continue (sound-group dialog dialog2)) ;; unpause dialog - (set-setting! 'music-volume 'abs 0.0 0) ;; mute music - (set-setting! 'sfx-volume 'abs 0.0 0) ;; mute sfx - (set-setting! 'ambient-volume 'abs 0.0 0) ;; mute ambient - (set-setting! 'dialog-volume 'abs 1.0 0) ;; max dialog - (apply-settings *setting-control*) ;; apply settings now - - (let* ((exit? #f) - (old-speed 0.0) - (speed 0.0) - (id (new 'static 'sound-id)) - (stop! (lambda :behavior process ((id sound-id)) - (set-action! *gui-control* (gui-action stop) id (gui-channel none) (gui-action none) (the-as string #f) (the-as (function gui-connection symbol) #f) (the-as process #f)))) - (play! (lambda :behavior process ((idx int)) - (add-process *gui-control* self (gui-channel alert) (gui-action play) (-> *vag-list* idx) -10.0 0))) - (playing? (lambda :behavior process ((id sound-id)) - (let ((status (get-status *gui-control* id))) (or (= status (gui-status ready)) (= status (gui-status active)))))) - (set-speed (lambda :behavior process ((id sound-id) (speed float)) - (when *sound-player-enable* - (let ((cmd (the-as sound-rpc-set-param (get-sound-buffer-entry)))) - (set! (-> cmd command) (sound-command set-param)) - (set! (-> cmd id) id) - (set! (-> cmd params pitch-mod) (the int (* 1524.0 speed))) - (set! (-> cmd params mask) (the-as uint 2)) - (-> cmd id) - ) - )))) - - (set! id (play! idx)) - (while (= (gui-status pending) (get-status *gui-control* id)) - (suspend)) - - (until (or exit? (!= *master-mode* 'menu)) - (format *stdcon* "Vag Player -- Press Triangle To Exit~%") - (cond - ((zero? id) - (format *stdcon* "No vag queued~%")) - ((not (playing? id)) - (format *stdcon* "Vag not playing~%")) - (else - (format *stdcon* "Vag playing: ~3L~D~0L~%" (the int (/ (the float (current-str-pos id)) 34.133335)))) - ) - (format *stdcon* "Vag: ~S <- ~S(max:~3L~D~0L) -> ~S~%" (if (> idx 0) (-> *vag-list* (1- idx))) - (-> *vag-list* idx) (-> *vag-max-pos-list* idx) - (if (< (1+ idx) (-> *vag-list* allocated-length)) (-> *vag-list* (1+ idx)))) - (format *stdcon* "X to Pause and Play~%R1 and L1 for Speed, Circle Resets~%Left and Right for Prev / Next~%") - (format *stdcon* "Speed: ~f~%" speed) - (cond - ((cpad-pressed? 0 triangle) - (cpad-clear! 0 triangle) - (stop! id) - (true! exit?)) - ((cpad-pressed? 0 x) - (cpad-clear! 0 x) - (cond - ((not (playing? id)) - (set! id (play! idx)) - (set! old-speed 0.0)) - ((= speed -1000.0) - (set! speed 0.0) - (sound-continue id) - (when *sound-player-enable* - (let ((cmd (the-as sound-rpc-set-param (get-sound-buffer-entry)))) - (set! (-> cmd command) (sound-command set-param)) - (set! (-> cmd id) id) - (set! (-> cmd params pitch-mod) 0) - (set! (-> cmd params mask) (the-as uint 2)) - (-> cmd id) - ) - ) - ) - (else - (set! speed -1000.0) - (sound-pause id) - ) - ) - ) - ((and (cpad-pressed? 0 left) (> idx 0)) - (cpad-clear! 0 left) - (stop! id) - (1-! idx) - (set! id (play! idx)) - (set! old-speed 0.0)) - ((and (cpad-pressed? 0 right) (< (1+ idx) (-> *vag-list* allocated-length))) - (cpad-clear! 0 right) - (stop! id) - (1+! idx) - (set! id (play! idx)) - (set! old-speed 0.0)) - ((and (cpad-hold? 0 r1 l1) (!= speed -1000.0)) - (seek! speed (if (cpad-hold? 0 l1) -4.0 4.0) (* 0.5 (-> self clock seconds-per-frame))) - ) - ((cpad-pressed? 0 circle) - (cpad-clear! 0 circle) - (set! speed 0.0)) - ((cpad-pressed? 0 square) - (cpad-clear! 0 square)) - ) - (when (playing? id) - (max! (-> *vag-max-pos-list* idx) (the int (/ (the float (current-str-pos id)) 34.133335))) - (when (and (!= speed old-speed) (!= speed -1000.0)) - (set-speed id speed) - (set! old-speed speed))) - (suspend)) - ) - - (sound-group-pause (sound-group dialog dialog2)) ;; re-pause dialog - (remove-setting! 'music-volume) - (remove-setting! 'sfx-volume) - (remove-setting! 'ambient-volume) - (remove-setting! 'dialog-volume) - (apply-settings *setting-control*) - - (set! *vag-player* #f) - )) idx)) - #t) - +(define *made-vag-list* #f) (defun build-vag-list ((menu debug-menu)) "Fill the vag play menu" + (if *made-vag-list* + (return #f)) + (true! *made-vag-list*) + ;; clear old list (debug-menu-remove-all-items menu) ;; make button for each vag, we use an index (dotimes (i (-> *vag-list* allocated-length)) - (debug-menu-append-item menu (new-dm-func (-> *vag-list* i) i dm-vag-play-pick-func)) + (debug-menu-append-item menu (new-dm-func (-> *vag-list* i) i vag-player-play-from-index)) ) ;; sort by vag name - note: already sorted from before ;(set! (-> menu items) (sort (-> menu items) debug-menu-node *setting-control* user-default subtitle)))) ;; pick channel - (build-vag-list *vag-play-menu*) - (new-dm-submenu "Vag" vag-menu) ) ) @@ -1012,7 +828,7 @@ ;; (flag "hungarian" 14 dm-text-language) ;; ) (flag "Discord RPC" #t ,(dm-lambda-boolean-flag (-> *pc-settings* discord-rpc?))) - (flag "SpeedRunner Mode" #t ,(dm-lambda-boolean-flag (-> *pc-settings* speedrunner-mode?))) + (flag "Speedrunner Mode" #t ,(dm-lambda-boolean-flag (-> *pc-settings* speedrunner-mode?))) (flag "Jetboard Trick String" #t ,(dm-lambda-boolean-flag (-> *pc-settings* jetboard-trick-text?))) ;; (flag "Speedrunner Mode" #t ,(dm-lambda-boolean-flag (-> *pc-settings* speedrunner-mode?))) (menu "PS2 settings" @@ -1075,12 +891,12 @@ (debug-menu-make-from-template *debug-menu-context* '(menu "Other" (flag "DECI Count" *display-deci-count* dm-boolean-toggle-pick-func) - ;(flag "Actor graph" *display-actor-graph* dm-boolean-toggle-pick-func) + (flag "Actor graph" *display-actor-graph* dm-boolean-toggle-pick-func) (flag "Update vis outside bsp" *update-leaf-when-outside-bsp* dm-boolean-toggle-pick-func) ;; (flag "Pad display" *display-pad-debug* dm-boolean-toggle-pick-func) - (flag "Display actor bank" *display-actor-bank* dm-boolean-toggle-pick-func) (flag "Heap status" *display-heap-status* dm-boolean-toggle-pick-func) - ;; (flag "Text boxes" *display-text-box* dm-boolean-toggle-pick-func) + (flag "Text boxes" *display-text-box* dm-boolean-toggle-pick-func) + (flag "Display actor bank" *display-actor-bank* dm-boolean-toggle-pick-func) (float-var "Actor birth dist" #f ,(dm-lambda-meters-var (-> *ACTOR-bank* birth-dist)) 20 1 #t 0 10000 1) (float-var "Actor pause dist" #f ,(dm-lambda-meters-var (-> *ACTOR-bank* pause-dist)) 20 1 #t 0 10000 1) (flag "Display city info" *display-city-info* dm-boolean-toggle-pick-func) diff --git a/goal_src/jak2/pc/debug/entity-debug.gc b/goal_src/jak2/pc/debug/entity-debug.gc index 8e3aa7b476..eec486e491 100644 --- a/goal_src/jak2/pc/debug/entity-debug.gc +++ b/goal_src/jak2/pc/debug/entity-debug.gc @@ -23,6 +23,7 @@ (defun entity-inspect-draw ((inspect-info entity-debug-inspect)) "draw text about an entity on screen" + (mlet ((LINE_HEIGHT 15)) (update-pad inspect-info 0) (let* ((e (-> inspect-info entity)) (name (res-lump-struct e 'name string))) (set! *debug-actor* (the string (and (type-type? (-> e type) entity-actor) (-> inspect-info show-actor-info) name))) @@ -42,14 +43,14 @@ ) ;; start writing text - (let* ((begin-y (- 16 (* (-> inspect-info scroll-y) 16))) (cur-y begin-y) (y-adv 16)) + (let* ((begin-y (- LINE_HEIGHT (* (-> inspect-info scroll-y) LINE_HEIGHT))) (cur-y begin-y) (y-adv 16)) (with-dma-buffer-add-bucket ((debug-buf (-> (current-frame) debug-buf)) (bucket-id debug-no-zbuf1)) ;; basic info, actor id, etc (draw-string-xy (string-format "~3L~A~0L ~A~%tags: ~D size: ~D aid: #x~x~%R1/L1 scroll L3 toggle display-actor-info~%--------------------" (-> e type) name (length e) (asize-of e) (-> e aid)) debug-buf 352 cur-y (font-color default) (font-flags shadow kerning middle)) - (+! cur-y (* 14 4)) + (+! cur-y (* LINE_HEIGHT 4)) (cond ((type-type? (-> e type) entity-actor) (let ((actor (the entity-actor e))) @@ -57,11 +58,11 @@ (draw-string-xy (string-format "etype: ~A~%vis: ~D task: ~S" (-> actor etype) (-> actor vis-id) (game-task->string (-> actor task))) debug-buf 352 cur-y (font-color default) (font-flags shadow kerning middle)) - (+! cur-y (* 14 2)) - (format *debug-temp-string* "(~S)" (begin (bit-enum->string task-mask (-> actor kill-mask) (clear *temp-string*)) *temp-string*)) + (+! cur-y (* LINE_HEIGHT 2)) + (format (clear *debug-temp-string*) "(~S)" (begin (bit-enum->string task-mask (-> actor kill-mask) (clear *temp-string*)) *temp-string*)) (draw-string-xy (string-format "kill-mask: ~S" *debug-temp-string*) debug-buf 352 cur-y (font-color default) (font-flags shadow kerning middle)) - (+! cur-y (* 14 1)) + (+! cur-y (* LINE_HEIGHT 1)) ) ) ) @@ -77,7 +78,7 @@ (cond ;; some water-height info ((and (= (-> e tag i name) 'water-height) (= (-> e tag i elt-count) 4) (= (-> e tag i elt-type) float)) - (+! y-adv (* 14 1)) + (+! y-adv (* LINE_HEIGHT 1)) (format *debug-temp-string* "~mm ~mm ~mm~%(~S)" (-> (the (pointer float) data) 0) (-> (the (pointer float) data) 1) @@ -87,7 +88,7 @@ ) ;; some water-height info but with 5 elts ((and (= (-> e tag i name) 'water-height) (= (-> e tag i elt-count) 4) (= (-> e tag i elt-type) float)) - (+! y-adv (* 14 3)) + (+! y-adv (* LINE_HEIGHT 3)) (format *debug-temp-string* "~mm ~mm ~mm~%(~S)~%~mm" (-> (the (pointer float) data) 0) (-> (the (pointer float) data) 1) @@ -218,24 +219,24 @@ 'spawner-blocker-actor 'spawner-trigger-actor 'kill-actor 'fade-actor 'water-actor 'target-actor 'formation-actor) (format *debug-temp-string* "~%#x~x (~S)" (-> (the (pointer uint32) data) ii) (res-lump-struct (entity-by-aid (-> (the (pointer uint32) data) ii)) 'name string)) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) (('nav-mesh-actor) (format *debug-temp-string* "~%#x~x (~S)" (-> (the (pointer uint32) data) ii) (res-lump-struct (entity-nav-mesh-by-aid (-> (the (pointer actor-id) data) ii)) 'name string)) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) (('enemy-options) (format *debug-temp-string* "~%(~S)" (begin (bit-enum->string enemy-option (-> (the (pointer uint32) data) ii) (clear *temp-string*)) *temp-string*)) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) (('kill-mask) (format *debug-temp-string* "~%(~S)" (begin (bit-enum->string task-mask (-> (the (pointer uint32) data) ii) (clear *temp-string*)) *temp-string*)) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) (('elevator-flags) (format *debug-temp-string* "~%(~S)" (begin (bit-enum->string elevator-flags (-> (the (pointer uint32) data) ii) (clear *temp-string*)) *temp-string*)) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) (else (format *debug-temp-string* "#x~x" (-> (the (pointer uint32) data) ii)) @@ -281,10 +282,10 @@ ) ) ) - (+! y-adv 14)) + (+! y-adv LINE_HEIGHT)) ((pair) (format *debug-temp-string* "~%~A" (-> (the (pointer pair) data) 0)) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) ((actor-group) (let* ((group (-> (the (pointer actor-group) data) ii)) @@ -292,9 +293,9 @@ (format *debug-temp-string* "~%--- GROUP ~D: ---" ii len) (dotimes (iii len) (format *debug-temp-string* "~% #x~x (~S)" (-> group data iii id) (res-lump-struct (entity-by-aid (-> group data iii id)) 'name string)) - (+! y-adv 14)) + (+! y-adv LINE_HEIGHT)) ) - (+! y-adv 14) + (+! y-adv LINE_HEIGHT) ) ;; no clue! please report this. (else @@ -310,13 +311,13 @@ ;; draw a string for each tag instead of all at once. allows using smaller strings. (draw-string-xy *debug-temp-string* debug-buf 352 cur-y (font-color default) (font-flags shadow kerning middle)) (+! cur-y y-adv) - (set! y-adv 14) + (set! y-adv LINE_HEIGHT) )) ;; set max scroll based on how large the whole text was, ignore first 20 lines. - (set! (-> inspect-info scroll-y-max) (max 0 (+ -20 (/ (- cur-y begin-y) 14)))) + (set! (-> inspect-info scroll-y-max) (max 0 (+ -20 (/ (- cur-y begin-y) LINE_HEIGHT)))) ) - ))) + )))) diff --git a/goal_src/jak2/pc/debug/vag-player.gc b/goal_src/jak2/pc/debug/vag-player.gc new file mode 100644 index 0000000000..48871c362f --- /dev/null +++ b/goal_src/jak2/pc/debug/vag-player.gc @@ -0,0 +1,464 @@ +;;-*-Lisp-*- +(in-package goal) + +#| + + vag player process for debugging vag streams and for easier subtitling. + + |# + +(declare-file (debug)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; constants +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; types and enums +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +;;;---------------------------------- +;; process type +;;;---------------------------------- + + +;; the vag-player process. it lives on the PC actor pool +(deftype vag-player (process) + ( + (vag-index int32) + (id sound-id) + (speed float) + (old-speed float) + + ;; temp settings + (master-mode symbol) + (display-art-control symbol) + (debug-menu-hidden symbol) + (gui-kick-str symbol) + ) + + (:methods + (vag-stop (_type_) int) + (vag-play (_type_) sound-id) + (vag-playing? (_type_) symbol) + (vag-set-speed (_type_ float) sound-id) + ) + (:states + (vag-player-playing int) + ) + ) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; vag list +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; an array of 64-bit values which can be turned into a string +;; each representing the name of a vag stream. convert using alloc-vag-list +(define *vagdir-names-list* (alloc-vagdir-names 'debug)) + + +(defun sort-string-array ((arr (array string)) (compare-func (function string string object))) + "Sort an array, using compare-func to compare elements. + The comparison function can return either an integer or a true/false. + For integers, use a positive number to represent first > second + Ex: (sort lst -) will sort in ascending order + For booleans, you must explicitly use #t and not a truthy value. + Ex: (sort my-list (lambda ((x int) (y int)) (< x y))) will sort ascending. + NOTE: if you use an integer, don't accidentally return #t" + (let ((sorted -1)) + (while (nonzero? sorted) + (set! sorted 0) + (dotimes (i (1- (-> arr allocated-length))) + (let* ((cur (-> arr i)) + (next (-> arr (1+ i))) + (result (compare-func cur next)) + ) + (when (and (or (not result) (> (the-as int result) 0)) (!= result #t)) + (+! sorted 1) + (set! (-> arr i) next) + (set! (-> arr (1+ i)) cur) + ) + ) + ) + ) + ) + arr + ) + + +(defun alloc-vag-list () + "allocates and returns a boxed array with all of the vag names as strings, sorted" + (let ((list (new 'debug 'boxed-array string (the int (-> *vagdir-names-list* -1))))) + + ;; for each vag... + (dotimes (i (-> list allocated-length)) + ;; write the vag name (64 bits) into the string directly and add a null character + (set! (-> (the (pointer uint64) (-> *temp-string* data))) (-> *vagdir-names-list* i)) + (set! (-> *temp-string* data 8) 0) + (countdown (ii 8) + (if (!= #x20 (-> *temp-string* data ii)) + (set! ii 0) + (set! (-> *temp-string* data ii) 0)) + ) + + ;; copy into a new string + (set! (-> list i) (new 'debug 'string 0 *temp-string*))) + + ;; return the allocated, filled and sorted array + (sort-string-array list string<=?)) + ) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; globals +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; the process pointer. +(define *vag-player* (the (pointer vag-player) #f)) + +;; list of vag names (as a string) +(define *vag-list* (alloc-vag-list)) +;; the highest recorded position for each vag +(define *vag-max-pos-list* (the (pointer int32) (malloc 'debug (* 4 (-> *vag-list* allocated-length))))) + + +(defun get-vag-index-from-name ((name string)) + "return the index of the vag with that name in the *vag-list* or -1 if not found" + + ;; uppercase the string so we have a consistent name format + (string-upcase name *vag-temp-string*) + (dotimes (i (-> *vag-list* allocated-length)) + (string-upcase (-> *vag-list* i) *vag-temp-string-2*) + (when (string= *vag-temp-string* *vag-temp-string-2*) + (return i)) + ) + -1) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; states +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defmethod deactivate vag-player ((obj vag-player)) + (set! *vag-player* (the (pointer vag-player) #f)) + ((method-of-type process deactivate) obj) + (none) + ) + +(defstate vag-player-idle (vag-player) + + :event (behavior ((from process) (argc int) (msg symbol) (block event-message-block)) + (case msg + (('play) + (let ((vag-idx (get-vag-index-from-name (the-as string (-> block param 0))))) + (when (!= vag-idx -1) + (go vag-player-playing vag-idx) + (return #t))) + #f) + (('play-index) + (go vag-player-playing (the-as int (-> block param 0)))) + ) + ) + + :code (behavior () + (sleep-code) + (none)) + + ) + + +(defstate vag-player-playing (vag-player) + + :event (behavior ((from process) (argc int) (msg symbol) (block event-message-block)) + (case msg + (('play) + (let ((vag-idx (get-vag-index-from-name (the-as string (-> block param 0))))) + (when (!= vag-idx -1) + (set! (-> self vag-index) vag-idx) + (vag-play self) + (return #t))) + #f) + (('play-index) + (set! (-> self vag-index) (the-as int (-> block param 0))) + (vag-play self) + #t) + ) + ) + + :enter (behavior ((index int)) + (set! (-> self master-mode) *master-mode*) + (set! (-> self debug-menu-hidden) (-> *debug-menu-context* is-hidden)) + (set! (-> self display-art-control) *display-art-control*) + (set! (-> self gui-kick-str) *gui-kick-str*) + + (set-master-mode 'menu) ;; put us in menu mode first + (true! *display-art-control*) ;; force this on + (true! (-> *debug-menu-context* is-hidden)) ;; hide debug menu + (true! *gui-kick-str*) ;; force gui control to play streams + (sound-group-continue (sound-group dialog dialog2)) ;; unpause dialog + (set-setting! 'music-volume 'abs 0.0 0) ;; mute music + (set-setting! 'sfx-volume 'abs 0.0 0) ;; mute sfx + (set-setting! 'ambient-volume 'abs 0.0 0) ;; mute ambient + (set-setting! 'dialog-volume 'abs 1.0 0) ;; max dialog + (apply-settings *setting-control*) ;; apply settings now + + (set! (-> self speed) 0.0) + (set! (-> self old-speed) 0.0) + ) + + :exit (behavior () + (vag-stop self) + + (remove-setting! 'music-volume) + (remove-setting! 'sfx-volume) + (remove-setting! 'ambient-volume) + (remove-setting! 'dialog-volume) + (apply-settings *setting-control*) + (sound-group-pause (sound-group dialog dialog2)) + (set! *display-art-control* (-> self display-art-control)) + (set! (-> *debug-menu-context* is-hidden) (-> self debug-menu-hidden)) + (set! *gui-kick-str* (-> self gui-kick-str)) + (if (!= (-> self master-mode) 'menu) + (set-master-mode (-> self master-mode))) + (none)) + + :code (behavior ((index int)) + (set! (-> self vag-index) index) + + (let ((exit? #f)) + (vag-play self) + (while (= (gui-status pending) (get-status *gui-control* (-> self id))) + (suspend)) + + (until (or exit? (!= *master-mode* 'menu)) + (format *stdcon* "Vag Player -- Press Triangle To Exit~%") + (cond + ((zero? (-> self id)) + (format *stdcon* "No vag queued~%")) + ((not (vag-playing? self)) + (format *stdcon* "Vag not playing~%")) + (else + (format *stdcon* "Vag playing: ~3L~D~0L~%" (the int (/ (the float (current-str-pos (-> self id))) (/ 1024.0 30))))) + ) + (format *stdcon* "Vag: ~S <- ~S(max:~3L~D~0L) -> ~S~%" (if (> (-> self vag-index) 0) (-> *vag-list* (1- (-> self vag-index)))) + (-> *vag-list* (-> self vag-index)) (-> *vag-max-pos-list* (-> self vag-index)) + (if (< (1+ (-> self vag-index)) (-> *vag-list* allocated-length)) (-> *vag-list* (1+ (-> self vag-index))))) + (format *stdcon* "X to Pause and Play~%R1 and L1 for Speed, Circle Resets~%Left and Right for Prev / Next~%Square for Subtitles (~A)~%" (-> *setting-control* user-default subtitle)) + (format *stdcon* "Speed: ~f~%" (-> self speed)) + (cond + ((cpad-pressed? 0 triangle) + (cpad-clear! 0 triangle) + (true! exit?)) + ((cpad-pressed? 0 x) + (cpad-clear! 0 x) + (cond + ((not (vag-playing? self)) + (vag-play self)) + ((= (-> self speed) -1000.0) + (set! (-> self speed) 0.0) + (sound-continue (-> self id)) + (when *sound-player-enable* + (let ((cmd (the-as sound-rpc-set-param (get-sound-buffer-entry)))) + (set! (-> cmd command) (sound-command set-param)) + (set! (-> cmd id) (-> self id)) + (set! (-> cmd params pitch-mod) 0) + (set! (-> cmd params mask) (the-as uint 2)) + (-> cmd id) + ) + ) + ) + (else + (set! (-> self speed) -1000.0) + (sound-pause (-> self id)) + ) + ) + ) + ((and (cpad-pressed? 0 left) (> (-> self vag-index) 0)) + (cpad-clear! 0 left) + (1-! (-> self vag-index)) + (vag-play self)) + ((and (cpad-pressed? 0 right) (< (1+ (-> self vag-index)) (-> *vag-list* allocated-length))) + (cpad-clear! 0 right) + (1+! (-> self vag-index)) + (vag-play self)) + ((and (cpad-hold? 0 r1 l1) (!= (-> self speed) -1000.0)) + (seek! (-> self speed) (if (cpad-hold? 0 l1) -4.0 4.0) (* 0.5 (-> self clock seconds-per-frame))) + ) + ((cpad-pressed? 0 circle) + (cpad-clear! 0 circle) + (set! (-> self speed) 0.0)) + ((cpad-pressed? 0 square) + (cpad-clear! 0 square) + (not! (-> *setting-control* user-default subtitle))) + ) + (when (vag-playing? self) + (max! (-> *vag-max-pos-list* (-> self vag-index)) (the int (/ (the float (current-str-pos (-> self id))) (/ 1024.0 30)))) + (when (and (!= (-> self speed) (-> self old-speed)) (!= (-> self speed) -1000.0)) + (vag-set-speed self (-> self speed)) + (set! (-> self old-speed) (-> self speed)))) + (suspend)) + ) + + (go vag-player-idle) + (none)) + ) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; methods +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defmethod vag-play vag-player ((self vag-player)) + "play the current vag stream" + (set! (-> self speed) 0.0) + (set! (-> self old-speed) 0.0) + (vag-stop self) + (set! (-> self id) (add-process *gui-control* self (gui-channel alert) (gui-action play) (-> *vag-list* (-> self vag-index)) -10.0 0))) + +(defmethod vag-stop vag-player ((self vag-player)) + "stop the current vag stream" + (set-action! *gui-control* (gui-action stop) (-> self id) (gui-channel none) (gui-action none) (the-as string #f) (the-as (function gui-connection symbol) #f) (the-as process #f))) + +(defmethod vag-playing? vag-player ((self vag-player)) + "is the current vag stream playing?" + (let ((status (get-status *gui-control* (-> self id)))) (or (= status (gui-status ready)) (= status (gui-status active))))) + +(defmethod vag-set-speed vag-player ((self vag-player) (speed float)) + "set the speed of the current vag stream" + (when *sound-player-enable* + (let ((cmd (the-as sound-rpc-set-param (get-sound-buffer-entry)))) + (set! (-> cmd command) (sound-command set-param)) + (set! (-> cmd id) (-> self id)) + (set! (-> cmd params pitch-mod) (the int (* 1524.0 speed))) + (set! (-> cmd params mask) (the-as uint 2)) + (-> cmd id) + ) + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; helper functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defbehavior vag-player-init-by-other vag-player () + "external initializer for vag-player process" + (set! (-> self id) (new 'static 'sound-id)) + (go vag-player-idle) + ) + + +(defun vag-player-stop () + "kill the subtitle2 process" + + (kill-by-type vag-player *pc-pool*)) + +(defun vag-player-start () + "start the subtitle2 process" + + (when *vag-player* + (vag-player-stop) + ) + + (set! *vag-player* (process-spawn vag-player :from *pc-dead-pool* :to *pc-pool*)) + ) + + +(defun vag-player-play-from-index ((index int)) + "play a vag from its index in the vag list" + (if (not *vag-player*) + (vag-player-start)) + + (send-event (ppointer->process *vag-player*) 'play-index index)) + +(defun vag-player-play-from-name ((name string)) + "play a vag from its name" + (if (not *vag-player*) + (vag-player-start)) + + (send-event (ppointer->process *vag-player*) 'play name)) + +(defun vag-list-to-file ((file-name string)) + (if *vag-list* + (let ((file (new 'stack 'file-stream file-name 'write))) + (dotimes (i (-> *vag-list* allocated-length)) + (format file "~S~%" (-> *vag-list* i)) + ) + (file-stream-close file) + ) + #f + ) + ) + +;; start the vag-player process when this file loads. +(vag-player-start) + + +(defun scene-find-and-play ((name string)) + "go through the scene player list to find and play the requested scene" + + (vag-player-stop) + (cond + ;; hardcoded cases for the continue points + ((string= "intro-city-square" name) + (process-spawn scene-player :init scene-player-init name #t "ctyindb-intro-start")) + ((string= "intro-prison" name) + (process-spawn scene-player :init scene-player-init name #t "prison-intro-start")) + ((string= "outro-nest" name) + (set! (-> palout memory-mode) (load-buffer-mode borrow)) + (set! (-> hiphog memory-mode) (load-buffer-mode small-center)) + (process-spawn scene-player :init scene-player-init name #t "nestb-outro")) + ((string= "outro-palace" name) + (set! (-> palout memory-mode) (load-buffer-mode borrow)) + (set! (-> hiphog memory-mode) (load-buffer-mode small-center)) + (process-spawn scene-player :init scene-player-init name #t "throne-outro")) + ((string= "outro-hiphog" name) + (set! (-> hiphog memory-mode) (load-buffer-mode small-center)) + (process-spawn scene-player :init scene-player-init name #t "hiphog-outro")) + ((string= "outro-port" name) + (set! (-> hiphog memory-mode) (load-buffer-mode small-center)) + (process-spawn scene-player :init scene-player-init name #t "ctyport-outro")) + (else + (let* ((find-scene-in-act + (lambda ((scene-list (array hud-scene-info)) (name string)) + ;; for each scene in list + (doarray (scene-info scene-list) + ;; scene name matches - return that immediately + (if (and (string? (-> scene-info info)) (string= (the string (-> scene-info info)) name)) + (return scene-info)) + ;; scene name didn't match, see if there is a scene playlist + ;; if there is, then find our scene there + (when (pair? (-> scene-info info)) + (let ((iter (the pair (-> scene-info info)))) + (while (not (null? iter)) + (if (and (string? (car iter)) (string= (the string (car iter)) name)) + (return scene-info)) + (set! iter (cdr iter)) + ) + ) + ) + ) + (the hud-scene-info #f)))) + (awhen (or (find-scene-in-act *hud-select-scene-act1* name) + (find-scene-in-act *hud-select-scene-act2* name) + (find-scene-in-act *hud-select-scene-act3* name)) + (process-spawn scene-player :init scene-player-init name #t (-> (the hud-scene-info it) continue)) + ) + ) + )) + 0) + diff --git a/goal_src/jak2/pc/pckernel-impl.gc b/goal_src/jak2/pc/pckernel-impl.gc index d3f3e0fd8e..9312d111c3 100644 --- a/goal_src/jak2/pc/pckernel-impl.gc +++ b/goal_src/jak2/pc/pckernel-impl.gc @@ -19,11 +19,39 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; pc enum for languages. this is the game's languages + custom ones. +(defenum pc-language + :type uint16 + (english 0) + (french 1) + (german 2) + (spanish 3) + (italian 4) + (japanese 5) + (korean 6) + (uk-english 7) + ;; custom + (portuguese 8) + (finnish 9) + (swedish 10) + (danish 11) + (norwegian 12) + (dutch 13) + (br-portuguese 14) + (hungarian 15) + (catalan 16) + (icelandic 17) + (russian 18) + + (custom 999) ;; temp + ) + ;; The Jak 2 version of the pc-settings object. (deftype pc-settings-jak2 (pc-settings) ( (fast-airlock? symbol) (fast-elevator? symbol) + (text-language pc-language) ;; language for game text ;; debug (jetboard-trick-text? symbol) ;; enable rendering jetboard trick combo during minigame @@ -51,6 +79,7 @@ ) ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; resets ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/goal_src/jak2/pc/pckernel.gc b/goal_src/jak2/pc/pckernel.gc index 9c68a83c58..cd31a75949 100644 --- a/goal_src/jak2/pc/pckernel.gc +++ b/goal_src/jak2/pc/pckernel.gc @@ -119,6 +119,7 @@ (("jetboard-trick-text?") (set! (-> obj jetboard-trick-text?) (file-stream-read-symbol file))) (("fast-airlock?") (set! (-> obj fast-airlock?) (file-stream-read-symbol file))) (("fast-elevator?") (set! (-> obj fast-elevator?) (file-stream-read-symbol file))) + (("text-language") (set! (-> obj text-language) (the-as pc-language (file-stream-read-int file)))) ) 0) @@ -129,6 +130,7 @@ (format file " (jetboard-trick-text? ~A)~%" (-> obj jetboard-trick-text?)) (format file " (fast-airlock? ~A)~%" (-> obj fast-airlock?)) (format file " (fast-elevator? ~A)~%" (-> obj fast-elevator?)) + (format file " (text-language ~D)~%" (-> obj text-language)) 0) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/goal_src/jak2/pc/subtitle2-h.gc b/goal_src/jak2/pc/subtitle2-h.gc new file mode 100644 index 0000000000..afdc823e83 --- /dev/null +++ b/goal_src/jak2/pc/subtitle2-h.gc @@ -0,0 +1,355 @@ +;;-*-Lisp-*- +(in-package goal) + +#| + + Code for subtitles for the PC port. A PC actor pool is provided, and the subtitle2 process lives there. + Jak 2 has subtitles, but only for cutscenes and only for the actual spoken text. + The subtitle process automatically looks for currently-playing audio in the gui control. + It looks for specific channels there, NOT including the movie or subtitle channel. + + This updated subtitle system has a few different features than the Jak 1 subtitle system: + - you can have multiple playing subtitles at once. Additional subtitles are rendered above the older ones, + just like real subtitles. This goes for both multiple subtitles within the same scene, and also multiple scenes + playing at once. + - it can "merge" with the pre-existing subtitle system. Some code in scene.gc is changed to redirect subtitles + to here to do that. + - you supply the start AND end times as opposed to just the start time. + - the speaker names are color-coded. + Note that subtitle images are NOT supported with this! Merge mode will also NOT work with subtitle images. + + Similarly to the generic text file, only one subtitles text file is loaded at once, stored in a specific + heap. + + |# + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; constants +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstant PC_SUBTITLE_FILE_SIZE (* 192 1024)) ;; 192K heap for subtitles. adjust later if necessary. +(defconstant PC_SUBTITLE_FILE_NAME "subti2") +(defconstant PC_SUBTITLE_QUEUE_SIZE 5) ;; up to 8 things that display subtitles can be detected at once +(defconstant PC_SUBTITLE_QUEUE_MAX_LINES 2) ;; up to 2 lines can be queued per queueable thing +(defconstant PC_SUBTITLE_MAX_LINES 10) ;; max subtitles that can be displayed at once: queue-size * queue-lines + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; types and enums +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;------------------------ +;; data +;;;------------------------ + + +(defenum pc-subtitle2-flags + :bitfield #t + :type uint16 + (offscreen) ;; speaker is offscreen. + (merge) ;; line of text comes from movie subtitles + ) + +;; the list of available speakers for subtitles +(defenum pc-subtitle2-speaker + :type uint16 + (none) ;; won't display a speaker - use this for tutorial messages etc. + + (computer) + (jak) + (darkjak) + (daxter) + (samos) + (keira) + (keira-before-class-3) + (kid) + (kor) + (metalkor) + (baron) + (errol) + (torn) + (tess) + (guard) + (guard-a) + (guard-b) + (krew) + (sig) + (brutter) + (vin) + (youngsamos) + (youngsamos-before-rescue) + (pecker) + (onin) + (ashelin) + (jinx) + (mog) + (grim) + (agent) + (citizen-male) + (citizen-female) + (oracle) + (precursor) + + (max)) + +;; information about a single line of subtitles +(deftype subtitle2-line (structure) + ( + (start-frame float) ;; the first frame to show the line on + (end-frame float) ;; the last frame to show the line on + (text string) ;; the text for the subtitle2 line + (speaker pc-subtitle2-speaker) ;; who the line speaker is + (flags pc-subtitle2-flags) ;; flags + ) + :pack-me + ) + +;; an individual entry to a subtitle2 text making up a "scene" (audio file, spool), comprised of a series of lines +(deftype subtitle2-scene (structure) + ( + ;; the name of the spool-anim or audio file + (name string) + ;; the amount of lines + (length int32) + ;; line data + (lines (inline-array subtitle2-line)) + ) + :pack-me + :size-assert #xc ;; compact! + + (:methods + (get-line-at-pos (_type_ float int) subtitle2-line) + ) + ) + +;; the global subtitle2 text info bank +(deftype subtitle2-text-info (basic) + ((length int16) + (version int16) + (lang pc-language) + (speaker-length int16) + (speaker-names (pointer string)) + (data subtitle2-scene :inline :dynamic) + ) + + (:methods + (get-speaker (_type_ pc-subtitle2-speaker) string) + (get-scene-by-name (_type_ string) subtitle2-scene) + ) + ) + + +(defmacro subtitle2-flags? (sub &rest flags) + `(logtest? (-> ,sub flags) (pc-subtitle2-flags ,@flags))) + + +(defmethod inspect subtitle2-text-info ((obj subtitle2-text-info)) + (if (not obj) + (return (the subtitle2-text-info #f))) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~1Tlength: ~D~%" (-> obj length)) + (format #t "~1Tversion: ~D~%" (-> obj version)) + (format #t "~1Tlang: ~D~%" (-> obj lang)) + (format #t "~1Tspeaker-names[~D] @ #x~x~%" (-> obj speaker-length) (-> obj speaker-names)) + (dotimes (i (-> obj speaker-length)) + (format #t "~2T[~D]: ~A~%" i (-> obj speaker-names i))) + (format #t "~1Tdata[0] @ #x~x~%" (-> obj data)) + (dotimes (i (-> obj length)) + (format #t "~2T--------~%") + (format #t "~2Tname: ~A~%" (-> obj data i name)) + (format #t "~2Tlines[~D] @ #x~x~%" (-> obj data i length) (-> obj data i lines)) + (dotimes (ii (-> obj data i length)) + (format #t "~3T[~f to ~f] (#x~x)(~S) ~A~%" (-> obj data i lines ii start-frame) (-> obj data i lines ii end-frame) + (-> obj data i lines ii flags) + (enum->string pc-subtitle2-speaker (-> obj data i lines ii speaker)) + (-> obj data i lines ii text))) + ) + obj) + + +;;;---------------------------------- +;; process type +;;;---------------------------------- + + +;; graphic parameters for subtitles +(deftype subtitle2-bank (structure) + ((scale float) + (width float) + (lines float) + ) + ) + +(define *SUBTITLE2-bank* + (new 'static 'subtitle2-bank + :scale 0.9 + :width 0.65 + :lines 2.0 + )) + + +(deftype subtitle2-queue-element (structure) + ((id sound-id) + (gui gui-connection) + ) + :pack-me + + (:methods + (clear-line (_type_) int)) + ) + +(deftype subtitle2-line-queue-element (structure) + ((line subtitle2-line) + (y float) + ) + :pack-me + ) + +;; the subtitle2 process! it lives on the PC actor pool +(deftype subtitle2 (process) + ( + (font font-context) ;; the font to use for the subtitles. + + (have-message? symbol) ;; if there is a message displaying at the bottom, move subtitles up + (have-minimap? symbol) ;; if there is a minimap displaying at the bottom, shrink subtitles + (have-subtitles? symbol) ;; #t if we rendered any subtitles on the last frame. + + (movie-mode? symbol) ;; #t if we're in movie mode + (movie-line string) ;; a copy of the current movie line + (movie-gui gui-connection) ;; the gui entry for the movie. we need this to put it in the gui queue + (movie-pos float) + + (gui-id sound-id) + ;; store the gui id of channels with subtitles that we find. + ;; that way if subtitle B appears above A, it wont move back down + ;; if A ends before B + (queue subtitle2-queue-element PC_SUBTITLE_QUEUE_SIZE :inline) + (lines-0 subtitle2-line-queue-element PC_SUBTITLE_MAX_LINES :inline) + (lines-1 subtitle2-line-queue-element PC_SUBTITLE_MAX_LINES :inline) + (line-queue-idx int8) + + ;; debug + (cheat-backup symbol) + (checking-lines? symbol) + (current-debug-subtitle subtitle2-line) + (current-debug-scene int32) + (current-debug-line int32) + ) + + (:methods + (clear-queue (_type_) int) + (update-gui-connections (_type_) int) + (get-empty-queue (_type_) int) + (gui-queued? (_type_ gui-connection) symbol) + (add-to-queue (_type_ gui-connection) gui-connection) + (get-active-subtitles (_type_) int) + (subtitle-format (_type_ subtitle2-line) string) + (draw-subtitles (_type_) int) + (debug-print-queue (_type_) int) + (debug-print-speakers (_type_) int) + (start-gui (_type_) sound-id) + (stop-gui (_type_) sound-id) + ) + (:states + subtitle2-debug + subtitle2-debug-checking-lines) + ) + + + + +;;;---------------------------------------------- +;; globals +;;;---------------------------------------------- + + +;; the subtitle2 process. +(define *subtitle2* (the (pointer subtitle2) #f)) + +;; subtitle2 text data +(define *subtitle2-text* (the subtitle2-text-info #f)) +(kheap-alloc (define *subtitle2-text-heap* (new 'global 'kheap)) PC_SUBTITLE_FILE_SIZE) + +;; temp strings for name look-up +(define *vag-temp-string* (new 'global 'string 128 (the string #f))) +(define *vag-temp-string-2* (new 'global 'string 128 (the string #f))) + +;; speaker color table +(define *subtitle2-speaker-color-table* (the (pointer rgba) (malloc 'global (* (size-of rgba) (pc-subtitle2-speaker max))))) + +;; debug option +(define *display-subtitle-speakers* #f) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; helper functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defmethod length subtitle2-text-info ((obj subtitle2-text-info)) + "Get the length (number of subtitle2 scenes) in a subtitle2-text-info." + (-> obj length) + ) + +(defmethod length subtitle2-scene ((obj subtitle2-scene)) + "Get the length (number of subtitle2 lines) in a subtitle2-scene." + (-> obj length) + ) + + +(defmacro set-subtitle-speaker-color! (speaker color) + "macro for setting a color in *subtitle2-speaker-color-table*" + `(set! (-> *subtitle2-speaker-color-table* (pc-subtitle2-speaker ,speaker)) ,color)) +(defmacro set-subtitle-speaker-color<-speaker! (speaker speaker-from) + "macro for setting a color in *subtitle2-speaker-color-table* the same as a different speaker" + `(set-subtitle-speaker-color! ,speaker (-> *subtitle2-speaker-color-table* (pc-subtitle2-speaker ,speaker-from)))) + +(defun set-subtitle-speaker-colors () + "fill the subtitle speaker color table" + + (dotimes (i (pc-subtitle2-speaker max)) + (set! (-> *subtitle2-speaker-color-table* i) (-> *font-work* color-table (font-color red) color 0)) + ) + + (set-subtitle-speaker-color! computer (static-rgba #x60 #x60 #x60 #x80)) + (set-subtitle-speaker-color! jak (static-rgba #x70 #x80 #x00 #x80)) + (set-subtitle-speaker-color! darkjak (static-rgba #x68 #x68 #x80 #x80)) + (set-subtitle-speaker-color! samos (static-rgba #x30 #x80 #x08 #x80)) + (set-subtitle-speaker-color! youngsamos (static-rgba #x58 #x80 #x08 #x80)) + (set-subtitle-speaker-color! kor (static-rgba #x00 #x50 #x80 #x80)) + (set-subtitle-speaker-color! torn (static-rgba #x40 #x40 #x50 #x80)) + (set-subtitle-speaker-color! metalkor (static-rgba #x00 #x28 #x40 #x80)) + (set-subtitle-speaker-color! baron (static-rgba #x60 #x00 #x00 #x80)) + (set-subtitle-speaker-color! errol (static-rgba #x80 #x10 #x00 #x80)) + (set-subtitle-speaker-color! ashelin (static-rgba #x80 #x18 #x18 #x80)) + (set-subtitle-speaker-color! sig (static-rgba #x70 #x70 #x80 #x80)) + (set-subtitle-speaker-color! vin (static-rgba #x38 #x80 #x80 #x80)) + (set-subtitle-speaker-color! oracle (static-rgba #x80 #x40 #x00 #x80)) + (set-subtitle-speaker-color! brutter (static-rgba #x58 #x00 #x18 #x80)) + (set-subtitle-speaker-color! guard (static-rgba #x80 #x00 #x00 #x80)) + (set-subtitle-speaker-color! krew (static-rgba #x10 #x48 #x10 #x80)) + (set-subtitle-speaker-color! keira (static-rgba #x00 #x40 #x28 #x80)) + (set-subtitle-speaker-color! tess (static-rgba #x80 #x80 #x38 #x80)) + (set-subtitle-speaker-color! pecker (static-rgba #x80 #x80 #x00 #x80)) + (set-subtitle-speaker-color! onin (static-rgba #x80 #x80 #x80 #x80)) + (set-subtitle-speaker-color! jinx (static-rgba #x50 #x40 #x00 #x80)) + (set-subtitle-speaker-color! mog (static-rgba #x08 #x08 #x80 #x80)) + (set-subtitle-speaker-color! grim (static-rgba #x80 #x08 #x20 #x80)) + (set-subtitle-speaker-color! precursor (static-rgba #x00 #x60 #x80 #x80)) + (set-subtitle-speaker-color! citizen-male (static-rgba #x70 #x70 #x70 #x80)) + (set-subtitle-speaker-color! citizen-female (static-rgba #x70 #x70 #x70 #x80)) + + (set-subtitle-speaker-color<-speaker! kid jak) + (set-subtitle-speaker-color<-speaker! guard-a guard) + (set-subtitle-speaker-color<-speaker! guard-b guard) + (set-subtitle-speaker-color<-speaker! keira-before-class-3 keira) + (set-subtitle-speaker-color<-speaker! youngsamos-before-rescue youngsamos) + ) + + + diff --git a/goal_src/jak2/pc/subtitle2.gc b/goal_src/jak2/pc/subtitle2.gc new file mode 100644 index 0000000000..8e96285478 --- /dev/null +++ b/goal_src/jak2/pc/subtitle2.gc @@ -0,0 +1,875 @@ +;;-*-Lisp-*- +(in-package goal) + +#| + + Code for subtitles for the PC port. A PC actor pool is provided, and the subtitle2 process lives there. + Jak 2 has subtitles, but only for cutscenes and only for the actual spoken text. + The subtitle process automatically looks for currently-playing audio in the gui control. + It looks for specific channels there, NOT including the movie or subtitle channel. + + This updated subtitle system has a few different features than the Jak 1 subtitle system: + - you can have multiple playing subtitles at once. Additional subtitles are rendered above the older ones, + just like real subtitles. This goes for both multiple subtitles within the same scene, and also multiple scenes + playing at once. + - it can "merge" with the pre-existing subtitle system. Some code in scene.gc is changed to redirect subtitles + to here to do that. + - you supply the start AND end times as opposed to just the start time. + - the speaker names are color-coded. + Note that subtitle images are NOT supported with this! Merge mode will also NOT work with subtitle images. + + Similarly to the generic text file, only one subtitles text file is loaded at once, stored in a specific + heap. + + |# + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; constants +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstant PC_SUBTITLE_Y_RECALC -99.0) + +(defconstant PC_SUBTITLE_DISABLE_MOVIE_MODE #f) + +(defconstant PC_SUB_DBG_Y 60) +(defconstant PC_SUB_DBG_CHECK_GROUP_SIZE 64) +(defglobalconstant PC_SUBTITLE_DEBUG #f) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; access subtitle heap +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defmethod get-speaker subtitle2-text-info ((obj subtitle2-text-info) (speaker pc-subtitle2-speaker)) + "get the translated string for that speaker" + (if (and (> speaker (pc-subtitle2-speaker none)) (< speaker (-> obj speaker-length))) + (-> obj speaker-names speaker) + (the string #f)) + ) + +(defmethod get-scene-by-name subtitle2-text-info ((obj subtitle2-text-info) (name string)) + "get a subtitle scene info with the corresponding name. #f = none found" + + ;; invalid name so return invalid scene. + (if (not name) + (return (the subtitle2-scene #f))) + + ;; bounds checking + (when (> (length name) (-> *vag-temp-string* allocated-length)) + (format 0 "vag temp string is too short!! wanted: ~D chars~%" (length name))) + + ;; uppercase the string so we have a consistent name format + (string-upcase name *vag-temp-string*) + (dotimes (i (length obj)) + ;; bounds checking + (when (> (length (-> obj data i name)) (-> *vag-temp-string-2* allocated-length)) + (format 0 "vag temp string is too short!! wanted: ~D chars~%" (length name))) + ;; name and kind matches, return that! + (string-upcase (-> obj data i name) *vag-temp-string-2*) + (when (string= *vag-temp-string-2* *vag-temp-string*) + (return (-> obj data i))) + ) + + (the subtitle2-scene #f)) + + +(defmethod get-line-at-pos subtitle2-scene ((obj subtitle2-scene) (pos float) (index int)) + "return the subtitle line at that position. #f = none found + index is which line to return, since you can have multiple lines that cover the same position." + + (let ((found 0)) + + (dotimes (i (length obj)) + (when (and (>= pos (-> obj lines i start-frame)) + (< pos (-> obj lines i end-frame))) + (when (= found index) + (return (-> obj lines i))) + (1+! found) + ))) + + (the subtitle2-line #f)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; loading files +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun load-subtitle2-text-info ((txt-name string) (curr-text symbol) (heap kheap)) + "load a subtitles text file onto a heap. + txt-name = file name suffix + curr-text = a symbol to a subtitle2-text-info to link the file to + heap = the text heap to load the file onto" + + (let ((heap-sym-heap (the-as subtitle2-text-info (-> curr-text value))) + (lang (-> *setting-control* user-current subtitle-language)) + (load-status 0) + (heap-free (&- (-> heap top) (the-as uint (-> heap base))))) + + ;; current text has nothing loaded, or language doesn't match. + (when (or (= heap-sym-heap #f) + (!= (-> heap-sym-heap lang) lang)) + ;; so reload. + + ;; reset the text heap. + (kheap-reset heap) + + ;; try to load load... + (while (not (str-load (string-format "~D~S.TXT" lang txt-name) -1 (logand -64 (&+ (-> heap current) 63)) (&- (-> heap top) (-> heap current)))) + (return 0) + ) + ;; load succeeded. check status. + + (label retry) + (let ((status (str-load-status (the-as (pointer int32) (& load-status))))) + (when (= status 'error) + (format 0 "Error loading subtitle2~%") + (return 0) + (goto loaded) + ) + (cond + ((>= load-status (+ heap-free -300)) + (format 0 "Game subtitle2 heap overrun!~%") + (return 0) + ) + ((= status 'busy) + ;; still loading. + (goto retry) + ) + ) + ) + (label loaded) + + ;; link the text file! + (let ((new-mem (logand -64 (&+ (-> heap current) 63)))) + (flush-cache 0) + (set! (-> curr-text value) (link new-mem (-> (string-format "~D~S.TXT" lang txt-name) data) load-status heap 0)) + ) + ;; if linking failed just make the text invalid. + (if (<= (the-as int (-> curr-text value)) 0) + (set! (-> curr-text value) (the-as object #f)) + ) + )) + 0) + +(defun load-level-subtitle2-files ((idx int)) + "Load the subtitle2 files needed for level idx. + This function made more sense back when text files were split up, but in the end they put everything + in a single text group and file." + + ;; just load common. + (if (or *level-text-file-load-flag* (>= idx 0)) + (load-subtitle2-text-info PC_SUBTITLE_FILE_NAME '*subtitle2-text* *subtitle2-text-heap*) + ) + + (none)) + + +(defmacro reload-subtitles () + "rebuild and reload subtitles." + `(begin + (asm-text-file subtitle2 :files ("game/assets/jak2/game_subtitle.gp")) + (if *subtitle2-text* + (+! (-> *subtitle2-text* lang) 1)) + (load-level-subtitle2-files 0))) + +(defmacro reload-text () + "rebuild and reload text." + `(begin + (mng) + (if *common-text* + (+! (-> *common-text* language-id) 1)) + (load-level-text-files 0))) + + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; subtitle2 queue +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun subtitle-channel? ((ch gui-channel)) + "can this gui channel be checked for subtitles?" + (and (>= ch (gui-channel jak)) (<= ch (gui-channel krew))) + ) + +(defun valid-subtitle-gui? ((gui gui-connection)) + "is this gui connection valid for checking subtitles?" + (and gui (nonzero? (-> gui id)) + (subtitle-channel? (-> gui channel)) + (or (= (-> gui action) (gui-action playing)) + (= (-> gui action) (gui-action play))) + (let ((status (get-status *gui-control* (-> gui id)))) + (or (= status (gui-status ready)) + (= status (gui-status active))))) + ) + +(defun subtitle-bump-up? () + "should subtitles be moved up?" + ;; have a query or message up? + (or (nonzero? (lookup-gui-connection-id *gui-control* (the string #f) (gui-channel query) (gui-action playing))) + (nonzero? (lookup-gui-connection-id *gui-control* (the string #f) (gui-channel message) (gui-action playing))) + (nonzero? (lookup-gui-connection-id *gui-control* (the string #f) (gui-channel notice-low) (gui-action playing))) + ) + ) + + +(defmethod clear-line subtitle2-queue-element ((obj subtitle2-queue-element)) + "make this queue element invalid" + + (set! (-> obj gui) #f) + (set! (-> obj id) (new 'static 'sound-id)) + 0) + +(defmethod clear-queue subtitle2 ((obj subtitle2)) + "mark all slots in the gui queue as available" + + (dotimes (i PC_SUBTITLE_QUEUE_SIZE) + (clear-line (-> obj queue i))) + 0) + +(defmethod update-gui-connections subtitle2 ((obj subtitle2)) + "mark all inactive slots in the gui queue as available" + + (dotimes (i PC_SUBTITLE_QUEUE_SIZE) + + (let ((gui (lookup-gui-connection *gui-control* (the process #f) (gui-channel none) (the string #f) (-> obj queue i id)))) + + (if (not (valid-subtitle-gui? gui)) + (clear-line (-> obj queue i))))) + 0) + +(defmethod gui-queued? subtitle2 ((obj subtitle2) (gui gui-connection)) + "return #t is the gui is in the queue" + + (dotimes (i PC_SUBTITLE_QUEUE_SIZE) + (if (= (-> gui id) (-> obj queue i id)) + (return #t))) + #f) + +(defmethod get-empty-queue subtitle2 ((obj subtitle2)) + "return the first available gui queue slot" + + (dotimes (i PC_SUBTITLE_QUEUE_SIZE) + (if (not (-> obj queue i gui)) + (return i))) + (format #t "ran out of subtitle queue slots!") + 0 + ) + +(defmethod add-to-queue subtitle2 ((obj subtitle2) (gui gui-connection)) + "add a gui connection to the first empty queue slot available" + + (let ((slot (get-empty-queue obj))) + (set! (-> obj queue slot id) (-> gui id)) + (set! (-> obj queue slot gui) gui)) + gui) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; subtitle2 process and drawing! +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun set-speaker-color ((speaker pc-subtitle2-speaker)) + "set the color for the speaker font color" + (let ((spk-col (-> *subtitle2-speaker-color-table* speaker))) + (set-font-color (font-color progress-selected) 0 (new 'static 'rgba :r (-> spk-col r)) + (new 'static 'rgba :r (-> spk-col g)) + (new 'static 'rgba :r (-> spk-col b))) + (set-font-color (font-color progress-selected) 1 (new 'static 'rgba :r (-> spk-col r)) + (new 'static 'rgba :r (-> spk-col g)) + (new 'static 'rgba :r (-> spk-col b)))) + speaker) + + +(defmethod get-active-subtitles subtitle2 ((obj subtitle2)) + "collect active subtitles and add them to the queue + if a gui connection is already in the queue, + it will stay in the same slot when it was first added" + + ;; todo + (-> *gui-control* engine) + (let ((current (-> *gui-control* engine alive-list-end prev0))) + (-> *gui-control* engine) + (let ((next (-> current prev0))) + (while (!= current (-> *gui-control* engine alive-list)) + (let ((gui-conn (the gui-connection current))) + (when (and (valid-subtitle-gui? gui-conn) + (not (gui-queued? obj gui-conn))) + + (add-to-queue obj gui-conn) + ) + ) + (set! current next) + (-> *gui-control* engine) + (set! next (-> next prev0)) + ) + ) + ) + 0) + + +(defmethod subtitle-format subtitle2 ((obj subtitle2) (line subtitle2-line)) + "format the string for a subtitle line to *temp-string*" + + (when (subtitle2-flags? line merge) + (if (and (-> obj movie-mode?) (< 0 (length (-> obj movie-line)))) + (set! (-> line text) (-> obj movie-line)) + (return (the string #f)))) + + (cond + ((= (pc-subtitle2-speaker none) (-> line speaker)) + ;; there's no speaker so who cares. + (string-format "~S" (-> line text))) + ((or (= #t (-> *pc-settings* subtitle-speaker?)) + (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle2-flags? line offscreen))) + ;; there is a speaker and we do want it. + ;; we use color 33 which gets set at runtime to any color we want + (string-format "~33L~S:~0L ~S" (get-speaker *subtitle2-text* (-> line speaker)) (-> line text))) + (else + (string-format "~S" (-> line text))) + ) + *temp-string*) + +(defbehavior current-subtitle2-pos subtitle2 ((id sound-id)) + "get the str position for this sound id in a 30/sec measurement" + (if (and (-> self movie-mode?) (= id (-> self movie-gui id))) + (return (-> self movie-pos))) + (let ((pos (the float (current-str-pos id)))) + (if (< pos 0.0) -1.0 (/ pos (/ 1024.0 30))))) + + +(defbehavior setup-subtitle2-font subtitle2 ((font font-context)) + "setup a font and parameters for the subtitle2 subtitles." + + ;; set font settings. + (if (!= (language-enum japanese) (-> *setting-control* user-current subtitle-language)) + (set-scale! font (* 0.5 (-> *SUBTITLE2-bank* scale))) + (set-scale! font (* 0.5 (-> *SUBTITLE2-bank* scale) 1.2))) + (set-width! font (the int (* (-> *SUBTITLE2-bank* width) 0.91 512))) + (set-origin! font (the int (/ (- 512.0 (-> font width)) 2)) + (the int (* (if (-> self have-message?) 0.524 0.698) 416))) + (set-height! font (the int (* (-> *SUBTITLE2-bank* lines) 44))) + + ;; if we have the minimap, set the right border to 74.4% of screen width. shrink if larger than that. + ;; TODO scale this with aspect. + (when (and (-> self have-minimap?) + (< (get-screen-x 0.744) (+ (-> font width) (-> font origin x)))) + (let ((new-width (- (get-screen-x 0.744) (-> font origin x)))) + (set-scale! font (* (-> font scale) (/ (the float new-width) (-> font width)))) + (set-width! font new-width))) + ) + + +(defmethod draw-subtitles subtitle2 ((self subtitle2)) + "do the subtitle drawing" + + ;; check the gui queue for lines to add to the line queue + (let ((line-queue-old (if (zero? (-> self line-queue-idx)) (-> self lines-0) (-> self lines-1))) + (line-queue (if (zero? (-> self line-queue-idx)) (-> self lines-1) (-> self lines-0))) + + (find-line (lambda ((queue (inline-array subtitle2-line-queue-element)) (line subtitle2-line)) + (dotimes (i PC_SUBTITLE_MAX_LINES) + (if (= line (-> queue i line)) + (return i))) + -1))) + (logxor! (-> self line-queue-idx) 1) + ;; clear the queue we're writing to first + (dotimes (i PC_SUBTITLE_MAX_LINES) + (set! (-> line-queue i line) #f) + (set! (-> line-queue i y) PC_SUBTITLE_Y_RECALC) + ) + + ;; we won't be able to render any subtitles with no text loaded. + (when (not *subtitle2-text*) + (false! (-> self have-subtitles?)) + (return 0)) + + ;; font has already been set up in movie mode + (unless (-> self movie-mode?) + ;; set up our font to the initial parameters + (let ((map-gui (lookup-gui-connection *gui-control* (the process #f) (gui-channel hud-lower-right) "hud-map" (new 'static 'sound-id)))) + (set! (-> self have-message?) (or (subtitle-bump-up?) (and (-> self have-message?) (-> self have-subtitles?)))) + (set! (-> self have-minimap?) (and (logtest? (minimap-flag minimap) (-> *setting-control* user-current minimap)) + (!= map-gui #f) + (!= (gui-status pending) (get-status *gui-control* (-> map-gui id))) + (!= (gui-action hidden) (-> map-gui action)))) + ) + (setup-subtitle2-font (-> self font))) + + ;; do two passes - on the first one we add lines that were already being used, + ;; on the second pass we add new lines + (dotimes (q 2) + (dotimes (i PC_SUBTITLE_QUEUE_SIZE) + (when (-> self queue i gui) + (let ((pos (current-subtitle2-pos (-> self queue i id)))) + (when (and (zero? q) *debug-segment*) + (format *stdcon* "subtitle pos: ~3L~D~0L (~S)~%" (the int pos) (-> self queue i gui name))) + + (let ((scene (get-scene-by-name *subtitle2-text* (-> self queue i gui name)))) + (when scene + (dotimes (ii PC_SUBTITLE_QUEUE_MAX_LINES) + (awhen (get-line-at-pos scene pos ii) + (case q + ((0) + (let ((index-in-old (find-line line-queue-old it))) + (when (!= -1 index-in-old) + ;; this line exists in the previous frame, put it in the new queue at the same spot + (set! (-> line-queue index-in-old line) it) + (set! (-> line-queue index-in-old y) (-> line-queue-old index-in-old y))))) + ((1) + (when (= -1 (find-line line-queue it)) + ;; line not in the queue. find empty spot. + (let ((index-empty (find-line line-queue (the subtitle2-line #f)))) + (if (!= -1 index-empty) + (set! (-> line-queue index-empty line) it))) + )) + ) + ) + )) + ) + ) + ) + )) + + (let ((cur-y (-> self font origin y)) ;; the current y for the text + (start-y (-> self font origin y)) ;; the starting y for the text + (last-height 0.0) ;; the height of the previous subtitle + (this-height 0.0) ;; the height of the current subtitle + (lines-done 0) + (subtitles-drawn? #f) + ) + + (dotimes (i PC_SUBTITLE_QUEUE_MAX_LINES) + (when (and (-> line-queue i line) (subtitle-format self (-> line-queue i line))) + + (set! this-height (print-game-text *temp-string* (-> self font) #t 44 (bucket-id debug-no-zbuf2))) + + ;; push subtitle up since we are not the first one + (when (nonzero? lines-done) + (-! cur-y (/ last-height 2)) + (-! cur-y (/ this-height 2)) + ) + + ;; set the current y, it shall not be lower than the previous line! + (if (= (-> line-queue i y) PC_SUBTITLE_Y_RECALC) + (set! (-> line-queue i y) (- start-y cur-y)) + (set! cur-y (min cur-y (- start-y (-> line-queue i y))))) + (set! (-> self font origin y) cur-y) + + ;; check if we should actually draw subtitles and do it + (when (and (-> *setting-control* user-current subtitle) (or *gui-kick-str* (= *master-mode* 'game))) + (set-action! *gui-control* (gui-action play) (-> self gui-id) + (gui-channel none) (gui-action none) (the-as string #f) (the-as (function gui-connection symbol) #f) (the-as process #f)) + + (when (= (gui-status active) (get-status *gui-control* (-> self gui-id))) + (true! subtitles-drawn?) + (protect (*display-text-box*) + (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) + (set-speaker-color (-> line-queue i line speaker)) + (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) + ) + + ;; save this for later usage + (set! last-height this-height) + (1+! lines-done) + ) + ) + + (set! (-> self have-subtitles?) subtitles-drawn?) + (when (not (-> self have-subtitles?)) + (set-action! *gui-control* (gui-action hidden) (-> self gui-id) + (gui-channel none) (gui-action none) (the-as string #f) (the-as (function gui-connection symbol) #f) (the-as process #f))) + + (set! (-> self font origin y) start-y))) + + 0) + +(when *debug-segment* +(defmethod debug-print-queue subtitle2 ((self subtitle2)) + "print the queue to *stdcon*" + + (format *stdcon* "q: ~%") + (dotimes (i PC_SUBTITLE_QUEUE_SIZE) + (if (-> self queue i gui) + (format *stdcon* "~D: ~S ~3L~D~0L ~D ~`gui-connection`P~%" i + (-> self queue i gui name) + (the int (current-subtitle2-pos (-> self queue i id))) + (-> self queue i id) + (-> self queue i gui)))) + + (format *stdcon* "l: ~%") + (let ((line-queue (if (zero? (-> self line-queue-idx)) (-> self lines-0) (-> self lines-1)))) + (dotimes (i PC_SUBTITLE_MAX_LINES) + (format *stdcon* "~D: ~D ~S~%" i (the int (-> line-queue i y)) (aif (-> line-queue i line) (-> it text))))) + + 0) + +(defmethod debug-print-speakers subtitle2 ((self subtitle2)) + "print all speakers onscreen" + + (if (not *subtitle2-text*) + (return 0)) + + (let ((font (new 'stack 'font-context *font-default-matrix* 0 0 0.0 (font-color default) (font-flags shadow kerning large))) + (col-wid (/ 512.0 3))) + (set-width! font (the int col-wid)) + (set-height! font 44) + (set-scale! font 0.5) + + (dotimes (i (-> *subtitle2-text* speaker-length)) + (set-speaker-color (the pc-subtitle2-speaker i)) + (+! (-> font origin y) (print-game-text (string-format "~33L~S" (get-speaker *subtitle2-text* (the pc-subtitle2-speaker i))) + font #f 44 (bucket-id debug-no-zbuf2))) + (when (< 416.0 (-> font origin y)) + (set! (-> font origin y) 0.0) + (+! (-> font origin x) col-wid)) + )) + + 0) +) + +(defmethod start-gui subtitle2 ((self subtitle2)) + "start gui queueing" + (set! (-> self gui-id) (add-process *gui-control* self (gui-channel subtitle-pc) (gui-action hidden) "subtitle2" (meters 20) 0)) + ) + +(defmethod stop-gui subtitle2 ((self subtitle2)) + "stop gui queueing" + (set-action! *gui-control* (gui-action stop) (-> self gui-id) + (gui-channel none) + (gui-action none) + (the-as string #f) + (the-as (function gui-connection symbol) #f) + (the-as process #f)) + (set! (-> self gui-id) (new 'static 'sound-id)) + ) + +(defstate subtitle2-process (subtitle2) + + :event (behavior ((from process) (argc int) (msg symbol) (block event-message-block)) + (case msg + (('movie 'movie-no-subtitle) + ;; we are receiving parameters for a movie subtitle! + (when (not *subtitle2-text*) + (format 0 "movie subtitle: no text loaded~%") + (return #f)) + + (set! (-> self movie-gui) (lookup-gui-connection *gui-control* (the process #f) (gui-channel art-load) (the-as string (-> block param 0)) (new 'static 'sound-id))) + (when (not (-> self movie-gui)) + (format 0 "movie subtitle: no gui found~%") + (return #f)) + + (set! (-> self movie-mode?) #t) + (set! (-> self movie-pos) (the-as float (-> block param 2))) + + (when (!= msg 'movie-no-subtitle) + (copyn-charp<-string (-> self movie-line data) (the-as string (-> block param 1)) + (-> self movie-line allocated-length)) + (set! (-> self have-message?) #f) + (set! (-> self have-minimap?) #f) + (set! (-> self have-subtitles?) #f) + (setup-subtitle2-font (-> self font)) + ;; we're gonna use the same font as the movie subtitles + (set-origin! (-> self font) 20 290) + (set-width! (-> self font) 465) + (set-height! (-> self font) 70) + (set-scale! (-> self font) 0.5) + + (when (= (-> *setting-control* user-current subtitle-language) (language-enum korean)) + (set-scale! (-> self font) 0.6)) + ) + #t) + ) + ) + + :code (behavior () + (loop + (suspend)) + ) + + :trans (behavior () + (when *debug-segment* + (when (and (cpad-hold? 0 l3) (cpad-pressed? 0 r3)) + (cpad-clear! 0 r3) + (set! (-> self cheat-backup) *cheat-mode*) + (set! *cheat-mode* 'camera) + (set-master-mode 'pause) + (go subtitle2-debug) + ) + ) + + (load-level-subtitle2-files 0) + + ;; get subtitles + (cond + ((not (-> self movie-mode?)) + ;; get rid of invalid gui entries + (update-gui-connections self) + ;; queue up valid ones + (get-active-subtitles self) + ) + ((-> self movie-gui) + ;; wipe the queue + (clear-queue self) + ;; queue up the movie gui - this is the only one we want in movie mode + (add-to-queue self (-> self movie-gui)) + ) + (else + ;; something weird happened + (if *debug-segment* + (format #t "bad movie gui~%")) + (set! (-> self movie-mode?) #f) + (clear-queue self)) + ) + + (none)) + + :post (behavior () + + (draw-subtitles self) + + (when *debug-segment* + (if *display-subtitle-speakers* + (debug-print-speakers self)) + (if PC_SUBTITLE_DEBUG + (debug-print-queue self)) + ) + + (when (-> self movie-mode?) + (if *debug-segment* + (format *stdcon* "subtitle2 movie-mode~%")) + (set! (-> self movie-gui) #f) + (set! (-> self movie-mode?) #f) + (clear (-> self movie-line)) + ) + 0) + + ) + + +(defstate subtitle2-debug (subtitle2) + + :trans (behavior () + + (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) + (bucket-id debug-no-zbuf2)) + + (draw-string-xy "~3LSUBTITLE DEBUG!~0L" buf 14 (+ PC_SUB_DBG_Y (* 0 15)) (font-color default) (font-flags shadow kerning)) + (draw-string-xy "L3+R3: exit" buf 14 (+ PC_SUB_DBG_Y (* 1 15)) (font-color default) (font-flags shadow kerning)) + (if (!= 'pause *master-mode*) + (draw-string-xy "Pause the game to continue" buf 14 (+ PC_SUB_DBG_Y (* 2 15)) (font-color default) (font-flags shadow kerning))) + + (when (= 'pause *master-mode*) + ;(draw-string-xy "L3+X: debug lines" buf 14 (+ PC_SUB_DBG_Y (* 2 15)) (font-color default) (font-flags shadow kerning)) + ;(draw-string-xy "L3+Triangle: debug box" buf 14 (+ PC_SUB_DBG_Y (* 3 15)) (font-color default) (font-flags shadow kerning)) + + (cond + ((or (not *subtitle2-text*) (zero? (-> *subtitle2-text* length))) + (draw-string-xy "NO SUBTITLES LOADED!!!" buf 14 (+ PC_SUB_DBG_Y (* 10 15)) (font-color red) (font-flags shadow kerning)) + (load-level-subtitle2-files 0) + (set! (-> self current-debug-scene) 0) + (set! (-> self current-debug-line) 0) + ) + (else + + (cond + ((cpad-pressed? 0 square) + (true! (-> self checking-lines?)) + ) + ((cpad-pressed? 0 left) + (if (> (-> self current-debug-line) 0) + (1-! (-> self current-debug-line))) + ) + ((cpad-pressed? 0 right) + (if (< (-> self current-debug-line) (1- (-> *subtitle2-text* data (-> self current-debug-scene) length))) + (1+! (-> self current-debug-line))) + ) + ((or (cpad-pressed? 0 up) (and (cpad-hold? 0 l2) (cpad-hold? 0 up))) + (when (> (-> self current-debug-scene) 0) + (1-! (-> self current-debug-scene)) + (set! (-> self current-debug-line) 0)) + ) + ((or (cpad-pressed? 0 down) (and (cpad-hold? 0 l2) (cpad-hold? 0 down))) + (when (< (-> self current-debug-scene) (1- (-> *subtitle2-text* length))) + (1+! (-> self current-debug-scene)) + (set! (-> self current-debug-line) 0)) + ) + ) + + (let ((cur-scene (-> *subtitle2-text* data (-> self current-debug-scene)))) + (if (nonzero? (-> cur-scene length)) + (set! (-> self current-debug-subtitle) (-> *subtitle2-text* data (-> self current-debug-scene) lines (-> self current-debug-line))) + (set! (-> self current-debug-subtitle) #f)) + + (draw-string-xy "Up/down: Pick scene" buf 14 (+ PC_SUB_DBG_Y (* 4 15)) (font-color default) (font-flags shadow kerning)) + (draw-string-xy "L2+Up/down: Pick scene (fast)" buf 14 (+ PC_SUB_DBG_Y (* 5 15)) (font-color default) (font-flags shadow kerning)) + (draw-string-xy "Left/right: Pick line" buf 14 (+ PC_SUB_DBG_Y (* 6 15)) (font-color default) (font-flags shadow kerning)) + (draw-string-xy "Square: Check all line heights" buf 14 (+ PC_SUB_DBG_Y (* 7 15)) (font-color default) (font-flags shadow kerning)) + (draw-string-xy (string-format "Scene: ~D/~D (~S)" (1+ (-> self current-debug-scene)) (-> *subtitle2-text* length) (-> cur-scene name)) + buf 14 (+ PC_SUB_DBG_Y (* 8 15)) (font-color default) (font-flags shadow kerning)) + (draw-string-xy (string-format "Line: ~D/~D" (1+ (-> self current-debug-line)) (-> cur-scene length)) + buf 14 (+ PC_SUB_DBG_Y (* 9 15)) (font-color default) (font-flags shadow kerning)) + ) + + ) + ) + )) + + (when (-> self checking-lines?) + (false! (-> self checking-lines?)) + (go subtitle2-debug-checking-lines) + ) + (when (and (cpad-hold? 0 l3) (cpad-pressed? 0 r3)) + (cpad-clear! 0 r3) + (set! *cheat-mode* (-> self cheat-backup)) + (set-master-mode 'game) + (go subtitle2-process) + ) + + (none)) + + :code (-> subtitle2-process code) + :post (behavior () + (set! (-> self movie-mode?) #f) + (set! (-> self have-message?) #f) + (set! (-> self have-minimap?) #f) + (set! (-> self have-subtitles?) #f) + (setup-subtitle2-font (-> self font)) + (when (-> self current-debug-subtitle) + (set-speaker-color (-> self current-debug-subtitle speaker)) + (print-game-text (subtitle-format self (-> self current-debug-subtitle)) (-> self font) #f 44 (bucket-id debug-no-zbuf2)) + ) + 0) + + ) + +(defstate subtitle2-debug-checking-lines (subtitle2) + + :trans (behavior () + (set! (-> self movie-mode?) #f) + (set! (-> self have-message?) #f) + (set! (-> self have-minimap?) #f) + (set! (-> self have-subtitles?) #f) + (setup-subtitle2-font (-> self font)) + (none)) + + :code (behavior () + (protect ((-> *pc-settings* subtitle-speaker?)) + (set! (-> *pc-settings* subtitle-speaker?) #t) + (let ((lines-so-far 0) + (lines-this-frame 0) + (bad-lines 0)) + (dotimes (i (length *subtitle2-text*)) + (dotimes (ii (length (-> *subtitle2-text* data i))) + (when (= lines-this-frame PC_SUB_DBG_CHECK_GROUP_SIZE) + (set! lines-this-frame 0) + (suspend)) + + (1+! lines-this-frame) + (set! (-> self current-debug-subtitle) (-> *subtitle2-text* data i lines ii)) + (set-speaker-color (-> self current-debug-subtitle speaker)) + (when (< (* (-> *SUBTITLE2-bank* lines) 22) (print-game-text (subtitle-format self (-> self current-debug-subtitle)) (-> self font) #f 44 (bucket-id debug-no-zbuf2))) + (format 0 "ERROR: LINE ~D IN SCENE ~D IS TOO LARGE!~%" (1+ ii) (1+ i)) + (format #t "ERROR: LINE ~D IN SCENE ~D IS TOO LARGE!~%" (1+ ii) (1+ i)) + (1+! bad-lines) + ) + ) + ) + (suspend) + (if (> bad-lines 0) + (format 0 "error: ~D bad lines detected.~%" bad-lines) + (format 0 "no bad lines detected!~%" bad-lines)) + )) + (go subtitle2-debug) + ) + :post (behavior () + (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) + (bucket-id debug2)) + (draw-string-xy "Checking for bad lines... See console for info" buf 14 PC_SUB_DBG_Y (font-color red) (font-flags shadow kerning)) + ) + (draw-debug-text-box (-> self font)) + 0) + + ) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; helper functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defmethod deactivate subtitle2 ((self subtitle2)) + + (stop-gui self) + ;; not sure this works... + (if (= (ppointer->process *subtitle2*) self) + (set! *subtitle2* #f)) + + ((method-of-type process deactivate) self) + (none) + ) + +(defbehavior subtitle2-init-by-other subtitle2 () + "external initializer for subtitle2 process" + + (set! (-> self font) (new 'process 'font-context *font-default-matrix* + 0 0 0.0 (font-color default) (font-flags shadow kerning left middle large))) + (clear-queue self) + (dotimes (i PC_SUBTITLE_MAX_LINES) + (set! (-> self lines-0 i line) #f) + (set! (-> self lines-0 i y) PC_SUBTITLE_Y_RECALC) + (set! (-> self lines-1 i line) #f) + (set! (-> self lines-1 i y) PC_SUBTITLE_Y_RECALC) + ) + + (set! (-> self have-message?) #f) + (set! (-> self have-minimap?) #f) + (set! (-> self have-subtitles?) #f) + + (set! (-> self movie-mode?) #f) + (set! (-> self movie-line) (new 'process 'string (+ 7 (* 15 16)) (the string #f))) + + (set! (-> self current-debug-scene) 0) + (set! (-> self current-debug-line) 0) + (set! (-> self current-debug-subtitle) #f) + (set! (-> self checking-lines?) #f) + + (start-gui self) + + (go subtitle2-process) + ) + + +(defun subtitle2-stop () + "kill the subtitle2 process" + + (if *subtitle2* + (deactivate (ppointer->process *subtitle2*))) + *subtitle2*) + +(defun subtitle2-start () + "start the subtitle2 process" + + ;; fill the subtitle speaker table + (set-subtitle-speaker-colors) + + (if *subtitle2* + (subtitle2-stop)) + + (set! *subtitle2* (process-spawn subtitle2 :from *pc-dead-pool* :to *pc-pool*)) + ) + +;; start the subtitle2 process when this file loads. +(subtitle2-start) + + + diff --git a/goalc/compiler/compilation/CompilerControl.cpp b/goalc/compiler/compilation/CompilerControl.cpp index f4f4ba23ec..659ecd94e5 100644 --- a/goalc/compiler/compilation/CompilerControl.cpp +++ b/goalc/compiler/compilation/CompilerControl.cpp @@ -103,6 +103,18 @@ Val* Compiler::compile_asm_text_file(const goos::Object& form, const goos::Objec db.m_subtitle_groups = std::make_unique(); db.m_subtitle_groups->hydrate_from_asset_file(); compile_game_subtitle(inputs, db, m_make.compiler_output_prefix()); + } else if (kind == "subtitle2") { + std::vector inputs; + // open all project files specified (usually one). + for_each_in_list(args.named.at("files"), [this, &inputs, &form, &kind](const goos::Object& o) { + if (o.is_string()) { + open_subtitle2_project(kind, o.as_string()->data, inputs); + } else { + throw_compiler_error(form, "Invalid object {} in asm-text-file files list.", o.print()); + } + }); + GameSubtitle2DB db(m_version); + compile_game_subtitle2(inputs, db, m_make.compiler_output_prefix()); } else if (kind == "text") { std::vector inputs; // open all project files specified (usually one). diff --git a/goalc/data_compiler/game_text_common.cpp b/goalc/data_compiler/game_text_common.cpp index 9ec2ed4ed2..9b9e3d19c0 100644 --- a/goalc/data_compiler/game_text_common.cpp +++ b/goalc/data_compiler/game_text_common.cpp @@ -143,6 +143,83 @@ void compile_subtitle(GameSubtitleDB& db, const std::string& output_prefix) { data.data(), data.size()); } } + +/*! + * Write game subtitle2 data to a file. Uses the V2 object format which is identical between GOAL + * and OpenGOAL. + */ +void compile_subtitle2(GameSubtitle2DB& db, const std::string& output_prefix) { + auto& speaker_names = get_speaker_names(db.version()); + for (const auto& [lang, bank] : db.banks()) { + auto font = get_font_bank(bank->text_version); + DataObjectGenerator gen; + gen.add_type_tag("subtitle2-text-info"); // type + gen.add_word((bank->scenes.size() & 0xffff) | (1 << 16)); // length (lo) + version (hi) + // note: we add 1 because "none" isn't included + gen.add_word((lang & 0xffff) | ((speaker_names.size() + 1) << 16)); // lang + speaker-length + int speaker_array_link = gen.add_word(0); // speaker array (dummy for now) + + auto speaker_index_by_name = [&speaker_names](const std::string& name) { + for (int i = 0; i < speaker_names.size(); ++i) { + if (speaker_names.at(i) == name) { + return i + 1; + } + } + return 0; + }; + + // fifo queue for scene data arrays + std::queue array_link_sources; + // now add all the scenes inline + for (auto& [name, scene] : bank->scenes) { + gen.add_ref_to_string_in_pool(name); // scene name + gen.add_word(scene.lines.size()); // line amount + array_link_sources.push(gen.words()); + gen.add_word(0); // line array (linked later) + } + // now add all the line arrays and link them to their scene + for (auto& [name, scene] : bank->scenes) { + // link inline-array with reference from earlier + gen.link_word_to_word(array_link_sources.front(), gen.words()); + array_link_sources.pop(); + + for (auto& line : scene.lines) { + gen.add_word_float(line.start); // start frame + gen.add_word_float(line.end); // end frame + if (!line.merge) { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(line.text)); // line text + } else { + gen.add_symbol_link("#f"); + } + u16 speaker = speaker_index_by_name(line.speaker); + u16 flags = 0; + flags |= line.offscreen << 0; + flags |= line.merge << 1; + gen.add_word(speaker | (flags << 16)); // speaker (lo) + flags (hi) + } + } + // now write the array of strings for the speakers + gen.link_word_to_word(speaker_array_link, gen.words()); + // we write #f for invalid entries, including the "none" at the start + gen.add_symbol_link("#f"); + for (auto& speaker_name : speaker_names) { + if (bank->speakers.count(speaker_name) == 0) { + // no speaker for this + gen.add_symbol_link("#f"); + } else { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(bank->speakers.at(speaker_name))); + } + } + + auto data = gen.generate_v2(); + + file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); + file_util::write_binary_file( + file_util::get_file_path( + {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase("subti2"))}), + data.data(), data.size()); + } +} } // namespace /*! @@ -183,3 +260,14 @@ void compile_game_subtitle(const std::vector& files, } compile_subtitle(db, output_prefix); } + +void compile_game_subtitle2(const std::vector& files, + GameSubtitle2DB& db, + const std::string& output_prefix) { + goos::Reader reader; + for (auto& file : files) { + lg::print("[Build Game Subtitle] JSON {}\n", file.file_path); + parse_subtitle2_json(db, file); + } + compile_subtitle2(db, output_prefix); +} diff --git a/goalc/data_compiler/game_text_common.h b/goalc/data_compiler/game_text_common.h index f491c6e16f..07ec03d36d 100644 --- a/goalc/data_compiler/game_text_common.h +++ b/goalc/data_compiler/game_text_common.h @@ -6,6 +6,7 @@ #include #include "common/serialization/subtitles/subtitles_ser.h" +#include "common/serialization/subtitles2/subtitles2_ser.h" #include "common/util/Assert.h" #include "common/util/FontUtils.h" @@ -15,3 +16,6 @@ void compile_game_text(const std::vector& filenames, void compile_game_subtitle(const std::vector& filenames, GameSubtitleDB& db, const std::string& output_prefix); +void compile_game_subtitle2(const std::vector& filenames, + GameSubtitle2DB& db, + const std::string& output_prefix); diff --git a/goalc/main.cpp b/goalc/main.cpp index c41f1e92cc..cc80e2acf7 100644 --- a/goalc/main.cpp +++ b/goalc/main.cpp @@ -31,7 +31,7 @@ int main(int argc, char** argv) { std::string cmd = ""; std::string username = "#f"; std::string game = "jak1"; - int nrepl_port = 8181; + int nrepl_port = -1; fs::path project_path_override; // TODO - a lot of these flags could be deprecated and moved into `repl-config.json` @@ -40,7 +40,8 @@ int main(int argc, char** argv) { app.add_option("-c,--cmd", cmd, "Specify a command to run, no REPL is launched in this mode"); app.add_option("-u,--user", username, "Specify the username to use for your user profile in 'goal_src/user/'"); - app.add_option("-p,--port", nrepl_port, "Specify the nREPL port. Defaults to 8181"); + app.add_option("-p,--port", nrepl_port, + "Specify the nREPL port. Defaults to 8181 for Jak 1 and 8182 for Jak 2"); app.add_flag("--user-auto", auto_find_user, "Attempt to automatically deduce the user, overrides '--user'"); app.add_option("-g,--game", game, "The game name: 'jak1' or 'jak2'"); @@ -50,6 +51,17 @@ int main(int argc, char** argv) { CLI11_PARSE(app, argc, argv); GameVersion game_version = game_name_to_version(game); + if (nrepl_port == -1) { + switch (game_version) { + default: + case GameVersion::Jak1: + nrepl_port = 8181; + break; + case GameVersion::Jak2: + nrepl_port = 8182; + break; + } + } if (!project_path_override.empty()) { if (!fs::exists(project_path_override)) { diff --git a/goalc/make/MakeSystem.cpp b/goalc/make/MakeSystem.cpp index 5bb825494c..4cc53d16db 100644 --- a/goalc/make/MakeSystem.cpp +++ b/goalc/make/MakeSystem.cpp @@ -100,6 +100,7 @@ MakeSystem::MakeSystem(const std::optional repl_config, const std: add_tool(); add_tool(); add_tool(); + add_tool(); add_tool(); } diff --git a/goalc/make/Tools.cpp b/goalc/make/Tools.cpp index 41ef3db01b..03e875973a 100644 --- a/goalc/make/Tools.cpp +++ b/goalc/make/Tools.cpp @@ -214,6 +214,33 @@ bool SubtitleTool::run(const ToolInput& task, const PathMap& path_map) { return true; } +Subtitle2Tool::Subtitle2Tool() : Tool("subtitle2") {} + +bool Subtitle2Tool::needs_run(const ToolInput& task, const PathMap& path_map) { + if (task.input.size() != 1) { + throw std::runtime_error(fmt::format("Invalid amount of inputs to {} tool", name())); + } + + std::vector deps; + std::vector files; + open_subtitle2_project("subtitle2", task.input.at(0), files); + for (auto& file : files) { + deps.push_back(path_map.apply_remaps(file.file_path)); + } + return Tool::needs_run({task.input, deps, task.output, task.arg}, path_map); +} + +bool Subtitle2Tool::run(const ToolInput& task, const PathMap& path_map) { + GameSubtitle2DB db(GameVersion::Jak2); // TODO game version param + std::vector files; + open_subtitle2_project("subtitle2", task.input.at(0), files); + for (auto& file : files) { + file.file_path = path_map.apply_remaps(file.file_path); + } + compile_game_subtitle2(files, db, path_map.output_prefix); + return true; +} + BuildLevelTool::BuildLevelTool() : Tool("build-level") {} bool BuildLevelTool::needs_run(const ToolInput& task, const PathMap& path_map) { diff --git a/goalc/make/Tools.h b/goalc/make/Tools.h index c3cadd253e..48df8209b2 100644 --- a/goalc/make/Tools.h +++ b/goalc/make/Tools.h @@ -65,6 +65,13 @@ class SubtitleTool : public Tool { bool needs_run(const ToolInput& task, const PathMap& path_map) override; }; +class Subtitle2Tool : public Tool { + public: + Subtitle2Tool(); + bool run(const ToolInput& task, const PathMap& path_map) override; + bool needs_run(const ToolInput& task, const PathMap& path_map) override; +}; + class BuildLevelTool : public Tool { public: BuildLevelTool(); diff --git a/scripts/batch/gk2-demo.bat b/scripts/batch/gk2-demo.bat new file mode 100644 index 0000000000..0b0768547a --- /dev/null +++ b/scripts/batch/gk2-demo.bat @@ -0,0 +1,4 @@ +@echo off +cd ..\.. +out\build\Release\bin\gk -v --game jak2 -- -boot -fakeiso -demo +pause diff --git a/scripts/batch/gk2-release.bat b/scripts/batch/gk2-release.bat new file mode 100644 index 0000000000..2cce29099e --- /dev/null +++ b/scripts/batch/gk2-release.bat @@ -0,0 +1,4 @@ +@echo off +cd ..\.. +out\build\Release\bin\gk -v --game jak2 -- -boot -fakeiso +pause diff --git a/scripts/subtitle2_gen.py b/scripts/subtitle2_gen.py new file mode 100644 index 0000000000..e7735d5eb5 --- /dev/null +++ b/scripts/subtitle2_gen.py @@ -0,0 +1,101 @@ +import json +import argparse +import re + +# script to generate dummy subtitle2 JSON entries for a given speaker +# usage: python subtitle2-gen.py +# to get the vag list, run (vag-list-to-file "file-name") in the REPL + +# speaker regexes +speakers = { + "computer": "cityv[0-9]{3}$", + "jak": "(jak|jk|jd)[0-9]{3}$", + "darkjak": "", + "daxter": "(ds|dsek|dsbop)[0-9]{3}$", + "samos": "sam[0-9]{3}$", + "keira": "kei[0-9]{3}$", + "keira-before-class-3": "kei[0-9]{3}$", + "kid": "", + "kor": "kor[0-9]{3}$", + "metalkor": "", + "baron": "(bf|bar|prop)[0-9]{3}$", + "errol": "ero[0-9]{3}$", + "torn": "(bb|tor|torn)[0-9]{3}$", + "tess": "(tess|tswm)[0-9]{3}$", + "guard": "kgv?[0-9]{3}$", + "guard-a": "kg[0-9]{3}a", + "guard-b": "kg[0-9]{3}b", + "krew": "(krew|kwbf)[0-9]{3}$", + "sig": "(sigt|sigc)[0-9]{3}$", + "brutter": "bru[0-9]{3}$", + "vin": "vin[0-9]{3}$", + "youngsamos": "ys[0-9]{3}$", + "youngsamos-before-rescue": "", + "pecker": "pek[0-9]{3}$", + "onin": "", + "ashelin": "asha[0-9]{3}$", + "jinx": "hal[0-9]{3}$", + "mog": "hal[0-9]{3}$", + "grim": "hal[0-9]{3}$", + "agent": "agnt[0-9]{3}$", + # there's no clear pattern for what citizen line is male or female, but this seems to be the closest match + "citizen-male": "cit[0-9]{3}(a|b)?$", + "citizen-female": "cit[0-9]{3}(c|d)$", + "oracle": "ora[0-9]{3}$", + "precursor": "", +} + +vag_list = [] + +sub_json = {} + +def read_vag_list(file_name): + with open(file_name) as f: + for line in f: + vag_list.append(line.strip()) + +def gen_json_for_speaker(speaker): + sub = { + "lines": [ + { + "end": 10000.0, + "merge": False, + "offscreen": True, + "speaker": speaker, + "start": 0.0, + "text": "TODO", + } + ] + } + return sub + +def get_vags_for_speaker(speaker): + vags = [] + names = speakers[speaker] + if not names: + return [] + else: + reg = re.compile(names) + result = list(filter(reg.match, vag_list)) + vags.extend(result) + return vags + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("vag_list", type=str) + parser.add_argument("speaker", type=str) + args = parser.parse_args() + + read_vag_list(args.vag_list) + try: + vags = get_vags_for_speaker(args.speaker) + except KeyError: + print("No vags found for speaker " + args.speaker) + exit(1) + for vag in vags: + sub_json[vag] = (gen_json_for_speaker(args.speaker)) + with open (args.speaker + "_subs.json", "w") as f: + json.dump(sub_json, f, indent=2) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/test/decompiler/reference/jak2/engine/ambient/ambient_REF.gc b/test/decompiler/reference/jak2/engine/ambient/ambient_REF.gc index 7bfcfbee98..9ce3de889f 100644 --- a/test/decompiler/reference/jak2/engine/ambient/ambient_REF.gc +++ b/test/decompiler/reference/jak2/engine/ambient/ambient_REF.gc @@ -184,9 +184,11 @@ ) (play-communicator-speech! arg0) ) - (set! s2-0 (lookup-gui-connection-id *gui-control* (-> arg0 name) (-> arg0 channel) (gui-action none))) + (set! s2-0 + (the-as int (lookup-gui-connection-id *gui-control* (-> arg0 name) (-> arg0 channel) (gui-action none))) + ) (set! s2-0 (cond - ((zero? s2-0) + ((zero? (the-as sound-id s2-0)) (let ((v1-17 (process-spawn talker :init talker-init arg0 arg2 arg3 :to arg1))) (cond (v1-17 @@ -547,7 +549,3 @@ :virtual #t :code (the-as (function none :behavior talker) nothing) ) - - - - diff --git a/test/decompiler/reference/jak2/engine/anim/joint-exploder_REF.gc b/test/decompiler/reference/jak2/engine/anim/joint-exploder_REF.gc index 5e48cd428d..daf99f1881 100644 --- a/test/decompiler/reference/jak2/engine/anim/joint-exploder_REF.gc +++ b/test/decompiler/reference/jak2/engine/anim/joint-exploder_REF.gc @@ -881,7 +881,7 @@ (quaternion-copy! (-> self root quat) (-> (the-as process-drawable (-> self parent 0)) root quat)) (set! (-> self root scale quad) (-> (the-as process-drawable (-> self parent 0)) root scale quad)) (when (-> arg3 art-level) - (let ((a1-6 (entity-actor-from-level-name (the-as level (-> arg3 art-level))))) + (let ((a1-6 (entity-actor-from-level-name (-> arg3 art-level)))) (if a1-6 (process-entity-set! self a1-6) ) diff --git a/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc b/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc index ce1a1f1bbb..ab4aed92b2 100644 --- a/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/default-menu_REF.gc @@ -2761,7 +2761,7 @@ (a0-5 arg1) ) (when (if (= a0-5 'test) - (logtest? (continue-flags cf17) (-> (the-as continue-point v1-2) flags)) + (logtest? (continue-flags test) (-> (the-as continue-point v1-2) flags)) #t ) (let ((s2-0 (method-of-type pair new)) diff --git a/test/decompiler/reference/jak2/engine/debug/viewer_REF.gc b/test/decompiler/reference/jak2/engine/debug/viewer_REF.gc index c36b716a9c..e25b2c7ec4 100644 --- a/test/decompiler/reference/jak2/engine/debug/viewer_REF.gc +++ b/test/decompiler/reference/jak2/engine/debug/viewer_REF.gc @@ -289,6 +289,6 @@ This commonly includes things such as: ;; WARN: Return type mismatch symbol vs object. (defun birth-viewer ((arg0 process) (arg1 entity-actor)) (set! (-> arg0 type) viewer) - (init-entity arg0 arg1 (the-as process viewer)) + (init-entity arg0 arg1 viewer) (the-as object #t) ) diff --git a/test/decompiler/reference/jak2/engine/entity/entity_REF.gc b/test/decompiler/reference/jak2/engine/entity/entity_REF.gc index 554d647153..a6048aeb7e 100644 --- a/test/decompiler/reference/jak2/engine/entity/entity_REF.gc +++ b/test/decompiler/reference/jak2/engine/entity/entity_REF.gc @@ -234,7 +234,7 @@ ;; definition for function entity-actor-from-level-name ;; WARN: Return type mismatch entity vs entity-actor. -(defun entity-actor-from-level-name ((arg0 level)) +(defun entity-actor-from-level-name ((arg0 symbol)) (let ((v0-0 (the-as entity #f))) (dotimes (s5-0 (-> *level* length)) (let ((s4-0 (-> *level* level s5-0))) @@ -1788,7 +1788,7 @@ ;; definition for function init-entity ;; WARN: Return type mismatch process vs none. -(defun init-entity ((arg0 process) (arg1 entity-actor) (arg2 process)) +(defun init-entity ((arg0 process) (arg1 entity-actor) (arg2 type)) (activate arg0 *entity-pool* (res-lump-struct arg1 'name basic) (the-as pointer #x70004000)) (set! (-> arg0 entity) arg1) (set! (-> arg0 level) (-> arg1 extra level)) @@ -1818,7 +1818,7 @@ (valid? (method-of-object s4-0 init-from-entity!) function (the-as string #f) #f 0) ) ) - (init-entity s4-0 obj (the-as process s5-0)) + (init-entity s4-0 obj s5-0) ) (else (when (not (birth-viewer s4-0 obj)) diff --git a/test/decompiler/reference/jak2/engine/game/game-info_REF.gc b/test/decompiler/reference/jak2/engine/game/game-info_REF.gc index c61d1e7f00..4d779b3f43 100644 --- a/test/decompiler/reference/jak2/engine/game/game-info_REF.gc +++ b/test/decompiler/reference/jak2/engine/game/game-info_REF.gc @@ -71,7 +71,7 @@ (new 'static 'continue-point :name "default" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :w 1.0) @@ -227,7 +227,7 @@ ) ) ) - (if (and (logtest? (-> obj current-continue flags) (continue-flags cf2)) + (if (and (logtest? (-> obj current-continue flags) (continue-flags change-continue)) (and (!= (-> obj current-continue) *default-continue*) (not arg1)) ) (set! (-> obj current-continue) s5-0) @@ -1274,7 +1274,7 @@ (let ((conts (-> (the-as level-load-info (-> (the-as symbol (car levels)) value)) continues))) (while (not (null? conts)) (let ((cont (the-as continue-point (car conts)))) - (if (not (logtest? (-> cont flags) (continue-flags cf2))) + (if (not (logtest? (-> cont flags) (continue-flags change-continue))) (format #t "~S~%" (-> cont name)) ) ) diff --git a/test/decompiler/reference/jak2/engine/level/level-info_REF.gc b/test/decompiler/reference/jak2/engine/level/level-info_REF.gc index 43968b0894..1ae66eb5a3 100644 --- a/test/decompiler/reference/jak2/engine/level/level-info_REF.gc +++ b/test/decompiler/reference/jak2/engine/level/level-info_REF.gc @@ -158,7 +158,7 @@ :continues '((new 'static 'continue-point :name "demo-start" :level 'demo - :flags (continue-flags cf8) + :flags (continue-flags demo) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -182,7 +182,7 @@ (new 'static 'continue-point :name "demo-restart" :level 'demo - :flags (continue-flags cf8) + :flags (continue-flags demo) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -229,7 +229,7 @@ (new 'static 'continue-point :name "demo-movie-end" :level 'demo - :flags (continue-flags cf11) + :flags (continue-flags demo-movie) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -253,7 +253,7 @@ (new 'static 'continue-point :name "lkiddoge-skip0" :level 'demo - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4468809.5 :y 32759.809 :z 775372.4 :w 1.0) :quat (new 'static 'vector :y -0.8818 :w -0.4715) :camera-trans (new 'static 'vector :x 4418151.0 :y 53856.258 :z 783193.3 :w 1.0) @@ -332,7 +332,7 @@ :continues '((new 'static 'continue-point :name "title-start" :level 'title - :flags (continue-flags cf12) + :flags (continue-flags title) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -356,7 +356,7 @@ (new 'static 'continue-point :name "title-restart" :level 'title - :flags (continue-flags cf12) + :flags (continue-flags title) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -380,7 +380,7 @@ (new 'static 'continue-point :name "title-movie" :level 'title - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 4349280.0 :y 54451.406 :z 960109.4 :w 1.0) @@ -404,7 +404,7 @@ (new 'static 'continue-point :name "title-movie-end" :level 'title - :flags (continue-flags cf2 cf13) + :flags (continue-flags change-continue title-movie) :trans (new 'static 'vector :x 4014080.0 :y 348160.0 :z 1417216.0 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 76871.68 :y 55061.707 :z -938752.0 :w 1.0) @@ -507,7 +507,7 @@ (new 'static 'continue-point :name "vinroom-face-warp" :level 'vinroom - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4589356.0 :y 104436.53 :z 4648794.0 :w 1.0) :quat (new 'static 'vector :y -0.0314 :w -0.9995) :camera-trans (new 'static 'vector :x 4588769.0 :y 125421.16 :z 4597935.5 :w 1.0) @@ -531,7 +531,7 @@ (new 'static 'continue-point :name "vinroom-face-door" :level 'vinroom - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4539276.5 :y 104448.0 :z 4540455.0 :w 1.0) :quat (new 'static 'vector :y 0.9082 :w -0.4184) :camera-trans (new 'static 'vector :x 4575779.0 :y 125541.99 :z 4576384.0 :w 1.0) @@ -555,7 +555,7 @@ (new 'static 'continue-point :name "vinroom-movie" :level 'vinroom - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4544927.5 :y 104448.0 :z 4547219.5 :w 1.0) :quat (new 'static 'vector :y 0.5579 :w 0.8298) :camera-trans (new 'static 'vector :x 4518831.0 :y 122459.75 :z 4524515.5 :w 1.0) @@ -579,7 +579,7 @@ (new 'static 'continue-point :name "vinroom-warp" :level 'vinroom - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x 4587913.0 :y 104439.805 :z 4673306.0 :w 1.0) :quat (new 'static 'vector :y -0.9985 :w 0.0533) :camera-trans (new 'static 'vector :x 4586831.5 :y 123462.86 :z 4636004.5 :w 1.0) @@ -603,7 +603,7 @@ (new 'static 'continue-point :name "vinroom-demo" :level 'vinroom - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4590761.0 :y 104436.53 :z 4592729.0 :w 1.0) :quat (new 'static 'vector :y -0.8565 :w 0.516) :camera-trans (new 'static 'vector :x 4562904.0 :y 121919.08 :z 4567433.5 :w 1.0) @@ -627,7 +627,7 @@ (new 'static 'continue-point :name "vinroom-demo-end" :level 'vinroom - :flags (continue-flags cf2 cf6) + :flags (continue-flags change-continue demo-end) :trans (new 'static 'vector :x 4590761.0 :y 104436.53 :z 4592729.0 :w 1.0) :quat (new 'static 'vector :y -0.8565 :w 0.516) :camera-trans (new 'static 'vector :x 4562904.0 :y 121919.08 :z 4567433.5 :w 1.0) @@ -708,7 +708,7 @@ :continues '((new 'static 'continue-point :name "drill1-warp" :level 'drillmid - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x -350734.34 :y 32768.0 :z 885082.1 :w 1.0) :quat (new 'static 'vector :y -0.6878 :w 0.7258) :camera-trans (new 'static 'vector :x -391860.62 :y 53180.008 :z 885485.2 :w 1.0) @@ -732,7 +732,7 @@ (new 'static 'continue-point :name "drill-warp-gunship" :level 'drillmid - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x 108875.77 :y 65527.81 :z 27369.473 :w 1.0) :quat (new 'static 'vector :y -0.7367 :w -0.6761) :camera-trans (new 'static 'vector :x 149320.5 :y 85877.15 :z 20893.287 :w 1.0) @@ -756,7 +756,7 @@ (new 'static 'continue-point :name "drillmid-checkpoint" :level 'drillmid - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 858380.7 :y 49152.0 :z -652619.75 :w 1.0) :quat (new 'static 'vector :y 0.9999 :w -0.0117) :camera-trans (new 'static 'vector :x 859736.06 :y 70317.67 :z -609632.25 :w 1.0) @@ -780,7 +780,7 @@ (new 'static 'continue-point :name "drillmid-checkpoint-b" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -700254.2 :y 49141.35 :z -849702.06 :w 1.0) :quat (new 'static 'vector :y 0.6248 :w -0.7807) :camera-trans (new 'static 'vector :x -663167.4 :y 70235.75 :z -871562.9 :w 1.0) @@ -804,7 +804,7 @@ (new 'static 'continue-point :name "drillmid-checkpoint-c" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -711355.6 :y 98293.35 :z -723961.06 :w 1.0) :quat (new 'static 'vector :y 0.9459 :w 0.3242) :camera-trans (new 'static 'vector :x -736509.1 :y 119387.34 :z -688592.9 :w 1.0) @@ -828,7 +828,7 @@ (new 'static 'continue-point :name "drillmid-ship-warp" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 675723.25 :y 98298.67 :z -740878.75 :w 1.0) :quat (new 'static 'vector :y -0.4186 :w -0.9081) :camera-trans (new 'static 'vector :x 646477.8 :y 119392.664 :z -772429.8 :w 1.0) @@ -852,7 +852,7 @@ (new 'static 'continue-point :name "drill3-warp" :level 'drillmid - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x -350734.34 :y 32768.0 :z 885082.1 :w 1.0) :quat (new 'static 'vector :y -0.6878 :w 0.7258) :camera-trans (new 'static 'vector :x -391860.62 :y 53180.008 :z 885485.2 :w 1.0) @@ -876,7 +876,7 @@ (new 'static 'continue-point :name "drill-escape" :level 'drillmid - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 590609.2 :y -114696.6 :z -383934.47 :w 1.0) :quat (new 'static 'vector :y -0.1772 :w -0.9841) :camera-trans (new 'static 'vector :x 584495.94 :y -93804.95 :z -434038.78 :w 1.0) @@ -1122,7 +1122,7 @@ :continues '((new 'static 'continue-point :name "sewer-start" :level 'sewer - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 4626914.0 :y -207171.17 :z 2095240.8 :w 1.0) :quat (new 'static 'vector :x -0.0011 :y -0.7059 :z 0.0011 :w -0.7082) :camera-trans (new 'static 'vector :x 4575577.5 :y -186075.14 :z 2093692.5 :w 1.0) @@ -1146,7 +1146,7 @@ (new 'static 'continue-point :name "sewer-start-kiosk" :level 'sewer - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4609054.5 :y -207171.17 :z 2096862.0 :w 1.0) :quat (new 'static 'vector :x -0.001 :y -0.7399 :z 0.0009 :w -0.6726) :camera-trans (new 'static 'vector :x 4566007.5 :y -186076.78 :z 2096889.9 :w 1.0) @@ -1282,7 +1282,7 @@ :continues '((new 'static 'continue-point :name "sewesc-start" :level 'sewesc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 4510956.0 :y -199200.77 :z 2098181.0 :w 1.0) :quat (new 'static 'vector :y 0.6989 :w 0.7151) :camera-trans (new 'static 'vector :x 4481299.0 :y -183847.73 :z 2098697.8 :w 1.0) @@ -1306,7 +1306,7 @@ (new 'static 'continue-point :name "hal2-plant-first-bomb" :level 'sewesc - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4714868.5 :y -273857.75 :z 1846698.8 :w 1.0) :quat (new 'static 'vector :y -0.9872 :w 0.1593) :camera-trans (new 'static 'vector :x 4715987.0 :y -253211.44 :z 1895919.6 :w 1.0) @@ -1334,7 +1334,7 @@ (new 'static 'continue-point :name "hal2-go-elevator2" :level 'sewesc - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 4890738.5 :y -236485.84 :z 1366747.1 :w 1.0) :quat (new 'static 'vector :y -0.0163 :w 0.9998) :camera-trans (new 'static 'vector :x 4882573.5 :y -215391.03 :z 1316146.0 :w 1.0) @@ -1366,7 +1366,7 @@ (new 'static 'continue-point :name "hal2-wall2" :level 'sewesc - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 5797019.0 :y -373470.8 :z 2002612.2 :w 1.0) :quat (new 'static 'vector :y -0.5003 :w 0.8658) :camera-trans (new 'static 'vector :x 5833251.0 :y -356394.6 :z 2001096.2 :w 1.0) @@ -1503,7 +1503,7 @@ :continues '((new 'static 'continue-point :name "tomb-start" :level 'tomba - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 788477.56 :y -131086.34 :z 4270196.5 :w 1.0) :quat (new 'static 'vector :y 0.1202 :w -0.9927) :camera-trans (new 'static 'vector :x 787632.1 :y -109991.94 :z 4227172.0 :w 1.0) @@ -1534,7 +1534,7 @@ (new 'static 'continue-point :name "tomb-water-switch" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 546954.06 :y -221173.77 :z 4443352.5 :w 1.0) :quat (new 'static 'vector :y 0.4261 :w 0.9046) :camera-trans (new 'static 'vector :x 517370.25 :y -201672.7 :z 4408801.0 :w 1.0) @@ -1558,7 +1558,7 @@ (new 'static 'continue-point :name "tomb-poles-switch" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1024811.8 :y -221145.1 :z 4446944.5 :w 1.0) :quat (new 'static 'vector :y -0.3799 :w 0.9249) :camera-trans (new 'static 'vector :x 1055031.8 :y -200876.03 :z 4409347.5 :w 1.0) @@ -1582,7 +1582,7 @@ (new 'static 'continue-point :name "tomb-poles-start" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1112014.0 :y -319493.3 :z 5235235.0 :w 1.0) :quat (new 'static 'vector :y 0.627 :w 0.7789) :camera-trans (new 'static 'vector :x 1069004.8 :y -298403.84 :z 5235391.5 :w 1.0) @@ -1606,7 +1606,7 @@ (new 'static 'continue-point :name "tomb-water-start" :level 'tomba - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 301066.25 :y -249855.6 :z 5230534.5 :w 1.0) :quat (new 'static 'vector :y 0.7382 :w -0.6745) :camera-trans (new 'static 'vector :x 343957.5 :y -228723.92 :z 5233923.5 :w 1.0) @@ -1708,7 +1708,7 @@ :continues '((new 'static 'continue-point :name "tomb-boulder-pre" :level 'tombb - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 1422869.2 :y -471039.6 :z 4741993.5 :w 1.0) :quat (new 'static 'vector :y 0.9394 :w -0.3426) :camera-trans (new 'static 'vector :x 1438060.1 :y -455063.16 :z 4770099.0 :w 1.0) @@ -1732,7 +1732,7 @@ (new 'static 'continue-point :name "tomb-boulder-end" :level 'tombb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1380638.8 :y -471055.56 :z 4636391.5 :w 1.0) :quat (new 'static 'vector :y -0.9989 :w -0.0447) :camera-trans (new 'static 'vector :x 1384123.6 :y -451303.44 :z 4682465.0 :w 1.0) @@ -1811,7 +1811,7 @@ :continues '((new 'static 'continue-point :name "tombc-midpoint" :level 'tombc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -40754.79 :y -225288.61 :z 5402507.0 :w 1.0) :quat (new 'static 'vector :y 0.9992 :w -0.0391) :camera-trans (new 'static 'vector :x -35458.664 :y -204193.8 :z 5445199.5 :w 1.0) @@ -1968,7 +1968,7 @@ :continues '((new 'static 'continue-point :name "tomb-boulder" :level 'tombe - :flags (continue-flags cf3 cf22) + :flags (continue-flags no-auto indax) :trans (new 'static 'vector :x 1434184.9 :y -471039.6 :z 4588284.5 :w 1.0) :quat (new 'static 'vector :y -0.7083 :w -0.7058) :camera-trans (new 'static 'vector :x 1475034.8 :y -450687.78 :z 4586864.0 :w 1.0) @@ -1992,7 +1992,7 @@ (new 'static 'continue-point :name "tomb-boulder-explode" :level 'tombe - :flags (continue-flags cf3 cf22) + :flags (continue-flags no-auto indax) :trans (new 'static 'vector :x 1884670.0 :y -511351.2 :z 4874090.5 :w 1.0) :quat (new 'static 'vector :y 0.1226 :w -0.9924) :camera-trans (new 'static 'vector :x 1884803.1 :y -503642.53 :z 4929176.0 :w 1.0) @@ -2016,7 +2016,7 @@ (new 'static 'continue-point :name "tomb-boulder-climb" :level 'tombe - :flags (continue-flags cf3 cf22) + :flags (continue-flags no-auto indax) :trans (new 'static 'vector :x 1628354.5 :y -593924.5 :z 5830940.0 :w 1.0) :quat (new 'static 'vector :y 0.5849 :w -0.811) :camera-trans (new 'static 'vector :x 1614351.1 :y -519260.56 :z 5832011.5 :w 1.0) @@ -2153,7 +2153,7 @@ :continues '((new 'static 'continue-point :name "tombboss-start" :level 'tombboss - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 788065.5 :y -294914.06 :z 5738845.5 :w 1.0) :quat (new 'static 'vector :y 0.1262 :w 0.9919) :camera-trans (new 'static 'vector :x 790481.3 :y -274841.2 :z 5698627.0 :w 1.0) @@ -2256,7 +2256,7 @@ :continues '((new 'static 'continue-point :name "under-start" :level 'under - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -107954.99 :y -266244.1 :z 7974990.0 :w 1.0) :quat (new 'static 'vector :y -0.8287 :w 0.5596) :camera-trans (new 'static 'vector :x -62684.773 :y -245149.28 :z 7998945.5 :w 1.0) @@ -2336,7 +2336,7 @@ :continues '((new 'static 'continue-point :name "under-airlock" :level 'underb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 247507.36 :y -265523.62 :z 7132200.0 :w 1.0) :quat (new 'static 'vector :y -0.8764 :w -0.4814) :camera-trans (new 'static 'vector :x 205734.7 :y -246507.11 :z 7122904.5 :w 1.0) @@ -2360,7 +2360,7 @@ (new 'static 'continue-point :name "cent1-path0-record-path" :level 'underb - :flags (continue-flags cf2 cf21) + :flags (continue-flags change-continue record-sig) :trans (new 'static 'vector :x -324353.22 :y -274439.78 :z 8362734.5 :w 1.0) :quat (new 'static 'vector :y 0.1254 :w -0.992) :camera-trans (new 'static 'vector :x -308162.56 :y -253848.78 :z 8316009.0 :w 1.0) @@ -2384,7 +2384,7 @@ (new 'static 'continue-point :name "cent2-path0-record-path" :level 'underb - :flags (continue-flags cf2 cf21) + :flags (continue-flags change-continue record-sig) :trans (new 'static 'vector :x -855634.3 :y -290815.6 :z 7995028.5 :w 1.0) :quat (new 'static 'vector :y 0.6088 :w 0.7933) :camera-trans (new 'static 'vector :x -899652.0 :y -269720.78 :z 7968866.5 :w 1.0) @@ -2408,7 +2408,7 @@ (new 'static 'continue-point :name "sig5-skip-to-cent2" :level 'underb - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -1036247.9 :y -290824.2 :z 8022382.0 :w 1.0) :quat (new 'static 'vector :y 0.9395 :w 0.3424) :camera-trans (new 'static 'vector :x -1064226.9 :y -261537.8 :z 8065295.0 :w 1.0) @@ -2490,7 +2490,7 @@ :continues '((new 'static 'continue-point :name "palcab-start" :level 'palcab - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 929748.56 :y 1803958.2 :z -568005.8 :w 1.0) :quat (new 'static 'vector :y -0.2346 :w -0.972) :camera-trans (new 'static 'vector :x 930469.5 :y 1825050.6 :z -611119.94 :w 1.0) @@ -2594,7 +2594,7 @@ :continues '((new 'static 'continue-point :name "palshaft-lobby" :level 'palshaft - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 598668.5 :y 69131.06 :z 2697706.0 :w 1.0) :quat (new 'static 'vector :y 0.9982 :w -0.0596) :camera-trans (new 'static 'vector :x 626226.0 :y 88880.74 :z 2734727.5 :w 1.0) @@ -2730,7 +2730,7 @@ :continues '((new 'static 'continue-point :name "palroof-throne" :level 'palroof - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 589710.56 :y 1735487.9 :z 2039465.6 :w 1.0) :quat (new 'static 'vector :y -0.452 :w 0.8919) :camera-trans (new 'static 'vector :x 622908.2 :y 1756602.4 :z 2012121.9 :w 1.0) @@ -2754,7 +2754,7 @@ (new 'static 'continue-point :name "palroof-boss" :level 'palroof - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 870794.06 :y 1671154.9 :z 2027482.4 :w 1.0) :quat (new 'static 'vector :y 0.4793 :w 0.8776) :camera-trans (new 'static 'vector :x 831816.06 :y 1693132.0 :z 2045632.9 :w 1.0) @@ -2778,7 +2778,7 @@ (new 'static 'continue-point :name "palroof-boss-victory" :level 'palroof - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1175203.4 :y 1671159.0 :z 2741709.5 :w 1.0) :quat (new 'static 'vector :y -0.7428 :w 0.6694) :camera-trans (new 'static 'vector :x 1222606.5 :y 1692250.5 :z 2761046.0 :w 1.0) @@ -2915,7 +2915,7 @@ :continues '((new 'static 'continue-point :name "throne-ashelin" :level 'throne - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 634090.3 :y 1414044.9 :z 2314699.2 :w 1.0) :quat (new 'static 'vector :y 0.9525 :w -0.3044) :camera-trans (new 'static 'vector :x 660229.75 :y 1435136.9 :z 2348906.5 :w 1.0) @@ -2939,7 +2939,7 @@ (new 'static 'continue-point :name "throne-outro" :level 'throne - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 634090.3 :y 1414044.9 :z 2314699.2 :w 1.0) :quat (new 'static 'vector :y 0.9525 :w -0.3044) :camera-trans (new 'static 'vector :x 660229.75 :y 1435136.9 :z 2348906.5 :w 1.0) @@ -3189,7 +3189,7 @@ :continues '((new 'static 'continue-point :name "palent-throne" :level 'palent - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 689051.6 :y 1413868.8 :z 2516459.5 :w 1.0) :quat (new 'static 'vector :y 0.9997 :z -0.0013 :w -0.0211) :camera-trans (new 'static 'vector :x 664995.44 :y 1434960.8 :z 2552149.5 :w 1.0) @@ -3316,7 +3316,7 @@ (new 'static 'continue-point :name "game-start" :level 'prison - :flags (continue-flags cf5) + :flags (continue-flags game-start) :trans (new 'static 'vector :x 1942413.2 :y 34479.31 :z 275525.62 :w 1.0) :quat (new 'static 'vector :y 0.4562 :w 0.8898) :camera-trans (new 'static 'vector :x 1921090.8 :y 53425.766 :z 237949.75 :w 1.0) @@ -3340,7 +3340,7 @@ (new 'static 'continue-point :name "prison-intro-start" :level 'prison - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 1942413.2 :y 34479.31 :z 275525.62 :w 1.0) :quat (new 'static 'vector :y 0.4562 :w 0.8898) :camera-trans (new 'static 'vector :x 1921090.8 :y 53425.766 :z 237949.75 :w 1.0) @@ -3554,7 +3554,7 @@ (new 'static 'continue-point :name "forexita-mid" :level 'forexita - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 3037138.0 :y 295920.03 :z 686462.2 :w 1.0) :quat (new 'static 'vector :y -0.9805 :w -0.1963) :camera-trans (new 'static 'vector :x 3038071.2 :y 317014.03 :z 729465.6 :w 1.0) @@ -3634,7 +3634,7 @@ :continues '((new 'static 'continue-point :name "forexitb-end" :level 'forexitb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2338518.2 :y 123119.62 :z 41246.31 :w 1.0) :quat (new 'static 'vector :y 0.9969 :w 0.078) :camera-trans (new 'static 'vector :x 2333426.0 :y 144214.02 :z 92192.36 :w 1.0) @@ -3658,7 +3658,7 @@ (new 'static 'continue-point :name "forexita-tube" :level 'forexitb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2698146.5 :y 245757.95 :z 169426.94 :w 1.0) :quat (new 'static 'vector :y -0.0838 :w 0.9964) :camera-trans (new 'static 'vector :x 2697397.8 :y 267042.0 :z 118417.0 :w 1.0) @@ -3817,7 +3817,7 @@ :continues '((new 'static 'continue-point :name "forrescb-mid" :level 'forrescb - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 1873107.4 :y 55606.066 :z 602671.94 :w 1.0) :quat (new 'static 'vector :y -0.6722 :w 0.7403) :camera-trans (new 'static 'vector :x 1917880.4 :y 74982.195 :z 601561.5 :w 1.0) @@ -3920,7 +3920,7 @@ (new 'static 'continue-point :name "fordumpa-midpoint" :level 'fordumpa - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 1918058.5 :y 94208.0 :z 1170815.8 :w 1.0) :quat (new 'static 'vector :y -0.7063 :w 0.7078) :camera-trans (new 'static 'vector :x 1960915.4 :y 115301.99 :z 1166747.2 :w 1.0) @@ -4001,7 +4001,7 @@ :continues '((new 'static 'continue-point :name "fordumpb-start" :level 'fordumpb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1730156.5 :y 94197.35 :z 1192282.9 :w 1.0) :quat (new 'static 'vector :y 0.297 :w -0.9548) :camera-trans (new 'static 'vector :x 1769338.5 :y 113987.99 :z 1167812.6 :w 1.0) @@ -4081,7 +4081,7 @@ :continues '((new 'static 'continue-point :name "fordumpc-start" :level 'fordumpc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2587180.8 :y 147453.95 :z 1446389.4 :w 1.0) :quat (new 'static 'vector :y -0.992 :w -0.1258) :camera-trans (new 'static 'vector :x 2593020.8 :y 168384.92 :z 1404207.9 :w 1.0) @@ -4105,7 +4105,7 @@ (new 'static 'continue-point :name "fordumpc-movie-end" :level 'fordumpc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2572884.0 :y 147681.28 :z 1454391.8 :w 1.0) :quat (new 'static 'vector :y 0.5741 :w 0.8187) :camera-trans (new 'static 'vector :x 2561296.0 :y 168775.69 :z 1412936.1 :w 1.0) @@ -4129,7 +4129,7 @@ (new 'static 'continue-point :name "fordumpc-explode-movie" :level 'fordumpc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2572884.0 :y 147681.28 :z 1454391.8 :w 1.0) :quat (new 'static 'vector :y 0.5741 :w 0.8187) :camera-trans (new 'static 'vector :x 2561296.0 :y 168775.69 :z 1412936.1 :w 1.0) @@ -4265,7 +4265,7 @@ :continues '((new 'static 'continue-point :name "strip-start" :level 'strip - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 10392208.0 :y 291383.72 :z -194403.94 :w 1.0) :quat (new 'static 'vector :y -0.7102 :w 0.7039) :camera-trans (new 'static 'vector :x 10421589.0 :y 307730.44 :z -178237.84 :w 1.0) @@ -4289,7 +4289,7 @@ (new 'static 'continue-point :name "strip-warp" :level 'strip - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x 10392208.0 :y 291383.72 :z -194403.94 :w 1.0) :quat (new 'static 'vector :y -0.7102 :w 0.7039) :camera-trans (new 'static 'vector :x 10421589.0 :y 307730.44 :z -178237.84 :w 1.0) @@ -4313,7 +4313,7 @@ (new 'static 'continue-point :name "strip-warp-2" :level 'strip - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 9677517.0 :y 368640.0 :z -174448.23 :w 1.0) :quat (new 'static 'vector :y 0.7146 :w -0.6994) :camera-trans (new 'static 'vector :x 9634240.0 :y 388288.9 :z -160018.44 :w 1.0) @@ -4337,7 +4337,7 @@ (new 'static 'continue-point :name "strip-drop-midpoint" :level 'strip - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 11098202.0 :y 469663.34 :z 371692.34 :w 1.0) :quat (new 'static 'vector :y -0.878 :w 0.4786) :camera-trans (new 'static 'vector :x 11138690.0 :y 490766.34 :z 403012.8 :w 1.0) @@ -4465,7 +4465,7 @@ (new 'static 'continue-point :name "ruins-movie" :level 'ruins - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3597612.2 :y 2788.9663 :z -898058.25 :w 1.0) :quat (new 'static 'vector :y 0.9108 :w -0.4127) :camera-trans (new 'static 'vector :x 3600432.0 :y 23778.51 :z -847371.9 :w 1.0) @@ -4489,7 +4489,7 @@ (new 'static 'continue-point :name "ruins-hut" :level 'ruins - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 4338732.0 :y 99318.99 :z -1983915.2 :w 1.0) :quat (new 'static 'vector :y 0.964 :w 0.2657) :camera-trans (new 'static 'vector :x 4320175.0 :y 120442.47 :z -1945102.8 :w 1.0) @@ -4520,7 +4520,7 @@ (new 'static 'continue-point :name "ruins-tower-end" :level 'ruins - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4631596.0 :y 188402.08 :z -991184.9 :w 1.0) :quat (new 'static 'vector :y -0.9987 :w -0.0508) :camera-trans (new 'static 'vector :x 4670624.0 :y 206847.19 :z -979009.56 :w 1.0) @@ -4658,7 +4658,7 @@ :continues '((new 'static 'continue-point :name "atoll-start" :level 'atoll - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2288109.5 :y 8801.075 :z -3452941.0 :w 1.0) :quat (new 'static 'vector :y -0.9998 :w -0.0175) :camera-trans (new 'static 'vector :x 2289175.2 :y 29895.475 :z -3401749.0 :w 1.0) @@ -4682,7 +4682,7 @@ (new 'static 'continue-point :name "atoll-airlock" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2284922.5 :y 10056.09 :z -3324549.0 :w 1.0) :quat (new 'static 'vector :y 0.9999 :w 0.0044) :camera-trans (new 'static 'vector :x 2280927.8 :y 29319.986 :z -3280357.5 :w 1.0) @@ -4706,7 +4706,7 @@ (new 'static 'continue-point :name "atoll-movie" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2288109.5 :y 8801.075 :z -3452941.0 :w 1.0) :quat (new 'static 'vector :y -0.9998 :w -0.0175) :camera-trans (new 'static 'vector :x 2289175.2 :y 29895.475 :z -3401749.0 :w 1.0) @@ -4730,7 +4730,7 @@ (new 'static 'continue-point :name "sig0-hiding-behind-blocks" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2026609.9 :y 53760.0 :z -3877329.2 :w 1.0) :quat (new 'static 'vector :y 0.6803 :w -0.7328) :camera-trans (new 'static 'vector :x 2043578.0 :y 77001.93 :z -3838212.5 :w 1.0) @@ -4754,7 +4754,7 @@ (new 'static 'continue-point :name "sig0-down-ramp" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1762283.5 :y 53711.668 :z -4027283.8 :w 1.0) :quat (new 'static 'vector :x -0.0001 :y 0.9401 :w 0.3406) :camera-trans (new 'static 'vector :x 1721253.9 :y 95286.07 :z -3956288.2 :w 1.0) @@ -4778,7 +4778,7 @@ (new 'static 'continue-point :name "sig0-charge-gun-for-sniper-c" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1552601.1 :y 53711.668 :z -4779247.5 :w 1.0) :quat (new 'static 'vector :y 0.962 :w -0.2727) :camera-trans (new 'static 'vector :x 1513808.8 :y 73827.125 :z -4806706.5 :w 1.0) @@ -4802,7 +4802,7 @@ (new 'static 'continue-point :name "sig0-cross-water" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1874199.0 :y 6223.872 :z -4438985.0 :w 1.0) :quat (new 'static 'vector :y 0.3639 :w 0.9314) :camera-trans (new 'static 'vector :x 1838270.9 :y 27303.936 :z -4475633.0 :w 1.0) @@ -4826,7 +4826,7 @@ (new 'static 'continue-point :name "sig0-show-sniper-e" :level 'atoll - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2293206.8 :y 4907.4175 :z -4265200.5 :w 1.0) :quat (new 'static 'vector :x -0.0013 :y -0.8686 :z 0.0003 :w -0.4954) :camera-trans (new 'static 'vector :x 2213943.0 :y 46524.414 :z -4285937.0 :w 1.0) @@ -4850,7 +4850,7 @@ (new 'static 'continue-point :name "atoll-battle" :level 'atoll - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1786353.6 :y 173371.8 :z -4885427.5 :w 1.0) :quat (new 'static 'vector :y 0.7184 :w 0.6955) :camera-trans (new 'static 'vector :x 1744994.2 :y 194462.92 :z -4897220.0 :w 1.0) @@ -4986,7 +4986,7 @@ :continues '((new 'static 'continue-point :name "mountain-start" :level 'mountain - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -2323968.5 :y 492110.66 :z 847190.44 :w 1.0) :quat (new 'static 'vector :y 0.7072 :w -0.7069) :camera-trans (new 'static 'vector :x -2366673.8 :y 513098.12 :z 852492.3 :w 1.0) @@ -5010,7 +5010,7 @@ (new 'static 'continue-point :name "mountain-warp-top" :level 'mountain - :flags (continue-flags cf2 cf4 cf7) + :flags (continue-flags change-continue no-blackout warp-gate) :trans (new 'static 'vector :x -2344385.0 :y 493619.2 :z 855861.7 :w 1.0) :quat (new 'static 'vector :y 0.7897 :w -0.6134) :camera-trans (new 'static 'vector :x -2395385.8 :y 514670.2 :z 853979.1 :w 1.0) @@ -5057,7 +5057,7 @@ (new 'static 'continue-point :name "mountain-warp-bottom" :level 'mountain - :flags (continue-flags cf7) + :flags (continue-flags warp-gate) :trans (new 'static 'vector :x -1928867.9 :y 119072.36 :z 762851.3 :w 1.0) :quat (new 'static 'vector :y 0.1361 :w -0.9906) :camera-trans (new 'static 'vector :x -1970202.2 :y 140129.89 :z 792840.2 :w 1.0) @@ -5081,7 +5081,7 @@ (new 'static 'continue-point :name "mountain-movie" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1928867.9 :y 119072.36 :z 762851.3 :w 1.0) :quat (new 'static 'vector :y 0.1361 :w -0.9906) :camera-trans (new 'static 'vector :x -1970202.2 :y 140129.89 :z 792840.2 :w 1.0) @@ -5105,7 +5105,7 @@ (new 'static 'continue-point :name "mountain-aval" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -3678913.0 :y 242899.36 :z 547868.7 :w 1.0) :quat (new 'static 'vector :x -0.0014 :y 0.2389 :z -0.0006 :w -0.971) :camera-trans (new 'static 'vector :x -3658512.0 :y 263992.94 :z 500907.62 :w 1.0) @@ -5135,7 +5135,7 @@ (new 'static 'continue-point :name "mountain-dark-eco" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2598416.5 :y 385700.25 :z -131157.2 :w 1.0) :quat (new 'static 'vector :y 0.0011 :w -0.9999) :camera-trans (new 'static 'vector :x -2589366.2 :y 398878.72 :z -150739.77 :w 1.0) @@ -5159,7 +5159,7 @@ (new 'static 'continue-point :name "mountain-kiosk" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2389323.0 :y 495015.53 :z 963041.25 :w 1.0) :quat (new 'static 'vector :y -0.5072 :w 0.8617) :camera-trans (new 'static 'vector :x -2350041.5 :y 516124.7 :z 945515.75 :w 1.0) @@ -5183,7 +5183,7 @@ (new 'static 'continue-point :name "mountain-grind-rail" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2488779.2 :y 278519.4 :z 485033.97 :w 1.0) :quat (new 'static 'vector :y 0.7587 :w 0.6513) :camera-trans (new 'static 'vector :x -2531265.8 :y 299651.06 :z 491683.84 :w 1.0) @@ -5207,7 +5207,7 @@ (new 'static 'continue-point :name "mountain-door" :level 'mountain - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -2629474.0 :y 324481.44 :z 689014.4 :w 1.0) :quat (new 'static 'vector :y 0.9621 :w -0.2726) :camera-trans (new 'static 'vector :x -2631735.8 :y 344205.72 :z 735101.3 :w 1.0) @@ -5369,7 +5369,7 @@ (new 'static 'continue-point :name "forest-tree" :level 'forest - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -2612326.8 :y 149986.92 :z 3560990.0 :w 1.0) :quat (new 'static 'vector :x 0.0001 :y 0.3242 :z -0.0013 :w 0.9459) :camera-trans (new 'static 'vector :x -2642006.0 :y 171092.78 :z 3519268.5 :w 1.0) @@ -5507,7 +5507,7 @@ :continues '((new 'static 'continue-point :name "mincan-start" :level 'mincan - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1980823.1 :y 116416.516 :z -62922.344 :w 1.0) :quat (new 'static 'vector :y -0.9607 :z -0.0014 :w -0.2775) :camera-trans (new 'static 'vector :x -2001351.5 :y 131235.44 :z -44465.766 :w 1.0) @@ -5531,7 +5531,7 @@ (new 'static 'continue-point :name "mincan-city" :level 'mincan - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -2134463.8 :y 66739.41 :z -724928.1 :w 1.0) :quat (new 'static 'vector :y 0.5441 :w 0.839) :camera-trans (new 'static 'vector :x -2155888.2 :y 87833.4 :z -762217.25 :w 1.0) @@ -5979,7 +5979,7 @@ (new 'static 'continue-point :name "ctygena-burning-bush-2" :level 'ctygena - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1549425.0 :y 32753.254 :z -805722.1 :w 1.0) :quat (new 'static 'vector :y -0.6395 :w 0.7687) :camera-trans (new 'static 'vector :x -1498315.1 :y 53847.656 :z -808805.2 :w 1.0) @@ -6003,7 +6003,7 @@ (new 'static 'continue-point :name "ctygena-burning-bush" :level 'ctygena - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -256512.4 :y 32768.0 :z -116162.15 :w 1.0) :quat (new 'static 'vector :y 0.0466 :w -0.9989) :camera-trans (new 'static 'vector :x -255002.22 :y 53861.992 :z -167339.62 :w 1.0) @@ -6085,7 +6085,7 @@ :continues '((new 'static 'continue-point :name "ctygenb-start" :level 'ctygenb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 686539.56 :y 40271.87 :z -1015174.75 :w 1.0) :quat (new 'static 'vector :x 0.0009 :y 0.6545 :z 0.0007 :w -0.756) :camera-trans (new 'static 'vector :x 647089.75 :y 59344.49 :z -1026199.94 :w 1.0) @@ -6109,7 +6109,7 @@ (new 'static 'continue-point :name "ctygenb-burning-bush" :level 'ctygenb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 685747.8 :y 32765.543 :z -1213995.9 :w 1.0) :quat (new 'static 'vector :y 0.9949 :w 0.1007) :camera-trans (new 'static 'vector :x 686984.8 :y 53859.53 :z -1162769.6 :w 1.0) @@ -6133,7 +6133,7 @@ (new 'static 'continue-point :name "ctygenb-burning-bush-2" :level 'ctygenb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1092419.1 :y 32768.0 :z -269985.38 :w 1.0) :quat (new 'static 'vector :y 0.749 :w 0.6624) :camera-trans (new 'static 'vector :x 1041223.7 :y 53868.543 :z -270698.9 :w 1.0) @@ -6215,7 +6215,7 @@ :continues '((new 'static 'continue-point :name "ctygenc-start" :level 'ctygenc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 781528.25 :y 39733.656 :z 1322450.5 :w 1.0) :quat (new 'static 'vector :y -0.9673 :w 0.2534) :camera-trans (new 'static 'vector :x 778921.56 :y 60838.707 :z 1373583.8 :w 1.0) @@ -6239,7 +6239,7 @@ (new 'static 'continue-point :name "ctygenc-burning-bush" :level 'ctygenc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 883602.25 :y 32770.047 :z 35872.36 :w 1.0) :quat (new 'static 'vector :y -0.9999 :w 0.0085) :camera-trans (new 'static 'vector :x 883981.5 :y 53224.242 :z 84615.17 :w 1.0) @@ -6263,7 +6263,7 @@ (new 'static 'continue-point :name "ctygenc-burning-bush-2" :level 'ctygenc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 141574.14 :y 32772.098 :z 1081112.6 :w 1.0) :quat (new 'static 'vector :y -0.7665 :w -0.6422) :camera-trans (new 'static 'vector :x 90349.98 :y 53866.496 :z 1080261.0 :w 1.0) @@ -6368,7 +6368,7 @@ (new 'static 'continue-point :name "ctysluma-alley" :level 'ctysluma - :flags (continue-flags cf1 cf3 cf17) + :flags (continue-flags scene-wait no-auto test) :trans (new 'static 'vector :x 4660709.0 :y 33364.38 :z 61360.54 :w 1.0) :quat (new 'static 'vector :y -0.2484 :w -0.9686) :camera-trans (new 'static 'vector :x 4635918.5 :y 54458.367 :z 26214.4 :w 1.0) @@ -6392,7 +6392,7 @@ (new 'static 'continue-point :name "ctysluma-tower-intro" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4660709.0 :y 33364.38 :z 61360.54 :w 1.0) :quat (new 'static 'vector :y -0.2484 :w -0.9686) :camera-trans (new 'static 'vector :x 4635918.5 :y 54458.367 :z 26214.4 :w 1.0) @@ -6416,7 +6416,7 @@ (new 'static 'continue-point :name "ctysluma-tower-intro-exit" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4713875.5 :y 33354.957 :z 247486.47 :w 1.0) :quat (new 'static 'vector :y -0.9986 :w 0.0522) :camera-trans (new 'static 'vector :x 4724241.5 :y 54449.355 :z 297623.97 :w 1.0) @@ -6440,7 +6440,7 @@ (new 'static 'continue-point :name "ctysluma-alley-no-hideout" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4660709.0 :y 33364.38 :z 61360.54 :w 1.0) :quat (new 'static 'vector :y -0.2484 :w -0.9686) :camera-trans (new 'static 'vector :x 4635918.5 :y 54458.367 :z 26214.4 :w 1.0) @@ -6464,7 +6464,7 @@ (new 'static 'continue-point :name "ctysluma-fort-entrance" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3200250.2 :y 26049.332 :z 926289.94 :w 1.0) :quat (new 'static 'vector :y -0.6 :w 0.7999) :camera-trans (new 'static 'vector :x 3251440.8 :y 47171.176 :z 926989.1 :w 1.0) @@ -6488,7 +6488,7 @@ (new 'static 'continue-point :name "ctysluma-fort-end" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3241306.0 :y 33350.86 :z 1429365.1 :w 1.0) :quat (new 'static 'vector :y -0.7632 :w -0.646) :camera-trans (new 'static 'vector :x 3282688.5 :y 53891.48 :z 1433176.5 :w 1.0) @@ -6512,7 +6512,7 @@ (new 'static 'continue-point :name "escort-kid-intro" :level 'ctysluma - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 4720627.5 :y 33350.453 :z 238358.53 :w 1.0) :quat (new 'static 'vector :y -0.9882 :w 0.153) :camera-trans (new 'static 'vector :x 4725391.0 :y 54444.85 :z 289359.06 :w 1.0) @@ -6536,7 +6536,7 @@ (new 'static 'continue-point :name "ctysluma-escort-retry" :level 'ctysluma - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 4701751.5 :y 33350.453 :z 196943.88 :w 1.0) :quat (new 'static 'vector :y -0.2309 :w -0.9729) :camera-trans (new 'static 'vector :x 4686596.0 :y 54444.85 :z 156687.56 :w 1.0) @@ -6560,7 +6560,7 @@ (new 'static 'continue-point :name "ctysluma-burning-bush" :level 'ctysluma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3420067.8 :y 33357.414 :z 984182.4 :w 1.0) :quat (new 'static 'vector :x 0.0002 :y -0.5079 :w 0.8614) :camera-trans (new 'static 'vector :x 3465968.8 :y 53951.69 :z 1002505.0 :w 1.0) @@ -6688,7 +6688,7 @@ (new 'static 'continue-point :name "ctyslumb-burning-bush" :level 'ctyslumb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2895687.8 :y 33280.41 :z -332780.75 :w 1.0) :quat (new 'static 'vector :x 0.0002 :y 0.5948 :z -0.0003 :w 0.8038) :camera-trans (new 'static 'vector :x 2892613.8 :y 54387.508 :z -383899.25 :w 1.0) @@ -6712,7 +6712,7 @@ (new 'static 'continue-point :name "ctyslumb-burning-bush-2" :level 'ctyslumb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1747023.5 :y 32766.771 :z -249536.52 :w 1.0) :quat (new 'static 'vector :y 0.9992 :w -0.0382) :camera-trans (new 'static 'vector :x 1763576.2 :y 53857.895 :z -200809.67 :w 1.0) @@ -6794,7 +6794,7 @@ :continues '((new 'static 'continue-point :name "ctyslumc-start" :level 'ctyslumc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2453099.8 :y 32505.855 :z -2268892.8 :w 1.0) :quat (new 'static 'vector :y -0.6958 :w 0.7182) :camera-trans (new 'static 'vector :x 2468703.8 :y 53571.586 :z -2220125.5 :w 1.0) @@ -6841,7 +6841,7 @@ (new 'static 'continue-point :name "ctyslumc-seal-movie" :level 'ctyslumc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3095949.8 :y 38379.52 :z -2931103.2 :w 1.0) :quat (new 'static 'vector :y -0.1147 :w 0.9933) :camera-trans (new 'static 'vector :x 3105172.8 :y 58562.152 :z -2978129.0 :w 1.0) @@ -6865,7 +6865,7 @@ (new 'static 'continue-point :name "ctyslumc-burning-bush" :level 'ctyslumc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2201559.0 :y 32754.074 :z -2377998.0 :w 1.0) :quat (new 'static 'vector :y 0.8793 :w -0.4762) :camera-trans (new 'static 'vector :x 2230809.8 :y 53886.156 :z -2335975.5 :w 1.0) @@ -6971,7 +6971,7 @@ (new 'static 'continue-point :name "ctyport-hiphog" :level 'ctyport - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -237165.36 :y 31635.455 :z 5517031.5 :w 1.0) :quat (new 'static 'vector :y -0.9709 :w 0.239) :camera-trans (new 'static 'vector :x -213388.9 :y 52731.086 :z 5552992.5 :w 1.0) @@ -6995,7 +6995,7 @@ (new 'static 'continue-point :name "ctyport-hiphog-no-hiphog" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -263350.7 :y 31665.357 :z 5478634.5 :w 1.0) :quat (new 'static 'vector :y -0.7746 :w 0.6324) :camera-trans (new 'static 'vector :x -239528.75 :y 52765.082 :z 5523948.5 :w 1.0) @@ -7019,7 +7019,7 @@ (new 'static 'continue-point :name "ctyport-gungame" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1740270.8 :y 31670.271 :z 5416671.0 :w 1.0) :quat (new 'static 'vector :y 0.9703 :w 0.2417) :camera-trans (new 'static 'vector :x 1719776.0 :y 52764.26 :z 5463587.5 :w 1.0) @@ -7066,7 +7066,7 @@ (new 'static 'continue-point :name "ctyport-air-train" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 1526301.1 :y 31448.27 :z 7370150.5 :w 1.0) :quat (new 'static 'vector :x -0.0014 :y -0.9505 :z -0.0005 :w 0.3106) :camera-trans (new 'static 'vector :x 1511200.0 :y 50669.16 :z 7328715.0 :w 1.0) @@ -7090,7 +7090,7 @@ (new 'static 'continue-point :name "ctyport-air-train-ashelin" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 1526301.1 :y 31448.27 :z 7370150.5 :w 1.0) :quat (new 'static 'vector :x -0.0014 :y -0.9505 :z -0.0005 :w 0.3106) :camera-trans (new 'static 'vector :x 1511200.0 :y 50669.16 :z 7328715.0 :w 1.0) @@ -7137,7 +7137,7 @@ (new 'static 'continue-point :name "ctyport-errol-record-path" :level 'ctyport - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x -204202.39 :y 42518.117 :z 5517981.5 :w 1.0) :quat (new 'static 'vector :x 0.0218 :y -0.4594 :z -0.0486 :w 0.8866) :camera-trans (new 'static 'vector :x -185733.12 :y 53058.766 :z 5505444.0 :w 1.0) @@ -7161,7 +7161,7 @@ (new 'static 'continue-point :name "ctyport-race-fail" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2450949.8 :y 45615.105 :z 6574133.5 :w 1.0) :quat (new 'static 'vector :x -0.0072 :y -0.3548 :z 0.0109 :w 0.9348) :camera-trans (new 'static 'vector :x 2464248.2 :y 55870.258 :z 6559149.5 :w 1.0) @@ -7185,7 +7185,7 @@ (new 'static 'continue-point :name "ctyport-race-retry" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2519127.8 :y 31612.518 :z 6545450.0 :w 1.0) :quat (new 'static 'vector :x 0.0003 :y -0.1359 :z 0.0013 :w -0.9907) :camera-trans (new 'static 'vector :x 2552038.5 :y 50085.887 :z 6520416.0 :w 1.0) @@ -7209,7 +7209,7 @@ (new 'static 'continue-point :name "ctyport-errol-race-retry" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -237435.3 :y 31652.25 :z 5468062.0 :w 1.0) :quat (new 'static 'vector :y -0.4713 :w -0.8819) :camera-trans (new 'static 'vector :x -285678.78 :y 51959.4 :z 5466700.0 :w 1.0) @@ -7233,7 +7233,7 @@ (new 'static 'continue-point :name "ctyport-race-record-path" :level 'ctyport - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x 2491680.0 :y 44982.273 :z 6575569.5 :w 1.0) :quat (new 'static 'vector :x 0.0289 :y 0.5081 :z 0.0742 :w -0.8575) :camera-trans (new 'static 'vector :x 2511393.2 :y 56725.094 :z 6565603.5 :w 1.0) @@ -7257,7 +7257,7 @@ (new 'static 'continue-point :name "ctyport-outro" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -7281,7 +7281,7 @@ (new 'static 'continue-point :name "ctyport-outro-fireworks" :level 'ctyport - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 306485.66 :y 31610.47 :z 5660605.0 :w 1.0) :quat (new 'static 'vector :y -0.0814 :w 0.9966) :camera-trans (new 'static 'vector :x 304445.03 :y 55391.848 :z 5609440.5 :w 1.0) @@ -7305,7 +7305,7 @@ (new 'static 'continue-point :name "ctyport-burning-bush-3" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2568996.8 :y 31641.6 :z 6469675.5 :w 1.0) :quat (new 'static 'vector :y 0.8877 :w 0.4602) :camera-trans (new 'static 'vector :x 2526983.0 :y 52228.098 :z 6496139.0 :w 1.0) @@ -7329,7 +7329,7 @@ (new 'static 'continue-point :name "ctyport-burning-bush" :level 'ctyport - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -409080.22 :y 31759.154 :z 5577668.5 :w 1.0) :quat (new 'static 'vector :y 0.9767 :w -0.2145) :camera-trans (new 'static 'vector :x -378350.38 :y 52853.145 :z 5607808.0 :w 1.0) @@ -7467,7 +7467,7 @@ :continues '((new 'static 'continue-point :name "ctyfarma-start" :level 'ctyfarma - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1346162.8 :y 35138.355 :z 858246.4 :w 1.0) :quat (new 'static 'vector :y -0.4712 :w 0.882) :camera-trans (new 'static 'vector :x -1294963.1 :y 56245.043 :z 858741.56 :w 1.0) @@ -7491,7 +7491,7 @@ (new 'static 'continue-point :name "ctyfarma-airlock-movie" :level 'ctyfarma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1773681.9 :y 124271.82 :z 852637.3 :w 1.0) :quat (new 'static 'vector :y -0.6773 :w 0.7356) :camera-trans (new 'static 'vector :x -1739667.0 :y 142474.44 :z 861517.0 :w 1.0) @@ -7515,7 +7515,7 @@ (new 'static 'continue-point :name "ctyfarma-airlock" :level 'ctyfarma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1788942.4 :y 124271.82 :z 853132.5 :w 1.0) :quat (new 'static 'vector :x -0.0012 :y -0.7734 :z -0.001 :w 0.6339) :camera-trans (new 'static 'vector :x -1739187.0 :y 145007.4 :z 849631.6 :w 1.0) @@ -7539,7 +7539,7 @@ (new 'static 'continue-point :name "ctyfarma-burning-bush" :level 'ctyfarma - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -236415.39 :y 32763.904 :z 389540.25 :w 1.0) :quat (new 'static 'vector :y 0.9803 :w 0.1972) :camera-trans (new 'static 'vector :x -258035.72 :y 53921.383 :z 436186.72 :w 1.0) @@ -7622,7 +7622,7 @@ :continues '((new 'static 'continue-point :name "ctyfarmb-start" :level 'ctyfarmb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1473722.4 :y 32758.988 :z 4695127.0 :w 1.0) :quat (new 'static 'vector :y -0.9428 :w 0.3332) :camera-trans (new 'static 'vector :x -1457872.5 :y 54232.27 :z 4735104.0 :w 1.0) @@ -7646,7 +7646,7 @@ (new 'static 'continue-point :name "ctyfarmb-burning-bush" :level 'ctyfarmb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -1292948.6 :y 32763.904 :z 4407961.5 :w 1.0) :quat (new 'static 'vector :y -0.7097 :w -0.7044) :camera-trans (new 'static 'vector :x -1337764.2 :y 52156.824 :z 4405888.0 :w 1.0) @@ -7728,7 +7728,7 @@ :continues '((new 'static 'continue-point :name "ctyinda-start" :level 'ctyinda - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 3945097.8 :y 110584.625 :z 3721824.8 :w 1.0) :quat (new 'static 'vector :y 0.0533 :w 0.9985) :camera-trans (new 'static 'vector :x 3971861.0 :y 129763.734 :z 3686880.0 :w 1.0) @@ -7775,7 +7775,7 @@ (new 'static 'continue-point :name "lkiddoge-skip1" :level 'ctyinda - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4069240.5 :y 32741.785 :z 4647774.5 :w 1.0) :quat (new 'static 'vector :x 0.0001 :y -0.6735 :w -0.7391) :camera-trans (new 'static 'vector :x 4019418.0 :y 53836.188 :z 4635805.5 :w 1.0) @@ -7822,7 +7822,7 @@ (new 'static 'continue-point :name "ctyinda-burning-bush" :level 'ctyinda - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3184090.0 :y 34360.934 :z 3365469.8 :w 1.0) :quat (new 'static 'vector :y -0.9999 :w -0.0007) :camera-trans (new 'static 'vector :x 3190731.2 :y 55454.926 :z 3416230.2 :w 1.0) @@ -7904,7 +7904,7 @@ :continues '((new 'static 'continue-point :name "consite-start" :level 'consite - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2858555.0 :y 19556.352 :z 3729141.8 :w 1.0) :quat (new 'static 'vector :y -0.9948 :w 0.1013) :camera-trans (new 'static 'vector :x 2838449.2 :y 40298.086 :z 3684069.0 :w 1.0) @@ -8111,7 +8111,7 @@ (new 'static 'continue-point :name "ctyindb-intro-start" :level 'ctyindb - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 3978918.2 :y 32761.447 :z 2236849.8 :w 1.0) :quat (new 'static 'vector :y 0.9493 :w 0.3141) :camera-trans (new 'static 'vector :x 3946840.5 :y 52216.22 :z 2267846.2 :w 1.0) @@ -8135,7 +8135,7 @@ (new 'static 'continue-point :name "ctyindb-burning-bush" :level 'ctyindb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 3214073.5 :y 32741.785 :z 2913456.2 :w 1.0) :quat (new 'static 'vector :y -0.535 :w 0.8448) :camera-trans (new 'static 'vector :x 3260565.0 :y 52803.176 :z 2904624.0 :w 1.0) @@ -8218,7 +8218,7 @@ :continues '((new 'static 'continue-point :name "ctymarka-brutter" :level 'ctymarka - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -439072.34 :y 32768.0 :z 1956770.6 :w 1.0) :quat (new 'static 'vector :y -0.1582 :w 0.9874) :camera-trans (new 'static 'vector :x -396247.84 :y 53861.992 :z 1952489.9 :w 1.0) @@ -8242,7 +8242,7 @@ (new 'static 'continue-point :name "ctymarka-burning-bush" :level 'ctymarka - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -730452.8 :y 32765.543 :z 3454441.5 :w 1.0) :quat (new 'static 'vector :x -0.001 :y -0.0118 :z -0.0009 :w 0.9999) :camera-trans (new 'static 'vector :x -727241.94 :y 53859.94 :z 3403332.8 :w 1.0) @@ -8325,7 +8325,7 @@ :continues '((new 'static 'continue-point :name "ctymarkb-tanker" :level 'ctymarkb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2147489.0 :y 34444.902 :z 1948003.1 :w 1.0) :quat (new 'static 'vector :y 0.2325 :w -0.9725) :camera-trans (new 'static 'vector :x 2176129.5 :y 55539.3 :z 1905562.0 :w 1.0) @@ -8349,7 +8349,7 @@ (new 'static 'continue-point :name "ctymarkb-movie-end" :level 'ctymarkb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1931610.1 :y 34406.4 :z 1769602.6 :w 1.0) :quat (new 'static 'vector :y -0.3655 :w 0.9307) :camera-trans (new 'static 'vector :x 1956000.1 :y 53861.992 :z 1734111.2 :w 1.0) @@ -8373,7 +8373,7 @@ (new 'static 'continue-point :name "ctymarkb-burning-bush" :level 'ctymarkb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2977968.2 :y 34444.902 :z 2160323.0 :w 1.0) :quat (new 'static 'vector :y -0.1398 :w -0.9901) :camera-trans (new 'static 'vector :x 2964785.5 :y 54040.574 :z 2116632.2 :w 1.0) @@ -8397,7 +8397,7 @@ (new 'static 'continue-point :name "ctymarkb-burning-bush-2" :level 'ctymarkb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 2575240.5 :y 34444.902 :z 3103047.2 :w 1.0) :quat (new 'static 'vector :y 0.0787 :w 0.9968) :camera-trans (new 'static 'vector :x 2563072.0 :y 54984.293 :z 3055447.2 :w 1.0) @@ -8527,7 +8527,7 @@ (new 'static 'continue-point :name "ctypal-burning-bush" :level 'ctypal - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 377386.6 :y 65546.65 :z 1834825.8 :w 1.0) :quat (new 'static 'vector :y -0.0469 :w 0.9988) :camera-trans (new 'static 'vector :x 372478.38 :y 86293.71 :z 1785120.0 :w 1.0) @@ -8551,7 +8551,7 @@ (new 'static 'continue-point :name "ctypal-burning-bush-2" :level 'ctypal - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1236813.0 :y 32766.361 :z 3622210.2 :w 1.0) :quat (new 'static 'vector :y 0.7451 :w 0.6668) :camera-trans (new 'static 'vector :x 1185874.8 :y 53860.76 :z 3627872.8 :w 1.0) @@ -8656,7 +8656,7 @@ (new 'static 'continue-point :name "stadium-burning-bush" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1391598.4 :y 32767.59 :z -3062397.8 :w 1.0) :quat (new 'static 'vector :x -0.0002 :y 0.6685 :z -0.0001 :w -0.7436) :camera-trans (new 'static 'vector :x 1390407.6 :y 52200.242 :z -3017585.5 :w 1.0) @@ -8680,7 +8680,7 @@ (new 'static 'continue-point :name "stadium-class1-res-end-movie" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 572500.4 :y 49152.0 :z -2737227.0 :w 1.0) :quat (new 'static 'vector :y 0.4807 :z -0.0014 :w 0.8768) :camera-trans (new 'static 'vector :x 603791.75 :y 69309.234 :z -2701270.8 :w 1.0) @@ -8704,7 +8704,7 @@ (new 'static 'continue-point :name "stadium-blimp-intro" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1139318.8 :y -16393.83 :z -2717514.5 :w 1.0) :quat (new 'static 'vector :y 0.9647 :w -0.263) :camera-trans (new 'static 'vector :x 1140867.5 :y 4700.16 :z -2666331.2 :w 1.0) @@ -8728,7 +8728,7 @@ (new 'static 'continue-point :name "stadium-blimp" :level 'stadium - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1172569.2 :y -16393.83 :z -2875689.0 :w 1.0) :quat (new 'static 'vector :y 0.1113 :w -0.9937) :camera-trans (new 'static 'vector :x 1203939.4 :y 4689.92 :z -2916101.8 :w 1.0) @@ -8809,7 +8809,7 @@ :continues '((new 'static 'continue-point :name "stadiumb-start" :level 'stadiumb - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 139325.44 :y 34127.87 :z -2636048.5 :w 1.0) :quat (new 'static 'vector :y -0.2687 :w -0.9632) :camera-trans (new 'static 'vector :x 105139.81 :y 54302.72 :z -2669469.0 :w 1.0) @@ -8833,7 +8833,7 @@ (new 'static 'continue-point :name "stadiumb-race-fail" :level 'stadiumb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 296361.56 :y 47104.0 :z -2499580.2 :w 1.0) :quat (new 'static 'vector :y 0.4434 :w -0.8962) :camera-trans (new 'static 'vector :x 336107.94 :y 68197.99 :z -2531864.5 :w 1.0) @@ -8857,7 +8857,7 @@ (new 'static 'continue-point :name "stadiumb-race-retry" :level 'stadiumb - :flags (continue-flags cf2 cf19) + :flags (continue-flags change-continue pilot) :trans (new 'static 'vector :x 232675.73 :y -10616.832 :z -2443733.5 :w 1.0) :quat (new 'static 'vector :y 0.3456 :w 0.9383) :camera-trans (new 'static 'vector :x 217686.02 :y 1695.744 :z -2461328.2 :w 1.0) @@ -8881,7 +8881,7 @@ (new 'static 'continue-point :name "stadiumb-race-r-retry" :level 'stadiumb - :flags (continue-flags cf2 cf19) + :flags (continue-flags change-continue pilot) :trans (new 'static 'vector :x 284379.97 :y -14743.143 :z -2426257.5 :w 1.0) :quat (new 'static 'vector :y 0.9385 :w -0.345) :camera-trans (new 'static 'vector :x 303667.2 :y -2424.0127 :z -2403514.0 :w 1.0) @@ -8905,7 +8905,7 @@ (new 'static 'continue-point :name "stadiumb-record-path" :level 'stadiumb - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x -192482.52 :y -124127.234 :z -1315588.5 :w 1.0) :quat (new 'static 'vector :x 0.0395 :y -0.9955 :z -0.0827 :w 0.0227) :camera-trans (new 'static 'vector :x -191463.02 :y -115947.11 :z -1293051.5 :w 1.0) @@ -8985,7 +8985,7 @@ :continues '((new 'static 'continue-point :name "stadiumc-start" :level 'stadiumc - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 139325.44 :y 34127.87 :z -2636048.5 :w 1.0) :quat (new 'static 'vector :y -0.2687 :w -0.9632) :camera-trans (new 'static 'vector :x 105139.81 :y 54302.72 :z -2669469.0 :w 1.0) @@ -9009,7 +9009,7 @@ (new 'static 'continue-point :name "stadiumc-race-retry-pidax" :level 'stadiumc - :flags (continue-flags cf3 cf20) + :flags (continue-flags no-auto pilot-dax) :trans (new 'static 'vector :x -337180.7 :y -24649.318 :z -2695884.5 :w 1.0) :quat (new 'static 'vector :y 0.7066 :w 0.7075) :camera-trans (new 'static 'vector :x -386829.94 :y -12293.734 :z -2695941.0 :w 1.0) @@ -9033,7 +9033,7 @@ (new 'static 'continue-point :name "stadiumc-race-retry" :level 'stadiumc - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x -337180.7 :y -24649.318 :z -2695884.5 :w 1.0) :quat (new 'static 'vector :y 0.7066 :w 0.7075) :camera-trans (new 'static 'vector :x -386829.94 :y -12293.734 :z -2695941.0 :w 1.0) @@ -9057,7 +9057,7 @@ (new 'static 'continue-point :name "stadiumc-race-r-retry" :level 'stadiumc - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x -261450.55 :y -28719.924 :z -2723475.5 :w 1.0) :quat (new 'static 'vector :y -0.6995 :w 0.7146) :camera-trans (new 'static 'vector :x -210261.61 :y -16378.266 :z -2724553.0 :w 1.0) @@ -9081,7 +9081,7 @@ (new 'static 'continue-point :name "stadiumc-race-fail" :level 'stadiumc - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -350173.2 :y 47088.027 :z -2750787.2 :w 1.0) :quat (new 'static 'vector :y 0.227 :w -0.9738) :camera-trans (new 'static 'vector :x -350950.6 :y 68182.42 :z -2801975.2 :w 1.0) @@ -9105,7 +9105,7 @@ (new 'static 'continue-point :name "stadiumc-record-path" :level 'stadiumc - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x 70463.484 :y -171052.64 :z -2836438.8 :w 1.0) :quat (new 'static 'vector :x 0.0448 :y 0.2377 :z -0.0047 :w -0.9702) :camera-trans (new 'static 'vector :x 80398.336 :y -160836.4 :z -2856782.2 :w 1.0) @@ -9185,7 +9185,7 @@ :continues '((new 'static 'continue-point :name "stadiumd-start" :level 'stadiumd - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 139325.44 :y 34127.87 :z -2636048.5 :w 1.0) :quat (new 'static 'vector :y -0.2687 :w -0.9632) :camera-trans (new 'static 'vector :x 105139.81 :y 54302.72 :z -2669469.0 :w 1.0) @@ -9209,7 +9209,7 @@ (new 'static 'continue-point :name "stadiumd-race-fail" :level 'stadiumd - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 79271.12 :y 47103.59 :z -2669285.5 :w 1.0) :quat (new 'static 'vector :y -0.1495 :w 0.9887) :camera-trans (new 'static 'vector :x 103847.94 :y 67127.3 :z -2709570.0 :w 1.0) @@ -9233,7 +9233,7 @@ (new 'static 'continue-point :name "stadiumd-race-retry" :level 'stadiumd - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x 18072.781 :y -19255.297 :z -2648879.0 :w 1.0) :quat (new 'static 'vector :y 0.5232 :w 0.8521) :camera-trans (new 'static 'vector :x -27583.283 :y -6946.4062 :z -2672047.8 :w 1.0) @@ -9257,7 +9257,7 @@ (new 'static 'continue-point :name "stadiumd-race-r-retry" :level 'stadiumd - :flags (continue-flags cf3 cf19) + :flags (continue-flags no-auto pilot) :trans (new 'static 'vector :x 96944.54 :y -23309.518 :z -2578265.0 :w 1.0) :quat (new 'static 'vector :y -0.8521 :w 0.5232) :camera-trans (new 'static 'vector :x 125187.27 :y -11000.627 :z -2563945.8 :w 1.0) @@ -9281,7 +9281,7 @@ (new 'static 'continue-point :name "stadiumd-record-path" :level 'stadiumd - :flags (continue-flags cf2 cf18) + :flags (continue-flags change-continue record-path) :trans (new 'static 'vector :x -1065634.2 :y -90913.18 :z -1832483.2 :w 1.0) :quat (new 'static 'vector :x 0.0316 :y -0.899 :z 0.0115 :w -0.4364) :camera-trans (new 'static 'vector :x -1082339.8 :y -78608.38 :z -1817219.9 :w 1.0) @@ -9360,7 +9360,7 @@ :continues '((new 'static 'continue-point :name "skatea-start" :level 'skatea - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 446888.75 :y -38911.59 :z -2322099.8 :w 1.0) :quat (new 'static 'vector :w 1.0) :camera-trans (new 'static 'vector :x 457174.22 :y -18563.072 :z -2274887.8 :w 1.0) @@ -9384,7 +9384,7 @@ (new 'static 'continue-point :name "skatea-training" :level 'skatea - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 497077.44 :y -38912.41 :z -2587993.0 :w 1.0) :quat (new 'static 'vector :y -0.0379 :w -0.9992) :camera-trans (new 'static 'vector :x 494938.12 :y -18720.36 :z -2635767.8 :w 1.0) @@ -9486,7 +9486,7 @@ :continues '((new 'static 'continue-point :name "garage-start-skate" :level 'garage - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 362617.25 :y 49152.0 :z -1795099.5 :w 1.0) :quat (new 'static 'vector :y -0.4053 :w 0.9141) :camera-trans (new 'static 'vector :x 402171.1 :y 70245.99 :z -1812076.1 :w 1.0) @@ -9510,7 +9510,7 @@ (new 'static 'continue-point :name "garage-start-class3" :level 'garage - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 433220.4 :y 49152.0 :z -1832372.2 :w 1.0) :quat (new 'static 'vector :y -0.9926 :w 0.1212) :camera-trans (new 'static 'vector :x 449114.53 :y 69541.07 :z -1870120.1 :w 1.0) @@ -9534,7 +9534,7 @@ (new 'static 'continue-point :name "garage-class3-movie" :level 'garage - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 433220.4 :y 49152.0 :z -1832372.2 :w 1.0) :quat (new 'static 'vector :y -0.9926 :w 0.1212) :camera-trans (new 'static 'vector :x 449114.53 :y 69541.07 :z -1870120.1 :w 1.0) @@ -10519,7 +10519,7 @@ :continues '((new 'static 'continue-point :name "onintent-start" :level 'onintent - :flags (continue-flags cf1 cf17) + :flags (continue-flags scene-wait test) :trans (new 'static 'vector :x 2918937.5 :y 34444.902 :z 3093502.2 :w 1.0) :quat (new 'static 'vector :y -0.9989 :w 0.0465) :camera-trans (new 'static 'vector :x 2921813.5 :y 55538.484 :z 3144613.5 :w 1.0) @@ -10792,7 +10792,7 @@ :continues '((new 'static 'continue-point :name "oracle-start" :level 'oracle - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 2893301.2 :y 24565.35 :z -1878591.9 :w 1.0) :quat (new 'static 'vector :y -0.1552 :w -0.9878) :camera-trans (new 'static 'vector :x 2885879.0 :y 45466.83 :z -1928682.8 :w 1.0) @@ -10894,7 +10894,7 @@ (new 'static 'continue-point :name "hideout-movie" :level 'hideout - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 4880597.0 :y 15103.181 :z 244580.77 :w 1.0) :quat (new 'static 'vector :y 0.7269 :w 0.6866) :camera-trans (new 'static 'vector :x 4842975.5 :y 32609.484 :z 244427.98 :w 1.0) @@ -12003,7 +12003,7 @@ (new 'static 'continue-point :name "hiphog-movie" :level 'hiphog - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -12027,7 +12027,7 @@ (new 'static 'continue-point :name "hiphog-movie-all" :level 'hiphog - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -12051,7 +12051,7 @@ (new 'static 'continue-point :name "hiphog-demo" :level 'hiphog - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -12075,7 +12075,7 @@ (new 'static 'continue-point :name "hiphog-demo-end" :level 'hiphog - :flags (continue-flags cf2 cf6) + :flags (continue-flags change-continue demo-end) :trans (new 'static 'vector :x 2284730.0 :y 8799.847 :z -3431194.2 :w 1.0) :quat (new 'static 'vector :y 0.9929 :w -0.1181) :camera-trans (new 'static 'vector :x 2282735.5 :y 26317.62 :z -3393441.5 :w 1.0) @@ -12099,7 +12099,7 @@ (new 'static 'continue-point :name "hiphog-outro" :level 'hiphog - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x -325973.6 :y 36371.25 :z 5391642.0 :w 1.0) :quat (new 'static 'vector :y 0.9867 :w -0.162) :camera-trans (new 'static 'vector :x -301305.84 :y 51219.66 :z 5399168.5 :w 1.0) @@ -12516,7 +12516,7 @@ :continues '((new 'static 'continue-point :name "gungame-start" :level 'gungame - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 1797717.2 :y 34816.0 :z 5337087.0 :w 1.0) :quat (new 'static 'vector :y -0.9956 :w 0.0932) :camera-trans (new 'static 'vector :x 1807258.4 :y 55836.67 :z 5378828.5 :w 1.0) @@ -12540,7 +12540,7 @@ (new 'static 'continue-point :name "gungame-movie" :level 'gungame - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1797717.2 :y 34816.0 :z 5337087.0 :w 1.0) :quat (new 'static 'vector :y -0.9956 :w 0.0932) :camera-trans (new 'static 'vector :x 1807258.4 :y 55836.67 :z 5378828.5 :w 1.0) @@ -12621,7 +12621,7 @@ :continues '((new 'static 'continue-point :name "dig1-start" :level 'dig1 - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 1759030.1 :y -244842.1 :z -7407948.5 :w 1.0) :quat (new 'static 'vector :y 0.8886 :w -0.4586) :camera-trans (new 'static 'vector :x 1799911.9 :y -223814.86 :z -7395168.5 :w 1.0) @@ -12732,7 +12732,7 @@ (new 'static 'continue-point :name "dig-totem" :level 'dig3a - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 772547.8 :y -57348.098 :z -7644002.5 :w 1.0) :quat (new 'static 'vector :y -0.4492 :w 0.8934) :camera-trans (new 'static 'vector :x 788845.4 :y -36243.867 :z -7683787.0 :w 1.0) @@ -12756,7 +12756,7 @@ (new 'static 'continue-point :name "dig3b-start" :level 'dig3a - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 1150306.2 :y -217773.67 :z -8811749.0 :w 1.0) :quat (new 'static 'vector :y 0.7541 :w -0.6566) :camera-trans (new 'static 'vector :x 1192340.6 :y -196685.0 :z -8802656.0 :w 1.0) @@ -12937,7 +12937,7 @@ (new 'static 'continue-point :name "caspad-warp" :level 'caspad - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 1152265.0 :y 114685.13 :z -6746448.5 :w 1.0) :quat (new 'static 'vector :y 0.9282 :w 0.3719) :camera-trans (new 'static 'vector :x 1121375.9 :y 135779.12 :z -6705579.0 :w 1.0) @@ -12961,7 +12961,7 @@ (new 'static 'continue-point :name "caspad-face-castle" :level 'caspad - :flags (continue-flags cf1 cf3) + :flags (continue-flags scene-wait no-auto) :trans (new 'static 'vector :x 1103312.9 :y 114685.13 :z -6718415.5 :w 1.0) :quat (new 'static 'vector :y 0.7686 :w -0.6396) :camera-trans (new 'static 'vector :x 1153423.8 :y 135779.12 :z -6707907.0 :w 1.0) @@ -13043,7 +13043,7 @@ :continues '((new 'static 'continue-point :name "castle-start" :level 'castle - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 21039.924 :y 229371.9 :z -6893704.5 :w 1.0) :quat (new 'static 'vector :y 0.8039 :w -0.5946) :camera-trans (new 'static 'vector :x 72232.96 :y 250453.2 :z -6894464.0 :w 1.0) @@ -13146,7 +13146,7 @@ :continues '((new 'static 'continue-point :name "casboss-start" :level 'casboss - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x -1351936.0 :y 1454352.4 :z -6874412.0 :w 1.0) :quat (new 'static 'vector :y -0.7631 :w -0.6462) :camera-trans (new 'static 'vector :x -1403063.9 :y 1475443.1 :z -6877073.5 :w 1.0) @@ -13340,7 +13340,7 @@ :continues '((new 'static 'continue-point :name "village1-start" :level 'village1 - :flags (continue-flags cf1 cf17) + :flags (continue-flags scene-wait test) :trans (new 'static 'vector :x -687440.7 :y 154998.38 :z 752476.2 :w 1.0) :quat (new 'static 'vector :y 0.8595 :w 0.511) :camera-trans (new 'static 'vector :x -724766.3 :y 176109.56 :z 773868.75 :w 1.0) @@ -13364,7 +13364,7 @@ (new 'static 'continue-point :name "intro-start" :level 'village1 - :flags (continue-flags cf1 cf9) + :flags (continue-flags scene-wait intro) :trans (new 'static 'vector :x -687440.7 :y 154998.38 :z 752476.2 :w 1.0) :quat (new 'static 'vector :y 0.8595 :w 0.511) :camera-trans (new 'static 'vector :x -724766.3 :y 176109.56 :z 773868.75 :w 1.0) @@ -13388,7 +13388,7 @@ (new 'static 'continue-point :name "intro-start-hero" :level 'village1 - :flags (continue-flags cf1 cf10) + :flags (continue-flags scene-wait hero-mode) :trans (new 'static 'vector :x -687440.7 :y 154998.38 :z 752476.2 :w 1.0) :quat (new 'static 'vector :y 0.8595 :w 0.511) :camera-trans (new 'static 'vector :x -724766.3 :y 176109.56 :z 773868.75 :w 1.0) @@ -13694,7 +13694,7 @@ :continues '((new 'static 'continue-point :name "nest-start" :level 'nest - :flags (continue-flags cf17) + :flags (continue-flags test) :trans (new 'static 'vector :x 15416.524 :y -4361.8306 :z -400347.97 :w 1.0) :quat (new 'static 'vector :y -0.9467 :w 0.322) :camera-trans (new 'static 'vector :x 31184.486 :y 16731.75 :z -351637.9 :w 1.0) @@ -13718,7 +13718,7 @@ (new 'static 'continue-point :name "nest-warp" :level 'nest - :flags (continue-flags cf1 cf2) + :flags (continue-flags scene-wait change-continue) :trans (new 'static 'vector :x 52140.44 :y -4358.9634 :z -309093.16 :w 1.0) :quat (new 'static 'vector :y -0.0195 :w -0.9998) :camera-trans (new 'static 'vector :x 62153.523 :y 16219.75 :z -357362.06 :w 1.0) @@ -13765,7 +13765,7 @@ (new 'static 'continue-point :name "nest-barrier" :level 'nest - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -467713.22 :y 122876.73 :z -631910.4 :w 1.0) :quat (new 'static 'vector :y 0.0352 :w -0.9993) :camera-trans (new 'static 'vector :x -461033.88 :y 143970.3 :z -674393.7 :w 1.0) @@ -13870,7 +13870,7 @@ (new 'static 'continue-point :name "nestb-boss" :level 'nestb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 634325.0 :y 134077.23 :z -1619793.1 :w 1.0) :quat (new 'static 'vector :y -0.9292 :w -0.3694) :camera-trans (new 'static 'vector :x 606261.7 :y 153914.58 :z -1591727.8 :w 1.0) @@ -13894,7 +13894,7 @@ (new 'static 'continue-point :name "nestb-boss-pit" :level 'nestb - :flags (continue-flags cf3) + :flags (continue-flags no-auto) :trans (new 'static 'vector :x 690462.3 :y 84592.64 :z -1698655.0 :w 1.0) :quat (new 'static 'vector :y 0.8663 :w 0.4993) :camera-trans (new 'static 'vector :x 642789.8 :y 105517.47 :z -1715050.5 :w 1.0) @@ -13918,7 +13918,7 @@ (new 'static 'continue-point :name "nestb-outro" :level 'nestb - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 634325.0 :y 134077.23 :z -1619793.1 :w 1.0) :quat (new 'static 'vector :y -0.9292 :w -0.3694) :camera-trans (new 'static 'vector :x 606261.7 :y 153914.58 :z -1591727.8 :w 1.0) diff --git a/test/decompiler/reference/jak2/engine/level/level_REF.gc b/test/decompiler/reference/jak2/engine/level/level_REF.gc index 81ee77fe81..6e2b010e2c 100644 --- a/test/decompiler/reference/jak2/engine/level/level_REF.gc +++ b/test/decompiler/reference/jak2/engine/level/level_REF.gc @@ -2255,9 +2255,9 @@ (set! (-> *setting-control* user-default sound-reverb) (-> s4-1 info sound-reverb)) #t ) - (or (-> *level* border?) (logtest? (-> *game-info* current-continue flags) (continue-flags cf2))) + (or (-> *level* border?) (logtest? (-> *game-info* current-continue flags) (continue-flags change-continue))) (or (!= (-> s4-1 name) (-> *game-info* current-continue level)) - (logtest? (-> *game-info* current-continue flags) (continue-flags cf2)) + (logtest? (-> *game-info* current-continue flags) (continue-flags change-continue)) ) (not (null? (-> s4-1 info continues))) (-> *setting-control* user-current allow-continue) @@ -2273,7 +2273,7 @@ ) (string= (-> *game-info* current-continue name) (-> (the-as continue-point s1-0) name)) ) - (not (logtest? (-> (the-as continue-point s1-0) flags) (continue-flags cf2 cf3))) + (not (logtest? (-> (the-as continue-point s1-0) flags) (continue-flags change-continue no-auto))) ) (set! s3-0 (the-as continue-point s1-0)) (if (string= (-> *game-info* current-continue name) (-> (the-as continue-point s1-0) name)) @@ -2286,7 +2286,7 @@ ) (label cfg-59) (if (and (the-as continue-point s3-0) - (not (logtest? (-> (the-as continue-point s3-0) flags) (continue-flags cf2 cf3))) + (not (logtest? (-> (the-as continue-point s3-0) flags) (continue-flags change-continue no-auto))) ) (set-continue! *game-info* (the-as basic s3-0) #f) ) diff --git a/test/decompiler/reference/jak2/engine/load/loader_REF.gc b/test/decompiler/reference/jak2/engine/load/loader_REF.gc index c1d2915072..be31a77638 100644 --- a/test/decompiler/reference/jak2/engine/load/loader_REF.gc +++ b/test/decompiler/reference/jak2/engine/load/loader_REF.gc @@ -1493,6 +1493,7 @@ ) ;; definition for method 14 of type gui-control +;; WARN: Return type mismatch int vs sound-id. (defmethod lookup-gui-connection-id gui-control ((obj gui-control) (arg0 string) (arg1 gui-channel) (arg2 gui-action)) (let ((s2-0 (the-as gui-connection (-> obj engine alive-list next0)))) (-> obj engine) @@ -1502,7 +1503,7 @@ (or (= arg2 (gui-action none)) (= arg2 (-> s2-0 action))) (or (not arg0) (string= arg0 (-> s2-0 name))) ) - (return (the-as int (-> s2-0 id))) + (return (the-as sound-id (-> s2-0 id))) ) (set! s2-0 (the-as gui-connection s1-0)) (-> obj engine) @@ -1517,11 +1518,11 @@ (or (= arg2 (gui-action none)) (= arg2 (-> s1-1 action))) (or (not arg0) (string= arg0 (-> s1-1 name))) ) - (return (the-as int (-> s1-1 id))) + (return (the-as sound-id (-> s1-1 id))) ) ) ) - 0 + (the-as sound-id 0) ) ;; definition for method 20 of type gui-control diff --git a/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc b/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc index 7bbeb8594f..733561ff2e 100644 --- a/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc +++ b/test/decompiler/reference/jak2/engine/nav/nav-enemy_REF.gc @@ -1022,7 +1022,7 @@ ;; INFO: Used lq/sq ;; WARN: Return type mismatch int vs none. (defmethod nav-enemy-method-161 nav-enemy ((obj nav-enemy)) - (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag enemy-flag39)))) + (set! (-> obj enemy-flags) (the-as enemy-flag (logclear (-> obj enemy-flags) (enemy-flag not-frustrated)))) (set! (-> obj frustration-time) (current-time)) (let ((v1-7 (handle->process (-> obj focus handle)))) (if v1-7 @@ -1049,7 +1049,7 @@ (when (>= (- (current-time) (-> obj frustration-time)) (+ (-> obj reaction-time) (-> obj enemy-info-override frustration-time)) ) - (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag39) (-> obj enemy-flags)))) + (set! (-> obj enemy-flags) (the-as enemy-flag (logior (enemy-flag not-frustrated) (-> obj enemy-flags)))) 0 ) ) @@ -1632,7 +1632,7 @@ This commonly includes things such as: (defmethod go-stare nav-enemy ((obj nav-enemy)) (let ((s5-0 (-> obj focus aware))) (cond - ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) @@ -1653,7 +1653,7 @@ This commonly includes things such as: ;; definition for method 70 of type nav-enemy (defmethod go-hostile nav-enemy ((obj nav-enemy)) - (if (or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + (if (or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) @@ -2026,7 +2026,9 @@ This commonly includes things such as: ) ) ) - (when (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (when (and (-> self enemy-info-override use-frustration) + (logtest? (enemy-flag not-frustrated) (-> self enemy-flags)) + ) (if (-> self enemy-info-override use-stop-chase) (go-virtual stop-chase) (go-stare self) @@ -2217,7 +2219,9 @@ This commonly includes things such as: ) ((= gp-0 (enemy-aware enemy-aware-3)) (if (and (get-enemy-target self) - (not (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (not (and (-> self enemy-info-override use-frustration) + (logtest? (enemy-flag not-frustrated) (-> self enemy-flags)) + ) ) (>= (- (current-time) (-> self starting-time)) (-> self reaction-time)) ) diff --git a/test/decompiler/reference/jak2/engine/scene/scene_REF.gc b/test/decompiler/reference/jak2/engine/scene/scene_REF.gc index 83f15812a9..4e495963b8 100644 --- a/test/decompiler/reference/jak2/engine/scene/scene_REF.gc +++ b/test/decompiler/reference/jak2/engine/scene/scene_REF.gc @@ -1117,7 +1117,7 @@ (gui-action none) ) ) - (v1-167 (get-status *gui-control* (the-as sound-id a1-26))) + (v1-167 (get-status *gui-control* a1-26)) ) (not (or (= v1-167 (gui-status ready)) (= v1-167 (gui-status active)))) ) @@ -1345,7 +1345,7 @@ (let ((v1-41 (scene-player-method-24 self (-> self scene-list (-> self scene-index)) #t))) (when v1-41 (let ((a0-21 (scene-decode-continue (the-as basic (-> v1-41 load-point-obj))))) - (set! a0-24 (when (and a0-21 (logtest? (-> a0-21 flags) (continue-flags cf1))) + (set! a0-24 (when (and a0-21 (logtest? (-> a0-21 flags) (continue-flags scene-wait))) (go-virtual wait a0-24) a0-24 ) diff --git a/test/decompiler/reference/jak2/engine/target/target-death_REF.gc b/test/decompiler/reference/jak2/engine/target/target-death_REF.gc index 07c2a1b69e..4117e27af9 100644 --- a/test/decompiler/reference/jak2/engine/target/target-death_REF.gc +++ b/test/decompiler/reference/jak2/engine/target/target-death_REF.gc @@ -16,7 +16,7 @@ (a3-0 (car a2-2)) ) (while (not (null? a2-2)) - (if (and v1-0 (logtest? (continue-flags cf17) (-> (the-as continue-point a3-0) flags))) + (if (and v1-0 (logtest? (continue-flags test) (-> (the-as continue-point a3-0) flags))) (return (the-as continue-point a3-0)) ) (if (= a3-0 arg0) @@ -115,12 +115,12 @@ (if (-> *art-control* reserve-buffer) (reserve-free *art-control* (-> *art-control* reserve-buffer heap)) ) - (when (logtest? (-> arg0 flags) (continue-flags cf8 cf11)) + (when (logtest? (-> arg0 flags) (continue-flags demo demo-movie)) (set! (-> ctywide memory-mode) (load-buffer-mode small-edge)) 0 ) (kill-persister *setting-control* (the-as engine-pers 'fail) 'bg-a) - (when (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (when (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (add-setting! 'bg-a 'abs 1.0 0) (set! (-> *setting-control* user-current bg-a) 1.0) ) @@ -156,7 +156,7 @@ (if (not (string= (-> arg0 name) "default")) (set! *external-cam-mode* #f) ) - (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (if (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (cam-stop) ) (suspend) @@ -222,7 +222,7 @@ (set! (-> *level* border?) s5-2) ) (set! (-> *ACTOR-bank* birth-max) 1000) - (when (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (when (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (new 'stack 'transformq) (cam-start #t) (suspend) @@ -263,7 +263,7 @@ (set! *spawn-actors* #t) (set! *teleport* #t) (set! (-> *ACTOR-bank* birth-max) 1000) - (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (if (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (set-blackout-frames (seconds 0.1)) ) (let* ((a0-94 *game-info*) @@ -283,7 +283,7 @@ (t9-53 a0-94 a1-51 #f) ) (cond - ((logtest? (-> arg0 flags) (continue-flags cf5)) + ((logtest? (-> arg0 flags) (continue-flags game-start)) (case *kernel-boot-message* (('kiosk) (let ((s5-5 (ppointer->handle (auto-save-command 'restore 0 0 *default-pool* #f)))) @@ -299,27 +299,27 @@ ) ) ) - ((logtest? (-> arg0 flags) (continue-flags cf12)) + ((logtest? (-> arg0 flags) (continue-flags title)) (go target-title #t) ) - ((logtest? (-> arg0 flags) (continue-flags cf13)) + ((logtest? (-> arg0 flags) (continue-flags title-movie)) (go target-title #f) ) - ((logtest? (-> arg0 flags) (continue-flags cf8)) + ((logtest? (-> arg0 flags) (continue-flags demo)) (go target-demo #t) ) - ((logtest? (-> arg0 flags) (continue-flags cf11)) + ((logtest? (-> arg0 flags) (continue-flags demo-movie)) (go target-demo #f) ) - ((logtest? (-> arg0 flags) (continue-flags cf9)) + ((logtest? (-> arg0 flags) (continue-flags intro)) (intro-play) ) - ((logtest? (-> arg0 flags) (continue-flags cf10)) + ((logtest? (-> arg0 flags) (continue-flags hero-mode)) (logior! (-> self game secrets) (game-secrets hero-mode)) (logior! (-> self game purchase-secrets) (game-secrets hero-mode)) (intro-play) ) - ((logtest? (-> arg0 flags) (continue-flags cf7)) + ((logtest? (-> arg0 flags) (continue-flags warp-gate)) (let ((s5-7 (current-time))) (until (>= (- (current-time) s5-7) (seconds 0.05)) (suspend) @@ -335,22 +335,22 @@ ) ) ) - ((logtest? (continue-flags cf22) (-> arg0 flags)) + ((logtest? (continue-flags indax) (-> arg0 flags)) enter-state (go target-indax-start) ) - ((logtest? (continue-flags cf18) (-> arg0 flags)) + ((logtest? (continue-flags record-path) (-> arg0 flags)) ) - ((logtest? (continue-flags cf21) (-> arg0 flags)) + ((logtest? (continue-flags record-sig) (-> arg0 flags)) (start-sig-recorder) ) - ((logtest? (continue-flags cf19 cf20) (-> arg0 flags)) + ((logtest? (continue-flags pilot pilot-dax) (-> arg0 flags)) (set! (-> self focus-status) (logior (focus-status pilot) (-> self focus-status))) (while (not (-> self mode-cache)) (suspend) ) ) - ((logtest? (-> arg0 flags) (continue-flags cf6)) + ((logtest? (-> arg0 flags) (continue-flags demo-end)) (go target-grab 'stance) ) (else diff --git a/test/decompiler/reference/jak2/engine/ui/gui-h_REF.gc b/test/decompiler/reference/jak2/engine/ui/gui-h_REF.gc index 59970ece80..3c25dcf32b 100644 --- a/test/decompiler/reference/jak2/engine/ui/gui-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/ui/gui-h_REF.gc @@ -267,7 +267,7 @@ (stop-str (_type_ gui-connection) int 11) (gui-control-method-12 (_type_ process gui-channel gui-action string int float sound-id) sound-id 12) (update (_type_ symbol) int 13) - (lookup-gui-connection-id (_type_ string gui-channel gui-action) int 14) + (lookup-gui-connection-id (_type_ string gui-channel gui-action) sound-id 14) (lookup-gui-connection (_type_ process gui-channel string sound-id) gui-connection 15) (set-action! (_type_ gui-action sound-id gui-channel gui-action string (function gui-connection symbol) process) int 16) (get-status (_type_ sound-id) gui-status 17) diff --git a/test/decompiler/reference/jak2/engine/ui/text_REF.gc b/test/decompiler/reference/jak2/engine/ui/text_REF.gc index 2fe7f000e9..df4039a606 100644 --- a/test/decompiler/reference/jak2/engine/ui/text_REF.gc +++ b/test/decompiler/reference/jak2/engine/ui/text_REF.gc @@ -623,25 +623,11 @@ in a single text group and file." (set! sv-64 (+ sv-64 1)) ) (when (not arg2) - (let* ((s2-1 (-> *display* frames (-> *display* on-screen) global-buf)) - (s3-1 (-> s2-1 base)) - ) + (with-dma-buffer-add-bucket ((s2-1 (-> *display* frames (-> *display* on-screen) global-buf)) + arg4 + ) (draw-string *game-text-line* s2-1 arg1) (set! (-> arg1 color) (-> *font-work* last-color)) - (let ((a3-2 (-> s2-1 base))) - (let ((v1-121 (the-as object (-> s2-1 base)))) - (set! (-> (the-as dma-packet v1-121) dma) (new 'static 'dma-tag :id (dma-tag-id next))) - (set! (-> (the-as dma-packet v1-121) vif0) (new 'static 'vif-tag)) - (set! (-> (the-as dma-packet v1-121) vif1) (new 'static 'vif-tag)) - (set! (-> s2-1 base) (&+ (the-as pointer v1-121) 16)) - ) - (dma-bucket-insert-tag - (-> *display* frames (-> *display* on-screen) bucket-group) - arg4 - s3-1 - (the-as (pointer dma-tag) a3-2) - ) - ) ) ) (set! (-> arg1 origin y) f30-2) diff --git a/test/decompiler/reference/jak2/levels/atoll/atoll-scenes_REF.gc b/test/decompiler/reference/jak2/levels/atoll/atoll-scenes_REF.gc index c94ced0788..49ed6a070a 100644 --- a/test/decompiler/reference/jak2/levels/atoll/atoll-scenes_REF.gc +++ b/test/decompiler/reference/jak2/levels/atoll/atoll-scenes_REF.gc @@ -1282,7 +1282,7 @@ :end-point-obj (new 'static 'continue-point :name "atoll-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2277804.5 :y 217672.9 :z -4571725.5 :w 1.0) :quat (new 'static 'vector :y -0.9671 :w 0.2541) :camera-trans (new 'static 'vector :x 2310242.8 :y 251249.05 :z -4513428.0 :w 1.0) @@ -1689,7 +1689,7 @@ :end-point-obj (new 'static 'continue-point :name "atoll-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2277804.5 :y 217672.9 :z -4571725.5 :w 1.0) :quat (new 'static 'vector :y -0.9671 :w 0.2541) :camera-trans (new 'static 'vector :x 2310242.8 :y 251249.05 :z -4513428.0 :w 1.0) diff --git a/test/decompiler/reference/jak2/levels/city/common/ctywide-scenes_REF.gc b/test/decompiler/reference/jak2/levels/city/common/ctywide-scenes_REF.gc index 6d937cc6ae..89e62c9c2a 100644 --- a/test/decompiler/reference/jak2/levels/city/common/ctywide-scenes_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/common/ctywide-scenes_REF.gc @@ -645,7 +645,7 @@ :end-point-obj (new 'static 'continue-point :name "ctyslumb-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2620227.2 :y 31333.99 :z -400654.34 :w 1.0) :quat (new 'static 'vector :y 0.9997 :w -0.0234) :camera-trans (new 'static 'vector :x 2606159.8 :y 52533.656 :z -360011.78 :w 1.0) @@ -819,7 +819,7 @@ :end-point-obj (new 'static 'continue-point :name "ctyslumb-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 2588147.8 :y 32754.482 :z -150693.89 :w 1.0) :quat (new 'static 'vector :x -0.0012 :y -0.9819 :z -0.0008 :w 0.1889) :camera-trans (new 'static 'vector :x 2593185.8 :y 51852.492 :z -107130.88 :w 1.0) diff --git a/test/decompiler/reference/jak2/levels/city/market/east/ashelin/ctyasha-obs_REF.gc b/test/decompiler/reference/jak2/levels/city/market/east/ashelin/ctyasha-obs_REF.gc index 954d20ca4b..2939794b01 100644 --- a/test/decompiler/reference/jak2/levels/city/market/east/ashelin/ctyasha-obs_REF.gc +++ b/test/decompiler/reference/jak2/levels/city/market/east/ashelin/ctyasha-obs_REF.gc @@ -2158,7 +2158,7 @@ This commonly includes things such as: :end-point-obj (new 'static 'continue-point :name "ctymarkb-tanker" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 1928400.1 :y 34444.902 :z 1788676.5 :w 1.0) :quat (new 'static 'vector :y 0.3641 :w -0.9313) :camera-trans (new 'static 'vector :x 1960564.4 :y 55543.81 :z 1760002.0 :w 1.0) diff --git a/test/decompiler/reference/jak2/levels/common/ai/bot_REF.gc b/test/decompiler/reference/jak2/levels/common/ai/bot_REF.gc index 738bb6613a..ea396fd491 100644 --- a/test/decompiler/reference/jak2/levels/common/ai/bot_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/ai/bot_REF.gc @@ -1329,10 +1329,7 @@ If the player is too far, play a warning speech." (let ((speech (-> obj course speeches idx))) (= (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (-> speech name) (gui-channel none) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (-> speech name) (gui-channel none) (gui-action none)) ) (gui-status unknown) ) @@ -1355,10 +1352,7 @@ If the player is too far, play a warning speech." ) (nonzero? (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (the-as string #f) (the-as gui-channel channel) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (the-as string #f) (the-as gui-channel channel) (gui-action none)) ) ) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc index ffe69e2b1e..8716c1a1db 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/amphibian/amphibian_REF.gc @@ -942,7 +942,7 @@ (defmethod go-stare amphibian ((obj amphibian)) (let ((s5-0 (-> obj focus aware))) (cond - ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/guards/guard-conversation_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/guards/guard-conversation_REF.gc index be374102f8..8685bed07e 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/guards/guard-conversation_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/guards/guard-conversation_REF.gc @@ -351,10 +351,7 @@ ) (if (nonzero? (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) ) ) (set! (-> self last-playing-time) (current-time)) @@ -404,10 +401,7 @@ ) (until (= (get-status *gui-control* - (the-as - sound-id - (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (the-as string #f) (gui-channel guard) (gui-action none)) ) (gui-status unknown) ) diff --git a/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc b/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc index 31de6eeb79..7c3d96e552 100644 --- a/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/enemy/hover/crimson-guard-hover_REF.gc @@ -510,7 +510,7 @@ (kick-attack () _type_ :state 158) (attack () _type_ :state 159) (die-now () _type_ :state 160) - (shoot (_type_ vector projectile-init-by-other-params int float float) none 161) + (shoot (_type_ vector projectile-init-by-other-params int int float) none 161) (crimson-guard-hover-method-162 (_type_ process-focusable) symbol 162) ) ) @@ -748,8 +748,8 @@ (set! (-> s5-0 attack-id) a0-6) ) (set! (-> s5-0 timeout) (seconds 4)) - (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) - (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + (shoot self gp-0 s5-0 9 12 1.0) + (shoot self gp-0 s5-0 11 12 -1.0) ) (sound-play "hover-fire") (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) @@ -947,8 +947,8 @@ (set! (-> s5-0 attack-id) a0-6) ) (set! (-> s5-0 timeout) (seconds 4)) - (shoot self gp-0 s5-0 9 0.000000000000000000000000000000000000000000017 1.0) - (shoot self gp-0 s5-0 11 0.000000000000000000000000000000000000000000017 -1.0) + (shoot self gp-0 s5-0 9 12 1.0) + (shoot self gp-0 s5-0 11 12 -1.0) ) (sound-play "hover-fire") (let ((v0-0 (the-as object (+ (-> self shots-fired) 1)))) @@ -1705,7 +1705,7 @@ (arg0 vector) (arg1 projectile-init-by-other-params) (arg2 int) - (arg3 float) + (arg3 int) (arg4 float) ) (vector<-cspace! (-> arg1 pos) (-> obj node-list data arg2)) diff --git a/test/decompiler/reference/jak2/levels/common/races/race-manager_REF.gc b/test/decompiler/reference/jak2/levels/common/races/race-manager_REF.gc index f252dc6130..d27807898e 100644 --- a/test/decompiler/reference/jak2/levels/common/races/race-manager_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/races/race-manager_REF.gc @@ -1042,7 +1042,7 @@ (let* ((gp-0 (-> obj race-state)) (s3-0 (-> gp-0 info)) ) - (if (or (logtest? (-> s3-0 flags) 2) (logtest? (continue-flags cf19) (-> *game-info* last-continue flags))) + (if (or (logtest? (-> s3-0 flags) 2) (logtest? (continue-flags pilot) (-> *game-info* last-continue flags))) (logior! (-> gp-0 flags) 2) ) (let ((s4-0 (new 'stack-no-clear 'mystery-traffic-object-spawn-params))) diff --git a/test/decompiler/reference/jak2/levels/common/warp-gate_REF.gc b/test/decompiler/reference/jak2/levels/common/warp-gate_REF.gc index 657d02ae67..94ec5e9fa3 100644 --- a/test/decompiler/reference/jak2/levels/common/warp-gate_REF.gc +++ b/test/decompiler/reference/jak2/levels/common/warp-gate_REF.gc @@ -738,7 +738,7 @@ (ja :num! (loop!)) (ja-post) ) - (if (not (logtest? (-> arg0 flags) (continue-flags cf4))) + (if (not (logtest? (-> arg0 flags) (continue-flags no-blackout))) (set-blackout-frames (seconds 0.05)) ) (start 'play arg0) diff --git a/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc b/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc index 42408ae512..b07c1aea4b 100644 --- a/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc +++ b/test/decompiler/reference/jak2/levels/drill_platform/ginsu_REF.gc @@ -1000,7 +1000,7 @@ ;; definition for method 70 of type ginsu (defmethod go-hostile ginsu ((obj ginsu)) (cond - ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> obj enemy-flags))) + ((or (and (-> obj enemy-info-override use-frustration) (logtest? (enemy-flag not-frustrated) (-> obj enemy-flags))) (nav-enemy-method-163 obj) ) (go-stare2 obj) diff --git a/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc b/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc index 401c9f1430..1287877e2b 100644 --- a/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc +++ b/test/decompiler/reference/jak2/levels/mars_tomb/monster-frog_REF.gc @@ -578,7 +578,9 @@ ) ) ) - (when (and (-> self enemy-info-override use-frustration) (logtest? (enemy-flag enemy-flag39) (-> self enemy-flags))) + (when (and (-> self enemy-info-override use-frustration) + (logtest? (enemy-flag not-frustrated) (-> self enemy-flags)) + ) (if (-> self enemy-info-override use-stop-chase) (go-virtual stop-chase) (go-stare self) diff --git a/test/decompiler/reference/jak2/levels/mars_tomb/tomb-water_REF.gc b/test/decompiler/reference/jak2/levels/mars_tomb/tomb-water_REF.gc index 5e60293e28..b2dad2ef7c 100644 --- a/test/decompiler/reference/jak2/levels/mars_tomb/tomb-water_REF.gc +++ b/test/decompiler/reference/jak2/levels/mars_tomb/tomb-water_REF.gc @@ -1995,7 +1995,7 @@ This commonly includes things such as: ;; definition of type tomb-vibe (deftype tomb-vibe (process-drawable) ((spawn-pos vector :inline :offset-assert 208) - (pat-tbl (array handle) :offset-assert 224) + (pat-tbl (pointer int32) :offset-assert 224) (pat-count int32 :offset-assert 228) (pat-index int32 :offset-assert 232) (pat-entry-index int32 :offset-assert 236) @@ -2117,16 +2117,14 @@ This commonly includes things such as: (case (-> (the-as attack-info (-> event param 1)) mode) (('flop 'spin 'punch) (cond - ((and (= (-> v1-0 0) (-> (the-as (pointer int32) (+ (the-as uint (-> self pat-tbl)) (* (-> self pat-index) 4))))) - (!= (-> gp-0 0) (process->handle self)) - ) + ((and (= (-> v1-0 0) (-> self pat-tbl (-> self pat-index))) (!= (-> gp-0 0) (process->handle self))) (send-event (handle->process (-> gp-0 0)) 'interrupt) (send-event (handle->process (-> gp-0 0)) 'die) (logior! (-> self flags) 1) (go-virtual vibrate) ) (else - (set! (-> v1-0 0) (-> (the-as (pointer int32) (+ (the-as uint (-> self pat-tbl)) (* (-> self pat-index) 4))))) + (set! (-> v1-0 0) (-> self pat-tbl (-> self pat-index))) (set! (-> gp-0 0) (process->handle self)) (go-virtual vibrate) ) @@ -2257,7 +2255,7 @@ This commonly includes things such as: 'sound-tune #f 0.0 - (+ (-> (the-as (pointer int32) (+ (the-as uint (-> self pat-tbl)) (* (-> self pat-index) 4)))) 18) + (+ (-> self pat-tbl (-> self pat-index)) 18) ) (let ((gp-1 (current-time))) (until (>= (- (current-time) gp-1) (seconds 0.2)) @@ -2416,11 +2414,11 @@ This commonly includes things such as: (let ((v1-26 (res-lump-data (-> obj entity) 'vibe-pattern pointer :tag-ptr (& sv-16)))) (cond ((and v1-26 (nonzero? (-> sv-16 elt-count))) - (set! (-> obj pat-tbl) (the-as (array handle) v1-26)) + (set! (-> obj pat-tbl) (the-as (pointer int32) v1-26)) (set! (-> obj pat-count) (the-as int (-> sv-16 elt-count))) ) (else - (set! (-> obj pat-tbl) #f) + (set! (-> obj pat-tbl) (the-as (pointer int32) #f)) (set! (-> obj pat-count) 0) 0 ) @@ -3079,3 +3077,7 @@ This commonly includes things such as: (go (method-of-object obj idle)) (none) ) + + + + diff --git a/test/decompiler/reference/jak2/levels/palace/roof/palboss-scenes_REF.gc b/test/decompiler/reference/jak2/levels/palace/roof/palboss-scenes_REF.gc index 835b8ebe91..621009b9ea 100644 --- a/test/decompiler/reference/jak2/levels/palace/roof/palboss-scenes_REF.gc +++ b/test/decompiler/reference/jak2/levels/palace/roof/palboss-scenes_REF.gc @@ -527,7 +527,7 @@ :load-point-obj (new 'static 'continue-point :name "palroof-boss" :level #f - :flags (continue-flags cf3 cf17) + :flags (continue-flags no-auto test) :trans (new 'static 'vector :x 870794.06 :y 1671154.9 :z 2027482.4 :w 1.0) :quat (new 'static 'vector :y 0.4793 :w 0.8776) :camera-trans (new 'static 'vector :x 831816.06 :y 1693132.0 :z 2045632.9 :w 1.0) diff --git a/test/decompiler/reference/jak2/levels/sewer/sewer-obs2_REF.gc b/test/decompiler/reference/jak2/levels/sewer/sewer-obs2_REF.gc index 9932c2d83c..6d165caae2 100644 --- a/test/decompiler/reference/jak2/levels/sewer/sewer-obs2_REF.gc +++ b/test/decompiler/reference/jak2/levels/sewer/sewer-obs2_REF.gc @@ -1647,7 +1647,7 @@ This commonly includes things such as: (deftype sew-scare-grunt (grunt) ((anim spool-anim :offset-assert 692) (manipy (pointer manipy) :offset-assert 696) - (spooled-sound-id uint32 :offset-assert 700) + (spooled-sound-id sound-id :offset-assert 700) (grill-actor entity-actor :offset-assert 704) ) :heap-base #x250 @@ -1889,10 +1889,7 @@ This commonly includes things such as: ) ) (set! (-> self spooled-sound-id) - (the-as - uint - (lookup-gui-connection-id *gui-control* (-> self anim name) (gui-channel art-load) (gui-action none)) - ) + (lookup-gui-connection-id *gui-control* (-> self anim name) (gui-channel art-load) (gui-action none)) ) (none) ) @@ -1948,7 +1945,7 @@ This commonly includes things such as: (when *sound-player-enable* (let ((set-sound-param (the-as sound-rpc-set-param (get-sound-buffer-entry)))) (set! (-> set-sound-param command) (sound-command set-param)) - (set! (-> set-sound-param id) (the-as sound-id (-> self spooled-sound-id))) + (set! (-> set-sound-param id) (-> self spooled-sound-id)) (set! (-> set-sound-param params volume) (the int (* 1024.0 scale))) (let ((position (-> self root-override2 trans))) (let ((_self self)) @@ -2088,3 +2085,7 @@ This commonly includes things such as: (set! (-> obj root-override2 trans y) (+ -3276.8 (-> obj root-override2 trans y))) (none) ) + + + + diff --git a/test/decompiler/reference/jak2/levels/sewer/sewer-scenes_REF.gc b/test/decompiler/reference/jak2/levels/sewer/sewer-scenes_REF.gc index b202d4713c..fb536c9cd2 100644 --- a/test/decompiler/reference/jak2/levels/sewer/sewer-scenes_REF.gc +++ b/test/decompiler/reference/jak2/levels/sewer/sewer-scenes_REF.gc @@ -935,7 +935,7 @@ :end-point-obj (new 'static 'continue-point :name "sewesc-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 5541148.0 :y -363968.9 :z 2435194.5 :w 1.0) :quat (new 'static 'vector :y 0.0482 :w 0.9988) :camera-trans (new 'static 'vector :x 5518817.0 :y -344878.7 :z 2399633.5 :w 1.0) @@ -1219,7 +1219,7 @@ :end-point-obj (new 'static 'continue-point :name "sewesc-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x 5608474.5 :y -363960.3 :z 1988017.4 :w 1.0) :quat (new 'static 'vector :y -0.6775 :w -0.7354) :camera-trans (new 'static 'vector :x 5562796.5 :y -344327.78 :z 1985962.4 :w 1.0) diff --git a/test/decompiler/reference/jak2/levels/underport/under-scenes_REF.gc b/test/decompiler/reference/jak2/levels/underport/under-scenes_REF.gc index 52f5e16ebd..8e1d83af34 100644 --- a/test/decompiler/reference/jak2/levels/underport/under-scenes_REF.gc +++ b/test/decompiler/reference/jak2/levels/underport/under-scenes_REF.gc @@ -809,7 +809,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -281437.8 :y -266239.6 :z 7897175.0 :w 1.0) :quat (new 'static 'vector :y -0.0077 :w 0.9999) :camera-trans (new 'static 'vector :x -251373.16 :y -249839.2 :z 7882176.0 :w 1.0) @@ -1546,7 +1546,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -277934.5 :y -273739.38 :z 8274381.0 :w 1.0) :quat (new 'static 'vector :y 0.1135 :w -0.9935) :camera-trans (new 'static 'vector :x -251817.98 :y -252642.1 :z 8230336.0 :w 1.0) @@ -2370,7 +2370,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -912500.75 :y -274436.5 :z 8332461.5 :w 1.0) :quat (new 'static 'vector :y -0.9997 :w 0.0214) :camera-trans (new 'static 'vector :x -910896.3 :y -257269.77 :z 8368969.0 :w 1.0) @@ -2996,7 +2996,7 @@ :end-point-obj (new 'static 'continue-point :name "under-start" :level #f - :flags (continue-flags cf2) + :flags (continue-flags change-continue) :trans (new 'static 'vector :x -934223.06 :y -290824.2 :z 7948726.0 :w 1.0) :quat (new 'static 'vector :y 0.4849 :w 0.8745) :camera-trans (new 'static 'vector :x -978344.75 :y -270091.06 :z 7925256.5 :w 1.0) diff --git a/test/decompiler/reference/jak2/levels/underport/underb-master_REF.gc b/test/decompiler/reference/jak2/levels/underport/underb-master_REF.gc index 2579068f58..57e0b7446b 100644 --- a/test/decompiler/reference/jak2/levels/underport/underb-master_REF.gc +++ b/test/decompiler/reference/jak2/levels/underport/underb-master_REF.gc @@ -698,9 +698,9 @@ ((id int8 :offset-assert 200) (up-y float :offset-assert 204) (down-y float :offset-assert 208) - (mode uint64 :offset-assert 216) + (mode under-locking-mode :offset-assert 216) (which-reminder? symbol :offset-assert 224) - (spooled-sound-id uint32 :offset-assert 228) + (spooled-sound-id sound-id :offset-assert 228) (draining-part sparticle-launch-control :offset-assert 232) (actor-group (pointer actor-group) :offset-assert 236) (spooled-sound-delay int32 :offset-assert 240) @@ -809,7 +809,7 @@ (let ((a1-6 *target*)) (cond ((and a1-6 (focus-test? a1-6 mech)) - (set! (-> self mode) (the-as uint 3)) + (set! (-> self mode) (under-locking-mode want-drain)) (let ((a1-8 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-8 from) (process->ppointer self)) (set! (-> a1-8 num-params) 1) @@ -828,7 +828,7 @@ ) ) (else - (set! (-> self mode) (the-as uint 0)) + (set! (-> self mode) (under-locking-mode want-mech)) (let ((a1-9 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-9 from) (process->ppointer self)) (set! (-> a1-9 num-params) 1) @@ -870,14 +870,14 @@ (let ((v1-1 (-> self mode))) (cond ((-> event param 0) - (when (or (zero? v1-1) (= v1-1 5)) + (when (or (= v1-1 (under-locking-mode want-mech)) (= v1-1 (under-locking-mode want-exit-mech))) (let ((a0-4 *target*)) (and a0-4 (not (logtest? (focus-status mech) (-> a0-4 focus-status)))) ) ) ) (else - (or (= v1-1 2) (= v1-1 3)) + (or (= v1-1 (under-locking-mode airlock-wait)) (= v1-1 (under-locking-mode want-drain))) ) ) ) @@ -885,80 +885,78 @@ ) ) :trans (behavior () - (let ((v1-0 (-> self mode))) - (cond - ((zero? v1-0) - (let ((v1-1 *target*) - (a0-1 (-> self actor-group)) + (case (-> self mode) + (((under-locking-mode want-mech)) + (let ((v1-1 *target*) + (a0-1 (-> self actor-group)) + ) + (when (and v1-1 a0-1) + (if (and (-> a0-1 0 data 0 actor) + (focus-test? v1-1 mech) + (send-event (ppointer->process *underb-master*) 'request 'mech #t) + ) + (set! (-> self mode) (under-locking-mode want-fill)) ) - (when (and v1-1 a0-1) - (if (and (-> a0-1 0 data 0 actor) - (focus-test? v1-1 mech) - (send-event (ppointer->process *underb-master*) 'request 'mech #t) + ) + ) + ) + (((under-locking-mode want-fill)) + (if (not (logtest? (-> self actor-group 0 data 0 actor extra perm status) (entity-perm-status subtask-complete))) + (go-virtual filling) + ) + ) + (((under-locking-mode airlock-wait)) + (let ((a1-2 (new 'stack-no-clear 'event-message-block))) + (set! (-> a1-2 from) (process->ppointer self)) + (set! (-> a1-2 num-params) 0) + (set! (-> a1-2 message) 'front) + (let ((t9-2 send-event-function) + (v1-24 (-> self actor-group 0 data 1 actor)) + ) + (if (not (t9-2 + (if v1-24 + (-> v1-24 extra process) + ) + a1-2 ) - (set! (-> self mode) (the-as uint 1)) - ) - ) + ) + (set! (-> self mode) (under-locking-mode want-drain)) + ) ) ) - ((= v1-0 1) - (if (not (logtest? (-> self actor-group 0 data 0 actor extra perm status) (entity-perm-status subtask-complete))) - (go-virtual filling) - ) - ) - ((= v1-0 2) - (let ((a1-2 (new 'stack-no-clear 'event-message-block))) - (set! (-> a1-2 from) (process->ppointer self)) - (set! (-> a1-2 num-params) 0) - (set! (-> a1-2 message) 'front) - (let ((t9-2 send-event-function) - (v1-24 (-> self actor-group 0 data 1 actor)) - ) - (if (not (t9-2 - (if v1-24 - (-> v1-24 extra process) - ) - a1-2 - ) - ) - (set! (-> self mode) (the-as uint 3)) - ) - ) + ) + (((under-locking-mode want-drain)) + (if (>= 20480.0 (vector-vector-xz-distance (target-pos 0) (-> self root trans))) + (set! (-> self mode) (under-locking-mode drain)) + ) + ) + (((under-locking-mode drain)) + (go-virtual draining) + ) + (((under-locking-mode want-exit-mech)) + (let ((a1-4 *target*)) + (when (or (not a1-4) (not (logtest? (focus-status mech) (-> a1-4 focus-status)))) + (set! (-> self mode) (under-locking-mode want-mech)) + 0 ) ) - ((= v1-0 3) - (if (>= 20480.0 (vector-vector-xz-distance (target-pos 0) (-> self root trans))) - (set! (-> self mode) (the-as uint 4)) - ) - ) - ((= v1-0 4) - (go-virtual draining) - ) - ((= v1-0 5) - (let ((a1-4 *target*)) - (when (or (not a1-4) (not (logtest? (focus-status mech) (-> a1-4 focus-status)))) - (set! (-> self mode) (the-as uint 0)) - 0 - ) - ) - (when (>= (- (current-time) (-> self last-reminder-time)) (seconds 9)) - (set! (-> self last-reminder-time) (current-time)) - (add-process - *gui-control* - self - (gui-channel ashelin) - (gui-action play) - (if (-> self which-reminder?) - "cityv193" - "cityv192" - ) - -99.0 - 0 - ) - (set! (-> self which-reminder?) (not (-> self which-reminder?))) + (when (>= (- (current-time) (-> self last-reminder-time)) (seconds 9)) + (set! (-> self last-reminder-time) (current-time)) + (add-process + *gui-control* + self + (gui-channel ashelin) + (gui-action play) + (if (-> self which-reminder?) + "cityv193" + "cityv192" + ) + -99.0 + 0 ) + (set! (-> self which-reminder?) (not (-> self which-reminder?))) ) - ) + ) ) (none) ) @@ -971,7 +969,7 @@ :event (-> (method-of-type under-locking active) event) :enter (behavior () (set! (-> self spooled-sound-id) - (the-as uint (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrfill" -99.0 0)) + (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrfill" -99.0 0) ) (set! (-> self state-time) 0) (set! (-> self spooled-sound-delay) (if (= (-> self id) 1) @@ -983,7 +981,7 @@ ) :trans (behavior () (when (and (zero? (-> self state-time)) - (= (get-status *gui-control* (the-as sound-id (-> self spooled-sound-id))) (gui-status ready)) + (= (get-status *gui-control* (-> self spooled-sound-id)) (gui-status ready)) ) (set! (-> self state-time) (current-time)) (set! (-> self last-reminder-time) (current-time)) @@ -995,7 +993,7 @@ (set-action! *gui-control* (gui-action play) - (the-as sound-id (-> self spooled-sound-id)) + (-> self spooled-sound-id) (gui-channel none) (gui-action none) (the-as string #f) @@ -1064,7 +1062,7 @@ (persist-with-delay *setting-control* 'interp-time (seconds 0.05) 'interp-time 'abs 0.0 0) (remove-setting! 'entity-name) (send-event (ppointer->process *underb-master*) 'request 'under-warp #t) - (set! (-> self mode) (the-as uint 2)) + (set! (-> self mode) (under-locking-mode airlock-wait)) (go-virtual active) ) ) @@ -1082,7 +1080,7 @@ :event (-> (method-of-type under-locking active) event) :enter (behavior () (set! (-> self spooled-sound-id) - (the-as uint (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrdrain" -99.0 0)) + (add-process *gui-control* self (gui-channel ashelin) (gui-action queue) "wtrdrain" -99.0 0) ) (set! (-> self state-time) 0) 0 @@ -1090,14 +1088,14 @@ ) :trans (behavior () (when (and (zero? (-> self state-time)) - (= (get-status *gui-control* (the-as sound-id (-> self spooled-sound-id))) (gui-status ready)) + (= (get-status *gui-control* (-> self spooled-sound-id)) (gui-status ready)) ) (set! (-> self state-time) (current-time)) (set! (-> self last-reminder-time) (current-time)) (set-action! *gui-control* (gui-action play) - (the-as sound-id (-> self spooled-sound-id)) + (-> self spooled-sound-id) (gui-channel none) (gui-action none) (the-as string #f) @@ -1165,7 +1163,7 @@ ) (when v1-26 (when (= (-> (the-as water-anim v1-26) root trans y) (-> self down-y)) - (set! (-> self mode) (the-as uint 5)) + (set! (-> self mode) (under-locking-mode want-exit-mech)) (send-event (ppointer->process *underb-master*) 'request 'mech #f) (set! (-> self which-reminder?) #f) (go-virtual active) @@ -1191,7 +1189,7 @@ This commonly includes things such as: - sounds" (local-vars (sv-16 res-tag)) (set! (-> obj which-reminder?) #f) - (set! (-> obj spooled-sound-id) (the-as uint 0)) + (set! (-> obj spooled-sound-id) (new 'static 'sound-id)) (set! (-> obj root) (new 'process 'trsqv)) (process-drawable-from-entity! obj arg0) (set! (-> obj id) (res-lump-value arg0 'extra-id int :time -1000000000.0)) @@ -1271,3 +1269,7 @@ This commonly includes things such as: 0 (none) ) + + + + diff --git a/third-party/imgui/imgui_style.cpp b/third-party/imgui/imgui_style.cpp index 0d14589de1..835f6b2f83 100644 --- a/third-party/imgui/imgui_style.cpp +++ b/third-party/imgui/imgui_style.cpp @@ -3,84 +3,130 @@ #include "imgui.h" namespace ImGui { - void applyAlternateStyle() { - ImVec4* colors = ImGui::GetStyle().Colors; - colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); - colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); - colors[ImGuiCol_WindowBg] = ImVec4(0.10f, 0.10f, 0.10f, 1.00f); - colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_PopupBg] = ImVec4(0.19f, 0.19f, 0.19f, 0.92f); - colors[ImGuiCol_Border] = ImVec4(0.19f, 0.19f, 0.19f, 0.29f); - colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.24f); - colors[ImGuiCol_FrameBg] = ImVec4(0.05f, 0.05f, 0.05f, 0.54f); - colors[ImGuiCol_FrameBgHovered] = ImVec4(0.19f, 0.19f, 0.19f, 0.54f); - colors[ImGuiCol_FrameBgActive] = ImVec4(0.20f, 0.22f, 0.23f, 1.00f); - colors[ImGuiCol_TitleBg] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_TitleBgActive] = ImVec4(0.06f, 0.06f, 0.06f, 1.00f); - colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); - colors[ImGuiCol_ScrollbarBg] = ImVec4(0.05f, 0.05f, 0.05f, 0.54f); - colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.34f, 0.34f, 0.34f, 0.54f); - colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.40f, 0.54f); - colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.56f, 0.56f, 0.56f, 0.54f); - colors[ImGuiCol_CheckMark] = ImVec4(0.33f, 0.67f, 0.86f, 1.00f); - colors[ImGuiCol_SliderGrab] = ImVec4(0.34f, 0.34f, 0.34f, 0.54f); - colors[ImGuiCol_SliderGrabActive] = ImVec4(0.56f, 0.56f, 0.56f, 0.54f); - colors[ImGuiCol_Button] = ImVec4(0.05f, 0.05f, 0.05f, 0.54f); - colors[ImGuiCol_ButtonHovered] = ImVec4(0.19f, 0.19f, 0.19f, 0.54f); - colors[ImGuiCol_ButtonActive] = ImVec4(0.20f, 0.22f, 0.23f, 1.00f); - colors[ImGuiCol_Header] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); - colors[ImGuiCol_HeaderHovered] = ImVec4(0.00f, 0.00f, 0.00f, 0.36f); - colors[ImGuiCol_HeaderActive] = ImVec4(0.20f, 0.22f, 0.23f, 0.33f); - colors[ImGuiCol_Separator] = ImVec4(0.28f, 0.28f, 0.28f, 0.29f); - colors[ImGuiCol_SeparatorHovered] = ImVec4(0.44f, 0.44f, 0.44f, 0.29f); - colors[ImGuiCol_SeparatorActive] = ImVec4(0.40f, 0.44f, 0.47f, 1.00f); - colors[ImGuiCol_ResizeGrip] = ImVec4(0.28f, 0.28f, 0.28f, 0.29f); - colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.44f, 0.44f, 0.44f, 0.29f); - colors[ImGuiCol_ResizeGripActive] = ImVec4(0.40f, 0.44f, 0.47f, 1.00f); - colors[ImGuiCol_Tab] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); - colors[ImGuiCol_TabHovered] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); - colors[ImGuiCol_TabActive] = ImVec4(0.20f, 0.20f, 0.20f, 0.36f); - colors[ImGuiCol_TabUnfocused] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); - colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); - colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogram] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_TableHeaderBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); - colors[ImGuiCol_TableBorderStrong] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); - colors[ImGuiCol_TableBorderLight] = ImVec4(0.28f, 0.28f, 0.28f, 0.29f); - colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); - colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); - colors[ImGuiCol_TextSelectedBg] = ImVec4(0.20f, 0.22f, 0.23f, 1.00f); - colors[ImGuiCol_DragDropTarget] = ImVec4(0.33f, 0.67f, 0.86f, 1.00f); - colors[ImGuiCol_NavHighlight] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); - colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 0.00f, 0.00f, 0.70f); - colors[ImGuiCol_NavWindowingDimBg] = ImVec4(1.00f, 0.00f, 0.00f, 0.20f); - colors[ImGuiCol_ModalWindowDimBg] = ImVec4(1.00f, 0.00f, 0.00f, 0.35f); +void applyAlternateStyle() { + ImVec4* colors = ImGui::GetStyle().Colors; + colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.10f, 0.10f, 0.10f, 1.00f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(0.19f, 0.19f, 0.19f, 0.92f); + colors[ImGuiCol_Border] = ImVec4(0.19f, 0.19f, 0.19f, 0.29f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.24f); + colors[ImGuiCol_FrameBg] = ImVec4(0.05f, 0.05f, 0.05f, 0.54f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.19f, 0.19f, 0.19f, 0.54f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.20f, 0.22f, 0.23f, 1.00f); + colors[ImGuiCol_TitleBg] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.06f, 0.06f, 0.06f, 1.00f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.05f, 0.05f, 0.05f, 0.54f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.34f, 0.34f, 0.34f, 0.54f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.40f, 0.54f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.56f, 0.56f, 0.56f, 0.54f); + colors[ImGuiCol_CheckMark] = ImVec4(0.33f, 0.67f, 0.86f, 1.00f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.34f, 0.34f, 0.34f, 0.54f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.56f, 0.56f, 0.56f, 0.54f); + colors[ImGuiCol_Button] = ImVec4(0.05f, 0.05f, 0.05f, 0.54f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.19f, 0.19f, 0.19f, 0.54f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.20f, 0.22f, 0.23f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.00f, 0.00f, 0.00f, 0.36f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.20f, 0.22f, 0.23f, 0.33f); + colors[ImGuiCol_Separator] = ImVec4(0.28f, 0.28f, 0.28f, 0.29f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.44f, 0.44f, 0.44f, 0.29f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.40f, 0.44f, 0.47f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.28f, 0.28f, 0.28f, 0.29f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.44f, 0.44f, 0.44f, 0.29f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.40f, 0.44f, 0.47f, 1.00f); + colors[ImGuiCol_Tab] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); + colors[ImGuiCol_TabHovered] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); + colors[ImGuiCol_TabActive] = ImVec4(0.20f, 0.20f, 0.20f, 0.36f); + colors[ImGuiCol_TabUnfocused] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); + colors[ImGuiCol_TabUnfocusedActive] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); + colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.00f, 0.00f, 0.00f, 0.52f); + colors[ImGuiCol_TableBorderLight] = ImVec4(0.28f, 0.28f, 0.28f, 0.29f); + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.20f, 0.22f, 0.23f, 1.00f); + colors[ImGuiCol_DragDropTarget] = ImVec4(0.33f, 0.67f, 0.86f, 1.00f); + colors[ImGuiCol_NavHighlight] = ImVec4(1.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 0.00f, 0.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(1.00f, 0.00f, 0.00f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(1.00f, 0.00f, 0.00f, 0.35f); - ImGuiStyle& style = ImGui::GetStyle(); - style.WindowPadding = ImVec2(8.00f, 8.00f); - style.FramePadding = ImVec2(5.00f, 2.00f); - style.CellPadding = ImVec2(6.00f, 6.00f); - style.ItemSpacing = ImVec2(6.00f, 6.00f); - style.ItemInnerSpacing = ImVec2(6.00f, 6.00f); - style.TouchExtraPadding = ImVec2(0.00f, 0.00f); - style.IndentSpacing = 25; - style.ScrollbarSize = 15; - style.GrabMinSize = 10; - style.WindowBorderSize = 1; - style.ChildBorderSize = 1; - style.PopupBorderSize = 1; - style.FrameBorderSize = 1; - style.TabBorderSize = 1; - style.WindowRounding = 7; - style.ChildRounding = 4; - style.FrameRounding = 3; - style.PopupRounding = 4; - style.ScrollbarRounding = 9; - style.GrabRounding = 3; - style.LogSliderDeadzone = 4; - style.TabRounding = 4; - } + ImGuiStyle& style = ImGui::GetStyle(); + style.WindowPadding = ImVec2(8.00f, 8.00f); + style.FramePadding = ImVec2(5.00f, 2.00f); + style.CellPadding = ImVec2(6.00f, 6.00f); + style.ItemSpacing = ImVec2(6.00f, 6.00f); + style.ItemInnerSpacing = ImVec2(6.00f, 6.00f); + style.TouchExtraPadding = ImVec2(0.00f, 0.00f); + style.IndentSpacing = 25; + style.ScrollbarSize = 15; + style.GrabMinSize = 10; + style.WindowBorderSize = 1; + style.ChildBorderSize = 1; + style.PopupBorderSize = 1; + style.FrameBorderSize = 1; + style.TabBorderSize = 1; + style.WindowRounding = 7; + style.ChildRounding = 4; + style.FrameRounding = 3; + style.PopupRounding = 4; + style.ScrollbarRounding = 9; + style.GrabRounding = 3; + style.LogSliderDeadzone = 4; + style.TabRounding = 4; } + +void applyClassicStyle() { + ImGuiStyle& style = ImGui::GetStyle(); + style.Alpha = 1.0f; + style.DisabledAlpha = 0.60f; + style.WindowPadding = ImVec2(8, 8); + style.WindowRounding = 0.0f; + style.WindowBorderSize = 1.0f; + style.WindowMinSize = ImVec2(32, 32); + style.WindowTitleAlign = ImVec2(0.0f, 0.5f); + style.WindowMenuButtonPosition = ImGuiDir_Left; + style.ChildRounding = 0.0f; + style.ChildBorderSize = 1.0f; + style.PopupRounding = 0.0f; + style.PopupBorderSize = 1.0f; + style.FramePadding = ImVec2(4, 3); + style.FrameRounding = 0.0f; + style.FrameBorderSize = 0.0f; + style.ItemSpacing = ImVec2(8, 4); + style.ItemInnerSpacing = ImVec2(4, 4); + style.CellPadding = ImVec2(4, 2); + style.TouchExtraPadding = ImVec2(0, 0); + style.IndentSpacing = 21.0f; + style.ColumnsMinSpacing = 6.0f; + style.ScrollbarSize = 14.0f; + style.ScrollbarRounding = 9.0f; + style.GrabMinSize = 12.0f; + style.GrabRounding = 0.0f; + style.LogSliderDeadzone = 4.0f; + style.TabRounding = 4.0f; + style.TabBorderSize = 0.0f; + style.TabMinWidthForCloseButton = 0.0f; + style.ColorButtonPosition = ImGuiDir_Right; + style.ButtonTextAlign = ImVec2(0.5f, 0.5f); + style.SelectableTextAlign = ImVec2(0.0f, 0.0f); + style.DisplayWindowPadding = ImVec2(19, 19); + style.DisplaySafeAreaPadding = ImVec2(3, 3); + style.MouseCursorScale = 1.0f; + style.AntiAliasedLines = true; + style.AntiAliasedLinesUseTex = true; + style.AntiAliasedFill = true; + style.CurveTessellationTol = 1.25f; + style.CircleTessellationMaxError = 0.30f; + + ImGui::StyleColorsDark(); +} +} // namespace ImGui diff --git a/third-party/imgui/imgui_style.h b/third-party/imgui/imgui_style.h index 87ff2f22ba..42bd2dcf08 100644 --- a/third-party/imgui/imgui_style.h +++ b/third-party/imgui/imgui_style.h @@ -2,4 +2,5 @@ namespace ImGui { void applyAlternateStyle(); +void applyClassicStyle(); }