Merge branch 'master' into improveGToK
This commit is contained in:
commit
d70ab6045d
7 changed files with 116 additions and 77 deletions
19
.gitignore
vendored
19
.gitignore
vendored
|
@ -1,7 +1,7 @@
|
||||||
# Exclude obj directory (object files for Makefile build)
|
# Exclude obj directory (object files for Makefile build)
|
||||||
/obj
|
/obj
|
||||||
|
|
||||||
# Exclude the converted resource files
|
# Exclude converted resource files
|
||||||
src/Resource
|
src/Resource
|
||||||
|
|
||||||
# Exclude .dat and .rec files in build directories (avoid Config.dat, 290.rec and others)
|
# Exclude .dat and .rec files in build directories (avoid Config.dat, 290.rec and others)
|
||||||
|
@ -14,19 +14,19 @@ build_jp/*.rec
|
||||||
msvc2003/devilution/orig.asm
|
msvc2003/devilution/orig.asm
|
||||||
msvc2003/devilution/compare.asm
|
msvc2003/devilution/compare.asm
|
||||||
|
|
||||||
# Exclude build output on Linux (exclude normally produced executable files)
|
# Exclude build output on Linux (exclude normally produced executable files and out files)
|
||||||
build_en/CSE2
|
build_en/CSE2
|
||||||
build_en/CSE2d
|
build_en/CSE2d
|
||||||
build_en/DoConfig
|
build_en/DoConfig
|
||||||
build_en/DoConfigd
|
build_en/DoConfigd
|
||||||
|
|
||||||
build_jp/CSE2
|
build_jp/CSE2
|
||||||
build_jp/CSE2d
|
build_jp/CSE2d
|
||||||
build_jp/DoConfig
|
build_jp/DoConfig
|
||||||
build_jp/DoConfigd
|
build_jp/DoConfigd
|
||||||
|
build_en/*.out
|
||||||
|
build_jp/*.out
|
||||||
|
|
||||||
|
# Exclude PE executables in the build folder (and .exe.manifest files)
|
||||||
# Exclude executables in the build folder (and .exe.manifest files)
|
|
||||||
build_en/*.exe
|
build_en/*.exe
|
||||||
build_en/*.exe.manifest
|
build_en/*.exe.manifest
|
||||||
build_jp/*.exe
|
build_jp/*.exe
|
||||||
|
@ -46,12 +46,3 @@ msvc2003/Debug
|
||||||
msvc2003/Release
|
msvc2003/Release
|
||||||
msvc2003/Debug (Japanese)
|
msvc2003/Debug (Japanese)
|
||||||
msvc2003/Release (Japanese)
|
msvc2003/Release (Japanese)
|
||||||
|
|
||||||
# Exclude VS Code folder
|
|
||||||
.vscode/*
|
|
||||||
|
|
||||||
# Include generically useful files for VS Code users
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
|
|
|
@ -2126,6 +2126,14 @@ addr = 0x46E9E0
|
||||||
name = "ActNpc360"
|
name = "ActNpc360"
|
||||||
addr = 0x46EA90
|
addr = 0x46EA90
|
||||||
|
|
||||||
|
[[func]]
|
||||||
|
name = "LoadNpcTable"
|
||||||
|
addr = 0x472400
|
||||||
|
|
||||||
|
[[func]]
|
||||||
|
name = "ReleaseNpcTable"
|
||||||
|
addr = 0x472710
|
||||||
|
|
||||||
[[func]]
|
[[func]]
|
||||||
name = "InitBossChar"
|
name = "InitBossChar"
|
||||||
addr = 0x472740
|
addr = 0x472740
|
||||||
|
|
12
src/Main.cpp
12
src/Main.cpp
|
@ -50,12 +50,12 @@ static unsigned long int next = 1;
|
||||||
int rep_rand()
|
int rep_rand()
|
||||||
{
|
{
|
||||||
next = ((next) * 214013 + 2531011);
|
next = ((next) * 214013 + 2531011);
|
||||||
return ((next) >> 16) & 0x7FFF;
|
return ((next) >> 16) & 0x7FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rep_srand(unsigned int seed)
|
void rep_srand(unsigned int seed)
|
||||||
{
|
{
|
||||||
next = seed;
|
next = seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Framerate stuff
|
//Framerate stuff
|
||||||
|
@ -82,7 +82,7 @@ int GetFramePerSecound()
|
||||||
current_tick = SDL_GetTicks();
|
current_tick = SDL_GetTicks();
|
||||||
++current_frame;
|
++current_frame;
|
||||||
|
|
||||||
if ( base_tick + 1000 <= current_tick )
|
if (base_tick + 1000 <= current_tick)
|
||||||
{
|
{
|
||||||
base_tick += 1000;
|
base_tick += 1000;
|
||||||
frames_this_second = current_frame;
|
frames_this_second = current_frame;
|
||||||
|
@ -487,7 +487,7 @@ bool SystemTask()
|
||||||
|
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
//BUG FIX: Pixel relied on key codes for input, but these differ based on keyboard layout.
|
//BUG FIX: Pixel relied on key codes for input, but these differ based on keyboard layout.
|
||||||
//This would break the alternate movement keys on typical English keyboards, since the '=' key
|
//This would break the alternate movement keys on typical English keyboards, since the '=' key
|
||||||
//is in a completely different place to where it is on a Japanese keyboard.
|
//is in a completely different place to where it is on a Japanese keyboard.
|
||||||
|
@ -561,7 +561,7 @@ bool SystemTask()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
switch (event.key.keysym.sym)
|
switch (event.key.keysym.sym)
|
||||||
{
|
{
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
|
@ -627,7 +627,7 @@ bool SystemTask()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
35
src/Map.cpp
35
src/Map.cpp
|
@ -29,16 +29,16 @@ BOOL LoadMapData2(const char *path_map)
|
||||||
{
|
{
|
||||||
unsigned char dum;
|
unsigned char dum;
|
||||||
|
|
||||||
//Get path
|
// Get path
|
||||||
char path[PATH_LENGTH];
|
char path[PATH_LENGTH];
|
||||||
sprintf(path, "%s/%s", gDataPath, path_map);
|
sprintf(path, "%s/%s", gDataPath, path_map);
|
||||||
|
|
||||||
//Open file
|
// Open file
|
||||||
FILE *fp = fopen(path, "rb");
|
FILE *fp = fopen(path, "rb");
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
//Make sure file begins with "PXM"
|
// Make sure file begins with "PXM"
|
||||||
char check[3];
|
char check[3];
|
||||||
fread(check, 1, 3, fp);
|
fread(check, 1, 3, fp);
|
||||||
|
|
||||||
|
@ -50,10 +50,9 @@ BOOL LoadMapData2(const char *path_map)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fread(&dum, 1, 1, fp);
|
fread(&dum, 1, 1, fp);
|
||||||
//Get width and height
|
// Get width and height
|
||||||
#ifdef NONPORTABLE
|
#ifdef NONPORTABLE
|
||||||
// This fails on big-endian hardware, and platforms
|
// This fails on big-endian hardware, and platforms where short is not two bytes long.
|
||||||
// where short is not two bytes long.
|
|
||||||
fread(&gMap.width, 2, 1, fp);
|
fread(&gMap.width, 2, 1, fp);
|
||||||
fread(&gMap.length, 2, 1, fp);
|
fread(&gMap.length, 2, 1, fp);
|
||||||
#else
|
#else
|
||||||
|
@ -68,7 +67,7 @@ BOOL LoadMapData2(const char *path_map)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Read tiledata
|
// Read tiledata
|
||||||
fread(gMap.data, 1, gMap.length * gMap.width, fp);
|
fread(gMap.data, 1, gMap.length * gMap.width, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -80,7 +79,7 @@ BOOL LoadMapData2(const char *path_map)
|
||||||
|
|
||||||
BOOL LoadAttributeData(const char *path_atrb)
|
BOOL LoadAttributeData(const char *path_atrb)
|
||||||
{
|
{
|
||||||
//Open file
|
// Open file
|
||||||
char path[PATH_LENGTH];
|
char path[PATH_LENGTH];
|
||||||
sprintf(path, "%s/%s", gDataPath, path_atrb);
|
sprintf(path, "%s/%s", gDataPath, path_atrb);
|
||||||
|
|
||||||
|
@ -88,7 +87,7 @@ BOOL LoadAttributeData(const char *path_atrb)
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
//Read data
|
// Read data
|
||||||
fread(gMap.atrb, 1, 0x100, fp);
|
fread(gMap.atrb, 1, 0x100, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -158,7 +157,7 @@ void PutStage_Back(int fx, int fy)
|
||||||
RECT rect;
|
RECT rect;
|
||||||
int num_x;
|
int num_x;
|
||||||
|
|
||||||
//Get range to draw
|
// Get range to draw
|
||||||
num_x = ((WINDOW_WIDTH + 0xF) / 0x10) + 1;
|
num_x = ((WINDOW_WIDTH + 0xF) / 0x10) + 1;
|
||||||
num_y = ((WINDOW_HEIGHT + 0xF) / 0x10) + 1;
|
num_y = ((WINDOW_HEIGHT + 0xF) / 0x10) + 1;
|
||||||
put_x = (fx / 0x200 + 8) / 0x10;
|
put_x = (fx / 0x200 + 8) / 0x10;
|
||||||
|
@ -168,14 +167,14 @@ void PutStage_Back(int fx, int fy)
|
||||||
{
|
{
|
||||||
for (i = put_x; i < put_x + num_x; i++)
|
for (i = put_x; i < put_x + num_x; i++)
|
||||||
{
|
{
|
||||||
//Get attribute
|
// Get attribute
|
||||||
offset = i + j * gMap.width;
|
offset = i + j * gMap.width;
|
||||||
atrb = GetAttribute(i, j);
|
atrb = GetAttribute(i, j);
|
||||||
|
|
||||||
if (atrb >= 0x20)
|
if (atrb >= 0x20)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//Draw tile
|
// Draw tile
|
||||||
rect.left = 16 * (gMap.data[offset] % 0x10);
|
rect.left = 16 * (gMap.data[offset] % 0x10);
|
||||||
rect.top = 16 * (gMap.data[offset] / 0x10);
|
rect.top = 16 * (gMap.data[offset] / 0x10);
|
||||||
rect.right = rect.left + 16;
|
rect.right = rect.left + 16;
|
||||||
|
@ -199,7 +198,7 @@ void PutStage_Front(int fx, int fy)
|
||||||
RECT rect;
|
RECT rect;
|
||||||
int num_x;
|
int num_x;
|
||||||
|
|
||||||
//Get range to draw
|
// Get range to draw
|
||||||
num_x = ((WINDOW_WIDTH + 0xF) >> 4) + 1;
|
num_x = ((WINDOW_WIDTH + 0xF) >> 4) + 1;
|
||||||
num_y = ((WINDOW_HEIGHT + 0xF) >> 4) + 1;
|
num_y = ((WINDOW_HEIGHT + 0xF) >> 4) + 1;
|
||||||
put_x = (fx / 0x200 + 8) / 16;
|
put_x = (fx / 0x200 + 8) / 16;
|
||||||
|
@ -209,14 +208,14 @@ void PutStage_Front(int fx, int fy)
|
||||||
{
|
{
|
||||||
for (i = put_x; i < put_x + num_x; i++)
|
for (i = put_x; i < put_x + num_x; i++)
|
||||||
{
|
{
|
||||||
//Get attribute
|
// Get attribute
|
||||||
offset = i + j * gMap.width;
|
offset = i + j * gMap.width;
|
||||||
atrb = GetAttribute(i, j);
|
atrb = GetAttribute(i, j);
|
||||||
|
|
||||||
if (atrb < 0x40 || atrb >= 0x80)
|
if (atrb < 0x40 || atrb >= 0x80)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//Draw tile
|
// Draw tile
|
||||||
rect.left = 16 * (gMap.data[offset] % 0x10);
|
rect.left = 16 * (gMap.data[offset] % 0x10);
|
||||||
rect.top = 16 * (gMap.data[offset] / 0x10);
|
rect.top = 16 * (gMap.data[offset] / 0x10);
|
||||||
rect.right = rect.left + 16;
|
rect.right = rect.left + 16;
|
||||||
|
@ -242,11 +241,11 @@ void PutMapDataVector(int fx, int fy)
|
||||||
RECT rect;
|
RECT rect;
|
||||||
int num_x;
|
int num_x;
|
||||||
|
|
||||||
//Animate the wind
|
// Animate the wind
|
||||||
static unsigned char count = 0;
|
static unsigned char count = 0;
|
||||||
count += 2;
|
count += 2;
|
||||||
|
|
||||||
//Get range to draw
|
// Get range to draw
|
||||||
num_x = ((WINDOW_WIDTH + 0xF) >> 4) + 1;
|
num_x = ((WINDOW_WIDTH + 0xF) >> 4) + 1;
|
||||||
num_y = ((WINDOW_HEIGHT + 0xF) >> 4) + 1;
|
num_y = ((WINDOW_HEIGHT + 0xF) >> 4) + 1;
|
||||||
put_x = (fx / 0x200 + 8) / 16;
|
put_x = (fx / 0x200 + 8) / 16;
|
||||||
|
@ -256,7 +255,7 @@ void PutMapDataVector(int fx, int fy)
|
||||||
{
|
{
|
||||||
for (i = put_x; i < put_x + num_x; i++)
|
for (i = put_x; i < put_x + num_x; i++)
|
||||||
{
|
{
|
||||||
//Get attribute
|
// Get attribute
|
||||||
offset = i + j * gMap.width;
|
offset = i + j * gMap.width;
|
||||||
atrb = GetAttribute(i, j);
|
atrb = GetAttribute(i, j);
|
||||||
|
|
||||||
|
|
|
@ -14,15 +14,16 @@ void ReadyMapName(const char *str)
|
||||||
{
|
{
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
//Handle "Studio Pixel presents" text in the intro
|
// Handle "Studio Pixel presents" text in the intro, using an obfuscated string
|
||||||
unsigned char presentText[24] = {
|
unsigned char presentText[24] =
|
||||||
#ifdef JAPANESE
|
{
|
||||||
// "ŠJ”ŽºPixel presents"
|
#ifdef JAPANESE
|
||||||
0x8A - 1, // ŠJ
|
// "開発室Pixel presents"
|
||||||
|
0x8A - 1, // 開
|
||||||
0x4A - 1,
|
0x4A - 1,
|
||||||
0x94 - 1, // ”
|
0x94 - 1, // 発
|
||||||
0xAD - 1,
|
0xAD - 1,
|
||||||
0x8E - 1, // Žº
|
0x8E - 1, // 室
|
||||||
0xBA - 1,
|
0xBA - 1,
|
||||||
'P' - 1,
|
'P' - 1,
|
||||||
'i' - 1,
|
'i' - 1,
|
||||||
|
@ -38,7 +39,7 @@ void ReadyMapName(const char *str)
|
||||||
'n' - 1,
|
'n' - 1,
|
||||||
't' - 1,
|
't' - 1,
|
||||||
's' - 1,
|
's' - 1,
|
||||||
#else
|
#else
|
||||||
// " Studio Pixel presents"
|
// " Studio Pixel presents"
|
||||||
' ' - 1,
|
' ' - 1,
|
||||||
' ' - 1,
|
' ' - 1,
|
||||||
|
@ -63,11 +64,11 @@ void ReadyMapName(const char *str)
|
||||||
'n' - 1,
|
'n' - 1,
|
||||||
't' - 1,
|
't' - 1,
|
||||||
's' - 1,
|
's' - 1,
|
||||||
#endif
|
#endif
|
||||||
0xFF
|
0xFF
|
||||||
};
|
};
|
||||||
|
|
||||||
//Reset map name flags
|
// Reset map name flags
|
||||||
gMapName.flag = 0;
|
gMapName.flag = 0;
|
||||||
gMapName.wait = 0;
|
gMapName.wait = 0;
|
||||||
|
|
||||||
|
@ -79,10 +80,10 @@ void ReadyMapName(const char *str)
|
||||||
str = (char*)presentText;
|
str = (char*)presentText;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Copy map's name to the MapName
|
// Copy map's name to the MapName
|
||||||
strcpy(gMapName.name, str);
|
strcpy(gMapName.name, str);
|
||||||
|
|
||||||
//Draw the text to the surface
|
// Draw the text to the surface
|
||||||
a = (int)strlen(gMapName.name);
|
a = (int)strlen(gMapName.name);
|
||||||
|
|
||||||
CortBox2(&rc, 0, SURFACE_ID_ROOM_NAME);
|
CortBox2(&rc, 0, SURFACE_ID_ROOM_NAME);
|
||||||
|
@ -92,12 +93,12 @@ void ReadyMapName(const char *str)
|
||||||
|
|
||||||
void PutMapName(BOOL bMini)
|
void PutMapName(BOOL bMini)
|
||||||
{
|
{
|
||||||
// 'unused_rect' isn't the original name. The Linux port optimised this out, so there's no name for it.
|
// 'unused_rect' isn't the original name. The Linux port optimized this out, so there's no name for it.
|
||||||
RECT unused_rect = {0, 0, 160, 16};
|
RECT unused_rect = {0, 0, 160, 16};
|
||||||
|
|
||||||
if (bMini)
|
if (bMini)
|
||||||
{
|
{
|
||||||
//Map system
|
// Map system
|
||||||
RECT rcBack;
|
RECT rcBack;
|
||||||
rcBack.left = 0;
|
rcBack.left = 0;
|
||||||
rcBack.right = WINDOW_WIDTH;
|
rcBack.right = WINDOW_WIDTH;
|
||||||
|
@ -109,7 +110,7 @@ void PutMapName(BOOL bMini)
|
||||||
}
|
}
|
||||||
else if (gMapName.flag)
|
else if (gMapName.flag)
|
||||||
{
|
{
|
||||||
//MNA
|
// MNA
|
||||||
PutBitmap3(&grcGame, (WINDOW_WIDTH - 172) / 2, (WINDOW_HEIGHT - 80) / 2, &rc, SURFACE_ID_ROOM_NAME);
|
PutBitmap3(&grcGame, (WINDOW_WIDTH - 172) / 2, (WINDOW_HEIGHT - 80) / 2, &rc, SURFACE_ID_ROOM_NAME);
|
||||||
if (++gMapName.wait > 160)
|
if (++gMapName.wait > 160)
|
||||||
gMapName.flag = 0;
|
gMapName.flag = 0;
|
||||||
|
|
|
@ -1,60 +1,98 @@
|
||||||
#include "NpcTbl.h"
|
#include "NpcTbl.h"
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "WindowsWrapper.h"
|
||||||
|
|
||||||
#include "File.h"
|
#include "File.h"
|
||||||
#include "Generic.h"
|
#include "Generic.h"
|
||||||
#include "NpcAct.h"
|
#include "NpcAct.h"
|
||||||
|
|
||||||
NPC_TABLE *gNpcTable;
|
NPC_TABLE *gNpcTable;
|
||||||
|
|
||||||
bool LoadNpcTable(const char *path)
|
BOOL LoadNpcTable(const char *path)
|
||||||
{
|
{
|
||||||
const long size = GetFileSizeLong(path);
|
FILE *fp;
|
||||||
if (size == -1)
|
long n;
|
||||||
return false;
|
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));
|
gNpcTable = (NPC_TABLE*)malloc(num * sizeof(NPC_TABLE));
|
||||||
if (gNpcTable == NULL)
|
if (gNpcTable == NULL)
|
||||||
return false;
|
return FALSE;
|
||||||
|
|
||||||
FILE *fp = fopen(path, "rb");
|
fp = fopen(path, "rb");
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return false;
|
{
|
||||||
|
free(gNpcTable);
|
||||||
|
gNpcTable = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
for (long n = 0; n < num; n++) //bits
|
#ifdef NONPORTABLE
|
||||||
gNpcTable[n].bits = File_ReadLE16(fp);
|
for (n = 0; n < num; n++) //bits
|
||||||
for (long n = 0; n < num; n++) //life
|
fread(&gNpcTable[n].bits, 2, 1, fp);
|
||||||
gNpcTable[n].life = File_ReadLE16(fp);
|
for (n = 0; n < num; n++) //life
|
||||||
for (long n = 0; n < num; n++) //surf
|
fread(&gNpcTable[n].life, 2, 1, fp);
|
||||||
|
for (n = 0; n < num; n++) //surf
|
||||||
fread(&gNpcTable[n].surf, 1, 1, fp);
|
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);
|
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);
|
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);
|
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);
|
fread(&gNpcTable[n].exp, 4, 1, fp);
|
||||||
for (long n = 0; n < num; n++) //damage
|
for (n = 0; n < num; n++) //damage
|
||||||
gNpcTable[n].damage = File_ReadLE32(fp);
|
fread(&gNpcTable[n].damage, 4, 1, fp);
|
||||||
for (long n = 0; n < num; n++) //hit
|
for (n = 0; n < num; n++) //hit
|
||||||
fread(&gNpcTable[n].hit, 4, 1, fp);
|
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);
|
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);
|
fclose(fp);
|
||||||
return true;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReleaseNpcTable()
|
void ReleaseNpcTable()
|
||||||
{
|
{
|
||||||
if (gNpcTable)
|
if (gNpcTable)
|
||||||
|
{
|
||||||
free(gNpcTable);
|
free(gNpcTable);
|
||||||
|
gNpcTable = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Npc function table
|
//Npc function table
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "WindowsWrapper.h"
|
||||||
|
|
||||||
#include "Draw.h"
|
#include "Draw.h"
|
||||||
#include "NpChar.h"
|
#include "NpChar.h"
|
||||||
|
|
||||||
|
@ -29,7 +31,7 @@ struct NPC_TABLE
|
||||||
|
|
||||||
extern NPC_TABLE *gNpcTable;
|
extern NPC_TABLE *gNpcTable;
|
||||||
|
|
||||||
bool LoadNpcTable(const char *path);
|
BOOL LoadNpcTable(const char *path);
|
||||||
void ReleaseNpcTable();
|
void ReleaseNpcTable();
|
||||||
|
|
||||||
//NPC Function table
|
//NPC Function table
|
||||||
|
|
Loading…
Add table
Reference in a new issue