shithub: cstory

Download patch

ref: e7b2bc072676aba34b22ee96d7b137ea3e422715
parent: e294162040ff91344460d8f3ca267f2e9577a370
parent: 4998dfa0083e28680e5baf722f4a8a95b355c479
author: Gabriel Ravier <gabravier@gmail.com>
date: Wed May 8 06:46:27 EDT 2019

Merge branch 'master' into improveF

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