[decomp] make defpart and defpartgroup work in jak 2 (#1947)

This commit is contained in:
ManDude 2022-10-09 17:53:44 +01:00 committed by GitHub
parent 1d1ea907c9
commit af5009a29e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
66 changed files with 5567 additions and 376 deletions

View file

@ -77,7 +77,17 @@ class Vector {
return true;
}
bool operator==(const T other) const {
for (int i = 0; i < Size; i++) {
if (m_data[i] != other) {
return false;
}
}
return true;
}
bool operator!=(const Vector<T, Size>& other) const { return !((*this) == other); }
bool operator!=(const T other) const { return !((*this) == other); }
const T length() const { return std::sqrt(squared_length()); }

View file

@ -29,6 +29,14 @@ std::string meters_to_string(float value, bool append_trailing_decimal) {
return float_to_string(value / METER_LENGTH, append_trailing_decimal);
}
/*!
* Wrapper around float_to_string, for printing degrees. Unlike float_to_string, it does not append
* decimals by default.
*/
std::string degrees_to_string(float value, bool append_trailing_decimal) {
return float_to_string(value / DEGREES_LENGTH, append_trailing_decimal);
}
/*!
* Convert a fixed point value to a float. Fixed point values usually end up with strange numbers
* that were definitely not what was written when we do a naive conversion. This function

View file

@ -8,5 +8,6 @@ float fixed_point_to_float(s64 value, s64 scale);
std::string fixed_point_to_string(s64 value, s64 scale, bool append_trailing_decimal = false);
std::string float_to_string(float value, bool append_trailing_decimal = true);
std::string meters_to_string(float value, bool append_trailing_decimal = false);
std::string degrees_to_string(float value, bool append_trailing_decimal = false);
std::string seconds_to_string(s64 value, bool append_trailing_decimal = false);
int float_to_cstr(float value, char* buffer, bool append_trailing_decimal = true);

View file

@ -2481,11 +2481,12 @@ void DecompiledDataElement::get_modified_regs(RegSet&) const {}
void DecompiledDataElement::do_decomp(const Env& env, const LinkedObjectFile* file) {
if (m_label_info) {
m_description = decompile_at_label_with_hint(*m_label_info, m_label, env.file->labels,
env.file->words_by_seg, *env.dts, file);
m_description =
decompile_at_label_with_hint(*m_label_info, m_label, env.file->labels,
env.file->words_by_seg, *env.dts, file, env.version);
} else {
m_description = decompile_at_label_guess_type(m_label, env.file->labels, env.file->words_by_seg,
env.dts->ts, file);
env.dts->ts, file, env.version);
}
m_decompiled = true;
}
@ -3095,11 +3096,13 @@ goos::Object DefpartgroupElement::to_form_internal(const Env& env) const {
forms.push_back(pretty_print::to_symbol(fmt::format("defpartgroup {}", name())));
forms.push_back(pretty_print::to_symbol(fmt::format(":id {}", m_group_id)));
if (m_static_info.duration != 3000) {
forms.push_back(pretty_print::to_symbol(fmt::format(":duration {}", m_static_info.duration)));
forms.push_back(pretty_print::to_symbol(
fmt::format(":duration (seconds {})", seconds_to_string(m_static_info.duration))));
}
if (m_static_info.linger != 1500) {
forms.push_back(
pretty_print::to_symbol(fmt::format(":linger-duration {}", m_static_info.linger)));
// 5 seconds is default
forms.push_back(pretty_print::to_symbol(
fmt::format(":linger-duration (seconds {})", seconds_to_string(m_static_info.linger))));
}
if (m_static_info.flags != 0) {
auto things = decompile_bitfield_enum_from_int(TypeSpec("sp-group-flag"), env.dts->ts,
@ -3118,6 +3121,21 @@ goos::Object DefpartgroupElement::to_form_internal(const Env& env) const {
meters_to_string(m_static_info.bounds.y()), meters_to_string(m_static_info.bounds.z()),
meters_to_string(m_static_info.bounds.w()))));
if (env.version != GameVersion::Jak1) {
// jak 2 stuff.
if (m_static_info.rot != 0) {
forms.push_back(pretty_print::to_symbol(fmt::format(
":rotate ((degrees {}) (degrees {}) (degrees {}))",
meters_to_string(m_static_info.rot.x()), meters_to_string(m_static_info.rot.y()),
meters_to_string(m_static_info.rot.z()))));
}
if (m_static_info.scale != 1) {
forms.push_back(pretty_print::to_symbol(fmt::format(
":scale ({} {} {})", float_to_string(m_static_info.rot.x()),
float_to_string(m_static_info.rot.y()), float_to_string(m_static_info.rot.z()))));
}
}
std::vector<goos::Object> item_forms;
for (const auto& e : m_static_info.elts) {
s32 launcher = e.part_id;
@ -3204,12 +3222,11 @@ goos::Object DefpartElement::to_form_internal(const Env& env) const {
std::vector<goos::Object> item_forms;
for (const auto& e : m_static_info.fields) {
if (e.field_id == 67) {
if (e.is_sp_end(env.version)) {
// sp-end
break;
}
ASSERT(env.version == GameVersion::Jak1); // need to update enums
item_forms.push_back(decompile_sparticle_field_init(e, env.dts->ts));
item_forms.push_back(decompile_sparticle_field_init(e, env.dts->ts, env.version));
}
if (!item_forms.empty()) {
forms.push_back(pretty_print::to_symbol(":init-specs"));

View file

@ -1721,6 +1721,9 @@ class DefpartgroupElement : public FormElement {
u16 flags;
std::string name;
math::Vector4f bounds;
// added in jak 2
math::Vector3f rot;
math::Vector3f scale;
struct PartGroupItem {
u32 part_id;
@ -1763,6 +1766,18 @@ class DefpartElement : public FormElement {
u16 flags;
std::vector<LinkedWord> data;
goos::Object sound_spec;
bool is_sp_end(GameVersion version) const {
switch (version) {
case GameVersion::Jak1:
return field_id == 67;
case GameVersion::Jak2:
return field_id == 72;
default:
ASSERT_MSG(false, fmt::format("unknown version {} for is_sp_end"));
return false;
}
}
};
std::vector<PartField> fields;
};

View file

@ -1,5 +1,6 @@
#include "find_defpartgroup.h"
#include "common/goos/PrettyPrinter.h"
#include "common/util/BitUtils.h"
#include "decompiler/IR2/Form.h"
#include "decompiler/IR2/GenericElementMatcher.h"
#include "decompiler/ObjectFile/LinkedObjectFile.h"
@ -39,24 +40,24 @@ L81:
L82:
*/
int start_word_idx = (lab.offset / 4) - 1;
int word_idx = (lab.offset / 4) - 1;
auto& words = env.file->words_by_seg.at(lab.target_segment);
auto& first_word = words.at(start_word_idx);
auto& first_word = words.at(word_idx++);
if (first_word.kind() != LinkedWord::TYPE_PTR ||
first_word.symbol_name() != "sparticle-launch-group") {
env.func->warnings.error_and_throw(
"Reference to sparticle-launch-group bad: invalid type pointer");
}
auto& word_1 = words.at(start_word_idx + 1);
auto& word_1 = words.at(word_idx++);
s16 len = word_1.data & 0xffff;
group.duration = (word_1.data >> 16) & 0xffff;
auto& word_2 = words.at(start_word_idx + 2);
auto& word_2 = words.at(word_idx++);
group.linger = word_2.data & 0xffff;
group.flags = (word_2.data >> 16) & 0xffff;
auto& string_word = words.at(start_word_idx + 3);
auto& string_word = words.at(word_idx++);
if (string_word.kind() != LinkedWord::PTR) {
env.func->warnings.error_and_throw(
"Reference to sparticle-launch-group bad: invalid name label");
@ -64,7 +65,7 @@ L82:
group.name = env.file->get_goal_string_by_label(
env.file->get_label_by_name(env.file->get_label_name(string_word.label_id())));
auto& array_word = words.at(start_word_idx + 4);
auto& array_word = words.at(word_idx++);
if (array_word.kind() != LinkedWord::PTR) {
env.func->warnings.error_and_throw(
"Reference to sparticle-launch-group bad: invalid array label");
@ -87,13 +88,34 @@ L82:
item.binding = array_words.at(item_idx + 6).data;
}
if (env.version != GameVersion::Jak1) {
// added fields in jak 2
for (int i = 0; i < 3; i++) {
auto& word = words.at(word_idx++);
if (word.kind() != LinkedWord::PLAIN_DATA) {
env.func->warnings.error_and_throw("Reference to sparticle-launch-group bad: invalid rot");
}
group.rot[i] = *reinterpret_cast<float*>(&word.data);
}
for (int i = 0; i < 3; i++) {
auto& word = words.at(word_idx++);
if (word.kind() != LinkedWord::PLAIN_DATA) {
env.func->warnings.error_and_throw(
"Reference to sparticle-launch-group bad: invalid scale");
}
group.scale[i] = *reinterpret_cast<float*>(&word.data);
}
}
word_idx = align4(word_idx);
for (int i = 0; i < 4; i++) {
auto& word = words.at(start_word_idx + 8 + i);
auto& word = words.at(word_idx + i);
if (word.kind() != LinkedWord::PLAIN_DATA) {
env.func->warnings.error_and_throw("Reference to sparticle-launch-group bad: invalid bounds");
}
group.bounds[i] = *reinterpret_cast<float*>(&word.data);
}
word_idx += 4;
}
void read_static_part_data(DecompiledDataElement* src,
@ -159,7 +181,7 @@ L80:
auto& fld = car(cur_field);
item.sound_spec = cdr(cdr(cdr(cdr(&fld))))->as_pair()->car;
}
if (item.field_id == 67) {
if (item.is_sp_end(env.version)) {
// sp-end
break;
}

View file

@ -24157,20 +24157,6 @@
;; sparticle-launcher ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
(deftype sparticle-launcher (basic)
()
:method-count-assert 11
:size-assert #x10
:flag-assert #xb00000010
;; Failed to read fields.
(:methods
(sparticle-launcher-method-9 () none 9)
(sparticle-launcher-method-10 () none 10)
)
)
|#
(deftype sp-queued-launch-particles (structure)
((sp-system sparticle-system :offset-assert 0) ;; guessed by decompiler
(sp-launcher sparticle-launcher :offset-assert 4) ;; guessed by decompiler

View file

@ -7,7 +7,7 @@
// if you want to filter to only some object names.
// it will make the decompiler much faster.
"allowed_objects": ["mood"],
"allowed_objects": [],
"banned_objects": ["effect-control", "target-util", "ctywide-scenes"],
////////////////////////////

View file

@ -26,7 +26,8 @@ goos::Object decompile_at_label_with_hint(const LabelInfo& hint,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
DecompilerTypeSystem& dts,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
const auto& type = hint.result_type;
if (!hint.array_size.has_value()) {
// if we don't have an array size, treat it as just a normal type.
@ -34,7 +35,7 @@ goos::Object decompile_at_label_with_hint(const LabelInfo& hint,
throw std::runtime_error(fmt::format(
"Label {} was marked as a value, but is being decompiled as a reference.", hint.name));
}
return decompile_at_label(type, label, labels, words, dts.ts, file);
return decompile_at_label(type, label, labels, words, dts.ts, file, version);
}
if (type.base_type() == "pointer") {
@ -95,8 +96,8 @@ goos::Object decompile_at_label_with_hint(const LabelInfo& hint,
fake_label.target_segment = label.target_segment;
fake_label.offset = label.offset + field_type_info->get_offset() + stride * elt;
fake_label.name = fmt::format("fake-label-{}-elt-{}", type.get_single_arg().print(), elt);
array_def.push_back(
decompile_at_label(type.get_single_arg(), fake_label, labels, words, dts.ts, file));
array_def.push_back(decompile_at_label(type.get_single_arg(), fake_label, labels, words,
dts.ts, file, version));
}
return pretty_print::build_list(array_def);
}
@ -151,12 +152,13 @@ goos::Object decompile_at_label_guess_type(const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
auto guessed_type = get_type_of_label(label, words);
if (!guessed_type.has_value()) {
throw std::runtime_error("Could not guess the type of " + label.name);
}
return decompile_at_label(*guessed_type, label, labels, words, ts, file);
return decompile_at_label(*guessed_type, label, labels, words, ts, file, version);
}
goos::Object decompile_function_at_label(const DecompilerLabel& label,
@ -187,6 +189,7 @@ goos::Object decompile_at_label(const TypeSpec& type,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file,
GameVersion version,
bool in_static_pair) {
if (type == TypeSpec("string")) {
return decompile_string_at_label(label, words);
@ -201,15 +204,15 @@ goos::Object decompile_at_label(const TypeSpec& type,
if (type.has_single_arg()) {
content_type_spec = type.get_single_arg();
}
return decompile_boxed_array(label, labels, words, ts, file, content_type_spec);
return decompile_boxed_array(label, labels, words, ts, file, content_type_spec, version);
}
if (ts.tc(TypeSpec("structure"), type)) {
return decompile_structure(type, label, labels, words, ts, file, true);
return decompile_structure(type, label, labels, words, ts, file, true, version);
}
if (type == TypeSpec("pair")) {
return decompile_pair(label, labels, words, ts, true, file);
return decompile_pair(label, labels, words, ts, true, file, version);
}
throw std::runtime_error("Unimplemented decompile_at_label for " + type.print());
@ -439,7 +442,8 @@ goos::Object decomp_ref_to_inline_array_guess_size(
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file,
const TypeSpec& array_elt_type,
int stride) {
int stride,
GameVersion version) {
// lg::print("Decomp decomp_ref_to_inline_array_guess_size {}\n", array_elt_type.print());
// verify the stride matches the type system
@ -511,7 +515,7 @@ goos::Object decomp_ref_to_inline_array_guess_size(
fake_label.target_segment = my_seg; // same segment
fake_label.offset = start_label.offset + elt * stride;
array_def.push_back(
decompile_at_label(array_elt_type, fake_label, labels, all_words, ts, file));
decompile_at_label(array_elt_type, fake_label, labels, all_words, ts, file, version));
}
// build into a list.
@ -532,9 +536,10 @@ goos::Object ocean_near_indices_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("ocean-near-index"), 32);
file, TypeSpec("ocean-near-index"), 32, version);
}
goos::Object ocean_mid_masks_decompile(const std::vector<LinkedWord>& words,
@ -543,9 +548,10 @@ goos::Object ocean_mid_masks_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("ocean-mid-mask"), 8);
file, TypeSpec("ocean-mid-mask"), 8, version);
}
goos::Object sp_field_init_spec_decompile(const std::vector<LinkedWord>& words,
@ -554,9 +560,10 @@ goos::Object sp_field_init_spec_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("sp-field-init-spec"), 16);
file, TypeSpec("sp-field-init-spec"), 16, version);
}
goos::Object nav_mesh_vertex_arr_decompile(const std::vector<LinkedWord>& words,
@ -565,9 +572,10 @@ goos::Object nav_mesh_vertex_arr_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("nav-vertex"), 16);
file, TypeSpec("nav-vertex"), 16, version);
}
goos::Object nav_mesh_poly_arr_decompile(const std::vector<LinkedWord>& words,
@ -576,9 +584,10 @@ goos::Object nav_mesh_poly_arr_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("nav-poly"), 8);
file, TypeSpec("nav-poly"), 8, version);
}
goos::Object nav_mesh_poly_arr_jak2_decompile(const std::vector<LinkedWord>& words,
@ -587,9 +596,10 @@ goos::Object nav_mesh_poly_arr_jak2_decompile(const std::vector<LinkedWord>& wor
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("nav-poly"), 64);
file, TypeSpec("nav-poly"), 64, version);
}
goos::Object nav_mesh_nav_control_arr_decompile(
@ -599,9 +609,10 @@ goos::Object nav_mesh_nav_control_arr_decompile(
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("nav-control"), 288);
file, TypeSpec("nav-control"), 288, version);
}
goos::Object xz_height_map_data_arr_decompile(const std::vector<LinkedWord>& words,
@ -610,9 +621,10 @@ goos::Object xz_height_map_data_arr_decompile(const std::vector<LinkedWord>& wor
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("vector4b"), 4);
file, TypeSpec("vector4b"), 4, version);
}
goos::Object nav_mesh_route_arr_decompile(const std::vector<LinkedWord>& words,
@ -621,9 +633,10 @@ goos::Object nav_mesh_route_arr_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("vector4ub"), 4);
file, TypeSpec("vector4ub"), 4, version);
}
goos::Object sp_launch_grp_launcher_decompile(const std::vector<LinkedWord>& words,
@ -632,9 +645,10 @@ goos::Object sp_launch_grp_launcher_decompile(const std::vector<LinkedWord>& wor
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("sparticle-group-item"), 32);
file, TypeSpec("sparticle-group-item"), 32, version);
}
goos::Object probe_dir_decompile(const std::vector<LinkedWord>& words,
const std::vector<DecompilerLabel>& labels,
@ -642,9 +656,10 @@ goos::Object probe_dir_decompile(const std::vector<LinkedWord>& words,
int field_location,
const TypeSystem& ts,
const std::vector<std::vector<LinkedWord>>& all_words,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words,
file, TypeSpec("vector"), 16);
file, TypeSpec("vector"), 16, version);
}
goos::Object decompile_sound_spec(const TypeSpec& type,
@ -652,7 +667,8 @@ goos::Object decompile_sound_spec(const TypeSpec& type,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
// auto normal = decompile_structure(type, label, labels, words, ts, file, false);
// lg::print("Doing: {}\n", normal.print());
auto uncast_type_info = ts.lookup_type(type);
@ -673,7 +689,7 @@ goos::Object decompile_sound_spec(const TypeSpec& type,
for (int i = 0; i < word_count - 1; ++i) {
if (i == word_count - 2 && !obj_words.at(i).data) {
// just some default initialized sound spec, don't attempt anything fancy.
return decompile_structure(type, label, labels, words, ts, file, false);
return decompile_structure(type, label, labels, words, ts, file, false, version);
}
if (obj_words.at(i).data)
break;
@ -801,14 +817,15 @@ goos::Object decompile_structure(const TypeSpec& type,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file,
bool use_fancy_macros) {
bool use_fancy_macros,
GameVersion version) {
// some structures we want to decompile to fancy macros instead of a raw static definiton
// temp hack!!
if (use_fancy_macros && file) {
if (file->version == GameVersion::Jak1) {
if (type == TypeSpec("sp-field-init-spec")) {
ASSERT(file->version == GameVersion::Jak1); // need to update enums
return decompile_sparticle_field_init(type, label, labels, words, ts, file);
return decompile_sparticle_field_init(type, label, labels, words, ts, file, version);
}
if (type == TypeSpec("sparticle-group-item")) {
ASSERT(file->version == GameVersion::Jak1); // need to update enums
@ -816,7 +833,7 @@ goos::Object decompile_structure(const TypeSpec& type,
}
}
if (type == TypeSpec("sound-spec")) {
return decompile_sound_spec(type, label, labels, words, ts, file);
return decompile_sound_spec(type, label, labels, words, ts, file, version);
}
}
@ -851,7 +868,7 @@ goos::Object decompile_structure(const TypeSpec& type,
// try again with the right type. this resets back to decompile_at_label because we may
// want to get the specific function/string/etc implementations.
return decompile_at_label(actual_type, label, labels, words, ts, file);
return decompile_at_label(actual_type, label, labels, words, ts, file, version);
} else {
throw std::runtime_error(
fmt::format("Basic has the wrong type pointer, got {} expected {} at label {}:{}",
@ -1012,49 +1029,49 @@ goos::Object decompile_structure(const TypeSpec& type,
// first, get the label:
field_defs_out.emplace_back(
field.name(), ocean_near_indices_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "data" && type.print() == "ocean-mid-masks") {
field_defs_out.emplace_back(
field.name(), ocean_mid_masks_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "init-specs" && type.print() == "sparticle-launcher") {
field_defs_out.emplace_back(
field.name(), sp_field_init_spec_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "vertex" && type.print() == "nav-mesh" &&
file->version == GameVersion::Jak1) {
field_defs_out.emplace_back(
field.name(), nav_mesh_vertex_arr_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "poly" && type.print() == "nav-mesh" &&
file->version == GameVersion::Jak1) {
field_defs_out.emplace_back(
field.name(), nav_mesh_poly_arr_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "poly-array" && type.print() == "nav-mesh" &&
file->version == GameVersion::Jak2) {
field_defs_out.emplace_back(field.name(), nav_mesh_poly_arr_jak2_decompile(
obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "nav-control-array" && type.print() == "nav-mesh" &&
file->version == GameVersion::Jak2) {
field_defs_out.emplace_back(field.name(), nav_mesh_nav_control_arr_decompile(
obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "data" && type.print() == "xz-height-map" &&
file->version == GameVersion::Jak2) {
field_defs_out.emplace_back(field.name(), xz_height_map_data_arr_decompile(
obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "route" && type.print() == "nav-mesh" &&
file->version == GameVersion::Jak1) {
field_defs_out.emplace_back(
field.name(), nav_mesh_route_arr_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "launcher" && type.print() == "sparticle-launch-group") {
field_defs_out.emplace_back(field.name(), sp_launch_grp_launcher_decompile(
obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else if (field.name() == "col-mesh-indexes" && type.print() == "ropebridge-tuning") {
field_defs_out.emplace_back(
field.name(), decomp_ref_to_integer_array_guess_size(
@ -1063,7 +1080,7 @@ goos::Object decompile_structure(const TypeSpec& type,
} else if (field.name() == "probe-dirs" && type.print() == "lightning-probe-vars") {
field_defs_out.emplace_back(field.name(),
probe_dir_decompile(obj_words, labels, label.target_segment,
field_start, ts, words, file));
field_start, ts, words, file, version));
} else {
if (field.type().base_type() == "pointer") {
if (obj_words.at(field_start / 4).kind() != LinkedWord::SYM_PTR) {
@ -1100,7 +1117,8 @@ goos::Object decompile_structure(const TypeSpec& type,
fake_label.offset = offset_location + field.offset() + field_type_info->get_offset();
fake_label.name = fmt::format("fake-label-{}-{}", actual_type.print(), field.name());
field_defs_out.emplace_back(
field.name(), decompile_at_label(field.type(), fake_label, labels, words, ts, file));
field.name(),
decompile_at_label(field.type(), fake_label, labels, words, ts, file, version));
} else if (!field.is_dynamic() && field.is_array() && field.is_inline()) {
// it's an inline array. let's figure out the len and stride
auto len = field.array_size();
@ -1121,7 +1139,7 @@ goos::Object decompile_structure(const TypeSpec& type,
fake_label.name =
fmt::format("fake-label-{}-{}-elt-{}", actual_type.print(), field.name(), elt);
array_def.push_back(
decompile_at_label(field.type(), fake_label, labels, words, ts, file));
decompile_at_label(field.type(), fake_label, labels, words, ts, file, version));
}
field_defs_out.emplace_back(field.name(), pretty_print::build_list(array_def));
} else if (!field.is_dynamic() && field.is_array() && !field.is_inline()) {
@ -1149,7 +1167,7 @@ goos::Object decompile_structure(const TypeSpec& type,
if (word.kind() == LinkedWord::PTR) {
array_def.push_back(decompile_at_label(field.type(), labels.at(word.label_id()), labels,
words, ts, file));
words, ts, file, version));
} else if (word.kind() == LinkedWord::PLAIN_DATA && word.data == 0) {
// do nothing, the default is zero?
array_def.push_back(pretty_print::to_symbol("0"));
@ -1185,7 +1203,7 @@ goos::Object decompile_structure(const TypeSpec& type,
}
field_defs_out.emplace_back(
field.name(), decompile_at_label(field.type(), labels.at(word.label_id()), labels,
words, ts, file));
words, ts, file, version));
} else if (word.kind() == LinkedWord::PLAIN_DATA && word.data == 0) {
// do nothing, the default is zero?
field_defs_out.emplace_back(field.name(), pretty_print::to_symbol("0"));
@ -1419,7 +1437,8 @@ goos::Object decompile_boxed_array(const DecompilerLabel& label,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file,
const std::optional<TypeSpec>& content_type_override) {
const std::optional<TypeSpec>& content_type_override,
GameVersion version) {
TypeSpec content_type;
auto type_ptr_word_idx = (label.offset / 4) - 1;
if ((label.offset % 8) == 4) {
@ -1476,11 +1495,11 @@ goos::Object decompile_boxed_array(const DecompilerLabel& label,
result.push_back(pretty_print::to_symbol("0"));
} else if (word.kind() == LinkedWord::PTR) {
if (content_type == TypeSpec("object")) {
result.push_back(
decompile_at_label_guess_type(labels.at(word.label_id()), labels, words, ts, file));
result.push_back(decompile_at_label_guess_type(labels.at(word.label_id()), labels, words,
ts, file, version));
} else {
result.push_back(decompile_at_label(content_type, labels.at(word.label_id()), labels,
words, ts, file));
words, ts, file, version));
}
} else if (word.kind() == LinkedWord::SYM_PTR) {
result.push_back(pretty_print::to_symbol(fmt::format("'{}", word.symbol_name())));
@ -1508,7 +1527,7 @@ goos::Object decompile_boxed_array(const DecompilerLabel& label,
auto segment = labels.at(word.label_id()).target_segment;
result.push_back(decomp_ref_to_inline_array_guess_size(
words.at(segment), labels, segment, (first_elt_word_idx + elt) * 4, ts, words, file,
content_type.get_single_arg(), ts.get_deref_info(content_type).stride));
content_type.get_single_arg(), ts.get_deref_info(content_type).stride, version));
}
return pretty_print::build_list(result);
@ -1541,7 +1560,8 @@ goos::Object decompile_pair_elt(const LinkedWord& word,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
if (word.kind() == LinkedWord::PTR) {
auto& label = labels.at(word.label_id());
auto guessed_type = get_type_of_label(label, words);
@ -1550,10 +1570,10 @@ goos::Object decompile_pair_elt(const LinkedWord& word,
}
if (guessed_type == TypeSpec("pair")) {
return decompile_pair(label, labels, words, ts, false, file);
return decompile_pair(label, labels, words, ts, false, file, version);
}
return decompile_at_label(*guessed_type, label, labels, words, ts, file, true);
return decompile_at_label(*guessed_type, label, labels, words, ts, file, version, true);
} else if (word.kind() == LinkedWord::PLAIN_DATA && word.data == 0) {
// do nothing, the default is zero?
return pretty_print::to_symbol("0");
@ -1578,7 +1598,8 @@ goos::Object decompile_pair(const DecompilerLabel& label,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
bool add_quote,
const LinkedObjectFile* file) {
const LinkedObjectFile* file,
GameVersion version) {
if ((label.offset % 8) != 2) {
if ((label.offset % 4) != 0) {
throw std::runtime_error(
@ -1607,7 +1628,7 @@ goos::Object decompile_pair(const DecompilerLabel& label,
if ((to_print.offset % 8) == 2) {
// continue
auto car_word = words.at(to_print.target_segment).at((to_print.offset - 2) / 4);
list_tokens.push_back(decompile_pair_elt(car_word, labels, words, ts, file));
list_tokens.push_back(decompile_pair_elt(car_word, labels, words, ts, file, version));
auto cdr_word = words.at(to_print.target_segment).at((to_print.offset + 2) / 4);
// if empty
@ -1625,7 +1646,7 @@ goos::Object decompile_pair(const DecompilerLabel& label,
}
// improper
list_tokens.push_back(pretty_print::to_symbol("."));
list_tokens.push_back(decompile_pair_elt(cdr_word, labels, words, ts, file));
list_tokens.push_back(decompile_pair_elt(cdr_word, labels, words, ts, file, version));
if (add_quote) {
return pretty_print::build_list("quote", pretty_print::build_list(list_tokens));
} else {
@ -1638,8 +1659,9 @@ goos::Object decompile_pair(const DecompilerLabel& label,
} else {
// improper
list_tokens.push_back(pretty_print::to_symbol("."));
list_tokens.push_back(decompile_pair_elt(
words.at(to_print.target_segment).at(to_print.offset / 4), labels, words, ts, file));
list_tokens.push_back(
decompile_pair_elt(words.at(to_print.target_segment).at(to_print.offset / 4), labels,
words, ts, file, version));
if (add_quote) {
return pretty_print::build_list("quote", pretty_print::build_list(list_tokens));
} else {

View file

@ -5,6 +5,7 @@
#include "common/goos/Object.h"
#include "common/type_system/TypeSpec.h"
#include "common/type_system/TypeSystem.h"
#include "common/versions.h"
#include "decompiler/Disasm/DecompilerLabel.h"
#include "decompiler/IR2/LabelDB.h"
@ -25,37 +26,43 @@ goos::Object decompile_at_label(const TypeSpec& type,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file,
GameVersion version,
bool in_static_pair = false);
goos::Object decompile_at_label_with_hint(const LabelInfo& hint,
const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
DecompilerTypeSystem& dts,
const LinkedObjectFile* file);
const LinkedObjectFile* file,
GameVersion version);
goos::Object decompile_at_label_guess_type(const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file);
const LinkedObjectFile* file,
GameVersion version);
goos::Object decompile_structure(const TypeSpec& actual_type,
const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file,
bool use_fancy_macros);
bool use_fancy_macros,
GameVersion version);
goos::Object decompile_pair(const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
bool add_quote,
const LinkedObjectFile* file);
const LinkedObjectFile* file,
GameVersion version);
goos::Object decompile_boxed_array(const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file,
const std::optional<TypeSpec>& content_type_override);
const std::optional<TypeSpec>& content_type_override,
GameVersion version);
goos::Object decompile_value(const TypeSpec& type,
const std::vector<u8>& bytes,
const TypeSystem& ts);

View file

@ -80,6 +80,83 @@ enum class FieldId {
SPT_END = 67,
};
// jak2 version
enum class FieldId2 {
MISC_FIELDS_START = 0,
SPT_TEXTURE = 1,
SPT_ANIM = 2,
SPT_ANIM_SPEED = 3,
SPT_BIRTH_FUNC = 4,
SPT_JOINT_REFPOINT = 5,
SPT_NUM = 6,
SPT_SOUND = 7,
MISC_FIELDS_END = 8,
SPRITE_FIELDS_START = 9,
SPT_X = 10,
SPT_Y = 11,
SPT_Z = 12,
SPT_SCALE_X = 13,
SPT_ROT_X = 14,
SPT_ROT_Y = 15,
SPT_ROT_Z = 16,
SPT_SCALE_Y = 17,
SPT_R = 18,
SPT_G = 19,
SPT_B = 20,
SPT_A = 21,
SPRITE_FIELDS_END = 22,
CPU_FIELDS_START = 23,
SPT_OMEGA = 24,
SPT_VEL_X = 25,
SPT_VEL_Y = 26,
SPT_VEL_Z = 27,
SPT_SCALEVEL_X = 28,
SPT_ROTVEL_X = 29,
SPT_ROTVEL_Y = 30,
SPT_ROTVEL_Z = 31,
SPT_SCALEVEL_Y = 32,
SPT_FADE_R = 33,
SPT_FADE_G = 34,
SPT_FADE_B = 35,
SPT_FADE_A = 36,
SPT_ACCEL_X = 37,
SPT_ACCEL_Y = 38,
SPT_ACCEL_Z = 39,
SPT_DUMMY = 40,
SPT_QUAT_X = 41,
SPT_QUAT_Y = 42,
SPT_QUAT_Z = 43,
SPT_QUAD_W = 44,
SPT_FRICTION = 45,
SPT_TIMER = 46,
SPT_FLAGS = 47,
SPT_USERDATA = 48,
SPT_FUNC = 49,
SPT_NEXT_TIME = 50,
SPT_NEXT_LAUNCHER = 51,
CPU_FIELDS_END = 52,
LAUNCH_FIELDS_START = 53,
SPT_LAUNCHROT_X = 54,
SPT_LAUNCHROT_Y = 55,
SPT_LAUNCHROT_Z = 56,
SPT_LAUNCHROT_W = 57,
SPT_CONEROT_X = 58,
SPT_CONEROT_Y = 59,
SPT_CONEROT_Z = 60,
SPT_CONEROT_W = 61,
SPT_ROTATE_X = 62,
SPT_ROTATE_Y = 63,
SPT_ROTATE_Z = 64,
SPT_CONEROT_RADIUS = 65,
SPT_MAT_SCALE_X = 66,
SPT_MAT_SCALE_Y = 67,
SPT_MAT_SCALE_Z = 68,
LAUNCH_FIELDS_END = 69,
SPT_SCALE = 70,
SPT_SCALEVEL = 71,
SPT_END = 72,
};
// flag vals:
// 0: timer, flags, end
// 1: texture, float, random-rangef
@ -115,7 +192,7 @@ struct SparticleFieldDecomp {
FieldKind kind = FieldKind::INVALID;
};
const SparticleFieldDecomp field_kinds[68] = {
const SparticleFieldDecomp field_kind_jak1[68] = {
{false}, // MISC_FIELDS_START = 0
{true, FieldKind::TEXTURE_ID}, // SPT_TEXTURE = 1
{false}, // SPT_ANIM = 2
@ -183,10 +260,89 @@ const SparticleFieldDecomp field_kinds[68] = {
{false}, // LAUNCH_FIELDS_END = 64
{false}, // SPT_SCALE = 65
{false}, // SPT_SCALEVEL = 66
{true, FieldKind::END_FLAG}, // SPT_END = 67
{true, FieldKind::END_FLAG} // SPT_END = 67
};
const SparticleFieldDecomp field_kind_jak2[73] = {
{false}, // MISC_FIELDS_START = 0
{true, FieldKind::TEXTURE_ID}, // SPT_TEXTURE = 1
{false}, // SPT_ANIM = 2
{false}, // SPT_ANIM_SPEED = 3
{true, FieldKind::FUNCTION}, // SPT_BIRTH_FUNC = 4
{false}, // SPT_JOINT/REFPOINT = 5
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_NUM = 6
{true, FieldKind::SOUND_SPEC}, // SPT_SOUND = 7
{false}, // MISC_FIELDS_END = 8
{false}, // SPRITE_FIELDS_START = 9
{true, FieldKind::METER_WITH_RAND}, // SPT_X = 10
{true, FieldKind::METER_WITH_RAND}, // SPT_Y = 11
{true, FieldKind::METER_WITH_RAND}, // SPT_Z = 12
{true, FieldKind::METER_WITH_RAND}, // SPT_SCALE_X = 13
{true, FieldKind::ROT_X}, // SPT_ROT_X = 14
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROT_Y = 15
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROT_Z = 16
{true, FieldKind::METER_WITH_RAND}, // SPT_SCALE_Y = 17
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_R = 18
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_G = 19
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_B = 20
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_A = 21
{false}, // SPRITE_FIELDS_END = 22
{false}, // CPU_FIELDS_START = 23
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_OMEGA = 24
{true, FieldKind::METER_WITH_RAND}, // SPT_VEL_X = 25 (likely m/s)
{true, FieldKind::METER_WITH_RAND}, // SPT_VEL_Y = 26
{true, FieldKind::METER_WITH_RAND}, // SPT_VEL_Z = 27
{true, FieldKind::METER_WITH_RAND}, // SPT_SCALEVEL_X = 28
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROTVEL_X = 29
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROTVEL_Y = 30
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROTVEL_Z = 31
{true, FieldKind::METER_WITH_RAND}, // SPT_SCALEVEL_Y = 32
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_FADE_R = 33
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_FADE_G = 34
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_FADE_B = 35
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_FADE_A = 36
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_ACCEL_X = 37
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_ACCEL_Y = 38
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_ACCEL_Z = 39
{false}, // SPT_DUMMY = 40
{false}, // SPT_QUAT_X = 41
{false}, // SPT_QUAT_Y = 42
{false}, // SPT_QUAT_Z = 43
{false}, // SPT_QUAD_W = 44
{true, FieldKind::FLOAT_WITH_RAND}, // SPT_FRICTION = 45
{true, FieldKind::PLAIN_INT_WITH_RANDS}, // SPT_TIMER = 46
{true, FieldKind::CPUINFO_FLAGS}, // SPT_FLAGS = 47
{true, FieldKind::USERDATA}, // SPT_USERDATA = 48
{true, FieldKind::FUNCTION}, // SPT_FUNC = 49
{true, FieldKind::PLAIN_INT_WITH_RANDS}, // SPT_NEXT_TIME = 50
{true, FieldKind::LAUNCHER_BY_ID}, // SPT_NEXT_LAUNCHER = 51
{false}, // CPU_FIELDS_END = 52
{false}, // LAUNCH_FIELDS_START = 53
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_LAUNCHROT_X = 54
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_LAUNCHROT_Y = 55
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_LAUNCHROT_Z = 56
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_LAUNCHROT_W = 57
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_CONEROT_X = 58
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_CONEROT_Y = 59
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_CONEROT_Z = 60
{false}, // SPT_CONEROT_W = 61
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROTATE_X = 62
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROTATE_Y = 63
{true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROTATE_Z = 64
{true, FieldKind::METER_WITH_RAND}, // SPT_CONEROT_RADIUS = 65
{true, FieldKind::METER_WITH_RAND}, // SPT_MAT_SCALE_X = 66
{true, FieldKind::METER_WITH_RAND}, // SPT_MAT_SCALE_X = 67
{true, FieldKind::METER_WITH_RAND}, // SPT_MAT_SCALE_X = 68
{false}, // LAUNCH_FIELDS_END = 69
{false}, // SPT_SCALE = 70
{false}, // SPT_SCALEVEL = 71
{true, FieldKind::END_FLAG} // SPT_END = 72
};
const std::unordered_map<GameVersion, const SparticleFieldDecomp*> field_kinds = {
{GameVersion::Jak1, field_kind_jak1},
{GameVersion::Jak2, field_kind_jak2}};
std::string make_flags_str(const std::vector<std::string>& flags) {
if (flags.empty()) {
return "";
@ -536,8 +692,9 @@ goos::Object decompile_sparticle_field_init(const TypeSpec& type,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file) {
auto normal = decompile_structure(type, label, labels, words, ts, file, false);
const LinkedObjectFile* file,
GameVersion version) {
auto normal = decompile_structure(type, label, labels, words, ts, file, false, version);
// lg::print("Doing: {}\n", normal.print());
auto uncast_type_info = ts.lookup_type(type);
auto type_info = dynamic_cast<StructureType*>(uncast_type_info);
@ -560,7 +717,7 @@ goos::Object decompile_sparticle_field_init(const TypeSpec& type,
ASSERT(field_id <= (u32)FieldId::SPT_END);
auto field_name = decompile_int_enum_from_int(TypeSpec("sp-field-id"), ts, field_id);
const auto& field_info = field_kinds[field_id];
const auto& field_info = field_kinds.at(version)[field_id];
if (!field_info.known) {
throw std::runtime_error("Unknown sparticle field: " + field_name);
}
@ -635,13 +792,14 @@ goos::Object decompile_sparticle_userdata_ASSERT(const std::vector<LinkedWord>&
}
goos::Object decompile_sparticle_field_init(const DefpartElement::StaticInfo::PartField& field,
const TypeSystem& ts) {
const TypeSystem& ts,
GameVersion version) {
auto field_id = field.field_id;
auto flags = field.flags;
ASSERT(field_id <= (u32)FieldId::SPT_END);
auto field_name = decompile_int_enum_from_int(TypeSpec("sp-field-id"), ts, field_id);
const auto& field_info = field_kinds[field_id];
const auto& field_info = field_kinds.at(version)[field_id];
if (!field_info.known) {
throw std::runtime_error("Unknown sparticle field: " + field_name);
}

View file

@ -13,9 +13,11 @@ goos::Object decompile_sparticle_field_init(const TypeSpec& type,
const std::vector<DecompilerLabel>& labels,
const std::vector<std::vector<LinkedWord>>& words,
const TypeSystem& ts,
const LinkedObjectFile* file);
const LinkedObjectFile* file,
GameVersion version);
goos::Object decompile_sparticle_field_init(const DefpartElement::StaticInfo::PartField& field,
const TypeSystem& ts);
const TypeSystem& ts,
GameVersion version);
goos::Object decompile_sparticle_group_item(const TypeSpec& type,
const DecompilerLabel& label,
const std::vector<DecompilerLabel>& labels,

File diff suppressed because it is too large Load diff

View file

@ -137,6 +137,174 @@
(declare-type sparticle-cpuinfo structure)
(defmacro sp-item (launcher
&key (fade-after 0.0)
&key (falloff-to 0.0)
&key (flags ())
&key (period 0)
&key (length 0)
&key (offset 0)
&key (hour-mask 0)
&key (binding 0)
)
`(new 'static 'sparticle-group-item
:launcher ,launcher
:fade-after ,fade-after
:falloff-to ,falloff-to
:flags (sp-group-item-flag ,@flags)
:period ,period
:length ,length
:offset ,offset
:hour-mask ,hour-mask
:binding ,binding
)
)
(defmacro defpartgroup (name &key id &key parts &key (duration 3000) &key (linger-duration 1500) &key (flags ()) &key bounds
&key (rotate (0.0 0.0 0.0)) &key (scale (1.0 1.0 1.0)))
"define a new part group. defines a constant with the name of the group with the ID as its value"
`(begin
(defconstant ,name ,id)
(set! (-> *part-group-id-table* ,id)
(new 'static 'sparticle-launch-group
:duration ,duration
:linger-duration ,linger-duration
:flags (sp-group-flag ,@flags)
:bounds ,bounds
:name ,(symbol->string name)
:length ,(length parts)
:launcher (new 'static 'inline-array sparticle-group-item ,(length parts) ,@parts)
:rotate-x ,(car rotate)
:rotate-y ,(cadr rotate)
:rotate-z ,(caddr rotate)
:scale-x ,(car scale)
:scale-y ,(cadr scale)
:scale-z ,(caddr scale)
)
)
)
)
(defmacro defpart (id &key (init-specs ()))
"define a new sparticle-launcher"
`(set! (-> *part-id-table* ,id)
(new 'static 'sparticle-launcher
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
,@init-specs
(sp-end)
)))
)
(defmacro sp-tex (field-name tex-id)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-name) :tex ,tex-id)
)
(defmacro sp-rnd-flt (field-name val range mult)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-valuef ,val
:random-rangef ,range
:random-multf ,mult
:flags (sp-flag float-with-rand)
)
)
(defmacro sp-flt (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-valuef ,val
:random-rangef 0.0
:random-multf 1.0
:flags (sp-flag float-with-rand)
)
)
(defmacro sp-int (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:random-range 0
:random-mult 1
)
)
(defmacro sp-int-plain-rnd (field-name val range mult)
"For when we use plain integer, but set the randoms."
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:random-range ,range
:random-mult ,mult
)
)
(defmacro sp-rnd-int (field-name val range mult)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:random-range ,range
:random-multf ,mult
:flags (sp-flag int-with-rand)
)
)
(defmacro sp-rnd-int-flt (field-name val range mult)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-valuef ,val
:random-range ,range
:random-multf ,mult
:flags (sp-flag int-with-rand)
)
)
(defmacro sp-cpuinfo-flags (&rest flags)
`(new 'static 'sp-field-init-spec
:field (sp-field-id spt-flags)
:initial-value (sp-cpuinfo-flag ,@flags)
:random-mult 1
)
)
(defmacro sp-launcher-by-id (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:flags (sp-flag part-by-id)
)
)
(defmacro sp-func (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:sym ,val
:flags (sp-flag from-pointer)
)
)
(defmacro sp-sound (sound)
`(new 'static 'sp-field-init-spec
:field (sp-field-id spt-sound)
:sound ,sound
:flags (sp-flag plain-v2)
)
)
(defmacro sp-end ()
`(new 'static 'sp-field-init-spec
:field (sp-field-id spt-end)
)
)
(defmacro sp-copy-from-other (field-name offset)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,offset
:random-mult 1
:flags (sp-flag copy-from-other-field)
)
)
;; DECOMP BEGINS

View file

@ -7,3 +7,218 @@
;; DECOMP BEGINS
(defpartgroup group-board-land-straight
:id 119
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 209))
)
(defpartgroup group-board-quick-jump
:id 120
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 209))
)
(defpart 431
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-scale-x (meters 2.5))
(sp-int spt-rot-x 4)
(sp-flt spt-scale-y (meters 0.05))
(sp-flt spt-r 255.0)
(sp-flt spt-g 255.0)
(sp-flt spt-b 255.0)
(sp-rnd-flt spt-a 64.0 32.0 1.0)
(sp-flt spt-omega 8.192)
(sp-rnd-flt spt-vel-y (meters 0.033333335) (meters 0.033333335) 1.0)
(sp-rnd-flt spt-fade-g -0.85 -1.7 1.0)
(sp-flt spt-fade-b -8.0)
(sp-rnd-flt spt-fade-a -0.16 -0.16 1.0)
(sp-rnd-flt spt-accel-y -6.826667 -2.7306666 1.0)
(sp-flt spt-friction 0.95)
(sp-int-plain-rnd spt-timer 50 149 1)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3)
(sp-func spt-func 'sparticle-motion-blur)
(sp-rnd-flt spt-conerot-x (degrees 45.0) (degrees 90.0) 1.0)
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
)
)
(defpartgroup group-target-board
:id 118
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 432) (sp-item 433 :flags (is-3d)) (sp-item 434))
)
(defpart 432
:init-specs ((sp-flt spt-num 3.0)
(sp-flt spt-y (meters 0.25))
(sp-int spt-rot-x 7)
(sp-flt spt-r 2048.0)
(sp-flt spt-g 1638.4)
(sp-flt spt-b 1843.2)
(sp-flt spt-fade-b -0.08533333)
(sp-int spt-timer 40)
(sp-cpuinfo-flags distort)
(sp-flt spt-conerot-x (degrees 90.0))
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
(sp-rnd-flt spt-conerot-radius (meters 0) (meters 0.5) 1.0)
)
)
(defpart 433
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xc9 :page #xc))
(sp-func spt-birth-func 'birth-func-target-orient)
(sp-flt spt-num 1.0)
(sp-flt spt-y (meters 0.25))
(sp-rnd-flt spt-scale-x (meters 4) (meters 2) 1.0)
(sp-flt spt-rot-x 0.0)
(sp-flt spt-rot-y (degrees 0.0))
(sp-flt spt-rot-z (degrees 0.0))
(sp-copy-from-other spt-scale-y -4)
(sp-rnd-flt spt-r 64.0 128.0 1.0)
(sp-copy-from-other spt-g -1)
(sp-flt spt-b 255.0)
(sp-rnd-flt spt-a 8.0 8.0 1.0)
(sp-rnd-flt spt-scalevel-x (meters -0.02) (meters -0.006666667) 1.0)
(sp-copy-from-other spt-scalevel-y -4)
(sp-flt spt-fade-a -0.1)
(sp-int spt-timer 160)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12)
)
)
(defpart 434
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-scale-x (meters 2.5))
(sp-int spt-rot-x 4)
(sp-flt spt-scale-y (meters 0.05))
(sp-rnd-flt spt-r 128.0 64.0 1.0)
(sp-copy-from-other spt-g -1)
(sp-flt spt-b 255.0)
(sp-rnd-flt spt-a 64.0 32.0 1.0)
(sp-flt spt-omega 10.24)
(sp-rnd-flt spt-vel-y (meters 0.033333335) (meters 0.033333335) 1.0)
(sp-flt spt-fade-r -3.0)
(sp-flt spt-fade-g -3.0)
(sp-rnd-flt spt-fade-a -0.21333334 -0.21333334 1.0)
(sp-rnd-flt spt-accel-y -1.3653333 -1.3653333 1.0)
(sp-flt spt-friction 0.95)
(sp-int-plain-rnd spt-timer 50 149 1)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-12)
(sp-func spt-func 'sparticle-motion-blur)
(sp-rnd-flt spt-conerot-x (degrees 80.0) (degrees 10.0) 1.0)
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
(sp-rnd-flt spt-conerot-radius (meters 0) (meters 0.5) 1.0)
)
)
(defpart 435
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc))
(sp-flt spt-num 0.0)
(sp-flt spt-y (meters 0))
(sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0)
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
(sp-copy-from-other spt-scale-y -4)
(sp-flt spt-r 128.0)
(sp-flt spt-g 128.0)
(sp-flt spt-b 32.0)
(sp-rnd-flt spt-a 8.0 56.0 1.0)
(sp-rnd-flt spt-vel-y (meters 0.13333334) (meters 0.16666667) 1.0)
(sp-flt spt-scalevel-x (meters 0.013333334))
(sp-rnd-flt spt-rotvel-z (degrees -0.4) (degrees 0.8) 1.0)
(sp-copy-from-other spt-scalevel-y -4)
(sp-flt spt-fade-g -1.4222223)
(sp-flt spt-fade-a -0.35555556)
(sp-flt spt-accel-y 0.34133333)
(sp-flt spt-friction 0.7)
(sp-int spt-timer 180)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3)
(sp-flt spt-conerot-x (degrees 90.0))
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
)
)
(defpartgroup group-board-spin-attack
:id 117
:duration (seconds 50)
:flags (use-local-clock unk-6)
:bounds (static-bspherem 0 0 0 2)
:rotate ((degrees 4) (degrees 8) (degrees 4))
:parts ((sp-item 436 :flags (is-3d launch-asap bit6 bit7))
(sp-item 437 :flags (is-3d launch-asap bit6 bit7))
(sp-item 438 :flags (launch-asap bit6))
)
)
(defpart 438
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xca :page #xc))
(sp-flt spt-num 1.0)
(sp-rnd-flt spt-scale-x (meters 3) (meters 0.5) 1.0)
(sp-flt spt-rot-x 2048.0)
(sp-rnd-flt spt-scale-y (meters 4) (meters 0.5) 1.0)
(sp-flt spt-r 0.0)
(sp-flt spt-g 128.0)
(sp-flt spt-b 255.0)
(sp-flt spt-a 64.0)
(sp-flt spt-fade-a -0.4)
(sp-int spt-timer 80)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow)
(sp-flt spt-userdata 12288.0)
(sp-func spt-func 'sparticle-track-root)
)
)
(defpart 437
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xc9 :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-x (meters 0))
(sp-flt spt-y (meters 0))
(sp-flt spt-z (meters 0))
(sp-flt spt-scale-x (meters 12))
(sp-flt spt-rot-x 0.0)
(sp-flt spt-rot-y (degrees 0.0))
(sp-flt spt-rot-z (degrees 90.0))
(sp-flt spt-scale-y (meters 9))
(sp-flt spt-r 0.0)
(sp-rnd-flt spt-g 128.0 128.0 1.0)
(sp-flt spt-b 255.0)
(sp-flt spt-a 128.0)
(sp-flt spt-scalevel-x (meters -0.086666666))
(sp-flt spt-scalevel-y (meters -0.09))
(sp-int spt-timer 50)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14)
(sp-func spt-func 'sparticle-track-root)
(sp-flt spt-rotate-y (degrees 0.0))
)
)
(defpart 436
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2c :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-x (meters 0))
(sp-flt spt-y (meters 0))
(sp-flt spt-z (meters 0))
(sp-flt spt-scale-x (meters 1.4))
(sp-flt spt-rot-x 0.0)
(sp-flt spt-rot-y (degrees 0.0))
(sp-flt spt-rot-z (degrees 90.0))
(sp-flt spt-scale-y (meters 0.9))
(sp-flt spt-r 0.0)
(sp-rnd-flt spt-g 128.0 128.0 1.0)
(sp-flt spt-b 255.0)
(sp-flt spt-a 255.0)
(sp-flt spt-scalevel-x (meters 0.3))
(sp-copy-from-other spt-scalevel-y -4)
(sp-flt spt-fade-a -3.1875)
(sp-int spt-timer 20)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14)
(sp-func spt-func 'sparticle-track-root)
(sp-flt spt-rotate-y (degrees 0.0))
)
)

View file

@ -256,8 +256,8 @@
;; failed to figure out what this is:
(defpartgroup group-eco-blue-collect
:id 43
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 11 :flags (launch-asap) :binding 12)
(sp-item 12 :flags (start-dead launch-asap) :binding 13)
@ -737,8 +737,8 @@
;; failed to figure out what this is:
(defpartgroup group-eco-red-collect
:id 49
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 168 :flags (launch-asap) :binding 169)
@ -1330,8 +1330,8 @@
;; failed to figure out what this is:
(defpartgroup group-eco-yellow-collect
:id 57
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 199 :flags (launch-asap) :binding 200)
(sp-item 200 :flags (start-dead launch-asap) :binding 201)
@ -1675,8 +1675,8 @@
;; failed to figure out what this is:
(defpartgroup group-eco-green-pill-collect
:id 60
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 216 :flags (launch-asap) :binding 217)
(sp-item 217 :flags (start-dead launch-asap) :binding 218)
@ -1695,8 +1695,8 @@
;; failed to figure out what this is:
(defpartgroup group-eco-green-collect
:id 61
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 216 :flags (launch-asap) :binding 219)
(sp-item 219 :flags (start-dead launch-asap) :binding 218)
@ -2228,8 +2228,8 @@
;; failed to figure out what this is:
(defpartgroup group-green-collect
:id 66
:duration 5
:linger-duration 1200
:duration (seconds 0.017)
:linger-duration (seconds 4)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 241) (sp-item 242) (sp-item 243))
@ -2308,8 +2308,8 @@
;; failed to figure out what this is:
(defpartgroup group-blue-collect
:id 67
:duration 5
:linger-duration 1200
:duration (seconds 0.017)
:linger-duration (seconds 4)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 246) (sp-item 247) (sp-item 248))
@ -2388,8 +2388,8 @@
;; failed to figure out what this is:
(defpartgroup group-yellow-collect
:id 68
:duration 5
:linger-duration 1200
:duration (seconds 0.017)
:linger-duration (seconds 4)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 249) (sp-item 250) (sp-item 251))
@ -2478,8 +2478,8 @@
;; failed to figure out what this is:
(defpartgroup group-red-collect
:id 69
:duration 5
:linger-duration 1200
:duration (seconds 0.017)
:linger-duration (seconds 4)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 252) (sp-item 253) (sp-item 254))

View file

@ -274,7 +274,7 @@
;; failed to figure out what this is:
(defpartgroup group-crate-explode
:id 71
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 281) (sp-item 283) (sp-item 285) (sp-item 286) (sp-item 288))
@ -283,7 +283,7 @@
;; failed to figure out what this is:
(defpartgroup group-crate-steel-explode
:id 72
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 281) (sp-item 283) (sp-item 285) (sp-item 288) (sp-item 288) (sp-item 288))
@ -292,7 +292,7 @@
;; failed to figure out what this is:
(defpartgroup group-dark-eco-box-explosion
:id 73
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 295 :fade-after (meters 100) :period 600 :length 5 :binding 296)
@ -1296,8 +1296,8 @@
;; failed to figure out what this is:
(defpartgroup group-buzzer-crate
:id 74
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 302))
)

View file

@ -172,8 +172,8 @@
;; failed to figure out what this is:
(defpartgroup group-blue-hit-ground-effect
:id 70
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 261) (sp-item 262) (sp-item 263 :flags (is-3d)) (sp-item 264) (sp-item 265 :flags (is-3d)))
)

View file

@ -193,7 +193,7 @@
;; failed to figure out what this is:
(defpartgroup group-yellow-eco-fireball
:id 102
:duration 300
:duration (seconds 1)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 349 :flags (launch-asap) :binding 350)
(sp-item 350 :flags (start-dead launch-asap) :binding 351)
@ -340,7 +340,7 @@
;; failed to figure out what this is:
(defpartgroup group-part-yellow-eco-fireball-launcher
:id 103
:duration 600
:duration (seconds 2)
:bounds (static-bspherem 0 0 0 6)
:parts ((sp-item 355 :flags (launch-asap))
(sp-item 356 :flags (bit1) :period 630 :length 15)
@ -519,7 +519,7 @@
;; failed to figure out what this is:
(defpartgroup group-part-yellow-eco-fireball-hit
:id 104
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 6)
:parts ((sp-item 2059 :period 600 :length 5)

View file

@ -273,7 +273,7 @@
;; failed to figure out what this is:
(defpartgroup group-part-water-splash
:id 40
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 -12 0 14)
:parts ((sp-item 124 :flags (is-3d) :period 900 :length 63)
@ -312,7 +312,7 @@
;; failed to figure out what this is:
(defpartgroup group-part-water-splash-small
:id 41
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 -12 0 14)
:parts ((sp-item 124 :flags (is-3d) :period 900 :length 63)

View file

@ -193,7 +193,7 @@
;; failed to figure out what this is:
(defpartgroup group-target-hit
:id 1
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 56) (sp-item 57))
@ -247,8 +247,8 @@
;; failed to figure out what this is:
(defpartgroup group-red-eco-strike-ground
:id 2
:duration 10
:linger-duration 450
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 59) (sp-item 60))
)
@ -310,8 +310,8 @@
;; failed to figure out what this is:
(defpartgroup group-red-eco-spinkick
:id 3
:duration 10
:linger-duration 450
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 62) (sp-item 63) (sp-item 64))
)
@ -391,8 +391,8 @@
;; failed to figure out what this is:
(defpartgroup group-spin-hit
:id 4
:duration 10
:linger-duration 450
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 65) (sp-item 66))
)
@ -400,8 +400,8 @@
;; failed to figure out what this is:
(defpartgroup group-punch-hit
:id 5
:duration 10
:linger-duration 450
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 65) (sp-item 66))
)
@ -456,8 +456,8 @@
;; failed to figure out what this is:
(defpartgroup group-smack-surface
:id 6
:duration 10
:linger-duration 450
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 68)
(sp-item 69)
@ -578,8 +578,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-sand
:id 8
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 73) (sp-item 74) (sp-item 75))
)
@ -661,8 +661,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-dirt
:id 575
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2371) (sp-item 2372) (sp-item 2370))
)
@ -744,8 +744,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-snow
:id 9
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 76) (sp-item 77) (sp-item 78))
)
@ -827,8 +827,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-ice
:id 580
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 76) (sp-item 77) (sp-item 78))
)
@ -836,8 +836,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-grass
:id 10
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 79) (sp-item 80) (sp-item 81))
)
@ -920,8 +920,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-wood
:id 11
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 82) (sp-item 83))
)
@ -979,8 +979,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-crwood
:id 12
:duration 5
:linger-duration 750
:duration (seconds 0.017)
:linger-duration (seconds 2.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 82) (sp-item 83) (sp-item 84) (sp-item 84))
)
@ -988,8 +988,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-stone
:id 13
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 85) (sp-item 86))
)
@ -1047,8 +1047,8 @@
;; failed to figure out what this is:
(defpartgroup group-land-poof-pcmetal
:id 581
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2373) (sp-item 2374))
)
@ -1104,8 +1104,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-stone
:id 14
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 87))
)
@ -1113,8 +1113,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-stone
:id 15
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 87))
)
@ -1142,8 +1142,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-snow
:id 582
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2375) (sp-item 2376 :flags (is-3d)))
)
@ -1151,8 +1151,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-snow
:id 583
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2375))
)
@ -1160,8 +1160,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-footprint-snow
:id 584
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2376 :flags (is-3d)))
)
@ -1207,8 +1207,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-ice
:id 585
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2375))
)
@ -1216,8 +1216,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-ice
:id 586
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2375))
)
@ -1225,8 +1225,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-crwood
:id 16
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 89) (sp-item 89) (sp-item 84))
)
@ -1234,8 +1234,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-crwood
:id 17
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 88))
)
@ -1279,8 +1279,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-wood
:id 18
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 89))
)
@ -1288,8 +1288,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-wood
:id 19
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 89))
)
@ -1317,8 +1317,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-pcmetal
:id 587
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2377))
)
@ -1326,8 +1326,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-pcmetal
:id 588
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2377))
)
@ -1355,8 +1355,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-grass
:id 20
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 92) (sp-item 93 :flags (is-3d)))
)
@ -1364,8 +1364,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-grass
:id 21
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 92))
)
@ -1373,8 +1373,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-footprint-grass
:id 22
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 93 :flags (is-3d)))
)
@ -1420,8 +1420,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-sand
:id 23
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 88) (sp-item 94 :flags (is-3d)))
)
@ -1429,8 +1429,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-sand
:id 24
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 88))
)
@ -1438,8 +1438,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-footprint-sand
:id 25
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 94 :flags (is-3d)))
)
@ -1485,8 +1485,8 @@
;; failed to figure out what this is:
(defpartgroup group-run-poof-dirt
:id 576
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2378))
)
@ -1494,8 +1494,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-poof-dirt
:id 577
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2378))
)
@ -1503,8 +1503,8 @@
;; failed to figure out what this is:
(defpartgroup group-just-footprint-dirt
:id 578
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2379 :flags (is-3d)))
)
@ -1655,8 +1655,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-sand
:id 26
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 100) (sp-item 101))
)
@ -1713,8 +1713,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-dirt
:id 579
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2380) (sp-item 2381))
)
@ -1771,8 +1771,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-grass
:id 27
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 102) (sp-item 103))
)
@ -1830,8 +1830,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-stone
:id 28
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 104))
)
@ -1864,8 +1864,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-pcmetal
:id 589
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2382))
)
@ -1898,8 +1898,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-snow
:id 590
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2383))
)
@ -1932,8 +1932,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-ice
:id 591
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2383))
)
@ -1941,8 +1941,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-wood
:id 29
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 105))
)
@ -1975,8 +1975,8 @@
;; failed to figure out what this is:
(defpartgroup group-slide-poof-crwood
:id 30
:duration 5
:linger-duration 750
:duration (seconds 0.017)
:linger-duration (seconds 2.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 105))
)
@ -2065,7 +2065,7 @@
;; failed to figure out what this is:
(defpartgroup group-dark-eco-death
:id 31
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 295 :fade-after (meters 100) :period 600 :length 5 :binding 296)
@ -2110,8 +2110,8 @@
;; failed to figure out what this is:
(defpartgroup group-lava-death
:id 32
:duration 75
:linger-duration 600
:duration (seconds 0.25)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2003) (sp-item 2004) (sp-item 2005) (sp-item 2006))
)
@ -2119,8 +2119,8 @@
;; failed to figure out what this is:
(defpartgroup group-burn-death
:id 708
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2003))
)

