* Mod storage & network_discord_id_from_local_index
Introducing mod storage, a key/value system for saving things like high scores or settings or anything like that to AppData\Roaming\sm64ex-coop\sav\mod-name.sav (Windows example)
You can currently save only strings meaning if you want to save a number you'd need to do
mod_storage_save("score", tostring(score))
and then
score = tonumber(mod_storage_load("score"))
To handle types like that.
network_discord_id_from_local_index() returns the discord ID of a player by local index.
Some misc changes I made were removing the unsed ini.h include in save_file.c and making the autogen converters output LF line endings instead of CRLF on windows.
* Prevent getting id if using direct connect
* Update djui_panel_player.c
Why does this bother me?
Co-authored-by: djoslin0 <djoslin0@users.noreply.github.com>
* Unhardcoded ceiling and floor limits
* Revert "Unhardcoded ceiling and floor limits"
* Revert "Revert "Unhardcoded ceiling and floor limits""
This reverts commit 71b2da4c4b898cda73f211620d138b346370d2ce.
* Let's try that again
It now only appears when someone stops hosting and you are disconnected from their lobby, I also changed the text to "Disconnected: server closed" in case it wasn't obvious
Just a simple code cleanup opportunity I saw
"I won't be porting this to the web" - djoslin
Compiled and tested everything to see if it works, feel free to check yourself or look over the code
Also, I noticed TARGET_N64 was there too, might do a clean up on that since we all know this isn't getting ported to the N64 anytime soon.
More lives fixes, death loop fix, add a null check and add get_dialog_id()
add a way to disable rom hack cam collisions
expose more sound management functions
* Add gsDPSetTextureFilter to DynOS symbols
* Refactor code and fix 2 year oversight
Refactored the main menu background code, now uses vec3f_set instead of manually setting every vector
Also finally fixed the bug where you load in with only 3 lives, this has been in coop for 2 years now and was likely made as a test for syncing live count and was never reversed.
* add skipInViewCheck to GraphNodeObject
* Remove idle set
Co-authored-by: djoslin0 <djoslin0@users.noreply.github.com>
* Allow Lua action hooks to specify custom functions for more behavior
...like gravity, and update all current mods to match.
Spin jump and wall slide from the Extended Moveset mod now have gravity
code basically matching the original mod.
Currently, any place you'd want to use one of these new action hooks
still requires an O(n) check through all action hook per call. This
should probably be changed.
* Fix some remaining issues with Extended Moveset Lua port
- Remove divergent spin jump code
- Remove divergent roll code
- Remap roll button to Y
- Reimplement dive slide to make dive hop work like the original
- Allow spin from double jump, backflip, side flip
* Fix more issues with Extended Moveset Lua port
- Reimplement all users of update_walking_speed to incorporate the Tight
Controls edits and modified speed caps
- Fix instances of angle arithmetic to wrap properly across the mod
* Don't chop off group bits of custom action flags; assign missing groups in mods
This fixes the Extended Moveset's underwater actions. Chopping off those
bits was making the game consider the underwater actions to be a part of
the Stationary group, which caused `check_common_stationary_cancels`,
which upwarps Mario to the surface.
* Tweak roll sliding angle tendency
Rolling will now gradually (but fairly quckly) try to tend Mario's
facing angle down the slope.
This is cleaner than my old method that tries to flip Mario's angle
(wrongly) when he begins moving downward, having that logic coexist with
the logic for normal sliding actions that can also tend Mario to face
backward down the slope. Just looks ugly now by comparison.
* Disallow spin jump on slides in Extended Moveset port
This matches the original mod
* Extended Moveset: Crazy Box Bounce check
* Extended Moveset: Fix hugging the wall when spin jumping after wall kick
* Extended Moveset: Fix ledge drop snapping up to ground
Just reimplement `act_air_hit_wall` ourselves.
* Extended Moveset: Add Kaze's walking speed fix
* smlua_hooks.c: Restore option to use old API for hook_mario_action
The intent is to allow mods outside of this repo to continue working.
Co-authored-by: djoslin0 <djoslin0@users.noreply.github.com>
* Support for more granular player colors
You can now configure RGB values for shirt, pants, gloves, and shoes.
Due to some limitations, configuring shoes does nothing at the moment.
* Remove paletteIndex and friends
Restructured and filled in some remaining code to account for that.
* Add Edit Palette panel to Player panel
* Change PlayerPalette contents to an enum-indexed array, remove shoes
This gets rid of all the hokey code doing switch cases on the
different parts.
* Fix goof with player model selection box
Should actually have affect now even if a custom palette is being used.
* Fix gap in player color display list commands
The extra space was leftover from when I was trying to get shoes
working. Forgot to clean it up.
* Standardize PlayerParts enum, including for lua constants autogen
* djui_panel_player.c: Properly hook sending palette changes on unpause
Editing the palette and then unpausing should send out the packet to
everyone with the new palette changes (and update the palette preset
selection box), but since we weren't hooking that situation before, it
would stay changed only for you. You would have had to press the Back
button for it to work right.
* Allow Lua mods to continue using `paletteIndex`, `overridePaletteIndex`
This lets mod code like this still work unchanged:
if s.team == 2 then
np.overridePaletteIndex = 7
elseif s.team == 1 then
np.overridePaletteIndex = 15
else
np.overridePaletteIndex = np.paletteIndex
end
It's essentially faked, and would work strangely if the value of either
variable was inspected more closely directly. This should at least
handle the typical use case, though.
Every frame, `overridePaletteIndex` is checked to see if it was modified
from its previous value. If so, `overridePalette` is set to the preset
corresponding to the index. `paletteIndex` contains a special value that
when used to assign to `overridePaletteIndex`, it copies `palette` into
`overridePalette` to restore the real colors, which of course may not
follow the presets at all.
* characters.h: Pack `PlayerPalette` to eliminate size differences between computers
* mario_misc.c: Remove remaining "TODO GAG"
* First attempt
First attempt at having other Mario objects create ripples.
Works very inconsistently, the position of players not currently interacting with the painting seems to influence whether the ripples will work or not
* Moved nearest mario code from geo_painting_update
Instead of using the nearest mario object for geo_painting_update, I use it in painting.c functions that called for gPaintingMarioXYZPos, substituting the nearest Mario object's position instead, as well as using it for the last floor mario was over.
This method still isn't quite perfect and there's a few more things I'd like to fix/change.
1. If a Mario is closer to the painting (perhaps right against the middle) other Mario's can't trigger ripplings at all unless they get closer than the closest Mario
2. I would like for all Entry and Exit ripples to interrupt each other, meaning if multiple Marios jump in, each one triggers a ripple one after the other
3. I want to hear the other player's exit sounds
* Add currPositionValid
Sets currPositionValid to false for NetworkPlayers who are connected, who changed levels to a level different from the local player, and who are not the local player when the local player changes levels.
* Set currPositionValid
Sets currPositionValid to false for update packets that don't match local area.
Sets it to true for update packets that do match local area.
* Send change area/level immediately
Adds a function network_on_loaded_area2() which only sends a change level or area event and doesn't clear the sync ids.
Calls this function almost immediately as opposed to waiting for LOADING_LEVEL_THRESHOLD frames
* Add currPositionValid to NetworkPlayer
currPositionValid (which is used by painting.c to determine if a player should be considered for the closest player to the painting) is a variable that tells you if a network player's marioObj has a position which can be relied upon as a valid position for that player.
network_player_update_course_level sets it to false for a network player if the new location does not match the local player's location.
network_receive_player sets it to false if a network player's update is from a different location than the local player, but sets it to TRUE if the update is from the same location.
update_course does NOT set it to true, because the location is not sure to be valid until we've received a location from the player with the right location attached to it.
* Use currValidPosition correctly
Uses currValidPosition correctly, also add debug text for seeing closest player to painting.
* fix merge
* Fix merge
* Verboser logging and invpos on enter
* Multi collision arrays
* Removed nearest code, added comments
* Added simultaneous ripples on one painting
* Added commented Gamepad from Background line
* Removed debug logging
* renamed secondary network_on_loaded function
* Added early multiple paintings rippling at once
* Added multiple paintings rippling simultaneously
Co-authored-by: djoslin0 <djoslin0@users.noreply.github.com>
Added two options, one which lets user choose which gamepad to use, and one
which allows game to be played with gamepad while in the background.
These two features together allow for "splitscreen" (sort of) multiplayer by
starting up instances and joining them together and selecting different
gamepads for each one.
Gamepad choices are 0-7. If a number is chosen that does not correspond to a
gamepad, the previous gamepad (last number you were on this session that had
a working gamepad) is used.
Moved dynos parsing for bhvs and models to a common file
Fixed recursive descent to correctly parse the entire expression
Adjusted bhv generation to use recursive descent
Switched all known behavior comparisons to the overridden versions
Fixed issue with Chain Chomp in star road
Unhardcoded KingBobomb values, Mips values, star dialog values
Generated tex files when they're of the form levels/XXX/NUMBER
Now lua behaviors can call cur_obj_set_home_once() to set home correctly
Lua behaviors are now overridden correctly when created through spawn infos
Behavior checks now translate to the overridden behavior before checking
This method of interpolation aims to correctly interpolate the render
transformation matrices as best as possible without doing an entirely
new render pass. This is accomplished by deconstructing the matrices
into its composition of transformations, interpolating those simpler
transformations individually, and then reconstructing the
transformation matrix with the interpolated transformations.
Local head rotation is now no longer copied to all other players
C-Up mode head rotation now sends to the other players through
the player packet so others can see the head move around
m->particleFlags are now synced to the other players now
Fixed the following audio bugs:
Bug: Rom-hacks sequences don't seem to be affected by volume scaling and
muting
Fix: Force the BGM sequences to follow the vanilla behavior:
Volume can't go higher than default volume
Volume is reduced to 31% when the game is paused
Audio is stopped when the game is paused outside the Castle levels
Bug: (Pointed out by Draco) Mario's voice clips are not replaced by the
player's character's in the following instances: fall to death
barrier, "here we go" in the ending cutscene, "let's a go"
after selecting a star, "okey dokey" after starting the game.
Fix: The first two ones now call
play_character_sound(m, CHAR_SOUND_...) instead of
play_sound(SOUND_MARIO_..., pos). The last two ones couldn't be
fixed the same way for two reasons: First, the corresponding sounds
were not referenced in the sound table, second, the sound played is
always cut-off after a few frames (due to how sm64 resets the sound
banks after loading a level).
Added SOUND_*_LETS_A_GO and SOUND_*_OKEY_DOKEY sounds for each playable
character as Bass samples.
Character Bass sounds work the same way as vanilla sounds (i.e. can be
played with play_character_sound), but they cannot be prematurely stopped
by sm64 sound banks shenanigans.
This fixes the cut-off for both the star select and the castle grounds
entry, plays the sound corresponding to the player's character, and doesn't
need to extend or edit the sound table.
DynOS can detect texture duplicates when generating a bin or lvl file.
When a duplicate is detected, the name of the original texture node is
written instead of the whole PNG data, decreasing significantly the
resulting file size.
Bug: DynOS models with animations cannot swap animations if they are
loaded via lua (smlua_model_util_get_id and
obj_set_model_extended).
Fix: DynOS_Actor_GetActorGfx takes a graph node instead of a georef,
and checks for DynosValidActors graph nodes if georef is NULL.
Bug: The game can crash when calling obj_set_model_extended inside a
HOOK_ON_OBJECT_RENDER hook.
Fix: The crash happens in smlua_model_util_load_with_pool_and_cache_id
due to pool being NULL. If the game can't allocate an
AllocOnlyPool object, use DynOS to generate the graph node.
Bug: warp_to_level and similar functions don't trigger HOOK_ON_WARP.
Fix: Call HOOK_ON_WARP hooks in DynOS_Warp_UpdateWarp and
DynOS_Warp_UpdateExit after level and mario initialization.
Bug: The game sometimes calls HOOK_ON_OBJECT_RENDER hooks for
unintended objects.
Fix: Initialize hookRender field to 0 when creating an object.
Bug: Actions can't apply gfx offsets to characters that have an anim
offset (Waluigi, Wario)
Fix: Add m->curAnimOffset to gfx.pos[1] instead of setting it to
m->pos[1] + m->curAnimOffset, except during the jumbo star
cutscene.
New gLevelValues exposed to lua:
pssSlideStarTime: the time limit in frames for PSS-style levels (default: 630)
pssSlideStarIndex: the index of the star spawned below the time limit for PSS-style levels (default: 1)
coinsRequiredForCoinStar: number of coins required to spawn the 7th star of a main course (default: 100)
wingCapDuration: duration in frames of the wing cap (default: 1800)
metalCapDuration: duration in frames of the metal cap (default: 600)
vanishCapDuration: duration in frames of the vanish cap (default: 600)
wingCapDurationTotwc: duration in frames of the wing cap given to the player at the entrance of TOTWC (default: 1200)
metalCapDurationCotmc: duration in frames of the metal cap given to the player at the entrance of COTMC (default: 600)
vanishCapDurationVcutm: duration in frames of the vanish cap given to the player at the entrance of VCUTM (default: 600)
Fixed a bug preventing the level music from restarting after defeating a Boss.
Fixed some bugs with 3D coins or any model with the geo_rotate_coin function:
Disable billboard and cylboard attributes.
Set the pitch and roll to 0 for the model to rotate properly.
The model no longer rotates every frame (even when the game is paused), but every time the object is updated.
Modified number_geo to allow it to display orange numbers from 0 to 999.
Edited red coins/secrets code:
Added two fields in the Area struct: numRedCoins and numSecrets
The number of red coins/secrets in every area is computed during level script processing
Removed the useless global gRedCoinsCollected
These changes fix the following bugs:
Wrong sound effect played and incorrect number displayed when there is more than 8 red coins/5 secrets
Desynced red coins/secrets counter when going from an area to another
Remotely spawning red coins/secrets stars in other areas without collecting all red coins/secrets
Pausing the game now shows the correct number of collected red coins / the total number of red coins in the current area.
Improved level_info.c and added functions to LUA:
const char *get_level_name_ascii(s16 courseNum, s16 levelNum, s16 areaIndex, s16 charCase):
Return a level name as an ascii string. If charCase is 1, capitalize all letters.
If charCase is -1, decapitalize all letters except the first one of each word.
const u8 *get_level_name_sm64(s16 courseNum, s16 levelNum, s16 areaIndex, s16 charCase):
Return a level name as an sm64 u8 string.
If charCase is 1, capitalize all letters.
If charCase is -1, decapitalize all letters except the first one of each word.
const char *get_level_name(s16 courseNum, s16 levelNum, s16 areaIndex):
Shortcut for get_level_name_ascii(courseNum, levelNum, areaIndex, -1).
const char *get_star_name_ascii(s16 courseNum, s16 starNum, s16 charCase):
Return a star name as an ascii string.
If charCase is 1, capitalize all letters.
If charCase is -1, decapitalize all letters except the first one of each word.
const u8 *get_star_name_sm64(s16 courseNum, s16 starNum, s16 charCase):
Return a star name as an sm64 u8 string.
If charCase is 1, capitalize all letters.
If charCase is -1, decapitalize all letters except the first one of each word.
const char *get_star_name(s16 courseNum, s16 starNum):
Shortcut for get_star_name_ascii(courseNum, starNum, -1).
Added play_transition function to LUA.
I chose to copy the function declaration to smlua_misc_utils.h instead of adding area.h
to the autogen tool, as most structures, variables and functions in area.h aren't meant
to be used by LUA scripts.
Added a dev-only warp chat command.
This command signature is /warp [LEVEL] [AREA] [ACT]. Level can be either a number
or a shorthand name (bob, wf, ccm...). Area and Act are numbers.
This command is available only when building the game with DEBUG and DEVELOPMENT.
This command cannot be used if hosting through Discord.
Fixed a bug with moving sounds when they are played via a lua script.
Bug: Moving sounds (including terrain sounds, flying sound, quicksand sound)
are not played correctly when a lua script play them via a call of
play_sound or play_sound_with_freq_scale. This is due to how the moving
sounds are handled internally. They use the f32 pointer provided to the
play_sound functions to decide if the sound must be kept playing,
stopped or restarted. Most of the time, the pointer provided is the
cameraToObject field of Mario's object graph node. Since smlua uses a
circular buffer for Vec3f conversion, this pointer is lost, and the
sound engine can't decide what to do with the sound, resulting in a
weird and incorrect sound effect.
Fix: play_sound and play_sound_with_freq_scale now calls
smlua_get_vec3f_for_play_sound before filling the sound request queue,
to retrieve the correct pointer from the Vec3f provided by smlua.
Added a basic lua profiler
If the game is compiled with LUA_PROFILER=1, displays on screen the average execution time per frame of each active lua mod, in microseconds.
Added object functions
For some reasons, accessing the object fields obj.o* via lua is rather slow, and can drastically increase execution time of custom behaviors. For basic stuff like setting an object's velocity or moving it, some functions, missing from the original code, have been added:
s32 obj_is_valid_for_interaction(struct Object *o): returns 1 if an object is valid for interaction, i.e. active, tangible and not interacted.
s32 obj_check_hitbox_overlap(struct Object *o1, struct Object *o2): returns 1 if two objects hitboxes overlap. Doesn't check tangibility, only hitbox values.
void obj_set_vel(struct Object *o, f32 vx, f32 vy, f32 vz): sets an object's velocity.
void obj_move_xyz(struct Object *o, f32 dx, f32 dy, f32 dz): moves an object position by (dx, dy, dz).
Bug fixes:
Disable collisions with walls and ceilings after Mario exits a warp pipe to prevent softlocks in narrow places.
Make the koopa shell exclamation box respawn after some time.
Quicksand no longer downwarps and instant-kills Mario if he's shocked while being above it.
* Some bug fixes.
Fix Bully Star Spawning Cutscene to be player dependent.
Add missing line to Makefile.
Fix compile error with Clang in save_file.c
* Fix DDD Chests Star spawining in the wrong location.
Mods as a directory of files depend on loading order for them to work
properly. Currently, the loading order is basically undefined behavior
and unpredictable. The function mod_set_loading_order is here to
specify this order. By default (and for now), the order will be
alphabetical and will follow the ascii table values, meaning digits
come before capital letters and lowercase letters.
Fixed a bug with mods as directories of files when they are downloaded.
The bug was the following: If two selected mods have files with the
same relative filename, they overwrite each other when downloaded,
causing file corruption and making the client game crash when loaded.
To fix it, the mod's directory name is appended to every .lua filename,
so each file has a unique filename when downloaded.
A ton of Bowser fixes, Grand star included.
Fixed Grand Star cutscene syncing.
Partially fix grand star syncing after joining late.
Fix Bowser's intro cutscene always playing even if you joined after the first person.
Hopefully fixed Bowser's state getting interrupted mid-fight just a bit.
Add nothing state sanity check, and send object reliability when cutscene is finished.
Fix ownership override.
When a player dies in water, the camera continues to use the camera for under water even when you exit the water with the bubble. This commit fixes the issue.