//------------------------------------------------------------------- // main loop of the world to handle drawing, hiding, and showing of the // resources. When mario runs out of lives the thread is killed and cleaned // up. read: GAME OVER! //------------------------------------------------------------------- static bool Restart() { bool PlayWorld = false; TextStatus = false; //InitStatus(); Blocks.InitBlocks(); TmpObj.InitTempObj(); Glitter.ClearGlitter(); Enemies.ClearEnemies(); // ShowPage Buffers.GameDone = false; Buffers.Passed = false; for (int i = Enemies.StartEnemiesAt * -1; i < Buffers.NH + Enemies.StartEnemiesAt; i++) { int j = (Buffers.XView / Buffers.W) + i; Enemies.StartEnemies(j, (short)(1 - 2 * System.Convert.ToByte(j > Players.MapX))); } // SetYOffset (YBase); /*for (int i = 0; i < FormMarioPort.MAX_PAGE; i++) * { * // DrawSky (XView, 0, NH * W, NV * H); * * // StartClouds(); * * for (int x = Buffers.XView / Buffers.W; x < Buffers.XView / Buffers.W + Buffers.NH; x++) * for (int y = 0; y < Buffers.NV - 1; y++) * Figures.Redraw(x, y); * * BackGr.DrawBackGr(true); * //ReadColorMap(); * * if (Buffers.Options.Stars != 0) * Stars.ShowStars(); * * Enemies.ShowEnemies(); * if (!OnlyDraw) * Players.DrawPlayer(); * * FormMarioPort.formRef.ShowPage(); * } */ Buffers.Demo = Buffers.dmNoDemo; Waiting = false; //Palettes.NewPalette (P256*); //for (int i = 1; i < 100; i++) //{ //Waterfalls()? //Palettes.BlinkPalette(); //} Figures.SetSkyPalette(); BackGr.DrawPalBackGr(); //Palettes.InitGrass(); if (OnlyDraw) { return(false); } // Palettes.UnLockPal(); // FadeUp (64); // Palettes.ReadPalette (Palette); TextStatus = Stat;// && !KeyBoard.PlayingMacro()); //uint counter = 0; do //until gamedone { try { //Console.WriteLine("Restart Loop"); //if (!Keyboard.PlayingMacro) //{ // if (Key = 31) //'S' // { // Stat = !Stat; // TextStatus = Stat; // Keyboard.Key = 255; // } // if (Keyboard.Key = 16) //'Q' // { // if (Buffers.BeeperSound) // Buffers.BeeperOff(); // else // { // Buffers.BeeperOn(); // Buffers.Beep (80); // } // Key = 255; // } // if (Key == 197 || Key == 198) //Pause/Break // { // Music.PauseMusic(); // //do // //{ // // while (Keyboard.Key = 197) {} //busy wait of some sort? // //} while //(Keyboard.kbHit); // } // else // { // if (Keyboard.Key != 0) // { // Buffers.GameDone = true; // Buffers.Passed = true; // } // } // if (Buffers.TextCounter) //in 40..40+MAX_PAGE // ShowObjects = false; // HideGlitter(); // if (Options.Stars != 0) // HideStars(); // if (ShowObjects) // HideTempObj(); // if (ShowScore) // HideTotalBack(); // ErasePlayer(); // if (ShowObjects) // { // HideEnemies(); // EraseBlocks(); // } //} // { Fade }; Buffers.LavaCounter++; if (!Waiting) { if (Buffers.Demo == Buffers.dmNoDemo) { Enemies.MoveEnemies(); Players.MovePlayer(); } else { Players.DoDemo(); } } if (!Waiting) { if (Buffers.Passed) { if (Buffers.Demo == Buffers.dmNoDemo || Players.InPipe) { Waiting = true; Buffers.TextCounter = 0; } Buffers.TextCounter++; if (!ShowScore && (Buffers.TextCounter >= 50 && Buffers.TextCounter < 50 + FormMarioPort.MAX_PAGE)) //in 50..50 + MAX_PAGE { //SetFont (0, Bold + Shadow); //TXT.CenterText (20, Buffers.PlayerName [Buffers.Player], 30.ToString("X")); //SetFont(1, Bold + Shadow); //TXT.CenterText (40, "STAGE CLEAR!", 31); if (Buffers.TextCounter == (50 + FormMarioPort.MAX_PAGE)) { ShowScore = true; } } } else if (Buffers.GameDone) { Buffers.data.lives[Buffers.Player]--; Buffers.data.mode[Buffers.Player] = Buffers.mdSmall; Buffers.TextCounter = 0; Buffers.data.score[Buffers.Player] += Buffers.LevelScore; Waiting = true; Buffers.GameDone = false; } } //if (Keyboard.Key = 25) //P // Pause(); if (ShowScore && (Buffers.TextCounter == 120) && (Buffers.LevelScore > 0)) { int i = (int)(Buffers.LevelScore - 50); if (i < 0) { i = 0; } Buffers.data.score[Buffers.Player] += Buffers.LevelScore - 1; Buffers.LevelScore = i; Buffers.TextCounter = 119; CountingScore = true; } else { CountingScore = false; } if (Waiting) { Buffers.TextCounter++; if (Buffers.data.lives[Buffers.Player] == 0) { if (Buffers.TextCounter >= 100 && Buffers.TextCounter < 100 + FormMarioPort.MAX_PAGE) //in 100..100 + MAX_PAGE { //SetFont (0, Bold + Shadow); //CenterText (20, Buffers.PlayerName[Buffers.Player], 30.ToString("X")); //SetFont (1, Bold + Shadow); //CenterText (40, "GAME OVER", 31); ShowScore = true; } if (Buffers.TextCounter > 350) { Buffers.GameDone = true; } } else if (Buffers.Passed) { if (Buffers.TextCounter > 250) { Waiting = false; } } else if (Buffers.TextCounter > 100) { Buffers.GameDone = true; } } TmpObj.MoveTempObj(); Blocks.MoveBlocks(); if (Keyboard.kbEsc) { Buffers.QuitGame = true; } MoveScreen(); TmpObj.RunRemove(); if (Buffers.Options.Horizon < Buffers.NV) { int j = Buffers.Options.Horizon; for (int i = 0 / Buffers.W; i < Buffers.NH; i++) { int k = Buffers.XView / Buffers.W + (i + Buffers.LavaCounter / 8) % (Buffers.NH + 1); if (Buffers.WorldMap[k, j] == '%') { Figures.Redraw(k, j); } } } //FormMarioPort.formRef.ResetStack(); if (ShowObjects) { Blocks.DrawBlocks(); Enemies.ShowEnemies(); } Players.DrawPlayer(); if (ShowScore) { ShowTotalBack(); } //if (TextStatus) // Status.ShowStatus(); if (ShowObjects) { TmpObj.ShowTempObj(); } if (Buffers.Options.Stars != 0) { Stars.ShowStars(); } Glitter.ShowGlitter(); Buffers.LastXView[FormMarioPort.formRef.CurrentPage()] = Buffers.XView; //if (ShowRetrace) // SetPalette(0, 0, 0, 0); // ShowPage //if (ShowRetrace) // SetPalette( 0, 63, 63, 63); BackGr.DrawPalBackGr(); //Palette.BlinkPalette(); Music.PlayMusic(); if (Players.InPipe && Keyboard.PlayingMacro) { Buffers.GameDone = true; } if (Players.InPipe && !Buffers.GameDone && !Waiting) { Enemies.StopEnemies(); Glitter.ClearGlitter(); //FadeDown(64); //FormMarioPort.formRef.LockPal(); //FormMarioPort.formRef.ClearVGAMem(); switch (Players.PipeCode[1]) { case 'à': FindPipeExit(); //Delay(100); break; case 'á': //Swap(); FindPipeExit(); break; case 'ç': Buffers.GameDone = true; PlayWorld = true; break; } Players.InitPlayer(Players.MapX * Buffers.W + Buffers.W / 2, (Players.MapY - 1) * Buffers.H, Buffers.Player); FormMarioPort.formRef.SetView(Buffers.XView, Buffers.YView); for (int i = 0; i < FormMarioPort.MAX_PAGE; i++) { Buffers.LastXView[i] = Buffers.XView; } if (Players.PipeCode[1] == 'à') { Restart(); } else if (Players.PipeCode[1] == 'á') { BuildLevel(); } } } catch (Exception e) { Console.WriteLine("error" + e); } FormMarioPort.formRef.PaintForm(); System.Threading.Thread.Sleep(1 / 60 * 1000); } while (!Buffers.GameDone && !Buffers.QuitGame); return(PlayWorld); }
//------------------------------------------------------------------- // Sets up and reads in a new world to the buffer. After the world // has been read, it will build and then finally start running the // world. // N1: char, the first part (before the hyphen) of the world name. // N2: char, the second part (before the hyphen) of the world name. // Map1: char[,], the map to play // Opt1: WorldOptions, options for the aboveground world of Map1 // Opt1b, WorldOptions, options for the underground world of Map1 // Map2, char[,] the underground of the map to play // Opt2, WorldOptions, options for the abovegound world of Map2 // Opt2b, WorldOptions, options for the underground world of Map2 // Player, byte, the player to put in the world. //------------------------------------------------------------------- public static bool PlayWorld(char N1, char N2, char[,] Map1, Buffers.WorldOptions Opt1, Buffers.WorldOptions Opt1b, char[,] Map2, Buffers.WorldOptions Opt2, Buffers.WorldOptions Opt2b, byte Player) { int j, k, x, y; int[] TotalBackGrAddr = new int[FormMarioPort.MAX_PAGE]; //PlayWorld = false; //Keyboard.Key = 0; //Palettes.ClearPalette(); //Palettes.LockPal(); Buffers.TextCounter = 0; Buffers.WorldNumber = new string[] { N1.ToString(), "-", N2.ToString() }; OnlyDraw = ((N1 == '0') && (N2 == '0')); ShowObjects = true; Players.InPipe = false; Players.PipeCode = new char[] { ' ', ' ' }; Buffers.Demo = Buffers.dmNoDemo; Buffers.InitLevelScore(); //FillChar (TotalBackGrAddr, TotalBackGrAddr.Size(), 0); for (int i = 0; i < TotalBackGrAddr.Length; i++) { TotalBackGrAddr[i] = 0; } ShowScore = false; if (!Enemies.Turbo) { Buffers.ReadWorld(Map2, ref Buffers.WorldMap, Opt2); Buffers.Swap(); Buffers.ReadWorld(Map1, ref Buffers.WorldMap, Opt1); } else { Buffers.ReadWorld(Map2, ref Buffers.WorldMap, Opt2b); Buffers.Swap(); Buffers.ReadWorld(Map1, ref Buffers.WorldMap, Opt1b); } //Console.WriteLine("Done Reading World"); Players.InitPlayer(Buffers.Options.InitX, Buffers.Options.InitY, Buffers.Player); Players.MapX = Buffers.Options.InitX; Players.MapY = Buffers.Options.InitY; Buffers.XView = 0; Buffers.YView = 0; //FillChar (LastXView, LastXView.Size(), 0); for (int i = 0; i < Buffers.LastXView.Length; i++) { Buffers.LastXView[i] = 0; } FormMarioPort.formRef.SetView(Buffers.XView, Buffers.YView); BuildLevel(); try { if (Restart()) { return(true); } } catch (Exception e) { Console.WriteLine("Exception: ", e); } Enemies.ClearEnemies(); //ClearGlitter(); //Palettes.FadeDown(64); //Palettes.ClearPalette(); //Music.StopMusic(); return(false); //http://en.wikipedia.org/wiki/Return_statement#Syntax //"In Pascal there is no return statement." ...wat!? }
//------------------------------------------------------------------- // Scrolls the screen to move along with mario as he moves. //------------------------------------------------------------------- public static void MoveScreen() { int Scroll; int N1, N2; int OldX, NewX, Page; Random rand = new Random(); Page = FormMarioPort.formRef.CurrentPage(); Scroll = Buffers.XView - Buffers.LastXView[Page]; if (!Players.EarthQuake) { FormMarioPort.formRef.SetView(Buffers.XView, Buffers.YView); } else { Players.EarthQuakeCounter++; if (Players.EarthQuakeCounter > 0) { Players.EarthQuake = false; } int Rand1 = rand.Next(0, 2); int Rand2 = rand.Next(0, 2); FormMarioPort.formRef.SetView(Buffers.XView, Buffers.YView + Rand1 - Rand2); } if (Scroll < 0) { Enemies.StartEnemies((Buffers.XView / Buffers.W) - Enemies.StartEnemiesAt, 1); } else if (Scroll > 0) { Enemies.StartEnemies((Buffers.XView / Buffers.W) + Buffers.NH + Enemies.StartEnemiesAt, -1); } int i = Buffers.Options.Horizon; BackGr.DrawBackGr(false); Buffers.Options.Horizon = (byte)i; if (Scroll > 0) { for (int j = Buffers.LastXView[Page]; j < Buffers.XView; j++) { i = j - Buffers.W - Buffers.W; if (i >= 0) { FormMarioPort.formRef.PutPixel(i, 0, 0); } i = Buffers.W - j % Buffers.W - 1; Figures.Redraw(j / Buffers.W + Buffers.NH + 1, i); } } if (Scroll < 0) { for (int j = Buffers.LastXView[Page]; j > Buffers.XView; j--) { i = Buffers.W - j % Buffers.W - 1; Figures.Redraw(j / Buffers.W - 1, i); } } }
//------------------------------------------------------------------- // main function to drive the program, will determine if the game should // start in the menu or start up a world. after deciding that will initialize // the appropriate values // finally, when the user either dies or quits the game, it will // clear all the buffers and stop the program. //------------------------------------------------------------------- public static void main() { try { int level = -1; Buffers.data.numPlayers = 1; //ReadConfig(args); #if DEBUG do { #endif Players.InitPlayerFigures(); Enemies.InitEnemyFigures(); EndGame = false; if (MENU) Intro(); //Randomize(); if (Buffers.data.numPlayers == 2) if (Buffers.data.progress[Buffers.plMario] > Buffers.data.progress[Buffers.plLuigi]) Buffers.data.progress[Buffers.plLuigi] = Buffers.data.progress[Buffers.plMario]; else Buffers.data.progress[Buffers.plMario] = Buffers.data.progress[Buffers.plLuigi]; Buffers.data.lives[Buffers.plMario] = 3; Buffers.data.lives[Buffers.plLuigi] = 3; Buffers.data.coins[Buffers.plMario] = 0; Buffers.data.coins[Buffers.plLuigi] = 0; Buffers.data.score[Buffers.plMario] = 0; Buffers.data.score[Buffers.plLuigi] = 0; Buffers.data.mode[Buffers.plMario] = Buffers.mdSmall; Buffers.data.mode[Buffers.plLuigi] = Buffers.mdSmall; do //until EndGame or QuitGame { if (Buffers.data.numPlayers == 1) Buffers.data.lives[Buffers.plLuigi] = 0; for (CurPlayer = Buffers.plMario; CurPlayer < Buffers.data.numPlayers; CurPlayer++) { if (!(EndGame || Buffers.QuitGame)) if (Buffers.data.lives[CurPlayer] >= 1) { //Turbo = (ConfigData.Games[GameNumber].progress[CurPlayer] >= NUM_LEV); if (Buffers.data.progress[CurPlayer] > LAST_LEV) Buffers.data.progress[CurPlayer] = NUM_LEV; #if MENU ShowPlayerName (CurPlayer); #endif if (Keyboard.kb1) level = 0; else if (Keyboard.kb2) level = 1; else if (Keyboard.kb3) level = 2; else if (Keyboard.kb4) level = 3; else if (Keyboard.kb5) level = 4; else if (Keyboard.kb6) level = 5; //else if (level == -1) return; else break; //switch(Buffers.data.progress[CurPlayer] % NUM_LEV) switch (level) { case 0: Passed = Play.PlayWorld('x', '1', Worlds.Level_1a(), Worlds.Options_1a(), Worlds.Opt_1a(), Worlds.Level_1b(), Worlds.Options_1b(), Worlds.Options_1b(), Convert.ToByte(CurPlayer)); break; case 1: Passed = Play.PlayWorld('x', '2', Worlds.Level_2a(), Worlds.Options_2a(), Worlds.Opt_2a(), Worlds.Level_2b(), Worlds.Options_2b(), Worlds.Options_2b(), Convert.ToByte(CurPlayer)); break; case 2: Passed = Play.PlayWorld('x', '3', Worlds.Level_3a(), Worlds.Options_3a(), Worlds.Opt_3a(), Worlds.Level_3b(), Worlds.Options_3b(), Worlds.Options_3b(), Convert.ToByte(CurPlayer)); break; case 3: Passed = Play.PlayWorld('x', '4', Worlds.Level_5a(), Worlds.Options_5a(), Worlds.Opt_5a(), Worlds.Level_5b(), Worlds.Options_5b(), Worlds.Options_5b(), Convert.ToByte(CurPlayer)); break; case 4: Passed = Play.PlayWorld('x', '5', Worlds.Level_6a(), Worlds.Options_6a(), Worlds.Opt_6a(), Worlds.Level_6b(), Worlds.Options_6b(), Worlds.Options_6b(), Convert.ToByte(CurPlayer)); break; case 5: Passed = Play.PlayWorld('x', '6', Worlds.Level_4a(), Worlds.Options_4a(), Worlds.Opt_4a(), Worlds.Level_4b(), Worlds.Options_4b(), Worlds.Options_4b(), Convert.ToByte(CurPlayer)); break; default: EndGame = true; break; } //Console.WriteLine("I want to play a world"); if (Passed) Buffers.data.progress[CurPlayer]++; if (Buffers.QuitGame) { EndGame = true; #if MENU QuitGame = false; #endif } } } //FormMarioPort.formRef.Invalidate(); } while (!(EndGame || Buffers.QuitGame || (Buffers.data.lives[Buffers.plMario] + Buffers.data.lives[Buffers.plLuigi] == 0))); if (GameNumber != -1) Config.Games[GameNumber] = Buffers.data; #if MENU } while (!QuitGame) #endif WriteConfig(); } while (!Buffers.QuitGame); }
//------------------------------------------------- // Move the player //------------------------------------------------- public static void MovePlayer() { int MaxSpeed, MinSpeed, OldXVel, OldXView; bool CheckX; byte OldDir; bool LastKeyRight, LastKeyLeft; if (InPipe) { if (Buffers.WorldMap[MapX, MapY + 1] == '0') { StartDemo(Buffers.dmUpOutOfPipe); } else if (Buffers.WorldMap[MapX, MapY - 1] == '0') { StartDemo(Buffers.dmDownOutOfPipe); } return; } if (Enemies.cdChamp != 0) { if (Buffers.data.mode[Buffers.Player] == Buffers.mdSmall) { Buffers.data.mode[Buffers.Player] = Buffers.mdLarge; Growing = true; GrowCounter = 0; } //StartMusic (GrowMusic ); Enemies.cdChamp = 0; } if (Enemies.cdLife != 0) { Enemies.cdLife = 0; TmpObj.AddLife(); } if (Enemies.cdFlower != 0) { Buffers.data.mode[Buffers.Player] = Buffers.mdFire; Fired = true; FireCounter = 0; //StartMusic (GrowMusic ); Growing = true; GrowCounter = 0; Enemies.cdFlower = 0; } //if ( !Blinking && !Enemies.Star && !Growing ) if (!Blinking && !Growing) { if (Enemies.cdHit != 0) { switch (Buffers.data.mode[Buffers.Player]) { case Buffers.mdSmall: { BlinkCounter = 0; Blinking = true; StartDemo(Buffers.dmDead); //StartMusic (DeadMusic ); return; } case Buffers.mdLarge: case Buffers.mdFire: { Buffers.data.mode[Buffers.Player] = Buffers.mdSmall; BlinkCounter = 0; Blinking = true; //StartMusic (HitMusic ); break; } default: break; } } Enemies.cdHit = 0; } else { Enemies.cdHit = 0; } if (Blinking) { BlinkCounter++; if (BlinkCounter >= BlinkTime) { Blinking = false; } } if (Enemies.cdStar != 0) { //StartMusic(StarMusic ); StarCounter = 0; Enemies.Star = true; } if (Enemies.Star) { StarCounter++; if (StarCounter >= StarTime) { Enemies.Star = false; } if (StarCounter % 3 == 0) { Glitter.StartGlitter(X, Y + 11 * Convert.ToByte(Buffers.data.mode[Buffers.Player] = Buffers.mdSmall), Buffers.W, Buffers.H + 3 + 11 * Convert.ToByte(Buffers.data.mode[Buffers.Player] != Buffers.mdSmall)); } Enemies.cdStar = 0; } if (Growing) { GrowCounter++; if (GrowCounter > GrowTime) { Growing = false; } } Counter++; if ((XVel == 0) && (YVel == 0)) { Counter = 0; } CheckX = (Counter % Slip == 0); OldDir = Direction; OldXVel = XVel; // LastKeyLeft = Keyboard.keyLeft; // LastKeyRight = Keyboard.keyRight; keyLeft = Keyboard.kbLeftArrow; keyRight = Keyboard.kbRightArrow; keyUp = Keyboard.kbUpArrow; keyDown = Keyboard.kbDownArrow; keyAlt = Keyboard.kbAlt; keyCtrl = Keyboard.kbCtrl; keySpace = Keyboard.kbSP; if (keyRight && (Direction == Buffers.dirLeft)) { OldDir = Buffers.dirRight; OldXVel = -XVel; } if (keyLeft && (Direction == Buffers.dirRight)) { OldDir = Buffers.dirLeft; OldXVel = -XVel; } if (Fired && (!keySpace)) { Fired = false; } if (keySpace && (!Fired) && (Buffers.data.mode[Buffers.Player] == Buffers.mdFire)) { FireCounter = 0; Enemies.NewEnemy(EnemyType.tpFireBall, 0, X / Buffers.W + Direction, (Y + Buffers.H) / Buffers.H, 10 * (-1 + 2 * Direction), 3 + 3 * (Convert.ToByte(keyDown) - Convert.ToByte(keyUp)), 2); Fired = true; } if (Enemies.cdLift != 0) { Y = Enemies.PlayerY1; XVel = Enemies.PlayerXVel; YVel = Enemies.PlayerYVel; Status = stOnTheGround; } if (Enemies.cdStopJump != 0) { Jumped = true; Enemies.cdStopJump = 0; } if (Jumped && (!keyAlt)) { Jumped = false; } MaxSpeed = +MAX_SPEED - 1 + Convert.ToByte(keyCtrl) + Convert.ToByte(Enemies.Turbo) + Math.Abs(Enemies.cdLift * Enemies.PlayerXVel); MinSpeed = -MAX_SPEED + 1 - Convert.ToByte(keyCtrl) - Convert.ToByte(Enemies.Turbo) - Math.Abs(Enemies.cdLift * Enemies.PlayerXVel); if (keyLeft) { if ((XVel > MinSpeed)) { if (CheckX || (Enemies.cdLift != 0)) { XVel -= 1 + Convert.ToByte((Enemies.cdLift != 0) && keyCtrl); } } else { XVel = MinSpeed; } Direction = Convert.ToByte(XVel > 0); if (X + XVel < 0) { XVel = -X; } } else if ((XVel < 0) && CheckX && (Enemies.cdLift == 0)) { XVel++; } if (keyRight) { if ((XVel < MaxSpeed)) { if (CheckX || Enemies.cdLift != 0) { XVel += 1 + Convert.ToByte(Enemies.cdLift != 0 && keyCtrl); } } else { XVel = MaxSpeed; } Direction = Convert.ToByte(XVel >= 0); } else if ((XVel > 0) && CheckX && (Enemies.cdLift == 0)) { XVel--; } if (keyLeft && keyRight) { Direction = OldDir; XVel = OldXVel; } if (Y + YVel >= Buffers.NV * Buffers.H) { Buffers.GameDone = true; //StartMusic (DeadMusic ); } if (Status == stOnTheGround) { HitEnemy = false; } Check(); if ((Status == stOnTheGround) && YVel == 0) { if ((XVel == 0) || ((Enemies.cdLift != 0) && (XVel == Enemies.PlayerXVel))) { Walkingmode = 0; WalkCount = 0; } else { WalkCount++; WalkCount = (byte)(WalkCount & 0xf); Walkingmode = Convert.ToByte(WalkCount < 0x8); } } else { if (YVel < 0) { Walkingmode = 2; } else { Walkingmode = 3; } } if (keyDown) { CheckPipeBelow(); } X += XVel; Y += YVel; OldXView = Buffers.XView; Buffers.XView = Buffers.XView - System.Convert.ToByte(Keyboard.kbShiftl) + System.Convert.ToByte(Keyboard.kbShiftr); if (X + Buffers.W + SCROLL_AT > Buffers.XView + 320) { Buffers.XView = X + Buffers.W + SCROLL_AT - 320; } if (X < Buffers.XView + SCROLL_AT) { Buffers.XView = X - SCROLL_AT; } if (Buffers.XView - OldXView > MAX_SPEED + Convert.ToByte(Enemies.Turbo)) { Buffers.XView = OldXView + MAX_SPEED + Convert.ToByte(Enemies.Turbo); } if (Buffers.XView - OldXView < -MAX_SPEED - Convert.ToByte(Enemies.Turbo)) { Buffers.XView = OldXView - MAX_SPEED - Convert.ToByte(Enemies.Turbo); } if (Buffers.XView < 0) { Buffers.XView = 0; if (X < 0) { X = 0; } } if (Buffers.XView > (Buffers.Options.XSize - Buffers.NH) * Buffers.W) { Buffers.XView = (Buffers.Options.XSize - Buffers.NH) * Buffers.W; } if (Buffers.XView < OldXView) { if ((Buffers.WorldMap[Buffers.XView / Buffers.W, Buffers.NV] == 254)) { if ((Buffers.WorldMap[(Buffers.XView / Buffers.W), (int)(Enemies.PlayerY1 / Buffers.H)] != ' ')) { Buffers.XView = OldXView; } } } if (Buffers.XView > OldXView) { if ((Buffers.WorldMap[((Buffers.XView - 1) / Buffers.W + Buffers.NH), Buffers.NV] == 255)) { if ((Buffers.WorldMap[((Buffers.XView - 1) / Buffers.W + Buffers.NH), (int)(Enemies.PlayerY1 / Buffers.H)] != ' ')) { Buffers.XView = OldXView; } } } Enemies.PlayerX1 = X + XVel; Enemies.PlayerX2 = Enemies.PlayerX1 + Buffers.W - 1; Enemies.PlayerY1 = Y; if (Buffers.data.mode[Buffers.Player] == Buffers.mdSmall) { Enemies.PlayerY1 = Y + Buffers.H; } else { Enemies.PlayerY1 = Y; } Enemies.PlayerY2 = Y + 2 * Buffers.H - 1; Enemies.PlayerXVel = XVel; Enemies.PlayerYVel = YVel; if (Enemies.cdLift != 0) { Enemies.PlayerYVel += 2 - YVel; Enemies.cdLift = 0; } }
//------------------------------------------------- // Check the player for actions //------------------------------------------------- private static void Check() { bool Small; NewCh1 = ' '; NewCh2 = ' '; NewCh3 = ' '; Side = System.Convert.ToByte(XVel > 0) * (Buffers.W - 1); NewX1 = (X + Side) / Buffers.W; NewX2 = (X + Side + XVel) / Buffers.W; Small = Buffers.data.mode[Buffers.Player] == Buffers.mdSmall; if (NewX1 != NewX2) { Y1 = (Y + HSafe + (4)) / Buffers.H - Safe; Y2 = (Y + HSafe + Buffers.H) / Buffers.H - Safe; Y3 = (Y + HSafe + 2 * Buffers.H - 1) / Buffers.H - Safe; // Hack to fix negative Y Y1 = Y1 < 0 ? 1 : Y1; Y2 = Y2 < 0 ? 1 : Y2; Y3 = Y3 < 0 ? 1 : Y3; NewCh1 = (char)Buffers.WorldMap[NewX2, Y1]; NewCh2 = (char)Buffers.WorldMap[NewX2, Y2]; NewCh3 = (char)Buffers.WorldMap[NewX2, Y3]; if (NewCh3 == '*') { TmpObj.HitCoin(NewX2 * Buffers.W, Y3 * Buffers.H, false); } if (NewCh2 == '*') { TmpObj.HitCoin(NewX2 * Buffers.W, Y2 * Buffers.H, false); } else if (NewCh2 == 'z') { Enemies.Turbo = true; } if (!Small && NewCh1 == '*') { TmpObj.HitCoin(NewX2 * Buffers.W, Y1 * Buffers.H, false); } Hold1 = (Buffers.CanHoldYou(NewCh1)) && (!Small); Hold2 = (Buffers.CanHoldYou(NewCh2)); Hold3 = (Buffers.CanHoldYou(NewCh3)); if (Hold1 || Hold2 || Hold3) { XVel = 0; Walkingmode = 0; } } NewX1 = (X + XVel) / Buffers.W; NewX2 = (X + XVel + Buffers.W - 1) / Buffers.W; if (Enemies.cdEnemy != 0) { CheckJump(); } if ((Status == stJumping)) { NewY = (Y + 1 + (4) + (Buffers.H - 1 - (4)) * Convert.ToByte(Small) + YVel + HSafe) / Buffers.H - Safe; } else { NewY = (Y + 1 + 2 * Buffers.H + YVel + HSafe) / Buffers.H - Safe; } if (NewY < 0) { NewY = 12; Y = 12; } NewCh1 = (char)Buffers.WorldMap[NewX1, NewY]; NewCh2 = (char)Buffers.WorldMap[NewX2, NewY]; NewCh3 = (char)Buffers.WorldMap[(X + XVel + Buffers.W / 2) / Buffers.W, NewY]; Hold1 = (Buffers.CanHoldYou(NewCh1) || Buffers.CanStandOn(NewCh1)); Hold2 = (Buffers.CanHoldYou(NewCh2) || Buffers.CanStandOn(NewCh2)); Hold3 = (Buffers.CanHoldYou(NewCh3) || Buffers.CanStandOn(NewCh3)); switch (Status) { case stFalling: { CheckFall(); break; } case stOnTheGround: { if ((Enemies.cdLift == 0)) { if (!(Hold1 || Hold2)) { Status = stFalling; if (Math.Abs(XVel) < 2) { Y++; } } else { if ((NewCh1 == 'K') || (NewCh2 == 'K')) { CheckFall(); } else { if (XVel == 0) { Below1 = NewCh1; Below2 = NewCh2; MapX = NewX1; //Codes for pipes MapY = NewY - 1; AtCh1 = (char)Buffers.WorldMap[MapX, MapY]; AtCh2 = (char)Buffers.WorldMap[MapX + 1, MapY]; Mo = (X + XVel) % Buffers.W; if (!Hold1 && (Mo >= 1 && Mo <= 5)) { XVel--; } if (!Hold2 && (Mo >= Buffers.W - 5 && Mo <= Buffers.W - 1)) { XVel++; } } } CheckJump(); } } else { YVel = Enemies.PlayerYVel; CheckJump(); } break; } case stJumping: { Hold1 = (Buffers.CanHoldYou(NewCh1) || Buffers.CanStandOn(NewCh1)); Hold2 = (Buffers.CanHoldYou(NewCh2) || Buffers.CanStandOn(NewCh2)); Hold3 = (Buffers.CanHoldYou(NewCh3) || Buffers.CanStandOn(NewCh3)); Hit = (Hold1 || Hold2); if (Hit) { Mo = (X + XVel) % Buffers.W; if ((Mo >= 1 && Mo <= 4 && Mo >= Buffers.W - 4 && Mo <= Buffers.W - 1) && (!Hold3)) { if (!((NewCh1 == Buffers.Hidden) && (NewCh2 == Buffers.Hidden))) { Hit = false; } if ((Mo < Buffers.W / 2) && (!(NewCh2 == Buffers.Hidden))) { X -= Mo; } else if ((Mo >= Buffers.W / 2) && (!(NewCh1 == Buffers.Hidden))) { X += Buffers.W - Mo; } } } if (!Hit) { if (NewCh1 == '*') { TmpObj.HitCoin(NewX1 * Buffers.W, NewY * Buffers.H, false); } if (NewCh1 == '*') { TmpObj.HitCoin(NewX2 * Buffers.W, NewY * Buffers.H, false); } if ((Counter % (JumpDelay + Convert.ToByte(HighJump)) == 0) || ((!keyAlt) && (!HitEnemy))) { YVel++; } if (YVel >= 0) { YVel = 0; Status = stFalling; } } else { char Ch = (char)0; if (Mo >= 0 && Mo <= (Buffers.W / 2 - 1)) { if (Buffers.CanHoldYou(NewCh1) || Buffers.CanStandOn(NewCh1)) { Ch = NewCh1; NewX2 = NewX1; } else { Ch = NewCh2; } } else if (Mo >= (Buffers.W / 2) && Mo <= Buffers.W - 1) { Ch = NewCh2; if (!(Buffers.CanHoldYou(Ch) || Ch == Buffers.Hidden)) { Ch = NewCh1; NewX2 = NewX1; } } switch (Ch) { case '=': Enemies.cdHit = 1; break; case '0': case '1': if (keyUp) { CheckPipeAbove(NewCh1, NewCh2); } break; case '?': case '$': case 'J': case 'K': { Mo = 0; if (Buffers.WorldMap[NewX2, NewY - 1] >= 'à' && Buffers.WorldMap[NewX2, NewY - 1] <= 'â') { Buffers.WorldMap[NewX2, NewY] = '?'; Ch = '?'; } else if (Buffers.WorldMap[NewX2, NewY - 1] == 'ï') { Buffers.WorldMap[NewX2, NewY] = 'K'; Ch = 'K'; } else { if (!Small && (Ch == 'J')) { TmpObj.BreakBlock(NewX2, NewY); Buffers.AddScore(10); Mo = 1; } } if (Mo == 0) { Blocks.BumpBlock(NewX2 * Buffers.W, NewY * Buffers.H); //Beep (110 ); } if (Buffers.WorldMap[NewX2, NewY - 1] >= 'ã' && Buffers.WorldMap[NewX2, NewY - 1] <= 'ì') { if (!(Ch == 'J' || Ch == 'K')) { TmpObj.HitCoin(NewX2 * Buffers.W, NewY * Buffers.H, true); if (Buffers.WorldMap[NewX2, NewY - 1] != ' ') { Buffers.WorldMap[NewX2, NewY - 1] = (char)(Buffers.WorldMap[NewX2, NewY - 1] + 1); if (Buffers.WorldMap[NewX2, NewY] == '$') { TmpObj.Remove(NewX2 * Buffers.W, NewY * Buffers.H, Buffers.W, Buffers.H, 2); Buffers.WorldMap[NewX2, NewY] = '?'; } } } } else if (Buffers.WorldMap[NewX2, NewY - 1] == 'à') { if (Buffers.data.mode[Buffers.Player] == Buffers.mdSmall) { Enemies.NewEnemy(EnemyType.tpRisingChamp, 0, NewX2, NewY, 0, -1, 2); } else { Enemies.NewEnemy(EnemyType.tpRisingFlower, 0, NewX2, NewY, 0, -1, 2); } } else if (Buffers.WorldMap[NewX2, NewY - 1] == 'á') { Enemies.NewEnemy(EnemyType.tpRisingLife, 0, NewX2, NewY, 0, -1, 2); } else if (Buffers.WorldMap[NewX2, NewY - 1] == 'â') { Enemies.NewEnemy(EnemyType.tpRisingStar, 0, NewX2, NewY, 0, -1, 1); } else if (Buffers.WorldMap[NewX2, NewY - 1] == '*') { TmpObj.HitCoin(NewX2 * Buffers.W, (NewY - 1) * Buffers.H, false); } else if (Buffers.WorldMap[NewX2, NewY - 1] == 'í') { Enemies.NewEnemy(EnemyType.tpRisingChamp, 1, NewX2, NewY, 0, -1, 2); } Enemies.HitAbove(NewX2, NewY - 1); if (Ch == 'K') { TmpObj.Remove(NewX2 * Buffers.W, NewY * Buffers.H, Buffers.W, Buffers.H, TmpObj.tpNote); Buffers.WorldMap[NewX2, NewY] = 'K'; } else { if (Ch != 'J') { if (!(Buffers.WorldMap[NewX2, NewY - 1] >= 'ã' && Buffers.WorldMap[NewX2, NewY - 1] <= 'ì')) { TmpObj.Remove(NewX2 * Buffers.W, NewY * Buffers.H, Buffers.W, Buffers.H, 1); Buffers.WorldMap[NewX2, NewY] = '@'; } } } break; } default: //Beep (30); break; } if ((Ch != 'J') || (Buffers.data.mode[Buffers.Player] == Buffers.mdSmall)) { YVel = 0; Status = stFalling; } if (Ch == 'K') { YVel = 3; } } break; } } }