diff --git a/msvc2003/devilution/comparer-config.toml b/msvc2003/devilution/comparer-config.toml index d44ee262..73bfb2a0 100644 --- a/msvc2003/devilution/comparer-config.toml +++ b/msvc2003/devilution/comparer-config.toml @@ -2126,6 +2126,14 @@ addr = 0x46E9E0 name = "ActNpc360" addr = 0x46EA90 +[[func]] +name = "LoadNpcTable" +addr = 0x472400 + +[[func]] +name = "ReleaseNpcTable" +addr = 0x472710 + [[func]] name = "InitBossChar" addr = 0x472740 diff --git a/src/NpcTbl.cpp b/src/NpcTbl.cpp index ef51beaf..9f9409a3 100644 --- a/src/NpcTbl.cpp +++ b/src/NpcTbl.cpp @@ -1,60 +1,98 @@ #include "NpcTbl.h" +#include #include #include #include +#include "WindowsWrapper.h" + #include "File.h" #include "Generic.h" #include "NpcAct.h" NPC_TABLE *gNpcTable; -bool LoadNpcTable(const char *path) +BOOL LoadNpcTable(const char *path) { - const long size = GetFileSizeLong(path); - if (size == -1) - return false; + FILE *fp; + long n; + long num; + unsigned long size; - const long num = size / 0x18; + size = GetFileSizeLong(path); + if (size == -1) + return FALSE; + + num = size / 0x18; gNpcTable = (NPC_TABLE*)malloc(num * sizeof(NPC_TABLE)); if (gNpcTable == NULL) - return false; + return FALSE; - FILE *fp = fopen(path, "rb"); + fp = fopen(path, "rb"); if (fp == NULL) - return false; + { + free(gNpcTable); + gNpcTable = NULL; + return FALSE; + } - for (long n = 0; n < num; n++) //bits - gNpcTable[n].bits = File_ReadLE16(fp); - for (long n = 0; n < num; n++) //life - gNpcTable[n].life = File_ReadLE16(fp); - for (long n = 0; n < num; n++) //surf +#ifdef NONPORTABLE + for (n = 0; n < num; n++) //bits + fread(&gNpcTable[n].bits, 2, 1, fp); + for (n = 0; n < num; n++) //life + fread(&gNpcTable[n].life, 2, 1, fp); + for (n = 0; n < num; n++) //surf fread(&gNpcTable[n].surf, 1, 1, fp); - for (long n = 0; n < num; n++) //destroy_voice + for (n = 0; n < num; n++) //destroy_voice fread(&gNpcTable[n].destroy_voice, 1, 1, fp); - for (long n = 0; n < num; n++) //hit_voice + for (n = 0; n < num; n++) //hit_voice fread(&gNpcTable[n].hit_voice, 1, 1, fp); - for (long n = 0; n < num; n++) //size + for (n = 0; n < num; n++) //size fread(&gNpcTable[n].size, 1, 1, fp); - for (long n = 0; n < num; n++) //exp - gNpcTable[n].exp = File_ReadLE32(fp); - for (long n = 0; n < num; n++) //damage - gNpcTable[n].damage = File_ReadLE32(fp); - for (long n = 0; n < num; n++) //hit + for (n = 0; n < num; n++) //exp + fread(&gNpcTable[n].exp, 4, 1, fp); + for (n = 0; n < num; n++) //damage + fread(&gNpcTable[n].damage, 4, 1, fp); + for (n = 0; n < num; n++) //hit fread(&gNpcTable[n].hit, 4, 1, fp); - for (long n = 0; n < num; n++) //view + for (n = 0; n < num; n++) //view fread(&gNpcTable[n].view, 4, 1, fp); +#else + for (n = 0; n < num; n++) //bits + gNpcTable[n].bits = File_ReadLE16(fp); + for (n = 0; n < num; n++) //life + gNpcTable[n].life = File_ReadLE16(fp); + for (n = 0; n < num; n++) //surf + fread(&gNpcTable[n].surf, 1, 1, fp); + for (n = 0; n < num; n++) //destroy_voice + fread(&gNpcTable[n].destroy_voice, 1, 1, fp); + for (n = 0; n < num; n++) //hit_voice + fread(&gNpcTable[n].hit_voice, 1, 1, fp); + for (n = 0; n < num; n++) //size + fread(&gNpcTable[n].size, 1, 1, fp); + for (n = 0; n < num; n++) //exp + gNpcTable[n].exp = File_ReadLE32(fp); + for (n = 0; n < num; n++) //damage + gNpcTable[n].damage = File_ReadLE32(fp); + for (n = 0; n < num; n++) //hit + fread(&gNpcTable[n].hit, 4, 1, fp); + for (n = 0; n < num; n++) //view + fread(&gNpcTable[n].view, 4, 1, fp); +#endif fclose(fp); - return true; + return TRUE; } void ReleaseNpcTable() { if (gNpcTable) + { free(gNpcTable); + gNpcTable = NULL; + } } //Npc function table diff --git a/src/NpcTbl.h b/src/NpcTbl.h index e7604d41..981df470 100644 --- a/src/NpcTbl.h +++ b/src/NpcTbl.h @@ -2,6 +2,8 @@ #include +#include "WindowsWrapper.h" + #include "Draw.h" #include "NpChar.h" @@ -29,7 +31,7 @@ struct NPC_TABLE extern NPC_TABLE *gNpcTable; -bool LoadNpcTable(const char *path); +BOOL LoadNpcTable(const char *path); void ReleaseNpcTable(); //NPC Function table