summaryrefslogtreecommitdiff
path: root/jeu-test/tetris_lan_src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'jeu-test/tetris_lan_src/main.c')
-rw-r--r--jeu-test/tetris_lan_src/main.c320
1 files changed, 320 insertions, 0 deletions
diff --git a/jeu-test/tetris_lan_src/main.c b/jeu-test/tetris_lan_src/main.c
new file mode 100644
index 0000000..b410889
--- /dev/null
+++ b/jeu-test/tetris_lan_src/main.c
@@ -0,0 +1,320 @@
+#ifdef __cplusplus
+ #include <cstdlib>
+#else
+ #include <stdlib.h>
+#endif
+#ifdef __APPLE__
+#include <SDL/SDL.h>
+#else
+#include <SDL.h>
+#endif
+
+//-----------------------
+//
+// A Little Tetris Game
+// Done by Clément CORDE
+// c1702@yahoo.com
+//
+//-----------------------
+
+#include "includes.h"
+
+
+// Variables générales.
+struct SGene gVar;
+struct SExchange gExg;
+
+
+// Gestionnaire d'évènements.
+int EventHandler(void)
+{
+ static u8 nFullScreen = 0;
+ SDL_Event event;
+
+ while (SDL_PollEvent(&event))
+ {
+ switch (event.type)
+ {
+ case SDL_KEYDOWN:
+ gVar.pKeys = SDL_GetKeyState(NULL);
+
+ // Triggers.
+ if (event.key.keysym.sym == SDLK_UP) gVar.pKeysTrig[TRIG_UP] = 1;
+ if (event.key.keysym.sym == SDLK_DOWN) gVar.pKeysTrig[TRIG_DOWN] = 1;
+ if (event.key.keysym.sym == SDLK_RIGHT) gVar.pKeysTrig[TRIG_RIGHT] = 1;
+ if (event.key.keysym.sym == SDLK_LEFT) gVar.pKeysTrig[TRIG_LEFT] = 1;
+ if (event.key.keysym.sym == SDLK_p) gVar.pKeysTrig[TRIG_KeyP] = 1;
+ if (event.key.keysym.sym == SDLK_RETURN) gVar.pKeysTrig[TRIG_Return] = 1;
+ if (event.key.keysym.sym == SDLK_SPACE) gVar.pKeysTrig[TRIG_Space] = 1;
+
+ // Ingame toggles.
+ if (event.key.keysym.sym == SDLK_r) gVar.nOptFlags ^= OPT_Rotation;
+ if (event.key.keysym.sym == SDLK_g) gVar.nOptFlags ^= OPT_Ghost;
+
+ if (gVar.pKeys[SDLK_ESCAPE]) // Arrêt d'urgence !
+ {
+ TCP_CnxClose();
+ exit(0);//return (1);
+ }
+
+ // Toggle fullscreen/windowed.
+ if (gVar.pKeys[SDLK_F10])
+ {
+ SDL_Surface *pTmp = gVar.pScreen;
+
+ gVar.pScreen = SDL_SetVideoMode(SCR_Width, SCR_Height, 8, SDL_HWSURFACE | SDL_DOUBLEBUF | ((nFullScreen ^ 1) ? SDL_FULLSCREEN : 0));
+ if (gVar.pScreen == NULL)
+ {
+ // Raté.
+ fprintf(stderr, "Couldn't set video mode: %sn",SDL_GetError());
+ gVar.pScreen = pTmp; // Récupère l'ancien.
+ }
+ else
+ {
+ // Ok.
+ SDL_SetPalette(gVar.pScreen, SDL_LOGPAL | SDL_PHYSPAL, gVar.pCurBkg->format->palette->colors, 0, gVar.pCurBkg->format->palette->ncolors);
+ SDL_FreeSurface(pTmp); // Libère l'ancien.
+ nFullScreen ^= 1;
+ }
+ }
+
+ break;
+
+ case SDL_KEYUP:
+ gVar.pKeys = SDL_GetKeyState(NULL);
+ break;
+
+ case SDL_QUIT: // Fermeture de la fenêtre.
+ TCP_CnxClose();
+ exit(0);
+ break;
+ }
+ }
+ return (0);
+}
+
+// Load image.
+void LoadPic(SDL_Surface **pDst, char *pFilename)
+{
+ *pDst = SDL_LoadBMP(pFilename);
+ if (*pDst == NULL) {
+ fprintf(stderr, "Couldn't load picture '%s': %s\n", pFilename, SDL_GetError());
+ exit(1);
+ }
+}
+
+// Le Menu (générique).
+u32 Menu(void (*pFctInit)(void), u32 (*pFctMain)(void))
+{
+ u32 i;
+ u32 nMenuVal = MENU_Null;
+
+ // Sets up palette.
+ //SDL_SetColors(gVar.pScreen, gVar.pBkgMenu->format->palette->colors, 0, gVar.pBkgMenu->format->palette->ncolors);
+ SDL_SetPalette(gVar.pScreen, SDL_LOGPAL, gVar.pBkgMenu->format->palette->colors, 0, gVar.pBkgMenu->format->palette->ncolors);
+ gVar.pCurBkg = gVar.pBkgMenu;
+
+ // Main loop.
+ (*pFctInit)();
+ gVar.pKeys = SDL_GetKeyState(NULL); // Lecture dans le vide, pour init du ptr.
+ FrameInit();
+ while (nMenuVal == MENU_Null)
+ {
+ // Nettoyage du trigger.
+ for (i = 0; i < TRIG_MaxKeys; i++) gVar.pKeysTrig[i] = 0;
+
+ // Gestion des évenements.
+ EventHandler();
+
+ // Recopie le décor.
+ if (SDL_BlitSurface(gVar.pBkgMenu, NULL, gVar.pScreen, NULL) < 0)
+ {
+ fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ // Menu Main.
+ nMenuVal = (*pFctMain)();
+
+ // Wait for frame.
+ FrameWait();
+ SDL_Flip(gVar.pScreen); // => Refresh écran.
+
+ }
+
+ return (nMenuVal);
+}
+
+// Le jeu.
+void Game(void)
+{
+ u32 i;
+ u32 nTetVal = GAME_Null;
+
+ // Sets up palette.
+ //SDL_SetColors(gVar.pScreen, gVar.pBackground->format->palette->colors, 0, gVar.pBackground->format->palette->ncolors);
+ SDL_SetPalette(gVar.pScreen, SDL_LOGPAL, gVar.pBackground->format->palette->colors, 0, gVar.pBackground->format->palette->ncolors);
+ gVar.pCurBkg = gVar.pBackground;
+
+ // Main loop.
+ TetrisInit();
+ gVar.pKeys = SDL_GetKeyState(NULL); // Lecture dans le vide, pour init du ptr.
+ FrameInit();
+ while (nTetVal == GAME_Null)
+ {
+ // Nettoyage du trigger.
+ for (i = 0; i < TRIG_MaxKeys; i++) gVar.pKeysTrig[i] = 0;
+
+ // Gestion des évenements.
+ EventHandler();
+
+ // Recopie le décor. (possible optim => seulement l'aire de jeu).
+ if (SDL_BlitSurface(gVar.pBackground, NULL, gVar.pScreen, NULL) < 0)
+ {
+ fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ // Game.
+ nTetVal = TetrisMain();
+
+ // Wait for frame.
+ FrameWait();
+ SDL_Flip(gVar.pScreen); // => Refresh écran.
+
+ }
+
+ // High score ? (Slt en mode 1 joueur).
+ if (gVar.nGameMode == GAME_MODE_1Player && nTetVal == GAME_GameOver)
+ {
+ if (Scr_CheckHighSc(gExg.nScore) >= 0)
+ {
+ // Saisie du nom.
+ Menu(MenuGetNameInit, MenuGetName);
+ // Affichage de la table des high scores.
+ Menu(MenuMainInit, MenuHighScores); // !!! Même init que main !!!
+ }
+ }
+
+}
+
+// Point d'entrée.
+int main(int argc, char *argv[])
+{
+ u32 nLoop = 1;
+ u32 nMenuVal;
+
+
+//> revoir comment faire
+ // Récupération des paramètres de la ligne de commande :
+ // 1 = Adresse IP.
+ // 2 = Port.
+ if (argc != 3)
+ {
+ printf("Usage: Tetris <IP address> <Port>\n");
+ exit (1);
+ }
+ gVar.pIPAddress = argv[1];
+ gVar.nPort = atoi(argv[2]);
+ printf("Connect to %s, port %d\n", gVar.pIPAddress, (int)gVar.nPort);
+//<
+
+
+ // SDL Init.
+ if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+ fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
+ exit(1);
+ }
+ // atexit : Quand on quittera (exit, return...), SDL_Quit() sera appelée.
+ atexit(SDL_Quit);
+
+ // Video mode init.
+ gVar.pScreen = SDL_SetVideoMode(SCR_Width, SCR_Height, 8, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF);
+ if (gVar.pScreen == NULL)
+ {
+ fprintf(stderr, "Couldn't set video mode: %sn",SDL_GetError());
+ exit(1);
+ }
+ SDL_WM_SetCaption("Tetris", NULL); // Nom de la fenêtre.
+
+ // Load backgound picture.
+ LoadPic(&gVar.pBackground, "gfx/bkg.bmp");
+ // Load menu backgound picture.
+ LoadPic(&gVar.pBkgMenu, "gfx/bkg_menu.bmp");
+ // Load fonts.
+ LoadPic(&gVar.pFont1616, "gfx/fnt.bmp");
+ LoadPic(&gVar.pFont88, "gfx/fnt8.bmp");
+
+ // Init sound.
+ Sfx_SoundInit();
+ Sfx_LoadWavFiles();
+ Sfx_SoundOn(); // Starts playback.
+
+ TCP_EngineInit();
+
+ Scr_Load(); // Lecture du fichier des high scores.
+ Opt_Load(); // Lecture des options.
+
+ MenuInitMisc();
+ gVar.pWins[0] = gVar.pWins[1] = 0; // RAZ du nombre de victoires en LAN.
+
+ SDL_ShowCursor(SDL_DISABLE); // Cache le pointeur de la souris.
+
+ // Boucle infinie.
+ gExg.nStartingLevel = 1;
+ gExg.nHandicap = 0;
+ nMenuVal = MENU_Main;
+ while (nLoop)
+ {
+ switch (nMenuVal)
+ {
+ case MENU_Main : // Main menu.
+ nMenuVal = Menu(MenuMainInit2, MenuMain);
+ break;
+
+ case MENU_Game_1Player : // Jeu : 1 joueur.
+ gVar.nGameMode = GAME_MODE_1Player;
+ Game();
+ nMenuVal = MENU_Main;
+ break;
+
+ case MENU_Game_LAN : // Jeu : LAN.
+ gVar.nGameMode = GAME_MODE_LAN;
+ Game();
+ nMenuVal = MENU_Main;
+ break;
+
+ case MENU_HallOfFame : // High scores.
+ Menu(MenuMainInit, MenuHighScores); // !!! Même init que main !!!
+ nMenuVal = MENU_Main;
+ break;
+
+ case MENU_Options : // Options.
+ Menu(MenuMainInit, MenuOptions); // !!! Même init que main !!!
+ nMenuVal = MENU_Main;
+ break;
+
+ case MENU_Quit : // Sortie.
+ nLoop = 0;
+ break;
+ }
+
+ }
+
+ SDL_ShowCursor(SDL_ENABLE); // Réautorise l'affichage du curseur de la souris.
+
+ Sfx_SoundOff(); // Stops playback.
+ Sfx_FreeWavFiles(); // Libère les ressources des fx.
+
+ // Free the allocated BMP surfaces.
+ SDL_FreeSurface(gVar.pBackground);
+ SDL_FreeSurface(gVar.pBkgMenu);
+ SDL_FreeSurface(gVar.pFont1616);
+ SDL_FreeSurface(gVar.pFont88);
+
+ TCP_EngineClose();
+
+ return (0);
+}
+
+