Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions fast64_internal/sm64/settings/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@
("Refresh 16", "Refresh 16", "Refresh 16"),
("", "HackerSM64", ""),
("HackerSM64 2.3.0", "HackerSM64 (v2.3.0)", "HackerSM64 (v2.3.0)"),
("HackerSM64 3.0.0", "HackerSM64 (v3.0.0)", "HackerSM64 (v3.0.0)"),
]
42 changes: 37 additions & 5 deletions fast64_internal/sm64/sm64_objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -1611,9 +1611,33 @@ def export_model_id(self, context, props, offset):
PluginError("Could not find model_ids.h")

model_id_lines = open(model_ids, "r").readlines()
export_model_id = f"#define {props.model_id_define: <34}{props.model_id + offset}\n"
fast64_sig = "/* fast64 object exports get inserted here */"

# For hacker model ID enums add comma and no number
export_model_id = f" {props.model_id_define},\n"

# Check if hacker version is "3.0" or greater
refresh_version = bpy.context.scene.fast64.sm64.refresh_version
if refresh_version.startswith("HackerSM64"):
major_version = int(refresh_version.split()[1].split(".")[0])
if major_version >= 3:
# Check if the ID already exists
if any(props.model_id_define in line for line in model_id_lines):
print(f"Model ID '{props.model_id_define}' already exists. Skipping insertion.")
return

# Look for MODEL_ID_COUNT line
model_id_count_line = next(
(i for i, line in enumerate(model_id_lines) if "MODEL_ID_COUNT" in line), None
)
if model_id_count_line is not None:
# Insert new ID above MODEL_ID_COUNT with a comma
model_id_lines.insert(model_id_count_line, export_model_id)
self.write_file_lines(model_ids, model_id_lines)
return

# Default behavior if not enums
export_model_id_default = f"#define {props.model_id_define: <34}{props.model_id + offset}\n"
match_line, sig_insert_line, default_line = self.find_export_lines(
model_id_lines,
match_str=f"#define {props.model_id_define} ",
Expand All @@ -1622,13 +1646,13 @@ def export_model_id(self, context, props, offset):
)

if match_line:
model_id_lines[match_line] = export_model_id
model_id_lines[match_line] = export_model_id_default
elif sig_insert_line:
model_id_lines.insert(sig_insert_line + 1, export_model_id)
model_id_lines.insert(sig_insert_line + 1, export_model_id_default)
else:
export_line = default_line + 1 if default_line else len(model_id_lines)
model_id_lines.insert(export_line, f"\n{fast64_sig}\n")
model_id_lines.insert(export_line + 1, export_model_id)
model_id_lines.insert(export_line + 1, export_model_id_default)

self.write_file_lines(model_ids, model_id_lines)

Expand Down Expand Up @@ -2140,6 +2164,7 @@ def filter_name(self, name):
return name

def draw_export_options(self, layout):
refresh_version = bpy.context.scene.fast64.sm64.refresh_version
split = layout.row(align=True)

box = split.box()
Expand All @@ -2160,7 +2185,14 @@ def draw_export_options(self, layout):
if not self.export_all_selected:
box.prop(self, "graphics_object", icon_only=True)
if self.export_script_loads:
box.prop(self, "model_id", text="Model ID")
# Hide Model ID for HackerSM64 >= 3, show otherwise
if refresh_version.startswith("HackerSM64"):
major_version = int(refresh_version.split()[1].split(".")[0])
if major_version < 3:
box.prop(self, "model_id", text="Model ID")
else:
box.prop(self, "model_id", text="Model ID")

col = layout.column()
col.prop(self, "export_all_selected")
col.prop(self, "use_name_filtering")
Expand Down