Files
2017-04-23 08:03:50 -04:00

690 lines
27 KiB
HolyC

I64 BufferClipX;
I64 BufferClipY;
I64 LFIncr, LMIncr, LYIncr;
I64 MMDeath, MMDeathFlop, MMDeathPit, MMDeathInit, MMDeathX[13], MMDeathY[13];
I64 MMEnDamage[8], MMEnDir[8], MMEnHealth[8], MMEnInit, MMEnState[8], MMEnType[8], MMEnX[8], MMEnY[8];
I64 MMJump, MMJumpY;
I64 MMHit, MMHitDir, MMHitFlop;
I64 MMInvCtr;
I64 MMInvFlop;
I64 MMObsH, MMObsL;
I64 MMProjDir[8], MMProjInit, MMProjX[8], MMProjY[8];
I64 MMX, MMXBound, MMXMax, MMY;
I64 MMAct;
I64 MMCrouch;
I64 MMDir;
I64 MMExit;
I64 MMESCtr;
I64 MMHealth;
I64 MMLadder;
I64 MMPixScale;
I64 MMPSCtr;
I64 MMShoot;
I64 MMSlide;
I64 MMState;
I64 MMVBase;
I64 MMYTrBase, MMYTrMode;
I64 RMIncr, RMFlop;
I64 SysTimerCnt;
I64 TelY;
U8 MMScanCode;
U0 NewEnemy(I64 EnXX, I64 EnYY, I64 EnDamage, I64 EnDir, I64 EnHealth, I64 EnState, I64 EnType) {
for (MMESCtr=0;MMESCtr<8;MMESCtr++) {
if (MMEnDir[MMESCtr]==-1) {
MMEnDamage[MMESCtr] = EnDamage;
MMEnDir[MMESCtr] = EnDir;
MMEnHealth[MMESCtr] = EnHealth;
MMEnState[MMESCtr] = EnState;
MMEnType[MMESCtr] = EnType;
MMEnX[MMESCtr] = EnXX;
MMEnY[MMESCtr] = EnYY;
break;
};
};
};
U0 NewProjectile(I64 ProjXX, I64 ProjYY, I64 ProjDir) {
for (MMPSCtr=0;MMPSCtr<8;MMPSCtr++) {
if (MMProjDir[MMPSCtr]==-1) {
MMProjX[MMPSCtr] = ProjXX;
MMProjY[MMPSCtr] = ProjYY;
MMProjDir[MMPSCtr] = ProjDir;
break;
};
};
};
U0 DrawEnemies() {
for (MMESCtr=0;MMESCtr<8;MMESCtr++) {
if (MMEnX[MMESCtr]>=BufferClipX && MMEnY[MMESCtr]>=BufferClipY && MMEnX[MMESCtr]<(BufferClipX+640) && MMEnY[MMESCtr]<(BufferClipY+480)) {
if (MMEnState[MMESCtr]>-1) {
for (MMPSCtr=0;MMPSCtr<8;MMPSCtr++) {
if (MMProjDir[MMPSCtr]>-1) {
if(MMProjY[MMPSCtr]>=(MMEnY[MMESCtr]-BufferClipY) && MMProjY[MMPSCtr]+8*3<=(MMEnY[MMESCtr]-BufferClipY)+32*3) {
if(MMProjX[MMPSCtr]>=(MMEnX[MMESCtr]-BufferClipX) && MMProjX[MMPSCtr]+8*3<=(MMEnX[MMESCtr]-BufferClipX)+32*3) {
Sfx(SFX_ENHIT);
MMProjDir[MMPSCtr]=-1;
MMEnHealth[MMESCtr] -= 3;
if (MMEnHealth[MMESCtr]<1) { MMEnState[MMESCtr]=-1; };
};
};
};
};
switch(MMEnType[MMESCtr]) {
case 0:
switch(MMEnState[MMESCtr]) {
case 1:
MMSprite(SPR_Evilman, 0, MMEnX[MMESCtr]-BufferClipX, MMEnY[MMESCtr]-BufferClipY, ((32*3)*1), ((32*3)*0), ((32*3)*2)-1, ((32*3)*1)-1, MMEnDir[ MMESCtr]);
break;
case 2:
MMSprite(SPR_Evilman, 0, MMEnX[MMESCtr]-BufferClipX, MMEnY[MMESCtr]-BufferClipY, ((32*3)*2), ((32*3)*0), ((32*3)*3)-1, ((32*3)*1)-1, MMEnDir[ MMESCtr]);
break;
case 3:
MMSprite(SPR_Evilman, 0, MMEnX[MMESCtr]-BufferClipX, MMEnY[MMESCtr]-BufferClipY, ((32*3)*3), ((32*3)*0), ((32*3)*4)-1, ((32*3)*1)-1, MMEnDir[ MMESCtr]);
break;
case 4:
MMSprite(SPR_Evilman, 0, MMEnX[MMESCtr]-BufferClipX, MMEnY[MMESCtr]-BufferClipY, ((32*3)*2), ((32*3)*0), ((32*3)*3)-1, ((32*3)*1)-1, MMEnDir[ MMESCtr]);
break;
};
break;
};
};
};
if (MMEnState[MMESCtr]>0) {
switch(MMEnDir[MMESCtr]) {
case 0:
if (MMEnX[MMESCtr] >= 8) { MMEnX[MMESCtr] -= 8; } else { MMEnDir[MMESCtr] = 1; };
break;
case 1:
if (MMEnX[MMESCtr] <= 1200) { MMEnX[MMESCtr] += 8; } else { MMEnDir[MMESCtr] = 0; };
break;
};
MMEnState[MMESCtr]++;
if (MMEnState[MMESCtr]>4) { MMEnState[MMESCtr] = 1; };
};
};
};
U8 H2N16(U8 _hb) {
U8 *h2n_word;
U8 *h2n_chars = "0123456789ABCDEF";
h2n_word[0] = h2n_chars[_hb];
h2n_word[1] = 0x0;
return h2n_word;
};
U0 DrawDebugText(Bool _debug) {
if (!_debug) { return; };
I64 DbgB, DbgH, DbgL;
DbgB = MMX / 256; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text("X", 100, 32, LTRED);
Text(H2N16(DbgH), 150, 32, LTRED);
Text(H2N16(DbgL), 175, 32, LTRED);
DbgB = MMX & 0xFF; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text(H2N16(DbgH), 200, 32, LTRED);
Text(H2N16(DbgL), 225, 32, LTRED);
DbgB = (MMY-MMJumpY) / 256; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text("Y", 100, 60, LTRED);
Text(H2N16(DbgH), 150, 60, LTRED);
Text(H2N16(DbgL), 175, 60, LTRED);
DbgB = (MMY-MMJumpY) & 0xFF; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text(H2N16(DbgH), 200, 60, LTRED);
Text(H2N16(DbgL), 225, 60, LTRED);
DbgB = GetTilesTop(MMX, MMY-MMJumpY) / 256; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text("TT", 100, 88, LTRED);
Text(H2N16(DbgH), 150, 88, LTRED);
Text(H2N16(DbgL), 175, 88, LTRED);
DbgB = GetTilesTop(MMX, MMY-MMJumpY) & 0xFF; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text(H2N16(DbgH), 200, 88, LTRED);
Text(H2N16(DbgL), 225, 88, LTRED);
DbgB = GetTilesBot(MMX, MMY-MMJumpY) / 256; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text("TB", 100, 116, LTRED);
Text(H2N16(DbgH), 150, 116, LTRED);
Text(H2N16(DbgL), 175, 116, LTRED);
DbgB = GetTilesBot(MMX, MMY-MMJumpY) & 0xFF; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text(H2N16(DbgH), 200, 116, LTRED);
Text(H2N16(DbgL), 225, 116, LTRED);
DbgB = GetTilesAdj(MMX, MMY-MMJumpY, MMDir) / 256; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text("TX", 100, 144, LTRED);
Text(H2N16(DbgH), 150, 144, LTRED);
Text(H2N16(DbgL), 175, 144, LTRED);
DbgB = GetTilesAdj(MMX, MMY-MMJumpY, MMDir) & 0xFF; DbgH = DbgB / 16; DbgL = DbgB & 0x0F;
Text(H2N16(DbgH), 200, 144, LTRED);
Text(H2N16(DbgL), 225, 144, LTRED);
};
U0 DrawMMLifeMeter() {
Buffer->color = BLACK;
GrRect(Buffer, 48, 32, 8*MMPixScale, 56*MMPixScale);
Buffer->color = LTGRAY;
LMIncr = 27*(MMPixScale*2);
for (LFIncr=0;LFIncr<(MMHealth/2);LFIncr++) {
for (LYIncr=0;LYIncr<MMPixScale;LYIncr++) {
GrLine(Buffer, 48+(1*MMPixScale), 32+(LMIncr+LYIncr), 48+(7*MMPixScale), 32+(LMIncr+LYIncr));
};
LMIncr -= MMPixScale*2;
};
Buffer->color = WHITE;
LMIncr = 27*(MMPixScale*2);
for (LFIncr=0;LFIncr<(MMHealth/2);LFIncr++) {
for (LYIncr=0;LYIncr<MMPixScale;LYIncr++) {
GrLine(Buffer, 48+(3*MMPixScale), 32+(LMIncr+LYIncr), 48+(5*MMPixScale), 32+(LMIncr+LYIncr));
};
LMIncr -= MMPixScale*2;
};
};
U0 DrawProjectiles() {
for (MMPSCtr=0;MMPSCtr<8;MMPSCtr++) {
if (MMProjDir[MMPSCtr]>-1) {
MMSprite(SPR_Megaman, MMInvFlop, MMProjX[MMPSCtr], MMProjY[MMPSCtr], ((32*0)*0), ((32*3)*3), ((32*0)*3)+24, ((32*3)*3)+24, 0);
if (MMProjDir[MMPSCtr]==0) { MMProjX[MMPSCtr] -= 32; };
if (MMProjDir[MMPSCtr]==1) { MMProjX[MMPSCtr] += 32; };
if (MMProjX[MMPSCtr]>630) { MMProjDir[MMPSCtr] = -1; };
if (MMProjX[MMPSCtr]<0) { MMProjDir[MMPSCtr] = -1; };
};
};
};
U0 ReadyMsg() {
RMFlop = 0;
for (RMIncr=0;RMIncr<24;RMIncr++) {
UpdateBgr;
if (RMFlop==0) { Text("READY", 262, 216, WHITE); }
RMFlop++;
if (RMFlop>1) { RMFlop = 0; };
Sleep(60);
};
};
U0 MMTeleportIn() {
for (TelY=0;TelY<MMY;TelY+=48) {
UpdateBgr;
MMSprite(SPR_Megaman, MMInvFlop, MMX, TelY, ((32*3)*5), ((32*3)*0), ((32*3)*6)-1, ((32*3)*1)-1, MMDir);
DrawMMLifeMeter;
Sleep(1);
};
Sfx(SFX_MMTELIN);
UpdateBgr;
MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*5), ((32*3)*1)+2, ((32*3)*6)-1, ((32*3)*2)-1, MMDir);
DrawMMLifeMeter;
Sleep(1);
UpdateBgr;
MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*5), ((32*3)*2)+2, ((32*3)*6)-1, ((32*3)*3)-1, MMDir);
DrawMMLifeMeter;
Sleep(1);
UpdateBgr;
MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*5), ((32*3)*0), ((32*3)*6)-1, ((32*3)*1)-1, MMDir);
DrawMMLifeMeter;
Sleep(1);
};
U0 InitGameSettings() {
BgrIncrX=0;
BgrIncrY=0;
BgrMapPosX=0;
BgrMapPosY=0;
BgrMapStartPosY=0;
BgrScrollPosX=0;
BgrScrollPosY=0;
BgrState=0;
BufferClipX = 0;
BufferClipY = 0;
MMHealth = 56;
MMInvCtr = 0;
MMInvFlop = 0;
MMDeath = 0;
MMDeathPit = 0;
MMExit = 0;
MMLadder = 0;
MMCrouch = 0;
MMState = 1;
MMAct = 0;
MMJump = 0;
MMHit = 0;
MMHitDir = 0;
MMHitFlop = 0;
MMSlide = 0;
MMShoot = 0;
MMJumpY = 0;
MMVBase = 24;
MMX = 240;
MMXBound = 300;
MMXMax = 7280;
MMDir = 1;
MMPixScale = 3;
MMY = 311;
MMYTrBase = 0;
MMYTrMode = 0;
// Clear projectiles.
for (MMProjInit=0;MMProjInit<8;MMProjInit++) { MMProjX[MMProjInit]=0; MMProjY[MMProjInit]=0; MMProjDir[MMProjInit]=-1; };
// Clear enemies.
for (MMEnInit=0;MMEnInit<8;MMEnInit++) { MMEnX[MMEnInit]=0; MMEnY[MMEnInit]=0; MMEnDir[MMEnInit]=-1; MMEnState[MMEnInit]=-1; MMEnHealth[MMEnInit]=-1; };
// Set Mega Man default state.
MMState = 1;
// Spawn some "evil" Mega Men on the playfield.
NewEnemy(MMX+(16*MMPixScale)+(48*MMPixScale), MMY, 15, 0, 10, 1, 0);
NewEnemy(MMX+(128*MMPixScale)+(48*MMPixScale), MMY, 15, 0, 10, 1, 0);
};
U0 ItemSelect()
{
Bool xblk=FALSE;
Bool xcur=FALSE;
I64 iSysTimerCnt;
I64 isx=36;
I64 isy=60;
I64 isxctr=0;
I64 isyctr=0;
Sfx(SFX_MMPAUSE);
while (isyctr<14) {
isx=36;
isxctr=0;
while (isxctr<10) {
iSysTimerCnt=SysTimerRead;
xblk=FALSE;
if (isyctr>0 && isyctr<13) {
if (isxctr>0 && isxctr<9) {
xblk=TRUE;
};
};
if (xblk) {
GrBlot(,258+isx,16+isy,IX_WND);
} else {
GrBlot(,252+isx,12+isy,IX_BORDER);
};
while (SysTimerRead<iSysTimerCnt+550) {
Sleep(1);
};
isx+=24;
isxctr++;
};
isy+=24;
isyctr++;
};
// 24
Text(" P", 319, 93+(24*1), WHITE);
Text(" EXIT", 319, 93+(24*10), WHITE);
while (ScanKey) { Sleep(1); };
iSysTimerCnt=SysTimerRead;
while (SysTimerRead<iSysTimerCnt+180000) {
Sleep(1);
};
while (InU8(0x60)!=0x1C) {
Sleep(100);
if (xcur) {
Text(">", 319, 93+(24*1), LTGRAY);
} else {
GrBlot(,319,93+(24*1),IX_WND);
};
if (!xcur) { xcur=TRUE; } else { xcur=FALSE; };
};
iSysTimerCnt=SysTimerRead;
while (SysTimerRead<iSysTimerCnt+180000) {
Sleep(1);
};
while (InU8(0x60)==0x1C) { Sleep(1); };
while (ScanKey) { Sleep(1); };
}
U0 GameLoop() {
UpdateBgr;
ReadyMsg;
MMTeleportIn;
while (TRUE) {
SysTimerCnt=SysTimerRead;
UpdateBgr;
DrawProjectiles;
DrawEnemies;
if(MMHit<1 && MMDeath==0) {
for (MMESCtr=0;MMESCtr<8;MMESCtr++) {
if(MMEnState[MMESCtr]>-1) {
if(MMY-MMJumpY>=(MMEnY[MMESCtr]-BufferClipY)-32*1 && (MMY-MMJumpY)+32*3<=(MMEnY[MMESCtr]-BufferClipY)+32*5) {
if(MMInvCtr==0 && MMX>=(MMEnX[MMESCtr]-BufferClipX)-32*1 && MMX+32*3<=(MMEnX[MMESCtr]-BufferClipX)+32*5) {
MMHit=1;
MMHealth -= MMEnDamage[MMESCtr];
if (MMHealth>0) { Sfx(SFX_MMHIT); MMInvCtr = 1; MMInvFlop = 0; };
if (MMHealth<=0) {
for(MMDeathInit=0;MMDeathInit<12;MMDeathInit++) { MMDeathX[MMDeathInit] = MMX; MMDeathY[MMDeathInit] = MMY-MMJumpY; }
Sfx(MUS_STOP);
Sfx(SFX_MMDEATH);
MMDeath=1;
MMDeathPit=0;
MMState=99;
MMHit=0;
MMJump=0;
MMShoot=0;
MMDeathFlop=0;
};
MMSlide=0;
MMShoot=0;
MMHitDir = 0;
if (MMDir==1) { MMHitDir=1; };
};
};
};
};
};
if (MMDeath>0) {
for(MMDeathInit=1;MMDeathInit<12;MMDeathInit++) {
if (MMDeathFlop==0) { MMSprite(SPR_Megaman, MMInvFlop, MMDeathX[MMDeathInit], MMDeathY[MMDeathInit], ((32*3)*1), ((32*3)*3), ((32*3)*2)-1, ((32*3)*4)-1, MMDir); };
if (MMDeathFlop==1) { MMSprite(SPR_Megaman, MMInvFlop, MMDeathX[MMDeathInit]+8, MMDeathY[MMDeathInit], ((32*3)*2), ((32*3)*3), ((32*3)*3)-1, ((32*3)*4)-1, MMDir); };
if (MMDeathFlop==2) { MMSprite(SPR_Megaman, MMInvFlop, MMDeathX[MMDeathInit]+8, MMDeathY[MMDeathInit], ((32*3)*3), ((32*3)*3), ((32*3)*4)-1, ((32*3)*4)-1, MMDir); };
if (MMDeathFlop==3) { MMSprite(SPR_Megaman, MMInvFlop, MMDeathX[MMDeathInit]+8, MMDeathY[MMDeathInit], ((32*3)*4), ((32*3)*3), ((32*3)*5)-1, ((32*3)*4)-1, MMDir); };
};
MMDeathX[1] -= 12;
MMDeathX[2] -= 24;
MMDeathX[3] += 12;
MMDeathX[4] += 24;
MMDeathY[5] -= 12;
MMDeathY[6] -= 24;
MMDeathY[7] += 12;
MMDeathY[8] += 24;
MMDeathX[9] -= 24;
MMDeathX[10] -= 24;
MMDeathX[11] += 24;
MMDeathX[12] += 24;
MMDeathY[9] -= 24;
MMDeathY[10] += 24;
MMDeathY[11] -= 24;
MMDeathY[12] += 24;
MMDeath += 2;
MMDeathFlop++;
if(MMDeathFlop>3) {
MMDeathFlop = 0;
};
};
if(MMHit>0) {
MMHit += 2;
};
if(MMSlide>0) { MMSlide += 2; };
if(MMShoot>0) {
if(MMShoot==1) {
if (MMDir==0) { NewProjectile(MMX+(16*MMPixScale)-(12*MMPixScale), ((MMY-MMJumpY)+(3*MMPixScale)+(8*MMPixScale))-8, MMDir); };
if (MMDir==1) { NewProjectile(MMX+(16*MMPixScale)+(12*MMPixScale), ((MMY-MMJumpY)+(3*MMPixScale)+(8*MMPixScale))-8, MMDir); };
};
MMShoot += 1;
};
if(MMShoot>4) { MMShoot = 0; if(MMState==0) { MMState = 1; }; };
MMObsH = 0; MMObsL = 0;
if (MMLadder>0) { MMObsH = 1; MMObsL = 1; MMAct = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x30) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x32) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x34) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x36) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x38) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x3A) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x3D) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x68) { MMObsH = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x30) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x32) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x34) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x36) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x38) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x3A) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x3D) { MMObsL = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x68) { MMObsL = 1; };
if (MMJump==0 && MMDeath==0 && MMLadder==0) { if (MMObsH == 0 && MMObsL == 0) { MMSlide = 0; MMJump = 2; }; };
if (MMJump==1) {
MMJumpY += 48;
if(MMJumpY>224) { MMSlide = 0; MMJump = 2; };
if(MMJumpY>96 && (InU8(0x60) != 0x38)) { MMSlide = 0; MMJump = 2; };
};
if (MMJump==2 && MMDeathPit==0) {
if (GetTilesBot(MMX, MMY-MMJumpY) / 256 == 0x7E) { MMDeathPit = 1; };
if (GetTilesBot(MMX, MMY-MMJumpY) & 0xFF == 0x7E) { MMDeathPit = 1; };
if (MMDeathPit==1) {
for(MMDeathInit=0;MMDeathInit<12;MMDeathInit++) { MMDeathX[MMDeathInit] = -999; MMDeathY[MMDeathInit] = -999; }
Sfx(MUS_STOP);
Sfx(SFX_MMDEATH);
MMDeath=1;
MMDeathPit=1;
MMState=99;
MMHit=0;
MMJump=0;
MMShoot=0;
MMDeathFlop=0;
MMSlide=0;
MMShoot=0;
MMHitDir = 0;
MMX=0;
MMY=0;
};
if (MMY-MMJumpY>480 && MMDeathPit==0 && MMYTrMode==0) {
MMYTrMode = 1;
MMYTrBase = BgrScrollPosY;
};
if (MMJump == 2 && MMObsH == 0 && MMObsL == 0) {
MMJumpY -= 48;
} else {
MMJump = 0;
MMY = MMY-(48 * (MMJumpY / 48));
MMJumpY = 0;
if(MMState==0) { MMState = 1; };
};
};
if(MMState>9 & MMState<14) {
MMObsH = 1; MMObsL = 1;
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) / 256 == 0x2E) { MMObsH = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) / 256 == 0x3D) { MMObsH = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) / 256 == 0x48) { MMObsH = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) / 256 == 0x68) { MMObsH = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) & 0xFF == 0x2E) { MMObsL = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) & 0xFF == 0x3D) { MMObsL = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) & 0xFF == 0x48) { MMObsL = 0; };
if (GetTilesAdj(MMX, MMY-MMJumpY, MMDir) & 0xFF == 0x68) { MMObsL = 0; };
if (MMDir==0 && MMLadder==0 && MMObsH==0 && MMObsL==0) {
if(MMX>MMXBound) { MMX -= (MMVBase+(MMSlide*0)); };
if(MMX<=MMXBound && BufferClipX>0) { BufferClipX -= (MMVBase+(MMSlide*0)); BgrScrollPosX -= 12; };
if(MMX<=MMXBound && BufferClipX<=0 && MMX>0) { MMX -= (MMVBase+(MMSlide*0)); };
};
if (MMDir==1 && MMLadder==0 && MMObsH==0 && MMObsL==0) {
if(MMX<MMXBound) { MMX += (MMVBase+(MMSlide*0)); };
if(MMX>=MMXBound && BufferClipX<MMXMax) { BufferClipX += (MMVBase+(MMSlide*0)); BgrScrollPosX += 12; };
if(MMX>=MMXBound && BufferClipX>=MMXMax && MMX < 520) { MMX += (MMVBase+(MMSlide*0)); };
};
};
if (MMJump>0) {
if(MMShoot==0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*4), ((32*3)*0), ((32*3)*5)-1, ((32*3)*1)-1, MMDir); };
if(MMShoot>0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*4), ((32*3)*1), ((32*3)*5)-1, ((32*3)*2)-1, MMDir); };
};
if (MMSlide>0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY-12, ((32*3)*0), ((32*3)*2), ((32*3)*1)-1, ((32*3)*3)-1, MMDir); };
if(MMSlide>12) { MMSlide = 0; if(MMState==0) { MMState = 1; }; };
if (MMHit>0) {
MMHitFlop++;
if (MMHitFlop==1) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY-12, ((32*3)*3), ((32*3)*2), ((32*3)*4)-1, ((32*3)*3)-1, MMDir); }
if (MMHitFlop==2) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY-12, ((32*3)*4), ((32*3)*2), ((32*3)*5)-1, ((32*3)*3)-1, MMDir); }
if (MMHitFlop>2) { MMHitFlop = 0; };
};
if (MMHit>12) { MMHit = 0; if(MMState==0) { MMState = 1; }; };
if (MMDeath>128) { break; };
if (MMLadder>0) {
if ((GetTilesBot(MMX, MMY) / 256) == 0x48) { MMLadder = 10; };
if ((GetTilesBot(MMX, MMY) & 0xFF) == 0x48) { MMLadder = 10; };
if (MMLadder==10) { MMLadder=1; } else { MMLadder=0; };
};
if (MMLadder>0) {
if (MMY-MMJumpY>480 && MMDeathPit==0 && MMYTrMode==0) {
MMYTrMode = 1;
MMYTrBase = BgrScrollPosY;
};
if (MMY-MMJumpY<0 && MMDeathPit==0 && MMYTrMode==0) {
MMYTrMode = 2;
MMYTrBase = BgrScrollPosY;
};
};
if (MMLadder>0) {
if(MMShoot==0) {
if(MMState==20) { MMSprite(SPR_Megaman, MMInvFlop, MMX-19, MMY-MMJumpY, ((32*3)*1), ((32*3)*2), ((32*3)*2)-1, ((32*3)*3)-1, 0); };
if(MMState==21) { MMSprite(SPR_Megaman, MMInvFlop, MMX-29, MMY-MMJumpY, ((32*3)*1), ((32*3)*2), ((32*3)*2)-1, ((32*3)*3)-1, 1); };
};
if(MMShoot>0) {
if(MMState==20) { MMSprite(SPR_MegamanB, MMInvFlop, MMX-19, MMY-MMJumpY, ((32*3)*0), ((32*3)*0), ((32*3)*1)-1, ((32*3)*1)-1, MMDir); };
if(MMState==21) { MMSprite(SPR_MegamanB, MMInvFlop, MMX-29, MMY-MMJumpY, ((32*3)*0), ((32*3)*0), ((32*3)*1)-1, ((32*3)*1)-1, MMDir); };
};
};
if (MMLadder==0 && MMJump==0 && MMSlide==0 && MMHit==0 && MMDeath==0) {
if (MMState<10) { if (MMShoot>0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*0), ((32*3)*1), ((32*3)*1)-1, ((32*3)*2)-1, MMDir); }; };
if (MMState==12) {
if (MMShoot==0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*3), ((32*3)*0), ((32*3)*4)-1, ((32*3)*1)-1, MMDir); };
if (MMShoot>0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*3), ((32*3)*1), ((32*3)*4)-1, ((32*3)*2)-1, MMDir); };
MMState = 13;
};
if (MMState==11) {
if (MMShoot==0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*2), ((32*3)*0), ((32*3)*3)-1, ((32*3)*1)-1, MMDir); };
if (MMShoot>0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*2), ((32*3)*1), ((32*3)*3)-1, ((32*3)*2)-1, MMDir); };
MMState = 12;
};
if (MMState==10) {
if (MMShoot==0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*1), ((32*3)*0), ((32*3)*2)-1, ((32*3)*1)-1, MMDir); };
if (MMShoot>0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*1), ((32*3)*1), ((32*3)*2)-1, ((32*3)*2)-1, MMDir); };
MMState = 11;
};
if (MMState==0) {
if (MMShoot==0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*0), ((32*3)*0), ((32*3)*1)-1, ((32*3)*1)-1, MMDir); };
MMState = 0;
};
if (MMState==1) {
if (MMShoot==0) { MMSprite(SPR_Megaman, MMInvFlop, MMX, MMY-MMJumpY, ((32*3)*0), ((32*3)*0), ((32*3)*1)-1, ((32*3)*1)-1, MMDir); };
MMState = 0;
};
if (MMState==13) {
if (MMAct==1) { MMState = 10; };
if (MMAct==0) { MMState = 1; };
};
};
MMAct = 0;
MMScanCode = InU8(0x60);
if (MMScanCode==0x01) { MMExit = 1; break; };
if (MMYTrMode>0) { MMScanCode = 0x00; MMAct = 0; MMState = 1; };
if (MMYTrMode==1 && MMJump==2) {
MMJumpY += 96;
if (BgrScrollPosY<(MMYTrBase+480)) {
BgrScrollPosY += 48;
} else {
MMYTrMode = 0;
};
};
if (MMYTrMode==1 && MMLadder>0) {
if (MMState<20) { MMState = 21; };
if (MMState>21) { MMState = 20; };
MMY -= 48;
MMJumpY = 0;
if (BgrScrollPosY<(MMYTrBase+480)) {
BgrScrollPosY += 48;
} else {
MMY += 48;
MMYTrMode = 0;
};
};
if (MMYTrMode==2 && MMLadder>0) {
if (MMState<20) { MMState = 21; };
if (MMState>21) { MMState = 20; };
MMY += 48;
MMJumpY = 0;
if (BgrScrollPosY>(MMYTrBase-480)) {
BgrScrollPosY -= 48;
} else {
MMY -= 48;
MMYTrMode = 0;
};
};
if (MMScanCode==0x1d) {
if (MMSlide==0 && MMHit==0 && MMDeath==0) {
MMAct = 1;
if (MMShoot==0) { MMShoot = 1; Sfx(SFX_MMSHOT); }
};
};
if (MMScanCode==0x48) {
if(MMLadder>0) { MMAct=1; MMY -= 48; MMState++; if (MMState > 21) { MMState = 20; }; };
if(MMLadder==0) {
if (AlignToMapTile(MMX, MMY, 0x48) > -1) { MMLadder=1; MMAct=1; MMState=20; MMX = AlignToMapTile(MMX, MMY, 0x48); MMY -= 48; };
};
};
if (MMScanCode==0x38 && MMDeath==0) {
MMAct = 1;
if(MMCrouch==1) {
if (MMSlide==0 && MMHit==0 && MMDeath==0 && MMLadder==0) { if(MMJump==0) { MMSlide = 1; MMState=10; }; };
};
if(MMCrouch==0) {
if (MMJump==0) {
if(MMSlide==0 && MMHit==0 && MMDeath==0 && MMLadder==0) { MMJump = 1; Sfx(SFX_MMJUMP); }; if(MMLadder>0) { MMLadder=0; MMJump=2; };
};
};
};
if (MMScanCode==0x4b && MMDeath==0) {
MMAct = 1;
MMDir = 0;
if (MMState<10) { MMState = 10; };
};
if (MMScanCode==0x4d && MMDeath==0) {
MMAct = 1;
MMDir = 1;
if (MMState<10) { MMState = 10; };
};
if (MMAct == 0) { if (MMLadder==0 && MMState>15) { MMState = 1; } };
MMCrouch = 0;
if (MMScanCode==0x50 && MMDeath==0) {
if(MMLadder>0) { MMAct=1; MMY += 48; MMState--; if (MMState < 20) { MMState = 21; }; };
if(MMLadder==0) {
if (AlignToMapTile(MMX, MMY+128, 0x68) > -1) { MMLadder=1; MMAct=1; MMState=21; MMX = AlignToMapTile(MMX, MMY+128, 0x68); MMY += 48; }
else { MMCrouch = 1; };
};
};
if (MMInvCtr>0) {
MMInvCtr++;
MMInvFlop++;
if (MMInvFlop>1) { MMInvFlop = 0; };
};
if (MMInvCtr>48) { MMInvCtr = 0; MMInvFlop = 0; };
if (MMScanCode==0x1C && MMDeath==0) {
ItemSelect;
};
DrawMMLifeMeter;
DrawDebugText(FALSE);
while (SysTimerRead<SysTimerCnt+60000) {
Sleep(1);
};
};
};
// Start Application.
U0 Run(I64 sfx_cpu=0) {
LoadSprites;
MMExit = 0;
SettingsPush;
WinMax;
AutoComplete;
DocCursor;
WinBorder;
GameSetPalette;
DCFill(Buffer,BLACK);
MMSprite(SPR_Logo, 0, 48, 48, 0, 0, 545, 167, 0);
Text(" PRESS ENTER KEY", 96, 256, WHITE);
PressAKey;
while (MMExit==0) {
InitGameSettings;
*gr.fp_draw_grab_ms = &HideMs;
*gr.fp_draw_ms = &HideMs;
DCFill(Buffer,TRANSPARENT);
Sfx(MUS_DEMO);
Spawn(&PCSP,,,sfx_cpu);
GameLoop;
};
// Exit game.
Sfx(MUS_STOP);
PCSP_EXIT=TRUE;
FreeBgrs;
FreeSprites;
PaletteSetStd;
DCFill(DCAlias(),TRANSPARENT);
*gr.fp_draw_grab_ms = PtrMsGrab;
*gr.fp_draw_ms = PtrMsStd;
DocClear;
SettingsPop;
};