summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/brickmania.c284
-rw-r--r--apps/plugins/clix.c36
-rw-r--r--apps/plugins/jewels.c66
-rw-r--r--apps/plugins/lib/display_text.c5
-rw-r--r--apps/plugins/pegbox.c176
-rw-r--r--apps/plugins/robotfindskitten.c49
-rw-r--r--apps/plugins/solitaire.c172
-rw-r--r--apps/plugins/star.c314
-rw-r--r--apps/plugins/superdom.c53
9 files changed, 409 insertions, 746 deletions
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
index 2f11cef24e..f0229b4f8b 100644
--- a/apps/plugins/brickmania.c
+++ b/apps/plugins/brickmania.c
@@ -22,6 +22,7 @@
22#include "plugin.h" 22#include "plugin.h"
23#include "lib/configfile.h" /* Part of libplugin */ 23#include "lib/configfile.h" /* Part of libplugin */
24#include "lib/helper.h" 24#include "lib/helper.h"
25#include "lib/display_text.h"
25 26
26PLUGIN_HEADER 27PLUGIN_HEADER
27 28
@@ -1130,154 +1131,84 @@ int game_menu(int when)
1130 } 1131 }
1131} 1132}
1132 1133
1133int help(int when) 1134int help(void)
1134{ 1135{
1135 int w,h;
1136 int button; 1136 int button;
1137 int xoffset=0; 1137#define WORDS (sizeof help_text / sizeof (char*))
1138 int yoffset=0; 1138 static char* help_text[] = {
1139 /* set the maximum x and y in the helpscreen 1139 "BrickMania", "", "Aim", "",
1140 dont forget to update, if you change text */ 1140 "Destroy", "all", "the", "bricks", "by", "bouncing",
1141 int maxY=180; 1141 "the", "ball", "of", "them", "using", "the", "paddle.", "", "",
1142 int maxX=215; 1142 "Controls", "",
1143 1143 "< & >", "Move", "the", "paddle", "",
1144 while(true) {
1145#ifdef HAVE_LCD_COLOR
1146 rb->lcd_set_background(LCD_BLACK);
1147 rb->lcd_clear_display();
1148 rb->lcd_set_background(LCD_BLACK);
1149 rb->lcd_set_foreground(LCD_WHITE);
1150#else
1151 rb->lcd_clear_display();
1152#endif
1153
1154 rb->lcd_getstringsize("BrickMania", &w, &h);
1155 rb->lcd_putsxy(LCD_WIDTH/2-w/2+xoffset, 1+yoffset, "BrickMania");
1156
1157#ifdef HAVE_LCD_COLOR
1158 rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
1159 rb->lcd_putsxy(1+xoffset, 1*(h+2)+yoffset,"Aim");
1160 rb->lcd_set_foreground(LCD_WHITE);
1161#else
1162 rb->lcd_putsxy(1+xoffset, 1*(h+2)+yoffset,"Aim");
1163#endif
1164 rb->lcd_putsxy(1+xoffset, 2*(h+2)+yoffset,
1165 "destroy all the bricks by bouncing");
1166 rb->lcd_putsxy(1+xoffset, 3*(h+2)+yoffset,
1167 "the ball of them using the paddle.");
1168#ifdef HAVE_LCD_COLOR
1169 rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
1170 rb->lcd_putsxy(1+xoffset, 5*(h+2)+yoffset,"Controls");
1171 rb->lcd_set_foreground(LCD_WHITE);
1172#else
1173 rb->lcd_putsxy(1+xoffset, 5*(h+2)+yoffset,"Controls");
1174#endif
1175 rb->lcd_putsxy(1+xoffset, 6*(h+2)+yoffset,"< & > Move the paddle");
1176#if CONFIG_KEYPAD == ONDIO_PAD 1144#if CONFIG_KEYPAD == ONDIO_PAD
1177 rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset, 1145 "MENU",
1178 "MENU Releases the ball/Fire!");
1179#elif (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == IAUDIO_M3_PAD) 1146#elif (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == IAUDIO_M3_PAD)
1180 rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset, 1147 "PLAY",
1181 "PLAY Releases the ball/Fire!");
1182#elif CONFIG_KEYPAD == IRIVER_H300_PAD 1148#elif CONFIG_KEYPAD == IRIVER_H300_PAD
1183 rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset, 1149 "NAVI",
1184 "NAVI Releases the ball/Fire!");
1185#else 1150#else
1186 rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset, 1151 "SELECT",
1187 "SELECT Releases the ball/Fire!");
1188#endif 1152#endif
1153 "Releases", "the", "ball/", "Fire!", "",
1189#if CONFIG_KEYPAD == IAUDIO_M3_PAD 1154#if CONFIG_KEYPAD == IAUDIO_M3_PAD
1190 rb->lcd_putsxy(1+xoffset, 8*(h+2)+yoffset, "REC Opens menu/Quit"); 1155 "REC",
1156#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) || \
1157 (CONFIG_KEYPAD == CREATIVEZVM_PAD)
1158 "BACK",
1159#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
1160 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
1161 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
1162 "MENU",
1163#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
1164 (CONFIG_KEYPAD == IRIVER_H300_PAD) || \
1165 (CONFIG_KEYPAD == ONDIO_PAD) || \
1166 (CONFIG_KEYPAD == RECORDER_PAD) || \
1167 (CONFIG_KEYPAD == ARCHOS_AV300_PAD)
1168 "STOP",
1191#else 1169#else
1192 rb->lcd_putsxy(1+xoffset, 8*(h+2)+yoffset, "STOP Opens menu/Quit"); 1170 "POWER",
1193#endif 1171#endif
1172 "Opens", "menu/", "Quit", "", "",
1173 "Specials", "",
1174 "N", "Normal:", "returns", "paddle", "to", "normal", "",
1175 "D", "DIE!:", "loses", "a", "life", "",
1176 "L", "Life:", "gains", "a", "life/", "power", "up", "",
1177 "F", "Fire:", "allows", "you", "to", "shoot", "bricks", "",
1178 "G", "Glue:", "ball", "sticks", "to", "paddle", "",
1179 "B", "Ball:", "generates", "another", "ball", "",
1180 "FL", "Flip:", "flips", "left /", "right", "movement",
1181 };
1182 static struct style_text formation[]={
1183 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1184 { 2, C_RED },
1185 { 19, C_RED },
1186 { 38, C_RED },
1187 { 40, C_BLUE },
1188 { 47, C_RED },
1189 { 53, C_GREEN },
1190 { 61, C_ORANGE },
1191 { 69, C_GREEN },
1192 { 76, C_YELLOW },
1193 { 82, C_RED },
1194 { -1, 0 }
1195 };
1196
1194#ifdef HAVE_LCD_COLOR 1197#ifdef HAVE_LCD_COLOR
1195 rb->lcd_set_foreground(LCD_RGBPACK(245,0,0)); 1198 rb->lcd_set_background(LCD_BLACK);
1196 rb->lcd_putsxy(1+xoffset, 10*(h+2)+yoffset, "Specials"); 1199 rb->lcd_set_foreground(LCD_WHITE);
1197 rb->lcd_set_foreground(LCD_WHITE);
1198#else
1199 rb->lcd_putsxy(1+xoffset, 10*(h+2)+yoffset, "Specials");
1200#endif 1200#endif
1201 rb->lcd_putsxy(1+xoffset, 11*(h+2)+yoffset,
1202 "N Normal:returns paddle to normal");
1203 rb->lcd_putsxy(1+xoffset, 12*(h+2)+yoffset, "D DIE!:loses a life");
1204 rb->lcd_putsxy(1+xoffset, 13*(h+2)+yoffset,
1205 "L Life:gains a life/power up");
1206 rb->lcd_putsxy(1+xoffset, 14*(h+2)+yoffset,
1207 "F Fire:allows you to shoot bricks");
1208 rb->lcd_putsxy(1+xoffset, 15*(h+2)+yoffset,
1209 "G Glue:ball sticks to paddle");
1210 rb->lcd_putsxy(1+xoffset, 16*(h+2)+yoffset,
1211 "B Ball:generates another ball");
1212 rb->lcd_putsxy(1+xoffset, 17*(h+2)+yoffset,
1213 "FL Flip:flips left / right movement");
1214 rb->lcd_update();
1215 1201
1216 button=rb->button_get(true); 1202 rb->lcd_setfont(FONT_UI);
1217 switch (button) { 1203 if (display_text(WORDS, help_text, formation, NULL))
1218#ifdef RC_QUIT 1204 return 1;
1219 case RC_QUIT: 1205 do {
1220#endif 1206 button = rb->button_get(true);
1221#ifdef HAVE_TOUCHSCREEN 1207 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
1222 case BUTTON_TOUCHSCREEN: 1208 return 1;
1223#endif 1209 } while( ( button == BUTTON_NONE )
1224 case QUIT: 1210 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
1225 switch (game_menu(when)) { 1211 rb->lcd_setfont(FONT_SYSFIXED);
1226 case 0:
1227 cur_level=0;
1228 life=2;
1229 int_game(1);
1230 break;
1231 case 1:
1232 con_game=1;
1233 break;
1234 case 2:
1235 if (help(when)==1)
1236 return 1;
1237 break;
1238 case 3:
1239 return 1;
1240 break;
1241 }
1242 return 0;
1243 break;
1244 case LEFT:
1245 case LEFT | BUTTON_REPEAT:
1246#ifdef ALTLEFT
1247 case ALTLEFT:
1248 case ALTLEFT | BUTTON_REPEAT:
1249#endif
1250 if( xoffset<0)
1251 xoffset+=2;
1252 break;
1253 case RIGHT:
1254 case RIGHT | BUTTON_REPEAT:
1255#ifdef ALTRIGHT
1256 case ALTRIGHT:
1257 case ALTRIGHT | BUTTON_REPEAT:
1258#endif
1259 if(xoffset+maxX > LCD_WIDTH)
1260 xoffset-=2;
1261 break;
1262 case UP:
1263 case UP | BUTTON_REPEAT:
1264 if(yoffset <0)
1265 yoffset+=2;
1266 break;
1267 case DOWN:
1268 case DOWN | BUTTON_REPEAT:
1269 if(yoffset+maxY > LCD_HEIGHT)
1270 yoffset-=2;
1271 break;
1272
1273 default:
1274 if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
1275 return 1;
1276 break;
1277 }
1278
1279 rb->yield();
1280 }
1281 return 0; 1212 return 0;
1282} 1213}
1283 1214
@@ -1315,10 +1246,6 @@ int game_loop(void)
1315 int sec_count=0,num_count=10; 1246 int sec_count=0,num_count=10;
1316 int end; 1247 int end;
1317 1248
1318 rb->srand( *rb->current_tick );
1319
1320 configfile_load(HIGH_SCORE,config,1,0);
1321
1322 switch(game_menu(0)) { 1249 switch(game_menu(0)) {
1323 case 0: 1250 case 0:
1324 cur_level = 0; 1251 cur_level = 0;
@@ -1329,7 +1256,7 @@ int game_loop(void)
1329 con_game = 1; 1256 con_game = 1;
1330 break; 1257 break;
1331 case 2: 1258 case 2:
1332 if (help(0) == 1) return 1; 1259 return help();
1333 break; 1260 break;
1334 case 3: 1261 case 3:
1335 return 1; 1262 return 1;
@@ -1885,22 +1812,7 @@ int game_loop(void)
1885 sleep(3); 1812 sleep(3);
1886 } 1813 }
1887 1814
1888 switch(game_menu(0)) { 1815 return 0;
1889 case 0:
1890 life=2;
1891 cur_level=0;
1892 int_game(1);
1893 break;
1894 case 1:
1895 con_game=1;
1896 break;
1897 case 2:
1898 if (help(0)==1) return 1;
1899 break;
1900 case 3:
1901 return 1;
1902 break;
1903 }
1904 } 1816 }
1905 } 1817 }
1906 1818
@@ -2029,24 +1941,28 @@ int game_loop(void)
2029 case RC_QUIT: 1941 case RC_QUIT:
2030#endif 1942#endif
2031 case QUIT: 1943 case QUIT:
2032 switch(game_menu(1)) { 1944 while(1) {
2033 case 0: 1945 switch(game_menu(1)) {
2034 life=2; 1946 case 0:
2035 cur_level=0; 1947 life=2;
2036 int_game(1); 1948 cur_level=0;
2037 break; 1949 int_game(1);
2038 case 1: 1950 break;
2039 for(k=0;k<used_balls;k++) 1951 case 1:
2040 if (ball[k].x!=0 && ball[k].y !=0) 1952 for(k=0;k<used_balls;k++)
2041 con_game=1; 1953 if (ball[k].x!=0 && ball[k].y !=0)
2042 break; 1954 con_game=1;
2043 case 2: 1955 break;
2044 if (help(1)==1) 1956 case 2:
1957 if (help()==1)
1958 return 1;
1959 continue;
1960 break;
1961 case 3:
2045 return 1; 1962 return 1;
2046 break; 1963 break;
2047 case 3: 1964 }
2048 return 1; 1965 break;
2049 break;
2050 } 1966 }
2051 1967
2052 for(k=0;k<used_balls;k++) { 1968 for(k=0;k<used_balls;k++) {
@@ -2091,23 +2007,7 @@ int game_loop(void)
2091 ball[k].y=0; 2007 ball[k].y=0;
2092 } 2008 }
2093 2009
2094 switch(game_menu(0)) { 2010 return 0;
2095 case 0:
2096 cur_level=0;
2097 life=2;
2098 int_game(1);
2099 break;
2100 case 1:
2101 con_game=1;
2102 break;
2103 case 2:
2104 if (help(0)==1)
2105 return 1;
2106 break;
2107 case 3:
2108 return 1;
2109 break;
2110 }
2111 } 2011 }
2112 if (end > *rb->current_tick) 2012 if (end > *rb->current_tick)
2113 rb->sleep(end-*rb->current_tick); 2013 rb->sleep(end-*rb->current_tick);
@@ -2128,6 +2028,10 @@ enum plugin_status plugin_start(const void* parameter)
2128 /* Turn off backlight timeout */ 2028 /* Turn off backlight timeout */
2129 backlight_force_on(); /* backlight control in lib/helper.c */ 2029 backlight_force_on(); /* backlight control in lib/helper.c */
2130 2030
2031 rb->srand( *rb->current_tick );
2032
2033 configfile_load(HIGH_SCORE,config,1,0);
2034
2131 /* now go ahead and have fun! */ 2035 /* now go ahead and have fun! */
2132 while (game_loop()!=1); 2036 while (game_loop()!=1);
2133 2037
diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c
index a6a3bdd626..78bfdb8fdf 100644
--- a/apps/plugins/clix.c
+++ b/apps/plugins/clix.c
@@ -592,34 +592,34 @@ static int clix_clear_selected(struct clix_game_state_t* state)
592 return state->status; 592 return state->status;
593} 593}
594 594
595static int clix_help(void) 595static bool clix_help(void)
596{ 596{
597 rb->lcd_setfont(FONT_UI);
598 rb->lcd_set_foreground(LCD_WHITE);
599#define WORDS (sizeof help_text / sizeof (char*)) 597#define WORDS (sizeof help_text / sizeof (char*))
600 static char *help_text[] = { 598 static char *help_text[] = {
601 "Clix", "", "Aim", "", "Remove", "all", "blocks", "from", "the", 599 "Clix", "", "Aim", "",
602 "board", "to", "achieve", "the", "next", "level.", "You", "can", 600 "Remove", "all", "blocks", "from", "the", "board", "to", "achieve",
603 "only", "remove", "blocks,", "if", "at", "least", "two", "blocks", 601 "the", "next", "level.", "You", "can", "only", "remove", "blocks,",
604 "with", "the", "same", "color", "have", "a", "direct", "connection.", 602 "if", "at", "least", "two", "blocks", "with", "the", "same", "color",
605 "The", "more", "blocks", "you", "remove", "per", "turn,", "the", 603 "have", "a", "direct", "connection.", "The", "more", "blocks", "you",
606 "more", "points", "you", "get." 604 "remove", "per", "turn,", "the", "more", "points", "you", "get."
607 }; 605 };
608 static struct style_text formation[]={ 606 static struct style_text formation[]={
609 { 0, TEXT_CENTER|TEXT_UNDERLINE }, 607 { 0, TEXT_CENTER|TEXT_UNDERLINE },
610 { 2, C_RED } 608 { 2, C_RED },
609 { -1, 0 }
611 }; 610 };
612
613 if (display_text(WORDS, help_text, formation, NULL)==PLUGIN_USB_CONNECTED)
614 return PLUGIN_USB_CONNECTED;
615 int button; 611 int button;
612
613 rb->lcd_setfont(FONT_UI);
614 rb->lcd_set_foreground(LCD_WHITE);
615 if (display_text(WORDS, help_text, formation, NULL))
616 return true;
616 do { 617 do {
617 button = rb->button_get(true); 618 button = rb->button_get(true);
618 if (button == SYS_USB_CONNECTED) { 619 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
619 return PLUGIN_USB_CONNECTED; 620 return true;
620 }
621 } while( ( button == BUTTON_NONE ) 621 } while( ( button == BUTTON_NONE )
622 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) ); 622 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
623 rb->lcd_setfont(FONT_SYSFIXED); 623 rb->lcd_setfont(FONT_SYSFIXED);
624 return 0; 624 return 0;
625} 625}
@@ -656,7 +656,7 @@ static int clix_menu(struct clix_game_state_t* state, bool ingame)
656 clix_init(state); 656 clix_init(state);
657 return 0; 657 return 0;
658 case 2: 658 case 2:
659 if (clix_help()==PLUGIN_USB_CONNECTED) 659 if (clix_help())
660 return 1; 660 return 1;
661 break; 661 break;
662 case 3: 662 case 3:
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index 08051c8e9e..f19c63fd24 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -38,6 +38,8 @@ PLUGIN_HEADER
38#define JEWELS_RIGHT BUTTON_RIGHT 38#define JEWELS_RIGHT BUTTON_RIGHT
39#define JEWELS_SELECT BUTTON_PLAY 39#define JEWELS_SELECT BUTTON_PLAY
40#define JEWELS_CANCEL BUTTON_OFF 40#define JEWELS_CANCEL BUTTON_OFF
41#define HK_SELECT "PLAY"
42#define HK_CANCEL "OFF"
41 43
42#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD 44#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
43#define JEWELS_UP BUTTON_UP 45#define JEWELS_UP BUTTON_UP
@@ -46,6 +48,8 @@ PLUGIN_HEADER
46#define JEWELS_RIGHT BUTTON_RIGHT 48#define JEWELS_RIGHT BUTTON_RIGHT
47#define JEWELS_SELECT BUTTON_SELECT 49#define JEWELS_SELECT BUTTON_SELECT
48#define JEWELS_CANCEL BUTTON_OFF 50#define JEWELS_CANCEL BUTTON_OFF
51#define HK_SELECT "SELECT"
52#define HK_CANCEL "OFF"
49 53
50#elif CONFIG_KEYPAD == ONDIO_PAD 54#elif CONFIG_KEYPAD == ONDIO_PAD
51#define JEWELS_UP BUTTON_UP 55#define JEWELS_UP BUTTON_UP
@@ -54,6 +58,8 @@ PLUGIN_HEADER
54#define JEWELS_RIGHT BUTTON_RIGHT 58#define JEWELS_RIGHT BUTTON_RIGHT
55#define JEWELS_SELECT BUTTON_MENU 59#define JEWELS_SELECT BUTTON_MENU
56#define JEWELS_CANCEL BUTTON_OFF 60#define JEWELS_CANCEL BUTTON_OFF
61#define HK_SELECT "MENU"
62#define HK_CANCEL "OFF"
57 63
58#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) 64#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
59#define JEWELS_UP BUTTON_UP 65#define JEWELS_UP BUTTON_UP
@@ -63,6 +69,8 @@ PLUGIN_HEADER
63#define JEWELS_SELECT BUTTON_SELECT 69#define JEWELS_SELECT BUTTON_SELECT
64#define JEWELS_CANCEL BUTTON_OFF 70#define JEWELS_CANCEL BUTTON_OFF
65#define JEWELS_RC_CANCEL BUTTON_RC_STOP 71#define JEWELS_RC_CANCEL BUTTON_RC_STOP
72#define HK_SELECT "SELECT"
73#define HK_CANCEL "OFF"
66 74
67#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 75#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
68 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 76 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
@@ -75,6 +83,8 @@ PLUGIN_HEADER
75#define JEWELS_NEXT BUTTON_SCROLL_FWD 83#define JEWELS_NEXT BUTTON_SCROLL_FWD
76#define JEWELS_SELECT BUTTON_SELECT 84#define JEWELS_SELECT BUTTON_SELECT
77#define JEWELS_CANCEL (BUTTON_SELECT | BUTTON_MENU) 85#define JEWELS_CANCEL (BUTTON_SELECT | BUTTON_MENU)
86#define HK_SELECT "SELECT"
87#define HK_CANCEL "SEL + MENU"
78 88
79#elif (CONFIG_KEYPAD == IPOD_3G_PAD) 89#elif (CONFIG_KEYPAD == IPOD_3G_PAD)
80#define JEWELS_LEFT BUTTON_LEFT 90#define JEWELS_LEFT BUTTON_LEFT
@@ -83,6 +93,8 @@ PLUGIN_HEADER
83#define JEWELS_DOWN BUTTON_SCROLL_FWD 93#define JEWELS_DOWN BUTTON_SCROLL_FWD
84#define JEWELS_SELECT BUTTON_SELECT 94#define JEWELS_SELECT BUTTON_SELECT
85#define JEWELS_CANCEL BUTTON_MENU 95#define JEWELS_CANCEL BUTTON_MENU
96#define HK_SELECT "SELECT"
97#define HK_CANCEL "MENU"
86 98
87#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD 99#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
88#define JEWELS_UP BUTTON_UP 100#define JEWELS_UP BUTTON_UP
@@ -91,6 +103,8 @@ PLUGIN_HEADER
91#define JEWELS_RIGHT BUTTON_RIGHT 103#define JEWELS_RIGHT BUTTON_RIGHT
92#define JEWELS_SELECT BUTTON_SELECT 104#define JEWELS_SELECT BUTTON_SELECT
93#define JEWELS_CANCEL BUTTON_PLAY 105#define JEWELS_CANCEL BUTTON_PLAY
106#define HK_SELECT "SELECT"
107#define HK_CANCEL "PLAY"
94 108
95#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD 109#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
96#define JEWELS_UP BUTTON_UP 110#define JEWELS_UP BUTTON_UP
@@ -99,6 +113,8 @@ PLUGIN_HEADER
99#define JEWELS_RIGHT BUTTON_RIGHT 113#define JEWELS_RIGHT BUTTON_RIGHT
100#define JEWELS_SELECT BUTTON_SELECT 114#define JEWELS_SELECT BUTTON_SELECT
101#define JEWELS_CANCEL BUTTON_POWER 115#define JEWELS_CANCEL BUTTON_POWER
116#define HK_SELECT "SELECT"
117#define HK_CANCEL "POWER"
102 118
103#elif CONFIG_KEYPAD == GIGABEAT_PAD 119#elif CONFIG_KEYPAD == GIGABEAT_PAD
104#define JEWELS_UP BUTTON_UP 120#define JEWELS_UP BUTTON_UP
@@ -107,6 +123,8 @@ PLUGIN_HEADER
107#define JEWELS_RIGHT BUTTON_RIGHT 123#define JEWELS_RIGHT BUTTON_RIGHT
108#define JEWELS_SELECT BUTTON_SELECT 124#define JEWELS_SELECT BUTTON_SELECT
109#define JEWELS_CANCEL BUTTON_POWER 125#define JEWELS_CANCEL BUTTON_POWER
126#define HK_SELECT "SELECT"
127#define HK_CANCEL "POWER"
110 128
111#elif CONFIG_KEYPAD == SANSA_E200_PAD 129#elif CONFIG_KEYPAD == SANSA_E200_PAD
112#define JEWELS_SCROLLWHEEL 130#define JEWELS_SCROLLWHEEL
@@ -118,6 +136,8 @@ PLUGIN_HEADER
118#define JEWELS_NEXT BUTTON_SCROLL_FWD 136#define JEWELS_NEXT BUTTON_SCROLL_FWD
119#define JEWELS_SELECT BUTTON_SELECT 137#define JEWELS_SELECT BUTTON_SELECT
120#define JEWELS_CANCEL BUTTON_POWER 138#define JEWELS_CANCEL BUTTON_POWER
139#define HK_SELECT "SELECT"
140#define HK_CANCEL "POWER"
121 141
122#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) 142#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
123#define JEWELS_SCROLLWHEEL 143#define JEWELS_SCROLLWHEEL
@@ -129,6 +149,8 @@ PLUGIN_HEADER
129#define JEWELS_NEXT BUTTON_SCROLL_FWD 149#define JEWELS_NEXT BUTTON_SCROLL_FWD
130#define JEWELS_SELECT BUTTON_SELECT 150#define JEWELS_SELECT BUTTON_SELECT
131#define JEWELS_CANCEL (BUTTON_HOME|BUTTON_REPEAT) 151#define JEWELS_CANCEL (BUTTON_HOME|BUTTON_REPEAT)
152#define HK_SELECT "SELECT"
153#define HK_CANCEL "HOME"
132 154
133#elif CONFIG_KEYPAD == SANSA_C200_PAD || \ 155#elif CONFIG_KEYPAD == SANSA_C200_PAD || \
134CONFIG_KEYPAD == SANSA_CLIP_PAD || \ 156CONFIG_KEYPAD == SANSA_CLIP_PAD || \
@@ -139,6 +161,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
139#define JEWELS_RIGHT BUTTON_RIGHT 161#define JEWELS_RIGHT BUTTON_RIGHT
140#define JEWELS_SELECT BUTTON_SELECT 162#define JEWELS_SELECT BUTTON_SELECT
141#define JEWELS_CANCEL BUTTON_POWER 163#define JEWELS_CANCEL BUTTON_POWER
164#define HK_SELECT "SELECT"
165#define HK_CANCEL "POWER"
142 166
143#elif CONFIG_KEYPAD == IRIVER_H10_PAD 167#elif CONFIG_KEYPAD == IRIVER_H10_PAD
144#define JEWELS_UP BUTTON_SCROLL_UP 168#define JEWELS_UP BUTTON_SCROLL_UP
@@ -147,6 +171,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
147#define JEWELS_RIGHT BUTTON_RIGHT 171#define JEWELS_RIGHT BUTTON_RIGHT
148#define JEWELS_SELECT BUTTON_PLAY 172#define JEWELS_SELECT BUTTON_PLAY
149#define JEWELS_CANCEL BUTTON_POWER 173#define JEWELS_CANCEL BUTTON_POWER
174#define HK_SELECT "PLAY"
175#define HK_CANCEL "POWER"
150 176
151#elif CONFIG_KEYPAD == GIGABEAT_S_PAD 177#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
152#define JEWELS_UP BUTTON_UP 178#define JEWELS_UP BUTTON_UP
@@ -155,6 +181,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
155#define JEWELS_RIGHT BUTTON_RIGHT 181#define JEWELS_RIGHT BUTTON_RIGHT
156#define JEWELS_SELECT BUTTON_SELECT 182#define JEWELS_SELECT BUTTON_SELECT
157#define JEWELS_CANCEL BUTTON_BACK 183#define JEWELS_CANCEL BUTTON_BACK
184#define HK_SELECT "SELECT"
185#define HK_CANCEL "BACK"
158 186
159#elif CONFIG_KEYPAD == MROBE100_PAD 187#elif CONFIG_KEYPAD == MROBE100_PAD
160#define JEWELS_UP BUTTON_UP 188#define JEWELS_UP BUTTON_UP
@@ -163,6 +191,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
163#define JEWELS_RIGHT BUTTON_RIGHT 191#define JEWELS_RIGHT BUTTON_RIGHT
164#define JEWELS_SELECT BUTTON_SELECT 192#define JEWELS_SELECT BUTTON_SELECT
165#define JEWELS_CANCEL BUTTON_POWER 193#define JEWELS_CANCEL BUTTON_POWER
194#define HK_SELECT "SELECT"
195#define HK_CANCEL "POWER"
166 196
167#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 197#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
168#define JEWELS_UP BUTTON_RC_VOL_UP 198#define JEWELS_UP BUTTON_RC_VOL_UP
@@ -171,10 +201,14 @@ CONFIG_KEYPAD == SANSA_M200_PAD
171#define JEWELS_RIGHT BUTTON_RC_FF 201#define JEWELS_RIGHT BUTTON_RC_FF
172#define JEWELS_SELECT BUTTON_RC_PLAY 202#define JEWELS_SELECT BUTTON_RC_PLAY
173#define JEWELS_CANCEL BUTTON_RC_REC 203#define JEWELS_CANCEL BUTTON_RC_REC
204#define HK_SELECT "PLAY"
205#define HK_CANCEL "REC"
206
174#define JEWELS_RC_CANCEL BUTTON_REC 207#define JEWELS_RC_CANCEL BUTTON_REC
175 208
176#elif CONFIG_KEYPAD == COWOND2_PAD 209#elif CONFIG_KEYPAD == COWOND2_PAD
177#define JEWELS_CANCEL BUTTON_POWER 210#define JEWELS_CANCEL BUTTON_POWER
211#define HK_CANCEL "POWER"
178 212
179#elif CONFIG_KEYPAD == IAUDIO67_PAD 213#elif CONFIG_KEYPAD == IAUDIO67_PAD
180#define JEWELS_UP BUTTON_STOP 214#define JEWELS_UP BUTTON_STOP
@@ -183,6 +217,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
183#define JEWELS_RIGHT BUTTON_RIGHT 217#define JEWELS_RIGHT BUTTON_RIGHT
184#define JEWELS_SELECT BUTTON_MENU 218#define JEWELS_SELECT BUTTON_MENU
185#define JEWELS_CANCEL BUTTON_POWER 219#define JEWELS_CANCEL BUTTON_POWER
220#define HK_SELECT "MENU"
221#define HK_CANCEL "POWER"
186 222
187#elif CONFIG_KEYPAD == CREATIVEZVM_PAD 223#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
188#define JEWELS_UP BUTTON_UP 224#define JEWELS_UP BUTTON_UP
@@ -191,6 +227,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
191#define JEWELS_RIGHT BUTTON_RIGHT 227#define JEWELS_RIGHT BUTTON_RIGHT
192#define JEWELS_SELECT BUTTON_SELECT 228#define JEWELS_SELECT BUTTON_SELECT
193#define JEWELS_CANCEL BUTTON_BACK 229#define JEWELS_CANCEL BUTTON_BACK
230#define HK_SELECT "MIDDLE"
231#define HK_CANCEL "BACK"
194 232
195#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD 233#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
196#define JEWELS_UP BUTTON_UP 234#define JEWELS_UP BUTTON_UP
@@ -199,10 +237,13 @@ CONFIG_KEYPAD == SANSA_M200_PAD
199#define JEWELS_RIGHT BUTTON_RIGHT 237#define JEWELS_RIGHT BUTTON_RIGHT
200#define JEWELS_SELECT BUTTON_SELECT 238#define JEWELS_SELECT BUTTON_SELECT
201#define JEWELS_CANCEL BUTTON_POWER 239#define JEWELS_CANCEL BUTTON_POWER
240#define HK_SELECT "SELECT"
241#define HK_CANCEL "POWER"
202 242
203#elif CONFIG_KEYPAD == ONDAVX747_PAD || \ 243#elif CONFIG_KEYPAD == ONDAVX747_PAD || \
204CONFIG_KEYPAD == MROBE500_PAD 244CONFIG_KEYPAD == MROBE500_PAD
205#define JEWELS_CANCEL BUTTON_POWER 245#define JEWELS_CANCEL BUTTON_POWER
246#define HK_CANCEL "POWER"
206 247
207#else 248#else
208#error No keymap defined! 249#error No keymap defined!
@@ -223,9 +264,11 @@ CONFIG_KEYPAD == MROBE500_PAD
223#endif 264#endif
224#ifndef JEWELS_SELECT 265#ifndef JEWELS_SELECT
225#define JEWELS_SELECT BUTTON_CENTER 266#define JEWELS_SELECT BUTTON_CENTER
267#define HK_SELECT "CENTER"
226#endif 268#endif
227#ifndef JEWELS_CANCEL 269#ifndef JEWELS_CANCEL
228#define JEWELS_CANCEL BUTTON_TOPLEFT 270#define JEWELS_CANCEL BUTTON_TOPLEFT
271#define HK_CANCEL "TOPLEFT"
229#endif 272#endif
230#endif 273#endif
231 274
@@ -1312,15 +1355,26 @@ static int jewels_help(void)
1312 rb->lcd_setfont(FONT_UI); 1355 rb->lcd_setfont(FONT_UI);
1313#define WORDS (sizeof help_text / sizeof (char*)) 1356#define WORDS (sizeof help_text / sizeof (char*))
1314 static char *help_text[] = { 1357 static char *help_text[] = {
1315 "Jewels", "", "Aim", "", "Swap", "pairs", "of", "jewels", "to", 1358 "Jewels", "", "Aim", "",
1316 "form", "connected", "segments", "of", "three", "or", "more", "of", 1359 "Swap", "pairs", "of", "jewels", "to", "form", "connected",
1317 "the", "same", "type.", "", "The", "goal", "of", "the", "game", 1360 "segments", "of", "three", "or", "more", "of", "the", "same",
1318 "is", "to", "score", "as", "many", "points", "as", "possible", 1361 "type.", "",
1319 "before", "running", "out", "of", "available", "moves." 1362 "The", "goal", "of", "the", "game", "is", "to", "score", "as", "many",
1363 "points", "as", "possible", "before", "running", "out", "of",
1364 "available", "moves.", "", "",
1365 "Controls", "",
1366 "Directions",
1367#ifdef JEWELS_SCROLLWHEEL
1368 "or", "scroll",
1369#endif
1370 "to", "move", "",
1371 HK_SELECT, "to", "select", "",
1372 HK_CANCEL, "to", "go", "to", "menu"
1320 }; 1373 };
1321 static struct style_text formation[]={ 1374 static struct style_text formation[]={
1322 { 0, TEXT_CENTER|TEXT_UNDERLINE }, 1375 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1323 { 2, C_RED } 1376 { 2, C_RED },
1377 { -1, 0 }
1324 }; 1378 };
1325 1379
1326#ifdef HAVE_LCD_COLOR 1380#ifdef HAVE_LCD_COLOR
diff --git a/apps/plugins/lib/display_text.c b/apps/plugins/lib/display_text.c
index 67c78ec242..c6b5710644 100644
--- a/apps/plugins/lib/display_text.c
+++ b/apps/plugins/lib/display_text.c
@@ -135,10 +135,5 @@ bool display_text(short words, char** text, struct style_text* style,
135#ifdef HAVE_LCD_BITMAP 135#ifdef HAVE_LCD_BITMAP
136 rb->lcd_set_drawmode(prev_drawmode); 136 rb->lcd_set_drawmode(prev_drawmode);
137#endif 137#endif
138#ifdef HAVE_LCD_COLOR
139 if (style!=NULL) {
140 rb->lcd_set_foreground(standard_fgcolor);
141 }
142#endif
143 return false; 138 return false;
144} 139}
diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c
index d6f87cd46b..eb53eca8b5 100644
--- a/apps/plugins/pegbox.c
+++ b/apps/plugins/pegbox.c
@@ -19,6 +19,7 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "plugin.h" 21#include "plugin.h"
22#include "lib/display_text.h"
22 23
23#include "pluginbitmaps/pegbox_header.h" 24#include "pluginbitmaps/pegbox_header.h"
24#include "pluginbitmaps/pegbox_pieces.h" 25#include "pluginbitmaps/pegbox_pieces.h"
@@ -720,111 +721,6 @@ char levels[NUM_LEVELS][ROWS][COLS] = {
720 721
721 722
722/***************************************************************************** 723/*****************************************************************************
723* display_text() formats and outputs text.
724******************************************************************************/
725static void display_text(char *str, bool waitkey)
726{
727 int chars_by_line;
728 int lines_by_screen;
729 int chars_for_line;
730 int current_line = 0;
731 int char_width, char_height;
732 int first_char_index = 0;
733 char *ptr_char;
734 char *ptr_line;
735 int i;
736 char line[255];
737 int key;
738 bool go_on;
739
740 rb->lcd_clear_display();
741
742 rb->lcd_getstringsize("a", &char_width, &char_height);
743
744 chars_by_line = LCD_WIDTH / char_width;
745 lines_by_screen = LCD_HEIGHT / char_height;
746
747 do
748 {
749 ptr_char = str + first_char_index;
750 chars_for_line = 0;
751 i = 0;
752 ptr_line = line;
753 while (i < chars_by_line)
754 {
755 switch (*ptr_char)
756 {
757 case '\t':
758 case ' ':
759 *(ptr_line++) = ' ';
760 case '\n':
761 case '\0':
762 chars_for_line = i;
763 break;
764
765 default:
766 *(ptr_line++) = *ptr_char;
767 }
768 if (*ptr_char == '\n' || *ptr_char == '\0')
769 break;
770 ptr_char++;
771 i++;
772 }
773
774 if (chars_for_line == 0)
775 chars_for_line = i;
776
777 line[chars_for_line] = '\0';
778
779 /* test if we have cut a word. If it is the case we don't have to */
780 /* skip the space */
781 if (i == chars_by_line && chars_for_line == chars_by_line)
782 first_char_index += chars_for_line;
783 else
784 first_char_index += chars_for_line + 1;
785
786 /* print the line on the screen */
787 rb->lcd_putsxy(0, current_line * char_height, line);
788
789 /* if the number of line showed on the screen is equals to the */
790 /* maximum number of line we can show, we wait for a key pressed to */
791 /* clear and show the remaining text. */
792 current_line++;
793 if (current_line == lines_by_screen || *ptr_char == '\0')
794 {
795 current_line = 0;
796 rb->lcd_update();
797 go_on = false;
798 while (waitkey && !go_on)
799 {
800 key = rb->button_get(true);
801 switch (key)
802 {
803#ifdef HAVE_TOUCHSCREEN
804 case BUTTON_TOUCHSCREEN:
805#endif
806 case PEGBOX_QUIT:
807 case PEGBOX_LEFT:
808 case PEGBOX_DOWN:
809 go_on = true;
810 break;
811
812 default:
813 /*if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
814 {
815 usb_detected = true;
816 go_on = true;
817 break;
818 }*/
819 break;
820 }
821 }
822 rb->lcd_clear_display();
823 }
824 } while (*ptr_char != '\0');
825}
826
827/*****************************************************************************
828* draw_board() draws the game's current level. 724* draw_board() draws the game's current level.
829******************************************************************************/ 725******************************************************************************/
830static void draw_board(struct game_context* pb) { 726static void draw_board(struct game_context* pb) {
@@ -1127,6 +1023,48 @@ static void pegbox_callback(void* param) {
1127 pegbox_savedata(pb); 1023 pegbox_savedata(pb);
1128} 1024}
1129 1025
1026/***********************************************************************
1027* pegbox_help() display help text
1028************************************************************************/
1029static bool pegbox_help(void)
1030{
1031 int button;
1032#define WORDS (sizeof help_text / sizeof (char*))
1033 static char* help_text[] = {
1034 "Pegbox", "", "Aim", "",
1035 "To", "beat", "each", "level,", "you", "must", "destroy", "all", "of",
1036 "the", "pegs.", "If", "two", "like", "pegs", "are", "pushed", "into",
1037 "each", "other,", "they", "disappear", "except", "for", "triangles",
1038 "which", "form", "a", "solid", "block", "and", "crosses", "which",
1039 "allow", "you", "to", "choose", "a", "replacement", "block.", "", "",
1040 "Controls", "",
1041 RESTART_TEXT, "to", "restart", "level", "",
1042 LVL_UP_TEXT, "to", "go", "up", "a", "level", "",
1043 LVL_DOWN_TEXT, "to", "go", "down", "a", "level", "",
1044 SAVE_TEXT, "to", "select/save", "",
1045 QUIT_TEXT, "to", "quit"
1046 };
1047 static struct style_text formation[]={
1048 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1049 { 2, C_RED },
1050 { 46, C_RED },
1051 { -1, 0 }
1052 };
1053
1054 rb->lcd_setfont(FONT_UI);
1055
1056 if (display_text(WORDS, help_text, formation, NULL))
1057 return true;
1058 do {
1059 button = rb->button_get(true);
1060 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
1061 return true;
1062 } while( ( button == BUTTON_NONE )
1063 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
1064 rb->lcd_setfont(FONT_SYSFIXED);
1065 return false;
1066}
1067
1130/***************************************************************************** 1068/*****************************************************************************
1131* pegbox_menu() is the initial menu at the start of the game. 1069* pegbox_menu() is the initial menu at the start of the game.
1132******************************************************************************/ 1070******************************************************************************/
@@ -1251,28 +1189,12 @@ static unsigned int pegbox_menu(struct game_context* pb) {
1251 pb->save_exist = false; 1189 pb->save_exist = false;
1252 } 1190 }
1253 breakout = true; 1191 breakout = true;
1254 } 1192 }
1255 else if (loc == 2) 1193 else if (loc == 2)
1256 display_text("How to Play\nTo beat each level, you must " 1194 {
1257 "destroy all of the pegs. If two like pegs are " 1195 if(pegbox_help())
1258 "pushed into each other they disappear except " 1196 return PB_USB;
1259 "for triangles which form a solid block and " 1197 }
1260 "crosses which allow you to choose a "
1261 "replacement block.\n\n"
1262 "Controls\n"
1263#if LCD_HEIGHT > 64
1264 RESTART_TEXT " to restart level\n"
1265 LVL_UP_TEXT " to go up a level\n"
1266 LVL_DOWN_TEXT " to go down a level\n"
1267 SAVE_TEXT " to select/save\n"
1268 QUIT_TEXT " to quit\n",true);
1269#else
1270 RESTART_TEXT ": restart\n"
1271 LVL_UP_TEXT ": level up\n"
1272 LVL_DOWN_TEXT " level down\n"
1273 SAVE_TEXT " select/save\n"
1274 QUIT_TEXT " quit\n",true);
1275#endif
1276 else if (loc == 3) 1198 else if (loc == 3)
1277 return PB_QUIT; 1199 return PB_QUIT;
1278 break; 1200 break;
@@ -1462,7 +1384,7 @@ enum plugin_status plugin_start(const void* parameter) {
1462 rb->lcd_setfont(FONT_SYSFIXED); 1384 rb->lcd_setfont(FONT_SYSFIXED);
1463#if LCD_DEPTH > 1 1385#if LCD_DEPTH > 1
1464 rb->lcd_set_backdrop(NULL); 1386 rb->lcd_set_backdrop(NULL);
1465#endif 1387#endif
1466#ifdef HAVE_LCD_COLOR 1388#ifdef HAVE_LCD_COLOR
1467 rb->lcd_set_foreground(LCD_WHITE); 1389 rb->lcd_set_foreground(LCD_WHITE);
1468 rb->lcd_set_background(BG_COLOR); 1390 rb->lcd_set_background(BG_COLOR);
diff --git a/apps/plugins/robotfindskitten.c b/apps/plugins/robotfindskitten.c
index 1010531951..ed3cda2fc7 100644
--- a/apps/plugins/robotfindskitten.c
+++ b/apps/plugins/robotfindskitten.c
@@ -30,6 +30,7 @@
30 30
31#include "plugin.h" 31#include "plugin.h"
32#include "lib/pluginlib_actions.h" 32#include "lib/pluginlib_actions.h"
33#include "lib/display_text.h"
33 34
34/* This macros must always be included. Should be placed at the top by 35/* This macros must always be included. Should be placed at the top by
35 convention, although the actual position doesn't matter */ 36 convention, although the actual position doesn't matter */
@@ -692,7 +693,7 @@ static void play_game()
692#else 693#else
693 input = rb->button_get(true); 694 input = rb->button_get(true);
694#endif 695#endif
695 } 696 }
696 message("Bye!"); 697 message("Bye!");
697 refresh(); 698 refresh();
698} 699}
@@ -794,7 +795,7 @@ static int validchar(char a)
794 switch(a) 795 switch(a)
795 { 796 {
796 case '#': 797 case '#':
797 case ' ': 798 case ' ':
798 case 127: 799 case 127:
799 return 0; 800 return 0;
800 } 801 }
@@ -850,45 +851,23 @@ static void play_animation(int input)
850 851
851static void instructions() 852static void instructions()
852{ 853{
853#define MARGIN 2 854#define WORDS (sizeof help_text / sizeof (char*))
854 int y = MARGIN, space_w, width, height; 855 static char* help_text[] = {
855 unsigned short x = MARGIN, i = 0;
856#define WORDS (sizeof instructions / sizeof (char*))
857 static char* instructions[] = {
858#if 0 856#if 0
859 /* Not sure if we want to include this? */ 857 /* Not sure if we want to include this? */
860 "robotfindskitten", RFK_VERSION, "", "", 858 "robotfindskitten", RFK_VERSION, "", "",
861 "By", "the", "illustrious", "Leonard", "Richardson", "(C)", "1997,", "2000", "", 859 "By", "the", "illustrious", "Leonard", "Richardson", "(C)", "1997,", "2000", "",
862 "Written", "originally", "for", "the", "Nerth", "Pork", "robotfindskitten", "contest", "", "", 860 "Written", "originally", "for", "the", "Nerth", "Pork", "robotfindskitten", "contest", "", "",
863#endif 861#endif
864 "In", "this", "game", "you", "are", "robot", "(#).", "Your", "job", "is", "to", "find", "kitten.", "This", "task", "is", "complicated", "by", "the", "existence", "of", "various", "things", "which", "are", "not", "kitten.", "Robot", "must", "touch", "items", "to", "determine", "if", "they", "are", "kitten", "or", "not.", "", 862 "In", "this", "game", "you", "are", "robot", "(#).", "Your", "job", "is",
863 "to", "find", "kitten.", "This", "task", "is", "complicated", "by", "the",
864 "existence", "of", "various", "things", "which", "are", "not", "kitten.",
865 "Robot", "must", "touch", "items", "to", "determine", "if", "they", "are",
866 "kitten", "or", "not.", "",
865 "The", "game", "ends", "when", "robotfindskitten.", "", "", 867 "The", "game", "ends", "when", "robotfindskitten.", "", "",
866 "Press", "any", "key", "to", "start", 868 "Press", "any", "key", "to", "start",
867 }; 869 };
868 rb->lcd_clear_display(); 870 display_text(WORDS, help_text, NULL, NULL);
869 rb->lcd_getstringsize(" ", &space_w, &height);
870 for (i = 0; i < WORDS; i++) {
871 rb->lcd_getstringsize(instructions[i], &width, NULL);
872 /* Skip to next line if the current one can't fit the word */
873 if (x + width > LCD_WIDTH - MARGIN) {
874 x = MARGIN;
875 y += height;
876 }
877 /* .. or if the word is the empty string */
878 if (rb->strcmp(instructions[i], "") == 0) {
879 x = MARGIN;
880 y += height;
881 continue;
882 }
883 /* We filled the screen */
884 if (y + height > LCD_HEIGHT - MARGIN) {
885 y = MARGIN;
886 pause();
887 rb->lcd_clear_display();
888 }
889 rb->lcd_putsxy(x, y, instructions[i]);
890 x += width + space_w;
891 }
892 pause(); 871 pause();
893} 872}
894 873
@@ -953,7 +932,7 @@ static void initialize_kitten()
953 /*Assign the kitten a character and a color.*/ 932 /*Assign the kitten a character and a color.*/
954 do { 933 do {
955 kitten.character = randchar(); 934 kitten.character = randchar();
956 } while (!(validchar(kitten.character))); 935 } while (!(validchar(kitten.character)));
957 screen[kitten.x][kitten.y] = KITTEN; 936 screen[kitten.x][kitten.y] = KITTEN;
958 937
959 kitten.color = colors[randcolor()]; 938 kitten.color = colors[randcolor()];
@@ -973,7 +952,7 @@ static void initialize_bogus()
973 /*Give it a character.*/ 952 /*Give it a character.*/
974 do { 953 do {
975 bogus[counter].character = randchar(); 954 bogus[counter].character = randchar();
976 } while (!(validchar(bogus[counter].character))); 955 } while (!(validchar(bogus[counter].character)));
977 956
978 /*Give it a position.*/ 957 /*Give it a position.*/
979 do { 958 do {
@@ -1059,7 +1038,7 @@ enum plugin_status plugin_start(const void* parameter)
1059 /* 1038 /*
1060 * Run the game 1039 * Run the game
1061 */ 1040 */
1062 instructions(); 1041 instructions();
1063 1042
1064 initialize_screen(); 1043 initialize_screen();
1065 1044
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index 47b1b25fa0..668f0d5f96 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -22,6 +22,7 @@
22#include "plugin.h" 22#include "plugin.h"
23#include "lib/playback_control.h" 23#include "lib/playback_control.h"
24#include "lib/configfile.h" 24#include "lib/configfile.h"
25#include "lib/display_text.h"
25#include "button.h" 26#include "button.h"
26#include "lcd.h" 27#include "lcd.h"
27 28
@@ -448,26 +449,6 @@ PLUGIN_HEADER
448#endif 449#endif
449 450
450/** 451/**
451 * Help strings
452 */
453
454static int helplines;
455static int displaylines;
456
457static char helptext[] =
458 /* Use single spaces only! Close each line with one \0. */
459 "-- Navigation --\0"
460 HK_LR ": Move the cursor to the previous/ next column.\0"
461 HK_UD ": Move the cursor up/ down in the column.\0"
462 HK_MOVE ": Select cards, move cards, reveal hidden cards...\0"
463 HK_DRAW ": Deselect a card if it was selected. Else draw new card(s) from the remains stack.\0"
464 "-- Shortcuts --\0"
465 HK_REM2CUR ": Put the card on top of the remains stack on top of the cursor.\0"
466 HK_CUR2STACK ": Put the card under the cursor on one of the 4 final stacks.\0"
467 HK_REM2STACK ": Put the card on top of the remains stack on one of the 4 final stacks.\0"
468;
469
470/**
471 * Misc constants, graphics and other defines 452 * Misc constants, graphics and other defines
472 */ 453 */
473 454
@@ -634,122 +615,41 @@ static void draw_empty_stack( int s, int x, int y, bool cursor )
634 draw_card_ext( x, y, false, cursor ); 615 draw_card_ext( x, y, false, cursor );
635} 616}
636 617
637/** 618/* Help */
638 * Help 619static bool solitaire_help( void )
639 */
640
641static void init_help(void)
642{
643 int lines = 0;
644 int w_space, w, h;
645 int para_len;
646 char *para = helptext;
647
648 rb->lcd_getstringsize(" ", &w_space, &h);
649 displaylines = LCD_HEIGHT / h;
650 para_len = rb->strlen(para);
651
652 while (para_len)
653 {
654 bool first = true;
655 int x = 0;
656 char *next, *store;
657
658 next = rb->strtok_r(para, " ", &store);
659 while (next)
660 {
661 rb->lcd_getstringsize(next, &w, NULL);
662 if (!first)
663 {
664 if (x + w > LCD_WIDTH)
665 {
666 lines++;
667 x = 0;
668 }
669 else
670 next[-1] = ' '; /* re-concatenate string */
671 }
672 else
673 first = false;
674
675 x += w + w_space;
676 next = rb->strtok_r(NULL, " ", &store);
677 }
678
679 lines++;
680 para += para_len + 1;
681 para_len = rb->strlen(para);
682 }
683 helplines = lines;
684}
685
686enum help { HELP_QUIT, HELP_USB };
687
688/* help for the not so intuitive interface */
689enum help solitaire_help( void )
690{ 620{
691 int start = 0;
692 int button; 621 int button;
693 int lastbutton = BUTTON_NONE; 622#define WORDS (sizeof help_text / sizeof (char*))
694 bool fixed = (displaylines >= helplines); 623 static char* help_text[] = {
695 624 "Solitaire", "", "Controlls", "",
696 while( true ) 625 HK_LR ":", "Move", "the", "cursor", "to", "the",
697 { 626 "previous/", "next", "column.", "",
698 char *text = helptext; 627 HK_UD ":", "Move", "the", "cursor", "up/", "down", "in", "the",
699 int line = fixed ? (displaylines - helplines) / 2 : 0; 628 "column.", "",
700 int i; 629 HK_MOVE ":", "Select", "cards,", "move", "cards...", "",
701 630 HK_DRAW ":", "Deselect", "a", "card", "if", "it", "was", "selected.",
702 rb->lcd_clear_display(); 631 "Else", "draw", "new", "card(s)", "from", "the", "remains",
703 632 "stack.", "", "",
704 for (i = 0; i < start + displaylines; i++) 633 "Shortcuts", "",
705 { 634 HK_REM2CUR ":", "Put", "the", "card", "on", "top", "of", "the",
706 if (i >= start) 635 "remains", "stack", "on", "top", "of", "the", "cursor.", "",
707 rb->lcd_puts(0, line++, text); 636 HK_CUR2STACK ":", "Put", "the", "card", "under", "the", "cursor",
708 text += rb->strlen(text) + 1; 637 "on", "one", "of", "the", "4", "final", "stacks.", "",
709 } 638 HK_REM2STACK ":", "Put", "the", "card", "on", "top", "of", "the",
710 rb->lcd_update(); 639 "remains", "stack", "on", "one", "of", "the", "4", "final",
711 640 "stacks."
712 button = rb->button_get( true ); 641 };
713 switch( button ) 642
714 { 643 if (display_text(WORDS, help_text, NULL, NULL))
715 case SOL_UP: 644 return true;
716#ifdef SOL_UP_PRE 645 do {
717 if( lastbutton != SOL_UP_PRE ) 646 button = rb->button_get(true);
718 break; 647 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
719#else 648 return true;
720 case SOL_UP|BUTTON_REPEAT: 649 } while( ( button == BUTTON_NONE )
721#endif 650 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
722 if (!fixed && start > 0) 651
723 start--; 652 return false;
724 break;
725
726 case SOL_DOWN:
727#ifdef SOL_DOWN_PRE
728 if( lastbutton != SOL_DOWN_PRE )
729 break;
730#else
731 case SOL_DOWN|BUTTON_REPEAT:
732#endif
733 if (!fixed && start < helplines - displaylines)
734 start++;
735 break;
736
737#ifdef SOL_RC_QUIT
738 case SOL_RC_QUIT:
739#endif
740 case SOL_QUIT:
741 return HELP_QUIT;
742
743 default:
744 if( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
745 return HELP_USB;
746 break;
747 }
748 if( button != BUTTON_NONE )
749 lastbutton = button;
750
751 rb->yield();
752 }
753} 653}
754 654
755/** 655/**
@@ -831,7 +731,7 @@ int solitaire_menu(bool in_game)
831 break; 731 break;
832 732
833 case 3: 733 case 3:
834 if (solitaire_help() == HELP_USB) 734 if (solitaire_help())
835 result = MENU_USB; 735 result = MENU_USB;
836 break; 736 break;
837 737
@@ -1929,8 +1829,6 @@ enum plugin_status plugin_start(const void* parameter )
1929 else 1829 else
1930 result = SOLITAIRE_WIN; 1830 result = SOLITAIRE_WIN;
1931 1831
1932 init_help();
1933
1934 /* play the game :) 1832 /* play the game :)
1935 * Keep playing if a game was won (that means display the menu after 1833 * Keep playing if a game was won (that means display the menu after
1936 * winning instead of quiting) */ 1834 * winning instead of quiting) */
diff --git a/apps/plugins/star.c b/apps/plugins/star.c
index 4bb3afcbd5..0ab6dce17b 100644
--- a/apps/plugins/star.c
+++ b/apps/plugins/star.c
@@ -20,6 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "plugin.h" 21#include "plugin.h"
22#ifdef HAVE_LCD_BITMAP 22#ifdef HAVE_LCD_BITMAP
23#include "lib/display_text.h"
23 24
24PLUGIN_HEADER 25PLUGIN_HEADER
25 26
@@ -66,6 +67,11 @@ PLUGIN_HEADER
66#define STAR_LEVEL_UP BUTTON_F3 67#define STAR_LEVEL_UP BUTTON_F3
67#define STAR_LEVEL_DOWN BUTTON_F1 68#define STAR_LEVEL_DOWN BUTTON_F1
68#define STAR_LEVEL_REPEAT BUTTON_F2 69#define STAR_LEVEL_REPEAT BUTTON_F2
70#define STAR_TOGGLE_CONTROL_NAME "ON"
71#define STAR_QUIT_NAME "OFF"
72#define STAR_LEVEL_UP_NAME "F3"
73#define STAR_LEVEL_DOWN_NAME "F1"
74#define STAR_LEVEL_REPEAT_NAME "F2"
69 75
70#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD 76#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
71#define STAR_QUIT BUTTON_OFF 77#define STAR_QUIT BUTTON_OFF
@@ -78,6 +84,11 @@ PLUGIN_HEADER
78#define STAR_LEVEL_UP BUTTON_F3 84#define STAR_LEVEL_UP BUTTON_F3
79#define STAR_LEVEL_DOWN BUTTON_F1 85#define STAR_LEVEL_DOWN BUTTON_F1
80#define STAR_LEVEL_REPEAT BUTTON_F2 86#define STAR_LEVEL_REPEAT BUTTON_F2
87#define STAR_TOGGLE_CONTROL_NAME "ON/SELECT"
88#define STAR_QUIT_NAME "OFF"
89#define STAR_LEVEL_UP_NAME "F3"
90#define STAR_LEVEL_DOWN_NAME "F1"
91#define STAR_LEVEL_REPEAT_NAME "F2"
81 92
82#elif CONFIG_KEYPAD == ONDIO_PAD 93#elif CONFIG_KEYPAD == ONDIO_PAD
83#define STAR_QUIT BUTTON_OFF 94#define STAR_QUIT BUTTON_OFF
@@ -90,6 +101,11 @@ PLUGIN_HEADER
90#define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT) 101#define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
91#define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT) 102#define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
92#define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP) 103#define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
104#define STAR_TOGGLE_CONTROL_NAME "MODE"
105#define STAR_QUIT_NAME "OFF"
106#define STAR_LEVEL_UP_NAME "M >"
107#define STAR_LEVEL_DOWN_NAME "M <"
108#define STAR_LEVEL_REPEAT_NAME "M ^"
93 109
94#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 110#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
95 (CONFIG_KEYPAD == IRIVER_H300_PAD) 111 (CONFIG_KEYPAD == IRIVER_H300_PAD)
@@ -103,6 +119,11 @@ PLUGIN_HEADER
103#define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT) 119#define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
104#define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT) 120#define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
105#define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT) 121#define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
122#define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT"
123#define STAR_QUIT_NAME "OFF"
124#define STAR_LEVEL_UP_NAME "ON + RIGHT"
125#define STAR_LEVEL_DOWN_NAME "ON + LEFT"
126#define STAR_LEVEL_REPEAT_NAME "ON + NAVI"
106 127
107#define STAR_RC_QUIT BUTTON_RC_STOP 128#define STAR_RC_QUIT BUTTON_RC_STOP
108#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 129#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
@@ -119,6 +140,11 @@ PLUGIN_HEADER
119#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) 140#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
120#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) 141#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
121#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY) 142#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
143#define STAR_TOGGLE_CONTROL_NAME "SELECT"
144#define STAR_QUIT_NAME "S + MENU"
145#define STAR_LEVEL_UP_NAME "S >"
146#define STAR_LEVEL_DOWN_NAME "S <"
147#define STAR_LEVEL_REPEAT_NAME "S + PLAY"
122 148
123#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) 149#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
124 150
@@ -133,6 +159,11 @@ PLUGIN_HEADER
133#define STAR_LEVEL_DOWN_PRE BUTTON_REC 159#define STAR_LEVEL_DOWN_PRE BUTTON_REC
134#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT) 160#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
135#define STAR_LEVEL_REPEAT BUTTON_PLAY 161#define STAR_LEVEL_REPEAT BUTTON_PLAY
162#define STAR_TOGGLE_CONTROL_NAME "SELECT"
163#define STAR_QUIT_NAME "POWER"
164#define STAR_LEVEL_UP_NAME "REC"
165#define STAR_LEVEL_DOWN_NAME "REC.."
166#define STAR_LEVEL_REPEAT_NAME "PLAY"
136 167
137#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 168#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
138 169
@@ -145,13 +176,18 @@ PLUGIN_HEADER
145#define STAR_LEVEL_UP BUTTON_VOL_UP 176#define STAR_LEVEL_UP BUTTON_VOL_UP
146#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 177#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
147#define STAR_LEVEL_REPEAT BUTTON_A 178#define STAR_LEVEL_REPEAT BUTTON_A
179#define STAR_TOGGLE_CONTROL_NAME "SELECT"
180#define STAR_QUIT_NAME "POWER"
181#define STAR_LEVEL_UP_NAME "VOL UP"
182#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
183#define STAR_LEVEL_REPEAT_NAME "A"
148 184
149#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ 185#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
150(CONFIG_KEYPAD == SANSA_C200_PAD) || \ 186(CONFIG_KEYPAD == SANSA_C200_PAD) || \
151(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \ 187(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
152(CONFIG_KEYPAD == SANSA_M200_PAD) 188(CONFIG_KEYPAD == SANSA_M200_PAD)
153 189
154#define STAR_QUIT BUTTON_POWER 190#define STAR_QUIT BUTTON_POWER
155#define STAR_LEFT BUTTON_LEFT 191#define STAR_LEFT BUTTON_LEFT
156#define STAR_RIGHT BUTTON_RIGHT 192#define STAR_RIGHT BUTTON_RIGHT
157#define STAR_UP BUTTON_UP 193#define STAR_UP BUTTON_UP
@@ -160,11 +196,15 @@ PLUGIN_HEADER
160#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) 196#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
161#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) 197#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
162#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN) 198#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
163 199#define STAR_TOGGLE_CONTROL_NAME "SELECT"
200#define STAR_QUIT_NAME "POWER"
201#define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
202#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
203#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
164 204
165#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) 205#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
166 206
167#define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT) 207#define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
168#define STAR_LEFT BUTTON_LEFT 208#define STAR_LEFT BUTTON_LEFT
169#define STAR_RIGHT BUTTON_RIGHT 209#define STAR_RIGHT BUTTON_RIGHT
170#define STAR_UP BUTTON_UP 210#define STAR_UP BUTTON_UP
@@ -173,6 +213,11 @@ PLUGIN_HEADER
173#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT) 213#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
174#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT) 214#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
175#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN) 215#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
216#define STAR_TOGGLE_CONTROL_NAME "SELECT"
217#define STAR_QUIT_NAME "HOME"
218#define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
219#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
220#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
176 221
177#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) 222#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
178 223
@@ -185,6 +230,11 @@ PLUGIN_HEADER
185#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP) 230#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
186#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN) 231#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
187#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT) 232#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
233#define STAR_TOGGLE_CONTROL_NAME "REW"
234#define STAR_QUIT_NAME "POWER"
235#define STAR_LEVEL_UP_NAME "PLAY+UP"
236#define STAR_LEVEL_DOWN_NAME "PLAY+DOWN"
237#define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT"
188 238
189#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) 239#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
190 240
@@ -197,6 +247,11 @@ PLUGIN_HEADER
197#define STAR_LEVEL_UP BUTTON_VOL_UP 247#define STAR_LEVEL_UP BUTTON_VOL_UP
198#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 248#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
199#define STAR_LEVEL_REPEAT BUTTON_MENU 249#define STAR_LEVEL_REPEAT BUTTON_MENU
250#define STAR_TOGGLE_CONTROL_NAME "SELECT"
251#define STAR_QUIT_NAME "BACK"
252#define STAR_LEVEL_UP_NAME "VOL UP"
253#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
254#define STAR_LEVEL_REPEAT_NAME "MENU"
200 255
201#elif (CONFIG_KEYPAD == MROBE100_PAD) 256#elif (CONFIG_KEYPAD == MROBE100_PAD)
202 257
@@ -209,6 +264,11 @@ PLUGIN_HEADER
209#define STAR_LEVEL_UP BUTTON_PLAY 264#define STAR_LEVEL_UP BUTTON_PLAY
210#define STAR_LEVEL_DOWN BUTTON_MENU 265#define STAR_LEVEL_DOWN BUTTON_MENU
211#define STAR_LEVEL_REPEAT BUTTON_DISPLAY 266#define STAR_LEVEL_REPEAT BUTTON_DISPLAY
267#define STAR_TOGGLE_CONTROL_NAME "SELECT"
268#define STAR_QUIT_NAME "POWER"
269#define STAR_LEVEL_UP_NAME "PLAY"
270#define STAR_LEVEL_DOWN_NAME "MENU"
271#define STAR_LEVEL_REPEAT_NAME "DISPLAY"
212 272
213#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 273#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
214 274
@@ -221,11 +281,16 @@ PLUGIN_HEADER
221#define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP) 281#define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
222#define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN) 282#define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
223#define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU) 283#define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
284#define STAR_TOGGLE_CONTROL_NAME "MODE"
285#define STAR_QUIT_NAME "REC"
286#define STAR_LEVEL_UP_NAME "PLAY+VOL+"
287#define STAR_LEVEL_DOWN_NAME "PLAY+VOL-"
288#define STAR_LEVEL_REPEAT_NAME "PLAY+MENU"
224 289
225#elif (CONFIG_KEYPAD == COWOND2_PAD) 290#elif (CONFIG_KEYPAD == COWOND2_PAD)
226 291
227#define STAR_QUIT BUTTON_POWER 292#define STAR_QUIT BUTTON_POWER
228#define STAR_QUIT_NAME "[POWER]" 293#define STAR_QUIT_NAME "POWER"
229 294
230#elif CONFIG_KEYPAD == CREATIVEZVM_PAD 295#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
231 296
@@ -238,6 +303,11 @@ PLUGIN_HEADER
238#define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP) 303#define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
239#define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN) 304#define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
240#define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT) 305#define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
306#define STAR_TOGGLE_CONTROL_NAME "PLAY"
307#define STAR_QUIT_NAME "BACK"
308#define STAR_LEVEL_UP_NAME "CUSTOM+UP"
309#define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN"
310#define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT"
241 311
242#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD 312#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
243 313
@@ -250,15 +320,20 @@ PLUGIN_HEADER
250#define STAR_LEVEL_UP BUTTON_VOL_UP 320#define STAR_LEVEL_UP BUTTON_VOL_UP
251#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN 321#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
252#define STAR_LEVEL_REPEAT BUTTON_VIEW 322#define STAR_LEVEL_REPEAT BUTTON_VIEW
323#define STAR_TOGGLE_CONTROL_NAME "SELECT"
324#define STAR_QUIT_NAME "POWER"
325#define STAR_LEVEL_UP_NAME "VOL UP"
326#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
327#define STAR_LEVEL_REPEAT_NAME "VIEW"
253 328
254#elif (CONFIG_KEYPAD == ONDAVX747_PAD) 329#elif (CONFIG_KEYPAD == ONDAVX747_PAD)
255 330
256#define STAR_QUIT BUTTON_POWER 331#define STAR_QUIT BUTTON_POWER
257#define STAR_QUIT_NAME "[POWER]" 332#define STAR_QUIT_NAME "POWER"
258 333
259#elif CONFIG_KEYPAD == MROBE500_PAD 334#elif CONFIG_KEYPAD == MROBE500_PAD
260#define STAR_QUIT BUTTON_POWER 335#define STAR_QUIT BUTTON_POWER
261#define STAR_QUIT_NAME "[POWER]" 336#define STAR_QUIT_NAME "POWER"
262 337
263#else 338#else
264#error No keymap defined! 339#error No keymap defined!
@@ -267,7 +342,7 @@ PLUGIN_HEADER
267#ifdef HAVE_TOUCHSCREEN 342#ifdef HAVE_TOUCHSCREEN
268//#ifndef STAR_QUIT 343//#ifndef STAR_QUIT
269//#define STAR_QUIT BUTTON_TOPLEFT 344//#define STAR_QUIT BUTTON_TOPLEFT
270//#define STAR_QUIT_NAME "[TOPLEFT]" 345//#define STAR_QUIT_NAME "TOPLEFT"
271//#endif 346//#endif
272#ifndef STAR_LEFT 347#ifndef STAR_LEFT
273#define STAR_LEFT BUTTON_MIDLEFT 348#define STAR_LEFT BUTTON_MIDLEFT
@@ -283,19 +358,19 @@ PLUGIN_HEADER
283#endif 358#endif
284#ifndef STAR_TOGGLE_CONTROL 359#ifndef STAR_TOGGLE_CONTROL
285#define STAR_TOGGLE_CONTROL BUTTON_CENTER 360#define STAR_TOGGLE_CONTROL BUTTON_CENTER
286#define STAR_TOGGLE_CONTROL_NAME "[CENTER]" 361#define STAR_TOGGLE_CONTROL_NAME "CENTER"
287#endif 362#endif
288#ifndef STAR_LEVEL_UP 363#ifndef STAR_LEVEL_UP
289#define STAR_LEVEL_UP BUTTON_TOPLEFT 364#define STAR_LEVEL_UP BUTTON_TOPLEFT
290#define STAR_LEVEL_UP_NAME "[TOPLEFT]" 365#define STAR_LEVEL_UP_NAME "TOPLEFT"
291#endif 366#endif
292#ifndef STAR_LEVEL_DOWN 367#ifndef STAR_LEVEL_DOWN
293#define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT 368#define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
294#define STAR_LEVEL_DOWN_NAME "[BOTTOMLEFT]" 369#define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
295#endif 370#endif
296#ifndef STAR_LEVEL_REPEAT 371#ifndef STAR_LEVEL_REPEAT
297#define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT 372#define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
298#define STAR_LEVEL_REPEAT_NAME "[BOTTOMRIGHT]" 373#define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
299#endif 374#endif
300#endif 375#endif
301 376
@@ -539,104 +614,6 @@ static unsigned char* levels =
539"****************"; 614"****************";
540 615
541/** 616/**
542 * Display text.
543 */
544void star_display_text(char *str, bool waitkey)
545{
546 int chars_by_line;
547 int lines_by_screen;
548 int chars_for_line;
549 int current_line = 0;
550 int first_char_index = 0;
551 char *ptr_char;
552 char *ptr_line;
553 int i;
554 char line[255];
555 int key;
556 bool go_on;
557
558 rb->lcd_clear_display();
559
560 chars_by_line = LCD_WIDTH / char_width;
561 lines_by_screen = LCD_HEIGHT / char_height;
562
563 do
564 {
565 ptr_char = str + first_char_index;
566 chars_for_line = 0;
567 i = 0;
568 ptr_line = line;
569 while (i < chars_by_line)
570 {
571 switch (*ptr_char)
572 {
573 case '\t':
574 case ' ':
575 *(ptr_line++) = ' ';
576 case '\n':
577 case '\0':
578 chars_for_line = i;
579 break;
580
581 default:
582 *(ptr_line++) = *ptr_char;
583 }
584 if (*ptr_char == '\n' || *ptr_char == '\0')
585 break;
586 ptr_char++;
587 i++;
588 }
589
590 if (chars_for_line == 0)
591 chars_for_line = i;
592
593 line[chars_for_line] = '\0';
594
595 /* test if we have cut a word. If it is the case we don't have to */
596 /* skip the space */
597 if (i == chars_by_line && chars_for_line == chars_by_line)
598 first_char_index += chars_for_line;
599 else
600 first_char_index += chars_for_line + 1;
601
602 /* print the line on the screen */
603 rb->lcd_putsxy(0, current_line * char_height, line);
604
605 /* if the number of line showed on the screen is equals to the */
606 /* maximum number of line we can show, we wait for a key pressed to */
607 /* clear and show the remaining text. */
608 current_line++;
609 if (current_line == lines_by_screen || *ptr_char == '\0')
610 {
611 current_line = 0;
612 rb->lcd_update();
613 go_on = false;
614 while (waitkey && !go_on)
615 {
616 key = rb->button_get(true);
617 switch (key)
618 {
619 case STAR_QUIT:
620 case STAR_LEFT:
621 case STAR_DOWN:
622 go_on = true;
623 break;
624
625 default:
626 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
627 {
628 usb_detected = true;
629 go_on = true;
630 break;
631 }
632 }
633 }
634 rb->lcd_clear_display();
635 }
636 } while (*ptr_char != '\0');
637}
638
639/**
640 * Do a pretty transition from one level to another. 617 * Do a pretty transition from one level to another.
641 */ 618 */
642static void star_transition_update(void) 619static void star_transition_update(void)
@@ -986,7 +963,7 @@ static int star_run_game(int current_level)
986 if (current_level == STAR_LEVEL_COUNT) 963 if (current_level == STAR_LEVEL_COUNT)
987 { 964 {
988 rb->lcd_clear_display(); 965 rb->lcd_clear_display();
989 star_display_text("Congratulations!", true); 966 rb->splash(HZ*2, "Congratulations!");
990 rb->lcd_update(); 967 rb->lcd_update();
991 968
992 /* There is no such level as STAR_LEVEL_COUNT so it can't be the 969 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
@@ -1000,6 +977,45 @@ static int star_run_game(int current_level)
1000} 977}
1001 978
1002/** 979/**
980 * Display help text.
981 */
982static bool star_help(void)
983{
984 int button;
985#define WORDS (sizeof help_text / sizeof (char*))
986 static char* help_text[] = {
987 "Star", "", "Aim", "",
988 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
989 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
990 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
991 "stars.", "", "",
992 "Controls", "",
993 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "Control", "",
994 STAR_QUIT_NAME":", "", "Exit", "",
995 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
996 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
997 STAR_LEVEL_UP_NAME":", "Next", "level"
998 };
999 static struct style_text formation[]={
1000 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1001 { 2, C_RED },
1002 { 35, C_RED },
1003 { -1, 0 }
1004 };
1005
1006 if (display_text(WORDS, help_text, formation, NULL))
1007 return true;
1008 do {
1009 button = rb->button_get(true);
1010 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
1011 return true;
1012 } while( ( button == BUTTON_NONE )
1013 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
1014
1015 return false;
1016}
1017
1018/**
1003 * Display the choice menu. 1019 * Display the choice menu.
1004 */ 1020 */
1005static int star_menu(void) 1021static int star_menu(void)
@@ -1010,7 +1026,7 @@ static int star_menu(void)
1010 rb->lcd_getstringsize("a", &char_width, &char_height); 1026 rb->lcd_getstringsize("a", &char_width, &char_height);
1011 1027
1012 MENUITEM_STRINGLIST(menu,"Star Menu",NULL,"Play","Choose Level", 1028 MENUITEM_STRINGLIST(menu,"Star Menu",NULL,"Play","Choose Level",
1013 "Information","Keys","Quit"); 1029 "Help", "Quit");
1014 1030
1015 while(!menu_quit) 1031 while(!menu_quit)
1016 { 1032 {
@@ -1024,80 +1040,8 @@ static int star_menu(void)
1024 NULL, 1, 1, STAR_LEVEL_COUNT, NULL ); 1040 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1025 break; 1041 break;
1026 case 2: 1042 case 2:
1027 star_display_text( 1043 if(star_help())
1028 "INFO\n\n" 1044 usb_detected = true;
1029 "Take all the stars to go to the next level. "
1030 "You can toggle control with the block to "
1031 "use it as a mobile wall. The block cannot "
1032 "take stars.", true);
1033 break;
1034 case 3:
1035#if CONFIG_KEYPAD == RECORDER_PAD
1036 star_display_text("KEYS\n\n"
1037 "[ON] Toggle Ctl.\n"
1038 "[OFF] Exit\n"
1039 "[F1] Prev. level\n"
1040 "[F2] Reset level\n"
1041 "[F3] Next level", true);
1042#elif CONFIG_KEYPAD == ONDIO_PAD
1043 star_display_text("KEYS\n\n"
1044 "[MODE] Toggle Ctl\n"
1045 "[OFF] Exit\n"
1046 "[M <] Prev. level\n"
1047 "[M ^] Reset level\n"
1048 "[M >] Next level", true);
1049#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
1050 star_display_text("KEYS\n\n"
1051 "[MODE/NAVI] Toggle Ctrl\n"
1052 "[OFF] Exit\n"
1053 "[ON + LEFT] Prev. level\n"
1054 "[ON + NAVI] Reset level\n"
1055 "[ON + RIGHT] Next level", true);
1056#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
1057 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
1058 star_display_text("KEYS\n\n"
1059 "[SELECT] Toggle Ctl\n"
1060 "[S + MENU] Exit\n"
1061 "[S <] Prev. level\n"
1062 "[S + PLAY] Reset level\n"
1063 "[S >] Next level", true);
1064#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
1065 star_display_text("KEYS\n\n"
1066 "[SELECT] Toggle Ctl\n"
1067 "[POWER] Exit\n"
1068 "[REC..] Prev. level\n"
1069 "[PLAY] Reset level\n"
1070 "[REC] Next level", true);
1071#elif CONFIG_KEYPAD == GIGABEAT_PAD
1072 star_display_text("KEYS\n\n"
1073 "[SELECT] Toggle Control\n"
1074 "[POWER] Exit\n"
1075 "[VOL DOWN] Prev. level\n"
1076 "[A] Reset level\n"
1077 "[VOL UP] Next level", true);
1078#elif CONFIG_KEYPAD == IRIVER_H10_PAD
1079 star_display_text("KEYS\n\n"
1080 "[REW] Toggle Ctl\n"
1081 "[POWER] Exit\n"
1082 "[PLAY+DOWN] Prev. level\n"
1083 "[PLAY+RIGHT] Reset level\n"
1084 "[PLAY+UP] Next level", true);
1085#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
1086 star_display_text("KEYS\n\n"
1087 "[SELECT] Toggle Control\n"
1088 "[BACK] Exit\n"
1089 "[VOL DOWN] Prev. level\n"
1090 "[MENU] Reset level\n"
1091 "[VOL UP] Next level", true);
1092#endif
1093#ifdef HAVE_TOUCHSCREEN
1094 star_display_text("KEYS\n\n"
1095 STAR_TOGGLE_CONTROL_NAME " Toggle Control\n"
1096 STAR_QUIT_NAME " Exit\n"
1097 STAR_LEVEL_DOWN_NAME " Prev. level\n"
1098 STAR_LEVEL_REPEAT_NAME " Reset level\n"
1099 STAR_LEVEL_UP_NAME " Next level", true);
1100#endif
1101 break; 1045 break;
1102 default: 1046 default:
1103 menu_quit = true; 1047 menu_quit = true;
diff --git a/apps/plugins/superdom.c b/apps/plugins/superdom.c
index 80dd4f518b..1a44bad518 100644
--- a/apps/plugins/superdom.c
+++ b/apps/plugins/superdom.c
@@ -20,6 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "plugin.h" 21#include "plugin.h"
22#include "lib/playback_control.h" 22#include "lib/playback_control.h"
23#include "lib/display_text.h"
23PLUGIN_HEADER 24PLUGIN_HEADER
24 25
25extern const fb_data superdom_boarditems[]; 26extern const fb_data superdom_boarditems[];
@@ -557,11 +558,9 @@ int settings_menu_function(void) {
557 558
558static int do_help(void) { 559static int do_help(void) {
559 int button; 560 int button;
560 int y = MARGIN, space_w, width, height; 561#define WORDS (sizeof help_text / sizeof (char*))
561 unsigned short x = MARGIN, i = 0; 562 static char* help_text[] = {
562#define WORDS (sizeof instructions / sizeof (char*)) 563 "Super", "domination", "is", "a", "turn", "based", "strategy", "game,",
563 static char* instructions[] = {
564 "Super", "domination", "is", "a", "turn", "based", "strategy", "game,",
565 "where", "the", "aim", "is", "to", "overpower", "the", "computer", 564 "where", "the", "aim", "is", "to", "overpower", "the", "computer",
566 "player", "by", "taking", "their", "territory.", "", 565 "player", "by", "taking", "their", "territory.", "",
567 "Each", "year", "you", "are", "allocated", "an", "amount", "of", "cash", 566 "Each", "year", "you", "are", "allocated", "an", "amount", "of", "cash",
@@ -572,49 +571,17 @@ static int do_help(void) {
572 "the", "ownership", "of", "adjacent", "tiles,", "and", "the", "type", 571 "the", "ownership", "of", "adjacent", "tiles,", "and", "the", "type",
573 "and", "number", "of", "troops", "on", "them.", 572 "and", "number", "of", "troops", "on", "them.",
574 }; 573 };
575 rb->lcd_clear_display();
576 rb->lcd_getstringsize(" ", &space_w, &height);
577 for (i = 0; i < WORDS; i++) {
578 rb->lcd_getstringsize(instructions[i], &width, NULL);
579 /* Skip to next line if the current one can't fit the word */
580 if (x + width > LCD_WIDTH - MARGIN) {
581 x = MARGIN;
582 y += height;
583 }
584 /* .. or if the word is the empty string */
585 if (rb->strcmp(instructions[i], "") == 0) {
586 x = MARGIN;
587 y += height;
588 continue;
589 }
590 /* We filled the screen */
591 if (y + height > LCD_HEIGHT - MARGIN) {
592 y = MARGIN;
593 rb->lcd_update();
594 do {
595 button = rb->button_get(true);
596 if (button == SYS_USB_CONNECTED) {
597 return PLUGIN_USB_CONNECTED;
598 }
599 } while( ( button == BUTTON_NONE )
600 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
601
602 574
603 rb->lcd_clear_display(); 575 if (display_text(WORDS, help_text, NULL, NULL))
604 } 576 return PLUGIN_USB_CONNECTED;
605 rb->lcd_putsxy(x, y, instructions[i]);
606 x += width + space_w;
607 }
608 rb->lcd_update();
609 do { 577 do {
610 button = rb->button_get(true); 578 button = rb->button_get(true);
611 if (button == SYS_USB_CONNECTED) { 579 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
612 return PLUGIN_USB_CONNECTED; 580 return PLUGIN_USB_CONNECTED;
613 }
614 } while( ( button == BUTTON_NONE ) 581 } while( ( button == BUTTON_NONE )
615 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) ); 582 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
616 583
617 return 0; 584 return PLUGIN_OK;
618} 585}
619 586
620int menu(void) { 587int menu(void) {
@@ -661,7 +628,7 @@ int save_game(void) {
661 if(fd < 0) { 628 if(fd < 0) {
662 DEBUGF("Couldn't create/open file\n"); 629 DEBUGF("Couldn't create/open file\n");
663 return -1; 630 return -1;
664 } 631 }
665 632
666 rb->write(fd, "SSGv3", 5); 633 rb->write(fd, "SSGv3", 5);
667 rb->write(fd, &gamestate, sizeof(gamestate)); 634 rb->write(fd, &gamestate, sizeof(gamestate));
@@ -1599,7 +1566,7 @@ int killmen(int colour) {
1599 } 1566 }
1600 } 1567 }
1601 } 1568 }
1602 1569
1603 if(human) 1570 if(human)
1604 humanres.men -= menkilled; 1571 humanres.men -= menkilled;
1605 else 1572 else