ref: 260d245e4cd43be3ace24005e06e8000712a509c
parent: 7918e6067d9b8c6fcba78491e1b19de0ed24d8a7
author: Clownacy <Clownacy@users.noreply.github.com>
date: Tue May 7 16:58:29 EDT 2019
Made NpcTbl.cpp ASM-accurate
--- a/msvc2003/devilution/comparer-config.toml
+++ b/msvc2003/devilution/comparer-config.toml
@@ -2127,6 +2127,14 @@
addr = 0x46EA90
[[func]]
+name = "LoadNpcTable"
+addr = 0x472400
+
+[[func]]
+name = "ReleaseNpcTable"
+addr = 0x472710
+
+[[func]]
name = "InitBossChar"
addr = 0x472740
--- a/src/NpcTbl.cpp
+++ b/src/NpcTbl.cpp
@@ -1,9 +1,12 @@
#include "NpcTbl.h"
+#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "WindowsWrapper.h"
+
#include "File.h"
#include "Generic.h"
#include "NpcAct.h"
@@ -10,51 +13,86 @@
NPC_TABLE *gNpcTable;
-bool LoadNpcTable(const char *path)
+BOOL LoadNpcTable(const char *path)
{
- const long size = GetFileSizeLong(path);
+ FILE *fp;
+ long n;
+ long num;
+ unsigned long size;
+
+ size = GetFileSizeLong(path);
if (size == -1)
- return false;
+ return FALSE;
- const long num = size / 0x18;
+ 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
+#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 (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
+ 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 (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 (long n = 0; n < num; n++) //life
+ for (n = 0; n < num; n++) //life
gNpcTable[n].life = File_ReadLE16(fp);
- for (long n = 0; n < num; n++) //surf
+ 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
+ for (n = 0; n < num; n++) //exp
gNpcTable[n].exp = File_ReadLE32(fp);
- for (long n = 0; n < num; n++) //damage
+ for (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++) //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);
+#endif
fclose(fp);
- return true;
+ return TRUE;
}
void ReleaseNpcTable()
{
if (gNpcTable)
+ {
free(gNpcTable);
+ gNpcTable = NULL;
+ }
}
//Npc function table
--- a/src/NpcTbl.h
+++ b/src/NpcTbl.h
@@ -2,6 +2,8 @@
#include <stdint.h>
+#include "WindowsWrapper.h"
+
#include "Draw.h"
#include "NpChar.h"
@@ -29,7 +31,7 @@
extern NPC_TABLE *gNpcTable;
-bool LoadNpcTable(const char *path);
+BOOL LoadNpcTable(const char *path);
void ReleaseNpcTable();
//NPC Function table