working on arms and items

This commit is contained in:
cuckydev 2019-01-28 12:26:35 -05:00
parent b29f119f3d
commit 1e7b07a102
16 changed files with 902 additions and 129 deletions

View file

@ -34,6 +34,7 @@ endif
# For an accurate result to the original's code, compile in alphabetical order
SOURCES = \
ArmsItem \
Back \
Caret \
Config \

302
src/ArmsItem.cpp Normal file
View file

@ -0,0 +1,302 @@
#include <string.h>
#include "CommonDefines.h"
#include "TextScr.h"
#include "ArmsItem.h"
#include "Draw.h"
#include "KeyControl.h"
#include "Escape.h"
#include "Sound.h"
#include "Main.h"
#include "Game.h"
int gArmsEnergyX = 16;
ARMS gArmsData[ARMS_MAX];
ITEM gItemData[ITEM_MAX];
int gSelectedArms;
int gSelectedItem;
int gCampTitleY;
int gCampActive;
void ClearArmsData()
{
gArmsEnergyX = 32;
memset(gArmsData, 0, sizeof(gArmsData));
}
void ClearItemData()
{
memset(gItemData, 0, sizeof(gItemData));
}
bool AddArmsData(int code, int max_num)
{
for (int i = 0; i < ARMS_MAX; i++)
{
if (gArmsData[i].code == code || !gArmsData[i].code)
{
if (!gArmsData[i].code)
{
memset(&gArmsData[i], 0, sizeof(ARMS));
gArmsData[i].level = 1;
}
gArmsData[i].code = code;
gArmsData[i].max_num += max_num;
gArmsData[i].num += max_num;
if (gArmsData[i].num > gArmsData[i].max_num)
gArmsData[i].num = gArmsData[i].max_num;
return true;
}
}
return false;
}
bool SubArmsData(int code)
{
for (int i = 0; i < ARMS_MAX; i++)
{
if (gArmsData[i].code == code)
{
//Shift all arms from the right to the left
int ia;
for (ia = i + 1; ia < ARMS_MAX; ++ia)
{
gArmsData[ia - 1].code = gArmsData[ia].code;
gArmsData[ia - 1].level = gArmsData[ia].level;
gArmsData[ia - 1].exp = gArmsData[ia].exp;
gArmsData[ia - 1].max_num = gArmsData[ia].max_num;
gArmsData[ia - 1].num = gArmsData[ia].num;
}
gArmsData[ia - 1].code = 0;
gSelectedArms = 0;
return true;
}
}
return false;
}
bool TradeArms(int code1, int code2, int max_num)
{
for (int i = 0; i < ARMS_MAX; i++)
{
if (gArmsData[i].code == code1)
{
gArmsData[i].level = 1;
gArmsData[i].code = code2;
gArmsData[i].max_num += max_num;
gArmsData[i].num += max_num;
gArmsData[i].exp = 0;
return true;
}
}
return false;
}
bool AddItemData(int code)
{
for (int i = 0; i < ITEM_MAX; i++)
{
if (gItemData[i].code == code || !gItemData[i].code)
{
gItemData[i].code = code;
return true;
}
}
return false;
}
bool SubItemData(int code)
{
for (int i = 0; i < ITEM_MAX; i++)
{
if (gItemData[i].code == code)
{
//Shift all items from the right to the left
int ia;
for (ia = i + 1; ia < ITEM_MAX; ++ia)
gItemData[ia - 1].code = gItemData[ia].code;
gItemData[ia - 1].code = 0;
gSelectedItem = 0;
return true;
}
}
return false;
}
int CampLoop()
{
RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
//Load the inventory script
char old_script_path[PATH_LENGTH];
GetTextScriptPath(old_script_path);
char name[13];
strcpy(name, "ArmsItem.tsc");
LoadTextScript2(name);
gCampTitleY = 24;
gCampActive = 0;
gSelectedItem = 0;
//Run script
int arms_num;
for (arms_num = 0; gArmsData[arms_num].code != 0; arms_num++);
if (arms_num)
StartTextScript(gArmsData[gSelectedArms].code + 1000);
else
StartTextScript(gItemData[gSelectedItem].code + 5000);
while (true)
{
GetTrg();
if (gKeyTrg & KEY_ESCAPE)
{
int escRet = Call_Escape();
if (escRet == 0)
return 0;
if (escRet == 2)
return 1;
}
//if (g_GameFlags & 2)
// MoveCampCursor();
int tscRet = TextScriptProc();
if (tscRet == 0)
return 0;
if (tscRet == 2)
return 2;
PutBitmap4(&rcView, 0, 0, &rcView, 10);
//PutCampObject();
PutTextScript();
PutFramePerSecound();
if (!gCampActive && (gKeyItem | gKeyCancel | gKeyOk) & gKeyTrg)
break;
if (g_GameFlags & 2 && (gKeyItem | gKeyCancel) & gKeyTrg)
break;
if (!Flip_SystemTask())
return 0;
}
//Resume original script
StopTextScript();
LoadTextScript_Stage(old_script_path);
gArmsEnergyX = 32;
return 1;
}
bool CheckItem(int a)
{
for (int i = 0; i < ITEM_MAX; i++)
{
if (gItemData[i].code == a)
return true;
}
return false;
}
bool CheckArms(int a)
{
for (int i = 0; i < ARMS_MAX; i++)
{
if (gArmsData[i].code == a)
return true;
}
return false;
}
bool UseArmsEnergy(int num)
{
if (!gArmsData[gSelectedArms].max_num)
return true;
if (!gArmsData[gSelectedArms].num)
return false;
gArmsData[gSelectedArms].num -= num;
if (gArmsData[gSelectedArms].num < 0)
gArmsData[gSelectedArms].num = 0;
return true;
}
bool ChargeArmsEnergy(int num)
{
gArmsData[gSelectedArms].num += num;
if (gArmsData[gSelectedArms].num > gArmsData[gSelectedArms].max_num)
gArmsData[gSelectedArms].num = gArmsData[gSelectedArms].max_num;
return true;
}
void FullArmsEnergy()
{
for (int a = 0; a < ARMS_MAX; a++)
{
if (gArmsData[a].code)
gArmsData[a].num = gArmsData[a].max_num;
}
}
int RotationArms()
{
int arms_num;
for ( arms_num = 0; gArmsData[arms_num].code != 0; arms_num++);
if (!arms_num)
return 0;
//ResetSpurCharge();
++gSelectedArms;
while (gSelectedArms < arms_num && !gArmsData[gSelectedArms].code)
++gSelectedArms;
if (gSelectedArms == arms_num)
gSelectedArms = 0;
gArmsEnergyX = 32;
PlaySoundObject(4, 1);
return gArmsData[gSelectedArms].code;
}
int RotationArmsRev()
{
int arms_num;
for (arms_num = 0; gArmsData[arms_num].code != 0; arms_num++);
if (!arms_num)
return 0;
//ResetSpurCharge();
if (--gSelectedArms < 0)
gSelectedArms = arms_num - 1;
while (gSelectedArms < arms_num && !gArmsData[gSelectedArms].code)
--gSelectedArms;
gArmsEnergyX = 0;
PlaySoundObject(4, 1);
return gArmsData[gSelectedArms].code;
}
void ChangeToFirstArms()
{
gSelectedArms = 0;
gArmsEnergyX = 32;
PlaySoundObject(4, 1);
}