View file

@ -458,7 +458,7 @@
;; failed to figure out what this is:
(defpartgroup group-beach-harvester-rock-explosion
:id 156
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 543 :period 1500 :length 5)

View file

@ -13,7 +13,7 @@
;; failed to figure out what this is:
(defpartgroup group-beach-rocks-start
:id 553
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2340 :period 75 :length 10)
@ -146,7 +146,7 @@
;; failed to figure out what this is:
(defpartgroup group-beach-rocks-land
:id 555
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2342 :period 900 :length 40)

View file

@ -414,8 +414,8 @@
;; failed to figure out what this is:
(defpartgroup group-citb-generator-break
:id 598
:duration 600
:linger-duration 600
:duration (seconds 2)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 6)
:parts ((sp-item 2423 :period 600 :length 5)

View file

@ -185,8 +185,8 @@
;; failed to figure out what this is:
(defpartgroup group-dark-eco-pool-nasty
:id 445
:duration 600
:linger-duration 600
:duration (seconds 2)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2056 :fade-after (meters 100) :period 600 :length 5)

View file

@ -6,8 +6,8 @@
;; failed to figure out what this is:
(defpartgroup group-sharkey-splash
:id 106
:duration 120
:linger-duration 780
:duration (seconds 0.4)
:linger-duration (seconds 2.6)
:flags (use-local-clock)
:bounds (static-bspherem 0 -12 0 14)
:parts ((sp-item 124 :flags (is-3d) :period 900 :length 63)

View file

@ -128,7 +128,7 @@
;; failed to figure out what this is:
(defpartgroup group-green-eco-lurker-death
:id 643
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2585 :fade-after (meters 100) :period 600 :length 5 :binding 2583)

View file

@ -592,7 +592,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-darkecobomb-glow
:id 639
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2753)
@ -694,7 +694,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-darkecobomb-tick
:id 663
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2756) (sp-item 2757) (sp-item 2758) (sp-item 2759))
@ -1123,7 +1123,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-greenshot
:id 664
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2769 :binding 2766)
@ -1293,7 +1293,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-redshot-charge
:id 646
:duration 900
:duration (seconds 3)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2699) (sp-item 2700) (sp-item 2701))
)
@ -1472,7 +1472,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-redshot-body
:id 665
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2709) (sp-item 2710) (sp-item 2711))
@ -1539,7 +1539,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-redshot-warning
:id 647
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2712) (sp-item 2713) (sp-item 2714 :period 45 :length 5))
@ -1644,7 +1644,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-redshot-test
:id 679
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2772))
@ -1996,7 +1996,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-yellowshot-charge
:id 651
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2811) (sp-item 2812) (sp-item 2813))
@ -2074,7 +2074,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-yellowshot
:id 652
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2815) (sp-item 2816) (sp-item 2817) (sp-item 2818) (sp-item 2819))
@ -3222,7 +3222,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-blue-claw-glow
:id 674
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2324))
@ -3231,7 +3231,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-green-claw-glow
:id 675
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2324))
@ -3240,7 +3240,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-red-claw-glow
:id 676
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2324))
@ -3249,7 +3249,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-yellow-claw-glow
:id 677
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2324))

