Merge remote-tracking branch 'upstream/master' into v/nrepl

This commit is contained in:
Tyler Wilding
2022-04-26 23:38:29 -04:00
171 changed files with 3805 additions and 1966 deletions
+9
View File
@@ -233,6 +233,10 @@ void Texture::serialize(Serializer& ser) {
ser.from_ptr(&load_to_pool);
}
void CollisionMesh::serialize(Serializer& ser) {
ser.from_pod_vector(&vertices);
}
void Level::serialize(Serializer& ser) {
ser.from_ptr(&version);
if (ser.is_loading() && version != TFRAG3_VERSION) {
@@ -282,6 +286,8 @@ void Level::serialize(Serializer& ser) {
tree.serialize(ser);
}
collision.serialize(ser);
ser.from_ptr(&version2);
if (ser.is_loading() && version2 != TFRAG3_VERSION) {
ASSERT_MSG(false, fmt::format(
@@ -352,6 +358,9 @@ std::array<int, MemoryUsageCategory::NUM_CATEGORIES> Level::get_memory_usage() c
result[SHRUB_IND] += sizeof(u32) * shrub_tree.indices.size();
}
// collision
result[COLLISION] += sizeof(CollisionMesh::Vertex) * collision.vertices.size();
return result;
}
+17 -1
View File
@@ -44,10 +44,13 @@ enum MemoryUsageCategory {
SHRUB_TIME_OF_DAY,
SHRUB_VERT,
SHRUB_IND,
COLLISION,
NUM_CATEGORIES
};
constexpr int TFRAG3_VERSION = 14;
constexpr int TFRAG3_VERSION = 15;
// These vertices should be uploaded to the GPU at load time and don't change
struct PreloadedVertex {
@@ -306,6 +309,18 @@ struct ShrubTree {
void unpack();
};
struct CollisionMesh {
struct Vertex {
float x, y, z;
u32 flags;
s16 nx, ny, nz;
u16 pad;
};
static_assert(sizeof(Vertex) == 24);
std::vector<Vertex> vertices;
void serialize(Serializer& ser);
};
constexpr int TFRAG_GEOS = 3;
constexpr int TIE_GEOS = 4;
@@ -316,6 +331,7 @@ struct Level {
std::array<std::vector<TfragTree>, TFRAG_GEOS> tfrag_trees;
std::array<std::vector<TieTree>, TIE_GEOS> tie_trees;
std::vector<ShrubTree> shrub_trees;
CollisionMesh collision;
u16 version2 = TFRAG3_VERSION;
void serialize(Serializer& ser);
+7
View File
@@ -96,6 +96,13 @@ class Vector {
return *this;
}
Vector<T, Size>& operator-=(const Vector<T, Size>& other) {
for (int i = 0; i < Size; i++) {
m_data[i] -= other[i];
}
return *this;
}
Vector<T, Size> elementwise_multiply(const Vector<T, Size>& other) const {
Vector<T, Size> result;
for (int i = 0; i < Size; i++) {
+1
View File
@@ -282,6 +282,7 @@ class StructureType : public ReferenceType {
bool is_always_stack_singleton() const { return m_always_stack_singleton; }
void set_allow_misalign(bool misalign) { m_allow_misalign = misalign; }
void set_gen_inspect(bool gen_inspect) { m_generate_inspect = gen_inspect; }
int size() const { return m_size_in_mem; }
protected:
friend class TypeSystem;
+21 -9
View File
@@ -316,6 +316,7 @@ StructureDefResult parse_structure_def(
int method_count_assert = -1;
uint64_t flag_assert = 0;
bool flag_assert_set = false;
bool set_heapbase = false;
while (!rest->is_empty_list()) {
if (car(rest).is_pair()) {
auto opt_list = &car(rest);
@@ -366,6 +367,7 @@ StructureDefResult parse_structure_def(
}
rest = cdr(rest);
flags.heap_base = hb;
set_heapbase = true;
} else if (opt_name == ":allow-misaligned") {
result.allow_misaligned = true;
} else if (opt_name == ":final") {
@@ -378,6 +380,25 @@ StructureDefResult parse_structure_def(
}
}
if (ts->fully_defined_type_exists(TypeSpec("process")) &&
ts->tc(TypeSpec("process"), TypeSpec(type->get_parent()))) {
// check heap-base if this is a child of process.
auto process_type = ts->get_type_of_type<BasicType>("process");
auto auto_hb = (flags.size - process_type->size() + 0xf) & ~0xf;
if (!set_heapbase) {
// wasnt set manually so set automatically.
flags.heap_base = auto_hb;
} else if (flags.heap_base < auto_hb) {
// was set manually so verify if that's correct.
throw std::runtime_error(
fmt::format("Process heap underflow in type {}: heap-base is {} vs. auto-detected {}",
type->get_name(), flags.heap_base, auto_hb));
//} else if (flags.heap_base != auto_hb) {
// fmt::print("Type {} has manual heap-base ({} vs {}). This is fine. \n", type->get_name(),
// flags.heap_base, auto_hb);
}
}
if (size_assert != -1 && flags.size != u16(size_assert)) {
throw std::runtime_error("Type " + type->get_name() + " came out to size " +
std::to_string(int(flags.size)) + " but size-assert was set to " +
@@ -398,15 +419,6 @@ StructureDefResult parse_structure_def(
flags.flag, flag_assert));
}
if (result.flags.heap_base) {
int heap_start_1 = 112 + result.flags.heap_base;
int heap_start_2 = (result.flags.size + 15) & (~15);
if (heap_start_1 != heap_start_2) {
throw std::runtime_error(fmt::format("Heap base bad on {}: {} vs {}\n", type->get_name(),
heap_start_1, heap_start_2));
}
}
result.flags = flags;
return result;
}
+2 -2
View File
@@ -387,8 +387,8 @@ static std::vector<EncodeInfo> g_encode_info_jak1 = {
};
static std::vector<ReplaceInfo> g_replace_info_jak1 = {
// \" -> " (confusing)
{"\\\"", "\""},
// \" -> " (yeah it looks confusing)
{"\"", "\\\""},
// other
{"A~Y~-21H~-5Vº~Z", "Å"},
+2 -1
View File
@@ -51,10 +51,11 @@ add_library(
IR2/LabelDB.cpp
IR2/OpenGoalMapping.cpp
level_extractor/BspHeader.cpp
level_extractor/extract_collide_frags.cpp
level_extractor/extract_level.cpp
level_extractor/extract_tfrag.cpp
level_extractor/extract_tie.cpp
level_extractor/BspHeader.cpp
level_extractor/extract_shrub.cpp
ObjectFile/LinkedObjectFile.cpp
+1
View File
@@ -67,6 +67,7 @@ Config read_config_file(const std::string& path_to_config_file,
config.generate_symbol_definition_map = cfg.at("generate_symbol_definition_map").get<bool>();
config.is_pal = cfg.at("is_pal").get<bool>();
config.rip_levels = cfg.at("levels_convert_to_obj").get<bool>();
config.extract_collision = cfg.at("extract_collision").get<bool>();
auto allowed = cfg.at("allowed_objects").get<std::vector<std::string>>();
for (const auto& x : allowed) {
+1
View File
@@ -100,6 +100,7 @@ struct Config {
bool process_game_text = false;
bool process_game_count = false;
bool rip_levels = false;
bool extract_collision = false;
bool write_hex_near_instructions = false;
bool hexdump_code = false;
+23 -21
View File
@@ -501,7 +501,7 @@
(gmerc-tfrag-tex1 18) ;; generic merc, with tfrag textures, level 1
(shrub-tex0 19)
(shrub0 20)
(shrub-tex1 25)
(shrub1 26)
@@ -557,9 +557,12 @@
(pre-sprite-textures 65) ;; common
(sprite 66)
;; debug spheres? 67
(debug-draw0 67)
(debug 67)
;; debug text 68
(debug-draw1 68)
(debug-no-zbuf 68)
;; extra buckets for pc port
(subtitle 69)
)
(define-extern sinteger type)
@@ -1036,13 +1039,16 @@
(misty-daxter-hit-lurkers-not-mines #x27f)
(sidekick-speech-hint-crate-darkeco1 #x281)
(sidekick-speech-crate-steel-break1 #x283)
(sidekick-speech-hint-crate-iron #x284)
(sidekick-speech-hint-crate-steel #x285)
(beach-collectors-unblocked #x288)
(jungleb-eco-vents-opened #x289)
(misty-stopped-lurkers-at-silo #x28a)
(misty-stopped-balloon-lurkers #x28b)
(jungleb-eco-vents-opened #x289)
(sidekick-speech-crate-steel-break2 #x28e)
(sidekick-speech-hint-crate-darkeco2 #x28f)
@@ -1061,13 +1067,10 @@
(misty-teetertotter-bonk-dax-tutorial #x2a4)
(sidekick-hint-misty-get-red-eco #x2a5)
(red-eco-tutorial #x2a6)
(daxter-blue-eco-plat-tutorial #x2a7)
(fish? #x2a9)
(misty-bone-bridge-hint #x2aa)
(beach-grottopole-increment #x2af)
@@ -10259,7 +10262,7 @@
(normal-attack 14)
(strong-attack 15)
(indestructible 16)
(fop17 17) ;; unused
(eco-blocked 18)
(respawn 19)
@@ -10546,7 +10549,6 @@
;; - Types
;; NOTE - root can also be a collide-shape
(declare-type joint-mod basic)
(deftype manipy (process-drawable)
((new-trans-hook (function none) :offset-assert 176) ;; TODO - no idea on these types
@@ -10619,9 +10621,9 @@
(grab-target handle :offset 120)
(grab-event symbol :offset-assert 128)
(release-event symbol :offset-assert 132)
(old-global-mask uint32 :offset-assert 136)
(old-self-mask uint32 :offset-assert 140)
(old-parent-mask uint32 :offset-assert 144)
(old-global-mask process-mask :offset-assert 136)
(old-self-mask process-mask :offset-assert 140)
(old-parent-mask process-mask :offset-assert 144)
(look-at-target handle :offset-assert 152)
(pov-target handle :offset-assert 160)
(work-process handle :offset-assert 168)
@@ -10631,7 +10633,7 @@
(userdata basic :offset-assert 196)
(message basic :offset-assert 200)
(border-value basic :offset-assert 204)
(mask-to-clear uint32 :offset-assert 208)
(mask-to-clear process-mask :offset-assert 208)
(script pair :offset-assert 212)
(script-line pair :offset-assert 216)
(script-func (function none) :offset-assert 220) ;; TODO - unconfirmed, see generic-obs::lambda::33
@@ -10701,16 +10703,16 @@
(deftype othercam (process)
((hand handle :offset-assert 112)
(old-global-mask uint32 :offset-assert 120)
(mask-to-clear uint32 :offset-assert 124)
(old-global-mask process-mask :offset-assert 120)
(mask-to-clear process-mask :offset-assert 124)
(cam-joint-index int32 :offset-assert 128)
(old-pos vector :inline :offset-assert 144)
(old-mat-z vector :inline :offset-assert 160)
(had-valid-frame basic :offset-assert 176)
(border-value basic :offset-assert 180)
(die? symbol :offset-assert 184)
(die? symbol :offset-assert 184)
(survive-anim-end? symbol :offset-assert 188)
(spooling? symbol :offset-assert 192)
(spooling? symbol :offset-assert 192)
)
:heap-base #x60
:method-count-assert 14
@@ -10754,7 +10756,7 @@
(notify-handle handle :offset-assert 192)
(anim-name string :offset-assert 200)
(command-list pair :offset-assert 204)
(mask-to-clear uint32 :offset-assert 208)
(mask-to-clear process-mask :offset-assert 208)
(music-volume-movie float :offset-assert 212)
(sfx-volume-movie float :offset-assert 216)
)
@@ -11365,7 +11367,7 @@
(target-attack 12) ;; all target attacks
(mother-spider 13)
(cak-14 14) ;; unused
(blue-eco-suck 15) ;; manipy, orb-cache-top,
(blue-eco-suck 15) ;; manipy, orb-cache-top,
(unknown-16 16)
(unknown-17 17)
(unknown-18 18)
@@ -23782,10 +23784,10 @@
;; - Functions
(define-extern mistycannon-prebind-function (function mistycannon int mistycannon none))
(define-extern mistycannon-prebind-function (function pointer int mistycannon none))
(define-extern mistycannon-postbind-function (function mistycannon none))
(define-extern angle-tracker-init-range! (function angle-tracker float float float none))
(define-extern mistycannon-pick-random-target-point (function float :behavior mistycannon))
(define-extern mistycannon-pick-random-target-point (function none :behavior mistycannon))
(define-extern angle-tracker-seek! (function angle-tracker float symbol))
(define-extern mistycannon-do-aim (function vector vector none :behavior mistycannon)) ;; can return a #f is postbindinfo-ok is false
(define-extern mistycannon-find-trajectory (function trajectory-params none :behavior mistycannon))
@@ -86,5 +86,8 @@
// turn this on to extract level background graphics data
"levels_extract": true,
// turn this on if you want extracted levels to be saved out as .obj files
"levels_convert_to_obj": false
"levels_convert_to_obj": false,
// should we extract collision meshes?
// these can be displayed in game, but makes the .fr3 files slightly larger
"extract_collision": true
}
+15 -4
View File
@@ -290,7 +290,7 @@ void decompile(std::filesystem::path jak1_input_files) {
// levels
{
extract_all_levels(db, tex_db, config.levels_to_extract, "GAME.CGO", config.hacks,
config.rip_levels);
config.rip_levels, config.extract_collision);
}
}
@@ -317,6 +317,7 @@ int main(int argc, char** argv) {
bool flag_decompile = false;
bool flag_compile = false;
bool flag_play = false;
bool flag_folder = false;
lg::initialize();
@@ -334,6 +335,7 @@ int main(int argc, char** argv) {
app.add_flag("-d,--decompile", flag_decompile, "Decompile the game data");
app.add_flag("-c,--compile", flag_compile, "Compile the game");
app.add_flag("-p,--play", flag_play, "Play the game");
app.add_flag("-f,--folder", flag_folder, "Extract from folder");
app.validate_positionals();
CLI11_PARSE(app, argc, argv);
@@ -352,16 +354,18 @@ int main(int argc, char** argv) {
setup_global_decompiler_stuff(std::nullopt);
}
auto path_to_iso_files = file_util::get_jak_project_dir() / "extracted_iso";
std::filesystem::path path_to_iso_files = file_util::get_jak_project_dir() / "iso_data" / "jak1";
std::filesystem::create_directories(path_to_iso_files);
// make sure the input looks right
if (!std::filesystem::exists(data_dir_path)) {
fmt::print("Error: input folder {} does not exist\n", data_dir_path.string());
fmt::print("Error: input data path {} does not exist\n", data_dir_path.string());
return 1;
}
if (flag_runall || flag_extract) {
if (!std::filesystem::is_directory(data_dir_path)) {
if (std::filesystem::is_regular_file(data_dir_path)) {
// it's a file, treat it as an ISO
auto iso_file = extract_files(data_dir_path, path_to_iso_files);
auto validation_res = validate(iso_file, path_to_iso_files);
if (validation_res == ExtractorErrorCode::VALIDATION_BAD_EXTRACTION) {
@@ -370,6 +374,13 @@ int main(int argc, char** argv) {
} else if (flag_fail_on_validation && validation_res != ExtractorErrorCode::SUCCESS) {
return static_cast<int>(validation_res);
}
} else if (std::filesystem::is_directory(data_dir_path)) {
if (!flag_folder) {
// if we didn't request a folder explicitly, but we got one, assume something went wrong.
fmt::print("Error: got a folder, but didn't get folder flag\n");
return static_cast<int>(ExtractorErrorCode::VALIDATION_BAD_ISO_CONTENTS);
}
path_to_iso_files = data_dir_path;
}
}
+138
View File
@@ -59,6 +59,14 @@ std::string Vector::print_meters(int indent) const {
return result;
}
std::string Vector::print_decimal(int indent) const {
s32 d[4];
memcpy(d, data, 16);
std::string is(indent, ' ');
std::string result;
result += fmt::format("{}<vector {:d} {:d} {:d} {:d}>\n", is, d[0], d[1], d[2], d[3]);
return result;
}
void FileInfo::read_from_file(TypedRef ref, const decompiler::DecompilerTypeSystem& dts) {
file_type = read_type_field(ref, "file-type", dts, true);
file_name = read_string_field(ref, "file-name", dts, true);
@@ -887,6 +895,15 @@ void PrototypeBucketTie::read_from_file(TypedRef ref,
dists.read_from_file(get_field_ref(ref, "dists", dts));
rdists.read_from_file(get_field_ref(ref, "rdists", dts));
stiffness = read_plain_data_field<float>(ref, "stiffness", dts);
auto fr = get_field_ref(ref, "collide-frag", dts);
{
const auto& word = fr.data->words_by_seg.at(fr.seg).at(fr.byte_offset / 4);
if (word.kind() == decompiler::LinkedWord::PTR) {
auto p = deref_label(fr);
p.byte_offset -= 4;
collide_frag.read_from_file(typed_ref_from_basic(p, dts), dts, stats);
}
}
auto next_slot = get_field_ref(ref, "next", dts);
for (int i = 0; i < 4; i++) {
@@ -1117,6 +1134,120 @@ std::string DrawableTreeInstanceTie::my_type() const {
return "drawable-tree-instance-tie";
}
void DrawableTreeCollideFragment::read_from_file(TypedRef ref,
const decompiler::DecompilerTypeSystem& dts,
DrawStats* stats) {
s16 length = read_plain_data_field<s16>(ref, "length", dts);
auto data_ref = get_field_ref(ref, "data", dts);
if ((data_ref.byte_offset % 4) != 0) {
throw Error("misaligned data array");
}
Ref array_slot_ref = data_ref;
array_slot_ref.byte_offset += (length - 1) * 4;
Ref object_ref = deref_label(array_slot_ref);
object_ref.byte_offset -= 4;
last_array.read_from_file(typed_ref_from_basic(object_ref, dts), dts, stats);
}
std::string DrawableTreeCollideFragment::print(const PrintSettings& settings, int indent) const {
return last_array.print(settings, indent);
}
std::string DrawableTreeCollideFragment::my_type() const {
return "drawable-tree-collide-fragment";
}
void DrawableInlineArrayCollideFragment::read_from_file(TypedRef ref,
const decompiler::DecompilerTypeSystem& dts,
DrawStats* stats) {
ASSERT(ref.type->get_name() == "drawable-inline-array-collide-fragment");
id = read_plain_data_field<s16>(ref, "id", dts);
length = read_plain_data_field<s16>(ref, "length", dts);
bsphere.read_from_file(get_field_ref(ref, "bsphere", dts));
auto data_ref = get_field_ref(ref, "data", dts);
for (int i = 0; i < length; i++) {
Ref obj_ref = data_ref;
obj_ref.byte_offset += 32 * i; // todo not a constant here
auto type = get_type_of_basic(obj_ref);
if (type != "collide-fragment") {
throw Error("bad collide fragment type: {}", type);
}
collide_fragments.emplace_back();
collide_fragments.back().read_from_file(typed_ref_from_basic(obj_ref, dts), dts, stats);
}
}
std::string DrawableInlineArrayCollideFragment::print(const PrintSettings& settings,
int indent) const {
std::string is(indent, ' ');
std::string result;
int next_indent = indent + 4;
result += fmt::format("{}id: {}\n", is, id);
result += fmt::format("{}length: {}\n", is, length);
result += fmt::format("{}bsphere: {}", is, bsphere.print_meters());
if (settings.expand_collide) {
for (u32 i = 0; i < collide_fragments.size(); i++) {
result += fmt::format("{}data [{}]:\n", is, i);
result += collide_fragments[i].print(settings, next_indent);
}
}
return result;
}
std::string DrawableInlineArrayCollideFragment::my_type() const {
return "drawable-inline-array-collide-fragment";
}
void CollideFragment::read_from_file(TypedRef ref,
const decompiler::DecompilerTypeSystem& dts,
DrawStats* stats) {
bsphere.read_from_file(get_field_ref(ref, "bsphere", dts));
auto r = deref_label(get_field_ref(ref, "mesh", dts));
r.byte_offset -= 4;
mesh.read_from_file(typed_ref_from_basic(r, dts), dts, stats);
}
std::string CollideFragment::print(const PrintSettings& settings, int indent) const {
std::string is(indent, ' ');
std::string result;
result += fmt::format("{}bsphere: {}", is, bsphere.print_meters());
result += mesh.print(settings, indent);
return result;
}
void CollideFragMesh::read_from_file(TypedRef ref,
const decompiler::DecompilerTypeSystem& dts,
DrawStats* stats) {
strip_data_len = read_plain_data_field<u16>(ref, "strip-data-len", dts);
poly_count = read_plain_data_field<u16>(ref, "poly-count", dts);
vertex_count = read_plain_data_field<u8>(ref, "vertex-count", dts);
vertex_data_qwc = read_plain_data_field<u8>(ref, "vertex-data-qwc", dts);
total_qwc = read_plain_data_field<u8>(ref, "total-qwc", dts);
base_trans.read_from_file(get_field_ref(ref, "base-trans", dts));
base_trans.data[3] = 0;
packed_data = deref_label(get_field_ref(ref, "packed-data", dts));
pat_array = deref_label(get_field_ref(ref, "pat-array", dts));
}
std::string CollideFragMesh::print(const PrintSettings& settings, int indent) const {
std::string is(indent, ' ');
std::string result;
result += fmt::format("{}strip-data-len: {}\n", is, strip_data_len);
result += fmt::format("{}poly-count: {}\n", is, poly_count);
result += fmt::format("{}vertex-count: {}\n", is, vertex_count);
result += fmt::format("{}vertex-data-qwc: {}\n", is, vertex_data_qwc);
result += fmt::format("{}total-qwc: {}\n", is, total_qwc);
result += fmt::format("{}base-trans: {}", is, base_trans.print_decimal());
return result;
}
//////////////////////////
// shrub
//////////////////////////
@@ -1584,6 +1715,13 @@ std::unique_ptr<DrawableTree> make_drawable_tree(TypedRef ref,
tree->read_from_file(ref, dts, stats);
return tree;
}
if (ref.type->get_name() == "drawable-tree-collide-fragment") {
auto tree = std::make_unique<DrawableTreeCollideFragment>();
tree->read_from_file(ref, dts, stats);
return tree;
}
auto tree = std::make_unique<DrawableTreeUnknown>();
tree->read_from_file(ref, dts, stats);
return tree;
+69 -1
View File
@@ -14,6 +14,9 @@ class DecompilerTypeSystem;
} // namespace decompiler
namespace level_tools {
u32 deref_u32(const Ref& ref, int word_offset);
struct PrintSettings {
bool print_tfrag = false;
bool expand_draw_node = false;
@@ -23,7 +26,8 @@ struct PrintSettings {
bool expand_drawable_tree_tie_proto_data = false;
bool expand_drawable_tree_instance_tie = false;
bool expand_drawable_tree_actor = false;
bool expand_shrub = true;
bool expand_shrub = false;
bool expand_collide = false;
};
struct DrawStats {
@@ -50,6 +54,7 @@ struct Vector {
std::string print(int indent = 0) const;
std::string print_meters(int indent = 0) const;
std::string print_decimal(int indent = 0) const;
};
// a matrix with 16-bit integers.
@@ -181,6 +186,68 @@ struct DrawableTreeActor : public DrawableTree {
std::vector<std::unique_ptr<DrawableInlineArray>> arrays;
};
/////////////////////
// Collision
/////////////////////
struct CollideFragMesh {
/*
((packed-data uint32 :offset-assert 4)
(pat-array uint32 :offset-assert 8)
(strip-data-len uint16 :offset-assert 12)
(poly-count uint16 :offset-assert 14)
(base-trans vector :inline :offset-assert 16)
;; these go in the w of the vector above.
(vertex-count uint8 :offset 28)
(vertex-data-qwc uint8 :offset 29)
(total-qwc uint8 :offset 30)
(unused uint8 :offset 31)
)
*/
void read_from_file(TypedRef ref, const decompiler::DecompilerTypeSystem& dts, DrawStats* stats);
std::string print(const PrintSettings& settings, int indent) const;
u16 strip_data_len;
u16 poly_count;
// appears to be integers...
Vector base_trans;
u8 vertex_count;
u8 vertex_data_qwc;
u8 total_qwc;
Ref packed_data;
Ref pat_array;
};
struct CollideFragment {
void read_from_file(TypedRef ref, const decompiler::DecompilerTypeSystem& dts, DrawStats* stats);
std::string print(const PrintSettings& settings, int indent) const;
Vector bsphere;
CollideFragMesh mesh;
};
struct DrawableInlineArrayCollideFragment : public DrawableInlineArray {
void read_from_file(TypedRef ref,
const decompiler::DecompilerTypeSystem& dts,
DrawStats* stats) override;
std::string print(const PrintSettings& settings, int indent) const override;
std::string my_type() const override;
std::vector<CollideFragment> collide_fragments;
s16 id;
s16 length;
Vector bsphere;
};
struct DrawableTreeCollideFragment : public DrawableTree {
void read_from_file(TypedRef ref,
const decompiler::DecompilerTypeSystem& dts,
DrawStats* stats) override;
std::string print(const PrintSettings& settings, int indent) const override;
std::string my_type() const override;
DrawableInlineArrayCollideFragment last_array;
};
/////////////////////
// TFRAG
/////////////////////
@@ -382,6 +449,7 @@ struct PrototypeBucketTie {
// todo envmap shader
// todo collide-frag
DrawableInlineArrayCollideFragment collide_frag;
// todo tie-colors
// todo data
@@ -0,0 +1,280 @@
#include "extract_collide_frags.h"
#include "common/util/FileUtil.h"
namespace decompiler {
struct CollideListItem {
const level_tools::CollideFragMesh* mesh = nullptr;
const level_tools::InstanceTie* inst = nullptr;
struct {
std::vector<math::Vector4f> vu0_buffer;
std::vector<math::Vector<u8, 3>> faces;
} unpacked;
};
/*!
* Get all collide frags.
*/
std::vector<CollideListItem> build_all_frags_list(
const level_tools::DrawableTreeCollideFragment* tree,
const std::vector<const level_tools::DrawableTreeInstanceTie*>& ties) {
std::vector<CollideListItem> list;
for (auto& cf : tree->last_array.collide_fragments) {
auto& elt = list.emplace_back();
elt.mesh = &cf.mesh;
elt.inst = nullptr;
}
for (auto tt : ties) {
auto last_array = tt->arrays.back().get();
auto as_instance_array = dynamic_cast<level_tools::DrawableInlineArrayInstanceTie*>(last_array);
ASSERT(as_instance_array);
for (auto& inst : as_instance_array->instances) {
auto& frags = tt->prototypes.prototype_array_tie.data.at(inst.bucket_index)
.collide_frag.collide_fragments;
for (auto& frag : frags) {
auto& elt = list.emplace_back();
elt.inst = &inst;
elt.mesh = &frag.mesh;
}
}
}
return list;
}
float u32_to_float(u32 in) {
float r;
memcpy(&r, &in, sizeof(float));
return r;
}
u16 deref_u16(const Ref& ref, int array_idx) {
u32 u32_offset = array_idx / 2;
u32 u32_val = level_tools::deref_u32(ref, u32_offset);
if (array_idx & 1) {
return u32_val >> 16;
} else {
return (u16)u32_val;
}
}
s8 deref_s8(const Ref& ref, int byte) {
u32 u32_offset = byte / 4;
u32 u32_val = level_tools::deref_u32(ref, u32_offset);
s8 vals[4];
memcpy(vals, &u32_val, 4);
return vals[byte & 3];
}
void unpack_part1_collide_list_item(CollideListItem& item) {
int in_idx = 0;
int out_idx = 0;
int qw_to_write = item.mesh->vertex_count;
while (out_idx < qw_to_write * 4) {
auto& vert = item.unpacked.vu0_buffer.emplace_back();
vert[0] = u32_to_float(0x4d000000 + deref_u16(item.mesh->packed_data, in_idx++));
vert[1] = u32_to_float(0x4d000000 + deref_u16(item.mesh->packed_data, in_idx++));
vert[2] = u32_to_float(0x4d000000 + deref_u16(item.mesh->packed_data, in_idx++));
vert[3] = u32_to_float(0x3f800000);
out_idx += 4;
}
}
math::Vector<float, 4> transform_tie(const std::array<math::Vector4f, 4> mat,
const math::Vector4f& pt) {
auto temp = mat[0] * pt.x() + mat[1] * pt.y() + mat[2] * pt.z() + mat[3];
math::Vector4f result;
result.x() = temp.x();
result.y() = temp.y();
result.z() = temp.z();
result.w() = 1.f;
return result;
}
namespace {
// todo dedup
std::array<math::Vector4f, 4> extract_tie_matrix(const u16* data) {
std::array<math::Vector4f, 4> result;
for (int i = 0; i < 4; i++) {
s32 x = data[12 + i];
x <<= 16;
x >>= 10;
result[3][i] = x;
}
for (int vec = 0; vec < 3; vec++) {
for (int i = 0; i < 4; i++) {
s32 x = data[vec * 4 + i];
x <<= 16;
x >>= 16;
result[vec][i] = (float)x / 4096.f;
}
}
return result;
}
} // namespace
void unpack_part2_collide_list_item(CollideListItem& item) {
float base_offset = u32_to_float(0x4d000000);
math::Vector4f vf13_combo_offset(base_offset, base_offset, base_offset, 0);
s32 base_trans_int[4];
memcpy(base_trans_int, item.mesh->base_trans.data, 16);
math::Vector4f vf14_base_trans_float(base_trans_int[0], base_trans_int[1], base_trans_int[2],
base_trans_int[3]);
vf13_combo_offset -= vf14_base_trans_float;
std::array<math::Vector4f, 4> mat;
if (item.inst) {
mat = extract_tie_matrix(item.inst->origin.data);
mat[3][0] += item.inst->bsphere.data[0];
mat[3][1] += item.inst->bsphere.data[1];
mat[3][2] += item.inst->bsphere.data[2];
}
for (auto& ver : item.unpacked.vu0_buffer) {
ver -= vf13_combo_offset;
if (item.inst) {
ver = transform_tie(mat, ver);
}
}
}
void find_faces(CollideListItem& item) {
u32 byte_offset = 16 * item.mesh->vertex_data_qwc;
while (true) {
s8 t7_start_idx = deref_s8(item.mesh->packed_data, byte_offset++);
if (t7_start_idx < 0) {
return;
}
s8 t8_start_idx = deref_s8(item.mesh->packed_data, byte_offset++);
s8 t6_start_idx = deref_s8(item.mesh->packed_data, byte_offset++);
s8 t6_run_idx = t7_start_idx;
s8 t7_run_idx = t8_start_idx;
s8 ra_run_idx = t6_start_idx;
item.unpacked.faces.emplace_back(t6_run_idx, t7_run_idx, ra_run_idx);
s8 s5 = 1;
while (true) {
s8 next = deref_s8(item.mesh->packed_data, byte_offset++);
if (!next) {
break;
}
if (next < 0) {
next = -((s32)next);
} else {
t6_run_idx = t7_run_idx;
s5 = -s5;
}
next--;
t7_run_idx = ra_run_idx;
ra_run_idx = next;
u8 result[3];
result[1] = t7_run_idx;
result[1 + s5] = ra_run_idx;
result[1 - s5] = t6_run_idx;
item.unpacked.faces.emplace_back(result[0], result[1], result[2]);
ASSERT((u32)next < item.unpacked.vu0_buffer.size());
}
}
}
std::string debug_dump_to_obj(const std::vector<CollideListItem>& list) {
std::vector<math::Vector4f> verts;
std::vector<math::Vector<u32, 3>> faces;
for (auto& item : list) {
u32 f_off = verts.size() + 1;
for (auto& f : item.unpacked.faces) {
faces.emplace_back(f[0] + f_off, f[1] + f_off, f[2] + f_off);
}
for (u32 t = 0; t < item.unpacked.vu0_buffer.size(); t++) {
verts.push_back(item.unpacked.vu0_buffer[t] / 65536);
}
}
std::string result;
for (auto& vert : verts) {
result += fmt::format("v {} {} {}\n", vert.x(), vert.y(), vert.z());
}
for (auto& face : faces) {
result += fmt::format("f {}/{} {}/{} {}/{}\n", face.x(), face.x(), face.y(), face.y(), face.z(),
face.z());
}
return result;
}
void set_vertices_for_tri(tfrag3::CollisionMesh::Vertex* out, const math::Vector4f* in) {
math::Vector3f v10 = in[1].xyz() - in[0].xyz();
math::Vector3f v20 = in[2].xyz() - in[0].xyz();
auto normal = (v10.cross(v20).normalized() * INT16_MAX).cast<s16>();
for (int i = 0; i < 3; i++) {
out[i].x = in[i].x();
out[i].y = in[i].y();
out[i].z = in[i].z();
out[i].nx = normal.x();
out[i].ny = normal.y();
out[i].nz = normal.z();
out[i].flags = 0; // todo
out[i].pad = 0;
}
}
void extract_collide_frags(const level_tools::DrawableTreeCollideFragment* tree,
const std::vector<const level_tools::DrawableTreeInstanceTie*>& ties,
const std::string& debug_name,
tfrag3::Level& out,
bool dump_level) {
// in-game, the broad-phase collision builds a list of fragments, then unpacks them with:
/*
*(dotimes (i (-> *collide-list* num-items))
(let ((frag (-> *collide-list* items i)))
;; to VU0 memory
(__pc-upload-collide-frag (-> frag mesh packed-data) (-> frag mesh vertex-data-qwc) (->
frag mesh vertex-count))
;; from VU0 memory to scratchpad
(unpack-background-collide-mesh obj (-> frag mesh) (-> frag inst) 0)
;; from scratchpad to collide-cache memory.
(import-mesh-func obj (-> frag mesh))
)
)
*/
auto all_frags = build_all_frags_list(tree, ties);
u32 total_faces = 0;
for (auto& frag : all_frags) {
unpack_part1_collide_list_item(frag);
unpack_part2_collide_list_item(frag);
find_faces(frag);
total_faces += frag.unpacked.faces.size();
}
if (dump_level) {
auto debug_out = debug_dump_to_obj(all_frags);
file_util::write_text_file(
file_util::get_file_path({"debug_out", fmt::format("collide-{}.obj", debug_name)}),
debug_out);
}
for (auto& item : all_frags) {
for (auto& f : item.unpacked.faces) {
math::Vector4f verts[3] = {item.unpacked.vu0_buffer[f[0]], item.unpacked.vu0_buffer[f[1]],
item.unpacked.vu0_buffer[f[2]]};
tfrag3::CollisionMesh::Vertex out_verts[3];
set_vertices_for_tri(out_verts, verts);
for (int i = 0; i < 3; i++) {
out.collision.vertices.push_back(out_verts[i]);
}
}
}
}
} // namespace decompiler
@@ -0,0 +1,14 @@
#pragma once
#include "BspHeader.h"
#include "common/custom_data/Tfrag3Data.h"
namespace decompiler {
void extract_collide_frags(const level_tools::DrawableTreeCollideFragment* tree,
const std::vector<const level_tools::DrawableTreeInstanceTie*>& ties,
const std::string& debug_name,
tfrag3::Level& out,
bool dump_level);
} // namespace decompiler
+31 -6
View File
@@ -6,6 +6,7 @@
#include "decompiler/level_extractor/extract_tfrag.h"
#include "decompiler/level_extractor/extract_tie.h"
#include "decompiler/level_extractor/extract_shrub.h"
#include "decompiler/level_extractor/extract_collide_frags.h"
#include "common/util/compress.h"
#include "common/util/FileUtil.h"
#include "common/util/SimpleThreadGroup.h"
@@ -77,7 +78,8 @@ void print_memory_usage(const tfrag3::Level& lev, int uncompressed_data_size) {
{"tfrag-bvh", memory_use_by_category[tfrag3::MemoryUsageCategory::TFRAG_BVH]},
{"shrub-colors", memory_use_by_category[tfrag3::MemoryUsageCategory::SHRUB_TIME_OF_DAY]},
{"shrub-vert", memory_use_by_category[tfrag3::MemoryUsageCategory::SHRUB_VERT]},
{"shrub-ind", memory_use_by_category[tfrag3::MemoryUsageCategory::SHRUB_IND]}};
{"shrub-ind", memory_use_by_category[tfrag3::MemoryUsageCategory::SHRUB_IND]},
{"collision", memory_use_by_category[tfrag3::MemoryUsageCategory::COLLISION]}};
for (auto& known : known_categories) {
total_accounted += known.second;
}
@@ -166,7 +168,8 @@ void extract_from_level(const ObjectFileDB& db,
const TextureDB& tex_db,
const std::string& dgo_name,
const DecompileHacks& hacks,
bool dump_level) {
bool dump_level,
bool extract_collision) {
if (db.obj_files_by_dgo.count(dgo_name) == 0) {
lg::warn("Skipping extract for {} because the DGO was not part of the input", dgo_name);
return;
@@ -192,9 +195,9 @@ void extract_from_level(const ObjectFileDB& db,
/*
level_tools::PrintSettings settings;
settings.expand_shrub = true;
settings.expand_collide = true;
fmt::print("{}\n", bsp_header.print(settings));
*/
*/
const std::set<std::string> tfrag_trees = {
"drawable-tree-tfrag", "drawable-tree-trans-tfrag", "drawable-tree-dirt-tfrag",
@@ -204,6 +207,15 @@ void extract_from_level(const ObjectFileDB& db,
add_all_textures_from_level(tfrag_level, dgo_name, tex_db);
std::vector<const level_tools::DrawableTreeInstanceTie*> all_ties;
for (auto& draw_tree : bsp_header.drawable_tree_array.trees) {
auto as_tie_tree = dynamic_cast<level_tools::DrawableTreeInstanceTie*>(draw_tree.get());
if (as_tie_tree) {
all_ties.push_back(as_tie_tree);
}
}
bool got_collide = false;
for (auto& draw_tree : bsp_header.drawable_tree_array.trees) {
if (tfrag_trees.count(draw_tree->my_type())) {
auto as_tfrag_tree = dynamic_cast<level_tools::DrawableTreeTfrag*>(draw_tree.get());
@@ -227,11 +239,21 @@ void extract_from_level(const ObjectFileDB& db,
ASSERT(as_shrub_tree);
extract_shrub(as_shrub_tree, fmt::format("{}-{}-shrub", dgo_name, i++),
bsp_header.texture_remap_table, tex_db, {}, tfrag_level, dump_level);
} else if (draw_tree->my_type() == "drawable-tree-collide-fragment" && extract_collision) {
auto as_collide_frags =
dynamic_cast<level_tools::DrawableTreeCollideFragment*>(draw_tree.get());
ASSERT(as_collide_frags);
ASSERT(!got_collide);
got_collide = true;
extract_collide_frags(as_collide_frags, all_ties, fmt::format("{}-{}-collide", dgo_name, i++),
tfrag_level, dump_level);
} else {
// fmt::print(" unsupported tree {}\n", draw_tree->my_type());
}
}
tfrag_level.level_name = level_name;
Serializer ser;
tfrag_level.serialize(ser);
auto compressed =
@@ -249,11 +271,14 @@ void extract_all_levels(const ObjectFileDB& db,
const std::vector<std::string>& dgo_names,
const std::string& common_name,
const DecompileHacks& hacks,
bool debug_dump_level) {
bool debug_dump_level,
bool extract_collision) {
extract_common(db, tex_db, common_name);
SimpleThreadGroup threads;
threads.run(
[&](int idx) { extract_from_level(db, tex_db, dgo_names[idx], hacks, debug_dump_level); },
[&](int idx) {
extract_from_level(db, tex_db, dgo_names[idx], hacks, debug_dump_level, extract_collision);
},
dgo_names.size());
threads.join();
}
+4 -2
View File
@@ -10,7 +10,8 @@ void extract_from_level(const ObjectFileDB& db,
const TextureDB& tex_db,
const std::string& dgo_name,
const DecompileHacks& hacks,
bool dump_level);
bool dump_level,
bool extract_collision);
void extract_common(const ObjectFileDB& db, const TextureDB& tex_db, const std::string& dgo_name);
// extract everything
@@ -19,5 +20,6 @@ void extract_all_levels(const ObjectFileDB& db,
const std::vector<std::string>& dgo_names,
const std::string& common_name,
const DecompileHacks& hacks,
bool debug_dump_level);
bool debug_dump_level,
bool extract_collision);
} // namespace decompiler
+1 -1
View File
@@ -210,7 +210,7 @@ int main(int argc, char** argv) {
if (config.levels_extract) {
extract_all_levels(db, tex_db, config.levels_to_extract, "GAME.CGO", config.hacks,
config.rip_levels);
config.rip_levels, config.extract_collision);
}
fmt::print("[Mem] After extraction: {} MB\n", get_peak_rss() / (1024 * 1024));
+4 -2
View File
@@ -234,7 +234,8 @@ TypedRef typed_ref_from_basic(const Ref& object, const decompiler::DecompilerTyp
const auto& word = object.data->words_by_seg.at(object.seg).at(byte_in_words / 4);
if (word.kind() != decompiler::LinkedWord::TYPE_PTR) {
throw Error("typed_ref_from_basic did not get a type tag (offset {} words)", byte_in_words / 4);
throw Error("typed_ref_from_basic did not get a type tag (offset {} words). Got {}",
byte_in_words / 4, (int)word.kind());
}
TypedRef result;
@@ -252,7 +253,8 @@ Ref deref_label(const Ref& object) {
const auto& word = object.data->words_by_seg.at(object.seg).at(byte_in_words / 4);
if (word.kind() != decompiler::LinkedWord::PTR) {
throw Error("deref_label did not get a label (offset {} words)", byte_in_words / 4);
throw Error("deref_label did not get a label (offset {} words). Got {} {}", byte_in_words / 4,
(int)word.kind(), word.data);
}
const auto& lab = object.data->labels.at(word.label_id());
+1
View File
@@ -96,6 +96,7 @@ set(RUNTIME_SOURCE
graphics/opengl_renderer/ocean/OceanTexture.cpp
graphics/opengl_renderer/ocean/OceanTexture_PC.cpp
graphics/opengl_renderer/BucketRenderer.cpp
graphics/opengl_renderer/CollideMeshRenderer.cpp
graphics/opengl_renderer/debug_gui.cpp
graphics/opengl_renderer/DirectRenderer.cpp
graphics/opengl_renderer/DirectRenderer2.cpp
+2 -2
View File
@@ -4,8 +4,8 @@
;; you can find the game-text-version parsing in .cpp and an enum in goal-lib.gc
(subtitle
(jak1-v1 "game/assets/jak1/subtitle/game_subtitle_en.txt")
(jak1-v1 "game/assets/jak1/subtitle/game_subtitle_es.txt")
(jak1-v1 "game/assets/jak1/subtitle/game_subtitle_en.gs")
(jak1-v1 "game/assets/jak1/subtitle/game_subtitle_es.gs")
)
+1 -1
View File
@@ -5,7 +5,7 @@
(text
(jak1-v1 "assets/game_text.txt")
(jak1-v1 "game/assets/jak1/text/game_text_en.txt")
(jak1-v1 "game/assets/jak1/text/game_text_en.gs")
)
@@ -0,0 +1,759 @@
(language-id 0 6)
;; -----------------
;; intro
("sage-intro-sequence-a"
(24 :offscreen "SAGE" "I HAVE SPENT MY LIFE SEARCHING FOR THE ANSWERS THAT MY FATHER, AND MY FATHER'S FATHERS FAILED TO FIND.")
(260 :offscreen "SAGE" "WHO WERE THE PRECURSORS? WHY DID THEY CREATE THE VAST MONOLITHS THAT LITHER OUR PLANET?")
(454 :offscreen "SAGE" "HOW DID THEY HARNESS ECO, THE LIFE ENERGY OF THE WORLD?")
(581 :offscreen "SAGE" "WHAT WAS THEIR PURPOSE? AND WHY DID THEY VANISH?")
(708)
(720 :offscreen "SAGE" "I HAVE ASKED THE PLANTS, BUT THEY DO NOT REMEMBER.")
(818 :offscreen "SAGE" "THE PLANTS HAVE ASKED THE ROCKS, BUT THE ROCKS DO NOT RECALL.")
(955 :offscreen "SAGE" "EVEN THE ROCKS DO NOT RECALL...")
(1064)
(1090 :offscreen "SAGE" "EVERY BONE IN MY BODY TELLS ME THAT THE ANSWERS REST ON THE SHOULDERS OF A YOUNG BOY")
(1297 :offscreen "SAGE" "OBLIVIOUS TO HIS DESTINY, UNINTERESTED IN THE SEARCH FOR TRUTH, AND REJECTING OF MY GUIDANCE!")
(1536)
(1545 :offscreen "SAGE" "AND WHY WOULD HE WANT TO LISTEN TO OLD SAMOS THE SAGE ANYWAY?")
(1680)
(1686 :offscreen "SAGE" "I'M ONLY THE MASTER OF GREEN ECO, ONE OF THE WISEST MEN ON THE PLANET!")
(1875)
(1958 :offscreen "SAGE" "SO IT SEEMS THE ANSWER BEGINS NOT WITH CAREFUL RESEARCH, OR SENSIBLE THINKING.")
(2141)
(2145 :offscreen "SAGE" "NAY! AS WITH MANY OF FATE'S MYSTERIES")
(2281 :offscreen "SAGE" "IT BEGINS WITH BUT A SMALL ACT OF DISOBEDIENCE.")
(2440 "DAXTER" "HEY! UH, JAK? OL' GREEN STUFF TOLD US NOT TO COME HERE!")
)
("sidekick-human-intro-sequence-b"
(547 "OLD MAN" "CONTINUE YOUR SEARCH FOR ARTIFACTS AND ECO.")
(674 "OLD MAN" "IF THE LOCALS POSSESS PRECURSOR ITEMS, YOU KNOW WHAT TO DO.")
(842 "WOMAN" "DEAL HARSHLY WITH ANYBODY WHO STRAYS FROM THE VILLAGE.")
(937 "WOMAN" "WE WILL ATTACK IT IN DUE TIME.")
(1027)
)
("sidekick-human-intro-sequence-c"
(12 "DAXTER" "WHAT ARE WE DOING HERE ANYWAY, JAK? THIS PLACE GIVES ME THE CREEPS!")
(151)
(369 "DAXTER" "HUH?")
(404 "DAXTER" "(GROAN) STUPID PRECURSOR JUNK!")
(496)
(577 "DAXTER" "EEK! WHAT IS THAT DARK OOZE? IT SURE DON'T LOOK FRIENDLY.")
(721)
(777 "DAXTER" "THE SAGE YAPS ON ABOUT THE PRECURSORS THAT BUILT THIS PLACE ALL THE TIME.")
(909 "DAXTER" "\"WHERE DID THEY GO? WHY DID THEY BUILD THIS CRAP?\"")
(1014 "DAXTER" "NOW I LIKE PRECURSOR ORBS AND POWER CELLS AS MUCH AS THE NEXT GUY")
(1124 "DAXTER" "BUT IF YOU ASK ME, THEY MUST HAVE BEEN REAL LOSERS.")
(1212 "DAXTER" "WHOA! HOW DID YOU DO THAT?")
(1271)
(1331 "DAXTER" "JAK, I THINK WE'RE IN TROUBLE!")
(1386)
(1857 "DAXTER" "MAN, THAT STUNG.")
(1913)
(1941 "DAXTER" "I TOLD YOU WE SHOULDN'T HAVE COME HERE, AND YOU LISTENED?")
(2028)
(2057 "DAXTER" "WHAAAT?")
(2101)
(2189 "DAXTER" "WAAAAAAAAHHHHHHHH!!")
(2307 "DAXTER" "OKAY, OKAY. I'M FINE, I'M FINE...")
(2431)
(2481 "DAXTER" "WAAAAAAAAHHHHHHHH!!")
)
("sage-intro-sequence-d1"
(137 "SAGE" "WHAT IN GREEN TARNATION DO YOU TWO WANT?")
(220 "DAXTER" "WE- WE- WE WAS- THEY WAS- I'M- I WAS-")
(283 "SAGE" "DON'T TELL ME! INSTEAD OF HEEDING MY WISDOM, THE TWO OF YOU WENT MUCKING AROUND")
(440 "SAGE" "IN THE ONLY PLACE THAT I TOLD YOU NOT TO GO: MISTY ISLAND!")
(550 "DAXTER" "THAT'S RIGHT! AND THEN-")
(579 "SAGE" "AND, DAXTER, YOU FINALLY TOOK A MUCH-NEEDED BATH, BUT IN A BATHTUB FILLED WITH DARK ECO.")
(793 "DAXTER" "LOOK, OLD MAN, ARE YOU GONNA KEEP YAPPIN', OR YOU GONNA HELP ME OUTTA THIS MESS!?")
(920 "SAGE" "I'M GONNA KEEP YAPPIN'! BECAUSE IN MY PROFESSIONAL OPINION, THE CHANGE IS AN IMPROVEMENT.")
(1079 "SAGE" "AND BESIDES... I COULDN'T HELP YOU IF I WANTED TO.")
(1186 "DAXTER" "WHAT!?")
(1220 "SAGE" "THERE'S ONLY ONE PERSON WHO HAS STUDIED DARK ECO LONG ENOUGH")
(1329 "SAGE" "TO HAVE A CHANCE AT RETURNING YOU TO YOUR PREVIOUS FORM:")
(1431 "SAGE" "GOL ACHERON, THE SAGE.")
(1493)
(1496 :offscreen "SAGE" "BUT HE LIVES FAR TO THE NORTH. FAR, FAR TO NORTH. NOBODY HAS SPOKEN TO HIM IN AGES.")
(1718 "SAGE" "I WOULD TELEPORT YOU THERE, BUT I CAN'T DO THAT EITHER.")
(1831 "SAGE" "NONE OF THE THREE SAGES THAT MAINTAIN THE OTHER TELEPORTER GATES")
(1934 "SAGE" "HAVE SEEN FIT TO TURN THEIR ENDS ON FOR QUITE A WHILE!")
)
("sage-intro-sequence-d2"
(3 "SAGE" "THE ONLY OTHER WAY NORTH IS BY FOOT THROUGH THE FIRE CANYON")
(114 :offscreen "SAGE" "BUT ITS VOLCANIC SOIL IS HOT ENOUGH TO MELT PRECURSOR METAL.")
(224 "SAGE" "YOU CAN'T JUST WALK THROUGH IT.")
(270 "KEIRA" "BUT YOU COULD FLY OVER IT, IF YOU HAD A ZOOMER EQUIPPED WITH A HEAT SHIELD.")
(393)
(396 "KEIRA" "I JUST HAPPEN TO BE WORKING ON SUCH A THING AT THIS VERY MOMENT.")
(512)
(515 "KEIRA" "ALL I WOULD NEED IS TWENTY POWER CELLS TO GIVE IT ENOUGH ENERGY")
(605 "KEIRA" "TO WITHSTAND THE CANYON'S HEAT. ISN'T THAT RIGHT, DADDY?")
(696)
(699 "SAGE" "YES, KEIRA, THAT MIGHT WORK. BUT WHERE ARE A BOY")
(826 :offscreen "SAGE" "AND A HALF!")
(857 "SAGE" "GOING TO GET TWENTY POWER CELLS?")
(910 "KEIRA" "FROM THE VILLAGERS! MOST OF THEM HAVE A POWER CELL OR TWO STASHED AWAY SOMEWHERE.")
(1050 :offscreen "KEIRA" "AND EVEN IF THEY AREN'T WILLING TO JUST GIVE THEM AWAY")
(1133 "KEIRA" "GREASING THEIR PALMS WITH A FEW PRECURSOR ORBS SHOULD DO THE TRICK.")
(1243)
(1246 :offscreen "KEIRA" "AND I BET THERE ARE EVEN MORE OF THEM OUT IN THE WILDS JUST WAITING FOR SOME")
(1364 "KEIRA" "BRAVE ADVENTURER TO FIND.")
(1435 "DAXTER" "WELL WE'VE GOT THE BRAVE ADVENTURER, AT LEAST.")
(1529)
(1532 "SAGE" "BRAVE ADVENTURER?")
(1582 "SAGE" "YOU TWO COULDN'T FIND YOUR WAY OUT OF THE VILLAGE WITHOUT TRAINING!")
(1685)
(1689 "SAGE" "BEFORE YOU DO ANYTHING ELSE, YOU BETTER GO THROUGH THE WARP GATE AND GET")
(1810 "SAGE" "SOME PRACTICE ON GEYSER ROCK.")
(1872)
(1878 "DAXTER" "UH, WE WON'T FIND ANY MORE OF THAT DARK GOOEY ECO STUFF, WILL WE?")
(1993 "DAXTER" "'CAUSE I'D HATE TO FALL IN AGAIN AND TURN INTO YOU!")
(2069)
(2072 "SAGE" "GET IN THERE! BEFORE I TURN YOU BOTH INTO FERNS!")
(2189)
)
("sage-intro-sequence-e"
(200 "SAGE" "GOOD TRAINING, BOYS, BUT THAT'S NOTHING COMPARED TO THE CHALLENGES THAT LIE AHEAD.")
(359 "DAXTER" "AH, THEY'RE NO PROBLEM. WE GOT THE MOVES, EH JAK?")
(496 "DAXTER" "WE'D LOVE TO STAY AND CHAT, BIG GREEN, BUT WE'RE UH... ITCHING TO GET ON WITH OUR ADVENTURES.")
(660 "SAGE" "FINE, FINE, \"ADVENTURE\" AWAY THEN.")
(787 "SAGE" "AND WHILE YOU'RE OUT \"ADVENTURING,\" WHY DON'T YOU MAKE YOURSELF USEFUL?")
(940)
(952 :offscreen "SAGE" "MY DARN GREEN ECO COLLECTORS ARE CLOGGED UP AGAIN.")
(1043)
(1046 :offscreen "SAGE" "HEAD OUT TO THE FAR SIDE OF THE BEACH AND CLEAR THEM OUT WHY DON'T YOU.")
(1160)
(1169 :offscreen "SAGE" "FOLLOW THE LAMPS, THEY'LL TAKE YOU RIGHT THERE.")
(1310)
(1313 :offscreen "SAGE" "NOW, ALL OF YOU...")
(1415)
(1439 :offscreen "SAGE" "GET OUT OF HERE!")
)
;; -----------------
;; sidekick
("sksp0014" :hint #x233
(0 "DAXTER" "WE SCROUNGED ENOUGH ORBS TO TRADE FOR A POWER CELL.")
(215 "DAXTER" "LET'S GET BACK AND MAKE THE SWITCH ALREADY!")
)
("sksp0009" :hint #x251
(0 "DAXTER" "WHAT A WEIRD-LOOKING THING! I'LL BET WE CAN GET THIS OPEN")
(207 "DAXTER" "IF YOU'RE POWERED UP WITH THAT ZAPPY BLUE ECO STUFF.")
)
("sksp0035" :hint #x25c
(0 "DAXTER" "YEAH, SO WE GOT A PRECURSOR LAUNCHER HERE")
(117 "DAXTER" "BUT YOU AREN'T POWERED UP WITH THE BLUE STUFF. SO IT AIN'T GONNA HELP US!")
)
("sksp0001" :hint #x280 (0 "DAXTER" "HEY! THAT SWEET-LOOKING BABE KEIRA WAS RIGHT! THERE ARE TRANS-PADS OUT HERE."))
("sksp0002" :hint #x281 (0 "DAXTER" "TRUST ME, THOSE DARK ECO BOXES ARE BAD NEWS!"))
("sksp0003" :hint #x282
(0 "DAXTER" "I BET IF WE FOUND ALL OF THOSE SICKLY CUTE SCOUT FLIES ON EACH LEVEL")
(215 "DAXTER" "AT LEAST ONE WILL HAVE A POWER CELL!")
)
("sksp0004" :hint #x283 (0 "DAXTER" "ALL RIGHT, TREASURE!"))
("sksp0005" :hint #x284
(0 "DAXTER" "THESE WOOD AND METAL BOXES DON'T LOOK THAT TOUGH!")
(166 "DAXTER" "I'LL BET THEY'LL BREAK IF YOU JUMP DIVE ONTO THEM.")
)
("sksp0006" :hint #x285
(0 "DAXTER" "THOSE ALL-METAL BOXES ARE THICKER THAN A YAKOW SKULL!")
(188 "DAXTER" "BUT THERE MUST BE SOMETHING THAT CAN BUST 'EM OPEN.")
)
("sksp0007" :hint #x286 (0 "DAXTER" "TWO WORDS: POWER CELLS. WE NEED TO FIND 'EM AND WE AREN'T LOOKIN' SO GOOD RIGHT NOW."))
("sksp0008" :hint #x287 (0 "DAXTER" "WE NEED ORBS. ORBS, JAK! HOW ARE EVER GONNA BUY POWER CELLS IF WE DON'T COLLECT ORBS!"))
("sksp009a" :hint 0 (0 "DAXTER" "HA HA! WE SHOWED HIM A THING OR TWO."))
("sksp009b" :hint #x28e (0 "DAXTER" "ALL RIGHT, MORE ORBS!"))
("sksp009c" :hint #x28f (0 "DAXTER" "DO ME A FAVOR AND KEEP AWAY FROM THOSE DARK ECO BOXES!"))
("sksp009d" :hint #x290 (0 "DAXTER" "YEAH-HA-HA-HA!"))
("sksp009e" :hint #x291 (0 "DAXTER" "WA-HOO!"))
("sksp009f" :hint #x292 (0 "DAXTER" "GET SOME, GET SOME! HA HA HA!"))
("sksp009g" :hint #x293 (0 "DAXTER" "RIGHT BEHIND YA, JAK!"))
("sksp009i" :hint #x294 (0 "DAXTER" "DID WE FIND ALL THE SCOUT FLIES IN THIS AREA?"))
("sksp009j" :hint #x295 (0 "DAXTER" "HEY! IT LOOKS LIKE SCOUT FLIES ARE ALWAYS IN RED BOXES."))
("sksp009k" :hint #x296 (0 "DAXTER" "ALRIGHT! YOU FOUND ALL THE SCOUT FLIES IN THIS AREA!"))
("sksp0071" :hint #x2a5 (0 "DAXTER" "GET THE RED ECO!"))
("sksp0072" :hint #x2a6 (0 "DAXTER" "RED ECO MAKES YOUR ATTACKS STRONGER."))
("sksp0073" :hint #x2a7 (0 "DAXTER" "WE NEED BLUE ECO TO CHARGE THIS PLATFORM UP!"))
("sksp0145" :hint #x359 (0 "DAXTER" "WOW! YOU CAN SHOOT FIRE BALLS WHEN YOU'RE POWERED UP WITH YELLOW ECO."))
;; -----------------
;; village1
("SAGELP03" :hint 0 (0 "SAGE" "THESE TWO COULDN'T UNBLOCK THEIR EARS..."))
("SAGELP04" :hint 0
(0 "SAGE" "HE'LL JUST NEVER BE LIKE HIS UNCLE...")
(221 "SAGE" "I DON'T CARE WHAT THE OTHERS SAY.")
)
("SAGELP05" :hint 0 (0 "SAGE" "HELLO, BLUE SAGE? HELLO? WHERE IN THE BLUE BLAZES COULD HE BE..."))
("SAGELP06" :hint 0 (0 "SAGE" "MY, MY, MY..."))
("SAGELP11" :hint 0 (0 "SAGE" "ANYONE? ANYONE AT ALL? COME IN?"))
("ASSTLP01" :hint 0 (0 "KEIRA" "HMM..."))
("ASSTLP02" :hint 0 (0 "KEIRA" "GOTTA GET THIS HEAT SHIELD WORKING..."))
("ASSTLP03" :hint 0 (0 "KEIRA" "WE NEED POWER CELLS TO FUEL THE HEAT SHIELD..."))
("ASSTLP04" :hint 0 (0 "KEIRA" "WHERE'S MY SPANNER?"))
("ASSTLP05" :hint 0 (0 "KEIRA" "FIRE CANYON IS SO HOT..."))
("EXP-AM01" :hint 0 (0 "JAK'S UNCLE" "I NEED TO SET OFF ON MY JOURNEY SOON. I NEED PRECURSOR ORBS!"))
("EXP-AM02" :hint 0 (0 "JAK'S UNCLE" "LET'S SEE, NOW WHERE SHALL I GO FIRST? EH..."))
("EXP-AM03" :hint 0 (0 "JAK'S UNCLE" "OH I DO MISS THE OPEN ROAD."))
("EXP-AM04" :hint 0 (0 "JAK'S UNCLE" "SO MANY PLACES TO SEE, AND SO LITTLE TIME."))
("EXP-AM05" :hint 0 (0 "JAK'S UNCLE" "WELL IN MY DAY, YOU COULD WALK THE LANDS WITHOUT BEING ASSAULTED BY MONSTERS!"))
("EXP-LO02" :hint 0 (0 "JAK'S UNCLE" "I NEED MORE PRECURSOR ORBS."))
("FAR-AM01" :hint 0 (0 "FARMER" "(SNORES) HERE, BESSIE... HERE, BESSIE BESSIE... THAT'S A GOOD GIRL..."))
("FAR-AM02" :hint 0 (0 "FARMER" "GOTTA BRING IN THE CROPS 'FORE THE JUNE BUGS..."))
("FAR-AM2A" :hint 0 (0 "FARMER" "GOTTA BRING IN THE CROPS 'FORE THE JUNE BUGS GET..."))
("FAR-LO01" :hint 0 (0 "FARMER" "(SNORES)"))
("FAR-LO1A" :hint 0 (0 "FARMER" "(SNORES)"))
("sksp0010" :hint #x231 (0 "DAXTER" "HEY! LET'S GO CHECK OUT OL' FISH BREATH'S SPEED-BOAT AT THE DOCK!"))
("sksp0013" :hint #x232
(0 "DAXTER" "DID YOU SEE THE SIZE OF THE BITE THAT LURKER SHARK TOOK OUT OF THE FISHERMAN'S BOAT?")
(315)
(337 "DAXTER" "WE BEST STAY WAY CLEAR OF THEM! I DON'T THINK WE CAN TACKLE A CREATURE THAT DAG NASTY.")
)
("sksp0015" :hint #x234
(0 "DAXTER" "THIS MUST BE A PRECURSOR ORACLE LIKE THE SAGE ALWAYS GOES ON ABOUT.")
(228 "DAXTER" "I HOPE THEY WEREN'T AS UGLY IN PERSON!")
)
("sksp0017" :hint #x235 (0 "DAXTER" "WHOA! CHECK OUT THAT FUNKY SCULPTURE SITTIN' ON THE ROCKS OVER THERE!"))
("sksp0043" :hint #x24e
(0 "DAXTER" "MAYBE WE SHOULD GO ROOT OUT THE FISHERMAN.")
(106 "DAXTER" "I HEARD HE WAS IN THE JUNGLE FISHING BY THE LOWER RIVER!")
)
("asstvb04" :hint #x2b1
(0 "KEIRA" "GOOD, YOU'VE COLLECTED ENOUGH POWER CELLS TO FUEL MY HEAT SHIELD!")
(235 "KEIRA" "MEET ME BY THE ENTRANCE TO THE FIRE CANYON BY CLIMBING THE CLIFF BEHIND THE FARMER'S HOUSE.")
(559 "KEIRA" "BRING THE POWER CELLS, AND HURRY! MY FATHER SAYS HE'S SEEN MORE LURKERS AROUND!")
)
("asstvb08" :hint #x2b2
(0 "KEIRA" "HURRY UP WITH THOSE POWER CELLS. I'M WAITING AT THE HEAD OF FIRE CANYON")
(260 "KEIRA" "AT THE TOP OF THE CLIFF BEHIND THE FARMER'S HOUSE!")
)
("sage-introduction-misty-cannon"
(24 "SAGE" "OH, IT'S THE CONQUERING HEROES.")
(136 "SAGE" "GOOD, I WANTED TO TALK WITH YOU TWO ABOUT SOMETHING SERIOUS.")
(258)
(261 :offscreen "SAGE" "THERE APPEARS TO BE QUITE A BIT OF LURKER ACTIVITY ON MISTY ISLAND.")
(387)
(393 :offscreen "SAGE" "I CAN SEE THEM BOMBARDING THE PRECURSOR SILO FROM MY LOOKOUT TOWER.")
(525)
(528 "SAGE" "IF THE LURKERS OPEN IT UP AND RELEASE THE DARK ECO, WE COULD ALL END UP")
(663 "SAGE" "RUNNING AROUND LOOKING AS RIDICULOUS AS THIS ANNOYING LITTLE SPECIMEN.")
(788)
(807 "SAGE" "JAK, IT'S TIME FOR YOU TO PROVE YOUR WORTH.")
(906 "SAGE" "GET THE FISHERMAN TO LET YOU TAKE HIS BOAT BACK TO MISTY ISLAND")
(1018 "SAGE" "GET TO THE TOP OF THE PRECURSOR SILO AND TAKE OUT THAT CANNON.")
(1171)
(1177 "DAXTER" "AND... WHAT ABOUT ME?")
(1232)
(1235 "SAGE" "YOU? WHY DON'T YOU MOP MY FLOORS? THEY SEEM TO HAVE LOST THEIR SHINE LATELY.")
)
("sage-reminder-1-misty-cannon"
(24 "SAGE" "THE BOMBARDMENT IS GETTING WORSE!")
(86 :offscreen "SAGE" "FIND THE FISHERMAN IN THE JUNGLE, GET PERMISSION TO USE HIS BOAT")
(215 :offscreen "SAGE" "AND GET OVER TO MISTY ISLAND TO STOP THE CANNON.")
(317)
(320 "SAGE" "AND YOU DAXTER, YOU NEED TO GET MOPPING. THIS PLACE IS A MESS!")
)
("sage-reminder-1-ecorocks"
(28 "SAGE" "SOME \"BRAVE ADVENTURERS\" YOU TWO ARE.")
(132 "SAGE" "BACK ALREADY AND WITHOUT CLEARING MY BLOCKED ECO HARVESTERS!")
(244)
(252 :offscreen "SAGE" "THEY'RE ON THE FAR SIDE OF THE BEACH, BOYS.")
(365)
(366 :offscreen "SAGE" "NOW...")
(412 :offscreen "SAGE" "GET MOVING!")
)
("sage-reminder-1-generic"
(54 "SAGE" "WHAT ARE YOU TWO DOING HERE? YOU HAVE POWER CELLS TO COLLECT!")
(178)
(181 "SAGE" "LEAVE ME ALONE... UNTIL YOU HAVE THEM!")
)
("sage-reminder-2-generic"
(27 "SAGE" "YOU TWO JUST DON'T UNDERSTAND THE GRAVITY OF THE SITUATION.")
(137 "SAGE" "THIS IS ABOUT MORE THAN A SINGLE BOY GONE FUZZY. THIS IS ABOUT LIFE AS WE KNOW IT.")
(320)
(323 "SAGE" "NOW, GET OUT THERE AND FULFILL YOUR DESTINY.")
(455)
)
("assistant-introduction-blue-eco-switch"
(23 "DAXTER" "HEY BABY. WHAT DO YOU SAY YOU AND I GO CRUISIN' ON THIS A-GRAV ZOOMER?")
(175)
(193 "KEIRA" "RULE NUMBER ONE: I DON'T DATE ANIMALS.")
(308)
(312 "DAXTER" "OH YOU DON'T KNOW WHAT YOU'RE MISSING, HE HEH.")
(430)
(505 "KEIRA" "LISTEN, IF YOU NEED SOMETHING TO KEEP YOU BUSY, MY FATHER ALWAYS TALKED")
(635 "KEIRA" "ABOUT AN ANCIENT PRECURSOR PIPELINE HIDDEN DEEP UNDERGROUND.")
(739)
(742 :offscreen "KEIRA" "SOME OF THESE PIPES END IN VENTS FROM WHICH ECO FLOWS FREELY,")
(842 :offscreen "KEIRA" "AND SOME HAVE BEEN CAPPED OFF SO THAT THE ECO IS SEALED BACK.")
(945)
(954 "KEIRA" "THERE MUST BE A WAY TO TURN THE CAPPED VENTS ON.")
(1052 :offscreen "KEIRA" "I TRACED PART OF THE PIPELINE BACK TO THE FORBIDDEN TEMPLE.")
(1138 "KEIRA" "MAYBE YOU SHOULD LOOK THERE FOR SOME TYPE OF SWITCH.")
(1246)
)
("assistant-reminder-1-blue-eco-switch"
(23 "KEIRA" "I'M SURE IF YOU LOOKED INSIDE THE PRECURSOR FORBIDDEN TEMPLE")
(143 "KEIRA" "YOU'LL FIND A WAY TO TURN ON THAT CAPPED BLUE ECO VENT ON SENTINEL BEACH.")
(295)
)
("farmer-introduction"
(1 "FARMER" "GOTTA MILK THOSE YAKOWS, GOTTA MILK THOSE YAKOWS...")
(113 "FARMER" "OH! IT'S YOU... JUST RESTIN' MY TRIED BONES. I'VE BEEN TRYING TO GET THOSE ORNERY YAKOWS")
(317 "FARMER" "BACK INTO THE PEN ALL DAY! SOME STRANGE CREATURES TRIED TO STEAL 'EM EARLIER.")
(454)
(456 "FARMER" "YOU THINK YOU CAN HELP AN OLD MAN TRY TO GET 'EM BACK INTO THE CORRAL?")
)
("farmer-reminder-1"
(0 "FARMER" "HEY! MY YAKOWS ARE STILL ON THE LOOSE! EH, COULD YOU BRING 'EM BACK FOR ME ALREADY?")
)
("farmer-reminder-2"
(0 "FARMER" "THOSE DARN YAKOWS ARE STILL ROAMIN' FREE.")
(85 "FARMER" "AIN'T YOU GONNA CHASE 'EM INTO THE CORRAL ALREADY?")
)
("farmer-resolution"
(0 "FARMER" "AH, WELL DONE MY BOY. YOU ACTUALLY GOT THOSE FLEABAGS PACK INTO THE PEN.")
(134 "FARMER" "NOW I CAN SLEEP IN PEACE. TAKE THIS POWER CELL FOR YOUR TROUBLE.")
(340)
)
("explorer-introduction"
(23 "JAK'S UNCLE" "WELL, HELLO THERE MY DEAR BOY. YOU'VE CAUGHT AT A MOST INOPPORTUNE MOMENT.")
(197 "JAK'S UNCLE" "I WAS TO SET OFF ON MY JOURNEYS YESTERDAY")
(288 "JAK'S UNCLE" "BUT I SEEM TO BE A SPOT SHORT ON THE OLD PRECURSOR ORBS.")
(426)
(430 "JAK'S UNCLE" "I WOULD'VE PLEDGED MY WORD THAT I HAD 90 OF THEM,")
(538 "JAK'S UNCLE" "BUT I GATHER THAT YOUR YOUNG FRIEND, YOU KNOW, THE LITTLE ANNOYING MISERABLY UGLY ONE")
(716 "JAK'S UNCLE" "MIGHT HAVE JUST PILFERED THEM AS A SORT OF A SPOT OF FUN.")
(829)
(865 "JAK'S UNCLE" "ANYWAY, WOULD YOU BE KIND ENOUGH TO LOAN YOUR DEAR OLD UNCLE 90 PRECURSOR ORBS")
(1043 "JAK'S UNCLE" "SO HE CAN GET UNDERWAY? I WOULD OFFER YOU A POWER CELL IN RETURN.")
)
("explorer-reminder-1"
(25 "JAK'S UNCLE" "WHAT? YOU DON'T HAVE THE FULL STASH? HARUMPH!")
(148 "JAK'S UNCLE" "WELL, ANY LESS THAN 90 PRECURSOR ORBS")
(251 "JAK'S UNCLE" "AND I SHAN'T HAVE A CHANCE TO GET UNDERWAY, DEAR BOY.")
(387)
)
("explorer-reminder-2"
(33 "JAK'S UNCLE" "OH SEE HERE, THE DEAL IS FOR 90 PRECURSOR ORBS FOR A POWER CELL.")
(187 "JAK'S UNCLE" "A DOWNRIGHT EVEN TRADE.")
)
("explorer-resolution"
(28 "JAK'S UNCLE" "I SEE YOU TWO ARE BACK TO MAKE THE TRADE. GOOD, GOOD, JOLLY GOOD!")
(179 "JAK'S UNCLE" "EH, YOU HAVE THE UH, PRECURSOR ORBS THAT WE AGREED ON?")
(310)
(324 "JAK'S UNCLE" "I HOPE YOU PUT THIS HARD-EARNED POWER CELL TO GOOD USE. CHEERIO, TA TA, BYE BYE!")
)
;; -----------------
;; oracle
("oracle-right-eye-1" (0 "ORACLE" "FOR YOUR GIFT, ANOTHER POWER CELL IS YOURS."))
("oracle-left-eye-1" (0 "ORACLE" "YOU HAVE PROVEN YOURSELF WORTHY. HERE IS A POWER CELL."))
("oracle-right-eye-2" (0 "ORACLE" "HERE IS ANOTHER POWER CELL FOR YOUR QUEST."))
("oracle-left-eye-2" (0 "ORACLE" "FOR YOUR SACRIFICE, I OFFER YOU A POWER CELL."))
("oracle-right-eye-3" (0 "ORACLE" "YOU HAVE OBTAINED ANOTHER POWER CELL."))
("oracle-left-eye-3" (0 "ORACLE" "FOR YOUR EFFORT, A POWER CELL IS THE REWARD."))
;; -----------------
;; misty
("sksp0031" :hint #x23a (0 "DAXTER" "OOH! LET'S USE THE CANNON TO BLOW THINGS UP!"))
("sksp0064" :hint #x245 (0 "DAXTER" "WATCH YOUR BACK! YOU REMEMBER WHAT HAPPENED THE LAST TIME WE WERE HERE."))
("sksp0067" :hint #x249 (0 "DAXTER" "DON'T FALL INTO THE MIST BELOW US! 'CAUSE I DON'T THINK WE'LL MAKE IT BACK."))
("sksp0059" :hint #x26e (0 "DAXTER" "THIS PLACE GIVES ME THE WILLIES! LET'S KEEP YOU OUT OF THE OOZE, OKAY?"))
("sksp0056" :hint #x27b (0 "DAXTER" "HEY! I SEE THE SCULPTOR'S MUSE!"))
("sksp0062" :hint #x27e (0 "DAXTER" "LET'S PLOW INTO THOSE BALLOON LURKERS AND SHRED 'EM!"))
("sksp0063" :hint #x27f
(0 "DAXTER" "I SAID \"SHRED THE LURKERS,\" JAK. NOT THE MINES!")
(332)
(344 "DAXTER" "RULE NUMBER ONE: ALWAYS AVOID THE MINES!")
)
("sagevb02" :hint #x28a
(6 "SAGE" "I HAVE TO ADMIT, I'M IMPRESSED. YOU TWO DIDN'T SCREW UP!")
(385)
(399 "SAGE" "NOW THAT THE LURKERS CAN'T OPEN THAT SILO, THEY CAN'T FLOOD THE WORLD WITH DARK ECO")
(720 "SAGE" "AND CAUSE UNTOLD DESTRUCTION.")
(863)
(880 "SAGE" "WIPE THAT RIDICULOUS GRIN OFF YOUR FACE, DAXTER! THE TWO OF YOU HAVE PLENTY TO DO.")
(1191 "SAGE" "GET ON WITH IT!")
)
("asstvb03" :hint #x28b
(0 "KEIRA" "GOOD! YOU STOPPED ALL THE MINE-DROPPING LURKERS!")
(190 "KEIRA" "THEY'VE BEEN THREATENING THE WATERS AROUND OUR VILLAGE FOR WEEKS.")
(391 "KEIRA" "BRING YOUR ZOOMER BACK TO THE TRANS-PAD AND I'LL TELEPORT IT BACK.")
)
("sksp0069" :hint #x2a3 (0 "DAXTER" "IT'S AN AMBUSH, JAK! IT'S AN AMBUSH!"))
("sksp0070" :hint #x2a4 (0 "DAXTER" "JUMP, THEN DIVE ONTO THE TEETER-TOTTER."))
("sksp0435" :hint #x2aa (0 "DAXTER" "KNOCK OVER THOSE BONES!"))
;; -----------------
;; swamp
("billy-introduction"
(6 "BILLY" "HOWDY, FRIENDS! ENJOYIN' MY BEAUTIFUL SWAMP? I OWN THESE HERE PARTS. EVERYTHING THAT DOESN'T SINK INTO THE MUD, THAT IS! HA HA HA...")
(349)
(369 "DAXTER" "JUDGING BY THE SMELL, I'D WAGER YOUR BATHTUB SANK IN THE MUD LONG AGO.")
(497)
(519 "BILLY" "WHAT'S A BATHTUB? ANYWAY I GOT BIGGER PROBLEMS NOW...")
(677)
(691 "BILLY" "SEEMS SOME NASTY LURKER VARMINTS ARE GROUSIN' ABOUTS SNATCHIN' EVERYTHING THEY CAN GET THEIR GRUBBY LITTLE PAWS ON.")
(910 "BILLY" "AND SCARED AWAY MY PET HIPHOG, FARTHY.")
(1000 "BILLY" "HE'S BEEN MISSIN' FOR NIGH ON TO A COON'S AGE.")
(1136 :offscreen "BILLY" "I'VE BEEN PUTTIN' OUT HIS FAVORITE SNACK, BUT THOSE ORNERY SWAMP RATS KEEP STEALIN' EM!")
(1318 :offscreen "BILLY" "IF YOU COULD KEEP THOSE PESKY CRITTERS AWAY LONG ENOUGH, I JUST KNOW FARTHY WOULD SMELL THEM VITTLES AND COME BACK!")
(1509)
(1527 "BILLY" "WILL YA HELP ME OUT?")
)
("billy-reject"
(7 "BILLY" "WELL, IF YOU CHANGE YOUR MIND, YOU KNOW WHERE TO FIND ME! (LAUGHS)")
)
("billy-accept"
(5 "BILLY" "GOOD! THOSE RATS WILL BE BACK ANYTIME.")
(109 "BILLY" "SHOOT ALL THEM RATS, AND KEEP 'EM FROM EATING AT LEAST ONE OF THEM SNACKS.")
)
("billy-resolution"
(1 "BILLY" "WELL FRY MY HIDE! YOU SURE KNOW HOW TO SHOOT! THANKS A HEAP FOR THE HELP.")
)
("billy-reminder-1"
(36 "BILLY" "AHH, Y'ALL BACK TO HELP STOP THEM RATS?")
)
;; -----------------
;; citadel
("green-sagecage-introduction"
(130 "SAGE" "IT'S ABOUT TIME YOU TWO DECIDED TO SHOW UP!")
(207 "DAXTER" "NICE TO SEE YOU TOO! DO THEY HAVE YOU MOPPING THE FLOORS NOW?")
(343 "SAGE" "THERE'S NO TIME FOR JOKES, DAXTER. GOL AND MAIA KIDNAPPED US")
(477 "SAGE" "TO SAP OUR ENERGIES TO POWER THEIR ABOMINABLE MACHINE.")
(574)
(577 :offscreen "SAGE" "IT APPEARS THEY HAVE COMBINED THE FUNCTIONAL REMAINS OF A PRECURSOR ROBOT")
(710 :offscreen "SAGE" "WITH SCAVENGED ARTIFACTS FROM ACROSS THE LAND.")
(800)
(803 :offscreen "SAGE" "THEN THEY ADDED A FEW DIABOLICAL ADDITIONS OF THEIR OWN,")
(921 :offscreen "SAGE" "CREATING THE ONE THING CAPABLE OF OPENING THE DARK ECO SILOS.")
(1060 "SAGE" "IF YOU CAN FREE THE FOUR OF US, WE CAN USE OUR COMBINED POWERS")
(1180 "SAGE" "TO BREAK THE FORCE SHIELD SURROUNDING THE ROBOT, BEFORE THEY USE IT TO DESTROY THE WORLD.")
)
("redsage-resolution"
(58 "RED SAGE" "(CHUCKLES) YOU'VE FINALLY COME TO RESCUE ME.")
(190 "RED SAGE" "DO YOU KNOW HOW LONG I'VE BEEN IN HERE? WHAT TOOK YOU SO LONG? AND UH... (CHUCKLES)")
(381 "RED SAGE" "WHAT ARE YOUR NAMES?")
(429)
(432 "DAXTER" "I'M DAXTER! HE'S JAK, HE'S WITH ME.")
(540 :offscreen "RED SAGE" "GOOD JOB, DAXTER. YOU'RE A REAL HERO.")
(674)
(700 "RED SAGE" "YOU'VE GOT TO STOP GOL FROM LAUNCHING THE ROBOT.")
(837 "RED SAGE" "I'LL USE MY ECO POWER TO HELP OPEN THE SHIELD DOOR.")
)
("bluesage-resolution"
(63 "BLUE SAGE" "GOOD WORK, FELLOWS! OLD SAMOS WAS RIGHT ABOUT YOU!")
(162)
(165 "BLUE SAGE" "GREAT PILES OF PRECURSOR METAL!")
(253 "BLUE SAGE" "THAT INSIDIOUS MECHANICAL CREATION MUST NOT BE ALLOWED TO WREAK ITS TERRIBLE HAVOC!")
(420 "BLUE SAGE" "I WILL TRY TO ACTUATE THE SHIELD DOOR BY ELLICITING A CONDUIT OF ENERGY")
(563 "BLUE SAGE" "BETWEEN MYSELF AND THE VAST PORTAL BELOW!")
(666 "DAXTER" "UH... YEAH. YOU DO THAT. WE'LL UH... JUST GO FIND MORE HELP.")
(873)
(891 :offscreen "DAXTER" "WEIRDO!")
(980)
)
("yellowsage-resolution"
(57 "YELLOW SAGE" "WHO WOULDA THOUGHT I'D LIVE TO SEE THE DAY")
(137 "YELLOW SAGE" "WHEN I NEEDED TO BE RESCUED BY A BOY AND HIS MUSKRAT!")
(271 "YELLOW SAGE" "(SIGHS) I'M GONNA GIVE GOL AND MAIA A LITTLE PAYBACK FOR THIS EMBARRASSMENT!")
(471)
(480 "YELLOW SAGE" "THEN WE'LL SEE ABOUT COOKING UP SOME MUSKRAT STEW...")
(605)
)
("green-sagecage-resolution"
(35 "SAGE" "GOOD WORK, BOYS! YOU'RE REAL HEROES NOW.")
(158 "SAGE" "I'LL COMBINE MY GREEN ECO POWER WITH THE OTHER THREE SAGES")
(280 "SAGE" "AND TOGETHER WE'LL OPEN THE SHIELD DOOR SURROUNDING THE PRECURSOR ROBOT.")
(405 "DAXTER" "YEAH YEAH THAT SOUNDS LIKE A GOOD START.")
(457 "DAXTER" "AND THEN AFTER YOU GUYS OPEN THAT SHIELD, WHAT ARE YOU GONNA DO ABOUT THE ROBOT?")
(576 "SAGE" "NOTHING, DAXTER. WE HAVE TO KEEP THE SHIELD OPEN.")
(704 "SAGE" "IT'S UP TO YOU TWO TO FIGURE OUT HOW TO DESTROY THE ROBOT.")
(823 "DAXTER" "OH, GREAT. I GET TO HELP THE GUY THAT TURNED ME INTO A FURBALL")
(983 "DAXTER" "DESTROY THE ONLY PERSON WHO CAN TURN ME BACK!")
(1111)
(1161 "SAGE" "FIRST, SAVE THE WORLD! THEN WE'LL TRY TO CONVINCE GOL TO HELP DAXTER.")
)
("green-sagecage-outro-preboss"
(56 "GOL" "YOU'RE TOO LATE, SAMOS.")
(125 "GOL" "ONCE I POSSESS LIMITLESS DARK ECO, I WILL HAVE THE KEY TO CREATION ITSELF!")
(335 "SAGE" "THIS IS MADNESS! RELEASING THAT MUCH DARK ECO WILL DESTROY EVERYTHING WE KNOW!")
(504 "SAGE" "JUST LOOK WHAT IT'S DONE TO YOU!")
(578)
(581 "MAIA" "IT HAS GIVEN US A BEAUTY BEYOND ANYTHING YOU COULD UNDERSTAND.")
(693)
(696 "DAXTER" "BEAUTY? HAVE YOU TWO LOOKED IN A MIRROR LATELY?")
(825)
(828 "MAIA" "JUST WAIT UNTIL WE OPEN THE SILOS, LITTLE ONE. YOU THINK SHORT AND FUZZY IS BAD?")
(1030 "GOL" "AND TO THINK, YOU TWO TRAVELLED ALL THIS WAY FOR MY HELP.")
(1180 "GOL" "FOOLS! ENJOY YOUR FRONT ROW SEATS TO THE RECREATION OF THE WORLD!")
(1391)
(1605 "SAGE" "JAK! TAKE THE ELEVATOR UP AND STOP THAT ROBOT!")
)
("BLU-AM01" :hint 0 (0 "BLUE SAGE" "A LITTLE BIT OF HELP WOULD BE GOOD!"))
("BLU-AM02" :hint 0 (0 "BLUE SAGE" "OH, THIS IS A FINE MESS."))
("BLU-AM03" :hint 0 (0 "BLUE SAGE" "HMM, QUITE AN ENIGMA WE'RE FACING."))
("RED-AM01" :hint 0 (0 "RED SAGE" "IS ANYBODY THERE?"))
("RED-AM02" :hint 0 (0 "RED SAGE" "WELL..."))
("RED-AM03" :hint 0 (0 "RED SAGE" "WHAT KEPT YOU?"))
("YEL-AM01" :hint 0 (0 "RED SAGE" "TIME IS RUNNIN' OUT!"))
("YEL-AM02" :hint 0 (0 "RED SAGE" "HEY! GET ME OUTTA HERE!"))
("YEL-AM03" :hint 0 (0 "RED SAGE" "WHEN I GET OUTTA HERE, SOME SHOOTIN'S GONNA START!"))
("sksp0381" :hint #x806 (0 "DAXTER" "BREAK THE GENERATOR TO FREE THE SAGE!"))
("sksp0382" :hint #x807 (0 "DAXTER" "JUST HANG ON TO THE EDGE!"))
("sksp0383" :hint #x808 (0 "DAXTER" "WE GOT COMPANY, JAK. LOOOTS OF LURKERS!"))
("sksp0384" :hint #x809 (0 "DAXTER" "DESTROY THOSE GENERATORS!"))
("sksp0385" :hint #x80a (0 "DAXTER" "PUSH THE BUTTON!"))
("sksp0386" :hint #x80b (0 "DAXTER" "THAT ROBOT DOESN'T SCARE ME!"))
("sksp0387" :hint #x80c (0 "DAXTER" "LET'S GO CLIMB UP THOSE PLATFORMS!"))
("sksp0388" :hint #x80d (0 "DAXTER" "DON'T MISS THE NEXT LAUNCHER!"))
("sksp0389" :hint #x80e (0 "DAXTER" "WATCH IT!"))
("sksp0390" :hint #x80f (0 "DAXTER" "WE HAVE TO RESCUE ALL THE SAGES!"))
("sksp0391" :hint #x810 (0 "DAXTER" "DO YOU THINK GOL WILL STILL CHANGE ME BACK?"))
("sksp0392" :hint #x811 (0 "DAXTER" "SO THIS IS GOL AND MAIA'S CITADEL. NICE AND COZY."))
("sksp0393" :hint #x812 (0 "DAXTER" "LAND ON THE NEXT LAUNCHER!"))
("sksp0378" :hint #x813 (0 "DAXTER" "THE DOOR'S OPEN, LET'S GET GOING!"))
;; -----------------
;; finalboss
("GOL-AM01" :hint 0 (0 "GOL" "YOU JUST WON'T GIVE UP, WILL YOU?"))
("GOL-AM02" :hint 0 (0 "GOL" "SOON, THE DARK ECO WILL BE OURS!"))
("GOL-AM03" :hint 0 (0 "GOL" "FINISH THEM!"))
("GOL-AM04" :hint 0 (0 "GOL" "FIRE!"))
("GOL-AM05" :hint 0 (0 "GOL" "BLAST THEM!"))
("GOL-AM06" :hint 0 (0 "GOL" "WHAT? THEM AGAIN!"))
("GOL-AM07" :hint 0 (0 "GOL" "IT'S TOO LATE!"))
("GOL-AM08" :hint 0 (0 "GOL" "YOU ARE MINE!"))
("GOL-AM09" :hint 0 (0 "GOL" "I HAVE YOU NOW!"))
("GOL-AM10" :hint 0 (0 "GOL" "AH HA HA HA HA!"))
("GOL-AM11" :hint 0 (0 "GOL" "NO MERCY!"))
("GOL-AM12" :hint 0 (0 "GOL" "TAKE THAT!"))
("GOL-AM13" :hint 0 (0 "GOL" "NICE TRY!"))
("GOL-AM14" :hint 0 (0 "GOL" "STAND STILL!"))
("GOL-AM15" :hint 0 (0 "GOL" "PATHETIC!"))
("GOL-AM16" :hint 0 (0 "GOL" "NOOO!"))
("GOL-AM17" :hint 0 (0 "GOL" "AHHH!"))
("GOL-AM18" :hint 0 (0 "GOL" "WE'LL OPEN THE SILO ALL THE WAY AND DESTROY YOU TWO!"))
("GOL-AM19" :hint 0 (0 "GOL" "LIGHT ECO! IT DOES EXIST!"))
("GOL-AM20" :hint 0 (0 "GOL" "WE'RE NOT GONNA TAKE IT!"))
("MAI-AM01" :hint 0 (0 "MAIA" "FINISH THEM BOTH OFF ONCE AND FOR ALL!"))
("MAI-AM02" :hint 0 (0 "MAIA" "TAKE THEM OUT!"))
("MAI-AM03" :hint 0 (0 "MAIA" "HA HA HA!"))
("MAI-AM04" :hint 0 (0 "MAIA" "ECO WON'T PROTECT YOU NOW!"))
("MAI-AM05" :hint 0 (0 "MAIA" "DO SOMETHING!"))
("MAI-AM06" :hint 0 (0 "MAIA" "AGH!"))
("MAI-AM07" :hint 0 (0 "MAIA" "NOOOOO!"))
("MAI-AM08" :hint 0 (0 "MAIA" "WE'LL OPEN THE SILO ALL THE WAY AND DESTROY YOU TWO!"))
("MAI-AM09" :hint 0 (0 "MAIA" "THEY MUST NOT BE ALLOWED TO GET IT!"))
("finalbosscam-white-eco"
(163 :offscreen "GOL" "LIGHT ECO! IT DOES EXIST!")
(268 :offscreen "MAIA" "THEY MUST NOT BE ALLOWED TO GET IT!")
)
("green-sagecage-daxter-sacrifice"
(0 "DAXTER" "LIGHT ECO! THAT COULD BE THE STUFF TO CHANGE ME BACK!")
(114)
(123 "DAXTER" "OR... IT MIGHT STOP THAT ROBOT.")
(235)
(274 "DAXTER" "STAY FUZZY, SAVE THE WORLD... CHOICES...")
(404)
(437 "DAXTER" "OKAY FINE WE'LL SAVE THE WORLD, BUT DO IT QUICKLY BEFORE I CHANGE MY MIND!")
(634)
)
("green-sagecage-outro-beat-boss-a"
(165 :offscreen "MAIA" "DO SOMETHING!")
(216)
(596 :offscreen "GOL" "NOOO!")
)
("green-sagecage-outro-beat-boss-b"
(522 "SAGE" "WELL IT LOOKS LIKE I MAY HAVE BEEN TOO HARD ON YOU BOYS.")
(640 "SAGE" "YOU DO HAVE WHAT IT TAKES TO BE HEROES!")
(745)
(751 "KEIRA" "BUT, DAXTER, NOW WE CAN'T CHANGE YOU BACK.")
(845)
(847 "DAXTER" "DON'T WORRY ABOUT ME, BABY. YOU KNOW WHAT THEY SAY: BIG THINGS COME IN SMALL PACKAGES.")
(1096)
(1100 "BLUE SAGE" "JAK, YOU HAVE AN INCREDIBLE TALENT FOR CHANNELING ECO!")
(1219)
(1222 "BLUE SAGE" "SAMOS, YOU MAY HAVE BEEN RIGHT ABOUT THIS ONE AFTER ALL!")
(1321)
(1323 "RED SAGE" "AND KEIRA, WITHOUT YOUR HELP AND INGENUITY NONE OF THIS WOULD HAVE BEEN POSSIBLE.")
(1515 "RED SAGE" "HM-HM-HM. PERHAPS WE FOUND ANOTHER SAGE NOW THAT GOL AND MAIA ARE LOST...")
(1728)
(1731 "SAGE" "YES, GOL AND MAIA... THE DARK ECO PROBABLY DESTROYED THEM.")
(1916 :offscreen "SAGE" "EH, PROBABLY...")
(1999)
(2003 "DAXTER" "AH WHO CARES? BRING 'EM ON WE CAN TAKE 'EM AGAIN, RIGHT JAK?")
(2168)
(2172 "DAXTER" "I SAID, RIGHT, JAK?")
(2256)
(2302 "DAXTER" "WHOA! PUT IT ON ICE, BIG GUY!")
)
("green-sagecage-outro-beat-boss-need-cells"
(151 "SAGE" "HOLY YAKOW! WHAT COULD THAT BE?")
(247 "KEIRA" "WOW, IT'S AN ANCIENT PRECURSOR DOOR!")
(342 :offscreen "KEIRA" "IT LOOKS LIKE IT WILL ONLY OPEN IF WE FILL ALL 100 HOLES WITH POWER CELLS!")
(485 "DAXTER" "OH BOY... HERE WE GO AGAIN!")
)
("green-sagecage-outro-beat-boss-enough-cells"
(151 "SAGE" "HOLY YAKOW! WHAT COULD THAT BE?")
(247 "KEIRA" "WOW, IT'S AN ANCIENT PRECURSOR DOOR!")
(342 :offscreen "KEIRA" "IT LOOKS LIKE IT WILL ONLY OPEN IF WE FILL ALL 100 HOLES WITH POWER CELLS!")
(485 "DAXTER" "UH, WE'RE HEROES, REMEMBER? WE HAVE 100 POWER CELLS!")
)
("green-sagecage-outro-big-finish"
(322 "DAXTER" "WOW! WHAT IS IT?")
(425)
(428 "KEIRA" "IT'S SO BEAUTIFUL...")
(516)
(519 "SAGE" "BY THE PRECURSORS...")
(602)
)
;; -----------------
;; training
("asstvb40" :hint #x900
(0 "KEIRA" "THIS DEVICE IS A COMMUNICATOR. WITH IT, MY FATHER AND I")
(181 "KEIRA" "CAN GIVE YOU ADVICE AT ANY TIME DURING YOUR QUEST.")
)
("asstvb41" :hint #x901
(0 "KEIRA" "THESE FLOATING EGG-SHAPED THINGS ARE PRECURSOR ORBS.")
(176)
(180 "KEIRA" "COLLECT ENOUGH OF THEM, AND SOME OF THE VILLAGERS WILL GIVE YOU")
(315 "KEIRA" "A POWER CELL IN EXCHANGE.")
)
("asstvb42" :hint #x902
(0 "KEIRA" "THIS IS A POWER CELL, THE MOST IMPORTANT PRECURSOR ARTIFACT YOU CAN FIND!")
(327)
(333 "KEIRA" "YOU NEED TO COLLECT 20 OF THESE SO I CAN POWER THE HEAT SHIELD")
(507 "KEIRA" "FOR YOUR A-GRAV ZOOMER.")
)
("asstvb44" :hint #x903
(0 "KEIRA" "HEY, YOU FOUND ONE OF MY SCOUT FLIES!")
(160 "KEIRA" "I SENT 7 OF THEM TO EACH AREA TO LOOK FOR POWER CELLS")
(343 "KEIRA" "BUT THE LURKERS MUST HAVE CAPTURED THEM ALL!")
)
("asstvb45" :hint #x904
(0 "KEIRA" "WOW! THAT LAST SCOUT FLY HAD A POWER CELL!")
(219 "KEIRA" "I'LL BET IF YOU COLLECT ALL 7 IN EACH AREA YOU CAN FIND EVEN MORE POWER CELLS.")
)
("asstvb46" :hint #x905
(0 "KEIRA" "BE CAREFUL IN THE OCEAN, THE WATERS ARE CHOCK-FULL OF LURKER SHARKS")
(258 "KEIRA" "AND I'VE NEVER SEEN ANYONE DEFEAT ONE.")
(419)
(426 "KEIRA" "STAY CLEAR OF THEM IF YOU KNOW WHAT'S GOOD FOR YOU!")
)
("asstvb47" :hint #x906 (0 "KEIRA" "REMEMBER, THAT'S A POWER CELL. YOU NEED TO COLLECT AS MANY OF THOSE AS YOU CAN."))
("asstvb48" :hint #x907
(0 "KEIRA" "THAT'S A BLUE ECO VENT! MORE CONCENTRATED THAN THE FLOATING CLUSTERS,")
(253 "KEIRA" "THIS VENT WILL GIVE YOU A FULL CHARGE OF BLUE ECO,")
(419 "KEIRA" "LETTING YOU USE IT FOR THE MAXIMUM TIME.")
)
("sagevb21" :hint #x908
(3 "SAGE" "THOSE LITTLE GREEN BALLS OF ENERGY ON THE GROUND ARE A TYPE OF ECO.")
(280 "SAGE" "PICK UP 50 SMALL GREEN ECOES, OR ONE BIG GREEN ONE TO INCREASE YOUR HEALTH.")
)
("sagevb22" :hint #x909
(0 "SAGE" "THAT'S BLUE ECO, WHICH CONTAINS THE ENERGY OF MOTION.")
(291 "SAGE" "BLUE ECO ALLOWS YOU TO RUN FAST, BREAK BOXES, AND EVEN ACTIVATE SOME PRECURSOR")
(640 "SAGE" "ARTIFACTS WHEN YOU GET NEAR THEM.")
)
("sagevb23" :hint #x90a (0 "SAGE" "NOTICE HOW EACH BLUE ECO CLUSTER YOU PICK UP INCREASES THE TIME YOU CAN USE ITS POWER."))
("sagevb24" :hint #x90b
(3 "SAGE" "THIS IS A PRECURSOR DOOR. IT CAN ONLY BE OPENED BY APPROACHING THE DOOR")
(357 "SAGE" "WHILE CHANNELING BLUE ECO THROUGH YOUR BODY.")
)
("sagevb25" :hint #x90c
(3 "SAGE" "GOOD WORK, THE BLUE ECO CAUSED THE DOOR TO OPEN. WITH BLUE ECO, YOU CAN BREATHE")
(365 "SAGE" "ENERGY INTO ALL KINDS OF PRECURSOR ARTIFACTS THAT HAVE LAIN DORMANT FOR YEARS.")
)
("sagevb26" :hint #x90d (0 "SAGE" "USE YOUR GOGGLES TO VIEW YOUR PROGRESS DURING THE ADVENTURE."))
("sagevb27" :hint #x90e (1 "SAGE" "YOU CAN JUMP ONCE, THEN JUMP AGAIN IN THE AIR TO REACH EVEN HIGHER LEDGES."))
("sagevb28" :hint #x90f (0 "SAGE" "WHEN YOU'RE SURROUNDED BY ENEMIES, USE YOUR SPIN KICK."))
("sagevb29" :hint #x910 (0 "SAGE" "THAT'S NOT A SPIN KICK! TRY AGAIN."))
("sagevb30" :hint #x911 (0 "SAGE" "COME ON, JAK! DO A SPIN KICK."))
("sagevb31" :hint #x912 (0 "SAGE" "GOOD WORK. USE THE SPIN KICK WHEN YOU WANT A GOOD ALL-ROUND ATTACK."))
("sagevb32" :hint #x913 (0 "SAGE" "FOR A STRAIGHT LINE, MOVING ATTACK, USE YOUR FIST TO PUNCH."))
("sagevb33" :hint #x914 (0 "SAGE" "THAT'S NOT A PUNCH ATTACK! LET'S SEE YOU PUNCH ALREADY."))
("sagevb34" :hint #x915 (0 "SAGE" "JAK! USE A PUNCH."))
("sagevb35" :hint #x916 (0 "SAGE" "GREAT JOB. USE THE PUNCH TO CLOSE DISTANCE QUICKLY IN A TOUGH SPOT."))
("sagevb36" :hint #x917
(0 "SAGE" "SOMETIMES YOU'LL WANT TO HIT THINGS WITH A GREATER FORCE.")
(218 "SAGE" "TO BREAK ONE OF THESE BOXES, YOU SHOULD JUMP IN THE AIR")
(420 "SAGE" "AND THEN DIVE DOWN ONTO IT, HANDS FIRST.")
)
("sagevb37" :hint #x918 (0 "SAGE" "WHEN YOU GET SOME CONFIDENCE, TRY USING SOME OF YOUR MOVES IN COMBINATIONS."))
("sagevb38" :hint #x919
(0 "SAGE" "YOU CAN'T COME BACK THROUGH THE WARP GATE UNTIL YOU FIND")
(168 "SAGE" "ALL 4 POWER CELLS ON THIS ISLAND.")
)
("sagevb39" :hint #x91a
(0 "SAGE" "GREAT! YOU FOUND ALL OF THE POWER CELLS ON THE ISLAND.")
(269 "SAGE" "COME BACK TO THE WARP GATE SO I CAN BRING YOU BACK TO THE LAB. HURRY UP!")
)
@@ -1,111 +0,0 @@
(language-id 0 6)
;; -----------------
;; oracle
("oracle-right-eye-1" (0 #f "ORACLE" "FOR YOUR GIFT, ANOTHER POWER CELL IS YOURS."))
("oracle-left-eye-1" (0 #f "ORACLE" "YOU HAVE PROVEN YOURSELF WORTHY. HERE IS A POWER CELL."))
("oracle-right-eye-2" (0 #f "ORACLE" "HERE IS ANOTHER POWER CELL FOR YOUR QUEST."))
("oracle-left-eye-2" (0 #f "ORACLE" "FOR YOUR SACRIFICE, I OFFER YOU A POWER CELL."))
("oracle-right-eye-3" (0 #f "ORACLE" "YOU HAVE OBTAINED ANOTHER POWER CELL."))
("oracle-left-eye-3" (0 #f "ORACLE" "FOR YOUR EFFORT, A POWER CELL IS THE REWARD."))
;; -----------------
;; swamp
("billy-introduction"
(6 #f "BILLY" "HOWDY, FRIENDS! ENJOYIN' MY BEAUTIFUL SWAMP? I OWN THESE HERE PARTS. EVERYTHING THAT DOESN'T SINK INTO THE MUD, THAT IS! (LAUGHS)")
(349 #f "" "")
(369 #f "DAXTER" "JUDGING BY THE SMELL, I'D WAGER YOUR BATHTUB SANK IN THE MUD LONG AGO.")
(497 #f "" "")
(519 #f "BILLY" "WHAT'S A BATHTUB? ANYWAY I GOT BIGGER PROBLEMS NOW...")
(677 #f "" "")
(691 #f "BILLY" "SEEMS SOME NASTY LURKER VARMINTS ARE GROUSIN' ABOUTS SNATCHIN' EVERYTHING THEY CAN GET THEIR GRUBBY LITTLE PAWS ON.")
(910 #f "BILLY" "AND SCARED AWAY MY PET HIPHOG, FARTHY.")
(1000 #f "BILLY" "HE'S BEEN MISSIN' FOR NIGH ON TO A COON'S AGE.")
(1136 #t "BILLY" "I'VE BEEN PUTTIN' OUT HIS FAVORITE SNACK, BUT THOSE ORNERY SWAMP RATS KEEP STEALIN' EM!")
(1318 #t "BILLY" "IF YOU COULD KEEP THOSE PESKY CRITTERS AWAY LONG ENOUGH, I JUST KNOW FARTHY WOULD SMELL THEM VITTLES AND COME BACK!")
(1509 #f "" "")
(1527 #f "BILLY" "WILL YA HELP ME OUT?")
)
("billy-reject"
(7 #f "BILLY" "WELL, IF YOU CHANGE YOUR MIND, YOU KNOW WHERE TO FIND ME! (LAUGHS)")
)
("billy-accept"
(5 #f "BILLY" "GOOD! THOSE RATS WILL BE BACK ANYTIME.")
(109 #f "BILLY" "SHOOT ALL THEM RATS, AND KEEP 'EM FROM EATING AT LEAST ONE OF THEM SNACKS.")
)
("billy-resolution"
(1 #f "BILLY" "WELL FRY MY HIDE! YOU SURE KNOW HOW TO SHOOT! THANKS A HEAP FOR THE HELP.")
)
("billy-reminder-1"
(36 #f "BILLY" "AHH, Y'ALL BACK TO HELP STOP THEM RATS?")
)
;; -----------------
;; citadel
("green-sagecage-introduction"
(130 #f "SAGE" "IT'S ABOUT TIME YOU TWO DECIDED TO SHOW UP!")
(207 #f "DAXTER" "NICE TO SEE YOU TOO! DO THEY HAVE YOU MOPPING THE FLOORS NOW?")
(343 #f "SAGE" "THERE'S NO TIME FOR JOKES, DAXTER. GOL AND MAIA KIDNAPPED US TO SAP OUR ENERGIES TO POWER THEIR ABOMINABLE MACHINE.")
(574 #t "SAGE" "IT APPEARS THEY HAVE COMBINED THE FUNCTIONAL REMAINS OF A PRECURSOR ROBOT WITH SCAVENGED ARTIFACTS FROM ACROSS THE LAND.")
(800 #t "SAGE" "THEN THEY ADDED A FEW DIABOLICAL ADDITIONS OF THEIR OWN, CREATING THE ONE THING CAPABLE OF OPENING THE DARK ECO SILOS.")
(1060 #f "SAGE" "IF YOU CAN FREE THE FOUR OF US, WE CAN USE OUR COMBINED POWERS")
(1180 #f "SAGE" "TO BREAK THE FORCE SHIELD SURROUNDING THE ROBOT, BEFORE THEY USE IT TO DESTROY THE WORLD.")
)
("redsage-resolution"
(60 #f "RED SAGE" "(CHUCKLES) YOU'VE FINALLY COME TO RESCUE ME.")
(190 #f "RED SAGE" "DO YOU KNOW HOW LONG I'VE BEEN IN HERE? WHAT TOOK YOU SO LONG, YOU KNOW? (CHUCKLES) WHAT ARE YOUR NAMES?")
(429 #f "DAXTER" "I'M DAXTER! HE'S JAK, HE'S WITH ME.")
(540 #t "RED SAGE" "GOOD JOB, DAXTER. YOU'RE A REAL HERO.")
(670 #f "" "")
(700 #f "RED SAGE" "YOU'VE GOT TO STOP GOL FROM LAUNCHING THE ROBOT. I'LL USE MY ECO POWER TO HELP OPEN THE SHIELD DOOR.")
)
("bluesage-resolution"
(60 #f "BLUE SAGE" "GOOD WORK, FELLOWS! OLD SAMOS WAS RIGHT ABOUT YOU!")
(165 #f "BLUE SAGE" "GREAT PILES OF PRECURSOR METAL! THAT INSIDIOUS MECHANICAL CREATION MUST NOT BE ALLOWED TO WREAK ITS TERRIBLE HAVOC!")
(420 #f "BLUE SAGE" "I WILL TRY TO ACTUATE THE SHIELD DOOR BY ELLICITING A CONDUIT OF ENERGY BETWEEN MYSELF AND THE VAST PORTAL BELOW!")
(666 #f "DAXTER" "UH... YEAH. YOU DO THAT. WE'LL UH... JUST GO FIND MORE HELP.")
(873 #f "" "")
(891 #t "DAXTER" "WEIRDO!")
(980 #f "" "")
)
("yellowsage-resolution"
(50 #f "YELLOW SAGE" "WHO WOULDA THOUGHT I'D LIVE TO SEE THE DAY WHEN I NEEDED TO BE RESCUED BY A BOY AND HIS MUSKRAT!")
(271 #f "YELLOW SAGE" "(SIGHS) I'M GONNA GIVE GOL AND MAIA A LITTLE PAYBACK FOR THIS EMBARRASSMENT!")
(480 #f "YELLOW SAGE" "THEN WE'LL SEE ABOUT COOKING UP SOME MUSKRAT STEW...")
(606 #f "" "")
)
("green-sagecage-resolution"
(30 #f "SAGE" "GOOD WORK, BOYS! YOU'RE REAL HEROES NOW. I'LL COMBINE MY GREEN ECO POWER WITH THE OTHER THREE SAGES")
(284 #f "SAGE" "AND TOGETHER WE'LL OPEN THE SHIELD DOOR SURROUNDING THE PRECURSOR ROBOT.")
(405 #f "DAXTER" "YEAH YEAH THAT SOUNDS LIKE A GOOD START. AND THEN AFTER YOU GUYS OPEN THAT SHIELD, WHAT ARE YOU GONNA DO ABOUT THE ROBOT?")
(576 #f "SAGE" "NOTHING, DAXTER. WE HAVE TO KEEP THE SHIELD OPEN, IT'S UP TO YOU TWO TO FIGURE OUT HOW TO DESTROY THE ROBOT.")
(823 #f "DAXTER" "OH, GREAT. I GET TO HELP THE GUY THAT TURNED ME INTO A FURBALL DESTROY THE ONLY PERSON WHO CAN TURN ME BACK!")
(1111 #f "" "")
(1156 #f "SAGE" "FIRST, SAVE THE WORLD! THEN WE'LL TRY TO CONVINCE GOL TO HELP DAXTER.")
)
("green-sagecage-outro-preboss"
(50 #f "GOL" "YOU'RE TOO LATE, SAMOS. ONCE I POSSESS LIMITLESS DARK ECO, I WILL HAVE THE KEY TO CREATION ITSELF!")
(335 #f "SAGE" "THIS IS MADNESS! RELEASING THAT MUCH DARK ECO WILL DESTROY EVERYTHING WE KNOW!")
(485 #f "SAGE" "JUST LOOK WHAT IT'S DONE TO YOU!")
(581 #f "MAIA" "IT HAS GIVEN US A BEAUTY BEYOND ANYTHING YOU COULD UNDERSTAND.")
(696 #f "DAXTER" "BEAUTY? HAVE YOU TWO LOOKED IN A MIRROR LATELY?")
(828 #f "MAIA" "JUST WAIT UNTIL WE OPEN THE SILOS, LITTLE ONE. YOU THINK SHORT AND FUZZY IS BAD?")
(1017 #f "GOL" "AND TO THINK, YOU TWO TRAVELLED ALL THIS WAY FOR MY HELP.")
(1180 #f "GOL" "FOOLS! ENJOY YOUR FRONT ROW SEATS TO THE RECREATION OF THE WORLD!")
(1382 #f "" "")
(1605 #f "SAGE" "JAK! TAKE THE ELEVATOR UP AND STOP THAT ROBOT!")
)
@@ -0,0 +1,6 @@
(language-id 3)
;; -----------------
;; oracle
("oracle-left-eye-1" (0 "ORÁCULO" "HABÉIS DEMOSTRADO SER HONESTOS. É AQUÍ UNA BATERÍA."))
@@ -1,6 +0,0 @@
(language-id 3)
;; -----------------
;; oracle
("oracle-left-eye-1" (0 #f "ORÁCULO" "HABÉIS DEMOSTRADO SER HONESTOS. É AQUÍ UNA BATERÍA."))
+44 -44
View File
@@ -29,12 +29,12 @@
03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000290000000000000,8Bitdo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
03000000c82d00003038000000000000,8Bitdo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000022000000090000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000203800000900000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00002038000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
@@ -45,11 +45,11 @@
03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00002867000000000000,8BitDo S30 Modkit,a:b0,b:b1,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000102800000900000000000000,8Bitdo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000102800000900000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00003028000000000000,8Bitdo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,
@@ -62,22 +62,22 @@
03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000a00500003232000000000000,8Bitdo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
03000000d81d00000e00000000000000,AC02,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows,
03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows,
030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,
03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
030000006d0400000bc2000000000000,Action,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows,
03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows,
030000006f0e00001301000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001302000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001304000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001413000000000000,Afterglow,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00003901000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000ab1200000103000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000ad1b000000f9000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001301000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001302000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001304000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
030000006f0e00001413000000000000,Afterglow Xbox Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00003901000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000ab1200000103000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000ad1b000000f9000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
@@ -164,8 +164,8 @@
03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
03000000790000003018000000000000,F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
03000000242f00003900000000000000,F300 Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
@@ -732,24 +732,24 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000022000000090000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000190000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000102800000900000000000000,8Bitdo SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00004028000000010000,8Bitdo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000a00500003232000008010000,8Bitdo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000a00500003232000009010000,8Bitdo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X,
03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X,
@@ -811,7 +811,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000790000004318000000010000,MayFlash GameCube Adapter,a:b4,b:b0,x:b8,y:b12,start:b36,rightshoulder:b28,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a20,righty:a8,lefttrigger:a12,righttrigger:a16,platform:Mac OS X,
03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,x:b8,y:b12,start:b36,rightshoulder:b28,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a20,righty:a8,lefttrigger:a12,righttrigger:a16,platform:Mac OS X,
03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X,
0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
@@ -868,7 +868,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X,
030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X,
030000004c050000e60c000000010000,Sony DualSense,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
@@ -920,7 +920,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux,
05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
@@ -928,10 +928,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000190000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
@@ -939,12 +939,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000061000000010000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
030000003512000012ab000010010000,8Bitdo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,
05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,
030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
05000000102800000900000000010000,8Bitdo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00003028000000010000,8Bitdo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
@@ -954,8 +954,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
05000000a00500003232000001000000,8Bitdo Zero,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
05000000a00500003232000008010000,8Bitdo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
@@ -1292,8 +1292,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000bc2000000055000010010000,Shanwan PS3 PC ,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
030000005f140000c501000010010000,Shanwan Trust,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000004c050000e60c000011810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000e60c000000810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
@@ -1564,8 +1564,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
32633532643734376632656664383733,Sony DualSense,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
61303162353165316365336436343139,Sony DualSense,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,
63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,
476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
@@ -59,7 +59,7 @@ void SkipRenderer::render(DmaFollower& dma,
}
void SharedRenderState::reset() {
has_camera_planes = false;
has_pc_data = false;
for (auto& x : occlusion_vis) {
x.valid = false;
}
@@ -43,11 +43,17 @@ struct SharedRenderState {
math::Vector<u8, 4> fog_color;
float fog_intensity = 1.f;
bool no_multidraw = false;
bool render_collision_mesh = false;
void reset();
bool has_camera_planes = false;
bool has_pc_data = false;
LevelVis occlusion_vis[2];
math::Vector4f camera_planes[4];
math::Vector4f camera_matrix[4];
math::Vector4f camera_hvdf_off;
math::Vector4f camera_fog;
math::Vector4f camera_pos;
EyeRenderer* eye_renderer = nullptr;
@@ -0,0 +1,97 @@
#include "CollideMeshRenderer.h"
#include "game/graphics/opengl_renderer/background/background_common.h"
CollideMeshRenderer::CollideMeshRenderer() {
glGenVertexArrays(1, &m_vao);
}
CollideMeshRenderer::~CollideMeshRenderer() {
glDeleteVertexArrays(1, &m_vao);
}
void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfilerNode& prof) {
if (!render_state->has_pc_data) {
return;
}
auto levels = render_state->loader->get_in_use_levels();
if (levels.empty()) {
return;
}
render_state->shaders[ShaderId::COLLISION].activate();
glBindVertexArray(m_vao);
TfragRenderSettings settings;
memcpy(settings.math_camera.data(), render_state->camera_matrix[0].data(), 64);
settings.hvdf_offset = render_state->camera_hvdf_off;
settings.fog = render_state->camera_fog;
settings.tree_idx = 0;
for (int i = 0; i < 4; i++) {
settings.planes[i] = render_state->camera_planes[i];
}
glUniformMatrix4fv(
glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "camera"), 1, GL_FALSE,
settings.math_camera.data());
glUniform4f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "hvdf_offset"),
settings.hvdf_offset[0], settings.hvdf_offset[1], settings.hvdf_offset[2],
settings.hvdf_offset[3]);
const auto& trans = render_state->camera_pos;
glUniform4f(
glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "camera_position"),
trans[0], trans[1], trans[2], trans[3]);
glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "fog_constant"),
settings.fog.x());
glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "fog_min"),
settings.fog.y());
glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "fog_max"),
settings.fog.z());
glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "mode"), 0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // ?
glDepthMask(GL_TRUE);
for (auto lev : levels) {
glBindBuffer(GL_ARRAY_BUFFER, lev->collide_vertices);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, // location 0 in the shader
3, // 3 values per vert
GL_FLOAT, // floats
GL_FALSE, // normalized
sizeof(tfrag3::CollisionMesh::Vertex), // stride
0 // offset (0)
);
glVertexAttribIPointer(1, // location 1 in the shader
1, // 3 values per vert
GL_UNSIGNED_INT, // u32
sizeof(tfrag3::CollisionMesh::Vertex), // stride
(void*)offsetof(tfrag3::CollisionMesh::Vertex, flags) // offset
);
glVertexAttribPointer(2, // location 2 in the shader
3, // 3 values per vert
GL_SHORT, // floats
GL_TRUE, // normalized
sizeof(tfrag3::CollisionMesh::Vertex), // stride
(void*)offsetof(tfrag3::CollisionMesh::Vertex, nx) // offset (0)
);
glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "mode"), 0);
glDrawArrays(GL_TRIANGLES, 0, lev->level->collision.vertices.size());
bool kDrawWireframe = false;
if (kDrawWireframe) {
glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "mode"), 1);
glDisable(GL_BLEND);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glDrawArrays(GL_TRIANGLES, 0, lev->level->collision.vertices.size());
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_BLEND);
}
prof.add_draw_call();
prof.add_tri(lev->level->collision.vertices.size() / 3);
}
}
@@ -0,0 +1,12 @@
#pragma once
#include "game/graphics/opengl_renderer/BucketRenderer.h"
class CollideMeshRenderer {
public:
CollideMeshRenderer();
void render(SharedRenderState* render_state, ScopedProfilerNode& prof);
~CollideMeshRenderer();
private:
GLuint m_vao;
};
+33 -5
View File
@@ -75,6 +75,21 @@ void Loader::set_want_levels(const std::vector<std::string>& levels) {
}
}
/*!
* Get all levels that are in memory and used very recently.
*/
std::vector<Loader::LevelData*> Loader::get_in_use_levels() {
std::vector<Loader::LevelData*> result;
std::unique_lock<std::mutex> lk(m_loader_mutex);
for (auto& lev : m_loaded_tfrag3_levels) {
if (lev.second.frames_since_last_used < 5) {
result.push_back(&lev.second.data);
}
}
return result;
}
/*!
* Loader function that runs in a completely separate thread.
* This is used for file I/O and unpacking.
@@ -474,6 +489,15 @@ bool Loader::init_tie(Timer& timer, LevelData& data) {
return false;
}
bool Loader::init_collide(Timer& /*timer*/, LevelData& data) {
glGenBuffers(1, &data.collide_vertices);
glBindBuffer(GL_ARRAY_BUFFER, data.collide_vertices);
glBufferData(GL_ARRAY_BUFFER,
data.level->collision.vertices.size() * sizeof(tfrag3::CollisionMesh::Vertex),
data.level->collision.vertices.data(), GL_STATIC_DRAW);
return true;
}
bool Loader::upload_textures(Timer& timer, LevelData& data, TexturePool& texture_pool) {
// try to move level from initializing to initialized:
@@ -583,12 +607,14 @@ void Loader::update(TexturePool& texture_pool) {
if (init_tie(loader_timer, lev.data)) {
if (init_tfrag(loader_timer, lev.data)) {
if (init_shrub(loader_timer, lev.data)) {
// we're done! lock before removing from loaded.
lk.lock();
it->second.data.load_id = m_id++;
if (init_collide(loader_timer, lev.data)) {
// we're done! lock before removing from loaded.
lk.lock();
it->second.data.load_id = m_id++;
m_loaded_tfrag3_levels[name] = std::move(lev);
m_initializing_tfrag3_levels.erase(it);
m_loaded_tfrag3_levels[name] = std::move(lev);
m_initializing_tfrag3_levels.erase(it);
}
}
}
}
@@ -640,6 +666,8 @@ void Loader::update(TexturePool& texture_pool) {
}
}
glDeleteBuffers(1, &lev.second.data.collide_vertices);
m_loaded_tfrag3_levels.erase(lev.first);
break;
}
+3
View File
@@ -31,6 +31,7 @@ class Loader {
std::array<std::vector<TieOpenGL>, tfrag3::TIE_GEOS> tie_data;
std::array<std::vector<GLuint>, tfrag3::TIE_GEOS> tfrag_vertex_data;
std::vector<GLuint> shrub_vertex_data;
GLuint collide_vertices;
// internal load state
bool tie_opengl_created = false;
@@ -56,6 +57,7 @@ class Loader {
const LevelData* get_tfrag3_level(const std::string& level_name);
void load_common(TexturePool& tex_pool, const std::string& name);
void set_want_levels(const std::vector<std::string>& levels);
std::vector<LevelData*> get_in_use_levels();
private:
struct Level {
@@ -70,6 +72,7 @@ class Loader {
bool init_tie(Timer& timer, LevelData& data);
bool init_tfrag(Timer& timer, LevelData& data);
bool init_shrub(Timer& timer, LevelData& data);
bool init_collide(Timer& timer, LevelData& data);
// used by game and loader thread
std::unordered_map<std::string, Level> m_initializing_tfrag3_levels;
@@ -55,7 +55,6 @@ OpenGLRenderer::OpenGLRenderer(std::shared_ptr<TexturePool> texture_pool,
std::shared_ptr<Loader> loader)
: m_render_state(texture_pool, loader) {
// setup OpenGL errors
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback(opengl_error_callback, nullptr);
// disable specific errors
@@ -266,10 +265,11 @@ void OpenGLRenderer::init_bucket_renderers() {
init_bucket_renderer<RenderMux>("sprite", BucketCategory::SPRITE, BucketId::SPRITE,
std::move(sprite_renderers)); // 66
init_bucket_renderer<DirectRenderer>("debug-draw-0", BucketCategory::OTHER,
BucketId::DEBUG_DRAW_0, 0x20000);
init_bucket_renderer<DirectRenderer>("debug-draw-1", BucketCategory::OTHER,
BucketId::DEBUG_DRAW_1, 0x8000);
init_bucket_renderer<DirectRenderer>("debug", BucketCategory::OTHER, BucketId::DEBUG, 0x20000);
init_bucket_renderer<DirectRenderer>("debug-no-zbuf", BucketCategory::OTHER,
BucketId::DEBUG_NO_ZBUF, 0x8000);
init_bucket_renderer<DirectRenderer>("subtitle", BucketCategory::OTHER, BucketId::SUBTITLE,
0x2000);
// for now, for any unset renderers, just set them to an EmptyBucketRenderer.
for (size_t i = 0; i < m_bucket_renderers.size(); i++) {
@@ -294,7 +294,6 @@ void OpenGLRenderer::render(DmaFollower dma, const RenderOptions& settings) {
m_render_state.reset();
m_render_state.ee_main_memory = g_ee_main_mem;
m_render_state.offset_of_s7 = offset_of_s7();
m_render_state.has_camera_planes = false;
{
auto prof = m_profiler.root()->make_scoped_child("frame-setup");
@@ -367,6 +366,7 @@ void OpenGLRenderer::draw_renderer_selection_window() {
ImGui::Begin("Renderer Debug");
ImGui::Checkbox("Use old single-draw", &m_render_state.no_multidraw);
ImGui::Checkbox("Render collision mesh", &m_render_state.render_collision_mesh);
ImGui::SliderFloat("Fog Adjust", &m_render_state.fog_intensity, 0, 10);
ImGui::Checkbox("Sky CPU", &m_render_state.use_sky_cpu);
ImGui::Checkbox("Occlusion Cull", &m_render_state.use_occlusion_culling);
@@ -457,6 +457,12 @@ void OpenGLRenderer::dispatch_buckets(DmaFollower dma, ScopedProfilerNode& prof)
m_render_state.next_bucket += 16;
vif_interrupt_callback();
m_category_times[(int)m_bucket_categories[bucket_id]] += bucket_prof.get_elapsed_time();
// hack to draw the collision mesh in the middle the drawing
if (bucket_id == (int)BucketId::ALPHA_TEX_LEVEL0 - 1 && m_render_state.render_collision_mesh) {
auto p = prof.make_scoped_child("collision-draw");
m_collide_renderer.render(&m_render_state, p);
}
}
g_current_render = "";
@@ -502,4 +508,4 @@ void OpenGLRenderer::do_pcrtc_effects(float alp,
glEnable(GL_DEPTH_TEST);
}
}
}
@@ -8,6 +8,7 @@
#include "game/graphics/opengl_renderer/BucketRenderer.h"
#include "game/graphics/opengl_renderer/Profiler.h"
#include "game/graphics/opengl_renderer/opengl_utils.h"
#include "game/graphics/opengl_renderer/CollideMeshRenderer.h"
struct RenderOptions {
int window_height_px = 0;
@@ -24,9 +25,19 @@ struct RenderOptions {
float pmode_alp_register = 0.f;
};
/*!
* Main OpenGL renderer.
* This handles the glClear and all game rendering, but not actual setup, synchronization or imgui
* stuff.
*
* It is simply a collection of bucket renderers, and a few special case ones.
*/
class OpenGLRenderer {
public:
OpenGLRenderer(std::shared_ptr<TexturePool> texture_pool, std::shared_ptr<Loader> loader);
// rendering interface: takes the dma chain from the game, and some size/debug settings from
// the graphics system.
void render(DmaFollower dma, const RenderOptions& settings);
private:
@@ -58,6 +69,7 @@ class OpenGLRenderer {
std::array<float, (int)BucketCategory::MAX_CATEGORIES> m_category_times;
FullScreenDraw m_blackout_renderer;
CollideMeshRenderer m_collide_renderer;
float m_last_pmode_alp = 1.;
bool m_enable_fast_blackout_loads = true;
+5
View File
@@ -83,4 +83,9 @@ ShaderLibrary::ShaderLibrary() {
at(ShaderId::OCEAN_COMMON) = {"ocean_common"};
at(ShaderId::SHRUB) = {"shrub"};
at(ShaderId::SHADOW) = {"shadow"};
at(ShaderId::COLLISION) = {"collision"};
for (auto& shader : m_shaders) {
ASSERT_MSG(shader.okay(), "Shader compiled");
}
}
+1
View File
@@ -40,6 +40,7 @@ enum class ShaderId {
OCEAN_COMMON = 15,
SHADOW = 16,
SHRUB = 17,
COLLISION = 18,
MAX_SHADERS
};
+1 -1
View File
@@ -649,7 +649,7 @@ void Sprite3::do_block_common(SpriteMode mode,
flush_sprites(render_state, prof, mode == ModeHUD);
}
if (mode == Mode2D && render_state->has_camera_planes && m_enable_culling) {
if (mode == Mode2D && render_state->has_pc_data && m_enable_culling) {
// we can skip sprites that are out of view
// it's probably possible to do this for 3D as well.
auto bsphere = m_vec_data_2d[sprite_idx].xyz_sx;
@@ -653,7 +653,7 @@ void SpriteRenderer::do_block_common(SpriteMode mode,
flush_sprites(render_state, prof);
}
if (mode == Mode2D && render_state->has_camera_planes && m_enable_culling) {
if (mode == Mode2D && render_state->has_pc_data && m_enable_culling) {
// we can skip sprites that are out of view
// it's probably possible to do this for 3D as well.
auto bsphere = m_vec_data_2d[sprite_idx].xyz_sx;
@@ -51,11 +51,11 @@ void Shrub::render(DmaFollower& dma, SharedRenderState* render_state, ScopedProf
2 * (0xff & m_pc_port_data.itimes[i / 2].data()[2 * (i % 2)]) / 127.f;
}
update_render_state_from_pc_settings(render_state, m_pc_port_data);
for (int i = 0; i < 4; i++) {
settings.planes[i] = m_pc_port_data.planes[i];
render_state->camera_planes[i] = m_pc_port_data.planes[i];
}
render_state->has_camera_planes = true;
m_has_level = setup_for_level(m_pc_port_data.level_name, render_state);
render_all_trees(settings, render_state, prof);
@@ -125,11 +125,11 @@ void TFragment::render(DmaFollower& dma,
settings.occlusion_culling = render_state->occlusion_vis[m_level_id].data;
}
update_render_state_from_pc_settings(render_state, m_pc_port_data);
for (int i = 0; i < 4; i++) {
settings.planes[i] = m_pc_port_data.planes[i];
render_state->camera_planes[i] = m_pc_port_data.planes[i];
}
render_state->has_camera_planes = true;
if (m_override_time_of_day) {
for (int i = 0; i < 8; i++) {
@@ -353,11 +353,11 @@ void Tie3::render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfi
settings.occlusion_culling = render_state->occlusion_vis[m_level_id].data;
}
update_render_state_from_pc_settings(render_state, m_pc_port_data);
for (int i = 0; i < 4; i++) {
settings.planes[i] = m_pc_port_data.planes[i];
render_state->camera_planes[i] = m_pc_port_data.planes[i];
}
render_state->has_camera_planes = true;
if (false) {
// for (int i = 0; i < 8; i++) {
@@ -658,4 +658,17 @@ u32 make_all_visible_index_list(std::pair<int, int>* group_out,
}
*num_tris_out = num_tris;
return idx_buffer_ptr;
}
void update_render_state_from_pc_settings(SharedRenderState* state, const TfragPcPortData& data) {
if (!state->has_pc_data) {
for (int i = 0; i < 4; i++) {
state->camera_planes[i] = data.planes[i];
state->camera_matrix[i] = data.camera[i];
}
state->camera_pos = data.cam_trans;
state->camera_hvdf_off = data.hvdf_off;
state->camera_fog = data.fog;
state->has_pc_data = true;
}
}
@@ -3,6 +3,19 @@
#include "common/math/Vector.h"
#include "game/graphics/opengl_renderer/BucketRenderer.h"
// data passed from game to PC renderers
// the GOAL code assumes this memory layout.
struct TfragPcPortData {
math::Vector4f planes[4];
math::Vector<s32, 4> itimes[4];
math::Vector4f camera[4];
math::Vector4f hvdf_off;
math::Vector4f fog;
math::Vector4f cam_trans;
char level_name[16];
};
// inputs to background renderers.
struct TfragRenderSettings {
math::Matrix4f math_camera;
math::Vector4f hvdf_offset;
@@ -12,7 +25,6 @@ struct TfragRenderSettings {
math::Vector4f planes[4];
bool debug_culling = false;
const u8* occlusion_culling = nullptr;
// todo occlusion culling string.
};
enum class DoubleDrawKind { NONE, AFAIL_NO_DEPTH_WRITE };
@@ -50,15 +62,7 @@ void cull_check_all_slow(const math::Vector4f* planes,
u8* out);
bool sphere_in_view_ref(const math::Vector4f& sphere, const math::Vector4f* planes);
struct TfragPcPortData {
math::Vector4f planes[4];
math::Vector<s32, 4> itimes[4];
math::Vector4f camera[4];
math::Vector4f hvdf_off;
math::Vector4f fog;
char level_name[12];
u32 tree_idx;
};
void update_render_state_from_pc_settings(SharedRenderState* state, const TfragPcPortData& data);
void make_all_visible_multidraws(std::pair<int, int>* draw_ptrs_out,
GLsizei* counts_out,
+5 -4
View File
@@ -70,9 +70,10 @@ enum class BucketId {
// 64
PRE_SPRITE_TEX = 65, // maybe it's just common textures?
SPRITE = 66,
DEBUG_DRAW_0 = 67,
DEBUG_DRAW_1 = 68,
MAX_BUCKETS = 69
DEBUG = 67,
DEBUG_NO_ZBUF = 68,
SUBTITLE = 69,
MAX_BUCKETS = 70
};
enum class BucketCategory {
@@ -89,4 +90,4 @@ enum class BucketCategory {
};
constexpr const char* BUCKET_CATEGORY_NAMES[(int)BucketCategory::MAX_CATEGORIES] = {
"tfrag", "tie", "shrub", "tex", "merc", "mercneric", "sprite", "ocean", "other"};
"tfrag", "tie", "shrub", "tex", "merc", "mercneric", "sprite", "ocean", "other"};
@@ -0,0 +1,9 @@
#version 430 core
out vec4 color;
in vec4 fragment_color;
void main() {
color = fragment_color;
}
@@ -0,0 +1,67 @@
#version 430 core
layout (location = 0) in vec3 position_in;
layout (location = 1) in uint flags;
layout (location = 2) in vec3 normal_in;
uniform vec4 hvdf_offset;
uniform mat4 camera;
uniform vec4 camera_position;
uniform float fog_constant;
uniform float fog_min;
uniform float fog_max;
uniform int mode;
out vec4 fragment_color;
void main() {
// Step 3, the camera transform
vec4 transformed = -camera[3].xyzw;
transformed += -camera[0] * position_in.x;
transformed += -camera[1] * position_in.y;
transformed += -camera[2] * position_in.z;
// compute Q
float Q = fog_constant / transformed[3];
// perspective divide!
transformed.xyz *= Q;
// offset
transformed.xyz += hvdf_offset.xyz;
// ftoi4
//transformed.xyzw *= 16;
// correct xy offset
transformed.xy -= (2048.);
// correct z scale
transformed.z /= (8388608);
transformed.z -= 1;
// correct xy scale
transformed.x /= (256);
transformed.y /= -(128);
// hack
transformed.xyz *= transformed.w;
gl_Position = transformed;
// scissoring area adjust
gl_Position.y *= 512.0/448.0;
vec3 to_cam = camera_position.xyz - position_in;
float dist_from_cam = length(to_cam);
vec3 to_cam_n = to_cam / dist_from_cam;
float cam_dot = abs(dot(to_cam_n, normal_in));
// color
if (mode == 0) {
fragment_color = vec4(0.4, 0.5, 0.5, 1);
fragment_color.xyz *= (pow(cam_dot, 3) + 0.3);
} else {
fragment_color = vec4(0.0, 0.3, 0.3, 1);
}
}
+1 -1
View File
@@ -217,7 +217,6 @@
"goal_src/engine/level/level-info.gc"
"goal_src/engine/level/level.gc"
"goal_src/engine/ui/text.gc"
"goal_src/pc/subtitle.gc" ;; added
"goal_src/engine/collide/collide-probe.gc"
"goal_src/engine/collide/collide-frag.gc"
"goal_src/engine/collide/collide-mesh.gc"
@@ -303,6 +302,7 @@
"goal_src/engine/debug/viewer.gc"
"goal_src/engine/debug/part-tester.gc"
"goal_src/engine/debug/default-menu.gc"
"goal_src/pc/subtitle.gc" ;; added
"goal_src/levels/common/texture-upload.gc"
"goal_src/levels/common/rigid-body-h.gc"
"goal_src/levels/common/water-anim.gc"
+1 -1
View File
@@ -209,7 +209,6 @@
("level-info.o" "level-info")
("level.o" "level")
("text.o" "text")
("subtitle.o" "subtitle") ;; added
("collide-probe.o" "collide-probe")
("collide-frag.o" "collide-frag")
("collide-mesh.o" "collide-mesh")
@@ -296,5 +295,6 @@
("viewer.o" "viewer")
("part-tester.o" "part-tester")
("default-menu.o" "default-menu")
("subtitle.o" "subtitle") ;; added
)
+1 -1
View File
@@ -205,7 +205,6 @@
("level-info.o" "level-info")
("level.o" "level")
("text.o" "text")
("subtitle.o" "subtitle") ;; added
("collide-probe.o" "collide-probe")
("collide-frag.o" "collide-frag")
("collide-mesh.o" "collide-mesh")
@@ -292,6 +291,7 @@
("viewer.o" "viewer")
("part-tester.o" "part-tester")
("default-menu.o" "default-menu")
("subtitle.o" "subtitle") ;; added
("dir-tpages.go" "dir-tpages")
("tpage-463.go" "tpage-463")
("tpage-2.go" "tpage-2")
+8 -5
View File
@@ -308,6 +308,7 @@
(none)
)
(#when PC_PORT (define *level-hint-spool-name* (the string #f)))
(defbehavior level-hint-init-by-other level-hint ((arg0 game-text-id) (arg1 string) (arg2 entity))
(mark-text-as-seen *game-info* arg0)
(set! (-> self text-id-to-display) arg0)
@@ -489,6 +490,7 @@
)
:exit
(behavior ()
(#when PC_PORT (set! *level-hint-spool-name* (the string #f)))
(if (nonzero? (-> self sound-id))
(sound-stop (-> self sound-id))
)
@@ -503,6 +505,7 @@
)
:code
(behavior ((arg0 string))
(#when PC_PORT (set! *level-hint-spool-name* arg0))
(when (and (-> *setting-control* current play-hints) (< 0.0 (-> *setting-control* current dialog-volume)))
(case (-> self mode)
(('voicebox)
@@ -671,7 +674,7 @@
*temp-string*
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
*temp-string*
(-> arg0 bsphere)
(font-color orange-red)
@@ -1119,7 +1122,7 @@
(when *display-ambient-sound-marks*
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(symbol->string (res-lump-struct obj 'effect-name symbol :time 0.0))
gp-0
(font-color white)
@@ -1147,7 +1150,7 @@
(when (and (nonzero? a1-7) *common-text*)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(lookup-text! *common-text* (the-as game-text-id a1-7) #f)
gp-0
(font-color white)
@@ -1213,7 +1216,7 @@
)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(res-lump-struct obj 'name string)
gp-0
(font-color white)
@@ -1221,7 +1224,7 @@
)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(symbol->string s5-0)
gp-0
(font-color white)
+5 -5
View File
@@ -249,7 +249,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
a2-0
(the-as (pointer dma-tag) a3-16)
)
@@ -1229,7 +1229,7 @@
(set! (-> a0-3 w) 1.0)
(vector+! a1-2 v1-4 a0-3)
)
(add-debug-line #t (bucket-id debug-draw1) gp-0 s5-0 (new 'static 'rgba :r #xff :a #x80) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-no-zbuf) gp-0 s5-0 (new 'static 'rgba :r #xff :a #x80) #f (the-as rgba -1))
(let ((a1-5 s5-0)
(v1-5 gp-0)
(a0-5 s5-0)
@@ -1240,7 +1240,7 @@
(set! (-> a0-5 w) 1.0)
(vector+! a1-5 v1-5 a0-5)
)
(add-debug-line #t (bucket-id debug-draw1) gp-0 s5-0 (new 'static 'rgba :g #xff :a #x80) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-no-zbuf) gp-0 s5-0 (new 'static 'rgba :g #xff :a #x80) #f (the-as rgba -1))
(let ((a1-8 s5-0)
(v1-6 gp-0)
(a0-7 s5-0)
@@ -1251,14 +1251,14 @@
(set! (-> a0-7 w) 1.0)
(vector+! a1-8 v1-6 a0-7)
)
(add-debug-line #t (bucket-id debug-draw1) gp-0 s5-0 (new 'static 'rgba :b #xff :a #x80) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-no-zbuf) gp-0 s5-0 (new 'static 'rgba :b #xff :a #x80) #f (the-as rgba -1))
(when arg0
(set! (-> s5-0 quad) (-> arg0 quad))
(vector-normalize! s5-0 4096.0)
(vector+! s5-0 gp-0 s5-0)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
gp-0
s5-0
(new 'static 'rgba :r #x7f :g #x7f :a #x80)
+1 -1
View File
@@ -168,7 +168,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-4)
)
+1 -1
View File
@@ -1341,7 +1341,7 @@
(let ((t1-0 #x40000080))
(add-debug-flat-triangle
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> gp-0 0))
(-> gp-0 0 vertex 1)
(-> gp-0 0 vertex 2)
+1 -1
View File
@@ -328,7 +328,7 @@
(when *display-level-spheres*
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s5-1 info bsphere)
(-> s5-1 info bsphere w)
(new 'static 'rgba :r #xff :a #x80)
+9 -9
View File
@@ -22,15 +22,15 @@
;; for example, the introduction to orbs in geyser, or the camera that shows you where the steps to fire canyon
;; are.
(deftype pov-camera (process-drawable)
((cspace-array cspace-array :offset 112)
(flags pov-camera-flag :offset-assert 176)
(debounce-start-time time-frame :offset-assert 184)
(notify-handle handle :offset-assert 192)
(anim-name string :offset-assert 200)
(command-list pair :offset-assert 204)
(mask-to-clear uint32 :offset-assert 208)
(music-volume-movie float :offset-assert 212)
(sfx-volume-movie float :offset-assert 216)
((cspace-array cspace-array :offset 112)
(flags pov-camera-flag :offset-assert 176)
(debounce-start-time time-frame :offset-assert 184)
(notify-handle handle :offset-assert 192)
(anim-name string :offset-assert 200)
(command-list pair :offset-assert 204)
(mask-to-clear process-mask :offset-assert 208)
(music-volume-movie float :offset-assert 212)
(sfx-volume-movie float :offset-assert 216)
)
:heap-base #x70
:method-count-assert 30
+2 -2
View File
@@ -293,14 +293,14 @@
((= (-> arg2 type) spool-anim)
)
)
(set! (-> self mask-to-clear) (the-as uint #x4a0800))
(set! (-> self mask-to-clear) (process-mask movie enemy platform projectile))
(set! (-> self event-hook) (lambda :behavior pov-camera
((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(let ((v1-0 arg2))
(the-as object (cond
((= v1-0 'mask)
(let ((v0-0 (the-as number (-> arg3 param 0))))
(set! (-> self mask-to-clear) (the-as uint v0-0))
(set! (-> self mask-to-clear) (the-as process-mask v0-0))
v0-0
)
)
+4 -4
View File
@@ -12,14 +12,14 @@
(let ((t1-0 (copy-and-set-field (-> *pat-mode-info* (-> gp-0 pat mode) color) a 64)))
(add-debug-flat-triangle
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> gp-0 vertex))
(-> gp-0 vertex 1)
(-> gp-0 vertex 2)
t1-0
)
(#when PC_PORT
(add-debug-outline-triangle #t (bucket-id debug-draw1) (-> gp-0 vertex 0) (-> gp-0 vertex 1) (-> gp-0 vertex 2)
(add-debug-outline-triangle #t (bucket-id debug-no-zbuf) (-> gp-0 vertex 0) (-> gp-0 vertex 1) (-> gp-0 vertex 2)
(static-rgba 0 0 0 64)
)
)
@@ -40,7 +40,7 @@
)
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> gp-1 prim-core))
(-> gp-1 prim-core world-sphere w)
t0-1
@@ -2506,7 +2506,7 @@
)
(when v1-12
;; uncomment to view the point that blocks you from exiting duck.
;;(add-debug-point #t (bucket-id debug-draw1) (-> s5-0 closest-pt))
;;(add-debug-point #t (bucket-id debug-no-zbuf) (-> s5-0 closest-pt))
(return #t)
)
)
+16 -16
View File
@@ -551,7 +551,7 @@
(defmethod debug-draw edge-grab-info ((obj edge-grab-info))
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> obj world-vertex))
(-> obj world-vertex 1)
(new 'static 'rgba :r #xff :a #x60)
@@ -560,28 +560,28 @@
)
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj center-hold)
204.8
(new 'static 'rgba :r #xff :g #xff :a #x80)
)
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj left-hand-hold)
204.8
(new 'static 'rgba :r #xff :g #xff :a #x60)
)
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj right-hand-hold)
204.8
(new 'static 'rgba :r #xff :g #xff :a #x60)
)
(add-debug-outline-triangle
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> obj tri-vertex))
(-> obj world-vertex 4)
(-> obj world-vertex 5)
@@ -615,7 +615,7 @@
((-> s3-0 ignore)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
a2-0
a3-0
(new 'static 'rgba :r #x7f :g #x7f :b #x7f :a #x50)
@@ -627,7 +627,7 @@
(else
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
a2-0
a3-0
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x60)
@@ -636,7 +636,7 @@
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
s2-0
(-> s3-0 outward)
(meters 0.3)
@@ -654,7 +654,7 @@
(defmethod debug-draw-sphere collide-edge-work ((obj collide-edge-work))
(dotimes (s5-0 (the-as int (-> obj num-verts)))
(let ((a2-0 (-> obj verts s5-0)))
(add-debug-sphere #t (bucket-id debug-draw1) a2-0 819.2 (new 'static 'rgba :r #xff :g #xff :a #x80))
(add-debug-sphere #t (bucket-id debug-no-zbuf) a2-0 819.2 (new 'static 'rgba :r #xff :g #xff :a #x80))
)
)
#f
@@ -671,28 +671,28 @@
(while s4-0
(+! s5-0 1)
(set! (-> s3-0 y) (-> s4-0 center-pt y))
(add-debug-sphere #t (bucket-id debug-draw1) s3-0 409.6 (new 'static 'rgba :a #x80))
(add-debug-sphere #t (bucket-id debug-no-zbuf) s3-0 409.6 (new 'static 'rgba :a #x80))
(cond
(s2-0
(set! s2-0 #f)
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s4-0 center-pt)
614.4
(new 'static 'rgba :r #xff :g #xff :a #x80)
)
(add-debug-sphere #t (bucket-id debug-draw1) (-> s4-0 outward-pt) 409.6 (new 'static 'rgba :r #xff :a #x80))
(add-debug-sphere #t (bucket-id debug-no-zbuf) (-> s4-0 outward-pt) 409.6 (new 'static 'rgba :r #xff :a #x80))
)
(else
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s4-0 center-pt)
614.4
(new 'static 'rgba :r #x7f :g #x7f :a #x40)
)
(add-debug-sphere #t (bucket-id debug-draw1) (-> s4-0 outward-pt) 409.6 (new 'static 'rgba :r #x7f :a #x40))
(add-debug-sphere #t (bucket-id debug-no-zbuf) (-> s4-0 outward-pt) 409.6 (new 'static 'rgba :r #x7f :a #x40))
)
)
(set! s4-0 (-> s4-0 next))
@@ -703,7 +703,7 @@
(dotimes (s5-1 (the-as int (-> obj num-attempts)))
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> obj attempts s5-1))
409.6
(new 'static 'rgba :a #x40)
@@ -719,7 +719,7 @@
)
(add-debug-outline-triangle
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> v1-3 vertex))
(-> v1-3 vertex 1)
(-> v1-3 vertex 2)
+1 -1
View File
@@ -73,7 +73,7 @@
(.svf (&-> a2-1 quad) vf1)
(.svf (&-> a3-0 quad) vf2)
(.svf (&-> t0-0 quad) vf3)
(add-debug-flat-triangle #t (bucket-id debug-draw1) a2-1 a3-0 t0-0 t1-0)
(add-debug-flat-triangle #t (bucket-id debug-no-zbuf) a2-1 a3-0 t0-0 t1-0)
)
)
(set! s5-0 (-> (the-as (inline-array collide-mesh-tri) s5-0) 1))
+10 -10
View File
@@ -1183,7 +1183,7 @@
(let ((t1-0 (-> *pat-mode-info* (-> s5-0 best-tri pat mode) hilite-color)))
(add-debug-outline-triangle
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> s5-0 best-tri))
(-> s5-0 best-tri vertex 1)
(-> s5-0 best-tri vertex 2)
@@ -1192,7 +1192,7 @@
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s5-0 best-tri intersect)
s2-1
(meters 0.00007324219)
@@ -1200,7 +1200,7 @@
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s5-0 best-tri intersect)
arg0
(meters 0.00007324219)
@@ -1209,7 +1209,7 @@
(if (= (-> obj process type) target)
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s5-0 best-tri intersect)
(-> obj surface-normal)
(meters 0.5)
@@ -1746,7 +1746,7 @@
(when (and *display-collide-cache* (= (-> obj process type) target))
(debug-draw *collide-cache*)
;; NOTE: added
(add-debug-box #t (bucket-id debug-draw0) (-> s5-0 min) (-> s5-0 max) (new 'static 'rgba :a #x80 :b #x70 :g #x70))
(add-debug-box #t (bucket-id debug) (-> s5-0 min) (-> s5-0 max) (new 'static 'rgba :a #x80 :b #x70 :g #x70))
)
)
(else
@@ -2030,7 +2030,7 @@
"Draw collision debug."
(add-debug-sphere
(or *display-collision-marks* *display-target-marks*)
(bucket-id debug-draw0)
(bucket-id debug)
(target-pos 0)
819.2
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
@@ -2439,7 +2439,7 @@
"Draw our sphere"
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x40)
@@ -2450,7 +2450,7 @@
"Draw our sphere"
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(the-as rgba (cond
@@ -2472,7 +2472,7 @@
"Draw our sphere"
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(new 'static 'rgba :b #xff :a #x40)
@@ -2483,7 +2483,7 @@
"Draw our sphere"
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(new 'static 'rgba :g #xff :a #x10)
+1 -1
View File
@@ -209,7 +209,7 @@
(.svf (&-> a2-0 quad) vf9)
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
a2-0
a3-0
(new 'static 'rgba :r #x80 :g #x80 :b #x80 :a #x80)
+19 -19
View File
@@ -216,7 +216,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-3
(the-as (pointer dma-tag) a3-6)
)
@@ -345,7 +345,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-6
(the-as (pointer dma-tag) a3-12)
)
@@ -847,7 +847,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-2)
)
@@ -942,7 +942,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s4-0
(the-as (pointer dma-tag) a3-2)
)
@@ -1017,7 +1017,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-2
(the-as (pointer dma-tag) a3-4)
)
@@ -1070,7 +1070,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s4-0
(the-as (pointer dma-tag) a3-2)
)
@@ -1189,7 +1189,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-1
(the-as (pointer dma-tag) a3-4)
)
@@ -1246,7 +1246,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s4-0
(the-as (pointer dma-tag) a3-2)
)
@@ -1360,7 +1360,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-1
(the-as (pointer dma-tag) a3-4)
)
@@ -1535,7 +1535,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s1-0
(the-as (pointer dma-tag) a3-4)
)
@@ -1586,7 +1586,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s1-1
(the-as (pointer dma-tag) a3-8)
)
@@ -1680,7 +1680,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
(the-as pointer s4-1)
(the-as (pointer dma-tag) a3-15)
)
@@ -1977,7 +1977,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-2
(the-as (pointer dma-tag) a3-17)
)
@@ -2008,7 +2008,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-3
(the-as (pointer dma-tag) a3-21)
)
@@ -2066,7 +2066,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-1
(the-as (pointer dma-tag) a3-1)
)
@@ -2108,7 +2108,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-3
(the-as (pointer dma-tag) a3-3)
)
@@ -2151,7 +2151,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-4
(the-as (pointer dma-tag) a3-5)
)
@@ -2182,7 +2182,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-5
(the-as (pointer dma-tag) a3-7)
)
@@ -2246,7 +2246,7 @@
(debug-print-channels (-> self skel) (the-as symbol *stdcon*))
(add-debug-x
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self root trans)
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
+2 -2
View File
@@ -894,7 +894,7 @@
(set! (-> gp-0 0 x) (* (sin (-> arg0 stick0-dir)) (-> arg0 stick0-speed)))
(set! (-> gp-0 0 y) (* (cos (-> arg0 stick0-dir)) (-> arg0 stick0-speed)))
(dotimes (s5-1 32)
(with-dma-buffer-add-bucket ((s3-0 (-> (current-frame) debug-buf)) (bucket-id debug-draw0))
(with-dma-buffer-add-bucket ((s3-0 (-> (current-frame) debug-buf)) (bucket-id debug))
(draw-sprite2d-xy s3-0
(the int (* 120.0 (-> gp-0 s5-1 x)))
(the int (* 144.0 (-> gp-0 s5-1 y)))
@@ -1010,7 +1010,7 @@
(when arg1
(dotimes (s5-1 (1- (-> arg0 num-points)))
(if (!= (+ s5-1 1) (-> arg0 h-first))
(add-debug-line #t (bucket-id debug-draw1)
(add-debug-line #t (bucket-id debug-no-zbuf)
(-> arg0 points s5-1)
(-> arg0 points (1+ s5-1))
(static-rgba #x80 #xc0 #x80 #x80) #f (the-as rgba -1))
+6 -6
View File
@@ -760,7 +760,7 @@
(else (font-color dim-gray)) ;; a parent, but not selected
))
(with-dma-buffer-add-bucket ((s3-0 (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(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)
@@ -797,7 +797,7 @@
)
)
(with-dma-buffer-add-bucket ((s4-0 (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
(draw-string (-> item name) s4-0 v1-2)
)
)
@@ -828,7 +828,7 @@
)
)
(with-dma-buffer-add-bucket ((s4-0 (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
(draw-string (-> item name) s4-0 v1-2)
)
)
@@ -856,7 +856,7 @@
)
)
(with-dma-buffer-add-bucket ((s1-0 (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
(draw-string-adv (-> item name) s1-0 s5-0)
(draw-string-adv ":" s1-0 s5-0)
(cond
@@ -940,7 +940,7 @@
)
)
(with-dma-buffer-add-bucket ((s0-0 (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
;; PC PORT : fixed for widescreen
(draw-sprite2d-xy s0-0 (correct-x-int x-pos) y-pos (correct-x-int (-> menu pix-width)) (-> menu pix-height) (static-rgba #x00 #x00 #x00 #x40))
)
@@ -964,7 +964,7 @@
)
(set-origin! (-> menu context font) s3-1 s2-1)
(with-dma-buffer-add-bucket ((sv-16 (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
(draw-string ">" sv-16 (-> menu context font))
)
)
+1 -1
View File
@@ -54,7 +54,7 @@
)
(add-debug-x
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self root trans)
(the-as rgba (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80))
)
+1 -1
View File
@@ -463,7 +463,7 @@
(defmacro with-dma-buffer-add-bucket (bindings &key (bucket-group (-> (current-frame) bucket-group)) &rest body)
"Bind a dma-buffer to a variable and use it on a block to allow adding things to a new bucket.
usage: (with-dma-buffer-add-bucket ((buffer-name buffer) bucket-id) &rest body)
example: (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) (bucket-id debug-draw1)) ...)"
example: (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) (bucket-id debug-no-zbuf)) ...)"
`(let ((,(caar bindings) ,(cadar bindings)))
(with-dma-bucket (,(caar bindings) ,bucket-group ,(cadr bindings))
+13 -10
View File
@@ -183,7 +183,7 @@
(next 2) ;; addr=after tag, next-tag=ADDR
(ref 3) ;; addr=ADDR, next-tag=after tag
(refs 4) ;; ref, but stall controled
(call 5) ;;
(call 5) ;;
(ret 6) ;;
(end 7) ;; next, but ends.
)
@@ -208,11 +208,11 @@
;; DMA data is divided into buckets.
;; At the end of a frame, the buckets are all connected together and sent.
;; the buckets are organized by renderer.
(defconstant BUCKET_COUNT (#if PC_PORT 70 69))
(defenum bucket-id
:type int32
:bitfield #f
(bucket-0 0) ;; ?
(bucket-1 1) ;; ?
(bucket-2 2) ;; ?
@@ -236,11 +236,11 @@
(gmerc-tfrag-tex1 18) ;; generic merc, with tfrag textures, level 1
(shrub-tex0 19)
(shrub0 20)
(shrub-tex1 25)
(shrub1 26)
(generic-foreground 30) ;; ?
(alpha-tex0 31)
@@ -258,11 +258,11 @@
(tfrag-dirt-near-1 42)
(tfrag-ice-1 43)
(tfrag-ice-near-1 44)
(bucket-45 45) ;; merc
(bucket-46 46)
(shadow 47)
(pris-tex0 48)
@@ -296,9 +296,12 @@
(pre-sprite-textures 65) ;; common
(sprite 66)
;; debug spheres? 67
(debug-draw0 67)
(debug 67)
;; debug text 68
(debug-draw1 68)
(debug-no-zbuf 68)
;; extra buckets for pc port
(subtitle 69)
)
;; A DMA bucket is a way of sorting data within a dma buffer.
+15 -17
View File
@@ -134,12 +134,12 @@
(when (sphere-cull (-> arg0 bsphere))
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(-> arg0 bsphere)
(-> arg0 bsphere w)
(new 'static 'rgba :r #x80 :a #x80)
)
(add-debug-text-3d #t (bucket-id debug-draw1) arg1 (-> arg0 bsphere) (font-color white) (the-as vector2h #f))
(add-debug-text-3d #t (bucket-id debug-no-zbuf) arg1 (-> arg0 bsphere) (font-color white) (the-as vector2h #f))
)
)
)
@@ -659,7 +659,7 @@
(if *display-lights*
(add-debug-lights
#t
(bucket-id debug-draw0)
(bucket-id debug)
(the-as (inline-array light) (-> s3-0 light-group))
(-> arg1 origin)
)
@@ -899,7 +899,6 @@
(none)
)
;; definition for symbol *debug-hook*, type (function none)
(define *debug-hook* main-debug-hook)
(define *add-sphere* #f)
@@ -908,9 +907,9 @@
(defun real-main-draw-hook ()
"The main drawing function. This dispatches all renderers and is called directly from the display-loop
in main.gc."
in main.gc"
(when *slow-frame-rate*
(dotimes (v1-2 40000000) ;; was 50000
(dotimes (v1-2 50000000) ;; was 50000
(nop!)
(nop!)
(nop!)
@@ -919,7 +918,7 @@
(nop!)
)
)
"Function to be executed to set up for engine dma"
"Function to be executed to set up for engine dma" ;; accidental docstring from the original game
;; update render enables from the debug menu
(set! *vu1-enable-user* *vu1-enable-user-menu*)
@@ -1333,7 +1332,7 @@
;; get the increment in seconds unit.
(let ((scaled-seconds (* (the int time-ratio) (the int (-> disp time-factor)))))
;; tell the sparticle system
(set-particle-frame-time (min 12 scaled-seconds))
(set-particle-frame-time (min (seconds 0.04) scaled-seconds))
;; the "not real" frame counters only count when unpaused
(when (not (paused?))
@@ -1433,15 +1432,14 @@
)
;; add the buckets
(set! (-> new-frame bucket-group)(dma-buffer-add-buckets (-> new-frame calc-buf) 69))
(set! (-> new-frame bucket-group) (dma-buffer-add-buckets (-> new-frame calc-buf) BUCKET_COUNT))
)
;; initialize the debug bucket
(debug-init-buffer
(bucket-id debug-draw1)
(new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24) :zmsk #x1)
(new 'static 'gs-test :zte #x1 :ztst (gs-ztest always))
)
(debug-init-buffer (bucket-id debug-no-zbuf)
(new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24) :zmsk #x1)
(new 'static 'gs-test :zte #x1 :ztst (gs-ztest always))
)
;; setup our drawing offset for even/odd offset
(set-draw-env-offset (-> disp frames new-frame-idx draw) 2048 2048 odd-even)
@@ -1465,7 +1463,7 @@
(*post-draw-hook* (-> disp frames (-> disp on-screen) frame calc-buf))
;; iterate through all buckets and append a final GS state reset.
(dotimes (bucket-idx 69)
(dotimes (bucket-idx BUCKET_COUNT)
(let* ((this-global-buf (-> this-frame global-buf))
(a2-0 (-> this-global-buf base))
)
@@ -1517,7 +1515,7 @@
(set! (-> v1-14 base) (&+ (the-as pointer a0-10) 16))
)
;; patch the buckets. Now sending the calc buf will send everything!
(dma-buffer-patch-buckets (-> this-frame bucket-group) 69)
(dma-buffer-patch-buckets (-> this-frame bucket-group) BUCKET_COUNT)
;; append the final END.
(let* ((v1-15 this-calc-buf)
(a0-13 (the-as object (-> v1-15 base)))
@@ -1574,7 +1572,7 @@
(>= (the-as int (-> *display* base-frame-counter)) (the-as int (-> *game-info* blackout-time)))
;; this is a hack. this is initialized to #x493e0. It prevents controller-loss pause from
;; triggering in the first few seconds of gameplay.
(< #x49764 (the-as int (-> *display* real-frame-counter)))
(< (seconds 1003) (-> *display* real-frame-counter))
)
(and (logtest? (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons r2)) ;; debug press
(paused?)
+4 -4
View File
@@ -271,7 +271,7 @@
(defun execute-math-engine ()
(#when PC_PORT
(with-dma-buffer-add-bucket ((debug-buf (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
(when (-> *pc-settings* display-actor-counts)
(draw-string-xy (string-format "M: ~D/~D A: ~D" (-> *matrix-engine* length) MATRIX_ENGINE_AMOUNT (process-count *active-pool*)) debug-buf 8 (- 224 18) (font-color default) (font-flags shadow kerning))
)
@@ -300,7 +300,7 @@
(when (and parent (nonzero? parent) (-> parent joint) (-> parent parent))
(let ((child (vector<-cspace! (new-stack-vector0) (-> obj node-list data i)))
)
(add-debug-line #t (bucket-id debug-draw0) child (vector<-cspace! (new-stack-vector0) parent) (new 'static 'rgba :g #xff :a #x40) #f (the rgba -1))
(add-debug-line #t (bucket-id debug) child (vector<-cspace! (new-stack-vector0) parent) (new 'static 'rgba :g #xff :a #x40) #f (the rgba -1))
)
)
)
@@ -402,8 +402,8 @@
(defun draw-joint-spheres ((arg0 process-drawable))
(dotimes (s5-0 (-> arg0 node-list length))
(let ((a2-0 (vector<-cspace! (new-stack-vector0) (-> arg0 node-list data s5-0))))
(add-debug-sphere #t (bucket-id debug-draw0) a2-0 819.2 (new 'static 'rgba :g #xff :a #x40))
;;(add-debug-text-sphere #t (bucket-id debug-draw0) a2-0 819.2 (the string (-> arg0 node-list data s5-0 joint name)) (new 'static 'rgba :g #xff :a #x40))
(add-debug-sphere #t (bucket-id debug) a2-0 819.2 (new 'static 'rgba :g #xff :a #x40))
;;(add-debug-text-sphere #t (bucket-id debug) a2-0 819.2 (the string (-> arg0 node-list data s5-0 joint name)) (new 'static 'rgba :g #xff :a #x40))
)
)
#f
+93 -129
View File
@@ -167,9 +167,7 @@
(when (nonzero? s4-0)
(dotimes (s3-0 (-> s4-0 length))
(let ((s2-0 (-> s4-0 data s3-0 actor)))
(if (and (type-type? (-> s2-0 type) entity-actor)
(= (-> s2-0 etype) arg0)
)
(if (and (type-type? (-> s2-0 type) entity-actor) (= (-> s2-0 etype) arg0))
(return s2-0)
)
)
@@ -232,11 +230,10 @@
(let* ((t1-3 (-> a3-5 data t0-4 actor))
(t2-1 (-> t1-3 extra trans))
)
(if (and
(= (the float (the int (-> t2-1 x))) arg0)
(= (the float (the int (-> t2-1 y))) arg1)
(= (the float (the int (-> t2-1 z))) arg2)
)
(if (and (= (the float (the int (-> t2-1 x))) arg0)
(= (the float (the int (-> t2-1 y))) arg1)
(= (the float (the int (-> t2-1 z))) arg2)
)
(return t1-3)
)
)
@@ -347,10 +344,9 @@
The second is a d, if we draw (only if we are process-drawable)
The third is the LOD of the drawing. (also only for process-drawable)"
(let* ((s5-0 arg0)
(proc-draw (the-as process-drawable
(if (and (nonzero? s5-0) (type-type? (-> s5-0 type) process-drawable))
s5-0
)
(proc-draw (the-as process-drawable (if (and (nonzero? s5-0) (type-type? (-> s5-0 type) process-drawable))
(the-as process-drawable s5-0)
)
)
)
)
@@ -458,8 +454,8 @@
)
(if (-> obj extra process)
(* (- (-> obj extra process allocated-length)
(&- (-> obj extra process heap-top) (the-as uint (-> obj extra process heap-cur)))
)
(&- (-> obj extra process heap-top) (the-as uint (-> obj extra process heap-cur)))
)
8
)
""
@@ -862,7 +858,7 @@
(let ((s1-1 (the-as process-drawable (-> s0-0 extra process))))
(add-debug-x
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s1-1 root trans)
(new 'static 'rgba :r #x80 :g #xff :b #x80 :a #x80)
)
@@ -878,7 +874,7 @@
)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(symbol->string (-> s1-1 state name))
(-> s1-1 root trans)
(font-color white)
@@ -910,7 +906,7 @@
(if (and (the-as structure v0-10) (= (-> v0-10 type) symbol))
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(symbol->string v0-10)
(-> s1-1 root trans)
(font-color white)
@@ -921,11 +917,11 @@
)
)
((or (= arg0 'full) (-> s0-0 extra process))
(add-debug-x #t (bucket-id debug-draw1) s1-0 (the-as rgba (if (-> s0-0 extra process)
(the-as uint #x8080ff80)
(the-as uint #x800000ff)
)
)
(add-debug-x #t (bucket-id debug-no-zbuf) s1-0 (the-as rgba (if (-> s0-0 extra process)
(the-as uint #x8080ff80)
(the-as uint #x800000ff)
)
)
)
(set! sv-192 add-debug-text-3d)
(set! sv-208 #t)
@@ -982,13 +978,13 @@
(when (and (type-type? (-> s0-3 type) process-drawable) (nonzero? (-> (the-as process-drawable s0-3) draw)))
(add-debug-x
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> (the-as process-drawable s0-3) root trans)
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(vector+!
(new 'stack-no-clear 'vector)
(-> (the-as process-drawable s0-3) draw origin)
@@ -1022,15 +1018,15 @@
(s4-2 (-> (the-as process-drawable s5-2) root trans))
)
(when s3-2
(add-debug-x #t (bucket-id debug-draw1) s4-2 (the-as rgba (if (-> s3-2 extra process)
(the-as uint #x8080ff80)
(the-as uint #x800000ff)
)
)
(add-debug-x #t (bucket-id debug-no-zbuf) s4-2 (the-as rgba (if (-> s3-2 extra process)
(the-as uint #x8080ff80)
(the-as uint #x800000ff)
)
)
)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(res-lump-struct s3-2 'name string)
s4-2
(the-as font-color (if (logtest? (-> s3-2 extra perm status) (entity-perm-status bit-0 bit-1))
@@ -1042,7 +1038,7 @@
)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(symbol->string (-> (the-as process-drawable s5-2) state name))
s4-2
(font-color white)
@@ -1063,15 +1059,14 @@
(dummy-9 (-> (the-as process-drawable s5-2) vol))
)
)
(if (and
(the-as process-drawable s5-2)
(type-type? (-> (the-as process-drawable s5-2) type) process-drawable)
(nonzero? (-> (the-as process-drawable s5-2) draw))
*display-actor-vis*
)
(if (and (the-as process-drawable s5-2)
(type-type? (-> (the-as process-drawable s5-2) type) process-drawable)
(nonzero? (-> (the-as process-drawable s5-2) draw))
*display-actor-vis*
)
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(vector+!
(new 'stack-no-clear 'vector)
(-> (the-as process-drawable s5-2) draw origin)
@@ -1083,7 +1078,7 @@
)
)
(when (and *display-actor-vis* *display-actor-anim*)
(let ((s5-3 (entity-by-name (the-as string *display-actor-anim*))))
(let ((s5-3 (entity-by-name *display-actor-anim*)))
(when s5-3
(let ((v0-35 (res-lump-data s5-3 'visvol pointer))
(a1-31 (-> s5-3 extra vis-id))
@@ -1091,7 +1086,7 @@
(if v0-35
(add-debug-box
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (&+ v0-35 0))
(the-as vector (&+ v0-35 16))
(the-as rgba (if (is-object-visible? (-> s5-3 extra level) a1-31)
@@ -1106,10 +1101,9 @@
)
)
)
(if (and
(or *display-nav-marks* *display-path-marks* *display-vol-marks*)
(not (or *display-actor-anim* *display-process-anim*))
)
(if (and (or *display-nav-marks* *display-path-marks* *display-vol-marks*)
(not (or *display-actor-anim* *display-process-anim*))
)
(iterate-process-tree
*active-pool*
(the-as (function object object) (lambda ((arg0 process-drawable))
@@ -1155,7 +1149,7 @@
(countdown (s2-4 (-> s3-4 length))
(add-debug-box
#t
(bucket-id debug-draw0)
(bucket-id debug)
(the-as vector (-> s3-4 data s2-4))
(the-as vector (+ (the-as uint (-> s3-4 data 0 max)) (* s2-4 32)))
(the-as rgba (if (zero? (-> s4-4 index))
@@ -1171,17 +1165,16 @@
)
)
)
(when (or
*display-ambient-hint-marks*
*display-ambient-sound-marks*
*display-ambient-poi-marks*
*display-ambient-light-marks*
*display-ambient-dark-marks*
*display-ambient-weather-off-marks*
*display-ambient-ocean-off-marks*
*display-ambient-ocean-near-off-marks*
*display-ambient-music-marks*
)
(when (or *display-ambient-hint-marks*
*display-ambient-sound-marks*
*display-ambient-poi-marks*
*display-ambient-light-marks*
*display-ambient-dark-marks*
*display-ambient-weather-off-marks*
*display-ambient-ocean-off-marks*
*display-ambient-ocean-near-off-marks*
*display-ambient-music-marks*
)
(dotimes (s5-5 (-> obj length))
(let ((v1-214 (-> obj level s5-5)))
(when (= (-> v1-214 status) 'active)
@@ -1254,21 +1247,6 @@
`(or ,@(apply (lambda (x) `(begin (define-extern ,x type) (type-type? (-> obj etype) ,x))) types))
)
(defmacro heap-size-hack (info entity-type)
; `(cond
; ((type-type? ,entity-type collectable)
; #x1000
; )
; (else
`(if ,info
(-> ,info heap-size)
#x4000
)
; )
; )
; #x8000
)
(defmethod birth! entity-actor ((obj entity-actor))
"Create a process for this entity and start it."
@@ -1288,7 +1266,10 @@
(let* ((entity-type (-> obj etype))
(info (entity-info-lookup entity-type))
(entity-process (get-process *default-dead-pool* entity-type (heap-size-hack info entity-type) ;; hack, modified this.
(entity-process (get-process *default-dead-pool* entity-type (if info
(-> info heap-size)
#x4000
)
)
)
)
@@ -1306,7 +1287,6 @@
(init-entity entity-process obj)
)
(else
(birth-log "could not birth ~A because there was an issue.~%" obj)
(when (not (birth-viewer entity-process obj))
(format 0 "ERROR: no proper process type named ~A exists in the code, could not start ~A~%" entity-type obj)
(logior! (-> obj extra perm status) (entity-perm-status bit-0))
@@ -1372,12 +1352,10 @@
;; NOTE: we don't actually birth the actors. It is too slow.
;; so it gets spread over multiple frames later.
(when (nonzero? (-> obj actors))
;;(birth-log "add-to-level! for ~D actors for ~A~%" (-> obj actors length) obj)
(dotimes (birth-idx (-> obj actors length))
(let* ((idx-to-birth (-> obj actor-birth-order birth-idx))
(actor-to-birth (-> obj actors data (logand idx-to-birth #xffff) actor))
)
;;(birth-log "now adding to level: ~D ~D ~A~%" birth-idx idx-to-birth actor-to-birth)
(add-to-level! actor-to-birth *level* (-> obj level) (the-as actor-id (-> actor-to-birth aid)))
)
)
@@ -1423,7 +1401,6 @@
(let ((cams (-> obj cameras)))
(when (nonzero? cams)
(dotimes (s3-1 (-> cams length))
;;(birth-log "birth cam: ~A~%" (-> cams s3-1))
(birth! (-> cams s3-1))
)
)
@@ -1471,11 +1448,10 @@
)
((= (-> s2-0 type) part-tracker)
(let ((v1-28 (the-as part-tracker s2-0)))
(if (and
(nonzero? (-> v1-28 part))
(>= (the-as int (-> v1-28 part group)) (the-as int s4-2))
(< (the-as int (-> v1-28 part group)) (the-as int s3-1))
)
(if (and (nonzero? (-> v1-28 part))
(>= (the-as int (-> v1-28 part group)) (the-as int s4-2))
(< (the-as int (-> v1-28 part group)) (the-as int s3-1))
)
(deactivate s2-0)
)
)
@@ -1489,11 +1465,10 @@
)
(when v1-34
(cond
((and
(nonzero? (-> (the-as process-drawable v1-34) part))
(>= (the-as int (-> (the-as process-drawable v1-34) part group)) (the-as int s4-2))
(< (the-as int (-> (the-as process-drawable v1-34) part group)) (the-as int s3-1))
)
((and (nonzero? (-> (the-as process-drawable v1-34) part))
(>= (the-as int (-> (the-as process-drawable v1-34) part group)) (the-as int s4-2))
(< (the-as int (-> (the-as process-drawable v1-34) part group)) (the-as int s3-1))
)
(format
#t
"NOTICE: rogue null level entity (using part ~A) ~A~% still alive~%"
@@ -1502,11 +1477,10 @@
)
(deactivate s2-0)
)
((and
(nonzero? (-> (the-as process-drawable v1-34) draw))
(>= (the-as int (-> (the-as process-drawable v1-34) draw art-group)) (the-as int s4-2))
(< (the-as int (-> (the-as process-drawable v1-34) draw art-group)) (the-as int s3-1))
)
((and (nonzero? (-> (the-as process-drawable v1-34) draw))
(>= (the-as int (-> (the-as process-drawable v1-34) draw art-group)) (the-as int s4-2))
(< (the-as int (-> (the-as process-drawable v1-34) draw art-group)) (the-as int s3-1))
)
(format
#t
"NOTICE: rogue null level entity (using art ~A) ~A~% still alive~%"
@@ -1540,13 +1514,12 @@
(logclear! (-> obj status) arg1)
)
((nonzero? (-> obj task))
(logclear! (-> obj status) (logior
(if (logtest? (-> obj status) (entity-perm-status bit-4))
524
0
)
515
)
(logclear! (-> obj status) (logior (if (logtest? (-> obj status) (entity-perm-status bit-4))
524
0
)
515
)
)
)
(else
@@ -1644,23 +1617,20 @@
)
(defmethod run-logic? process-drawable ((obj process-drawable))
(or
(zero? (logand (-> obj mask) (process-mask actor-pause)))
(or
(>= (+ (-> *ACTOR-bank* pause-dist) (-> obj root pause-adjust-distance))
(vector-vector-distance (-> obj root trans) (math-camera-pos))
(or (zero? (logand (-> obj mask) (process-mask actor-pause)))
(or (>= (+ (-> *ACTOR-bank* pause-dist) (-> obj root pause-adjust-distance))
(vector-vector-distance (-> obj root trans) (math-camera-pos))
)
(and (nonzero? (-> obj skel)) (!= (-> obj skel root-channel 0) (-> obj skel channel)))
(and (nonzero? (-> obj draw)) (logtest? (-> obj draw status) (draw-status no-skeleton-update)))
)
(and (nonzero? (-> obj skel)) (!= (-> obj skel root-channel 0) (-> obj skel channel)))
(and (nonzero? (-> obj draw)) (logtest? (-> obj draw status) (draw-status no-skeleton-update)))
)
)
)
(defmethod birth? entity-links ((obj entity-links) (arg0 vector))
(and
(zero? (logand (-> obj perm status) (entity-perm-status bit-0 dead)))
(< (vector-vector-distance (-> obj trans) arg0) (-> *ACTOR-bank* birth-dist))
)
(and (zero? (logand (-> obj perm status) (entity-perm-status bit-0 dead)))
(< (vector-vector-distance (-> obj trans) arg0) (-> *ACTOR-bank* birth-dist))
)
)
(defmethod actors-update level-group ((obj level-group))
@@ -1681,13 +1651,7 @@
)
(when (not (paused?))
(let ((s5-1 (-> *display* frames (-> *display* last-screen) frame run-time)))
(let ((f0-5
(fmax
327680.0
(fmin (+ 327680.0 (* 204.8 (the float (- 7000 (the-as int s5-1))))) (-> *ACTOR-bank* birth-dist))
)
)
)
(let ((f0-5 (fmax 327680.0 (fmin (+ 327680.0 (* 204.8 (the float (- 7000 s5-1)))) (-> *ACTOR-bank* birth-dist)))))
(seek! (-> *ACTOR-bank* pause-dist) f0-5 (* 81920.0 (-> *display* seconds-per-frame)))
)
(seekl! (-> *ACTOR-bank* birth-max) (the int (lerp-scale 25.0 1.0 (the float s5-1) 2000.0 7000.0)) 10)
@@ -1756,7 +1720,9 @@
)
)
)
((= (-> s4-2 display?) 'actor)
((#if PC_PORT
(or (= (-> s4-2 display?) 'actor) (with-pc (-> *pc-settings* force-actors?)))
(= (-> s4-2 display?) 'actor))
(let* ((s4-4 (-> s4-2 entity))
(s3-3 (-> s4-4 length))
)
@@ -1789,10 +1755,9 @@
(dotimes (s2-3 s3-4)
(let ((s1-1 (-> s4-5 data s2-3)))
(cond
((and
(< (vector-vector-distance (-> s1-1 trans) sv-16) (-> *ACTOR-bank* birth-dist))
(zero? (logand (-> s1-1 perm status) (entity-perm-status bit-9 bit-10)))
)
((and (< (vector-vector-distance (-> s1-1 trans) sv-16) (-> *ACTOR-bank* birth-dist))
(zero? (logand (-> s1-1 perm status) (entity-perm-status bit-9 bit-10)))
)
(when (not (or (-> s1-1 process) (logtest? (-> s1-1 perm status) (entity-perm-status bit-0 dead))))
(birth! (-> s1-1 entity))
(set! sv-24 (+ sv-24 1))
@@ -1820,10 +1785,9 @@
(dotimes (s1-2 s2-4)
(set! sv-32 (-> s3-5 data s1-2))
(cond
((and
(is-object-visible? s4-2 (-> sv-32 vis-id))
(zero? (logand (-> sv-32 perm status) (entity-perm-status bit-9 bit-10)))
)
((and (is-object-visible? s4-2 (-> sv-32 vis-id))
(zero? (logand (-> sv-32 perm status) (entity-perm-status bit-9 bit-10)))
)
(when (not (or (-> sv-32 process) (logtest? (-> sv-32 perm status) (entity-perm-status bit-0 dead)) s0-1))
(birth! (-> sv-32 entity))
(set! sv-24 (+ sv-24 1))
@@ -1936,14 +1900,14 @@
(let* ((e (-> inspect-info entity)) (name (res-lump-struct e 'name string)))
(set! *display-actor-anim* (the string (and (-> inspect-info show-actor-info) name)))
;; draw trans
(add-debug-x #t (bucket-id debug-draw1) (-> e trans) (static-rgba 255 255 0 128))
(add-debug-x #t (bucket-id debug-no-zbuf) (-> e trans) (static-rgba 255 255 0 128))
(if (or (not (-> inspect-info show-actor-info)) (!= (-> e type) entity-actor) (and (= (-> e type) entity-actor) (not (-> (the entity-actor e) extra process))))
(add-debug-text-3d #t (bucket-id debug-draw1) name (-> e trans) (font-color red) (new 'static 'vector2h :y 8)))
(add-debug-text-3d #t (bucket-id debug-no-zbuf) name (-> e trans) (font-color red) (new 'static 'vector2h :y 8)))
;; start writing text
(let* ((begin-y (- 16 (* (-> inspect-info scroll-y) 8))) (cur-y begin-y) (y-adv 8))
(with-dma-buffer-add-bucket ((debug-buf (-> (current-frame) debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
;; 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))
+5 -5
View File
@@ -29,8 +29,8 @@
)
;; add text and vector
(add-debug-text-sphere #t (bucket-id debug-draw1) (-> obj trans) 819.2 (symbol->string (-> obj name)) s5-0)
(add-debug-vector #t (bucket-id debug-draw1) (-> obj trans) (-> obj normal) 8192.0 s5-0)
(add-debug-text-sphere #t (bucket-id debug-no-zbuf) (-> obj trans) 819.2 (symbol->string (-> obj name)) s5-0)
(add-debug-vector #t (bucket-id debug-no-zbuf) (-> obj trans) (-> obj normal) 8192.0 s5-0)
)
0
(none)
@@ -929,12 +929,12 @@
(defmethod debug-draw! continue-point ((obj continue-point))
"Draw a continue point."
(add-debug-x #t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj trans)
(new 'static 'rgba :r #xff :a #x80)
)
(add-debug-text-3d #t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj name)
(-> obj trans)
(font-color white)
@@ -943,7 +943,7 @@
(let ((a3-2 (vector-z-quaternion! (new-stack-vector0) (-> obj quat))))
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj trans)
a3-2
8192.0
+15 -15
View File
@@ -112,9 +112,9 @@
(grab-target handle :offset 120)
(grab-event symbol :offset-assert 128)
(release-event symbol :offset-assert 132)
(old-global-mask uint32 :offset-assert 136)
(old-self-mask uint32 :offset-assert 140)
(old-parent-mask uint32 :offset-assert 144)
(old-global-mask process-mask :offset-assert 136)
(old-self-mask process-mask :offset-assert 140)
(old-parent-mask process-mask :offset-assert 144)
(look-at-target handle :offset-assert 152)
(pov-target handle :offset-assert 160)
(work-process handle :offset-assert 168)
@@ -124,7 +124,7 @@
(userdata basic :offset-assert 196)
(message basic :offset-assert 200)
(border-value basic :offset-assert 204)
(mask-to-clear uint32 :offset-assert 208)
(mask-to-clear process-mask :offset-assert 208)
(script pair :offset-assert 212)
(script-line pair :offset-assert 216)
(script-func (function none) :offset-assert 220)
@@ -199,17 +199,17 @@
;; control the camera from something else (an animation)
(deftype othercam (process)
((hand handle :offset-assert 112)
(old-global-mask uint32 :offset-assert 120)
(mask-to-clear uint32 :offset-assert 124)
(cam-joint-index int32 :offset-assert 128)
(old-pos vector :inline :offset-assert 144)
(old-mat-z vector :inline :offset-assert 160)
(had-valid-frame basic :offset-assert 176)
(border-value basic :offset-assert 180)
(die? symbol :offset-assert 184)
(survive-anim-end? symbol :offset-assert 188)
(spooling? symbol :offset-assert 192)
((hand handle :offset-assert 112)
(old-global-mask process-mask :offset-assert 120)
(mask-to-clear process-mask :offset-assert 124)
(cam-joint-index int32 :offset-assert 128)
(old-pos vector :inline :offset-assert 144)
(old-mat-z vector :inline :offset-assert 160)
(had-valid-frame basic :offset-assert 176)
(border-value basic :offset-assert 180)
(die? symbol :offset-assert 184)
(survive-anim-end? symbol :offset-assert 188)
(spooling? symbol :offset-assert 192)
)
:heap-base #x60
:method-count-assert 14
+2 -2
View File
@@ -1144,7 +1144,7 @@
)
((= v1-0 'mask)
(set! v0-0 (-> arg3 param 0))
(set! (-> self mask-to-clear) v0-0)
(set! (-> self mask-to-clear) (the-as process-mask v0-0))
v0-0
)
((= v1-0 'border)
@@ -1203,7 +1203,7 @@
(defbehavior camera-tracker-init camera-tracker ((arg0 object))
(stack-size-set! (-> self main-thread) 512)
(logclear! (-> self mask) (process-mask actor-pause movie enemy platform projectile))
(set! (-> self mask-to-clear) (the-as uint #x4a0800))
(set! (-> self mask-to-clear) (process-mask movie enemy platform projectile))
(set! (-> self grab-target) (the-as handle #f))
(set! (-> self grab-event) 'grab)
(set! (-> self release-event) 'end-mode)
+6 -6
View File
@@ -18,7 +18,7 @@
(defun letterbox ()
"Draw the letterbox black rectangles"
(with-dma-buffer-add-bucket ((dma-buf (-> (current-frame) global-buf))
(bucket-id debug-draw1)) ;; debug-draw1 is one of the last buckets
(bucket-id debug-no-zbuf)) ;; debug-no-zbuf is one of the last buckets
;; draw the two sprites
(#cond
((not PC_PORT)
@@ -75,7 +75,7 @@
(defun blackout ()
"Draw the blackout rectangle, convering the entire screen in darkness."
(with-dma-buffer-add-bucket ((dma-buf (-> (current-frame) global-buf))
(bucket-id debug-draw1)) ;; debug-draw1 is one of the last buckets
(bucket-id debug-no-zbuf)) ;; debug-no-zbuf is one of the last buckets
(draw-sprite2d-xy dma-buf 0 0 512 224 (new 'static 'rgba :a #x80))
)
(none)
@@ -330,7 +330,7 @@
)
(defmethod draw screen-filter ((obj screen-filter))
(with-dma-buffer-add-bucket ((buf (-> (current-frame) global-buf)) (bucket-id debug-draw1))
(with-dma-buffer-add-bucket ((buf (-> (current-frame) global-buf)) (bucket-id debug-no-zbuf))
(draw-sprite2d-xy buf -256 (- (-> *video-parms* screen-hy)) 512 (-> *video-parms* screen-sy) (-> obj color))
)
(none)
@@ -467,7 +467,7 @@
(-> (current-frame) debug-buf)
(-> (current-frame) global-buf)
))
(bucket-id debug-draw0))
(bucket-id debug))
(show-iop-memory dma-buff)
)
)
@@ -749,7 +749,7 @@
;; debug dma
(with-dma-buffer-add-bucket ((debug-buf (-> disp frames (-> disp on-screen) frame debug-buf))
(bucket-id debug-draw1))
(bucket-id debug-no-zbuf))
(when *display-profile*
(dma-buffer-add-gs-set debug-buf
(alpha-1 (new 'static 'gs-alpha :b 1 :d 1))
@@ -850,7 +850,7 @@
(-> disp frames (-> disp on-screen) frame debug-buf)
(-> disp frames (-> disp on-screen) frame global-buf)
))
(bucket-id debug-draw0))
(bucket-id debug))
(if (and (= *master-mode* 'pause) (!= *cheat-mode* 'camera))
(draw-string-xy (lookup-text! *common-text* (game-text-id pause) #f)
s3-1 256 160 (font-color orange-red) (font-flags shadow kerning middle large))
@@ -89,7 +89,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-0
(the-as (pointer dma-tag) a3-4)
)
@@ -118,7 +118,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s5-1
(the-as (pointer dma-tag) a3-7)
)
@@ -1304,7 +1304,7 @@
)
(('mask)
(set! v0-0 (-> arg3 param 0))
(set! (-> self mask-to-clear) (the-as uint v0-0))
(set! (-> self mask-to-clear) (the-as process-mask v0-0))
v0-0
)
)
@@ -1424,7 +1424,7 @@
(set! (-> self border-value) #f)
(set! (-> self die?) #f)
(set! (-> self survive-anim-end?) arg2)
(set! (-> self mask-to-clear) (the-as uint #x4a0800))
(set! (-> self mask-to-clear) (process-mask movie enemy platform projectile))
(set! (-> self event-hook) (-> othercam-running event))
(go othercam-running)
0
@@ -1434,7 +1434,10 @@
(defmethod draw-npc-shadow process-taskable ((obj process-taskable))
(let ((gp-0 (-> obj draw shadow-ctrl)))
(cond
((and (-> obj draw shadow) (zero? (-> obj draw cur-lod)) (logtest? (-> obj draw status) (draw-status was-drawn)))
((and (-> obj draw shadow)
(zero? (-> obj draw cur-lod))
(logtest? (-> obj draw status) (draw-status was-drawn))
)
(collide-to-find-planes gp-0 (-> obj draw origin) -4096.0 4096.0 32768.0)
(update-direction-from-time-of-day gp-0)
)
+1 -1
View File
@@ -192,7 +192,7 @@
(dotimes (s3-0 (/ (-> obj point-count) 2))
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector s4-0)
(the-as vector (&-> s4-0 4))
(the-as rgba s5-0)
+5 -5
View File
@@ -1122,15 +1122,15 @@
(+! (-> p3 x) (+ x0 3145728.0))
(+! (-> p3 z) (+ y0 3145728.0))
(add-debug-flat-triangle #t (bucket-id debug-draw1) p0 p1s p2s color0)
;; (add-debug-flat-triangle #t (bucket-id debug-draw1) p3 p1 p2 color0)
(add-debug-outline-triangle #t (bucket-id debug-draw1) p0 p1 p2 color1)
(add-debug-outline-triangle #t (bucket-id debug-draw1) p3 p1 p2 color1)
(add-debug-flat-triangle #t (bucket-id debug-no-zbuf) p0 p1s p2s color0)
;; (add-debug-flat-triangle #t (bucket-id debug-no-zbuf) p3 p1 p2 color0)
(add-debug-outline-triangle #t (bucket-id debug-no-zbuf) p0 p1 p2 color1)
(add-debug-outline-triangle #t (bucket-id debug-no-zbuf) p3 p1 p2 color1)
(format (clear *temp-string*) "o: ~d ~d ~d ~b" x y (+ (* 6 y) x) masks)
(add-debug-text-3d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
*temp-string*
p0
(font-color orange-red)
+1 -1
View File
@@ -122,7 +122,7 @@
(vector+! s5-0 s5-0 (-> arg0 root trans))
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
s5-0
2048.0
(new 'static 'rgba :r #xff :g #xff :a #x80)
+3 -3
View File
@@ -17,7 +17,7 @@
(dotimes (s3-0 (/ (-> s4-0 length) 2))
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s4-0 data (* s3-0 2))
(-> s4-0 data (+ (* s3-0 2) 1))
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
@@ -999,8 +999,8 @@
(-> arg1 global-buf)
(edge-debug-lines (-> obj debug-data debug-lines))
(add-debug-sphere #t (bucket-id debug-draw0) (-> obj bsphere) (-> obj bsphere w) (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80))
;;(add-debug-x #t (bucket-id debug-draw0) (-> obj bsphere) (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80))
(add-debug-sphere #t (bucket-id debug) (-> obj bsphere) (-> obj bsphere w) (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80))
;;(add-debug-x #t (bucket-id debug) (-> obj bsphere) (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80))
(none)
)
+4 -3
View File
@@ -322,7 +322,7 @@
(defun add-pc-tfrag3-data ((dma-buf dma-buffer) (lev level))
"Add PC-port specific tfrag data"
(let ((packet (the-as dma-packet (-> dma-buf base))))
(set! (-> packet dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc 15))
(set! (-> packet dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc 16))
(set! (-> packet vif0) (new 'static 'vif-tag))
(set! (-> packet vif1) (new 'static 'vif-tag :cmd (vif-cmd pc-port)))
(set! (-> dma-buf base) (the pointer (&+ packet 16)))
@@ -348,9 +348,10 @@
(set! (-> vec y) (-> *math-camera* fog-min))
(set! (-> vec z) (-> *math-camera* fog-max))
)
(charp<-string (the (pointer uint8) (&-> data-ptr 14)) (symbol->string (-> lev nickname)))
(set! (-> data-ptr 14) (-> (math-camera-pos) quad))
(charp<-string (the (pointer uint8) (&-> data-ptr 15)) (symbol->string (-> lev nickname)))
)
(&+! (-> dma-buf base) (* 16 15))
(&+! (-> dma-buf base) (* 16 16))
)
;;;;;;;;;;;;;;;;;;;;;
+1 -8
View File
@@ -1047,10 +1047,7 @@
"Is arg0 visible? Note that this will return #f if the visibility data is not loaded."
;; note : pc port added option to show every actor regardless
(#when PC_PORT
(cond
((actor-force-visible? *pc-settings*) #t)
(else
(with-pc (if (-> *pc-settings* force-actors?) (return #t)))
;; check the vis bits!
(let* (;; lwu v1, 388(a0)
@@ -1072,10 +1069,6 @@
;; movz v0, s7, v1 if (csw >= 0) result = false
;;(format 0 "vis check ~D ~X ~X ~A~%" arg0 vis-byte check-sign-word (>= check-sign-word 0))
(< check-sign-word 0)
)
)
)
)
)
+3 -3
View File
@@ -382,7 +382,7 @@
(logtest? (-> *display* real-actual-frame-counter) 4)
)
))
(with-dma-buffer-add-bucket ((s5-0 (-> (current-frame) global-buf)) (bucket-id debug-draw0))
(with-dma-buffer-add-bucket ((s5-0 (-> (current-frame) global-buf)) (bucket-id debug))
(dma-buffer-add-gs-set-flusha s5-0
(zbuf-1 (new 'static 'gs-zbuf :zbp #x1c0 :psm (gs-psm ct24)))
(test-1 (new 'static 'gs-test :ate #x1 :atst (gs-atest greater-equal) :aref #x26 :zte #x1 :ztst (gs-ztest greater-equal)))
@@ -501,7 +501,7 @@
(set! (-> s2-0 y) (-> s5-0 top-plane))
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
s2-0
8192.0
(new 'static 'rgba :a #x80)
@@ -510,7 +510,7 @@
(set! (-> s2-0 y) (-> s5-0 bot-plane))
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
s2-0
8192.0
(new 'static 'rgba :a #x80)
+17 -17
View File
@@ -190,7 +190,7 @@
)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! gp-0 s5-0 (the-as vector (-> s2-0 (-> arg0 vertex 0))))
(vector+! s4-0 s5-0 (the-as vector (-> s2-0 (-> arg0 vertex 1))))
arg1
@@ -199,7 +199,7 @@
)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! gp-0 s5-0 (the-as vector (-> s2-0 (-> arg0 vertex 1))))
(vector+! s4-0 s5-0 (the-as vector (-> s2-0 (-> arg0 vertex 2))))
arg1
@@ -208,7 +208,7 @@
)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! gp-0 s5-0 (the-as vector (-> s2-0 (-> arg0 vertex 2))))
(vector+! s4-0 s5-0 (the-as vector (-> s2-0 (-> arg0 vertex 0))))
arg1
@@ -1630,18 +1630,18 @@
(set! (-> s5-0 debug-time) (the-as uint (-> *display* actual-frame-counter)))
(add-debug-sphere
(logtest? (-> obj flags) (nav-control-flags navcf1))
(bucket-id debug-draw0)
(bucket-id debug)
(-> s5-0 bounds)
(-> s5-0 bounds w)
(new 'static 'rgba :r #xff :g #xff :a #x20)
)
(add-debug-vector #t (bucket-id debug-draw1) (-> s5-0 origin) *x-vector* (meters 1.0) *color-red*)
(add-debug-vector #t (bucket-id debug-draw1) (-> s5-0 origin) *z-vector* (meters 1.0) *color-blue*)
(add-debug-vector #t (bucket-id debug-no-zbuf) (-> s5-0 origin) *x-vector* (meters 1.0) *color-red*)
(add-debug-vector #t (bucket-id debug-no-zbuf) (-> s5-0 origin) *z-vector* (meters 1.0) *color-blue*)
(when (logtest? (-> obj flags) (nav-control-flags navcf2))
(dotimes (s3-0 (-> s5-0 vertex-count))
(add-debug-x
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! s4-0 (-> s5-0 origin) (the-as vector (-> s5-0 vertex s3-0)))
*color-green*
)
@@ -1677,9 +1677,9 @@
(set! (-> s0-0 x) (- (-> a0-15 x) (-> v1-20 x)))
(set! (-> s0-0 y) (+ (-> a0-15 y) (-> v1-20 y)))
(set! (-> s0-0 z) (+ (-> a0-15 z) (-> v1-20 z)))
(add-debug-line #t (bucket-id debug-draw1) sv-192 s2-0 (the-as rgba sv-208) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-draw1) s2-0 s1-0 (the-as rgba sv-208) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-draw1) s1-0 s0-0 (the-as rgba sv-208) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-no-zbuf) sv-192 s2-0 (the-as rgba sv-208) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-no-zbuf) s2-0 s1-0 (the-as rgba sv-208) #f (the-as rgba -1))
(add-debug-line #t (bucket-id debug-no-zbuf) s1-0 s0-0 (the-as rgba sv-208) #f (the-as rgba -1))
(let ((t9-7 add-debug-line)
(a0-19 #t)
(a1-13 68)
@@ -1755,7 +1755,7 @@
(when (logtest? (-> obj flags) (nav-control-flags navcf7))
(dotimes (s3-3 (the-as int (-> s5-0 static-sphere-count)))
(let ((s2-2 (-> s5-0 static-sphere s3-3)))
(add-debug-sphere #t (bucket-id debug-draw0) (the-as vector s2-2) (-> s2-2 trans w) *color-blue*)
(add-debug-sphere #t (bucket-id debug) (the-as vector s2-2) (-> s2-2 trans w) *color-blue*)
(let ((s1-2 add-debug-text-3d)
(s0-2 #t)
)
@@ -1793,7 +1793,7 @@
)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! a2-22 v1-80 (the-as vector (-> obj portal 0)))
(vector+! a3-13 v1-80 (the-as vector (-> obj portal 1)))
(new 'static 'rgba :r #xff :g #x80 :b #x40 :a #x80)
@@ -1804,7 +1804,7 @@
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> obj shape trans)
(-> obj travel)
(meters 0.00024414062)
@@ -1812,7 +1812,7 @@
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! (new 'stack-no-clear 'vector) (-> obj shape trans) (new 'static 'vector :y 4096.0 :w 1.0))
(-> obj old-travel)
(meters 0.00024414062)
@@ -1820,7 +1820,7 @@
)
(add-debug-x
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(vector+! (new 'stack-no-clear 'vector) (-> obj shape trans) (-> obj travel))
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
@@ -1828,7 +1828,7 @@
(when (logtest? (-> obj flags) (nav-control-flags navcf7))
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> obj shape root-prim prim-core))
(-> obj shape nav-radius)
(new 'static 'rgba :g #xff :b #xff :a #x20)
@@ -1838,7 +1838,7 @@
(vector+! s4-0 (-> s5-0 origin) (the-as vector (&-> v1-95 x)))
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
s4-0
(- (-> v1-95 w) (-> obj shape nav-radius))
(new 'static 'rgba :g #xff :b #xff :a #x20)
+4 -4
View File
@@ -35,7 +35,7 @@
(if (and (logtest? (-> obj flags) (path-control-flag draw-line)) (< s5-1 (+ (-> obj curve num-cverts) -1)))
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
s4-1
(-> obj cverts (+ s5-1 1))
(new 'static 'rgba :r #xff :g #x80 :a #x80)
@@ -44,7 +44,7 @@
)
)
(if (logtest? (-> obj flags) (path-control-flag draw-point))
(add-debug-x #t (bucket-id debug-draw1) s4-1 (new 'static 'rgba :r #xff :a #x80))
(add-debug-x #t (bucket-id debug-no-zbuf) s4-1 (new 'static 'rgba :r #xff :a #x80))
)
(when (logtest? (-> obj flags) (path-control-flag draw-text))
(let ((s3-1 add-debug-text-3d)
@@ -292,7 +292,7 @@
(if (and (logtest? (-> obj flags) (path-control-flag draw-line)) (> (-> obj curve num-cverts) 0))
(add-debug-curve2
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as curve (&-> obj cverts))
(new 'static 'rgba :r #xff :g #x80 :a #x80)
#f
@@ -301,7 +301,7 @@
(dotimes (s5-1 (-> obj curve num-cverts))
(let ((s4-1 (-> obj cverts s5-1)))
(if (logtest? (-> obj flags) (path-control-flag draw-point))
(add-debug-x #t (bucket-id debug-draw1) s4-1 (new 'static 'rgba :r #xff :a #x80))
(add-debug-x #t (bucket-id debug-no-zbuf) s4-1 (new 'static 'rgba :r #xff :a #x80))
)
(when (logtest? (-> obj flags) (path-control-flag draw-text))
(let ((s3-1 add-debug-text-3d)
+1 -1
View File
@@ -97,7 +97,7 @@
)
(add-debug-line
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
prev-pos
pos
(new 'static 'rgba :r #xff :a #x80)
@@ -925,7 +925,7 @@
)
(add-debug-sphere
*display-actor-vis*
(bucket-id debug-draw0)
(bucket-id debug)
gp-1
(-> gp-1 w)
(new 'static 'rgba :g #xff :a #x80)
+3 -3
View File
@@ -70,7 +70,7 @@
(defun-debug joint-mod-debug-draw ((mod joint-mod))
"Draw a frame at the bone."
;; I believe this draws a set of coordinate axes that represent the transformation matrix.
(add-debug-matrix #t (bucket-id debug-draw1) (-> mod joint bone transform))
(add-debug-matrix #t (bucket-id debug-no-zbuf) (-> mod joint bone transform))
(none)
)
@@ -425,7 +425,7 @@
(if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0))
(add-debug-text-sphere
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 target)
819.2
"look"
@@ -559,7 +559,7 @@
(if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0))
(add-debug-text-sphere
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 target)
819.2
"look"
+22 -22
View File
@@ -93,7 +93,7 @@
(let ((s2-0 (-> arg0 history-data (logand (+ (-> arg0 unknown-halfword00) s4-0) 127))))
(add-debug-line
(logtest? s5-0 2)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> v1-19 trans)
(-> s2-0 trans)
(the-as rgba (+ #xffff00 (shl s4-0 24)))
@@ -102,7 +102,7 @@
)
(add-debug-vector
(logtest? s5-0 4)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s2-0 trans)
(-> s2-0 transv)
(meters 0.000024414063)
@@ -111,7 +111,7 @@
(when (zero? (logand (-> s2-0 status) 256))
(add-debug-line
(logtest? s5-0 1)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s1-0 intersect)
(-> s2-0 intersect)
(the-as rgba (+ #xffffff (shl s4-0 24)))
@@ -124,7 +124,7 @@
)
(add-debug-vector
(logtest? s5-0 32)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s2-0 intersect)
(-> s2-0 surface-normal)
(meters 1.0)
@@ -132,7 +132,7 @@
)
(add-debug-vector
(logtest? s5-0 16)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s2-0 intersect)
(-> s2-0 local-normal)
(meters 1.0)
@@ -141,7 +141,7 @@
)
(add-debug-vector
(logtest? s5-0 8)
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> s2-0 trans)
(-> s2-0 transv-out)
(meters 0.000024414063)
@@ -633,7 +633,7 @@
(vector+! gp-1 gp-1 (-> self control trans))
(add-debug-text-sphere
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
gp-1
819.2
"target"
@@ -809,7 +809,7 @@
(vector+! gp-1 gp-1 (-> self control trans))
(add-debug-text-sphere
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
gp-1
819.2
"ltransv"
@@ -820,7 +820,7 @@
(vector+! gp-1 gp-1 (-> self control trans))
(add-debug-text-sphere
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
gp-1
819.2
"btransv"
@@ -934,7 +934,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
gp-0
(meters 2.0)
@@ -942,7 +942,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
s5-0
(meters 2.0)
@@ -951,7 +951,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
(-> self control unknown-matrix01 vector 2)
(meters 2.0)
@@ -1196,7 +1196,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
(-> self control ground-poly-normal)
(meters 2.0)
@@ -1204,7 +1204,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
(-> self control local-normal)
(meters 2.0)
@@ -1212,7 +1212,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
(-> self control unknown-dynamics00 gravity-normal)
(meters 2.5)
@@ -1220,7 +1220,7 @@
)
(add-debug-vector
*display-target-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self control trans)
(-> self control dynam gravity-normal)
(meters 3.0)
@@ -1344,7 +1344,7 @@
(when *display-edge-collision-marks*
(add-debug-vector
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> (the-as swingpole s4-0) root trans)
(the-as vector (&-> s4-0 stack 16))
(meters 3.0)
@@ -1352,21 +1352,21 @@
)
(add-debug-sphere
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> (the-as swingpole s4-0) root trans)
(-> (the-as swingpole s4-0) range)
(new 'static 'rgba :r #xff :g #xff :a #x80)
)
(add-debug-sphere
#t
(bucket-id debug-draw0)
(bucket-id debug)
(-> self control unknown-vector90)
819.2
(new 'static 'rgba :r #xff :a #x80)
)
(add-debug-sphere #t (bucket-id debug-draw1) s3-0 819.2 (new 'static 'rgba :g #xff :a #x80))
(add-debug-sphere #t (bucket-id debug-draw1) s2-0 819.2 (new 'static 'rgba :g #xff :b #x40 :a #x80))
(add-debug-sphere #t (bucket-id debug-draw1) s5-0 819.2 (new 'static 'rgba :b #xff :a #x80))
(add-debug-sphere #t (bucket-id debug-no-zbuf) s3-0 819.2 (new 'static 'rgba :g #xff :a #x80))
(add-debug-sphere #t (bucket-id debug-no-zbuf) s2-0 819.2 (new 'static 'rgba :g #xff :b #x40 :a #x80))
(add-debug-sphere #t (bucket-id debug-no-zbuf) s5-0 819.2 (new 'static 'rgba :b #xff :a #x80))
)
)
(let ((s4-2 (vector-! (new-stack-vector0) s5-0 (-> self control unknown-vector90))))
+3 -3
View File
@@ -182,21 +182,21 @@
(debug-print-channels (-> self skel) (the-as symbol *stdcon*))
(add-debug-sphere
*display-sidekick-stats*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self parent-override 0 control unknown-cspace10 parent bone transform vector 3)
409.6
(new 'static 'rgba :g #xff :a #x80)
)
(add-debug-sphere
*display-sidekick-stats*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self node-list data 3 bone transform vector 3)
409.6
(new 'static 'rgba :r #xff :g #xff :a #x80)
)
(add-debug-sphere
*display-sidekick-stats*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> self draw origin)
409.6
(new 'static 'rgba :r #xff :g #x80 :a #x80)
+4 -4
View File
@@ -1166,7 +1166,7 @@
((logtest? (-> gp-0 state-flags) 1024)
(add-debug-sphere
*display-camera-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 alt-cam-pos)
819.2
(new 'static 'rgba :r #xff :a #x80)
@@ -1176,7 +1176,7 @@
((logtest? #x20000 (-> gp-0 state-flags))
(add-debug-sphere
*display-camera-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 alt-cam-pos)
819.2
(new 'static 'rgba :r #xff :a #x80)
@@ -1189,7 +1189,7 @@
(set! (-> (the-as vector s5-0) y) (fmax (-> (the-as vector s5-0) y) (-> gp-0 alt-cam-pos y)))
(add-debug-sphere
*display-camera-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector s5-0)
819.2
(new 'static 'rgba :r #xff :a #x80)
@@ -1200,7 +1200,7 @@
(else
(add-debug-sphere
*display-camera-marks*
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (&-> (-> gp-0 control) unknown-qword00))
819.2
(new 'static 'rgba :r #xff :a #x80)
+5 -5
View File
@@ -170,7 +170,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-7)
)
@@ -565,7 +565,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s4-1
(the-as (pointer dma-tag) a3-12)
)
@@ -789,7 +789,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-7)
)
@@ -1192,7 +1192,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-7)
)
@@ -1473,7 +1473,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-7)
)
+2 -2
View File
@@ -1776,7 +1776,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s4-0
(the-as (pointer dma-tag) a3-4)
)
@@ -1885,7 +1885,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
s4-4
(the-as (pointer dma-tag) a3-9)
)
@@ -154,7 +154,7 @@
(define *options-remap* (new 'static 'boxed-array :type (array game-option) :length 0 :allocated-length (#if (not PC_PORT) 35 50)))
;; TODO probably an enum.
;; maps "levels" to the appropriate offset in *level-task-data*
;; maps level-info indices to the appropriate offset in *level-task-data*
(define *level-task-data-remap*
(new 'static 'boxed-array :type int32 :length 23 :allocated-length 23
0
+4 -4
View File
@@ -2392,7 +2392,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-4)
)
@@ -2414,7 +2414,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-1
(the-as (pointer dma-tag) a3-6)
)
@@ -2436,7 +2436,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-2
(the-as (pointer dma-tag) a3-8)
)
@@ -2458,7 +2458,7 @@
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
(bucket-id debug)
gp-3
(the-as (pointer dma-tag) a3-10)
)
+4 -4
View File
@@ -191,13 +191,16 @@
(misty-daxter-hit-lurkers-not-mines #x27f)
(sidekick-speech-hint-crate-darkeco1 #x281)
(sidekick-speech-crate-steel-break1 #x283)
(sidekick-speech-hint-crate-iron #x284)
(sidekick-speech-hint-crate-steel #x285)
(beach-collectors-unblocked #x288)
(jungleb-eco-vents-opened #x289)
(misty-stopped-lurkers-at-silo #x28a)
(misty-stopped-balloon-lurkers #x28b)
(jungleb-eco-vents-opened #x289)
(sidekick-speech-crate-steel-break2 #x28e)
(sidekick-speech-hint-crate-darkeco2 #x28f)
@@ -216,13 +219,10 @@
(misty-teetertotter-bonk-dax-tutorial #x2a4)
(sidekick-hint-misty-get-red-eco #x2a5)
(red-eco-tutorial #x2a6)
(daxter-blue-eco-plat-tutorial #x2a7)
(fish? #x2a9)
(misty-bone-bridge-hint #x2aa)
(beach-grottopole-increment #x2af)
+186 -231
View File
@@ -233,9 +233,10 @@
)
(defun load-level-text-files ((arg0 int))
"If needed, load text"
"Load the text 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. These flags are not yet understood.
(if (or *level-text-file-load-flag* (>= arg0 0))
(load-game-text-info "common" '*common-text* *common-text-heap*)
)
@@ -323,28 +324,28 @@
(set-vector! s5-0 128 128 128 128)
(add-debug-line2d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(the-as vector (-> gp-0 vector))
(-> gp-0 vector 1)
(the-as vector s5-0)
)
(add-debug-line2d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 vector 1)
(-> gp-0 vector 2)
(the-as vector s5-0)
)
(add-debug-line2d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 vector 2)
(-> gp-0 vector 3)
(the-as vector s5-0)
)
(add-debug-line2d
#t
(bucket-id debug-draw1)
(bucket-id debug-no-zbuf)
(-> gp-0 vector 3)
(the-as vector (-> gp-0 vector))
(the-as vector s5-0)
@@ -399,7 +400,7 @@
(none)
)
(defun print-game-text ((str string) (font-ctxt font-context) (alpha symbol) (offset-thing int) (arg4 int))
(defun print-game-text ((str string) (font-ctxt font-context) (opaque 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)
@@ -424,238 +425,192 @@
(sv-208 symbol)
(sv-212 symbol)
)
(let
((gp-0
(new
'stack
'font-context
*font-default-matrix*
(the int (-> font-ctxt origin x))
(the int (-> font-ctxt origin y))
0.0
(font-color default)
(font-flags shadow kerning)
)
)
)
(when (< 0.1 (-> font-ctxt scale))
(set! sv-112 (-> font-ctxt mat vector 0 x))
(set! sv-116 (-> font-ctxt mat vector 1 y))
(set! sv-120 (-> *video-parms* relative-x-scale))
(set! sv-124 (-> *video-parms* relative-y-scale))
(set! sv-128 (-> *video-parms* relative-x-scale-reciprical))
(set! sv-132 (-> *video-parms* relative-y-scale-reciprical))
(set! sv-136 (-> font-ctxt scale))
(set! (-> gp-0 origin z) (-> font-ctxt origin z))
(set! (-> gp-0 flags) (-> font-ctxt flags))
(set! (-> gp-0 color) (-> font-ctxt color))
(set! (-> gp-0 scale) sv-136)
(when (logtest? (-> gp-0 flags) (font-flags left))
(logclear! (-> gp-0 flags) (font-flags left))
(let ((f30-0 (-> gp-0 width))
(f28-0 (-> gp-0 height))
)
(set! (-> gp-0 width) (-> font-ctxt width))
(set! (-> gp-0 height) (-> font-ctxt height))
(+!
(-> gp-0 origin y)
(the
float
(the
int
(* 0.5 (- (-> gp-0 height) (print-game-text str gp-0 #t 128 22)))
)
)
)
(set! (-> gp-0 width) f30-0)
(set! (-> gp-0 height) f28-0)
)
)
(set! (-> gp-0 mat vector 0 x) (* (-> gp-0 mat vector 0 x) sv-136))
(set! (-> gp-0 mat vector 1 y) (* (-> gp-0 mat vector 1 y) sv-136))
(set!
(-> *video-parms* relative-x-scale)
(* (-> *video-parms* relative-x-scale) sv-136)
)
(set!
(-> *video-parms* relative-y-scale)
(* (-> *video-parms* relative-y-scale) sv-136)
)
(set!
(-> *video-parms* relative-x-scale-reciprical)
(/ 1.0 (-> *video-parms* relative-x-scale))
)
(set! (-> *video-parms* relative-y-scale-reciprical) (/ 1.0 sv-136))
(set! sv-140 (-> str data))
(set! sv-144 (-> gp-0 origin x))
(set! sv-148 (-> gp-0 origin x))
(set! sv-152 (+ (-> gp-0 origin x) (-> font-ctxt width)))
(set! sv-156 (+ (-> gp-0 origin y) (-> font-ctxt height)))
(set!
sv-160
(* (get-string-length " " gp-0) (-> *video-parms* relative-x-scale))
)
(set! sv-164 (* (if (logtest? (-> gp-0 flags) 32)
(the float arg4)
14.0
)
sv-136
)
)
(set! sv-168 0)
(if (logtest? (-> gp-0 flags) 4)
(+! (-> gp-0 origin x) (* 0.5 (-> font-ctxt width)))
)
(set! sv-176 (the-as int (-> sv-140 0))) ;; char
(set! sv-184 0)
(set! sv-192 0)
(set! sv-200 0)
(set! sv-208 (the-as symbol #f))
(set! sv-212 (the-as symbol #f))
(set! (-> *game-text-line* data 0) (the-as uint 0))
(while
(or (not (and (zero? sv-176) (zero? sv-184) (zero? sv-192)))
(>= sv-156 (-> gp-0 origin y))
)
(cond
((= sv-176 32)
(set! (-> *game-text-word* data sv-184) (the-as uint sv-176))
(set! sv-184 (+ sv-184 1))
(set! sv-208 #t)
)
((zero? sv-176)
(if (zero? sv-184)
(set! sv-212 #t)
(set! sv-208 #t)
)
)
(else
(if (= sv-176 95)
(set! sv-176 32)
)
(set! (-> *game-text-word* data sv-184) (the-as uint sv-176))
(set! sv-184 (+ sv-184 1))
)
)
(when (= sv-208 #t)
(set! (-> *game-text-word* data sv-184) (the-as uint 0))
(let* ((f30-1 sv-144)
(f0-49
(*
(get-string-length *game-text-word* gp-0)
(-> *video-parms* relative-x-scale)
)
(let ((gp-0 (new
'stack
'font-context
*font-default-matrix*
(the int (-> font-ctxt origin x))
(the int (-> font-ctxt origin y))
0.0
(font-color default)
(font-flags shadow kerning)
)
)
(f1-14 (+ f30-1 f0-49))
)
(if (= (-> *game-text-word* data (+ sv-184 -1)) 32)
(set! f1-14 (- f1-14 sv-160))
)
(cond
((< sv-152 f1-14)
(set! sv-144 (+ sv-148 f0-49))
(set! sv-212 #t)
)
(else
(set! sv-144 (+ sv-144 f0-49))
)
(when (< 0.1 (-> font-ctxt scale))
(set! sv-112 (-> font-ctxt mat vector 0 x))
(set! sv-116 (-> font-ctxt mat vector 1 y))
(set! sv-120 (-> *video-parms* relative-x-scale))
(set! sv-124 (-> *video-parms* relative-y-scale))
(set! sv-128 (-> *video-parms* relative-x-scale-reciprical))
(set! sv-132 (-> *video-parms* relative-y-scale-reciprical))
(set! sv-136 (-> font-ctxt scale))
(set! (-> gp-0 origin z) (-> font-ctxt origin z))
(set! (-> gp-0 flags) (-> font-ctxt flags))
(set! (-> gp-0 color) (-> font-ctxt color))
(set! (-> gp-0 scale) sv-136)
(when (logtest? (-> gp-0 flags) (font-flags left))
(logclear! (-> gp-0 flags) (font-flags left))
(let ((f30-0 (-> gp-0 width))
(f28-0 (-> gp-0 height))
)
(set! (-> gp-0 width) (-> font-ctxt width))
(set! (-> gp-0 height) (-> font-ctxt height))
(+! (-> gp-0 origin y)
(the float (the int (* 0.5 (- (-> gp-0 height) (print-game-text str gp-0 #t 128 22)))))
)
(set! (-> gp-0 width) f30-0)
(set! (-> gp-0 height) f28-0)
)
)
)
)
(when (= sv-212 #t)
(when (>= sv-200 (the-as int (-> gp-0 start-line)))
(let ((f30-2 (+ (-> gp-0 origin y) sv-164)))
(when (>= sv-156 f30-2)
(when (= (-> *game-text-line* data (+ sv-192 -1)) 32)
(set! (-> *game-text-line* data (+ sv-192 -1)) (the-as uint 0))
(when
(and
(= (-> *game-text-line* data (+ sv-192 -5)) 126)
(= (-> *game-text-line* data (+ sv-192 -2)) 72)
(set! (-> gp-0 mat vector 0 x) (* (-> gp-0 mat vector 0 x) sv-136))
(set! (-> gp-0 mat vector 1 y) (* (-> gp-0 mat vector 1 y) sv-136))
(set! (-> *video-parms* relative-x-scale) (* (-> *video-parms* relative-x-scale) sv-136))
(set! (-> *video-parms* relative-y-scale) (* (-> *video-parms* relative-y-scale) sv-136))
(set! (-> *video-parms* relative-x-scale-reciprical) (/ 1.0 (-> *video-parms* relative-x-scale)))
(set! (-> *video-parms* relative-y-scale-reciprical) (/ 1.0 sv-136))
(set! sv-140 (-> str data))
(set! sv-144 (-> gp-0 origin x))
(set! sv-148 (-> gp-0 origin x))
(set! sv-152 (+ (-> gp-0 origin x) (-> font-ctxt width)))
(set! sv-156 (+ (-> gp-0 origin y) (-> font-ctxt height)))
(set! sv-160 (* (get-string-length " " gp-0) (-> *video-parms* relative-x-scale)))
(set! sv-164 (* (if (logtest? (-> gp-0 flags) (font-flags large))
(the float line-height)
14.0
)
sv-136
)
)
(set! (-> *game-text-line* data (+ sv-192 -5)) (the-as uint 0))
0
)
(set! sv-168 0)
(if (logtest? (-> gp-0 flags) (font-flags middle))
(+! (-> gp-0 origin x) (* 0.5 (-> font-ctxt width)))
)
)
(when
(and
(= (-> *game-text-line* data (+ sv-192 -4)) 126)
(= (-> *game-text-line* data (+ sv-192 -1)) 72)
)
(set! (-> *game-text-line* data (+ sv-192 -4)) (the-as uint 0))
0
)
(if (nonzero? (-> *game-text-line* data 0))
(set! sv-168 (+ sv-168 1))
)
(when (not alpha)
(let*
((s1-1
(-> *display* frames (-> *display* on-screen) frame global-buf)
)
(s2-1 (-> s1-1 base))
)
(set-font-color-alpha (-> font-ctxt color) offset-thing)
(draw-string *game-text-line* s1-1 gp-0)
(set-font-color-alpha (-> font-ctxt color) 128)
(set! (-> gp-0 color) (-> *font-work* last-color))
(let ((a3-3 (-> s1-1 base)))
(let ((v1-127 (the-as object (-> s1-1 base))))
(set!
(-> (the-as dma-packet v1-127) dma)
(new 'static 'dma-tag :id (dma-tag-id next))
)
(set! (-> (the-as dma-packet v1-127) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-127) vif1) (new 'static 'vif-tag))
(set! (-> s1-1 base) (&+ (the-as pointer v1-127) 16))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug-draw0)
s2-1
(the-as (pointer dma-tag) a3-3)
)
)
)
)
(set! (-> gp-0 origin y) f30-2)
)
)
(set! sv-200 (+ sv-200 1))
(set! (-> *game-text-line* data 0) (the-as uint 0))
(set! sv-192 0)
(set! sv-212 (the-as symbol #f))
)
(when (= sv-208 #t)
(copy-charp<-charp
(&-> *game-text-line* data sv-192)
(-> *game-text-word* data)
)
(set! sv-192 (+ sv-192 sv-184))
(set! sv-184 0)
(set! sv-208 (the-as symbol #f))
)
(when (nonzero? sv-176)
(set! sv-140 (&-> sv-140 1))
(set! sv-176 (the-as int (-> sv-140 0)))
(set! sv-184 0)
(set! sv-192 0)
(set! sv-200 0)
(set! sv-208 (the-as symbol #f))
(set! sv-212 (the-as symbol #f))
(set! (-> *game-text-line* data 0) (the-as uint 0))
(while (or (not (and (zero? sv-176) (zero? sv-184) (zero? sv-192))) (>= sv-156 (-> gp-0 origin y)))
(cond
((= sv-176 32)
(set! (-> *game-text-word* data sv-184) (the-as uint sv-176))
(set! sv-184 (+ sv-184 1))
(set! sv-208 #t)
)
((zero? sv-176)
(if (zero? sv-184)
(set! sv-212 #t)
(set! sv-208 #t)
)
)
(else
(if (= sv-176 95)
(set! sv-176 32)
)
(set! (-> *game-text-word* data sv-184) (the-as uint sv-176))
(set! sv-184 (+ sv-184 1))
)
)
(when (= sv-208 #t)
(set! (-> *game-text-word* data sv-184) (the-as uint 0))
(let* ((f30-1 sv-144)
(f0-49 (* (get-string-length *game-text-word* gp-0) (-> *video-parms* relative-x-scale)))
(f1-14 (+ f30-1 f0-49))
)
(if (= (-> *game-text-word* data (+ sv-184 -1)) 32)
(set! f1-14 (- f1-14 sv-160))
)
(cond
((< sv-152 f1-14)
(set! sv-144 (+ sv-148 f0-49))
(set! sv-212 #t)
)
(else
(set! sv-144 (+ sv-144 f0-49))
)
)
)
)
(when (= sv-212 #t)
(when (>= sv-200 (the-as int (-> gp-0 start-line)))
(let ((f30-2 (+ (-> gp-0 origin y) sv-164)))
(when (>= sv-156 f30-2)
(when (= (-> *game-text-line* data (+ sv-192 -1)) 32)
(set! (-> *game-text-line* data (+ sv-192 -1)) (the-as uint 0))
(when (and (= (-> *game-text-line* data (+ sv-192 -5)) 126) (= (-> *game-text-line* data (+ sv-192 -2)) 72))
(set! (-> *game-text-line* data (+ sv-192 -5)) (the-as uint 0))
0
)
)
)
(when (and (= (-> *game-text-line* data (+ sv-192 -4)) 126) (= (-> *game-text-line* data (+ sv-192 -1)) 72))
(set! (-> *game-text-line* data (+ sv-192 -4)) (the-as uint 0))
0
)
(if (nonzero? (-> *game-text-line* data 0))
(set! sv-168 (+ sv-168 1))
)
(when (not opaque)
(let* ((s1-1 (-> *display* frames (-> *display* on-screen) frame global-buf))
(s2-1 (-> s1-1 base))
)
(set-font-color-alpha (-> font-ctxt color) alpha)
(draw-string *game-text-line* s1-1 gp-0)
(set-font-color-alpha (-> font-ctxt color) 128)
(set! (-> gp-0 color) (-> *font-work* last-color))
(let ((a3-3 (-> s1-1 base)))
(let ((v1-127 (the-as object (-> s1-1 base))))
(set! (-> (the-as dma-packet v1-127) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
(set! (-> (the-as dma-packet v1-127) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-127) vif1) (new 'static 'vif-tag))
(set! (-> s1-1 base) (&+ (the-as pointer v1-127) 16))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug)
s2-1
(the-as (pointer dma-tag) a3-3)
)
)
)
)
(set! (-> gp-0 origin y) f30-2)
)
)
(set! sv-200 (+ sv-200 1))
(set! (-> *game-text-line* data 0) (the-as uint 0))
(set! sv-192 0)
(set! sv-212 (the-as symbol #f))
)
(when (= sv-208 #t)
(copy-charp<-charp (&-> *game-text-line* data sv-192) (-> *game-text-word* data))
(set! sv-192 (+ sv-192 sv-184))
(set! sv-184 0)
(set! sv-208 (the-as symbol #f))
)
(when (nonzero? sv-176)
(set! sv-140 (&-> sv-140 1))
(set! sv-176 (the-as int (-> sv-140 0)))
)
)
(set! (-> gp-0 mat vector 0 x) sv-112)
(set! (-> gp-0 mat vector 1 y) sv-116)
(set! (-> *video-parms* relative-x-scale) sv-120)
(set! (-> *video-parms* relative-y-scale) sv-124)
(set! (-> *video-parms* relative-x-scale-reciprical) sv-128)
(set! (-> *video-parms* relative-y-scale-reciprical) sv-132)
(with-pc
(if (and *debug-segment* (-> *pc-settings* display-text-box))
(draw-debug-text-box font-ctxt)))
(if (> sv-168 0)
(* sv-164 (the float sv-168))
0.0
)
)
)
(set! (-> gp-0 mat vector 0 x) sv-112)
(set! (-> gp-0 mat vector 1 y) sv-116)
(set! (-> *video-parms* relative-x-scale) sv-120)
(set! (-> *video-parms* relative-y-scale) sv-124)
(set! (-> *video-parms* relative-x-scale-reciprical) sv-128)
(set! (-> *video-parms* relative-y-scale-reciprical) sv-132)
(with-pc
(if (and *debug-segment* (-> *pc-settings* display-text-box))
(draw-debug-text-box font-ctxt)))
(if (> sv-168 0)
(* sv-164 (the float sv-168))
0.0
)
)
)
)
(defun disable-level-text-file-loading ()
+2 -21
View File
@@ -356,24 +356,6 @@
"out/iso/GAME.CGO"
)
;;;;;;;;;;;;;;;;;;;;;
;; hub1 Group
;;;;;;;;;;;;;;;;;;;;;
;; the hub1 group is a group of files required to play the first hub (village1, jungle, beach, misty, training, firecanyon)
(group "hub1"
"out/iso/0COMMON.TXT"
"out/iso/0SUBTIT.TXT"
"out/iso/KERNEL.CGO"
"out/iso/GAME.CGO"
"out/iso/VI1.DGO"
"out/iso/TRA.DGO"
"out/iso/FIC.DGO"
"out/iso/JUN.DGO"
"out/iso/BEA.DGO"
"out/iso/MIS.DGO"
)
;;;;;;;;;;;;;;;;;;;;;;;;
;; Common Level Objects
;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1929,8 +1911,7 @@
)
(group-list "text"
`(
"out/iso/0COMMON.TXT"
`("out/iso/0COMMON.TXT"
"out/iso/0SUBTIT.TXT"
)
)
@@ -1939,7 +1920,7 @@
;; Custom or Modified Code
(goal-src "pc/pckernel-h.gc" "dma-disasm")
(goal-src "pc/pckernel.gc" "settings")
(goal-src "pc/subtitle.gc" "text")
(goal-src "pc/subtitle.gc" "text" "pckernel" "hint-control" "loader-h" "gsound" "ambient")
(goal-src "pc/progress-pc.gc" "progress" "pckernel")

Some files were not shown because too many files have changed in this diff Show More