sm64coopdx/data/dynos_mgr_col.cpp
PeachyPeach 32f395fb0c
Some checks failed
Build coop / build-linux (push) Has been cancelled
Build coop / build-steamos (push) Has been cancelled
Build coop / build-windows-opengl (push) Has been cancelled
Build coop / build-windows-directx (push) Has been cancelled
Build coop / build-macos-arm (push) Has been cancelled
Build coop / build-macos-intel (push) Has been cancelled
ModFs improvements (#907)
* zip + json properties; check existing file in create file

* smlua_audio_utils_replace_sequence

* audio_stream_load, audio_sample_load, smlua_model_util_get_id

* get_texture_info + can also load PNG files

* smlua_collision_util_get

* add wildcard in properties files + set text mode

* filepath restrictions

* Some mod_storage improvements

- Cache mod storage files into a map to reduce file I/O
- Fix a bug in mod_storage_save
- Add mod_storage_load_all that returns all keys/values as a table

* shutdown; fix buffer overflow; fix warnings; lua table

* reject binary files starting with MZ or ELF

* function members

* better doc

* adding file rewind

* ModFS guide; replace yaml by ini; read string buffer changes
2025-10-21 19:42:06 +02:00

78 lines
2.1 KiB
C++

#include "dynos.cpp.h"
extern "C" {
#include "pc/mods/mod_fs.h"
}
static Array<Pair<const char*, DataNode<Collision>*>>& DynosCollisions() {
static Array<Pair<const char*, DataNode<Collision>*>> sDynosCollisions;
return sDynosCollisions;
}
bool DynOS_Col_Activate(const SysPath &aFilename, const char *aCollisionName) {
auto& _DynosCollisions = DynosCollisions();
// check for duplicates
for (s32 i = 0; i < _DynosCollisions.Count(); ++i) {
if (!strcmp(_DynosCollisions[i].first, aCollisionName)) {
return true;
}
}
// Allocate name
u16 collisionLen = strlen(aCollisionName);
char* collisionName = (char*)calloc(1, sizeof(char) * (collisionLen + 1));
strcpy(collisionName, aCollisionName);
// Load
DataNode<Collision>* _Node = DynOS_Col_LoadFromBinary(aFilename, collisionName);
if (!_Node) {
free(collisionName);
return false;
}
// Add to collisions
_DynosCollisions.Add({ collisionName, _Node });
return true;
}
Collision* DynOS_Col_Get(const char* collisionName) {
auto& _DynosCollisions = DynosCollisions();
// check levels
auto& levelsArray = DynOS_Lvl_GetArray();
for (auto& lvl : levelsArray) {
for (auto& col : lvl.second->mCollisions) {
if (col->mName == collisionName) {
return col->mData;
}
}
}
// check mod actor collisions
for (s32 i = 0; i < _DynosCollisions.Count(); ++i) {
if (!strcmp(_DynosCollisions[i].first, collisionName)) {
return _DynosCollisions[i].second->mData;
}
}
// check modfs file
if (is_mod_fs_file(collisionName)) {
if (DynOS_Col_Activate(collisionName, collisionName)) {
return DynOS_Col_Get(collisionName);
}
}
// check builtin collisions
return (Collision*)DynOS_Builtin_Col_GetFromName(collisionName);
}
void DynOS_Col_ModShutdown() {
auto& _DynosCollisions = DynosCollisions();
while (_DynosCollisions.Count() > 0) {
auto& pair = _DynosCollisions[0];
free((void*)pair.first);
Delete(pair.second);
_DynosCollisions.Remove(0);
}
}