View file

@ -135,7 +135,7 @@
;; failed to figure out what this is:
(defpartgroup group-target-white-eco-ground
:id 699
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2921)
@ -294,7 +294,7 @@
;; failed to figure out what this is:
(defpartgroup group-target-white-eco-joints
:id 700
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2929) (sp-item 2930))
@ -430,7 +430,7 @@
;; failed to figure out what this is:
(defpartgroup group-target-white-eco-hand-glow
:id 701
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2892))
@ -463,7 +463,7 @@
;; failed to figure out what this is:
(defpartgroup group-target-white-eco-hand-shot
:id 702
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2893) (sp-item 2935))
@ -514,7 +514,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-joints
:id 703
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2936 :period 36 :length 5)
@ -601,7 +601,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-explode
:id 696
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2939 :period 1200 :length 20 :binding 2938)
@ -832,7 +832,7 @@
;; failed to figure out what this is:
(defpartgroup group-robotboss-splash
:id 704
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2949) (sp-item 2950))
@ -897,7 +897,7 @@
;; failed to figure out what this is:
(defpartgroup group-bigdoor-open
:id 698
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2952 :flags (is-3d))

View file

@ -29,7 +29,7 @@
;; failed to figure out what this is:
(defpartgroup group-balloon
:id 227
:duration 5
:duration (seconds 0.017)
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 1006) (sp-item 1007) (sp-item 1008))
)
@ -429,7 +429,7 @@
;; failed to figure out what this is:
(defpartgroup group-dark-cluster-explosion
:id 228
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2100 :period 600 :length 5)

