diff options
author | AlejandroColomar <colomar.6.4.3@gmail.com> | 2019-01-07 03:01:16 +0100 |
---|---|---|
committer | AlejandroColomar <colomar.6.4.3@gmail.com> | 2019-01-07 03:01:16 +0100 |
commit | 629b6ea7a8fd3dce3695f590b19a9475211ac6d6 (patch) | |
tree | e4516e28d3d66e2518d7ab1153292c0730214b12 | |
parent | 7dad09c99bd85fc9302477daceb0ae2aff15964b (diff) |
Fix style; Unix new lines;
35 files changed, 8117 insertions, 8045 deletions
@@ -1,9 +1,9 @@ #!/usr/bin/make -f VERSION = 4 -PATCHLEVEL = ~b1 +PATCHLEVEL = SUBLEVEL = -EXTRAVERSION = +EXTRAVERSION = ~b2 NAME = graphic export VERSION @@ -67,7 +67,7 @@ export BUILD_VERBOSE MAKEFLAGS += --no-print-directory ################################################################################ -PROGRAMVERSION = $(VERSION)$(if $(PATCHLEVEL),$(PATCHLEVEL)$(if $(SUBLEVEL),$(SUBLEVEL)))$(EXTRAVERSION) +PROGRAMVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION) export PROGRAMVERSION ################################################################################ @@ -80,74 +80,31 @@ export TST export DBG ################################################################################ -# directories - -MAIN_DIR = $(CURDIR) - -LIBALX_DIR = $(CURDIR)/libalx/ -MODULES_DIR = $(CURDIR)/modules/ -TMP_DIR = $(CURDIR)/tmp/ -BIN_DIR = $(CURDIR)/bin/ - -export MAIN_DIR -export LIBALX_DIR -export MODULES_DIR - -# FIXME: Set local or not local when building a package -ifeq ($(OS), linux) - INSTALL_BIN_DIR = /usr/local/games/ -# INSTALL_BIN_DIR = /usr/games/ - INSTALL_SHARE_DIR = /usr/local/share/ -# INSTALL_SHARE_DIR = /usr/share/ - SHARE_DIR = mine-sweeper/ - INSTALL_VAR_DIR = /var/local/ -# INSTALL_VAR_DIR = /var/games/ - VAR_DIR = mine-sweeper/ -else ifeq ($(OS), win) - INSTALL_DIR = c:/Program files (x86)/ - INSTALL_SHARE_DIR = $(INSTALL_DIR)/mine-sweeper/ - SHARE_DIR = share/ - INSTALL_VAR_DIR = $(INSTALL_DIR)/mine-sweeper/ - VAR_DIR = var/ -endif - -export INSTALL_DIR -export INSTALL_SHARE_DIR -export SHARE_DIR - -################################################################################ -# executables - -ifeq ($(OS), linux) - BIN_NAME = mine-sweeper -else ifeq ($(OS), win) - BIN_NAME = mine-sweeper.exe -endif - -export BIN_NAME - -################################################################################ # Make variables (CC, etc...) CC = gcc AS = as + AR = ar LD = ld export CC export AS +export AR export LD ################################################################################ # cflags CFLAGS_STD = -std=c11 +CFLAGS_STD += -Wpedantic CFLAGS_OPT = -O3 CFLAGS_OPT += -march=native CFLAGS_W = -Wall CFLAGS_W += -Werror -CFLAGS_W += -Wno-format-truncation -CFLAGS_W += -Wno-format-zero-length -CFLAGS_W += -Wno-unused-function +#CFLAGS_W += -Wstrict-prototypes +CFLAGS_W += -Wno-error=format-truncation +#CFLAGS_W += -Wno-error=unused-function +#CFLAGS_W += -Wno-error=unused-parameter CFLAGS_PKG = `pkg-config --cflags ncurses` CFLAGS_PKG += `pkg-config --cflags gtk+-2.0` @@ -190,6 +147,53 @@ endif export LIBS ################################################################################ +# directories + +MAIN_DIR = $(CURDIR) + +LIBALX_DIR = $(CURDIR)/libalx/ +MODULES_DIR = $(CURDIR)/modules/ +TMP_DIR = $(CURDIR)/tmp/ +BIN_DIR = $(CURDIR)/bin/ + +export MAIN_DIR +export LIBALX_DIR +export MODULES_DIR + +# FIXME: Set local or not local when building a package +ifeq ($(OS), linux) + INSTALL_BIN_DIR = /usr/local/games/ +# INSTALL_BIN_DIR = /usr/games/ + INSTALL_SHARE_DIR = /usr/local/share/ +# INSTALL_SHARE_DIR = /usr/share/ + SHARE_DIR = mine-sweeper/ + INSTALL_VAR_DIR = /var/local/ +# INSTALL_VAR_DIR = /var/games/ + VAR_DIR = mine-sweeper/ +else ifeq ($(OS), win) + INSTALL_DIR = c:/Program files (x86)/ + INSTALL_SHARE_DIR = $(INSTALL_DIR)/mine-sweeper/ + SHARE_DIR = share/ + INSTALL_VAR_DIR = $(INSTALL_DIR)/mine-sweeper/ + VAR_DIR = var/ +endif + +export INSTALL_DIR +export INSTALL_SHARE_DIR +export SHARE_DIR + +################################################################################ +# executables + +ifeq ($(OS), linux) + BIN_NAME = mine-sweeper +else ifeq ($(OS), win) + BIN_NAME = mine-sweeper.exe +endif + +export BIN_NAME + +################################################################################ # target: dependencies # action @@ -226,41 +230,42 @@ binary: main PHONY += install install: uninstall - @echo "Create $(INSTALL_BIN_DIR)/" + @echo " Install:" + @echo " MKDIR $(INSTALL_BIN_DIR)/" $(Q)mkdir -p $(DESTDIR)/$(INSTALL_BIN_DIR)/ - @echo "Copy $(BIN_NAME)" + @echo " CP $(BIN_NAME)" $(Q)cp $(BIN_DIR)/$(BIN_NAME) $(DESTDIR)/$(INSTALL_BIN_DIR)/ - @echo - - @echo "Create $(INSTALL_SHARE_DIR)/$(SHARE_DIR)/" + @echo " MKDIR $(INSTALL_SHARE_DIR)/$(SHARE_DIR)/" $(Q)mkdir -p $(DESTDIR)/$(INSTALL_SHARE_DIR)/$(SHARE_DIR)/ - @echo "Copy share/*" + @echo " CP -r share/*" $(Q)cp -r ./share/* $(DESTDIR)/$(INSTALL_SHARE_DIR)/$(SHARE_DIR)/ - @echo "Create $(INSTALL_VAR_DIR)/$(VAR_DIR)/" + @echo " MKDIR $(INSTALL_VAR_DIR)/$(VAR_DIR)/" $(Q)mkdir -p $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ $(Q)mkdir $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/boards_beginner/ $(Q)mkdir $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/boards_intermediate/ $(Q)mkdir $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/boards_expert/ $(Q)mkdir $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/boards_custom/ - @echo "Copy var/*" + @echo " CP -r var/*" $(Q)cp -r ./var/* $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ - @echo "Change owner" + @echo " CHOWN $(INSTALL_VAR_DIR)/$(VAR_DIR)/" $(Q)chown root:games -R $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ - @echo "Change permissions" + @echo " CHMOD $(INSTALL_VAR_DIR)/$(VAR_DIR)/" $(Q)chmod 664 -R $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ $(Q)chmod +X -R $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ - @echo - - @echo "Done" + @echo " Done" @echo PHONY += uninstall uninstall: - @echo "Clean old installations" - $(Q)rm -f $(DESTDIR)/$(INSTALL_BIN_DIR)/$(BIN_NAME) - $(Q)rm -f -r $(DESTDIR)/$(INSTALL_SHARE_DIR)/$(SHARE_DIR)/ - $(Q)rm -f -r $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ + @echo " Clean old installations:" + @echo " RM bin" + $(Q)rm -f $(DESTDIR)/$(INSTALL_BIN_DIR)/$(BIN_NAME) + @echo " RM -r $(INSTALL_SHARE_DIR)/$(SHARE_DIR)/" + $(Q)rm -f -r $(DESTDIR)/$(INSTALL_SHARE_DIR)/$(SHARE_DIR)/ + @echo " RM -r $(INSTALL_VAR_DIR)/$(VAR_DIR)/" + $(Q)rm -f -r $(DESTDIR)/$(INSTALL_VAR_DIR)/$(VAR_DIR)/ + @echo " Done" @echo PHONY += clean @@ -271,17 +276,19 @@ clean: $(Q)$(MAKE) clean -C $(TMP_DIR) @echo ' CLEAN bin' $(Q)$(MAKE) clean -C $(BIN_DIR) + @echo PHONY += mrproper mrproper: clean @echo ' CLEAN libalx' $(Q)$(MAKE) clean -C $(LIBALX_DIR) + @echo PHONY += help help: @echo 'Cleaning targets:' - @echo ' clean - Remove all object files, but keep the binary' - @echo ' mrproper - Remove all generated files' + @echo ' clean - Remove all generated files' + @echo ' mrproper - Remove all generated files (including libraries)' @echo '' @echo 'Other generic targets:' @echo ' all - Build all targets marked with [*]' diff --git a/modules/about/inc/about.h b/modules/about/inc/about.h index 7118577..804e4a7 100644 --- a/modules/about/inc/about.h +++ b/modules/about/inc/about.h @@ -1,62 +1,62 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_ABOUT_H
- # define MSW_ABOUT_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* FILENAME_MAX */
- #include <stdio.h>
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define PROG_NAME "mine-sweeper"
- # define PROG_YEAR "2015"
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Share_File {
- SHARE_COPYRIGHT,
- SHARE_DISCLAIMER,
- SHARE_HELP,
- SHARE_LICENSE,
- SHARE_USAGE
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
- extern char share_path [FILENAME_MAX];
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void about_init (void);
- void snprint_share_file (char *dest, int destsize, int share_file);
- void print_share_file (int share_file);
- void print_version (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* about.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_ABOUT_H + # define MSW_ABOUT_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* FILENAME_MAX */ + #include <stdio.h> + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define PROG_NAME "mine-sweeper" + # define PROG_YEAR "2015" + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Share_File { + SHARE_COPYRIGHT, + SHARE_DISCLAIMER, + SHARE_HELP, + SHARE_LICENSE, + SHARE_USAGE + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern char share_path [FILENAME_MAX]; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void about_init (void); +void snprint_share_file (char *dest, int destsize, int share_file); +void print_share_file (int share_file); +void print_version (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* about.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/about/src/about.c b/modules/about/src/about.c index a9fe94a..1f829ad 100644 --- a/modules/about/src/about.c +++ b/modules/about/src/about.c @@ -1,91 +1,115 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* printf() */
- #include <stdio.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* alx_prn_file() */
- #include "alx_file.h"
-
- #include "about.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define BUFF_SIZE_TEXT (1048576)
-
-#if defined OS_LINUX
- # define BEGINNING "\n┌──────────────────────────────────────────────────────────────────────────────┐\n"
- # define ENDING "└──────────────────────────────────────────────────────────────────────────────┘\n\n"
-#elif defined OS_WIN
- # define BEGINNING "\n________________________________________________________________________________\n"
- # define ENDING "________________________________________________________________________________\n\n"
-#endif
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-char share_path [FILENAME_MAX];
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void about_init (void)
-{
- snprintf(share_path, FILENAME_MAX, "%s/%s/", INSTALL_SHARE_DIR, SHARE_DIR);
-}
-
-void snprint_share_file (char *dest, int destsize, int share_file)
-{
- char file_name [FILENAME_MAX];
-
- switch (share_file) {
- case SHARE_COPYRIGHT:
- snprintf(file_name, FILENAME_MAX, "%s/%s", share_path, "COPYRIGHT.txt");
- break;
- case SHARE_DISCLAIMER:
- snprintf(file_name, FILENAME_MAX, "%s/%s", share_path, "DISCLAIMER.txt");
- break;
- case SHARE_HELP:
- snprintf(file_name, FILENAME_MAX, "%s/%s", share_path, "HELP.txt");
- break;
- case SHARE_LICENSE:
- snprintf(file_name, FILENAME_MAX, "%s/%s", share_path, "LICENSE.txt");
- break;
- case SHARE_USAGE:
- snprintf(file_name, FILENAME_MAX, "%s/%s", share_path, "USAGE.txt");
- break;
- }
-
- alx_snprint_file(dest, destsize, file_name);
-}
-
-void print_share_file (int share_file)
-{
- char str [BUFF_SIZE_TEXT];
-
- snprint_share_file(str, BUFF_SIZE_TEXT, share_file);
-
- printf(BEGINNING);
- printf("%s", str);
- printf(ENDING);
-}
-
-void print_version (void)
-{
- printf("" PROG_NAME " " PROG_VERSION "\n\n");
-}
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + /* printf() */ + #include <stdio.h> + +/* libalx ------------------------------------------------------------------*/ + /* alx_prn_file() */ + #include "alx_file.h" + +/* Project -------------------------------------------------------------------*/ + #include "about.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define BUFF_SIZE_TEXT (1048576) + +#if defined OS_LINUX + # define BEGINNING "\n┌──────────────────────────────────────────────────────────────────────────────┐\n" + # define ENDING "└──────────────────────────────────────────────────────────────────────────────┘\n\n" +#elif defined OS_WIN + # define BEGINNING "\n________________________________________________________________________________\n" + # define ENDING "________________________________________________________________________________\n\n" +#endif + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +char share_path [FILENAME_MAX]; + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void about_init (void) +{ + snprintf(share_path, FILENAME_MAX, "%s/%s/", INSTALL_SHARE_DIR, SHARE_DIR); +} + +void snprint_share_file (char *dest, int destsize, int share_file) +{ + char file_name [FILENAME_MAX]; + + switch (share_file) { + case SHARE_COPYRIGHT: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + share_path, + "COPYRIGHT.txt") >= FILENAME_MAX) { + goto err_path; + } + break; + case SHARE_DISCLAIMER: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + share_path, + "DISCLAIMER.txt") >= FILENAME_MAX) { + goto err_path; + } + break; + case SHARE_HELP: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + share_path, + "HELP.txt") >= FILENAME_MAX) { + goto err_path; + } + break; + case SHARE_LICENSE: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + share_path, + "LICENSE.txt") >= FILENAME_MAX) { + goto err_path; + } + break; + case SHARE_USAGE: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + share_path, + "USAGE.txt") >= FILENAME_MAX) { + goto err_path; + } + break; + } + + alx_snprint_file(dest, destsize, file_name); + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + printf("File could not be shown!\n"); +} + +void print_share_file (int share_file) +{ + char str [BUFF_SIZE_TEXT]; + + snprint_share_file(str, BUFF_SIZE_TEXT, share_file); + + printf(BEGINNING); + printf("%s", str); + printf(ENDING); +} + +void print_version (void) +{ + printf("" PROG_NAME " " PROG_VERSION "\n\n"); +} diff --git a/modules/ctrl/inc/start.h b/modules/ctrl/inc/start.h index f636c7a..224999b 100644 --- a/modules/ctrl/inc/start.h +++ b/modules/ctrl/inc/start.h @@ -1,43 +1,43 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_START_H
- # define MSW_START_H
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Start_Mode {
- START_FOO = 0,
- START_RAND,
- START_LOAD
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern int start_mode;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void start_switch (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* start.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_START_H + # define MSW_START_H + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Start_Mode { + START_FOO = 0, + START_RAND, + START_LOAD + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern int start_mode; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ + void start_switch (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* start.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/ctrl/src/start.c b/modules/ctrl/src/start.c index e734b86..bd0fb94 100644 --- a/modules/ctrl/src/start.c +++ b/modules/ctrl/src/start.c @@ -1,133 +1,133 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* errno */
- #include <errno.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* game() */
- #include "game.h"
- /* game_iface() */
- #include "game_iface.h"
- /* menu_iface_board() */
- #include "menu_iface.h"
- /* player_iface() */
- #include "player_iface.h"
-
- #include "start.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-int start_mode;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void start_foo (void);
-static void start_rand (void);
-static void start_load (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void start_switch (void)
-{
- switch (start_mode) {
- case START_FOO:
- start_foo();
- break;
-
- case START_RAND:
- start_rand();
- break;
-
- case START_LOAD:
- start_load();
- break;
- }
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void start_foo (void)
-{
- /* empty */
-}
-
-static void start_rand (void)
-{
- /* size & mines */
- int level;
- int rows;
- int cols;
- int mines;
- menu_iface_board(&level, &rows, &cols, &mines);
-
- /* user iface init */
- bool fail;
- player_iface_init(rows, cols);
-
- /* start position */
- int r;
- int c;
- fail = player_iface_start(&r, &c);
-
- if (!fail) {
- /* game init */
- game_init_rand(rows, cols, mines, r, c);
-
- /* game iface init */
- game_iface_init_rand(level, r, c);
-
- /* game loop */
- game_iface();
- }
-
- /* user iface cluanup */
- player_iface_cleanup();
-}
-
-static void start_load (void)
-{
- /* size & game init (sets errno) */
- int rows;
- int cols;
-
- errno = 0;
- game_init_load(&rows, &cols);
-
- if (!errno) {
- /* player iface init */
- player_iface_init(rows, cols);
-
- /* game iface init */
- game_iface_init_load();
-
- /* game loop */
- game_iface();
-
- /* user iface cluanup */
- player_iface_cleanup();
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + /* errno */ + #include <errno.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + /* game() */ + #include "game.h" + /* game_iface() */ + #include "game_iface.h" + /* menu_iface_board() */ + #include "menu_iface.h" + /* player_iface() */ + #include "player_iface.h" + + #include "start.h" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +int start_mode; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void start_foo (void); +static void start_rand (void); +static void start_load (void); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void start_switch (void) +{ + switch (start_mode) { + case START_FOO: + start_foo(); + break; + + case START_RAND: + start_rand(); + break; + + case START_LOAD: + start_load(); + break; + } +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void start_foo (void) +{ + /* empty */ +} + +static void start_rand (void) +{ + /* size & mines */ + int level; + int rows; + int cols; + int mines; + menu_iface_board(&level, &rows, &cols, &mines); + + /* user iface init */ + bool fail; + player_iface_init(rows, cols); + + /* start position */ + int r; + int c; + fail = player_iface_start(&r, &c); + + if (!fail) { + /* game init */ + game_init_rand(rows, cols, mines, r, c); + + /* game iface init */ + game_iface_init_rand(level, r, c); + + /* game loop */ + game_iface(); + } + + /* user iface cluanup */ + player_iface_cleanup(); +} + +static void start_load (void) +{ + /* size & game init (sets errno) */ + int rows; + int cols; + + errno = 0; + game_init_load(&rows, &cols); + + if (!errno) { + /* player iface init */ + player_iface_init(rows, cols); + + /* game iface init */ + game_iface_init_load(); + + /* game loop */ + game_iface(); + + /* user iface cluanup */ + player_iface_cleanup(); + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/game/inc/game.h b/modules/game/inc/game.h index 9a97b86..74ec25c 100644 --- a/modules/game/inc/game.h +++ b/modules/game/inc/game.h @@ -1,100 +1,100 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_GAME_H
- # define MSW_GAME_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <stdbool.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* ¡ Need to include these in the Makefile ! */
- /* ROWS_MAX & COLS_MAX */
- #include "game_iface.h"
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Game_Mine_Board {
- GAME_MINE_NO = 0,
- GAME_MINE_YES = 9
- };
-
- enum Game_Usr_Board {
- GAME_USR_KBOOM = -1,
- GAME_USR_HIDDEN,
- GAME_USR_CLEAR,
- GAME_USR_FLAG,
- GAME_USR_POSSIBLE
- };
-
- enum Game_Action {
- GAME_ACT_FOO = 0,
- GAME_ACT_STEP,
- GAME_ACT_FLAG,
- GAME_ACT_FLAG_POSSIBLE,
- GAME_ACT_RM_FLAG
- };
-
- enum Game_State {
- GAME_STATE_PLAYING = 0,
- GAME_STATE_SAFE,
- GAME_STATE_GAMEOVER
- };
-
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
- struct Game_Board {
- int rows;
- int cols;
- int mines;
- int gnd [ROWS_MAX] [COLS_MAX];
- int usr [ROWS_MAX] [COLS_MAX];
- int flags;
- int clr;
- int state;
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
- extern struct Game_Board game_board;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void game_init (void);
- void game_init_rand (int rows, int cols, int p,
- int pos_row, int pos_col);
- void game_init_load (int *rows, int *cols);
- void game_action (int action, int row, int col);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* game.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_GAME_H + # define MSW_GAME_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <stdbool.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + /* ¡ Need to include these in the Makefile ! */ + /* ROWS_MAX & COLS_MAX */ + #include "game_iface.h" + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Game_Mine_Board { + GAME_MINE_NO = 0, + GAME_MINE_YES = 9 + }; + + enum Game_Usr_Board { + GAME_USR_KBOOM = -1, + GAME_USR_HIDDEN, + GAME_USR_CLEAR, + GAME_USR_FLAG, + GAME_USR_POSSIBLE + }; + + enum Game_Action { + GAME_ACT_FOO = 0, + GAME_ACT_STEP, + GAME_ACT_FLAG, + GAME_ACT_FLAG_POSSIBLE, + GAME_ACT_RM_FLAG + }; + + enum Game_State { + GAME_STATE_PLAYING = 0, + GAME_STATE_SAFE, + GAME_STATE_GAMEOVER + }; + + + +/****************************************************************************** + ******* structs ************************************************************** + ******************************************************************************/ + struct Game_Board { + int rows; + int cols; + int mines; + int gnd [ROWS_MAX] [COLS_MAX]; + int usr [ROWS_MAX] [COLS_MAX]; + int flags; + int clr; + int state; + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ + extern struct Game_Board game_board; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ + void game_init (void); + void game_init_rand (int rows, int cols, int p, + int pos_row, int pos_col); + void game_init_load (int *rows, int *cols); + void game_action (int action, int row, int col); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* game.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/game/inc/game_iface.h b/modules/game/inc/game_iface.h index 9ef36ee..b3f4ae5 100644 --- a/modules/game/inc/game_iface.h +++ b/modules/game/inc/game_iface.h @@ -1,153 +1,153 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_GAME_IFACE_H
- # define MSW_GAME_IFACE_H
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define ROWS_MAX (999)
- # define COLS_MAX (999)
- # define CHEATED (-1)
-
- # define GAME_IFACE_LEVEL_BEGINNER_ROWS (8)
- # define GAME_IFACE_LEVEL_BEGINNER_COLS (8)
- # define GAME_IFACE_LEVEL_BEGINNER_MINES (10)
-
- # define GAME_IFACE_LEVEL_INTERMEDIATE_ROWS (16)
- # define GAME_IFACE_LEVEL_INTERMEDIATE_COLS (16)
- # define GAME_IFACE_LEVEL_INTERMEDIATE_MINES (40)
-
- # define GAME_IFACE_LEVEL_EXPERT_ROWS (16)
- # define GAME_IFACE_LEVEL_EXPERT_COLS (30)
- # define GAME_IFACE_LEVEL_EXPERT_MINES (99)
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Game_Iface_Level {
- GAME_IFACE_LEVEL_BEGINNER = 0,
- GAME_IFACE_LEVEL_INTERMEDIATE,
- GAME_IFACE_LEVEL_EXPERT,
- GAME_IFACE_LEVEL_EXPERT_INV,
- GAME_IFACE_LEVEL_CUSTOM
- };
-
- enum Game_Iface_Visible_Board {
- GAME_IFACE_VIS_FOO = -1,
- GAME_IFACE_VIS_KBOOM,
- GAME_IFACE_VIS_HIDDEN_FIELD,
- GAME_IFACE_VIS_HIDDEN_MINE,
- GAME_IFACE_VIS_HIDDEN_SAFE,
- GAME_IFACE_VIS_SAFE_MINE,
- GAME_IFACE_VIS_0,
- GAME_IFACE_VIS_1,
- GAME_IFACE_VIS_2,
- GAME_IFACE_VIS_3,
- GAME_IFACE_VIS_4,
- GAME_IFACE_VIS_5,
- GAME_IFACE_VIS_6,
- GAME_IFACE_VIS_7,
- GAME_IFACE_VIS_8,
- GAME_IFACE_VIS_FLAG,
- GAME_IFACE_VIS_FLAG_FALSE,
- GAME_IFACE_VIS_POSSIBLE,
- GAME_IFACE_VIS_POSSIBLE_FALSE
- };
-
- /* Needs to be the same as 'enum Game_Usr_Board' in 'game.h' */
- enum Game_Iface_Usr_Board {
- GAME_IFACE_USR_KBOOM = -1,
- GAME_IFACE_USR_HIDDEN,
- GAME_IFACE_USR_CLEAR,
- GAME_IFACE_USR_FLAG,
- GAME_IFACE_USR_POSSIBLE
- };
-
- /* Needs to be the same as 'enum Game_Action' in 'game.h' */
- enum Game_Iface_Action_Play {
- GAME_IFACE_GAME_ACT_FOO = 0,
- GAME_IFACE_GAME_ACT_STEP,
- GAME_IFACE_GAME_ACT_FLAG,
- GAME_IFACE_GAME_ACT_FLAG_POSSIBLE,
- GAME_IFACE_GAME_ACT_RM_FLAG
- };
-
- enum Game_Iface_Action {
- GAME_IFACE_ACT_FOO,
- GAME_IFACE_ACT_PLAY,
- GAME_IFACE_ACT_PAUSE,
- GAME_IFACE_ACT_SAVE,
- GAME_IFACE_ACT_XYZZY_ON,
- GAME_IFACE_ACT_XYZZY_OFF,
- GAME_IFACE_ACT_XYZZY_LIN,
- GAME_IFACE_ACT_XYZZY_P,
- GAME_IFACE_ACT_XYZZY_NP,
- GAME_IFACE_ACT_QUIT
- };
-
- enum Game_Iface_State {
- GAME_IFACE_STATE_PLAYING,
- GAME_IFACE_STATE_SAFE,
- GAME_IFACE_STATE_GAMEOVER,
-
- GAME_IFACE_STATE_PAUSE,
- GAME_IFACE_STATE_CHEATED,
- GAME_IFACE_STATE_XYZZY,
- GAME_IFACE_STATE_QUIT,
-
- GAME_IFACE_STATE_FOO
- };
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
- struct Game_Iface_Out {
- int rows;
- int cols;
- int mines;
- int visible [ROWS_MAX] [COLS_MAX];
- int usr [ROWS_MAX] [COLS_MAX];
- int flags;
- int clr;
- int state;
- };
-
- struct Game_Iface_Score {
- int level;
- int time;
- int clicks;
- };
-
- struct Game_Iface_In {
- int action;
- int act_game [ROWS_MAX] [COLS_MAX];
- };
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void game_iface_init_rand (int level, int pos_row, int pos_col);
- void game_iface_init_load (void);
- void game_iface (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* game_iface.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_GAME_IFACE_H + # define MSW_GAME_IFACE_H + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define ROWS_MAX (999) + # define COLS_MAX (999) + # define CHEATED (-1) + + # define GAME_IFACE_LEVEL_BEGINNER_ROWS (8) + # define GAME_IFACE_LEVEL_BEGINNER_COLS (8) + # define GAME_IFACE_LEVEL_BEGINNER_MINES (10) + + # define GAME_IFACE_LEVEL_INTERMEDIATE_ROWS (16) + # define GAME_IFACE_LEVEL_INTERMEDIATE_COLS (16) + # define GAME_IFACE_LEVEL_INTERMEDIATE_MINES (40) + + # define GAME_IFACE_LEVEL_EXPERT_ROWS (16) + # define GAME_IFACE_LEVEL_EXPERT_COLS (30) + # define GAME_IFACE_LEVEL_EXPERT_MINES (99) + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Game_Iface_Level { + GAME_IFACE_LEVEL_BEGINNER = 0, + GAME_IFACE_LEVEL_INTERMEDIATE, + GAME_IFACE_LEVEL_EXPERT, + GAME_IFACE_LEVEL_EXPERT_INV, + GAME_IFACE_LEVEL_CUSTOM + }; + + enum Game_Iface_Visible_Board { + GAME_IFACE_VIS_FOO = -1, + GAME_IFACE_VIS_KBOOM, + GAME_IFACE_VIS_HIDDEN_FIELD, + GAME_IFACE_VIS_HIDDEN_MINE, + GAME_IFACE_VIS_HIDDEN_SAFE, + GAME_IFACE_VIS_SAFE_MINE, + GAME_IFACE_VIS_0, + GAME_IFACE_VIS_1, + GAME_IFACE_VIS_2, + GAME_IFACE_VIS_3, + GAME_IFACE_VIS_4, + GAME_IFACE_VIS_5, + GAME_IFACE_VIS_6, + GAME_IFACE_VIS_7, + GAME_IFACE_VIS_8, + GAME_IFACE_VIS_FLAG, + GAME_IFACE_VIS_FLAG_FALSE, + GAME_IFACE_VIS_POSSIBLE, + GAME_IFACE_VIS_POSSIBLE_FALSE + }; + + /* Needs to be the same as 'enum Game_Usr_Board' in 'game.h' */ + enum Game_Iface_Usr_Board { + GAME_IFACE_USR_KBOOM = -1, + GAME_IFACE_USR_HIDDEN, + GAME_IFACE_USR_CLEAR, + GAME_IFACE_USR_FLAG, + GAME_IFACE_USR_POSSIBLE + }; + + /* Needs to be the same as 'enum Game_Action' in 'game.h' */ + enum Game_Iface_Action_Play { + GAME_IFACE_GAME_ACT_FOO = 0, + GAME_IFACE_GAME_ACT_STEP, + GAME_IFACE_GAME_ACT_FLAG, + GAME_IFACE_GAME_ACT_FLAG_POSSIBLE, + GAME_IFACE_GAME_ACT_RM_FLAG + }; + + enum Game_Iface_Action { + GAME_IFACE_ACT_FOO, + GAME_IFACE_ACT_PLAY, + GAME_IFACE_ACT_PAUSE, + GAME_IFACE_ACT_SAVE, + GAME_IFACE_ACT_XYZZY_ON, + GAME_IFACE_ACT_XYZZY_OFF, + GAME_IFACE_ACT_XYZZY_LIN, + GAME_IFACE_ACT_XYZZY_P, + GAME_IFACE_ACT_XYZZY_NP, + GAME_IFACE_ACT_QUIT + }; + + enum Game_Iface_State { + GAME_IFACE_STATE_PLAYING, + GAME_IFACE_STATE_SAFE, + GAME_IFACE_STATE_GAMEOVER, + + GAME_IFACE_STATE_PAUSE, + GAME_IFACE_STATE_CHEATED, + GAME_IFACE_STATE_XYZZY, + GAME_IFACE_STATE_QUIT, + + GAME_IFACE_STATE_FOO + }; + + +/****************************************************************************** + ******* structs ************************************************************** + ******************************************************************************/ + struct Game_Iface_Out { + int rows; + int cols; + int mines; + int visible [ROWS_MAX] [COLS_MAX]; + int usr [ROWS_MAX] [COLS_MAX]; + int flags; + int clr; + int state; + }; + + struct Game_Iface_Score { + int level; + int time; + int clicks; + }; + + struct Game_Iface_In { + int action; + int act_game [ROWS_MAX] [COLS_MAX]; + }; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ + void game_iface_init_rand (int level, int pos_row, int pos_col); + void game_iface_init_load (void); + void game_iface (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* game_iface.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/game/src/game.c b/modules/game/src/game.c index 29da873..077d21c 100644 --- a/modules/game/src/game.c +++ b/modules/game/src/game.c @@ -1,399 +1,399 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* bool */
- #include <stdbool.h>
- /* rand() */
- #include <stdlib.h>
- /* time_t & clock() & time() */
- #include <time.h>
- /* getpid() */
- #include <unistd.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* seedf() */
- #include "alx_seed.h"
-
- #include "save.h"
-
- #include "game.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-struct Game_Board game_board;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Init */
-static void game_init_clr (void);
-static void game_init_mines (int pos_row, int pos_col);
-static void game_init_adjnums (void);
- /* Step */
-static void game_step (int r, int c);
-static void game_discover (int r, int c);
-static void game_discover_recursive (int r, int c);
-static void game_big_step (int r, int c);
-static int game_count_flags (int r, int c);
-static void game_step_recursive (int r, int c);
- /* Flag */
-static void game_flag (int r, int c);
-static void game_possible (int r, int c);
-static void game_rmflag (int r, int c);
-static void game_all_flags (int r, int c);
-static int game_count_nclear (int r, int c);
-static void game_flag_recursive (int r, int c);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void game_init (void)
-{
- int seed;
- seed = seedf(clock(), time(NULL), getpid());
- srand(seed);
-}
-
-void game_init_rand (int rows, int cols, int mines,
- int pos_row, int pos_col)
-{
- /* size & mines */
- game_board.rows = rows;
- game_board.cols = cols;
- game_board.mines = mines;
-
- /* clear */
- game_init_clr();
-
- /* place mines */
- game_init_mines(pos_row, pos_col);
-
- /* calc adjacency numbers */
- game_init_adjnums();
-}
-
-void game_init_load (int *rows, int *cols)
-{
- load_game_file();
-
- game_board.state = GAME_STATE_PLAYING;
-
- *rows = game_board.rows;
- *cols = game_board.cols;
-}
-
-void game_action (int action, int row, int col)
-{
- switch (action) {
- case GAME_ACT_STEP:
- game_step(row, col);
- break;
-
- case GAME_ACT_FLAG:
- game_flag(row, col);
- break;
-
- case GAME_ACT_FLAG_POSSIBLE:
- game_possible(row, col);
- break;
-
- case GAME_ACT_RM_FLAG:
- game_rmflag(row, col);
- break;
- }
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Init * * * * * * *
- * * * * * * * * * */
-static void game_init_clr (void)
-{
- int i;
- int j;
- for (i = 0; i < game_board.rows; i++) {
- for (j = 0; j < game_board.cols; j++) {
- game_board.gnd[i][j] = GAME_MINE_NO;
- game_board.usr[i][j] = GAME_USR_HIDDEN;
- }
- }
- game_board.flags = 0;
- game_board.clr = 0;
- game_board.state = GAME_STATE_PLAYING;
-}
-
-static void game_init_mines (int pos_row, int pos_col)
-{
- /* place mines */
- int i;
- int r;
- int c;
- i = 0;
- while (i < game_board.mines) {
- r = (rand() % game_board.rows);
- c = (rand() % game_board.cols);
-
- if (game_board.gnd[r][c] == GAME_MINE_NO) {
- /* first step is safe */
- if (!((r == pos_row) && (c == pos_col))) {
- game_board.gnd[r][c] = GAME_MINE_YES;
- i++;
- }
- }
- }
-}
-
-static void game_init_adjnums (void)
-{
- int r;
- int c;
- int i;
- int j;
- for (r = 0; r < game_board.rows; r++) {
- for (c = 0; c < game_board.cols; c++) {
- if (game_board.gnd[r][c] >= GAME_MINE_YES) {
- for (i = r-1; i < r+2; i++) {
- for (j = c-1; j < c+2; j++) {
- if (i >= 0 && i < game_board.rows) {
- if (j >= 0 && j < game_board.cols) {
- game_board.gnd[i][j]++;
- }
- }
- }
- }
- }
- }
- }
-}
-
-/* * * * * * * * * *
- * * * Step * * * * * * *
- * * * * * * * * * */
-static void game_step (int r, int c)
-{
- switch (game_board.usr[r][c]) {
- case GAME_USR_HIDDEN:
- case GAME_USR_POSSIBLE:
- game_discover(r, c);
- break;
-
- case GAME_USR_CLEAR:
- game_big_step(r, c);
- break;
- }
-}
-
-static void game_discover (int r, int c)
-{
- int safe_fields;
- safe_fields = (game_board.rows * game_board.cols) - game_board.mines;
-
- if (game_board.gnd[r][c] >= GAME_MINE_YES) {
- game_board.usr[r][c] = GAME_USR_KBOOM;
- game_board.state = GAME_STATE_GAMEOVER;
-
- } else if (game_board.usr[r][c] != GAME_USR_CLEAR) {
- game_board.usr[r][c] = GAME_USR_CLEAR;
- game_board.clr++;
-
- if (game_board.clr == safe_fields) {
- game_board.state = GAME_STATE_SAFE;
-
- } else if (game_board.gnd[r][c] == GAME_MINE_NO) {
- game_discover_recursive(r, c);
- }
- }
-}
-
-static void game_discover_recursive (int r, int c)
-{
- int i;
- int j;
-
- for (i = r - 1; i < r + 2; i++) {
- for (j = c - 1; j < c + 2; j++) {
- if (i >= 0 && i < game_board.rows &&
- j >= 0 && j < game_board.cols) {
- game_discover(i, j);
- }
- }
- }
-}
-
-static void game_big_step (int r, int c)
-{
- int cnt;
- cnt = game_count_flags(r, c);
-
- if (cnt && (game_board.gnd[r][c] == cnt)) {
- game_step_recursive(r, c);
- }
-}
-
-static int game_count_flags (int r, int c)
-{
- int cnt;
- int i;
- int j;
-
- cnt = 0;
- for (i = r - 1; i < r + 2; i++) {
- for (j = c - 1; j < c + 2; j++) {
- if (i >= 0 && i < game_board.rows &&
- j >= 0 && j < game_board.cols) {
- if (game_board.usr[i][j] == GAME_USR_FLAG) {
- cnt++;
- }
- }
- }
- }
-
- return cnt;
-}
-
-static void game_step_recursive (int r, int c)
-{
- int i;
- int j;
-
- for (i = r - 1; i < r + 2; i++) {
- for (j = c - 1; j < c + 2; j++) {
- if (i >= 0 && i < game_board.rows &&
- j >= 0 && j < game_board.cols) {
- switch (game_board.usr[i][j]) {
- case GAME_USR_HIDDEN:
- case GAME_USR_POSSIBLE:
- game_discover(i, j);
- break;
- }
- }
- }
- }
-}
-
-/* * * * * * * * * *
- * * * Flag * * * * * * *
- * * * * * * * * * */
-static void game_flag (int r, int c)
-{
- switch (game_board.usr[r][c]) {
- case GAME_USR_HIDDEN:
- game_board.usr[r][c] = GAME_USR_FLAG;
- game_board.flags++;
- break;
-
- case GAME_USR_FLAG:
- game_board.usr[r][c] = GAME_USR_POSSIBLE;
- game_board.flags--;
- break;
-
- case GAME_USR_POSSIBLE:
- game_rmflag(r, c);
- break;
-
- case GAME_USR_CLEAR:
- game_all_flags(r, c);
- break;
- }
-}
-
-static void game_possible (int r, int c)
-{
- switch (game_board.usr[r][c]) {
- case GAME_USR_HIDDEN:
- game_board.usr[r][c] = GAME_USR_POSSIBLE;
- break;
-
- case GAME_USR_POSSIBLE:
- game_rmflag(r, c);
- break;
- }
-}
-
-static void game_rmflag (int r, int c)
-{
- switch (game_board.usr[r][c]) {
- case GAME_USR_FLAG:
- game_board.usr[r][c] = GAME_USR_HIDDEN;
- game_board.flags--;
- break;
-
- case GAME_USR_POSSIBLE:
- game_board.usr[r][c] = GAME_USR_HIDDEN;
- break;
- }
-}
-
-static void game_all_flags (int r, int c)
-{
- int cnt;
- cnt = game_count_nclear(r, c);
-
- if (cnt && (game_board.gnd[r][c] == cnt)) {
- game_flag_recursive(r, c);
- }
-}
-
-static int game_count_nclear (int r, int c)
-{
- int cnt;
- int i;
- int j;
-
- cnt = 0;
- for (i = r - 1; i < r + 2; i++) {
- for (j = c - 1; j < c + 2; j++) {
- if (i >= 0 && i < game_board.rows &&
- j >= 0 && j < game_board.cols) {
- if (game_board.usr[i][j] != GAME_USR_CLEAR) {
- cnt++;
- }
- }
- }
- }
-
- return cnt;
-}
-
-static void game_flag_recursive (int r, int c)
-{
- int i;
- int j;
-
- for (i = r - 1; i < r + 2; i++) {
- for (j = c - 1; j < c + 2; j++) {
- if (i >= 0 && i < game_board.rows &&
- j >= 0 && j < game_board.cols) {
- switch (game_board.usr[i][j]) {
- case GAME_USR_HIDDEN:
- case GAME_USR_POSSIBLE:
- game_board.usr[i][j] = GAME_USR_FLAG;
- game_board.flags++;
- break;
- }
- }
- }
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + /* bool */ + #include <stdbool.h> + /* rand() */ + #include <stdlib.h> + /* time_t & clock() & time() */ + #include <time.h> + /* getpid() */ + #include <unistd.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + /* seedf() */ + #include "alx_seed.h" + + #include "save.h" + + #include "game.h" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +struct Game_Board game_board; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Init */ +static void game_init_clr (void); +static void game_init_mines (int pos_row, int pos_col); +static void game_init_adjnums (void); + /* Step */ +static void game_step (int r, int c); +static void game_discover (int r, int c); +static void game_discover_recursive (int r, int c); +static void game_big_step (int r, int c); +static int game_count_flags (int r, int c); +static void game_step_recursive (int r, int c); + /* Flag */ +static void game_flag (int r, int c); +static void game_possible (int r, int c); +static void game_rmflag (int r, int c); +static void game_all_flags (int r, int c); +static int game_count_nclear (int r, int c); +static void game_flag_recursive (int r, int c); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void game_init (void) +{ + int seed; + seed = seedf(clock(), time(NULL), getpid()); + srand(seed); +} + +void game_init_rand (int rows, int cols, int mines, + int pos_row, int pos_col) +{ + /* size & mines */ + game_board.rows = rows; + game_board.cols = cols; + game_board.mines = mines; + + /* clear */ + game_init_clr(); + + /* place mines */ + game_init_mines(pos_row, pos_col); + + /* calc adjacency numbers */ + game_init_adjnums(); +} + +void game_init_load (int *rows, int *cols) +{ + load_game_file(); + + game_board.state = GAME_STATE_PLAYING; + + *rows = game_board.rows; + *cols = game_board.cols; +} + +void game_action (int action, int row, int col) +{ + switch (action) { + case GAME_ACT_STEP: + game_step(row, col); + break; + + case GAME_ACT_FLAG: + game_flag(row, col); + break; + + case GAME_ACT_FLAG_POSSIBLE: + game_possible(row, col); + break; + + case GAME_ACT_RM_FLAG: + game_rmflag(row, col); + break; + } +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Init * * * * * * * + * * * * * * * * * */ +static void game_init_clr (void) +{ + int i; + int j; + for (i = 0; i < game_board.rows; i++) { + for (j = 0; j < game_board.cols; j++) { + game_board.gnd[i][j] = GAME_MINE_NO; + game_board.usr[i][j] = GAME_USR_HIDDEN; + } + } + game_board.flags = 0; + game_board.clr = 0; + game_board.state = GAME_STATE_PLAYING; +} + +static void game_init_mines (int pos_row, int pos_col) +{ + /* place mines */ + int i; + int r; + int c; + i = 0; + while (i < game_board.mines) { + r = (rand() % game_board.rows); + c = (rand() % game_board.cols); + + if (game_board.gnd[r][c] == GAME_MINE_NO) { + /* first step is safe */ + if (!((r == pos_row) && (c == pos_col))) { + game_board.gnd[r][c] = GAME_MINE_YES; + i++; + } + } + } +} + +static void game_init_adjnums (void) +{ + int r; + int c; + int i; + int j; + for (r = 0; r < game_board.rows; r++) { + for (c = 0; c < game_board.cols; c++) { + if (game_board.gnd[r][c] >= GAME_MINE_YES) { + for (i = r-1; i < r+2; i++) { + for (j = c-1; j < c+2; j++) { + if (i >= 0 && i < game_board.rows) { + if (j >= 0 && j < game_board.cols) { + game_board.gnd[i][j]++; + } + } + } + } + } + } + } +} + +/* * * * * * * * * * + * * * Step * * * * * * * + * * * * * * * * * */ +static void game_step (int r, int c) +{ + switch (game_board.usr[r][c]) { + case GAME_USR_HIDDEN: + case GAME_USR_POSSIBLE: + game_discover(r, c); + break; + + case GAME_USR_CLEAR: + game_big_step(r, c); + break; + } +} + +static void game_discover (int r, int c) +{ + int safe_fields; + safe_fields = (game_board.rows * game_board.cols) - game_board.mines; + + if (game_board.gnd[r][c] >= GAME_MINE_YES) { + game_board.usr[r][c] = GAME_USR_KBOOM; + game_board.state = GAME_STATE_GAMEOVER; + + } else if (game_board.usr[r][c] != GAME_USR_CLEAR) { + game_board.usr[r][c] = GAME_USR_CLEAR; + game_board.clr++; + + if (game_board.clr == safe_fields) { + game_board.state = GAME_STATE_SAFE; + + } else if (game_board.gnd[r][c] == GAME_MINE_NO) { + game_discover_recursive(r, c); + } + } +} + +static void game_discover_recursive (int r, int c) +{ + int i; + int j; + + for (i = r - 1; i < r + 2; i++) { + for (j = c - 1; j < c + 2; j++) { + if (i >= 0 && i < game_board.rows && + j >= 0 && j < game_board.cols) { + game_discover(i, j); + } + } + } +} + +static void game_big_step (int r, int c) +{ + int cnt; + cnt = game_count_flags(r, c); + + if (cnt && (game_board.gnd[r][c] == cnt)) { + game_step_recursive(r, c); + } +} + +static int game_count_flags (int r, int c) +{ + int cnt; + int i; + int j; + + cnt = 0; + for (i = r - 1; i < r + 2; i++) { + for (j = c - 1; j < c + 2; j++) { + if (i >= 0 && i < game_board.rows && + j >= 0 && j < game_board.cols) { + if (game_board.usr[i][j] == GAME_USR_FLAG) { + cnt++; + } + } + } + } + + return cnt; +} + +static void game_step_recursive (int r, int c) +{ + int i; + int j; + + for (i = r - 1; i < r + 2; i++) { + for (j = c - 1; j < c + 2; j++) { + if (i >= 0 && i < game_board.rows && + j >= 0 && j < game_board.cols) { + switch (game_board.usr[i][j]) { + case GAME_USR_HIDDEN: + case GAME_USR_POSSIBLE: + game_discover(i, j); + break; + } + } + } + } +} + +/* * * * * * * * * * + * * * Flag * * * * * * * + * * * * * * * * * */ +static void game_flag (int r, int c) +{ + switch (game_board.usr[r][c]) { + case GAME_USR_HIDDEN: + game_board.usr[r][c] = GAME_USR_FLAG; + game_board.flags++; + break; + + case GAME_USR_FLAG: + game_board.usr[r][c] = GAME_USR_POSSIBLE; + game_board.flags--; + break; + + case GAME_USR_POSSIBLE: + game_rmflag(r, c); + break; + + case GAME_USR_CLEAR: + game_all_flags(r, c); + break; + } +} + +static void game_possible (int r, int c) +{ + switch (game_board.usr[r][c]) { + case GAME_USR_HIDDEN: + game_board.usr[r][c] = GAME_USR_POSSIBLE; + break; + + case GAME_USR_POSSIBLE: + game_rmflag(r, c); + break; + } +} + +static void game_rmflag (int r, int c) +{ + switch (game_board.usr[r][c]) { + case GAME_USR_FLAG: + game_board.usr[r][c] = GAME_USR_HIDDEN; + game_board.flags--; + break; + + case GAME_USR_POSSIBLE: + game_board.usr[r][c] = GAME_USR_HIDDEN; + break; + } +} + +static void game_all_flags (int r, int c) +{ + int cnt; + cnt = game_count_nclear(r, c); + + if (cnt && (game_board.gnd[r][c] == cnt)) { + game_flag_recursive(r, c); + } +} + +static int game_count_nclear (int r, int c) +{ + int cnt; + int i; + int j; + + cnt = 0; + for (i = r - 1; i < r + 2; i++) { + for (j = c - 1; j < c + 2; j++) { + if (i >= 0 && i < game_board.rows && + j >= 0 && j < game_board.cols) { + if (game_board.usr[i][j] != GAME_USR_CLEAR) { + cnt++; + } + } + } + } + + return cnt; +} + +static void game_flag_recursive (int r, int c) +{ + int i; + int j; + + for (i = r - 1; i < r + 2; i++) { + for (j = c - 1; j < c + 2; j++) { + if (i >= 0 && i < game_board.rows && + j >= 0 && j < game_board.cols) { + switch (game_board.usr[i][j]) { + case GAME_USR_HIDDEN: + case GAME_USR_POSSIBLE: + game_board.usr[i][j] = GAME_USR_FLAG; + game_board.flags++; + break; + } + } + } + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/game/src/game_iface.c b/modules/game/src/game_iface.c index 01e7cfa..d4cc602 100644 --- a/modules/game/src/game_iface.c +++ b/modules/game/src/game_iface.c @@ -1,588 +1,588 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <stdbool.h>
- /* time_t & time() */
- #include <time.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* player_iface() */
- #include "player_iface.h"
- /* save_game_file() */
- #include "save.h"
- /* save_score() */
- #include "score.h"
- /* xyzzy_...() */
- #include "xyzzy.h"
-
- /* game_action() */
- #include "game.h"
-
- #include "game_iface.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-static struct Game_Iface_Out game_iface_out;
-static struct Game_Iface_In game_iface_in;
-static struct Game_Iface_Score game_iface_score;
-static time_t tim_ini;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Init */
-static void game_iface_init_score (int level);
-static void game_iface_init_cheated (void);
- /* Actions */
-static void game_iface_act (void);
-static void game_iface_playing_act (void);
-static void game_iface_xyzzy_act (void);
-static void game_iface_cheated_act (void);
-static void game_iface_pause_act (void);
-static void game_iface_safe_act (void);
-static void game_iface_gameover_act (void);
- /* Actions: game */
-static void game_iface_act_game (void);
- /* Actions: game_iface */
-static void game_iface_pause (void);
-static void game_iface_unpause (void);
-static void game_iface_xyzzy_on (void);
-static void game_iface_xyzzy_off (void);
-static void game_iface_save_score (void);
-static void game_iface_quit (void);
- /* Output */
-static void game_iface_update_out (void);
-static void game_iface_update_board (void);
-static void game_iface_update_vis (int r, int c);
-static void game_iface_update_usr (int r, int c);
- /* Score */
-static void game_iface_update_score (void);
- /* Prepare input */
-static void game_iface_clean_in (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void game_iface_init_rand (int level, int pos_row, int pos_col)
-{
- /* first step */
- game_action(GAME_ACT_STEP, pos_row, pos_col);
-
- game_iface_out.state = GAME_IFACE_STATE_PLAYING;
- game_iface_init_score(level);
-
- game_iface_out.rows = game_board.rows;
- game_iface_out.cols = game_board.cols;
- game_iface_out.mines = game_board.mines;
- game_iface_update_out();
- game_iface_update_score();
- game_iface_clean_in();
-}
-
-void game_iface_init_load (void)
-{
- game_iface_init_cheated();
-
- game_iface_out.rows = game_board.rows;
- game_iface_out.cols = game_board.cols;
- game_iface_out.mines = game_board.mines;
- game_iface_update_out();
- game_iface_clean_in();
-}
-
-void game_iface (void)
-{
- while (game_iface_out.state != GAME_IFACE_STATE_QUIT) {
- game_iface_update_out();
- game_iface_update_score();
- game_iface_clean_in();
-
- player_iface(&game_iface_out, &game_iface_score, &game_iface_in);
-
- game_iface_act();
- }
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Init * * * * * * *
- * * * * * * * * * */
-static void game_iface_init_score (int level)
-{
- game_iface_score.level = level;
- tim_ini = time(NULL);
- game_iface_score.clicks = 1;
-}
-
-static void game_iface_init_cheated (void)
-{
- game_iface_out.state = GAME_IFACE_STATE_CHEATED;
- game_iface_score.level = GAME_IFACE_LEVEL_CUSTOM;
- game_iface_score.time = CHEATED;
- game_iface_score.clicks = CHEATED;
-}
-
-/* * * * * * * * * *
- * * * Actions * * * * * *
- * * * * * * * * * */
-static void game_iface_act (void)
-{
- switch (game_iface_out.state) {
- case GAME_IFACE_STATE_PLAYING:
- game_iface_playing_act();
- break;
-
- case GAME_IFACE_STATE_CHEATED:
- game_iface_cheated_act();
- break;
-
- case GAME_IFACE_STATE_XYZZY:
- game_iface_xyzzy_act();
- break;
-
- case GAME_IFACE_STATE_PAUSE:
- game_iface_pause_act();
- break;
-
- case GAME_IFACE_STATE_SAFE:
- game_iface_safe_act();
- break;
-
- case GAME_IFACE_STATE_GAMEOVER:
- game_iface_gameover_act();
- break;
- }
-}
-
-static void game_iface_playing_act (void)
-{
- switch (game_iface_in.action) {
- case GAME_IFACE_ACT_PLAY:
- game_iface_act_game();
- break;
-
- case GAME_IFACE_ACT_PAUSE:
- game_iface_pause();
- break;
-
- case GAME_IFACE_ACT_XYZZY_ON:
- game_iface_xyzzy_on();
- break;
-
- case GAME_IFACE_ACT_SAVE:
- save_game_file(saved_path);
- break;
-
- case GAME_IFACE_ACT_QUIT:
- game_iface_quit();
- break;
- }
-}
-
-static void game_iface_xyzzy_act (void)
-{
- xyzzy_init();
-
- bool wh;
- wh = true;
- while (wh) {
- switch (game_iface_in.action) {
- case GAME_IFACE_ACT_PLAY:
- game_iface_act_game();
- wh = false;
- break;
-
- case GAME_IFACE_ACT_XYZZY_OFF:
- game_iface_xyzzy_off();
- wh = false;
- break;
-
- case GAME_IFACE_ACT_XYZZY_LIN:
- wh = xyzzy_lin(&game_iface_out, &game_iface_in);
- game_iface_act_game();
- break;
-
- case GAME_IFACE_ACT_XYZZY_P:
- wh = xyzzy_p(&game_iface_out, &game_iface_in);
- game_iface_act_game();
- game_iface_update_out();
- break;
-
- case GAME_IFACE_ACT_SAVE:
- save_game_file(saved_path);
- wh = false;
- break;
-
- case GAME_IFACE_ACT_QUIT:
- game_iface_quit();
- wh = false;
- break;
-
- default:
- wh = false;
- break;
- }
- }
-}
-
-static void game_iface_cheated_act (void)
-{
- switch (game_iface_in.action) {
- case GAME_IFACE_ACT_PLAY:
- game_iface_act_game();
- break;
-
- case GAME_IFACE_ACT_XYZZY_ON:
- game_iface_xyzzy_on();
- break;
-
- case GAME_IFACE_ACT_SAVE:
- save_game_file(saved_path);
- break;
-
- case GAME_IFACE_ACT_QUIT:
- game_iface_quit();
- break;
- }
-}
-
-static void game_iface_pause_act (void)
-{
- switch (game_iface_in.action) {
- case GAME_IFACE_ACT_PAUSE:
- game_iface_unpause();
- break;
-
- case GAME_IFACE_ACT_XYZZY_ON:
- game_iface_xyzzy_on();
- break;
-
- case GAME_IFACE_ACT_SAVE:
- save_game_file(saved_path);
- break;
-
- case GAME_IFACE_ACT_QUIT:
- game_iface_quit();
- break;
- }
-}
-
-static void game_iface_safe_act (void)
-{
- switch (game_iface_in.action) {
- case GAME_IFACE_ACT_SAVE:
- game_iface_save_score();
- game_iface_quit();
- break;
-
- case GAME_IFACE_ACT_QUIT:
- game_iface_quit();
- break;
- }
-}
-
-static void game_iface_gameover_act (void)
-{
- switch (game_iface_in.action) {
- case GAME_IFACE_ACT_QUIT:
- game_iface_quit();
- break;
- }
-}
-
-/* * * * * * * * * *
- * * * Actions: game * * * * *
- * * * * * * * * * */
-static void game_iface_act_game (void)
-{
- int i;
- int j;
-
- for (i = 0; i < game_board.rows; i++) {
- for (j = 0; j < game_board.cols; j++) {
- if (game_iface_in.act_game[i][j]) {
- game_action(game_iface_in.act_game[i][j], i, j);
- game_iface_score.clicks++;
- }
- }
- }
-}
-
-/* * * * * * * * * *
- * * * Actions: game_iface * * * * *
- * * * * * * * * * */
-static void game_iface_pause (void)
-{
- time_t tim_now;
-
- tim_now = time(NULL);
- game_iface_score.time = (int)(tim_now - tim_ini);
- game_iface_out.state = GAME_IFACE_STATE_PAUSE;
-}
-
-static void game_iface_unpause (void)
-{
- time_t tim_now;
-
- tim_now = time(NULL);
- tim_ini = tim_now - (time_t)game_iface_score.time;
- game_iface_out.state = GAME_IFACE_STATE_PLAYING;
-}
-
-static void game_iface_xyzzy_on (void)
-{
- game_iface_out.state = GAME_IFACE_STATE_XYZZY;
-}
-
-static void game_iface_xyzzy_off (void)
-{
- game_iface_out.state = GAME_IFACE_STATE_CHEATED;
-}
-
-static void game_iface_save_score (void)
-{
- /* Save board and score */
- switch (game_iface_score.level) {
- case GAME_IFACE_LEVEL_BEGINNER:
- save_game_file(var_boards_beginner_path);
- save_score(&game_iface_score);
- break;
-
- case GAME_IFACE_LEVEL_INTERMEDIATE:
- save_game_file(var_boards_intermediate_path);
- save_score(&game_iface_score);
- break;
-
- case GAME_IFACE_LEVEL_EXPERT:
- save_game_file(var_boards_expert_path);
- save_score(&game_iface_score);
- break;
-
- case GAME_IFACE_LEVEL_CUSTOM:
- save_game_file(var_boards_custom_path);
- break;
- }
-}
-
-static void game_iface_quit (void)
-{
- game_iface_out.state = GAME_IFACE_STATE_QUIT;
-}
-
-/* * * * * * * * * *
- * * * Output * * * * * *
- * * * * * * * * * */
-static void game_iface_update_out (void)
-{
- game_iface_out.flags = game_board.flags;
- game_iface_out.clr = game_board.clr;
-
- switch (game_board.state) {
- case GAME_STATE_SAFE:
- game_iface_out.state = GAME_IFACE_STATE_SAFE;
- break;
-
- case GAME_STATE_GAMEOVER:
- game_iface_out.state = GAME_IFACE_STATE_GAMEOVER;
- break;
- }
-
- game_iface_update_board();
-}
-
-static void game_iface_update_board (void)
-{
- int i;
- int j;
-
- for (i = 0; i < game_board.rows; i++) {
- for (j = 0; j < game_board.cols; j++) {
- game_iface_update_vis(i, j);
- game_iface_update_usr(i, j);
- }
- }
-}
-
-static void game_iface_update_vis (int r, int c)
-{
- int field_vis;
-
- switch (game_iface_out.state) {
- case GAME_IFACE_STATE_CHEATED:
- case GAME_IFACE_STATE_XYZZY:
- case GAME_IFACE_STATE_PLAYING:
- switch (game_board.usr[r][c]) {
- case GAME_USR_HIDDEN:
- field_vis = GAME_IFACE_VIS_HIDDEN_FIELD;
- break;
-
- case GAME_USR_CLEAR:
- field_vis = GAME_IFACE_VIS_0 + game_board.gnd[r][c];
- break;
-
- case GAME_USR_FLAG:
- field_vis = GAME_IFACE_VIS_FLAG;
- break;
-
- case GAME_USR_POSSIBLE:
- field_vis = GAME_IFACE_VIS_POSSIBLE;
- break;
- }
- break;
-
- case GAME_IFACE_STATE_SAFE:
- switch (game_board.usr[r][c]) {
- case GAME_USR_HIDDEN:
- field_vis = GAME_IFACE_VIS_SAFE_MINE;
- break;
-
- case GAME_USR_CLEAR:
- field_vis = GAME_IFACE_VIS_0 + game_board.gnd[r][c];
- break;
-
- case GAME_USR_FLAG:
- field_vis = GAME_IFACE_VIS_FLAG;
- break;
-
- case GAME_USR_POSSIBLE:
- field_vis = GAME_IFACE_VIS_POSSIBLE;
- break;
- }
- break;
-
- case GAME_IFACE_STATE_GAMEOVER:
- switch (game_board.usr[r][c]) {
- case GAME_USR_KBOOM:
- field_vis = GAME_IFACE_VIS_KBOOM;
- break;
-
- case GAME_USR_HIDDEN:
- if (game_board.gnd[r][c] >= GAME_MINE_YES) {
- field_vis = GAME_IFACE_VIS_HIDDEN_MINE;
- } else {
- field_vis = GAME_IFACE_VIS_HIDDEN_SAFE;
- }
- break;
-
- case GAME_USR_CLEAR:
- field_vis = GAME_IFACE_VIS_0 + game_board.gnd[r][c];
- break;
-
- case GAME_USR_FLAG:
- if (game_board.gnd[r][c] >= GAME_MINE_YES) {
- field_vis = GAME_IFACE_VIS_FLAG;
- } else {
- field_vis = GAME_IFACE_VIS_FLAG_FALSE;
- }
- break;
-
- case GAME_USR_POSSIBLE:
- if (game_board.gnd[r][c] >= GAME_MINE_YES) {
- field_vis = GAME_IFACE_VIS_POSSIBLE;
- } else {
- field_vis = GAME_IFACE_VIS_POSSIBLE_FALSE;
- }
- break;
- }
- break;
-
- default:
- field_vis = GAME_IFACE_VIS_HIDDEN_FIELD;
- break;
- }
-
- game_iface_out.visible[r][c] = field_vis;
-}
-
-static void game_iface_update_usr (int r, int c)
-{
- int field_usr;
-
- switch (game_board.usr[r][c]) {
- case GAME_USR_KBOOM:
- field_usr = GAME_IFACE_USR_KBOOM;
- break;
-
- case GAME_USR_HIDDEN:
- field_usr = GAME_IFACE_USR_HIDDEN;
- break;
-
- case GAME_USR_CLEAR:
- field_usr = GAME_IFACE_USR_CLEAR;
- break;
-
- case GAME_USR_FLAG:
- field_usr = GAME_IFACE_VIS_FLAG;
- break;
-
- case GAME_USR_POSSIBLE:
- field_usr = GAME_IFACE_VIS_POSSIBLE;
- break;
-
- default:
- field_usr = GAME_IFACE_VIS_FOO;
- break;
- }
-
- game_iface_out.usr[r][c] = field_usr;
-}
-
-/* * * * * * * * * *
- * * * Score * * * * * * *
- * * * * * * * * * */
-static void game_iface_update_score (void)
-{
- time_t tim_now;
-
- switch (game_iface_out.state) {
- case GAME_IFACE_STATE_PLAYING:
- tim_now = time(NULL);
- game_iface_score.time = (int)(tim_now - tim_ini);
- break;
-
- case GAME_IFACE_STATE_XYZZY:
- case GAME_IFACE_STATE_CHEATED:
- game_iface_score.level = GAME_IFACE_LEVEL_CUSTOM;
- game_iface_score.time = CHEATED;
- game_iface_score.clicks = CHEATED;
- break;
- }
-}
-
-/* * * * * * * * * *
- * * * Prepare input * * * * * *
- * * * * * * * * * */
-static void game_iface_clean_in (void)
-{
- int i;
- int j;
- for (i = 0; i < game_board.rows; i++) {
- for (j = 0; j < game_board.cols; j++) {
- game_iface_in.act_game[i][j] = GAME_IFACE_GAME_ACT_FOO;
- }
- }
-
- game_iface_in.action = GAME_IFACE_ACT_FOO;
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <stdbool.h> + /* time_t & time() */ + #include <time.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + /* player_iface() */ + #include "player_iface.h" + /* save_game_file() */ + #include "save.h" + /* save_score() */ + #include "score.h" + /* xyzzy_...() */ + #include "xyzzy.h" + + /* game_action() */ + #include "game.h" + + #include "game_iface.h" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +static struct Game_Iface_Out game_iface_out; +static struct Game_Iface_In game_iface_in; +static struct Game_Iface_Score game_iface_score; +static time_t tim_ini; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Init */ +static void game_iface_init_score (int level); +static void game_iface_init_cheated (void); + /* Actions */ +static void game_iface_act (void); +static void game_iface_playing_act (void); +static void game_iface_xyzzy_act (void); +static void game_iface_cheated_act (void); +static void game_iface_pause_act (void); +static void game_iface_safe_act (void); +static void game_iface_gameover_act (void); + /* Actions: game */ +static void game_iface_act_game (void); + /* Actions: game_iface */ +static void game_iface_pause (void); +static void game_iface_unpause (void); +static void game_iface_xyzzy_on (void); +static void game_iface_xyzzy_off (void); +static void game_iface_save_score (void); +static void game_iface_quit (void); + /* Output */ +static void game_iface_update_out (void); +static void game_iface_update_board (void); +static void game_iface_update_vis (int r, int c); +static void game_iface_update_usr (int r, int c); + /* Score */ +static void game_iface_update_score (void); + /* Prepare input */ +static void game_iface_clean_in (void); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void game_iface_init_rand (int level, int pos_row, int pos_col) +{ + /* first step */ + game_action(GAME_ACT_STEP, pos_row, pos_col); + + game_iface_out.state = GAME_IFACE_STATE_PLAYING; + game_iface_init_score(level); + + game_iface_out.rows = game_board.rows; + game_iface_out.cols = game_board.cols; + game_iface_out.mines = game_board.mines; + game_iface_update_out(); + game_iface_update_score(); + game_iface_clean_in(); +} + +void game_iface_init_load (void) +{ + game_iface_init_cheated(); + + game_iface_out.rows = game_board.rows; + game_iface_out.cols = game_board.cols; + game_iface_out.mines = game_board.mines; + game_iface_update_out(); + game_iface_clean_in(); +} + +void game_iface (void) +{ + while (game_iface_out.state != GAME_IFACE_STATE_QUIT) { + game_iface_update_out(); + game_iface_update_score(); + game_iface_clean_in(); + + player_iface(&game_iface_out, &game_iface_score, &game_iface_in); + + game_iface_act(); + } +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Init * * * * * * * + * * * * * * * * * */ +static void game_iface_init_score (int level) +{ + game_iface_score.level = level; + tim_ini = time(NULL); + game_iface_score.clicks = 1; +} + +static void game_iface_init_cheated (void) +{ + game_iface_out.state = GAME_IFACE_STATE_CHEATED; + game_iface_score.level = GAME_IFACE_LEVEL_CUSTOM; + game_iface_score.time = CHEATED; + game_iface_score.clicks = CHEATED; +} + +/* * * * * * * * * * + * * * Actions * * * * * * + * * * * * * * * * */ +static void game_iface_act (void) +{ + switch (game_iface_out.state) { + case GAME_IFACE_STATE_PLAYING: + game_iface_playing_act(); + break; + + case GAME_IFACE_STATE_CHEATED: + game_iface_cheated_act(); + break; + + case GAME_IFACE_STATE_XYZZY: + game_iface_xyzzy_act(); + break; + + case GAME_IFACE_STATE_PAUSE: + game_iface_pause_act(); + break; + + case GAME_IFACE_STATE_SAFE: + game_iface_safe_act(); + break; + + case GAME_IFACE_STATE_GAMEOVER: + game_iface_gameover_act(); + break; + } +} + +static void game_iface_playing_act (void) +{ + switch (game_iface_in.action) { + case GAME_IFACE_ACT_PLAY: + game_iface_act_game(); + break; + + case GAME_IFACE_ACT_PAUSE: + game_iface_pause(); + break; + + case GAME_IFACE_ACT_XYZZY_ON: + game_iface_xyzzy_on(); + break; + + case GAME_IFACE_ACT_SAVE: + save_game_file(saved_path); + break; + + case GAME_IFACE_ACT_QUIT: + game_iface_quit(); + break; + } +} + +static void game_iface_xyzzy_act (void) +{ + xyzzy_init(); + + bool wh; + wh = true; + while (wh) { + switch (game_iface_in.action) { + case GAME_IFACE_ACT_PLAY: + game_iface_act_game(); + wh = false; + break; + + case GAME_IFACE_ACT_XYZZY_OFF: + game_iface_xyzzy_off(); + wh = false; + break; + + case GAME_IFACE_ACT_XYZZY_LIN: + wh = xyzzy_lin(&game_iface_out, &game_iface_in); + game_iface_act_game(); + break; + + case GAME_IFACE_ACT_XYZZY_P: + wh = xyzzy_p(&game_iface_out, &game_iface_in); + game_iface_act_game(); + game_iface_update_out(); + break; + + case GAME_IFACE_ACT_SAVE: + save_game_file(saved_path); + wh = false; + break; + + case GAME_IFACE_ACT_QUIT: + game_iface_quit(); + wh = false; + break; + + default: + wh = false; + break; + } + } +} + +static void game_iface_cheated_act (void) +{ + switch (game_iface_in.action) { + case GAME_IFACE_ACT_PLAY: + game_iface_act_game(); + break; + + case GAME_IFACE_ACT_XYZZY_ON: + game_iface_xyzzy_on(); + break; + + case GAME_IFACE_ACT_SAVE: + save_game_file(saved_path); + break; + + case GAME_IFACE_ACT_QUIT: + game_iface_quit(); + break; + } +} + +static void game_iface_pause_act (void) +{ + switch (game_iface_in.action) { + case GAME_IFACE_ACT_PAUSE: + game_iface_unpause(); + break; + + case GAME_IFACE_ACT_XYZZY_ON: + game_iface_xyzzy_on(); + break; + + case GAME_IFACE_ACT_SAVE: + save_game_file(saved_path); + break; + + case GAME_IFACE_ACT_QUIT: + game_iface_quit(); + break; + } +} + +static void game_iface_safe_act (void) +{ + switch (game_iface_in.action) { + case GAME_IFACE_ACT_SAVE: + game_iface_save_score(); + game_iface_quit(); + break; + + case GAME_IFACE_ACT_QUIT: + game_iface_quit(); + break; + } +} + +static void game_iface_gameover_act (void) +{ + switch (game_iface_in.action) { + case GAME_IFACE_ACT_QUIT: + game_iface_quit(); + break; + } +} + +/* * * * * * * * * * + * * * Actions: game * * * * * + * * * * * * * * * */ +static void game_iface_act_game (void) +{ + int i; + int j; + + for (i = 0; i < game_board.rows; i++) { + for (j = 0; j < game_board.cols; j++) { + if (game_iface_in.act_game[i][j]) { + game_action(game_iface_in.act_game[i][j], i, j); + game_iface_score.clicks++; + } + } + } +} + +/* * * * * * * * * * + * * * Actions: game_iface * * * * * + * * * * * * * * * */ +static void game_iface_pause (void) +{ + time_t tim_now; + + tim_now = time(NULL); + game_iface_score.time = (int)(tim_now - tim_ini); + game_iface_out.state = GAME_IFACE_STATE_PAUSE; +} + +static void game_iface_unpause (void) +{ + time_t tim_now; + + tim_now = time(NULL); + tim_ini = tim_now - (time_t)game_iface_score.time; + game_iface_out.state = GAME_IFACE_STATE_PLAYING; +} + +static void game_iface_xyzzy_on (void) +{ + game_iface_out.state = GAME_IFACE_STATE_XYZZY; +} + +static void game_iface_xyzzy_off (void) +{ + game_iface_out.state = GAME_IFACE_STATE_CHEATED; +} + +static void game_iface_save_score (void) +{ + /* Save board and score */ + switch (game_iface_score.level) { + case GAME_IFACE_LEVEL_BEGINNER: + save_game_file(var_boards_beginner_path); + save_score(&game_iface_score); + break; + + case GAME_IFACE_LEVEL_INTERMEDIATE: + save_game_file(var_boards_intermediate_path); + save_score(&game_iface_score); + break; + + case GAME_IFACE_LEVEL_EXPERT: + save_game_file(var_boards_expert_path); + save_score(&game_iface_score); + break; + + case GAME_IFACE_LEVEL_CUSTOM: + save_game_file(var_boards_custom_path); + break; + } +} + +static void game_iface_quit (void) +{ + game_iface_out.state = GAME_IFACE_STATE_QUIT; +} + +/* * * * * * * * * * + * * * Output * * * * * * + * * * * * * * * * */ +static void game_iface_update_out (void) +{ + game_iface_out.flags = game_board.flags; + game_iface_out.clr = game_board.clr; + + switch (game_board.state) { + case GAME_STATE_SAFE: + game_iface_out.state = GAME_IFACE_STATE_SAFE; + break; + + case GAME_STATE_GAMEOVER: + game_iface_out.state = GAME_IFACE_STATE_GAMEOVER; + break; + } + + game_iface_update_board(); +} + +static void game_iface_update_board (void) +{ + int i; + int j; + + for (i = 0; i < game_board.rows; i++) { + for (j = 0; j < game_board.cols; j++) { + game_iface_update_vis(i, j); + game_iface_update_usr(i, j); + } + } +} + +static void game_iface_update_vis (int r, int c) +{ + int field_vis; + + switch (game_iface_out.state) { + case GAME_IFACE_STATE_CHEATED: + case GAME_IFACE_STATE_XYZZY: + case GAME_IFACE_STATE_PLAYING: + switch (game_board.usr[r][c]) { + case GAME_USR_HIDDEN: + field_vis = GAME_IFACE_VIS_HIDDEN_FIELD; + break; + + case GAME_USR_CLEAR: + field_vis = GAME_IFACE_VIS_0 + game_board.gnd[r][c]; + break; + + case GAME_USR_FLAG: + field_vis = GAME_IFACE_VIS_FLAG; + break; + + case GAME_USR_POSSIBLE: + field_vis = GAME_IFACE_VIS_POSSIBLE; + break; + } + break; + + case GAME_IFACE_STATE_SAFE: + switch (game_board.usr[r][c]) { + case GAME_USR_HIDDEN: + field_vis = GAME_IFACE_VIS_SAFE_MINE; + break; + + case GAME_USR_CLEAR: + field_vis = GAME_IFACE_VIS_0 + game_board.gnd[r][c]; + break; + + case GAME_USR_FLAG: + field_vis = GAME_IFACE_VIS_FLAG; + break; + + case GAME_USR_POSSIBLE: + field_vis = GAME_IFACE_VIS_POSSIBLE; + break; + } + break; + + case GAME_IFACE_STATE_GAMEOVER: + switch (game_board.usr[r][c]) { + case GAME_USR_KBOOM: + field_vis = GAME_IFACE_VIS_KBOOM; + break; + + case GAME_USR_HIDDEN: + if (game_board.gnd[r][c] >= GAME_MINE_YES) { + field_vis = GAME_IFACE_VIS_HIDDEN_MINE; + } else { + field_vis = GAME_IFACE_VIS_HIDDEN_SAFE; + } + break; + + case GAME_USR_CLEAR: + field_vis = GAME_IFACE_VIS_0 + game_board.gnd[r][c]; + break; + + case GAME_USR_FLAG: + if (game_board.gnd[r][c] >= GAME_MINE_YES) { + field_vis = GAME_IFACE_VIS_FLAG; + } else { + field_vis = GAME_IFACE_VIS_FLAG_FALSE; + } + break; + + case GAME_USR_POSSIBLE: + if (game_board.gnd[r][c] >= GAME_MINE_YES) { + field_vis = GAME_IFACE_VIS_POSSIBLE; + } else { + field_vis = GAME_IFACE_VIS_POSSIBLE_FALSE; + } + break; + } + break; + + default: + field_vis = GAME_IFACE_VIS_HIDDEN_FIELD; + break; + } + + game_iface_out.visible[r][c] = field_vis; +} + +static void game_iface_update_usr (int r, int c) +{ + int field_usr; + + switch (game_board.usr[r][c]) { + case GAME_USR_KBOOM: + field_usr = GAME_IFACE_USR_KBOOM; + break; + + case GAME_USR_HIDDEN: + field_usr = GAME_IFACE_USR_HIDDEN; + break; + + case GAME_USR_CLEAR: + field_usr = GAME_IFACE_USR_CLEAR; + break; + + case GAME_USR_FLAG: + field_usr = GAME_IFACE_VIS_FLAG; + break; + + case GAME_USR_POSSIBLE: + field_usr = GAME_IFACE_VIS_POSSIBLE; + break; + + default: + field_usr = GAME_IFACE_VIS_FOO; + break; + } + + game_iface_out.usr[r][c] = field_usr; +} + +/* * * * * * * * * * + * * * Score * * * * * * * + * * * * * * * * * */ +static void game_iface_update_score (void) +{ + time_t tim_now; + + switch (game_iface_out.state) { + case GAME_IFACE_STATE_PLAYING: + tim_now = time(NULL); + game_iface_score.time = (int)(tim_now - tim_ini); + break; + + case GAME_IFACE_STATE_XYZZY: + case GAME_IFACE_STATE_CHEATED: + game_iface_score.level = GAME_IFACE_LEVEL_CUSTOM; + game_iface_score.time = CHEATED; + game_iface_score.clicks = CHEATED; + break; + } +} + +/* * * * * * * * * * + * * * Prepare input * * * * * * + * * * * * * * * * */ +static void game_iface_clean_in (void) +{ + int i; + int j; + for (i = 0; i < game_board.rows; i++) { + for (j = 0; j < game_board.cols; j++) { + game_iface_in.act_game[i][j] = GAME_IFACE_GAME_ACT_FOO; + } + } + + game_iface_in.action = GAME_IFACE_ACT_FOO; +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/inc/menu_clui.h b/modules/menu/inc/menu_clui.h index fb3d20f..69060a5 100644 --- a/modules/menu/inc/menu_clui.h +++ b/modules/menu/inc/menu_clui.h @@ -1,27 +1,27 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_MENU_CLUI_H
- # define MSW_MENU_CLUI_H
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void menu_clui (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* menu_clui.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_MENU_CLUI_H + # define MSW_MENU_CLUI_H + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ + void menu_clui (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* menu_clui.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/inc/menu_gui.h b/modules/menu/inc/menu_gui.h index c605842..4269cdc 100644 --- a/modules/menu/inc/menu_gui.h +++ b/modules/menu/inc/menu_gui.h @@ -1,56 +1,56 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_MENU_GUI_H
- # define MSW_MENU_GUI_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* GtkWidget */
- #include <gtk/gtk.h>
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define ROWS_GUI_MAX (22)
-#if (ROWS_GUI_MAX > ROWS_MAX)
-# error "rows max (gui)"
-#endif
-
- # define COLS_GUI_MAX (33)
-#if (COLS_GUI_MAX > COLS_MAX)
-# error "cols max (gui)"
-#endif
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern GtkWidget *window_gui;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void menu_gui_init (void);
- void menu_gui_cleanup (void);
- void menu_gui (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* menu_gui.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_MENU_GUI_H + # define MSW_MENU_GUI_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* GtkWidget */ + #include <gtk/gtk.h> + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define ROWS_GUI_MAX (22) +#if (ROWS_GUI_MAX > ROWS_MAX) +# error "rows max (gui)" +#endif + + # define COLS_GUI_MAX (33) +#if (COLS_GUI_MAX > COLS_MAX) +# error "cols max (gui)" +#endif + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern GtkWidget *window_gui; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ + void menu_gui_init (void); + void menu_gui_cleanup (void); + void menu_gui (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* menu_gui.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/inc/menu_iface.h b/modules/menu/inc/menu_iface.h index 481e6cb..83eeead 100644 --- a/modules/menu/inc/menu_iface.h +++ b/modules/menu/inc/menu_iface.h @@ -1,67 +1,67 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_MENU_IFACE_H
- # define MSW_MENU_IFACE_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- #include <stdbool.h>
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Menu_Iface_Mode {
- MENU_IFACE_FOO = 0,
- MENU_IFACE_CLUI,
- MENU_IFACE_TUI,
- MENU_IFACE_GUI
- };
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
- struct Menu_Iface_Variables {
- int level;
- int rows;
- int cols;
- double p;
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern bool flag_exit;
-extern int menu_iface_mode;
-extern struct Menu_Iface_Variables menu_iface_variables;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void menu_iface_init (void);
-void menu_iface_init_iface (void);
-void menu_iface_cleanup (void);
-void menu_iface_board (int *level, int *rows, int *cols, int *mines);
-void menu_iface (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* menu_iface.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_MENU_IFACE_H + # define MSW_MENU_IFACE_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + #include <stdbool.h> + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Menu_Iface_Mode { + MENU_IFACE_FOO = 0, + MENU_IFACE_CLUI, + MENU_IFACE_TUI, + MENU_IFACE_GUI + }; + + +/****************************************************************************** + ******* structs ************************************************************** + ******************************************************************************/ + struct Menu_Iface_Variables { + int level; + int rows; + int cols; + double p; + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern bool flag_exit; +extern int menu_iface_mode; +extern struct Menu_Iface_Variables menu_iface_variables; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void menu_iface_init (void); +void menu_iface_init_iface (void); +void menu_iface_cleanup (void); +void menu_iface_board (int *level, int *rows, int *cols, int *mines); +void menu_iface (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* menu_iface.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/inc/menu_tui.h b/modules/menu/inc/menu_tui.h index c02a183..71e3104 100644 --- a/modules/menu/inc/menu_tui.h +++ b/modules/menu/inc/menu_tui.h @@ -1,27 +1,27 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_MENU_TUI_H
- # define MSW_MENU_TUI_H
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void menu_tui (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* menu_tui.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_MENU_TUI_H + # define MSW_MENU_TUI_H + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ + void menu_tui (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* menu_tui.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/inc/parser.h b/modules/menu/inc/parser.h index d498a6f..38fac23 100644 --- a/modules/menu/inc/parser.h +++ b/modules/menu/inc/parser.h @@ -1,27 +1,27 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_PARSER_H
- # define MSW_PARSER_H
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void parser (int argc, char *argv[]);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* parser.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_PARSER_H + # define MSW_PARSER_H + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void parser (int argc, char *argv[]); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* parser.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/src/menu_clui.c b/modules/menu/src/menu_clui.c index dacd569..e7c057b 100644 --- a/modules/menu/src/menu_clui.c +++ b/modules/menu/src/menu_clui.c @@ -1,208 +1,208 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* INFINITY */
- #include <math.h>
- /* srand() */
- #include <stdlib.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- #include "alx_input.h"
-
- #include "about.h"
- #include "game_iface.h"
-// #include "save.h"
- #include "start.h"
-
- #include "menu_iface.h"
-
- #include "menu_clui.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define ROWS_CLUI_MAX (99)
-#if (ROWS_CLUI_MAX > ROWS_MAX)
-# error "rows max (clui)"
-#endif
-
- # define COLS_CLUI_MAX (26)
-#if (COLS_CLUI_MAX > COLS_MAX)
-# error "cols max (clui)"
-#endif
-
- # define BUFF_SIZE (1024)
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void menu_clui_rand (void);
-static void menu_clui_custom (void);
-static void menu_clui_load (void);
-static void menu_clui_start (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void menu_clui (void)
-{
- char buff [BUFF_SIZE];
- char ch;
-
- ch = 'n';
- printf("Read 'Disclaimer of warranty'? (yes/NO): ");
- fgets(buff, BUFF_SIZE, stdin);
- sscanf(buff, " %c", &ch);
- if (ch == 'y' || ch == 'Y') {
- puts (" >yes");
- print_share_file(SHARE_DISCLAIMER);
- } else {
- puts (" >NO");
- }
-
- ch = 'n';
- printf("Read 'License'? (yes/NO): ");
- fgets(buff, BUFF_SIZE, stdin);
- sscanf(buff, " %c", &ch);
- if (ch == 'y' || ch == 'Y') {
- puts (" >yes");
- print_share_file(SHARE_LICENSE);
- } else {
- puts (" >NO");
- }
-#if 0
- printf("Game interface? (NCURSES/text): ");
- scanf(" %c%*s ", &ch);
- if (ch == 't' || ch == 'T') {
- puts (" >text");
- // FIXME
- } else {
- puts (" >NCURSES");
- // FIXME
- }
-#endif
- ch = 'n';
- printf("New game or load game? (NEW/load): ");
- fgets(buff, BUFF_SIZE, stdin);
- sscanf(buff, " %c", &ch);
- if (ch == 'l' || ch == 'L') {
- puts (" >load");
- menu_clui_load();
- } else {
- puts (" >NEW");
- menu_clui_rand();
- }
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void menu_clui_rand (void)
-{
- /* Random */
- start_mode = START_RAND;
-
- char buff [BUFF_SIZE];
- char ch;
-
- ch = 'n';
- printf("Set seed for random generator? (yes/NO): ");
- fgets(buff, BUFF_SIZE, stdin);
- sscanf(buff, " %c", &ch);
- int seed;
- if (ch == 'y' || ch == 'Y') {
- puts (" >yes");
- seed = alx_getint(-INFINITY, 1, INFINITY, "Seed:", NULL);
- srand(seed);
- } else {
- puts (" >NO");
- }
-
- ch = 'b';
- printf("Level? (BEGINNER/intermediate/(expert)/custom): ");
- fgets(buff, BUFF_SIZE, stdin);
- sscanf(buff, " %c", &ch);
- if (ch == 'i' || ch == 'I') {
- puts (" >intermediate");
- menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE;
- menu_clui_start();
- } else if (ch == 'e' || ch == 'E') {
- puts (" >expert");
- menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT_INV;
- menu_clui_start();
-
- } else if (ch == 'c' || ch == 'C') {
- puts (" >custom");
- menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM;
- menu_clui_custom();
- } else {
- puts (" >BEGINNER");
- menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER;
- menu_clui_start();
- }
-}
-
-static void menu_clui_custom (void)
-{
- /* Random */
- start_mode = START_RAND;
-
- menu_iface_variables.rows = alx_getint(2, menu_iface_variables.rows, ROWS_CLUI_MAX, "Rows:", NULL);
- menu_iface_variables.cols = alx_getint(2, menu_iface_variables.cols, COLS_CLUI_MAX, "Columns:", NULL);
- menu_iface_variables.p = alx_getdbl(0, menu_iface_variables.p, 1, "Proportion:", NULL);
-
- menu_clui_start();
-}
-
-static void menu_clui_load (void)
-{
- /* Load */
- start_mode = START_LOAD;
-#if 0
- /* File name */ // FIXME
- alx_w_getfname(USER_SAVED_DIR, saved_name, "File name:", saved_name, NULL);
-#endif
- menu_clui_start();
-}
-
-static void menu_clui_start (void)
-{
- puts(" >>START:");
- start_switch();
-
- char buff [BUFF_SIZE];
- char ch;
-
- ch = 'm';
- printf("Play again? (MENU/play/exit): ");
- fgets(buff, BUFF_SIZE, stdin);
- sscanf(buff, " %c", &ch);
- if (ch == 'p' || ch == 'P') {
- puts (" >play");
- menu_clui_start();
- } else if (ch == 'e' || ch == 'E') {
- puts (" >exit!");
- } else {
- puts (" >MENU");
- menu_clui();
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + /* INFINITY */ + #include <math.h> + /* srand() */ + #include <stdlib.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + #include "alx_input.h" + + #include "about.h" + #include "game_iface.h" +// #include "save.h" + #include "start.h" + + #include "menu_iface.h" + + #include "menu_clui.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define ROWS_CLUI_MAX (99) +#if (ROWS_CLUI_MAX > ROWS_MAX) +# error "rows max (clui)" +#endif + + # define COLS_CLUI_MAX (26) +#if (COLS_CLUI_MAX > COLS_MAX) +# error "cols max (clui)" +#endif + + # define BUFF_SIZE (1024) + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void menu_clui_rand (void); +static void menu_clui_custom (void); +static void menu_clui_load (void); +static void menu_clui_start (void); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void menu_clui (void) +{ + char buff [BUFF_SIZE]; + char ch; + + ch = 'n'; + printf("Read 'Disclaimer of warranty'? (yes/NO): "); + fgets(buff, BUFF_SIZE, stdin); + sscanf(buff, " %c", &ch); + if (ch == 'y' || ch == 'Y') { + puts (" >yes"); + print_share_file(SHARE_DISCLAIMER); + } else { + puts (" >NO"); + } + + ch = 'n'; + printf("Read 'License'? (yes/NO): "); + fgets(buff, BUFF_SIZE, stdin); + sscanf(buff, " %c", &ch); + if (ch == 'y' || ch == 'Y') { + puts (" >yes"); + print_share_file(SHARE_LICENSE); + } else { + puts (" >NO"); + } +#if 0 + printf("Game interface? (NCURSES/text): "); + scanf(" %c%*s ", &ch); + if (ch == 't' || ch == 'T') { + puts (" >text"); + // FIXME + } else { + puts (" >NCURSES"); + // FIXME + } +#endif + ch = 'n'; + printf("New game or load game? (NEW/load): "); + fgets(buff, BUFF_SIZE, stdin); + sscanf(buff, " %c", &ch); + if (ch == 'l' || ch == 'L') { + puts (" >load"); + menu_clui_load(); + } else { + puts (" >NEW"); + menu_clui_rand(); + } +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void menu_clui_rand (void) +{ + /* Random */ + start_mode = START_RAND; + + char buff [BUFF_SIZE]; + char ch; + + ch = 'n'; + printf("Set seed for random generator? (yes/NO): "); + fgets(buff, BUFF_SIZE, stdin); + sscanf(buff, " %c", &ch); + int seed; + if (ch == 'y' || ch == 'Y') { + puts (" >yes"); + seed = alx_getint(-INFINITY, 1, INFINITY, "Seed:", NULL); + srand(seed); + } else { + puts (" >NO"); + } + + ch = 'b'; + printf("Level? (BEGINNER/intermediate/(expert)/custom): "); + fgets(buff, BUFF_SIZE, stdin); + sscanf(buff, " %c", &ch); + if (ch == 'i' || ch == 'I') { + puts (" >intermediate"); + menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE; + menu_clui_start(); + } else if (ch == 'e' || ch == 'E') { + puts (" >expert"); + menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT_INV; + menu_clui_start(); + + } else if (ch == 'c' || ch == 'C') { + puts (" >custom"); + menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM; + menu_clui_custom(); + } else { + puts (" >BEGINNER"); + menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER; + menu_clui_start(); + } +} + +static void menu_clui_custom (void) +{ + /* Random */ + start_mode = START_RAND; + + menu_iface_variables.rows = alx_getint(2, menu_iface_variables.rows, ROWS_CLUI_MAX, "Rows:", NULL); + menu_iface_variables.cols = alx_getint(2, menu_iface_variables.cols, COLS_CLUI_MAX, "Columns:", NULL); + menu_iface_variables.p = alx_getdbl(0, menu_iface_variables.p, 1, "Proportion:", NULL); + + menu_clui_start(); +} + +static void menu_clui_load (void) +{ + /* Load */ + start_mode = START_LOAD; +#if 0 + /* File name */ // FIXME + alx_w_getfname(USER_SAVED_DIR, saved_name, "File name:", saved_name, NULL); +#endif + menu_clui_start(); +} + +static void menu_clui_start (void) +{ + puts(" >>START:"); + start_switch(); + + char buff [BUFF_SIZE]; + char ch; + + ch = 'm'; + printf("Play again? (MENU/play/exit): "); + fgets(buff, BUFF_SIZE, stdin); + sscanf(buff, " %c", &ch); + if (ch == 'p' || ch == 'P') { + puts (" >play"); + menu_clui_start(); + } else if (ch == 'e' || ch == 'E') { + puts (" >exit!"); + } else { + puts (" >MENU"); + menu_clui(); + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/src/menu_gui.c b/modules/menu/src/menu_gui.c index 451fb7f..fbd684b 100644 --- a/modules/menu/src/menu_gui.c +++ b/modules/menu/src/menu_gui.c @@ -1,998 +1,1003 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <gtk/gtk.h>
- /* INFINITY */
- #include <math.h>
- /* true & false */
- #include <stdbool.h>
- /* snprintf() */
- #include <stdio.h>
- /* srand() */
- #include <stdlib.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- #include "alx_input.h"
-
- #include "about.h"
- #include "game_iface.h"
- #include "save.h"
- #include "score.h"
- #include "start.h"
-
- #include "menu_iface.h"
-
- #include "menu_gui.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define LINE_SIZE (80)
- # define BUFF_SIZE_TEXT (1048576)
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
-struct Button_Data {
- GtkWidget *ptr;
- char text [LINE_SIZE];
- int num;
- int *sw;
-};
-
-struct Label_Data {
- GtkWidget *ptr;
- char text [LINE_SIZE];
-};
-
-struct Entry_dbl_Data {
- GtkWidget *ptr;
- struct Label_Data lbl;
- double *num;
- double min;
- double def;
- double max;
-};
-
-struct Entry_int_Data {
- GtkWidget *ptr;
- struct Label_Data lbl;
- int *num;
- double min;
- int64_t def;
- double max;
-};
-
-struct Entry_fname_Data {
- GtkWidget *ptr;
- struct Label_Data lbl;
- const char *fpath;
- char *fname;
-};
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Global * * * * * *
- * * * * * * * * * */
- GtkWidget *window_gui;
-
-/* * * * * * * * * *
- * * * Static * * * * * *
- * * * * * * * * * */
-static GtkWidget *box;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Init & cleanup */
-static gboolean delete_window (GtkWidget *widget,
- GdkEvent *event,
- void *data);
-static void destroy_window (GtkWidget *widget,
- void *data);
- /* Selection */
-static void callback_button (GtkWidget *widget,
- void *data);
- /* Entries */
-static void callback_entry_dbl (GtkWidget *widget,
- void *data);
-static void callback_entry_int (GtkWidget *widget,
- void *data);
- /* Text */
-static void menu_gui_disclaim (void);
-static void menu_gui_license (void);
-static void menu_gui_hiscores (void);
- /* Submenus */
-static void menu_gui_continue (void);
-static void menu_gui_select (void);
-static void menu_gui_level (void);
-static void menu_gui_custom (void);
-static void menu_gui_devel (void);
-static void menu_gui_verbose (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void menu_gui_init (void)
-{
- /* Window */
- window_gui = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- /* Quit */
- g_signal_connect(window_gui, "delete-event", G_CALLBACK(delete_window), NULL);
- g_signal_connect(window_gui, "destroy", G_CALLBACK(destroy_window), NULL);
-
- /* Title. PROG_VERSION defined in Makefile */
- char title [LINE_SIZE];
- snprintf(title, LINE_SIZE, "mine-sweeper %s", PROG_VERSION);
- gtk_window_set_title(GTK_WINDOW(window_gui), title);
-
- /* Border */
- gtk_container_set_border_width(GTK_CONTAINER(window_gui), 20);
-}
-
-void menu_gui_cleanup (void)
-{
- /* Destroy window */
- gtk_widget_destroy(window_gui);
-}
-
-void menu_gui (void)
-{
- bool wh;
- int sw;
- GtkWidget *separator[3];
- struct Label_Data label;
- struct Button_Data button [4];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Main menu");
- snprintf(button[1].text, LINE_SIZE, "[_1] Continue");
- snprintf(button[2].text, LINE_SIZE, "[_2] Disclaimer of warranty");
- snprintf(button[3].text, LINE_SIZE, "[_3] Terms and conditions");
- snprintf(button[0].text, LINE_SIZE, "[_0] Exit program");
-
- /* Data */
- button[1].num = 1;
- button[2].num = 2;
- button[3].num = 3;
- button[0].num = 0;
- button[1].sw = &sw;
- button[2].sw = &sw;
- button[3].sw = &sw;
- button[0].sw = &sw;
-
- /* Menu loop */
- wh = true;
- while (wh) {
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- button[1].ptr = gtk_button_new_with_mnemonic(button[1].text);
- separator[1] = gtk_hseparator_new();
- button[2].ptr = gtk_button_new_with_mnemonic(button[2].text);
- button[3].ptr = gtk_button_new_with_mnemonic(button[3].text);
- separator[2] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[1].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[1]);
- g_signal_connect(button[2].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[2]);
- g_signal_connect(button[3].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[3]);
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- sw = -1;
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-
- /* Selection */
- switch (sw) {
- case 0:
- wh = false;
- break;
- case 1:
- menu_gui_continue();
- break;
- case 2:
- menu_gui_disclaim();
- break;
- case 3:
- menu_gui_license();
- break;
- }
- }
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * Cleanup * * * * * *
- * * * * * * * * * */
-static gboolean delete_window (GtkWidget *widget,
- GdkEvent *event,
- void *data)
-{
- gtk_main_quit();
-
- /* false: send destroy signal */
- return false;
-}
-
-static void destroy_window (GtkWidget *widget,
- void *data)
-{
- exit(EXIT_SUCCESS);
-}
-
-/* * * * * * * * * *
- * * Selection * * * * * *
- * * * * * * * * * */
-static void callback_button (GtkWidget *widget,
- void *data)
-{
- struct Button_Data *button;
-
- button = ((struct Button_Data *)data);
-
- *(button->sw) = button->num;
-
- gtk_main_quit();
-}
-
-/* * * * * * * * * *
- * * Entries * * * * * * *
- * * * * * * * * * */
-static void callback_entry_dbl (GtkWidget *widget,
- void *data)
-{
- struct Entry_dbl_Data *entry;
- const char *str;
- int err;
- char buff [LINE_SIZE];
-
- entry = ((struct Entry_dbl_Data *)data);
-
- str = gtk_entry_get_text(GTK_ENTRY(entry->ptr));
- err = alx_sscan_dbl(entry->num, entry->min, entry->def, entry->max, str);
-
- if (err) {
- snprintf(buff, LINE_SIZE, "Error %i", err);
- gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff);
- gtk_editable_select_region(GTK_EDITABLE(entry->ptr),
- 0, GTK_ENTRY(entry->ptr)->text_length);
- }
-
- gtk_main_quit();
-}
-
-static void callback_entry_int (GtkWidget *widget,
- void *data)
-{
- struct Entry_int_Data *entry;
- const char *str;
- int err;
- int64_t Z;
- char buff [LINE_SIZE];
-
- entry = ((struct Entry_int_Data *)data);
-
- str = gtk_entry_get_text(GTK_ENTRY(entry->ptr));
- err = alx_sscan_int64(&Z, entry->min, entry->def, entry->max, str);
-
- if (err) {
- snprintf(buff, LINE_SIZE, "Error %i", err);
- gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff);
- gtk_editable_select_region(GTK_EDITABLE(entry->ptr),
- 0, GTK_ENTRY(entry->ptr)->text_length);
- } else {
- *(entry->num) = Z;
- }
-
- gtk_main_quit();
-}
-
-static void callback_entry_fname (GtkWidget *widget,
- void *data)
-{
- struct Entry_fname_Data *entry;
- const char *str;
- int err;
- char buff [LINE_SIZE];
-
- entry = ((struct Entry_fname_Data *)data);
-
- str = gtk_entry_get_text(GTK_ENTRY(entry->ptr));
- err = alx_sscan_fname(entry->fpath, entry->fname, true, str);
-
- if (err) {
- snprintf(buff, LINE_SIZE, "Error %i", err);
- gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff);
- gtk_editable_select_region(GTK_EDITABLE(entry->ptr),
- 0, GTK_ENTRY(entry->ptr)->text_length);
- }
-
- gtk_main_quit();
-}
-
-/* * * * * * * * * *
- * * Text * * * * * * *
- * * * * * * * * * */
-static void menu_gui_disclaim (void)
-{
- int sw;
- GtkWidget *separator[2];
- struct Label_Data label;
- struct Button_Data button [1];
- GtkWidget *label_file;
- char label_file_txt [BUFF_SIZE_TEXT];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Disclaimer of warranty");
- snprint_share_file(label_file_txt, BUFF_SIZE_TEXT, SHARE_DISCLAIMER);
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- button[0].num = 0;
- button[0].sw = &sw;
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- label_file = gtk_label_new(label_file_txt);
- separator[1] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), label_file, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-}
-
-static void menu_gui_license (void)
-{
- int sw;
- GtkWidget *separator[2];
- struct Label_Data label;
- struct Button_Data button [1];
- GtkWidget *label_file;
- char label_file_txt [BUFF_SIZE_TEXT];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Terms and conditions");
- snprint_share_file(label_file_txt, BUFF_SIZE_TEXT, SHARE_LICENSE);
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- button[0].num = 0;
- button[0].sw = &sw;
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- label_file = gtk_label_new(label_file_txt);
- separator[1] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), label_file, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-}
-
-static void menu_gui_hiscores (void)
-{
- int sw;
- GtkWidget *separator[2];
- struct Label_Data label;
- struct Button_Data button [1];
- GtkWidget *label_file;
- char label_file_txt [BUFF_SIZE_TEXT];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Hi scores");
- snprint_scores(label_file_txt, BUFF_SIZE_TEXT);
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- button[0].num = 0;
- button[0].sw = &sw;
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- label_file = gtk_label_new(label_file_txt);
- separator[1] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), label_file, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-}
-
-/* * * * * * * * * *
- * * Submenus * * * * * *
- * * * * * * * * * */
-static void menu_gui_continue (void)
-{
- bool wh;
- int sw;
- GtkWidget *separator[4];
- struct Label_Data label;
- struct Button_Data button [6];
- struct Entry_fname_Data entry_fname[1];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Game menu");
- snprintf(button[1].text, LINE_SIZE, "[_1] Start");
- snprintf(button[2].text, LINE_SIZE, "[_2] Select map");
- snprintf(button[3].text, LINE_SIZE, "[_3] Change difficulty");
- snprintf(button[4].text, LINE_SIZE, "[_4] Hi scores");
- snprintf(button[5].text, LINE_SIZE, "[_5] DEVEL");
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- button[1].num = 1;
- button[2].num = 2;
- button[3].num = 3;
- button[4].num = 4;
- button[5].num = 5;
- button[0].num = 0;
- button[1].sw = &sw;
- button[2].sw = &sw;
- button[3].sw = &sw;
- entry_fname[0].fpath = saved_path;
- entry_fname[0].fname = saved_name;
- button[4].sw = &sw;
- button[5].sw = &sw;
- button[0].sw = &sw;
-
- /* Menu loop */
- wh = true;
- while (wh) {
- /* Text */
- snprintf(entry_fname[0].lbl.text, LINE_SIZE,
- "Change file name (File: \"%s\")", saved_name);
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- button[1].ptr = gtk_button_new_with_mnemonic(button[1].text);
- separator[1] = gtk_hseparator_new();
- button[2].ptr = gtk_button_new_with_mnemonic(button[2].text);
- button[3].ptr = gtk_button_new_with_mnemonic(button[3].text);
- entry_fname[0].lbl.ptr = gtk_label_new(entry_fname[0].lbl.text);
- entry_fname[0].ptr = gtk_entry_new();
- button[4].ptr = gtk_button_new_with_mnemonic(button[4].text);
- separator[2] = gtk_hseparator_new();
- button[5].ptr = gtk_button_new_with_mnemonic(button[5].text);
- separator[3] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[1].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[1]);
- g_signal_connect(button[2].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[2]);
- g_signal_connect(button[3].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[3]);
- g_signal_connect(entry_fname[0].ptr, "activate",
- G_CALLBACK(callback_entry_fname), (void *)&entry_fname[0]);
- g_signal_connect(button[4].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[4]);
- g_signal_connect(button[5].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[5]);
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_fname[0].lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_fname[0].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), button[4].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[5].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[3], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- sw = -1;
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-
- /* Selection */
- switch (sw) {
- case 0:
- wh = false;
- break;
- case 1:
- start_switch();
- break;
- case 2:
- menu_gui_select();
- break;
- case 3:
- menu_gui_level();
- break;
- case 4:
- menu_gui_hiscores();
- break;
- case 5:
- menu_gui_devel();
- break;
- }
- }
-}
-
-static void menu_gui_select (void)
-{
- int sw;
- GtkWidget *separator[3];
- struct Label_Data label;
- struct Button_Data button [3];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Select map");
- snprintf(button[1].text, LINE_SIZE, "[_1] New map");
- snprintf(button[2].text, LINE_SIZE, "[_2] Load map (File: \"%s\")", saved_name);
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- button[1].num = 1;
- button[2].num = 2;
- button[0].num = 0;
- button[1].sw = &sw;
- button[2].sw = &sw;
- button[0].sw = &sw;
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- button[1].ptr = gtk_button_new_with_mnemonic(button[1].text);
- separator[1] = gtk_hseparator_new();
- button[2].ptr = gtk_button_new_with_mnemonic(button[2].text);
- separator[2] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[1].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[1]);
- g_signal_connect(button[2].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[2]);
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- sw = -1;
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-
- /* Selection */
- switch (sw) {
- case 0:
- break;
- case 1:
- start_mode = START_RAND;
- break;
- case 2:
- start_mode = START_LOAD;
- break;
- }
-}
-
-static void menu_gui_level (void)
-{
- int sw;
- GtkWidget *separator[3];
- struct Label_Data label;
- struct Button_Data button [5];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Select level");
- snprintf(button[1].text, LINE_SIZE, "[_1] Beginner");
- snprintf(button[2].text, LINE_SIZE, "[_2] Intermediate");
- snprintf(button[3].text, LINE_SIZE, "[_3] Expert");
- snprintf(button[4].text, LINE_SIZE, "[_4] Custom");
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- button[1].num = 1;
- button[2].num = 2;
- button[3].num = 3;
- button[4].num = 4;
- button[0].num = 0;
- button[1].sw = &sw;
- button[2].sw = &sw;
- button[3].sw = &sw;
- button[4].sw = &sw;
- button[0].sw = &sw;
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- button[1].ptr = gtk_button_new_with_mnemonic(button[1].text);
- button[2].ptr = gtk_button_new_with_mnemonic(button[2].text);
- button[3].ptr = gtk_button_new_with_mnemonic(button[3].text);
- separator[1] = gtk_hseparator_new();
- button[4].ptr = gtk_button_new_with_mnemonic(button[4].text);
- separator[2] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(button[1].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[1]);
- g_signal_connect(button[2].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[2]);
- g_signal_connect(button[3].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[3]);
- g_signal_connect(button[4].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[4]);
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[4].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- sw = -1;
- gtk_main();
-
- /* Clear window */
- gtk_widget_destroy(box);
-
- /* Selection */
- switch (sw) {
- case 1:
- menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER;
- break;
- case 2:
- menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE;
- break;
- case 3:
- menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT;
- break;
- case 4:
- menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM;
- menu_gui_custom();
- break;
- }
-}
-
-static void menu_gui_custom (void)
-{
- bool wh;
- int sw;
- GtkWidget *separator[3];
- struct Label_Data label;
- struct Button_Data button [1];
- struct Entry_int_Data entry_int[2];
- struct Entry_dbl_Data entry_dbl[1];
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "Custom");
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- entry_int[0].num = &menu_iface_variables.rows;
- entry_int[0].min = 2;
- entry_int[0].def = menu_iface_variables.rows;
- entry_int[0].max = ROWS_GUI_MAX;
- entry_int[1].num = &menu_iface_variables.cols;
- entry_int[1].min = 2;
- entry_int[1].def = menu_iface_variables.cols;
- entry_int[1].max = COLS_GUI_MAX;
- entry_dbl[0].num = &menu_iface_variables.p;
- entry_dbl[0].min = 0;
- entry_dbl[0].def = menu_iface_variables.p;
- entry_dbl[0].max = 1;
- button[0].num = 0;
- button[0].sw = &sw;
-
- /* Menu loop */
- wh = true;
- while (wh) {
-
- /* Text */
- snprintf(entry_int[0].lbl.text, LINE_SIZE,
- "Change rows: rows\t\t(%i)\n"
- "Introduce an integer number [%i U %i]",
- menu_iface_variables.rows, 2, ROWS_GUI_MAX);
- snprintf(entry_int[1].lbl.text, LINE_SIZE,
- "Change columns: cols\t(%i)\n"
- "Introduce an integer number [%i U %i]",
- menu_iface_variables.cols, 2, COLS_GUI_MAX);
- snprintf(entry_dbl[0].lbl.text, LINE_SIZE,
- "Change proportion of mines: p\t(%lf)\n"
- "Introduce a Real number [%i U %i]",
- menu_iface_variables.p, 0, 1);
-
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- entry_int[0].lbl.ptr = gtk_label_new(entry_int[0].lbl.text);
- entry_int[0].ptr = gtk_entry_new();
- entry_int[1].lbl.ptr = gtk_label_new(entry_int[1].lbl.text);
- entry_int[1].ptr = gtk_entry_new();
- separator[1] = gtk_hseparator_new();
- entry_dbl[0].lbl.ptr = gtk_label_new(entry_dbl[0].lbl.text);
- entry_dbl[0].ptr = gtk_entry_new();
- separator[2] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(entry_int[0].ptr, "activate",
- G_CALLBACK(callback_entry_int), (void *)&entry_int[0]);
- g_signal_connect(entry_int[1].ptr, "activate",
- G_CALLBACK(callback_entry_int), (void *)&entry_int[1]);
- g_signal_connect(entry_dbl[0].ptr, "activate",
- G_CALLBACK(callback_entry_dbl), (void *)&entry_dbl[0]);
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), entry_int[0].lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_int[0].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_int[1].lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_int[1].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), entry_dbl[0].lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_dbl[0].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- sw = -1;
- gtk_main();
-
- /* Selection */
- switch (sw) {
- case 0:
- wh = false;
- break;
-
- default:
- break;
- }
-
- /* Clear window */
- gtk_widget_destroy(box);
- }
-}
-
-static void menu_gui_devel (void)
-{
- bool wh;
- int sw;
- GtkWidget *separator[2];
- struct Label_Data label;
- struct Button_Data button [1];
- struct Entry_int_Data entry_int[1];
- int seed;
-
- /* Text */
- snprintf(label.text, LINE_SIZE, "DEVELOPER OPTIONS");
- snprintf(entry_int[0].lbl.text, LINE_SIZE, "Change seed (srand)");
- snprintf(button[0].text, LINE_SIZE, "[_0] Back");
-
- /* Data */
- entry_int[0].num = &seed;
- entry_int[0].min = -INFINITY;
- entry_int[0].def = 1;
- entry_int[0].max = INFINITY;
- button[0].num = 0;
- button[0].sw = &sw;
-
- /* Text */
-
- /* Menu loop */
- wh = true;
- while (wh) {
- /* Generate widgets */
- box = gtk_vbox_new(false, 0);
- label.ptr = gtk_label_new(label.text);
- separator[0] = gtk_hseparator_new();
- entry_int[0].lbl.ptr = gtk_label_new(entry_int[0].lbl.text);
- entry_int[0].ptr = gtk_entry_new();
- separator[1] = gtk_hseparator_new();
- button[0].ptr = gtk_button_new_with_mnemonic(button[0].text);
-
- /* Events */
- g_signal_connect(entry_int[0].ptr, "activate",
- G_CALLBACK(callback_entry_int), (void *)&entry_int[0]);
- g_signal_connect(button[0].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[0]);
-
- /* Container */
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), entry_int[0].lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), entry_int[0].ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0);
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-
- /* GTK loop */
- sw = -1;
- gtk_main();
-
- /* Selection */
- switch (sw) {
- case 0:
- wh = false;
- break;
- default:
- srand(seed);
- break;
- }
-
- /* Clear window */
- gtk_widget_destroy(box);
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <gtk/gtk.h> + /* INFINITY */ + #include <math.h> + /* true & false */ + #include <stdbool.h> + /* snprintf() */ + #include <stdio.h> + /* srand() */ + #include <stdlib.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + #include "alx_input.h" + + #include "about.h" + #include "game_iface.h" + #include "save.h" + #include "score.h" + #include "start.h" + + #include "menu_iface.h" + + #include "menu_gui.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define LINE_SIZE (80) + # define BUFF_SIZE_TEXT (1048576) + + +/****************************************************************************** + ******* structs ************************************************************** + ******************************************************************************/ +struct Button_Data { + GtkWidget *ptr; + char text [LINE_SIZE]; + int num; + int *sw; +}; + +struct Label_Data { + GtkWidget *ptr; + char text [LINE_SIZE]; +}; + +struct Entry_dbl_Data { + GtkWidget *ptr; + struct Label_Data lbl; + double *num; + double min; + double def; + double max; +}; + +struct Entry_int_Data { + GtkWidget *ptr; + struct Label_Data lbl; + int *num; + double min; + int64_t def; + double max; +}; + +struct Entry_fname_Data { + GtkWidget *ptr; + struct Label_Data lbl; + const char *fpath; + char *fname; +}; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +/* * * * * * * * * * + * * * Global * * * * * * + * * * * * * * * * */ + GtkWidget *window_gui; + +/* * * * * * * * * * + * * * Static * * * * * * + * * * * * * * * * */ +static GtkWidget *box; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Init & cleanup */ +static gboolean delete_window (GtkWidget *widget, + GdkEvent *event, + void *data); +static void destroy_window (GtkWidget *widget, + void *data); + /* Selection */ +static void callback_button (GtkWidget *widget, + void *data); + /* Entries */ +static void callback_entry_dbl (GtkWidget *widget, + void *data); +static void callback_entry_int (GtkWidget *widget, + void *data); + /* Text */ +static void menu_gui_disclaim (void); +static void menu_gui_license (void); +static void menu_gui_hiscores (void); + /* Submenus */ +static void menu_gui_continue (void); +static void menu_gui_select (void); +static void menu_gui_level (void); +static void menu_gui_custom (void); +static void menu_gui_devel (void); +#if 0 +static void menu_gui_verbose (void); +#endif + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void menu_gui_init (void) +{ + /* Window */ + window_gui = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + /* Quit */ + g_signal_connect(window_gui, "delete-event", G_CALLBACK(delete_window), NULL); + g_signal_connect(window_gui, "destroy", G_CALLBACK(destroy_window), NULL); + + /* Title. PROG_VERSION defined in Makefile */ + char title [LINE_SIZE]; + (void)snprintf(title, LINE_SIZE, "mine-sweeper %s", PROG_VERSION); + gtk_window_set_title(GTK_WINDOW(window_gui), title); + + /* Border */ + gtk_container_set_border_width(GTK_CONTAINER(window_gui), 20); +} + +void menu_gui_cleanup (void) +{ + /* Destroy window */ + gtk_widget_destroy(window_gui); +} + +void menu_gui (void) +{ + bool wh; + int sw; + GtkWidget *separator[3]; + struct Label_Data label; + struct Button_Data button [4]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Main menu"); + (void)snprintf(button[1].text, LINE_SIZE, "[_1] Continue"); + (void)snprintf(button[2].text, LINE_SIZE, "[_2] Disclaimer of warranty"); + (void)snprintf(button[3].text, LINE_SIZE, "[_3] Terms and conditions"); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Exit program"); + + /* Data */ + button[1].num = 1; + button[2].num = 2; + button[3].num = 3; + button[0].num = 0; + button[1].sw = &sw; + button[2].sw = &sw; + button[3].sw = &sw; + button[0].sw = &sw; + + /* Menu loop */ + wh = true; + while (wh) { + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + button[1].ptr = gtk_button_new_with_mnemonic(button[1].text); + separator[1] = gtk_hseparator_new(); + button[2].ptr = gtk_button_new_with_mnemonic(button[2].text); + button[3].ptr = gtk_button_new_with_mnemonic(button[3].text); + separator[2] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[1].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[1]); + g_signal_connect(button[2].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[2]); + g_signal_connect(button[3].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[3]); + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + sw = -1; + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); + + /* Selection */ + switch (sw) { + case 0: + wh = false; + break; + case 1: + menu_gui_continue(); + break; + case 2: + menu_gui_disclaim(); + break; + case 3: + menu_gui_license(); + break; + } + } +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * Cleanup * * * * * * + * * * * * * * * * */ +static gboolean delete_window (GtkWidget *widget, + GdkEvent *event, + void *data) +{ + + gtk_main_quit(); + + /* false: send destroy signal */ + return false; +} + +static void destroy_window (GtkWidget *widget, + void *data) +{ + + exit(EXIT_SUCCESS); +} + +/* * * * * * * * * * + * * Selection * * * * * * + * * * * * * * * * */ +static void callback_button (GtkWidget *widget, + void *data) +{ + struct Button_Data *button; + + button = ((struct Button_Data *)data); + + *(button->sw) = button->num; + + gtk_main_quit(); +} + +/* * * * * * * * * * + * * Entries * * * * * * * + * * * * * * * * * */ +static void callback_entry_dbl (GtkWidget *widget, + void *data) +{ + struct Entry_dbl_Data *entry; + const char *str; + int err; + char buff [LINE_SIZE]; + + entry = ((struct Entry_dbl_Data *)data); + + str = gtk_entry_get_text(GTK_ENTRY(entry->ptr)); + err = alx_sscan_dbl(entry->num, entry->min, entry->def, entry->max, str); + + if (err) { + (void)snprintf(buff, LINE_SIZE, "Error %i", err); + gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff); + gtk_editable_select_region(GTK_EDITABLE(entry->ptr), + 0, GTK_ENTRY(entry->ptr)->text_length); + } + + gtk_main_quit(); +} + +static void callback_entry_int (GtkWidget *widget, + void *data) +{ + struct Entry_int_Data *entry; + const char *str; + int err; + int64_t Z; + char buff [LINE_SIZE]; + + entry = ((struct Entry_int_Data *)data); + + str = gtk_entry_get_text(GTK_ENTRY(entry->ptr)); + err = alx_sscan_int64(&Z, entry->min, entry->def, entry->max, str); + + if (err) { + (void)snprintf(buff, LINE_SIZE, "Error %i", err); + gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff); + gtk_editable_select_region(GTK_EDITABLE(entry->ptr), + 0, GTK_ENTRY(entry->ptr)->text_length); + } else { + *(entry->num) = Z; + } + + gtk_main_quit(); +} + +static void callback_entry_fname (GtkWidget *widget, + void *data) +{ + struct Entry_fname_Data *entry; + const char *str; + int err; + char buff [LINE_SIZE]; + + entry = ((struct Entry_fname_Data *)data); + + str = gtk_entry_get_text(GTK_ENTRY(entry->ptr)); + err = alx_sscan_fname(entry->fpath, entry->fname, true, str); + + if (err) { + snprintf(buff, LINE_SIZE, "Error %i", err); + gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff); + gtk_editable_select_region(GTK_EDITABLE(entry->ptr), + 0, GTK_ENTRY(entry->ptr)->text_length); + } + + gtk_main_quit(); +} + +/* * * * * * * * * * + * * Text * * * * * * * + * * * * * * * * * */ +static void menu_gui_disclaim (void) +{ + int sw; + GtkWidget *separator[2]; + struct Label_Data label; + struct Button_Data button [1]; + GtkWidget *label_file; + char label_file_txt [BUFF_SIZE_TEXT]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Disclaimer of warranty"); + snprint_share_file(label_file_txt, BUFF_SIZE_TEXT, SHARE_DISCLAIMER); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + button[0].num = 0; + button[0].sw = &sw; + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + label_file = gtk_label_new(label_file_txt); + separator[1] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), label_file, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); +} + +static void menu_gui_license (void) +{ + int sw; + GtkWidget *separator[2]; + struct Label_Data label; + struct Button_Data button [1]; + GtkWidget *label_file; + char label_file_txt [BUFF_SIZE_TEXT]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Terms and conditions"); + snprint_share_file(label_file_txt, BUFF_SIZE_TEXT, SHARE_LICENSE); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + button[0].num = 0; + button[0].sw = &sw; + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + label_file = gtk_label_new(label_file_txt); + separator[1] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), label_file, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); +} + +static void menu_gui_hiscores (void) +{ + int sw; + GtkWidget *separator[2]; + struct Label_Data label; + struct Button_Data button [1]; + GtkWidget *label_file; + char label_file_txt [BUFF_SIZE_TEXT]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Hi scores"); + snprint_scores(label_file_txt, BUFF_SIZE_TEXT); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + button[0].num = 0; + button[0].sw = &sw; + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + label_file = gtk_label_new(label_file_txt); + separator[1] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), label_file, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); +} + +/* * * * * * * * * * + * * Submenus * * * * * * + * * * * * * * * * */ +static void menu_gui_continue (void) +{ + bool wh; + int sw; + GtkWidget *separator[4]; + struct Label_Data label; + struct Button_Data button [6]; + struct Entry_fname_Data entry_fname[1]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Game menu"); + (void)snprintf(button[1].text, LINE_SIZE, "[_1] Start"); + (void)snprintf(button[2].text, LINE_SIZE, "[_2] Select map"); + (void)snprintf(button[3].text, LINE_SIZE, "[_3] Change difficulty"); + (void)snprintf(button[4].text, LINE_SIZE, "[_4] Hi scores"); + (void)snprintf(button[5].text, LINE_SIZE, "[_5] DEVEL"); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + button[1].num = 1; + button[2].num = 2; + button[3].num = 3; + button[4].num = 4; + button[5].num = 5; + button[0].num = 0; + button[1].sw = &sw; + button[2].sw = &sw; + button[3].sw = &sw; + entry_fname[0].fpath = saved_path; + entry_fname[0].fname = saved_name; + button[4].sw = &sw; + button[5].sw = &sw; + button[0].sw = &sw; + + /* Menu loop */ + wh = true; + while (wh) { + /* Text */ + (void)snprintf(entry_fname[0].lbl.text, LINE_SIZE, + "Change file name (File: \"%s\")", saved_name); + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + button[1].ptr = gtk_button_new_with_mnemonic(button[1].text); + separator[1] = gtk_hseparator_new(); + button[2].ptr = gtk_button_new_with_mnemonic(button[2].text); + button[3].ptr = gtk_button_new_with_mnemonic(button[3].text); + entry_fname[0].lbl.ptr = gtk_label_new(entry_fname[0].lbl.text); + entry_fname[0].ptr = gtk_entry_new(); + button[4].ptr = gtk_button_new_with_mnemonic(button[4].text); + separator[2] = gtk_hseparator_new(); + button[5].ptr = gtk_button_new_with_mnemonic(button[5].text); + separator[3] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[1].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[1]); + g_signal_connect(button[2].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[2]); + g_signal_connect(button[3].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[3]); + g_signal_connect(entry_fname[0].ptr, "activate", + G_CALLBACK(callback_entry_fname), (void *)&entry_fname[0]); + g_signal_connect(button[4].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[4]); + g_signal_connect(button[5].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[5]); + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_fname[0].lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_fname[0].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), button[4].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[5].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[3], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + sw = -1; + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); + + /* Selection */ + switch (sw) { + case 0: + wh = false; + break; + case 1: + start_switch(); + break; + case 2: + menu_gui_select(); + break; + case 3: + menu_gui_level(); + break; + case 4: + menu_gui_hiscores(); + break; + case 5: + menu_gui_devel(); + break; + } + } +} + +static void menu_gui_select (void) +{ + int sw; + GtkWidget *separator[3]; + struct Label_Data label; + struct Button_Data button [3]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Select map"); + (void)snprintf(button[1].text, LINE_SIZE, "[_1] New map"); + (void)snprintf(button[2].text, LINE_SIZE, "[_2] Load map (File: \"%s\")", + saved_name); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + button[1].num = 1; + button[2].num = 2; + button[0].num = 0; + button[1].sw = &sw; + button[2].sw = &sw; + button[0].sw = &sw; + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + button[1].ptr = gtk_button_new_with_mnemonic(button[1].text); + separator[1] = gtk_hseparator_new(); + button[2].ptr = gtk_button_new_with_mnemonic(button[2].text); + separator[2] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[1].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[1]); + g_signal_connect(button[2].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[2]); + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + sw = -1; + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); + + /* Selection */ + switch (sw) { + case 0: + break; + case 1: + start_mode = START_RAND; + break; + case 2: + start_mode = START_LOAD; + break; + } +} + +static void menu_gui_level (void) +{ + int sw; + GtkWidget *separator[3]; + struct Label_Data label; + struct Button_Data button [5]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Select level"); + (void)snprintf(button[1].text, LINE_SIZE, "[_1] Beginner"); + (void)snprintf(button[2].text, LINE_SIZE, "[_2] Intermediate"); + (void)snprintf(button[3].text, LINE_SIZE, "[_3] Expert"); + (void)snprintf(button[4].text, LINE_SIZE, "[_4] Custom"); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + button[1].num = 1; + button[2].num = 2; + button[3].num = 3; + button[4].num = 4; + button[0].num = 0; + button[1].sw = &sw; + button[2].sw = &sw; + button[3].sw = &sw; + button[4].sw = &sw; + button[0].sw = &sw; + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + button[1].ptr = gtk_button_new_with_mnemonic(button[1].text); + button[2].ptr = gtk_button_new_with_mnemonic(button[2].text); + button[3].ptr = gtk_button_new_with_mnemonic(button[3].text); + separator[1] = gtk_hseparator_new(); + button[4].ptr = gtk_button_new_with_mnemonic(button[4].text); + separator[2] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(button[1].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[1]); + g_signal_connect(button[2].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[2]); + g_signal_connect(button[3].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[3]); + g_signal_connect(button[4].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[4]); + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[1].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), button[2].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), button[3].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[4].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + sw = -1; + gtk_main(); + + /* Clear window */ + gtk_widget_destroy(box); + + /* Selection */ + switch (sw) { + case 1: + menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER; + break; + case 2: + menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE; + break; + case 3: + menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT; + break; + case 4: + menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM; + menu_gui_custom(); + break; + } +} + +static void menu_gui_custom (void) +{ + bool wh; + int sw; + GtkWidget *separator[3]; + struct Label_Data label; + struct Button_Data button [1]; + struct Entry_int_Data entry_int[2]; + struct Entry_dbl_Data entry_dbl[1]; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "Custom"); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + entry_int[0].num = &menu_iface_variables.rows; + entry_int[0].min = 2; + entry_int[0].def = menu_iface_variables.rows; + entry_int[0].max = ROWS_GUI_MAX; + entry_int[1].num = &menu_iface_variables.cols; + entry_int[1].min = 2; + entry_int[1].def = menu_iface_variables.cols; + entry_int[1].max = COLS_GUI_MAX; + entry_dbl[0].num = &menu_iface_variables.p; + entry_dbl[0].min = 0; + entry_dbl[0].def = menu_iface_variables.p; + entry_dbl[0].max = 1; + button[0].num = 0; + button[0].sw = &sw; + + /* Menu loop */ + wh = true; + while (wh) { + + /* Text */ + (void)snprintf(entry_int[0].lbl.text, LINE_SIZE, + "Change rows: rows\t\t(%i)\n" + "Introduce an integer number [%i U %i]", + menu_iface_variables.rows, 2, ROWS_GUI_MAX); + (void)snprintf(entry_int[1].lbl.text, LINE_SIZE, + "Change columns: cols\t(%i)\n" + "Introduce an integer number [%i U %i]", + menu_iface_variables.cols, 2, COLS_GUI_MAX); + (void)snprintf(entry_dbl[0].lbl.text, LINE_SIZE, + "Change proportion of mines: p\t(%lf)\n" + "Introduce a Real number [%i U %i]", + menu_iface_variables.p, 0, 1); + + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + entry_int[0].lbl.ptr = gtk_label_new(entry_int[0].lbl.text); + entry_int[0].ptr = gtk_entry_new(); + entry_int[1].lbl.ptr = gtk_label_new(entry_int[1].lbl.text); + entry_int[1].ptr = gtk_entry_new(); + separator[1] = gtk_hseparator_new(); + entry_dbl[0].lbl.ptr = gtk_label_new(entry_dbl[0].lbl.text); + entry_dbl[0].ptr = gtk_entry_new(); + separator[2] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(entry_int[0].ptr, "activate", + G_CALLBACK(callback_entry_int), (void *)&entry_int[0]); + g_signal_connect(entry_int[1].ptr, "activate", + G_CALLBACK(callback_entry_int), (void *)&entry_int[1]); + g_signal_connect(entry_dbl[0].ptr, "activate", + G_CALLBACK(callback_entry_dbl), (void *)&entry_dbl[0]); + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), entry_int[0].lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_int[0].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_int[1].lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_int[1].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), entry_dbl[0].lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_dbl[0].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[2], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + sw = -1; + gtk_main(); + + /* Selection */ + switch (sw) { + case 0: + wh = false; + break; + + default: + break; + } + + /* Clear window */ + gtk_widget_destroy(box); + } +} + +static void menu_gui_devel (void) +{ + bool wh; + int sw; + GtkWidget *separator[2]; + struct Label_Data label; + struct Button_Data button [1]; + struct Entry_int_Data entry_int[1]; + int seed; + + /* Text */ + (void)snprintf(label.text, LINE_SIZE, "DEVELOPER OPTIONS"); + (void)snprintf(entry_int[0].lbl.text, LINE_SIZE, "Change seed (srand)"); + (void)snprintf(button[0].text, LINE_SIZE, "[_0] Back"); + + /* Data */ + entry_int[0].num = &seed; + entry_int[0].min = -INFINITY; + entry_int[0].def = 1; + entry_int[0].max = INFINITY; + button[0].num = 0; + button[0].sw = &sw; + + /* Text */ + + /* Menu loop */ + wh = true; + while (wh) { + /* Generate widgets */ + box = gtk_vbox_new(false, 0); + label.ptr = gtk_label_new(label.text); + separator[0] = gtk_hseparator_new(); + entry_int[0].lbl.ptr = gtk_label_new(entry_int[0].lbl.text); + entry_int[0].ptr = gtk_entry_new(); + separator[1] = gtk_hseparator_new(); + button[0].ptr = gtk_button_new_with_mnemonic(button[0].text); + + /* Events */ + g_signal_connect(entry_int[0].ptr, "activate", + G_CALLBACK(callback_entry_int), (void *)&entry_int[0]); + g_signal_connect(button[0].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[0]); + + /* Container */ + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box), label.ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box), separator[0], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), entry_int[0].lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), entry_int[0].ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box), separator[1], false, false, 5); + gtk_box_pack_start(GTK_BOX(box), button[0].ptr, true, true, 0); + + /* Refresh */ + gtk_widget_show_all(window_gui); + + /* GTK loop */ + sw = -1; + gtk_main(); + + /* Selection */ + switch (sw) { + case 0: + wh = false; + break; + default: + srand(seed); + break; + } + + /* Clear window */ + gtk_widget_destroy(box); + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/src/menu_iface.c b/modules/menu/src/menu_iface.c index 5322194..2fd89e4 100644 --- a/modules/menu/src/menu_iface.c +++ b/modules/menu/src/menu_iface.c @@ -1,146 +1,146 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <math.h>
- #include <stdbool.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- #include "game_iface.h"
- #include "start.h"
-
- #include "menu_clui.h"
- #include "menu_tui.h"
- #include "menu_gui.h"
-
- #include "menu_iface.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-bool flag_exit;
-int menu_iface_mode;
-struct Menu_Iface_Variables menu_iface_variables;
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void menu_iface_init (void)
-{
- menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER;
- menu_iface_variables.rows = 8;
- menu_iface_variables.cols = 8;
- menu_iface_variables.p = 0.16;
-}
-
-void menu_iface_init_iface (void)
-{
- switch (menu_iface_mode) {
- case MENU_IFACE_CLUI:
- break;
-
- case MENU_IFACE_TUI:
- break;
-
- case MENU_IFACE_GUI:
- menu_gui_init();
- break;
- }
-}
-
-void menu_iface_cleanup (void)
-{
- switch (menu_iface_mode) {
- case MENU_IFACE_CLUI:
- break;
-
- case MENU_IFACE_TUI:
- break;
-
- case MENU_IFACE_GUI:
- menu_gui_cleanup();
- break;
- }
-}
-
-void menu_iface_board (int *level, int *rows, int *cols, int *mines)
-{
- *level = menu_iface_variables.level;
-
- /* size & number of mines */
- switch (*level) {
- case GAME_IFACE_LEVEL_BEGINNER:
- *rows = GAME_IFACE_LEVEL_BEGINNER_ROWS;
- *cols = GAME_IFACE_LEVEL_BEGINNER_COLS;
- *mines = GAME_IFACE_LEVEL_BEGINNER_MINES;
- break;
-
- case GAME_IFACE_LEVEL_INTERMEDIATE:
- *rows = GAME_IFACE_LEVEL_INTERMEDIATE_ROWS;
- *cols = GAME_IFACE_LEVEL_INTERMEDIATE_COLS;
- *mines = GAME_IFACE_LEVEL_INTERMEDIATE_MINES;
- break;
-
- case GAME_IFACE_LEVEL_EXPERT:
- *rows = GAME_IFACE_LEVEL_EXPERT_ROWS;
- *cols = GAME_IFACE_LEVEL_EXPERT_COLS;
- *mines = GAME_IFACE_LEVEL_EXPERT_MINES;
- break;
-
- case GAME_IFACE_LEVEL_EXPERT_INV:
- *rows = GAME_IFACE_LEVEL_EXPERT_COLS;
- *cols = GAME_IFACE_LEVEL_EXPERT_ROWS;
- *mines = GAME_IFACE_LEVEL_EXPERT_MINES;
- break;
-
- case GAME_IFACE_LEVEL_CUSTOM:
- *rows = menu_iface_variables.rows;
- *cols = menu_iface_variables.cols;
- *mines = menu_iface_variables.p * (*rows) * (*cols);
- /* at least one safe field */
- if ((*mines) == (*rows) * (*cols)) {
- (*mines)--;
- }
- break;
- }
-}
-
-void menu_iface (void)
-{
- start_mode = START_RAND;
-
- if (!flag_exit) {
- switch (menu_iface_mode) {
- case MENU_IFACE_FOO:
- break;
-
- case MENU_IFACE_CLUI:
- menu_clui();
- break;
-
- case MENU_IFACE_TUI:
- menu_tui();
- break;
-
- case MENU_IFACE_GUI:
- menu_gui();
- break;
- }
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <math.h> + #include <stdbool.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + #include "game_iface.h" + #include "start.h" + + #include "menu_clui.h" + #include "menu_tui.h" + #include "menu_gui.h" + + #include "menu_iface.h" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +bool flag_exit; +int menu_iface_mode; +struct Menu_Iface_Variables menu_iface_variables; + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void menu_iface_init (void) +{ + menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER; + menu_iface_variables.rows = 8; + menu_iface_variables.cols = 8; + menu_iface_variables.p = 0.16; +} + +void menu_iface_init_iface (void) +{ + switch (menu_iface_mode) { + case MENU_IFACE_CLUI: + break; + + case MENU_IFACE_TUI: + break; + + case MENU_IFACE_GUI: + menu_gui_init(); + break; + } +} + +void menu_iface_cleanup (void) +{ + switch (menu_iface_mode) { + case MENU_IFACE_CLUI: + break; + + case MENU_IFACE_TUI: + break; + + case MENU_IFACE_GUI: + menu_gui_cleanup(); + break; + } +} + +void menu_iface_board (int *level, int *rows, int *cols, int *mines) +{ + *level = menu_iface_variables.level; + + /* size & number of mines */ + switch (*level) { + case GAME_IFACE_LEVEL_BEGINNER: + *rows = GAME_IFACE_LEVEL_BEGINNER_ROWS; + *cols = GAME_IFACE_LEVEL_BEGINNER_COLS; + *mines = GAME_IFACE_LEVEL_BEGINNER_MINES; + break; + + case GAME_IFACE_LEVEL_INTERMEDIATE: + *rows = GAME_IFACE_LEVEL_INTERMEDIATE_ROWS; + *cols = GAME_IFACE_LEVEL_INTERMEDIATE_COLS; + *mines = GAME_IFACE_LEVEL_INTERMEDIATE_MINES; + break; + + case GAME_IFACE_LEVEL_EXPERT: + *rows = GAME_IFACE_LEVEL_EXPERT_ROWS; + *cols = GAME_IFACE_LEVEL_EXPERT_COLS; + *mines = GAME_IFACE_LEVEL_EXPERT_MINES; + break; + + case GAME_IFACE_LEVEL_EXPERT_INV: + *rows = GAME_IFACE_LEVEL_EXPERT_COLS; + *cols = GAME_IFACE_LEVEL_EXPERT_ROWS; + *mines = GAME_IFACE_LEVEL_EXPERT_MINES; + break; + + case GAME_IFACE_LEVEL_CUSTOM: + *rows = menu_iface_variables.rows; + *cols = menu_iface_variables.cols; + *mines = menu_iface_variables.p * (*rows) * (*cols); + /* at least one safe field */ + if ((*mines) == (*rows) * (*cols)) { + (*mines)--; + } + break; + } +} + +void menu_iface (void) +{ + start_mode = START_RAND; + + if (!flag_exit) { + switch (menu_iface_mode) { + case MENU_IFACE_FOO: + break; + + case MENU_IFACE_CLUI: + menu_clui(); + break; + + case MENU_IFACE_TUI: + menu_tui(); + break; + + case MENU_IFACE_GUI: + menu_gui(); + break; + } + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/src/menu_tui.c b/modules/menu/src/menu_tui.c index 15b363b..e675b25 100644 --- a/modules/menu/src/menu_tui.c +++ b/modules/menu/src/menu_tui.c @@ -1,436 +1,441 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* Standard C ----------------------------------------------------------------*/
- /* INFINITY */
- #include <math.h>
- #include <ncurses.h>
- #include <stdbool.h>
- /* srand() */
- #include <stdlib.h>
-
-/* libalx --------------------------------------------------------------------*/
- #include "alx_ncur.h"
-
-/* Project -------------------------------------------------------------------*/
- #include "about.h"
- #include "game_iface.h"
- #include "save.h"
- #include "score.h"
- #include "start.h"
-
-/* Module --------------------------------------------------------------------*/
- #include "menu_iface.h"
-
- #include "menu_tui.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define ROWS_TUI_MAX (22)
-#if (ROWS_TUI_MAX > ROWS_MAX)
-# error "rows max (tui)"
-#endif
-
- # define COLS_TUI_MAX (33)
-#if (COLS_TUI_MAX > COLS_MAX)
-# error "cols max (tui)"
-#endif
-
- # define BUFF_SIZE_TEXT (1048576)
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void menu_tui_continue (void);
-static void menu_tui_select (void);
-static void menu_tui_level (void);
-static void menu_tui_custom (void);
-static void menu_tui_devel (void);
-static void menu_tui_verbose (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void menu_tui (void)
-{
- alx_resume_curses();
-
- /* Menu dimensions & options */
- int h;
- int w;
- h = 10;
- w = 34;
- int N;
- N = 4;
- struct Alx_Menu mnu[4] = {
- {7, 4, "[0] Exit program"},
- {2, 4, "[1] Continue"},
- {4, 4, "[2] Disclaimer of warranty"},
- {5, 4, "[3] Terms and conditions"}
- };
-
- /* Menu */
- bool wh;
- int sw;
- wh = true;
- while (wh) {
- /* Menu loop */
- sw = alx_menu(h, w, N, mnu, "MENU:");
-
- /* Selection */
- switch (sw) {
- case 0:
- wh = false;
- break;
-
- case 1:
- menu_tui_continue();
- break;
-
- case 2:
- alx_pause_curses();
- print_share_file(SHARE_DISCLAIMER);
- getchar();
- alx_resume_curses();
- break;
-
- case 3:
- alx_pause_curses();
- print_share_file(SHARE_LICENSE);
- getchar();
- alx_resume_curses();
- break;
- }
- }
-
- alx_pause_curses();
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void menu_tui_continue (void)
-{
- /* Hi scores tmp string */
- char str [BUFF_SIZE_TEXT];
-
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 18;
- w = 50;
- r = 1;
- c = (80 - w) / 2;
- int N;
- /* N = 7 if DEVEL option is enabled */
- N = 6;
- struct Alx_Menu mnu[6] = {
- {11, 4, "[0] Back"},
- {2, 4, "[1] Start"},
- {4, 4, "[2] Select map"},
- {5, 4, "[3] Change difficulty"},
- {6, 4, "[4] Change file name"},
- {7, 4, "[5] Hi scores"}/*,
- {9, 4, "[6] DEVEL"}*/
- };
-
- /* Input box */
- int w2;
- int r2;
- w2 = w - 8;
- r2 = r + h - 5;
- char *txt[] = {"File name:"};
-
- /* Menu */
- bool wh;
- int sw;
- wh = true;
- while (wh) {
- /* Menu loop */
- win = newwin(h, w, r, c);
- mvwprintw(win, mnu[4].r, mnu[4].c, "%s (File: \"%s\")", mnu[4].t, saved_name);
- wrefresh(win);
- sw = alx_menu_2(win, N, mnu, "CONTINUE:");
-
- /* Selection */
- switch (sw) {
- case 0:
- alx_win_del(win);
- wh = false;
- break;
-
- case 1:
- alx_win_del(win);
- alx_pause_curses();
- start_switch();
- alx_resume_curses();
- break;
-
- case 2:
- alx_win_del(win);
- menu_tui_select();
- break;
-
- case 3:
- alx_win_del(win);
- menu_tui_level();
- break;
-
- case 4:
- save_clr();
- alx_w_getfname(saved_path, saved_name, true, w2, r2,
- txt[0], NULL);
- alx_win_del(win);
- break;
-
- case 5:
- alx_win_del(win);
- alx_pause_curses();
- snprint_scores(str, BUFF_SIZE_TEXT);
- printf("%s", str);
- getchar();
- alx_resume_curses();
- break;
-/*
- case 6:
- alx_win_del(win);
- menu_tui_devel();
- break;
-*/
- }
- }
-}
-
-static void menu_tui_select (void)
-{
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 9;
- w = 70;
- r = 1;
- c = (80 - w) / 2;
- int N;
- N = 3;
- struct Alx_Menu mnu[3] = {
- {6, 4, "[0] Back"},
- {2, 4, "[1] New map"},
- {4, 4, "[2] Load map"}
- };
-
- /* Menu loop */
- int sw;
- win = newwin(h, w, r, c);
- mvwprintw(win, mnu[2].r, mnu[2].c, "%s (File: \"%s\")", mnu[1].t, saved_name);
- wrefresh(win);
- sw = alx_menu_2(win, N, mnu, "SELECT MAP:");
- alx_win_del(win);
-
- /* Selection */
- switch (sw) {
- case 1:
- start_mode = START_RAND;
- break;
-
- case 2:
- start_mode = START_LOAD;
- break;
- }
-
-}
-
-static void menu_tui_level (void)
-{
- /* Menu dimensions & options */
- int h;
- int w;
- h = 10;
- w = 70;
- int N;
- N = 5;
- struct Alx_Menu mnu[5] = {
- {7, 4, "[0] Back"},
- {2, 4, "[1] Beginner"},
- {3, 4, "[2] Intermediate"},
- {4, 4, "[3] Expert"},
- {5, 4, "[4] Custom"}
- };
-
- /* Menu loop */
- int sw;
- sw = alx_menu(h, w, N, mnu, "SELECT LEVEL:");
-
- /* Selection */
- switch (sw) {
- case 1:
- menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER;
- break;
-
- case 2:
- menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE;
- break;
-
- case 3:
- menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT;
- break;
-
- case 4:
- menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM;
- menu_tui_custom();
- break;
- }
-
-}
-
-static void menu_tui_custom (void)
-{
- /* Menu dimensions & options */
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 16;
- w = 76;
- r = 1;
- c = (80 - w) / 2;
- int N;
- N = 4;
- struct Alx_Menu mnu[4] = {
- {8, 4, "[0] Back"},
- {2, 4, "[1] Change rows:"},
- {4, 4, "[2] Change columns:"},
- {6, 4, "[3] Change proportion of mines:"}
- };
-
- /* Input box */
- int w2;
- int r2;
- w2 = w - 8;
- r2 = r + h - 5;
- char *txt[] = {
- "Rows:",
- "Columns:",
- "Proportion:"
- };
-
- /* Menu */
- win = newwin(h, w, r, c);
-
- /* Menu loop */
- bool wh;
- int sw;
- wh = true;
- while (wh) {
- mvwprintw(win, mnu[1].r, mnu[1].c, "%s rows\t\t(%i)",
- mnu[1].t, menu_iface_variables.rows);
- mvwprintw(win, mnu[2].r, mnu[2].c, "%s cols\t\t(%i)",
- mnu[2].t, menu_iface_variables.cols);
- mvwprintw(win, mnu[3].r, mnu[3].c, "%s p\t(%lf)",
- mnu[3].t, menu_iface_variables.p);
- wrefresh(win);
-
- /* Selection */
- sw = alx_menu_2(win, N, mnu, "Custom:");
-
- switch (sw) {
- case 0:
- wh = false;
- break;
-
- case 1:
- menu_iface_variables.rows = alx_w_getint(w2, r2,
- txt[sw - 1], 2, menu_iface_variables.rows, ROWS_TUI_MAX, NULL);
- break;
-
- case 2:
- menu_iface_variables.cols = alx_w_getint(w2, r2,
- txt[sw - 1], 2, menu_iface_variables.cols, COLS_TUI_MAX, NULL);
- break;
-
- case 3:
- menu_iface_variables.p = alx_w_getdbl(w2, r2,
- txt[sw - 1], 0, menu_iface_variables.p, 1, NULL);
- break;
- }
-
- }
-
- /* Cleanup */
- alx_win_del(win);
-}
-
-static void menu_tui_devel (void)
-{
- WINDOW *win;
- int h;
- int w;
- int r;
- int c;
- h = 12;
- w = 50;
- r = 1;
- c = (80 - w) / 2;
- int N;
- N = 2;
- struct Alx_Menu mnu[2] = {
- {5, 4, "[0] Back"},
- {2, 4, "[1] Change seed (srand)"}
- };
-
- /* Input box */
- int w2;
- int r2;
- w2 = w - 8;
- r2 = r + h - 5;
- char *txt[] = {"Seed:"};
-
- /* Menu */
- win = newwin(h, w, r, c);
-
- /* Menu loop */
- bool wh;
- int sw;
- wh = true;
- int seed;
- while (wh) {
- /* Selection */
- sw = alx_menu_2(win, N, mnu, "DEVELOPER OPTIONS:");
-
- switch (sw) {
- case 0:
- wh = false;
- break;
-
- case 1:
- seed = alx_w_getint(w2, r2, txt[0],
- -INFINITY, 1, INFINITY, NULL);
- srand(seed);
- break;
- }
- }
-
- /* Cleanup */
- alx_win_del(win);
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + /* INFINITY */ + #include <math.h> + #include <ncurses.h> + #include <stdbool.h> + /* srand() */ + #include <stdlib.h> + +/* libalx --------------------------------------------------------------------*/ + #include "alx_ncur.h" + +/* Project -------------------------------------------------------------------*/ + #include "about.h" + #include "game_iface.h" + #include "save.h" + #include "score.h" + #include "start.h" + +/* Module --------------------------------------------------------------------*/ + #include "menu_iface.h" + + #include "menu_tui.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define ROWS_TUI_MAX (22) +#if (ROWS_TUI_MAX > ROWS_MAX) +# error "rows max (tui)" +#endif + + # define COLS_TUI_MAX (33) +#if (COLS_TUI_MAX > COLS_MAX) +# error "cols max (tui)" +#endif + + # define BUFF_SIZE_TEXT (1048576) + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void menu_tui_continue (void); +static void menu_tui_select (void); +static void menu_tui_level (void); +static void menu_tui_custom (void); +#if 0 +static void menu_tui_devel (void); +#endif +#if 0 +static void menu_tui_verbose (void); +#endif + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void menu_tui (void) +{ + alx_resume_curses(); + + /* Menu dimensions & options */ + int h; + int w; + h = 10; + w = 34; + int N; + N = 4; + struct Alx_Menu mnu[4] = { + {7, 4, "[0] Exit program"}, + {2, 4, "[1] Continue"}, + {4, 4, "[2] Disclaimer of warranty"}, + {5, 4, "[3] Terms and conditions"} + }; + + /* Menu */ + bool wh; + int sw; + wh = true; + while (wh) { + /* Menu loop */ + sw = alx_menu(h, w, N, mnu, "MENU:"); + + /* Selection */ + switch (sw) { + case 0: + wh = false; + break; + + case 1: + menu_tui_continue(); + break; + + case 2: + alx_pause_curses(); + print_share_file(SHARE_DISCLAIMER); + getchar(); + alx_resume_curses(); + break; + + case 3: + alx_pause_curses(); + print_share_file(SHARE_LICENSE); + getchar(); + alx_resume_curses(); + break; + } + } + + alx_pause_curses(); +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void menu_tui_continue (void) +{ + /* Hi scores tmp string */ + char str [BUFF_SIZE_TEXT]; + + /* Menu dimensions & options */ + WINDOW *win; + int h; + int w; + int r; + int c; + h = 18; + w = 50; + r = 1; + c = (80 - w) / 2; + int N; + /* N = 7 if DEVEL option is enabled */ + N = 6; + struct Alx_Menu mnu[6] = { + {11, 4, "[0] Back"}, + {2, 4, "[1] Start"}, + {4, 4, "[2] Select map"}, + {5, 4, "[3] Change difficulty"}, + {6, 4, "[4] Change file name"}, + {7, 4, "[5] Hi scores"}/*, + {9, 4, "[6] DEVEL"}*/ + }; + + /* Input box */ + int w2; + int r2; + w2 = w - 8; + r2 = r + h - 5; + char *txt[] = {"File name:"}; + + /* Menu */ + bool wh; + int sw; + wh = true; + while (wh) { + /* Menu loop */ + win = newwin(h, w, r, c); + mvwprintw(win, mnu[4].r, mnu[4].c, "%s (File: \"%s\")", mnu[4].t, saved_name); + wrefresh(win); + sw = alx_menu_2(win, N, mnu, "CONTINUE:"); + + /* Selection */ + switch (sw) { + case 0: + alx_win_del(win); + wh = false; + break; + + case 1: + alx_win_del(win); + alx_pause_curses(); + start_switch(); + alx_resume_curses(); + break; + + case 2: + alx_win_del(win); + menu_tui_select(); + break; + + case 3: + alx_win_del(win); + menu_tui_level(); + break; + + case 4: + save_clr(); + alx_w_getfname(saved_path, saved_name, true, w2, r2, + txt[0], NULL); + alx_win_del(win); + break; + + case 5: + alx_win_del(win); + alx_pause_curses(); + snprint_scores(str, BUFF_SIZE_TEXT); + printf("%s", str); + getchar(); + alx_resume_curses(); + break; +/* + case 6: + alx_win_del(win); + menu_tui_devel(); + break; +*/ + } + } +} + +static void menu_tui_select (void) +{ + /* Menu dimensions & options */ + WINDOW *win; + int h; + int w; + int r; + int c; + h = 9; + w = 70; + r = 1; + c = (80 - w) / 2; + int N; + N = 3; + struct Alx_Menu mnu[3] = { + {6, 4, "[0] Back"}, + {2, 4, "[1] New map"}, + {4, 4, "[2] Load map"} + }; + + /* Menu loop */ + int sw; + win = newwin(h, w, r, c); + mvwprintw(win, mnu[2].r, mnu[2].c, "%s (File: \"%s\")", mnu[1].t, saved_name); + wrefresh(win); + sw = alx_menu_2(win, N, mnu, "SELECT MAP:"); + alx_win_del(win); + + /* Selection */ + switch (sw) { + case 1: + start_mode = START_RAND; + break; + + case 2: + start_mode = START_LOAD; + break; + } + +} + +static void menu_tui_level (void) +{ + /* Menu dimensions & options */ + int h; + int w; + h = 10; + w = 70; + int N; + N = 5; + struct Alx_Menu mnu[5] = { + {7, 4, "[0] Back"}, + {2, 4, "[1] Beginner"}, + {3, 4, "[2] Intermediate"}, + {4, 4, "[3] Expert"}, + {5, 4, "[4] Custom"} + }; + + /* Menu loop */ + int sw; + sw = alx_menu(h, w, N, mnu, "SELECT LEVEL:"); + + /* Selection */ + switch (sw) { + case 1: + menu_iface_variables.level = GAME_IFACE_LEVEL_BEGINNER; + break; + + case 2: + menu_iface_variables.level = GAME_IFACE_LEVEL_INTERMEDIATE; + break; + + case 3: + menu_iface_variables.level = GAME_IFACE_LEVEL_EXPERT; + break; + + case 4: + menu_iface_variables.level = GAME_IFACE_LEVEL_CUSTOM; + menu_tui_custom(); + break; + } + +} + +static void menu_tui_custom (void) +{ + /* Menu dimensions & options */ + WINDOW *win; + int h; + int w; + int r; + int c; + h = 16; + w = 76; + r = 1; + c = (80 - w) / 2; + int N; + N = 4; + struct Alx_Menu mnu[4] = { + {8, 4, "[0] Back"}, + {2, 4, "[1] Change rows:"}, + {4, 4, "[2] Change columns:"}, + {6, 4, "[3] Change proportion of mines:"} + }; + + /* Input box */ + int w2; + int r2; + w2 = w - 8; + r2 = r + h - 5; + char *txt[] = { + "Rows:", + "Columns:", + "Proportion:" + }; + + /* Menu */ + win = newwin(h, w, r, c); + + /* Menu loop */ + bool wh; + int sw; + wh = true; + while (wh) { + mvwprintw(win, mnu[1].r, mnu[1].c, "%s rows\t\t(%i)", + mnu[1].t, menu_iface_variables.rows); + mvwprintw(win, mnu[2].r, mnu[2].c, "%s cols\t\t(%i)", + mnu[2].t, menu_iface_variables.cols); + mvwprintw(win, mnu[3].r, mnu[3].c, "%s p\t(%lf)", + mnu[3].t, menu_iface_variables.p); + wrefresh(win); + + /* Selection */ + sw = alx_menu_2(win, N, mnu, "Custom:"); + + switch (sw) { + case 0: + wh = false; + break; + + case 1: + menu_iface_variables.rows = alx_w_getint(w2, r2, + txt[sw - 1], 2, menu_iface_variables.rows, ROWS_TUI_MAX, NULL); + break; + + case 2: + menu_iface_variables.cols = alx_w_getint(w2, r2, + txt[sw - 1], 2, menu_iface_variables.cols, COLS_TUI_MAX, NULL); + break; + + case 3: + menu_iface_variables.p = alx_w_getdbl(w2, r2, + txt[sw - 1], 0, menu_iface_variables.p, 1, NULL); + break; + } + + } + + /* Cleanup */ + alx_win_del(win); +} +#if 0 +static void menu_tui_devel (void) +{ + WINDOW *win; + int h; + int w; + int r; + int c; + h = 12; + w = 50; + r = 1; + c = (80 - w) / 2; + int N; + N = 2; + struct Alx_Menu mnu[2] = { + {5, 4, "[0] Back"}, + {2, 4, "[1] Change seed (srand)"} + }; + + /* Input box */ + int w2; + int r2; + w2 = w - 8; + r2 = r + h - 5; + char *txt[] = {"Seed:"}; + + /* Menu */ + win = newwin(h, w, r, c); + + /* Menu loop */ + bool wh; + int sw; + wh = true; + int seed; + while (wh) { + /* Selection */ + sw = alx_menu_2(win, N, mnu, "DEVELOPER OPTIONS:"); + + switch (sw) { + case 0: + wh = false; + break; + + case 1: + seed = alx_w_getint(w2, r2, txt[0], + -INFINITY, 1, INFINITY, NULL); + srand(seed); + break; + } + } + + /* Cleanup */ + alx_win_del(win); +} +#endif + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/menu/src/parser.c b/modules/menu/src/parser.c index 931c685..fed821d 100644 --- a/modules/menu/src/parser.c +++ b/modules/menu/src/parser.c @@ -1,226 +1,228 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <getopt.h>
- /* FILE & fopen() & snprintf() & FILENAME_MAX */
- #include <stdio.h>
- /* exit() */
- #include <stdlib.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- #include "alx_seed.h"
-
- #include "about.h"
- #include "game_iface.h"
- #include "player_iface.h"
- #include "save.h"
- #include "start.h"
-
- #include "menu_iface.h"
-
- #include "parser.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define OPT_LIST "xhLuv""a:b:f:i:p:r:s:"
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void parse_rows (char* argument);
-static void parse_columns (char* argument);
-static void parse_file (char* argument);
-static void parse_iface (char* argument);
-static void parse_proportion (char* argument);
-static void parse_rand_seed (char* argument);
-static void parse_start (char* argument);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void parser (int argc, char *argv[])
-{
- int opt = 0;
- int opt_index = 0;
-
- struct option long_options[] = {
- /* Standard */
- {"exit", no_argument, 0, 'x'},
- {"help", no_argument, 0, 'h'},
- {"license", no_argument, 0, 'L'},
- {"usage", no_argument, 0, 'u'},
- {"version", no_argument, 0, 'v'},
- /* Non-standard */
- {"rows", required_argument, 0, 'a'},
- {"columns", required_argument, 0, 'b'},
- {"file", required_argument, 0, 'f'},
- {"iface", required_argument, 0, 'i'},
- {"proportion", required_argument, 0, 'p'},
-// {"rand-seed", required_argument, 0, 'r'},
- {"start", required_argument, 0, 's'},
- /* Null */
- {0, 0, 0, 0}
- };
-
- while ((opt = getopt_long(argc, argv, OPT_LIST, long_options,
- &opt_index)) != -1) {
-
- switch (opt) {
- /* Standard */
- case 'x':
- flag_exit = true;
- break;
-
- case 'h':
- print_share_file(SHARE_HELP);
- exit(EXIT_SUCCESS);
-
- case 'L':
- print_share_file(SHARE_LICENSE);
- exit(EXIT_SUCCESS);
-
- case 'u':
- print_share_file(SHARE_USAGE);
- exit(EXIT_SUCCESS);
-
- case 'v':
- print_version();
- exit(EXIT_SUCCESS);
-
- /* Non-standard */
- case 'a':
- parse_rows(optarg);
- break;
-
- case 'b':
- parse_columns(optarg);
- break;
-
- case 'f':
- parse_file(optarg);
- break;
-
- case 'i':
- parse_iface(optarg);
- break;
-
- case 'p':
- parse_proportion(optarg);
- break;
-# if 0
-// for DEVEL
- case 'r':
- parse_rand_seed(optarg);
- break;
-# endif
- case 's':
- parse_start(optarg);
- break;
-
- case '?':
- /* getopt_long already printed an error message. */
-
- default:
- print_share_file(SHARE_USAGE);
- exit(EXIT_FAILURE);
- }
- }
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void parse_rows (char* argument)
-{
- menu_iface_variables.rows = atoi(argument);
- if (menu_iface_variables.rows < 2 || menu_iface_variables.rows > ROWS_MAX) {
- printf("--rows argument not valid\n");
- printf("It must be an integer [%i U %i]\n", 2, ROWS_MAX);
- exit(EXIT_FAILURE);
- }
-}
-
-static void parse_columns (char* argument)
-{
- menu_iface_variables.cols = atoi(argument);
- if (menu_iface_variables.cols < 2 || menu_iface_variables.cols > COLS_MAX) {
- printf("--columns argument not valid\n");
- printf("It must be an integer [%i U %i]\n", 2, COLS_MAX);
- exit(EXIT_FAILURE);
- }
-}
-
-static void parse_file (char* argument)
-{
- // FIXME
- FILE *fp;
- fp = fopen(argument, "r");
- if (!fp) {
- printf("--file argument not valid\n");
- printf("It must be a valid file name (relative to saved dir)\n");
- exit(EXIT_FAILURE);
- } else {
- fclose(fp);
-
- sprintf(saved_path, "");
- snprintf(saved_name, FILENAME_MAX, argument);
- }
-}
-
-static void parse_iface (char* argument)
-{
- menu_iface_mode = atoi(argument);
- player_iface_mode = menu_iface_mode;
- if (menu_iface_mode < MENU_IFACE_CLUI || menu_iface_mode > MENU_IFACE_GUI) {
- printf("--iface argument not valid\n");
- printf("It must be an integer [%i U %i]\n", MENU_IFACE_CLUI, MENU_IFACE_GUI);
- exit(EXIT_FAILURE);
- }
-}
-
-static void parse_proportion (char* argument)
-{
- menu_iface_variables.p = atof(argument);
- if (menu_iface_variables.p < 0 || menu_iface_variables.p > 1) {
- printf("--proportion argument not valid\n");
- printf("It must be a real [0 U 1]\n");
- exit(EXIT_FAILURE);
- }
-}
-
-static void parse_rand_seed (char* argument)
-{
- int seed;
- seed = atof(argument);
- srand(seed);
-}
-
-static void parse_start (char* argument)
-{
- start_mode = atoi(argument);
- if (start_mode < START_FOO || start_mode > START_LOAD) {
- printf("--start argument not valid\n");
- printf("It must be an integer [%i U %i]\n", START_FOO, START_LOAD);
- exit(EXIT_FAILURE);
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <getopt.h> + /* FILE & fopen() & snprintf() & FILENAME_MAX */ + #include <stdio.h> + /* exit() */ + #include <stdlib.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + #include "alx_seed.h" + + #include "about.h" + #include "game_iface.h" + #include "player_iface.h" + #include "save.h" + #include "start.h" + + #include "menu_iface.h" + + #include "parser.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define OPT_LIST "xhLuv""a:b:f:i:p:r:s:" + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void parse_rows (char *argument); +static void parse_columns (char *argument); +static void parse_file (char *argument); +static void parse_iface (char *argument); +static void parse_proportion (char *argument); +#if 0 +static void parse_rand_seed (char *argument); +#endif +static void parse_start (char *argument); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void parser (int argc, char *argv[]) +{ + int opt = 0; + int opt_index = 0; + + struct option long_options[] = { + /* Standard */ + {"exit", no_argument, 0, 'x'}, + {"help", no_argument, 0, 'h'}, + {"license", no_argument, 0, 'L'}, + {"usage", no_argument, 0, 'u'}, + {"version", no_argument, 0, 'v'}, + /* Non-standard */ + {"rows", required_argument, 0, 'a'}, + {"columns", required_argument, 0, 'b'}, + {"file", required_argument, 0, 'f'}, + {"iface", required_argument, 0, 'i'}, + {"proportion", required_argument, 0, 'p'}, +// {"rand-seed", required_argument, 0, 'r'}, + {"start", required_argument, 0, 's'}, + /* Null */ + {0, 0, 0, 0} + }; + + while ((opt = getopt_long(argc, argv, OPT_LIST, long_options, + &opt_index)) != -1) { + + switch (opt) { + /* Standard */ + case 'x': + flag_exit = true; + break; + + case 'h': + print_share_file(SHARE_HELP); + exit(EXIT_SUCCESS); + + case 'L': + print_share_file(SHARE_LICENSE); + exit(EXIT_SUCCESS); + + case 'u': + print_share_file(SHARE_USAGE); + exit(EXIT_SUCCESS); + + case 'v': + print_version(); + exit(EXIT_SUCCESS); + + /* Non-standard */ + case 'a': + parse_rows(optarg); + break; + + case 'b': + parse_columns(optarg); + break; + + case 'f': + parse_file(optarg); + break; + + case 'i': + parse_iface(optarg); + break; + + case 'p': + parse_proportion(optarg); + break; +# if 0 +// for DEVEL + case 'r': + parse_rand_seed(optarg); + break; +# endif + case 's': + parse_start(optarg); + break; + + case '?': + /* getopt_long already printed an error message. */ + + default: + print_share_file(SHARE_USAGE); + exit(EXIT_FAILURE); + } + } +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void parse_rows (char *argument) +{ + menu_iface_variables.rows = atoi(argument); + if (menu_iface_variables.rows < 2 || menu_iface_variables.rows > ROWS_MAX) { + printf("--rows argument not valid\n"); + printf("It must be an integer [%i U %i]\n", 2, ROWS_MAX); + exit(EXIT_FAILURE); + } +} + +static void parse_columns (char *argument) +{ + menu_iface_variables.cols = atoi(argument); + if (menu_iface_variables.cols < 2 || menu_iface_variables.cols > COLS_MAX) { + printf("--columns argument not valid\n"); + printf("It must be an integer [%i U %i]\n", 2, COLS_MAX); + exit(EXIT_FAILURE); + } +} + +static void parse_file (char *argument) +{ + // FIXME + FILE *fp; + fp = fopen(argument, "r"); + if (!fp) { + printf("--file argument not valid\n"); + printf("It must be a valid file name (relative to saved dir)\n"); + exit(EXIT_FAILURE); + } else { + fclose(fp); + + saved_path[0] = '\0'; + snprintf(saved_name, FILENAME_MAX, argument); + } +} + +static void parse_iface (char *argument) +{ + menu_iface_mode = atoi(argument); + player_iface_mode = menu_iface_mode; + if (menu_iface_mode < MENU_IFACE_CLUI || menu_iface_mode > MENU_IFACE_GUI) { + printf("--iface argument not valid\n"); + printf("It must be an integer [%i U %i]\n", MENU_IFACE_CLUI, MENU_IFACE_GUI); + exit(EXIT_FAILURE); + } +} + +static void parse_proportion (char *argument) +{ + menu_iface_variables.p = atof(argument); + if (menu_iface_variables.p < 0 || menu_iface_variables.p > 1) { + printf("--proportion argument not valid\n"); + printf("It must be a real [0 U 1]\n"); + exit(EXIT_FAILURE); + } +} +#if 0 +static void parse_rand_seed (char *argument) +{ + int seed; + seed = atof(argument); + srand(seed); +} +#endif +static void parse_start (char *argument) +{ + start_mode = atoi(argument); + if (start_mode < START_FOO || start_mode > START_LOAD) { + printf("--start argument not valid\n"); + printf("It must be an integer [%i U %i]\n", START_FOO, START_LOAD); + exit(EXIT_FAILURE); + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/inc/player_clui.h b/modules/player/inc/player_clui.h index 3ad3bcd..ffe7e25 100644 --- a/modules/player/inc/player_clui.h +++ b/modules/player/inc/player_clui.h @@ -1,74 +1,74 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_PLAYER_CLUI_H
- # define MSW_PLAYER_CLUI_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* struct Game_Iface_... */
- #include "game_iface.h"
-
- #include "player_iface.h"
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Player_CLUI_Char {
- PLAYER_CLUI_CHAR_ERROR = 'X',
- PLAYER_CLUI_CHAR_KBOOM = '#',
- PLAYER_CLUI_CHAR_HIDDEN_FIELD = '+',
- PLAYER_CLUI_CHAR_HIDDEN_MINE = '*',
- PLAYER_CLUI_CHAR_HIDDEN_SAFE = '-',
- PLAYER_CLUI_CHAR_SAFE_MINE = 'v',
- PLAYER_CLUI_CHAR_0 = ' ',
- PLAYER_CLUI_CHAR_1 = '1',
- PLAYER_CLUI_CHAR_2 = '2',
- PLAYER_CLUI_CHAR_3 = '3',
- PLAYER_CLUI_CHAR_4 = '4',
- PLAYER_CLUI_CHAR_5 = '5',
- PLAYER_CLUI_CHAR_6 = '6',
- PLAYER_CLUI_CHAR_7 = '7',
- PLAYER_CLUI_CHAR_8 = '8',
- PLAYER_CLUI_CHAR_FLAG = '!',
- PLAYER_CLUI_CHAR_FLAG_FALSE = 'F',
- PLAYER_CLUI_CHAR_POSSIBLE = '?',
- PLAYER_CLUI_CHAR_POSSIBLE_FALSE = 'f'
- };
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void player_clui_start (const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action);
-
-void player_clui (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action);
-
-void player_clui_save_name (const char *filepath, char *filename, int destsize);
-void player_clui_score_name (char *player_name, int destsize);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* player_clui.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_PLAYER_CLUI_H + # define MSW_PLAYER_CLUI_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* struct Game_Iface_... */ + #include "game_iface.h" + + #include "player_iface.h" + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Player_CLUI_Char { + PLAYER_CLUI_CHAR_ERROR = 'X', + PLAYER_CLUI_CHAR_KBOOM = '#', + PLAYER_CLUI_CHAR_HIDDEN_FIELD = '+', + PLAYER_CLUI_CHAR_HIDDEN_MINE = '*', + PLAYER_CLUI_CHAR_HIDDEN_SAFE = '-', + PLAYER_CLUI_CHAR_SAFE_MINE = 'v', + PLAYER_CLUI_CHAR_0 = ' ', + PLAYER_CLUI_CHAR_1 = '1', + PLAYER_CLUI_CHAR_2 = '2', + PLAYER_CLUI_CHAR_3 = '3', + PLAYER_CLUI_CHAR_4 = '4', + PLAYER_CLUI_CHAR_5 = '5', + PLAYER_CLUI_CHAR_6 = '6', + PLAYER_CLUI_CHAR_7 = '7', + PLAYER_CLUI_CHAR_8 = '8', + PLAYER_CLUI_CHAR_FLAG = '!', + PLAYER_CLUI_CHAR_FLAG_FALSE = 'F', + PLAYER_CLUI_CHAR_POSSIBLE = '?', + PLAYER_CLUI_CHAR_POSSIBLE_FALSE = 'f' + }; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void player_clui_start (const struct Player_Iface_Position *position, + const char *title, + const char *subtitle, + int *action); + +void player_clui (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, + const char *subtitle, + int *action); + +void player_clui_save_name (const char *filepath, char *filename, int destsize); +void player_clui_score_name (char *player_name, int destsize); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* player_clui.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/inc/player_gui.h b/modules/player/inc/player_gui.h index 5e6776d..d9eb579 100644 --- a/modules/player/inc/player_gui.h +++ b/modules/player/inc/player_gui.h @@ -1,81 +1,79 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_PLAYER_GUI_H
- # define MSW_PLAYER_GUI_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* struct Game_Iface_... */
- #include "game_iface.h"
-
- #include "player_iface.h"
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Player_GUI_Char {
- PLAYER_GUI_CHAR_ERROR = 'X',
- PLAYER_GUI_CHAR_KBOOM = '#',
- PLAYER_GUI_CHAR_HIDDEN_FIELD = '+',
- PLAYER_GUI_CHAR_HIDDEN_MINE = '*',
- PLAYER_GUI_CHAR_HIDDEN_SAFE = '-',
- PLAYER_GUI_CHAR_SAFE_MINE = 'v',
- PLAYER_GUI_CHAR_0 = ' ',
- PLAYER_GUI_CHAR_1 = '1',
- PLAYER_GUI_CHAR_2 = '2',
- PLAYER_GUI_CHAR_3 = '3',
- PLAYER_GUI_CHAR_4 = '4',
- PLAYER_GUI_CHAR_5 = '5',
- PLAYER_GUI_CHAR_6 = '6',
- PLAYER_GUI_CHAR_7 = '7',
- PLAYER_GUI_CHAR_8 = '8',
- PLAYER_GUI_CHAR_FLAG = '!',
- PLAYER_GUI_CHAR_FLAG_FALSE = 'F',
- PLAYER_GUI_CHAR_POSSIBLE = '?',
- PLAYER_GUI_CHAR_POSSIBLE_FALSE = 'f'
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void player_gui_init (struct Player_Iface_Position *position,
- int *action);
-
-int player_gui_start (struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-int player_gui (const struct Game_Iface_Out *board,
- struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-void player_gui_save_name (const char *filepath, char *filename, int destsize);
-void player_gui_score_name (char *player_name, int destsize);
-void player_gui_cleanup (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* player_gui.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_PLAYER_GUI_H + # define MSW_PLAYER_GUI_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* struct Game_Iface_... */ + #include "game_iface.h" + + #include "player_iface.h" + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Player_GUI_Char { + PLAYER_GUI_CHAR_ERROR = 'X', + PLAYER_GUI_CHAR_KBOOM = '#', + PLAYER_GUI_CHAR_HIDDEN_FIELD = '+', + PLAYER_GUI_CHAR_HIDDEN_MINE = '*', + PLAYER_GUI_CHAR_HIDDEN_SAFE = '-', + PLAYER_GUI_CHAR_SAFE_MINE = 'v', + PLAYER_GUI_CHAR_0 = ' ', + PLAYER_GUI_CHAR_1 = '1', + PLAYER_GUI_CHAR_2 = '2', + PLAYER_GUI_CHAR_3 = '3', + PLAYER_GUI_CHAR_4 = '4', + PLAYER_GUI_CHAR_5 = '5', + PLAYER_GUI_CHAR_6 = '6', + PLAYER_GUI_CHAR_7 = '7', + PLAYER_GUI_CHAR_8 = '8', + PLAYER_GUI_CHAR_FLAG = '!', + PLAYER_GUI_CHAR_FLAG_FALSE = 'F', + PLAYER_GUI_CHAR_POSSIBLE = '?', + PLAYER_GUI_CHAR_POSSIBLE_FALSE = 'f' + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void player_gui_init (struct Player_Iface_Position *position, + int *action); + +int player_gui_start (struct Player_Iface_Position *position, + const char *title, const char *subtitle); + +int player_gui (const struct Game_Iface_Out *board, + struct Player_Iface_Position *position, + const char *title, const char *subtitle); + +void player_gui_save_name (const char *fpath, char *fname, int destsize); +void player_gui_score_name (char *player_name, int destsize); +void player_gui_cleanup (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* player_gui.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/inc/player_iface.h b/modules/player/inc/player_iface.h index a60a0ac..d936dc6 100644 --- a/modules/player/inc/player_iface.h +++ b/modules/player/inc/player_iface.h @@ -1,93 +1,93 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_PLAYER_IFACE_H
- # define MSW_PLAYER_IFACE_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* struct Game_Iface_... */
- #include "game_iface.h"
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Player_Iface_Mode {
- PLAYER_IFACE_FOO = 0,
- PLAYER_IFACE_CLUI,
- PLAYER_IFACE_TUI,
- PLAYER_IFACE_GUI
- };
-
- enum Player_Iface_Action {
- PLAYER_IFACE_ACT_FOO,
- PLAYER_IFACE_ACT_STEP,
- PLAYER_IFACE_ACT_FLAG,
- PLAYER_IFACE_ACT_FLAG_POSSIBLE,
- PLAYER_IFACE_ACT_RM_FLAG,
-
- PLAYER_IFACE_ACT_PAUSE,
- PLAYER_IFACE_ACT_SAVE,
- PLAYER_IFACE_ACT_XYZZY_ON,
- PLAYER_IFACE_ACT_XYZZY_OFF,
- PLAYER_IFACE_ACT_XYZZY_LIN,
- PLAYER_IFACE_ACT_XYZZY_P,
- PLAYER_IFACE_ACT_XYZZY_NP,
- PLAYER_IFACE_ACT_QUIT,
-
- PLAYER_IFACE_ACT_MOVE_UP,
- PLAYER_IFACE_ACT_MOVE_DOWN,
- PLAYER_IFACE_ACT_MOVE_RIGHT,
- PLAYER_IFACE_ACT_MOVE_LEFT,
- PLAYER_IFACE_ACT_HIGHLIGHT
- };
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
- struct Player_Iface_Position {
- int rows;
- int cols;
- int row;
- int col;
- int highlight;
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern int player_iface_mode;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void player_iface_init (int rows, int cols);
-int player_iface_start (int *pos_row, int *pos_col);
-void player_iface (const struct Game_Iface_Out *game_iface_out,
- const struct Game_Iface_Score *game_iface_score,
- struct Game_Iface_In *game_iface_in);
-void player_iface_save_name (const char *filepath, char *filename, int destsize);
-void player_iface_score_name (char *player_name, int destsize);
-void player_iface_cleanup (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* player_iface.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_PLAYER_IFACE_H + # define MSW_PLAYER_IFACE_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* struct Game_Iface_... */ + #include "game_iface.h" + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Player_Iface_Mode { + PLAYER_IFACE_FOO = 0, + PLAYER_IFACE_CLUI, + PLAYER_IFACE_TUI, + PLAYER_IFACE_GUI + }; + + enum Player_Iface_Action { + PLAYER_IFACE_ACT_FOO, + PLAYER_IFACE_ACT_STEP, + PLAYER_IFACE_ACT_FLAG, + PLAYER_IFACE_ACT_FLAG_POSSIBLE, + PLAYER_IFACE_ACT_RM_FLAG, + + PLAYER_IFACE_ACT_PAUSE, + PLAYER_IFACE_ACT_SAVE, + PLAYER_IFACE_ACT_XYZZY_ON, + PLAYER_IFACE_ACT_XYZZY_OFF, + PLAYER_IFACE_ACT_XYZZY_LIN, + PLAYER_IFACE_ACT_XYZZY_P, + PLAYER_IFACE_ACT_XYZZY_NP, + PLAYER_IFACE_ACT_QUIT, + + PLAYER_IFACE_ACT_MOVE_UP, + PLAYER_IFACE_ACT_MOVE_DOWN, + PLAYER_IFACE_ACT_MOVE_RIGHT, + PLAYER_IFACE_ACT_MOVE_LEFT, + PLAYER_IFACE_ACT_HIGHLIGHT + }; + + +/****************************************************************************** + ******* structs ************************************************************** + ******************************************************************************/ + struct Player_Iface_Position { + int rows; + int cols; + int row; + int col; + int highlight; + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern int player_iface_mode; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void player_iface_init (int rows, int cols); +int player_iface_start (int *row, int *col); +void player_iface (const struct Game_Iface_Out *out, + const struct Game_Iface_Score *score, + struct Game_Iface_In *in); +void player_iface_save_name (const char *fpath, char *fname, int destsize); +void player_iface_score_name (char *player_name, int destsize); +void player_iface_cleanup (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* player_iface.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/inc/player_tui.h b/modules/player/inc/player_tui.h index b27748b..4af3cae 100644 --- a/modules/player/inc/player_tui.h +++ b/modules/player/inc/player_tui.h @@ -1,120 +1,114 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_PLAYER_TUI_H
- # define MSW_PLAYER_TUI_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <stdbool.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* struct Game_Iface_... */
- #include "game_iface.h"
-
- #include "player_iface.h"
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Player_TUI_Char {
- PLAYER_TUI_CHAR_ERROR = 'X',
- PLAYER_TUI_CHAR_KBOOM = '#',
- PLAYER_TUI_CHAR_HIDDEN_FIELD = '+',
- PLAYER_TUI_CHAR_HIDDEN_MINE = '*',
- PLAYER_TUI_CHAR_HIDDEN_SAFE = '-',
- PLAYER_TUI_CHAR_SAFE_MINE = 'v',
- PLAYER_TUI_CHAR_0 = ' ',
- PLAYER_TUI_CHAR_1 = '1',
- PLAYER_TUI_CHAR_2 = '2',
- PLAYER_TUI_CHAR_3 = '3',
- PLAYER_TUI_CHAR_4 = '4',
- PLAYER_TUI_CHAR_5 = '5',
- PLAYER_TUI_CHAR_6 = '6',
- PLAYER_TUI_CHAR_7 = '7',
- PLAYER_TUI_CHAR_8 = '8',
- PLAYER_TUI_CHAR_FLAG = '!',
- PLAYER_TUI_CHAR_FLAG_FALSE = 'F',
- PLAYER_TUI_CHAR_POSSIBLE = '?',
- PLAYER_TUI_CHAR_POSSIBLE_FALSE = 'f'
- };
-
- enum Color_Pairs {
- /* Clear */
- PAIR_1 = 1,
- PAIR_2,
- PAIR_3,
- PAIR_4,
- PAIR_5,
- PAIR_6,
- PAIR_7,
- PAIR_8,
- PAIR_BLANK,
- /* Hidden */
- PAIR_MINE,
- PAIR_HIDDEN,
- /* Possible */
- PAIR_fail,
- PAIR_POSSIBLE,
- /* Flag */
- PAIR_FAIL,
- PAIR_FLAG,
- /* kboom */
- PAIR_KBOOM,
- /* Highlight */
- PAIR_HILITE,
-
- /* Terminal colors */
- PAIR_TERM
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern bool flag_color;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void player_tui_init (int rows, int cols);
-
-int player_tui_start (const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action);
-
-int player_tui (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action);
-
-void player_tui_save_name (const char *filepath, char *filename, int destsize);
-void player_tui_score_name (char *player_name, int destsize);
-void player_tui_cleanup (void);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* player_tui.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_PLAYER_TUI_H + # define MSW_PLAYER_TUI_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + #include <stdbool.h> + +/* Project -------------------------------------------------------------------*/ + /* struct Game_Iface_... */ + #include "game_iface.h" + + #include "player_iface.h" + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Player_TUI_Char { + PLAYER_TUI_CHAR_ERROR = 'X', + PLAYER_TUI_CHAR_KBOOM = '#', + PLAYER_TUI_CHAR_HIDDEN_FIELD = '+', + PLAYER_TUI_CHAR_HIDDEN_MINE = '*', + PLAYER_TUI_CHAR_HIDDEN_SAFE = '-', + PLAYER_TUI_CHAR_SAFE_MINE = 'v', + PLAYER_TUI_CHAR_0 = ' ', + PLAYER_TUI_CHAR_1 = '1', + PLAYER_TUI_CHAR_2 = '2', + PLAYER_TUI_CHAR_3 = '3', + PLAYER_TUI_CHAR_4 = '4', + PLAYER_TUI_CHAR_5 = '5', + PLAYER_TUI_CHAR_6 = '6', + PLAYER_TUI_CHAR_7 = '7', + PLAYER_TUI_CHAR_8 = '8', + PLAYER_TUI_CHAR_FLAG = '!', + PLAYER_TUI_CHAR_FLAG_FALSE = 'F', + PLAYER_TUI_CHAR_POSSIBLE = '?', + PLAYER_TUI_CHAR_POSSIBLE_FALSE = 'f' + }; + + enum Color_Pairs { + /* Clear */ + PAIR_1 = 1, + PAIR_2, + PAIR_3, + PAIR_4, + PAIR_5, + PAIR_6, + PAIR_7, + PAIR_8, + PAIR_BLANK, + /* Hidden */ + PAIR_MINE, + PAIR_HIDDEN, + /* Possible */ + PAIR_fail, + PAIR_POSSIBLE, + /* Flag */ + PAIR_FAIL, + PAIR_FLAG, + /* kboom */ + PAIR_KBOOM, + /* Highlight */ + PAIR_HILITE, + + /* Terminal colors */ + PAIR_TERM + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern bool flag_color; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void player_tui_init (int rows, int cols); + +int player_tui_start (const struct Player_Iface_Position *position, + const char *title, const char *subtitle, + int *action); + +int player_tui (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, const char *subtitle, + int *action); + +void player_tui_save_name (const char *fpath, char *fname, int destsize); +void player_tui_score_name (char *player_name, int destsize); +void player_tui_cleanup (void); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* player_tui.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/src/player_clui.c b/modules/player/src/player_clui.c index c947aea..06ca591 100644 --- a/modules/player/src/player_clui.c +++ b/modules/player/src/player_clui.c @@ -1,519 +1,519 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <stdbool.h>
- /* printf() & sscanf() */
- #include <stdio.h>
- #include <wchar.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* struct Game_Iface_Out */
- #include "game_iface.h"
-
- /* struct Player_Iface_Position */
- #include "player_iface.h"
-
- #include "player_clui.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define BUFF_SIZE (1024)
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-static int oldaction;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Start */
-static void show_board_start(const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-static void board_loop_start(const struct Player_Iface_Position *position);
-
- /* Play */
-static void show_board (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-static void board_loop (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position);
-
-static char set_char (int game_iface_visible);
- /* Input */
-static int usr_input (void);
- /* Help */
-static void show_help (const struct Game_Iface_Out *board);
-static void show_help_start (void);
-static void show_help_play (void);
-static void show_help_pause (void);
-static void show_help_xyzzy (void);
-static void show_help_cheat (void);
-static void show_help_safe (void);
-static void show_help_gameover (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void player_clui_start (const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action)
-{
- /* User action */
- show_help_start();
- show_board_start(position, title, subtitle);
-
- *action = usr_input();
- oldaction = *action;
-}
-
-void player_clui (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action)
-{
- /* User action */
-
-
- if (oldaction != PLAYER_IFACE_ACT_FOO) {
- show_help(board);
- show_board(board, position, title, subtitle);
- }
- *action = usr_input();
- oldaction = *action;
-}
-
-void player_clui_save_name (const char *filepath, char *filename, int destsize)
-{
- puts("File name:");
- fgets(filename, destsize, stdin);
-}
-
-void player_clui_score_name (char *player_name, int destsize)
-{
- puts("Your name:");
- fgets(player_name, destsize, stdin);
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Start * * * * * * *
- * * * * * * * * * */
-static void show_board_start(const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- /* Title */
- puts("________________________________________________________________________________");
-
- /* Board */
- board_loop_start(position);
-
- /* Subtitle & title */
- printf("%s - %s\n", subtitle, title);
- puts("--------------------------------------------------------------------------------");
-}
-
-static void board_loop_start(const struct Player_Iface_Position *position)
-{
- int i;
- int j;
- char ch;
-
- putchar('\n');
- for (i = 0; i < position->rows; i++) {
- for (j = 0; j < position->cols; j++) {
- ch = PLAYER_CLUI_CHAR_HIDDEN_FIELD;
-
- /* Print char */
- if (i == position->row && j == position->col) {
- putchar('<');
- putchar(ch);
- putchar('>');
- } else {
- putchar(' ');
- putchar(ch);
- putchar(' ');
- }
- }
- putchar('\n');
- }
- putchar('\n');
-}
-
-/* * * * * * * * * *
- * * * Play * * * * * *
- * * * * * * * * * */
-static void show_board (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- puts("________________________________________________________________________________");
-
- /* Board */
- board_loop(board, position);
-
- /* Subtitle & title */
- printf("%s - %s\n", subtitle, title);
- puts("--------------------------------------------------------------------------------");
-
-}
-
-static void board_loop (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position)
-{
- int i;
- int j;
- char ch;
-
- putchar('\n');
- for (i = 0; i < board->rows; i++) {
- for (j = 0; j < board->cols; j++) {
- ch = set_char(board->visible[i][j]);
-
- /* Print char */
- if (i == position->row && j == position->col) {
- putchar('<');
- putchar(ch);
- putchar('>');
- } else {
- putchar(' ');
- putchar(ch);
- putchar(' ');
- }
- }
- putchar('\n');
- }
- putchar('\n');
-}
-
-static char set_char (int game_iface_visible)
-{
- char ch;
- switch (game_iface_visible) {
- case GAME_IFACE_VIS_KBOOM:
- ch = PLAYER_CLUI_CHAR_KBOOM;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_FIELD:
- ch = PLAYER_CLUI_CHAR_HIDDEN_FIELD;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_MINE:
- ch = PLAYER_CLUI_CHAR_HIDDEN_MINE;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_SAFE:
- ch = PLAYER_CLUI_CHAR_HIDDEN_SAFE;
- break;
-
- case GAME_IFACE_VIS_SAFE_MINE:
- ch = PLAYER_CLUI_CHAR_SAFE_MINE;
- break;
-
- case GAME_IFACE_VIS_0:
- ch = PLAYER_CLUI_CHAR_0;
- break;
-
- case GAME_IFACE_VIS_1:
- ch = PLAYER_CLUI_CHAR_1;
- break;
-
- case GAME_IFACE_VIS_2:
- ch = PLAYER_CLUI_CHAR_2;
- break;
-
- case GAME_IFACE_VIS_3:
- ch = PLAYER_CLUI_CHAR_3;
- break;
-
- case GAME_IFACE_VIS_4:
- ch = PLAYER_CLUI_CHAR_4;
- break;
-
- case GAME_IFACE_VIS_5:
- ch = PLAYER_CLUI_CHAR_5;
- break;
-
- case GAME_IFACE_VIS_6:
- ch = PLAYER_CLUI_CHAR_6;
- break;
-
- case GAME_IFACE_VIS_7:
- ch = PLAYER_CLUI_CHAR_7;
- break;
-
- case GAME_IFACE_VIS_8:
- ch = PLAYER_CLUI_CHAR_8;
- break;
-
- case GAME_IFACE_VIS_FLAG:
- ch = PLAYER_CLUI_CHAR_FLAG;
- break;
-
- case GAME_IFACE_VIS_FLAG_FALSE:
- ch = PLAYER_CLUI_CHAR_FLAG_FALSE;
- break;
-
- case GAME_IFACE_VIS_POSSIBLE:
- ch = PLAYER_CLUI_CHAR_POSSIBLE;
- break;
-
- case GAME_IFACE_VIS_POSSIBLE_FALSE:
- ch = PLAYER_CLUI_CHAR_POSSIBLE_FALSE;
- break;
-
- default:
- ch = PLAYER_CLUI_CHAR_ERROR;
- break;
- }
-
- return ch;
-}
-
-/* * * * * * * * * *
- * * * Input * * * * * * *
- * * * * * * * * * */
-static int usr_input (void)
-{
- /* Wait for input */
- char buff [BUFF_SIZE];
- char ch;
- buff[0] = '\0';
- ch = '\0';
- fgets(buff, BUFF_SIZE, stdin);
-
- /* Interpret input */
- int action;
- action = PLAYER_IFACE_ACT_FOO;
- sscanf(buff, "%c", &ch);
- switch (ch) {
- /* Escape sequence */
- case 27:
- /* Arrows */
- sscanf(buff, "%*c""%c", &ch);
- switch (ch) {
- case 91:
- sscanf(buff, "%*2c""%c", &ch);
- switch (ch) {
- case 65:
- action = PLAYER_IFACE_ACT_MOVE_UP;
- break;
-
- case 66:
- action = PLAYER_IFACE_ACT_MOVE_DOWN;
- break;
-
- case 67:
- action = PLAYER_IFACE_ACT_MOVE_RIGHT;
- break;
-
- case 68:
- action = PLAYER_IFACE_ACT_MOVE_LEFT;
- break;
- }
- break;
- }
- break;
-
- case 'h':
- action = PLAYER_IFACE_ACT_MOVE_LEFT;
- break;
-
- case 'j':
- action = PLAYER_IFACE_ACT_MOVE_DOWN;
- break;
-
- case 'k':
- action = PLAYER_IFACE_ACT_MOVE_UP;
- break;
-
- case 'l':
- action = PLAYER_IFACE_ACT_MOVE_RIGHT;
- break;
-
- case '+':
- action = PLAYER_IFACE_ACT_STEP;
- break;
-
- case ' ':
- action = PLAYER_IFACE_ACT_FLAG;
- break;
-
- case 'f':
- action = PLAYER_IFACE_ACT_FLAG_POSSIBLE;
- break;
-
- /* ASCII 0x08 is BS */
- case 0x7F:
- case 0x08:
- action = PLAYER_IFACE_ACT_RM_FLAG;
- break;
-
- case 'p':
- action = PLAYER_IFACE_ACT_PAUSE;
- break;
-
- case 's':
- action = PLAYER_IFACE_ACT_SAVE;
- break;
-
- case 'x':
- /* Special sequence "xyzzy" */
- sscanf(buff, "%*c""%c", &ch);
- if (ch == 'y') {
- sscanf(buff, "%*2c""%c", &ch);
- if (ch == 'z') {
- sscanf(buff, "%*3c""%c", &ch);
- if (ch == 'z') {
- sscanf(buff, "%*4c""%c", &ch);
- if (ch == 'y') {
- action = PLAYER_IFACE_ACT_XYZZY_ON;
- }
- }
- }
- }
- break;
-
- case '0':
- action = PLAYER_IFACE_ACT_XYZZY_OFF;
- break;
-
- case '1':
- action = PLAYER_IFACE_ACT_XYZZY_LIN;
- break;
-
- case '2':
- action = PLAYER_IFACE_ACT_XYZZY_P;
- break;
-
- case '3':
- action = PLAYER_IFACE_ACT_XYZZY_NP;
- break;
-
- case 'q':
- action = PLAYER_IFACE_ACT_QUIT;
- break;
- }
-
- return action;
-}
-
-/* * * * * * * * * *
- * * * Help * * * * * * *
- * * * * * * * * * */
-static void show_help (const struct Game_Iface_Out *board)
-{
- switch (board->state) {
- case GAME_IFACE_STATE_PLAYING:
- show_help_play();
- break;
-
- case GAME_IFACE_STATE_PAUSE:
- show_help_pause();
- break;
-
- case GAME_IFACE_STATE_XYZZY:
- show_help_xyzzy();
- break;
-
- case GAME_IFACE_STATE_CHEATED:
- show_help_cheat();
- break;
-
- case GAME_IFACE_STATE_SAFE:
- show_help_safe();
- break;
-
- case GAME_IFACE_STATE_GAMEOVER:
- show_help_gameover();
- break;
- }
-}
-
-static void show_help_start (void)
-{
- puts( "Move " "|Step " "|Quit " "|Confirm");
- printf(" %c%c%c%c %c%c%c%c| %c ""| %c ""| Enter\n",
- 'h','j','k','l',
- '<','v','^','>',
- '+', 'q');
-}
-
-static void show_help_play (void)
-{
- puts( "Move " "|Step " "|Flag |? " "|Remove |Pause " "|Save " "|Quit " "|Confirm");
- printf(" %c%c%c%c %c%c%c%c| %c ""| Space| %c""| BS | %c ""| %c ""| %c ""| Enter\n",
- 'h','j','k','l',
- '<','v','^','>',
- '+', 'f', 'p', 's', 'q');
-}
-
-static void show_help_pause (void)
-{
- puts( "Continue " "|Save " "|Quit " "|Confirm");
- printf(" %c ""| %c ""| %c ""| Enter",
- 'p', 's', 'q');
-}
-
-static void show_help_xyzzy (void)
-{
- puts( "XYZZY |Move " "|Step " "|Flag |? " "|Remove |Save " "|Quit " "|Confirm");
- printf(" 0 1 2| %c%c%c%c %c%c%c%c| %c ""| Space| %c""| BS | %c ""| %c ""| Enter\n",
- 'h','j','k','l',
- '<','v','^','>',
- '+', 'f', 's', 'q');
-}
-
-static void show_help_cheat (void)
-{
- puts( "Move " "|Step " "|Flag |? " "|Remove |Save " "|Quit " "|Confirm");
- printf(" %c%c%c%c %c%c%c%c| %c ""| Space| %c""| BS | %c ""| %c ""| Enter\n",
- 'h','j','k','l',
- '<','v','^','>',
- '+', 'f', 's', 'q');
-}
-
-static void show_help_safe (void)
-{
- puts( "Save " "|Quit " "|Confirm");
- printf(" %c ""| %c ""| Enter\n",
- 's', 'q');
-}
-
-static void show_help_gameover (void)
-{
- puts( "Quit " "|Confirm");
- printf(" %c ""| Enter\n",
- 'q');
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <stdbool.h> + /* printf() & sscanf() */ + #include <stdio.h> + #include <wchar.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + /* struct Game_Iface_Out */ + #include "game_iface.h" + + /* struct Player_Iface_Position */ + #include "player_iface.h" + + #include "player_clui.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define BUFF_SIZE (1024) + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +static int oldaction; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Start */ +static void show_board_start(const struct Player_Iface_Position *position, + const char *title, + const char *subtitle); + +static void board_loop_start(const struct Player_Iface_Position *position); + + /* Play */ +static void show_board (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, + const char *subtitle); + +static void board_loop (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position); + +static char set_char (int game_iface_visible); + /* Input */ +static int usr_input (void); + /* Help */ +static void show_help (const struct Game_Iface_Out *board); +static void show_help_start (void); +static void show_help_play (void); +static void show_help_pause (void); +static void show_help_xyzzy (void); +static void show_help_cheat (void); +static void show_help_safe (void); +static void show_help_gameover (void); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void player_clui_start (const struct Player_Iface_Position *position, + const char *title, + const char *subtitle, + int *action) +{ + /* User action */ + show_help_start(); + show_board_start(position, title, subtitle); + + *action = usr_input(); + oldaction = *action; +} + +void player_clui (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, + const char *subtitle, + int *action) +{ + /* User action */ + + + if (oldaction != PLAYER_IFACE_ACT_FOO) { + show_help(board); + show_board(board, position, title, subtitle); + } + *action = usr_input(); + oldaction = *action; +} + +void player_clui_save_name (const char *filepath, char *filename, int destsize) +{ + puts("File name:"); + fgets(filename, destsize, stdin); +} + +void player_clui_score_name (char *player_name, int destsize) +{ + puts("Your name:"); + fgets(player_name, destsize, stdin); +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Start * * * * * * * + * * * * * * * * * */ +static void show_board_start(const struct Player_Iface_Position *position, + const char *title, + const char *subtitle) +{ + /* Title */ + puts("________________________________________________________________________________"); + + /* Board */ + board_loop_start(position); + + /* Subtitle & title */ + printf("%s - %s\n", subtitle, title); + puts("--------------------------------------------------------------------------------"); +} + +static void board_loop_start(const struct Player_Iface_Position *position) +{ + int i; + int j; + char ch; + + putchar('\n'); + for (i = 0; i < position->rows; i++) { + for (j = 0; j < position->cols; j++) { + ch = PLAYER_CLUI_CHAR_HIDDEN_FIELD; + + /* Print char */ + if (i == position->row && j == position->col) { + putchar('<'); + putchar(ch); + putchar('>'); + } else { + putchar(' '); + putchar(ch); + putchar(' '); + } + } + putchar('\n'); + } + putchar('\n'); +} + +/* * * * * * * * * * + * * * Play * * * * * * + * * * * * * * * * */ +static void show_board (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, + const char *subtitle) +{ + puts("________________________________________________________________________________"); + + /* Board */ + board_loop(board, position); + + /* Subtitle & title */ + printf("%s - %s\n", subtitle, title); + puts("--------------------------------------------------------------------------------"); + +} + +static void board_loop (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position) +{ + int i; + int j; + char ch; + + putchar('\n'); + for (i = 0; i < board->rows; i++) { + for (j = 0; j < board->cols; j++) { + ch = set_char(board->visible[i][j]); + + /* Print char */ + if (i == position->row && j == position->col) { + putchar('<'); + putchar(ch); + putchar('>'); + } else { + putchar(' '); + putchar(ch); + putchar(' '); + } + } + putchar('\n'); + } + putchar('\n'); +} + +static char set_char (int game_iface_visible) +{ + char ch; + switch (game_iface_visible) { + case GAME_IFACE_VIS_KBOOM: + ch = PLAYER_CLUI_CHAR_KBOOM; + break; + + case GAME_IFACE_VIS_HIDDEN_FIELD: + ch = PLAYER_CLUI_CHAR_HIDDEN_FIELD; + break; + + case GAME_IFACE_VIS_HIDDEN_MINE: + ch = PLAYER_CLUI_CHAR_HIDDEN_MINE; + break; + + case GAME_IFACE_VIS_HIDDEN_SAFE: + ch = PLAYER_CLUI_CHAR_HIDDEN_SAFE; + break; + + case GAME_IFACE_VIS_SAFE_MINE: + ch = PLAYER_CLUI_CHAR_SAFE_MINE; + break; + + case GAME_IFACE_VIS_0: + ch = PLAYER_CLUI_CHAR_0; + break; + + case GAME_IFACE_VIS_1: + ch = PLAYER_CLUI_CHAR_1; + break; + + case GAME_IFACE_VIS_2: + ch = PLAYER_CLUI_CHAR_2; + break; + + case GAME_IFACE_VIS_3: + ch = PLAYER_CLUI_CHAR_3; + break; + + case GAME_IFACE_VIS_4: + ch = PLAYER_CLUI_CHAR_4; + break; + + case GAME_IFACE_VIS_5: + ch = PLAYER_CLUI_CHAR_5; + break; + + case GAME_IFACE_VIS_6: + ch = PLAYER_CLUI_CHAR_6; + break; + + case GAME_IFACE_VIS_7: + ch = PLAYER_CLUI_CHAR_7; + break; + + case GAME_IFACE_VIS_8: + ch = PLAYER_CLUI_CHAR_8; + break; + + case GAME_IFACE_VIS_FLAG: + ch = PLAYER_CLUI_CHAR_FLAG; + break; + + case GAME_IFACE_VIS_FLAG_FALSE: + ch = PLAYER_CLUI_CHAR_FLAG_FALSE; + break; + + case GAME_IFACE_VIS_POSSIBLE: + ch = PLAYER_CLUI_CHAR_POSSIBLE; + break; + + case GAME_IFACE_VIS_POSSIBLE_FALSE: + ch = PLAYER_CLUI_CHAR_POSSIBLE_FALSE; + break; + + default: + ch = PLAYER_CLUI_CHAR_ERROR; + break; + } + + return ch; +} + +/* * * * * * * * * * + * * * Input * * * * * * * + * * * * * * * * * */ +static int usr_input (void) +{ + /* Wait for input */ + char buff [BUFF_SIZE]; + char ch; + buff[0] = '\0'; + ch = '\0'; + fgets(buff, BUFF_SIZE, stdin); + + /* Interpret input */ + int action; + action = PLAYER_IFACE_ACT_FOO; + sscanf(buff, "%c", &ch); + switch (ch) { + /* Escape sequence */ + case 27: + /* Arrows */ + sscanf(buff, "%*c""%c", &ch); + switch (ch) { + case 91: + sscanf(buff, "%*2c""%c", &ch); + switch (ch) { + case 65: + action = PLAYER_IFACE_ACT_MOVE_UP; + break; + + case 66: + action = PLAYER_IFACE_ACT_MOVE_DOWN; + break; + + case 67: + action = PLAYER_IFACE_ACT_MOVE_RIGHT; + break; + + case 68: + action = PLAYER_IFACE_ACT_MOVE_LEFT; + break; + } + break; + } + break; + + case 'h': + action = PLAYER_IFACE_ACT_MOVE_LEFT; + break; + + case 'j': + action = PLAYER_IFACE_ACT_MOVE_DOWN; + break; + + case 'k': + action = PLAYER_IFACE_ACT_MOVE_UP; + break; + + case 'l': + action = PLAYER_IFACE_ACT_MOVE_RIGHT; + break; + + case '+': + action = PLAYER_IFACE_ACT_STEP; + break; + + case ' ': + action = PLAYER_IFACE_ACT_FLAG; + break; + + case 'f': + action = PLAYER_IFACE_ACT_FLAG_POSSIBLE; + break; + + /* ASCII 0x08 is BS */ + case 0x7F: + case 0x08: + action = PLAYER_IFACE_ACT_RM_FLAG; + break; + + case 'p': + action = PLAYER_IFACE_ACT_PAUSE; + break; + + case 's': + action = PLAYER_IFACE_ACT_SAVE; + break; + + case 'x': + /* Special sequence "xyzzy" */ + sscanf(buff, "%*c""%c", &ch); + if (ch == 'y') { + sscanf(buff, "%*2c""%c", &ch); + if (ch == 'z') { + sscanf(buff, "%*3c""%c", &ch); + if (ch == 'z') { + sscanf(buff, "%*4c""%c", &ch); + if (ch == 'y') { + action = PLAYER_IFACE_ACT_XYZZY_ON; + } + } + } + } + break; + + case '0': + action = PLAYER_IFACE_ACT_XYZZY_OFF; + break; + + case '1': + action = PLAYER_IFACE_ACT_XYZZY_LIN; + break; + + case '2': + action = PLAYER_IFACE_ACT_XYZZY_P; + break; + + case '3': + action = PLAYER_IFACE_ACT_XYZZY_NP; + break; + + case 'q': + action = PLAYER_IFACE_ACT_QUIT; + break; + } + + return action; +} + +/* * * * * * * * * * + * * * Help * * * * * * * + * * * * * * * * * */ +static void show_help (const struct Game_Iface_Out *board) +{ + switch (board->state) { + case GAME_IFACE_STATE_PLAYING: + show_help_play(); + break; + + case GAME_IFACE_STATE_PAUSE: + show_help_pause(); + break; + + case GAME_IFACE_STATE_XYZZY: + show_help_xyzzy(); + break; + + case GAME_IFACE_STATE_CHEATED: + show_help_cheat(); + break; + + case GAME_IFACE_STATE_SAFE: + show_help_safe(); + break; + + case GAME_IFACE_STATE_GAMEOVER: + show_help_gameover(); + break; + } +} + +static void show_help_start (void) +{ + puts( "Move " "|Step " "|Quit " "|Confirm"); + printf(" %c%c%c%c %c%c%c%c| %c ""| %c ""| Enter\n", + 'h','j','k','l', + '<','v','^','>', + '+', 'q'); +} + +static void show_help_play (void) +{ + puts( "Move " "|Step " "|Flag |? " "|Remove |Pause " "|Save " "|Quit " "|Confirm"); + printf(" %c%c%c%c %c%c%c%c| %c ""| Space| %c""| BS | %c ""| %c ""| %c ""| Enter\n", + 'h','j','k','l', + '<','v','^','>', + '+', 'f', 'p', 's', 'q'); +} + +static void show_help_pause (void) +{ + puts( "Continue " "|Save " "|Quit " "|Confirm"); + printf(" %c ""| %c ""| %c ""| Enter", + 'p', 's', 'q'); +} + +static void show_help_xyzzy (void) +{ + puts( "XYZZY |Move " "|Step " "|Flag |? " "|Remove |Save " "|Quit " "|Confirm"); + printf(" 0 1 2| %c%c%c%c %c%c%c%c| %c ""| Space| %c""| BS | %c ""| %c ""| Enter\n", + 'h','j','k','l', + '<','v','^','>', + '+', 'f', 's', 'q'); +} + +static void show_help_cheat (void) +{ + puts( "Move " "|Step " "|Flag |? " "|Remove |Save " "|Quit " "|Confirm"); + printf(" %c%c%c%c %c%c%c%c| %c ""| Space| %c""| BS | %c ""| %c ""| Enter\n", + 'h','j','k','l', + '<','v','^','>', + '+', 'f', 's', 'q'); +} + +static void show_help_safe (void) +{ + puts( "Save " "|Quit " "|Confirm"); + printf(" %c ""| %c ""| Enter\n", + 's', 'q'); +} + +static void show_help_gameover (void) +{ + puts( "Quit " "|Confirm"); + printf(" %c ""| Enter\n", + 'q'); +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/src/player_gui.c b/modules/player/src/player_gui.c index ae05171..40523da 100644 --- a/modules/player/src/player_gui.c +++ b/modules/player/src/player_gui.c @@ -1,990 +1,973 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <gtk/gtk.h>
- /* fmod */
- #include <math.h>
- /* true & false */
- #include <stdbool.h>
- /* snprintf() */
- #include <stdio.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* alx_sscan_fname() */
- #include "alx_input.h"
-
- /* struct Game_Iface_Out */
- #include "game_iface.h"
- /* window_gui */
- #include "menu_gui.h"
-
- /* struct Player_Iface_Position */
- #include "player_iface.h"
-
- #include "player_gui.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define LINE_SIZE (80)
- # define REFRESH_TIME_MS (100)
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
-enum Buttons {
- BTN_CH_OFF = 0,
- BTN_CH_1,
- BTN_CH_2,
- BTN_SAVE,
- BTN_QUIT,
- BTN_QTTY
-};
-
-enum TButtons {
- TBTN_PAUSE,
- TBTN_QTTY
-};
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
-struct Label_Data {
- GtkWidget *ptr;
- char text [LINE_SIZE];
-};
-
-struct Field_Data {
- GtkWidget *ptr;
- char ch;
- int r;
- int c;
- int *row;
- int *col;
- int *act;
-};
-
-struct Button_Data {
- GtkWidget *ptr;
- char text [LINE_SIZE];
- int val;
- int *act;
-};
-
-struct TButton_Data {
- GtkWidget *ptr;
- char text [LINE_SIZE];
- char text2 [LINE_SIZE];
- int val;
- int val2;
- int *act;
-};
-
-struct Entry_fname_Data {
- GtkWidget *ptr;
- struct Label_Data lbl;
- const char *fpath;
- char *fname;
-};
-
-struct Entry_str_Data {
- GtkWidget *ptr;
- struct Label_Data lbl;
- char *str;
- int strsize;
-};
-
-struct PBar_Data {
- GtkWidget *ptr;
- double frac;
- char text [LINE_SIZE];
-};
-
-struct EBox_Data {
- GtkWidget *ptr;
- int val;
- int *act;
-};
-
-struct Timeout_Data {
- int id;
- int val;
- int *act;
-};
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-static GtkWidget *box;
-static GtkWidget *box_help;
-static GtkWidget *box_help_in;
-static struct Button_Data button [BTN_QTTY];
-static struct TButton_Data tbutton [TBTN_QTTY];
-static struct Entry_str_Data entry_name;
-static struct Entry_fname_Data entry_fname;
-static GtkWidget *box_board;
-static GtkWidget *box_board_in;
-static struct PBar_Data pbar_board_tit;
-// static GtkWidget *box_board_tit;
-static GtkWidget *box_board_tab;
-static GtkWidget *table_board;
-static struct Field_Data field [ROWS_GUI_MAX] [COLS_GUI_MAX];
-static struct EBox_Data ebox_cheat;
-// static GtkWidget *box_board_stit;
-static struct Label_Data label_stit;
-static int last_help;
-static struct Timeout_Data timeout;
-
-static int state;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Start */
-static void board_init (struct Player_Iface_Position *position,
- int *action);
-static void show_board_start(struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-static void board_loop_start(struct Player_Iface_Position *position);
-
- /* Play */
-static void show_board (const struct Game_Iface_Out *board,
- struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-static void board_loop (const struct Game_Iface_Out *board,
- struct Player_Iface_Position *position);
-
-static char set_char (int game_iface_visible);
-static void show_char (struct Field_Data *field);
- /* Help */
-static void help_init (int *action);
-static void show_help (const struct Game_Iface_Out *board);
-static void show_help_start (void);
-static void show_help_play (void);
-static void show_help_pause (void);
-static void show_help_xyzzy (void);
-static void show_help_cheat (void);
-static void show_help_safe (void);
-static void show_help_gameover (void);
- /* Input */
-static gboolean callback_field (GtkWidget *widget,
- GdkEventButton *event,
- void *data);
-static gboolean callback_ebox (GtkWidget *widget,
- GdkEventButton *event,
- void *data);
-static void callback_button (GtkWidget *widget,
- void *data);
-static gboolean callback_tbutton (GtkWidget *widget,
- void *data);
-static void callback_entry_fname (GtkWidget *widget,
- void *data);
-static void callback_entry_str (GtkWidget *widget,
- void *data);
-static gboolean callback_timeout (void *data);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void player_gui_init (struct Player_Iface_Position *position,
- int *action)
-{
- box = gtk_hbox_new(false, 0);
- gtk_container_add(GTK_CONTAINER(window_gui), box);
-
- /* Structure */
- GtkWidget *separator;
- box_help = gtk_vbox_new(true, 0);
- separator = gtk_vseparator_new();
- box_board = gtk_vbox_new(false, 0);
- gtk_box_pack_start(GTK_BOX(box), box_help, false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), separator, false, false, 5);
- gtk_box_pack_start(GTK_BOX(box), box_board, true, true, 5);
-
- help_init(action);
- board_init(position, action);
-
- /* Board fields */
- int i;
- int j;
- for (i = 0; i < position->rows; i++) {
- for (j = 0; j < position->cols; j++) {
- field[i][j].r = i;
- field[i][j].c = j;
- field[i][j].row = &(position->row);
- field[i][j].col = &(position->col);
- field[i][j].act = action;
- field[i][j].ptr = gtk_button_new_with_label("NEW");
- g_signal_connect(field[i][j].ptr, "button-press-event",
- G_CALLBACK(callback_field), (void *)&field[i][j]);
- gtk_table_attach_defaults(GTK_TABLE(table_board), field[i][j].ptr,
- field[i][j].c, field[i][j].c + 1,
- field[i][j].r, field[i][j].r + 1);
- }
- }
-
- /* Refresh */
- gtk_widget_show_all(window_gui);
-}
-
-int player_gui_start (struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- show_help_start();
- show_board_start(position, title, subtitle);
-
- /* Refresh */
- gtk_widget_show(box);
- gtk_widget_show(window_gui);
-
- gtk_main();
-
- return 0;
-}
-
-int player_gui (const struct Game_Iface_Out *board,
- struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- state = board->state;
-
- show_help(board);
- show_board(board, position, title, subtitle);
-
- /* Refresh */
- gtk_widget_show(box);
- gtk_widget_show(window_gui);
-
- gtk_main();
-
- return 0;
-}
-
-void player_gui_save_name (const char *filepath, char *filename, int destsize)
-{
- entry_fname.fpath = filepath;
- entry_fname.fname = filename;
-
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_hide(button[BTN_SAVE].ptr);
- gtk_widget_show(entry_fname.lbl.ptr);
- gtk_widget_show(entry_fname.ptr);
- gtk_widget_hide(button[BTN_QUIT].ptr);
-
- gtk_widget_hide(box_board);
-
- gtk_main();
-
- gtk_widget_show(box_board);
-
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
-
- /* Update last_help */
- last_help = GAME_IFACE_STATE_FOO;
-}
-
-void player_gui_score_name (char *player_name, int destsize)
-{
- entry_name.str = player_name;
- entry_name.strsize = destsize;
-
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_hide(button[BTN_SAVE].ptr);
- gtk_widget_show(entry_name.lbl.ptr);
- gtk_widget_show(entry_name.ptr);
- gtk_widget_hide(button[BTN_QUIT].ptr);
-
- gtk_widget_hide(box_board);
-
- gtk_main();
-
- gtk_widget_show(box_board);
-
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
-
- /* Update last_help */
- last_help = GAME_IFACE_STATE_FOO;
-}
-
-void player_gui_cleanup (void)
-{
- /* Del box */
- gtk_widget_destroy(box);
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Start * * * * * * *
- * * * * * * * * * */
-static void board_init (struct Player_Iface_Position *position,
- int *action)
-{
- GtkWidget *separator[2];
-
- /* Box */
- box_board_in = gtk_vbox_new(false, 0);
- gtk_box_pack_start(GTK_BOX(box_board), box_board_in, true, true, 5);
-
- /* Title (with progress bar) */
- pbar_board_tit.ptr = gtk_progress_bar_new();
-// box_board_tit = gtk_vbox_new(false, 0);
- gtk_box_pack_start(GTK_BOX(box_board_in), pbar_board_tit.ptr, false, false, 0);
-// gtk_box_pack_start(GTK_BOX(box_board_in), box_board_tit, false, false, 0);
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_board_tit.ptr), "NEW");
-// gtk_box_pack_start(GTK_BOX(box_board_tit), label[0].ptr, false, false, 0);
-
- /* Pogress bar */
- gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(pbar_board_tit.ptr), GTK_PROGRESS_LEFT_TO_RIGHT);
-
- /* Separator */
- separator[0] = gtk_hseparator_new();
- gtk_box_pack_start(GTK_BOX(box_board_in), separator[0], false, false, 5);
-
- /* Board */
- box_board_tab = gtk_vbox_new(true, 0);
- gtk_box_pack_start(GTK_BOX(box_board_in), box_board_tab, true, true, 0);
- table_board = gtk_table_new(position->rows, position->cols, true);
- gtk_box_pack_start(GTK_BOX(box_board_tab), table_board, true, true, 5);
-
- /* Separator */
- separator[1] = gtk_hseparator_new();
- gtk_box_pack_start(GTK_BOX(box_board_in), separator[1], false, false, 5);
-
- /* Subtitle (with cheats) */
- ebox_cheat.ptr = gtk_event_box_new();
-// box_board_stit = gtk_vbox_new(false, 0);
- gtk_box_pack_start(GTK_BOX(box_board_in), ebox_cheat.ptr, false, false, 0);
-// gtk_box_pack_start(GTK_BOX(box_board_in), box_board_stit, false, false, 0);
- label_stit.ptr = gtk_label_new("NEW");
- gtk_container_add(GTK_CONTAINER(ebox_cheat.ptr), label_stit.ptr);
-// gtk_box_pack_start(GTK_BOX(box_board_stit), label_stit.ptr, false, false, 0);
-
- /* Cheats */
- ebox_cheat.val = PLAYER_IFACE_ACT_XYZZY_ON;
- ebox_cheat.act = action;
- g_signal_connect(ebox_cheat.ptr, "button-press-event",
- G_CALLBACK(callback_ebox), (void *)&ebox_cheat);
-
- /* Timeout */
- timeout.val = PLAYER_IFACE_ACT_FOO;
- timeout.act = action;
- timeout.id = 0;
-
- /* Refresh */
- gtk_widget_show_all(box_board);
-}
-
-static void show_board_start(struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- /* Title */
- snprintf(pbar_board_tit.text, LINE_SIZE, title);
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.text);
-
- /* Progress bar */
- pbar_board_tit.frac = 0;
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.frac);
-
- /* Board */
- board_loop_start(position);
-
- /* Subtitle */
- snprintf(label_stit.text, LINE_SIZE, subtitle);
- gtk_label_set_text(GTK_LABEL(label_stit.ptr), label_stit.text);
-
- /* Refresh */
- gtk_widget_show_all(box_board);
-}
-
-static void board_loop_start(struct Player_Iface_Position *position)
-{
- int i;
- int j;
- char ch;
-
- ch = PLAYER_GUI_CHAR_HIDDEN_FIELD;
-
- for (i = 0; i < position->rows; i++) {
- for (j = 0; j < position->cols; j++) {
- field[i][j].ch = ch;
- show_char(&field[i][j]);
- }
- }
-}
-
-/* * * * * * * * * *
- * * * Play * * * * * *
- * * * * * * * * * */
-static void show_board (const struct Game_Iface_Out *board,
- struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- /* Title */
- snprintf(pbar_board_tit.text, LINE_SIZE, title);
- gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.text);
-
- /* Progress bar */
- if (board->flags % board->mines) {
- /* This is a trick to have (frac <= 1) instead of (frac < 1) */
- pbar_board_tit.frac = ((double)board->flags) / ((double)board->mines);
- pbar_board_tit.frac = fmod(pbar_board_tit.frac, 1);
- } else if (board->flags) {
- pbar_board_tit.frac = 1;
- } else {
- pbar_board_tit.frac = 0;
- }
- gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.frac);
-
- /* Board */
- board_loop(board, position);
-
- /* Subtitle */
- snprintf(label_stit.text, LINE_SIZE, subtitle);
- gtk_label_set_text(GTK_LABEL(label_stit.ptr), label_stit.text);
-
- /* Timeout */
- if (board->state == GAME_IFACE_STATE_PLAYING) {
- timeout.id = g_timeout_add_seconds(1, callback_timeout, (void *)&timeout);
- }
-
- /* Refresh */
- gtk_widget_show_all(box_board);
-}
-
-static void board_loop (const struct Game_Iface_Out *board,
- struct Player_Iface_Position *position)
-{
- int i;
- int j;
-
- for (i = 0; i < board->rows; i++) {
- for (j = 0; j < board->cols; j++) {
- field[i][j].ch = set_char(board->visible[i][j]);
- show_char(&field[i][j]);
- }
- }
-}
-
-static char set_char (int game_iface_visible)
-{
- char ch;
- switch (game_iface_visible) {
- case GAME_IFACE_VIS_KBOOM:
- ch = PLAYER_GUI_CHAR_KBOOM;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_FIELD:
- ch = PLAYER_GUI_CHAR_HIDDEN_FIELD;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_MINE:
- ch = PLAYER_GUI_CHAR_HIDDEN_MINE;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_SAFE:
- ch = PLAYER_GUI_CHAR_HIDDEN_SAFE;
- break;
-
- case GAME_IFACE_VIS_SAFE_MINE:
- ch = PLAYER_GUI_CHAR_SAFE_MINE;
- break;
-
- case GAME_IFACE_VIS_0:
- ch = PLAYER_GUI_CHAR_0;
- break;
-
- case GAME_IFACE_VIS_1:
- ch = PLAYER_GUI_CHAR_1;
- break;
-
- case GAME_IFACE_VIS_2:
- ch = PLAYER_GUI_CHAR_2;
- break;
-
- case GAME_IFACE_VIS_3:
- ch = PLAYER_GUI_CHAR_3;
- break;
-
- case GAME_IFACE_VIS_4:
- ch = PLAYER_GUI_CHAR_4;
- break;
-
- case GAME_IFACE_VIS_5:
- ch = PLAYER_GUI_CHAR_5;
- break;
-
- case GAME_IFACE_VIS_6:
- ch = PLAYER_GUI_CHAR_6;
- break;
-
- case GAME_IFACE_VIS_7:
- ch = PLAYER_GUI_CHAR_7;
- break;
-
- case GAME_IFACE_VIS_8:
- ch = PLAYER_GUI_CHAR_8;
- break;
-
- case GAME_IFACE_VIS_FLAG:
- ch = PLAYER_GUI_CHAR_FLAG;
- break;
-
- case GAME_IFACE_VIS_FLAG_FALSE:
- ch = PLAYER_GUI_CHAR_FLAG_FALSE;
- break;
-
- case GAME_IFACE_VIS_POSSIBLE:
- ch = PLAYER_GUI_CHAR_POSSIBLE;
- break;
-
- case GAME_IFACE_VIS_POSSIBLE_FALSE:
- ch = PLAYER_GUI_CHAR_POSSIBLE_FALSE;
- break;
-
- default:
- ch = PLAYER_GUI_CHAR_ERROR;
- break;
- }
-
- return ch;
-}
-
-static void show_char (struct Field_Data *field)
-{
- char text [2];
- sprintf(text, "%c", field->ch);
- gtk_button_set_label(GTK_BUTTON(field->ptr), text);
-}
-
-/* * * * * * * * * *
- * * * Help * * * * * * *
- * * * * * * * * * */
-static void help_init (int *action)
-{
- /* Box */
- box_help_in = gtk_vbox_new(false, 0);
- gtk_box_pack_start(GTK_BOX(box_help), box_help_in, false, false, 5);
-
- /* Text */
- snprintf(button[BTN_CH_OFF].text, LINE_SIZE, "[_0] Cheats off");
- snprintf(button[BTN_CH_1].text, LINE_SIZE, "Cheat _1");
- snprintf(button[BTN_CH_2].text, LINE_SIZE, "Cheat _2");
- snprintf(tbutton[TBTN_PAUSE].text, LINE_SIZE, "_Pause");
- snprintf(tbutton[TBTN_PAUSE].text2, LINE_SIZE, "[_P] Continue");
- snprintf(button[BTN_SAVE].text, LINE_SIZE, "_Save");
- snprintf(entry_fname.lbl.text, LINE_SIZE, "File name:");
- snprintf(entry_name.lbl.text, LINE_SIZE, "Your name:");
- snprintf(button[BTN_QUIT].text, LINE_SIZE, "_Quit");
-
- /* Data */
- /* L click */
- button[BTN_CH_OFF].val = PLAYER_IFACE_ACT_XYZZY_OFF;
- button[BTN_CH_1].val = PLAYER_IFACE_ACT_XYZZY_LIN;
- button[BTN_CH_2].val = PLAYER_IFACE_ACT_XYZZY_P;
- tbutton[TBTN_PAUSE].val = PLAYER_IFACE_ACT_PAUSE;
- button[BTN_SAVE].val = PLAYER_IFACE_ACT_SAVE;
- button[BTN_QUIT].val = PLAYER_IFACE_ACT_QUIT;
- /* R click */
- tbutton[TBTN_PAUSE].val2 = PLAYER_IFACE_ACT_PAUSE;
-
- /* Action */
- button[BTN_CH_OFF].act = action;
- button[BTN_CH_1].act = action;
- button[BTN_CH_2].act = action;
- tbutton[TBTN_PAUSE].act = action;
- button[BTN_SAVE].act = action;
- button[BTN_QUIT].act = action;
-
- /* Generate widgets */
- button[BTN_CH_OFF].ptr = gtk_button_new_with_mnemonic(button[BTN_CH_OFF].text);
- button[BTN_CH_1].ptr = gtk_button_new_with_mnemonic(button[BTN_CH_1].text);
- button[BTN_CH_2].ptr = gtk_button_new_with_mnemonic(button[BTN_CH_2].text);
- tbutton[TBTN_PAUSE].ptr = gtk_toggle_button_new_with_mnemonic(tbutton[TBTN_PAUSE].text);
- button[BTN_SAVE].ptr = gtk_button_new_with_mnemonic(button[BTN_SAVE].text);
- entry_fname.lbl.ptr = gtk_label_new(entry_fname.lbl.text);
- entry_fname.ptr = gtk_entry_new();
- entry_name.lbl.ptr = gtk_label_new(entry_name.lbl.text);
- entry_name.ptr = gtk_entry_new();
- button[BTN_QUIT].ptr = gtk_button_new_with_mnemonic(button[BTN_QUIT].text);
-
- /* Toggle buttons */
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tbutton[TBTN_PAUSE].ptr), false);
-
- /* Events */
- g_signal_connect(button[BTN_CH_OFF].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[BTN_CH_OFF]);
- g_signal_connect(button[BTN_CH_1].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[BTN_CH_1]);
- g_signal_connect(button[BTN_CH_2].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[BTN_CH_2]);
- g_signal_connect(tbutton[TBTN_PAUSE].ptr, "toggled",
- G_CALLBACK(callback_tbutton), (void *)&tbutton[TBTN_PAUSE]);
- g_signal_connect(button[BTN_SAVE].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]);
- g_signal_connect(entry_fname.ptr, "activate",
- G_CALLBACK(callback_entry_fname), (void *)&entry_fname);
- g_signal_connect(entry_name.ptr, "activate",
- G_CALLBACK(callback_entry_str), (void *)&entry_name);
- g_signal_connect(button[BTN_QUIT].ptr, "clicked",
- G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]);
-
- /* Box */
- gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_OFF].ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_1].ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_2].ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), tbutton[TBTN_PAUSE].ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), entry_fname.lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), entry_fname.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), entry_name.lbl.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), entry_name.ptr, true, true, 0);
- gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0);
-}
-
-static void show_help (const struct Game_Iface_Out *board)
-{
- if (last_help != board->state) {
- switch (board->state) {
- case GAME_IFACE_STATE_PLAYING:
- show_help_play();
- break;
-
- case GAME_IFACE_STATE_PAUSE:
- show_help_pause();
- break;
-
- case GAME_IFACE_STATE_XYZZY:
- show_help_xyzzy();
- break;
-
- case GAME_IFACE_STATE_CHEATED:
- show_help_cheat();
- break;
-
- case GAME_IFACE_STATE_SAFE:
- show_help_safe();
- break;
-
- case GAME_IFACE_STATE_GAMEOVER:
- show_help_gameover();
- break;
- }
-
- /* Update last_help */
- last_help = board->state;
-
- /* Refresh */
- gtk_widget_show(box_help_in);
- gtk_widget_show(box_help);
- }
-}
-
-static void show_help_start (void)
-{
- /* Show & hide */
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_hide(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-
- /* Update last_help */
- last_help = GAME_IFACE_STATE_FOO;
-
- /* Refresh */
- gtk_widget_show(box_help_in);
- gtk_widget_show(box_help);
-}
-
-static void show_help_play (void)
-{
- /* Show & hide */
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_show(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_show(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-}
-
-static void show_help_pause (void)
-{
- /* Show & hide */
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_show(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_show(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-}
-
-static void show_help_xyzzy (void)
-{
- /* Show & hide */
- gtk_widget_show(button[BTN_CH_OFF].ptr);
- gtk_widget_show(button[BTN_CH_1].ptr);
- gtk_widget_show(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_show(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-}
-
-static void show_help_cheat (void)
-{
- /* Show & hide */
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_show(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-}
-
-static void show_help_safe (void)
-{
- /* Show & hide */
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_show(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-}
-
-static void show_help_gameover (void)
-{
- /* Show & hide */
- gtk_widget_hide(button[BTN_CH_OFF].ptr);
- gtk_widget_hide(button[BTN_CH_1].ptr);
- gtk_widget_hide(button[BTN_CH_2].ptr);
- gtk_widget_hide(tbutton[TBTN_PAUSE].ptr);
- gtk_widget_hide(button[BTN_SAVE].ptr);
- gtk_widget_hide(entry_fname.lbl.ptr);
- gtk_widget_hide(entry_fname.ptr);
- gtk_widget_hide(entry_name.lbl.ptr);
- gtk_widget_hide(entry_name.ptr);
- gtk_widget_show(button[BTN_QUIT].ptr);
-}
-
-/* * * * * * * * * *
- * * * Input * * * * * * *
- * * * * * * * * * */
-static gboolean callback_field (GtkWidget *widget,
- GdkEventButton *event,
- void *data)
-{
- if (state == GAME_IFACE_STATE_PLAYING && timeout.id) {
- g_source_remove(timeout.id);
- }
-
- struct Field_Data *field_ij;
- field_ij = ((struct Field_Data *)data);
-
- *(field_ij->row) = field_ij->r;
- *(field_ij->col) = field_ij->c;
-
- switch (event->button) {
- case 1:
- //1 is left mouse btn
- if (event->type == GDK_BUTTON_PRESS) {
- *(field_ij->act) = PLAYER_IFACE_ACT_STEP;
- }
- break;
-
- case 3:
- //3 is right mouse btn
- if (event->type == GDK_BUTTON_PRESS) {
- *(field_ij->act) = PLAYER_IFACE_ACT_FLAG;
- }
- break;
- }
-
- gtk_main_quit();
-
- return false;
-}
-
-static gboolean callback_ebox (GtkWidget *widget,
- GdkEventButton *event,
- void *data)
-{
- if (state == GAME_IFACE_STATE_PLAYING && timeout.id) {
- g_source_remove(timeout.id);
- }
-
- struct EBox_Data *ebox;
- ebox = ((struct EBox_Data *)data);
-
- switch (event->button) {
- case 1:
- //1 is left mouse btn
- if (event->type == GDK_BUTTON_PRESS) {
- *(ebox->act) = ebox->val;
- } else if (event->type == GDK_2BUTTON_PRESS) {
- }
- break;
-
- case 3:
- //3 is right mouse btn
- break;
- }
-
- gtk_main_quit();
-
- return false;
-}
-
-static void callback_button (GtkWidget *widget,
- void *data)
-{
- if (state == GAME_IFACE_STATE_PLAYING && timeout.id) {
- g_source_remove(timeout.id);
- }
-
- struct Button_Data *button;
- button = ((struct Button_Data *)data);
-
- *(button->act) = button->val;
-
- gtk_main_quit();
-
-}
-
-static gboolean callback_tbutton (GtkWidget *widget,
- void *data)
-{
- if (state == GAME_IFACE_STATE_PLAYING && timeout.id) {
- g_source_remove(timeout.id);
- }
-
- struct TButton_Data *tbutton;
- tbutton = ((struct TButton_Data *)data);
-
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
- /* If control reaches here, the toggle button is down */
- *(tbutton->act) = tbutton->val;
- gtk_button_set_label(GTK_BUTTON(tbutton[TBTN_PAUSE].ptr), tbutton[TBTN_PAUSE].text2);
- } else {
- /* If control reaches here, the toggle button is up */
- *(tbutton->act) = tbutton->val2;
- gtk_button_set_label(GTK_BUTTON(tbutton[TBTN_PAUSE].ptr), tbutton[TBTN_PAUSE].text);
- }
-
- gtk_main_quit();
-
- return false;
-}
-
-static void callback_entry_fname (GtkWidget *widget,
- void *data)
-{
- struct Entry_fname_Data *entry;
- const char *str;
- int err;
- char buff [LINE_SIZE];
-
- entry = ((struct Entry_fname_Data *)data);
-
- str = gtk_entry_get_text(GTK_ENTRY(entry->ptr));
- err = alx_sscan_fname(entry->fpath, entry->fname, false, str);
-
- if (err) {
- snprintf(buff, LINE_SIZE, "Error %i", err);
- gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff);
- gtk_editable_select_region(GTK_EDITABLE(entry->ptr),
- 0, GTK_ENTRY(entry->ptr)->text_length);
- }
-
- gtk_main_quit();
-}
-
-static void callback_entry_str (GtkWidget *widget,
- void *data)
-{
- struct Entry_str_Data *entry;
- const char *str;
-
- entry = ((struct Entry_str_Data *)data);
-
- str = gtk_entry_get_text(GTK_ENTRY(entry->ptr));
- snprintf(entry->str, entry->strsize, "%s", str);
-
- gtk_main_quit();
-}
-
-static gboolean callback_timeout (void *data)
-{
- struct Timeout_Data *tout;
- tout = ((struct Timeout_Data *)data);
-
- *(tout->act) = tout->val;
-
- gtk_main_quit();
-
- return false;
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + #include <gtk/gtk.h> + /* fmod */ + #include <math.h> + /* true & false */ + #include <stdbool.h> + /* snprintf() */ + #include <stdio.h> + +/* libalx ------------------------------------------------------------------*/ + /* alx_sscan_fname() */ + #include "alx_input.h" + +/* Project -------------------------------------------------------------------*/ + /* struct Game_Iface_Out */ + #include "game_iface.h" + /* window_gui */ + #include "menu_gui.h" + + /* struct Player_Iface_Position */ + #include "player_iface.h" + + #include "player_gui.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define LINE_SIZE (80) + # define REFRESH_TIME_MS (100) + + +/****************************************************************************** + ******* enums **************************************************************** + ******************************************************************************/ + enum Buttons { + BTN_CH_OFF = 0, + BTN_CH_1, + BTN_CH_2, + BTN_SAVE, + BTN_QUIT, + BTN_QTTY + }; + + enum TButtons { + TBTN_PAUSE, + TBTN_QTTY + }; + + +/****************************************************************************** + ******* structs ************************************************************** + ******************************************************************************/ + struct Label_Data { + GtkWidget *ptr; + char text [LINE_SIZE]; + }; + + struct Field_Data { + GtkWidget *ptr; + char ch; + int r; + int c; + int *row; + int *col; + int *act; + }; + + struct Button_Data { + GtkWidget *ptr; + char text [LINE_SIZE]; + int val; + int *act; + }; + + struct TButton_Data { + GtkWidget *ptr; + char text [LINE_SIZE]; + char text2 [LINE_SIZE]; + int val; + int val2; + int *act; + }; + + struct Entry_fname_Data { + GtkWidget *ptr; + struct Label_Data lbl; + const char *fpath; + char *fname; + }; + + struct Entry_str_Data { + GtkWidget *ptr; + struct Label_Data lbl; + char *str; + int strsize; + }; + + struct PBar_Data { + GtkWidget *ptr; + double frac; + char text [LINE_SIZE]; + }; + + struct EBox_Data { + GtkWidget *ptr; + int val; + int *act; + }; + + struct Timeout_Data { + int id; + int val; + int *act; + }; + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +static GtkWidget *box; +static GtkWidget *box_help; +static GtkWidget *box_help_in; +static struct Button_Data button [BTN_QTTY]; +static struct TButton_Data tbutton [TBTN_QTTY]; +static struct Entry_str_Data entry_name; +static struct Entry_fname_Data entry_fname; +static GtkWidget *box_board; +static GtkWidget *box_board_in; +static struct PBar_Data pbar_board_tit; +// static GtkWidget *box_board_tit; +static GtkWidget *box_board_tab; +static GtkWidget *table_board; +static struct Field_Data field [ROWS_GUI_MAX] [COLS_GUI_MAX]; +static struct EBox_Data ebox_cheat; +// static GtkWidget *box_board_stit; +static struct Label_Data label_stit; +static int last_help; +static struct Timeout_Data timeout; + +static int state; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Start */ +static void board_init (struct Player_Iface_Position *position, + int *action); +static void show_board_start(struct Player_Iface_Position *position, + const char *title, const char *subtitle); + +static void board_loop_start(struct Player_Iface_Position *position); + + /* Play */ +static void show_board (const struct Game_Iface_Out *board, + struct Player_Iface_Position *position, + const char *title, const char *subtitle); + +static void board_loop (const struct Game_Iface_Out *board, + struct Player_Iface_Position *position); + +static char set_char (int game_iface_visible); +static void show_char (struct Field_Data *field); + /* Help */ +static void help_init (int *action); +static void show_help (const struct Game_Iface_Out *board); +static void show_help_start (void); +static void show_help_play (void); +static void show_help_pause (void); +static void show_help_xyzzy (void); +static void show_help_cheat (void); +static void show_help_safe (void); +static void show_help_gameover (void); + /* Input */ +static gboolean callback_field (GtkWidget *widget, + GdkEventButton *event, + void *data); +static gboolean callback_ebox (GtkWidget *widget, + GdkEventButton *event, + void *data); +static void callback_button (GtkWidget *widget, void *data); +static gboolean callback_tbutton (GtkWidget *widget, void *data); +static void callback_entry_fname (GtkWidget *widget, void *data); +static void callback_entry_str (GtkWidget *widget, void *data); +static gboolean callback_timeout (void *data); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void player_gui_init (struct Player_Iface_Position *position, + int *action) +{ + box = gtk_hbox_new(false, 0); + gtk_container_add(GTK_CONTAINER(window_gui), box); + + /* Structure */ + GtkWidget *separator; + box_help = gtk_vbox_new(true, 0); + separator = gtk_vseparator_new(); + box_board = gtk_vbox_new(false, 0); + gtk_box_pack_start(GTK_BOX(box), box_help, false, false, 5); + gtk_box_pack_start(GTK_BOX(box), separator, false, false, 5); + gtk_box_pack_start(GTK_BOX(box), box_board, true, true, 5); + + help_init(action); + board_init(position, action); + + /* Board fields */ + int i; + int j; + for (i = 0; i < position->rows; i++) { + for (j = 0; j < position->cols; j++) { + field[i][j].r = i; + field[i][j].c = j; + field[i][j].row = &(position->row); + field[i][j].col = &(position->col); + field[i][j].act = action; + field[i][j].ptr = gtk_button_new_with_label("NEW"); + g_signal_connect(field[i][j].ptr, "button-press-event", + G_CALLBACK(callback_field), (void *)&field[i][j]); + gtk_table_attach_defaults(GTK_TABLE(table_board), field[i][j].ptr, + field[i][j].c, field[i][j].c + 1, + field[i][j].r, field[i][j].r + 1); + } + } + + /* Refresh */ + gtk_widget_show_all(window_gui); +} + +int player_gui_start (struct Player_Iface_Position *position, + const char *title, const char *subtitle) +{ + show_help_start(); + show_board_start(position, title, subtitle); + + /* Refresh */ + gtk_widget_show(box); + gtk_widget_show(window_gui); + + gtk_main(); + + return 0; +} + +int player_gui (const struct Game_Iface_Out *board, + struct Player_Iface_Position *position, + const char *title, const char *subtitle) +{ + state = board->state; + + show_help(board); + show_board(board, position, title, subtitle); + + /* Refresh */ + gtk_widget_show(box); + gtk_widget_show(window_gui); + + gtk_main(); + + return 0; +} + +void player_gui_save_name (const char *fpath, char *fname, int destsize) +{ + entry_fname.fpath = fpath; + entry_fname.fname = fname; + + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_hide(button[BTN_SAVE].ptr); + gtk_widget_show(entry_fname.lbl.ptr); + gtk_widget_show(entry_fname.ptr); + gtk_widget_hide(button[BTN_QUIT].ptr); + + gtk_widget_hide(box_board); + + gtk_main(); + + gtk_widget_show(box_board); + + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + + /* Update last_help */ + last_help = GAME_IFACE_STATE_FOO; +} + +void player_gui_score_name (char *player_name, int destsize) +{ + entry_name.str = player_name; + entry_name.strsize = destsize; + + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_hide(button[BTN_SAVE].ptr); + gtk_widget_show(entry_name.lbl.ptr); + gtk_widget_show(entry_name.ptr); + gtk_widget_hide(button[BTN_QUIT].ptr); + + gtk_widget_hide(box_board); + + gtk_main(); + + gtk_widget_show(box_board); + + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + + /* Update last_help */ + last_help = GAME_IFACE_STATE_FOO; +} + +void player_gui_cleanup (void) +{ + /* Del box */ + gtk_widget_destroy(box); +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Start * * * * * * * + * * * * * * * * * */ +static void board_init (struct Player_Iface_Position *position, + int *action) +{ + GtkWidget *separator[2]; + + /* Box */ + box_board_in = gtk_vbox_new(false, 0); + gtk_box_pack_start(GTK_BOX(box_board), box_board_in, true, true, 5); + + /* Title (with progress bar) */ + pbar_board_tit.ptr = gtk_progress_bar_new(); +// box_board_tit = gtk_vbox_new(false, 0); + gtk_box_pack_start(GTK_BOX(box_board_in), pbar_board_tit.ptr, false, false, 0); +// gtk_box_pack_start(GTK_BOX(box_board_in), box_board_tit, false, false, 0); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_board_tit.ptr), "NEW"); +// gtk_box_pack_start(GTK_BOX(box_board_tit), label[0].ptr, false, false, 0); + + /* Pogress bar */ + gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(pbar_board_tit.ptr), GTK_PROGRESS_LEFT_TO_RIGHT); + + /* Separator */ + separator[0] = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(box_board_in), separator[0], false, false, 5); + + /* Board */ + box_board_tab = gtk_vbox_new(true, 0); + gtk_box_pack_start(GTK_BOX(box_board_in), box_board_tab, true, true, 0); + table_board = gtk_table_new(position->rows, position->cols, true); + gtk_box_pack_start(GTK_BOX(box_board_tab), table_board, true, true, 5); + + /* Separator */ + separator[1] = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(box_board_in), separator[1], false, false, 5); + + /* Subtitle (with cheats) */ + ebox_cheat.ptr = gtk_event_box_new(); +// box_board_stit = gtk_vbox_new(false, 0); + gtk_box_pack_start(GTK_BOX(box_board_in), ebox_cheat.ptr, false, false, 0); +// gtk_box_pack_start(GTK_BOX(box_board_in), box_board_stit, false, false, 0); + label_stit.ptr = gtk_label_new("NEW"); + gtk_container_add(GTK_CONTAINER(ebox_cheat.ptr), label_stit.ptr); +// gtk_box_pack_start(GTK_BOX(box_board_stit), label_stit.ptr, false, false, 0); + + /* Cheats */ + ebox_cheat.val = PLAYER_IFACE_ACT_XYZZY_ON; + ebox_cheat.act = action; + g_signal_connect(ebox_cheat.ptr, "button-press-event", + G_CALLBACK(callback_ebox), (void *)&ebox_cheat); + + /* Timeout */ + timeout.val = PLAYER_IFACE_ACT_FOO; + timeout.act = action; + timeout.id = 0; + + /* Refresh */ + gtk_widget_show_all(box_board); +} + +static void show_board_start(struct Player_Iface_Position *position, + const char *title, const char *subtitle) +{ + /* Title */ + snprintf(pbar_board_tit.text, LINE_SIZE, title); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.text); + + /* Progress bar */ + pbar_board_tit.frac = 0; + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.frac); + + /* Board */ + board_loop_start(position); + + /* Subtitle */ + snprintf(label_stit.text, LINE_SIZE, subtitle); + gtk_label_set_text(GTK_LABEL(label_stit.ptr), label_stit.text); + + /* Refresh */ + gtk_widget_show_all(box_board); +} + +static void board_loop_start(struct Player_Iface_Position *position) +{ + int i; + int j; + char ch; + + ch = PLAYER_GUI_CHAR_HIDDEN_FIELD; + + for (i = 0; i < position->rows; i++) { + for (j = 0; j < position->cols; j++) { + field[i][j].ch = ch; + show_char(&field[i][j]); + } + } +} + +/* * * * * * * * * * + * * * Play * * * * * * + * * * * * * * * * */ +static void show_board (const struct Game_Iface_Out *board, + struct Player_Iface_Position *position, + const char *title, const char *subtitle) +{ + /* Title */ + snprintf(pbar_board_tit.text, LINE_SIZE, title); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.text); + + /* Progress bar */ + if (board->flags % board->mines) { + /* This is a trick to have (frac <= 1) instead of (frac < 1) */ + pbar_board_tit.frac = ((double)board->flags) / ((double)board->mines); + pbar_board_tit.frac = fmod(pbar_board_tit.frac, 1); + } else if (board->flags) { + pbar_board_tit.frac = 1; + } else { + pbar_board_tit.frac = 0; + } + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar_board_tit.ptr), pbar_board_tit.frac); + + /* Board */ + board_loop(board, position); + + /* Subtitle */ + snprintf(label_stit.text, LINE_SIZE, subtitle); + gtk_label_set_text(GTK_LABEL(label_stit.ptr), label_stit.text); + + /* Timeout */ + if (board->state == GAME_IFACE_STATE_PLAYING) { + timeout.id = g_timeout_add_seconds(1, callback_timeout, (void *)&timeout); + } + + /* Refresh */ + gtk_widget_show_all(box_board); +} + +static void board_loop (const struct Game_Iface_Out *board, + struct Player_Iface_Position *position) +{ + int i; + int j; + + for (i = 0; i < board->rows; i++) { + for (j = 0; j < board->cols; j++) { + field[i][j].ch = set_char(board->visible[i][j]); + show_char(&field[i][j]); + } + } +} + +static char set_char (int game_iface_visible) +{ + char ch; + switch (game_iface_visible) { + case GAME_IFACE_VIS_KBOOM: + ch = PLAYER_GUI_CHAR_KBOOM; + break; + + case GAME_IFACE_VIS_HIDDEN_FIELD: + ch = PLAYER_GUI_CHAR_HIDDEN_FIELD; + break; + + case GAME_IFACE_VIS_HIDDEN_MINE: + ch = PLAYER_GUI_CHAR_HIDDEN_MINE; + break; + + case GAME_IFACE_VIS_HIDDEN_SAFE: + ch = PLAYER_GUI_CHAR_HIDDEN_SAFE; + break; + + case GAME_IFACE_VIS_SAFE_MINE: + ch = PLAYER_GUI_CHAR_SAFE_MINE; + break; + + case GAME_IFACE_VIS_0: + ch = PLAYER_GUI_CHAR_0; + break; + + case GAME_IFACE_VIS_1: + ch = PLAYER_GUI_CHAR_1; + break; + + case GAME_IFACE_VIS_2: + ch = PLAYER_GUI_CHAR_2; + break; + + case GAME_IFACE_VIS_3: + ch = PLAYER_GUI_CHAR_3; + break; + + case GAME_IFACE_VIS_4: + ch = PLAYER_GUI_CHAR_4; + break; + + case GAME_IFACE_VIS_5: + ch = PLAYER_GUI_CHAR_5; + break; + + case GAME_IFACE_VIS_6: + ch = PLAYER_GUI_CHAR_6; + break; + + case GAME_IFACE_VIS_7: + ch = PLAYER_GUI_CHAR_7; + break; + + case GAME_IFACE_VIS_8: + ch = PLAYER_GUI_CHAR_8; + break; + + case GAME_IFACE_VIS_FLAG: + ch = PLAYER_GUI_CHAR_FLAG; + break; + + case GAME_IFACE_VIS_FLAG_FALSE: + ch = PLAYER_GUI_CHAR_FLAG_FALSE; + break; + + case GAME_IFACE_VIS_POSSIBLE: + ch = PLAYER_GUI_CHAR_POSSIBLE; + break; + + case GAME_IFACE_VIS_POSSIBLE_FALSE: + ch = PLAYER_GUI_CHAR_POSSIBLE_FALSE; + break; + + default: + ch = PLAYER_GUI_CHAR_ERROR; + break; + } + + return ch; +} + +static void show_char (struct Field_Data *field) +{ + char text [2]; + sprintf(text, "%c", field->ch); + gtk_button_set_label(GTK_BUTTON(field->ptr), text); +} + +/* * * * * * * * * * + * * * Help * * * * * * * + * * * * * * * * * */ +static void help_init (int *action) +{ + /* Box */ + box_help_in = gtk_vbox_new(false, 0); + gtk_box_pack_start(GTK_BOX(box_help), box_help_in, false, false, 5); + + /* Text */ + snprintf(button[BTN_CH_OFF].text, LINE_SIZE, "[_0] Cheats off"); + snprintf(button[BTN_CH_1].text, LINE_SIZE, "Cheat _1"); + snprintf(button[BTN_CH_2].text, LINE_SIZE, "Cheat _2"); + snprintf(tbutton[TBTN_PAUSE].text, LINE_SIZE, "_Pause"); + snprintf(tbutton[TBTN_PAUSE].text2, LINE_SIZE, "[_P] Continue"); + snprintf(button[BTN_SAVE].text, LINE_SIZE, "_Save"); + snprintf(entry_fname.lbl.text, LINE_SIZE, "File name:"); + snprintf(entry_name.lbl.text, LINE_SIZE, "Your name:"); + snprintf(button[BTN_QUIT].text, LINE_SIZE, "_Quit"); + + /* Data */ + /* L click */ + button[BTN_CH_OFF].val = PLAYER_IFACE_ACT_XYZZY_OFF; + button[BTN_CH_1].val = PLAYER_IFACE_ACT_XYZZY_LIN; + button[BTN_CH_2].val = PLAYER_IFACE_ACT_XYZZY_P; + tbutton[TBTN_PAUSE].val = PLAYER_IFACE_ACT_PAUSE; + button[BTN_SAVE].val = PLAYER_IFACE_ACT_SAVE; + button[BTN_QUIT].val = PLAYER_IFACE_ACT_QUIT; + /* R click */ + tbutton[TBTN_PAUSE].val2 = PLAYER_IFACE_ACT_PAUSE; + + /* Action */ + button[BTN_CH_OFF].act = action; + button[BTN_CH_1].act = action; + button[BTN_CH_2].act = action; + tbutton[TBTN_PAUSE].act = action; + button[BTN_SAVE].act = action; + button[BTN_QUIT].act = action; + + /* Generate widgets */ + button[BTN_CH_OFF].ptr = gtk_button_new_with_mnemonic(button[BTN_CH_OFF].text); + button[BTN_CH_1].ptr = gtk_button_new_with_mnemonic(button[BTN_CH_1].text); + button[BTN_CH_2].ptr = gtk_button_new_with_mnemonic(button[BTN_CH_2].text); + tbutton[TBTN_PAUSE].ptr = gtk_toggle_button_new_with_mnemonic(tbutton[TBTN_PAUSE].text); + button[BTN_SAVE].ptr = gtk_button_new_with_mnemonic(button[BTN_SAVE].text); + entry_fname.lbl.ptr = gtk_label_new(entry_fname.lbl.text); + entry_fname.ptr = gtk_entry_new(); + entry_name.lbl.ptr = gtk_label_new(entry_name.lbl.text); + entry_name.ptr = gtk_entry_new(); + button[BTN_QUIT].ptr = gtk_button_new_with_mnemonic(button[BTN_QUIT].text); + + /* Toggle buttons */ + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tbutton[TBTN_PAUSE].ptr), false); + + /* Events */ + g_signal_connect(button[BTN_CH_OFF].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[BTN_CH_OFF]); + g_signal_connect(button[BTN_CH_1].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[BTN_CH_1]); + g_signal_connect(button[BTN_CH_2].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[BTN_CH_2]); + g_signal_connect(tbutton[TBTN_PAUSE].ptr, "toggled", + G_CALLBACK(callback_tbutton), (void *)&tbutton[TBTN_PAUSE]); + g_signal_connect(button[BTN_SAVE].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[BTN_SAVE]); + g_signal_connect(entry_fname.ptr, "activate", + G_CALLBACK(callback_entry_fname), (void *)&entry_fname); + g_signal_connect(entry_name.ptr, "activate", + G_CALLBACK(callback_entry_str), (void *)&entry_name); + g_signal_connect(button[BTN_QUIT].ptr, "clicked", + G_CALLBACK(callback_button), (void *)&button[BTN_QUIT]); + + /* Box */ + gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_OFF].ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_1].ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_CH_2].ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), tbutton[TBTN_PAUSE].ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_SAVE].ptr, false, false, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), entry_fname.lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), entry_fname.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), entry_name.lbl.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), entry_name.ptr, true, true, 0); + gtk_box_pack_start(GTK_BOX(box_help_in), button[BTN_QUIT].ptr, false, false, 0); +} + +static void show_help (const struct Game_Iface_Out *board) +{ + if (last_help != board->state) { + switch (board->state) { + case GAME_IFACE_STATE_PLAYING: + show_help_play(); + break; + + case GAME_IFACE_STATE_PAUSE: + show_help_pause(); + break; + + case GAME_IFACE_STATE_XYZZY: + show_help_xyzzy(); + break; + + case GAME_IFACE_STATE_CHEATED: + show_help_cheat(); + break; + + case GAME_IFACE_STATE_SAFE: + show_help_safe(); + break; + + case GAME_IFACE_STATE_GAMEOVER: + show_help_gameover(); + break; + } + + /* Update last_help */ + last_help = board->state; + + /* Refresh */ + gtk_widget_show(box_help_in); + gtk_widget_show(box_help); + } +} + +static void show_help_start (void) +{ + /* Show & hide */ + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_hide(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); + + /* Update last_help */ + last_help = GAME_IFACE_STATE_FOO; + + /* Refresh */ + gtk_widget_show(box_help_in); + gtk_widget_show(box_help); +} + +static void show_help_play (void) +{ + /* Show & hide */ + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_show(tbutton[TBTN_PAUSE].ptr); + gtk_widget_show(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); +} + +static void show_help_pause (void) +{ + /* Show & hide */ + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_show(tbutton[TBTN_PAUSE].ptr); + gtk_widget_show(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); +} + +static void show_help_xyzzy (void) +{ + /* Show & hide */ + gtk_widget_show(button[BTN_CH_OFF].ptr); + gtk_widget_show(button[BTN_CH_1].ptr); + gtk_widget_show(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_show(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); +} + +static void show_help_cheat (void) +{ + /* Show & hide */ + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_show(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); +} + +static void show_help_safe (void) +{ + /* Show & hide */ + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_show(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); +} + +static void show_help_gameover (void) +{ + /* Show & hide */ + gtk_widget_hide(button[BTN_CH_OFF].ptr); + gtk_widget_hide(button[BTN_CH_1].ptr); + gtk_widget_hide(button[BTN_CH_2].ptr); + gtk_widget_hide(tbutton[TBTN_PAUSE].ptr); + gtk_widget_hide(button[BTN_SAVE].ptr); + gtk_widget_hide(entry_fname.lbl.ptr); + gtk_widget_hide(entry_fname.ptr); + gtk_widget_hide(entry_name.lbl.ptr); + gtk_widget_hide(entry_name.ptr); + gtk_widget_show(button[BTN_QUIT].ptr); +} + +/* * * * * * * * * * + * * * Input * * * * * * * + * * * * * * * * * */ +static gboolean callback_field (GtkWidget *widget, + GdkEventButton *event, + void *data) +{ + if (state == GAME_IFACE_STATE_PLAYING && timeout.id) { + g_source_remove(timeout.id); + } + + struct Field_Data *field_ij; + field_ij = ((struct Field_Data *)data); + + *(field_ij->row) = field_ij->r; + *(field_ij->col) = field_ij->c; + + switch (event->button) { + case 1: + //1 is left mouse btn + if (event->type == GDK_BUTTON_PRESS) { + *(field_ij->act) = PLAYER_IFACE_ACT_STEP; + } + break; + + case 3: + //3 is right mouse btn + if (event->type == GDK_BUTTON_PRESS) { + *(field_ij->act) = PLAYER_IFACE_ACT_FLAG; + } + break; + } + + gtk_main_quit(); + + return false; +} + +static gboolean callback_ebox (GtkWidget *widget, + GdkEventButton *event, + void *data) +{ + if (state == GAME_IFACE_STATE_PLAYING && timeout.id) { + g_source_remove(timeout.id); + } + + struct EBox_Data *ebox; + ebox = ((struct EBox_Data *)data); + + switch (event->button) { + case 1: + //1 is left mouse btn + if (event->type == GDK_BUTTON_PRESS) { + *(ebox->act) = ebox->val; + } else if (event->type == GDK_2BUTTON_PRESS) { + } + break; + + case 3: + //3 is right mouse btn + break; + } + + gtk_main_quit(); + + return false; +} + +static void callback_button (GtkWidget *widget, void *data) +{ + if (state == GAME_IFACE_STATE_PLAYING && timeout.id) { + g_source_remove(timeout.id); + } + + struct Button_Data *button; + button = ((struct Button_Data *)data); + + *(button->act) = button->val; + + gtk_main_quit(); + +} + +static gboolean callback_tbutton (GtkWidget *widget, void *data) +{ + if (state == GAME_IFACE_STATE_PLAYING && timeout.id) { + g_source_remove(timeout.id); + } + + struct TButton_Data *tbutton; + tbutton = ((struct TButton_Data *)data); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { + /* If control reaches here, the toggle button is down */ + *(tbutton->act) = tbutton->val; + gtk_button_set_label(GTK_BUTTON(tbutton[TBTN_PAUSE].ptr), tbutton[TBTN_PAUSE].text2); + } else { + /* If control reaches here, the toggle button is up */ + *(tbutton->act) = tbutton->val2; + gtk_button_set_label(GTK_BUTTON(tbutton[TBTN_PAUSE].ptr), tbutton[TBTN_PAUSE].text); + } + + gtk_main_quit(); + + return false; +} + +static void callback_entry_fname (GtkWidget *widget, void *data) +{ + struct Entry_fname_Data *entry; + const char *str; + int err; + char buff [LINE_SIZE]; + + entry = ((struct Entry_fname_Data *)data); + + str = gtk_entry_get_text(GTK_ENTRY(entry->ptr)); + err = alx_sscan_fname(entry->fpath, entry->fname, false, str); + + if (err) { + snprintf(buff, LINE_SIZE, "Error %i", err); + gtk_entry_set_text(GTK_ENTRY(entry->ptr), buff); + gtk_editable_select_region(GTK_EDITABLE(entry->ptr), + 0, GTK_ENTRY(entry->ptr)->text_length); + } + + gtk_main_quit(); +} + +static void callback_entry_str (GtkWidget *widget, void *data) +{ + struct Entry_str_Data *entry; + const char *str; + + entry = ((struct Entry_str_Data *)data); + + str = gtk_entry_get_text(GTK_ENTRY(entry->ptr)); + snprintf(entry->str, entry->strsize, "%s", str); + + gtk_main_quit(); +} + +static gboolean callback_timeout (void *data) +{ + struct Timeout_Data *tout; + tout = ((struct Timeout_Data *)data); + + *(tout->act) = tout->val; + + gtk_main_quit(); + + return false; +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/src/player_iface.c b/modules/player/src/player_iface.c index 07b5590..ee3b30f 100644 --- a/modules/player/src/player_iface.c +++ b/modules/player/src/player_iface.c @@ -1,456 +1,450 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* snprintf() & fflush() */
- #include <stdio.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* struct Game_Iface_... */
- #include "game_iface.h"
-
- /* game_tui() */
- #include "player_clui.h"
- /* game_tui() */
- #include "player_tui.h"
- /* game_gui() */
- #include "player_gui.h"
-
- #include "player_iface.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define TITLE_SIZE (20)
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Global * * * * * *
- * * * * * * * * * */
-int player_iface_mode;
-
-/* * * * * * * * * *
- * * * Static * * * * * *
- * * * * * * * * * */
-static struct Player_Iface_Position player_iface_position;
-static int player_action;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Actions */
-static void player_iface_act (struct Game_Iface_In *game_iface_in);
-
- /* Actions: game iface */
-static void player_iface_act_start (void);
-static void player_iface_act_play (struct Game_Iface_In *game_iface_in);
-static void player_iface_act_game (struct Game_Iface_In *game_iface_in);
-
- /* Actions: player iface */
-static void player_iface_move_up (void);
-static void player_iface_move_down (void);
-static void player_iface_move_right (void);
-static void player_iface_move_left (void);
-static void highlight_cursor (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void player_iface_init (int rows, int cols)
-{
- player_iface_position.rows = rows;
- player_iface_position.cols = cols;
-
- switch (player_iface_mode) {
- case PLAYER_IFACE_CLUI:
- break;
-
- case PLAYER_IFACE_TUI:
- player_tui_init(rows, cols);
- break;
-
- case PLAYER_IFACE_GUI:
- player_gui_init(&player_iface_position, &player_action);
- break;
- }
-}
-
-int player_iface_start (int *pos_row, int *pos_col)
-{
- /* Title */
- char title[TITLE_SIZE];
- snprintf(title, TITLE_SIZE, "Start:");
- /* Subtitle */
- char subtitle[TITLE_SIZE];
- snprintf(subtitle, TITLE_SIZE, "00:00 | 0");
-
- /* Start position */
- player_iface_position.row = 0;
- player_iface_position.col = 0;
- player_iface_position.highlight = false;
-
- /* Loop until first step */
- do {
- switch (player_iface_mode) {
- case PLAYER_IFACE_CLUI:
- player_clui_start(&player_iface_position,
- title, subtitle, &player_action);
- break;
-
- case PLAYER_IFACE_TUI:
- player_tui_start(&player_iface_position,
- title, subtitle, &player_action);
- break;
-
- case PLAYER_IFACE_GUI:
- player_gui_start(&player_iface_position,
- title, subtitle);
- break;
- }
-
- player_iface_act_start();
- } while (player_action != PLAYER_IFACE_ACT_STEP &&
- player_action != PLAYER_IFACE_ACT_QUIT);
-
- *pos_row = player_iface_position.row;
- *pos_col = player_iface_position.col;
-
- int fail;
- switch (player_action) {
- case PLAYER_IFACE_ACT_STEP:
- fail = 0;
- break;
-
- case PLAYER_IFACE_ACT_QUIT:
- fail = -1;
- break;
-
- default:
- fail = -2;
- break;
- }
- return fail;
-}
-
-void player_iface (const struct Game_Iface_Out *game_iface_out,
- const struct Game_Iface_Score *game_iface_score,
- struct Game_Iface_In *game_iface_in)
-{
- /* Title */
- char title[TITLE_SIZE];
- switch (game_iface_out->state) {
- case GAME_IFACE_STATE_XYZZY:
- case GAME_IFACE_STATE_CHEATED:
- case GAME_IFACE_STATE_PLAYING:
- case GAME_IFACE_STATE_PAUSE:
- snprintf(title, TITLE_SIZE, "Mines: %i/%i", game_iface_out->flags, game_iface_out->mines);
- break;
-
- case GAME_IFACE_STATE_GAMEOVER:
- snprintf(title, TITLE_SIZE, "GAME OVER");
- break;
-
- case GAME_IFACE_STATE_SAFE:
- snprintf(title, TITLE_SIZE, "You win!");
- break;
- }
- /* Subtitle */
- char subtitle[TITLE_SIZE];
- int hours;
- int mins;
- int secs;
- if (game_iface_score->time != CHEATED) {
- hours = ((int)game_iface_score->time / 3600);
- mins = (((int)game_iface_score->time % 3600) / 60);
- secs = ((int)game_iface_score->time % 60);
-
- if (game_iface_score->time >= 3600) {
- snprintf(subtitle, TITLE_SIZE, "%02i:%02i:%02i | %i", hours, mins, secs, game_iface_score->clicks);
- } else {
- snprintf(subtitle, TITLE_SIZE, "%02i:%02i | %i", mins, secs, game_iface_score->clicks);
- }
- } else {
- snprintf(subtitle, TITLE_SIZE, "N/A");
- }
-
- /* Request player action */
- switch (player_iface_mode) {
- case PLAYER_IFACE_CLUI:
- player_clui(game_iface_out, &player_iface_position,
- title, subtitle, &player_action);
- break;
-
- case PLAYER_IFACE_TUI:
- player_tui(game_iface_out, &player_iface_position,
- title, subtitle, &player_action);
- break;
-
- case PLAYER_IFACE_GUI:
- player_gui(game_iface_out, &player_iface_position,
- title, subtitle);
- break;
- }
-
- player_iface_act(game_iface_in);
-}
-
-void player_iface_save_name (const char *filepath, char *filename, int destsize)
-{
- switch (player_iface_mode) {
- case PLAYER_IFACE_CLUI:
- player_clui_save_name(filepath, filename, destsize);
- break;
-
- case PLAYER_IFACE_TUI:
- player_tui_save_name(filepath, filename, destsize);
- break;
-
- case PLAYER_IFACE_GUI:
- player_gui_save_name(filepath, filename, destsize);
- break;
- }
-}
-
-void player_iface_score_name (char *player_name, int destsize)
-{
- switch (player_iface_mode) {
- case PLAYER_IFACE_CLUI:
- player_clui_score_name(player_name, destsize);
- break;
-
- case PLAYER_IFACE_TUI:
- player_tui_score_name(player_name, destsize);
- break;
-
- case PLAYER_IFACE_GUI:
- player_gui_score_name(player_name, destsize);
- break;
- }
-}
-
-void player_iface_cleanup (void)
-{
- switch (player_iface_mode) {
- case PLAYER_IFACE_CLUI:
- break;
-
- case PLAYER_IFACE_TUI:
- player_tui_cleanup();
- break;
-
- case PLAYER_IFACE_GUI:
- player_gui_cleanup();
- break;
- }
- fflush(stdout);
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Actions * * * * * *
- * * * * * * * * * */
-static void player_iface_act (struct Game_Iface_In *game_iface_in)
-{
- switch (player_action) {
- case PLAYER_IFACE_ACT_STEP:
- case PLAYER_IFACE_ACT_FLAG:
- case PLAYER_IFACE_ACT_FLAG_POSSIBLE:
- case PLAYER_IFACE_ACT_RM_FLAG:
- player_iface_act_play(game_iface_in);
- break;
-
- case PLAYER_IFACE_ACT_PAUSE:
- case PLAYER_IFACE_ACT_SAVE:
- case PLAYER_IFACE_ACT_XYZZY_ON:
- case PLAYER_IFACE_ACT_XYZZY_OFF:
- case PLAYER_IFACE_ACT_XYZZY_LIN:
- case PLAYER_IFACE_ACT_XYZZY_P:
- case PLAYER_IFACE_ACT_XYZZY_NP:
- case PLAYER_IFACE_ACT_QUIT:
- player_iface_act_game(game_iface_in);
- break;
-
- case PLAYER_IFACE_ACT_MOVE_UP:
- player_iface_move_up();
- break;
-
- case PLAYER_IFACE_ACT_MOVE_DOWN:
- player_iface_move_down();
- break;
-
- case PLAYER_IFACE_ACT_MOVE_RIGHT:
- player_iface_move_right();
- break;
-
- case PLAYER_IFACE_ACT_MOVE_LEFT:
- player_iface_move_left();
- break;
-
- case PLAYER_IFACE_ACT_HIGHLIGHT:
- highlight_cursor();
- break;
- }
-}
-
-static void player_iface_act_start (void)
-{
- switch (player_action) {
- case PLAYER_IFACE_ACT_STEP:
- case PLAYER_IFACE_ACT_QUIT:
- break;
-
- case PLAYER_IFACE_ACT_MOVE_UP:
- player_iface_move_up();
- break;
-
- case PLAYER_IFACE_ACT_MOVE_DOWN:
- player_iface_move_down();
- break;
-
- case PLAYER_IFACE_ACT_MOVE_RIGHT:
- player_iface_move_right();
- break;
-
- case PLAYER_IFACE_ACT_MOVE_LEFT:
- player_iface_move_left();
- break;
-
- case PLAYER_IFACE_ACT_HIGHLIGHT:
- highlight_cursor();
- break;
- }
-}
-
-/* * * * * * * * * *
- * * * Actions: game iface * * * * *
- * * * * * * * * * */
-static void player_iface_act_play (struct Game_Iface_In *game_iface_in)
-{
- switch (player_action) {
- case PLAYER_IFACE_ACT_STEP:
- game_iface_in->act_game[player_iface_position.row][player_iface_position.col] =
- GAME_IFACE_GAME_ACT_STEP;
- break;
-
- case PLAYER_IFACE_ACT_FLAG:
- game_iface_in->act_game[player_iface_position.row][player_iface_position.col] =
- GAME_IFACE_GAME_ACT_FLAG;
- break;
-
- case PLAYER_IFACE_ACT_FLAG_POSSIBLE:
- game_iface_in->act_game[player_iface_position.row][player_iface_position.col] =
- GAME_IFACE_GAME_ACT_FLAG_POSSIBLE;
- break;
-
- case PLAYER_IFACE_ACT_RM_FLAG:
- game_iface_in->act_game[player_iface_position.row][player_iface_position.col] =
- GAME_IFACE_GAME_ACT_RM_FLAG;
- break;
- }
-
- game_iface_in->action = GAME_IFACE_ACT_PLAY;
-}
-
-static void player_iface_act_game (struct Game_Iface_In *game_iface_in)
-{
- switch (player_action) {
- case PLAYER_IFACE_ACT_PAUSE:
- game_iface_in->action = GAME_IFACE_ACT_PAUSE;
- break;
-
- case PLAYER_IFACE_ACT_SAVE:
- game_iface_in->action = GAME_IFACE_ACT_SAVE;
- break;
-
- case PLAYER_IFACE_ACT_XYZZY_ON:
- game_iface_in->action = GAME_IFACE_ACT_XYZZY_ON;
- break;
-
- case PLAYER_IFACE_ACT_XYZZY_OFF:
- game_iface_in->action = GAME_IFACE_ACT_XYZZY_OFF;
- break;
-
- case PLAYER_IFACE_ACT_XYZZY_LIN:
- game_iface_in->action = GAME_IFACE_ACT_XYZZY_LIN;
- break;
-
- case PLAYER_IFACE_ACT_XYZZY_P:
- game_iface_in->action = GAME_IFACE_ACT_XYZZY_P;
- break;
-
- case PLAYER_IFACE_ACT_XYZZY_NP:
- game_iface_in->action = GAME_IFACE_ACT_XYZZY_NP;
- break;
-
- case PLAYER_IFACE_ACT_QUIT:
- game_iface_in->action = GAME_IFACE_ACT_QUIT;
- break;
- }
-}
-
-/* * * * * * * * * *
- * * * Actions: player iface * * * *
- * * * * * * * * * */
-static void player_iface_move_up (void)
-{
- if (player_iface_position.row) {
- (player_iface_position.row)--;
- } else {
- player_iface_position.row = player_iface_position.rows - 1;
- }
-}
-
-static void player_iface_move_down (void)
-{
- if (player_iface_position.row != player_iface_position.rows - 1) {
- (player_iface_position.row)++;
- } else {
- player_iface_position.row = 0;
- }
-}
-
-static void player_iface_move_right (void)
-{
- if (player_iface_position.col != player_iface_position.cols - 1) {
- (player_iface_position.col)++;
- } else {
- player_iface_position.col = 0;
- }
-}
-
-static void player_iface_move_left (void)
-{
- if (player_iface_position.col) {
- (player_iface_position.col)--;
- } else {
- player_iface_position.col = player_iface_position.cols - 1;
- }
-}
-
-static void highlight_cursor (void)
-{
- player_iface_position.highlight = !player_iface_position.highlight;
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + /* snprintf() & fflush() */ + #include <stdio.h> + +/* Project -------------------------------------------------------------------*/ + /* struct Game_Iface_... */ + #include "game_iface.h" + + /* game_tui() */ + #include "player_clui.h" + /* game_tui() */ + #include "player_tui.h" + /* game_gui() */ + #include "player_gui.h" + + #include "player_iface.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define TITLE_SIZE (20) + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +/* Global --------------------------------------------------------------------*/ +int player_iface_mode; +/* Static --------------------------------------------------------------------*/ +static struct Player_Iface_Position player_iface_position; +static int player_action; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Actions */ +static void player_iface_act (struct Game_Iface_In *in); + + /* Actions: game iface */ +static void player_iface_act_start (void); +static void player_iface_act_play (struct Game_Iface_In *in); +static void player_iface_act_game (struct Game_Iface_In *in); + + /* Actions: player iface */ +static void player_iface_move_up (void); +static void player_iface_move_down (void); +static void player_iface_move_right (void); +static void player_iface_move_left (void); +static void highlight_cursor (void); + + +/****************************************************************************** + ******* global functions ***************************************************** + ******************************************************************************/ +void player_iface_init (int rows, int cols) +{ + + player_iface_position.rows = rows; + player_iface_position.cols = cols; + + switch (player_iface_mode) { + case PLAYER_IFACE_CLUI: + break; + + case PLAYER_IFACE_TUI: + player_tui_init(rows, cols); + break; + + case PLAYER_IFACE_GUI: + player_gui_init(&player_iface_position, &player_action); + break; + } +} + +int player_iface_start (int *row, int *col) +{ + char title[TITLE_SIZE]; + char subtitle[TITLE_SIZE]; + int fail; + + snprintf(title, TITLE_SIZE, "Start:"); + snprintf(subtitle, TITLE_SIZE, "00:00 | 0"); + + /* Start position */ + player_iface_position.row = 0; + player_iface_position.col = 0; + player_iface_position.highlight = false; + + /* Loop until first step */ + do { + switch (player_iface_mode) { + case PLAYER_IFACE_CLUI: + player_clui_start(&player_iface_position, + title, subtitle, &player_action); + break; + + case PLAYER_IFACE_TUI: + player_tui_start(&player_iface_position, + title, subtitle, &player_action); + break; + + case PLAYER_IFACE_GUI: + player_gui_start(&player_iface_position, + title, subtitle); + break; + } + + player_iface_act_start(); + } while ((player_action != PLAYER_IFACE_ACT_STEP) && + (player_action != PLAYER_IFACE_ACT_QUIT)); + + *row = player_iface_position.row; + *col = player_iface_position.col; + + switch (player_action) { + case PLAYER_IFACE_ACT_STEP: + fail = 0; + break; + + case PLAYER_IFACE_ACT_QUIT: + fail = -1; + break; + + default: + fail = -2; + break; + } + return fail; +} + +void player_iface (const struct Game_Iface_Out *out, + const struct Game_Iface_Score *score, + struct Game_Iface_In *in) +{ + char title[TITLE_SIZE]; + + /* Title */ + switch (out->state) { + case GAME_IFACE_STATE_XYZZY: + case GAME_IFACE_STATE_CHEATED: + case GAME_IFACE_STATE_PLAYING: + case GAME_IFACE_STATE_PAUSE: + snprintf(title, TITLE_SIZE, "Mines: %i/%i", + out->flags, out->mines); + break; + + case GAME_IFACE_STATE_GAMEOVER: + snprintf(title, TITLE_SIZE, "GAME OVER"); + break; + + case GAME_IFACE_STATE_SAFE: + snprintf(title, TITLE_SIZE, "You win!"); + break; + } + /* Subtitle */ + char subtitle[TITLE_SIZE]; + int hours; + int mins; + int secs; + if (score->time != CHEATED) { + hours = ((int)score->time / 3600); + mins = (((int)score->time % 3600) / 60); + secs = ((int)score->time % 60); + + if (score->time >= 3600) { + snprintf(subtitle, TITLE_SIZE, "%02i:%02i:%02i | %i", + hours, mins, secs, score->clicks); + } else { + snprintf(subtitle, TITLE_SIZE, "%02i:%02i | %i", + mins, secs, score->clicks); + } + } else { + snprintf(subtitle, TITLE_SIZE, "N/A"); + } + + /* Request player action */ + switch (player_iface_mode) { + case PLAYER_IFACE_CLUI: + player_clui(out, &player_iface_position, title, subtitle, + &player_action); + break; + + case PLAYER_IFACE_TUI: + player_tui(out, &player_iface_position, title, subtitle, + &player_action); + break; + + case PLAYER_IFACE_GUI: + player_gui(out, &player_iface_position, title, subtitle); + break; + } + + player_iface_act(in); +} + +void player_iface_save_name (const char *fpath, char *fname, int destsize) +{ + switch (player_iface_mode) { + case PLAYER_IFACE_CLUI: + player_clui_save_name(fpath, fname, destsize); + break; + + case PLAYER_IFACE_TUI: + player_tui_save_name(fpath, fname, destsize); + break; + + case PLAYER_IFACE_GUI: + player_gui_save_name(fpath, fname, destsize); + break; + } +} + +void player_iface_score_name (char *player_name, int destsize) +{ + switch (player_iface_mode) { + case PLAYER_IFACE_CLUI: + player_clui_score_name(player_name, destsize); + break; + + case PLAYER_IFACE_TUI: + player_tui_score_name(player_name, destsize); + break; + + case PLAYER_IFACE_GUI: + player_gui_score_name(player_name, destsize); + break; + } +} + +void player_iface_cleanup (void) +{ + switch (player_iface_mode) { + case PLAYER_IFACE_CLUI: + break; + + case PLAYER_IFACE_TUI: + player_tui_cleanup(); + break; + + case PLAYER_IFACE_GUI: + player_gui_cleanup(); + break; + } + fflush(stdout); +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Actions * * * * * * + * * * * * * * * * */ +static void player_iface_act (struct Game_Iface_In *in) +{ + switch (player_action) { + case PLAYER_IFACE_ACT_STEP: + case PLAYER_IFACE_ACT_FLAG: + case PLAYER_IFACE_ACT_FLAG_POSSIBLE: + case PLAYER_IFACE_ACT_RM_FLAG: + player_iface_act_play(in); + break; + + case PLAYER_IFACE_ACT_PAUSE: + case PLAYER_IFACE_ACT_SAVE: + case PLAYER_IFACE_ACT_XYZZY_ON: + case PLAYER_IFACE_ACT_XYZZY_OFF: + case PLAYER_IFACE_ACT_XYZZY_LIN: + case PLAYER_IFACE_ACT_XYZZY_P: + case PLAYER_IFACE_ACT_XYZZY_NP: + case PLAYER_IFACE_ACT_QUIT: + player_iface_act_game(in); + break; + + case PLAYER_IFACE_ACT_MOVE_UP: + player_iface_move_up(); + break; + + case PLAYER_IFACE_ACT_MOVE_DOWN: + player_iface_move_down(); + break; + + case PLAYER_IFACE_ACT_MOVE_RIGHT: + player_iface_move_right(); + break; + + case PLAYER_IFACE_ACT_MOVE_LEFT: + player_iface_move_left(); + break; + + case PLAYER_IFACE_ACT_HIGHLIGHT: + highlight_cursor(); + break; + } +} + +static void player_iface_act_start (void) +{ + switch (player_action) { + case PLAYER_IFACE_ACT_STEP: + case PLAYER_IFACE_ACT_QUIT: + break; + + case PLAYER_IFACE_ACT_MOVE_UP: + player_iface_move_up(); + break; + + case PLAYER_IFACE_ACT_MOVE_DOWN: + player_iface_move_down(); + break; + + case PLAYER_IFACE_ACT_MOVE_RIGHT: + player_iface_move_right(); + break; + + case PLAYER_IFACE_ACT_MOVE_LEFT: + player_iface_move_left(); + break; + + case PLAYER_IFACE_ACT_HIGHLIGHT: + highlight_cursor(); + break; + } +} + +/* * * * * * * * * * + * * * Actions: game iface * * * * * + * * * * * * * * * */ +static void player_iface_act_play (struct Game_Iface_In *in) +{ + switch (player_action) { + case PLAYER_IFACE_ACT_STEP: + in->act_game[player_iface_position.row][player_iface_position.col] = + GAME_IFACE_GAME_ACT_STEP; + break; + + case PLAYER_IFACE_ACT_FLAG: + in->act_game[player_iface_position.row][player_iface_position.col] = + GAME_IFACE_GAME_ACT_FLAG; + break; + + case PLAYER_IFACE_ACT_FLAG_POSSIBLE: + in->act_game[player_iface_position.row][player_iface_position.col] = + GAME_IFACE_GAME_ACT_FLAG_POSSIBLE; + break; + + case PLAYER_IFACE_ACT_RM_FLAG: + in->act_game[player_iface_position.row][player_iface_position.col] = + GAME_IFACE_GAME_ACT_RM_FLAG; + break; + } + + in->action = GAME_IFACE_ACT_PLAY; +} + +static void player_iface_act_game (struct Game_Iface_In *in) +{ + switch (player_action) { + case PLAYER_IFACE_ACT_PAUSE: + in->action = GAME_IFACE_ACT_PAUSE; + break; + + case PLAYER_IFACE_ACT_SAVE: + in->action = GAME_IFACE_ACT_SAVE; + break; + + case PLAYER_IFACE_ACT_XYZZY_ON: + in->action = GAME_IFACE_ACT_XYZZY_ON; + break; + + case PLAYER_IFACE_ACT_XYZZY_OFF: + in->action = GAME_IFACE_ACT_XYZZY_OFF; + break; + + case PLAYER_IFACE_ACT_XYZZY_LIN: + in->action = GAME_IFACE_ACT_XYZZY_LIN; + break; + + case PLAYER_IFACE_ACT_XYZZY_P: + in->action = GAME_IFACE_ACT_XYZZY_P; + break; + + case PLAYER_IFACE_ACT_XYZZY_NP: + in->action = GAME_IFACE_ACT_XYZZY_NP; + break; + + case PLAYER_IFACE_ACT_QUIT: + in->action = GAME_IFACE_ACT_QUIT; + break; + } +} + +/* * * * * * * * * * + * * * Actions: player iface * * * * + * * * * * * * * * */ +static void player_iface_move_up (void) +{ + if (player_iface_position.row) { + (player_iface_position.row)--; + } else { + player_iface_position.row = player_iface_position.rows - 1; + } +} + +static void player_iface_move_down (void) +{ + if (player_iface_position.row != player_iface_position.rows - 1) { + (player_iface_position.row)++; + } else { + player_iface_position.row = 0; + } +} + +static void player_iface_move_right (void) +{ + if (player_iface_position.col != player_iface_position.cols - 1) { + (player_iface_position.col)++; + } else { + player_iface_position.col = 0; + } +} + +static void player_iface_move_left (void) +{ + if (player_iface_position.col) { + (player_iface_position.col)--; + } else { + player_iface_position.col = player_iface_position.cols - 1; + } +} + +static void highlight_cursor (void) +{ + player_iface_position.highlight = !player_iface_position.highlight; +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/player/src/player_tui.c b/modules/player/src/player_tui.c index 2905932..b5209ed 100644 --- a/modules/player/src/player_tui.c +++ b/modules/player/src/player_tui.c @@ -1,980 +1,944 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* WINDOW & wgetch() & KEY_... & ... */
- #include <ncurses.h>
- /* wchar_t */
- #include <wchar.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* alx_..._curses() & alx_ncur_prn_...() */
- #include "alx_ncur.h"
-
- /* struct Game_Iface_Out */
- #include "game_iface.h"
-
- /* struct Player_Iface_Position */
- #include "player_iface.h"
-
- #include "player_tui.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define REFRESH_TIME_MS (100)
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Global * * * * * *
- * * * * * * * * * */
-bool flag_color;
-
-/* * * * * * * * * *
- * * * Static * * * * * *
- * * * * * * * * * */
-static WINDOW *win_board;
-static WINDOW *win_help;
-static int last_help;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
- /* Start */
-static void show_board_start(const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-static void board_loop_start(const struct Player_Iface_Position *position);
-static void highlight_cursor_start(const struct Player_Iface_Position *position);
-
- /* Play */
-static void show_board (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle);
-
-static void board_loop (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position);
-
-static void highlight_cursor(wchar_t wch,
- const struct Player_Iface_Position *position);
-
-static wchar_t set_char (int game_iface_visible);
-static void show_char (int row, int col, wchar_t wch);
- /* Input */
-static int usr_input (void);
- /* Help */
-static void show_help (const struct Game_Iface_Out *board);
-static void show_help_start (void);
-static void show_help_play (void);
-static void show_help_pause (void);
-static void show_help_xyzzy (void);
-static void show_help_cheat (void);
-static void show_help_safe (void);
-static void show_help_gameover (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void player_tui_init (int rows, int cols)
-{
- /* Use curses mode */
- alx_resume_curses();
-
- /* Colors */
- flag_color = false;
- if (has_colors()) {
- flag_color = true;
- /* Clear */
- init_pair(PAIR_1, COLOR_BLUE, COLOR_WHITE);
- init_pair(PAIR_2, COLOR_GREEN, COLOR_WHITE);
- init_pair(PAIR_3, COLOR_RED, COLOR_WHITE);
- init_pair(PAIR_4, COLOR_BLUE, COLOR_WHITE);
- init_pair(PAIR_5, COLOR_RED, COLOR_WHITE);
- init_pair(PAIR_6, COLOR_CYAN, COLOR_WHITE);
- init_pair(PAIR_7, COLOR_BLACK, COLOR_WHITE);
- init_pair(PAIR_8, COLOR_BLACK, COLOR_WHITE);
- init_pair(PAIR_BLANK, COLOR_BLACK, COLOR_WHITE);
- /* Hidden */
- init_pair(PAIR_MINE, COLOR_WHITE, COLOR_BLACK);
- init_pair(PAIR_HIDDEN, COLOR_WHITE, COLOR_BLACK);
- /* Possible */
- init_pair(PAIR_fail, COLOR_RED, COLOR_BLACK);
- init_pair(PAIR_POSSIBLE, COLOR_BLUE, COLOR_BLACK);
- /* Flag */
- init_pair(PAIR_FAIL, COLOR_RED, COLOR_BLACK);
- init_pair(PAIR_FLAG, COLOR_RED, COLOR_BLACK);
- /* Kboom */
- init_pair(PAIR_KBOOM, COLOR_BLACK, COLOR_RED);
- /* Highlight */
- init_pair(PAIR_HILITE, COLOR_YELLOW, COLOR_RED);
- /* Terminal */
- init_pair(PAIR_TERM, -1, -1);
- }
-
- /* Dimensions: board */
- const int h1 = rows + 2;
- const int w1 = 2 * cols + 3;
- const int r1 = 0;
- const int c1 = 11;
- win_board = newwin(h1, w1, r1, c1);
-
- /* Dimensions: help */
- const int h2 = 24;
- const int w2 = 10;
- const int r2 = 0;
- const int c2 = 0;
- win_help = newwin(h2, w2, r2, c2);
-
- /* Activate keypad, don't echo input, and set timeout = REFRESH_TIME_MS ms */
- keypad(win_board, true);
- noecho();
- wtimeout(win_board, REFRESH_TIME_MS);
-}
-
-int player_tui_start (const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action)
-{
- show_help_start();
- show_board_start(position, title, subtitle);
- *action = usr_input();
-
- return 0;
-}
-
-int player_tui (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle,
- int *action)
-{
- show_help(board);
- show_board(board, position, title, subtitle);
- *action = usr_input();
-
- return 0;
-}
-
-void player_tui_save_name (const char *filepath, char *filename, int destsize)
-{
- /* Input box */
- int w;
- int r;
- w = 60;
- r = 10;
-
- /* Request name */
- alx_w_getfname(filepath, filename, false, w, r, "File name:", NULL);
-}
-
-void player_tui_score_name (char *player_name, int destsize)
-{
- /* Input box */
- int w;
- int r;
- w = 60;
- r = 10;
-
- /* Request name */
- alx_w_getstr(player_name, destsize, w, r, "Your name:", NULL);
-}
-
-void player_tui_cleanup (void)
-{
- /* Del wins & return to terminal mode */
- alx_win_del(win_board);
- alx_win_del(win_help);
- alx_pause_curses();
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Start * * * * * * *
- * * * * * * * * * */
-static void show_board_start(const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- /* Clear & box */
- werase(win_board);
- box(win_board, 0, 0);
-
- /* Title */
- alx_ncur_prn_title(win_board, title);
- /* Subtitle */
- alx_ncur_prn_subtitle(win_board, subtitle);
-
- /* Board */
- board_loop_start(position);
-
- /* Cursor */
- wmove(win_board, 1 + position->row, 2 + 2 * position->col);
-
- /* Refresh */
- wrefresh(win_board);
-}
-
-static void board_loop_start(const struct Player_Iface_Position *position)
-{
- int i;
- int j;
-
- int k;
- int l;
- wchar_t wch;
- wch = PLAYER_TUI_CHAR_HIDDEN_FIELD;
-
- for (i = 0; i < position->rows; i++) {
- k = 1 + i;
-
- /* hidden */
- for (j = 0; j < position->cols; j++) {
- l = 2 + 2 * j;
-
- show_char(k, l, wch);
- }
- }
-
- /* Highlight cursor */
- if (position->highlight) {
- highlight_cursor(wch, position);
- }
-}
-
-static void highlight_cursor_start(const struct Player_Iface_Position *position)
-{
- int k;
- int l;
- wchar_t wch;
- int pair;
-
- k = 1 + position->row;
- l = 2 + 2 * position->col;
- wch = PLAYER_TUI_CHAR_HIDDEN_FIELD;
-
- pair = PAIR_HILITE;
- if (flag_color) {
- wattron(win_board, A_BOLD | COLOR_PAIR(pair));
- }
- mvwaddch(win_board, k, l - 1, '<');
- mvwaddch(win_board, k, l, wch);
- mvwaddch(win_board, k, l + 1, '>');
- if (flag_color) {
- wattroff(win_board, A_BOLD | COLOR_PAIR(pair));
- }
-}
-
-/* * * * * * * * * *
- * * * Play * * * * * *
- * * * * * * * * * */
-static void show_board (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position,
- const char *title,
- const char *subtitle)
-{
- /* Clear & box */
- werase(win_board);
- box(win_board, 0, 0);
-
- /* Title */
- alx_ncur_prn_title(win_board, title);
- /* Subtitle */
- alx_ncur_prn_subtitle(win_board, subtitle);
-
- /* Board */
- board_loop(board, position);
-
- /* Cursor */
- wmove(win_board, 1 + position->row, 2 + 2 * position->col);
-
- /* Refresh */
- wrefresh(win_board);
-}
-
-static void board_loop (const struct Game_Iface_Out *board,
- const struct Player_Iface_Position *position)
-{
- int i;
- int j;
- int k;
- int l;
- wchar_t wch;
-
- for (i = 0; i < board->rows; i++) {
- k = 1 + i;
-
- /* clear */
- for (j = 0; j < board->cols; j++) {
- l = 2 + 2 * j;
- if (board->usr[i][j] == GAME_IFACE_USR_CLEAR) {
- wch = set_char(board->visible[i][j]);
- show_char(k, l, wch);
- }
- }
- /* xyzzy */
- /* hidden */
- for (j = 0; j < board->cols; j++) {
- l = 2 + 2 * j;
- if (board->usr[i][j] != GAME_IFACE_USR_CLEAR) {
- wch = set_char(board->visible[i][j]);
- show_char(k, l, wch);
- }
- }
- /* kboom */
- for (j = 0; j < board->cols; j++) {
- l = 2 + 2 * j;
- if (board->usr[i][j] == GAME_IFACE_USR_KBOOM) {
- wch = set_char(board->visible[i][j]);
- show_char(k, l, wch);
- }
- }
- }
-
- /* Highlight cursor */
- if (position->highlight) {
- wch = set_char(board->visible[position->row][position->col]);
- highlight_cursor(wch, position);
- }
-}
-
-static void highlight_cursor(wchar_t wch,
- const struct Player_Iface_Position *position)
-{
- int k;
- int l;
- int pair;
-
- k = 1 + position->row;
- l = 2 + 2 * position->col;
-
- pair = PAIR_HILITE;
- if (flag_color) {
- wattron(win_board, A_BOLD | COLOR_PAIR(pair));
- }
- mvwaddch(win_board, k, l - 1, '<');
- mvwaddch(win_board, k, l, wch);
- mvwaddch(win_board, k, l + 1, '>');
- if (flag_color) {
- wattroff(win_board, A_BOLD | COLOR_PAIR(pair));
- }
-}
-
-static wchar_t set_char (int game_iface_visible)
-{
- wchar_t wch;
- switch (game_iface_visible) {
- case GAME_IFACE_VIS_KBOOM:
- wch = PLAYER_TUI_CHAR_KBOOM;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_FIELD:
- wch = PLAYER_TUI_CHAR_HIDDEN_FIELD;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_MINE:
- wch = PLAYER_TUI_CHAR_HIDDEN_MINE;
- break;
-
- case GAME_IFACE_VIS_HIDDEN_SAFE:
- wch = PLAYER_TUI_CHAR_HIDDEN_SAFE;
- break;
-
- case GAME_IFACE_VIS_SAFE_MINE:
- wch = PLAYER_TUI_CHAR_SAFE_MINE;
- break;
-
- case GAME_IFACE_VIS_0:
- wch = PLAYER_TUI_CHAR_0;
- break;
-
- case GAME_IFACE_VIS_1:
- wch = PLAYER_TUI_CHAR_1;
- break;
-
- case GAME_IFACE_VIS_2:
- wch = PLAYER_TUI_CHAR_2;
- break;
-
- case GAME_IFACE_VIS_3:
- wch = PLAYER_TUI_CHAR_3;
- break;
-
- case GAME_IFACE_VIS_4:
- wch = PLAYER_TUI_CHAR_4;
- break;
-
- case GAME_IFACE_VIS_5:
- wch = PLAYER_TUI_CHAR_5;
- break;
-
- case GAME_IFACE_VIS_6:
- wch = PLAYER_TUI_CHAR_6;
- break;
-
- case GAME_IFACE_VIS_7:
- wch = PLAYER_TUI_CHAR_7;
- break;
-
- case GAME_IFACE_VIS_8:
- wch = PLAYER_TUI_CHAR_8;
- break;
-
- case GAME_IFACE_VIS_FLAG:
- wch = PLAYER_TUI_CHAR_FLAG;
- break;
-
- case GAME_IFACE_VIS_FLAG_FALSE:
- wch = PLAYER_TUI_CHAR_FLAG_FALSE;
- break;
-
- case GAME_IFACE_VIS_POSSIBLE:
- wch = PLAYER_TUI_CHAR_POSSIBLE;
- break;
-
- case GAME_IFACE_VIS_POSSIBLE_FALSE:
- wch = PLAYER_TUI_CHAR_POSSIBLE_FALSE;
- break;
-
- default:
- wch = PLAYER_TUI_CHAR_ERROR;
- break;
- }
-
- return wch;
-}
-
-static void show_char (int row, int col, wchar_t wch)
-{
- /* Select attributes */
- int pair;
- switch (wch) {
- case PLAYER_TUI_CHAR_1:
- pair = PAIR_1;
- break;
-
- case PLAYER_TUI_CHAR_2:
- pair = PAIR_2;
- break;
-
- case PLAYER_TUI_CHAR_3:
- pair = PAIR_3;
- break;
-
- case PLAYER_TUI_CHAR_4:
- pair = PAIR_4;
- break;
-
- case PLAYER_TUI_CHAR_5:
- pair = PAIR_5;
- break;
-
- case PLAYER_TUI_CHAR_6:
- pair = PAIR_6;
- break;
-
- case PLAYER_TUI_CHAR_7:
- pair = PAIR_7;
- break;
-
- case PLAYER_TUI_CHAR_8:
- pair = PAIR_8;
- break;
-
- case PLAYER_TUI_CHAR_0:
- pair = PAIR_BLANK;
- break;
-
- case PLAYER_TUI_CHAR_HIDDEN_MINE:
- case PLAYER_TUI_CHAR_SAFE_MINE:
- pair = PAIR_MINE;
- break;
-
- case PLAYER_TUI_CHAR_HIDDEN_FIELD:
- case PLAYER_TUI_CHAR_HIDDEN_SAFE:
- pair = PAIR_HIDDEN;
- break;
-
- case PLAYER_TUI_CHAR_POSSIBLE_FALSE:
- pair = PAIR_fail;
- break;
-
- case PLAYER_TUI_CHAR_POSSIBLE:
- pair = PAIR_POSSIBLE;
- break;
-
- case PLAYER_TUI_CHAR_FLAG_FALSE:
- pair = PAIR_FAIL;
- break;
-
- case PLAYER_TUI_CHAR_FLAG:
- pair = PAIR_FLAG;
- break;
-
- case PLAYER_TUI_CHAR_KBOOM:
- pair = PAIR_KBOOM;
- break;
-
- default:
- pair = PAIR_KBOOM;
- break;
- }
-
- /* Print char */
- if (flag_color) {
- wattron(win_board, A_BOLD | COLOR_PAIR(pair));
- }
- mvwaddch(win_board, row, col - 1, ' ');
- mvwaddch(win_board, row, col, wch);
- mvwaddch(win_board, row, col + 1, ' ');
- if (flag_color) {
- wattroff(win_board, A_BOLD | COLOR_PAIR(pair));
- }
-}
-
-/* * * * * * * * * *
- * * * Input * * * * * * *
- * * * * * * * * * */
-static int usr_input (void)
-{
- wchar_t ch;
- ch = wgetch(win_board);
-
- int action;
-
- switch (ch) {
- case '+':
- case '\r':
- case '\n':
- action = PLAYER_IFACE_ACT_STEP;
- break;
-
- case ' ':
- action = PLAYER_IFACE_ACT_FLAG;
- break;
-
- case 'f':
- action = PLAYER_IFACE_ACT_FLAG_POSSIBLE;
- break;
-
- /* ASCII 0x08 is BS */
- case KEY_BACKSPACE:
- case 0x08:
- action = PLAYER_IFACE_ACT_RM_FLAG;
- break;
-
-
- case KEY_BREAK:
- case 'p':
- action = PLAYER_IFACE_ACT_PAUSE;
- break;
-
- case 's':
- action = PLAYER_IFACE_ACT_SAVE;
- break;
-
- case 'x':
- /* Wait for special sequence "xyzzy" */
- wtimeout(win_board, 1000);
-
- ch = wgetch(win_board);
- if (ch == 'y') {
- ch = wgetch(win_board);
- if (ch == 'z') {
-
- ch = wgetch(win_board);
- if (ch == 'z') {
-
- ch = wgetch(win_board);
- if (ch == 'y') {
- action = PLAYER_IFACE_ACT_XYZZY_ON;
- }
- }
- }
- }
-
- /* Resume */
- wtimeout(win_board, REFRESH_TIME_MS);
- break;
-
- case '0':
- action = PLAYER_IFACE_ACT_XYZZY_OFF;
- break;
-
- case '1':
- action = PLAYER_IFACE_ACT_XYZZY_LIN;
- break;
-
- case '2':
- action = PLAYER_IFACE_ACT_XYZZY_P;
- break;
-
- case '3':
- action = PLAYER_IFACE_ACT_XYZZY_NP;
- break;
-
- case 'q':
- action = PLAYER_IFACE_ACT_QUIT;
- break;
-
-
- case KEY_LEFT:
- case 'h':
- action = PLAYER_IFACE_ACT_MOVE_LEFT;
- break;
-
- case KEY_DOWN:
- case 'j':
- action = PLAYER_IFACE_ACT_MOVE_DOWN;
- break;
-
- case KEY_UP:
- case 'k':
- action = PLAYER_IFACE_ACT_MOVE_UP;
- break;
-
- case KEY_RIGHT:
- case 'l':
- action = PLAYER_IFACE_ACT_MOVE_RIGHT;
- break;
-
- case 'c':
- action = PLAYER_IFACE_ACT_HIGHLIGHT;
- break;
-
- default:
- action = PLAYER_IFACE_ACT_FOO;
- break;
- }
-
- return action;
-}
-
-/* * * * * * * * * *
- * * * Help * * * * * * *
- * * * * * * * * * */
-static void show_help (const struct Game_Iface_Out *board)
-{
- if (last_help != board->state) {
- /* Clear */
- werase(win_help);
-
- switch (board->state) {
- case GAME_IFACE_STATE_PLAYING:
- show_help_play();
- break;
-
- case GAME_IFACE_STATE_PAUSE:
- show_help_pause();
- break;
-
- case GAME_IFACE_STATE_XYZZY:
- show_help_xyzzy();
- break;
-
- case GAME_IFACE_STATE_CHEATED:
- show_help_cheat();
- break;
-
- case GAME_IFACE_STATE_SAFE:
- show_help_safe();
- break;
-
- case GAME_IFACE_STATE_GAMEOVER:
- show_help_gameover();
- break;
- }
-
- /* Refresh */
- wrefresh(win_help);
-
- /* Update last_help */
- last_help = board->state;
- }
-}
-
-static void show_help_start (void)
-{
- /* Clear */
- werase(win_help);
-
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win_help, r, c, 'h');
- c += 2;
- mvwaddch(win_help, r, c, 'j');
- c += 2;
- mvwaddch(win_help, r, c, 'k');
- c += 2;
- mvwaddch(win_help, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win_help, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win_help, r++, c, "Cursor:");
- mvwprintw(win_help, r++, c, " %c", 'c');
-
- mvwaddstr(win_help, r++, c, "Step:");
- mvwprintw(win_help, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-
- /* Refresh */
- wrefresh(win_help);
-
- /* Update last_help */
- last_help = GAME_IFACE_STATE_FOO;
-}
-
-static void show_help_play (void)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win_help, r, c, 'h');
- c += 2;
- mvwaddch(win_help, r, c, 'j');
- c += 2;
- mvwaddch(win_help, r, c, 'k');
- c += 2;
- mvwaddch(win_help, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win_help, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win_help, r++, c, "Cursor:");
- mvwprintw(win_help, r++, c, " %c", 'c');
-
- mvwaddstr(win_help, r++, c, "Step:");
- mvwprintw(win_help, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win_help, r++, c, "Flag:");
- mvwprintw(win_help, r++, c, " Space");
-
- mvwaddstr(win_help, r++, c, "Possible:");
- mvwprintw(win_help, r++, c, " %c", 'f');
-
- mvwaddstr(win_help, r++, c, "rm flag:");
- mvwprintw(win_help, r++, c, " Backspace");
-
- mvwaddstr(win_help, r++, c, "Pause:");
- mvwprintw(win_help, r++, c, " Break / %c", 'p');
-
- mvwaddstr(win_help, r++, c, "Save:");
- mvwprintw(win_help, r++, c, " %c", 's');
-
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-}
-
-static void show_help_pause (void)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c, "Cursor:");
- mvwprintw(win_help, r++, c, " %c", 'c');
-
- mvwaddstr(win_help, r++, c, "Continue:");
- mvwprintw(win_help, r++, c, " Break / %c", 'p');
-
- mvwaddstr(win_help, r++, c, "Save:");
- mvwprintw(win_help, r++, c, " %c", 's');
-
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-}
-
-static void show_help_xyzzy (void)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c++, "XYZZY:");
- mvwprintw(win_help, r, c, "%c", '1');
- c += 2;
- mvwprintw(win_help, r, c, "%c", '2');
-// c += 2;
-// mvwprintw(win_help, r, c, "%c", 'd');
-
- r++;
- c = 0;
- mvwaddstr(win_help, r++, c, "XYZZY off:");
- mvwprintw(win_help, r++, c, " %c", '0');
-
- mvwaddstr(win_help, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win_help, r, c, 'h');
- c += 2;
- mvwaddch(win_help, r, c, 'j');
- c += 2;
- mvwaddch(win_help, r, c, 'k');
- c += 2;
- mvwaddch(win_help, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win_help, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win_help, r++, c, "Cursor:");
- mvwprintw(win_help, r++, c, " %c", 'c');
-
- mvwaddstr(win_help, r++, c, "Step:");
- mvwprintw(win_help, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win_help, r++, c, "Flag:");
- mvwprintw(win_help, r++, c, " Space");
-
- mvwaddstr(win_help, r++, c, "Possible:");
- mvwprintw(win_help, r++, c, " %c", 'f');
-
- mvwaddstr(win_help, r++, c, "rm flag:");
- mvwprintw(win_help, r++, c, " Backspace");
-
- mvwaddstr(win_help, r++, c, "Save:");
- mvwprintw(win_help, r++, c, " %c", 's');
-
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-}
-
-static void show_help_cheat (void)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win_help, r, c, 'h');
- c += 2;
- mvwaddch(win_help, r, c, 'j');
- c += 2;
- mvwaddch(win_help, r, c, 'k');
- c += 2;
- mvwaddch(win_help, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win_help, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win_help, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win_help, r++, c, "Cursor:");
- mvwprintw(win_help, r++, c, " %c", 'c');
-
- mvwaddstr(win_help, r++, c, "Step:");
- mvwprintw(win_help, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win_help, r++, c, "Flag:");
- mvwprintw(win_help, r++, c, " Space");
-
- mvwaddstr(win_help, r++, c, "Possible:");
- mvwprintw(win_help, r++, c, " %c", 'f');
-
- mvwaddstr(win_help, r++, c, "rm flag:");
- mvwprintw(win_help, r++, c, " Backspace");
-
- mvwaddstr(win_help, r++, c, "Save:");
- mvwprintw(win_help, r++, c, " %c", 's');
-
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-}
-
-static void show_help_safe (void)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c, "Save:");
- mvwprintw(win_help, r++, c, " %c", 's');
-
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-}
-
-static void show_help_gameover (void)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win_help, r++, c, "Quit:");
- mvwprintw(win_help, r++, c, " %c", 'q');
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + /* WINDOW & wgetch() & KEY_... & ... */ + #include <ncurses.h> + /* wchar_t */ + #include <wchar.h> + +/* libalx ------------------------------------------------------------------*/ + /* alx_..._curses() & alx_ncur_prn_...() */ + #include "alx_ncur.h" + +/* Project -------------------------------------------------------------------*/ + /* struct Game_Iface_Out */ + #include "game_iface.h" + + /* struct Player_Iface_Position */ + #include "player_iface.h" + + #include "player_tui.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define REFRESH_TIME_MS (100) + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +/* Global --------------------------------------------------------------------*/ +bool flag_color; +/* Static --------------------------------------------------------------------*/ +static WINDOW *win_board; +static WINDOW *win_help; +static int last_help; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ + /* Start */ +static void show_board_start(const struct Player_Iface_Position *position, + const char *title, const char *subtitle); + +static void board_loop_start(const struct Player_Iface_Position *position); + + /* Play */ +static void show_board (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, const char *subtitle); + +static void board_loop (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position); + +static void highlight_cursor(wchar_t wch, + const struct Player_Iface_Position *position); + +static wchar_t set_char (int game_iface_visible); +static void show_char (int row, int col, wchar_t wch); + /* Input */ +static int usr_input (void); + /* Help */ +static void show_help (const struct Game_Iface_Out *board); +static void show_help_start (void); +static void show_help_play (void); +static void show_help_pause (void); +static void show_help_xyzzy (void); +static void show_help_cheat (void); +static void show_help_safe (void); +static void show_help_gameover (void); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void player_tui_init (int rows, int cols) +{ + /* Use curses mode */ + alx_resume_curses(); + + /* Colors */ + flag_color = false; + if (has_colors()) { + flag_color = true; + /* Clear */ + init_pair(PAIR_1, COLOR_BLUE, COLOR_WHITE); + init_pair(PAIR_2, COLOR_GREEN, COLOR_WHITE); + init_pair(PAIR_3, COLOR_RED, COLOR_WHITE); + init_pair(PAIR_4, COLOR_BLUE, COLOR_WHITE); + init_pair(PAIR_5, COLOR_RED, COLOR_WHITE); + init_pair(PAIR_6, COLOR_CYAN, COLOR_WHITE); + init_pair(PAIR_7, COLOR_BLACK, COLOR_WHITE); + init_pair(PAIR_8, COLOR_BLACK, COLOR_WHITE); + init_pair(PAIR_BLANK, COLOR_BLACK, COLOR_WHITE); + /* Hidden */ + init_pair(PAIR_MINE, COLOR_WHITE, COLOR_BLACK); + init_pair(PAIR_HIDDEN, COLOR_WHITE, COLOR_BLACK); + /* Possible */ + init_pair(PAIR_fail, COLOR_RED, COLOR_BLACK); + init_pair(PAIR_POSSIBLE, COLOR_BLUE, COLOR_BLACK); + /* Flag */ + init_pair(PAIR_FAIL, COLOR_RED, COLOR_BLACK); + init_pair(PAIR_FLAG, COLOR_RED, COLOR_BLACK); + /* Kboom */ + init_pair(PAIR_KBOOM, COLOR_BLACK, COLOR_RED); + /* Highlight */ + init_pair(PAIR_HILITE, COLOR_YELLOW, COLOR_RED); + /* Terminal */ + init_pair(PAIR_TERM, -1, -1); + } + + /* Dimensions: board */ + const int h1 = rows + 2; + const int w1 = 2 * cols + 3; + const int r1 = 0; + const int c1 = 11; + win_board = newwin(h1, w1, r1, c1); + + /* Dimensions: help */ + const int h2 = 24; + const int w2 = 10; + const int r2 = 0; + const int c2 = 0; + win_help = newwin(h2, w2, r2, c2); + + /* Activate keypad, don't echo input, and set timeout = REFRESH_TIME_MS ms */ + keypad(win_board, true); + noecho(); + wtimeout(win_board, REFRESH_TIME_MS); +} + +int player_tui_start (const struct Player_Iface_Position *position, + const char *title, const char *subtitle, + int *action) +{ + + show_help_start(); + show_board_start(position, title, subtitle); + *action = usr_input(); + + return 0; +} + +int player_tui (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, const char *subtitle, + int *action) +{ + + show_help(board); + show_board(board, position, title, subtitle); + *action = usr_input(); + + return 0; +} + +void player_tui_save_name (const char *fpath, char *fname, int destsize) +{ + int w; + int r; + + /* Input box */ + w = 60; + r = 10; + /* Request name */ + alx_w_getfname(fpath, fname, false, w, r, "File name:", NULL); +} + +void player_tui_score_name (char *player_name, int destsize) +{ + int w; + int r; + + /* Input box */ + w = 60; + r = 10; + /* Request name */ + alx_w_getstr(player_name, destsize, w, r, "Your name:", NULL); +} + +void player_tui_cleanup (void) +{ + + alx_win_del(win_board); + alx_win_del(win_help); + alx_pause_curses(); +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Start * * * * * * * + * * * * * * * * * */ +static void show_board_start(const struct Player_Iface_Position *position, + const char *title, const char *subtitle) +{ + /* Clear & box */ + werase(win_board); + box(win_board, 0, 0); + + /* Title */ + alx_ncur_prn_title(win_board, title); + /* Subtitle */ + alx_ncur_prn_subtitle(win_board, subtitle); + + /* Board */ + board_loop_start(position); + + /* Cursor */ + wmove(win_board, 1 + position->row, 2 + 2 * position->col); + + /* Refresh */ + wrefresh(win_board); +} + +static void board_loop_start(const struct Player_Iface_Position *position) +{ + int i; + int j; + + int k; + int l; + wchar_t wch; + wch = PLAYER_TUI_CHAR_HIDDEN_FIELD; + + for (i = 0; i < position->rows; i++) { + k = 1 + i; + + /* hidden */ + for (j = 0; j < position->cols; j++) { + l = 2 + 2 * j; + + show_char(k, l, wch); + } + } + + /* Highlight cursor */ + if (position->highlight) { + highlight_cursor(wch, position); + } +} + +/* * * * * * * * * * + * * * Play * * * * * * + * * * * * * * * * */ +static void show_board (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position, + const char *title, const char *subtitle) +{ + /* Clear & box */ + werase(win_board); + box(win_board, 0, 0); + + /* Title */ + alx_ncur_prn_title(win_board, title); + /* Subtitle */ + alx_ncur_prn_subtitle(win_board, subtitle); + + /* Board */ + board_loop(board, position); + + /* Cursor */ + wmove(win_board, 1 + position->row, 2 + 2 * position->col); + + /* Refresh */ + wrefresh(win_board); +} + +static void board_loop (const struct Game_Iface_Out *board, + const struct Player_Iface_Position *position) +{ + int i; + int j; + int k; + int l; + wchar_t wch; + + for (i = 0; i < board->rows; i++) { + k = 1 + i; + + /* clear */ + for (j = 0; j < board->cols; j++) { + l = 2 + 2 * j; + if (board->usr[i][j] == GAME_IFACE_USR_CLEAR) { + wch = set_char(board->visible[i][j]); + show_char(k, l, wch); + } + } + /* xyzzy */ + /* hidden */ + for (j = 0; j < board->cols; j++) { + l = 2 + 2 * j; + if (board->usr[i][j] != GAME_IFACE_USR_CLEAR) { + wch = set_char(board->visible[i][j]); + show_char(k, l, wch); + } + } + /* kboom */ + for (j = 0; j < board->cols; j++) { + l = 2 + 2 * j; + if (board->usr[i][j] == GAME_IFACE_USR_KBOOM) { + wch = set_char(board->visible[i][j]); + show_char(k, l, wch); + } + } + } + + /* Highlight cursor */ + if (position->highlight) { + wch = set_char(board->visible[position->row][position->col]); + highlight_cursor(wch, position); + } +} + +static void highlight_cursor(wchar_t wch, + const struct Player_Iface_Position *position) +{ + int k; + int l; + int pair; + + k = 1 + position->row; + l = 2 + 2 * position->col; + + pair = PAIR_HILITE; + if (flag_color) { + wattron(win_board, A_BOLD | COLOR_PAIR(pair)); + } + mvwaddch(win_board, k, l - 1, '<'); + mvwaddch(win_board, k, l, wch); + mvwaddch(win_board, k, l + 1, '>'); + if (flag_color) { + wattroff(win_board, A_BOLD | COLOR_PAIR(pair)); + } +} + +static wchar_t set_char (int game_iface_visible) +{ + wchar_t wch; + switch (game_iface_visible) { + case GAME_IFACE_VIS_KBOOM: + wch = PLAYER_TUI_CHAR_KBOOM; + break; + + case GAME_IFACE_VIS_HIDDEN_FIELD: + wch = PLAYER_TUI_CHAR_HIDDEN_FIELD; + break; + + case GAME_IFACE_VIS_HIDDEN_MINE: + wch = PLAYER_TUI_CHAR_HIDDEN_MINE; + break; + + case GAME_IFACE_VIS_HIDDEN_SAFE: + wch = PLAYER_TUI_CHAR_HIDDEN_SAFE; + break; + + case GAME_IFACE_VIS_SAFE_MINE: + wch = PLAYER_TUI_CHAR_SAFE_MINE; + break; + + case GAME_IFACE_VIS_0: + wch = PLAYER_TUI_CHAR_0; + break; + + case GAME_IFACE_VIS_1: + wch = PLAYER_TUI_CHAR_1; + break; + + case GAME_IFACE_VIS_2: + wch = PLAYER_TUI_CHAR_2; + break; + + case GAME_IFACE_VIS_3: + wch = PLAYER_TUI_CHAR_3; + break; + + case GAME_IFACE_VIS_4: + wch = PLAYER_TUI_CHAR_4; + break; + + case GAME_IFACE_VIS_5: + wch = PLAYER_TUI_CHAR_5; + break; + + case GAME_IFACE_VIS_6: + wch = PLAYER_TUI_CHAR_6; + break; + + case GAME_IFACE_VIS_7: + wch = PLAYER_TUI_CHAR_7; + break; + + case GAME_IFACE_VIS_8: + wch = PLAYER_TUI_CHAR_8; + break; + + case GAME_IFACE_VIS_FLAG: + wch = PLAYER_TUI_CHAR_FLAG; + break; + + case GAME_IFACE_VIS_FLAG_FALSE: + wch = PLAYER_TUI_CHAR_FLAG_FALSE; + break; + + case GAME_IFACE_VIS_POSSIBLE: + wch = PLAYER_TUI_CHAR_POSSIBLE; + break; + + case GAME_IFACE_VIS_POSSIBLE_FALSE: + wch = PLAYER_TUI_CHAR_POSSIBLE_FALSE; + break; + + default: + wch = PLAYER_TUI_CHAR_ERROR; + break; + } + + return wch; +} + +static void show_char (int row, int col, wchar_t wch) +{ + /* Select attributes */ + int pair; + switch (wch) { + case PLAYER_TUI_CHAR_1: + pair = PAIR_1; + break; + + case PLAYER_TUI_CHAR_2: + pair = PAIR_2; + break; + + case PLAYER_TUI_CHAR_3: + pair = PAIR_3; + break; + + case PLAYER_TUI_CHAR_4: + pair = PAIR_4; + break; + + case PLAYER_TUI_CHAR_5: + pair = PAIR_5; + break; + + case PLAYER_TUI_CHAR_6: + pair = PAIR_6; + break; + + case PLAYER_TUI_CHAR_7: + pair = PAIR_7; + break; + + case PLAYER_TUI_CHAR_8: + pair = PAIR_8; + break; + + case PLAYER_TUI_CHAR_0: + pair = PAIR_BLANK; + break; + + case PLAYER_TUI_CHAR_HIDDEN_MINE: + case PLAYER_TUI_CHAR_SAFE_MINE: + pair = PAIR_MINE; + break; + + case PLAYER_TUI_CHAR_HIDDEN_FIELD: + case PLAYER_TUI_CHAR_HIDDEN_SAFE: + pair = PAIR_HIDDEN; + break; + + case PLAYER_TUI_CHAR_POSSIBLE_FALSE: + pair = PAIR_fail; + break; + + case PLAYER_TUI_CHAR_POSSIBLE: + pair = PAIR_POSSIBLE; + break; + + case PLAYER_TUI_CHAR_FLAG_FALSE: + pair = PAIR_FAIL; + break; + + case PLAYER_TUI_CHAR_FLAG: + pair = PAIR_FLAG; + break; + + case PLAYER_TUI_CHAR_KBOOM: + pair = PAIR_KBOOM; + break; + + default: + pair = PAIR_KBOOM; + break; + } + + /* Print char */ + if (flag_color) { + wattron(win_board, A_BOLD | COLOR_PAIR(pair)); + } + mvwaddch(win_board, row, col - 1, ' '); + mvwaddch(win_board, row, col, wch); + mvwaddch(win_board, row, col + 1, ' '); + if (flag_color) { + wattroff(win_board, A_BOLD | COLOR_PAIR(pair)); + } +} + +/* * * * * * * * * * + * * * Input * * * * * * * + * * * * * * * * * */ +static int usr_input (void) +{ + wchar_t ch; + ch = wgetch(win_board); + + int action; + + switch (ch) { + case '+': + case '\r': + case '\n': + action = PLAYER_IFACE_ACT_STEP; + break; + + case ' ': + action = PLAYER_IFACE_ACT_FLAG; + break; + + case 'f': + action = PLAYER_IFACE_ACT_FLAG_POSSIBLE; + break; + + /* ASCII 0x08 is BS */ + case KEY_BACKSPACE: + case 0x08: + action = PLAYER_IFACE_ACT_RM_FLAG; + break; + + + case KEY_BREAK: + case 'p': + action = PLAYER_IFACE_ACT_PAUSE; + break; + + case 's': + action = PLAYER_IFACE_ACT_SAVE; + break; + + case 'x': + /* Wait for special sequence "xyzzy" */ + wtimeout(win_board, 1000); + + ch = wgetch(win_board); + if (ch == 'y') { + ch = wgetch(win_board); + if (ch == 'z') { + + ch = wgetch(win_board); + if (ch == 'z') { + + ch = wgetch(win_board); + if (ch == 'y') { + action = PLAYER_IFACE_ACT_XYZZY_ON; + } + } + } + } + + /* Resume */ + wtimeout(win_board, REFRESH_TIME_MS); + break; + + case '0': + action = PLAYER_IFACE_ACT_XYZZY_OFF; + break; + + case '1': + action = PLAYER_IFACE_ACT_XYZZY_LIN; + break; + + case '2': + action = PLAYER_IFACE_ACT_XYZZY_P; + break; + + case '3': + action = PLAYER_IFACE_ACT_XYZZY_NP; + break; + + case 'q': + action = PLAYER_IFACE_ACT_QUIT; + break; + + + case KEY_LEFT: + case 'h': + action = PLAYER_IFACE_ACT_MOVE_LEFT; + break; + + case KEY_DOWN: + case 'j': + action = PLAYER_IFACE_ACT_MOVE_DOWN; + break; + + case KEY_UP: + case 'k': + action = PLAYER_IFACE_ACT_MOVE_UP; + break; + + case KEY_RIGHT: + case 'l': + action = PLAYER_IFACE_ACT_MOVE_RIGHT; + break; + + case 'c': + action = PLAYER_IFACE_ACT_HIGHLIGHT; + break; + + default: + action = PLAYER_IFACE_ACT_FOO; + break; + } + + return action; +} + +/* * * * * * * * * * + * * * Help * * * * * * * + * * * * * * * * * */ +static void show_help (const struct Game_Iface_Out *board) +{ + if (last_help != board->state) { + /* Clear */ + werase(win_help); + + switch (board->state) { + case GAME_IFACE_STATE_PLAYING: + show_help_play(); + break; + + case GAME_IFACE_STATE_PAUSE: + show_help_pause(); + break; + + case GAME_IFACE_STATE_XYZZY: + show_help_xyzzy(); + break; + + case GAME_IFACE_STATE_CHEATED: + show_help_cheat(); + break; + + case GAME_IFACE_STATE_SAFE: + show_help_safe(); + break; + + case GAME_IFACE_STATE_GAMEOVER: + show_help_gameover(); + break; + } + + /* Refresh */ + wrefresh(win_help); + + /* Update last_help */ + last_help = board->state; + } +} + +static void show_help_start (void) +{ + /* Clear */ + werase(win_help); + + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c++, "Move:"); + /* hjkl */ + mvwaddch(win_help, r, c, 'h'); + c += 2; + mvwaddch(win_help, r, c, 'j'); + c += 2; + mvwaddch(win_help, r, c, 'k'); + c += 2; + mvwaddch(win_help, r, c, 'l'); + /* Arrows */ + r++; + c = 1; + mvwaddch(win_help, r, c, ACS_LARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_DARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_UARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_RARROW); + + r++; + c = 0; + mvwaddstr(win_help, r++, c, "Cursor:"); + mvwprintw(win_help, r++, c, " %c", 'c'); + + mvwaddstr(win_help, r++, c, "Step:"); + mvwprintw(win_help, r++, c, " Enter / %c", '+'); + + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); + + /* Refresh */ + wrefresh(win_help); + + /* Update last_help */ + last_help = GAME_IFACE_STATE_FOO; +} + +static void show_help_play (void) +{ + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c++, "Move:"); + /* hjkl */ + mvwaddch(win_help, r, c, 'h'); + c += 2; + mvwaddch(win_help, r, c, 'j'); + c += 2; + mvwaddch(win_help, r, c, 'k'); + c += 2; + mvwaddch(win_help, r, c, 'l'); + /* Arrows */ + r++; + c = 1; + mvwaddch(win_help, r, c, ACS_LARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_DARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_UARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_RARROW); + + r++; + c = 0; + mvwaddstr(win_help, r++, c, "Cursor:"); + mvwprintw(win_help, r++, c, " %c", 'c'); + + mvwaddstr(win_help, r++, c, "Step:"); + mvwprintw(win_help, r++, c, " Enter / %c", '+'); + + mvwaddstr(win_help, r++, c, "Flag:"); + mvwprintw(win_help, r++, c, " Space"); + + mvwaddstr(win_help, r++, c, "Possible:"); + mvwprintw(win_help, r++, c, " %c", 'f'); + + mvwaddstr(win_help, r++, c, "rm flag:"); + mvwprintw(win_help, r++, c, " Backspace"); + + mvwaddstr(win_help, r++, c, "Pause:"); + mvwprintw(win_help, r++, c, " Break / %c", 'p'); + + mvwaddstr(win_help, r++, c, "Save:"); + mvwprintw(win_help, r++, c, " %c", 's'); + + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); +} + +static void show_help_pause (void) +{ + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c, "Cursor:"); + mvwprintw(win_help, r++, c, " %c", 'c'); + + mvwaddstr(win_help, r++, c, "Continue:"); + mvwprintw(win_help, r++, c, " Break / %c", 'p'); + + mvwaddstr(win_help, r++, c, "Save:"); + mvwprintw(win_help, r++, c, " %c", 's'); + + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); +} + +static void show_help_xyzzy (void) +{ + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c++, "XYZZY:"); + mvwprintw(win_help, r, c, "%c", '1'); + c += 2; + mvwprintw(win_help, r, c, "%c", '2'); +// c += 2; +// mvwprintw(win_help, r, c, "%c", 'd'); + + r++; + c = 0; + mvwaddstr(win_help, r++, c, "XYZZY off:"); + mvwprintw(win_help, r++, c, " %c", '0'); + + mvwaddstr(win_help, r++, c++, "Move:"); + /* hjkl */ + mvwaddch(win_help, r, c, 'h'); + c += 2; + mvwaddch(win_help, r, c, 'j'); + c += 2; + mvwaddch(win_help, r, c, 'k'); + c += 2; + mvwaddch(win_help, r, c, 'l'); + /* Arrows */ + r++; + c = 1; + mvwaddch(win_help, r, c, ACS_LARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_DARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_UARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_RARROW); + + r++; + c = 0; + mvwaddstr(win_help, r++, c, "Cursor:"); + mvwprintw(win_help, r++, c, " %c", 'c'); + + mvwaddstr(win_help, r++, c, "Step:"); + mvwprintw(win_help, r++, c, " Enter / %c", '+'); + + mvwaddstr(win_help, r++, c, "Flag:"); + mvwprintw(win_help, r++, c, " Space"); + + mvwaddstr(win_help, r++, c, "Possible:"); + mvwprintw(win_help, r++, c, " %c", 'f'); + + mvwaddstr(win_help, r++, c, "rm flag:"); + mvwprintw(win_help, r++, c, " Backspace"); + + mvwaddstr(win_help, r++, c, "Save:"); + mvwprintw(win_help, r++, c, " %c", 's'); + + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); +} + +static void show_help_cheat (void) +{ + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c++, "Move:"); + /* hjkl */ + mvwaddch(win_help, r, c, 'h'); + c += 2; + mvwaddch(win_help, r, c, 'j'); + c += 2; + mvwaddch(win_help, r, c, 'k'); + c += 2; + mvwaddch(win_help, r, c, 'l'); + /* Arrows */ + r++; + c = 1; + mvwaddch(win_help, r, c, ACS_LARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_DARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_UARROW); + c += 2; + mvwaddch(win_help, r, c, ACS_RARROW); + + r++; + c = 0; + mvwaddstr(win_help, r++, c, "Cursor:"); + mvwprintw(win_help, r++, c, " %c", 'c'); + + mvwaddstr(win_help, r++, c, "Step:"); + mvwprintw(win_help, r++, c, " Enter / %c", '+'); + + mvwaddstr(win_help, r++, c, "Flag:"); + mvwprintw(win_help, r++, c, " Space"); + + mvwaddstr(win_help, r++, c, "Possible:"); + mvwprintw(win_help, r++, c, " %c", 'f'); + + mvwaddstr(win_help, r++, c, "rm flag:"); + mvwprintw(win_help, r++, c, " Backspace"); + + mvwaddstr(win_help, r++, c, "Save:"); + mvwprintw(win_help, r++, c, " %c", 's'); + + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); +} + +static void show_help_safe (void) +{ + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c, "Save:"); + mvwprintw(win_help, r++, c, " %c", 's'); + + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); +} + +static void show_help_gameover (void) +{ + int r; + int c; + + r = 0; + c = 0; + mvwaddstr(win_help, r++, c, "Quit:"); + mvwprintw(win_help, r++, c, " %c", 'q'); +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/save/inc/save.h b/modules/save/inc/save.h index ca1721b..d2dee37 100644 --- a/modules/save/inc/save.h +++ b/modules/save/inc/save.h @@ -1,63 +1,63 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_SAVE_H
- # define MSW_SAVE_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* bool */
- #include <stdbool.h>
- /* FILENAME_MAX */
- #include <stdio.h>
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # if defined (OS_LINUX)
- # define ENV_HOME "HOME"
- # elif defined (OS_WIN)
- # define ENV_HOME "USERPROFILE"
- # endif
-
- # define USER_GAME_DIR ".mine-sweeper/"
- # define USER_SAVED_DIR ".mine-sweeper/saved/"
- # define SAVED_NAME_DEFAULT "saved"
- # define FILE_EXTENSION ".mine"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern char home_path [FILENAME_MAX];
-extern char user_game_path [FILENAME_MAX];
-extern char saved_path [FILENAME_MAX];
-extern char saved_name [FILENAME_MAX];
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void save_init (void);
-void save_clr (void);
-void load_game_file (void);
-void save_game_file (char *filepath);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* save.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_SAVE_H + # define MSW_SAVE_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* bool */ + #include <stdbool.h> + /* FILENAME_MAX */ + #include <stdio.h> + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # if defined (OS_LINUX) + # define ENV_HOME "HOME" + # elif defined (OS_WIN) + # define ENV_HOME "USERPROFILE" + # endif + + # define USER_GAME_DIR ".mine-sweeper/" + # define USER_SAVED_DIR ".mine-sweeper/saved/" + # define SAVED_NAME_DEFAULT "saved" + # define FILE_EXTENSION ".mine" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern char home_path [FILENAME_MAX]; +extern char user_game_path [FILENAME_MAX]; +extern char saved_path [FILENAME_MAX]; +extern char saved_name [FILENAME_MAX]; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void save_init (void); +void save_clr (void); +void load_game_file (void); +void save_game_file (char *filepath); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* save.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/save/inc/score.h b/modules/save/inc/score.h index e81c6d1..fede1f7 100644 --- a/modules/save/inc/score.h +++ b/modules/save/inc/score.h @@ -1,70 +1,70 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_SCORE_H
- # define MSW_SCORE_H
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
- /* FILENAME_MAX */
- #include <stdio.h>
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # if defined (OS_LINUX)
- # define ENV_HOME "HOME"
- # elif defined (OS_WIN)
- # define ENV_HOME "USERPROFILE"
- # endif
-
- # define HISCORES_DIR "hiscores/"
- # define BOARDS_BEGINNER_DIR "hiscores/boards_beginner/"
- # define BOARDS_INTERMEDIATE_DIR "hiscores/boards_intermediate/"
- # define BOARDS_EXPERT_DIR "hiscores/boards_expert/"
- # define BOARDS_CUSTOM_DIR "hiscores/boards_custom/"
- # define HISCORES_BEGINNER_NAME "hiscores_beginner.mine"
- # define HISCORES_INTERMEDIATE_NAME "hiscores_intermediate.mine"
- # define HISCORES_EXPERT_NAME "hiscores_expert.mine"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-extern char var_path [FILENAME_MAX];
-extern char var_hiscores_path [FILENAME_MAX];
-extern char var_boards_beginner_path [FILENAME_MAX];
-extern char var_boards_intermediate_path [FILENAME_MAX];
-extern char var_boards_expert_path [FILENAME_MAX];
-extern char var_boards_custom_path [FILENAME_MAX];
-
-extern char var_hiscores_beginner_name [FILENAME_MAX];
-extern char var_hiscores_intermediate_name [FILENAME_MAX];
-extern char var_hiscores_expert_name [FILENAME_MAX];
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void score_init (void);
-void save_score (const struct Game_Iface_Score *game_iface_score);
-void snprint_scores (char *dest, int destsize);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* score.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_SCORE_H + # define MSW_SCORE_H + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ + /* FILENAME_MAX */ + #include <stdio.h> + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # if defined (OS_LINUX) + # define ENV_HOME "HOME" + # elif defined (OS_WIN) + # define ENV_HOME "USERPROFILE" + # endif + + # define HISCORES_DIR "hiscores/" + # define BOARDS_BEGINNER_DIR "hiscores/boards_beginner/" + # define BOARDS_INTERMEDIATE_DIR "hiscores/boards_intermediate/" + # define BOARDS_EXPERT_DIR "hiscores/boards_expert/" + # define BOARDS_CUSTOM_DIR "hiscores/boards_custom/" + # define HISCORES_BEGINNER_NAME "hiscores_beginner.mine" + # define HISCORES_INTERMEDIATE_NAME "hiscores_intermediate.mine" + # define HISCORES_EXPERT_NAME "hiscores_expert.mine" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +extern char var_path [FILENAME_MAX]; +extern char var_hiscores_path [FILENAME_MAX]; +extern char var_boards_beginner_path [FILENAME_MAX]; +extern char var_boards_intermediate_path [FILENAME_MAX]; +extern char var_boards_expert_path [FILENAME_MAX]; +extern char var_boards_custom_path [FILENAME_MAX]; + +extern char var_hiscores_beginner_name [FILENAME_MAX]; +extern char var_hiscores_intermediate_name [FILENAME_MAX]; +extern char var_hiscores_expert_name [FILENAME_MAX]; + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void score_init (void); +void save_score (const struct Game_Iface_Score *game_iface_score); +void snprint_scores (char *dest, int destsize); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* score.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/save/src/save.c b/modules/save/src/save.c index 27cfc81..a9a54e3 100644 --- a/modules/save/src/save.c +++ b/modules/save/src/save.c @@ -1,220 +1,266 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* errno */
- #include <errno.h>
- /* bool */
- #include <stdbool.h>
- /* fscanf() & fprintf() & FILE & FILENAME_MAX & snprintf() */
- #include <stdio.h>
- /* getenv() */
- #include <stdlib.h>
- /* mkdir */
-#if defined OS_LINUX
- #include <sys/stat.h>
-#elif defined OS_WIN
- #include <direct.h>
-#endif
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* struct Game_Board */
- #include "game.h"
- /* player_iface_save_name() */
- #include "player_iface.h"
-
- #include "save.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-char home_path [FILENAME_MAX];
-char user_game_path [FILENAME_MAX];
-char saved_path [FILENAME_MAX];
-char saved_name [FILENAME_MAX];
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void save_init (void)
-{
- snprintf(home_path, FILENAME_MAX, "%s/", getenv(ENV_HOME));
- snprintf(user_game_path, FILENAME_MAX, "%s/%s/", home_path, USER_GAME_DIR);
- snprintf(saved_path, FILENAME_MAX, "%s/%s/", home_path, USER_SAVED_DIR);
- sprintf(saved_name, "");
-
- int err;
-#if defined OS_LINUX
- err = mkdir(user_game_path, 0700);
-#elif defined OS_WIN
- err = mkdir(user_game_path);
-#endif
-
- if (!err) {
-#if defined OS_LINUX
- mkdir(saved_path, 0700);
-#elif defined OS_WIN
- mkdir(saved_path);
-#endif
- } else {
-
- switch (errno) {
- case EACCES:
- printf("err = EACCES");
- exit(EXIT_FAILURE);
- break;
-
- case EEXIST:
- /* OK */
- break;
-
- default:
- printf("WTF?!");
- exit(EXIT_FAILURE);
- }
- }
-}
-
-void save_clr (void)
-{
- snprintf(saved_path, FILENAME_MAX, "%s/%s/", home_path, USER_SAVED_DIR);
-}
-
-void load_game_file (void)
-{
- char file_name [FILENAME_MAX];
- FILE *fp;
-
- int i;
- int j;
-
- snprintf(file_name, FILENAME_MAX, "%s/%s", saved_path, saved_name);
-
- fp = fopen(file_name, "r");
- if (fp) {
- fscanf(fp, "mine-sweeper saved game");
- fscanf(fp, " rows %i", &game_board.rows);
- fscanf(fp, " cols %i", &game_board.cols);
- fscanf(fp, " mines %i", &game_board.mines);
- fscanf(fp, " gnd");
- for (i = 0; i < game_board.rows; i++) {
- fscanf(fp, " %i", &game_board.gnd[i][0]);
- for (j = 1; j < game_board.cols; j++) {
- fscanf(fp, ",%i", &game_board.gnd[i][j]);
- }
- }
- fscanf(fp, " usr");
- for (i = 0; i < game_board.rows; i++) {
- fscanf(fp, " %i", &game_board.usr[i][0]);
- for (j = 1; j < game_board.cols; j++) {
- fscanf(fp, ",%i", &game_board.usr[i][j]);
- }
- }
- fscanf(fp, " flags %i", &game_board.flags);
- fscanf(fp, " cleared %i", &game_board.clr);
-
- fclose(fp);
- }
-}
-
-void save_game_file (char *filepath)
-{
- char file_name [FILENAME_MAX];
- char tmp [FILENAME_MAX];
- char old_saved [FILENAME_MAX];
- char file_num [6];
- FILE *fp;
- int i;
- int j;
-
- /* Don't change saved_name variable if not in default dir */
- if (filepath != NULL) {
- snprintf(old_saved, FILENAME_MAX, "%s", saved_name);
- }
-
- /* Default path & name */
- save_clr();
- snprintf(saved_name, FILENAME_MAX, "%s", SAVED_NAME_DEFAULT);
- sprintf(file_num, "");
-
- /* Request file name */
- player_iface_save_name(filepath, saved_name, FILENAME_MAX);
-
- /* Look for an unused name of the type 'name_XXX.mine'. */
- bool x;
- x = true;
- for (i = 0; x; i++) {
- if (filepath == NULL) {
- snprintf(file_name, FILENAME_MAX, "%s/%s%s%s",
- saved_path, saved_name, file_num, FILE_EXTENSION);
- } else {
- snprintf(file_name, FILENAME_MAX, "%s/%s%s%s",
- filepath, saved_name, file_num, FILE_EXTENSION);
- }
-
- fp = fopen(file_name, "r");
- if (fp) {
- fclose(fp);
- file_num[0] = '_';
- file_num[1] = '0' + ((i / 100) % 10);
- file_num[2] = '0' + ((i / 10) % 10);
- file_num[3] = '0' + (i % 10);
- file_num[4] = '\0';
- } else {
- x = false;
- snprintf(tmp, FILENAME_MAX, "%s%s%s",
- saved_name, file_num, FILE_EXTENSION);
- snprintf(saved_name, FILENAME_MAX, "%s", tmp);
- }
- }
-
- /* Write to a new file */
- fp = fopen(file_name, "w");
- if (fp) {
- fprintf(fp, "mine-sweeper saved game\n");
- fprintf(fp, "rows %i\n", game_board.rows);
- fprintf(fp, "cols %i\n", game_board.cols);
- fprintf(fp, "mines %i\n", game_board.mines);
- fprintf(fp, "gnd\n");
- for (i = 0; i < game_board.rows; i++) {
- fprintf(fp, "%i", game_board.gnd[i][0]);
- for (j = 1; j < game_board.cols; j++) {
- fprintf(fp, ",%i", game_board.gnd[i][j]);
- }
- fprintf(fp, "\n");
- }
- fprintf(fp, "usr\n");
- for (i = 0; i < game_board.rows; i++) {
- fprintf(fp, "%i", game_board.usr[i][0]);
- for (j = 1; j < game_board.cols; j++) {
- fprintf(fp, ",%i", game_board.usr[i][j]);
- }
- fprintf(fp, "\n");
- }
- fprintf(fp, "flags %i\n", game_board.flags);
- fprintf(fp, "cleared %i\n", game_board.clr);
-
- fclose(fp);
- }
-
- /* Don't change saved_name if saving in non-default dir */
- if (filepath != NULL) {
- snprintf(saved_name, FILENAME_MAX, "%s", old_saved);
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + * SPDX-License-Identifier: GPL-2.0-only * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + /* errno */ + #include <errno.h> + /* bool */ + #include <stdbool.h> + /* fscanf() & fprintf() & FILE & FILENAME_MAX & snprintf() */ + #include <stdio.h> + /* getenv() & exit() */ + #include <stdlib.h> + +/* Linux ---------------------------------------------------------------------*/ + /* mkdir */ + #include <sys/stat.h> + +/* Project -------------------------------------------------------------------*/ + /* struct Game_Board */ + #include "game.h" + /* player_iface_save_name() */ + #include "player_iface.h" + +/* Module --------------------------------------------------------------------*/ + #include "save.h" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ + char home_path [FILENAME_MAX]; + char user_game_path [FILENAME_MAX]; + char saved_path [FILENAME_MAX]; + char saved_name [FILENAME_MAX]; + + +/****************************************************************************** + ******* global functions ***************************************************** + ******************************************************************************/ +void save_init (void) +{ + if (snprintf(home_path, FILENAME_MAX, "%s/", + getenv(ENV_HOME)) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(user_game_path, FILENAME_MAX, "%s/%s/", + home_path, USER_GAME_DIR) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(saved_path, FILENAME_MAX, "%s/%s/", + home_path, USER_SAVED_DIR) >= FILENAME_MAX) { + goto err_path; + } + saved_name[0] = '\0'; + + int err; + err = mkdir(user_game_path, 0700); + + if (!err) { + mkdir(saved_path, 0700); + } else { + + switch (errno) { + case EACCES: + printf("err = EACCES"); + exit(EXIT_FAILURE); + break; + + case EEXIST: + /* OK */ + break; + + default: + printf("WTF?!"); + exit(EXIT_FAILURE); + } + } + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + getchar(); + exit(EXIT_FAILURE); +} + +void save_clr (void) +{ + if (snprintf(saved_path, FILENAME_MAX, "%s/%s/", + home_path, USER_SAVED_DIR) >= FILENAME_MAX) { + goto err_path; + } + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + getchar(); + exit(EXIT_FAILURE); +} + +void load_game_file (void) +{ + char file_name [FILENAME_MAX]; + FILE *fp; + + int i; + int j; + + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + saved_path, saved_name) >= FILENAME_MAX) { + goto err_path; + } + + fp = fopen(file_name, "r"); + if (fp) { + fscanf(fp, "mine-sweeper saved game"); + fscanf(fp, " rows %i", &game_board.rows); + fscanf(fp, " cols %i", &game_board.cols); + fscanf(fp, " mines %i", &game_board.mines); + fscanf(fp, " gnd"); + for (i = 0; i < game_board.rows; i++) { + fscanf(fp, " %i", &game_board.gnd[i][0]); + for (j = 1; j < game_board.cols; j++) { + fscanf(fp, ",%i", &game_board.gnd[i][j]); + } + } + fscanf(fp, " usr"); + for (i = 0; i < game_board.rows; i++) { + fscanf(fp, " %i", &game_board.usr[i][0]); + for (j = 1; j < game_board.cols; j++) { + fscanf(fp, ",%i", &game_board.usr[i][j]); + } + } + fscanf(fp, " flags %i", &game_board.flags); + fscanf(fp, " cleared %i", &game_board.clr); + + fclose(fp); + } + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + getchar(); + exit(EXIT_FAILURE); +} + +void save_game_file (char *filepath) +{ + char file_name [FILENAME_MAX]; + char tmp [FILENAME_MAX]; + char old_saved [FILENAME_MAX]; + char file_num [6]; + FILE *fp; + int i; + int j; + + /* Don't change saved_name variable if not in default dir */ + if (filepath != NULL) { + snprintf(old_saved, FILENAME_MAX, "%s", saved_name); + } + + /* Default path & name */ + save_clr(); + snprintf(saved_name, FILENAME_MAX, "%s", SAVED_NAME_DEFAULT); + file_num[0] = '\0'; + + /* Request file name */ + player_iface_save_name(filepath, saved_name, FILENAME_MAX); + + /* Look for an unused name of the type 'name_XXX.mine'. */ + bool x; + x = true; + for (i = 0; x; i++) { + if (filepath == NULL) { + if (snprintf(file_name, FILENAME_MAX, "%s/%s%s%s", + saved_path, + saved_name, file_num, + FILE_EXTENSION) >= FILENAME_MAX) { + goto err_path; + } + } else { + if (snprintf(file_name, FILENAME_MAX, "%s/%s%s%s", + filepath, + saved_name, file_num, + FILE_EXTENSION) >= FILENAME_MAX) { + goto err_path; + } + } + + fp = fopen(file_name, "r"); + if (fp) { + fclose(fp); + file_num[0] = '_'; + file_num[1] = '0' + ((i / 100) % 10); + file_num[2] = '0' + ((i / 10) % 10); + file_num[3] = '0' + (i % 10); + file_num[4] = '\0'; + } else { + x = false; + if (snprintf(tmp, FILENAME_MAX, "%s%s%s", + saved_name, file_num, + FILE_EXTENSION) >= FILENAME_MAX) { + goto err_path; + } + snprintf(saved_name, FILENAME_MAX, "%s", tmp); + } + } + + /* Write to a new file */ + fp = fopen(file_name, "w"); + if (fp) { + fprintf(fp, "mine-sweeper saved game\n"); + fprintf(fp, "rows %i\n", game_board.rows); + fprintf(fp, "cols %i\n", game_board.cols); + fprintf(fp, "mines %i\n", game_board.mines); + fprintf(fp, "gnd\n"); + for (i = 0; i < game_board.rows; i++) { + fprintf(fp, "%i", game_board.gnd[i][0]); + for (j = 1; j < game_board.cols; j++) { + fprintf(fp, ",%i", game_board.gnd[i][j]); + } + fprintf(fp, "\n"); + } + fprintf(fp, "usr\n"); + for (i = 0; i < game_board.rows; i++) { + fprintf(fp, "%i", game_board.usr[i][0]); + for (j = 1; j < game_board.cols; j++) { + fprintf(fp, ",%i", game_board.usr[i][j]); + } + fprintf(fp, "\n"); + } + fprintf(fp, "flags %i\n", game_board.flags); + fprintf(fp, "cleared %i\n", game_board.clr); + + fclose(fp); + } + + /* Don't change saved_name if saving in non-default dir */ + if (filepath != NULL) { + snprintf(saved_name, FILENAME_MAX, "%s", old_saved); + } + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + getchar(); + exit(EXIT_FAILURE); +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/save/src/score.c b/modules/save/src/score.c index 8aa837e..2a8d274 100644 --- a/modules/save/src/score.c +++ b/modules/save/src/score.c @@ -1,264 +1,318 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- /* fscanf() & fprintf() & FILE & FILENAME_MAX & snprintf() */
- #include <stdio.h>
- /* exit() */
- #include <stdlib.h>
- /* time_t & time() & struct tm & localtime() */
- #include <time.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* struct Game_Board */
- #include "game.h"
- /* enum Game_Iface_Level */
- #include "game_iface.h"
- /* player_iface_score_name() */
- #include "player_iface.h"
- /* saved_name */
- #include "save.h"
-
- #include "score.h"
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define BUFF_SIZE (1024)
- # define BUFF_SIZE_TEXT (1048576)
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-char var_path [FILENAME_MAX];
-char var_hiscores_path [FILENAME_MAX];
-char var_boards_beginner_path [FILENAME_MAX];
-char var_boards_intermediate_path [FILENAME_MAX];
-char var_boards_expert_path [FILENAME_MAX];
-char var_boards_custom_path [FILENAME_MAX];
-
-char var_hiscores_beginner_name [FILENAME_MAX];
-char var_hiscores_intermediate_name [FILENAME_MAX];
-char var_hiscores_expert_name [FILENAME_MAX];
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void snprint_scores_file (char *dest, int destsize, char *file_name);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void score_init (void)
-{
- snprintf(var_path, FILENAME_MAX, "%s/%s/",
- INSTALL_VAR_DIR, VAR_DIR);
- snprintf(var_hiscores_path, FILENAME_MAX, "%s/%s/",
- var_path, HISCORES_DIR);
- snprintf(var_boards_beginner_path, FILENAME_MAX, "%s/%s/",
- var_path, BOARDS_BEGINNER_DIR);
- snprintf(var_boards_intermediate_path, FILENAME_MAX, "%s/%s/",
- var_path, BOARDS_INTERMEDIATE_DIR);
- snprintf(var_boards_expert_path, FILENAME_MAX, "%s/%s/",
- var_path, BOARDS_EXPERT_DIR);
- snprintf(var_boards_custom_path, FILENAME_MAX, "%s/%s/",
- var_path, BOARDS_CUSTOM_DIR);
- snprintf(var_hiscores_beginner_name, FILENAME_MAX, "%s",
- HISCORES_BEGINNER_NAME);
- snprintf(var_hiscores_intermediate_name, FILENAME_MAX, "%s",
- HISCORES_INTERMEDIATE_NAME);
- snprintf(var_hiscores_expert_name, FILENAME_MAX, "%s",
- HISCORES_EXPERT_NAME);
-}
-
-void save_score (const struct Game_Iface_Score *game_iface_score)
-{
- /* File name */
- char file_name [FILENAME_MAX];
- switch (game_iface_score->level) {
- case GAME_IFACE_LEVEL_BEGINNER:
- snprintf(file_name, FILENAME_MAX, "%s/%s",
- var_hiscores_path, var_hiscores_beginner_name);
- break;
-
- case GAME_IFACE_LEVEL_INTERMEDIATE:
- snprintf(file_name, FILENAME_MAX, "%s/%s",
- var_hiscores_path, var_hiscores_intermediate_name);
- break;
-
- case GAME_IFACE_LEVEL_EXPERT:
- snprintf(file_name, FILENAME_MAX, "%s/%s",
- var_hiscores_path, var_hiscores_expert_name);
- break;
- }
-
- /* Date & time */
- time_t date_secs;
- struct tm *date_format;
- date_secs = time(NULL);
- date_format = localtime(&date_secs);
-
- /* Player name (foo is default) */
- char player_name [BUFF_SIZE];
- player_iface_score_name(player_name, BUFF_SIZE);
-
- /* Write to file (append) */
- FILE *fp;
- fp = fopen(file_name, "a");
- if (fp) {
- fprintf(fp, "\n");
- fprintf(fp, "name %s\n", player_name);
- fprintf(fp, "date %i\n", (int)date_secs);
- fprintf(fp, "{\n");
- fprintf(fp, " isdst %i\n", date_format->tm_isdst);
- fprintf(fp, " yday %i\n", date_format->tm_yday);
- fprintf(fp, " wday %i\n", date_format->tm_wday);
- fprintf(fp, " year %i\n", date_format->tm_year);
- fprintf(fp, " mon %i\n", date_format->tm_mon);
- fprintf(fp, " mday %i\n", date_format->tm_mday);
- fprintf(fp, " hour %i\n", date_format->tm_hour);
- fprintf(fp, " min %i\n", date_format->tm_min);
- fprintf(fp, " sec %i\n", date_format->tm_sec);
- fprintf(fp, "}\n");
- fprintf(fp, "time %i\n", game_iface_score->time);
- fprintf(fp, "clicks %i\n", game_iface_score->clicks);
- fprintf(fp, "file %s\n", saved_name);
-
- fclose(fp);
- } else {
- exit(EXIT_FAILURE);
- }
-}
-
-void snprint_scores (char *dest, int destsize)
-{
- /* File */
- char file_name [FILENAME_MAX];
-
- /* Tmp strings */
- char tmp1 [BUFF_SIZE_TEXT];
- char tmp2 [BUFF_SIZE_TEXT];
-
- /* Beginner */
- snprintf(file_name, FILENAME_MAX, "%s/%s",
- var_hiscores_path, var_hiscores_beginner_name);
- snprint_scores_file(dest, destsize, file_name);
-
- /* Intermediate */
- snprintf(file_name, FILENAME_MAX, "%s/%s",
- var_hiscores_path, var_hiscores_intermediate_name);
- snprint_scores_file(tmp1, destsize, file_name);
- snprintf(tmp2, destsize, "%s%s", dest, tmp1);
- snprintf(dest, destsize, "%s", tmp2);
-
- /* Expert */
- snprintf(file_name, FILENAME_MAX, "%s/%s",
- var_hiscores_path, var_hiscores_expert_name);
- snprint_scores_file(tmp1, destsize, file_name);
- snprintf(tmp2, destsize, "%s%s", dest, tmp1);
- snprintf(dest, destsize, "%s", tmp2);
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-static void snprint_scores_file (char *dest, int destsize, char *file_name)
-{
- /* File */
- FILE *fp;
- int c;
-
- /* Tmp string */
- char tmp [BUFF_SIZE_TEXT];
-
- /* Score variables */
- char title [BUFF_SIZE];
- char name [BUFF_SIZE];
- int year;
- int mon;
- int day;
- int time;
- int hours;
- int mins;
- int secs;
- int clicks;
- char file [FILENAME_MAX];
-
- fp = fopen(file_name, "r");
-
- if (fp) {
- /* Title */
- fscanf(fp, "%[^\n]s", title);
- /* For some reason, a space after "%[^\n]s" doesn't skip spaces */
- fscanf(fp, " ");
-
- /* Print */
- snprintf(dest, destsize,
- "_______________________________________________________\n"
- "%s\n\n"
- "name date clicks time file\n\n",
- title);
-
- while ((c = getc(fp)) != EOF){
- ungetc(c, fp);
-
- /* Read */
- fscanf(fp, "name %s ", name);
- fscanf(fp, "date %*i ");
- fscanf(fp, "{ ");
- fscanf(fp, " isdst %*i ");
- fscanf(fp, " yday %*i ");
- fscanf(fp, " wday %*i ");
- fscanf(fp, " year %i ", &year);
- fscanf(fp, " mon %i ", &mon);
- fscanf(fp, " mday %i ", &day);
- fscanf(fp, " hour %*i ");
- fscanf(fp, " min %*i ");
- fscanf(fp, " sec %*i ");
- fscanf(fp, "} ");
- fscanf(fp, "time %i ", &time);
- fscanf(fp, "clicks %i ", &clicks);
- fscanf(fp, "file %s ", file);
-
- /* Adjust date & time */
- year += 1900;
- hours = (time / 3600);
- mins = ((time % 3600) / 60);
- secs = (time % 60);
-
- /* Print */
- snprintf(tmp, BUFF_SIZE_TEXT,
- "%s"
- "%s\n"
- " %4i/%2i/%2i %i %i:%02i:%02i \t%s\n\n",
- dest,
- name,
- year, 1 + mon, day,
- clicks,
- hours, mins, secs,
- file);
- snprintf(dest, BUFF_SIZE_TEXT, "%s", tmp);
- }
-
- fclose(fp);
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + * SPDX-License-Identifier: GPL-2.0-only * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + #include <errno.h> + /* fscanf() & fprintf() & FILE & FILENAME_MAX & snprintf() */ + #include <stdio.h> + /* exit() */ + #include <stdlib.h> + /* time_t & time() & struct tm & localtime() */ + #include <time.h> + +/* Project -------------------------------------------------------------------*/ + /* struct Game_Board */ + #include "game.h" + /* enum Game_Iface_Level */ + #include "game_iface.h" + /* player_iface_score_name() */ + #include "player_iface.h" + +/* Module --------------------------------------------------------------------*/ + /* saved_name */ + #include "save.h" + + #include "score.h" + + +/****************************************************************************** + ******* macros *************************************************************** + ******************************************************************************/ + # define BUFF_SIZE (1024) + # define BUFF_SIZE_TEXT (1048576) + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ + char var_path [FILENAME_MAX]; + char var_hiscores_path [FILENAME_MAX]; + char var_boards_beginner_path [FILENAME_MAX]; + char var_boards_intermediate_path [FILENAME_MAX]; + char var_boards_expert_path [FILENAME_MAX]; + char var_boards_custom_path [FILENAME_MAX]; + + char var_hiscores_beginner_name [FILENAME_MAX]; + char var_hiscores_intermediate_name [FILENAME_MAX]; + char var_hiscores_expert_name [FILENAME_MAX]; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void snprint_scores_file (char *dest, int destsize, char *file_name); + + +/****************************************************************************** + ******* global functions ***************************************************** + ******************************************************************************/ +void score_init (void) +{ + + if (snprintf(var_path, FILENAME_MAX, "%s/%s/", + INSTALL_VAR_DIR, VAR_DIR) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(var_hiscores_path, FILENAME_MAX, "%s/%s/", + var_path, HISCORES_DIR) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(var_boards_beginner_path, FILENAME_MAX, "%s/%s/", + var_path, BOARDS_BEGINNER_DIR) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(var_boards_intermediate_path, FILENAME_MAX, "%s/%s/", + var_path, BOARDS_INTERMEDIATE_DIR) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(var_boards_expert_path, FILENAME_MAX, "%s/%s/", + var_path, BOARDS_EXPERT_DIR) >= FILENAME_MAX) { + goto err_path; + } + if (snprintf(var_boards_custom_path, FILENAME_MAX, "%s/%s/", + var_path, BOARDS_CUSTOM_DIR) >= FILENAME_MAX) { + goto err_path; + } + snprintf(var_hiscores_beginner_name, FILENAME_MAX, "%s", + HISCORES_BEGINNER_NAME); + snprintf(var_hiscores_intermediate_name, FILENAME_MAX, "%s", + HISCORES_INTERMEDIATE_NAME); + snprintf(var_hiscores_expert_name, FILENAME_MAX, "%s", + HISCORES_EXPERT_NAME); + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + getchar(); + exit(EXIT_FAILURE); +} + +void save_score (const struct Game_Iface_Score *game_iface_score) +{ + struct tm *date_format; + char file_name [FILENAME_MAX]; + char player_name [BUFF_SIZE]; + FILE *fp; + + /* File name */ + switch (game_iface_score->level) { + case GAME_IFACE_LEVEL_BEGINNER: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + var_hiscores_path, + var_hiscores_beginner_name) >= + FILENAME_MAX) { + goto err_path; + } + break; + + case GAME_IFACE_LEVEL_INTERMEDIATE: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + var_hiscores_path, + var_hiscores_intermediate_name) >= + FILENAME_MAX) { + goto err_path; + } + break; + + case GAME_IFACE_LEVEL_EXPERT: + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + var_hiscores_path, + var_hiscores_expert_name) >= + FILENAME_MAX) { + goto err_path; + } + break; + } + + /* Date & time */ + time_t date_secs; + date_secs = time(NULL); + date_format = localtime(&date_secs); + + /* Player name (foo is default) */ + player_iface_score_name(player_name, BUFF_SIZE); + + /* Write to file (append) */ + errno = 0; + fp = fopen(file_name, "a"); + if (fp) { + fprintf(fp, "\n"); + fprintf(fp, "name %s\n", player_name); + fprintf(fp, "date %i\n", (int)date_secs); + fprintf(fp, "{\n"); + fprintf(fp, " isdst %i\n", date_format->tm_isdst); + fprintf(fp, " yday %i\n", date_format->tm_yday); + fprintf(fp, " wday %i\n", date_format->tm_wday); + fprintf(fp, " year %i\n", date_format->tm_year); + fprintf(fp, " mon %i\n", date_format->tm_mon); + fprintf(fp, " mday %i\n", date_format->tm_mday); + fprintf(fp, " hour %i\n", date_format->tm_hour); + fprintf(fp, " min %i\n", date_format->tm_min); + fprintf(fp, " sec %i\n", date_format->tm_sec); + fprintf(fp, "}\n"); + fprintf(fp, "time %i\n", game_iface_score->time); + fprintf(fp, "clicks %i\n", game_iface_score->clicks); + fprintf(fp, "file %s\n", saved_name); + + fclose(fp); + } else { + printf("errno: %i", errno); + exit(EXIT_FAILURE); + } + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + printf("Score could not be saved!\n"); +} + +void snprint_scores (char *dest, int destsize) +{ + char file_name [FILENAME_MAX]; + char tmp1 [BUFF_SIZE_TEXT]; + char tmp2 [BUFF_SIZE_TEXT]; + + /* Beginner */ + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + var_hiscores_path, + var_hiscores_beginner_name) >= + FILENAME_MAX) { + goto err_path; + } + (void)snprint_scores_file(dest, destsize, file_name); + + /* Intermediate */ + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + var_hiscores_path, + var_hiscores_intermediate_name) >= + FILENAME_MAX) { + goto err_path; + } + (void)snprint_scores_file(tmp1, destsize, file_name); + (void)snprintf(tmp2, destsize, "%s%s", dest, tmp1); + (void)snprintf(dest, destsize, "%s", tmp2); + + /* Expert */ + if (snprintf(file_name, FILENAME_MAX, "%s/%s", + var_hiscores_path, + var_hiscores_expert_name) >= + FILENAME_MAX) { + goto err_path; + } + (void)snprint_scores_file(tmp1, destsize, file_name); + (void)snprintf(tmp2, destsize, "%s%s", dest, tmp1); + (void)snprintf(dest, destsize, "%s", tmp2); + + return; + + +err_path: + printf("Path is too large and has been truncated\n"); + printf("Score could not be shown!\n"); +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void snprint_scores_file (char *dest, int destsize, char *file_name) +{ + FILE *fp; + int c; + char tmp [BUFF_SIZE_TEXT]; + char title [BUFF_SIZE]; + char name [BUFF_SIZE]; + int year; + int mon; + int day; + int time; + int hours; + int mins; + int secs; + int clicks; + char file [FILENAME_MAX]; + + fp = fopen(file_name, "r"); + + if (fp) { + /* Title */ + fscanf(fp, "%[^\n]s", title); + /* For some reason, a space after "%[^\n]s" doesn't skip spaces */ + fscanf(fp, " "); + + /* Print */ + (void)snprintf(dest, destsize, + "_______________________________________________________\n" + "%s\n\n" + "name date clicks time file\n\n", + title); + + while ((c = getc(fp)) != EOF){ + ungetc(c, fp); + + /* Read */ + fscanf(fp, "name %s ", name); + fscanf(fp, "date %*i "); + fscanf(fp, "{ "); + fscanf(fp, " isdst %*i "); + fscanf(fp, " yday %*i "); + fscanf(fp, " wday %*i "); + fscanf(fp, " year %i ", &year); + fscanf(fp, " mon %i ", &mon); + fscanf(fp, " mday %i ", &day); + fscanf(fp, " hour %*i "); + fscanf(fp, " min %*i "); + fscanf(fp, " sec %*i "); + fscanf(fp, "} "); + fscanf(fp, "time %i ", &time); + fscanf(fp, "clicks %i ", &clicks); + fscanf(fp, "file %s ", file); + + /* Adjust date & time */ + year += 1900; + hours = (time / 3600); + mins = ((time % 3600) / 60); + secs = (time % 60); + + /* Print */ + (void)snprintf(tmp, BUFF_SIZE_TEXT, + "%s" + "%s\n" + " %4i/%2i/%2i %i %i:%02i:%02i \t%s\n\n", + dest, + name, + year, 1 + mon, day, + clicks, + hours, mins, secs, + file); + (void)snprintf(dest, BUFF_SIZE_TEXT, "%s", tmp); + } + + fclose(fp); + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/xyzzy/inc/xyzzy.h b/modules/xyzzy/inc/xyzzy.h index f7107c5..e81d5e9 100644 --- a/modules/xyzzy/inc/xyzzy.h +++ b/modules/xyzzy/inc/xyzzy.h @@ -1,31 +1,31 @@ -/******************************************************************************
- * Copyright (C) 2018 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# ifndef MSW_XYZZY_H
- # define MSW_XYZZY_H
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void xyzzy_init (void);
-int xyzzy_lin (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in);
-int xyzzy_p (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in);
-
-
-/******************************************************************************
- ******* include guard ********************************************************
- ******************************************************************************/
-# endif /* xyzzy.h */
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2018 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# ifndef MSW_XYZZY_H + # define MSW_XYZZY_H + + +/****************************************************************************** + ******* functions ************************************************************ + ******************************************************************************/ +void xyzzy_init (void); +int xyzzy_lin (const struct Game_Iface_Out *out, + struct Game_Iface_In *in); +int xyzzy_p (const struct Game_Iface_Out *out, + struct Game_Iface_In *in); + + +/****************************************************************************** + ******* include guard ******************************************************** + ******************************************************************************/ +# endif /* xyzzy.h */ + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/xyzzy/src/xyzzy.c b/modules/xyzzy/src/xyzzy.c index 90865ed..7bd05cf 100644 --- a/modules/xyzzy/src/xyzzy.c +++ b/modules/xyzzy/src/xyzzy.c @@ -1,119 +1,115 @@ -/******************************************************************************
- * Copyright (C) 2018 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <stdbool.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- /* game_action() */
- #include "game_iface.h"
-
- #include "xyzzy.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-static int x;
-static bool step_notflag;
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-void xyzzy_step_all (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in);
-void xyzzy_flag_all (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-void xyzzy_init (void)
-{
- x = 0;
- step_notflag = true;
-}
-
-int xyzzy_lin (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in)
-{
- if (!x) {
- x = 1;
- }
-
- if (step_notflag) {
- xyzzy_step_all(game_iface_out, game_iface_in);
- } else {
- xyzzy_flag_all(game_iface_out, game_iface_in);
- x--;
- }
-
- step_notflag = !step_notflag;
-
- return x;
-}
-
-int xyzzy_p (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in)
-{
- int fields;
- fields = game_iface_out->rows * game_iface_out->cols;
-
- if (!x) {
- x = fields / 2;
- }
-
- xyzzy_lin(game_iface_out, game_iface_in);
-
- return x;
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-void xyzzy_step_all (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in)
-{
- int i;
- int j;
-
- for (i = 0; i < game_iface_out->rows; i++) {
- for (j = 0; j < game_iface_out->cols; j++) {
- if (game_iface_out->usr[i][j] == GAME_IFACE_USR_CLEAR) {
- game_iface_in->act_game[i][j] = GAME_IFACE_GAME_ACT_STEP;
- }
- }
- }
-}
-
-void xyzzy_flag_all (const struct Game_Iface_Out *game_iface_out,
- struct Game_Iface_In *game_iface_in)
-{
- int i;
- int j;
-
- for (i = 0; i < game_iface_out->rows; i++) {
- for (j = 0; j < game_iface_out->cols; j++) {
- if (game_iface_out->usr[i][j] == GAME_IFACE_USR_CLEAR) {
- game_iface_in->act_game[i][j] = GAME_IFACE_GAME_ACT_FLAG;
- }
- }
- }
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2018 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* Standard C ----------------------------------------------------------------*/ + #include <stdbool.h> + +/* Project -------------------------------------------------------------------*/ + /* game_action() */ + #include "game_iface.h" + + #include "xyzzy.h" + + +/****************************************************************************** + ******* variables ************************************************************ + ******************************************************************************/ +static int x; +static bool step_notflag; + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void xyzzy_step_all (const struct Game_Iface_Out *out, + struct Game_Iface_In *in); +static void xyzzy_flag_all (const struct Game_Iface_Out *out, + struct Game_Iface_In *in); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +void xyzzy_init (void) +{ + + x = 0; + step_notflag = true; +} + +int xyzzy_lin (const struct Game_Iface_Out *out, + struct Game_Iface_In *in) +{ + + if (!x) { + x = 1; + } + + if (step_notflag) { + xyzzy_step_all(out, in); + } else { + xyzzy_flag_all(out, in); + x--; + } + + step_notflag = !step_notflag; + + return x; +} + +int xyzzy_p (const struct Game_Iface_Out *out, + struct Game_Iface_In *in) +{ + + if (!x) { + x = (out->rows * out->cols) / 2; + } + + xyzzy_lin(out, in); + + return x; +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +static void xyzzy_step_all (const struct Game_Iface_Out *out, + struct Game_Iface_In *in) +{ + int i; + int j; + + for (i = 0; i < out->rows; i++) { + for (j = 0; j < out->cols; j++) { + if (out->usr[i][j] == GAME_IFACE_USR_CLEAR) { + in->act_game[i][j] = GAME_IFACE_GAME_ACT_STEP; + } + } + } +} + +static void xyzzy_flag_all (const struct Game_Iface_Out *out, + struct Game_Iface_In *in) +{ + int i; + int j; + + for (i = 0; i < out->rows; i++) { + for (j = 0; j < out->cols; j++) { + if (out->usr[i][j] == GAME_IFACE_USR_CLEAR) { + in->act_game[i][j] = GAME_IFACE_GAME_ACT_FLAG; + } + } + } +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ diff --git a/modules/xyzzy/tmp/Makefile b/modules/xyzzy/tmp/Makefile index afe43ba..dc82625 100644 --- a/modules/xyzzy/tmp/Makefile +++ b/modules/xyzzy/tmp/Makefile @@ -31,7 +31,7 @@ all: $(ALL) xyzzy_mod.o: $(_ALL) @echo " LD $@" $(Q)$(LD) -r $^ -o $@ - + xyzzy.s: $(XYZZY_DEPS) @echo " CC $@" @@ -1,105 +1,105 @@ -/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
-/******************************************************************************
- ******* headers **************************************************************
- ******************************************************************************/
-/* * * * * * * * * *
- * * * Standard * * * * * *
- * * * * * * * * * */
- #include <gtk/gtk.h>
- /* getchar() */
- #include <stdio.h>
-
-/* * * * * * * * * *
- * * * Other * * * * * * *
- * * * * * * * * * */
- #include "alx_ncur.h"
-
- /* about_init() & print_cpright() */
- #include "about.h"
- #include "game.h"
- #include "menu_iface.h"
- #include "player_iface.h"
- #include "parser.h"
- #include "save.h"
- #include "score.h"
- #include "start.h"
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-void init_all (int *argc, char *(*argv[]));
-void cleanup (void);
-
-
-/******************************************************************************
- ******* main *****************************************************************
- ******************************************************************************/
-int main (int argc, char *argv[])
-{
- init_all(&argc, &argv);
-
- /* Print copyright () and wait for any key to continue */
- print_share_file(SHARE_COPYRIGHT);
- getchar();
-
- /* Start () */
- start_switch();
-
- /* Menu () */
- menu_iface();
-
- cleanup();
-
- return 0;
-}
-
-
-/******************************************************************************
- ******* static functions *****************************************************
- ******************************************************************************/
-void init_all (int *argc, char *(*argv[]))
-{
- /* Init gtk & curses */
- gtk_init_check(argc, argv);
- alx_start_curses();
- alx_pause_curses();
-
- /* Init modules */
- menu_iface_init();
- game_init();
- about_init();
- save_init();
- score_init();
-
- /* Modes */
- start_mode = START_FOO;
- flag_exit = false;
- menu_iface_mode = MENU_IFACE_TUI;
- player_iface_mode = PLAYER_IFACE_TUI;
-
- /* Parse command line options */
- parser(*argc, *argv);
-
- /* Init iface */
- menu_iface_init_iface();
-}
-
-void cleanup (void)
-{
- /* Clean iface */
- menu_iface_cleanup();
-
- /* End curses */
- alx_resume_curses();
- alx_end_curses();
-}
-
-
-/******************************************************************************
- ******* end of file **********************************************************
- ******************************************************************************/
+/****************************************************************************** + * Copyright (C) 2015 Alejandro Colomar Andrés * + ******************************************************************************/ + + +/****************************************************************************** + ******* headers ************************************************************** + ******************************************************************************/ +/* * * * * * * * * * + * * * Standard * * * * * * + * * * * * * * * * */ + #include <gtk/gtk.h> + /* getchar() */ + #include <stdio.h> + +/* * * * * * * * * * + * * * Other * * * * * * * + * * * * * * * * * */ + #include "alx_ncur.h" + + /* about_init() & print_cpright() */ + #include "about.h" + #include "game.h" + #include "menu_iface.h" + #include "player_iface.h" + #include "parser.h" + #include "save.h" + #include "score.h" + #include "start.h" + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +void init_all (int *argc, char *(*argv[])); +void cleanup (void); + + +/****************************************************************************** + ******* main ***************************************************************** + ******************************************************************************/ +int main (int argc, char *argv[]) +{ + init_all(&argc, &argv); + + /* Print copyright () and wait for any key to continue */ + print_share_file(SHARE_COPYRIGHT); + getchar(); + + /* Start () */ + start_switch(); + + /* Menu () */ + menu_iface(); + + cleanup(); + + return 0; +} + + +/****************************************************************************** + ******* static functions ***************************************************** + ******************************************************************************/ +void init_all (int *argc, char *(*argv[])) +{ + /* Init gtk & curses */ + gtk_init_check(argc, argv); + alx_start_curses(); + alx_pause_curses(); + + /* Init modules */ + menu_iface_init(); + game_init(); + about_init(); + save_init(); + score_init(); + + /* Modes */ + start_mode = START_FOO; + flag_exit = false; + menu_iface_mode = MENU_IFACE_TUI; + player_iface_mode = PLAYER_IFACE_TUI; + + /* Parse command line options */ + parser(*argc, *argv); + + /* Init iface */ + menu_iface_init_iface(); +} + +void cleanup (void) +{ + /* Clean iface */ + menu_iface_cleanup(); + + /* End curses */ + alx_resume_curses(); + alx_end_curses(); +} + + +/****************************************************************************** + ******* end of file ********************************************************** + ******************************************************************************/ |