mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-09 13:15:18 -05:00
New chessbox plugin by Miguel A. ArЩvalo, based on GNU Chess v2
Not built yet because of a missing dependancy with the pieces' bitmaps. Someone with Makefile knowledge, please, look at it! git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8778 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
b12bcecb29
commit
91522721f4
11 changed files with 3053 additions and 0 deletions
|
|
@ -17,6 +17,19 @@ bejeweled_jewels.220x176x16.bmp
|
||||||
bejeweled_jewels.320x240x16.bmp
|
bejeweled_jewels.320x240x16.bmp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* ChessBox */
|
||||||
|
#if (LCD_WIDTH >= 240) && (LCD_HEIGHT >= 240) & (LCD_DEPTH >= 16)
|
||||||
|
chessbox_pieces.240x240x16.bmp
|
||||||
|
#elif (LCD_WIDTH >= 176) && (LCD_HEIGHT >= 176) & (LCD_DEPTH >= 16)
|
||||||
|
chessbox_pieces.176x176x16.bmp
|
||||||
|
#elif (LCD_WIDTH >= 128) && (LCD_HEIGHT >= 128) & (LCD_DEPTH > 1)
|
||||||
|
chessbox_pieces.128x128x2.bmp
|
||||||
|
#elif (LCD_WIDTH >= 128) && (LCD_HEIGHT >= 128)
|
||||||
|
chessbox_pieces.128x128x1.bmp
|
||||||
|
#elif (LCD_WIDTH >= 64) && (LCD_HEIGHT >= 64)
|
||||||
|
chessbox_pieces.64x64x1.bmp
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Solitaire */
|
/* Solitaire */
|
||||||
#ifdef HAVE_LCD_COLOR
|
#ifdef HAVE_LCD_COLOR
|
||||||
solitaire_cardback.220x176x16.bmp
|
solitaire_cardback.220x176x16.bmp
|
||||||
|
|
|
||||||
BIN
apps/plugins/bitmaps/native/chessbox_pieces.128x128x1.bmp
Normal file
BIN
apps/plugins/bitmaps/native/chessbox_pieces.128x128x1.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
apps/plugins/bitmaps/native/chessbox_pieces.128x128x2.bmp
Normal file
BIN
apps/plugins/bitmaps/native/chessbox_pieces.128x128x2.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.6 KiB |
BIN
apps/plugins/bitmaps/native/chessbox_pieces.176x176x16.bmp
Normal file
BIN
apps/plugins/bitmaps/native/chessbox_pieces.176x176x16.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
BIN
apps/plugins/bitmaps/native/chessbox_pieces.240x240x16.bmp
Normal file
BIN
apps/plugins/bitmaps/native/chessbox_pieces.240x240x16.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
BIN
apps/plugins/bitmaps/native/chessbox_pieces.64x64x1.bmp
Normal file
BIN
apps/plugins/bitmaps/native/chessbox_pieces.64x64x1.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 894 B |
112
apps/plugins/chessbox/Makefile
Normal file
112
apps/plugins/chessbox/Makefile
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
# __________ __ ___.
|
||||||
|
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
# \/ \/ \/ \/ \/
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \
|
||||||
|
-I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR)
|
||||||
|
CFLAGS = $(GCCOPTS) -O3 $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \
|
||||||
|
-DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN
|
||||||
|
|
||||||
|
ifdef APPEXTRA
|
||||||
|
INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA)))
|
||||||
|
endif
|
||||||
|
|
||||||
|
LINKFILE := $(OBJDIR)/link.lds
|
||||||
|
DEPFILE = $(OBJDIR)/dep-chessbox
|
||||||
|
SRC = chessbox.c gnuchess.c
|
||||||
|
|
||||||
|
SOURCES = $(SRC)
|
||||||
|
OBJS := $(SRC:%.c=$(OBJDIR)/%.o)
|
||||||
|
DIRS = .
|
||||||
|
|
||||||
|
LDS := ../plugin.lds
|
||||||
|
OUTPUT = $(OUTDIR)/chessbox.rock
|
||||||
|
|
||||||
|
all: $(OUTPUT)
|
||||||
|
|
||||||
|
ifndef SIMVER
|
||||||
|
$(OBJDIR)/chessbox.elf: $(OBJS) $(LINKFILE)
|
||||||
|
@echo "LD "`basename $@`
|
||||||
|
@$(CC) $(GCCOPTS) -O -nostdlib -o $@ $(OBJS) -L$(BUILDDIR) -lplugin -lgcc \
|
||||||
|
-T$(LINKFILE) -Wl,-Map,$(OBJDIR)/chessbox.map
|
||||||
|
|
||||||
|
$(OUTPUT): $(OBJDIR)/chessbox.elf
|
||||||
|
@echo "OBJCOPY "`basename $@`
|
||||||
|
@$(OC) -O binary $< $@
|
||||||
|
else
|
||||||
|
|
||||||
|
ifeq ($(SIMVER), x11)
|
||||||
|
###################################################
|
||||||
|
# This is the X11 simulator version
|
||||||
|
|
||||||
|
$(OUTPUT): $(OBJS)
|
||||||
|
@echo "LD $<"
|
||||||
|
@$(CC) $(CFLAGS) -shared $(OBJS) -L$(BUILDDIR) -lplugin -o $@
|
||||||
|
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
|
||||||
|
# 'x' must be kept or you'll have "Win32 error 5"
|
||||||
|
# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
|
||||||
|
# #define ERROR_ACCESS_DENIED 5L
|
||||||
|
else
|
||||||
|
@chmod -x $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
else # end of x11-simulator
|
||||||
|
ifeq ($(SIMVER), sdl)
|
||||||
|
###################################################
|
||||||
|
# This is the SDL simulator version
|
||||||
|
|
||||||
|
$(OUTPUT): $(OBJS)
|
||||||
|
@echo "LD $<"
|
||||||
|
@$(CC) $(CFLAGS) -shared $(OBJS) -L$(BUILDDIR) -lplugin -o $@
|
||||||
|
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
|
||||||
|
# 'x' must be kept or you'll have "Win32 error 5"
|
||||||
|
# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
|
||||||
|
# #define ERROR_ACCESS_DENIED 5L
|
||||||
|
else
|
||||||
|
@chmod -x $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
else # end of sdl-simulator
|
||||||
|
###################################################
|
||||||
|
# This is the win32 simulator version
|
||||||
|
DLLTOOLFLAGS = --export-all
|
||||||
|
DLLWRAPFLAGS = -s --entry _DllMain@12 --target=i386-mingw32 -mno-cygwin
|
||||||
|
|
||||||
|
$(OUTPUT): $(OBJS)
|
||||||
|
@echo "DLL "`basename $@`
|
||||||
|
@$(DLLTOOL) $(DLLTOOLFLAGS) -z $(OBJDIR)/$*.def $(OBJS)
|
||||||
|
@$(DLLWRAP) $(DLLWRAPFLAGS) --def $(OBJDIR)/$*.def $(OBJS) \
|
||||||
|
$(BUILDDIR)/libplugin.a -o $@
|
||||||
|
ifeq ($(findstring CYGWIN,$(UNAME)),CYGWIN)
|
||||||
|
# 'x' must be kept or you'll have "Win32 error 5"
|
||||||
|
# $ fgrep 5 /usr/include/w32api/winerror.h | head -1
|
||||||
|
# #define ERROR_ACCESS_DENIED 5L
|
||||||
|
else
|
||||||
|
@chmod -x $@
|
||||||
|
endif
|
||||||
|
endif # end of win32-simulator
|
||||||
|
endif
|
||||||
|
endif # end of simulator section
|
||||||
|
|
||||||
|
|
||||||
|
include $(TOOLSDIR)/make.inc
|
||||||
|
|
||||||
|
# MEMORYSIZE should be passed on to this makefile with the chosen memory size
|
||||||
|
# given in number of MB
|
||||||
|
$(LINKFILE): $(LDS)
|
||||||
|
@echo "build "`basename $@`
|
||||||
|
@cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) \
|
||||||
|
$(DEFINES) -E -P - >$@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo "cleaning chessbox"
|
||||||
|
@rm -rf $(OBJDIR)/chessbox
|
||||||
|
@rm -f $(OBJDIR)/chessbox.* $(DEPFILE)
|
||||||
|
|
||||||
|
-include $(DEPFILE)
|
||||||
|
|
||||||
485
apps/plugins/chessbox/chessbox.c
Normal file
485
apps/plugins/chessbox/chessbox.c
Normal file
|
|
@ -0,0 +1,485 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* __________ __ ___.
|
||||||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
|
* \/ \/ \/ \/ \/
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006 Miguel A. Arévalo
|
||||||
|
* Color graphics from eboard
|
||||||
|
* GNUChess v2 chess engine Copyright (c) 1988 John Stanback
|
||||||
|
*
|
||||||
|
* All files in this archive are subject to the GNU General Public License.
|
||||||
|
* See the file COPYING in the source tree root for full license agreement.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "plugin.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
|
||||||
|
#include "gnuchess.h"
|
||||||
|
|
||||||
|
/* type definitions */
|
||||||
|
struct cb_command {
|
||||||
|
int type;
|
||||||
|
char mv_s[5];
|
||||||
|
unsigned short mv;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* global rockbox api */
|
||||||
|
static struct plugin_api* rb;
|
||||||
|
|
||||||
|
/* External bitmaps */
|
||||||
|
extern const fb_data chessbox_pieces[];
|
||||||
|
|
||||||
|
|
||||||
|
PLUGIN_HEADER
|
||||||
|
|
||||||
|
/* button definitions */
|
||||||
|
#if (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
|
||||||
|
#define CB_SELECT BUTTON_SELECT
|
||||||
|
#define CB_UP BUTTON_SCROLL_BACK
|
||||||
|
#define CB_DOWN BUTTON_SCROLL_FWD
|
||||||
|
#define CB_LEFT BUTTON_LEFT
|
||||||
|
#define CB_RIGHT BUTTON_RIGHT
|
||||||
|
#define CB_PLAY BUTTON_PLAY
|
||||||
|
#define CB_LEVEL BUTTON_MENU
|
||||||
|
#define CB_QUIT BUTTON_REL
|
||||||
|
|
||||||
|
#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
|
||||||
|
#define CB_SELECT BUTTON_MENU
|
||||||
|
#define CB_UP BUTTON_UP
|
||||||
|
#define CB_DOWN BUTTON_DOWN
|
||||||
|
#define CB_LEFT BUTTON_LEFT
|
||||||
|
#define CB_RIGHT BUTTON_RIGHT
|
||||||
|
#define CB_PLAY BUTTON_PLAY
|
||||||
|
#define CB_LEVEL BUTTON_REC
|
||||||
|
#define CB_QUIT BUTTON_POWER
|
||||||
|
|
||||||
|
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||||
|
#define CB_SELECT BUTTON_SELECT
|
||||||
|
#define CB_UP BUTTON_UP
|
||||||
|
#define CB_DOWN BUTTON_DOWN
|
||||||
|
#define CB_LEFT BUTTON_LEFT
|
||||||
|
#define CB_RIGHT BUTTON_RIGHT
|
||||||
|
#define CB_PLAY BUTTON_ON
|
||||||
|
#define CB_LEVEL BUTTON_MODE
|
||||||
|
#define CB_QUIT BUTTON_OFF
|
||||||
|
|
||||||
|
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
|
||||||
|
#define CB_SELECT BUTTON_SELECT
|
||||||
|
#define CB_UP BUTTON_UP
|
||||||
|
#define CB_DOWN BUTTON_DOWN
|
||||||
|
#define CB_LEFT BUTTON_LEFT
|
||||||
|
#define CB_RIGHT BUTTON_RIGHT
|
||||||
|
#define CB_PLAY BUTTON_PLAY
|
||||||
|
#define CB_LEVEL BUTTON_EQ
|
||||||
|
#define CB_QUIT BUTTON_MODE
|
||||||
|
|
||||||
|
#elif CONFIG_KEYPAD == RECORDER_PAD
|
||||||
|
#define CB_SELECT BUTTON_PLAY
|
||||||
|
#define CB_UP BUTTON_UP
|
||||||
|
#define CB_DOWN BUTTON_DOWN
|
||||||
|
#define CB_LEFT BUTTON_LEFT
|
||||||
|
#define CB_RIGHT BUTTON_RIGHT
|
||||||
|
#define CB_PLAY BUTTON_ON
|
||||||
|
#define CB_LEVEL BUTTON_F1
|
||||||
|
#define CB_QUIT BUTTON_OFF
|
||||||
|
|
||||||
|
#elif CONFIG_KEYPAD == ONDIO_PAD
|
||||||
|
#define CB_SELECT (BUTTON_MENU|BUTTON_REL)
|
||||||
|
#define CB_UP BUTTON_UP
|
||||||
|
#define CB_DOWN BUTTON_DOWN
|
||||||
|
#define CB_LEFT BUTTON_LEFT
|
||||||
|
#define CB_RIGHT BUTTON_RIGHT
|
||||||
|
#define CB_PLAY BUTTON_MENU
|
||||||
|
#define CB_LEVEL (BUTTON_MENU|BUTTON_OFF)
|
||||||
|
#define CB_QUIT BUTTON_OFF
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error CHESSBOX: Unsupported keypad
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* use 30x30 tiles */
|
||||||
|
#if (LCD_HEIGHT >= 240) && (LCD_WIDTH >= 240)
|
||||||
|
#define TILE_WIDTH 30
|
||||||
|
#define TILE_HEIGHT 30
|
||||||
|
/* use 22x22 tiles */
|
||||||
|
#elif (LCD_HEIGHT >= 176) && (LCD_WIDTH >= 176)
|
||||||
|
#define TILE_WIDTH 22
|
||||||
|
#define TILE_HEIGHT 22
|
||||||
|
/* use 16x16 tiles */
|
||||||
|
#elif (LCD_HEIGHT >= 128) && (LCD_WIDTH >= 128)
|
||||||
|
#define TILE_WIDTH 16
|
||||||
|
#define TILE_HEIGHT 16
|
||||||
|
/* use 8x8 tiles */
|
||||||
|
#elif (LCD_HEIGHT >= 64) && (LCD_WIDTH >= 64)
|
||||||
|
#define TILE_WIDTH 8
|
||||||
|
#define TILE_HEIGHT 8
|
||||||
|
#else
|
||||||
|
#error BEJEWELED: Unsupported LCD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Calculate Offsets */
|
||||||
|
#define XOFS ((LCD_WIDTH-8*TILE_WIDTH)/2)
|
||||||
|
#define YOFS ((LCD_HEIGHT-8*TILE_HEIGHT)/2)
|
||||||
|
|
||||||
|
/* commands enum */
|
||||||
|
#define COMMAND_MOVE 1
|
||||||
|
#define COMMAND_PLAY 2
|
||||||
|
#define COMMAND_LEVEL 3
|
||||||
|
/*#define COMMAND_RESTART 4*/
|
||||||
|
#define COMMAND_QUIT 5
|
||||||
|
|
||||||
|
/* ---- Get the board column and row (e2 f.e.) for a physical x y ---- */
|
||||||
|
void xy2cr ( short x, short y, short *c, short *r ) {
|
||||||
|
if (computer == black ) {
|
||||||
|
*c = x ;
|
||||||
|
*r = y ;
|
||||||
|
} else {
|
||||||
|
*c = 7 - x ;
|
||||||
|
*r = 7 - y ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- get physical x y for a board column and row (e2 f.e.) ---- */
|
||||||
|
void cr2xy ( short c, short r, short *x, short *y ) {
|
||||||
|
if ( computer == black ) {
|
||||||
|
*x = c ;
|
||||||
|
*y = r ;
|
||||||
|
} else {
|
||||||
|
*x = 7 - c ;
|
||||||
|
*y = 7 - r ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Draw a complete board ---- */
|
||||||
|
static void cb_drawboard (void) {
|
||||||
|
short r , c , x , y ;
|
||||||
|
short l , piece , p_color ;
|
||||||
|
int b_color=1;
|
||||||
|
|
||||||
|
rb->lcd_clear_display();
|
||||||
|
|
||||||
|
for (r = 0; r < 8; r++) {
|
||||||
|
for (c = 0; c < 8; c++) {
|
||||||
|
l = locn[r][c];
|
||||||
|
piece = board[l] ;
|
||||||
|
p_color = color[l] ;
|
||||||
|
cr2xy ( c , r , &x , &y );
|
||||||
|
if ( piece == no_piece ) {
|
||||||
|
rb->lcd_bitmap_part ( chessbox_pieces , 0 ,
|
||||||
|
TILE_HEIGHT * b_color ,
|
||||||
|
TILE_WIDTH ,
|
||||||
|
XOFS + x*TILE_WIDTH ,
|
||||||
|
YOFS + ( 7 - y )*TILE_HEIGHT ,
|
||||||
|
TILE_WIDTH ,
|
||||||
|
TILE_HEIGHT );
|
||||||
|
} else {
|
||||||
|
rb->lcd_bitmap_part ( chessbox_pieces ,
|
||||||
|
0 ,
|
||||||
|
2 * TILE_HEIGHT +
|
||||||
|
4 * TILE_HEIGHT * ( piece - 1 ) +
|
||||||
|
2 * TILE_HEIGHT * p_color +
|
||||||
|
TILE_HEIGHT * b_color ,
|
||||||
|
TILE_WIDTH ,
|
||||||
|
XOFS + x*TILE_WIDTH ,
|
||||||
|
YOFS + (7 - y)*TILE_HEIGHT ,
|
||||||
|
TILE_WIDTH ,
|
||||||
|
TILE_HEIGHT );
|
||||||
|
}
|
||||||
|
b_color = (b_color == 1) ? 0 : 1 ;
|
||||||
|
}
|
||||||
|
b_color = (b_color == 1) ? 0 : 1 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* draw board limits */
|
||||||
|
if ( LCD_WIDTH > TILE_WIDTH*8 ) {
|
||||||
|
rb->lcd_set_drawmode ( DRMODE_FG );
|
||||||
|
rb->lcd_drawline ( XOFS - 1 , YOFS ,
|
||||||
|
XOFS - 1 , YOFS + TILE_HEIGHT*8 );
|
||||||
|
rb->lcd_drawline ( XOFS + 8*TILE_WIDTH , YOFS ,
|
||||||
|
XOFS + 8*TILE_WIDTH , YOFS + TILE_HEIGHT*8 );
|
||||||
|
}
|
||||||
|
if ( LCD_HEIGHT > TILE_HEIGHT*8 ) {
|
||||||
|
rb->lcd_set_drawmode ( DRMODE_FG );
|
||||||
|
rb->lcd_drawline ( XOFS , YOFS - 1 ,
|
||||||
|
XOFS + TILE_WIDTH*8 , YOFS - 1 );
|
||||||
|
rb->lcd_drawline ( XOFS , YOFS + TILE_HEIGHT*8 ,
|
||||||
|
XOFS + 8*TILE_WIDTH , YOFS + TILE_HEIGHT*8 );
|
||||||
|
}
|
||||||
|
rb->lcd_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- Switch mark on board ---- */
|
||||||
|
void cb_switch ( short x , short y ) {
|
||||||
|
rb->lcd_set_drawmode ( DRMODE_COMPLEMENT );
|
||||||
|
rb->lcd_drawrect ( XOFS + x*TILE_WIDTH + 1 ,
|
||||||
|
YOFS + ( 7 - y )*TILE_HEIGHT +1 ,
|
||||||
|
TILE_WIDTH-2 , TILE_HEIGHT-2 );
|
||||||
|
rb->lcd_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---- increase playing level ---- */
|
||||||
|
void cb_levelup ( void ) {
|
||||||
|
Level ++;
|
||||||
|
if ( Level == 8 ) Level = 1;
|
||||||
|
switch (Level) {
|
||||||
|
case 1 :
|
||||||
|
TCmoves = 60;
|
||||||
|
TCminutes = 5;
|
||||||
|
rb->splash ( 50 , true , "Level 1: 60 moves / 5 min" );
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
|
TCmoves = 60;
|
||||||
|
TCminutes = 15;
|
||||||
|
rb->splash ( 50 , true , "Level 2: 60 moves / 15 min" );
|
||||||
|
break;
|
||||||
|
case 3 :
|
||||||
|
TCmoves = 60;
|
||||||
|
TCminutes = 30;
|
||||||
|
rb->splash ( 50 , true , "Level 3: 60 moves / 30 min" );
|
||||||
|
break;
|
||||||
|
case 4 :
|
||||||
|
TCmoves = 40;
|
||||||
|
TCminutes = 30;
|
||||||
|
rb->splash ( 50 , true , "Level 4: 40 moves / 30 min" );
|
||||||
|
break;
|
||||||
|
case 5 :
|
||||||
|
TCmoves = 40;
|
||||||
|
TCminutes = 60;
|
||||||
|
rb->splash ( 50 , true , "Level 5: 40 moves / 60 min" );
|
||||||
|
break;
|
||||||
|
case 6 :
|
||||||
|
TCmoves = 40;
|
||||||
|
TCminutes = 120;
|
||||||
|
rb->splash ( 50 , true , "Level 6: 40 moves / 120 min" );
|
||||||
|
break;
|
||||||
|
case 7 :
|
||||||
|
TCmoves = 40;
|
||||||
|
TCminutes = 240;
|
||||||
|
rb->splash ( 50 , true , "Level 7: 40 moves / 240 min" );
|
||||||
|
break;
|
||||||
|
case 8 :
|
||||||
|
TCmoves = 1;
|
||||||
|
TCminutes = 15;
|
||||||
|
rb->splash ( 50 , true , "Level 8: 1 move / 15 min" );
|
||||||
|
break;
|
||||||
|
case 9 :
|
||||||
|
TCmoves = 1;
|
||||||
|
TCminutes = 60;
|
||||||
|
rb->splash ( 50 , true , "Level 9: 1 move / 60 min" );
|
||||||
|
break;
|
||||||
|
case 10 :
|
||||||
|
TCmoves = 1;
|
||||||
|
TCminutes = 600;
|
||||||
|
rb->splash ( 50 , true , "Level 10: 1 move / 600 min" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TCflag = (TCmoves > 1);
|
||||||
|
SetTimeControl();
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---- main user loop ---- */
|
||||||
|
struct cb_command cb_getcommand (void) {
|
||||||
|
static short x = 4 , y = 4 ;
|
||||||
|
short c , r , l;
|
||||||
|
int button = BUTTON_NONE;
|
||||||
|
int marked = false , from_marked = false ;
|
||||||
|
short marked_x = 0 , marked_y = 0 ;
|
||||||
|
struct cb_command result;
|
||||||
|
|
||||||
|
cb_switch ( x , y );
|
||||||
|
/* main loop */
|
||||||
|
while ( true ) {
|
||||||
|
button = rb->button_get(true);
|
||||||
|
switch (button) {
|
||||||
|
case CB_QUIT:
|
||||||
|
result.type = COMMAND_QUIT;
|
||||||
|
return result;
|
||||||
|
/* case CB_RESTART:
|
||||||
|
result.type = COMMAND_RESTART;
|
||||||
|
return result;*/
|
||||||
|
case CB_LEVEL:
|
||||||
|
result.type = COMMAND_LEVEL;
|
||||||
|
return result;
|
||||||
|
case CB_PLAY:
|
||||||
|
result.type = COMMAND_PLAY;
|
||||||
|
return result;
|
||||||
|
case CB_UP:
|
||||||
|
if ( !from_marked ) cb_switch ( x , y );
|
||||||
|
y++;
|
||||||
|
if ( y == 8 ) {
|
||||||
|
y = 0;
|
||||||
|
x--;
|
||||||
|
if ( x < 0 ) x = 7;
|
||||||
|
}
|
||||||
|
if ( marked && ( marked_x == x ) && ( marked_y == y ) ) {
|
||||||
|
from_marked = true ;
|
||||||
|
} else {
|
||||||
|
from_marked = false ;
|
||||||
|
cb_switch ( x , y );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CB_DOWN:
|
||||||
|
if ( !from_marked ) cb_switch ( x , y );
|
||||||
|
y--;
|
||||||
|
if ( y < 0 ) {
|
||||||
|
y = 7;
|
||||||
|
x++;
|
||||||
|
if ( x == 8 ) x = 0;
|
||||||
|
}
|
||||||
|
if ( marked && ( marked_x == x ) && ( marked_y == y ) ) {
|
||||||
|
from_marked = true ;
|
||||||
|
} else {
|
||||||
|
from_marked = false ;
|
||||||
|
cb_switch ( x , y );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CB_LEFT:
|
||||||
|
if ( !from_marked ) cb_switch ( x , y );
|
||||||
|
x--;
|
||||||
|
if ( x < 0 ) {
|
||||||
|
x = 7;
|
||||||
|
y++;
|
||||||
|
if ( y == 8 ) y = 0;
|
||||||
|
}
|
||||||
|
if ( marked && ( marked_x == x ) && ( marked_y == y ) ) {
|
||||||
|
from_marked = true ;
|
||||||
|
} else {
|
||||||
|
from_marked = false ;
|
||||||
|
cb_switch ( x , y );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CB_RIGHT:
|
||||||
|
if ( !from_marked ) cb_switch ( x , y );
|
||||||
|
x++;
|
||||||
|
if ( x == 8 ) {
|
||||||
|
x = 0;
|
||||||
|
y--;
|
||||||
|
if ( y < 0 ) y = 7;
|
||||||
|
}
|
||||||
|
if ( marked && ( marked_x == x ) && ( marked_y == y ) ) {
|
||||||
|
from_marked = true ;
|
||||||
|
} else {
|
||||||
|
from_marked = false ;
|
||||||
|
cb_switch ( x , y );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CB_SELECT:
|
||||||
|
if ( !marked ) {
|
||||||
|
xy2cr ( x , y , &c , &r );
|
||||||
|
l = locn[r][c];
|
||||||
|
if ( ( color[l]!=computer ) && ( board[l]!=no_piece ) ) {
|
||||||
|
marked = true;
|
||||||
|
from_marked = true ;
|
||||||
|
marked_x = x;
|
||||||
|
marked_y = y;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( ( marked_x == x ) && ( marked_y == y ) ) {
|
||||||
|
marked = false;
|
||||||
|
from_marked = false;
|
||||||
|
} else {
|
||||||
|
xy2cr ( marked_x , marked_y , &c , &r );
|
||||||
|
result.mv_s[0] = 'a' + c;
|
||||||
|
result.mv_s[1] = '1' + r;
|
||||||
|
xy2cr ( x , y , &c , &r );
|
||||||
|
result.mv_s[2] = 'a' + c;
|
||||||
|
result.mv_s[3] = '1' + r;
|
||||||
|
result.mv_s[4] = '\00';
|
||||||
|
result.type = COMMAND_MOVE;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* plugin entry point.
|
||||||
|
******************************************************************************/
|
||||||
|
enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
|
||||||
|
struct cb_command command;
|
||||||
|
/* init status */
|
||||||
|
bool exit = false;
|
||||||
|
|
||||||
|
/* plugin init */
|
||||||
|
(void)parameter;
|
||||||
|
rb = api;
|
||||||
|
/* end of plugin init */
|
||||||
|
|
||||||
|
/* load opening book, soon */
|
||||||
|
|
||||||
|
/* init board */
|
||||||
|
GNUChess_Initialize();
|
||||||
|
|
||||||
|
/* draw the board */
|
||||||
|
/* I don't like configscreens, start game inmediatly */
|
||||||
|
cb_drawboard();
|
||||||
|
|
||||||
|
while (!exit) {
|
||||||
|
if ( mate ) {
|
||||||
|
rb->splash ( 500 , true , "Checkmate!" );
|
||||||
|
rb->button_get(true);
|
||||||
|
GNUChess_Initialize();
|
||||||
|
cb_drawboard();
|
||||||
|
}
|
||||||
|
command = cb_getcommand ();
|
||||||
|
switch (command.type) {
|
||||||
|
case COMMAND_MOVE:
|
||||||
|
if ( ! VerifyMove ( command.mv_s , 0 , &command.mv ) ) {
|
||||||
|
rb->splash ( 50 , true , "Illegal move!" );
|
||||||
|
cb_drawboard();
|
||||||
|
} else {
|
||||||
|
cb_drawboard();
|
||||||
|
rb->splash ( 0 , true , "Thinking..." );
|
||||||
|
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
|
||||||
|
rb->cpu_boost ( true );
|
||||||
|
#endif
|
||||||
|
SelectMove ( computer , 0 );
|
||||||
|
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
|
||||||
|
rb->cpu_boost ( false );
|
||||||
|
#endif
|
||||||
|
cb_drawboard();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
/* case COMMAND_RESTART:
|
||||||
|
GNUChess_Initialize();
|
||||||
|
cb_drawboard();
|
||||||
|
break;*/
|
||||||
|
case COMMAND_PLAY:
|
||||||
|
opponent = !opponent; computer = !computer;
|
||||||
|
rb->splash ( 0 , true , "Thinking..." );
|
||||||
|
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
|
||||||
|
rb->cpu_boost ( true );
|
||||||
|
#endif
|
||||||
|
SelectMove ( computer , 0 );
|
||||||
|
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
|
||||||
|
rb->cpu_boost ( false );
|
||||||
|
#endif
|
||||||
|
cb_drawboard();
|
||||||
|
break;
|
||||||
|
case COMMAND_LEVEL:
|
||||||
|
cb_levelup ( );
|
||||||
|
cb_drawboard();
|
||||||
|
break;
|
||||||
|
case COMMAND_QUIT:
|
||||||
|
/*cb_saveposition();*/
|
||||||
|
exit = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rb->lcd_setfont(FONT_UI);
|
||||||
|
return PLUGIN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_LCD_BITMAP */
|
||||||
2405
apps/plugins/chessbox/gnuchess.c
Normal file
2405
apps/plugins/chessbox/gnuchess.c
Normal file
File diff suppressed because it is too large
Load diff
37
apps/plugins/chessbox/gnuchess.h
Normal file
37
apps/plugins/chessbox/gnuchess.h
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
#ifndef _GNUCHESS_H_
|
||||||
|
#define _GNUCHESS_H_
|
||||||
|
|
||||||
|
#define neutral 2
|
||||||
|
#define white 0
|
||||||
|
#define black 1
|
||||||
|
#define no_piece 0
|
||||||
|
#define pawn 1
|
||||||
|
#define knight 2
|
||||||
|
#define bishop 3
|
||||||
|
#define rook 4
|
||||||
|
#define queen 5
|
||||||
|
#define king 6
|
||||||
|
#define valueP 100
|
||||||
|
#define valueN 350
|
||||||
|
#define valueB 355
|
||||||
|
#define valueR 550
|
||||||
|
#define valueQ 1100
|
||||||
|
#define valueK 1200
|
||||||
|
|
||||||
|
|
||||||
|
extern short mate,opponent,computer;
|
||||||
|
extern short locn[8][8];
|
||||||
|
extern short board[64];
|
||||||
|
extern short color[64];
|
||||||
|
extern long Level;
|
||||||
|
extern short TCflag,TCmoves,TCminutes;
|
||||||
|
|
||||||
|
|
||||||
|
void SetTimeControl(void);
|
||||||
|
void GNUChess_Initialize(void);
|
||||||
|
int VerifyMove(char s[],short iop,unsigned short *mv);
|
||||||
|
int SelectMove ( short side, short iop);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -171,3 +171,4 @@ Mikael Magnusson
|
||||||
Dominik Wenger
|
Dominik Wenger
|
||||||
Henrico Witvliet
|
Henrico Witvliet
|
||||||
Andrew Scott
|
Andrew Scott
|
||||||
|
Miguel A. Arévalo
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue