shithub: cstory

Download patch

ref: 6932e01650ca61fc9e2cb5573bc5dd424d64b88b
parent: e8cab4a2d5635ae734f4516742ef5a64e1f3b752
author: Clownacy <Clownacy@users.noreply.github.com>
date: Tue Sep 3 21:37:15 EDT 2019

Fix some horribly platform-dependant code in Organya

--- a/src/Organya.cpp
+++ b/src/Organya.cpp
@@ -36,24 +36,6 @@
 #define SETWAVE		0x00000020
 #define SETPIPI		0x00000040
 
-typedef struct ORGANYATRACK
-{
-	unsigned short freq;	// +α周波数(1000がDefault) (+ α frequency (1000 is Default))
-	unsigned char wave_no;	// 波形No (Waveform No)
-	unsigned char pipi;	// ☆
-	unsigned short note_num;	// 音符の数 (Number of notes)
-} ORGANYATRACK;
-
-typedef struct ORGANYADATA
-{
-	unsigned short wait;
-	unsigned char line;
-	unsigned char dot;
-	long repeat_x;	// リピート (repeat)
-	long end_x;	// 曲の終わり(リピートに戻る)	(End of song (return to repeat))
-	ORGANYATRACK tdata[MAXTRACK];
-} ORGANYADATA;
-
 // Below are Organya song data structures
 typedef struct NOTELIST
 {
@@ -532,11 +514,14 @@
 
 BOOL OrgData::InitMusicData(const char *path)
 {
-	ORGANYADATA org_data;
+	#define READ_LE16(p) ((p[1] << 8) | p[0]); p += 2
+	#define READ_LE32(p) ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); p += 4
+
 	NOTELIST *np;
 	int i,j;
 	char pass_check[6];
 	char ver = 0;
+	unsigned short note_num[MAXTRACK];
 
 	const unsigned char *p = FindResource(path, "ORG", NULL);
 	if (p == NULL)
@@ -553,27 +538,27 @@
 	if(ver == 0)
 		return FALSE;
 
-	// 曲情報の読み込み (Loading song information)
-	memcpy(&org_data, p, sizeof(ORGANYADATA));
-	p += sizeof(ORGANYADATA);
-
 	// 曲の情報を設定 (Set song information)
-	info.wait = org_data.wait;
-	info.line = org_data.line;
-	info.dot = org_data.dot;
-	info.repeat_x = org_data.repeat_x;
-	info.end_x = org_data.end_x;
+	info.wait = READ_LE16(p);
+	info.line = *p++;
+	info.dot = *p++;
+	info.repeat_x = READ_LE32(p);
+	info.end_x = READ_LE32(p);
 
 	for (i = 0; i < MAXTRACK; i++)
 	{
-		info.tdata[i].freq = org_data.tdata[i].freq;
+		info.tdata[i].freq = READ_LE16(p);
 
+		info.tdata[i].wave_no = *p++;
+
 		if (ver == 1)
 			info.tdata[i].pipi = 0;
 		else
-			info.tdata[i].pipi = org_data.tdata[i].pipi;
+			info.tdata[i].pipi = *p;
 
-		info.tdata[i].wave_no = org_data.tdata[i].wave_no;
+		++p;
+
+		note_num[i] = READ_LE16(p);
 	}
 
 	// 音符のロード (Loading notes)
@@ -580,7 +565,7 @@
 	for (j = 0; j < MAXTRACK; j++)
 	{
 		// 最初の音符はfromがNULLとなる (The first note has from as NULL)
-		if (org_data.tdata[j].note_num == 0)
+		if (note_num[j] == 0)
 		{
 			info.tdata[j].note_list = NULL;
 			continue;
@@ -593,7 +578,7 @@
 		np->to = (np + 1);
 		np++;
 
-		for (i = 1; i < org_data.tdata[j].note_num; i++)
+		for (i = 1; i < note_num[j]; i++)
 		{
 			np->from = (np - 1);
 			np->to = (np + 1);
@@ -606,42 +591,37 @@
 
 		// 内容を代入 (Assign content)
 		np = info.tdata[j].note_p;	// X座標 (X coordinate)
-		for (i = 0; i < org_data.tdata[j].note_num; i++)
+		for (i = 0; i < note_num[j]; i++)
 		{
-			memcpy(&np->x, p, sizeof(long));
-			p += sizeof(long);
+			np->x = READ_LE32(p);
 			np++;
 		}
 
 		np = info.tdata[j].note_p;	// Y座標 (Y coordinate)
-		for (i = 0; i < org_data.tdata[j].note_num; i++)
+		for (i = 0; i < note_num[j]; i++)
 		{
-			memcpy(&np->y, p, sizeof(unsigned char));
-			p += sizeof(unsigned char);
+			np->y = *p++;
 			np++;
 		}
 
 		np = info.tdata[j].note_p;	// 長さ (Length)
-		for (i = 0; i < org_data.tdata[j].note_num; i++)
+		for (i = 0; i < note_num[j]; i++)
 		{
-			memcpy(&np->length, p, sizeof(unsigned char));
-			p += sizeof(unsigned char);
+			np->length = *p++;
 			np++;
 		}
 
 		np = info.tdata[j].note_p;	// ボリューム (Volume)
-		for (i = 0; i < org_data.tdata[j].note_num; i++)
+		for (i = 0; i < note_num[j]; i++)
 		{
-			memcpy(&np->volume, p, sizeof(unsigned char));
-			p += sizeof(unsigned char);
+			np->volume = *p++;
 			np++;
 		}
 
 		np = info.tdata[j].note_p;	// パン (Pan)
-		for (i = 0; i < org_data.tdata[j].note_num; i++)
+		for (i = 0; i < note_num[j]; i++)
 		{
-			memcpy(&np->pan, p, sizeof(unsigned char));
-			p += sizeof(unsigned char);
+			np->pan = *p++;
 			np++;
 		}
 	}
--