ref: 11bbcde9f84eb3e62c5bb107b1db7092486105d8
parent: b41dab1de96611e7452f4d6bbca006032cc11371
author: cuckydev <[email protected]>
date: Sat Jan 26 20:28:14 EST 2019
worked on tsc some more, fixed Surface2Surface, blah blah blah happy birthday to me
binary files /dev/null b/build/data/ItemImage.bmp differ
binary files a/build/data/ItemImage.pbm /dev/null differ
--- a/src/Draw.cpp
+++ b/src/Draw.cpp
@@ -130,7 +130,10 @@
SDL_SetTextureBlendMode(textureAccessible, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(gRenderer, textureAccessible);
+ SDL_SetRenderDrawColor(gRenderer, 0, 0, 0, 0);
+ SDL_RenderClear(gRenderer);
SDL_RenderCopy(gRenderer, texture, NULL, NULL);
+ SDL_RenderPresent(gRenderer);
SDL_SetRenderTarget(gRenderer, NULL);
//Set surface's metadata
--- a/src/MycHit.cpp
+++ b/src/MycHit.cpp
@@ -170,7 +170,7 @@
&& gMC.y + gMC.hit.bottom > (2 * y - 1) << 12)
{
//Clip
- gMC.y = (y << 13) - (-0x2000 * x + gMC.x) / 2 - 0x800 + gMC.hit.top;
+ gMC.y = (y << 13) + (-0x2000 * x + gMC.x) / 2 - 0x800 + gMC.hit.top;
//Halt momentum
if (!(gMC.cond & 2) && gMC.ym < -0x200)
--- a/src/NpChar.cpp
+++ b/src/NpChar.cpp
@@ -6,8 +6,10 @@
#include "CommonDefines.h"
#include "Tags.h"
#include "NpChar.h"
+#include "MyChar.h"
#include "Game.h"
#include "Flags.h"
+#include "Sound.h"
#include "NpcTbl.h"
#include "Draw.h"
@@ -337,4 +339,265 @@
--gNPC[i].shock;
}
}
+}
+
+void ChangeNpCharByEvent(int code_event, int code_char, int dir)
+{
+ for (int n = 0; n < NPC_MAX; n++)
+ {
+ if ((gNPC[n].cond & 0x80u) && gNPC[n].code_event == code_event)
+ {
+ gNPC[n].bits &= (npc_eventTouch | npc_eventDie | 0x400 | npc_appearSet | npc_altDir | npc_interact | npc_hideSet);
+ gNPC[n].code_char = code_char;
+ gNPC[n].bits |= gNpcTable[gNPC[n].code_char].bits;
+ gNPC[n].exp = gNpcTable[gNPC[n].code_char].exp;
+ SetUniqueParameter(&gNPC[n]);
+ gNPC[n].cond |= 0x80u;
+ gNPC[n].act_no = 0;
+ gNPC[n].act_wait = 0;
+ gNPC[n].count1 = 0;
+ gNPC[n].count2 = 0;
+ gNPC[n].ani_no = 0;
+ gNPC[n].ani_wait = 0;
+ gNPC[n].xm = 0;
+ gNPC[n].ym = 0;
+
+ if (dir != 5)
+ {
+ if (dir == 4)
+ {
+ if (gNPC[n].x >= gMC.x)
+ gNPC[n].direct = 0;
+ else
+ gNPC[n].direct = 2;
+ }
+ else
+ {
+ gNPC[n].direct = dir;
+ }
+ }
+
+ if (gpNpcFuncTbl[code_char] != nullptr)
+ gpNpcFuncTbl[code_char](&gNPC[n]);
+ }
+ }
+}
+
+void ChangeCheckableNpCharByEvent(int code_event, int code_char, int dir)
+{
+ for (int n = 0; n < NPC_MAX; n++)
+ {
+ if ((gNPC[n].cond & 0x80u) != 0 && gNPC[n].code_event == code_event)
+ {
+ gNPC[n].bits &= (npc_eventTouch | npc_eventDie | 0x400 | npc_appearSet | npc_altDir | npc_interact | npc_hideSet);
+ gNPC[n].bits |= npc_interact;
+ gNPC[n].code_char = code_char;
+ gNPC[n].bits |= gNpcTable[gNPC[n].code_char].bits;
+ gNPC[n].exp = gNpcTable[gNPC[n].code_char].exp;
+ SetUniqueParameter(&gNPC[n]);
+ gNPC[n].cond |= 0x80u;
+ gNPC[n].act_no = 0;
+ gNPC[n].act_wait = 0;
+ gNPC[n].count1 = 0;
+ gNPC[n].count2 = 0;
+ gNPC[n].ani_no = 0;
+ gNPC[n].ani_wait = 0;
+ gNPC[n].xm = 0;
+ gNPC[n].ym = 0;
+
+ if (dir != 5)
+ {
+ if (dir == 4)
+ {
+ if (gNPC[n].x >= gMC.x)
+ gNPC[n].direct = 0;
+ else
+ gNPC[n].direct = 2;
+ }
+ else
+ {
+ gNPC[n].direct = dir;
+ }
+ }
+
+ if (gpNpcFuncTbl[code_char] != nullptr)
+ gpNpcFuncTbl[code_char](&gNPC[n]);
+ }
+ }
+}
+
+void SetNpCharActionNo(int code_event, int act_no, int dir)
+{
+ for (int n = 0; n < NPC_MAX; n++)
+ {
+ if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event)
+ {
+ gNPC[n].act_no = act_no;
+
+ if (dir != 5)
+ {
+ if (dir == 4)
+ {
+ if (gNPC[n].x >= gMC.x)
+ gNPC[n].direct = 0;
+ else
+ gNPC[n].direct = 2;
+ }
+ else
+ {
+ gNPC[n].direct = dir;
+ }
+ }
+ break;
+ }
+ }
+}
+
+void MoveNpChar(int code_event, int x, int y, int dir)
+{
+ for (int n = 0; n < NPC_MAX; n++)
+ {
+ if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event)
+ {
+ gNPC[n].x = x;
+ gNPC[n].y = y;
+
+ if (dir != 5)
+ {
+ if (dir == 4)
+ {
+ if (gNPC[n].x >= gMC.x)
+ gNPC[n].direct = 0;
+ else
+ gNPC[n].direct = 2;
+ }
+ else
+ {
+ gNPC[n].direct = dir;
+ }
+ }
+ break;
+ }
+ }
+}
+
+void BackStepMyChar(int code_event)
+{
+ gMC.cond &= ~1;
+ gMC.ym = -0x200;
+
+ if (code_event)
+ {
+ if (code_event == 2)
+ {
+ gMC.direct = 2;
+ gMC.xm = -0x200;
+ }
+ else
+ {
+ for (int n = 0; n < NPC_MAX; n++)
+ {
+ if ((gNPC[n].cond & 0x80) && gNPC[n].code_event == code_event)
+ {
+ if (gNPC[n].x >= gMC.x)
+ {
+ gMC.direct = 2;
+ gMC.xm = -0x200;
+ }
+ else
+ {
+ gMC.direct = 0;
+ gMC.xm = 0x200;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ gMC.direct = 0;
+ gMC.xm = 0x200;
+ }
+}
+
+void DeleteNpCharEvent(int code)
+{
+ for (int i = 0; i < NPC_MAX; i++)
+ {
+ if ((gNPC[i].cond & 0x80) && gNPC[i].code_event == code)
+ {
+ gNPC[i].cond = 0;
+ SetNPCFlag(gNPC[i].code_flag);
+ }
+ }
+}
+
+void DeleteNpCharCode(int code, bool bSmoke)
+{
+ for (int n = 0; n < NPC_MAX; n++)
+ {
+ if ((gNPC[n].cond & 0x80) && gNPC[n].code_char == code)
+ {
+ gNPC[n].cond = 0;
+ SetNPCFlag(gNPC[n].code_flag);
+
+ if (bSmoke)
+ {
+ PlaySoundObject(gNPC[n].destroy_voice, 1);
+
+ switch (gNPC[n].size)
+ {
+ case 2:
+ SetDestroyNpChar(gNPC[n].x, gNPC[n].y, gNPC[n].view.back, 8);
+ break;
+ case 3:
+ SetDestroyNpChar(gNPC[n].x, gNPC[n].y, gNPC[n].view.back, 16);
+ break;
+ case 1:
+ SetDestroyNpChar(gNPC[n].x, gNPC[n].y, gNPC[n].view.back, 4);
+ break;
+ }
+ }
+ }
+ }
+}
+
+void GetNpCharPosition(int *x, int *y, int i)
+{
+ *x = gNPC[i].x;
+ *y = gNPC[i].y;
+}
+
+bool IsNpCharCode(int code)
+{
+ for (int i = 0; i < NPC_MAX; i++)
+ {
+ if ((gNPC[i].cond & 0x80) && gNPC[i].code_char == code)
+ return true;
+ }
+
+ return false;
+}
+
+bool GetNpCharAlive(int code_event)
+{
+ for (int i = 0; i < NPC_MAX; i++)
+ {
+ if ((gNPC[i].cond & 0x80) && gNPC[i].code_event == code_event)
+ return true;
+ }
+
+ return false;
+}
+
+int CountAliveNpChar()
+{
+ int count = 0;
+ for (int n = 0; n < NPC_MAX; ++n)
+ {
+ if (gNPC[n].cond & 0x80)
+ ++count;
+ }
+
+ return count;
}
--- a/src/NpChar.h
+++ b/src/NpChar.h
@@ -83,3 +83,14 @@
void VanishNpChar(NPCHAR *npc);
void PutNpChar(int fx, int fy);
void ActNpChar();
+void ChangeNpCharByEvent(int code_event, int code_char, int dir);
+void ChangeCheckableNpCharByEvent(int code_event, int code_char, int dir);
+void SetNpCharActionNo(int code_event, int act_no, int dir);
+void MoveNpChar(int code_event, int x, int y, int dir);
+void BackStepMyChar(int code_event);
+void DeleteNpCharEvent(int code);
+void DeleteNpCharCode(int code, bool bSmoke);
+void GetNpCharPosition(int *x, int *y, int i);
+bool IsNpCharCode(int code);
+bool GetNpCharAlive(int code_event);
+int CountAliveNpChar();
--- a/src/Stage.cpp
+++ b/src/Stage.cpp
@@ -71,7 +71,6 @@
SetMyCharPosition(x << 13, y << 13);
bool bError = false;
- bool result;
//Get path
char path_dir[20];
--- a/src/TextScr.cpp
+++ b/src/TextScr.cpp
@@ -1,7 +1,6 @@
#include <stdint.h>
#include <string>
-#include <SDL_messagebox.h>
#include "WindowsWrapper.h"
#include "CommonDefines.h"
@@ -410,6 +409,61 @@
rect.bottom = rect.top + 11;
CortBox(&rect, 0xFFFFFE);
}
+
+ //Draw GIT
+ RECT rcItemBox1 = {0, 0, 72, 16};
+ RECT rcItemBox2 = {0, 8, 72, 24};
+ RECT rcItemBox3 = {240, 0, 244, 8};
+ RECT rcItemBox4 = {240, 8, 244, 16};
+ RECT rcItemBox5 = {240, 16, 244, 24};
+
+ if (gTS.item)
+ {
+ PutBitmap3(&grcFull, (WINDOW_WIDTH - 80) / 2, WINDOW_HEIGHT - 112, &rcItemBox1, 26);
+ PutBitmap3(&grcFull, (WINDOW_WIDTH - 80) / 2, WINDOW_HEIGHT - 96, &rcItemBox2, 26);
+ PutBitmap3(&grcFull, (WINDOW_WIDTH + 64) / 2, WINDOW_HEIGHT - 112, &rcItemBox3, 26);
+ PutBitmap3(&grcFull, (WINDOW_WIDTH + 64) / 2, WINDOW_HEIGHT - 104, &rcItemBox4, 26);
+ PutBitmap3(&grcFull, (WINDOW_WIDTH + 64) / 2, WINDOW_HEIGHT - 96, &rcItemBox4, 26);
+ PutBitmap3(&grcFull, (WINDOW_WIDTH + 64) / 2, WINDOW_HEIGHT - 88, &rcItemBox5, 26);
+
+ if (gTS.item_y < WINDOW_HEIGHT - 104)
+ ++gTS.item_y;
+
+ RECT rect;
+ if (gTS.item >= 1000)
+ {
+ rect.left = 32 * ((gTS.item - 1000) % 8);
+ rect.right = 32 * ((gTS.item - 1000) % 8) + 32;
+ rect.top = 16 * ((gTS.item - 1000) / 8);
+ rect.bottom = 16 * ((gTS.item - 1000) / 8) + 16;
+ PutBitmap3(&grcFull, (WINDOW_WIDTH - 40) / 2, gTS.item_y, &rect, 8);
+ }
+ else
+ {
+ rect.left = 16 * (gTS.item % 16);
+ rect.right = 16 * (gTS.item % 16) + 16;
+ rect.top = 16 * (gTS.item / 16);
+ rect.bottom = 16 * (gTS.item / 16) + 16;
+ PutBitmap3(&grcFull, (WINDOW_WIDTH - 24) / 2, gTS.item_y, &rect, 12);
+ }
+ }
+
+ //Draw Yes / No selection
+ RECT rect_yesno = {152, 48, 244, 80};
+ RECT rect_cur = {112, 88, 128, 104};
+
+ if (gTS.mode == 6 )
+ {
+ int i;
+ if (gTS.wait > 1)
+ i = WINDOW_HEIGHT - 96;
+ else
+ i = WINDOW_HEIGHT - 88 - gTS.wait * 4;
+
+ PutBitmap3(&grcFull, (WINDOW_WIDTH + 112) / 2, i, &rect_yesno, 26);
+ if (gTS.wait == 16)
+ PutBitmap3(&grcFull, 41 * gTS.select + (WINDOW_WIDTH + 102) / 2, 154, &rect_cur, 26);
+ }
}
}
@@ -559,6 +613,23 @@
if (!TransferStage(z, w, x, y))
return 0;
}
+ else if (IS_COMMAND('M','O','V'))
+ {
+ int x = GetTextScriptNo(gTS.p_read + 4);
+ int y = GetTextScriptNo(gTS.p_read + 9);
+ SetMyCharPosition(x << 13, y << 13);
+ gTS.p_read += 13;
+ }
+ else if (IS_COMMAND('H','M','C'))
+ {
+ ShowMyChar(false);
+ gTS.p_read += 4;
+ }
+ else if (IS_COMMAND('S','M','C'))
+ {
+ ShowMyChar(true);
+ gTS.p_read += 4;
+ }
else if (IS_COMMAND('F','L','+'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
@@ -666,6 +737,26 @@
gTS.p_read += 4;
gTS.flags |= 0x40;
}
+ else if (IS_COMMAND('C','L','O'))
+ {
+ gTS.flags &= ~0x33;
+ gTS.p_read += 4;
+ }
+ else if (IS_COMMAND('E','V','E'))
+ {
+ int z = GetTextScriptNo(gTS.p_read + 4);
+ JumpTextScript(z);
+ }
+ else if (IS_COMMAND('Y','N','J'))
+ {
+ gTS.next_event = GetTextScriptNo(gTS.p_read + 4);
+ gTS.p_read += 8;
+ gTS.mode = 6;
+ PlaySoundObject(5, 1);
+ gTS.wait = 0;
+ gTS.select = 0;
+ bExit = true;
+ }
else if (IS_COMMAND('F','L','J'))
{
int x = GetTextScriptNo(gTS.p_read + 4);
@@ -728,6 +819,87 @@
{
ReCallMusic();
gTS.p_read += 4;
+ }
+ else if (IS_COMMAND('D','N','P'))
+ {
+ int z = GetTextScriptNo(gTS.p_read + 4);
+ DeleteNpCharEvent(z);
+ gTS.p_read += 8;
+ }
+ else if (IS_COMMAND('D','N','A'))
+ {
+ int z = GetTextScriptNo(gTS.p_read + 4);
+ DeleteNpCharCode(z, 1);
+ gTS.p_read += 8;
+ }
+ else if (IS_COMMAND('C','N','P'))
+ {
+ int x = GetTextScriptNo(gTS.p_read + 4);
+ int y = GetTextScriptNo(gTS.p_read + 9);
+ int z = GetTextScriptNo(gTS.p_read + 14);
+ ChangeNpCharByEvent(x, y, z);
+ gTS.p_read += 18;
+ }
+ else if (IS_COMMAND('A','N','P'))
+ {
+ int x = GetTextScriptNo(gTS.p_read + 4);
+ int y = GetTextScriptNo(gTS.p_read + 9);
+ int z = GetTextScriptNo(gTS.p_read + 14);
+ SetNpCharActionNo(x, y, z);
+ gTS.p_read += 18;
+ }
+ else if (IS_COMMAND('I','N','P'))
+ {
+ int x = GetTextScriptNo(gTS.p_read + 4);
+ int y = GetTextScriptNo(gTS.p_read + 9);
+ int z = GetTextScriptNo(gTS.p_read + 14);
+ ChangeCheckableNpCharByEvent(x, y, z);
+ gTS.p_read += 18;
+ }
+ else if (IS_COMMAND('S','N','P'))
+ {
+ int w = GetTextScriptNo(gTS.p_read + 4);
+ int x = GetTextScriptNo(gTS.p_read + 9);
+ int y = GetTextScriptNo(gTS.p_read + 14);
+ int z = GetTextScriptNo(gTS.p_read + 19);
+ SetNpChar(w, x << 13, y << 13, 0, 0, z, 0, 0x100);
+ gTS.p_read += 23;
+ }
+ else if (IS_COMMAND('M','N','P'))
+ {
+ int w = GetTextScriptNo(gTS.p_read + 4);
+ int x = GetTextScriptNo(gTS.p_read + 9);
+ int y = GetTextScriptNo(gTS.p_read + 14);
+ int z = GetTextScriptNo(gTS.p_read + 19);
+ MoveNpChar(w, x << 13, y << 13, z);
+ gTS.p_read += 23;
+ }
+ else if (IS_COMMAND('F','A','C'))
+ {
+ int z = GetTextScriptNo(gTS.p_read + 4);
+ if (gTS.face != z)
+ {
+ gTS.face = z;
+ gTS.face_x = (gTS.rcText.left - 48) << 9;
+ }
+ gTS.p_read += 8;
+ }
+ else if (IS_COMMAND('F','A','C'))
+ {
+ int z = GetTextScriptNo(gTS.p_read + 4);
+ if (gTS.face != z)
+ {
+ gTS.face = z;
+ gTS.face_x = (gTS.rcText.left - 48) << 9;
+ }
+ gTS.p_read += 8;
+ }
+ else if (IS_COMMAND('G','I','T'))
+ {
+ int z = GetTextScriptNo(gTS.p_read + 4);
+ gTS.item = z;
+ gTS.item_y = WINDOW_HEIGHT - 112;
+ gTS.p_read += 8;
}
else
{