View file

@ -71,8 +71,8 @@
;; failed to figure out what this is:
(defpartgroup group-flut-attack-strike-ground
:id 121
:duration 10
:linger-duration 450
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 749) (sp-item 750))
)

View file

@ -64,7 +64,7 @@
;; failed to figure out what this is:
(defpartgroup group-darkvine-puffs
:id 175
:duration 150
:duration (seconds 0.5)
:flags (use-local-clock)
:bounds (static-bspherem 0 2 0 3)
:parts ((sp-item 800) (sp-item 801) (sp-item 802))

View file

@ -37,8 +37,8 @@
;; failed to figure out what this is:
(defpartgroup group-bad-fish
:id 177
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 828) (sp-item 2013))
@ -92,8 +92,8 @@
;; failed to figure out what this is:
(defpartgroup group-normal-fish
:id 178
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2001))
@ -121,8 +121,8 @@
;; failed to figure out what this is:
(defpartgroup group-fish-collect
:id 179
:duration 5
:linger-duration 1200
:duration (seconds 0.017)
:linger-duration (seconds 4)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 830) (sp-item 831))

View file

@ -51,7 +51,7 @@
;; failed to figure out what this is:
(defpartgroup group-jungle-blue-eco-room-activate
:id 190
:duration 900
:duration (seconds 3)
:bounds (static-bspherem 0 -6 0 8)
:parts ((sp-item 903) (sp-item 903) (sp-item 904 :flags (bit1) :period 1200 :length 15))
)

View file

@ -1283,7 +1283,7 @@
;; failed to figure out what this is:
(defpartgroup group-lavaballoon
:id 543
:duration 5
:duration (seconds 0.017)
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 1987) (sp-item 1988) (sp-item 1989))
)

View file

@ -86,7 +86,7 @@
;; failed to figure out what this is:
(defpartgroup group-dark-crystal-gnd-explode
:id 322
:duration 75
:duration (seconds 0.25)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 16)
:parts ((sp-item 2153 :fade-after (meters 100) :period 600 :length 5 :binding 296)
@ -278,8 +278,8 @@
;; failed to figure out what this is:
(defpartgroup group-dark-crystal-water-explode
:id 323
:duration 75
:linger-duration 12000
:duration (seconds 0.25)
:linger-duration (seconds 40)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 16)
:parts ((sp-item 2159 :period 600 :length 5)

View file

@ -72,8 +72,8 @@
;; failed to figure out what this is:
(defpartgroup group-spider-egg-hatches
:id 324
:duration 5
:linger-duration 900
:duration (seconds 0.017)
:linger-duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 2018 :fade-after (meters 50) :falloff-to (meters 50))
@ -146,8 +146,8 @@
;; failed to figure out what this is:
(defpartgroup group-spider-egg-explodes
:id 325
:duration 5
:linger-duration 375
:duration (seconds 0.017)
:linger-duration (seconds 1.25)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 2074 :fade-after (meters 50) :falloff-to (meters 50)))

View file

@ -24,7 +24,7 @@
;; failed to figure out what this is:
(defpartgroup group-mother-spider-proj-fly
:id 326
:duration 300
:duration (seconds 1)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 718 :flags (launch-asap) :binding 716)
(sp-item 716 :flags (start-dead) :binding 717)
@ -153,7 +153,7 @@
;; failed to figure out what this is:
(defpartgroup group-mother-spider-proj-hit
:id 327
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 722) (sp-item 723) (sp-item 724))
@ -232,7 +232,7 @@
;; failed to figure out what this is:
(defpartgroup group-mother-spider-proj-die
:id 328
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 722))

