ref: 992bf692daccd7da9f5d15e35356eef2c9d8e5a3
parent: 7a3bea3c0afee85ec5d049aae7b2a4aa1782ed49
parent: 4998dfa0083e28680e5baf722f4a8a95b355c479
author: Gabriel Ravier <gabravier@gmail.com>
date: Wed May 8 06:45:58 EDT 2019
Merge branch 'master' into makeFlagsMacros
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
# Exclude obj directory (object files for Makefile build)
/obj
-# Exclude the converted resource files
+# Exclude converted resource files
src/Resource
# Exclude .dat and .rec files in build directories (avoid Config.dat, 290.rec and others)
@@ -14,19 +14,19 @@
msvc2003/devilution/orig.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/CSE2d
build_en/DoConfig
build_en/DoConfigd
-
build_jp/CSE2
build_jp/CSE2d
build_jp/DoConfig
build_jp/DoConfigd
+build_en/*.out
+build_jp/*.out
-
-# Exclude executables in the build folder (and .exe.manifest files)
+# Exclude PE executables in the build folder (and .exe.manifest files)
build_en/*.exe
build_en/*.exe.manifest
build_jp/*.exe
@@ -46,12 +46,3 @@
msvc2003/Release
msvc2003/Debug (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
--- 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/Main.cpp
+++ b/src/Main.cpp
@@ -50,12 +50,12 @@
int rep_rand()
{
next = ((next) * 214013 + 2531011);
- return ((next) >> 16) & 0x7FFF;
+ return ((next) >> 16) & 0x7FFF;
}
void rep_srand(unsigned int seed)
{
- next = seed;
+ next = seed;
}
//Framerate stuff
@@ -82,7 +82,7 @@
current_tick = SDL_GetTicks();
++current_frame;
- if ( base_tick + 1000 <= current_tick )
+ if (base_tick + 1000 <= current_tick)
{
base_tick += 1000;
frames_this_second = current_frame;
@@ -487,7 +487,7 @@
case SDL_KEYDOWN:
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.
//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.
@@ -561,7 +561,7 @@
break;
}
break;
- #else
+#else
switch (event.key.keysym.sym)
{
case SDLK_ESCAPE:
@@ -627,7 +627,7 @@
break;
}
break;
- #endif
+#endif
}
}
--- a/src/Map.cpp
+++ b/src/Map.cpp
@@ -29,16 +29,16 @@
{
unsigned char dum;
- //Get path
+ // Get path
char path[PATH_LENGTH];
sprintf(path, "%s/%s", gDataPath, path_map);
- //Open file
+ // Open file
FILE *fp = fopen(path, "rb");
if (fp == NULL)
return FALSE;
- //Make sure file begins with "PXM"
+ // Make sure file begins with "PXM"
char check[3];
fread(check, 1, 3, fp);
@@ -50,10 +50,9 @@
else
{
fread(&dum, 1, 1, fp);
- //Get width and height
+ // Get width and height
#ifdef NONPORTABLE
- // This fails on big-endian hardware, and platforms
- // where short is not two bytes long.
+ // This fails on big-endian hardware, and platforms where short is not two bytes long.
fread(&gMap.width, 2, 1, fp);
fread(&gMap.length, 2, 1, fp);
#else
@@ -68,7 +67,7 @@
}
else
{
- //Read tiledata
+ // Read tiledata
fread(gMap.data, 1, gMap.length * gMap.width, fp);
fclose(fp);
return TRUE;
@@ -80,7 +79,7 @@
BOOL LoadAttributeData(const char *path_atrb)
{
- //Open file
+ // Open file
char path[PATH_LENGTH];
sprintf(path, "%s/%s", gDataPath, path_atrb);
@@ -88,7 +87,7 @@
if (fp == NULL)
return FALSE;
- //Read data
+ // Read data
fread(gMap.atrb, 1, 0x100, fp);
fclose(fp);
return TRUE;
@@ -158,7 +157,7 @@
RECT rect;
int num_x;
- //Get range to draw
+ // Get range to draw
num_x = ((WINDOW_WIDTH + 0xF) / 0x10) + 1;
num_y = ((WINDOW_HEIGHT + 0xF) / 0x10) + 1;
put_x = (fx / 0x200 + 8) / 0x10;
@@ -168,7 +167,7 @@
{
for (i = put_x; i < put_x + num_x; i++)
{
- //Get attribute
+ // Get attribute
offset = i + j * gMap.width;
atrb = GetAttribute(i, j);
@@ -175,7 +174,7 @@
if (atrb >= 0x20)
continue;
- //Draw tile
+ // Draw tile
rect.left = 16 * (gMap.data[offset] % 0x10);
rect.top = 16 * (gMap.data[offset] / 0x10);
rect.right = rect.left + 16;
@@ -199,7 +198,7 @@
RECT rect;
int num_x;
- //Get range to draw
+ // Get range to draw
num_x = ((WINDOW_WIDTH + 0xF) >> 4) + 1;
num_y = ((WINDOW_HEIGHT + 0xF) >> 4) + 1;
put_x = (fx / 0x200 + 8) / 16;
@@ -209,7 +208,7 @@
{
for (i = put_x; i < put_x + num_x; i++)
{
- //Get attribute
+ // Get attribute
offset = i + j * gMap.width;
atrb = GetAttribute(i, j);
@@ -216,7 +215,7 @@
if (atrb < 0x40 || atrb >= 0x80)
continue;
- //Draw tile
+ // Draw tile
rect.left = 16 * (gMap.data[offset] % 0x10);
rect.top = 16 * (gMap.data[offset] / 0x10);
rect.right = rect.left + 16;
@@ -242,11 +241,11 @@
RECT rect;
int num_x;
- //Animate the wind
+ // Animate the wind
static unsigned char count = 0;
count += 2;
- //Get range to draw
+ // Get range to draw
num_x = ((WINDOW_WIDTH + 0xF) >> 4) + 1;
num_y = ((WINDOW_HEIGHT + 0xF) >> 4) + 1;
put_x = (fx / 0x200 + 8) / 16;
@@ -256,7 +255,7 @@
{
for (i = put_x; i < put_x + num_x; i++)
{
- //Get attribute
+ // Get attribute
offset = i + j * gMap.width;
atrb = GetAttribute(i, j);
--- a/src/MapName.cpp
+++ b/src/MapName.cpp
@@ -14,15 +14,16 @@
{
int a;
- //Handle "Studio Pixel presents" text in the intro
- unsigned char presentText[24] = {
- #ifdef JAPANESE
- // "�J����Pixel presents"
- 0x8A - 1, // �J
+ // Handle "Studio Pixel presents" text in the intro, using an obfuscated string
+ unsigned char presentText[24] =
+ {
+#ifdef JAPANESE
+ // "開発室Pixel presents"
+ 0x8A - 1, // 開
0x4A - 1,
- 0x94 - 1, // ��
+ 0x94 - 1, // 発
0xAD - 1,
- 0x8E - 1, // ��
+ 0x8E - 1, // 室
0xBA - 1,
'P' - 1,
'i' - 1,
@@ -38,7 +39,7 @@
'n' - 1,
't' - 1,
's' - 1,
- #else
+#else
// " Studio Pixel presents"
' ' - 1,
' ' - 1,
@@ -63,11 +64,11 @@
'n' - 1,
't' - 1,
's' - 1,
- #endif
+#endif
0xFF
};
- //Reset map name flags
+ // Reset map name flags
gMapName.flag = 0;
gMapName.wait = 0;
@@ -79,10 +80,10 @@
str = (char*)presentText;
}
- //Copy map's name to the MapName
+ // Copy map's name to the MapName
strcpy(gMapName.name, str);
- //Draw the text to the surface
+ // Draw the text to the surface
a = (int)strlen(gMapName.name);
CortBox2(&rc, 0, SURFACE_ID_ROOM_NAME);
@@ -92,12 +93,12 @@
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};
if (bMini)
{
- //Map system
+ // Map system
RECT rcBack;
rcBack.left = 0;
rcBack.right = WINDOW_WIDTH;
@@ -109,7 +110,7 @@
}
else if (gMapName.flag)
{
- //MNA
+ // MNA
PutBitmap3(&grcGame, (WINDOW_WIDTH - 172) / 2, (WINDOW_HEIGHT - 80) / 2, &rc, SURFACE_ID_ROOM_NAME);
if (++gMapName.wait > 160)
gMapName.flag = 0;
--- 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