mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-12-22 16:30:23 +00:00
Delete star flags (#501)
* Expose save_file_remove_star_flags * new packet added a new packet type and two new functions * oops * create packet_save_remove_flag.c move the new network functions to a new file * Switch u32 to u8 Switched courseStarsToRemove from u32 to u8 for consistency * fixed the function -Fixed empty save file marked as existing -Fixed SAVE_FILE_EXISTS flag being deleted -Fixed removing ALL flags from the remote saves
This commit is contained in:
parent
8eb0babc07
commit
5d39741be1
11 changed files with 133 additions and 2 deletions
|
@ -70,7 +70,7 @@ override_allowed_functions = {
|
|||
"src/audio/external.h": [ " play_", "fade", "current_background", "stop_", "sound_banks", "drop_queued_background_music" ],
|
||||
"src/game/rumble_init.c": [ "queue_rumble_", "reset_rumble_timers" ],
|
||||
"src/pc/djui/djui_popup.h" : [ "create" ],
|
||||
"src/game/save_file.h": [ "save_file_get_", "save_file_set_flags", "save_file_clear_flags", "save_file_reload", "save_file_erase_current_backup_save", "save_file_set_star_flags", "save_file_is_cannon_unlocked", "touch_coin_score_age", "save_file_set_course_coin_score", "save_file_do_save" ],
|
||||
"src/game/save_file.h": [ "save_file_get_", "save_file_set_flags", "save_file_clear_flags", "save_file_reload", "save_file_erase_current_backup_save", "save_file_set_star_flags", "save_file_is_cannon_unlocked", "touch_coin_score_age", "save_file_set_course_coin_score", "save_file_do_save", "save_file_remove_star_flags" ],
|
||||
"src/pc/lua/utils/smlua_model_utils.h": [ "smlua_model_util_get_id" ],
|
||||
"src/game/object_list_processor.h": [ "set_object_respawn_info_bits" ],
|
||||
"src/game/mario_misc.h": [ "bhv_toad.*", "bhv_unlock_door.*" ],
|
||||
|
|
|
@ -8065,6 +8065,14 @@ function save_file_reload(load_all)
|
|||
-- ...
|
||||
end
|
||||
|
||||
--- @param fileIndex integer
|
||||
--- @param courseIndex integer
|
||||
--- @param starFlagsToRemove integer
|
||||
--- @return nil
|
||||
function save_file_remove_star_flags(fileIndex, courseIndex, starFlagsToRemove)
|
||||
-- ...
|
||||
end
|
||||
|
||||
--- @param fileIndex integer
|
||||
--- @param courseIndex integer
|
||||
--- @param coinScore integer
|
||||
|
|
|
@ -7007,6 +7007,28 @@
|
|||
|
||||
<br />
|
||||
|
||||
## [save_file_remove_star_flags](#save_file_remove_star_flags)
|
||||
|
||||
### Lua Example
|
||||
`save_file_remove_star_flags(fileIndex, courseIndex, starFlagsToRemove)`
|
||||
|
||||
### Parameters
|
||||
| Field | Type |
|
||||
| ----- | ---- |
|
||||
| fileIndex | `integer` |
|
||||
| courseIndex | `integer` |
|
||||
| starFlagsToRemove | `integer` |
|
||||
|
||||
### Returns
|
||||
- None
|
||||
|
||||
### C Prototype
|
||||
`void save_file_remove_star_flags(s32 fileIndex, s32 courseIndex, u32 starFlagsToRemove);`
|
||||
|
||||
[:arrow_up_small:](#)
|
||||
|
||||
<br />
|
||||
|
||||
## [save_file_set_course_coin_score](#save_file_set_course_coin_score)
|
||||
|
||||
### Lua Example
|
||||
|
|
|
@ -1507,6 +1507,7 @@
|
|||
- [save_file_get_total_star_count](functions-4.md#save_file_get_total_star_count)
|
||||
- [save_file_is_cannon_unlocked](functions-4.md#save_file_is_cannon_unlocked)
|
||||
- [save_file_reload](functions-4.md#save_file_reload)
|
||||
- [save_file_remove_star_flags](functions-4.md#save_file_remove_star_flags)
|
||||
- [save_file_set_course_coin_score](functions-4.md#save_file_set_course_coin_score)
|
||||
- [save_file_set_flags](functions-4.md#save_file_set_flags)
|
||||
- [save_file_set_star_flags](functions-4.md#save_file_set_star_flags)
|
||||
|
|
|
@ -703,6 +703,22 @@ void save_file_set_star_flags(s32 fileIndex, s32 courseIndex, u32 starFlags) {
|
|||
gSaveFileModified = TRUE;
|
||||
}
|
||||
|
||||
void save_file_remove_star_flags(s32 fileIndex, s32 courseIndex, u32 starFlagsToRemove) {
|
||||
if (INVALID_FILE_INDEX(fileIndex)) { return; }
|
||||
if (INVALID_SRC_SLOT(gSaveFileUsingBackupSlot)) { return; }
|
||||
|
||||
if (courseIndex == -1) {
|
||||
gSaveBuffer.files[fileIndex][gSaveFileUsingBackupSlot].flags &= ~STAR_FLAG_TO_SAVE_FLAG(starFlagsToRemove);
|
||||
network_send_save_remove_flag(fileIndex, courseIndex, 0, STAR_FLAG_TO_SAVE_FLAG(starFlagsToRemove));
|
||||
}
|
||||
else if (!INVALID_COURSE_STAR_INDEX(courseIndex)) {
|
||||
gSaveBuffer.files[fileIndex][gSaveFileUsingBackupSlot].courseStars[courseIndex] &= ~starFlagsToRemove;
|
||||
network_send_save_remove_flag(fileIndex, courseIndex, starFlagsToRemove, 0);
|
||||
}
|
||||
|
||||
gSaveFileModified = TRUE;
|
||||
}
|
||||
|
||||
s32 save_file_get_course_coin_score(s32 fileIndex, s32 courseIndex) {
|
||||
if (INVALID_FILE_INDEX(fileIndex)) { return 0; }
|
||||
if (INVALID_SRC_SLOT(gSaveFileUsingBackupSlot)) { return 0; }
|
||||
|
|
|
@ -148,6 +148,7 @@ void save_file_clear_flags(u32 flags);
|
|||
u32 save_file_get_flags(void);
|
||||
u32 save_file_get_star_flags(s32 fileIndex, s32 courseIndex);
|
||||
void save_file_set_star_flags(s32 fileIndex, s32 courseIndex, u32 starFlags);
|
||||
void save_file_remove_star_flags(s32 fileIndex, s32 courseIndex, u32 starFlagsToRemove);
|
||||
s32 save_file_get_course_coin_score(s32 fileIndex, s32 courseIndex);
|
||||
void save_file_set_course_coin_score(s32 fileIndex, s32 courseIndex, u8 coinScore);
|
||||
s32 save_file_is_cannon_unlocked(s32 fileIndex, s32 courseIndex);
|
||||
|
|
|
@ -26947,6 +26947,27 @@ int smlua_func_save_file_reload(lua_State* L) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
int smlua_func_save_file_remove_star_flags(lua_State* L) {
|
||||
if (L == NULL) { return 0; }
|
||||
|
||||
int top = lua_gettop(L);
|
||||
if (top != 3) {
|
||||
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "save_file_remove_star_flags", 3, top);
|
||||
return 0;
|
||||
}
|
||||
|
||||
s32 fileIndex = smlua_to_integer(L, 1);
|
||||
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "save_file_remove_star_flags"); return 0; }
|
||||
s32 courseIndex = smlua_to_integer(L, 2);
|
||||
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "save_file_remove_star_flags"); return 0; }
|
||||
u32 starFlagsToRemove = smlua_to_integer(L, 3);
|
||||
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "save_file_remove_star_flags"); return 0; }
|
||||
|
||||
save_file_remove_star_flags(fileIndex, courseIndex, starFlagsToRemove);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int smlua_func_save_file_set_course_coin_score(lua_State* L) {
|
||||
if (L == NULL) { return 0; }
|
||||
|
||||
|
@ -32684,6 +32705,7 @@ void smlua_bind_functions_autogen(void) {
|
|||
smlua_bind_function(L, "save_file_get_total_star_count", smlua_func_save_file_get_total_star_count);
|
||||
smlua_bind_function(L, "save_file_is_cannon_unlocked", smlua_func_save_file_is_cannon_unlocked);
|
||||
smlua_bind_function(L, "save_file_reload", smlua_func_save_file_reload);
|
||||
smlua_bind_function(L, "save_file_remove_star_flags", smlua_func_save_file_remove_star_flags);
|
||||
smlua_bind_function(L, "save_file_set_course_coin_score", smlua_func_save_file_set_course_coin_score);
|
||||
smlua_bind_function(L, "save_file_set_flags", smlua_func_save_file_set_flags);
|
||||
smlua_bind_function(L, "save_file_set_star_flags", smlua_func_save_file_set_star_flags);
|
||||
|
|
|
@ -97,6 +97,7 @@ void packet_process(struct Packet* p) {
|
|||
case PACKET_LEAVING: network_receive_leaving(p); break;
|
||||
case PACKET_SAVE_FILE: network_receive_save_file(p); break;
|
||||
case PACKET_SAVE_SET_FLAG: network_receive_save_set_flag(p); break;
|
||||
case PACKET_SAVE_REMOVE_FLAG: network_receive_save_remove_flag(p); break;
|
||||
case PACKET_NETWORK_PLAYERS: network_receive_network_players(p); break;
|
||||
case PACKET_DEATH: network_receive_death(p); break;
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ enum PacketType {
|
|||
PACKET_LEAVING,
|
||||
PACKET_SAVE_FILE,
|
||||
PACKET_SAVE_SET_FLAG,
|
||||
PACKET_SAVE_REMOVE_FLAG,
|
||||
PACKET_NETWORK_PLAYERS,
|
||||
PACKET_DEATH,
|
||||
|
||||
|
@ -261,6 +262,10 @@ void network_receive_save_file(struct Packet* p);
|
|||
void network_send_save_set_flag(s32 fileIndex, s32 courseIndex, u8 courseStars, u32 flags);
|
||||
void network_receive_save_set_flag(struct Packet* p);
|
||||
|
||||
// packet_save_remove_flag.c
|
||||
void network_send_save_remove_flag(s32 fileIndex, s32 courseIndex, u8 courseStarsToRemove, u32 flagsToRemove);
|
||||
void network_receive_save_remove_flag(struct Packet* p);
|
||||
|
||||
// packet_network_players.c
|
||||
void network_send_network_players_request(void);
|
||||
void network_receive_network_players_request(struct Packet* p);
|
||||
|
|
55
src/pc/network/packets/packet_save_remove_flag.c
Normal file
55
src/pc/network/packets/packet_save_remove_flag.c
Normal file
|
@ -0,0 +1,55 @@
|
|||
#include <stdio.h>
|
||||
#include "../network.h"
|
||||
#include "game/save_file.h"
|
||||
#include "buffers/buffers.h"
|
||||
#include "pc/debuglog.h"
|
||||
|
||||
extern u8 gSaveFileUsingBackupSlot;
|
||||
|
||||
void network_send_save_remove_flag(s32 fileIndex, s32 courseIndex, u8 courseStarsToRemove, u32 flagsToRemove) {
|
||||
struct Packet p = { 0 };
|
||||
packet_init(&p, PACKET_SAVE_REMOVE_FLAG, true, PLMT_NONE);
|
||||
packet_write(&p, &fileIndex, sizeof(s32));
|
||||
packet_write(&p, &courseIndex, sizeof(s32));
|
||||
packet_write(&p, &courseStarsToRemove, sizeof(u8));
|
||||
packet_write(&p, &flagsToRemove, sizeof(u32));
|
||||
packet_write(&p, &gSaveFileUsingBackupSlot, sizeof(u8));
|
||||
network_send(&p);
|
||||
}
|
||||
|
||||
void network_receive_save_remove_flag(struct Packet* p) {
|
||||
s32 fileIndex;
|
||||
s32 courseIndex;
|
||||
u8 courseStarsToRemove;
|
||||
u32 flagsToRemove;
|
||||
u8 backupSlot;
|
||||
packet_read(p, &fileIndex, sizeof(s32));
|
||||
packet_read(p, &courseIndex, sizeof(s32));
|
||||
packet_read(p, &courseStarsToRemove, sizeof(u8));
|
||||
packet_read(p, &flagsToRemove, sizeof(u32));
|
||||
packet_read(p, &backupSlot, sizeof(u8));
|
||||
|
||||
if (fileIndex >= NUM_SAVE_FILES) {
|
||||
LOG_ERROR("Invalid fileIndex: %d", fileIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (courseIndex >= COURSE_COUNT) {
|
||||
LOG_ERROR("Invalid courseIndex: %d", courseIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (backupSlot > 1) {
|
||||
LOG_ERROR("Invalid backupSlot: %d", backupSlot);
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove the specified star flags and flags from the save data
|
||||
if (courseIndex == -1) {
|
||||
gSaveBuffer.files[fileIndex][backupSlot].flags &= ~flagsToRemove;
|
||||
} else {
|
||||
gSaveBuffer.files[fileIndex][backupSlot].courseStars[courseIndex] &= ~courseStarsToRemove;
|
||||
}
|
||||
|
||||
gSaveFileModified = TRUE;
|
||||
}
|
|
@ -47,4 +47,4 @@ void network_receive_save_set_flag(struct Packet* p) {
|
|||
gSaveBuffer.files[fileIndex][backupSlot].courseStars[courseIndex] |= courseStars;
|
||||
gSaveBuffer.files[fileIndex][backupSlot].flags |= flags;
|
||||
gSaveFileModified = TRUE;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue