Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 48 additions & 50 deletions src/editor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);
}
Expand Down
6 changes: 4 additions & 2 deletions src/editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -50,6 +51,7 @@ class Editor

Mouse &m_mouse;
Game &m_game;
Level &m_level;
Gamepad &m_gamepad;
};
#endif
46 changes: 21 additions & 25 deletions src/game.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,12 @@ 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, 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;
Expand All @@ -70,7 +66,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
Expand Down Expand Up @@ -247,7 +243,7 @@ eMenu Game::SDLMain()
}
#endif
NumN++;
if (level.N == NumN) {
if (m_level.N == NumN) {
Pref.Score += Pref.Lives * 100;
return mScoreEdit;
}
Expand Down Expand Up @@ -277,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
Expand All @@ -300,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
Expand Down Expand Up @@ -356,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
Expand Down Expand Up @@ -508,7 +504,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) {
Expand All @@ -526,44 +522,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);
}
}
Loading
Loading