Merge branch 'master' into addBetterMakefileDebugFlags

This commit is contained in:
Gabriel Ravier 2019-05-08 10:49:47 +02:00
commit 46d4d1b095
7 changed files with 116 additions and 77 deletions

19
.gitignore vendored
View file

@ -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

View file

@ -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

View file

@ -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
} }
} }

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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