View file

@ -6,8 +6,8 @@
;; failed to figure out what this is:
(defpartgroup group-balloonlurker-pilot-death
:id 203
:duration 5
:linger-duration 600
:duration (seconds 0.017)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2015))
@ -34,7 +34,7 @@
;; failed to figure out what this is:
(defpartgroup group-balloonlurker-mine-explosion
:id 204
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 16)
:parts ((sp-item 964 :period 1200 :length 30)

View file

@ -8,8 +8,8 @@
;; failed to figure out what this is:
(defpartgroup group-keg-bounce
:id 197
:duration 10
:linger-duration 600
:duration (seconds 0.035)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2014 :fade-after (meters 100) :falloff-to (meters 100)))

View file

@ -158,7 +158,7 @@
;; failed to figure out what this is:
(defpartgroup group-misty-bone-01
:id 192
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 24)
:parts ((sp-item 914 :period 780 :length 15)
@ -404,7 +404,7 @@
;; failed to figure out what this is:
(defpartgroup group-misty-bone-03
:id 193
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 24)
:parts ((sp-item 914 :period 780 :length 15)
@ -586,7 +586,7 @@
;; failed to figure out what this is:
(defpartgroup group-misty-bone-02
:id 194
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 24)
:parts ((sp-item 914 :period 780 :length 15)
@ -768,7 +768,7 @@
;; failed to figure out what this is:
(defpartgroup group-misty-bone-07
:id 195
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 24)
:parts ((sp-item 914 :period 780 :length 15)

View file

@ -134,7 +134,7 @@
;; failed to figure out what this is:
(defpartgroup group-quicksandlurker-pre-missile
:id 199
:duration 5
:duration (seconds 0.017)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 2483))
)
@ -170,7 +170,7 @@
;; failed to figure out what this is:
(defpartgroup group-quicksandlurker-missile-impact
:id 200
:duration 10
:duration (seconds 0.035)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 2484) (sp-item 2485) (sp-item 2486))
)
@ -248,7 +248,7 @@
;; failed to figure out what this is:
(defpartgroup group-quicksandlurker-hide
:id 201
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 -12 0 14)
:parts ((sp-item 124 :flags (is-3d) :period 900 :length 63)
@ -273,7 +273,7 @@
;; failed to figure out what this is:
(defpartgroup group-quicksandlurker-popup
:id 202
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 -12 0 14)
:parts ((sp-item 124 :flags (is-3d) :period 900 :length 63)

View file

@ -180,7 +180,7 @@
;; failed to figure out what this is:
(defpartgroup group-evilsib-appear
:id 557
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2345 :period 1500 :length 20 :offset 1500)
@ -849,7 +849,7 @@
;; failed to figure out what this is:
(defpartgroup group-sequenceC-glowing-can
:id 560
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2298))
@ -880,7 +880,7 @@
;; failed to figure out what this is:
(defpartgroup group-sequenceC-exploding-can
:id 561
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2785 :period 1800 :length 5)
@ -1070,7 +1070,7 @@
;; failed to figure out what this is:
(defpartgroup group-sequenceC-dark-splash
:id 562
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 295 :fade-after (meters 100) :period 600 :length 5 :binding 296)
@ -1115,8 +1115,8 @@
;; failed to figure out what this is:
(defpartgroup group-sequenceC-blow-dust
:id 681
:duration 5
:linger-duration 900
:duration (seconds 0.017)
:linger-duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2790))

View file

@ -172,7 +172,7 @@
;; failed to figure out what this is:
(defpartgroup group-tntbarrel-explosion
:id 474
:duration 600
:duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2079 :period 600 :length 5)
@ -1566,7 +1566,7 @@
;; failed to figure out what this is:
(defpartgroup group-shortcut-boulder-explosion
:id 475
:duration 300
:duration (seconds 1)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 2149 :period 1500 :length 5)

View file

@ -4,8 +4,8 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboss-column-break
:id 464
:duration 1500
:linger-duration 3000
:duration (seconds 5)
:linger-duration (seconds 10)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2193 :period 1500 :length 5)
@ -144,8 +144,8 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboss-lava-splash
:id 465
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2023))
@ -174,8 +174,8 @@
;; failed to figure out what this is:
(defpartgroup group-ogre-bridge-splash
:id 466
:duration 75
:linger-duration 600
:duration (seconds 0.25)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2108) (sp-item 2109) (sp-item 2110) (sp-item 2111))
@ -297,8 +297,8 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboss-boulder-grow
:id 468
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 12)
:parts ((sp-item 2201) (sp-item 2202) (sp-item 2203) (sp-item 2204))
@ -459,8 +459,8 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboss-pre-missile
:id 470
:duration 150
:linger-duration 600
:duration (seconds 0.5)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 2079 :period 600 :length 5)
@ -506,7 +506,7 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboss-missile-impact
:id 471
:duration 300
:duration (seconds 1)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 16)
:parts ((sp-item 2079 :period 600 :length 5)

View file

@ -1000,8 +1000,8 @@
;; failed to figure out what this is:
(defpartgroup group-racer-explode
:id 116
:duration 300
:linger-duration 3000
:duration (seconds 1)
:linger-duration (seconds 10)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 2279 :period 600 :length 5)

View file

@ -1103,7 +1103,7 @@
;; failed to figure out what this is:
(defpartgroup group-peeper
:id 456
:duration 5
:duration (seconds 0.017)
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 1768) (sp-item 1769 :period 120 :length 30) (sp-item 1770 :period 120 :length 60))
)

