// *********************************************** // MAIN.C - main file // *********************************************** // **** includes //#include "storescr.h" //#include "useful.h" #include "addrs.h" #include "pad.h" #include "init.h" #include "graphics.h" #include "creation.h" #include "calcs.h" #include "maps.h" #include "mapsetup.h" #include "global.h" #include "render.h" #include "text.h" #include "enemies.h" #include "title.h" // **** global variable extern DISPENV GsDISPENV; // **** function prototypes void InitialiseGameData(); void UpdateProgram(); void RenderProgram(); static void DrawTextLoop(u_long tPos, u_char tChar); u_long ProcessPad(); // **** read and act on pad u_long ProcessPad() { static u_long isCrossPressed=FALSE; u_long returnValue = 0; u_long PAD1, PAD2; long playerMove = 0; static u_long SWINGINGSWORD = FALSE; PAD2 = (PAD = PAD1 = ReadPad()) >> 16; if (PAD2& PADup) GsDISPENV.screen.y--; if (PAD2& PADdown) GsDISPENV.screen.y++; if (PAD2& PADleft) GsDISPENV.screen.x--; if (PAD2& PADright) GsDISPENV.screen.x++; if (PAD1& PADleft) RotateModel(&CHARINFO[0].charModel, &CHARINFO[0].charVector, 0, -64, 0); if (PAD1& PADright) RotateModel(&CHARINFO[0].charModel, &CHARINFO[0].charVector, 0, 64, 0); // if ((PAD1& PADL1) && (currentItem>0)) currentItem--; // if ((PAD1& PADR1) && (currentItem<2)) currentItem++; // if ((PAD1& PADL2) && (currentMagic>0)) currentMagic--; // if ((PAD1& PADR2) && (currentMagic<2)) currentMagic++; if (!(PAD1& PADup) && !(PAD1& PADdown) && (SWINGINGSWORD == FALSE)) { u_long *tMemAddress = (u_long *) (PLAY1_TMD); GsLinkObject4((u_long) (tMemAddress+3), &CHARINFO[0].charModel.Object_Handler, 0); PLAYERANIM = 0; } if ((PAD1& PADcross) && (CurrentMap->fight == TRUE) && (isCrossPressed == FALSE)) { u_long *tMemAddress = (u_long *) (PLAY4_TMD); GsLinkObject4((u_long) (tMemAddress+3), &CHARINFO[0].charModel.Object_Handler, 0); PLAYERANIM = 16; SWORDHURT = FALSE; isCrossPressed = TRUE; SWINGINGSWORD = TRUE; } if (SWINGINGSWORD == TRUE) { PLAYERANIM++; if (PLAYERANIM == 18) { u_long *tMemAddress = (u_long *) (PLAY5_TMD); GsLinkObject4((u_long) (tMemAddress+3), &CHARINFO[0].charModel.Object_Handler, 0); SWORDHURT = TRUE; Calculate3dOffset(&CHARINFO[0].charVector, 100, -150, 250, &SwordPlace[0]); SwordPlace[0] += CHARINFO[0].charModel.Object_Coord.coord.t[0]; SwordPlace[1] += CHARINFO[0].charModel.Object_Coord.coord.t[1]; SwordPlace[2] += CHARINFO[0].charModel.Object_Coord.coord.t[2]; } if (PLAYERANIM>22) { u_long *tMemAddress = (u_long *) (PLAY4_TMD); GsLinkObject4((u_long) (tMemAddress+3), &CHARINFO[0].charModel.Object_Handler, 0); SWORDHURT = FALSE; } if (PLAYERANIM>26) SWINGINGSWORD = FALSE; } if ((isCrossPressed == TRUE) && !(PAD1& PADcross)) { isCrossPressed = FALSE; } if ((PAD1& PADup) && (SWINGINGSWORD==FALSE)) { playerMove = 64; if (PLAYERANIM >15) PLAYERANIM = 0; PLAYERANIM = (PLAYERANIM+2) % 16; } if ((PAD1& PADdown) && (SWINGINGSWORD==FALSE)) { playerMove = -32; if (PLAYERANIM >15) PLAYERANIM = 0; PLAYERANIM = (PLAYERANIM-1+16) % 16; } UpdateCharacterPosition(0, 0, playerMove); if (playerMove != 0) { u_long *tMemAddress = (u_long *) (PLAYANIMFRAMES[PLAYERANIM>>2]); GsLinkObject4((u_long) (tMemAddress+3), &CHARINFO[0].charModel.Object_Handler, 0); } // if (PAD1& PADR1) CameraMode = 0; // if (PAD1& PADR2) CameraMode = 1; // if (PAD1& PADL1) CameraMode = 2; // quit if start on pad 1 pressed if (PAD1& PADstart) { u_char tText1[] = "- GAME PAUSED - START button to continue playing. SELECT button to quit. #"; CreateText(tText1); while (PAD& PADstart) { PAD = ReadPad(); RenderProgramText(1); } while (!(PAD& PADstart) && !(PAD& PADselect)) { PAD = ReadPad(); RenderProgramText(1); } while ((PAD& PADstart) || (PAD& PADselect)) { PAD = ReadPad(); RenderProgramText(1); if (PAD& PADselect) { returnValue = 1; stop_sound(SONG[MusicPlaying-1]); } } } // if (PAD& PADtriangle) {DrawSync(0); VSync(0); VSync(0); StoreScreen2((u_long *) 0x80090000, 0, 0, 320, 248); printf("wib");VSync(0); returnValue = 1;} //if (PAD& PADL1) CameraMode = 0; //if (PAD& PADR1) CameraMode = 1; //if (PAD& PADL2) CameraMode = 2; return returnValue; } // **** update the world void UpdateProgram() { CalculateCamera(CameraMode, &ViewPoint, 0); UpdateEnemies(); GsSetRefView2(&ViewPoint); } // **** MAIN function void main(void) { u_long counter; u_long GameNotQuit = TRUE; InitScreen(); InitPad(); InitText(); GsDISPENV.screen.h = 256; // printf("*"); SetSpriteInfo(&TITLE[0], TITLE2_TIM, -108, -120); SetSpriteInfo(&flame[0], FLAME00_TIM, -160,-128-256); SetSpriteInfo(&flame[1], FLAME10_TIM, -160+256,-128-256); SetSpriteInfo(&flame[2], FLAME01_TIM, -160,-128); SetSpriteInfo(&flame[3], FLAME11_TIM, -160+256,-128); // printf("*"); SetSpriteInfo(&SNOWSPRITE[0], SNOW1_TIM, 0, 0); SetSpriteInfo(&SNOWSPRITE[1], SNOW2_TIM, 0, 0); SetSpriteInfo(&SNOWSPRITE[2], SNOW3_TIM, 0, 0); BitSet(&SNOWSPRITE[0].attribute, (1<<30)+(1<<28)); BitSet(&SNOWSPRITE[1].attribute, (1<<30)+(1<<28)); // printf("*"); // create models and map info etc GROUND_MEM = NY_1_TIM; // MEM_ADDRESS[0] = createPlayer(FREE_MEM, 192, 64, 192); // MEM_ADDRESS[1] = createPlayer(0, 192, 192, 64); // create a rubbish model simply to get next bit of memory for tmds // printf("*"); // shitty loading screen tihng, which is what we all hate. No, honest it is! // EXTREMELY LAZY routine, so don't knock it please LoadTimData(NY_1_TIM); LoadTimData(NY_2_TIM); { GsSPRITE ny[2]; SetSpriteInfo(&ny[0], NY_1_TIM, 0-160, 0-128); SetSpriteInfo(&ny[1], NY_2_TIM, 256-160, 0-128); for (counter=0; counter<128; counter+=4) { u_long currentBuffer = GsGetActiveBuff(); GsClearOt(0, 0, &OTable_Header[currentBuffer]); GsSetWorkBase((PACKET*)Packet_Memory[currentBuffer]); ny[0].r = ny[0].g = ny[0].b = ny[1].r = ny[1].g = ny[1].b = counter; GsSortFastSprite(&ny[0],&OTable_Header[currentBuffer], 1); GsSortFastSprite(&ny[1],&OTable_Header[currentBuffer], 1); DrawSync(0); VSync(0); GsSwapDispBuff(); GsSortClear(0,0,0, &OTable_Header[currentBuffer]); GsDrawOt(&OTable_Header[currentBuffer]); } for (counter=0; counter<5*50; counter++) { u_long currentBuffer = GsGetActiveBuff(); GsClearOt(0, 0, &OTable_Header[currentBuffer]); GsSetWorkBase((PACKET*)Packet_Memory[currentBuffer]); ny[0].r = ny[0].g = ny[0].b = ny[1].r = ny[1].g = ny[1].b = 128; GsSortFastSprite(&ny[0],&OTable_Header[currentBuffer], 1); GsSortFastSprite(&ny[1],&OTable_Header[currentBuffer], 1); DrawSync(0); VSync(0); GsSwapDispBuff(); GsSortClear(0,0,0, &OTable_Header[currentBuffer]); GsDrawOt(&OTable_Header[currentBuffer]); } for (counter=128; counter>0; counter-=4) { u_long currentBuffer = GsGetActiveBuff(); GsClearOt(0, 0, &OTable_Header[currentBuffer]); GsSetWorkBase((PACKET*)Packet_Memory[currentBuffer]); ny[0].r = ny[0].g = ny[0].b = ny[1].r = ny[1].g = ny[1].b = counter; GsSortFastSprite(&ny[0],&OTable_Header[currentBuffer], 1); GsSortFastSprite(&ny[1],&OTable_Header[currentBuffer], 1); DrawSync(0); VSync(0); GsSwapDispBuff(); GsSortClear(0,0,0, &OTable_Header[currentBuffer]); GsDrawOt(&OTable_Header[currentBuffer]); } } // end of fading title screen. get rid of the damn thing for good now! hurrah lights[0].vx = 10; lights[0].vy = 20; lights[0].vz = 10; lights[0].r = 255; lights[0].g = 255; lights[0].b = 255; GsSetFlatLight(0, &lights[0]); GsSetAmbient(1028, 1028, 1028); PLAYANIMFRAMES[0] = PLAY1_TMD; PLAYANIMFRAMES[1] = PLAY2_TMD; PLAYANIMFRAMES[2] = PLAY1_TMD; PLAYANIMFRAMES[3] = PLAY3_TMD; LoadTimData(OPTIONS_TIM); LoadTimData(TXT_TEST_TIM); LoadTimData(TXT_TREE_TIM); LoadTimData(TXT_ROOF_TIM); LoadTimData(TXT_WALL_TIM); LoadTimData(TXT_DOOR_TIM); LoadTimData(TXT_02_TIM); LoadTimData(TXT_03_TIM); LoadTimData(TXT_12_TIM); LoadTimData(TXT_21_TIM); LoadTimData(TXT_22_TIM); LoadTimData(TXT_23_TIM); LoadTimData(TXT_30_TIM); LoadTimData(TXT_31_TIM); LoadTimData(TXT_32_TIM); LoadTimData(TXT_40_TIM); LoadTimData(TXT_41_TIM); LoadTimData(TXT_42_TIM); LoadTimData(TXT_50_TIM); LoadTimData(TXT_51_TIM); LoadTimData(TXT_52_TIM); LoadTimData(TXT_53_TIM); LoadTimData(TXT_WAT_TIM); LoadTimData(BACK_TIM); LoadTimData(BACK_T_TIM); LoadTimData(FONT_TIM); LoadTimData(SNOW1_TIM); LoadTimData(SNOW2_TIM); LoadTimData(SNOW3_TIM); LoadTimData(FLAME00_TIM); LoadTimData(FLAME01_TIM); LoadTimData(FLAME10_TIM); LoadTimData(FLAME11_TIM); LoadTimData(TITLE2_TIM); LoadTimData(SWORD_TIM); LoadTimData(BUBBLE_TIM); HEALTH.x = -160+12; HEALTH.y = -128+12; HEALTH.w = 255; HEALTH.h = 12; HEALTH.r = 255; HEALTH.g = HEALTH.b = 128; HEALTH.attribute += (1<<30); GsMapModelingData((u_long *)(PLAY1_TMD)+1); GsMapModelingData((u_long *)(PLAY2_TMD)+1); GsMapModelingData((u_long *)(PLAY3_TMD)+1); GsMapModelingData((u_long *)(PLAY4_TMD)+1); GsMapModelingData((u_long *)(PLAY5_TMD)+1); GsMapModelingData((u_long *)(PLAY6_TMD)+1); GsMapModelingData((u_long *)(WOMAN_TMD)+1); GsMapModelingData((u_long *)(OLDW_TMD)+1); GsMapModelingData((u_long *)(OLDM_TMD)+1); GsMapModelingData((u_long *)(BAT1_TMD)+1); GsMapModelingData((u_long *)(BAT2_TMD)+1); SetSpriteInfo(&SWORD, SWORD_TIM, 160-32-12, -128+12); SetSpriteInfo(&BUBBLE, BUBBLE_TIM, 160-32-12, -128+12); datafile_search(); datafile_read(); init_sound(); // while (ReadPad() == 0) {VSync(0);} while (GameNotQuit == TRUE) { GameRunning = TRUE; if (TitleScreenLoop() == TRUE) GameNotQuit = FALSE; GameRunning = TRUE; if (GameNotQuit == TRUE) InitialiseGameData(); while ((GameRunning == TRUE) && (GameNotQuit == TRUE)) { if (ProcessPad() == 1) GameRunning = FALSE; if (GameRunning == TRUE) { UpdateProgram(); if (PLAYERHEALTH < 1) { u_char tText1[] = "Too bad, you died. Would you like some more fun by starting again? Press the X button to continue. #"; stop_sound(MusicPlaying-1); MusicPlaying = 3; play_sound(MusicPlaying-1); CreateText(&tText1[0]); GameRunning = FALSE; GsLinkObject4((u_long) ((u_long *)(PLAY6_TMD)+3), &CHARINFO[0].charModel.Object_Handler, 0); DrawTextLoop(1, 0); PLAYERHEALTH = 1; } HEALTH.w = PLAYERHEALTH; if (GameRunning == FALSE) stop_sound(MusicPlaying-1); else RenderProgram(0); } } // printf("*"); } close_sound(); // printf("*"); ResetGraph(3); } // **** set any stuff that is required for a game loop to work correctly void InitialiseGameData() { u_long counter; // printf("*"); ClearMapInfo(); CameraMode = 0; MapInitZero(); MapInitOne(); MapInitTwo(); MapInitThree(); MapInitFour(); MapInitFive(); MapInitSix(); MapInitSeven(); MapInitEight(); MapInitNine(); MapInitTen(); MapInitEleven(); MapInitTwelve(); MapInitThirteen(); PLAYERHEALTH = 255; // printf("*"); InitCurrentMap(0, GROUND_MEM); // printf("*"); // initialise the player // SetModelInfo(&CHARINFO[0].charModel, 2*512+256, CalculateHeight(2*512+256, 17*512+256), 17*512+256, MEM_ADDRESS[0]); SetModelInfo(&CHARINFO[0].charModel, 2*512+256, CalculateHeight(2*512+256, 17*512+256), 17*512+256, PLAY1_TMD); RotateModel(&CHARINFO[0].charModel, &CHARINFO[0].charVector, 0, 2048, 0); CHARINFO[0].state = 1; CHARINFO[0].scaleX = (2*512+256)<<4; CHARINFO[0].scaleZ = (17*512+256)<<4; // printf("*"); PLAYERANIM= 0; // normal part carries on here SetViewPoint(&ViewPoint, 400, 0, 0, -20000, 0, 512*20, 0, 0, WORLD); for (counter = 0; counter<100; counter++) CalculateCamera(0, &ViewPoint, 0); // printf("*"); SWORDHURT = FALSE; MusicPlaying = 6; play_sound(SONG[MusicPlaying-1]); } static void DrawTextLoop(u_long tPos, u_char tChar) { while (PAD& PADcross) { PAD = ReadPad(); CalculateCamera(CameraMode, &ViewPoint, tChar); GsSetRefView2(&ViewPoint); RenderProgramText(tPos); } while (!(PAD& PADcross)) { PAD = ReadPad(); CalculateCamera(CameraMode, &ViewPoint, tChar); GsSetRefView2(&ViewPoint); RenderProgramText(tPos); } while (PAD& PADcross) { PAD = ReadPad(); CalculateCamera(CameraMode, &ViewPoint, tChar); GsSetRefView2(&ViewPoint); RenderProgramText(tPos); } }