From 5ec8bcae1e560a2091d17271e0549bb8baf1b3ba Mon Sep 17 00:00:00 2001 From: Johnny Jazeix Date: Thu, 26 Mar 2026 18:31:53 +0100 Subject: [PATCH 1/2] remove screen global variable --- src/game.cc | 32 ++++++++++++------------- src/game.h | 4 +++- src/main.cc | 9 +++---- src/menu.cc | 67 ++++++++++++++++++++++++++-------------------------- src/menu.h | 6 +++-- src/mouse.cc | 3 +-- src/mouse.h | 6 +++-- 7 files changed, 65 insertions(+), 62 deletions(-) diff --git a/src/game.cc b/src/game.cc index 21578b1..8c2e49e 100644 --- a/src/game.cc +++ b/src/game.cc @@ -45,16 +45,14 @@ extern sNewPreference Pref; extern int currentTime; extern int previousTime; -extern Screen screen; - extern Level level; static int NumRail[] = { -1, -1, -1, 0, -1, 1, 2, 3, -1, 4, 5, 6, 7, 8, 9, 10 }; int MaskK; // Mask for movement keys -Game::Game(Audio &sounds, Gamepad &gamepad) : - m_sounds(sounds), m_gamepad(gamepad), Lo(m_sounds) +Game::Game(Audio &sounds, Screen &screen, Gamepad &gamepad) : + m_sounds(sounds), m_screen(screen), m_gamepad(gamepad), Lo(m_sounds) { KeyPress[0] = D_Top; KeyPress[1] = D_Bottom; @@ -70,7 +68,7 @@ eMenu Game::SDLMain() Help = true; Load(NumN); // Loads map/level SDL_RenderPresent(sdlRenderer); - screen.CleanSpriteAndScreen(fgame); + m_screen.CleanSpriteAndScreen(fgame); Pause = true; currentTime = SDL_GetTicks(); // get Clock time @@ -508,7 +506,7 @@ void Game::DisplayScreen() int ndir = 0; // New Display - Lo.Display(screen); // Display locomotive + Lo.Display(m_screen); // Display locomotive if (Lo.IntersectPos != -1 && Help) { // Display arrow on future intersection switch (Lo.EntryPos) { @@ -526,44 +524,44 @@ void Game::DisplayScreen() break; } - screen.PrintSprite(dir, ndir, (Lo.IntersectPos % LT) * D_Case + D_Case / 2, (Lo.IntersectPos / LT) * D_Case + D_Case / 2); + m_screen.PrintSprite(dir, ndir, (Lo.IntersectPos % LT) * D_Case + D_Case / 2, (Lo.IntersectPos / LT) * D_Case + D_Case / 2); } // Display options for (i = 0; i < LT * HT; i++) { switch (T[i]) { case C_Car: // if car sprite - screen.PrintSprite(car, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); + m_screen.PrintSprite(car, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); break; case C_Expand: // if expander sprite - screen.PrintSprite(expander, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); + m_screen.PrintSprite(expander, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); break; case C_Shrink: // if shrinker sprite - screen.PrintSprite(shrinker, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); + m_screen.PrintSprite(shrinker, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); break; case C_Speed: // if speed sprite - screen.PrintSprite(speed, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); + m_screen.PrintSprite(speed, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); break; case C_Life: // if life sprite - screen.PrintSprite(life, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); + m_screen.PrintSprite(life, (GameClock * 40 / 1000 + i * 7) % 50, i % LT * D_Case + D_Case / 2, i / LT * D_Case + D_Case / 2); break; } } // When paused, asks for a key press if (Pause) { - screen.PrintText(T_press_any_key, LT * D_Case / 2, 300); + m_screen.PrintText(T_press_any_key, LT * D_Case / 2, 300); } // Prints a dashboard - screen.PrintOptions(Pref.Lives, Pref.Score); + m_screen.PrintOptions(Pref.Lives, Pref.Score); if (Pref.WagonGap < WAGON_GAP_MIN) { - screen.PrintSprite(shrinker, (GameClock * 40 / 1000) % 50, 715, 295); + m_screen.PrintSprite(shrinker, (GameClock * 40 / 1000) % 50, 715, 295); } if (Pref.WagonGap > WAGON_GAP_AVERAGE) { - screen.PrintSprite(expander, (GameClock * 40 / 1000) % 50, 715, 295); + m_screen.PrintSprite(expander, (GameClock * 40 / 1000) % 50, 715, 295); } if (Pref.SpeedAverage > Pref.Speed) { - screen.PrintSprite(speed, (GameClock * 40 / 1000 + 7) % 50, 765, 295); + m_screen.PrintSprite(speed, (GameClock * 40 / 1000 + 7) % 50, 765, 295); } } diff --git a/src/game.h b/src/game.h index dc1caef..d2353ce 100644 --- a/src/game.h +++ b/src/game.h @@ -30,11 +30,12 @@ class Audio; class Menu; class Gamepad; +class Screen; class Game { public: - explicit Game(Audio &sounds, Gamepad &gamepad); + explicit Game(Audio &sounds, Screen &screen, Gamepad &gamepad); ~Game() = default; void setMenu(Menu *menu) { m_menu = menu; } @@ -59,6 +60,7 @@ class Game bool Help { true }; // Show intersection arrows Audio &m_sounds; + Screen &m_screen; Gamepad &m_gamepad; Menu *m_menu { nullptr }; diff --git a/src/main.cc b/src/main.cc index 3608b81..602be91 100644 --- a/src/main.cc +++ b/src/main.cc @@ -53,7 +53,6 @@ char Titre[] = "Li-ri V" VERSION; Sprite *Sprites = nullptr; // Sprites pointer int NSprites = 0; // Number of sprites in memory -Screen screen; // 2 Video buffer pointer sNewPreference Pref; // Preference table. Level level; @@ -115,6 +114,8 @@ int main(int narg, char *argv[]) SDL_ShowCursor(0); // Hide cursor + Screen screen; + Audio audio; audio.Init(); if (LoadSprites() == false) { @@ -125,16 +126,16 @@ int main(int narg, char *argv[]) } audio.PlayMusic(); - Mouse mouse { audio }; + Mouse mouse { audio, screen }; mouse.InitStart(); Gamepad gamepad; gamepad.Initialize(); - Game game { audio, gamepad }; + Game game { audio, screen, gamepad }; Editor editor { mouse, game, gamepad }; - Menu MainMenu { game, audio, mouse, gamepad }; + Menu MainMenu { game, audio, screen, mouse, gamepad }; game.setMenu(&MainMenu); previousTime = currentTime = SDL_GetTicks(); diff --git a/src/menu.cc b/src/menu.cc index b9aac37..cfc79b1 100644 --- a/src/menu.cc +++ b/src/menu.cc @@ -54,7 +54,6 @@ extern int previousTime; extern SDL_Window *sdlWindow; extern SDL_Renderer *sdlRenderer; extern Sprite *Sprites; -extern Screen screen; extern sNewPreference Pref; static char Points[] = ". . . . . . . . . . . . . ."; @@ -111,7 +110,7 @@ eMenu Menu::SDLMain() // Fetching events do { - screen.CleanSpriteAndScreen(fmenu); + m_screen.CleanSpriteAndScreen(fmenu); SDL_RenderClear(sdlRenderer); // Get background image and build menu Sprites[background_menu].Draw(400, 300, 0, Sprites[fmenu].Image[0]); @@ -425,7 +424,7 @@ eMenu Menu::SDLMain_Options() PyE = 4; // Fetch events do { - screen.CleanSpriteAndScreen(fmenu); + m_screen.CleanSpriteAndScreen(fmenu); SDL_RenderClear(sdlRenderer); InitMain_Options(); // Prepare menu SDL_Event event; @@ -589,39 +588,39 @@ eMenu Menu::SDLMain_Options() Sleeping(); if (Pref.FullScreen) { - screen.PrintSprite(arrows, 1, 350, 300); - screen.PrintSprite(arrows, 3, 450, 300); + m_screen.PrintSprite(arrows, 1, 350, 300); + m_screen.PrintSprite(arrows, 3, 450, 300); } else { - screen.PrintSprite(arrows, 0, 350, 300); - screen.PrintSprite(arrows, 4, 450, 300); + m_screen.PrintSprite(arrows, 0, 350, 300); + m_screen.PrintSprite(arrows, 4, 450, 300); } NumSp = (currentTime / 30) % 25; - screen.PrintSprite(sound, NumSp, 150, 110); + m_screen.PrintSprite(sound, NumSp, 150, 110); NumSp = (currentTime / 30) % 25; - screen.PrintSprite(music, NumSp, 150, 200); + m_screen.PrintSprite(music, NumSp, 150, 200); NumSp = (currentTime / 50) % 50; - screen.PrintSprite(earth, NumSp, 180, 400); + m_screen.PrintSprite(earth, NumSp, 180, 400); N = (int)(Pref.Volume * 10 + 1) / SDL_MIX_MAXVOLUME; NumSp = (currentTime / 50) % 40 + 120; for (i = 0; i < N; i++) { if (i == N - 1) { - screen.PrintSprite(locomotive, NumSp, (690 - 300) / 10 * i + 300, 110); + m_screen.PrintSprite(locomotive, NumSp, (690 - 300) / 10 * i + 300, 110); } else { - screen.PrintSprite(logs_wagon, NumSp, (690 - 300) / 10 * i + 300, 110); + m_screen.PrintSprite(logs_wagon, NumSp, (690 - 300) / 10 * i + 300, 110); } } N = (int)(Pref.VolumeM * 10 + 1) / SDL_MIX_MAXVOLUME; for (i = 0; i < N; i++) { if (i == N - 1) { - screen.PrintSprite(locomotive, NumSp, (690 - 300) / 10 * i + 300, 200); + m_screen.PrintSprite(locomotive, NumSp, (690 - 300) / 10 * i + 300, 200); } else { - screen.PrintSprite(logs_wagon, NumSp, (690 - 300) / 10 * i + 300, 200); + m_screen.PrintSprite(logs_wagon, NumSp, (690 - 300) / 10 * i + 300, 200); } } @@ -676,7 +675,7 @@ eMenu Menu::SDLMain_Speed() // Fetch events do { - screen.CleanSpriteAndScreen(fmenu); + m_screen.CleanSpriteAndScreen(fmenu); SDL_RenderClear(sdlRenderer); // Set background image and build display Sprites[background_menu].Draw(400, 300, 0, Sprites[fmenu].Image[0]); @@ -782,7 +781,7 @@ eMenu Menu::SDLMain_Level() // Fetch events do { // Erase background - screen.CleanSpriteAndScreen(fmenu); + m_screen.CleanSpriteAndScreen(fmenu); SDL_RenderClear(sdlRenderer); // Set background image and build display Sprites[background_menu].Draw(400, 300, 0, Sprites[fmenu].Image[0]); @@ -890,26 +889,26 @@ eMenu Menu::SDLMain_Level() // Draw arrows if (Level > 0) { if (PyE == 3) { - screen.PrintSprite(arrows, 2, 330, 380); + m_screen.PrintSprite(arrows, 2, 330, 380); } else { - screen.PrintSprite(arrows, 1, 330, 380); + m_screen.PrintSprite(arrows, 1, 330, 380); } } else { - screen.PrintSprite(arrows, 0, 330, 380); + m_screen.PrintSprite(arrows, 0, 330, 380); } if (Level < Pref.LevelMax[Pref.Difficulty]) { if (PyE == 4) { - screen.PrintSprite(arrows, 5, 470, 380); + m_screen.PrintSprite(arrows, 5, 470, 380); } else { - screen.PrintSprite(arrows, 4, 470, 380); + m_screen.PrintSprite(arrows, 4, 470, 380); } } else { - screen.PrintSprite(arrows, 3, 470, 380); + m_screen.PrintSprite(arrows, 3, 470, 380); } DrawNumber(400, 380, Level + 1); @@ -1104,17 +1103,17 @@ eMenu Menu::SDLMain_HR() Sleeping(); if (Order) { - screen.PrintSprite(background_hrr, 0, 240, 492); + m_screen.PrintSprite(background_hrr, 0, 240, 492); DrawText(240, 492, e_Sprite(T_tart1 + N1)); } else { - screen.PrintSprite(background_hrr, 0, 440, 492); + m_screen.PrintSprite(background_hrr, 0, 440, 492); DrawText(440, 492, e_Sprite(T_tart1 + N1)); } if (Done == -1) { if (Order) { - screen.PrintSprite(background_hrr, 0, 440, 492); + m_screen.PrintSprite(background_hrr, 0, 440, 492); DrawText(440, 492, e_Sprite(T_tart1 + N2)); if (PyE == 0) { Print_Main(240); @@ -1124,7 +1123,7 @@ eMenu Menu::SDLMain_HR() } } else { - screen.PrintSprite(background_hrr, 0, 240, 492); + m_screen.PrintSprite(background_hrr, 0, 240, 492); DrawText(240, 492, e_Sprite(T_tart1 + N2)); if (PyE == 1) { Print_Main(240); @@ -1179,7 +1178,7 @@ eMenu Menu::SDLMain_InGame() // Fetch events do { - screen.CleanSpriteAndScreen(fmenu); + m_screen.CleanSpriteAndScreen(fmenu); SDL_RenderClear(sdlRenderer); SDL_Event event; while (SDL_PollEvent(&event)) { @@ -1310,7 +1309,7 @@ eMenu Menu::SDLMain_Score(bool EditScore) // Fetch events do { // Erase background - screen.CleanSpriteAndScreen(fmenu); + m_screen.CleanSpriteAndScreen(fmenu); SDL_RenderClear(sdlRenderer); // Set background image and build display Sprites[background_menu].Draw(400, 300, 0, Sprites[fmenu].Image[0]); @@ -1403,8 +1402,8 @@ eMenu Menu::SDLMain_Score(bool EditScore) DrawString(140, 120 + NEdit * (360 / 7), Pref.Sco[NEdit].Name); i = (currentTime / 50) % 20; // Draw cursors - screen.PrintSprite(arrow_left, i, 110, 120 + NEdit * (360 / 7)); - screen.PrintSprite(arrow_right, i, 180 + StringLength(Pref.Sco[NEdit].Name), 120 + NEdit * (360 / 7)); + m_screen.PrintSprite(arrow_left, i, 110, 120 + NEdit * (360 / 7)); + m_screen.PrintSprite(arrow_right, i, 180 + StringLength(Pref.Sco[NEdit].Name), 120 + NEdit * (360 / 7)); } // Update render @@ -1427,8 +1426,8 @@ void Menu::Print_Main(int Center) const int const x2 = (Center - x1) + Center; int const y = (Menu_Py[PyE].EndY + Menu_Py[PyE].StartY) / 2; - screen.PrintSprite(arrow_left, NumSp, x1, y); - screen.PrintSprite(arrow_right, NumSp, x2, y); + m_screen.PrintSprite(arrow_left, NumSp, x1, y); + m_screen.PrintSprite(arrow_right, NumSp, x2, y); } /*** Center arrows on the menu ***/ @@ -1440,6 +1439,6 @@ void Menu::Center_Arrows() const int const x2 = Menu_Py[PyE].EndX + 5; int const y = (Menu_Py[PyE].EndY + Menu_Py[PyE].StartY) / 2; - screen.PrintSprite(arrow_left, NumSp, x1, y); - screen.PrintSprite(arrow_right, NumSp, x2, y); + m_screen.PrintSprite(arrow_left, NumSp, x1, y); + m_screen.PrintSprite(arrow_right, NumSp, x2, y); } diff --git a/src/menu.h b/src/menu.h index 381b258..5db645e 100644 --- a/src/menu.h +++ b/src/menu.h @@ -32,12 +32,13 @@ class Game; class Audio; class Gamepad; class Mouse; +class Screen; class Menu { public: - Menu(Game &game, Audio &audio, Mouse &mouse, Gamepad &gamepad) : - m_game(game), m_audio(audio), m_mouse(mouse), m_gamepad(gamepad) { }; + Menu(Game &game, Audio &audio, Screen &screen, Mouse &mouse, Gamepad &gamepad) : + m_game(game), m_audio(audio), m_screen(screen), m_mouse(mouse), m_gamepad(gamepad) { }; ~Menu() = default; eMenu SDLMain(); // Main menu @@ -63,6 +64,7 @@ class Menu Game &m_game; Audio &m_audio; + Screen &m_screen; Mouse &m_mouse; Gamepad &m_gamepad; }; diff --git a/src/mouse.cc b/src/mouse.cc index 16a1aa3..6b8174d 100644 --- a/src/mouse.cc +++ b/src/mouse.cc @@ -30,7 +30,6 @@ #include "sprite.h" // for e_Sprite extern int currentTime; -extern Screen screen; extern SDL_Window *sdlWindow; /*** Mouse init ***/ @@ -141,6 +140,6 @@ void Mouse::Print() const #ifndef ANDROID // Display cursor - screen.PrintSprite(cursor, NumSp, X, Y); + m_screen.PrintSprite(cursor, NumSp, X, Y); #endif } diff --git a/src/mouse.h b/src/mouse.h index e4286ec..dc218ba 100644 --- a/src/mouse.h +++ b/src/mouse.h @@ -27,6 +27,7 @@ #include class Audio; +class Screen; /*** Structure for the positions in the Py menu ***/ /**************************************************/ @@ -49,8 +50,8 @@ struct mButton class Mouse { public: - explicit Mouse(Audio &audio) : - m_audio(audio) { } + explicit Mouse(Audio &audio, Screen &screen) : + m_audio(audio), m_screen(screen) { } ~Mouse() = default; void InitStart(); // Inits the mouse coordinates @@ -62,6 +63,7 @@ class Mouse private: Audio &m_audio; + Screen &m_screen; struct mPy *tPy { nullptr }; // Pointer to py coordinates struct mButton *Bo { nullptr }; // Pointer to Button coordinates }; From d16d4546090ea6fe9aec4b31098d7db2174b692c Mon Sep 17 00:00:00 2001 From: Johnny Jazeix Date: Thu, 26 Mar 2026 19:07:26 +0100 Subject: [PATCH 2/2] remove level global variable --- src/editor.cc | 98 +++++++++++++++++++++++++-------------------------- src/editor.h | 6 ++-- src/game.cc | 18 +++++----- src/game.h | 4 ++- src/main.cc | 7 ++-- 5 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/editor.cc b/src/editor.cc index e8961e6..a573d2b 100644 --- a/src/editor.cc +++ b/src/editor.cc @@ -44,8 +44,6 @@ extern sNewPreference Pref; extern int currentTime; extern int previousTime; -extern Level level; - static int NumRail[] = { 10, 10, 10, 0, 10, 1, 2, 3, 10, 4, 5, 6, 7, 8, 9, 10 }; eMenu Editor::SDLMain(int LevelNumber) @@ -97,7 +95,7 @@ eMenu Editor::SDLMain(int LevelNumber) case SDL_MOUSEBUTTONUP: Button = false; if (TypeB != -1 && Option == deco && cx >= LT) { // If a decoration must be deleted - level.T[NumN].NDeco--; + m_level.T[NumN].NDeco--; } TypeB = -1; break; @@ -115,72 +113,72 @@ eMenu Editor::SDLMain(int LevelNumber) switch (Option) { case deco: if (TypeB == -1) { // On first time clicking - for (i = 0; i < level.T[NumN].NDeco; i++) { // Search if there's a decoration nearby the click - dx = level.T[NumN].Deco[i].x - m_mouse.Px; - dy = level.T[NumN].Deco[i].y - m_mouse.Py; + for (i = 0; i < m_level.T[NumN].NDeco; i++) { // Search if there's a decoration nearby the click + dx = m_level.T[NumN].Deco[i].x - m_mouse.Px; + dy = m_level.T[NumN].Deco[i].y - m_mouse.Py; d = dx * dx + dy * dy; if (d <= (D_Case * 2) * (D_Case * 2)) { TypeB = i; } } if (TypeB == -1) { // Building a new decor - level.T[NumN].NDeco++; - level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].NumSpr = NumDeco; - level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].x = m_mouse.Px; - level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].y = m_mouse.Py; + m_level.T[NumN].NDeco++; + m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].NumSpr = NumDeco; + m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].x = m_mouse.Px; + m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].y = m_mouse.Py; TypeB = 1; } else { // Highlight selection - level.T[NumN].Deco[level.T[NumN].NDeco].NumSpr = level.T[NumN].Deco[TypeB].NumSpr; - level.T[NumN].Deco[level.T[NumN].NDeco].x = level.T[NumN].Deco[TypeB].x; - level.T[NumN].Deco[level.T[NumN].NDeco].y = level.T[NumN].Deco[TypeB].y; - for (d = TypeB; d < level.T[NumN].NDeco; d++) { - level.T[NumN].Deco[d].NumSpr = level.T[NumN].Deco[d + 1].NumSpr; - level.T[NumN].Deco[d].x = level.T[NumN].Deco[d + 1].x; - level.T[NumN].Deco[d].y = level.T[NumN].Deco[d + 1].y; + m_level.T[NumN].Deco[m_level.T[NumN].NDeco].NumSpr = m_level.T[NumN].Deco[TypeB].NumSpr; + m_level.T[NumN].Deco[m_level.T[NumN].NDeco].x = m_level.T[NumN].Deco[TypeB].x; + m_level.T[NumN].Deco[m_level.T[NumN].NDeco].y = m_level.T[NumN].Deco[TypeB].y; + for (d = TypeB; d < m_level.T[NumN].NDeco; d++) { + m_level.T[NumN].Deco[d].NumSpr = m_level.T[NumN].Deco[d + 1].NumSpr; + m_level.T[NumN].Deco[d].x = m_level.T[NumN].Deco[d + 1].x; + m_level.T[NumN].Deco[d].y = m_level.T[NumN].Deco[d + 1].y; } - NumDeco = level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].NumSpr; + NumDeco = m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].NumSpr; } } else { // if not the first click, replace - level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].NumSpr = NumDeco; - level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].x = m_mouse.Px; - level.T[NumN].Deco[(level.T[NumN].NDeco - 1)].y = m_mouse.Py; + m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].NumSpr = NumDeco; + m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].x = m_mouse.Px; + m_level.T[NumN].Deco[(m_level.T[NumN].NDeco - 1)].y = m_mouse.Py; } break; case rail: if (TypeB == -1) { - if (level.T[NumN].T[cy * LT + cx] != C_Rail) { + if (m_level.T[NumN].T[cy * LT + cx] != C_Rail) { TypeB = C_Rail; } else { TypeB = C_None; } } - level.T[NumN].T[cy * LT + cx] = TypeB; + m_level.T[NumN].T[cy * LT + cx] = TypeB; break; case car: - level.T[NumN].T[cy * LT + cx] = C_Car; + m_level.T[NumN].T[cy * LT + cx] = C_Car; break; case expander: - level.T[NumN].T[cy * LT + cx] = C_Expand; + m_level.T[NumN].T[cy * LT + cx] = C_Expand; break; case shrinker: - level.T[NumN].T[cy * LT + cx] = C_Shrink; + m_level.T[NumN].T[cy * LT + cx] = C_Shrink; break; case speed: - level.T[NumN].T[cy * LT + cx] = C_Speed; + m_level.T[NumN].T[cy * LT + cx] = C_Speed; break; case life: - level.T[NumN].T[cy * LT + cx] = C_Life; + m_level.T[NumN].T[cy * LT + cx] = C_Life; break; case (e_Sprite)(locomotive + D_Top): case (e_Sprite)(locomotive + D_Bottom): case (e_Sprite)(locomotive + D_Left): case (e_Sprite)(locomotive + D_Right): - level.T[NumN].StartX = cx; - level.T[NumN].StartY = cy; - level.T[NumN].StartDir = (int)(Option) - (int)(locomotive); + m_level.T[NumN].StartX = cx; + m_level.T[NumN].StartY = cy; + m_level.T[NumN].StartDir = (int)(Option) - (int)(locomotive); break; default: break; @@ -209,7 +207,7 @@ void Editor::Draw() const unsigned char *T; // Address of the level - T = level.T[NumN].T; + T = m_level.T[NumN].T; // Builds the game's background Sprites[background].Draw(400, 300, 0); @@ -241,8 +239,8 @@ void Editor::Draw() const } // Displays decorations - for (i = 0; i < level.T[NumN].NDeco; i++) { - Sprites[deco].Draw(level.T[NumN].Deco[i].x, level.T[NumN].Deco[i].y, level.T[NumN].Deco[i].NumSpr); + for (i = 0; i < m_level.T[NumN].NDeco; i++) { + Sprites[deco].Draw(m_level.T[NumN].Deco[i].x, m_level.T[NumN].Deco[i].y, m_level.T[NumN].Deco[i].NumSpr); } // Displays the level number @@ -270,18 +268,18 @@ void Editor::Draw() const } // Displays the starting point of the locomotive - switch (level.T[NumN].StartDir) { + switch (m_level.T[NumN].StartDir) { case D_Top: - Sprites[locomotive].Draw(level.T[NumN].StartX * D_Case + D_Case / 2, level.T[NumN].StartY * D_Case + D_Case / 2, 0); + Sprites[locomotive].Draw(m_level.T[NumN].StartX * D_Case + D_Case / 2, m_level.T[NumN].StartY * D_Case + D_Case / 2, 0); break; case D_Bottom: - Sprites[locomotive].Draw(level.T[NumN].StartX * D_Case + D_Case / 2, level.T[NumN].StartY * D_Case + D_Case / 2, 40); + Sprites[locomotive].Draw(m_level.T[NumN].StartX * D_Case + D_Case / 2, m_level.T[NumN].StartY * D_Case + D_Case / 2, 40); break; case D_Left: - Sprites[locomotive].Draw(level.T[NumN].StartX * D_Case + D_Case / 2, level.T[NumN].StartY * D_Case + D_Case / 2, 80); + Sprites[locomotive].Draw(m_level.T[NumN].StartX * D_Case + D_Case / 2, m_level.T[NumN].StartY * D_Case + D_Case / 2, 80); break; case D_Right: - Sprites[locomotive].Draw(level.T[NumN].StartX * D_Case + D_Case / 2, level.T[NumN].StartY * D_Case + D_Case / 2, 120); + Sprites[locomotive].Draw(m_level.T[NumN].StartX * D_Case + D_Case / 2, m_level.T[NumN].StartY * D_Case + D_Case / 2, 120); break; } @@ -331,18 +329,18 @@ void Editor::GetKeyPress(int Key) switch (Key) { case SDLK_PAGEUP: - if (NumN < level.N - 1) { + if (NumN < m_level.N - 1) { NumN++; } else { j = 0; for (i = 0; i < LT * HT; i++) { - j += level.T[NumN].T[i]; + j += m_level.T[NumN].T[i]; } if (j != 0) { NumN++; - level.N++; - level.Clear(NumN); + m_level.N++; + m_level.Clear(NumN); } } break; @@ -366,10 +364,10 @@ void Editor::GetKeyPress(int Key) } break; case SDLK_INSERT: - level.Ins(NumN); + m_level.Ins(NumN); break; case SDLK_DELETE: - level.Del(NumN); + m_level.Del(NumN); break; case SDLK_UP: Option = (e_Sprite)(locomotive + D_Top); @@ -384,21 +382,21 @@ void Editor::GetKeyPress(int Key) Option = (e_Sprite)(locomotive + D_Right); break; case 'c': - level.Clear(NumN); + m_level.Clear(NumN); break; case '$': // Checks if the last level is empty for (j = i = 0; i < LT * HT; i++) { - j += level.T[level.N - 1].T[i]; + j += m_level.T[m_level.N - 1].T[i]; } if (j == 0) { - if (NumN < level.N - 1) { - level.N--; // Not counted if empty + if (NumN < m_level.N - 1) { + m_level.N--; // Not counted if empty } } // Saving the level - if (level.Save() == false) { + if (m_level.Save() == false) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error while saving levels"); exit(-1); } diff --git a/src/editor.h b/src/editor.h index 6d17455..f4fdf6c 100644 --- a/src/editor.h +++ b/src/editor.h @@ -30,12 +30,13 @@ class Mouse; class Game; class Gamepad; +class Level; class Editor { public: - Editor(Mouse &mouse, Game &game, Gamepad &gamepad) : - m_mouse(mouse), m_game(game), m_gamepad(gamepad) { }; + Editor(Mouse &mouse, Game &game, Level &level, Gamepad &gamepad) : + m_mouse(mouse), m_game(game), m_level(level), m_gamepad(gamepad) { }; ~Editor() = default; eMenu SDLMain(int LevelNumber); // Main loop @@ -50,6 +51,7 @@ class Editor Mouse &m_mouse; Game &m_game; + Level &m_level; Gamepad &m_gamepad; }; #endif diff --git a/src/game.cc b/src/game.cc index 8c2e49e..b8938d0 100644 --- a/src/game.cc +++ b/src/game.cc @@ -45,14 +45,12 @@ extern sNewPreference Pref; extern int currentTime; extern int previousTime; -extern Level level; - static int NumRail[] = { -1, -1, -1, 0, -1, 1, 2, 3, -1, 4, 5, 6, 7, 8, 9, 10 }; int MaskK; // Mask for movement keys -Game::Game(Audio &sounds, Screen &screen, Gamepad &gamepad) : - m_sounds(sounds), m_screen(screen), m_gamepad(gamepad), Lo(m_sounds) +Game::Game(Audio &sounds, Screen &screen, Level &level, Gamepad &gamepad) : + m_sounds(sounds), m_screen(screen), m_level(level), m_gamepad(gamepad), Lo(m_sounds) { KeyPress[0] = D_Top; KeyPress[1] = D_Bottom; @@ -245,7 +243,7 @@ eMenu Game::SDLMain() } #endif NumN++; - if (level.N == NumN) { + if (m_level.N == NumN) { Pref.Score += Pref.Lives * 100; return mScoreEdit; } @@ -275,7 +273,7 @@ bool Game::Load(int LevelN) // Copy wanted level to current for (i = 0; i < LT * HT; i++) { - T[i] = (int)level.T[LevelN].T[i]; + T[i] = (int)m_level.T[LevelN].T[i]; } // Change lives count with difficulty settings @@ -298,8 +296,8 @@ bool Game::Load(int LevelN) } // Initialize locomotive - Lo.Init(level.T[LevelN].StartX + level.T[LevelN].StartY * LT, level.T[LevelN].StartDir); - BufKeyPress(level.T[LevelN].StartDir); + Lo.Init(m_level.T[LevelN].StartX + m_level.T[LevelN].StartY * LT, m_level.T[LevelN].StartDir); + BufKeyPress(m_level.T[LevelN].StartDir); MaskK = 0; // Adapt speed with difficulty @@ -354,8 +352,8 @@ bool Game::DrawLevel(int LevelN) // Display decorations #ifndef DCHILDREN - for (i = 0; i < level.T[LevelN].NDeco; i++) { - Sprites[deco].Draw(level.T[LevelN].Deco[i].x, level.T[LevelN].Deco[i].y, level.T[LevelN].Deco[i].NumSpr, + for (i = 0; i < m_level.T[LevelN].NDeco; i++) { + Sprites[deco].Draw(m_level.T[LevelN].Deco[i].x, m_level.T[LevelN].Deco[i].y, m_level.T[LevelN].Deco[i].NumSpr, Sprites[fgame].Image[0]); } #endif diff --git a/src/game.h b/src/game.h index d2353ce..7e5a76d 100644 --- a/src/game.h +++ b/src/game.h @@ -31,11 +31,12 @@ class Audio; class Menu; class Gamepad; class Screen; +class Level; class Game { public: - explicit Game(Audio &sounds, Screen &screen, Gamepad &gamepad); + explicit Game(Audio &sounds, Screen &screen, Level &level, Gamepad &gamepad); ~Game() = default; void setMenu(Menu *menu) { m_menu = menu; } @@ -61,6 +62,7 @@ class Game Audio &m_sounds; Screen &m_screen; + Level &m_level; Gamepad &m_gamepad; Menu *m_menu { nullptr }; diff --git a/src/main.cc b/src/main.cc index 602be91..49d5fab 100644 --- a/src/main.cc +++ b/src/main.cc @@ -54,7 +54,6 @@ char Titre[] = "Li-ri V" VERSION; Sprite *Sprites = nullptr; // Sprites pointer int NSprites = 0; // Number of sprites in memory sNewPreference Pref; // Preference table. -Level level; int currentTime = 0; // Game clock int previousTime = 0; @@ -121,6 +120,8 @@ int main(int narg, char *argv[]) if (LoadSprites() == false) { exit(-1); } + + Level level; if (level.Load() == false) { exit(-1); } @@ -132,8 +133,8 @@ int main(int narg, char *argv[]) Gamepad gamepad; gamepad.Initialize(); - Game game { audio, screen, gamepad }; - Editor editor { mouse, game, gamepad }; + Game game { audio, screen, level, gamepad }; + Editor editor { mouse, game, level, gamepad }; Menu MainMenu { game, audio, screen, mouse, gamepad }; game.setMenu(&MainMenu);