mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-23 20:45:11 +00:00
Added in-game console for DynOS and Lua errors
This commit is contained in:
parent
75861d365e
commit
d043fdd22d
35 changed files with 322 additions and 97 deletions
|
@ -8,6 +8,7 @@ extern "C" {
|
|||
#include "engine/behavior_script.h"
|
||||
#include "engine/math_util.h"
|
||||
#include "src/game/moving_texture.h"
|
||||
#include "src/pc/djui/djui_console.h"
|
||||
}
|
||||
|
||||
#define FUNCTION_CODE (u32) 0x434E5546
|
||||
|
@ -725,9 +726,23 @@ void Print(const char *aFmt, Args... aArgs) {
|
|||
fflush(stdout);
|
||||
}
|
||||
|
||||
#define PrintError(...) { \
|
||||
template <typename... Args>
|
||||
void PrintConsole(const char *aFmt, Args... aArgs) {
|
||||
snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, aFmt, aArgs...);
|
||||
djui_console_message_create(gDjuiConsoleTmpBuffer);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
void PrintError(const char *aFmt, Args... aArgs) {
|
||||
printf(aFmt, aArgs...);
|
||||
printf("\r\n");
|
||||
fflush(stdout);
|
||||
PrintConsole(aFmt, aArgs...);
|
||||
}
|
||||
#define PrintDataError(...) { \
|
||||
if (aGfxData->mErrorCount == 0) Print(" ERROR!"); \
|
||||
Print(__VA_ARGS__); \
|
||||
PrintConsole(__VA_ARGS__); \
|
||||
aGfxData->mErrorCount++; \
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ void ClearGfxDataNodes(DataNodes<T> &aDataNodes) {
|
|||
static bool DynOS_Actor_WriteBinary(const SysPath &aOutputFilename, GfxData *aGfxData) {
|
||||
BinFile *_File = BinFile::OpenW(aOutputFilename.c_str());
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -182,6 +182,7 @@ static void DynOS_Actor_Generate(const SysPath &aPackFolder, Array<Pair<u64, Str
|
|||
|
||||
// Parse data
|
||||
PrintNoNewLine("%s.bin: Model identifier: %X - Processing... ", _GeoRootName.begin(), _GfxData->mModelIdentifier);
|
||||
PrintConsole("%s.bin: Model identifier: %X - Processing... ", _GeoRootName.begin(), _GfxData->mModelIdentifier);
|
||||
DynOS_Geo_Parse(_GfxData, _GeoNode, true);
|
||||
|
||||
// Init animation data
|
||||
|
@ -215,7 +216,7 @@ static void DynOS_Actor_Generate(const SysPath &aPackFolder, Array<Pair<u64, Str
|
|||
if (_GfxData->mErrorCount == 0) {
|
||||
DynOS_Actor_WriteBinary(_BinFilename, _GfxData);
|
||||
} else {
|
||||
Print(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
PrintError(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
}
|
||||
// Clear data pointers
|
||||
ClearGfxDataNodes(_GfxData->mLights);
|
||||
|
|
|
@ -9,7 +9,7 @@ DataNode<Ambient_t>* DynOS_AmbientT_Parse(GfxData* aGfxData, DataNode<Ambient_t>
|
|||
|
||||
// Check tokens count
|
||||
if (aNode->mTokens.Count() < 8) {
|
||||
PrintError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
PrintDataError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
static void ScanAnimationDataFile(GfxData *aGfxData, const SysPath &aFilename) {
|
||||
FILE *_File = fopen(aFilename.c_str(), "rb");
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to open file \"%s\"", aFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to open file \"%s\"", aFilename.c_str());
|
||||
}
|
||||
|
||||
// Load file into a buffer while removing all comments
|
||||
|
@ -70,7 +70,7 @@ static void ScanAnimationDataFile(GfxData *aGfxData, const SysPath &aFilename) {
|
|||
|
||||
case DATA_TYPE_ANIMATION: {
|
||||
if (_Data.Count() < 10) {
|
||||
PrintError(" ERROR: %s: Not enough data", _DataName.begin());
|
||||
PrintDataError(" ERROR: %s: Not enough data", _DataName.begin());
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ static void ScanAnimationDataFile(GfxData *aGfxData, const SysPath &aFilename) {
|
|||
static void ScanAnimationTableFile(GfxData *aGfxData, const SysPath &aFilename) {
|
||||
FILE *_File = fopen(aFilename.c_str(), "rb");
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to open file \"%s\"", aFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to open file \"%s\"", aFilename.c_str());
|
||||
}
|
||||
|
||||
// Load file into a buffer while removing all comments
|
||||
|
|
|
@ -1973,7 +1973,7 @@ static BehaviorScript ParseBehaviorScriptSymbolArg(GfxData *aGfxData, DataNode<B
|
|||
BehaviorScript value = ParseBehaviorScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &found);
|
||||
if (!found) {
|
||||
const String &_Arg = aNode->mTokens[aTokenIndex - 1];
|
||||
PrintError(" ERROR: Unknown bhv arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown bhv arg: %s", _Arg.begin());
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
@ -2262,7 +2262,7 @@ static void ParseBehaviorScriptSymbol(GfxData *aGfxData, DataNode<BehaviorScript
|
|||
//BehaviorScript _Bs[] = { LOAD_ANIMATIONS_EXT(field, animIndex) };
|
||||
//memcpy(aHead, _Bs, sizeof(_Bs));
|
||||
//aHead += (sizeof(_Bs) / sizeof(_Bs[0]));
|
||||
PrintError(" ERROR: : Custom external animations are currently not supported. Skipping LOAD_ANIMATIONS_EXT.");
|
||||
PrintDataError(" ERROR: : Custom external animations are currently not supported. Skipping LOAD_ANIMATIONS_EXT.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -2403,7 +2403,7 @@ static void ParseBehaviorScriptSymbol(GfxData *aGfxData, DataNode<BehaviorScript
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown behavior symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown behavior symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<BehaviorScript> *DynOS_Bhv_Parse(GfxData *aGfxData, DataNode<BehaviorScript> *aNode, bool aDisplayPercent) {
|
||||
|
@ -2466,7 +2466,7 @@ static void DynOS_Bhv_Write(BinFile* aFile, GfxData* aGfxData, DataNode<Behavior
|
|||
static bool DynOS_Bhv_WriteBinary(const SysPath &aOutputFilename, GfxData *aGfxData) {
|
||||
BinFile *_File = BinFile::OpenW(aOutputFilename.c_str());
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2490,7 +2490,7 @@ static DataNode<BehaviorScript> *DynOS_Bhv_Load(BinFile *aFile, GfxData *aGfxDat
|
|||
// Sanity check the files size. The minimum valid size is 9 bytes.
|
||||
// 1 byte for the type, 1 bytes for the name length, 3 bytes for the version, And 4 bytes for the behaviors size.
|
||||
if (aFile->Size() < 9) {
|
||||
PrintError(" ERROR: Behavior file is smaller then it should be, Rejecting '%s'.", aFile->GetFilename());
|
||||
PrintDataError(" ERROR: Behavior file is smaller then it should be, Rejecting '%s'.", aFile->GetFilename());
|
||||
// We have nothing to return, So return NULL.
|
||||
return NULL;
|
||||
}
|
||||
|
@ -2512,7 +2512,7 @@ static DataNode<BehaviorScript> *DynOS_Bhv_Load(BinFile *aFile, GfxData *aGfxDat
|
|||
// we can't read it no matter what. If it's just minor or patch. We might have
|
||||
// code to support it.
|
||||
if (majorVersion != BEHAVIOR_MIN_MAJOR_VER || (minorVersion < BEHAVIOR_MIN_MINOR_VER || patchVersion < BEHAVIOR_MIN_PATCH_VER)) {
|
||||
PrintError(" ERROR: Behavior file is version %u.%u.%u, which is not supported! Rejecting '%s'.", majorVersion, minorVersion, patchVersion, aFile->GetFilename());
|
||||
PrintDataError(" ERROR: Behavior file is version %u.%u.%u, which is not supported! Rejecting '%s'.", majorVersion, minorVersion, patchVersion, aFile->GetFilename());
|
||||
// We don't return this since we failed to read the behavior.
|
||||
Delete(_Node);
|
||||
// We have nothing to return, So return NULL.
|
||||
|
@ -2523,7 +2523,7 @@ static DataNode<BehaviorScript> *DynOS_Bhv_Load(BinFile *aFile, GfxData *aGfxDat
|
|||
// We also check if the specified behavior size is valid for the file.
|
||||
u32 dataSize = aFile->Read<u32>();
|
||||
if (dataSize == 0 || (dataSize > (aFile->Size() - aFile->Offset()))) {
|
||||
PrintError(" ERROR: Behavior file has a invalid behavior in it! Rejecting '%s'.", aFile->GetFilename());
|
||||
PrintDataError(" ERROR: Behavior file has a invalid behavior in it! Rejecting '%s'.", aFile->GetFilename());
|
||||
// We don't return this since we failed to read the behavior.
|
||||
Delete(_Node);
|
||||
// We have nothing to return, So return NULL.
|
||||
|
@ -2537,7 +2537,7 @@ static DataNode<BehaviorScript> *DynOS_Bhv_Load(BinFile *aFile, GfxData *aGfxDat
|
|||
// Read it
|
||||
for (u32 i = 0; i != _Node->mSize; ++i) {
|
||||
if (aFile->EoF()) {
|
||||
PrintError(" ERROR: Reached EOF when reading file! Expected %llx bytes!", _Node->mSize * sizeof(u32));
|
||||
PrintDataError(" ERROR: Reached EOF when reading file! Expected %llx bytes!", _Node->mSize * sizeof(u32));
|
||||
break;
|
||||
}
|
||||
u32 _Value = aFile->Read<u32>();
|
||||
|
@ -2626,13 +2626,14 @@ static void DynOS_Bhv_Generate(const SysPath &aPackFolder, Array<Pair<u64, Strin
|
|||
|
||||
// Parse data
|
||||
PrintNoNewLine("%s.bhv: Model identifier: %X - Processing... ", _BhvRootName.begin(), _GfxData->mModelIdentifier);
|
||||
PrintConsole("%s.bhv: Model identifier: %X - Processing... ", _BhvRootName.begin(), _GfxData->mModelIdentifier);
|
||||
DynOS_Bhv_Parse(_GfxData, _BhvNode, true);
|
||||
|
||||
// Write if no error
|
||||
if (_GfxData->mErrorCount == 0) {
|
||||
DynOS_Bhv_WriteBinary(_BinFilename, _GfxData);
|
||||
} else {
|
||||
Print(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
PrintError(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
}
|
||||
|
||||
// Clear data pointers
|
||||
|
|
|
@ -42,21 +42,21 @@ struct CollisionValidationData {
|
|||
|
||||
static void ValidateColSectionChange(GfxData* aGfxData, struct CollisionValidationData& aColValData, u8 section) {
|
||||
if (aColValData.section == COL_SECTION_END) {
|
||||
PrintError("Found new col section after COL_END");
|
||||
PrintDataError("Found new col section after COL_END");
|
||||
}
|
||||
|
||||
if (aColValData.section != section) {
|
||||
if (aColValData.vtxAlloc != aColValData.vtxCount) {
|
||||
PrintError("Improper vtx count found in section. Allocated: %u, Defined: %u", aColValData.vtxAlloc, aColValData.vtxCount);
|
||||
PrintDataError("Improper vtx count found in section. Allocated: %u, Defined: %u", aColValData.vtxAlloc, aColValData.vtxCount);
|
||||
}
|
||||
if (aColValData.triAlloc != aColValData.triCount) {
|
||||
PrintError("Improper triangle count found in section. Allocated: %u, Defined: %u", aColValData.triAlloc, aColValData.triCount);
|
||||
PrintDataError("Improper triangle count found in section. Allocated: %u, Defined: %u", aColValData.triAlloc, aColValData.triCount);
|
||||
}
|
||||
if (aColValData.specialAlloc != aColValData.specialCount) {
|
||||
PrintError("Improper sepcial count found in section. Allocated: %u, Defined: %u", aColValData.triAlloc, aColValData.triCount);
|
||||
PrintDataError("Improper sepcial count found in section. Allocated: %u, Defined: %u", aColValData.triAlloc, aColValData.triCount);
|
||||
}
|
||||
if (aColValData.waterBoxAlloc != aColValData.waterBoxCount) {
|
||||
PrintError("Improper water box count found in section. Allocated: %u, Defined: %u", aColValData.waterBoxAlloc, aColValData.waterBoxCount);
|
||||
PrintDataError("Improper water box count found in section. Allocated: %u, Defined: %u", aColValData.waterBoxAlloc, aColValData.waterBoxCount);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,17 +65,17 @@ static void ValidateColSectionChange(GfxData* aGfxData, struct CollisionValidati
|
|||
|
||||
static void ValidateColInit(GfxData* aGfxData, struct CollisionValidationData& aColValData) {
|
||||
if (aColValData.tokenIndex != 0) {
|
||||
PrintError("COL_INIT found after the first token");
|
||||
PrintDataError("COL_INIT found after the first token");
|
||||
}
|
||||
ValidateColSectionChange(aGfxData, aColValData, COL_SECTION_VTX);
|
||||
}
|
||||
|
||||
static void ValidateColVertexInit(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0) {
|
||||
if (strcmp(aColValData.lastSymbol, "COL_INIT") != 0) {
|
||||
PrintError("COL_VERTEX_INIT found outside of vertex section");
|
||||
PrintDataError("COL_VERTEX_INIT found outside of vertex section");
|
||||
}
|
||||
if (arg0 < 0) {
|
||||
PrintError("COL_VERTEX_INIT with a negative count: %d", arg0);
|
||||
PrintDataError("COL_VERTEX_INIT with a negative count: %d", arg0);
|
||||
}
|
||||
aColValData.vtxAlloc = arg0;
|
||||
aColValData.vtxCount = 0;
|
||||
|
@ -83,14 +83,14 @@ static void ValidateColVertexInit(GfxData* aGfxData, struct CollisionValidationD
|
|||
|
||||
static void ValidateColVertex(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1, s16 arg2) {
|
||||
if (aColValData.section != COL_SECTION_VTX) {
|
||||
PrintError("COL_VERTEX found outside of vertex section");
|
||||
PrintDataError("COL_VERTEX found outside of vertex section");
|
||||
}
|
||||
aColValData.vtxCount++;
|
||||
}
|
||||
|
||||
static void ValidateColTriInit(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1) {
|
||||
if (arg1 < 0) {
|
||||
PrintError("COL_TRI_INIT with a negative count: %d", arg1);
|
||||
PrintDataError("COL_TRI_INIT with a negative count: %d", arg1);
|
||||
}
|
||||
ValidateColSectionChange(aGfxData, aColValData, COL_SECTION_TRI);
|
||||
aColValData.triAlloc = arg1;
|
||||
|
@ -99,16 +99,16 @@ static void ValidateColTriInit(GfxData* aGfxData, struct CollisionValidationData
|
|||
|
||||
static void ValidateColTri(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1, s16 arg2) {
|
||||
if (aColValData.section != COL_SECTION_TRI) {
|
||||
PrintError("COL_TRI found outside of triangle section");
|
||||
PrintDataError("COL_TRI found outside of triangle section");
|
||||
}
|
||||
if (arg0 < 0 || arg0 > aColValData.vtxCount) {
|
||||
PrintError("COL_TRI used vertex outside of known range for first param: %d", arg0);
|
||||
PrintDataError("COL_TRI used vertex outside of known range for first param: %d", arg0);
|
||||
}
|
||||
if (arg1 < 0 || arg1 > aColValData.vtxCount) {
|
||||
PrintError("COL_TRI used vertex outside of known range for second param: %d", arg1);
|
||||
PrintDataError("COL_TRI used vertex outside of known range for second param: %d", arg1);
|
||||
}
|
||||
if (arg2 < 0 || arg2 > aColValData.vtxCount) {
|
||||
PrintError("COL_TRI used vertex outside of known range for third param: %d", arg2);
|
||||
PrintDataError("COL_TRI used vertex outside of known range for third param: %d", arg2);
|
||||
}
|
||||
aColValData.triCount++;
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ static void ValidateColEnd(GfxData* aGfxData, struct CollisionValidationData& aC
|
|||
|
||||
static void ValidateColSpecialInit(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0) {
|
||||
if (arg0 < 0) {
|
||||
PrintError("COL_SPECIAL_INIT with a negative count: %d", arg0);
|
||||
PrintDataError("COL_SPECIAL_INIT with a negative count: %d", arg0);
|
||||
}
|
||||
ValidateColSectionChange(aGfxData, aColValData, COL_SECTION_SPECIAL);
|
||||
aColValData.specialAlloc = arg0;
|
||||
|
@ -136,7 +136,7 @@ static void ValidateColSpecialInit(GfxData* aGfxData, struct CollisionValidation
|
|||
|
||||
static void ValidateColWaterBoxInit(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0) {
|
||||
if (arg0 < 0) {
|
||||
PrintError("COL_WATER_BOX_INIT with a negative count: %d", arg0);
|
||||
PrintDataError("COL_WATER_BOX_INIT with a negative count: %d", arg0);
|
||||
}
|
||||
ValidateColSectionChange(aGfxData, aColValData, COL_SECTION_WATER_BOX);
|
||||
aColValData.waterBoxAlloc = arg0;
|
||||
|
@ -145,28 +145,28 @@ static void ValidateColWaterBoxInit(GfxData* aGfxData, struct CollisionValidatio
|
|||
|
||||
static void ValidateColWaterBox(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1, s16 arg2, s16 arg3, s16 arg4, s16 arg5) {
|
||||
if (aColValData.section != COL_SECTION_WATER_BOX) {
|
||||
PrintError("COL_WATER_BOX found outside of water box section");
|
||||
PrintDataError("COL_WATER_BOX found outside of water box section");
|
||||
}
|
||||
aColValData.waterBoxCount++;
|
||||
}
|
||||
|
||||
static void ValidateColSpecialObject(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1, s16 arg2, s16 arg3) {
|
||||
if (aColValData.section != COL_SECTION_SPECIAL) {
|
||||
PrintError("SPECIAL_OBJECT found outside of special section");
|
||||
PrintDataError("SPECIAL_OBJECT found outside of special section");
|
||||
}
|
||||
aColValData.specialCount++;
|
||||
}
|
||||
|
||||
static void ValidateColSpecialObjectWithYaw(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1, s16 arg2, s16 arg3, s16 arg4) {
|
||||
if (aColValData.section != COL_SECTION_SPECIAL) {
|
||||
PrintError("SPECIAL_OBJECT_WITH_YAW found outside of special section");
|
||||
PrintDataError("SPECIAL_OBJECT_WITH_YAW found outside of special section");
|
||||
}
|
||||
aColValData.specialCount++;
|
||||
}
|
||||
|
||||
static void ValidateColSpecialObjectWithYawAndParam(GfxData* aGfxData, struct CollisionValidationData& aColValData, s16 arg0, s16 arg1, s16 arg2, s16 arg3, s16 arg4, s16 arg5) {
|
||||
if (aColValData.section != COL_SECTION_SPECIAL) {
|
||||
PrintError("SPECIAL_OBJECT_WITH_YAW_AND_PARAM found outside of special section");
|
||||
PrintDataError("SPECIAL_OBJECT_WITH_YAW_AND_PARAM found outside of special section");
|
||||
}
|
||||
aColValData.specialCount++;
|
||||
}
|
||||
|
@ -458,7 +458,7 @@ static s16 ParseColSymbolArg(GfxData* aGfxData, DataNode<Collision>* aNode, u64&
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown col arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown col arg: %s", _Arg.begin());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -575,7 +575,7 @@ static void ParseCollisionSymbol(GfxData* aGfxData, DataNode<Collision>* aNode,
|
|||
col_symbol_6(SPECIAL_OBJECT_WITH_YAW_AND_PARAM, ValidateColSpecialObjectWithYawAndParam);
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown col symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown col symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<Collision>* DynOS_Col_Parse(GfxData* aGfxData, DataNode<Collision>* aNode, bool aDisplayPercent) {
|
||||
|
@ -595,7 +595,7 @@ DataNode<Collision>* DynOS_Col_Parse(GfxData* aGfxData, DataNode<Collision>* aNo
|
|||
}
|
||||
|
||||
if (colValData.section != COL_SECTION_END) {
|
||||
PrintError("Collision did not end with COL_END");
|
||||
PrintDataError("Collision did not end with COL_END");
|
||||
}
|
||||
|
||||
if (aDisplayPercent && aGfxData->mErrorCount == 0) { Print("100%%"); }
|
||||
|
@ -603,7 +603,7 @@ DataNode<Collision>* DynOS_Col_Parse(GfxData* aGfxData, DataNode<Collision>* aNo
|
|||
aNode->mLoadIndex = aGfxData->mLoadIndex++;
|
||||
|
||||
if (aGfxData->mErrorCount > 0) {
|
||||
Print("Failed to parse collision: '%s'", aNode->mName.begin());
|
||||
PrintDataError("Failed to parse collision: '%s'", aNode->mName.begin());
|
||||
}
|
||||
|
||||
return aNode;
|
||||
|
@ -630,7 +630,7 @@ void DynOS_Col_Write(BinFile* aFile, GfxData* aGfxData, DataNode<Collision> *aNo
|
|||
static bool DynOS_Col_WriteBinary(const SysPath &aOutputFilename, GfxData *aGfxData, DataNode<Collision>* _Node) {
|
||||
BinFile *_File = BinFile::OpenW(aOutputFilename.c_str());
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -706,13 +706,14 @@ void DynOS_Col_Generate(const SysPath &aPackFolder, Array<Pair<u64, String>> _Ac
|
|||
|
||||
// Parse data
|
||||
PrintNoNewLine("%s.col: Model identifier: %X - Processing... ", _ColRootName.begin(), _GfxData->mModelIdentifier);
|
||||
PrintConsole("%s.col: Model identifier: %X - Processing... ", _ColRootName.begin(), _GfxData->mModelIdentifier);
|
||||
DynOS_Col_Parse(_GfxData, _ColNode, true);
|
||||
|
||||
// Write if no error
|
||||
if (_GfxData->mErrorCount == 0) {
|
||||
DynOS_Col_WriteBinary(_ColFilename, _GfxData, _ColNode);
|
||||
} else {
|
||||
Print(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
PrintError(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
}
|
||||
|
||||
// Clear data pointers
|
||||
|
|
|
@ -29,7 +29,7 @@ static inline void DynOS_Bin_Compress_Free() {
|
|||
|
||||
static inline bool DynOS_Bin_Compress_Check(bool condition, const char *function, const char *filename, const char *message) {
|
||||
if (!condition) {
|
||||
Print("ERROR: %s: File \"%s\": %s", function, filename, message);
|
||||
PrintError("ERROR: %s: File \"%s\": %s", function, filename, message);
|
||||
DynOS_Bin_Compress_Free();
|
||||
return false;
|
||||
}
|
||||
|
@ -223,7 +223,7 @@ BinFile *DynOS_Bin_Decompress(const SysPath &aFilename) {
|
|||
uncompressRc == Z_OK,
|
||||
__FUNCTION__, aFilename.c_str(), "Cannot uncompress data"
|
||||
)) {
|
||||
Print("ERROR: uncompress rc: %d, length uncompressed: %lu, length compressed: %lu, length header: %lu", uncompressRc, sLengthUncompressed, sLengthCompressed, _LengthHeader);
|
||||
PrintError("ERROR: uncompress rc: %d, length uncompressed: %lu, length compressed: %lu, length header: %lu", uncompressRc, sLengthUncompressed, sLengthCompressed, _LengthHeader);
|
||||
return NULL;
|
||||
}
|
||||
Print("uncompress rc: %d, length uncompressed: %lu, length compressed: %lu, length header: %lu", uncompressRc, sLengthUncompressed, sLengthCompressed, _LengthHeader);
|
||||
|
|
|
@ -148,7 +148,7 @@ static s64 ParseGeoSymbolArg(GfxData* aGfxData, DataNode<GeoLayout>* aNode, u64&
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown geo arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown geo arg: %s", _Arg.begin());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -405,7 +405,7 @@ static void ParseGeoSymbol(GfxData* aGfxData, DataNode<GeoLayout>* aNode, GeoLay
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown geo symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown geo symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<GeoLayout>* DynOS_Geo_Parse(GfxData* aGfxData, DataNode<GeoLayout>* aNode, bool aDisplayPercent) {
|
||||
|
|
|
@ -480,7 +480,7 @@ static s64 ParseGfxSymbolArg(GfxData* aGfxData, DataNode<Gfx>* aNode, u64* pToke
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown gfx arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown gfx arg: %s", _Arg.begin());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -673,7 +673,7 @@ static String ConvertSetCombineModeArgToString(GfxData *aGfxData, const String&
|
|||
gfx_set_combine_mode_arg(G_CC_HILITERGBA2);
|
||||
gfx_set_combine_mode_arg(G_CC_HILITERGBDECALA2);
|
||||
gfx_set_combine_mode_arg(G_CC_HILITERGBPASSA2);
|
||||
PrintError(" ERROR: Unknown gfx gsDPSetCombineMode arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown gfx gsDPSetCombineMode arg: %s", _Arg.begin());
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@ -693,7 +693,7 @@ static Array<s64> ParseGfxSetCombineMode(GfxData* aGfxData, DataNode<Gfx>* aNode
|
|||
}
|
||||
}
|
||||
if (_Args.Count() < 8) {
|
||||
PrintError(" ERROR: gsDPSetCombineMode %s: Not enough arguments", _Buffer.begin());
|
||||
PrintDataError(" ERROR: gsDPSetCombineMode %s: Not enough arguments", _Buffer.begin());
|
||||
}
|
||||
return _Args;
|
||||
}
|
||||
|
@ -935,7 +935,7 @@ static void ParseGfxSymbol(GfxData* aGfxData, DataNode<Gfx>* aNode, Gfx*& aHead,
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown gfx symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown gfx symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<Gfx>* DynOS_Gfx_Parse(GfxData* aGfxData, DataNode<Gfx>* aNode) {
|
||||
|
|
|
@ -9,7 +9,7 @@ DataNode<Light_t>* DynOS_LightT_Parse(GfxData* aGfxData, DataNode<Light_t>* aNod
|
|||
|
||||
// Check tokens count
|
||||
if (aNode->mTokens.Count() < 12) {
|
||||
PrintError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
PrintDataError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,13 +9,13 @@ DataNode<Lights1>* DynOS_Lights_Parse(GfxData* aGfxData, DataNode<Lights1>* aNod
|
|||
|
||||
// Check tokens count
|
||||
if (aNode->mTokens.Count() < 10) {
|
||||
PrintError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
PrintDataError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
// Parse def token
|
||||
if (aNode->mTokens[0] != "gdSPDefLights1") {
|
||||
PrintError(" ERROR: Invalid def token: should be gdSPDefLights1, is %s", aNode->mTokens[0].begin());
|
||||
PrintDataError(" ERROR: Invalid def token: should be gdSPDefLights1, is %s", aNode->mTokens[0].begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
|
|
|
@ -523,7 +523,7 @@ static LevelScript ParseLevelScriptSymbolArg(GfxData* aGfxData, DataNode<LevelSc
|
|||
LevelScript value = ParseLevelScriptSymbolArgInternal(aGfxData, aNode, aTokenIndex, &found);
|
||||
if (!found) {
|
||||
const String& _Arg = aNode->mTokens[aTokenIndex - 1];
|
||||
PrintError(" ERROR: Unknown lvl arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown lvl arg: %s", _Arg.begin());
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
@ -827,7 +827,7 @@ static void ParseLevelScriptSymbol(GfxData* aGfxData, DataNode<LevelScript>* aNo
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown lvl symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown lvl symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<LevelScript>* DynOS_Lvl_Parse(GfxData* aGfxData, DataNode<LevelScript>* aNode, bool aDisplayPercent) {
|
||||
|
@ -884,7 +884,7 @@ static void DynOS_Lvl_Write(BinFile* aFile, GfxData* aGfxData, DataNode<LevelScr
|
|||
static bool DynOS_Lvl_WriteBinary(const SysPath &aOutputFilename, GfxData *aGfxData) {
|
||||
BinFile *_File = BinFile::OpenW(aOutputFilename.c_str());
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1078,6 +1078,7 @@ static bool DynOS_Lvl_GeneratePack_Internal(const SysPath &aPackFolder, Array<Pa
|
|||
|
||||
// Parse data
|
||||
PrintNoNewLine("%s.lvl: Model identifier: %X - Processing... ", _LvlRootName.begin(), _GfxData->mModelIdentifier);
|
||||
PrintConsole("%s.lvl: Model identifier: %X - Processing... ", _LvlRootName.begin(), _GfxData->mModelIdentifier);
|
||||
DynOS_Lvl_Parse(_GfxData, _LvlRoot, true);
|
||||
|
||||
// Force all of the movtexs, collisions, and trajectories into the compiled lvl
|
||||
|
@ -1102,7 +1103,7 @@ static bool DynOS_Lvl_GeneratePack_Internal(const SysPath &aPackFolder, Array<Pa
|
|||
if (_GfxData->mErrorCount == 0) {
|
||||
DynOS_Lvl_WriteBinary(_LvlFilename, _GfxData);
|
||||
} else {
|
||||
Print(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
PrintError(" %u error(s): Unable to parse data", _GfxData->mErrorCount);
|
||||
}
|
||||
|
||||
// Clear data pointers
|
||||
|
|
|
@ -404,7 +404,7 @@ static s64 ParseMacroObjectSymbolArg(GfxData* aGfxData, DataNode<MacroObject>* a
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown macro object arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown macro object arg: %s", _Arg.begin());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -451,7 +451,7 @@ static void ParseMacroObjectSymbol(GfxData* aGfxData, DataNode<MacroObject>* aNo
|
|||
macro_object_symbol_0(MACRO_OBJECT_END);
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown macro object symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown macro object symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<MacroObject>* DynOS_MacroObject_Parse(GfxData* aGfxData, DataNode<MacroObject>* aNode, bool aDisplayPercent) {
|
||||
|
|
|
@ -40,7 +40,7 @@ static s64 ParseMovtexSymbolArg(GfxData* aGfxData, DataNode<Movtex>* aNode, u64&
|
|||
movtex_constant(NULL);
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown movtex arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown movtex arg: %s", _Arg.begin());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ static void ParseMovtexSymbol(GfxData* aGfxData, DataNode<Movtex>* aNode, Movtex
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown movtex symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown movtex symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<Movtex>* DynOS_Movtex_Parse(GfxData* aGfxData, DataNode<Movtex>* aNode, bool aDisplayPercent) {
|
||||
|
|
|
@ -27,7 +27,7 @@ static Movtex* ParseMovtexQCSymbolArg(GfxData* aGfxData, DataNode<MovtexQC>* aNo
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown movtexqc arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown movtexqc arg: %s", _Arg.begin());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -183,7 +183,7 @@ static PointerData GetDataFromPointer(const void* aPtr, GfxData* aGfxData) {
|
|||
}
|
||||
}
|
||||
|
||||
PrintError("Unable to find pointer %x!", aPtr);
|
||||
PrintDataError("Unable to find pointer %x!", aPtr);
|
||||
return { "", 0 };
|
||||
}
|
||||
|
||||
|
|
|
@ -217,7 +217,7 @@ void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename) {
|
|||
} else if (_Buffer == "BehaviorScript") {
|
||||
_DataType = DATA_TYPE_BEHAVIOR_SCRIPT;
|
||||
} else {
|
||||
PrintError(" ERROR: Unknown type name: %s", _Buffer.begin());
|
||||
PrintDataError(" ERROR: Unknown type name: %s", _Buffer.begin());
|
||||
}
|
||||
_Buffer.Clear();
|
||||
}
|
||||
|
@ -266,7 +266,7 @@ void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename) {
|
|||
if (*c == '=') {
|
||||
pDataStart = c + 1;
|
||||
} else if (*c == ';') {
|
||||
PrintError(" ERROR: %s: Unexpected end of data", pDataName->begin());
|
||||
PrintDataError(" ERROR: %s: Unexpected end of data", pDataName->begin());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ static TexData* LoadTextureFromFile(GfxData *aGfxData, const char* aFile) {
|
|||
|
||||
// The file does not exist in either spot!
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to open file at \"%s\" or \"%s\"", _Filename.c_str(), _ActorFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to open file at \"%s\" or \"%s\"", _Filename.c_str(), _ActorFilename.c_str());
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ void DynOS_Tex_ConvertTextureDataToPng(GfxData *aGfxData, TexData* aTexture) {
|
|||
const u8 *_Palette = (aGfxData->mGfxContext.mCurrentPalette ? aGfxData->mGfxContext.mCurrentPalette->mData->mRawData.begin() : NULL);
|
||||
u8 *_Buffer = DynOS_Tex_ConvertToRGBA32(aTexture->mRawData.begin(), aTexture->mRawData.Count(), aTexture->mRawFormat, aTexture->mRawSize, _Palette);
|
||||
if (_Buffer == NULL) {
|
||||
PrintError(" ERROR: Unknown texture format");
|
||||
PrintDataError(" ERROR: Unknown texture format");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -80,7 +80,7 @@ void DynOS_Tex_ConvertTextureDataToPng(GfxData *aGfxData, TexData* aTexture) {
|
|||
s32 _PngLength = 0;
|
||||
u8 *_PngData = stbi_write_png_to_mem(_Buffer, 0, aTexture->mRawWidth, aTexture->mRawHeight, 4, &_PngLength);
|
||||
if (!_PngData || !_PngLength) {
|
||||
PrintError(" ERROR: Cannot convert texture to PNG");
|
||||
PrintDataError(" ERROR: Cannot convert texture to PNG");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -97,7 +97,7 @@ DataNode<TexData>* DynOS_Tex_Parse(GfxData* aGfxData, DataNode<TexData>* aNode)
|
|||
|
||||
// Check tokens Count
|
||||
if (aNode->mTokens.Count() < 1) {
|
||||
PrintError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
PrintDataError(" ERROR: %s: not enough data", aNode->mName.begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
|
@ -106,7 +106,7 @@ DataNode<TexData>* DynOS_Tex_Parse(GfxData* aGfxData, DataNode<TexData>* aNode)
|
|||
if (i0 != -1) {
|
||||
s32 i1 = aNode->mTokens[0].Find(".inc.c");
|
||||
if (i1 == -1) {
|
||||
PrintError(" ERROR: %s: missing .inc.c in String %s", aNode->mName.begin(), aNode->mTokens[0].begin());
|
||||
PrintDataError(" ERROR: %s: missing .inc.c in String %s", aNode->mName.begin(), aNode->mTokens[0].begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
|
@ -122,7 +122,7 @@ DataNode<TexData>* DynOS_Tex_Parse(GfxData* aGfxData, DataNode<TexData>* aNode)
|
|||
if (dq0 != -1) {
|
||||
s32 dq1 = aNode->mTokens[0].Find('\"', dq0 + 1);
|
||||
if (dq1 == -1) {
|
||||
PrintError(" ERROR: %s: missing second quote in String %s", aNode->mName.begin(), aNode->mTokens[0].begin());
|
||||
PrintDataError(" ERROR: %s: missing second quote in String %s", aNode->mName.begin(), aNode->mTokens[0].begin());
|
||||
return aNode;
|
||||
}
|
||||
|
||||
|
@ -181,7 +181,7 @@ void DynOS_Tex_Write(BinFile* aFile, GfxData* aGfxData, DataNode<TexData> *aNode
|
|||
static bool DynOS_Tex_WriteBinary(GfxData* aGfxData, const SysPath &aOutputFilename, String& aName, TexData* aTexData, bool aRawTexture) {
|
||||
BinFile *_File = BinFile::OpenW(aOutputFilename.c_str());
|
||||
if (!_File) {
|
||||
PrintError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
PrintDataError(" ERROR: Unable to create file \"%s\"", aOutputFilename.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -411,7 +411,7 @@ static void DynOS_Tex_GeneratePack_Recursive(const SysPath &aPackFolder, SysPath
|
|||
aGfxData->mModelIdentifier++;
|
||||
TexData* _TexData = LoadTextureFromFile(aGfxData, _Path.c_str());
|
||||
if (_TexData == NULL) {
|
||||
PrintError("Error reading texture from file: %s", _Path.c_str());
|
||||
PrintDataError("Error reading texture from file: %s", _Path.c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ static TexData* ParseTexListSymbol(GfxData* aGfxData, DataNode<TexData*>* aNode,
|
|||
}
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown texlist arg: %s", aToken.begin());
|
||||
PrintDataError(" ERROR: Unknown texlist arg: %s", aToken.begin());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ void DynOS_TexList_Write(BinFile* aFile, GfxData* aGfxData, DataNode<TexData*> *
|
|||
}
|
||||
}
|
||||
if (!found) {
|
||||
PrintError("Could not write texture in texlist");
|
||||
PrintDataError("Could not write texture in texlist");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ DataNode<TexData*>* DynOS_TexList_Load(BinFile *aFile, GfxData *aGfxData) {
|
|||
u32 _Value = aFile->Read<u32>();
|
||||
void *_Ptr = DynOS_Pointer_Load(aFile, aGfxData, _Value, &_Node->mFlags);
|
||||
if (_Ptr == NULL) {
|
||||
PrintError("Could not read texture in texlist");
|
||||
PrintDataError("Could not read texture in texlist");
|
||||
} else {
|
||||
_Node->mData[i] = ((DataNode<TexData>*)_Ptr)->mData;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ static s64 ParseTrajectorySymbolArg(GfxData* aGfxData, DataNode<Trajectory>* aNo
|
|||
trajectory_constant(NULL);
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown trajectory arg: %s", _Arg.begin());
|
||||
PrintDataError(" ERROR: Unknown trajectory arg: %s", _Arg.begin());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -59,7 +59,7 @@ static void ParseTrajectorySymbol(GfxData* aGfxData, DataNode<Trajectory>* aNode
|
|||
trajectory_symbol_0(TRAJECTORY_END);
|
||||
|
||||
// Unknown
|
||||
PrintError(" ERROR: Unknown trajectory symbol: %s", _Symbol.begin());
|
||||
PrintDataError(" ERROR: Unknown trajectory symbol: %s", _Symbol.begin());
|
||||
}
|
||||
|
||||
DataNode<Trajectory>* DynOS_Trajectory_Parse(GfxData* aGfxData, DataNode<Trajectory>* aNode, bool aDisplayPercent) {
|
||||
|
|
|
@ -33,14 +33,14 @@ void DynOS_Actor_AddCustom(const SysPath &aFilename, const char *aActorName) {
|
|||
|
||||
GfxData *_GfxData = DynOS_Actor_LoadFromBinary(aFilename, actorName, aFilename, false);
|
||||
if (!_GfxData) {
|
||||
Print(" ERROR: Couldn't load Actor Binary \"%s\" from \"%s\"", actorName, aFilename.c_str());
|
||||
PrintError(" ERROR: Couldn't load Actor Binary \"%s\" from \"%s\"", actorName, aFilename.c_str());
|
||||
free(actorName);
|
||||
return;
|
||||
}
|
||||
|
||||
void* geoLayout = (*(_GfxData->mGeoLayouts.end() - 1))->mData;
|
||||
if (!geoLayout) {
|
||||
Print(" ERROR: Couldn't load geo layout for \"%s\"", actorName);
|
||||
PrintError(" ERROR: Couldn't load geo layout for \"%s\"", actorName);
|
||||
free(actorName);
|
||||
return;
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ void DynOS_Actor_AddCustom(const SysPath &aFilename, const char *aActorName) {
|
|||
actorGfx.mPackIndex = MOD_PACK_INDEX;
|
||||
actorGfx.mGraphNode = (GraphNode *) DynOS_Model_LoadGeo(&id, MODEL_POOL_SESSION, geoLayout, true);
|
||||
if (!actorGfx.mGraphNode) {
|
||||
Print(" ERROR: Couldn't load graph node for \"%s\"", actorName);
|
||||
PrintError(" ERROR: Couldn't load graph node for \"%s\"", actorName);
|
||||
free(actorName);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -105,7 +105,7 @@ void DynOS_Bhv_HookAllCustomBehaviors() {
|
|||
|
||||
// Theres currently no better place but to do this here.
|
||||
if (smlua_hook_custom_bhv(script, scriptName) == 0) {
|
||||
PrintError(" ERROR: Failed to add custom behavior '%s'!", scriptName);
|
||||
PrintDataError(" ERROR: Failed to add custom behavior '%s'!", scriptName);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -86,7 +86,7 @@ void DynOS_Lvl_Activate(s32 modIndex, const SysPath &aFilename, const char *aLev
|
|||
auto& newScriptNode = newScripts[newScripts.Count() - 1];
|
||||
const void* originalScript = DynOS_Builtin_ScriptPtr_GetFromName(newScriptNode->mName.begin());
|
||||
if (originalScript == NULL) {
|
||||
Print("Could not find level to override: '%s'", newScriptNode->mName.begin());
|
||||
PrintError("Could not find level to override: '%s'", newScriptNode->mName.begin());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ void DynOS_Lvl_LoadBackground(void *aPtr) {
|
|||
double_break:
|
||||
|
||||
if (foundList == NULL) {
|
||||
Print("Could not find custom background");
|
||||
PrintError("Could not find custom background");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "djui_panel_pause.h"
|
||||
#include "djui_panel_join.h"
|
||||
#include "djui_panel_join_message.h"
|
||||
#include "djui_console.h"
|
||||
#include "../debuglog.h"
|
||||
#include "pc/cliopts.h"
|
||||
#include "game/level_update.h"
|
||||
|
@ -66,6 +67,10 @@ void djui_init(void) {
|
|||
|
||||
djui_panel_playerlist_create(NULL);
|
||||
|
||||
djui_console_create();
|
||||
}
|
||||
|
||||
void djui_init_late(void) {
|
||||
if (gCLIOpts.Network != NT_SERVER) {
|
||||
djui_panel_main_create(NULL);
|
||||
if (configLanguage[0] == '\0') {
|
||||
|
@ -130,6 +135,7 @@ void djui_render(void) {
|
|||
}
|
||||
|
||||
djui_cursor_update();
|
||||
djui_base_render(&gDjuiConsole->base);
|
||||
djui_interactable_update();
|
||||
djui_gfx_displaylist_end();
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ extern bool gDjuiDisabled;
|
|||
extern bool gDjuiRenderBehindHud;
|
||||
|
||||
void djui_init(void);
|
||||
void djui_init_late(void);
|
||||
void djui_connect_menu_open(void);
|
||||
void djui_lua_error(char* text);
|
||||
void djui_render(void);
|
||||
|
|
|
@ -414,6 +414,24 @@ void djui_base_destroy_children(struct DjuiBase* base) {
|
|||
base->child = NULL;
|
||||
}
|
||||
|
||||
void djui_base_destroy_one_child(struct DjuiBase* base) {
|
||||
// destroy last child in our linked list
|
||||
struct DjuiBaseChild* prev = NULL;
|
||||
struct DjuiBaseChild* child = base->child;
|
||||
while (child != NULL) {
|
||||
if (!child->next) { break; }
|
||||
prev = child;
|
||||
child = child->next;
|
||||
}
|
||||
|
||||
if (child) {
|
||||
child->base->parent = NULL;
|
||||
djui_base_destroy(child->base);
|
||||
free(child);
|
||||
if (prev) { prev->next = NULL; }
|
||||
}
|
||||
}
|
||||
|
||||
void djui_base_init(struct DjuiBase* parent, struct DjuiBase* base, bool (*render)(struct DjuiBase*), void (*destroy)(struct DjuiBase*)) {
|
||||
memset(base, 0, sizeof(struct DjuiBase));
|
||||
base->parent = parent;
|
||||
|
|
|
@ -70,4 +70,5 @@ void djui_base_compute_tree(struct DjuiBase* base);
|
|||
bool djui_base_render(struct DjuiBase* base);
|
||||
void djui_base_destroy(struct DjuiBase* base);
|
||||
void djui_base_destroy_children(struct DjuiBase* base);
|
||||
void djui_base_destroy_one_child(struct DjuiBase* base);
|
||||
void djui_base_init(struct DjuiBase* parent, struct DjuiBase* base, bool (*render)(struct DjuiBase*), void (*destroy)(struct DjuiBase*));
|
||||
|
|
144
src/pc/djui/djui_console.c
Normal file
144
src/pc/djui/djui_console.c
Normal file
|
@ -0,0 +1,144 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "djui.h"
|
||||
#include "djui_console.h"
|
||||
|
||||
#define MAX_CONSOLE_MESSAGES 500
|
||||
|
||||
struct DjuiConsole* gDjuiConsole = NULL;
|
||||
bool gDjuiConsoleFocus = false;
|
||||
char gDjuiConsoleTmpBuffer[CONSOLE_MAX_TMP_BUFFER] = "";
|
||||
u32 sDjuiConsoleMessages = 0;
|
||||
|
||||
bool djui_console_render(struct DjuiBase* base) {
|
||||
djui_base_set_size(base, gDjuiRoot->base.width.value, gDjuiRoot->base.height.value * 0.6f);
|
||||
|
||||
djui_rect_render(base);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void djui_console_destroy(struct DjuiBase* base) {
|
||||
struct DjuiConsole* console = (struct DjuiConsole*)base;
|
||||
free(console);
|
||||
}
|
||||
|
||||
void djui_console_toggle(void) {
|
||||
if (gDjuiConsole == NULL) { return; }
|
||||
gDjuiConsoleFocus = !gDjuiConsoleFocus;
|
||||
djui_base_set_visible(&gDjuiConsole->base, gDjuiConsoleFocus);
|
||||
|
||||
if (gDjuiConsoleFocus) {
|
||||
if (gDjuiChatBoxFocus) { djui_chat_box_toggle(); }
|
||||
djui_interactable_set_input_focus(&gDjuiConsole->base);
|
||||
} else {
|
||||
djui_interactable_set_input_focus(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static bool djui_console_on_key_down(UNUSED struct DjuiBase* base, int scancode) {
|
||||
if (gDjuiConsole == NULL) { return false; }
|
||||
f32 yMax = gDjuiConsole->base.comp.height - gDjuiConsole->flow->base.height.value;
|
||||
|
||||
f32* yValue = &gDjuiConsole->flow->base.y.value;
|
||||
bool canScrollUp = (*yValue > yMax);
|
||||
bool canScrollDown = (*yValue < 0);
|
||||
f32 pageAmount = gDjuiConsole->base.comp.height * 3.0f / 4.0f;
|
||||
|
||||
switch (scancode) {
|
||||
case SCANCODE_UP:
|
||||
if (canScrollUp) { *yValue = fmax(*yValue - 15, yMax); }
|
||||
break;
|
||||
case SCANCODE_DOWN:
|
||||
if (canScrollDown) { *yValue = fmin(*yValue + 15, 0); }
|
||||
break;
|
||||
case SCANCODE_PAGE_UP:
|
||||
if (canScrollUp) { *yValue = fmax(*yValue - pageAmount, yMax); }
|
||||
break;
|
||||
case SCANCODE_PAGE_DOWN:
|
||||
if (canScrollDown) { *yValue = fmin(*yValue + pageAmount, 0); }
|
||||
break;
|
||||
case SCANCODE_ESCAPE: djui_console_toggle(); break;
|
||||
default: break;
|
||||
}
|
||||
gDjuiConsole->scrolling = (*yValue != yMax);
|
||||
return true;
|
||||
}
|
||||
|
||||
void djui_console_message_create(char* message) {
|
||||
djui_base_compute_tree(&gDjuiConsole->base);
|
||||
struct DjuiBase* cfBase = &gDjuiConsole->flow->base;
|
||||
|
||||
f32 maxTextWidth = gDjuiConsole->base.comp.width - gDjuiConsole->base.padding.left.value - gDjuiConsole->base.padding.right.value;
|
||||
|
||||
struct DjuiText* text = djui_text_create(cfBase, message);
|
||||
struct DjuiBase* tBase = &text->base;
|
||||
djui_base_set_alignment(tBase, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM);
|
||||
djui_base_set_size_type(tBase, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE);
|
||||
djui_base_set_size(tBase, maxTextWidth, 32);
|
||||
djui_base_set_color(tBase, 255, 255, 255, 255);
|
||||
|
||||
// figure out chat message height
|
||||
text->base.comp.width = maxTextWidth;
|
||||
f32 messageHeight = djui_text_count_lines(text, 10) * (text->font->lineHeight * text->font->defaultFontScale) + 8;
|
||||
djui_base_set_size(tBase, maxTextWidth, messageHeight);
|
||||
|
||||
f32 heightAdjust = messageHeight + gDjuiConsole->flow->margin.value;
|
||||
cfBase->height.value += heightAdjust;
|
||||
|
||||
if (gDjuiConsole->scrolling) {
|
||||
cfBase->y.value -= heightAdjust;
|
||||
}
|
||||
|
||||
sDjuiConsoleMessages++;
|
||||
if (sDjuiConsoleMessages >= MAX_CONSOLE_MESSAGES) {
|
||||
if (cfBase->child) {
|
||||
heightAdjust = cfBase->child->base->height.value + gDjuiConsole->flow->margin.value;
|
||||
cfBase->height.value -= heightAdjust;
|
||||
if (gDjuiConsole->scrolling) {
|
||||
cfBase->y.value += heightAdjust;
|
||||
}
|
||||
}
|
||||
|
||||
djui_base_destroy_one_child(cfBase);
|
||||
sDjuiConsoleMessages--;
|
||||
}
|
||||
}
|
||||
|
||||
struct DjuiConsole* djui_console_create(void) {
|
||||
if (gDjuiConsole != NULL) {
|
||||
djui_base_destroy(&gDjuiConsole->base);
|
||||
gDjuiConsole = NULL;
|
||||
}
|
||||
|
||||
struct DjuiConsole* console = calloc(1, sizeof(struct DjuiConsole));
|
||||
struct DjuiBase* base = &console->base;
|
||||
|
||||
djui_base_init(NULL, base, djui_console_render, djui_console_destroy);
|
||||
djui_base_set_size_type(base, DJUI_SVT_ABSOLUTE, DJUI_SVT_ABSOLUTE);
|
||||
djui_base_set_size(base, gDjuiRoot->base.width.value, gDjuiRoot->base.height.value * 0.6f);
|
||||
djui_base_set_alignment(base, DJUI_HALIGN_LEFT, DJUI_VALIGN_TOP);
|
||||
djui_base_set_color(base, 0, 0, 0, 250);
|
||||
djui_base_set_padding(base, 0, 8, 8, 8);
|
||||
djui_base_set_visible(base, false);
|
||||
|
||||
djui_interactable_create(base, NULL);
|
||||
djui_interactable_hook_key(base, djui_console_on_key_down, NULL);
|
||||
|
||||
struct DjuiFlowLayout* flow = djui_flow_layout_create(base);
|
||||
struct DjuiBase* cfBase = &flow->base;
|
||||
djui_base_set_alignment(cfBase, DJUI_HALIGN_LEFT, DJUI_VALIGN_BOTTOM);
|
||||
djui_base_set_location(cfBase, 0, 0);
|
||||
djui_base_set_size_type(cfBase, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
|
||||
djui_base_set_size(cfBase, 1.0f, 0);
|
||||
djui_base_set_color(cfBase, 0, 0, 0, 0);
|
||||
djui_base_set_padding(cfBase, 2, 2, 2, 2);
|
||||
djui_flow_layout_set_margin(flow, 2);
|
||||
djui_flow_layout_set_flow_direction(flow, DJUI_FLOW_DIR_UP);
|
||||
cfBase->addChildrenToHead = true;
|
||||
cfBase->abandonAfterChildRenderFail = true;
|
||||
console->flow = flow;
|
||||
|
||||
gDjuiConsole = console;
|
||||
|
||||
return console;
|
||||
}
|
17
src/pc/djui/djui_console.h
Normal file
17
src/pc/djui/djui_console.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#pragma once
|
||||
#include "djui.h"
|
||||
|
||||
struct DjuiConsole {
|
||||
struct DjuiBase base;
|
||||
struct DjuiFlowLayout* flow;
|
||||
bool scrolling;
|
||||
};
|
||||
|
||||
#define CONSOLE_MAX_TMP_BUFFER 256
|
||||
extern struct DjuiConsole* gDjuiConsole;
|
||||
extern bool gDjuiConsoleFocus;
|
||||
extern char gDjuiConsoleTmpBuffer[];
|
||||
|
||||
void djui_console_message_create(char* message);
|
||||
void djui_console_toggle(void);
|
||||
struct DjuiConsole* djui_console_create(void);
|
|
@ -23,10 +23,12 @@ void djui_cursor_set_visible(bool visible) {
|
|||
djui_base_set_visible(&sMouseCursor->base, visible);
|
||||
}
|
||||
|
||||
if (configWindow.fullscreen) {
|
||||
wm_api->set_cursor_visible(false);
|
||||
} else {
|
||||
wm_api->set_cursor_visible(!visible);
|
||||
if (wm_api) {
|
||||
if (configWindow.fullscreen) {
|
||||
wm_api->set_cursor_visible(false);
|
||||
} else {
|
||||
wm_api->set_cursor_visible(!visible);
|
||||
}
|
||||
}
|
||||
sSavedMouseX = mouse_window_x;
|
||||
sSavedMouseY = mouse_window_y;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "djui_panel_pause.h"
|
||||
#include "djui_panel_modlist.h"
|
||||
#include "djui_panel_playerlist.h"
|
||||
#include "djui_console.h"
|
||||
|
||||
#include "src/pc/controller/controller_sdl.h"
|
||||
#include "src/pc/controller/controller_mouse.h"
|
||||
|
@ -17,6 +18,8 @@
|
|||
#define CALL_CALLBACK(x) if (base->interactable->x != NULL) { base->interactable->x(base); }
|
||||
#define CALL_CALLBACK_PARAM(x, y) if (base->interactable->x != NULL) { base->interactable->x(base, y); }
|
||||
|
||||
#define SCANCODE_F1 59
|
||||
|
||||
enum PadHoldDirection { PAD_HOLD_DIR_NONE, PAD_HOLD_DIR_UP, PAD_HOLD_DIR_DOWN, PAD_HOLD_DIR_LEFT, PAD_HOLD_DIR_RIGHT };
|
||||
static enum PadHoldDirection sKeyboardHoldDirection = PAD_HOLD_DIR_NONE;
|
||||
static u16 sKeyboardButtons = 0;
|
||||
|
@ -32,6 +35,7 @@ bool gInteractableOverridePad = false;
|
|||
OSContPad gInteractablePad = { 0 };
|
||||
static OSContPad sLastInteractablePad = { 0 };
|
||||
static int sLastMouseButtons = 0;
|
||||
static bool sControlDown = false;
|
||||
|
||||
static void djui_interactable_update_style(struct DjuiBase* base) {
|
||||
if (base == NULL) { return; }
|
||||
|
@ -180,6 +184,10 @@ void djui_interactable_set_binding(struct DjuiBase* base) {
|
|||
}
|
||||
|
||||
void djui_interactable_set_input_focus(struct DjuiBase* base) {
|
||||
if (gDjuiConsoleFocus && base != &gDjuiConsole->base) {
|
||||
return;
|
||||
}
|
||||
|
||||
djui_interactable_on_focus_end(gInteractableFocus);
|
||||
gInteractableFocus = base;
|
||||
djui_interactable_on_focus_begin(base);
|
||||
|
@ -195,6 +203,12 @@ bool djui_interactable_on_key_down(int scancode) {
|
|||
return true;
|
||||
}
|
||||
|
||||
if (scancode == SCANCODE_CONTROL_LEFT) {
|
||||
sControlDown = true;
|
||||
} else if (sControlDown && scancode == SCANCODE_F1) {
|
||||
djui_console_toggle();
|
||||
}
|
||||
|
||||
bool keyFocused = (gInteractableFocus != NULL)
|
||||
&& (gInteractableFocus->interactable != NULL)
|
||||
&& (gInteractableFocus->interactable->on_key_down != NULL);
|
||||
|
@ -220,7 +234,7 @@ bool djui_interactable_on_key_down(int scancode) {
|
|||
if (scancode == (int)configKeyChat[i]) { pressChat = true; }
|
||||
}
|
||||
|
||||
if (pressChat) {
|
||||
if (pressChat && !gDjuiConsoleFocus) {
|
||||
djui_chat_box_toggle();
|
||||
return true;
|
||||
}
|
||||
|
@ -273,6 +287,10 @@ void djui_interactable_on_key_up(int scancode) {
|
|||
}
|
||||
}
|
||||
|
||||
if (scancode == SCANCODE_CONTROL_LEFT) {
|
||||
sControlDown = false;
|
||||
}
|
||||
|
||||
if (keyFocused) {
|
||||
gInteractableFocus->interactable->on_key_up(gInteractableFocus, scancode);
|
||||
sKeyboardHoldDirection = PAD_HOLD_DIR_NONE;
|
||||
|
|
|
@ -28,11 +28,8 @@ struct DjuiRoot* djui_root_create(void) {
|
|||
|
||||
djui_base_init(NULL, base, djui_root_render, djui_root_destroy);
|
||||
|
||||
u32 windowWidth, windowHeight;
|
||||
wm_api->get_dimensions(&windowWidth, &windowHeight);
|
||||
|
||||
djui_base_set_location(base, 0, 0);
|
||||
djui_base_set_size(base, windowWidth, windowHeight);
|
||||
djui_base_set_size(base, 1280, 720);
|
||||
djui_base_set_color(base, 0, 0, 0, 0);
|
||||
|
||||
return root;
|
||||
|
|
|
@ -18,9 +18,10 @@
|
|||
#include "smlua_sync_table.h"
|
||||
|
||||
#include "pc/debuglog.h"
|
||||
#include "pc/djui/djui_console.h"
|
||||
|
||||
#define LOG_LUA(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(); } }
|
||||
#define LOG_LUA_LINE(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(); smlua_logline(); } }
|
||||
#define LOG_LUA(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(), snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), djui_console_message_create(gDjuiConsoleTmpBuffer); } }
|
||||
#define LOG_LUA_LINE(...) { if (!gSmLuaSuppressErrors) { _debuglog_print_log("LUA ", __FILE__), printf(__VA_ARGS__), printf("\n"), smlua_mod_error(); snprintf(gDjuiConsoleTmpBuffer, CONSOLE_MAX_TMP_BUFFER, __VA_ARGS__), djui_console_message_create(gDjuiConsoleTmpBuffer), smlua_logline(); } }
|
||||
|
||||
#ifdef DEVELOPMENT
|
||||
#define LUA_STACK_CHECK_BEGIN() int __LUA_STACK_TOP = lua_gettop(gLuaState)
|
||||
|
|
|
@ -752,7 +752,7 @@ void smlua_logline(void) {
|
|||
int level = 0;
|
||||
while (lua_getstack(L, level, &info)) {
|
||||
lua_getinfo(L, "nSl", &info);
|
||||
LOG_INFO(" [%d] %s:%d -- %s [%s]",
|
||||
LOG_LUA(" [%d] %s:%d -- %s [%s]",
|
||||
level, info.short_src, info.currentline,
|
||||
(info.name ? info.name : "<unknown>"), info.what);
|
||||
++level;
|
||||
|
|
|
@ -290,6 +290,7 @@ void main_func(void) {
|
|||
|
||||
sync_objects_init_system();
|
||||
djui_unicode_init();
|
||||
djui_init();
|
||||
mods_init();
|
||||
|
||||
// load config
|
||||
|
@ -367,7 +368,7 @@ void main_func(void) {
|
|||
audio_api = &audio_null;
|
||||
}
|
||||
|
||||
djui_init();
|
||||
djui_init_late();
|
||||
|
||||
if (gCLIOpts.Network == NT_CLIENT) {
|
||||
network_set_system(NS_SOCKET);
|
||||
|
|
Loading…
Reference in a new issue