summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandro Colomar <Colomar.6.4.3@GMail.com>2018-08-31 00:08:53 +0200
committerGitHub <noreply@github.com>2018-08-31 00:08:53 +0200
commitfe901b2e4b2dc751ff2183dbb08b9d7a391e7854 (patch)
treeca4fbe8714445255eac4e029f036762229060cac
parentd8d5abcfa4df160d6f7619feaa3d1bfd67245ffd (diff)
parent7f3546027a743be94c43014fea4d04df6917d6ed (diff)
Merge pull request #42 from AlejandroColomar/v-3.a.9
V 3.a.9
-rw-r--r--Makefile3
-rw-r--r--bin/Makefile71
-rw-r--r--libalx/src/alx_ncur.c3
-rw-r--r--modules/Makefile28
-rw-r--r--modules/about/Makefile (renamed from modules/ui/Makefile)2
-rw-r--r--modules/about/inc/about.h46
-rw-r--r--modules/about/obj/Makefile44
-rw-r--r--modules/about/src/about.c (renamed from modules/prnt/src/about.c)30
-rw-r--r--modules/ctrl/inc/start.h34
-rw-r--r--modules/ctrl/obj/Makefile43
-rw-r--r--modules/ctrl/src/start.c123
-rw-r--r--modules/data/inc/data.h218
-rw-r--r--modules/data/obj/Makefile38
-rw-r--r--modules/data/src/data.c215
-rw-r--r--modules/game/inc/game.h84
-rw-r--r--modules/game/inc/game_iface.h129
-rw-r--r--modules/game/obj/Makefile40
-rw-r--r--modules/game/src/game.c406
-rw-r--r--modules/game/src/game_iface.c514
-rw-r--r--modules/gen/inc/init.h13
-rw-r--r--modules/gen/obj/Makefile46
-rw-r--r--modules/gen/src/init.c128
-rw-r--r--modules/menu/Makefile (renamed from modules/data/Makefile)2
-rw-r--r--modules/menu/inc/menu_iface.h64
-rw-r--r--modules/menu/inc/menu_tui.h27
-rw-r--r--modules/menu/inc/parser.h27
-rw-r--r--modules/menu/obj/Makefile111
-rw-r--r--modules/menu/src/menu_iface.c83
-rw-r--r--modules/menu/src/menu_tui.c363
-rw-r--r--modules/menu/src/parser.c (renamed from modules/ui/src/parser.c)88
-rw-r--r--modules/player/Makefile (renamed from modules/gen/Makefile)2
-rw-r--r--modules/player/inc/player_clui.h70
-rw-r--r--modules/player/inc/player_iface.h91
-rw-r--r--modules/player/inc/player_tui.h117
-rw-r--r--modules/player/obj/Makefile75
-rw-r--r--modules/player/src/player_clui.c616
-rw-r--r--modules/player/src/player_iface.c391
-rw-r--r--modules/player/src/player_tui.c912
-rw-r--r--modules/prnt/Makefile24
-rw-r--r--modules/prnt/inc/about.h15
-rw-r--r--modules/prnt/inc/print.h10
-rw-r--r--modules/prnt/obj/Makefile58
-rw-r--r--modules/prnt/src/print.c40
-rw-r--r--modules/save/inc/save.h51
-rw-r--r--modules/save/obj/Makefile22
-rw-r--r--modules/save/src/save.c170
-rw-r--r--modules/ui/inc/clui.h11
-rw-r--r--modules/ui/inc/game_clui.h11
-rw-r--r--modules/ui/inc/game_iface.h11
-rw-r--r--modules/ui/inc/game_tui.h13
-rw-r--r--modules/ui/inc/game_ui.h11
-rw-r--r--modules/ui/inc/parser.h11
-rw-r--r--modules/ui/inc/tui.h11
-rw-r--r--modules/ui/obj/Makefile136
-rw-r--r--modules/ui/src/clui.c192
-rw-r--r--modules/ui/src/game_clui.c455
-rw-r--r--modules/ui/src/game_iface.c470
-rw-r--r--modules/ui/src/game_tui.c707
-rw-r--r--modules/ui/src/game_ui.c800
-rw-r--r--modules/ui/src/tui.c348
-rw-r--r--modules/xyzzy/inc/xyzzy.h23
-rw-r--r--modules/xyzzy/obj/Makefile35
-rw-r--r--modules/xyzzy/src/xyzzy.c125
-rw-r--r--obj/Makefile62
-rw-r--r--src/main.c94
65 files changed, 4715 insertions, 4498 deletions
diff --git a/Makefile b/Makefile
index f4630ff..af77e94 100644
--- a/Makefile
+++ b/Makefile
@@ -122,11 +122,14 @@ export SHARE_DIR
# Make variables (CC, etc...)
ifeq ($(OS), linux)
CC = gcc
+ LD = ld
else ifeq ($(OS), win)
CC = gcc.exe
+ LD = ld.exe
endif
export CC
+export LD
################################################################################
CFLAGS = -std=c11
diff --git a/bin/Makefile b/bin/Makefile
index e483b13..739c366 100644
--- a/bin/Makefile
+++ b/bin/Makefile
@@ -2,62 +2,57 @@
# directories
-LIBALX_OBJ_DIR = $(LIBALX_DIR)/obj/
+LIBALX_OBJ_DIR = $(LIBALX_DIR)/obj/
-CTRL_DIR = $(MODULES_DIR)/ctrl/
-CTRL_OBJ_DIR = $(CTRL_DIR)/obj/
+ABOUT_DIR = $(MODULES_DIR)/about/
+ABOUT_OBJ_DIR = $(ABOUT_DIR)/obj/
-DATA_DIR = $(MODULES_DIR)/data/
-DATA_OBJ_DIR = $(DATA_DIR)/obj/
+CTRL_DIR = $(MODULES_DIR)/ctrl/
+CTRL_OBJ_DIR = $(CTRL_DIR)/obj/
-GAME_DIR = $(MODULES_DIR)/game/
-GAME_OBJ_DIR = $(GAME_DIR)/obj/
+GAME_DIR = $(MODULES_DIR)/game/
+GAME_OBJ_DIR = $(GAME_DIR)/obj/
-GEN_DIR = $(MODULES_DIR)/gen/
-GEN_OBJ_DIR = $(GEN_DIR)/obj/
+MENU_DIR = $(MODULES_DIR)/menu/
+MENU_OBJ_DIR = $(MENU_DIR)/obj/
-PRNT_DIR = $(MODULES_DIR)/prnt/
-PRNT_OBJ_DIR = $(PRNT_DIR)/obj/
+PLAY_DIR = $(MODULES_DIR)/player/
+PLAY_OBJ_DIR = $(PLAY_DIR)/obj/
-SAVE_DIR = $(MODULES_DIR)/save/
-SAVE_OBJ_DIR = $(SAVE_DIR)/obj/
+SAVE_DIR = $(MODULES_DIR)/save/
+SAVE_OBJ_DIR = $(SAVE_DIR)/obj/
-UI_DIR = $(MODULES_DIR)/ui/
-UI_OBJ_DIR = $(UI_DIR)/obj/
+XYZZY_DIR = $(MODULES_DIR)/xyzzy/
+XYZZY_OBJ_DIR = $(XYZZY_DIR)/obj/
-XYZZY_DIR = $(MODULES_DIR)/xyzzy/
-XYZZY_OBJ_DIR = $(XYZZY_DIR)/obj/
-
-OBJ_DIR = $(MAIN_DIR)/obj/
+OBJ_DIR = $(MAIN_DIR)/obj/
# dependencies
-_ALL = mine_sweeper mine_sweeper.exe
+_ALL = mine_sweeper mine_sweeper.exe
ifeq ($(OS), linux)
- ALL = mine_sweeper
+ ALL = mine_sweeper
else ifeq ($(OS), win)
- ALL = mine_sweeper.exe
+ ALL = mine_sweeper.exe
endif
-MAIN_OBJ_LIBALX = alx_file.o alx_getnum.o alx_ncur.o alx_seed.o
-MAIN_OBJ_CTRL = start.o
-MAIN_OBJ_DATA = data.o
-MAIN_OBJ_GAME = game.o
-MAIN_OBJ_GEN = init.o
-MAIN_OBJ_PRNT = about.o print.o
-MAIN_OBJ_SAVE = save.o
-MAIN_OBJ_UI = parser.o game_iface.o game_clui.o game_tui.o tui.o
-MAIN_OBJ_XYZZY = xyzzy.o
-
-MAIN_OBJS = $(OBJ_DIR)/main.o \
+MAIN_OBJ_LIBALX = alx_file.o alx_getnum.o alx_ncur.o alx_seed.o
+MAIN_OBJ_ABOUT = about_mod.o
+MAIN_OBJ_CTRL = ctrl_mod.o
+MAIN_OBJ_GAME = game_mod.o
+MAIN_OBJ_MENU = menu_mod.o
+MAIN_OBJ_PLAY = player_mod.o
+MAIN_OBJ_SAVE = save_mod.o
+MAIN_OBJ_XYZZY = xyzzy_mod.o
+
+MAIN_OBJS = $(OBJ_DIR)/main.o \
$(patsubst %,$(LIBALX_OBJ_DIR)/%,$(MAIN_OBJ_LIBALX)) \
+ $(patsubst %,$(ABOUT_OBJ_DIR)/%,$(MAIN_OBJ_ABOUT)) \
$(patsubst %,$(CTRL_OBJ_DIR)/%,$(MAIN_OBJ_CTRL)) \
- $(patsubst %,$(DATA_OBJ_DIR)/%,$(MAIN_OBJ_DATA)) \
$(patsubst %,$(GAME_OBJ_DIR)/%,$(MAIN_OBJ_GAME)) \
- $(patsubst %,$(GEN_OBJ_DIR)/%,$(MAIN_OBJ_GEN)) \
- $(patsubst %,$(PRNT_OBJ_DIR)/%,$(MAIN_OBJ_PRNT)) \
+ $(patsubst %,$(MENU_OBJ_DIR)/%,$(MAIN_OBJ_MENU)) \
+ $(patsubst %,$(PLAY_OBJ_DIR)/%,$(MAIN_OBJ_PLAY)) \
$(patsubst %,$(SAVE_OBJ_DIR)/%,$(MAIN_OBJ_SAVE)) \
- $(patsubst %,$(UI_OBJ_DIR)/%,$(MAIN_OBJ_UI)) \
$(patsubst %,$(XYZZY_OBJ_DIR)/%,$(MAIN_OBJ_XYZZY))
@@ -79,7 +74,7 @@ mine_sweeper.exe: $(MAIN_OBJS)
clean:
- $(Q)rm -f $(ALL)
+ $(Q)rm -f $(_ALL)
@echo "Clean binaries"
################################################################################
diff --git a/libalx/src/alx_ncur.c b/libalx/src/alx_ncur.c
index 0cf27a5..c615c56 100644
--- a/libalx/src/alx_ncur.c
+++ b/libalx/src/alx_ncur.c
@@ -67,12 +67,13 @@ void alx_pause_curses (void)
void alx_resume_curses (void)
{
fflush(stdout);
-// getchar();
reset_prog_mode();
}
void alx_end_curses (void)
{
+ clear();
+ refresh();
endwin();
}
diff --git a/modules/Makefile b/modules/Makefile
index 2fdd0d0..8bbb06b 100644
--- a/modules/Makefile
+++ b/modules/Makefile
@@ -4,22 +4,20 @@
# directories
+ABOUT_DIR = $(MODULES_DIR)/about/
CTRL_DIR = $(MODULES_DIR)/ctrl/
-DATA_DIR = $(MODULES_DIR)/data/
GAME_DIR = $(MODULES_DIR)/game/
-GEN_DIR = $(MODULES_DIR)/gen/
-PRNT_DIR = $(MODULES_DIR)/prnt/
+MENU_DIR = $(MODULES_DIR)/menu/
+PLAY_DIR = $(MODULES_DIR)/player/
SAVE_DIR = $(MODULES_DIR)/save/
-UI_DIR = $(MODULES_DIR)/ui/
XYZZY_DIR = $(MODULES_DIR)/xyzzy/
+export ABOUT_DIR
export CTRL_DIR
-export DATA_DIR
export GAME_DIR
-export GEN_DIR
-export PRNT_DIR
+export MENU_DIR
+export PLAY_DIR
export SAVE_DIR
-export UI_DIR
export XYZZY_DIR
# dependencies
@@ -29,24 +27,22 @@ export XYZZY_DIR
# action
all:
+ $(Q)cd $(ABOUT_DIR) && $(MAKE) && cd ..
$(Q)cd $(CTRL_DIR) && $(MAKE) && cd ..
- $(Q)cd $(DATA_DIR) && $(MAKE) && cd ..
$(Q)cd $(GAME_DIR) && $(MAKE) && cd ..
- $(Q)cd $(GEN_DIR) && $(MAKE) && cd ..
- $(Q)cd $(PRNT_DIR) && $(MAKE) && cd ..
+ $(Q)cd $(MENU_DIR) && $(MAKE) && cd ..
+ $(Q)cd $(PLAY_DIR) && $(MAKE) && cd ..
$(Q)cd $(SAVE_DIR) && $(MAKE) && cd ..
- $(Q)cd $(UI_DIR) && $(MAKE) && cd ..
$(Q)cd $(XYZZY_DIR) && $(MAKE) && cd ..
clean:
+ $(Q)cd $(ABOUT_DIR) && $(MAKE) clean && cd ..
$(Q)cd $(CTRL_DIR) && $(MAKE) clean && cd ..
- $(Q)cd $(DATA_DIR) && $(MAKE) clean && cd ..
$(Q)cd $(GAME_DIR) && $(MAKE) clean && cd ..
- $(Q)cd $(GEN_DIR) && $(MAKE) clean && cd ..
- $(Q)cd $(PRNT_DIR) && $(MAKE) clean && cd ..
+ $(Q)cd $(MENU_DIR) && $(MAKE) clean && cd ..
+ $(Q)cd $(PLAY_DIR) && $(MAKE) clean && cd ..
$(Q)cd $(SAVE_DIR) && $(MAKE) clean && cd ..
- $(Q)cd $(UI_DIR) && $(MAKE) clean && cd ..
$(Q)cd $(XYZZY_DIR) && $(MAKE) clean && cd ..
@echo "Clean modules"
diff --git a/modules/ui/Makefile b/modules/about/Makefile
index 5258acf..224aba5 100644
--- a/modules/ui/Makefile
+++ b/modules/about/Makefile
@@ -4,7 +4,7 @@
# directories
-OBJ_DIR = $(UI_DIR)/obj/
+OBJ_DIR = $(ABOUT_DIR)/obj/
# target: dependencies
# action
diff --git a/modules/about/inc/about.h b/modules/about/inc/about.h
new file mode 100644
index 0000000..9a3de85
--- /dev/null
+++ b/modules/about/inc/about.h
@@ -0,0 +1,46 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# ifndef MSW_ABOUT_H
+ # define MSW_ABOUT_H
+
+
+/******************************************************************************
+ ******* macros ***************************************************************
+ ******************************************************************************/
+ # define PROG_NAME "mine_sweeper"
+ # define PROG_YEAR "2015"
+
+
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+ extern char share_path [FILENAME_MAX];
+
+
+/******************************************************************************
+ ******* functions ************************************************************
+ ******************************************************************************/
+ void about_init (void);
+ void print_cpright (void);
+ void print_disclaim (void);
+ void print_help (void);
+ void print_license (void);
+ void print_usage (void);
+ void print_version (void);
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# endif /* about.h */
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/about/obj/Makefile b/modules/about/obj/Makefile
new file mode 100644
index 0000000..701c308
--- /dev/null
+++ b/modules/about/obj/Makefile
@@ -0,0 +1,44 @@
+# -*- MakeFile -*-
+
+# MACRO = substitute with this
+
+# directories
+
+LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
+
+INC_DIR = $(ABOUT_DIR)/inc/
+SRC_DIR = $(ABOUT_DIR)/src/
+
+# dependencies
+
+_ALL = about.o
+ALL = $(_ALL) about_mod.o
+
+ABOU_INC_LIBALX = alx_file.h
+ABOU_INC = about.h
+ABOU_DEPS = $(SRC_DIR)/about.c \
+ $(patsubst %,$(LIBALX_INC_DIR)/%,$(ABOU_INC_LIBALX)) \
+ $(patsubst %,$(INC_DIR)/%,$(ABOU_INC))
+ABOU_INC_DIRS = -I $(INC_DIR) \
+ -I $(LIBALX_INC_DIR)
+
+# target: dependencies
+# action
+
+all: $(ALL)
+
+
+about_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
+
+
+about.o: $(ABOU_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(ABOU_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+
+clean:
+ $(Q)rm -f *.o
diff --git a/modules/prnt/src/about.c b/modules/about/src/about.c
index 22bd67f..0f5ed88 100644
--- a/modules/prnt/src/about.c
+++ b/modules/about/src/about.c
@@ -2,20 +2,44 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
/* printf() */
#include <stdio.h>
/* strcpy() & strcat() */
#include <string.h>
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
/* alx_prn_file() */
#include "alx_file.h"
- /* PROG_... */
- #include "data.h"
-
#include "about.h"
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+char share_path [FILENAME_MAX];
+
+
+/******************************************************************************
+ ******* main *****************************************************************
+ ******************************************************************************/
+void about_init (void)
+{
+ strcpy(share_path, INSTALL_SHARE_DIR);
+ strcat(share_path, "/");
+ strcat(share_path, SHARE_DIR);
+ strcat(share_path, "/");
+}
+
void print_cpright (void)
{
char file_name [FILENAME_MAX];
diff --git a/modules/ctrl/inc/start.h b/modules/ctrl/inc/start.h
index ae361d6..f636c7a 100644
--- a/modules/ctrl/inc/start.h
+++ b/modules/ctrl/inc/start.h
@@ -2,10 +2,42 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
# ifndef MSW_START_H
# define MSW_START_H
-void start_switch (void);
+/******************************************************************************
+ ******* 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/obj/Makefile b/modules/ctrl/obj/Makefile
index 489810d..79c85a6 100644
--- a/modules/ctrl/obj/Makefile
+++ b/modules/ctrl/obj/Makefile
@@ -4,10 +4,9 @@
# directories
-DATA_INC_DIR = $(DATA_DIR)/inc/
-GEN_INC_DIR = $(GEN_DIR)/inc/
-PRNT_INC_DIR = $(PRNT_DIR)/inc/
-UI_INC_DIR = $(UI_DIR)/inc/
+GAME_INC_DIR = $(GAME_DIR)/inc/
+MENU_INC_DIR = $(MENU_DIR)/inc/
+PLAY_INC_DIR = $(PLAY_DIR)/inc/
INC_DIR = $(CTRL_DIR)/inc/
SRC_DIR = $(CTRL_DIR)/src/
@@ -15,24 +14,22 @@ TST_DIR = $(CTRL_DIR)/tst/
# dependencies
-ALL = start.o
-
-STRT_INC_DATA = data.h
-STRT_INC_GEN = init.h
-STRT_INC_PRNT = print.h
-STRT_INC_UI = game_iface.h
-STRT_INC = start.h
-STRT_DEPS = $(SRC_DIR)/start.c \
- $(patsubst %,$(DATA_INC_DIR)/%,$(STRT_INC_DATA)) \
- $(patsubst %,$(GEN_INC_DIR)/%,$(STRT_INC_GEN)) \
- $(patsubst %,$(PRNT_INC_DIR)/%,$(STRT_INC_PRNT)) \
- $(patsubst %,$(UI_INC_DIR)/%,$(STRT_INC_UI)) \
+_ALL = start.o
+ALL = $(_ALL) ctrl_mod.o
+
+STRT_INC_GAME = game.h game_iface.h
+STRT_INC_MENU = menu_iface.h
+STRT_INC_PLAY = player_iface.h
+STRT_INC = start.h
+STRT_DEPS = $(SRC_DIR)/start.c \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(STRT_INC_GAME)) \
+ $(patsubst %,$(MENU_INC_DIR)/%,$(STRT_INC_MENU)) \
+ $(patsubst %,$(PLAY_INC_DIR)/%,$(STRT_INC_PLAY)) \
$(patsubst %,$(INC_DIR)/%,$(STRT_INC))
STRT_INC_DIRS = -I $(INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(GEN_INC_DIR) \
- -I $(PRNT_INC_DIR) \
- -I $(UI_INC_DIR)
+ -I $(GAME_INC_DIR) \
+ -I $(MENU_INC_DIR) \
+ -I $(PLAY_INC_DIR)
# target: dependencies
# action
@@ -40,6 +37,12 @@ STRT_INC_DIRS = -I $(INC_DIR) \
all: $(ALL)
+ctrl_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
+
+
start.o: $(STRT_DEPS)
$(Q)$(CC) $(CFLAGS) $(STRT_INC_DIRS) -c $< -o $@ $(LIBS)
@echo "\tCC $<"
diff --git a/modules/ctrl/src/start.c b/modules/ctrl/src/start.c
index f300ff0..f80067b 100644
--- a/modules/ctrl/src/start.c
+++ b/modules/ctrl/src/start.c
@@ -2,85 +2,130 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* errno */
#include <errno.h>
/* fflush(stdout) */
#include <stdio.h>
- /* global variables */
- #include "data.h"
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
+ /* game() */
+ #include "game.h"
/* game_iface() */
#include "game_iface.h"
- /* init_board_...() */
- #include "init.h"
- /* print_...() & show_board_...() */
- #include "print.h"
+ /* menu_iface_board() */
+ #include "menu_iface.h"
+ /* player_iface() */
+ #include "player_iface.h"
#include "start.h"
-static void start (void);
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+int start_mode;
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
static void start_foo (void);
-static void start_custom (void);
static void start_rand (void);
+static void start_load (void);
+/******************************************************************************
+ ******* main *****************************************************************
+ ******************************************************************************/
void start_switch (void)
{
- switch (flag_s) {
+ switch (start_mode) {
case START_FOO:
start_foo();
break;
- case START_NEW:
+ case START_RAND:
start_rand();
break;
case START_LOAD:
- start_custom();
+ start_load();
break;
}
-
- fflush(stdout);
}
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
static void start_foo (void)
{
- /* foo */
+ /* empty */
}
-static void start_custom (void)
+static void start_rand (void)
{
- /* sets errno */
- init_board_custom();
+ /* size & mines */
+ int rows;
+ int cols;
+ int mines;
+ menu_iface_board(&rows, &cols, &mines);
- if (!errno) {
- start();
- }
+ /* user iface init */
+ player_iface_init(rows, cols);
+
+ /* start position */
+ int r;
+ int c;
+ player_iface_start(&r, &c);
+
+ /* game init */
+ game_init_rand(rows, cols, mines, r, c);
+
+ /* game iface init */
+ game_iface_init_rand(r, c);
+
+ /* game loop */
+ game_iface();
+
+ /* user iface cluanup */
+ player_iface_cleanup();
+ fflush(stdout);
}
-static void start_rand (void)
+static void start_load (void)
{
- /* clear */
- init_board_clr();
+ /* size & game init (sets errno) */
+ int rows;
+ int cols;
+ game_init_load(&rows, &cols);
- start();
-}
+ /* player iface init */
+ player_iface_init(rows, cols);
+ if (!errno) {
+ /* game iface init */
+ game_iface_init_load();
-static void start (void)
-{
- game_iface();
+ /* game loop */
+ game_iface();
+ }
+
+ /* user iface cluanup */
+ player_iface_cleanup();
+ fflush(stdout);
}
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/data/inc/data.h b/modules/data/inc/data.h
deleted file mode 100644
index 0c3e0a5..0000000
--- a/modules/data/inc/data.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_DATA_H
- # define MSW_DATA_H
-
- /* bool */
- #include <stdbool.h>
- /* FILENAME_MAX */
- #include <stdio.h>
- /* time_t */
- #include <time.h>
- /* wchar_t */
- #include <wchar.h>
-
-
-/******************************************************************************
- ******* macros ***************************************************************
- ******************************************************************************/
- # define DBG true
- # if (DBG)
- # define DBG_PRINT(x, y, z) print_verbose(x, y, z)
- # else
- # define DBG_PRINT(x, y, z) do {} while (0)
- # endif
-
- # define PROG_NAME "mine-sweeper"
- # define PROG_YEAR "2015"
-
- # define OPT_LIST "xhLuV:v""a:b:f:i:p:r:s:"
-
- # if defined (OS_LINUX)
- # define ENV_HOME "HOME"
- # elif defined (OS_WIN)
- # define ENV_HOME "USERPROFILE"
- # endif
-
- # define MAIN_DIR "mine_sweeper/"
-
- # define ROWS_MAX 22
- # define COLS_MAX 33
-
- # define USER_GAME_DIR ".mine_sweeper/"
- # define USER_SAVED_DIR ".mine_sweeper/saved/"
- # define SAVED_NAME_DEFAULT "saved_000.mine"
-
- # define CHEATED (-1)
-
-
-/******************************************************************************
- ******* enums ****************************************************************
- ******************************************************************************/
- enum Mine_Board {
- MINE_NO = 0,
- MINE_YES = 9
- };
-
- enum Usr_Board {
- KBOOM = -1,
- USR_HIDDEN,
- USR_CLEAR,
- USR_FLAG,
- USR_POSSIBLE
- };
-
- enum Actions {
- ACT_FOO,
- ACT_MOVE_UP,
- ACT_MOVE_DOWN,
- ACT_MOVE_RIGHT,
- ACT_MOVE_LEFT,
- ACT_STEP,
- ACT_FLAG,
- ACT_FLAG_POSSIBLE,
- ACT_RM_FLAG,
- ACT_HIGHLIGHT,
- ACT_PAUSE,
- ACT_SAVE,
- ACT_XYZZY_ON,
- ACT_XYZZY_OFF,
- ACT_XYZZY_LIN,
- ACT_XYZZY_P,
- ACT_XYZZY_NP,
- ACT_QUIT
- };
-
- enum Game_State {
- GAME_READY,
- GAME_PLAYING,
- GAME_PAUSE,
- GAME_CHEATED,
- GAME_XYZZY,
- GAME_WIN,
- GAME_OVER,
- GAME_QUIT
- };
-
- enum Flag_s {
- START_FOO = 0,
- START_NEW,
- START_LOAD
- };
-
- enum Flag_V {
- VERBOSE_FOO
- };
-
- enum Flag_Iface {
- IFACE_FOO = 0,
- IFACE_CLUI,
- IFACE_TUI,
- IFACE_GUI
- };
-
- 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
- };
-
- enum Eggs {
-/* Stop blowing holes in my ship! */
- EGG_KBOOM,
-/* Sticks and stones, love. I saved your life, you saved mine. We’re square. */
- EGG_WIN,
-/*
- * Do us a favor. I know it’s difficult for you, but please,
- * stay here, and try not to do anything stupid.
- */
- EGG_PAUSE,
-/* If you were waiting for the opportune moment, that was it. */
- EGG_UNPAUSE,
-/* Nothing happens. */
- EGG_XYZZY,
-/* Not a game. */
- EGG_QUIT
- };
-
-
-/******************************************************************************
- ******* structs **************************************************************
- ******************************************************************************/
- struct Board {
- int rows;
- int cols;
- double p;
- int mines;
- int gnd [ROWS_MAX] [COLS_MAX];
- int usr [ROWS_MAX] [COLS_MAX];
- wchar_t visible [ROWS_MAX] [COLS_MAX];
- int flags;
- int cleared;
- bool set;
- int state;
- int time;
- int clicks;
- };
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
- extern char prog_name [FILENAME_MAX];
-
- extern struct Board board;
-
- extern enum Flag_s flag_s;
- extern enum Flag_V flag_V;
- extern enum Flag_Iface flag_iface;
- extern bool flag_exit;
- extern bool flag_color;
-
- extern char share_path [FILENAME_MAX];
-
- 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];
-
- extern int seed;
-
- extern time_t tim_ini;
-
- extern bool highlight;
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
- void init_values (void);
-
-
-# endif /* data.h */
diff --git a/modules/data/obj/Makefile b/modules/data/obj/Makefile
deleted file mode 100644
index 011dcf3..0000000
--- a/modules/data/obj/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-# -*- MakeFile -*-
-
-# MACRO = substitute with this
-
-# directories
-
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-
-INC_DIR = $(DATA_DIR)/inc/
-SRC_DIR = $(DATA_DIR)/src/
-TST_DIR = $(DATA_DIR)/tst/
-
-# dependencies
-
-ALL = data.o
-
-DATA_INC_LIBALX = alx_seed.h
-DATA_INC = data.h
-DATA_DEPS = $(SRC_DIR)/data.c \
- $(patsubst %,$(INC_DIR)/%,$(DATA_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(DATA_INC_LIBALX))
-DATA_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR)
-
-# target: dependencies
-# action
-
-all: $(ALL)
-
-
-data.o: $(DATA_DEPS)
- $(Q)$(CC) $(CFLAGS) $(DATA_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-
-clean:
- $(Q)rm -f *.o
diff --git a/modules/data/src/data.c b/modules/data/src/data.c
deleted file mode 100644
index 6ed626e..0000000
--- a/modules/data/src/data.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- /* errors */
- #include <errno.h>
- /* has_colors() & start_color() & init_pair() */
- #include <ncurses.h>
- /* mkdir */
- #include <sys/stat.h>
- /* bool */
- #include <stdbool.h>
- /* srand() */
- #include <stdlib.h>
- /* strcpy() */
- #include <string.h>
- /* time_t & clock() & time() */
- #include <time.h>
- /* getpid() */
- #include <unistd.h>
-
- /* seedf() */
- #include "alx_seed.h"
-
- #include "data.h"
-
-
-/******************************************************************************
- ******* variables ************************************************************
- ******************************************************************************/
-char prog_name[FILENAME_MAX];
-
-struct Board board;
-
-enum Flag_s flag_s;
-enum Flag_V flag_V;
-enum Flag_Iface flag_iface;
-bool flag_exit;
-bool flag_color;
-
-char share_path [FILENAME_MAX];
-
-char home_path [FILENAME_MAX];
-char user_game_path [FILENAME_MAX];
-
-char saved_path [FILENAME_MAX];
-char saved_name [FILENAME_MAX];
-
-int seed;
-
-time_t tim_ini;
-
-bool highlight;
-
-
-/******************************************************************************
- ******* static ***************************************************************
- ******************************************************************************/
-static void init_values_home (void);
-static void init_values_color (void);
-
-
-/******************************************************************************
- ******* functions ************************************************************
- ******************************************************************************/
-void init_values (void)
-{
- strcpy(share_path, INSTALL_SHARE_DIR);
- strcat(share_path, "/");
- strcat(share_path, SHARE_DIR);
- strcat(share_path, "/");
-
- strcpy(saved_name, SAVED_NAME_DEFAULT);
-
- board.p = 0.16;
- board.rows = 8;
- board.cols = 8;
-
- flag_s = START_FOO;
- flag_V = 1;
- flag_iface = IFACE_TUI;
- flag_exit = false;
-
- seed = seedf(clock(), time(NULL), getpid());
- srand(seed);
-
- init_values_home();
- init_values_color();
-}
-
-
-/******************************************************************************
- ******* static ***************************************************************
- ******************************************************************************/
-static void init_values_home (void)
-{
- int err;
-
- strcpy(home_path, getenv(ENV_HOME));
-
- strcpy(user_game_path, home_path);
- strcat(user_game_path, "/");
- strcat(user_game_path, USER_GAME_DIR);
- strcat(user_game_path, "/");
-
- strcpy(saved_path, home_path);
- strcat(saved_path, "/");
- strcat(saved_path, USER_SAVED_DIR);
- strcat(saved_path, "/");
-
- strcpy(saved_name, SAVED_NAME_DEFAULT);
-
-#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(user_game_path, 0700);
-#elif defined OS_WIN
- mkdir(user_game_path);
-#endif
- } else {
-
- switch (errno) {
- case EACCES:
- printf("err = EACCES");
- break;
-
- case EEXIST:
- /* OK */
- break;
-/* fails on mingw
- case ELOOP:
- printf("err = ELOOP");
- break;
-*/
- case EMLINK:
- printf("err = EMLINK");
- break;
-
- case ENAMETOOLONG:
- printf("err = ENAMETOOLONG");
- break;
-
- case ENOENT:
- printf("err = ENOENT");
- break;
-
- case ENOSPC:
- printf("err = ENOSPC");
- break;
-
- case ENOTDIR:
- printf("err = ENOTDIR");
- break;
-
- case EROFS:
- printf("err = EROFS");
- break;
-
- default:
- printf("err = other");
- break;
- }
- }
-}
-
-static void init_values_color (void)
-{
- 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);
-
- init_pair(PAIR_TERM, -1, -1);
- }
-}
-
-
-/******************************************************************************
- ******************************************************************************
- **** END OF FILE *************************************************************
- ******************************************************************************
- ******************************************************************************/
-
-/******************************************************************************
- ******************************************************************************
- **** END OF FILE *************************************************************
- ******************************************************************************
- ******************************************************************************/
diff --git a/modules/game/inc/game.h b/modules/game/inc/game.h
index 8af008c..69182fa 100644
--- a/modules/game/inc/game.h
+++ b/modules/game/inc/game.h
@@ -2,11 +2,91 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
# ifndef MSW_GAME_H
# define MSW_GAME_H
-void game_action (int action, int *pos_row, int *pos_col);
-void game_update_time (void);
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+ /* ¡ 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
new file mode 100644
index 0000000..3bb1ebd
--- /dev/null
+++ b/modules/game/inc/game_iface.h
@@ -0,0 +1,129 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# ifndef MSW_GAME_IFACE_H
+ # define MSW_GAME_IFACE_H
+
+
+/******************************************************************************
+ ******* macros ***************************************************************
+ ******************************************************************************/
+ # define ROWS_MAX (22)
+ # define COLS_MAX (33)
+ # define CHEATED (-1)
+
+
+/******************************************************************************
+ ******* enums ****************************************************************
+ ******************************************************************************/
+ enum Game_Iface_Visible_Board {
+ 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 = 0,
+ GAME_IFACE_STATE_SAFE,
+ GAME_IFACE_STATE_GAMEOVER,
+
+ GAME_IFACE_STATE_PAUSE,
+ GAME_IFACE_STATE_CHEATED,
+ GAME_IFACE_STATE_XYZZY,
+ GAME_IFACE_STATE_QUIT
+ };
+
+
+/******************************************************************************
+ ******* 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 time;
+ int clicks;
+ };
+
+ struct Game_Iface_In {
+ int action;
+ int act_game [ROWS_MAX] [COLS_MAX];
+ };
+
+
+/******************************************************************************
+ ******* functions ************************************************************
+ ******************************************************************************/
+ void game_iface_init_rand (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/obj/Makefile b/modules/game/obj/Makefile
index 849773e..5cd0760 100644
--- a/modules/game/obj/Makefile
+++ b/modules/game/obj/Makefile
@@ -6,37 +6,65 @@
LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-DATA_INC_DIR = $(DATA_DIR)/inc/
+PLAY_INC_DIR = $(PLAY_DIR)/inc/
+SAVE_INC_DIR = $(SAVE_DIR)/inc/
+XYZZY_INC_DIR = $(XYZZY_DIR)/inc/
INC_DIR = $(GAME_DIR)/inc/
SRC_DIR = $(GAME_DIR)/src/
# dependencies
-ALL = game.o
+_ALL = game.o game_iface.o
+ALL = $(_ALL) game_mod.o
-GAME_INC_LIBALX =
-GAME_INC_DATA = data.h
+GAME_INC_LIBALX = alx_seed.h
+GAME_INC_SAVE = save.h
GAME_INC = game.h
GAME_DEPS = $(SRC_DIR)/game.c \
$(patsubst %,$(INC_DIR)/%,$(GAME_INC)) \
$(patsubst %,$(LIBALX_INC_DIR)/%,$(GAME_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(GAME_INC_DATA))
+ $(patsubst %,$(SAVE_INC_DIR)/%,$(GAME_INC_SAVE))
GAME_INC_DIRS = -I $(INC_DIR) \
- -I $(DATA_INC_DIR) \
+ -I $(SAVE_INC_DIR) \
-I $(LIBALX_INC_DIR)
+GAMEI_INC_PLAY = player_iface.h
+GAMEI_INC_SAVE = save.h
+GAMEI_INC_XYZZY = xyzzy.h
+GAMEI_INC = game_iface.h game.h
+GAMEI_DEPS = $(SRC_DIR)/game_iface.c \
+ $(patsubst %,$(INC_DIR)/%,$(GAME_INC)) \
+ $(patsubst %,$(PLAY_INC_DIR)/%,$(GAMEI_INC_PLAY)) \
+ $(patsubst %,$(SAVE_INC_DIR)/%,$(GAME_INC_SAVE)) \
+ $(patsubst %,$(XYZZY_INC_DIR)/%,$(GAMEI_INC_XYZZY))
+GAMEI_INC_DIRS = -I $(INC_DIR) \
+ -I $(PLAY_INC_DIR) \
+ -I $(SAVE_INC_DIR) \
+ -I $(XYZZY_INC_DIR)
+
# target: dependencies
# action
all: $(ALL)
+game_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
+
+
game.o: $(GAME_DEPS)
$(Q)$(CC) $(CFLAGS) $(GAME_INC_DIRS) -c $< -o $@ $(LIBS)
@echo "\tCC $<"
@echo ""
+game_iface.o: $(GAMEI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(GAMEI_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
clean:
$(Q)rm -f *.o
diff --git a/modules/game/src/game.c b/modules/game/src/game.c
index 458737d..c149545 100644
--- a/modules/game/src/game.c
+++ b/modules/game/src/game.c
@@ -2,187 +2,262 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
- /* macros */
- #include "data.h"
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* 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"
/******************************************************************************
- ******| static |**************************************************************
+ ******* variables ************************************************************
******************************************************************************/
-static void game_move_up (int *pos_row);
-static void game_move_down (int *pos_row);
-static void game_move_right (int *pos_col);
-static void game_move_left (int *pos_col);
-
-static void game_step (int pos_row, int pos_col);
-static void game_first_step (int pos_row, int pos_col);
-static void game_discover (int pos_row, int pos_col);
-static void game_discover_recursive (int pos_row, int pos_col);
-static void game_big_step (int pos_row, int pos_col);
-static int game_count_flags (int pos_row, int pos_col);
-static void game_step_recursive (int pos_row, int pos_col);
-
-static void game_flag (int pos_row, int pos_col);
-static void game_possible (int pos_row, int pos_col);
-static void game_rmflag (int pos_row, int pos_col);
-static void game_all_flags (int pos_row, int pos_col);
-static int game_count_nclear (int pos_row, int pos_col);
-static void game_flag_recursive (int pos_row, int pos_col);
+struct Game_Board game_board;
/******************************************************************************
- ******| main |****************************************************************
+ ******* static functions *****************************************************
******************************************************************************/
-void game_action (int action, int *pos_row, int *pos_col)
+ /* 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_first_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)
{
- switch (action) {
- case ACT_MOVE_UP:
- game_move_up(pos_row);
- break;
+ int seed;
+ seed = seedf(clock(), time(NULL), getpid());
+ srand(seed);
+}
- case ACT_MOVE_DOWN:
- game_move_down(pos_row);
- break;
+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;
- case ACT_MOVE_RIGHT:
- game_move_right(pos_col);
- break;
+ /* clear */
+ game_init_clr();
- case ACT_MOVE_LEFT:
- game_move_left(pos_col);
- break;
+ /* place mines */
+ game_init_mines(pos_row, pos_col);
- case ACT_STEP:
- game_step(*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 ACT_FLAG:
- game_flag(*pos_row, *pos_col);
+ case GAME_ACT_FLAG:
+ game_flag(row, col);
break;
- case ACT_FLAG_POSSIBLE:
- game_possible(*pos_row, *pos_col);
+ case GAME_ACT_FLAG_POSSIBLE:
+ game_possible(row, col);
break;
- case ACT_RM_FLAG:
- game_rmflag(*pos_row, *pos_col);
+ case GAME_ACT_RM_FLAG:
+ game_rmflag(row, col);
break;
}
}
/******************************************************************************
- ******| static |**************************************************************
+ ******* static functions *****************************************************
******************************************************************************/
-static void game_move_up (int *pos_row)
+/* * * * * * * * * *
+ * * * Init * * * * * * *
+ * * * * * * * * * */
+static void game_init_clr (void)
{
- if (*pos_row) {
- (*pos_row)--;
- } else {
- *pos_row = board.rows - 1;
+ 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_move_down (int *pos_row)
+static void game_init_mines (int pos_row, int pos_col)
{
- if (*pos_row != board.rows - 1) {
- (*pos_row)++;
- } else {
- *pos_row = 0;
+ /* 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_move_right (int *pos_col)
+static void game_init_adjnums (void)
{
- if (*pos_col != board.cols - 1) {
- (*pos_col)++;
- } else {
- *pos_col = 0;
+ 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]++;
+ }
+ }
+ }
+ }
+ }
}
-}
-
-static void game_move_left (int *pos_col)
-{
- if (*pos_col) {
- (*pos_col)--;
- } else {
- *pos_col = board.cols - 1;
}
}
-static void game_step (int pos_row, int pos_col)
+/* * * * * * * * * *
+ * * * Step * * * * * * *
+ * * * * * * * * * */
+static void game_step (int r, int c)
{
- switch (board.usr[pos_row][pos_col]) {
- case USR_HIDDEN:
- case USR_POSSIBLE:
- game_discover(pos_row, pos_col);
+ switch (game_board.usr[r][c]) {
+ case GAME_USR_HIDDEN:
+ case GAME_USR_POSSIBLE:
+ game_discover(r, c);
break;
- case USR_CLEAR:
- game_big_step(pos_row, pos_col);
+ case GAME_USR_CLEAR:
+ game_big_step(r, c);
break;
}
- board.clicks++;
}
-static void game_discover (int pos_row, int pos_col)
+static void game_discover (int r, int c)
{
- const int total_safe_fields = board.rows * board.cols -
- board.mines;
+ 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;
- if (board.gnd[pos_row][pos_col] >= MINE_YES) {
- board.usr[pos_row][pos_col] = KBOOM;
- board.state = GAME_OVER;
+ } else if (game_board.usr[r][c] != GAME_USR_CLEAR) {
+ game_board.usr[r][c] = GAME_USR_CLEAR;
+ game_board.clr++;
- } else if (board.usr[pos_row][pos_col] != USR_CLEAR) {
- board.usr[pos_row][pos_col] = USR_CLEAR;
- board.cleared++;
+ if (game_board.clr == safe_fields) {
+ game_board.state = GAME_STATE_SAFE;
- if (board.cleared == total_safe_fields) {
- board.state = GAME_WIN;
- } else if (board.gnd[pos_row][pos_col] == MINE_NO) {
- game_discover_recursive(pos_row, pos_col);
+ } else if (game_board.gnd[r][c] == GAME_MINE_NO) {
+ game_discover_recursive(r, c);
}
}
}
-static void game_discover_recursive (int pos_row, int pos_col)
+static void game_discover_recursive (int r, int c)
{
int i;
int j;
- for (i = pos_row-1; i < pos_row+2; i++) {
- for (j = pos_col-1; j < pos_col+2; j++) {
- if (i >= 0 && i < board.rows && j >= 0 && j < board.cols) {
+ 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 pos_row, int pos_col)
+static void game_big_step (int r, int c)
{
int cnt;
- cnt = game_count_flags(pos_row, pos_col);
+ cnt = game_count_flags(r, c);
- if (cnt && (board.gnd[pos_row][pos_col] == cnt)) {
- game_step_recursive(pos_row, pos_col);
+ if (cnt && (game_board.gnd[r][c] == cnt)) {
+ game_step_recursive(r, c);
}
}
-static int game_count_flags (int pos_row, int pos_col)
+static int game_count_flags (int r, int c)
{
int cnt;
int i;
int j;
cnt = 0;
- for (i = pos_row-1; i < pos_row+2; i++) {
- for (j = pos_col-1; j < pos_col+2; j++) {
- if (i >= 0 && i < board.rows && j >= 0 && j < board.cols) {
- if (board.usr[i][j] == USR_FLAG) {
+ 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++;
}
}
@@ -192,17 +267,18 @@ static int game_count_flags (int pos_row, int pos_col)
return cnt;
}
-static void game_step_recursive (int pos_row, int pos_col)
+static void game_step_recursive (int r, int c)
{
int i;
int j;
- for (i = pos_row-1; i < pos_row+2; i++) {
- for (j = pos_col-1; j < pos_col+2; j++) {
- if (i >= 0 && i < board.rows && j >= 0 && j < board.cols) {
- switch (board.usr[i][j]) {
- case USR_HIDDEN:
- case USR_POSSIBLE:
+ 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;
}
@@ -211,81 +287,81 @@ static void game_step_recursive (int pos_row, int pos_col)
}
}
-static void game_flag (int pos_row, int pos_col)
+/* * * * * * * * * *
+ * * * Flag * * * * * * *
+ * * * * * * * * * */
+static void game_flag (int r, int c)
{
- switch (board.usr[pos_row][pos_col]) {
- case USR_HIDDEN:
- board.usr[pos_row][pos_col] = USR_FLAG;
- board.flags++;
- board.clicks++;
+ switch (game_board.usr[r][c]) {
+ case GAME_USR_HIDDEN:
+ game_board.usr[r][c] = GAME_USR_FLAG;
+ game_board.flags++;
break;
- case USR_FLAG:
- board.usr[pos_row][pos_col] = USR_POSSIBLE;
- board.flags--;
- board.clicks++;
+ case GAME_USR_FLAG:
+ game_board.usr[r][c] = GAME_USR_POSSIBLE;
+ game_board.flags--;
break;
- case USR_POSSIBLE:
- game_rmflag(pos_row, pos_col);
+ case GAME_USR_POSSIBLE:
+ game_rmflag(r, c);
break;
- case USR_CLEAR:
- game_all_flags(pos_row, pos_col);
- board.clicks++;
+ case GAME_USR_CLEAR:
+ game_all_flags(r, c);
break;
}
}
-static void game_possible (int pos_row, int pos_col)
+static void game_possible (int r, int c)
{
- switch (board.usr[pos_row][pos_col]) {
- case USR_HIDDEN:
- board.usr[pos_row][pos_col] = USR_POSSIBLE;
+ switch (game_board.usr[r][c]) {
+ case GAME_USR_HIDDEN:
+ game_board.usr[r][c] = GAME_USR_POSSIBLE;
break;
- case USR_POSSIBLE:
- game_rmflag(pos_row, pos_col);
+ case GAME_USR_POSSIBLE:
+ game_rmflag(r, c);
break;
}
}
-static void game_rmflag (int pos_row, int pos_col)
+static void game_rmflag (int r, int c)
{
- switch (board.usr[pos_row][pos_col]) {
- case USR_FLAG:
- board.usr[pos_row][pos_col] = USR_HIDDEN;
- board.flags--;
- board.clicks++;
+ switch (game_board.usr[r][c]) {
+ case GAME_USR_FLAG:
+ game_board.usr[r][c] = GAME_USR_HIDDEN;
+ game_board.flags--;
break;
- case USR_POSSIBLE:
- board.usr[pos_row][pos_col] = USR_HIDDEN;
+ case GAME_USR_POSSIBLE:
+ game_board.usr[r][c] = GAME_USR_HIDDEN;
break;
}
}
-static void game_all_flags (int pos_row, int pos_col)
+static void game_all_flags (int r, int c)
{
int cnt;
- cnt = game_count_nclear(pos_row, pos_col);
+ cnt = game_count_nclear(r, c);
- if (cnt && (board.gnd[pos_row][pos_col] == cnt)) {
- game_flag_recursive(pos_row, pos_col);
+ if (cnt && (game_board.gnd[r][c] == cnt)) {
+ game_flag_recursive(r, c);
}
}
-static int game_count_nclear (int pos_row, int pos_col)
+static int game_count_nclear (int r, int c)
{
int cnt;
int i;
int j;
cnt = 0;
- for (i = pos_row-1; i < pos_row+2; i++) {
- for (j = pos_col-1; j < pos_col+2; j++) {
- if (i >= 0 && i < board.rows && j >= 0 && j < board.cols) {
- if (board.usr[i][j] != USR_CLEAR) {
+ 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++;
}
}
@@ -295,19 +371,20 @@ static int game_count_nclear (int pos_row, int pos_col)
return cnt;
}
-static void game_flag_recursive (int pos_row, int pos_col)
+static void game_flag_recursive (int r, int c)
{
int i;
int j;
- for (i = pos_row-1; i < pos_row+2; i++) {
- for (j = pos_col-1; j < pos_col+2; j++) {
- if (i >= 0 && i < board.rows && j >= 0 && j < board.cols) {
- switch (board.usr[i][j]) {
- case USR_HIDDEN:
- case USR_POSSIBLE:
- board.usr[i][j] = USR_FLAG;
- board.flags++;
+ 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;
}
}
@@ -315,14 +392,7 @@ static void game_flag_recursive (int pos_row, int pos_col)
}
}
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/game/src/game_iface.c b/modules/game/src/game_iface.c
new file mode 100644
index 0000000..f7b35fb
--- /dev/null
+++ b/modules/game/src/game_iface.c
@@ -0,0 +1,514 @@
+/******************************************************************************
+ * 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"
+ /* 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 (void);
+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_end_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_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 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();
+
+ 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.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 (void)
+{
+ 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.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:
+ case GAME_IFACE_STATE_GAMEOVER:
+ game_iface_end_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();
+ 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();
+ 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();
+ 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();
+ break;
+
+ case GAME_IFACE_ACT_QUIT:
+ game_iface_quit();
+ break;
+ }
+}
+
+static void game_iface_end_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_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_SAFE:
+ 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_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;
+ }
+
+ 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.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/gen/inc/init.h b/modules/gen/inc/init.h
deleted file mode 100644
index 7539bc1..0000000
--- a/modules/gen/inc/init.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_INIT_H
- # define MSW_INIT_H
-
-
-void init_board_clr (void);
-void init_board_rand (int pos_row, int pos_col);
-void init_board_custom (void);
-
-# endif /* init.h */
diff --git a/modules/gen/obj/Makefile b/modules/gen/obj/Makefile
deleted file mode 100644
index 935798c..0000000
--- a/modules/gen/obj/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- MakeFile -*-
-
-# MACRO = substitute with this
-
-# directories
-
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-
-DATA_INC_DIR = $(DATA_DIR)/inc/
-SAVE_INC_DIR = $(SAVE_DIR)/inc/
-
-INC_DIR = $(GEN_DIR)/inc/
-SRC_DIR = $(GEN_DIR)/src/
-
-# dependencies
-
-ALL = init.o
-
-INIT_INC_LIBALX = alx_seed.h
-INIT_INC_DATA = data.h
-INIT_INC_SAVE = save.h
-INIT_INC = init.h
-INIT_DEPS = $(SRC_DIR)/init.c \
- $(patsubst %,$(INC_DIR)/%,$(INIT_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(INIT_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(INIT_INC_DATA)) \
- $(patsubst %,$(SAVE_INC_DIR)/%,$(INIT_INC_SAVE))
-INIT_INC_DIRS = -I $(INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(SAVE_INC_DIR) \
- -I $(LIBALX_INC_DIR)
-
-# target: dependencies
-# action
-
-all: $(ALL)
-
-
-init.o: $(INIT_DEPS)
- $(Q)$(CC) $(CFLAGS) $(INIT_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-
-clean:
- $(Q)rm -f *.o
diff --git a/modules/gen/src/init.c b/modules/gen/src/init.c
deleted file mode 100644
index 50b1972..0000000
--- a/modules/gen/src/init.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
-
- #include "alx_seed.h"
-
- #include "data.h"
- #include "save.h"
-
- #include "init.h"
-
-
- /*
- * Init:
- */
-/*----------------------------------------------------------------------------*/
-
-static void init_board_adjacent (void);
-
-
-void init_board_rand (int pos_row, int pos_col)
-{
- /* calc number of mines & ensure at least one safe field */
- board.mines = board.p * board.rows * board.cols;
- if (board.mines == board.rows * board.cols) {
- board.mines--;
- }
-
- /* put mines */
- int i;
- int r;
- int c;
- i = 0;
- while (i < board.mines) {
- r = (rand() % board.rows);
- c = (rand() % board.cols);
-
- if ((board.gnd[r][c] == MINE_NO) &&
- /* first step is safe */
- !((r == pos_row) && (c == pos_col))) {
- board.gnd[r][c] = MINE_YES;
- i++;
- }
- }
-
- /* calc adjacency numbers */
- init_board_adjacent();
-}
-
- /*
- * Read from a file.
- */
-void init_board_custom (void)
-{
- /* clear */
- init_board_clr();
-
- load_game_file();
-}
-
-void init_board_clr (void)
-{
- int i;
- int j;
-
- /* clear */
- for (i = 0; i < board.rows; i++) {
- for (j = 0; j < board.cols; j++) {
- board.gnd[i][j] = MINE_NO;
- board.usr[i][j] = USR_HIDDEN;
- }
- }
- board.mines = 0;
- board.flags = 0;
- board.cleared = 0;
- if (flag_s == START_NEW) {
- board.set = false;
- board.state = GAME_READY;
- } else {
- board.set = true;
- board.state = GAME_PLAYING;
- }
- board.time = 0;
- board.clicks = 0;
- highlight = false;
-}
-
-
-static void init_board_adjacent (void)
-{
- int l;
- int i;
- int c;
- int j;
-
- for (l = 0; l < board.rows; l++) {
- for (c = 0; c < board.cols; c++) {
- if (board.gnd[l][c] >= MINE_YES) {
- for (i = l-1; i < l+2; i++) {
- for (j = c-1; j < c+2; j++) {
- if (i >= 0 && i < board.rows &&
- j >= 0 &&
- j < board.cols) {
- board.gnd[i][j]++;
- }
- }
- }
- }
- }
- }
-
- board.flags = 0;
-}
-
-/******************************************************************************
- ******************************************************************************
- **** END OF FILE *************************************************************
- ******************************************************************************
- ******************************************************************************/
-
-/******************************************************************************
- ******************************************************************************
- **** END OF FILE *************************************************************
- ******************************************************************************
- ******************************************************************************/
diff --git a/modules/data/Makefile b/modules/menu/Makefile
index d8a96b4..981afeb 100644
--- a/modules/data/Makefile
+++ b/modules/menu/Makefile
@@ -4,7 +4,7 @@
# directories
-OBJ_DIR = $(DATA_DIR)/obj/
+OBJ_DIR = $(MENU_DIR)/obj/
# target: dependencies
# action
diff --git a/modules/menu/inc/menu_iface.h b/modules/menu/inc/menu_iface.h
new file mode 100644
index 0000000..22a61d0
--- /dev/null
+++ b/modules/menu/inc/menu_iface.h
@@ -0,0 +1,64 @@
+/******************************************************************************
+ * 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 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_board (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
new file mode 100644
index 0000000..c02a183
--- /dev/null
+++ b/modules/menu/inc/menu_tui.h
@@ -0,0 +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 **********************************************************
+ ******************************************************************************/
diff --git a/modules/menu/inc/parser.h b/modules/menu/inc/parser.h
new file mode 100644
index 0000000..d498a6f
--- /dev/null
+++ b/modules/menu/inc/parser.h
@@ -0,0 +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 **********************************************************
+ ******************************************************************************/
diff --git a/modules/menu/obj/Makefile b/modules/menu/obj/Makefile
new file mode 100644
index 0000000..549869d
--- /dev/null
+++ b/modules/menu/obj/Makefile
@@ -0,0 +1,111 @@
+# -*- MakeFile -*-
+
+# MACRO = substitute with this
+
+# directories
+
+LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
+
+ABOUT_INC_DIR = $(ABOUT_DIR)/inc/
+CTRL_INC_DIR = $(CTRL_DIR)/inc/
+GAME_INC_DIR = $(GAME_DIR)/inc/
+PLAY_INC_DIR = $(PLAY_DIR)/inc/
+SAVE_INC_DIR = $(SAVE_DIR)/inc/
+
+INC_DIR = $(MENU_DIR)/inc/
+SRC_DIR = $(MENU_DIR)/src/
+
+# dependencies
+
+_ALL = parser.o menu_iface.o menu_tui.o
+ALL = $(_ALL) menu_mod.o
+
+PARS_INC_LIBALX = alx_seed.h
+PARS_INC_ABOUT = about.h
+PARS_INC_CTRL = start.h
+PARS_INC_GAME = game_iface.h
+PARS_INC_PLAY = player_iface.h
+PARS_INC_SAVE = save.h
+PARS_INC = parser.h menu_iface.h
+PARS_DEPS = $(SRC_DIR)/parser.c \
+ $(patsubst %,$(INC_DIR)/%,$(PARS_INC)) \
+ $(patsubst %,$(LIBALX_INC_DIR)/%,$(PARS_INC_LIBALX)) \
+ $(patsubst %,$(ABOUT_INC_DIR)/%,$(PARS_INC_ABOUT)) \
+ $(patsubst %,$(CTRL_INC_DIR)/%,$(PARS_INC_CTRL)) \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(PARS_INC_GAME)) \
+ $(patsubst %,$(PLAY_INC_DIR)/%,$(PARS_INC_PLAY)) \
+ $(patsubst %,$(SAVE_INC_DIR)/%,$(PARS_INC_SAVE))
+PARS_INC_DIRS = -I $(INC_DIR) \
+ -I $(LIBALX_INC_DIR) \
+ -I $(ABOUT_INC_DIR) \
+ -I $(CTRL_INC_DIR) \
+ -I $(GAME_INC_DIR) \
+ -I $(PLAY_INC_DIR) \
+ -I $(SAVE_INC_DIR)
+
+MENUI_INC_CTRL = start.h
+MENUI_INC = menu_iface.h menu_tui.h #menu_clui.h
+MENUI_DEPS = $(SRC_DIR)/menu_iface.c \
+ $(patsubst %,$(INC_DIR)/%,$(MENUI_INC)) \
+ $(patsubst %,$(CTRL_INC_DIR)/%,$(MENUI_INC_CTRL))
+MENUI_INC_DIRS = -I $(INC_DIR) \
+ -I $(CTRL_INC_DIR)
+
+#MENUCLUI_INC_LIBALX =
+#MENUCLUI_INC_DATA = data.h
+#MENUCLUI_INC = game_clui.h
+#MENUCLUI_DEPS = $(SRC_DIR)/game_clui.c \
+# $(patsubst %,$(INC_DIR)/%,$(MENUCLUI_INC)) \
+# $(patsubst %,$(LIBALX_INC_DIR)/%,$(MENUCLUI_INC_LIBALX)) \
+# $(patsubst %,$(DATA_INC_DIR)/%,$(MENUCLUI_INC_DATA))
+#MENUCLUI_INC_DIRS = -I $(INC_DIR) \
+# -I $(LIBALX_INC_DIR) \
+# -I $(DATA_INC_DIR)
+
+MENUTUI_INC_LIBALX = alx_ncur.h
+MENUTUI_INC_ABOUT = about.h
+MENUTUI_INC_CTRL = start.h
+MENUTUI_INC_SAVE = save.h
+MENUTUI_INC = menu_tui.h menu_iface.h
+MENUTUI_DEPS = $(SRC_DIR)/menu_tui.c \
+ $(patsubst %,$(INC_DIR)/%,$(MENUTUI_INC)) \
+ $(patsubst %,$(LIBALX_INC_DIR)/%,$(MENUTUI_INC_LIBALX)) \
+ $(patsubst %,$(ABOUT_INC_DIR)/%,$(MENUTUI_INC_ABOUT)) \
+ $(patsubst %,$(CTRL_INC_DIR)/%,$(MENUTUI_INC_CTRL)) \
+ $(patsubst %,$(SAVE_INC_DIR)/%,$(MENUTUI_INC_SAVE))
+MENUTUI_INC_DIRS = -I $(INC_DIR) \
+ -I $(LIBALX_INC_DIR) \
+ -I $(ABOUT_INC_DIR) \
+ -I $(CTRL_INC_DIR) \
+ -I $(SAVE_INC_DIR)
+
+# target: dependencies
+# action
+
+all: $(ALL)
+
+
+menu_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
+
+
+parser.o: $(PARS_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(PARS_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+menu_iface.o: $(MENUI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(MENUI_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+menu_tui.o: $(MENUTUI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(MENUTUI_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+
+clean:
+ $(Q)rm -f *.o
diff --git a/modules/menu/src/menu_iface.c b/modules/menu/src/menu_iface.c
new file mode 100644
index 0000000..0c95eb4
--- /dev/null
+++ b/modules/menu/src/menu_iface.c
@@ -0,0 +1,83 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ #include <math.h>
+ #include <stdbool.h>
+
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
+ #include "start.h"
+
+// #include "menu_clui.h"
+ #include "menu_tui.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.rows = 8;
+ menu_iface_variables.cols = 8;
+ menu_iface_variables.p = 0.16;
+}
+
+void menu_iface_board (int *rows, int *cols, int *mines)
+{
+ *rows = menu_iface_variables.rows;
+ *cols = menu_iface_variables.cols;
+
+ /* calc number of mines */
+ *mines = menu_iface_variables.p * (*rows) * (*cols);
+
+ /* at least one safe field */
+ if ((*mines) == (*rows) * (*cols)) {
+ (*mines)--;
+ }
+}
+
+void menu_iface (void)
+{
+ start_mode = START_RAND;
+
+ if (!flag_exit) {
+ switch (menu_iface_mode) {
+ case MENU_IFACE_FOO:
+ break;
+
+ case MENU_IFACE_CLUI:
+ break;
+
+ case MENU_IFACE_TUI:
+ menu_tui();
+ break;
+
+ case MENU_IFACE_GUI:
+ break;
+ }
+ }
+}
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/menu/src/menu_tui.c b/modules/menu/src/menu_tui.c
new file mode 100644
index 0000000..d77f1f6
--- /dev/null
+++ b/modules/menu/src/menu_tui.c
@@ -0,0 +1,363 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* INFINITY */
+ #include <math.h>
+ #include <ncurses.h>
+ #include <stdbool.h>
+ #include <stdlib.h>
+
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
+ #include "alx_ncur.h"
+
+ #include "about.h"
+ #include "save.h"
+ #include "start.h"
+
+ #include "menu_iface.h"
+
+ #include "menu_tui.h"
+
+
+/******************************************************************************
+ ******* macros ***************************************************************
+ ******************************************************************************/
+ # define ROWS_TUI_MAX (22)
+ # define COLS_TUI_MAX (33)
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+static void menu_tui_continue (void);
+static void menu_tui_select (void);
+static void menu_tui_difficulty (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_optn 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_disclaim();
+ getchar();
+ alx_resume_curses();
+ break;
+
+ case 3:
+ alx_pause_curses();
+ print_license();
+ getchar();
+ alx_resume_curses();
+ break;
+ }
+ }
+
+ alx_pause_curses();
+}
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+static void menu_tui_continue (void)
+{
+ /* Menu dimensions & options */
+ WINDOW *win;
+ int h;
+ int w;
+ int r;
+ int c;
+ h = 17;
+ w = 50;
+ r = 1;
+ c = (80 - w) / 2;
+ int N;
+ N = 6;
+ struct alx_optn mnu[6] = {
+ {10, 4, "[0] Back"},
+ {2, 4, "[1] Start"},
+ {4, 4, "[2] Select map"},
+ {5, 4, "[3] Change difficulty"},
+ {6, 4, "[4] Change file name"},
+ {8, 4, "[5] 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_difficulty();
+ break;
+
+ case 4:
+ alx_w_getfname(USER_SAVED_DIR, saved_name, w2, r2,
+ txt[0], saved_name, NULL);
+ alx_win_del(win);
+ break;
+
+ case 5:
+ 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_optn 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_difficulty (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_optn 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, "Difficulty:");
+
+ 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_optn 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 **********************************************************
+ ******************************************************************************/
diff --git a/modules/ui/src/parser.c b/modules/menu/src/parser.c
index cc630b6..aecd766 100644
--- a/modules/ui/src/parser.c
+++ b/modules/menu/src/parser.c
@@ -2,21 +2,42 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
#include "alx_seed.h"
#include "about.h"
- #include "data.h"
+ #include "game_iface.h"
+ #include "player_iface.h"
+ #include "save.h"
+ #include "start.h"
+
+ #include "menu_iface.h"
#include "parser.h"
/******************************************************************************
- ******* static ***************************************************************
+ ******* 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);
@@ -32,18 +53,15 @@ static void parse_start (char* argument);
******************************************************************************/
void parser (int argc, char *argv[])
{
- strcpy(prog_name, argv[0]);
-
- int opt = 0;
- int opt_index = 0;
+ int opt = 0;
+ int opt_index = 0;
- struct option long_options[] = {
+ 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'},
- {"verbose", required_argument, 0, 'V'},
{"version", no_argument, 0, 'v'},
/* Non-standard */
{"rows", required_argument, 0, 'a'},
@@ -58,11 +76,12 @@ void parser (int argc, char *argv[])
};
while ((opt = getopt_long(argc, argv, OPT_LIST, long_options,
- &opt_index )) != -1) {
+ &opt_index)) != -1) {
+
switch (opt) {
/* Standard */
case 'x':
- flag_exit = true;
+ flag_exit = true;
break;
case 'h':
@@ -75,18 +94,7 @@ void parser (int argc, char *argv[])
case 'u':
print_usage();
- exit(EXIT_FAILURE);
-
- case 'V':
-/*
- flag_V = atoi(optarg);
- if (flag_V < 0 || flag_V > 4) {
- printf("--Verbose argument not valid\n");
- printf("It must be an integer [0 U 4]\n");
- exit(EXIT_FAILURE);
- }
-*/
- break;
+ exit(EXIT_SUCCESS);
case 'v':
print_version();
@@ -133,12 +141,12 @@ void parser (int argc, char *argv[])
/******************************************************************************
- ******* static ***************************************************************
+ ******* static functions *****************************************************
******************************************************************************/
static void parse_rows (char* argument)
{
- board.rows = atoi(argument);
- if (board.rows < 2 || board.rows > ROWS_MAX) {
+ 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);
@@ -147,8 +155,8 @@ static void parse_rows (char* argument)
static void parse_columns (char* argument)
{
- board.cols = atoi(argument);
- if (board.cols < 2 || board.cols > COLS_MAX) {
+ 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);
@@ -157,8 +165,9 @@ static void parse_columns (char* argument)
static void parse_file (char* argument)
{
+ // FIXME
FILE *fp;
- fp = fopen(argument, "r");
+ 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");
@@ -172,18 +181,19 @@ static void parse_file (char* argument)
static void parse_iface (char* argument)
{
- flag_iface = atoi(argument);
- if (flag_iface < IFACE_CLUI || flag_iface > IFACE_TUI) {
+ menu_iface_mode = atoi(argument);
+ player_iface_mode = menu_iface_mode;
+ if (menu_iface_mode < MENU_IFACE_CLUI || menu_iface_mode > MENU_IFACE_TUI) {
printf("--iface argument not valid\n");
- printf("It must be an integer [%i U %i]\n", IFACE_CLUI, IFACE_TUI);
+ printf("It must be an integer [%i U %i]\n", MENU_IFACE_CLUI, MENU_IFACE_TUI);
exit(EXIT_FAILURE);
}
}
static void parse_proportion (char* argument)
{
- board.p = atof(argument);
- if (board.p < 0 || board.p > 1) {
+ 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);
@@ -192,16 +202,22 @@ static void parse_proportion (char* argument)
static void parse_rand_seed (char* argument)
{
- seed = atof(argument);
+ int seed;
+ seed = atof(argument);
srand(seed);
}
static void parse_start (char* argument)
{
- flag_s = atoi(argument);
- if (flag_s < 0 || flag_s > 10) {
+ 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/gen/Makefile b/modules/player/Makefile
index 057c62b..eb84b96 100644
--- a/modules/gen/Makefile
+++ b/modules/player/Makefile
@@ -4,7 +4,7 @@
# directories
-OBJ_DIR = $(GEN_DIR)/obj/
+OBJ_DIR = $(PLAY_DIR)/obj/
# target: dependencies
# action
diff --git a/modules/player/inc/player_clui.h b/modules/player/inc/player_clui.h
new file mode 100644
index 0000000..f8509f6
--- /dev/null
+++ b/modules/player/inc/player_clui.h
@@ -0,0 +1,70 @@
+/******************************************************************************
+ * 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_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);
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# endif /* player_clui.h */
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/player/inc/player_iface.h b/modules/player/inc/player_iface.h
new file mode 100644
index 0000000..f5e4ae6
--- /dev/null
+++ b/modules/player/inc/player_iface.h
@@ -0,0 +1,91 @@
+/******************************************************************************
+ * 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);
+void 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_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
new file mode 100644
index 0000000..d5ede3c
--- /dev/null
+++ b/modules/player/inc/player_tui.h
@@ -0,0 +1,117 @@
+/******************************************************************************
+ * 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_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_cleanup (void);
+
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# endif /* player_tui.h */
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/player/obj/Makefile b/modules/player/obj/Makefile
new file mode 100644
index 0000000..4cef87b
--- /dev/null
+++ b/modules/player/obj/Makefile
@@ -0,0 +1,75 @@
+# -*- MakeFile -*-
+
+# MACRO = substitute with this
+
+# directories
+
+LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
+
+GAME_INC_DIR = $(GAME_DIR)/inc/
+
+INC_DIR = $(PLAY_DIR)/inc/
+SRC_DIR = $(PLAY_DIR)/src/
+
+# dependencies
+
+_ALL = player_iface.o player_clui.o player_tui.o
+ALL = $(_ALL) player_mod.o
+
+PLAYI_INC_GAME = game_iface.h
+PLAYI_INC = player_iface.h player_clui.h player_tui.h
+PLAYI_DEPS = $(SRC_DIR)/player_iface.c \
+ $(patsubst %,$(INC_DIR)/%,$(PLAYI_INC)) \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(PLAYI_INC_GAME))
+PLAYI_INC_DIRS = -I $(INC_DIR) \
+ -I $(GAME_INC_DIR)
+
+PLAYCLUI_INC_GAME = game_iface.h
+PLAYCLUI_INC = player_clui.h player_iface.h
+PLAYCLUI_DEPS = $(SRC_DIR)/player_clui.c \
+ $(patsubst %,$(INC_DIR)/%,$(PLAYCLUI_INC)) \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(PLAYCLUI_INC_GAME))
+PLAYCLUI_INC_DIRS = -I $(INC_DIR) \
+ -I $(GAME_INC_DIR)
+
+PLAYTUI_INC_LIBALX = alx_ncur.h
+PLAYTUI_INC_GAME = game_iface.h
+PLAYTUI_INC = player_tui.h player_iface.h
+PLAYTUI_DEPS = $(SRC_DIR)/player_tui.c \
+ $(patsubst %,$(INC_DIR)/%,$(PLAYTUI_INC)) \
+ $(patsubst %,$(LIBALX_INC_DIR)/%,$(PLAYTUI_INC_LIBALX)) \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(PLAYCLUI_INC_GAME))
+PLAYTUI_INC_DIRS = -I $(INC_DIR) \
+ -I $(LIBALX_INC_DIR) \
+ -I $(GAME_INC_DIR)
+
+# target: dependencies
+# action
+
+all: $(ALL)
+
+
+player_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
+
+
+player_iface.o: $(PLAYI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(PLAYI_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+player_clui.o: $(PLAYCLUI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(PLAYCLUI_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+player_tui.o: $(PLAYTUI_DEPS)
+ $(Q)$(CC) $(CFLAGS) $(PLAYTUI_INC_DIRS) -c $< -o $@ $(LIBS)
+ @echo "\tCC $<"
+ @echo ""
+
+
+clean:
+ $(Q)rm -f *.o
diff --git a/modules/player/src/player_clui.c b/modules/player/src/player_clui.c
new file mode 100644
index 0000000..b195d12
--- /dev/null
+++ b/modules/player/src/player_clui.c
@@ -0,0 +1,616 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ #include <stdbool.h>
+ /* sprintf() */
+ #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"
+
+
+/******************************************************************************
+ ******* 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_end (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;
+}
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Start * * * * * * *
+ * * * * * * * * * */
+static void show_board_start(const struct Player_Iface_Position *position,
+ const char *title,
+ const char *subtitle)
+{
+ /* Title */
+ puts("________________________________________________________________________________");
+ puts(title);
+
+ /* Board */
+ board_loop_start(position);
+
+ /* Subtitle */
+ puts(subtitle);
+ 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)
+{
+ /* Title */
+ puts("________________________________________________________________________________");
+ puts(title);
+
+ /* Board */
+ board_loop(board, position);
+
+ /* Subtitle */
+ puts(subtitle);
+ 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;
+ }
+
+ return ch;
+}
+
+/* * * * * * * * * *
+ * * * Input * * * * * * *
+ * * * * * * * * * */
+static int usr_input (void)
+{
+ wchar_t ch;
+ ch = getchar();
+
+ int action;
+
+ switch (ch) {
+ /* Escape sequence */
+ case 27:
+ /* Arrows ¿? */
+ ch = getchar();
+ switch (ch) {
+ case 91:
+ ch = getchar();
+ 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" */
+ ch = getchar();
+ if (ch == 'y') {
+ ch = getchar();
+ if (ch == 'z') {
+ ch = getchar();
+ if (ch == 'z') {
+ ch = getchar();
+ 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;
+
+ default:
+ action = PLAYER_IFACE_ACT_FOO;
+ 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:
+ case GAME_IFACE_STATE_GAMEOVER:
+ show_help_end();
+ break;
+ }
+}
+
+static void show_help_start (void)
+{
+ puts("Move:");
+ /* hjkl */
+ printf(" %c", 'h');
+ printf(" %c", 'j');
+ printf(" %c", 'k');
+ printf(" %c", 'l');
+ putchar('\n');
+ /* Arrows */
+ printf(" %c", '<');
+ printf(" %c", 'v');
+ printf(" %c", '^');
+ printf(" %c", '>');
+ putchar('\n');
+
+ puts("Step:");
+ printf(" %c\n", '+');
+
+ puts("Save:");
+ printf(" %c\n", 's');
+
+ puts("Quit:");
+ printf(" %c\n", 'q');
+
+ puts("Confirm:");
+ printf(" Enter\n");
+}
+
+static void show_help_play (void)
+{
+ puts("Move:");
+ /* hjkl */
+ printf(" %c", 'h');
+ printf(" %c", 'j');
+ printf(" %c", 'k');
+ printf(" %c", 'l');
+ putchar('\n');
+ /* Arrows */
+ printf(" %c", '<');
+ printf(" %c", 'v');
+ printf(" %c", '^');
+ printf(" %c", '>');
+ putchar('\n');
+
+ puts("Step:");
+ printf(" %c\n", '+');
+
+ puts("Flag:");
+ printf(" Space\n");
+
+ puts("Possible:");
+ printf(" %c\n", 'f');
+
+ puts("rm flag:");
+ printf(" Backspace\n");
+
+ puts("Pause:");
+ printf(" %c\n", 'p');
+
+ puts("Save:");
+ printf(" %c\n", 's');
+
+ puts("Quit:");
+ printf(" %c\n", 'q');
+
+ puts("Confirm:");
+ printf(" Enter\n");
+}
+
+static void show_help_pause (void)
+{
+
+ puts("Continue:");
+ printf(" %c\n", 'p');
+
+ puts("Save:");
+ printf(" %c\n", 's');
+
+ puts("Quit:");
+ printf(" %c\n", 'q');
+
+ puts("Confirm:");
+ printf(" Enter\n");
+}
+
+static void show_help_xyzzy (void)
+{
+ puts("XYZZY:");
+ printf(" %c", '1');
+ printf(" %c", '2');
+ putchar('\n');
+
+ puts("XYZZY off:");
+ printf(" %c\n", '0');
+
+ puts("Move:");
+ /* hjkl */
+ printf(" %c", 'h');
+ printf(" %c", 'j');
+ printf(" %c", 'k');
+ printf(" %c", 'l');
+ putchar('\n');
+ /* Arrows */
+ printf(" %c", '<');
+ printf(" %c", 'v');
+ printf(" %c", '^');
+ printf(" %c", '>');
+ putchar('\n');
+
+ puts("Step:");
+ printf(" %c\n", '+');
+
+ puts("Flag:");
+ printf(" Space\n");
+
+ puts("Possible:");
+ printf(" %c\n", 'f');
+
+ puts("rm flag:");
+ printf(" Backspace\n");
+
+ puts("Save:");
+ printf(" %c\n", 's');
+
+ puts("Quit:");
+ printf(" %c\n", 'q');
+
+ puts("Confirm:");
+ printf(" Enter\n");
+}
+
+static void show_help_cheat (void)
+{
+ puts("Move:");
+ /* hjkl */
+ printf(" %c", 'h');
+ printf(" %c", 'j');
+ printf(" %c", 'k');
+ printf(" %c", 'l');
+ putchar('\n');
+ /* Arrows */
+ printf(" %c", '<');
+ printf(" %c", 'v');
+ printf(" %c", '^');
+ printf(" %c", '>');
+ putchar('\n');
+
+ puts("Step:");
+ printf(" %c\n", '+');
+
+ puts("Flag:");
+ printf(" Space\n");
+
+ puts("Possible:");
+ printf(" %c\n", 'f');
+
+ puts("rm flag:");
+ printf(" Backspace\n");
+
+ puts("Save:");
+ printf(" %c\n", 's');
+
+ puts("Quit:");
+ printf(" %c\n", 'q');
+
+ puts("Confirm:");
+ printf(" Enter\n");
+}
+
+static void show_help_end (void)
+{
+ puts("Quit:");
+ printf(" %c\n", 'q');
+
+ puts("Confirm:");
+ printf(" Enter\n");
+}
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/player/src/player_iface.c b/modules/player/src/player_iface.c
new file mode 100644
index 0000000..a9a498c
--- /dev/null
+++ b/modules/player/src/player_iface.c
@@ -0,0 +1,391 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* sprintf() */
+ #include <stdio.h>
+
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
+ /* struct Game_Iface_... */
+ #include "game_iface.h"
+
+ /* game_tui() */
+ #include "player_clui.h"
+ /* game_tui() */
+ #include "player_tui.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 functions *****************************************************
+ ******************************************************************************/
+ /* Actions */
+static void player_iface_act (struct Game_Iface_In *game_iface_in,
+ int action);
+
+ /* Actions: game iface */
+static void player_iface_act_start (int action);
+
+static void player_iface_act_play (struct Game_Iface_In *game_iface_in,
+ int action);
+static void player_iface_act_game (struct Game_Iface_In *game_iface_in,
+ int action);
+
+ /* 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;
+ }
+}
+
+void player_iface_start (int *pos_row, int *pos_col)
+{
+ /* Title */
+ char title[TITLE_SIZE];
+ sprintf(title, "Start:");
+ /* Subtitle */
+ char subtitle[TITLE_SIZE];
+ sprintf(subtitle, "00:00 | 0");
+
+ /* Start position */
+ player_iface_position.row = 0;
+ player_iface_position.col = 0;
+ player_iface_position.highlight = false;
+
+ /* Loop until first step */
+ int player_action;
+ 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;
+ }
+
+ player_iface_act_start(player_action);
+ } while (player_action != PLAYER_IFACE_ACT_STEP);
+
+ *pos_row = player_iface_position.row;
+ *pos_col = player_iface_position.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)
+{
+ /* 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:
+ sprintf(title, "Mines: %i/%i", game_iface_out->flags, game_iface_out->mines);
+ break;
+
+ case GAME_IFACE_STATE_GAMEOVER:
+ sprintf(title, "GAME OVER");
+ break;
+
+ case GAME_IFACE_STATE_SAFE:
+ sprintf(title, "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) {
+ sprintf(subtitle, "%02i:%02i:%02i | %i", hours, mins, secs, game_iface_score->clicks);
+ } else {
+ sprintf(subtitle, "%02i:%02i | %i", mins, secs, game_iface_score->clicks);
+ }
+ } else {
+ sprintf(subtitle, "N/A");
+ }
+
+ /* Request player action */
+ int 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;
+ }
+
+ player_iface_act(game_iface_in, player_action);
+}
+
+void player_iface_cleanup (void)
+{
+ switch (player_iface_mode) {
+ case PLAYER_IFACE_CLUI:
+ break;
+
+ case PLAYER_IFACE_TUI:
+ player_tui_cleanup();
+ break;
+ }
+}
+
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Actions * * * * * *
+ * * * * * * * * * */
+static void player_iface_act (struct Game_Iface_In *game_iface_in,
+ int player_action)
+{
+ 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, player_action);
+ 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, player_action);
+ 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 (int player_action)
+{
+ switch (player_action) {
+ case PLAYER_IFACE_ACT_STEP:
+ 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,
+ int player_action)
+{
+ 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,
+ int player_action)
+{
+ 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 **********************************************************
+ ******************************************************************************/
diff --git a/modules/player/src/player_tui.c b/modules/player/src/player_tui.c
new file mode 100644
index 0000000..fead461
--- /dev/null
+++ b/modules/player/src/player_tui.c
@@ -0,0 +1,912 @@
+/******************************************************************************
+ * Copyright (C) 2015 Alejandro Colomar Andrés *
+ ******************************************************************************/
+
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* WINDOW & wgetch() & KEY_... & ... */
+ #include <ncursesw/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"
+
+
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Global * * * * * *
+ * * * * * * * * * */
+bool flag_color;
+
+/* * * * * * * * * *
+ * * * Static * * * * * *
+ * * * * * * * * * */
+static WINDOW *win_board;
+static WINDOW *win_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_end (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 = 100 ms */
+ keypad(win_board, true);
+ noecho();
+ wtimeout(win_board, 100);
+}
+
+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();
+}
+
+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();
+}
+
+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;
+ }
+
+ 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, 100);
+ 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)
+{
+ /* 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:
+ case GAME_IFACE_STATE_GAMEOVER:
+ show_help_end();
+ break;
+ }
+
+ /* Refresh */
+ wrefresh(win_help);
+}
+
+static void show_help_start (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, "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_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_end (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/prnt/Makefile b/modules/prnt/Makefile
deleted file mode 100644
index 95b807e..0000000
--- a/modules/prnt/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- MakeFile -*-
-
-# MACRO = substitute with this
-
-# directories
-
-OBJ_DIR = $(PRNT_DIR)/obj/
-
-# target: dependencies
-# action
-
-all:
- $(Q)cd $(OBJ_DIR) && $(MAKE) && cd ..
-
-clean:
- $(Q)cd $(OBJ_DIR) && $(MAKE) clean && cd ..
-
-################################################################################
-######## End of file ###########################################################
-################################################################################
-######## End of file ###########################################################
-################################################################################
-######## End of file ###########################################################
-################################################################################
diff --git a/modules/prnt/inc/about.h b/modules/prnt/inc/about.h
deleted file mode 100644
index 8301a97..0000000
--- a/modules/prnt/inc/about.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_ABOUT_H
- # define MSW_ABOUT_H
-
-void print_cpright (void);
-void print_disclaim (void);
-void print_help (void);
-void print_license (void);
-void print_usage (void);
-void print_version (void);
-
-# endif /* about.h */
diff --git a/modules/prnt/inc/print.h b/modules/prnt/inc/print.h
deleted file mode 100644
index fef8b4b..0000000
--- a/modules/prnt/inc/print.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_PRINT_H
- # define MSW_PRINT_H
-
-void print_verbose (int verbose, void *print_func, int arg);
-
-# endif /* print.h */
diff --git a/modules/prnt/obj/Makefile b/modules/prnt/obj/Makefile
deleted file mode 100644
index 7c10fd6..0000000
--- a/modules/prnt/obj/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- MakeFile -*-
-
-# MACRO = substitute with this
-
-# directories
-
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-
-DATA_INC_DIR = $(DATA_DIR)/inc/
-
-INC_DIR = $(PRNT_DIR)/inc/
-SRC_DIR = $(PRNT_DIR)/src/
-
-# dependencies
-
-ALL = about.o print.o
-
-ABOU_INC_LIBALX = alx_file.h
-ABOU_INC_DATA = data.h
-ABOU_INC = about.h
-ABOU_DEPS = $(SRC_DIR)/about.c \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(ABOU_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(ABOU_INC_DATA)) \
- $(patsubst %,$(INC_DIR)/%,$(ABOU_INC))
-ABOU_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR) \
- -I $(DATA_INC_DIR)
-
-PRNT_INC_LIBALX =
-PRNT_INC_DATA = data.h
-PRNT_INC = print.h
-PRNT_DEPS = $(SRC_DIR)/print.c \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(PRNT_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(PRNT_INC_DATA)) \
- $(patsubst %,$(INC_DIR)/%,$(PRNT_INC))
-PRNT_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR) \
- -I $(DATA_INC_DIR)
-
-# target: dependencies
-# action
-
-all: $(ALL)
-
-
-about.o: $(ABOU_DEPS)
- $(Q)$(CC) $(CFLAGS) $(ABOU_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-print.o: $(PRNT_DEPS)
- $(Q)$(CC) $(CFLAGS) $(PRNT_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-
-clean:
- $(Q)rm -f *.o
diff --git a/modules/prnt/src/print.c b/modules/prnt/src/print.c
deleted file mode 100644
index 4669705..0000000
--- a/modules/prnt/src/print.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- /* flag_V */
- #include "data.h"
-
- #include "print.h"
-
-
-
-void print_time (void)
-{
-}
-
-void print_verbose (int verbose, void *print_func, int arg)
-{
-
- if (arg != -1) {
- if (flag_V >= verbose) {
- (*(void (*)(bool)) print_func)(arg);
- }
- } else {
- if (flag_V >= verbose) {
- (*(void (*)()) print_func)();
- }
- }
-}
-
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
diff --git a/modules/save/inc/save.h b/modules/save/inc/save.h
index 6ef8d16..f4689e1 100644
--- a/modules/save/inc/save.h
+++ b/modules/save/inc/save.h
@@ -2,11 +2,58 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
-# ifndef MSW_SAVE_H
- # define MSW_SAVE_H
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
+# ifndef MSW_SAVE_H
+ # define MSW_SAVE_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 USER_GAME_DIR ".mine_sweeper/"
+ # define USER_SAVED_DIR ".mine_sweeper/saved/"
+ # define SAVED_NAME_DEFAULT "saved_000.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 load_game_file (void);
void save_game_file (void);
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
# endif /* save.h */
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/modules/save/obj/Makefile b/modules/save/obj/Makefile
index 173a2c3..bdcd284 100644
--- a/modules/save/obj/Makefile
+++ b/modules/save/obj/Makefile
@@ -4,32 +4,34 @@
# directories
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-
-DATA_INC_DIR = $(DATA_DIR)/inc/
+GAME_INC_DIR = $(GAME_DIR)/inc/
INC_DIR = $(SAVE_DIR)/inc/
SRC_DIR = $(SAVE_DIR)/src/
# dependencies
-ALL = save.o
+_ALL = save.o
+ALL = $(_ALL) save_mod.o
-SAVE_INC_LIBALX =
-SAVE_INC_DATA = data.h
+SAVE_INC_GAME = game.h
SAVE_INC = save.h
SAVE_DEPS = $(SRC_DIR)/save.c \
$(patsubst %,$(INC_DIR)/%,$(SAVE_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(SAVE_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(SAVE_INC_DATA))
+ $(patsubst %,$(GAME_INC_DIR)/%,$(SAVE_INC_GAME))
SAVE_INC_DIRS = -I $(INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(LIBALX_INC_DIR)
+ -I $(GAME_INC_DIR)
# target: dependencies
# action
all: $(ALL)
+
+
+save_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
save.o: $(SAVE_DEPS)
diff --git a/modules/save/src/save.c b/modules/save/src/save.c
index ba83815..e72e3da 100644
--- a/modules/save/src/save.c
+++ b/modules/save/src/save.c
@@ -2,74 +2,144 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* errno */
#include <errno.h>
+ /* bool */
+ #include <stdbool.h>
/* fscanf() & fprintf() & FILE & FILENAME_MAX */
#include <stdio.h>
+ /* getenv() */
+ #include <stdlib.h>
/* strcpy() & strcat() */
#include <string.h>
+ /* mkdir */
+ #include <sys/stat.h>
- #include "data.h"
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
+ /* struct Game_Board */
+ #include "game.h"
#include "save.h"
-static FILE *fp;
+/******************************************************************************
+ ******* variables ************************************************************
+ ******************************************************************************/
+char home_path [FILENAME_MAX];
+char user_game_path [FILENAME_MAX];
+char saved_path [FILENAME_MAX];
+char saved_name [FILENAME_MAX];
-/*----------------------------------------------------------------------------*/
- /*
- * Load from a file.
- */
+/******************************************************************************
+ ******* main *****************************************************************
+ ******************************************************************************/
+void save_init (void)
+{
+ strcpy(home_path, getenv(ENV_HOME));
+
+ strcpy(user_game_path, home_path);
+ strcat(user_game_path, "/");
+ strcat(user_game_path, USER_GAME_DIR);
+ strcat(user_game_path, "/");
+
+ strcpy(saved_path, home_path);
+ strcat(saved_path, "/");
+ strcat(saved_path, USER_SAVED_DIR);
+ strcat(saved_path, "/");
+
+ strcpy(saved_name, SAVED_NAME_DEFAULT);
+
+ 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 load_game_file (void)
{
+ char file_name [FILENAME_MAX];
+ FILE *fp;
+
int i;
int j;
- char file_name [FILENAME_MAX];
strcpy(file_name, saved_path);
strcat(file_name, saved_name);
- fp = fopen(file_name, "r");
+ fp = fopen(file_name, "r");
if (fp) {
fscanf(fp, "mine_sweeper saved game");
- fscanf(fp, " rows %i", &board.rows);
- fscanf(fp, " cols %i", &board.cols);
- fscanf(fp, " mines %i", &board.mines);
+ 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 < board.rows; i++) {
- fscanf(fp, " %i", &board.gnd[i][0]);
- for (j = 1; j < board.cols; j++) {
- fscanf(fp, ",%i", &board.gnd[i][j]);
+ 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 < board.rows; i++) {
- fscanf(fp, " %i", &board.usr[i][0]);
- for (j = 1; j < board.cols; j++) {
- fscanf(fp, ",%i", &board.usr[i][j]);
+ 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", &board.flags);
- fscanf(fp, " cleared %i", &board.cleared);
+ fscanf(fp, " flags %i", &game_board.flags);
+ fscanf(fp, " cleared %i", &game_board.clr);
fclose(fp);
-
- board.time = CHEATED;
- board.clicks = CHEATED;
- board.state = GAME_CHEATED;
}
}
- /*
- * Save into a file.
- */
void save_game_file (void)
{
- /* Look for an unused name of the type 'saved_XXX.mine'. */
char file_name [FILENAME_MAX];
+ FILE *fp;
+
int i;
+ int j;
bool x;
- x = true;
+
+ /* Look for an unused name of the type 'saved_XXX.mine'. */
+ x = true;
strcpy(saved_name, SAVED_NAME_DEFAULT);
for (i = 0; x; i++) {
strcpy(file_name, saved_path);
@@ -82,49 +152,41 @@ void save_game_file (void)
saved_name[7] = '0' + ((i / 10) % 10);
saved_name[8] = '0' + (i % 10);
} else {
- x = false;
+ x = false;
}
}
/* Write to a new file */
- int j;
- fp = fopen(file_name, "w");
+ fp = fopen(file_name, "w");
if (fp) {
fprintf(fp, "mine_sweeper saved game\n");
- fprintf(fp, "rows %i\n", board.rows);
- fprintf(fp, "cols %i\n", board.cols);
- fprintf(fp, "mines %i\n", board.mines);
+ 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 < board.rows; i++) {
- fprintf(fp, "%i", board.gnd[i][0]);
- for (j = 1; j < board.cols; j++) {
- fprintf(fp, ",%i", board.gnd[i][j]);
+ 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 < board.rows; i++) {
- fprintf(fp, "%i", board.usr[i][0]);
- for (j = 1; j < board.cols; j++) {
- fprintf(fp, ",%i", board.usr[i][j]);
+ 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", board.flags);
- fprintf(fp, "cleared %i\n", board.cleared);
+ fprintf(fp, "flags %i\n", game_board.flags);
+ fprintf(fp, "cleared %i\n", game_board.clr);
fclose(fp);
}
}
-/******************************************************************************
- ******************************************************************************
- **** END OF FILE *************************************************************
- ******************************************************************************
- ******************************************************************************/
/******************************************************************************
- ******************************************************************************
- **** END OF FILE *************************************************************
- ******************************************************************************
+ ******* end of file **********************************************************
******************************************************************************/
diff --git a/modules/ui/inc/clui.h b/modules/ui/inc/clui.h
deleted file mode 100644
index 5014bec..0000000
--- a/modules/ui/inc/clui.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_CLUI_H
- # define MSW_CLUI_H
-
-
-void parser (int argc, char *argv[]);
-
-# endif /* clui.h */
diff --git a/modules/ui/inc/game_clui.h b/modules/ui/inc/game_clui.h
deleted file mode 100644
index f5730d0..0000000
--- a/modules/ui/inc/game_clui.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_GAME_CLUI_H
- # define MSW_GAME_CLUI_H
-
-
-int game_clui (int oldaction, int pos_row, int pos_col);
-
-# endif /* game_tui.h */
diff --git a/modules/ui/inc/game_iface.h b/modules/ui/inc/game_iface.h
deleted file mode 100644
index 0a6faf5..0000000
--- a/modules/ui/inc/game_iface.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_GAME_IFACE_H
- # define MSW_GAME_IFACE_H
-
-
-void game_iface (void);
-
-# endif /* game_iface.h */
diff --git a/modules/ui/inc/game_tui.h b/modules/ui/inc/game_tui.h
deleted file mode 100644
index b52dece..0000000
--- a/modules/ui/inc/game_tui.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_GAME_TUI_H
- # define MSW_GAME_TUI_H
-
-
-void game_tui_init (void);
-int game_tui (int pos_row, int pos_col);
-void game_tui_cleanup (void);
-
-# endif /* game_tui.h */
diff --git a/modules/ui/inc/game_ui.h b/modules/ui/inc/game_ui.h
deleted file mode 100644
index 7f89638..0000000
--- a/modules/ui/inc/game_ui.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_GAME_UI_H
- # define MSW_GAME_UI_H
-
-
-void game_ui (void);
-
-# endif /* game_ui.h */
diff --git a/modules/ui/inc/parser.h b/modules/ui/inc/parser.h
deleted file mode 100644
index ec20084..0000000
--- a/modules/ui/inc/parser.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_PARSER_H
- # define MSW_PARSER_H
-
-
-void parser (int argc, char *argv[]);
-
-# endif /* parser.h */
diff --git a/modules/ui/inc/tui.h b/modules/ui/inc/tui.h
deleted file mode 100644
index 082ec33..0000000
--- a/modules/ui/inc/tui.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-# ifndef MSW_TUI_H
- # define MSW_TUI_H
-
-
-void menu_main (void);
-
-# endif /* tui.h */
diff --git a/modules/ui/obj/Makefile b/modules/ui/obj/Makefile
deleted file mode 100644
index b259d48..0000000
--- a/modules/ui/obj/Makefile
+++ /dev/null
@@ -1,136 +0,0 @@
-# -*- MakeFile -*-
-
-# MACRO = substitute with this
-
-# directories
-
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-
-CTRL_INC_DIR = $(CTRL_DIR)/inc/
-DATA_INC_DIR = $(DATA_DIR)/inc/
-GAME_INC_DIR = $(GAME_DIR)/inc/
-GEN_INC_DIR = $(GEN_DIR)/inc/
-PRNT_INC_DIR = $(PRNT_DIR)/inc/
-SAVE_INC_DIR = $(SAVE_DIR)/inc/
-XYZZY_INC_DIR = $(XYZZY_DIR)/inc/
-
-INC_DIR = $(UI_DIR)/inc/
-SRC_DIR = $(UI_DIR)/src/
-
-# dependencies
-
-ALL = parser.o game_iface.o game_clui.o game_tui.o tui.o
-
-PARS_INC_LIBALX = alx_seed.h
-PARS_INC_CTRL = start.h
-PARS_INC_DATA = data.h
-PARS_INC_PRNT = about.h
-PARS_INC = parser.h
-PARS_DEPS = $(SRC_DIR)/parser.c \
- $(patsubst %,$(INC_DIR)/%,$(PARS_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(PARS_INC_LIBALX)) \
- $(patsubst %,$(CTRL_INC_DIR)/%,$(PARS_INC_CTRL)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(PARS_INC_DATA)) \
- $(patsubst %,$(PRNT_INC_DIR)/%,$(PARS_INC_PRNT))
-PARS_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR) \
- -I $(CTRL_INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(PRNT_INC_DIR)
-
-GAMEI_INC_LIBALX =
-GAMEI_INC_DATA = data.h
-GAMEI_INC_GAME = game.h
-GAMEI_INC_GEN = init.h
-GAMEI_INC_SAVE = save.h
-GAMEI_INC_XYZZY = xyzzy.h
-GAMEI_INC = game_iface.h game_clui.h game_tui.h
-GAMEI_DEPS = $(SRC_DIR)/game_iface.c \
- $(patsubst %,$(INC_DIR)/%,$(GAMEI_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(GAMEI_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(GAMEI_INC_DATA)) \
- $(patsubst %,$(GAME_INC_DIR)/%,$(GAMEI_INC_GAME)) \
- $(patsubst %,$(GEN_INC_DIR)/%,$(GAMEI_INC_GEN)) \
- $(patsubst %,$(SAVE_INC_DIR)/%,$(GAMEI_INC_SAVE)) \
- $(patsubst %,$(XYZZY_INC_DIR)/%,$(GAMEI_INC_XYZZY))
-GAMEI_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(GAME_INC_DIR) \
- -I $(GEN_INC_DIR) \
- -I $(SAVE_INC_DIR) \
- -I $(XYZZY_INC_DIR)
-
-GAMECLUI_INC_LIBALX =
-GAMECLUI_INC_DATA = data.h
-GAMECLUI_INC = game_clui.h
-GAMECLUI_DEPS = $(SRC_DIR)/game_clui.c \
- $(patsubst %,$(INC_DIR)/%,$(GAMECLUI_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(GAMECLUI_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(GAMECLUI_INC_DATA))
-GAMECLUI_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR) \
- -I $(DATA_INC_DIR)
-
-GAMETUI_INC_LIBALX = alx_ncur.h
-GAMETUI_INC_DATA = data.h
-GAMETUI_INC = game_tui.h
-GAMETUI_DEPS = $(SRC_DIR)/game_tui.c \
- $(patsubst %,$(INC_DIR)/%,$(GAMETUI_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(GAMETUI_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(GAMETUI_INC_DATA))
-GAMETUI_INC_DIRS = -I $(INC_DIR) \
- -I $(LIBALX_INC_DIR) \
- -I $(DATA_INC_DIR)
-
-TUI_INC_LIBALX = alx_ncur.h
-TUI_INC_CTRL = start.h
-TUI_INC_DATA = data.h
-TUI_INC_PRNT = about.h
-TUI_INC = tui.h
-TUI_DEPS = $(SRC_DIR)/tui.c \
- $(patsubst %,$(INC_DIR)/%,$(TUI_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(TUI_INC_LIBALX)) \
- $(patsubst %,$(CTRL_INC_DIR)/%,$(TUI_INC_CTRL)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(TUI_INC_DATA)) \
- $(patsubst %,$(PRNT_INC_DIR)/%,$(TUI_INC_PRNT))
-TUI_INC_DIRS = -I $(INC_DIR) \
- -I $(CTRL_INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(PRNT_INC_DIR) \
- -I $(LIBALX_INC_DIR)
-
-# target: dependencies
-# action
-
-all: $(ALL)
-
-
-parser.o: $(PARS_DEPS)
- $(Q)$(CC) $(CFLAGS) $(PARS_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-game_iface.o: $(GAMEI_DEPS)
- $(Q)$(CC) $(CFLAGS) $(GAMEI_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-game_clui.o: $(GAMECLUI_DEPS)
- $(Q)$(CC) $(CFLAGS) $(GAMECLUI_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-game_tui.o: $(GAMETUI_DEPS)
- $(Q)$(CC) $(CFLAGS) $(GAMETUI_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-tui.o: $(TUI_DEPS)
- $(Q)$(CC) $(CFLAGS) $(TUI_INC_DIRS) -c $< -o $@ $(LIBS)
- @echo "\tCC $<"
- @echo ""
-
-
-clean:
- $(Q)rm -f *.o
diff --git a/modules/ui/src/clui.c b/modules/ui/src/clui.c
deleted file mode 100644
index 25a877b..0000000
--- a/modules/ui/src/clui.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- #include <getopt.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "alx_seed.h"
-
- #include "about.h"
- #include "data.h"
-
- #include "clui.h"
-
-
-/******************************************************************************
- ******* static ***************************************************************
- ******************************************************************************/
-static void parse_rows (char* argument);
-static void parse_columns (char* argument);
-static void parse_file (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[])
-{
- strcpy(prog_name, argv[0]);
-
- 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'},
- {"verbose", required_argument, 0, 'V'},
- {"version", no_argument, 0, 'v'},
- /* Non-standard */
- {"rows", required_argument, 0, 'a'},
- {"columns", required_argument, 0, 'b'},
- {"file", required_argument, 0, 'f'},
- {"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_help();
- exit(EXIT_SUCCESS);
-
- case 'L':
- print_license();
- exit(EXIT_SUCCESS);
-
- case 'u':
- print_usage();
- exit(EXIT_FAILURE);
-
- case 'V':
-/*
- flag_V = atoi(optarg);
- if (flag_V < 0 || flag_V > 4) {
- printf("--Verbose argument not valid\n");
- printf("It must be an integer [0 U 4]\n");
- exit(EXIT_FAILURE);
- }
-*/
- break;
-
- 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 'p':
- parse_proportion(optarg);
- break;
-
- case 'r':
- parse_rand_seed(optarg);
- break;
-
- case 's':
- parse_start(optarg);
- break;
-
- case '?':
- /* getopt_long already printed an error message. */
-
- default:
- print_usage();
- exit(EXIT_FAILURE);
- }
- }
-}
-
-
-/******************************************************************************
- ******* static ***************************************************************
- ******************************************************************************/
-static void parse_rows (char* argument)
-{
- board.rows = atoi(argument);
- if (board.rows < 2 || board.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)
-{
- board.cols = atoi(argument);
- if (board.cols < 2 || board.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)
-{
- FILE *fp;
- fp = fopen(argument, "r");
- if (!fp) {
- printf("--file argument not valid\n");
- printf("It must be a valid file name\n");
- exit(EXIT_FAILURE);
- } else {
- fclose(fp);
-
- strcpy(file_name, "../../bin/");
- strcat(file_name, argument);
- }
-}
-
-static void parse_proportion (char* argument)
-{
- board.p = atof(argument);
- if (board.p < 0 || board.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)
-{
- seed = atof(argument);
- srand(seed);
-}
-
-static void parse_start (char* argument)
-{
- flag_s = atoi(argument);
- if (flag_s < 0 || flag_s > 10) {
- printf("--start argument not valid\n");
- printf("It must be an integer [%i U %i]\n", START_FOO, START_LOAD);
- exit(EXIT_FAILURE);
- }
-}
diff --git a/modules/ui/src/game_clui.c b/modules/ui/src/game_clui.c
deleted file mode 100644
index a350240..0000000
--- a/modules/ui/src/game_clui.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
- /* sprintf() */
- #include <stdio.h>
- /* wchar_t */
- #include <wchar.h>
-
- /* board & macros */
- #include "data.h"
-
- #include "game_clui.h"
-
-
- # define TITLE_SIZE (20)
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static int usr_input (void);
-
-static void show_board (int pos_row, int pos_col);
-static void board_loop (int pos_row, int pos_col);
-
-static void show_help (void);
-static void show_help_ready (void);
-static void show_help_playing (void);
-static void show_help_pause (void);
-static void show_help_xyzzy (void);
-static void show_help_cheated (void);
-static void show_help_end (void);
-
-
-/******************************************************************************
- ******| main |****************************************************************
- ******************************************************************************/
-int game_clui (int oldaction, int pos_row, int pos_col)
-{
- /* User action */
- int action;
- if (oldaction != ACT_FOO) {
- show_help();
- show_board(pos_row, pos_col);
- }
- action = usr_input();
-
- return action;
-}
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static int usr_input (void)
-{
- wchar_t ch;
- ch = getchar();
-
- int action;
-
- switch (ch) {
- /* Escape sequence */
- case 27:
- /* Arrows ¿? */
- ch = getchar();
- switch (ch) {
- case 91:
- ch = getchar();
- switch (ch) {
- case 65:
- action = ACT_MOVE_UP;
- break;
-
- case 66:
- action = ACT_MOVE_DOWN;
- break;
-
- case 67:
- action = ACT_MOVE_RIGHT;
- break;
-
- case 68:
- action = ACT_MOVE_LEFT;
- break;
- }
- break;
- }
- break;
-
- case 'h':
- action = ACT_MOVE_LEFT;
- break;
-
- case 'j':
- action = ACT_MOVE_DOWN;
- break;
-
- case 'k':
- action = ACT_MOVE_UP;
- break;
-
- case 'l':
- action = ACT_MOVE_RIGHT;
- break;
-
- case '+':
- action = ACT_STEP;
- break;
-
- case ' ':
- action = ACT_FLAG;
- break;
-
- case 'f':
- action = ACT_FLAG_POSSIBLE;
- break;
-
- /* ASCII 0x08 is BS */
- case 0x7F:
- case 0x08:
- action = ACT_RM_FLAG;
- break;
-
- case 'p':
- action = ACT_PAUSE;
- break;
-
- case 's':
- action = ACT_SAVE;
- break;
-
- case 'x':
- /* Special sequence "xyzzy" */
- ch = getchar();
- if (ch == 'y') {
- ch = getchar();
- if (ch == 'z') {
- ch = getchar();
- if (ch == 'z') {
- ch = getchar();
- if (ch == 'y') {
- action = ACT_XYZZY_ON;
- }
- }
- }
- }
- break;
-
- case '0':
- action = ACT_XYZZY_OFF;
- break;
-
- case '1':
- action = ACT_XYZZY_LIN;
- break;
-
- case '2':
- action = ACT_XYZZY_P;
- break;
-
- case '3':
- action = ACT_XYZZY_NP;
- break;
-
- case 'q':
- action = ACT_QUIT;
- break;
-
- default:
- action = ACT_FOO;
- break;
- }
-
- return action;
-}
-
-static void show_board (int pos_row, int pos_col)
-{
- /* Title */
- char tit [TITLE_SIZE];
- switch (board.state) {
- case GAME_READY:
- case GAME_XYZZY:
- case GAME_CHEATED:
- case GAME_PLAYING:
- case GAME_PAUSE:
- sprintf(tit, "Mines: %i/%i", board.flags, board.mines);
- break;
-
- case GAME_OVER:
- sprintf(tit, "GAME OVER");
- break;
-
- case GAME_WIN:
- sprintf(tit, "You win!");
- break;
- }
- puts("________________________________________________________________________________");
- puts(tit);
-
- /* Board */
- board_loop(pos_row, pos_col);
-
- /* Subtitle */
- char subtit[TITLE_SIZE];
- int mins;
- int secs;
- if (board.time != CHEATED) {
- mins = (int)(board.time / 60);
- secs = ((int)board.time % 60);
- sprintf(subtit, "%i:%02i | %i", mins, secs, board.clicks);
- puts(subtit);
- }
- puts("--------------------------------------------------------------------------------");
-
-}
-
-static void board_loop (int pos_row, int pos_col)
-{
- int i;
- int j;
- wchar_t ch;
-
- putchar('\n');
- for (i = 0; i < board.rows; i++) {
- for (j = 0; j < board.cols; j++) {
- ch = board.visible[i][j];
-
- /* Print char */
- if (i == pos_row && j == pos_col) {
- putchar('<');
- putchar(ch);
- putchar('>');
- } else {
- putchar(' ');
- putchar(ch);
- putchar(' ');
- }
- }
- putchar('\n');
- }
- putchar('\n');
-}
-
-static void show_help (void)
-{
- switch (board.state) {
- case GAME_READY:
- show_help_ready();
- break;
-
- case GAME_PLAYING:
- show_help_playing();
- break;
-
- case GAME_PAUSE:
- show_help_pause();
- break;
-
- case GAME_XYZZY:
- show_help_xyzzy();
- break;
-
- case GAME_CHEATED:
- show_help_cheated();
- break;
-
- case GAME_WIN:
- case GAME_OVER:
- show_help_end();
- break;
- }
-}
-
-static void show_help_ready (void)
-{
- puts("Move:");
- /* hjkl */
- printf(" %c", 'h');
- printf(" %c", 'j');
- printf(" %c", 'k');
- printf(" %c", 'l');
- putchar('\n');
- /* Arrows */
- printf(" %c", '<');
- printf(" %c", 'v');
- printf(" %c", '^');
- printf(" %c", '>');
- putchar('\n');
-
- puts("Step:");
- printf(" %c\n", '+');
-
- puts("Save:");
- printf(" %c\n", 's');
-
- puts("Quit:");
- printf(" %c\n", 'q');
-
- puts("Confirm:");
- printf(" Enter\n");
-}
-
-static void show_help_playing (void)
-{
- puts("Move:");
- /* hjkl */
- printf(" %c", 'h');
- printf(" %c", 'j');
- printf(" %c", 'k');
- printf(" %c", 'l');
- putchar('\n');
- /* Arrows */
- printf(" %c", '<');
- printf(" %c", 'v');
- printf(" %c", '^');
- printf(" %c", '>');
- putchar('\n');
-
- puts("Step:");
- printf(" %c\n", '+');
-
- puts("Flag:");
- printf(" Space\n");
-
- puts("Possible:");
- printf(" %c\n", 'f');
-
- puts("rm flag:");
- printf(" Backspace\n");
-
- puts("Pause:");
- printf(" %c\n", 'p');
-
- puts("Save:");
- printf(" %c\n", 's');
-
- puts("Quit:");
- printf(" %c\n", 'q');
-
- puts("Confirm:");
- printf(" Enter\n");
-}
-
-static void show_help_pause (void)
-{
-
- puts("Continue:");
- printf(" %c\n", 'p');
-
- puts("Save:");
- printf(" %c\n", 's');
-
- puts("Quit:");
- printf(" %c\n", 'q');
-
- puts("Confirm:");
- printf(" Enter\n");
-}
-
-static void show_help_xyzzy (void)
-{
- puts("XYZZY:");
- printf(" %c", '1');
- printf(" %c", '2');
- putchar('\n');
-
- puts("XYZZY off:");
- printf(" %c\n", '0');
-
- puts("Move:");
- /* hjkl */
- printf(" %c", 'h');
- printf(" %c", 'j');
- printf(" %c", 'k');
- printf(" %c", 'l');
- putchar('\n');
- /* Arrows */
- printf(" %c", '<');
- printf(" %c", 'v');
- printf(" %c", '^');
- printf(" %c", '>');
- putchar('\n');
-
- puts("Step:");
- printf(" %c\n", '+');
-
- puts("Flag:");
- printf(" Space\n");
-
- puts("Possible:");
- printf(" %c\n", 'f');
-
- puts("rm flag:");
- printf(" Backspace\n");
-
- puts("Save:");
- printf(" %c\n", 's');
-
- puts("Quit:");
- printf(" %c\n", 'q');
-
- puts("Confirm:");
- printf(" Enter\n");
-}
-
-static void show_help_cheated (void)
-{
- puts("Move:");
- /* hjkl */
- printf(" %c", 'h');
- printf(" %c", 'j');
- printf(" %c", 'k');
- printf(" %c", 'l');
- putchar('\n');
- /* Arrows */
- printf(" %c", '<');
- printf(" %c", 'v');
- printf(" %c", '^');
- printf(" %c", '>');
- putchar('\n');
-
- puts("Step:");
- printf(" %c\n", '+');
-
- puts("Flag:");
- printf(" Space\n");
-
- puts("Possible:");
- printf(" %c\n", 'f');
-
- puts("rm flag:");
- printf(" Backspace\n");
-
- puts("Save:");
- printf(" %c\n", 's');
-
- puts("Quit:");
- printf(" %c\n", 'q');
-
- puts("Confirm:");
- printf(" Enter\n");
-}
-
-static void show_help_end (void)
-{
- puts("Quit:");
- printf(" %c\n", 'q');
-
- puts("Confirm:");
- printf(" Enter\n");
-}
diff --git a/modules/ui/src/game_iface.c b/modules/ui/src/game_iface.c
deleted file mode 100644
index fdc2926..0000000
--- a/modules/ui/src/game_iface.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
-
- /* clock_t & clock() & CLOCKS_PER_SEC */
- #include <time.h>
- /* wchar_t */
- #include <wchar.h>
-
- /* board & macros */
- #include "data.h"
- /* game_action() & game_state() & game_update_time() */
- #include "game.h"
- /* game_tui() */
- #include "game_clui.h"
- /* game_tui() */
- #include "game_tui.h"
- /* init_board_rand() */
- #include "init.h"
- /* save_game_file() */
- #include "save.h"
- /* xyzzy_...() */
- #include "xyzzy.h"
-
- #include "game_iface.h"
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static void game_iface_act (int action, int *pos_row, int *pos_col);
-static void game_iface_act_ready (int action, int *pos_row, int *pos_col);
-static void game_iface_act_playing (int action, int *pos_row, int *pos_col);
-static void game_iface_act_xyzzy (int action, int *pos_row, int *pos_col);
-static void game_iface_act_pause (int action, int *pos_row, int *pos_col);
-static void game_iface_act_end (int action, int *pos_row, int *pos_col);
-
-static void game_iface_first_step (int pos_row, int pos_col);
-static void game_iface_update_time (void);
-static void game_iface_pause (void);
-static void game_iface_quit (void);
-
-static void game_iface_xyzzy_on (void);
-static void game_iface_xyzzy_off (void);
-
-static void game_iface_visible_board (void);
-static wchar_t game_iface_visible_char (int row, int col);
-
-
-/******************************************************************************
- ******| main |****************************************************************
- ******************************************************************************/
-void game_iface (void)
-{
- /* Init interface */
- switch (flag_iface) {
- case IFACE_CLUI:
- /* Empty */
- break;
-
- case IFACE_TUI:
- game_tui_init();
- break;
- }
-
- /* Board position */
- int pos_row;
- int pos_col;
- pos_row = 0;
- pos_col = 0;
-
- /* User action */
- int action;
-
- /* Game loop */
- while (board.state != GAME_QUIT) {
- game_iface_visible_board();
- switch (flag_iface) {
- case IFACE_CLUI:
- action = game_clui(action, pos_row, pos_col);
- break;
-
- case IFACE_TUI:
- action = game_tui(pos_row, pos_col);
- break;
- }
-
- game_iface_act(action, &pos_row, &pos_col);
- game_iface_update_time();
- }
-
- /* Cleanup interface */
- switch (flag_iface) {
- case IFACE_CLUI:
- /* Empty */
- break;
-
- case IFACE_TUI:
- game_tui_cleanup();
- break;
- }
-}
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static void game_iface_act (int action, int *pos_row, int *pos_col)
-{
- switch (board.state) {
- case GAME_READY:
- game_iface_act_ready(action, pos_row, pos_col);
- break;
-
- case GAME_CHEATED:
- case GAME_PLAYING:
- game_iface_act_playing(action, pos_row, pos_col);
- break;
-
- case GAME_XYZZY:
- game_iface_act_xyzzy(action, pos_row, pos_col);
- break;
-
- case GAME_PAUSE:
- game_iface_act_pause(action, pos_row, pos_col);
- break;
-
- case GAME_WIN:
- case GAME_OVER:
- game_iface_act_end(action, pos_row, pos_col);
- break;
- }
-}
-
-static void game_iface_act_ready (int action, int *pos_row, int *pos_col)
-{
- switch (action) {
- case ACT_STEP:
- /* First step: gen map & set timer before stepping */
- if (!board.set) {
- game_iface_first_step(*pos_row, *pos_col);
- }
- game_action(action, pos_row, pos_col);
- break;
-
- case ACT_SAVE:
- save_game_file();
- break;
-/*
- case ACT_XYZZY_ON:
- game_iface_xyzzy_on();
- break;
-*/
- case ACT_QUIT:
- game_iface_quit();
- break;
-
- case ACT_FOO:
- case ACT_FLAG:
- case ACT_FLAG_POSSIBLE:
- case ACT_RM_FLAG:
- case ACT_PAUSE:
- case ACT_XYZZY_ON:
- case ACT_XYZZY_OFF:
- case ACT_XYZZY_LIN:
- case ACT_XYZZY_P:
- case ACT_XYZZY_NP:
- /* Empty */
- break;
-
- default:
- game_action(action, pos_row, pos_col);
- break;
- }
-}
-
-static void game_iface_act_playing (int action, int *pos_row, int *pos_col)
-{
- switch (action) {
- case ACT_PAUSE:
- game_iface_pause();
- break;
-
- case ACT_SAVE:
- save_game_file();
- break;
-
- case ACT_XYZZY_ON:
- game_iface_xyzzy_on();
- break;
-
- case ACT_QUIT:
- game_iface_quit();
- break;
-
- case ACT_FOO:
- case ACT_XYZZY_OFF:
- case ACT_XYZZY_LIN:
- case ACT_XYZZY_P:
- case ACT_XYZZY_NP:
- /* Empty */
- break;
-
- default:
- game_action(action, pos_row, pos_col);
- break;
- }
-}
-
-static void game_iface_act_xyzzy (int action, int *pos_row, int *pos_col)
-{
- switch (action) {
- case ACT_SAVE:
- save_game_file();
- break;
-
- case ACT_XYZZY_LIN:
- xyzzy_lin();
- break;
-
- case ACT_XYZZY_P:
- xyzzy_p();
- break;
-
- case ACT_XYZZY_OFF:
- game_iface_xyzzy_off();
- break;
-
- case ACT_QUIT:
- game_iface_quit();
- break;
-
- case ACT_FOO:
- case ACT_PAUSE:
- case ACT_XYZZY_ON:
- case ACT_XYZZY_NP:
- /* Empty */
- break;
-
- default:
- game_action(action, pos_row, pos_col);
- break;
- }
-}
-
-static void game_iface_act_pause (int action, int *pos_row, int *pos_col)
-{
- switch (action) {
- case ACT_PAUSE:
- game_iface_pause();
- break;
-
- case ACT_SAVE:
- save_game_file();
- break;
-
- case ACT_QUIT:
- game_iface_quit();
- break;
- }
-}
-
-static void game_iface_act_end (int action, int *pos_row, int *pos_col)
-{
- switch (action) {
- case ACT_QUIT:
- board.state = GAME_QUIT;
- break;
- }
-}
-
-
-static void game_iface_first_step (int pos_row, int pos_col)
-{
- /* Generate map */
- init_board_rand(pos_row, pos_col);
- board.set = true;
-
- /* Play */
- if (board.state == GAME_READY) {
- board.state = GAME_PLAYING;
- }
-
- /* Start timer */
- tim_ini = time(NULL);
- game_iface_update_time();
-}
-
-static void game_iface_update_time (void)
-{
- time_t tim_now;
-
- switch (board.state) {
- case GAME_PLAYING:
- tim_now = time(NULL);
- board.time = (int)(tim_now - tim_ini);
- break;
-
- case GAME_XYZZY:
- board.time = CHEATED;
- board.clicks = CHEATED;
- break;
- }
-}
-
-static void game_iface_pause (void)
-{
- time_t tim_now;
-
- switch (board.state) {
- case GAME_PLAYING:
- tim_now = time(NULL);
- board.time = (int)(tim_now - tim_ini);
- board.state = GAME_PAUSE;
- break;
-
- case GAME_PAUSE:
- tim_now = time(NULL);
- tim_ini = tim_now - (time_t)board.time;
- board.state = GAME_PLAYING;
- break;
- }
-}
-
-static void game_iface_xyzzy_on (void)
-{
- board.state = GAME_XYZZY;
-}
-
-static void game_iface_xyzzy_off (void)
-{
- board.state = GAME_CHEATED;
-}
-
-static void game_iface_quit (void)
-{
- board.state = GAME_QUIT;
-}
-
-
-static void game_iface_visible_board (void)
-{
- int i;
- int j;
- wchar_t ch;
-
- for (i = 0; i < board.rows; i++) {
- for (j = 0; j < board.cols; j++) {
- ch = game_iface_visible_char(i, j);
- board.visible[i][j] = ch;
- }
- }
-}
-
-static wchar_t game_iface_visible_char (int row, int col)
-{
- wchar_t ch;
-
- switch (board.state) {
- case GAME_READY:
- switch (board.usr[row][col]) {
- case USR_HIDDEN:
- ch = '+';
- break;
-
- case USR_FLAG:
- ch = '!';
- break;
-
- case USR_POSSIBLE:
- ch = '?';
- break;
- }
- break;
-
- case GAME_CHEATED:
- case GAME_XYZZY:
- case GAME_PLAYING:
- switch (board.usr[row][col]) {
- case USR_HIDDEN:
- ch = '+';
- break;
- case USR_CLEAR:
- if (board.gnd[row][col] == MINE_NO) {
- ch = ' ';
- } else {
- ch = '0' + board.gnd[row][col];
- }
- break;
- case USR_FLAG:
- ch = '!';
- break;
- case USR_POSSIBLE:
- ch = '?';
- break;
- }
- break;
-
- case GAME_WIN:
- switch (board.usr[row][col]) {
- case USR_HIDDEN:
- ch = 'v';
- break;
-
- case USR_CLEAR:
- if (board.gnd[row][col] == MINE_NO) {
- ch = ' ';
- } else {
- ch = '0' + board.gnd[row][col];
- }
- break;
-
- case USR_FLAG:
- ch = '!';
- break;
-
- case USR_POSSIBLE:
- ch = '?';
- break;
- }
- break;
-
- case GAME_OVER:
- switch (board.usr[row][col]) {
- case KBOOM:
- ch = '#';
- break;
-
- case USR_HIDDEN:
- if (board.gnd[row][col] >= MINE_YES) {
- ch = '*';
- } else {
- ch = '-';
- }
- break;
-
- case USR_CLEAR:
- if (board.gnd[row][col] == MINE_NO) {
- ch = ' ';
- } else {
- ch = '0' + board.gnd[row][col];
- }
- break;
-
- case USR_FLAG:
- if (board.gnd[row][col] >= MINE_YES) {
- ch = '!';
- } else {
- ch = 'F';
- }
- break;
-
- case USR_POSSIBLE:
- if (board.gnd[row][col] >= MINE_YES) {
- ch = '*';
- } else {
- ch = 'f';
- }
- break;
- }
- break;
-
- default:
- ch = '0';
- break;
- }
-
- return ch;
-}
diff --git a/modules/ui/src/game_tui.c b/modules/ui/src/game_tui.c
deleted file mode 100644
index 0564061..0000000
--- a/modules/ui/src/game_tui.c
+++ /dev/null
@@ -1,707 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- /* WINDOW & wgetch() & KEY_... & ... */
- #include <ncursesw/ncurses.h>
- /* sprintf() */
- #include <stdio.h>
- /* wchar_t */
- #include <wchar.h>
-
- /* alx_..._curses() & alx_ncur_prn_...() */
- #include "alx_ncur.h"
-
- /* board & macros */
- #include "data.h"
-
- #include "game_tui.h"
-
-
- # define TITLE_SIZE (20)
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static WINDOW *win_board;
-static WINDOW *win_help;
-
-
-static int usr_input (WINDOW *win);
-
-static void show_board (WINDOW *win, int pos_row, int pos_col);
-static void board_loop (WINDOW *win, int pos_row, int pos_col);
-static void show_char (WINDOW *win, int row, int col,
- wchar_t ch);
-
-static void show_help (WINDOW *win);
-static void show_help_ready (WINDOW *win);
-static void show_help_playing (WINDOW *win);
-static void show_help_pause (WINDOW *win);
-static void show_help_xyzzy (WINDOW *win);
-static void show_help_cheated (WINDOW *win);
-static void show_help_end (WINDOW *win);
-
-static void highlight_cursor (void);
-
-
-/******************************************************************************
- ******| main |****************************************************************
- ******************************************************************************/
-void game_tui_init (void)
-{
- /* Use curses mode */
- alx_resume_curses();
-
- /* Dimensions: board */
- const int h1 = board.rows + 2;
- const int w1 = 2 * board.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 = 100 ms */
- keypad(win_board, true);
- noecho();
- wtimeout(win_board, 100);
-}
-
-int game_tui (int pos_row, int pos_col)
-{
- int action;
-
- show_help(win_help);
- show_board(win_board, pos_row, pos_col);
- action = usr_input(win_board);
-
- return action;
-}
-
-void game_tui_cleanup (void)
-{
- /* Del wins & return to terminal mode */
- alx_win_del(win_board);
- alx_win_del(win_help);
- alx_pause_curses();
-}
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static int usr_input (WINDOW *win)
-{
- wchar_t ch;
- ch = wgetch(win);
-
- int action;
-
- switch (ch) {
- case KEY_UP:
- case 'k':
- action = ACT_MOVE_UP;
- break;
-
- case KEY_DOWN:
- case 'j':
- action = ACT_MOVE_DOWN;
- break;
-
- case KEY_RIGHT:
- case 'l':
- action = ACT_MOVE_RIGHT;
- break;
-
- case KEY_LEFT:
- case 'h':
- action = ACT_MOVE_LEFT;
- break;
-
- case '+':
- case '\r':
- case '\n':
- action = ACT_STEP;
- break;
-
- case ' ':
- action = ACT_FLAG;
- break;
-
- case 'f':
- action = ACT_FLAG_POSSIBLE;
- break;
-
- /* ASCII 0x08 is BS */
- case KEY_BACKSPACE:
- case 0x08:
- action = ACT_RM_FLAG;
- break;
-
- case KEY_BREAK:
- case 'p':
- action = ACT_PAUSE;
- break;
-
- case 's':
- action = ACT_SAVE;
- break;
-
- case 'x':
- /* Wait for special sequence "xyzzy" */
- wtimeout(win_board, 1000);
- ch = wgetch(win);
- if (ch == 'y') {
- ch = wgetch(win);
- if (ch == 'z') {
- ch = wgetch(win);
- if (ch == 'z') {
- ch = wgetch(win);
- if (ch == 'y') {
- action = ACT_XYZZY_ON;
- }
- }
- }
- }
- /* Resume */
- wtimeout(win_board, 100);
- break;
-
- case '0':
- action = ACT_XYZZY_OFF;
- break;
-
- case '1':
- action = ACT_XYZZY_LIN;
- break;
-
- case '2':
- action = ACT_XYZZY_P;
- break;
-
- case '3':
- action = ACT_XYZZY_NP;
- break;
-
- case 'q':
- action = ACT_QUIT;
- break;
-
- case 'c':
- highlight_cursor();
- action = ACT_FOO;
- break;
-
- default:
- action = ACT_FOO;
- break;
- }
-
- return action;
-}
-
-static void show_board (WINDOW *win, int pos_row, int pos_col)
-{
- /* Clear & box */
- werase(win);
- box(win, 0, 0);
-
- /* Title */
- char tit[TITLE_SIZE];
- switch (board.state) {
- case GAME_READY:
- case GAME_XYZZY:
- case GAME_CHEATED:
- case GAME_PLAYING:
- case GAME_PAUSE:
- sprintf(tit, "Mines: %i/%i", board.flags, board.mines);
- break;
-
- case GAME_OVER:
- sprintf(tit, "GAME OVER");
- break;
-
- case GAME_WIN:
- sprintf(tit, "You win!");
- break;
- }
- alx_ncur_prn_title(win, tit);
-
- /* Subtitle */
- char subtit[TITLE_SIZE];
- int hours;
- int mins;
- int secs;
- if (board.time != CHEATED) {
- hours = ((int)board.time / 3600);
- mins = (((int)board.time % 3600) / 60);
- secs = ((int)board.time % 60);
-
- if (board.time >= 3600) {
- sprintf(subtit, "%02i:%02i:%02i | %i", hours, mins, secs, board.clicks);
- } else {
- sprintf(subtit, "%02i:%02i | %i", mins, secs, board.clicks);
- }
-
- alx_ncur_prn_subtitle(win, subtit);
- }
-
- /* Board */
- board_loop(win, pos_row, pos_col);
-
- /* Cursor */
- wmove(win, 1 + pos_row, 2 + 2 * pos_col);
-
- /* Refresh */
- wrefresh(win);
-}
-
-static void board_loop (WINDOW *win, int pos_row, int pos_col)
-{
- int i;
- int j;
- int k;
- int l;
- wchar_t ch;
-
- 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] == USR_CLEAR) {
- ch = board.visible[i][j];
- show_char(win, k, l, ch);
- }
- }
- /* xyzzy */
- /* hidden */
- for (j = 0; j < board.cols; j++) {
- l = 2 + 2 * j;
- if (board.usr[i][j] != USR_CLEAR) {
- ch = board.visible[i][j];
- show_char(win, k, l, ch);
- }
- }
- /* kboom */
- for (j = 0; j < board.cols; j++) {
- l = 2 + 2 * j;
- if (board.usr[i][j] == KBOOM) {
- ch = board.visible[i][j];
- show_char(win, k, l, ch);
- }
- }
- }
-
- /* Highlight cursor */
- int pair;
- if (highlight) {
- k = 1 + pos_row;
- l = 2 + 2 * pos_col;
- ch = board.visible[pos_row][pos_col];
-
- pair = PAIR_HILITE;
- if (flag_color) {
- wattron(win, A_BOLD | COLOR_PAIR(pair));
- }
- mvwaddch(win, k, l - 1, '<');
- mvwaddch(win, k, l, ch);
- mvwaddch(win, k, l + 1, '>');
- if (flag_color) {
- wattroff(win, A_BOLD | COLOR_PAIR(pair));
- }
- }
-
- /* Refresh */
- wrefresh(win);
-}
-
-static void show_char (WINDOW *win, int row, int col, wchar_t ch)
-{
- /* Select attributes */
- int pair;
- switch (ch) {
- case '1':
- pair = PAIR_1;
- break;
-
- case '2':
- pair = PAIR_2;
- break;
-
- case '3':
- pair = PAIR_3;
- break;
-
- case '4':
- pair = PAIR_4;
- break;
-
- case '5':
- pair = PAIR_5;
- break;
-
- case '6':
- pair = PAIR_6;
- break;
-
- case '7':
- pair = PAIR_7;
- break;
-
- case '8':
- pair = PAIR_8;
- break;
-
- case ' ':
- pair = PAIR_BLANK;
- break;
-
- case '*':
- case 'v':
- pair = PAIR_MINE;
- break;
-
- case '+':
- case '-':
- pair = PAIR_HIDDEN;
- break;
-
- case 'f':
- pair = PAIR_fail;
- break;
-
- case '?':
- pair = PAIR_POSSIBLE;
- break;
-
- case 'F':
- pair = PAIR_FAIL;
- break;
-
- case '!':
- pair = PAIR_FLAG;
- break;
-
- case '#':
- pair = PAIR_KBOOM;
- break;
-
- default:
- pair = PAIR_KBOOM;
- break;
- }
-
- /* Print char */
- if (flag_color) {
- wattron(win, A_BOLD | COLOR_PAIR(pair));
- }
- if (ch == 'c') {
- } else {
- mvwaddch(win, row, col - 1, ' ');
- mvwaddch(win, row, col, ch);
- mvwaddch(win, row, col + 1, ' ');
- }
- if (flag_color) {
- wattroff(win, A_BOLD | COLOR_PAIR(pair));
- }
-}
-
-static void show_help (WINDOW *win)
-{
- /* Clear */
- werase(win);
-
- switch (board.state) {
- case GAME_READY:
- show_help_ready(win);
- break;
-
- case GAME_PLAYING:
- show_help_playing(win);
- break;
-
- case GAME_PAUSE:
- show_help_pause(win);
- break;
-
- case GAME_XYZZY:
- show_help_xyzzy(win);
- break;
-
- case GAME_CHEATED:
- show_help_cheated(win);
- break;
-
- case GAME_WIN:
- case GAME_OVER:
- show_help_end(win);
- break;
- }
-}
-
-static void show_help_ready (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c, "Cursor:");
- mvwprintw(win, r++, c, " %c", 'c');
-
- mvwaddstr(win, r++, c, "Step:");
- mvwprintw(win, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win, r++, c, "Save:");
- mvwprintw(win, r++, c, " %c", 's');
-
- mvwaddstr(win, r++, c, "Quit:");
- mvwprintw(win, r++, c, " %c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_playing (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c, "Cursor:");
- mvwprintw(win, r++, c, " %c", 'c');
-
- mvwaddstr(win, r++, c, "Step:");
- mvwprintw(win, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win, r++, c, "Flag:");
- mvwprintw(win, r++, c, " Space");
-
- mvwaddstr(win, r++, c, "Possible:");
- mvwprintw(win, r++, c, " %c", 'f');
-
- mvwaddstr(win, r++, c, "rm flag:");
- mvwprintw(win, r++, c, " Backspace");
-
- mvwaddstr(win, r++, c, "Pause:");
- mvwprintw(win, r++, c, " Break / %c", 'p');
-
- mvwaddstr(win, r++, c, "Save:");
- mvwprintw(win, r++, c, " %c", 's');
-
- mvwaddstr(win, r++, c, "Quit:");
- mvwprintw(win, r++, c, " %c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_pause (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c, "Cursor:");
- mvwprintw(win, r++, c, " %c", 'c');
-
- mvwaddstr(win, r++, c, "Continue:");
- mvwprintw(win, r++, c, " Break / %c", 'p');
-
- mvwaddstr(win, r++, c, "Save:");
- mvwprintw(win, r++, c, " %c", 's');
-
- mvwaddstr(win, r++, c, "Quit:");
- mvwprintw(win, r++, c, " %c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_xyzzy (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "XYZZY:");
- mvwprintw(win, r, c, "%c", '1');
- c += 2;
- mvwprintw(win, r, c, "%c", '2');
-// c += 2;
-// mvwprintw(win, r, c, "%c", 'd');
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c, "XYZZY off:");
- mvwprintw(win, r++, c, " %c", '0');
-
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c, "Cursor:");
- mvwprintw(win, r++, c, " %c", 'c');
-
- mvwaddstr(win, r++, c, "Step:");
- mvwprintw(win, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win, r++, c, "Flag:");
- mvwprintw(win, r++, c, " Space");
-
- mvwaddstr(win, r++, c, "Possible:");
- mvwprintw(win, r++, c, " %c", 'f');
-
- mvwaddstr(win, r++, c, "rm flag:");
- mvwprintw(win, r++, c, " Backspace");
-
- mvwaddstr(win, r++, c, "Save:");
- mvwprintw(win, r++, c, " %c", 's');
-
- mvwaddstr(win, r++, c, "Quit:");
- mvwprintw(win, r++, c, " %c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_cheated (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c, "Cursor:");
- mvwprintw(win, r++, c, " %c", 'c');
-
- mvwaddstr(win, r++, c, "Step:");
- mvwprintw(win, r++, c, " Enter / %c", '+');
-
- mvwaddstr(win, r++, c, "Flag:");
- mvwprintw(win, r++, c, " Space");
-
- mvwaddstr(win, r++, c, "Possible:");
- mvwprintw(win, r++, c, " %c", 'f');
-
- mvwaddstr(win, r++, c, "rm flag:");
- mvwprintw(win, r++, c, " Backspace");
-
- mvwaddstr(win, r++, c, "Save:");
- mvwprintw(win, r++, c, " %c", 's');
-
- mvwaddstr(win, r++, c, "Quit:");
- mvwprintw(win, r++, c, " %c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_end (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c, "Quit:");
- mvwprintw(win, r++, c, " %c", 'q');
-
- wrefresh(win);
-}
-
-static void highlight_cursor (void)
-{
- highlight = !highlight;
-}
diff --git a/modules/ui/src/game_ui.c b/modules/ui/src/game_ui.c
deleted file mode 100644
index 31f02fa..0000000
--- a/modules/ui/src/game_ui.c
+++ /dev/null
@@ -1,800 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- /* WINDOW & wgetch() & KEY_... & ... */
- #include <ncursesw/ncurses.h>
- /* sprintf() */
- #include <stdio.h>
- /* clock_t & clock() & CLOCKS_PER_SEC */
- #include <time.h>
- /* wchar_t */
- #include <wchar.h>
-
- /* alx_..._curses() & alx_ncur_prn_...() */
- #include "alx_ncur.h"
-
- /* board & macros */
- #include "data.h"
- /* game_action() & game_state() */
- #include "game.h"
- /* show_board() */
- #include "print.h"
-
- #include "game_ui.h"
-
-
- # define TITLE_SIZE (20)
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static int usr_input (WINDOW *win);
-static void show_char (WINDOW *win, int row, int col,
- wchar_t ch);
-static void show_board (WINDOW *win, int pos_row, int pos_col);
-static wchar_t board_char (int row, int col);
-static void board_loop (WINDOW *win);
-
-static void show_help (WINDOW *win);
-static void show_help_ready (WINDOW *win);
-static void show_help_playing (WINDOW *win);
-static void show_help_pause (WINDOW *win);
-static void show_help_xyzzy (WINDOW *win);
-static void show_help_cheated (WINDOW *win);
-static void show_help_end (WINDOW *win);
-
-static void highlight_cursor (void);
-
-
-/******************************************************************************
- ******| main |****************************************************************
- ******************************************************************************/
-void game_ui (void)
-{
- alx_resume_curses();
-
- /* Dimensions: board */
- WINDOW *win_board;
- const int h1 = board.rows + 2;
- const int w1 = 2 * board.cols + 3;
- const int r1 = 0;
- const int c1 = 11;
- win_board = newwin(h1, w1, r1, c1);
-
- /* Dimensions: help */
- WINDOW *win_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, and don't echo input */
- keypad(win_board, true);
- noecho();
-
- /* Board position */
- int pos_row;
- int pos_col;
- pos_row = 0;
- pos_col = 0;
-
- /* User action */
- int action;
-
- /* Game loop */
- while (board.state != GAME_QUIT) {
- show_help(win_help);
- show_board(win_board, pos_row, pos_col);
- action = usr_input(win_board);
- game_action(action, &pos_row, &pos_col);
- game_update_time();
- }
-
- /* Del win */
- alx_win_del(win_board);
- alx_win_del(win_help);
-
- alx_pause_curses();
-}
-
-
-/******************************************************************************
- ******| static |**************************************************************
- ******************************************************************************/
-static int usr_input (WINDOW *win)
-{
- wchar_t ch;
- ch = wgetch(win);
-
- int action;
-
- switch (ch) {
- case KEY_UP:
- case 'k':
- action = ACT_MOVE_UP;
- break;
-
- case KEY_DOWN:
- case 'j':
- action = ACT_MOVE_DOWN;
- break;
-
- case KEY_RIGHT:
- case 'l':
- action = ACT_MOVE_RIGHT;
- break;
-
- case KEY_LEFT:
- case 'h':
- action = ACT_MOVE_LEFT;
- break;
-
- case '\r':
- case '\n':
- action = ACT_STEP;
- break;
-
- case ' ':
- action = ACT_FLAG;
- break;
-
- case 'f':
- action = ACT_FLAG_POSSIBLE;
- break;
-
- /* ASCII 0x08 is BS */
- case KEY_BACKSPACE:
- case 0x08:
- action = ACT_RM_FLAG;
- break;
-
- case KEY_BREAK:
- case 'p':
- action = ACT_PAUSE;
- break;
-
- case 's':
- action = ACT_SAVE;
- break;
-
- case 'x':
- ch = wgetch(win);
- if (ch == 'y') {
- ch = wgetch(win);
- if (ch == 'z') {
- ch = wgetch(win);
- if (ch == 'z') {
- ch = wgetch(win);
- if (ch == 'y') {
- action = ACT_XYZZY_ON;
- }
- }
- }
- }
- break;
-
- case '0':
- action = ACT_XYZZY_OFF;
- break;
-
- case '1':
- action = ACT_XYZZY_LIN;
- break;
-
- case '2':
- action = ACT_XYZZY_SQ;
- break;
-
- case 'q':
- action = ACT_QUIT;
- break;
-
- case 'c':
- highlight_cursor();
- action = ACT_FOO;
- break;
-
- default:
- action = ACT_FOO;
- break;
- }
-
- return action;
-}
-
-static void show_board (WINDOW *win, int pos_row, int pos_col)
-{
- /* Clear & box */
- wclear(win);
- box(win, 0, 0);
-
- /* Title */
- char tit[TITLE_SIZE];
- switch (board.state) {
- case GAME_READY:
- case GAME_XYZZY:
- case GAME_CHEATED:
- case GAME_PLAYING:
- case GAME_PAUSE:
- sprintf(tit, "Mines: %i/%i", board.flags, board.mines);
- break;
-
- case GAME_OVER:
- sprintf(tit, "GAME OVER");
- break;
-
- case GAME_WIN:
- sprintf(tit, "You win!");
- break;
- }
- alx_ncur_prn_title(win, tit);
-
- /* Subtitle */
- char subtit[TITLE_SIZE];
- int mins;
- int secs;
- if (board.time != CHEATED) {
- mins = (int)(board.time / 60);
- secs = ((int)board.time % 60);
- sprintf(subtit, "%i:%02i | %i", mins, secs, board.clicks);
- alx_ncur_prn_subtitle(win, subtit);
- }
-
- /* Board */
- board_loop(win);
-
- /* Highlight cursor */
- if (highlight) {
- show_char(win, 1 + pos_row, 2 + 2 * pos_col, 'c');
- }
- wmove(win, 1 + pos_row, 2 + 2 * pos_col);
-
- /* Refresh */
- wrefresh(win);
-}
-
-static void board_loop (WINDOW *win)
-{
- int i;
- int j;
- int k;
- int l;
-
- for (i = 0; i < board.rows; i++) {
- k = 1 + i;
-
- /* clear */
- for (j = 0; j < board.cols; j++) {
- l = 2 + 2 * j;
- wchar_t ch;
- if (board.usr[i][j] == USR_CLEAR) {
- ch = board_char(i, j);
- show_char(win, k, l, ch);
- }
- }
- /* xyzzy */
- /* hidden */
- for (j = 0; j < board.cols; j++) {
- l = 2 + 2 * j;
- wchar_t ch;
- if (board.usr[i][j] != USR_CLEAR) {
- ch = board_char(i, j);
- show_char(win, k, l, ch);
- }
- }
- /* kboom */
- for (j = 0; j < board.cols; j++) {
- l = 2 + 2 * j;
- wchar_t ch;
- if (board.usr[i][j] == KBOOM) {
- ch = board_char(i, j);
- show_char(win, k, l, ch);
- }
- }
- }
- /* Refresh */
- wrefresh(win);
-}
-
-static wchar_t board_char (int row, int col)
-{
- wchar_t ch;
-
- switch (board.state) {
- case GAME_READY:
- switch (board.usr[row][col]) {
- case USR_HIDDEN:
- ch = '+';
- break;
-
- case USR_FLAG:
- ch = '!';
- break;
-
- case USR_POSSIBLE:
- ch = '?';
- break;
- }
- break;
-
- case GAME_CHEATED:
- case GAME_XYZZY:
- case GAME_PLAYING:
- switch (board.usr[row][col]) {
- case USR_HIDDEN:
- ch = '+';
- break;
- case USR_CLEAR:
- if (board.gnd[row][col] == MINE_NO) {
- ch = ' ';
- } else {
- ch = '0' + board.gnd[row][col];
- }
- break;
- case USR_FLAG:
- ch = '!';
- break;
- case USR_POSSIBLE:
- ch = '?';
- break;
- }
- break;
-
- case GAME_WIN:
- switch (board.usr[row][col]) {
- case USR_HIDDEN:
- ch = 'v';
- break;
-
- case USR_CLEAR:
- if (board.gnd[row][col] == MINE_NO) {
- ch = ' ';
- } else {
- ch = '0' + board.gnd[row][col];
- }
- break;
-
- case USR_FLAG:
- ch = '!';
- break;
-
- case USR_POSSIBLE:
- ch = '?';
- break;
- }
- break;
-
- case GAME_OVER:
- switch (board.usr[row][col]) {
- case KBOOM:
- ch = '#';
- break;
-
- case USR_HIDDEN:
- if (board.gnd[row][col] >= MINE_YES) {
- ch = '*';
- } else {
- ch = '-';
- }
- break;
-
- case USR_CLEAR:
- if (board.gnd[row][col] == MINE_NO) {
- ch = ' ';
- } else {
- ch = '0' + board.gnd[row][col];
- }
- break;
-
- case USR_FLAG:
- if (board.gnd[row][col] >= MINE_YES) {
- ch = '!';
- } else {
- ch = 'F';
- }
- break;
-
- case USR_POSSIBLE:
- if (board.gnd[row][col] >= MINE_YES) {
- ch = '*';
- } else {
- ch = 'f';
- }
- break;
- }
- break;
-
- default:
- ch = '0';
- break;
- }
-
- return ch;
-}
-
-static void show_char (WINDOW *win, int row, int col, wchar_t ch)
-{
- /* Select attributes */
- int pair;
- switch (ch) {
- case '1':
- pair = PAIR_1;
- break;
-
- case '2':
- pair = PAIR_2;
- break;
-
- case '3':
- pair = PAIR_3;
- break;
-
- case '4':
- pair = PAIR_4;
- break;
-
- case '5':
- pair = PAIR_5;
- break;
-
- case '6':
- pair = PAIR_6;
- break;
-
- case '7':
- pair = PAIR_7;
- break;
-
- case '8':
- pair = PAIR_8;
- break;
-
- case ' ':
- pair = PAIR_BLANK;
- break;
-
- case '*':
- case 'v':
- pair = PAIR_MINE;
- break;
-
- case '+':
- case '-':
- pair = PAIR_HIDDEN;
- break;
-
- case 'f':
- pair = PAIR_fail;
- break;
-
- case '?':
- pair = PAIR_POSSIBLE;
- break;
-
- case 'F':
- pair = PAIR_FAIL;
- break;
-
- case '!':
- pair = PAIR_FLAG;
- break;
-
- case '#':
- pair = PAIR_KBOOM;
- break;
-
- case 'c':
- pair = PAIR_HILITE;
- break;
-
- default:
- pair = PAIR_KBOOM;
- break;
- }
-
- /* Print char */
- if (flag_color) {
- wattron(win, A_BOLD | COLOR_PAIR(pair));
- }
- mvwaddch(win, row, col - 1, ' ');
- mvwaddch(win, row, col, ch);
- mvwaddch(win, row, col + 1, ' ');
- if (flag_color) {
- wattroff(win, A_BOLD | COLOR_PAIR(pair));
- }
- wrefresh(win);
-}
-
-static void show_help (WINDOW *win)
-{
- /* Clear */
- wclear(win);
-
- switch (board.state) {
- case GAME_READY:
- show_help_ready(win);
- break;
-
- case GAME_PLAYING:
- show_help_playing(win);
- break;
-
- case GAME_PAUSE:
- show_help_pause(win);
- break;
-
- case GAME_XYZZY:
- show_help_xyzzy(win);
- break;
-
- case GAME_CHEATED:
- show_help_cheated(win);
- break;
-
- case GAME_WIN:
- case GAME_OVER:
- show_help_end(win);
- break;
- }
-}
-
-static void show_help_ready (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c++, "Cursor:");
- mvwprintw(win, r++, c--, "%c", 'c');
-
- mvwaddstr(win, r++, c++, "Step:");
- mvwprintw(win, r++, c--, "Enter");
-
- mvwaddstr(win, r++, c++, "Save:");
- mvwprintw(win, r++, c--, "%c", 's');
-
- mvwaddstr(win, r++, c++, "Quit:");
- mvwprintw(win, r++, c--, "%c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_playing (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c++, "Cursor:");
- mvwprintw(win, r++, c--, "%c", 'c');
-
- mvwaddstr(win, r++, c++, "Step:");
- mvwprintw(win, r++, c--, "Enter");
-
- mvwaddstr(win, r++, c++, "Flag:");
- mvwprintw(win, r++, c--, "Space");
-
- mvwaddstr(win, r++, c++, "Possible:");
- mvwprintw(win, r++, c--, "%c", 'f');
-
- mvwaddstr(win, r++, c++, "rm flag:");
- mvwprintw(win, r++, c--, "Backspace");
-
- mvwaddstr(win, r++, c++, "Pause:");
- mvwprintw(win, r++, c--, "Break / %c", 'p');
-
- mvwaddstr(win, r++, c++, "Save:");
- mvwprintw(win, r++, c--, "%c", 's');
-
- mvwaddstr(win, r++, c++, "Quit:");
- mvwprintw(win, r++, c--, "%c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_pause (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Cursor:");
- mvwprintw(win, r++, c--, "%c", 'c');
-
- mvwaddstr(win, r++, c++, "Continue:");
- mvwprintw(win, r++, c--, "Break / %c", 'p');
-
- mvwaddstr(win, r++, c++, "Save:");
- mvwprintw(win, r++, c--, "%c", 's');
-
- mvwaddstr(win, r++, c++, "Quit:");
- mvwprintw(win, r++, c--, "%c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_xyzzy (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "XYZZY:");
- mvwprintw(win, r, c, "%c", '1');
- c += 2;
- mvwprintw(win, r, c, "%c", '2');
-// c += 2;
-// mvwprintw(win, r, c, "%c", 'd');
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c++, "XYZZY off:");
- mvwprintw(win, r++, c--, "%c", '0');
-
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c++, "Cursor:");
- mvwprintw(win, r++, c--, "%c", 'c');
-
- mvwaddstr(win, r++, c++, "Step:");
- mvwprintw(win, r++, c--, "Enter");
-
- mvwaddstr(win, r++, c++, "Flag:");
- mvwprintw(win, r++, c--, "Space");
-
- mvwaddstr(win, r++, c++, "Possible:");
- mvwprintw(win, r++, c--, "%c", 'f');
-
- mvwaddstr(win, r++, c++, "rm flag:");
- mvwprintw(win, r++, c--, "Backspace");
-
- mvwaddstr(win, r++, c++, "Save:");
- mvwprintw(win, r++, c--, "%c", 's');
-
- mvwaddstr(win, r++, c++, "Quit:");
- mvwprintw(win, r++, c--, "%c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_cheated (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Move:");
- /* hjkl */
- mvwaddch(win, r, c, 'h');
- c += 2;
- mvwaddch(win, r, c, 'j');
- c += 2;
- mvwaddch(win, r, c, 'k');
- c += 2;
- mvwaddch(win, r, c, 'l');
- /* Arrows */
- r++;
- c = 1;
- mvwaddch(win, r, c, ACS_LARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_DARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_UARROW);
- c += 2;
- mvwaddch(win, r, c, ACS_RARROW);
-
- r++;
- c = 0;
- mvwaddstr(win, r++, c++, "Cursor:");
- mvwprintw(win, r++, c--, "%c", 'c');
-
- mvwaddstr(win, r++, c++, "Step:");
- mvwprintw(win, r++, c--, "Enter");
-
- mvwaddstr(win, r++, c++, "Flag:");
- mvwprintw(win, r++, c--, "Space");
-
- mvwaddstr(win, r++, c++, "Possible:");
- mvwprintw(win, r++, c--, "%c", 'f');
-
- mvwaddstr(win, r++, c++, "rm flag:");
- mvwprintw(win, r++, c--, "Backspace");
-
- mvwaddstr(win, r++, c++, "Save:");
- mvwprintw(win, r++, c--, "%c", 's');
-
- mvwaddstr(win, r++, c++, "Quit:");
- mvwprintw(win, r++, c--, "%c", 'q');
-
- wrefresh(win);
-}
-
-static void show_help_end (WINDOW *win)
-{
- int r;
- int c;
-
- r = 0;
- c = 0;
- mvwaddstr(win, r++, c++, "Quit:");
- mvwprintw(win, r++, c--, "%c", 'q');
-
- wrefresh(win);
-}
-
-static void highlight_cursor (void)
-{
- highlight = !highlight;
-}
diff --git a/modules/ui/src/tui.c b/modules/ui/src/tui.c
deleted file mode 100644
index 305fb42..0000000
--- a/modules/ui/src/tui.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Alejandro Colomar Andrés *
- ******************************************************************************/
-
- #include <math.h>
- #include <ncurses.h>
- #include <stdbool.h>
- #include <stdlib.h>
-
- #include "alx_ncur.h"
-
- #include "about.h"
- #include "data.h"
- #include "start.h"
-
- #include "tui.h"
-
-
- /*
- * + Menu:
- * + Continue:
- * - Start
- * + Select map:
- * - New map
- * - Load map("path
- * - ..
- * + Change difficulty:
- * - Change rows: rows (XX)
- * - Change columns: cols (XX)
- * - Change proportion of mines: p (XX.XXXXXX)
- * - ..
- * - Change file name (File: "<file_name>")
- * + DEVEL:
- * - Change seed (srand)
- * x Change verbose
- * - ..
- * - ..
- * - Disclaimer of warranty
- * - Terms and conditions
- * - Exit program
- */
-
-
-/******************************************************************************
- ******| submenus |************************************************************
- ******************************************************************************/
-static void menu_continue (void);
-static void menu_select (void);
-static void menu_difficulty (void);
-static void menu_devel (void);
-static void menu_verbose (void);
-
-
-/******************************************************************************
- ******| main menu |***********************************************************
- ******************************************************************************/
-void menu_main (void)
-{
- int sw;
- bool wh;
- int h = 10;
- int w = 34;
-
- int N = 4;
- struct alx_optn mnu[4] = {
- {7, 4, "[0] Exit program"},
- {2, 4, "[1] Continue"},
- {4, 4, "[2] Disclaimer of warranty"},
- {5, 4, "[3] Terms and conditions"}
- };
-
- flag_s = START_NEW;
-
- wh = true;
- while (wh) {
- sw = alx_menu(h, w, N, mnu, "MENU:");
-
- switch (sw) {
- case 0:
- wh = false;
- break;
-
- case 1:
- menu_continue();
- break;
-
- case 2:
- alx_pause_curses();
- print_disclaim();
- getchar();
- alx_resume_curses();
- break;
-
- case 3:
- alx_pause_curses();
- print_license();
- getchar();
- alx_resume_curses();
- break;
- }
- }
-}
-
-
-/******************************************************************************
- ******| submenus |************************************************************
- ******************************************************************************/
-static void menu_continue (void)
-{
- int sw;
- bool wh;
- WINDOW *win;
- int h = 17;
- int w = 50;
- int r = 1;
- int c = (80 - w) / 2;
-
- int w2 = w - 8;
- int r2 = r + h - 5;
-
- int N = 6;
- struct alx_optn mnu[6] = {
- {10, 4, "[0] Back"},
- {2, 4, "[1] Start"},
- {4, 4, "[2] Select map"},
- {5, 4, "[3] Change difficulty"},
- {6, 4, "[4] Change file name"},
- {8, 4, "[5] DEVEL"}
- };
-
- char *txt[] = {"File name:"};
-
- wh = true;
- while (wh) {
- 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:");
-
- 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_select();
- break;
-
- case 3:
- alx_win_del(win);
- menu_difficulty();
- break;
-
- case 4:
- alx_w_getfname(USER_SAVED_DIR, saved_name, w2, r2, txt[0],
- saved_name, NULL);
- alx_win_del(win);
- break;
-
- case 5:
- alx_win_del(win);
- menu_devel();
- break;
- }
- }
-}
-
-static void menu_select (void)
-{
- int sw;
- WINDOW *win;
- int h = 9;
- int w = 70;
- int r = 1;
- int c = (80 - w) / 2;
-
- int N = 3;
- struct alx_optn mnu[3] = {
- {6, 4, "[0] Back"},
- {2, 4, "[1] New map"},
- {4, 4, "[2] Load map"}
- };
-
- 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);
-
- switch (sw) {
- case 1:
- flag_s = START_NEW;
- break;
-
- case 2:
- flag_s = START_LOAD;
- break;
- }
-
-}
-
-static void menu_difficulty (void)
-{
-
- int sw;
- bool wh;
- WINDOW *win;
- int h = 16;
- int w = 76;
- int r = 1;
- int c = (80 - w) / 2;
-
- int w2 = w - 8;
- int r2 = r + h - 5;
-
- int N = 4;
- struct alx_optn mnu[4] = {
- {8, 4, "[0] Back"},
- {2, 4, "[1] Change rows:"},
- {4, 4, "[2] Change columns:"},
- {6, 4, "[3] Change proportion of mines:"}
- };
-
- char *txt[] = {
- "Rows:",
- "Columns:",
- "Proportion:"
- };
-
- wh = true;
- while (wh) {
- win = newwin(h, w, r, c);
- mvwprintw(win, mnu[1].r, mnu[1].c, "%s rows\t\t(%i)", mnu[1].t, board.rows);
- mvwprintw(win, mnu[2].r, mnu[2].c, "%s cols\t\t(%i)", mnu[2].t, board.cols);
- mvwprintw(win, mnu[3].r, mnu[3].c, "%s p\t(%lf)", mnu[3].t, board.p);
- wrefresh(win);
- sw = alx_menu_2(win, N, mnu, "Difficulty:");
-
- switch (sw) {
- case 0:
- wh = false;
- break;
-
- case 1:
- board.rows = alx_w_getint(w2, r2, txt[sw - 1],
- 2, board.rows, ROWS_MAX, NULL);
- break;
-
- case 2:
- board.cols = alx_w_getint(w2, r2, txt[sw - 1],
- 2, board.cols, COLS_MAX, NULL);
- break;
-
- case 3:
- board.p = alx_w_getdbl(w2, r2, txt[sw - 1],
- 0, board.p, 1, NULL);
- break;
- }
-
- alx_win_del(win);
- }
-}
-
-static void menu_devel (void)
-{
- int sw;
- bool wh;
- WINDOW *win;
- int h = 12;
- int w = 50;
- int r = 1;
- int c = (80 - w) / 2;
-
- int w2 = w - 8;
- int r2 = r + h - 5;
-
- int N = 3;
- struct alx_optn mnu[3] = {
- {5, 4, "[0] Back"},
- {2, 4, "[1] Change seed (srand)"},
- {3, 4, "[-] Change verbose"}
- };
-
- char *txt[] = {"Seed:"};
-
- wh = true;
- while (wh) {
- win = newwin(h, w, r, c);
- mvwprintw(win, mnu[2].r, mnu[2].c, "%s (V = %i)", mnu[2].t, flag_V);
- wrefresh(win);
- sw = alx_menu_2(win, N, mnu, "DEVELOPER OPTIONS:");
-
- switch (sw) {
- case 0:
- alx_win_del(win);
- wh = false;
- break;
-
- case 1:
- seed = alx_w_getint(w2, r2, txt[0],
- -INFINITY, 1, INFINITY, NULL);
- srand(seed);
- alx_win_del(win);
- break;
-
- case 2:
-/* Not yet */
- alx_win_del(win);
-// menu_verbose();
- break;
- }
- }
-}
-
-static void menu_verbose (void)
-{
-/*
- int h = 10;
- int w = 51;
-
- int N = 5;
- struct alx_optn mnu[5] = {
- {7, 4, "[0] Show NOTHING"},
- {2, 4, "[1] Show only time"},
- {3, 4, "[2] Show WORST time, matrix and solution"},
- {4, 4, "[3] Show time, matrix and solution"},
-# if (DBG)
- {5, 4, "[4] Show everything (DBG)"}
-# else
- {5, 4, "[4] DBG (Not active)"}
-# endif
- };
-
- flag_V = alx_menu(h, w, N, mnu, "VERBOSE: //Not yet//");
-*/
-}
-
-
diff --git a/modules/xyzzy/inc/xyzzy.h b/modules/xyzzy/inc/xyzzy.h
index 65351e7..f7107c5 100644
--- a/modules/xyzzy/inc/xyzzy.h
+++ b/modules/xyzzy/inc/xyzzy.h
@@ -2,11 +2,30 @@
* Copyright (C) 2018 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* include guard ********************************************************
+ ******************************************************************************/
# ifndef MSW_XYZZY_H
# define MSW_XYZZY_H
-void xyzzy_lin (void);
-void xyzzy_p (void);
+/******************************************************************************
+ ******* 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 **********************************************************
+ ******************************************************************************/
diff --git a/modules/xyzzy/obj/Makefile b/modules/xyzzy/obj/Makefile
index 9b42422..0a79bda 100644
--- a/modules/xyzzy/obj/Makefile
+++ b/modules/xyzzy/obj/Makefile
@@ -4,37 +4,34 @@
# directories
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
+GAME_INC_DIR = $(GAME_DIR)/inc/
-DATA_INC_DIR = $(DATA_DIR)/inc/
-GAME_INC_DIR = $(GAME_DIR)/inc/
-SAVE_INC_DIR = $(SAVE_DIR)/inc/
-
-INC_DIR = $(XYZZY_DIR)/inc/
-SRC_DIR = $(XYZZY_DIR)/src/
+INC_DIR = $(XYZZY_DIR)/inc/
+SRC_DIR = $(XYZZY_DIR)/src/
# dependencies
-ALL = xyzzy.o
+_ALL = xyzzy.o
+ALL = $(_ALL) xyzzy_mod.o
-XYZZY_INC_LIBALX =
-XYZZY_INC_DATA = data.h
-XYZZY_INC_GAME = game.h
-XYZZY_INC = xyzzy.h
-XYZZY_DEPS = $(SRC_DIR)/xyzzy.c \
+XYZZY_INC_GAME = game_iface.h
+XYZZY_INC = xyzzy.h
+XYZZY_DEPS = $(SRC_DIR)/xyzzy.c \
$(patsubst %,$(INC_DIR)/%,$(XYZZY_INC)) \
- $(patsubst %,$(LIBALX_INC_DIR)/%,$(XYZZY_INC_LIBALX)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(XYZZY_INC_DATA)) \
$(patsubst %,$(GAME_INC_DIR)/%,$(XYZZY_INC_GAME))
-XYZZY_INC_DIRS = -I $(INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(GAME_INC_DIR) \
- -I $(LIBALX_INC_DIR)
+XYZZY_INC_DIRS = -I $(INC_DIR) \
+ -I $(GAME_INC_DIR)
# target: dependencies
# action
all: $(ALL)
+
+
+xyzzy_mod.o: $(_ALL)
+ $(Q)$(LD) -r $^ -o $@
+ @echo "\tLD $@"
+ @echo ""
xyzzy.o: $(XYZZY_DEPS)
diff --git a/modules/xyzzy/src/xyzzy.c b/modules/xyzzy/src/xyzzy.c
index 38596da..90865ed 100644
--- a/modules/xyzzy/src/xyzzy.c
+++ b/modules/xyzzy/src/xyzzy.c
@@ -2,53 +2,118 @@
* Copyright (C) 2018 Alejandro Colomar Andrés *
******************************************************************************/
- /* macros */
- #include "data.h"
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ #include <stdbool.h>
+
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
/* game_action() */
- #include "game.h"
+ #include "game_iface.h"
#include "xyzzy.h"
-void xyzzy_lin (void)
+/******************************************************************************
+ ******* 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;
- int action;
-
- for (i = 0; i < board.rows; i++) {
- for (j = 0; j < board.cols; j++) {
- if (board.usr[i][j] == USR_CLEAR) {
- action = ACT_STEP;
- game_action(action, &i, &j);
- action = ACT_FLAG;
- game_action(action, &i, &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_p (void)
+void xyzzy_flag_all (const struct Game_Iface_Out *game_iface_out,
+ struct Game_Iface_In *game_iface_in)
{
int i;
- int fields;
-
- fields = board.rows * board.cols;
+ int j;
- for (i = 0; i < fields; i++) {
- xyzzy_lin();
+ 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 |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/
diff --git a/obj/Makefile b/obj/Makefile
index bf846e6..b05a369 100644
--- a/obj/Makefile
+++ b/obj/Makefile
@@ -4,48 +4,54 @@
# directories
-LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
+LIBALX_INC_DIR = $(LIBALX_DIR)/inc/
-CTRL_DIR = $(MODULES_DIR)/ctrl/
-CTRL_INC_DIR = $(CTRL_DIR)/inc/
+ABOUT_DIR = $(MODULES_DIR)/about/
+ABOUT_INC_DIR = $(ABOUT_DIR)/inc/
-DATA_DIR = $(MODULES_DIR)/data/
-DATA_INC_DIR = $(DATA_DIR)/inc/
+CTRL_DIR = $(MODULES_DIR)/ctrl/
+CTRL_INC_DIR = $(CTRL_DIR)/inc/
-GEN_DIR = $(MODULES_DIR)/gen/
-GEN_INC_DIR = $(GEN_DIR)/inc/
+GAME_DIR = $(MODULES_DIR)/game/
+GAME_INC_DIR = $(GAME_DIR)/inc/
-PRNT_DIR = $(MODULES_DIR)/prnt/
-PRNT_INC_DIR = $(PRNT_DIR)/inc/
+MENU_DIR = $(MODULES_DIR)/menu/
+MENU_INC_DIR = $(MENU_DIR)/inc/
-UI_DIR = $(MODULES_DIR)/ui/
-UI_INC_DIR = $(UI_DIR)/inc/
+PLAY_DIR = $(MODULES_DIR)/player/
+PLAY_INC_DIR = $(PLAY_DIR)/inc/
-SRC_DIR = $(MAIN_DIR)/src/
+SAVE_DIR = $(MODULES_DIR)/save/
+SAVE_INC_DIR = $(SAVE_DIR)/inc/
+
+SRC_DIR = $(MAIN_DIR)/src/
# dependencies
ALL = main.o
-MAIN_INC_LIBALX = alx_ncur.h
-MAIN_INC_CTRL = start.h
-MAIN_INC_DATA = data.h
-MAIN_INC_GEN = init.h
-MAIN_INC_PRNT = about.h print.h
-MAIN_INC_UI = parser.h tui.h
-MAIN_DEPS = $(SRC_DIR)/main.c \
+MAIN_INC_LIBALX = alx_ncur.h
+MAIN_INC_ABOUT = about.h
+MAIN_INC_CTRL = start.h
+MAIN_INC_GAME = game.h
+MAIN_INC_MENU = parser.h menu_iface.h
+MAIN_INC_PLAY = player_iface.h
+MAIN_INC_SAVE = save.h
+MAIN_DEPS = $(SRC_DIR)/main.c \
$(patsubst %,$(LIBALX_INC_DIR)/%,$(MAIN_INC_LIBALX)) \
+ $(patsubst %,$(ABOUT_INC_DIR)/%,$(MAIN_INC_ABOUT)) \
$(patsubst %,$(CTRL_INC_DIR)/%,$(MAIN_INC_CTRL)) \
- $(patsubst %,$(DATA_INC_DIR)/%,$(MAIN_INC_DATA)) \
- $(patsubst %,$(GEN_INC_DIR)/%,$(MAIN_INC_GEN)) \
- $(patsubst %,$(PRNT_INC_DIR)/%,$(MAIN_INC_PRNT)) \
- $(patsubst %,$(UI_INC_DIR)/%,$(MAIN_INC_UI))
-MAIN_INC_DIRS = -I $(LIBALX_INC_DIR) \
+ $(patsubst %,$(GAME_INC_DIR)/%,$(MAIN_INC_GAME)) \
+ $(patsubst %,$(MENU_INC_DIR)/%,$(MAIN_INC_MENU)) \
+ $(patsubst %,$(PLAY_INC_DIR)/%,$(MAIN_INC_PLAY)) \
+ $(patsubst %,$(SAVE_INC_DIR)/%,$(MAIN_INC_SAVE))
+MAIN_INC_DIRS = -I $(LIBALX_INC_DIR) \
+ -I $(ABOUT_INC_DIR) \
-I $(CTRL_INC_DIR) \
- -I $(DATA_INC_DIR) \
- -I $(GEN_INC_DIR) \
- -I $(PRNT_INC_DIR) \
- -I $(UI_INC_DIR)
+ -I $(GAME_INC_DIR) \
+ -I $(MENU_INC_DIR) \
+ -I $(PLAY_INC_DIR) \
+ -I $(SAVE_INC_DIR)
# target: dependencies
diff --git a/src/main.c b/src/main.c
index 62f102c..61e5a4f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,54 +2,92 @@
* Copyright (C) 2015 Alejandro Colomar Andrés *
******************************************************************************/
+
+/******************************************************************************
+ ******* headers **************************************************************
+ ******************************************************************************/
+/* * * * * * * * * *
+ * * * Standard * * * * * *
+ * * * * * * * * * */
+ /* getchar() */
+ #include <stdio.h>
+
+/* * * * * * * * * *
+ * * * Other * * * * * * *
+ * * * * * * * * * */
#include "alx_ncur.h"
+ /* about_init() & print_cpright() */
#include "about.h"
- #include "data.h"
- #include "init.h"
- #include "tui.h"
+ #include "game.h"
+ #include "menu_iface.h"
+ #include "player_iface.h"
#include "parser.h"
- #include "print.h"
+ #include "save.h"
#include "start.h"
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+void init_all (void);
+void cleanup (void);
+
+
+/******************************************************************************
+ ******* main *****************************************************************
+ ******************************************************************************/
int main (int argc, char *argv[])
{
- /* Init values */
- alx_start_curses();
- init_values();
- alx_pause_curses();
-
+ init_all();
+
/* Parse command line options */
parser(argc, argv);
/* Print copyright () and wait for any key to continue */
- print_verbose(1, print_cpright, -1);
- print_verbose(1, getchar, -1);
+ print_cpright();
+ getchar();
/* Start () */
start_switch();
/* Menu () */
- if (!flag_exit) {
- alx_resume_curses();
- menu_main();
- }
+ menu_iface();
- /* End curses */
- alx_end_curses();
+ cleanup();
return 0;
}
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*--| END OF FILE |-----------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
-/*----------------------------------------------------------------------------*/
+
+/******************************************************************************
+ ******* static functions *****************************************************
+ ******************************************************************************/
+void init_all (void)
+{
+ /* Init modules */
+ alx_start_curses();
+ menu_iface_init();
+ alx_pause_curses();
+ game_init();
+ about_init();
+ save_init();
+
+ /* Modes */
+ start_mode = START_FOO;
+ flag_exit = false;
+ menu_iface_mode = MENU_IFACE_TUI;
+ player_iface_mode = PLAYER_IFACE_TUI;
+}
+
+void cleanup (void)
+{
+ /* End curses */
+ alx_resume_curses();
+ alx_end_curses();
+}
+
+
+/******************************************************************************
+ ******* end of file **********************************************************
+ ******************************************************************************/