mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "dynos.cpp.h"
 | 
						|
 | 
						|
static Array<Pair<const char*, DataNode<Collision>*>>& DynosCollisions() {
 | 
						|
    static Array<Pair<const char*, DataNode<Collision>*>> sDynosCollisions;
 | 
						|
    return sDynosCollisions;
 | 
						|
}
 | 
						|
 | 
						|
void 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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // 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;
 | 
						|
    }
 | 
						|
 | 
						|
    // Add to collisions
 | 
						|
    _DynosCollisions.Add({ collisionName, _Node });
 | 
						|
}
 | 
						|
 | 
						|
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 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);
 | 
						|
    }
 | 
						|
}
 |