46
src/ArmsItem.h Normal file
View file

@ -0,0 +1,46 @@
#pragma once
struct ARMS
{
int code;
int level;
int exp;
int max_num;
int num;
};
struct ITEM
{
int code;
};
#define ARMS_MAX 8
#define ITEM_MAX 32
extern int gArmsEnergyX;
extern int gSelectedArms;
extern int gSelectedItem;
extern ARMS gArmsData[ARMS_MAX];
extern ITEM gItemData[ITEM_MAX];
extern int gSelectedArms;
extern int gSelectedItem;
extern int gCampTitleY;
extern int gCampActive;
void ClearArmsData();
void ClearItemData();
bool AddArmsData(int code, int max_num);
bool SubArmsData(int code);
bool TradeArms(int code1, int code2, int max_num);
bool AddItemData(int code);
bool SubItemData(int code);
int CampLoop();
bool CheckItem(int a);
bool CheckArms(int a);
bool UseArmsEnergy(int num);
bool ChargeArmsEnergy(int num);
void FullArmsEnergy();
int RotationArms();
int RotationArmsRev();
void ChangeToFirstArms();

View file

@ -58,6 +58,14 @@ void ActCaret01(CARET *crt)
crt->rect = rcLeft[crt->ani_no];
}
void ActCaret08(CARET *crt)
{
if (crt->direct)
crt->rect = {32, 80, 48, 96};
else
crt->rect = {16, 80, 32, 96};
}
void ActCaret09(CARET *crt)
{
if (++crt->ani_wait <= 4)
@ -138,20 +146,20 @@ CARET_TABLE gCaretTable[18] =
typedef void (*CARETFUNCTION)(CARET*);
CARETFUNCTION gpCaretFuncTbl[] =
{
&ActCaret00,
&ActCaret01,
ActCaret00,
ActCaret01,
nullptr, //&ActCaret02,
nullptr, //&ActCaret03,
nullptr, //&ActCaret04,
nullptr, //&ActCaret05,
nullptr, //&ActCaret04,
nullptr, //&ActCaret07,
nullptr, //&ActCaret08,
&ActCaret09,
ActCaret08,
ActCaret09,
nullptr, //&ActCaret10,
nullptr, //&ActCaret11,
nullptr, //&ActCaret12,
&ActCaret13,
ActCaret13,
nullptr, //&ActCaret14,
nullptr, //&ActCaret15,
nullptr, //&ActCaret16,

View file

@ -243,14 +243,30 @@ void BackupSurface(int surf_no, RECT *rect)
SDL_FreeSurface(surface);
//Get rects
SDL_Rect frameRect = {0, 0, frameRect.w, frameRect.h};
SDL_Rect destRect = RectToSDLRect(rect);
SDL_Rect frameRect = RectToSDLRect(rect);
frameRect = {frameRect.x * gWindowScale, frameRect.y * gWindowScale, frameRect.w * gWindowScale, frameRect.h * gWindowScale};
//Draw texture onto surface
SDL_SetRenderTarget(gRenderer, surf[surf_no].texture);
SDL_RenderCopy(gRenderer, screenTexture, &frameRect, &destRect);
SDL_Texture *textureAccessible = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_TARGET, frameRect.w, frameRect.h);
if (!textureAccessible)
{
printf("Failed to create real texture for surface id %d\nSDL Error: %s\n", surf_no, SDL_GetError());
return;
}
SDL_SetTextureBlendMode(textureAccessible, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(gRenderer, textureAccessible);
SDL_SetRenderDrawColor(gRenderer, 0, 0, 0, 0);
SDL_RenderClear(gRenderer);
SDL_RenderCopy(gRenderer, screenTexture, &frameRect, NULL);
SDL_RenderPresent(gRenderer);
SDL_SetRenderTarget(gRenderer, NULL);
//Set surface's metadata
surf[surf_no].texture = textureAccessible;
//Free stuff
SDL_DestroyTexture(screenTexture);
}

View file

@ -10,6 +10,7 @@
#include "NpcHit.h"
#include "Generic.h"
#include "GenericLoad.h"
#include "ArmsItem.h"
#include "TextScr.h"
#include "Fade.h"
#include "Frame.h"
@ -25,6 +26,7 @@
#include "Sound.h"
#include "Organya.h"
#include "Profile.h"
#include "MycParam.h"
#include "Back.h"
#include "KeyControl.h"
#include "ValueView.h"
@ -278,15 +280,10 @@ int ModeTitle()
break;
}
//Reset cliprect, flags, and give the player the booster 0.8?
//Reset cliprect, flags, and give the player the nikumaru counter
grcGame.left = 0;
g_GameFlags = 0;
/*
v0 = unk_81C8598;
BYTE1(v0) |= 1u;
unk_81C8598 = v0;
*/
gMC.equip & 0x100;
//Start loop
int wait = 0;
@ -434,8 +431,8 @@ int ModeAction()
//InitStar();
InitFade();
//InitFlash();
//ClearArmsData();
//ClearItemData();
ClearArmsData();
ClearItemData();
//ClearPermitStage();
//StartMapping();
InitFlags();
@ -518,6 +515,41 @@ int ModeAction()
//PutBossLife();
PutFade();
if (!(g_GameFlags & 4))
{
//Open inventory
if (gKeyTrg & gKeyItem)
{
BackupSurface(10, &grcGame);
int campRet = CampLoop();
if (campRet == 0)
return 0;
if (campRet == 2)
return 1;
gMC.cond &= ~1;
}
/*
else if ( unk_81C8598 & 2 && gKeyTrg & gKeyMap )
{
BackupSurface(10, &grcGame);
v3 = MiniMapLoop();
if ( !v3 )
return 0;
if ( v3 == 2 )
return 1;
}
*/
}
if (g_GameFlags & 2)
{
if (gKeyTrg & gKeyArms)
RotationArms();
else if (gKeyTrg & gKeyArmsRev)
RotationArmsRev();
}
if (swPlay & 1)
{
int tscRet = TextScriptProc();
@ -529,6 +561,14 @@ int ModeAction()
PutMapName(false);
if (g_GameFlags & 2)
{
PutMyLife(true);
PutArmsEnergy(true);
PutMyAir((WINDOW_WIDTH - 80) / 2, (WINDOW_HEIGHT - 32) / 2);
PutActiveArmsList();
}
if (g_GameFlags & 8)
{
PutIllust();

View file

@ -5,10 +5,14 @@
#include "MyChar.h"
#include "MycParam.h"
#include "ArmsItem.h"
#include "NpChar.h"
#include "Draw.h"
#include "Sound.h"
#include "ValueView.h"
#include "KeyControl.h"
#include "TextScr.h"
#include "Flags.h"
#include "Game.h"
#include "Caret.h"
@ -147,9 +151,9 @@ void PutMyChar(int fx, int fy)
if ((gMC.cond & 0x80u) && !(gMC.cond & 2))
{
//Draw weapon
gMC.rect_arms.left = 24 * 0;//(gArmsData[gSelectedArms].code % 13);
gMC.rect_arms.left = 24 * (gArmsData[gSelectedArms].code % 13);
gMC.rect_arms.right = gMC.rect_arms.left + 24;
gMC.rect_arms.top = 96 * 0;//(gArmsData[gSelectedArms].code / 13);
gMC.rect_arms.top = 96 * (gArmsData[gSelectedArms].code / 13);
gMC.rect_arms.bottom = gMC.rect_arms.top + 16;
if (gMC.direct == 2)
@ -183,14 +187,14 @@ void PutMyChar(int fx, int fy)
PutBitmap3(
&grcGame,
(gMC.x - gMC.view.left) / 0x200 - fx / 0x200,
arms_offset_y + (gMC.y - gMC.view.top) / 0x200 - fy / 0x200,
(gMC.y - gMC.view.top) / 0x200 - fy / 0x200 + arms_offset_y,
&gMC.rect_arms,
11);
else
PutBitmap3(
&grcGame,
(gMC.x - gMC.view.left) / 0x200 - fx / 0x200 - 8,
arms_offset_y + (gMC.y - gMC.view.top) / 0x200 - fy / 0x200,
(gMC.y - gMC.view.top) / 0x200 - fy / 0x200 + arms_offset_y,
&gMC.rect_arms,
11);
@ -633,47 +637,50 @@ void ActMyChar_Normal(bool bKey)
void AirProcess()
{
/*
if ( unk_81C8598 & 0x10 )
if (gMC.equip & 0x10)
{
unk_81C8624 = 1000;
unk_81C8628 = 0;
gMC.air = 1000;
gMC.air_get = 0;
}
else
{
if ( gMC.flag & 0x100 )
if (gMC.flag & 0x100)
{
if ( --unk_81C8624 <= 0 )
if (--gMC.air <= 0)
{
if ( (unsigned __int8)GetNPCFlag(4000) )
if (GetNPCFlag(4000))
{
//Core cutscene
StartTextScript(1100);
}
else
{
//Drown
StartTextScript(41);
if ( dir )
SetCaret(x, y, 8, 2);
if (gMC.direct)
SetCaret(gMC.x, gMC.y, 8, 2);
else
SetCaret(x, y, 8, 0);
gMC.cond &= 0x7Fu;
SetCaret(gMC.x, gMC.y, 8, 0);
gMC.cond &= ~0x80;
}
}
}
else
{
unk_81C8624 = 1000;
gMC.air = 1000;
}
if ( gMC.flag & 0x100 )
{
unk_81C8628 = 60;
gMC.air_get = 60;
}
else if ( unk_81C8628 )
else if (gMC.air_get)
{
--unk_81C8628;
--gMC.air_get;
}
}
*/
}
void ActMyChar(bool bKey)
@ -689,7 +696,7 @@ void ActMyChar(bool bKey)
}
else if (gMC.exp_count)
{
//SetValueView(&x, &y, gMC.exp_count);
SetValueView(&gMC.x, &gMC.y, gMC.exp_count);
gMC.exp_count = 0;
}

View file

@ -784,7 +784,7 @@ void HitMyCharNpChar()
if (hit && gNPC[i].code_char == 87)
{
PlaySoundObject(20, 1);
//AddLifeMyChar(gNPC[i].exp);
AddLifeMyChar(gNPC[i].exp);
gNPC[i].cond = 0;
}

View file

@ -1,8 +1,95 @@
#include "Sound.h"
#include "MyChar.h"
#include "MycParam.h"
#include "NpChar.h"
#include "CommonDefines.h"
#include "ArmsItem.h"
#include "ValueView.h"
#include "TextScr.h"
#include "Game.h"
#include "Draw.h"
#include "Caret.h"
ARMS_LEVEL gArmsLevelTable[14] =
{
{{0, 0, 100}},
{{30, 40, 16}},
{{10, 20, 10}},
{{10, 20, 20}},
{{30, 40, 10}},
{{10, 20, 10}},
{{10, 20, 30}},
{{10, 20, 5}},
{{10, 20, 100}},
{{30, 60, 0}},
{{30, 60, 10}},
{{10, 20, 100}},
{{1, 1, 1}},
{{40, 60, 200}}
};
void AddExpMyChar(int x)
{
int lv = gArmsData[gSelectedArms].level - 1;
int arms_code = gArmsData[gSelectedArms].code;
gArmsData[gSelectedArms].exp += x;
if (lv == 2)
{
if (gArmsData[gSelectedArms].exp >= gArmsLevelTable[0].exp[3 * arms_code + 2])
{
gArmsData[gSelectedArms].exp = gArmsLevelTable[0].exp[3 * arms_code + 2];
if (gMC.equip & 0x80)
{
if (gMC.star < 3)
++gMC.star;
}
}
}
else
{
while (lv <= 1)
{
if (gArmsData[gSelectedArms].exp >= gArmsLevelTable[0].exp[lv + 3 * arms_code])
{
++gArmsData[gSelectedArms].level;
gArmsData[gSelectedArms].exp = 0;
if (gArmsData[gSelectedArms].code != 13)
{
PlaySoundObject(27, 1);
SetCaret(gMC.x, gMC.y, 10, 0);
}
}
++lv;
}
}
if (gArmsData[gSelectedArms].code == 13)
{
gMC.exp_wait = 10;
}
else
{
gMC.exp_count += x;
gMC.exp_wait = 30;
}
}
void ZeroExpMyChar()
{
gArmsData[gSelectedArms].level = 1;
gArmsData[gSelectedArms].exp = 0;
}
bool IsMaxExpMyChar()
{
return gArmsData[gSelectedArms].level == 3
&& gArmsData[gSelectedArms].exp >= gArmsLevelTable[gArmsData[gSelectedArms].code].exp[2];
}
void DamageMyChar(int damage)
{
@ -21,28 +108,24 @@ void DamageMyChar(int damage)
--gMC.star;
//Lose experience
/*
if ( unk_81C8598 & 4 )
v1 = gArmsData[gSelectedArms].exp - damage;
if (gMC.equip & 4)
gArmsData[gSelectedArms].exp -= damage;
else
v1 = gArmsData[gSelectedArms].exp - 2 * damage;
gArmsData[gSelectedArms].exp = v1;
while ( gArmsData[gSelectedArms].exp < 0 )
gArmsData[gSelectedArms].exp -= 2 * damage;
while (gArmsData[gSelectedArms].exp < 0)
{
if ( gArmsData[gSelectedArms].level <= 1 )
if (gArmsData[gSelectedArms].level <= 1)
{
gArmsData[gSelectedArms].exp = 0;
}
else
{
gArmsData[gSelectedArms].exp += gArmsLevelTable[0].exp[--gArmsData[gSelectedArms].level
- 1
+ 3 * gArmsData[gSelectedArms].code];
if ( word_81C8614 > 0 && gArmsData[gSelectedArms].code != 13 )
SetCaret(x, y, 10, 2);
gArmsData[gSelectedArms].exp += gArmsLevelTable[0].exp[--gArmsData[gSelectedArms].level - 1 + 3 * gArmsData[gSelectedArms].code];
if (gMC.life > 0 && gArmsData[gSelectedArms].code != 13)
SetCaret(gMC.x, gMC.y, 10, 2);
}
}
*/
//Tell player how much damage was taken
SetValueView(&gMC.x, &gMC.y, -damage);
@ -57,3 +140,168 @@ void DamageMyChar(int damage)
}
}
}
void AddLifeMyChar(int x)
{
gMC.life += x;
if (gMC.life > gMC.max_life)
gMC.life = gMC.max_life;
gMC.lifeBr = gMC.life;
}
void AddMaxLifeMyChar(int val)
{
gMC.max_life += val;
if (gMC.max_life > 232)
gMC.max_life = 232;
gMC.life += val;
gMC.lifeBr = gMC.life;
}
void PutArmsEnergy(bool flash)
{
RECT rcPer = {72, 48, 80, 56};
RECT rcLv = {80, 80, 96, 88};
RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
RECT rcNone = {80, 48, 96, 56};
if (gArmsEnergyX > 16)
gArmsEnergyX -= 2;
if (gArmsEnergyX < 16)
gArmsEnergyX += 2;
//Draw max ammo
if (gArmsData[gSelectedArms].max_num)
{
PutNumber4(gArmsEnergyX + 32, 16, gArmsData[gSelectedArms].num, 0);
PutNumber4(gArmsEnergyX + 32, 24, gArmsData[gSelectedArms].max_num, 0);
}
else
{
PutBitmap3(&rcView, gArmsEnergyX + 48, 16, &rcNone, 26);
PutBitmap3(&rcView, gArmsEnergyX + 48, 24, &rcNone, 26);
}
//Draw experience and ammo
if (!flash || !((gMC.shock >> 1) & 1))
{
PutBitmap3(&rcView, gArmsEnergyX + 32, 24, &rcPer, 26);
PutBitmap3(&rcView, gArmsEnergyX, 32, &rcLv, 26);
PutNumber4(gArmsEnergyX - 8, 32, gArmsData[gSelectedArms].level, 0);
RECT rcExpBox = {0, 72, 40, 80};
RECT rcExpVal = {0, 80, 0, 88};
RECT rcExpMax = {40, 72, 80, 80};
RECT rcExpFlash = {40, 80, 80, 88};
int lv = gArmsData[gSelectedArms].level - 1;
int arms_code = gArmsData[gSelectedArms].code;
int exp_now = gArmsData[gSelectedArms].exp;
int exp_next = gArmsLevelTable[0].exp[lv + 3 * arms_code];
PutBitmap3(&rcView, gArmsEnergyX + 24, 32, &rcExpBox, 26);
if (lv != 2 || gArmsData[gSelectedArms].exp != gArmsLevelTable[0].exp[3 * arms_code + 2])
{
if (exp_next)
rcExpVal.right += 40 * exp_now / exp_next;
else
rcExpVal.right = 0;
PutBitmap3(&rcView, gArmsEnergyX + 24, 32, &rcExpVal, 26);
}
else
{
PutBitmap3(&rcView, gArmsEnergyX + 24, 32, &rcExpMax, 26);
}
static int add_flash = true;
if (gMC.exp_wait && ((add_flash++ >> 1) & 1))
PutBitmap3(&rcView, gArmsEnergyX + 24, 32, &rcExpFlash, 26);
}
}
void PutActiveArmsList()
{
RECT rect = {0, 0, 0, 16};
int arms_num;
for (arms_num = 0; gArmsData[arms_num].code != 0; ++arms_num);
if (arms_num)
{
for (int a = 0; a < arms_num; a++)
{
//Get X position to draw at
int x = 16 * (a - gSelectedArms) + gArmsEnergyX;
if (x >= 8)
{
if (x >= 24)
x += 48;
}
else
{
x += 16 * (arms_num + 3);
}
if (8 * (2 * (arms_num + 3) + 1) <= x)
x += 16 * (-3 - arms_num);
if (x < 72 && x >= 24)
x -= 48;
//Draw icon
rect.left = 16 * gArmsData[a].code;
rect.right = rect.left + 16;
PutBitmap3(&grcGame, x, 16, &rect, 12);
}
}
}
void PutMyLife(bool flash)
{
RECT rcCase = {0, 40, 232, 48};
RECT rcLife = {0, 24, 232, 32};
RECT rcBr = {0, 32, 232, 40};
if (!flash || !((gMC.shock >> 1) & 1))
{
if (gMC.lifeBr < gMC.life)
gMC.lifeBr = gMC.life;
if (gMC.lifeBr <= gMC.life)
gMC.lifeBr_count = 0;
else if (++gMC.lifeBr_count > 30)
--gMC.lifeBr;
//Draw bar
rcCase.right = 64;
rcLife.right = 40 * gMC.life / gMC.max_life - 1;
rcBr.right = 40 * gMC.lifeBr / gMC.max_life - 1;
PutBitmap3(&grcGame, 16, 40, &rcCase, 26);
PutBitmap3(&grcGame, 40, 40, &rcBr, 26);
PutBitmap3(&grcGame, 40, 40, &rcLife, 26);
PutNumber4(8, 40, gMC.lifeBr, 0);
}
}
void PutMyAir(int x, int y)
{
RECT rcAir[2];
rcAir[0] = {112, 72, 144, 80};
rcAir[1] = {112, 80, 144, 88};
if (!(gMC.equip & 0x10) && gMC.air_get)
{
//Draw how much air is left
if (gMC.air_get % 6 <= 3)
PutNumber4(x + 32, y, gMC.air / 10, 0);
//Draw "AIR" text
if (gMC.air % 30 <= 10)
PutBitmap3(&grcGame, x, y, &rcAir[1], 26);
else
PutBitmap3(&grcGame, x, y, &rcAir[0], 26);
}
}