View file

@ -517,7 +517,7 @@
;; failed to figure out what this is:
(defpartgroup group-dark-plant
:id 455
:duration 42
:duration (seconds 0.14)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 1764) (sp-item 2356))

View file

@ -46,7 +46,7 @@
;; failed to figure out what this is:
(defpartgroup group-rolling-ring
:id 457
:linger-duration 0
:linger-duration (seconds 0)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1773 :fade-after (meters 100) :falloff-to (meters 100))
(sp-item 1774 :fade-after (meters 80))
@ -137,8 +137,8 @@
;; failed to figure out what this is:
(defpartgroup group-rolling-spawn-ring
:id 458
:duration 5
:linger-duration 141
:duration (seconds 0.017)
:linger-duration (seconds 0.47)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1777 :fade-after (meters 100) :falloff-to (meters 100))
(sp-item 1778 :flags (is-3d))
@ -249,8 +249,8 @@
;; failed to figure out what this is:
(defpartgroup group-rolling-explode-ring
:id 459
:duration 5
:linger-duration 150
:duration (seconds 0.017)
:linger-duration (seconds 0.5)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1783 :fade-after (meters 100) :falloff-to (meters 100)) (sp-item 1784 :flags (is-3d)))
)
@ -320,7 +320,7 @@
;; failed to figure out what this is:
(defpartgroup group-rolling-ring-blue
:id 460
:linger-duration 0
:linger-duration (seconds 0)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1785 :fade-after (meters 100) :falloff-to (meters 100))
(sp-item 1786 :fade-after (meters 80))
@ -411,8 +411,8 @@
;; failed to figure out what this is:
(defpartgroup group-rolling-spawn-ring-blue
:id 461
:duration 5
:linger-duration 141
:duration (seconds 0.017)
:linger-duration (seconds 0.47)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1789 :fade-after (meters 100) :falloff-to (meters 100))
(sp-item 1790 :flags (is-3d))
@ -523,8 +523,8 @@
;; failed to figure out what this is:
(defpartgroup group-rolling-explode-ring-blue
:id 462
:duration 5
:linger-duration 150
:duration (seconds 0.017)
:linger-duration (seconds 0.5)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1795 :fade-after (meters 100) :falloff-to (meters 100)) (sp-item 1796 :flags (is-3d)))
)

View file

@ -235,8 +235,8 @@
;; failed to figure out what this is:
(defpartgroup group-ice-cube-foot-puff
:id 567
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2325) (sp-item 2326) (sp-item 2327))
)

View file

@ -171,7 +171,7 @@
;; failed to figure out what this is:
(defpartgroup group-snow-yellow-eco-room-activate
:id 511
:duration 900
:duration (seconds 3)
:bounds (static-bspherem 0 -6 0 8)
:parts ((sp-item 1994) (sp-item 1994) (sp-item 1995 :flags (bit1) :period 1200 :length 15))
)

View file

@ -291,7 +291,7 @@
;; failed to figure out what this is:
(defpartgroup group-ram-boss-proj-fly
:id 522
:duration 300
:duration (seconds 1)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 1910 :flags (launch-asap) :binding 1908)
(sp-item 1908 :flags (start-dead) :binding 1909)
@ -420,7 +420,7 @@
;; failed to figure out what this is:
(defpartgroup group-ram-boss-proj-hit
:id 523
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1914) (sp-item 1915) (sp-item 1916))
@ -497,7 +497,7 @@
;; failed to figure out what this is:
(defpartgroup group-ram-boss-proj-die
:id 524
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1914))
@ -849,8 +849,8 @@
;; failed to figure out what this is:
(defpartgroup group-ram-boss-foot-puff
:id 574
:duration 5
:linger-duration 450
:duration (seconds 0.017)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 2367) (sp-item 2368) (sp-item 2369))
)

View file

@ -170,7 +170,7 @@
;; failed to figure out what this is:
(defpartgroup group-exit-chamber-ripples
:id 620
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2512 :flags (is-3d)))

View file

@ -327,7 +327,7 @@
;; failed to figure out what this is:
(defpartgroup group-kermit-pulse-impact
:id 301
:duration 5
:duration (seconds 0.017)
:bounds (static-bspherem 0 0 0 3)
:parts ((sp-item 1371) (sp-item 1372))
)

View file

@ -10,7 +10,7 @@
;; failed to figure out what this is:
(defpartgroup group-swamp-spike-up
:id 289
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1325 :fade-after (meters 120) :falloff-to (meters 120))
@ -106,7 +106,7 @@
;; failed to figure out what this is:
(defpartgroup group-swamp-spike-down
:id 290
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1325 :fade-after (meters 120) :falloff-to (meters 120))
@ -578,7 +578,7 @@
;; failed to figure out what this is:
(defpartgroup group-swamp-rock-explosion
:id 291
:duration 300
:duration (seconds 1)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 8)
:parts ((sp-item 1330 :period 1500 :length 5)

View file

@ -6,7 +6,7 @@
;; failed to figure out what this is:
(defpartgroup group-swamp-rat-nest-a-explosion
:id 292
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 6)
:parts ((sp-item 1334) (sp-item 1335) (sp-item 1336) (sp-item 1337) (sp-item 1338) (sp-item 1339))
@ -15,7 +15,7 @@
;; failed to figure out what this is:
(defpartgroup group-swamp-rat-nest-b-explosion
:id 293
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 6)
:parts ((sp-item 1342) (sp-item 1339) (sp-item 1337) (sp-item 1334))
@ -24,7 +24,7 @@
;; failed to figure out what this is:
(defpartgroup group-swamp-rat-nest-c-explosion
:id 294
:duration 5
:duration (seconds 0.017)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 6)
:parts ((sp-item 1335) (sp-item 1339) (sp-item 1337) (sp-item 1334))

View file

@ -472,7 +472,7 @@
;; failed to figure out what this is:
(defpartgroup group-scarecrow-explode
:id 143
:duration 15
:duration (seconds 0.05)
:bounds (static-bspherem 0 0 0 1)
:parts ((sp-item 2912) (sp-item 2913) (sp-item 2914) (sp-item 2915) (sp-item 2916))
)
@ -630,7 +630,7 @@
;; failed to figure out what this is:
(defpartgroup group-scarecrow-joint-explode
:id 144
:duration 15
:duration (seconds 0.05)
:bounds (static-bspherem 0 0 0 1)
:parts ((sp-item 2912))
)
@ -638,7 +638,7 @@
;; failed to figure out what this is:
(defpartgroup group-scarecrow-hit
:id 145
:duration 15
:duration (seconds 0.05)
:bounds (static-bspherem 0 0 0 1)
:parts ((sp-item 2913))
)

View file

@ -4,7 +4,7 @@
;; failed to figure out what this is:
(defpartgroup group-sequenceAV-splash
:id 686
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2854 :period 900 :length 600))
@ -37,8 +37,8 @@
;; failed to figure out what this is:
(defpartgroup group-sequenceAV-spit
:id 687
:duration 5
:linger-duration 900
:duration (seconds 0.017)
:linger-duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2855))

View file

@ -1035,7 +1035,7 @@
;; failed to figure out what this is:
(defpartgroup group-levitator-on-big
:id 660
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2751 :fade-after (meters 100) :falloff-to (meters 100) :binding 2750)
@ -1183,7 +1183,7 @@
;; failed to figure out what this is:
(defpartgroup group-levitator-on-small
:id 661
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2679))

View file

