summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandroColomar <colomar.6.4.3@gmail.com>2019-01-07 03:01:16 +0100
committerAlejandroColomar <colomar.6.4.3@gmail.com>2019-01-07 03:01:16 +0100
commit629b6ea7a8fd3dce3695f590b19a9475211ac6d6 (patch)
treee4516e28d3d66e2518d7ab1153292c0730214b12
parent7dad09c99bd85fc9302477daceb0ae2aff15964b (diff)
Fix style; Unix new lines;
-rw-r--r--Makefile151
-rw-r--r--modules/about/inc/about.h124
-rw-r--r--modules/about/src/about.c206
-rw-r--r--modules/ctrl/inc/start.h86
-rw-r--r--modules/ctrl/src/start.c266
-rw-r--r--modules/game/inc/game.h200
-rw-r--r--modules/game/inc/game_iface.h306
-rw-r--r--modules/game/src/game.c798
-rw-r--r--modules/game/src/game_iface.c1176
-rw-r--r--modules/menu/inc/menu_clui.h54
-rw-r--r--modules/menu/inc/menu_gui.h112
-rw-r--r--modules/menu/inc/menu_iface.h134
-rw-r--r--modules/menu/inc/menu_tui.h54
-rw-r--r--modules/menu/inc/parser.h54
-rw-r--r--modules/menu/src/menu_clui.c416
-rw-r--r--modules/menu/src/menu_gui.c2001
-rw-r--r--modules/menu/src/menu_iface.c292
-rw-r--r--modules/menu/src/menu_tui.c877
-rw-r--r--modules/menu/src/parser.c454
-rw-r--r--modules/player/inc/player_clui.h148
-rw-r--r--modules/player/inc/player_gui.h160
-rw-r--r--modules/player/inc/player_iface.h186
-rw-r--r--modules/player/inc/player_tui.h234
-rw-r--r--modules/player/src/player_clui.c1038
-rw-r--r--modules/player/src/player_gui.c1963
-rw-r--r--modules/player/src/player_iface.c906
-rw-r--r--modules/player/src/player_tui.c1924
-rw-r--r--modules/save/inc/save.h126
-rw-r--r--modules/save/inc/score.h140
-rw-r--r--modules/save/src/save.c486
-rw-r--r--modules/save/src/score.c582
-rw-r--r--modules/xyzzy/inc/xyzzy.h62
-rw-r--r--modules/xyzzy/src/xyzzy.c234
-rw-r--r--modules/xyzzy/tmp/Makefile2
-rw-r--r--src/main.c210
35 files changed, 8117 insertions, 8045 deletions
diff --git a/Makefile b/Makefile
index d94c02f..bb39a1d 100644
--- a/Makefile
+++ b/Makefile
@@ -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 $@"
diff --git a/src/main.c b/src/main.c
index fbb8561..3e12501 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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 **********************************************************
+ ******************************************************************************/