View file

@ -1,2 +1,15 @@
#pragma once
struct ARMS_LEVEL
{
int exp[3];
};
extern ARMS_LEVEL gArmsLevelTable[14];
void DamageMyChar(int damage);
void AddLifeMyChar(int x);
void AddMaxLifeMyChar(int val);
void PutArmsEnergy(bool flash);
void PutActiveArmsList();
void PutMyLife(bool flash);
void PutMyAir(int x, int y);

View file

@ -13,3 +13,5 @@ void ActNpc017(NPCHAR *npc);
void ActNpc018(NPCHAR *npc);
void ActNpc021(NPCHAR *npc);
void ActNpc032(NPCHAR *npc);

View file

@ -27,3 +27,22 @@ void ActNpc021(NPCHAR *npc)
npc->rect = rect[0];
}
//Life capsule
void ActNpc032(NPCHAR *npc)
{
RECT rect[2];
rect[0] = {32, 96, 48, 112};
rect[1] = {48, 96, 64, 112};
if (++npc->ani_wait > 2)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 1)
npc->ani_no = 0;
npc->rect = rect[npc->ani_no];
}

View file

@ -88,7 +88,7 @@ NPCFUNCTION gpNpcFuncTbl[] =
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc032,
nullptr,
nullptr,
nullptr,