@ -42,7 +42,7 @@
;; failed to figure out what this is:
(defpartgroup group-tetherrock-explode
:id 285
:duration 150
:duration (seconds 0.5)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 16)
:parts ((sp-item 2065 :period 600 :length 5)

View file

@ -1212,7 +1212,7 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboulder-hit-wall
:id 551
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2287 :period 900 :length 40))
@ -1240,7 +1240,7 @@
;; failed to figure out what this is:
(defpartgroup group-ogreboulder-splash
:id 552
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 64)
:parts ((sp-item 2288 :period 900 :length 20)

View file

@ -621,7 +621,7 @@
;; failed to figure out what this is:
(defpartgroup group-village2-fireboulder
:id 271
:duration 18000
:duration (seconds 60)
:bounds (static-bspherem 0 4 0 10.5)
:parts ((sp-item 1153 :fade-after (meters 200) :falloff-to (meters 240))
(sp-item 1154 :fade-after (meters 100) :falloff-to (meters 120) :period 300 :length 60)
@ -1970,7 +1970,7 @@
;; failed to figure out what this is:
(defpartgroup group-village2-fireboulder-hover
:id 678
:duration 900
:duration (seconds 3)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 16)
:parts ((sp-item 2792 :fade-after (meters 100) :falloff-to (meters 100) :binding 2791)

View file

@ -966,3 +966,180 @@
:mask (sound-mask ,@snd-mask)
))
)
(defmacro sp-item (launcher
&key (fade-after 0.0)
&key (falloff-to 0.0)
&key (flags ())
&key (period 0)
&key (length 0)
&key (offset 0)
&key (hour-mask 0)
&key (binding 0)
)
`(new 'static 'sparticle-group-item
:launcher ,launcher
:fade-after ,fade-after
:falloff-to ,falloff-to
:flags (sp-group-item-flag ,@flags)
:period ,period
:length ,length
:offset ,offset
:hour-mask ,hour-mask
:binding ,binding
)
)
(defmacro defpartgroup (name &key id &key parts &key (duration 3000) &key (linger-duration 1500) &key (flags ()) &key bounds
&key (rotate (0.0 0.0 0.0)) &key (scale (1.0 1.0 1.0)))
"define a new part group. defines a constant with the name of the group with the ID as its value"
`(begin
(defconstant ,name ,id)
(set! (-> *part-group-id-table* ,id)
(new 'static 'sparticle-launch-group
:duration ,duration
:linger-duration ,linger-duration
:flags (sp-group-flag ,@flags)
:bounds ,bounds
:name ,(symbol->string name)
:length ,(length parts)
:launcher (new 'static 'inline-array sparticle-group-item ,(length parts) ,@parts)
:rotate-x ,(car rotate)
:rotate-y ,(cadr rotate)
:rotate-z ,(caddr rotate)
:scale-x ,(car scale)
:scale-y ,(cadr scale)
:scale-z ,(caddr scale)
)
)
)
)
(defmacro defpart (id &key (init-specs ()))
"define a new sparticle-launcher"
`(set! (-> *part-id-table* ,id)
(new 'static 'sparticle-launcher
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
,@init-specs
(sp-end)
)))
)
(defmacro sp-tex (field-name tex-id)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-name) :tex ,tex-id)
)
(defmacro sp-rnd-flt (field-name val range mult)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-valuef ,val
:random-rangef ,range
:random-multf ,mult
:flags (sp-flag float-with-rand)
)
)
(defmacro sp-flt (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-valuef ,val
:random-rangef 0.0
:random-multf 1.0
:flags (sp-flag float-with-rand)
)
)
(defmacro sp-int (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:random-range 0
:random-mult 1
)
)
(defmacro sp-int-plain-rnd (field-name val range mult)
"For when we use plain integer, but set the randoms."
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:random-range ,range
:random-mult ,mult
)
)
(defmacro sp-rnd-int (field-name val range mult)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:random-range ,range
:random-multf ,mult
:flags (sp-flag int-with-rand)
)
)
(defmacro sp-rnd-int-flt (field-name val range mult)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-valuef ,val
:random-range ,range
:random-multf ,mult
:flags (sp-flag int-with-rand)
)
)
(defmacro sp-cpuinfo-flags (&rest flags)
`(new 'static 'sp-field-init-spec
:field (sp-field-id spt-flags)
:initial-value (sp-cpuinfo-flag ,@flags)
:random-mult 1
)
)
(defmacro sp-launcher-by-id (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,val
:flags (sp-flag part-by-id)
)
)
(defmacro sp-func (field-name val)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:sym ,val
:flags (sp-flag from-pointer)
)
)
(defmacro sp-sound (sound)
`(new 'static 'sp-field-init-spec
:field (sp-field-id spt-sound)
:sound ,sound
:flags (sp-flag plain-v2)
)
)
(defmacro sp-end ()
`(new 'static 'sp-field-init-spec
:field (sp-field-id spt-end)
)
)
(defmacro sp-copy-from-other (field-name offset)
`(new 'static 'sp-field-init-spec
:field (sp-field-id ,field-name)
:initial-value ,offset
:random-mult 1
:flags (sp-flag copy-from-other-field)
)
)
(defmacro static-spherem (x y z r)
"actually makes a vector. use bspherem for sphere."
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,r))
)
(defmacro static-bspherem (x y z r)
`(new 'static 'sphere :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,r))
)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,230 @@
;;-*-Lisp-*-
(in-package goal)
;; failed to figure out what this is:
(defpartgroup group-board-land-straight
:id 119
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 209))
)
;; failed to figure out what this is:
(defpartgroup group-board-quick-jump
:id 120
:duration (seconds 0.035)
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 209))
)
;; failed to figure out what this is:
(defpart 431
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-scale-x (meters 2.5))
(sp-int spt-rot-x 4)
(sp-flt spt-scale-y (meters 0.05))
(sp-flt spt-r 255.0)
(sp-flt spt-g 255.0)
(sp-flt spt-b 255.0)
(sp-rnd-flt spt-a 64.0 32.0 1.0)
(sp-flt spt-omega 8.192)
(sp-rnd-flt spt-vel-y (meters 0.033333335) (meters 0.033333335) 1.0)
(sp-rnd-flt spt-fade-g -0.85 -1.7 1.0)
(sp-flt spt-fade-b -8.0)
(sp-rnd-flt spt-fade-a -0.16 -0.16 1.0)
(sp-rnd-flt spt-accel-y -6.826667 -2.7306666 1.0)
(sp-flt spt-friction 0.95)
(sp-int-plain-rnd spt-timer 50 149 1)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3)
(sp-func spt-func 'sparticle-motion-blur)
(sp-rnd-flt spt-conerot-x (degrees 45.0) (degrees 90.0) 1.0)
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
)
)
;; failed to figure out what this is:
(defpartgroup group-target-board
:id 118
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 432) (sp-item 433 :flags (is-3d)) (sp-item 434))
)
;; failed to figure out what this is:
(defpart 432
:init-specs ((sp-flt spt-num 3.0)
(sp-flt spt-y (meters 0.25))
(sp-int spt-rot-x 7)
(sp-flt spt-r 2048.0)
(sp-flt spt-g 1638.4)
(sp-flt spt-b 1843.2)
(sp-flt spt-fade-b -0.08533333)
(sp-int spt-timer 40)
(sp-cpuinfo-flags distort)
(sp-flt spt-conerot-x (degrees 90.0))
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
(sp-rnd-flt spt-conerot-radius (meters 0) (meters 0.5) 1.0)
)
)
;; failed to figure out what this is:
(defpart 433
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xc9 :page #xc))
(sp-func spt-birth-func 'birth-func-target-orient)
(sp-flt spt-num 1.0)
(sp-flt spt-y (meters 0.25))
(sp-rnd-flt spt-scale-x (meters 4) (meters 2) 1.0)
(sp-flt spt-rot-x 0.0)
(sp-flt spt-rot-y (degrees 0.0))
(sp-flt spt-rot-z (degrees 0.0))
(sp-copy-from-other spt-scale-y -4)
(sp-rnd-flt spt-r 64.0 128.0 1.0)
(sp-copy-from-other spt-g -1)
(sp-flt spt-b 255.0)
(sp-rnd-flt spt-a 8.0 8.0 1.0)
(sp-rnd-flt spt-scalevel-x (meters -0.02) (meters -0.006666667) 1.0)
(sp-copy-from-other spt-scalevel-y -4)
(sp-flt spt-fade-a -0.1)
(sp-int spt-timer 160)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-12)
)
)
;; failed to figure out what this is:
(defpart 434
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x92 :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-scale-x (meters 2.5))
(sp-int spt-rot-x 4)
(sp-flt spt-scale-y (meters 0.05))
(sp-rnd-flt spt-r 128.0 64.0 1.0)
(sp-copy-from-other spt-g -1)
(sp-flt spt-b 255.0)
(sp-rnd-flt spt-a 64.0 32.0 1.0)
(sp-flt spt-omega 10.24)
(sp-rnd-flt spt-vel-y (meters 0.033333335) (meters 0.033333335) 1.0)
(sp-flt spt-fade-r -3.0)
(sp-flt spt-fade-g -3.0)
(sp-rnd-flt spt-fade-a -0.21333334 -0.21333334 1.0)
(sp-rnd-flt spt-accel-y -1.3653333 -1.3653333 1.0)
(sp-flt spt-friction 0.95)
(sp-int-plain-rnd spt-timer 50 149 1)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-12)
(sp-func spt-func 'sparticle-motion-blur)
(sp-rnd-flt spt-conerot-x (degrees 80.0) (degrees 10.0) 1.0)
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
(sp-rnd-flt spt-conerot-radius (meters 0) (meters 0.5) 1.0)
)
)
;; failed to figure out what this is:
(defpart 435
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :page #xc))
(sp-flt spt-num 0.0)
(sp-flt spt-y (meters 0))
(sp-rnd-flt spt-scale-x (meters 1) (meters 1) 1.0)
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
(sp-copy-from-other spt-scale-y -4)
(sp-flt spt-r 128.0)
(sp-flt spt-g 128.0)
(sp-flt spt-b 32.0)
(sp-rnd-flt spt-a 8.0 56.0 1.0)
(sp-rnd-flt spt-vel-y (meters 0.13333334) (meters 0.16666667) 1.0)
(sp-flt spt-scalevel-x (meters 0.013333334))
(sp-rnd-flt spt-rotvel-z (degrees -0.4) (degrees 0.8) 1.0)
(sp-copy-from-other spt-scalevel-y -4)
(sp-flt spt-fade-g -1.4222223)
(sp-flt spt-fade-a -0.35555556)
(sp-flt spt-accel-y 0.34133333)
(sp-flt spt-friction 0.7)
(sp-int spt-timer 180)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3)
(sp-flt spt-conerot-x (degrees 90.0))
(sp-rnd-flt spt-conerot-y (degrees 0.0) (degrees 360.0) 1.0)
)
)
;; failed to figure out what this is:
(defpartgroup group-board-spin-attack
:id 117
:duration (seconds 50)
:flags (use-local-clock unk-6)
:bounds (static-bspherem 0 0 0 2)
:rotate ((degrees 4) (degrees 8) (degrees 4))
:parts ((sp-item 436 :flags (is-3d launch-asap bit6 bit7))
(sp-item 437 :flags (is-3d launch-asap bit6 bit7))
(sp-item 438 :flags (launch-asap bit6))
)
)
;; failed to figure out what this is:
(defpart 438
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xca :page #xc))
(sp-flt spt-num 1.0)
(sp-rnd-flt spt-scale-x (meters 3) (meters 0.5) 1.0)
(sp-flt spt-rot-x 2048.0)
(sp-rnd-flt spt-scale-y (meters 4) (meters 0.5) 1.0)
(sp-flt spt-r 0.0)
(sp-flt spt-g 128.0)
(sp-flt spt-b 255.0)
(sp-flt spt-a 64.0)
(sp-flt spt-fade-a -0.4)
(sp-int spt-timer 80)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow)
(sp-flt spt-userdata 12288.0)
(sp-func spt-func 'sparticle-track-root)
)
)
;; failed to figure out what this is:
(defpart 437
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xc9 :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-x (meters 0))
(sp-flt spt-y (meters 0))
(sp-flt spt-z (meters 0))
(sp-flt spt-scale-x (meters 12))
(sp-flt spt-rot-x 0.0)
(sp-flt spt-rot-y (degrees 0.0))
(sp-flt spt-rot-z (degrees 90.0))
(sp-flt spt-scale-y (meters 9))
(sp-flt spt-r 0.0)
(sp-rnd-flt spt-g 128.0 128.0 1.0)
(sp-flt spt-b 255.0)
(sp-flt spt-a 128.0)
(sp-flt spt-scalevel-x (meters -0.086666666))
(sp-flt spt-scalevel-y (meters -0.09))
(sp-int spt-timer 50)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14)
(sp-func spt-func 'sparticle-track-root)
(sp-flt spt-rotate-y (degrees 0.0))
)
)
;; failed to figure out what this is:
(defpart 436
:init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #x2c :page #xc))
(sp-flt spt-num 1.0)
(sp-flt spt-x (meters 0))
(sp-flt spt-y (meters 0))
(sp-flt spt-z (meters 0))
(sp-flt spt-scale-x (meters 1.4))
(sp-flt spt-rot-x 0.0)
(sp-flt spt-rot-y (degrees 0.0))
(sp-flt spt-rot-z (degrees 90.0))
(sp-flt spt-scale-y (meters 0.9))
(sp-flt spt-r 0.0)
(sp-rnd-flt spt-g 128.0 128.0 1.0)
(sp-flt spt-b 255.0)
(sp-flt spt-a 255.0)
(sp-flt spt-scalevel-x (meters 0.3))
(sp-copy-from-other spt-scalevel-y -4)
(sp-flt spt-fade-a -3.1875)
(sp-int spt-timer 20)
(sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14)
(sp-func spt-func 'sparticle-track-root)
(sp-flt spt-rotate-y (degrees 0.0))
)
)

View file

@ -127,7 +127,7 @@ TEST_F(DataDecompTest, String) {
" .word 0x0\n";
auto parsed = parse_data(input);
auto decomp = decompile_at_label_guess_type(parsed.label("L62"), parsed.labels, {parsed.words},
dts->ts, nullptr);
dts->ts, nullptr, GameVersion::Jak1);
EXPECT_EQ(decomp.print(), "\"finalboss-fight\"");
}
@ -148,8 +148,9 @@ TEST_F(DataDecompTest, SimpleStructure) {
" .word 0x79637473\n"
" .word 0x6c63\n";
auto parsed = parse_data(input);
auto decomp = decompile_at_label(TypeSpec("vif-disasm-element"), parsed.label("L217"),
parsed.labels, {parsed.words}, dts->ts, nullptr);
auto decomp =
decompile_at_label(TypeSpec("vif-disasm-element"), parsed.label("L217"), parsed.labels,
{parsed.words}, dts->ts, nullptr, GameVersion::Jak1);
check_forms_equal(decomp.print(),
"(new 'static 'vif-disasm-element :mask #x7f :tag (vif-cmd-32 stcycl) :print "
"#x2 :string1 \"stcycl\")");
@ -210,7 +211,7 @@ TEST_F(DataDecompTest, VifDisasmArray) {
" .word 0x0";
auto parsed = parse_data(input);
auto decomp = decompile_at_label_guess_type(parsed.label("L148"), parsed.labels, {parsed.words},
dts->ts, nullptr);
dts->ts, nullptr, GameVersion::Jak1);
check_forms_equal(decomp.print(),
"(new 'static 'boxed-array :type vif-disasm-element\n"
" (new 'static 'vif-disasm-element :mask #x7f :string1 \"nop\")\n"
@ -286,7 +287,7 @@ TEST_F(DataDecompTest, ContinuePoint) {
" .word 0x747261";
auto parsed = parse_data(input);
auto decomp = decompile_at_label_guess_type(parsed.label("L63"), parsed.labels, {parsed.words},
dts->ts, nullptr);
dts->ts, nullptr, GameVersion::Jak1);
check_forms_equal(decomp.print(),
"(new 'static 'continue-point\n"
" :name \"finalboss-start\"\n"
@ -344,7 +345,7 @@ TEST_F(DataDecompTest, FloatArray) {
info.array_size = 7;
info.is_value = false;
auto decomp = decompile_at_label_with_hint(info, parsed.label("L63"), parsed.labels,
{parsed.words}, *dts, nullptr);
{parsed.words}, *dts, nullptr, GameVersion::Jak1);
check_forms_equal(decomp.print(),
"(new 'static 'array float 7\n"
"1.0 0.0 1.0 0.0 1.0 0.0 1.0)");
@ -382,7 +383,7 @@ TEST_F(DataDecompTest, KernelContext) {
" .symbol #t\n";
auto parsed = parse_data(input);
auto decomp = decompile_at_label_guess_type(parsed.label("L345"), parsed.labels, {parsed.words},
dts->ts, nullptr);
dts->ts, nullptr, GameVersion::Jak1);
check_forms_equal(decomp.print(),
"(new 'static 'kernel-context\n"
" :prevent-from-run (process-mask execute sleep)\n"