You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
* buffers: refresh 15 and revert to base decomp * behavior script * color helper functions * extended bounds * egeo_layout * fixed model ids * camera conf improved * message panel ucode small * graph node * level script * mathutil updates * mathutil updates (allow unused funcs) * behaviors a - beta_fish * Add librtc and fix some data declarations * Move GRUCODE define to proper location in makefile * Refresh 15 * extra * Make ROM name smaller and change messages printed on build a bit * Fix console (lol) * Update UNF to latest master * Make ucode load from .o's (and also fix Super3D) * Fix crash with rumble + custom mario model * graph node and mathutil * removed behaviors * Ldtob documentation * _Putfld labeling * area * behavior actions * camera * debug updates * bubbles * envfx snow * farcall helpers * game init * geo misc * hud * only check if VC on render init * ingame menu * revert goddard to base decomp * insn disasm * interaction documentation * level geo * level update defines * macro special objects formatting changes * main.h documentation * map parser documentation & formatting * airborne documentation * mario actions automatic documentation * mario actions cutscene documentation * mario actions moving documentation and options * mario actions object documentation and options * mario stationary documentation * mario submerged documentation * mario misc documentation * mario step: ledge grab fixes and documentation * mario documentation * memory.h documentation * moving textures * object behaviors * object collision * fix flamethrower bug * object helpers * object list processor documentation * paintings * platform displacement * print / printf * puppycam absf * puppyprint updates and formatting changes * rendering graph node performance optimizations * rumble opt and doc * hqvm back to ultrasm64 * save file documentation and unlock defines * s2d engine * reset various files to ultrasm64 * file select * intro geo documentation * screen transition documentation * segment2.h * shadow overhaul * skybox refactor * sound init: clean up define usage + documentation * spawn object optimizations and documentation * spawn sound cleanup * sram to ultrasm64 * star select cleanup * title screen cleanup * dialogs / text * rename stomp smoke * stomp smoke -> small water splash * updated README * compilation flags * optimized file positions + support function/data sections * surface collision performance improvements * surface load optimizations * camera conf documentation * Allow easier command for opening puppyprint debug * Rearranged framebuffers & fixed puppyprint console printing * Fix shadow scaling and shifting * Fix SILHOUETTE, OBJECTS_REJ, and ucode loading, also clean up render phase system a bit. * Fixed build with BETTER_HANGING off * Clean up OBJECTS_REJ ifdefs * Fix duplicate comment & graph render layers/flags bitmask * Fixed build with BETTER_HANGING off * Fix Fast64 importing by reverting sSegmentTable change * Readded missing functions that caused build errors with Mario head enabled * Fixed clang compilation issues * Add INTER mode for geo_update_layer_transparency * Fix build warnings * bugfix: miscalculation in obj_turn_toward_object * Some puppytech fixes * Further Puppycamera fixes * Fix BUGFIX_DIALOG_TIME_STOP Fixes #136 * Fix sliding platform bparams * Add LEGACY_SHADOW_IDS define for Fast64 compatibility * Apply suggested changes * Better find_in_bounds_yaw_wdw_bob_thi ifdef * Fix build warnings for unused functions * Fixed stale reference bug from obj_mark_for_deletion change * Fixed incorrect digit for 100s #145 * Change groundpound-fix define and functionality to just disable bonking * Fixed puppyroll #134 * Adjust height value for terrain angle to kick in * fixed hi score flashing * Remove menudata backup (#131) Not considered important enough to keep * Fix fread() build warning * Add COURSE_NUM_TO_INDEX to save_file_get_star_flags check in bhv_unagi_init * Fix approach_s16 return value * Use boolean defines for oCapDoScaleVertically * Make the door lock a part of the key door model to eliminate z-fighting, also reduce z fighting on numbered doors with AUTO_LOD enabled. * Move flames to LAYER_TRANSPARENT_INTER * Resolved some compiler warnings and added FALL_THROUGH define (#168) * Address some more compiler warnings with different define toggles * Remove unnecessary fallthrough attribute * fixed geo_process_billboard floating point exception * Allow water to face any direction * Initialize focOffset so that BBH doesn't crash * Removed superfluous RDP commands when switching microcodes which would override scissor * Set OBJ_FLAG_DONT_CALC_COLL_DIST on bhvUkikiCage * Fix rumble build * Fixed UNLOCK_FPS strobing * Update src/game/object_helpers.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Update src/game/object_helpers.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Fix LEGACY_SHADOW_IDS id conflict * Use the vanilla default value for rotating fire bars if bparam2 is 0 * START_LEVEL safeguard * Fix some drawing distance issues caused by AUTO_COLLISION_DISTANCE * Fix rumble build * Fixed spline poll code using the wrong values for keyframes * Update readme with better credits Better credits for individual contributors * add arthur * added falco and moose * add fazana * le funny typo * added S2DEX engine to credits * silhouette + axo + ratio * remove specific callouts + add auto col distance * Update data/behavior_data.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Update data/behavior_data.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Update data/behavior_data.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> * Revert formatting changes to match vanilla decomp * Re-implement Y buffer for find_ceil * Re-implement POWER_STARS_HEAL for normal Power Stars * Start level comment & exit course comment/collapse * utilize reonucam technique for FAST_VERTICAL_CAMERA_MOVEMENT * Fix "MAX_REFERENCED_WALLS" typo * Allow stop_and_set_height_to_floor to work at any height if Mario is teleporting (#213) * Revert stop_and_set_height_to_floor to vanilla Fixes #208 * Fixed sAudioEnabled so that it disables audio CPU processing as well * Fixed puppyprint debug RDP us calculations * Renamed sAudioEnabled to gAudioEnabled * Replaced mtxf_to_mtx_asm with an equivalent implementation that supports WORLD_SCALE * Moved extended bounds and world scale configuration to a new config_world.h file * Default all objects to non-rej (#227) Fixes #221 (Default all objects to non-rej) * Fix #221 * Fix VISUAL_DEBUG breaking/crashing when OBJECTS_REJ is disabled (#211) * Fix VISUAL_DEBUG breaking/crashing when OBJECTS_REJ is disabled * Change vtl decrement in visual_surface_display from 6 to 3 Fixes #207 * Make area in SL igloo wider to prevent a softlock (#233) Fixes #210 * Fix coin formation coins being deleted if they spawn in the middle of a floor, also fix TTM slide coin position (#232) Fixes #201 * Make UNLOCK_ALL apply to more things * Fix wrong ifdef/ifndef in bhv_invisible_objects_under_bridge_init * Change chain chomp load/unload distances depending on number of segments (#237) Fixes #192 * added WATER_PLUNGE_UPWARP define * Add reonucam patch (#239) * added reonucam patch Fixes #218 * Fix how shadows handle water/transparency/height (#228) * Fix how shadows handle water/transparency/height * Change shadow check for flying carpets from a level specific check to a oPlatformOnTrackType check Fixes #179 * added reonucam credit * delete unnecesary patches * Apply suggested changes * murdered more patches * UNLOCK_ALL unlocks the cap boxes * UNLOCK_ALL unlocks cap boxes (slightly more epic edition) * revert ceil buffer * Renamed HD_INTRO_TEXTURES define, separated intro floombas * prevent double definition of floombas * actually prevent floomba redefinition * Develop/refactor default defines (#242) * Changed default config options * Added build dir to includePaths for pngs * disable NO_SLEEP by default * Disable puppyprint by default Sorry fazana 😔 * fix typos * add comment about BETTER_REVERB console perf * disable blue coin switch retry by default * Update config_audio.h Co-authored-by: Reonu <danileon95@gmail.com> Co-authored-by: Mr-Wiseguy <68165316+Mr-Wiseguy@users.noreply.github.com> * revert air step line to vanilla to fix bitfs scaling platform issue (#247) Fixes #200 * Fix stuttering on thin slopes (#248) * Fix stuttering on thin slopes * Revert vec3f_find_ceil calls to vanilla * Rename vec3f_find_ceil to find_mario_ceil * Update src/engine/surface_collision.h Fixes #249 * Swap static and dynamic surface checks back to vanilla order (#253) * Swap static and dynamic surface checks back to vanilla order * re-enable DISABLE_ALL config Fixes #251 #252 * Fixed save and quitting while in widescreen (#257) * Fixed save and quitting while in widescreen * use define for the level * all my homies hate ifdefs * skip wall offsets < 0 (#255) Fixes #255 * #264: Document non-stop stars' issues (#267) * #264: Document non-stop stars' issues * Update include/config/config_game.h * nonstop vanilla comment * derive margin_radius from radius after capping at 200 (#266) Fixes #259 * Config cleanup/refactor (#269) * Moved puppyprint define to graphics / rearranged some debug defines for ease of access * Moved compatibility safeguards to config_safeguards.h * spacing and comment formatting * #272 Move GFX_POOL_SIZE to config_graphics.h * disable EASIER_DIALOG_TRIGGER by default * prevent redefining warnings * small ifdef typo * changed ifndef to undefs Fixes #262 Fixes #272 * Improved movement config documentation related to turning around (#271) Fixes #270 * rename CUSTOM_DEBUG, add comments (#275) * Update README.md (#277) * v2.0.0 Co-authored-by: CrashOveride95 <crashoveride953@gmail.com> Co-authored-by: Arceveti <73617174+Arceveti@users.noreply.github.com> Co-authored-by: n64 <n64> Co-authored-by: Fazana <52551480+FazanaJ@users.noreply.github.com> Co-authored-by: Mr-Wiseguy <mrwiseguyromhacking@gmail.com> Co-authored-by: aglab2 <aglab3@gmail.com> Co-authored-by: gheskett <gheskett@gmail.com> Co-authored-by: Reonu <danileon95@gmail.com> Co-authored-by: Axollyon <20480418+Axollyon@users.noreply.github.com> Co-authored-by: Mr-Wiseguy <68165316+Mr-Wiseguy@users.noreply.github.com>
294 lines
12 KiB
C
294 lines
12 KiB
C
#include <PR/ultratypes.h>
|
|
|
|
#include "sm64.h"
|
|
#include "object_helpers.h"
|
|
#include "macro_special_objects.h"
|
|
#include "object_list_processor.h"
|
|
|
|
#include "behavior_data.h"
|
|
|
|
#include "macro_presets.h"
|
|
|
|
#include "special_presets.h"
|
|
|
|
/*
|
|
* Converts the rotation value supplied by macro objects into one
|
|
* that can be used by in-game objects.
|
|
*/
|
|
s32 convert_rotation(s16 inRotation) {
|
|
u16 rotation = ((u16)(inRotation & 0xFF) << 8);
|
|
switch (rotation) {
|
|
case 0x3F00: rotation = 0x4000; break;
|
|
case 0x7F00: rotation = 0x8000; break;
|
|
case 0xBF00: rotation = 0xC000; break;
|
|
case 0xFF00: rotation = 0x0000; break;
|
|
}
|
|
return (s16) rotation;
|
|
}
|
|
|
|
/*
|
|
* Spawns an object at an absolute location with rotation around the y-axis and
|
|
* parameters filling up the upper 2 bytes of newObj->oBehParams.
|
|
* The object will not spawn if 'behavior' is NULL.
|
|
*/
|
|
void spawn_macro_abs_yrot_2params(ModelID32 model, const BehaviorScript *behavior, s16 x, s16 y, s16 z, s16 ry, s16 params) {
|
|
if (behavior != NULL) {
|
|
struct Object *newObj =
|
|
spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, convert_rotation(ry), 0);
|
|
newObj->oBehParams = ((u32) params) << 16;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Spawns an object at an absolute location with rotation around the y-axis and
|
|
* a single parameter filling up the upper byte of newObj->oBehParams.
|
|
* The object will not spawn if 'behavior' is NULL.
|
|
*/
|
|
void spawn_macro_abs_yrot_param1(ModelID32 model, const BehaviorScript *behavior, s16 x, s16 y, s16 z, s16 ry, s16 param) {
|
|
if (behavior != NULL) {
|
|
struct Object *newObj =
|
|
spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, convert_rotation(ry), 0);
|
|
newObj->oBehParams = ((u32) param) << 24;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Spawns an object at an absolute location with currently 3 unknown variables that get converted to
|
|
* floats. Oddly enough, this function doesn't care if 'behavior' is NULL or not.
|
|
*/
|
|
void spawn_macro_abs_special(ModelID32 model, const BehaviorScript *behavior, s16 x, s16 y, s16 z, s16 unkA, s16 unkB, s16 unkC) {
|
|
struct Object *newObj =
|
|
spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, 0, 0);
|
|
|
|
// Are all three of these values unused?
|
|
newObj->oMacroUnk108 = (f32) unkA;
|
|
newObj->oMacroUnk10C = (f32) unkB;
|
|
newObj->oMacroUnk110 = (f32) unkC;
|
|
}
|
|
|
|
UNUSED static void spawn_macro_coin_unknown(const BehaviorScript *behavior, s16 a1[]) {
|
|
struct Object *obj;
|
|
ModelID16 model = bhvYellowCoin == behavior ? MODEL_YELLOW_COIN : MODEL_NONE;
|
|
|
|
obj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior,
|
|
a1[1], a1[2], a1[3], 0, convert_rotation(a1[0]), 0);
|
|
|
|
obj->oUnusedCoinParams = a1[4];
|
|
obj->oBehParams = (a1[4] & 0xFF) >> 16;
|
|
}
|
|
|
|
struct LoadedMacroObject {
|
|
/*0x00*/ Angle yaw;
|
|
/*0x02*/ Vec3s pos;
|
|
/*0x08*/ s16 params;
|
|
};
|
|
|
|
void spawn_macro_objects(s32 areaIndex, MacroObject *macroObjList) {
|
|
s32 presetID;
|
|
struct LoadedMacroObject macroObject;
|
|
struct Object *newObj;
|
|
struct MacroPreset preset;
|
|
|
|
gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex;
|
|
gMacroObjectDefaultParent.header.gfx.activeAreaIndex = areaIndex;
|
|
|
|
while (TRUE) {
|
|
if (*macroObjList == -1) { // An encountered value of -1 means the list has ended.
|
|
break;
|
|
}
|
|
|
|
presetID = (*macroObjList & 0x1FF) - 31; // Preset identifier for MacroObjectPresets array
|
|
|
|
if (presetID < 0) {
|
|
break;
|
|
}
|
|
|
|
// Set macro object properties from the list
|
|
macroObject.yaw = ((*macroObjList++ >> 9) & 0x7F) << 1; // Y-Rotation
|
|
macroObject.pos[0] = *macroObjList++; // X position
|
|
macroObject.pos[1] = *macroObjList++; // Y position
|
|
macroObject.pos[2] = *macroObjList++; // Z position
|
|
macroObject.params = *macroObjList++; // Behavior params
|
|
|
|
// Get the preset values from the MacroObjectPresets list.
|
|
preset = MacroObjectPresets[presetID];
|
|
|
|
// If the preset has a defined param, replace the lower bits with the preset param.
|
|
// The lower bits are later used for bparam2.
|
|
if (preset.param != 0) {
|
|
macroObject.params = (macroObject.params & 0xFF00) + (preset.param & 0x00FF);
|
|
}
|
|
|
|
// If object has been killed (bparam3 check), prevent it from respawning
|
|
if ((GET_BPARAM3(macroObject.params) & RESPAWN_INFO_DONT_RESPAWN) != RESPAWN_INFO_DONT_RESPAWN) {
|
|
// Spawn the new macro object.
|
|
newObj = spawn_object_abs_with_rot(
|
|
&gMacroObjectDefaultParent, // Parent object
|
|
0, // Unused
|
|
preset.model, // Model ID
|
|
preset.behavior, // Behavior address
|
|
macroObject.pos[0], // X-position
|
|
macroObject.pos[1], // Y-position
|
|
macroObject.pos[2], // Z-position
|
|
0x0, // X-rotation
|
|
convert_rotation(macroObject.yaw), // Y-rotation
|
|
0x0 // Z-rotation
|
|
);
|
|
|
|
newObj->oUnusedCoinParams = macroObject.params;
|
|
newObj->oBehParams = (((macroObject.params & 0x00FF) << 16) // Set 2nd byte from lower bits (shifted).
|
|
| (macroObject.params & 0xFF00)); // Set 3rd byte from upper bits.
|
|
newObj->oBehParams2ndByte = (macroObject.params & 0x00FF); // Set 2nd byte from lower bits.
|
|
newObj->respawnInfoType = RESPAWN_INFO_TYPE_MACRO_OBJECT;
|
|
newObj->respawnInfo = macroObjList - 1;
|
|
newObj->parentObj = newObj;
|
|
}
|
|
}
|
|
}
|
|
|
|
void spawn_macro_objects_hardcoded(s32 areaIndex, MacroObject *macroObjList) {
|
|
// This version of macroObjList has the preset and Y-Rotation separated,
|
|
// and lacks behavior params. Might be an early version of the macro object list?
|
|
Vec3s pos;
|
|
s16 macroObjPreset;
|
|
s16 yaw;
|
|
|
|
gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex;
|
|
gMacroObjectDefaultParent.header.gfx.activeAreaIndex = areaIndex;
|
|
|
|
while (TRUE) {
|
|
macroObjPreset = *macroObjList++;
|
|
|
|
if (macroObjPreset < 0) {
|
|
break;
|
|
}
|
|
|
|
pos[0] = *macroObjList++;
|
|
pos[1] = *macroObjList++;
|
|
pos[2] = *macroObjList++;
|
|
yaw = *macroObjList++;
|
|
|
|
// Spawn objects based on hardcoded presets, and most seem to be for Big Boo's Haunt.
|
|
// However, BBH doesn't use this function so this might just be an early test?
|
|
switch (macroObjPreset) {
|
|
case 0: spawn_macro_abs_yrot_2params(MODEL_NONE, bhvBooStaircase, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
case 1: spawn_macro_abs_yrot_2params(MODEL_BBH_TILTING_FLOOR_PLATFORM, bhvBbhTiltingTrapPlatform, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
case 2: spawn_macro_abs_yrot_2params(MODEL_BBH_TUMBLING_PLATFORM, bhvBbhTumblingBridge, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
case 3: spawn_macro_abs_yrot_2params(MODEL_BBH_MOVING_BOOKSHELF, bhvHauntedBookshelf, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
case 4: spawn_macro_abs_yrot_2params(MODEL_BBH_MESH_ELEVATOR, bhvMeshElevator, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
case 20: spawn_macro_abs_yrot_2params(MODEL_YELLOW_COIN, bhvYellowCoin, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
case 21: spawn_macro_abs_yrot_2params(MODEL_YELLOW_COIN, bhvYellowCoin, pos[0], pos[1], pos[2], yaw, 0); break;
|
|
default: break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void spawn_special_objects(s32 areaIndex, TerrainData **specialObjList) {
|
|
s32 i;
|
|
s32 offset;
|
|
Vec3s pos;
|
|
s16 extraParams[4];
|
|
ModelID16 model;
|
|
u8 type;
|
|
u8 presetID;
|
|
u8 defaultParam;
|
|
const BehaviorScript *behavior;
|
|
|
|
s32 numOfSpecialObjects = *(*specialObjList)++;
|
|
|
|
gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex;
|
|
gMacroObjectDefaultParent.header.gfx.activeAreaIndex = areaIndex;
|
|
|
|
for (i = 0; i < numOfSpecialObjects; i++) {
|
|
presetID = *(*specialObjList)++;
|
|
pos[0] = *(*specialObjList)++;
|
|
pos[1] = *(*specialObjList)++;
|
|
pos[2] = *(*specialObjList)++;
|
|
|
|
offset = 0;
|
|
while (TRUE) {
|
|
if (SpecialObjectPresets[offset].preset_id == presetID) {
|
|
break;
|
|
}
|
|
offset++;
|
|
}
|
|
|
|
model = SpecialObjectPresets[offset].model;
|
|
behavior = SpecialObjectPresets[offset].behavior;
|
|
type = SpecialObjectPresets[offset].type;
|
|
defaultParam = SpecialObjectPresets[offset].defParam;
|
|
|
|
switch (type) {
|
|
case SPTYPE_NO_YROT_OR_PARAMS:
|
|
spawn_macro_abs_yrot_2params(model, behavior, pos[0], pos[1], pos[2], 0, 0);
|
|
break;
|
|
case SPTYPE_YROT_NO_PARAMS:
|
|
extraParams[0] = *(*specialObjList)++; // Y-rotation
|
|
spawn_macro_abs_yrot_2params(model, behavior, pos[0], pos[1], pos[2], extraParams[0], 0);
|
|
break;
|
|
case SPTYPE_PARAMS_AND_YROT:
|
|
extraParams[0] = *(*specialObjList)++; // Y-rotation
|
|
extraParams[1] = *(*specialObjList)++; // Params
|
|
spawn_macro_abs_yrot_2params(model, behavior, pos[0], pos[1], pos[2], extraParams[0], extraParams[1]);
|
|
break;
|
|
case SPTYPE_UNKNOWN:
|
|
extraParams[0] = *(*specialObjList)++; // Unknown, gets put into obj->oMacroUnk108 as a float
|
|
extraParams[1] = *(*specialObjList)++; // Unknown, gets put into obj->oMacroUnk10C as a float
|
|
extraParams[2] = *(*specialObjList)++; // Unknown, gets put into obj->oMacroUnk110 as a float
|
|
spawn_macro_abs_special(model, behavior, pos[0], pos[1], pos[2], extraParams[0], extraParams[1], extraParams[2]);
|
|
break;
|
|
case SPTYPE_DEF_PARAM_AND_YROT:
|
|
extraParams[0] = *(*specialObjList)++; // Y-rotation
|
|
spawn_macro_abs_yrot_param1(model, behavior, pos[0], pos[1], pos[2], extraParams[0], defaultParam);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifdef NO_SEGMENTED_MEMORY
|
|
u32 get_special_objects_size(s16 *data) {
|
|
s16 *startPos = data;
|
|
s32 i;
|
|
u8 presetID;
|
|
s32 offset;
|
|
|
|
s32 numOfSpecialObjects = *data++;
|
|
|
|
for (i = 0; i < numOfSpecialObjects; i++) {
|
|
presetID = (u8) *data++;
|
|
data += 3;
|
|
offset = 0;
|
|
|
|
while (TRUE) {
|
|
if (SpecialObjectPresets[offset].preset_id == presetID) {
|
|
break;
|
|
}
|
|
offset++;
|
|
}
|
|
|
|
switch (SpecialObjectPresets[offset].type) {
|
|
case SPTYPE_NO_YROT_OR_PARAMS:
|
|
break;
|
|
case SPTYPE_YROT_NO_PARAMS:
|
|
data++;
|
|
break;
|
|
case SPTYPE_PARAMS_AND_YROT:
|
|
data += 2;
|
|
break;
|
|
case SPTYPE_UNKNOWN:
|
|
data += 3;
|
|
break;
|
|
case SPTYPE_DEF_PARAM_AND_YROT:
|
|
data++;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return data - startPos;
|
|
}
|
|
#endif
|