[IFxEffectDef] Continue with the efx parser

This commit is contained in:
momo5502 2017-02-09 21:14:28 +01:00
parent ac75429d1d
commit 2d828d27db
3 changed files with 46 additions and 6 deletions

View File

@ -4,8 +4,8 @@ namespace Assets
{
void IFxEffectDef::load(Game::XAssetHeader* /*header*/, std::string name, Components::ZoneBuilder::Zone* /*builder*/)
{
#if 0
Components::FileSystem::File rawFx(fmt::sprintf("fx/%s.efx", name.data()));
#ifdef DEBUG
Components::FileSystem::File rawFx(Utils::String::VA("fx/%s.efx", name.data()));
if (rawFx.exists())
{
const char* session = rawFx.getBuffer().data();
@ -30,12 +30,48 @@ namespace Assets
Game::FxEditorEffectDef efx;
ZeroMemory(&efx, sizeof(efx));
// for (int i = 0; i < FX_ELEM_FIELD_COUNT; ++i)
// {
// Game::s_elemFields[i].handler(&session, efx.elems);
// }
for (efx.elemCount = 0; ; ++efx.elemCount)
{
const char* value = Game::Com_Parse(&session);
if (!value) break;
if (*value != '{')
{
Components::Logger::Error("Expected '{' to start a new segment, found '%s' instead.\n", value);
}
if (efx.elemCount >= ARRAYSIZE(efx.elems))
{
Components::Logger::Error("Cannot have more than %i segments.\n", ARRAYSIZE(efx.elems));
}
Game::FxEditorElemDef* element = &efx.elems[efx.elemCount];
// TODO: Initialize some stuff here
while (true)
{
std::string newValue = Game::Com_Parse(&session);
if (newValue[0] != '}') break;
for (int i = 0; i < FX_ELEM_FIELD_COUNT; ++i)
{
if(Game::s_elemFields[i].keyName == std::string(newValue))
{
// TODO: Allow loading assets from raw!
if(Game::s_elemFields[i].handler(&session, element)) break;
Components::Logger::Error("Failed to parse element %s!\n", newValue);
}
}
if (!Game::Com_MatchToken(&session, ";", 1))
{
Components::Logger::Error("Expected token ';'\n");
}
}
}
Game::Com_EndParseSession();
// TODO: Convert editor fx to real fx
}
#endif
}

View File

@ -35,6 +35,7 @@ namespace Game
Com_BeginParseSession_t Com_BeginParseSession = Com_BeginParseSession_t(0x4AAB80);
Com_SetSpaceDelimited_t Com_SetSpaceDelimited = Com_SetSpaceDelimited_t(0x4FC710);
Com_Parse_t Com_Parse = Com_Parse_t(0x474D60);
Com_MatchToken_t Com_MatchToken = Com_MatchToken_t(0x447130);
Com_SetSlowMotion_t Com_SetSlowMotion = Com_SetSlowMotion_t(0x446E20);
Con_DrawMiniConsole_t Con_DrawMiniConsole = Con_DrawMiniConsole_t(0x464F30);

View File

@ -86,6 +86,9 @@ namespace Game
typedef char* (__cdecl * Com_Parse_t)(const char **data_p);
extern Com_Parse_t Com_Parse;
typedef bool (__cdecl * Com_MatchToken_t)(const char **data_p, const char* token, int size);
extern Com_MatchToken_t Com_MatchToken;
typedef void(__cdecl * Com_SetSlowMotion_t)(float start, float end, int duration);
extern Com_SetSlowMotion_t Com_SetSlowMotion;