View file

@ -7,6 +7,7 @@
#include "Tags.h"
#include "Profile.h"
#include "Fade.h"
#include "ArmsItem.h"
#include "Flags.h"
#include "MyChar.h"
#include "Frame.h"
@ -43,11 +44,11 @@ bool LoadProfile(char *name)
bool InitializeGame()
{
InitMyChar();
//gSelectedArms = 0;
//gSelectedItem = 0;
gSelectedArms = 0;
gSelectedItem = 0;
gCounter = 0;
//ClearArmsData();
//ClearItemData();
ClearArmsData();
ClearItemData();
//ClearPermitStage();
//StartMapping();
InitFlags();

View file

@ -7,10 +7,13 @@
#include "TextScr.h"
#include "Draw.h"
#include "Tags.h"
#include "ArmsItem.h"
#include "MyChar.h"
#include "Fade.h"
#include "Stage.h"
#include "MycParam.h"
#include "Flags.h"
#include "Profile.h"
#include "MapName.h"
#include "KeyControl.h"
#include "NpChar.h"
@ -489,6 +492,7 @@ int TextScriptProc()
gTS.wait = 0;
//Parsing time
int w, x, y, z;
bExit = false;
while (!bExit)
@ -510,7 +514,7 @@ int TextScriptProc()
else if (gTS.flags & 0x10)
{
//SAT/CAT/TUR printing
int x;
x;
for (x = gTS.p_read; ; x++)
{
//Break if reaches command, or new-line
@ -604,19 +608,65 @@ int TextScriptProc()
gTS.face = 0;
bExit = true;
}
else if (IS_COMMAND('L','I','+'))
{
x = GetTextScriptNo(gTS.p_read + 4);
AddLifeMyChar(x);
gTS.p_read += 8;
}
else if (IS_COMMAND('M','L','+'))
{
z = GetTextScriptNo(gTS.p_read + 4);
AddMaxLifeMyChar(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('A','E','+'))
{
FullArmsEnergy();
gTS.p_read += 4;
}
else if (IS_COMMAND('I','T','+'))
{
x = GetTextScriptNo(gTS.p_read + 4);
PlaySoundObject(38, 1);
AddItemData(x);
gTS.p_read += 8;
}
else if (IS_COMMAND('I','T','-'))
{
z = GetTextScriptNo(gTS.p_read + 4);
SubItemData(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('A','M','+'))
{
w = GetTextScriptNo(gTS.p_read + 4);
x = GetTextScriptNo(gTS.p_read + 9);
gNumberTextScript[0] = x;
gNumberTextScript[1] = z;
PlaySoundObject(38, 1);
AddArmsData(w, x);
gTS.p_read += 13;
}
else if (IS_COMMAND('A','M','-'))
{
z = GetTextScriptNo(gTS.p_read + 4);
SubArmsData(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('T','R','A'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
int w = GetTextScriptNo(gTS.p_read + 9);
int x = GetTextScriptNo(gTS.p_read + 14);
int y = GetTextScriptNo(gTS.p_read + 19);
z = GetTextScriptNo(gTS.p_read + 4);
w = GetTextScriptNo(gTS.p_read + 9);
x = GetTextScriptNo(gTS.p_read + 14);
y = GetTextScriptNo(gTS.p_read + 19);
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);
x = GetTextScriptNo(gTS.p_read + 4);
y = GetTextScriptNo(gTS.p_read + 9);
SetMyCharPosition(x << 13, y << 13);
gTS.p_read += 13;
}
@ -632,25 +682,25 @@ int TextScriptProc()
}
else if (IS_COMMAND('F','L','+'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
SetNPCFlag(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('F','L','-'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
CutNPCFlag(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('S','K','+'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
SetSkipFlag(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('S','K','-'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
CutSkipFlag(z);
gTS.p_read += 8;
}
@ -744,7 +794,7 @@ int TextScriptProc()
}
else if (IS_COMMAND('E','V','E'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
JumpTextScript(z);
}
else if (IS_COMMAND('Y','N','J'))
@ -759,8 +809,8 @@ int TextScriptProc()
}
else if (IS_COMMAND('F','L','J'))
{
int x = GetTextScriptNo(gTS.p_read + 4);
int z = GetTextScriptNo(gTS.p_read + 9);
x = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 9);
if (GetNPCFlag(x))
JumpTextScript(z);
@ -769,8 +819,8 @@ int TextScriptProc()
}
else if (IS_COMMAND('S','K','J'))
{
int x = GetTextScriptNo(gTS.p_read + 4);
int z = GetTextScriptNo(gTS.p_read + 9);
x = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 9);
if (GetSkipFlag(x))
JumpTextScript(z);
@ -779,7 +829,7 @@ int TextScriptProc()
}
else if (IS_COMMAND('F','A','I'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
StartFadeIn(z);
gTS.mode = 5;
gTS.p_read += 8;
@ -787,7 +837,7 @@ int TextScriptProc()
}
else if (IS_COMMAND('F','A','O'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
StartFadeOut(z);
gTS.mode = 5;
gTS.p_read += 8;
@ -800,13 +850,13 @@ int TextScriptProc()
}
else if (IS_COMMAND('S','O','U'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
PlaySoundObject(z, 1);
gTS.p_read += 8;
}
else if (IS_COMMAND('C','M','U'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
ChangeMusic(z);
gTS.p_read += 8;
}
@ -822,61 +872,76 @@ int TextScriptProc()
}
else if (IS_COMMAND('D','N','P'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
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);
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);
x = GetTextScriptNo(gTS.p_read + 4);
y = GetTextScriptNo(gTS.p_read + 9);
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);
x = GetTextScriptNo(gTS.p_read + 4);
y = GetTextScriptNo(gTS.p_read + 9);
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);
x = GetTextScriptNo(gTS.p_read + 4);
y = GetTextScriptNo(gTS.p_read + 9);
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);
w = GetTextScriptNo(gTS.p_read + 4);
x = GetTextScriptNo(gTS.p_read + 9);
y = GetTextScriptNo(gTS.p_read + 14);
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);
w = GetTextScriptNo(gTS.p_read + 4);
x = GetTextScriptNo(gTS.p_read + 9);
y = GetTextScriptNo(gTS.p_read + 14);
z = GetTextScriptNo(gTS.p_read + 19);
MoveNpChar(w, x << 13, y << 13, z);
gTS.p_read += 23;
}
else if (IS_COMMAND('I','N','I'))
{
InitializeGame();
gTS.p_read += 4;
}
else if (IS_COMMAND('S','V','P'))
{
SaveProfile(NULL);
gTS.p_read += 4;
}
else if (IS_COMMAND('L','D','P'))
{
if (!LoadProfile(NULL))
InitializeGame();
}
else if (IS_COMMAND('F','A','C'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
if (gTS.face != z)
{
gTS.face = z;
@ -886,7 +951,7 @@ int TextScriptProc()
}
else if (IS_COMMAND('F','A','C'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
if (gTS.face != z)
{
gTS.face = z;
@ -896,11 +961,15 @@ int TextScriptProc()
}
else if (IS_COMMAND('G','I','T'))
{
int z = GetTextScriptNo(gTS.p_read + 4);
z = GetTextScriptNo(gTS.p_read + 4);
gTS.item = z;
gTS.item_y = WINDOW_HEIGHT - 112;
gTS.p_read += 8;
}
else if (IS_COMMAND('E','S','C'))
{
return 2;
}
else
{
printf("Unimplemented command: <%c%c%c\n", (char)gTS.data[gTS.p_read + 1], (char)gTS.data[gTS.p_read + 2], (char)gTS.data[gTS.p_read + 3]);

View file

@ -61,5 +61,6 @@ bool LoadTextScript2(char *name);
bool LoadTextScript_Stage(char *name);
void GetTextScriptPath(char *path);
bool StartTextScript(int no);
void StopTextScript();
void PutTextScript();
int TextScriptProc();