mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "dynos.cpp.h"
 | 
						|
 | 
						|
static Array<Pair<const char*, void *>> sDynosCustomActors;
 | 
						|
 | 
						|
// TODO: the cleanup/refactor didn't really go as planned.
 | 
						|
//       clean up the actor management code more
 | 
						|
 | 
						|
void DynOS_Actor_AddCustom(const SysPath &aPackFolder, const char *aActorName) {
 | 
						|
    // check for duplicates
 | 
						|
    bool isUnique = true;
 | 
						|
    s32 foundIndex = -1;
 | 
						|
    for (s32 i = 0; i < DynOS_Actor_GetCount(); ++i) {
 | 
						|
        if (!strcmp(DynOS_Actor_GetName(i), aActorName)) {
 | 
						|
            isUnique = false;
 | 
						|
            foundIndex = i;
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    u16 actorLen = strlen(aActorName);
 | 
						|
    char* actorName = (char*)calloc(1, sizeof(char) * (actorLen + 1));
 | 
						|
    strcpy(actorName, aActorName);
 | 
						|
 | 
						|
    GfxData *_GfxData = DynOS_Actor_LoadFromBinary(aPackFolder, actorName);
 | 
						|
    if (!_GfxData) {
 | 
						|
        free(actorName);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    void* geoLayout = (*(_GfxData->mGeoLayouts.end() - 1))->mData;
 | 
						|
    if (!geoLayout) {
 | 
						|
        free(actorName);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Add to custom actors
 | 
						|
    s32 index = DynOS_Actor_GetCount();
 | 
						|
    if (isUnique) {
 | 
						|
        sDynosCustomActors.Add({ actorName, geoLayout });
 | 
						|
    } else {
 | 
						|
        index = foundIndex;
 | 
						|
        free(actorName);
 | 
						|
    }
 | 
						|
 | 
						|
    // Alloc and init the actors gfx list
 | 
						|
    Array<ActorGfx> &pActorGfxList = DynOS_Gfx_GetActorList();
 | 
						|
    pActorGfxList.Resize(DynOS_Actor_GetCount());
 | 
						|
    pActorGfxList[index].mPackIndex = 99;
 | 
						|
    pActorGfxList[index].mGfxData   = _GfxData;
 | 
						|
    pActorGfxList[index].mGraphNode = (GraphNode *) DynOS_Geo_GetGraphNode(geoLayout, false);
 | 
						|
}
 | 
						|
 | 
						|
s32 DynOS_Actor_GetCount() {
 | 
						|
    return (s32) DynOS_Builtin_Actor_GetCount() + sDynosCustomActors.Count();
 | 
						|
}
 | 
						|
 | 
						|
const char *DynOS_Actor_GetName(s32 aIndex) {
 | 
						|
    s32 builtinCount = DynOS_Builtin_Actor_GetCount();
 | 
						|
    if (aIndex < builtinCount) { return (const char *) DynOS_Builtin_Actor_GetNameFromIndex(aIndex); }
 | 
						|
    return sDynosCustomActors[aIndex - builtinCount].first;
 | 
						|
}
 | 
						|
 | 
						|
const void *DynOS_Actor_GetLayoutFromIndex(s32 aIndex) {
 | 
						|
    s32 builtinCount = DynOS_Builtin_Actor_GetCount();
 | 
						|
    if (aIndex < builtinCount) { return (const void *) DynOS_Builtin_Actor_GetFromIndex(aIndex); }
 | 
						|
    return sDynosCustomActors[aIndex - builtinCount].second;
 | 
						|
}
 | 
						|
 | 
						|
const void *DynOS_Actor_GetLayoutFromName(const char *aActorName) {
 | 
						|
    if (aActorName == NULL) { return NULL; }
 | 
						|
 | 
						|
    // check levels
 | 
						|
    auto& levelsArray = DynOS_Lvl_GetArray();
 | 
						|
    for (auto& lvl : levelsArray) {
 | 
						|
        for (auto& geo : lvl.second->mGeoLayouts) {
 | 
						|
            if (geo->mName == aActorName) {
 | 
						|
                return geo->mData;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // check actors
 | 
						|
    for (s32 i = 0; i < DynOS_Actor_GetCount(); ++i) {
 | 
						|
        if (!strcmp(DynOS_Actor_GetName(i), aActorName)) {
 | 
						|
            return DynOS_Actor_GetLayoutFromIndex(i);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return NULL;
 | 
						|
}
 | 
						|
 | 
						|
s32 DynOS_Actor_GetIndex(const void *aGeoLayout) {
 | 
						|
    for (s32 i = 0; i < DynOS_Actor_GetCount(); ++i) {
 | 
						|
        if (DynOS_Actor_GetLayoutFromIndex(i) == aGeoLayout) {
 | 
						|
            return i;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return -1;
 | 
						|
}
 | 
						|
 | 
						|
bool DynOS_Actor_IsCustom(s32 aIndex) {
 | 
						|
    s32 builtinCount = DynOS_Builtin_Actor_GetCount();
 | 
						|
    return aIndex >= builtinCount;
 | 
						|
}
 |