summaryrefslogtreecommitdiff
path: root/apps/plugins/wormlet.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/wormlet.c')
-rw-r--r--apps/plugins/wormlet.c594
1 files changed, 138 insertions, 456 deletions
diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c
index 2ef9f990f4..97b2fded4f 100644
--- a/apps/plugins/wormlet.c
+++ b/apps/plugins/wormlet.c
@@ -63,10 +63,6 @@ PLUGIN_HEADER
63#define MULTIPLAYER 63#define MULTIPLAYER
64#endif 64#endif
65 65
66#define PLAYERS_TEXT "UP/DN"
67#define WORMS_TEXT "L/R"
68#define KEY_CONTROL_TEXT "F1"
69
70#elif (CONFIG_KEYPAD == ARCHOS_AV300_PAD) 66#elif (CONFIG_KEYPAD == ARCHOS_AV300_PAD)
71#define BTN_DIR_UP BUTTON_UP 67#define BTN_DIR_UP BUTTON_UP
72#define BTN_DIR_DOWN BUTTON_DOWN 68#define BTN_DIR_DOWN BUTTON_DOWN
@@ -79,10 +75,6 @@ PLUGIN_HEADER
79#define BTN_STOPRESET BUTTON_ON 75#define BTN_STOPRESET BUTTON_ON
80#define BTN_TOGGLE_KEYS BUTTON_F1 76#define BTN_TOGGLE_KEYS BUTTON_F1
81 77
82#define PLAYERS_TEXT "UP/DN"
83#define WORMS_TEXT "L/R"
84#define KEY_CONTROL_TEXT "F1"
85
86#elif (CONFIG_KEYPAD == ONDIO_PAD) 78#elif (CONFIG_KEYPAD == ONDIO_PAD)
87#define BTN_DIR_UP BUTTON_UP 79#define BTN_DIR_UP BUTTON_UP
88#define BTN_DIR_DOWN BUTTON_DOWN 80#define BTN_DIR_DOWN BUTTON_DOWN
@@ -92,9 +84,6 @@ PLUGIN_HEADER
92#define BTN_QUIT (BUTTON_OFF|BUTTON_REL) 84#define BTN_QUIT (BUTTON_OFF|BUTTON_REL)
93#define BTN_STOPRESET (BUTTON_OFF|BUTTON_MENU) 85#define BTN_STOPRESET (BUTTON_OFF|BUTTON_MENU)
94 86
95#define PLAYERS_TEXT "UP/DN"
96#define WORMS_TEXT "L/R"
97
98#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 87#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
99 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 88 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
100 89
@@ -106,9 +95,6 @@ PLUGIN_HEADER
106#define BTN_QUIT (BUTTON_SELECT|BUTTON_MENU) 95#define BTN_QUIT (BUTTON_SELECT|BUTTON_MENU)
107#define BTN_STOPRESET (BUTTON_SELECT|BUTTON_PLAY) 96#define BTN_STOPRESET (BUTTON_SELECT|BUTTON_PLAY)
108 97
109#define PLAYERS_TEXT "Menu/Play"
110#define WORMS_TEXT "Left/Right"
111
112#elif (CONFIG_KEYPAD == IRIVER_H300_PAD) || (CONFIG_KEYPAD == IRIVER_H100_PAD) 98#elif (CONFIG_KEYPAD == IRIVER_H300_PAD) || (CONFIG_KEYPAD == IRIVER_H100_PAD)
113 99
114#define BTN_DIR_UP BUTTON_UP 100#define BTN_DIR_UP BUTTON_UP
@@ -121,9 +107,6 @@ PLUGIN_HEADER
121 107
122#define BTN_RC_QUIT BUTTON_RC_STOP 108#define BTN_RC_QUIT BUTTON_RC_STOP
123 109
124#define PLAYERS_TEXT "Up/Down"
125#define WORMS_TEXT "Left/Right"
126
127#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) 110#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
128 111
129#define BTN_DIR_UP BUTTON_UP 112#define BTN_DIR_UP BUTTON_UP
@@ -134,9 +117,6 @@ PLUGIN_HEADER
134#define BTN_QUIT BUTTON_POWER 117#define BTN_QUIT BUTTON_POWER
135#define BTN_STOPRESET BUTTON_REC 118#define BTN_STOPRESET BUTTON_REC
136 119
137#define PLAYERS_TEXT "Up/Down"
138#define WORMS_TEXT "Left/Right"
139
140#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 120#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
141 121
142#define BTN_DIR_UP BUTTON_UP 122#define BTN_DIR_UP BUTTON_UP
@@ -147,10 +127,6 @@ PLUGIN_HEADER
147#define BTN_QUIT BUTTON_POWER 127#define BTN_QUIT BUTTON_POWER
148#define BTN_STOPRESET BUTTON_A 128#define BTN_STOPRESET BUTTON_A
149 129
150#define PLAYERS_TEXT "Up/Down"
151#define WORMS_TEXT "Left/Right"
152
153
154#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ 130#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
155(CONFIG_KEYPAD == SANSA_C200_PAD) 131(CONFIG_KEYPAD == SANSA_C200_PAD)
156 132
@@ -162,9 +138,6 @@ PLUGIN_HEADER
162#define BTN_QUIT BUTTON_POWER 138#define BTN_QUIT BUTTON_POWER
163#define BTN_STOPRESET BUTTON_REC 139#define BTN_STOPRESET BUTTON_REC
164 140
165#define PLAYERS_TEXT "Up/Down"
166#define WORMS_TEXT "Left/Right"
167
168#elif (CONFIG_KEYPAD == SANSA_CLIP_PAD) 141#elif (CONFIG_KEYPAD == SANSA_CLIP_PAD)
169 142
170#define BTN_DIR_UP BUTTON_UP 143#define BTN_DIR_UP BUTTON_UP
@@ -175,9 +148,6 @@ PLUGIN_HEADER
175#define BTN_QUIT BUTTON_POWER 148#define BTN_QUIT BUTTON_POWER
176#define BTN_STOPRESET BUTTON_HOME 149#define BTN_STOPRESET BUTTON_HOME
177 150
178#define PLAYERS_TEXT "Up/Down"
179#define WORMS_TEXT "Left/Right"
180
181#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) 151#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
182 152
183#define BTN_DIR_UP BUTTON_UP 153#define BTN_DIR_UP BUTTON_UP
@@ -188,9 +158,6 @@ PLUGIN_HEADER
188#define BTN_QUIT (BUTTON_HOME|BUTTON_REPEAT) 158#define BTN_QUIT (BUTTON_HOME|BUTTON_REPEAT)
189#define BTN_STOPRESET (BUTTON_SELECT | BUTTON_UP) 159#define BTN_STOPRESET (BUTTON_SELECT | BUTTON_UP)
190 160
191#define PLAYERS_TEXT "Up/Down"
192#define WORMS_TEXT "Left/Right"
193
194#elif (CONFIG_KEYPAD == SANSA_M200_PAD) 161#elif (CONFIG_KEYPAD == SANSA_M200_PAD)
195 162
196#define BTN_DIR_UP BUTTON_UP 163#define BTN_DIR_UP BUTTON_UP
@@ -201,9 +168,6 @@ PLUGIN_HEADER
201#define BTN_QUIT BUTTON_POWER 168#define BTN_QUIT BUTTON_POWER
202#define BTN_STOPRESET (BUTTON_SELECT | BUTTON_UP) 169#define BTN_STOPRESET (BUTTON_SELECT | BUTTON_UP)
203 170
204#define PLAYERS_TEXT "Up/Down"
205#define WORMS_TEXT "Left/Right"
206
207#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) 171#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
208 172
209#define BTN_DIR_UP BUTTON_SCROLL_UP 173#define BTN_DIR_UP BUTTON_SCROLL_UP
@@ -214,9 +178,6 @@ PLUGIN_HEADER
214#define BTN_QUIT BUTTON_POWER 178#define BTN_QUIT BUTTON_POWER
215#define BTN_STOPRESET BUTTON_REW 179#define BTN_STOPRESET BUTTON_REW
216 180
217#define PLAYERS_TEXT "Up/Down"
218#define WORMS_TEXT "Left/Right"
219
220#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) 181#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
221 182
222#define BTN_DIR_UP BUTTON_UP 183#define BTN_DIR_UP BUTTON_UP
@@ -227,9 +188,6 @@ PLUGIN_HEADER
227#define BTN_QUIT BUTTON_BACK 188#define BTN_QUIT BUTTON_BACK
228#define BTN_STOPRESET BUTTON_MENU 189#define BTN_STOPRESET BUTTON_MENU
229 190
230#define PLAYERS_TEXT "Up/Down"
231#define WORMS_TEXT "Left/Right"
232
233#elif (CONFIG_KEYPAD == MROBE100_PAD) 191#elif (CONFIG_KEYPAD == MROBE100_PAD)
234 192
235#define BTN_DIR_UP BUTTON_UP 193#define BTN_DIR_UP BUTTON_UP
@@ -240,9 +198,6 @@ PLUGIN_HEADER
240#define BTN_QUIT BUTTON_POWER 198#define BTN_QUIT BUTTON_POWER
241#define BTN_STOPRESET BUTTON_DISPLAY 199#define BTN_STOPRESET BUTTON_DISPLAY
242 200
243#define PLAYERS_TEXT "Up/Down"
244#define WORMS_TEXT "Left/Right"
245
246#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 201#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
247 202
248#define BTN_DIR_UP BUTTON_RC_VOL_UP 203#define BTN_DIR_UP BUTTON_RC_VOL_UP
@@ -253,9 +208,6 @@ PLUGIN_HEADER
253#define BTN_QUIT BUTTON_RC_REC 208#define BTN_QUIT BUTTON_RC_REC
254#define BTN_STOPRESET BUTTON_RC_MODE 209#define BTN_STOPRESET BUTTON_RC_MODE
255 210
256#define PLAYERS_TEXT "VOL UP/DN"
257#define WORMS_TEXT "REW/FF"
258
259#elif (CONFIG_KEYPAD == COWOND2_PAD) 211#elif (CONFIG_KEYPAD == COWOND2_PAD)
260 212
261#define BTN_QUIT BUTTON_POWER 213#define BTN_QUIT BUTTON_POWER
@@ -270,9 +222,6 @@ PLUGIN_HEADER
270#define BTN_QUIT BUTTON_BACK 222#define BTN_QUIT BUTTON_BACK
271#define BTN_STOPRESET BUTTON_MENU 223#define BTN_STOPRESET BUTTON_MENU
272 224
273#define PLAYERS_TEXT "Up/Down"
274#define WORMS_TEXT "Left/Right"
275
276#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD 225#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
277 226
278#define BTN_DIR_UP BUTTON_UP 227#define BTN_DIR_UP BUTTON_UP
@@ -283,9 +232,6 @@ PLUGIN_HEADER
283#define BTN_QUIT BUTTON_POWER 232#define BTN_QUIT BUTTON_POWER
284#define BTN_STOPRESET BUTTON_VIEW 233#define BTN_STOPRESET BUTTON_VIEW
285 234
286#define PLAYERS_TEXT "Up/Down"
287#define WORMS_TEXT "Left/Right"
288
289#elif (CONFIG_KEYPAD == ONDAVX747_PAD) || CONFIG_KEYPAD == MROBE500_PAD 235#elif (CONFIG_KEYPAD == ONDAVX747_PAD) || CONFIG_KEYPAD == MROBE500_PAD
290 236
291#define BTN_QUIT BUTTON_POWER 237#define BTN_QUIT BUTTON_POWER
@@ -315,16 +261,8 @@ PLUGIN_HEADER
315#endif 261#endif
316#ifndef BTN_STOPRESET 262#ifndef BTN_STOPRESET
317#define BTN_STOPRESET BUTTON_TOPRIGHT 263#define BTN_STOPRESET BUTTON_TOPRIGHT
318
319#endif 264#endif
320#ifndef PLAYERS_TEXT
321#define PLAYERS_TEXT "Up/Down"
322#endif 265#endif
323#ifndef WORMS_TEXT
324#define WORMS_TEXT "Left/Right"
325#endif
326#endif
327
328 266
329#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64) 267#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
330#define FOOD_SIZE 3 268#define FOOD_SIZE 3
@@ -500,14 +438,14 @@ static int players = 1;
500 438
501static struct configdata config[] = 439static struct configdata config[] =
502{ 440{
503 {TYPE_INT, 0, 1024, { .int_p = &highscore }, "highscore", NULL}, 441 {TYPE_INT, 0, 1024, { .int_p = &highscore }, "highscore", NULL},
504 {TYPE_INT, 0, 15, { .int_p = &arghs_per_food }, "arghs per food", NULL}, 442 {TYPE_INT, 0, 15, { .int_p = &arghs_per_food }, "arghs per food", NULL},
505 {TYPE_INT, 0, 15, { .int_p = &argh_size }, "argh size", NULL}, 443 {TYPE_INT, 0, 15, { .int_p = &argh_size }, "argh size", NULL},
506 {TYPE_INT, 0, 15, { .int_p = &food_size }, "food size", NULL}, 444 {TYPE_INT, 0, 15, { .int_p = &food_size }, "food size", NULL},
507 {TYPE_INT, 0, 3, { .int_p = &players }, "players", NULL}, 445 {TYPE_INT, 0, 3, { .int_p = &players }, "players", NULL},
508 {TYPE_INT, 0, 3, { .int_p = &worm_count }, "worms", NULL}, 446 {TYPE_INT, 0, 3, { .int_p = &worm_count }, "worms", NULL},
509 {TYPE_INT, 0, 20, { .int_p = &speed }, "speed", NULL}, 447 {TYPE_INT, 0, 20, { .int_p = &speed }, "speed", NULL},
510 {TYPE_INT, 0, 15, { .int_p = &worm_food }, "Worm Growth Per Food", NULL} 448 {TYPE_INT, 0, 15, { .int_p = &worm_food }, "Worm Growth Per Food", NULL}
511}; 449};
512 450
513#ifdef DEBUG_WORMLET 451#ifdef DEBUG_WORMLET
@@ -524,7 +462,8 @@ static void set_debug_out(char *str){
524 * @return int A value 0 <= value < 4 462 * @return int A value 0 <= value < 4
525 * Note the predefined constants NORTH, SOUTH, EAST, WEST 463 * Note the predefined constants NORTH, SOUTH, EAST, WEST
526 */ 464 */
527static int get_worm_dir(struct worm *w) { 465static int get_worm_dir(struct worm *w)
466{
528 int retVal ; 467 int retVal ;
529 if (w->dirx == 0) { 468 if (w->dirx == 0) {
530 if (w->diry == 1) { 469 if (w->diry == 1) {
@@ -551,13 +490,14 @@ static int get_worm_dir(struct worm *w) {
551 * dir must be 0 <= dir < 4. Use predefined constants 490 * dir must be 0 <= dir < 4. Use predefined constants
552 * NORTH, SOUTH, EAST, WEST 491 * NORTH, SOUTH, EAST, WEST
553 */ 492 */
554static void set_worm_dir(struct worm *w, int dir) { 493static void set_worm_dir(struct worm *w, int dir)
494{
555 switch (dir) { 495 switch (dir) {
556 case WEST: 496 case WEST:
557 w->dirx = -1; 497 w->dirx = -1;
558 w->diry = 0; 498 w->diry = 0;
559 break; 499 break;
560 case NORTH: 500 case NORTH:
561 w->dirx = 0; 501 w->dirx = 0;
562 w->diry = - 1; 502 w->diry = - 1;
563 break; 503 break;
@@ -569,7 +509,7 @@ static void set_worm_dir(struct worm *w, int dir) {
569 w->dirx = 0; 509 w->dirx = 0;
570 w->diry = 1; 510 w->diry = 1;
571 break; 511 break;
572 } 512 }
573} 513}
574 514
575/** 515/**
@@ -577,7 +517,8 @@ static void set_worm_dir(struct worm *w, int dir) {
577 * is also a value for the number of bends that are in the worm. 517 * is also a value for the number of bends that are in the worm.
578 * @return int a positive value with 0 <= value < MAX_WORM_SEGMENTS 518 * @return int a positive value with 0 <= value < MAX_WORM_SEGMENTS
579 */ 519 */
580static int get_worm_array_length(struct worm *w) { 520static int get_worm_array_length(struct worm *w)
521{
581 /* initial simple calculation will be overwritten if wrong. */ 522 /* initial simple calculation will be overwritten if wrong. */
582 int retVal = w->head - w->tail; 523 int retVal = w->head - w->tail;
583 524
@@ -596,7 +537,8 @@ static int get_worm_array_length(struct worm *w) {
596 * w must not be null. 537 * w must not be null.
597 * @return int The length of the worm (>= 0). 538 * @return int The length of the worm (>= 0).
598 */ 539 */
599static int get_score(struct worm *w) { 540static int get_score(struct worm *w)
541{
600 int retval = 0; 542 int retval = 0;
601 int length = get_worm_array_length(w); 543 int length = get_worm_array_length(w);
602 int i; 544 int i;
@@ -620,7 +562,7 @@ static int get_score(struct worm *w) {
620 minimum = MIN(startx, endx); 562 minimum = MIN(startx, endx);
621 maximum = MAX(startx, endx); 563 maximum = MAX(startx, endx);
622 } 564 }
623 retval += abs(maximum - minimum); 565 retval += abs(maximum - minimum);
624 } 566 }
625 return retval; 567 return retval;
626} 568}
@@ -639,7 +581,9 @@ static int get_score(struct worm *w) {
639 * @param int height The height of the rectangle. 581 * @param int height The height of the rectangle.
640 * @return bool Returns true if the specified line intersects with the recangle. 582 * @return bool Returns true if the specified line intersects with the recangle.
641 */ 583 */
642static bool line_in_rect(int startx, int starty, int endx, int endy, int x, int y, int width, int height) { 584static bool line_in_rect(int startx, int starty, int endx, int endy,
585 int x, int y, int width, int height)
586{
643 bool retval = false; 587 bool retval = false;
644 int simple, simplemin, simplemax; 588 int simple, simplemin, simplemax;
645 int compa, compb, compmin, compmax; 589 int compa, compb, compmin, compmax;
@@ -687,7 +631,8 @@ static bool line_in_rect(int startx, int starty, int endx, int endy, int x, int
687 * @param int height The height of the rect 631 * @param int height The height of the rect
688 * @return bool Returns true if the worm intersects with the rect 632 * @return bool Returns true if the worm intersects with the rect
689 */ 633 */
690static bool worm_in_rect(struct worm *w, int x, int y, int width, int height) { 634static bool worm_in_rect(struct worm *w, int x, int y, int width, int height)
635{
691 bool retval = false; 636 bool retval = false;
692 637
693 638
@@ -722,7 +667,8 @@ static bool worm_in_rect(struct worm *w, int x, int y, int width, int height) {
722 * @return Returns true if the coordinate hits the food specified by 667 * @return Returns true if the coordinate hits the food specified by
723 * foodIndex. 668 * foodIndex.
724 */ 669 */
725static bool specific_food_collision(int foodIndex, int x, int y) { 670static bool specific_food_collision(int foodIndex, int x, int y)
671{
726 bool retVal = false; 672 bool retVal = false;
727 if (x >= foodx[foodIndex] && 673 if (x >= foodx[foodIndex] &&
728 x < foodx[foodIndex] + food_size && 674 x < foodx[foodIndex] + food_size &&
@@ -740,7 +686,8 @@ static bool specific_food_collision(int foodIndex, int x, int y) {
740 * -1 is returned. 686 * -1 is returned.
741 * @return int -1 <= value < MAX_FOOD 687 * @return int -1 <= value < MAX_FOOD
742 */ 688 */
743static int food_collision(int x, int y) { 689static int food_collision(int x, int y)
690{
744 int i = 0; 691 int i = 0;
745 int retVal = -1; 692 int retVal = -1;
746 for (i = 0; i < MAX_FOOD; i++) { 693 for (i = 0; i < MAX_FOOD; i++) {
@@ -761,8 +708,8 @@ static int food_collision(int x, int y) {
761 * @return Returns true if the coordinate hits the argh specified by 708 * @return Returns true if the coordinate hits the argh specified by
762 * arghIndex. 709 * arghIndex.
763 */ 710 */
764static bool specific_argh_collision(int arghIndex, int x, int y) { 711static bool specific_argh_collision(int arghIndex, int x, int y)
765 712{
766 if ( x >= arghx[arghIndex] && 713 if ( x >= arghx[arghIndex] &&
767 y >= arghy[arghIndex] && 714 y >= arghy[arghIndex] &&
768 x < arghx[arghIndex] + argh_size && 715 x < arghx[arghIndex] + argh_size &&
@@ -782,7 +729,8 @@ static bool specific_argh_collision(int arghIndex, int x, int y) {
782 * @param int y The y coordinate. 729 * @param int y The y coordinate.
783 * @return int -1 <= value < argh_count <= MAX_ARGH 730 * @return int -1 <= value < argh_count <= MAX_ARGH
784 */ 731 */
785static int argh_collision(int x, int y) { 732static int argh_collision(int x, int y)
733{
786 int i = 0; 734 int i = 0;
787 int retVal = -1; 735 int retVal = -1;
788 736
@@ -821,7 +769,8 @@ static bool worm_food_collision(struct worm *w, int foodIndex)
821 * @return Returns false if the specified argh is not hit within the next 769 * @return Returns false if the specified argh is not hit within the next
822 * moves. 770 * moves.
823 */ 771 */
824static bool worm_argh_collision_in_moves(struct worm *w, int argh_idx, int moves){ 772static bool worm_argh_collision_in_moves(struct worm *w, int argh_idx, int moves)
773{
825 bool retVal = false; 774 bool retVal = false;
826 int x1, y1, x2, y2; 775 int x1, y1, x2, y2;
827 x1 = w->x[w->head]; 776 x1 = w->x[w->head];
@@ -857,8 +806,8 @@ static bool worm_argh_collision(struct worm *w, int arghIndex)
857 * @param int index 806 * @param int index
858 * Ensure that 0 <= index < MAX_FOOD. 807 * Ensure that 0 <= index < MAX_FOOD.
859 */ 808 */
860static void make_food(int index) { 809static void make_food(int index)
861 810{
862 int x = 0; 811 int x = 0;
863 int y = 0; 812 int y = 0;
864 bool collisionDetected = false; 813 bool collisionDetected = false;
@@ -1002,8 +951,8 @@ static void draw_argh(int index)
1002 rb->lcd_set_foreground(COLOR_ARGH); 951 rb->lcd_set_foreground(COLOR_ARGH);
1003#endif 952#endif
1004 rb->lcd_fillrect(arghx[index] + FIELD_RECT_X, 953 rb->lcd_fillrect(arghx[index] + FIELD_RECT_X,
1005 arghy[index] + FIELD_RECT_Y, 954 arghy[index] + FIELD_RECT_Y,
1006 argh_size, argh_size); 955 argh_size, argh_size);
1007#ifdef HAVE_LCD_COLOR 956#ifdef HAVE_LCD_COLOR
1008 rb->lcd_set_foreground(COLOR_FG); 957 rb->lcd_set_foreground(COLOR_FG);
1009#endif 958#endif
@@ -1020,24 +969,25 @@ static void virtual_player(struct worm *w);
1020 * @param int y The y coordinate at which the tail of the worm starts 969 * @param int y The y coordinate at which the tail of the worm starts
1021 * y must be 0 <= y < FIELD_RECT_WIDTH. 970 * y must be 0 <= y < FIELD_RECT_WIDTH.
1022 */ 971 */
1023static void init_worm(struct worm *w, int x, int y){ 972static void init_worm(struct worm *w, int x, int y)
1024 /* initialize the worm size */ 973{
1025 w->head = 1; 974 /* initialize the worm size */
1026 w->tail = 0; 975 w->head = 1;
976 w->tail = 0;
1027 977
1028 w->x[w->head] = x + 1; 978 w->x[w->head] = x + 1;
1029 w->y[w->head] = y; 979 w->y[w->head] = y;
1030 980
1031 w->x[w->tail] = x; 981 w->x[w->tail] = x;
1032 w->y[w->tail] = y; 982 w->y[w->tail] = y;
1033 983
1034 /* set the initial direction the worm creeps to */ 984 /* set the initial direction the worm creeps to */
1035 w->dirx = 1; 985 w->dirx = 1;
1036 w->diry = 0; 986 w->diry = 0;
1037 987
1038 w->growing = INITIAL_WORM_LENGTH - 1; 988 w->growing = INITIAL_WORM_LENGTH - 1;
1039 w->alive = true; 989 w->alive = true;
1040 w->fetch_worm_direction = virtual_player; 990 w->fetch_worm_direction = virtual_player;
1041} 991}
1042 992
1043/** 993/**
@@ -1089,9 +1039,9 @@ static void init_wormlet(void)
1089 int i; 1039 int i;
1090 1040
1091 for (i = 0; i< worm_count; i++) { 1041 for (i = 0; i< worm_count; i++) {
1092 /* Initialize all the worm coordinates to center. */ 1042 /* Initialize all the worm coordinates to center. */
1093 int x = (int)(FIELD_RECT_WIDTH / 2); 1043 int x = (int)(FIELD_RECT_WIDTH / 2);
1094 int y = (int)((FIELD_RECT_HEIGHT - 20)/ 2) + i * 10; 1044 int y = (int)((FIELD_RECT_HEIGHT - 20)/ 2) + i * 10;
1095 1045
1096 init_worm(&worms[i], x, y); 1046 init_worm(&worms[i], x, y);
1097 } 1047 }
@@ -1223,12 +1173,12 @@ static void move_worm(struct worm *w)
1223 */ 1173 */
1224static void draw_worm(struct worm *w) 1174static void draw_worm(struct worm *w)
1225{ 1175{
1226#ifdef HAVE_LCD_COLOR
1227 rb->lcd_set_foreground(COLOR_WORM);
1228#endif
1229 /* draw the new head */ 1176 /* draw the new head */
1230 int x = w->x[w->head]; 1177 int x = w->x[w->head];
1231 int y = w->y[w->head]; 1178 int y = w->y[w->head];
1179#ifdef HAVE_LCD_COLOR
1180 rb->lcd_set_foreground(COLOR_WORM);
1181#endif
1232 if (x >= 0 && x < FIELD_RECT_WIDTH && y >= 0 && y < FIELD_RECT_HEIGHT) { 1182 if (x >= 0 && x < FIELD_RECT_WIDTH && y >= 0 && y < FIELD_RECT_HEIGHT) {
1233 rb->lcd_drawpixel(x + FIELD_RECT_X, y + FIELD_RECT_Y); 1183 rb->lcd_drawpixel(x + FIELD_RECT_X, y + FIELD_RECT_Y);
1234 } 1184 }
@@ -1325,7 +1275,8 @@ static void add_growing(struct worm *w, int len) {
1325 * @return struct worm* The worm that has been hit by x,y. If no worm 1275 * @return struct worm* The worm that has been hit by x,y. If no worm
1326 * was at the position NULL is returned. 1276 * was at the position NULL is returned.
1327 */ 1277 */
1328static struct worm* worm_collision(struct worm *w, int x, int y){ 1278static struct worm* worm_collision(struct worm *w, int x, int y)
1279{
1329 struct worm *retVal = NULL; 1280 struct worm *retVal = NULL;
1330 int i; 1281 int i;
1331 for (i = 0; (i < worm_count) && (retVal == NULL); i++) { 1282 for (i = 0; (i < worm_count) && (retVal == NULL); i++) {
@@ -1366,7 +1317,8 @@ static bool field_collision(struct worm *w)
1366 * @return bool Returns false if x,y specifies a point outside the 1317 * @return bool Returns false if x,y specifies a point outside the
1367 * field of worms. 1318 * field of worms.
1368 */ 1319 */
1369static bool is_in_field_rect(int x, int y) { 1320static bool is_in_field_rect(int x, int y)
1321{
1370 bool retVal = false; 1322 bool retVal = false;
1371 retVal = (x >= 0 && x < FIELD_RECT_WIDTH && 1323 retVal = (x >= 0 && x < FIELD_RECT_WIDTH &&
1372 y >= 0 && y < FIELD_RECT_HEIGHT); 1324 y >= 0 && y < FIELD_RECT_HEIGHT);
@@ -1410,7 +1362,8 @@ static int check_collision(struct worm *w)
1410 * @param int y The y coordinate of the point 1362 * @param int y The y coordinate of the point
1411 * @return int A value usable as index in foodx and foody. 1363 * @return int A value usable as index in foodx and foody.
1412 */ 1364 */
1413static int get_nearest_food(int x, int y){ 1365static int get_nearest_food(int x, int y)
1366{
1414 int nearestfood = 0; 1367 int nearestfood = 0;
1415 int olddistance = FIELD_RECT_WIDTH + FIELD_RECT_HEIGHT; 1368 int olddistance = FIELD_RECT_WIDTH + FIELD_RECT_HEIGHT;
1416 int deltax = 0; 1369 int deltax = 0;
@@ -1443,7 +1396,8 @@ static int get_nearest_food(int x, int y){
1443 * @return Returns true if the worm will hit the position unless 1396 * @return Returns true if the worm will hit the position unless
1444 * it change its direction before the next move. 1397 * it change its direction before the next move.
1445 */ 1398 */
1446static bool is_in_front_of_worm(struct worm *w, int x, int y) { 1399static bool is_in_front_of_worm(struct worm *w, int x, int y)
1400{
1447 bool infront = false; 1401 bool infront = false;
1448 int deltax = x - w->x[w->head]; 1402 int deltax = x - w->x[w->head];
1449 int deltay = y - w->y[w->head]; 1403 int deltay = y - w->y[w->head];
@@ -1463,7 +1417,8 @@ static bool is_in_front_of_worm(struct worm *w, int x, int y) {
1463 * @return Returns true if the worm will collide with the next move 1417 * @return Returns true if the worm will collide with the next move
1464 * unless it changes its direction. 1418 * unless it changes its direction.
1465 */ 1419 */
1466static bool will_worm_collide(struct worm *w) { 1420static bool will_worm_collide(struct worm *w)
1421{
1467 int x = w->x[w->head] + w->dirx; 1422 int x = w->x[w->head] + w->dirx;
1468 int y = w->y[w->head] + w->diry; 1423 int y = w->y[w->head] + w->diry;
1469 bool retVal = !is_in_field_rect(x, y); 1424 bool retVal = !is_in_field_rect(x, y);
@@ -1487,7 +1442,8 @@ static bool will_worm_collide(struct worm *w) {
1487 * @param struct worm *w - The worm of which the direction 1442 * @param struct worm *w - The worm of which the direction
1488 * is altered. 1443 * is altered.
1489 */ 1444 */
1490static void virtual_player(struct worm *w) { 1445static void virtual_player(struct worm *w)
1446{
1491 bool isright; 1447 bool isright;
1492 int plana, planb, planc; 1448 int plana, planb, planc;
1493 /* find the next lunch */ 1449 /* find the next lunch */
@@ -1554,7 +1510,8 @@ static void score_board(void)
1554 int i; 1510 int i;
1555 int y = 0; 1511 int y = 0;
1556 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); 1512 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
1557 rb->lcd_fillrect(FIELD_RECT_WIDTH + 2, 0, LCD_WIDTH - FIELD_RECT_WIDTH - 2, LCD_HEIGHT); 1513 rb->lcd_fillrect(FIELD_RECT_WIDTH + 2, 0,
1514 LCD_WIDTH - FIELD_RECT_WIDTH - 2, LCD_HEIGHT);
1558 rb->lcd_set_drawmode(DRMODE_SOLID); 1515 rb->lcd_set_drawmode(DRMODE_SOLID);
1559 for (i = 0; i < worm_count; i++) { 1516 for (i = 0; i < worm_count; i++) {
1560 int score = get_score(&worms[i]); 1517 int score = get_score(&worms[i]);
@@ -1662,7 +1619,7 @@ static bool process_collisions(struct worm *w)
1662 else { 1619 else {
1663 if (worm_collision(w, w->x[w->head], w->y[w->head]) != NULL) { 1620 if (worm_collision(w, w->x[w->head], w->y[w->head]) != NULL) {
1664 w->alive = false; 1621 w->alive = false;
1665 } 1622 }
1666 } 1623 }
1667 } 1624 }
1668 } 1625 }
@@ -1834,7 +1791,8 @@ static int run(void)
1834 * Just a test routine that checks that worm_food_collision works 1791 * Just a test routine that checks that worm_food_collision works
1835 * in some typical situations. 1792 * in some typical situations.
1836 */ 1793 */
1837static void test_worm_food_collision(void) { 1794static void test_worm_food_collision(void)
1795{
1838 int collision_count = 0; 1796 int collision_count = 0;
1839 int i; 1797 int i;
1840 rb->lcd_clear_display(); 1798 rb->lcd_clear_display();
@@ -1892,7 +1850,8 @@ static void test_worm_food_collision(void) {
1892 1850
1893} 1851}
1894 1852
1895static bool expensive_worm_in_rect(struct worm *w, int rx, int ry, int rw, int rh){ 1853static bool expensive_worm_in_rect(struct worm *w, int rx, int ry, int rw, int rh)
1854{
1896 int x, y; 1855 int x, y;
1897 bool retVal = false; 1856 bool retVal = false;
1898 for (x = rx; x < rx + rw; x++){ 1857 for (x = rx; x < rx + rw; x++){
@@ -1905,7 +1864,8 @@ static bool expensive_worm_in_rect(struct worm *w, int rx, int ry, int rw, int r
1905 return retVal; 1864 return retVal;
1906} 1865}
1907 1866
1908static void test_worm_argh_collision(void) { 1867static void test_worm_argh_collision(void)
1868{
1909 int i; 1869 int i;
1910 int dir; 1870 int dir;
1911 int collision_count = 0; 1871 int collision_count = 0;
@@ -1955,7 +1915,8 @@ static void test_worm_argh_collision(void) {
1955 } 1915 }
1956} 1916}
1957 1917
1958static int testline_in_rect(void) { 1918static int testline_in_rect(void)
1919{
1959 int testfailed = -1; 1920 int testfailed = -1;
1960 1921
1961 int rx = 10; 1922 int rx = 10;
@@ -2164,7 +2125,8 @@ static int testline_in_rect(void) {
2164/** 2125/**
2165 * Just a test routine to test wether specific_worm_collision might work properly 2126 * Just a test routine to test wether specific_worm_collision might work properly
2166 */ 2127 */
2167static int test_specific_worm_collision(void) { 2128static int test_specific_worm_collision(void)
2129{
2168 int collisions = 0; 2130 int collisions = 0;
2169 int dir; 2131 int dir;
2170 int x = 0; 2132 int x = 0;
@@ -2202,7 +2164,8 @@ static int test_specific_worm_collision(void) {
2202 return collisions; 2164 return collisions;
2203} 2165}
2204 2166
2205static void test_make_argh(void){ 2167static void test_make_argh(void)
2168{
2206 int dir; 2169 int dir;
2207 int seed = 0; 2170 int seed = 0;
2208 int hit = 0; 2171 int hit = 0;
@@ -2241,31 +2204,35 @@ static void test_make_argh(void){
2241 for (worm_idx = 0; worm_idx < worm_count; worm_idx++){ 2204 for (worm_idx = 0; worm_idx < worm_count; worm_idx++){
2242 if (expensive_worm_in_rect(&worms[worm_idx], x, y, argh_size, argh_size)) { 2205 if (expensive_worm_in_rect(&worms[worm_idx], x, y, argh_size, argh_size)) {
2243 int tries = 0; 2206 int tries = 0;
2244 rb->srand(seed); 2207 rb->srand(seed);
2245 2208
2246 tries = make_argh(0); 2209 tries = make_argh(0);
2247 if ((x == arghx[0] && y == arghy[0]) || tries < 2) { 2210 if ((x == arghx[0] && y == arghy[0]) || tries < 2) {
2248 failures ++; 2211 failures ++;
2249 } 2212 }
2250 2213
2251 rb->snprintf(buf, sizeof buf, "(%d;%d) fail%d try%d", x, y, failures, tries); 2214 rb->snprintf(buf, sizeof buf, "(%d;%d) fail%d try%d",
2252 rb->lcd_putsxy(0, LCD_HEIGHT - 8, buf); 2215 x, y, failures, tries);
2253 rb->lcd_update(); 2216 rb->lcd_putsxy(0, LCD_HEIGHT - 8, buf);
2254 rb->lcd_invertrect(x + FIELD_RECT_X, y+ FIELD_RECT_Y, argh_size, argh_size); 2217 rb->lcd_update();
2218 rb->lcd_invertrect(x + FIELD_RECT_X, y+ FIELD_RECT_Y,
2219 argh_size, argh_size);
2255 rb->lcd_update(); 2220 rb->lcd_update();
2256 draw_argh(0); 2221 draw_argh(0);
2257 rb->lcd_update(); 2222 rb->lcd_update();
2258 rb->lcd_invertrect(x + FIELD_RECT_X, y + FIELD_RECT_Y, argh_size, argh_size); 2223 rb->lcd_invertrect(x + FIELD_RECT_X, y + FIELD_RECT_Y,
2259 rb->lcd_clearrect(arghx[0] + FIELD_RECT_X, arghy[0] + FIELD_RECT_Y, argh_size, argh_size); 2224 argh_size, argh_size);
2225 rb->lcd_clearrect(arghx[0] + FIELD_RECT_X, arghy[0] + FIELD_RECT_Y,
2226 argh_size, argh_size);
2260 2227
2261 if (failures > last_failures) { 2228 if (failures > last_failures) {
2262 rb->button_get(true); 2229 rb->button_get(true);
2263 } 2230 }
2264 last_failures = failures; 2231 last_failures = failures;
2265 hit ++; 2232 hit ++;
2233 }
2266 } 2234 }
2267 } 2235 }
2268 }
2269} 2236}
2270 2237
2271static void test_worm_argh_collision_in_moves(void) { 2238static void test_worm_argh_collision_in_moves(void) {
@@ -2296,184 +2263,10 @@ static void test_worm_argh_collision_in_moves(void) {
2296} 2263}
2297#endif /* DEBUG_WORMLET */ 2264#endif /* DEBUG_WORMLET */
2298 2265
2299extern bool use_old_rect;
2300
2301/**
2302 * These are additional functions required to set various wormlet settings
2303 * and to enable saving of settings and high score
2304 */
2305
2306/*
2307Sets the total number of worms, both human and machine
2308*/
2309bool set_worm_num_worms(void)
2310{
2311 bool ret;
2312 static const struct opt_items num_worms_option[3] = {
2313 { "1", -1 },
2314 { "2", -1 },
2315 { "3", -1 },
2316 };
2317
2318 ret = rb->set_option("Number Of Worms", &worm_count,INT, num_worms_option, 3, NULL);
2319 if (worm_count < players) {
2320 worm_count=players;
2321 }
2322 return ret;
2323}
2324
2325/* 2266/*
2326Sets the number of human players 2267 * Reverts default settings
2327*/ 2268 */
2328bool set_worm_num_players(void) 2269static void default_settings(void)
2329{
2330 bool ret;
2331 static const struct opt_items num_players_option[4] = {
2332 { "0", -1 },
2333 { "1", -1 },
2334 { "2", -1 },
2335 { "3", -1 }
2336 };
2337
2338 ret = rb->set_option("Number of Players", &players, INT,num_players_option , 4, NULL);
2339 if (players > worm_count) {
2340 worm_count = players;
2341 }
2342 if (players > 2) {
2343 use_remote = true;
2344 }
2345 return ret;
2346}
2347
2348/*
2349Sets the size of each argh block created
2350*/
2351bool set_worm_argh_size(void)
2352{
2353 static const struct opt_items argh_size_option[11] = {
2354 { "0", -1 },
2355 { "1", -1 },
2356 { "2", -1 },
2357 { "3", -1 },
2358 { "4", -1 },
2359 { "5", -1 },
2360 { "6", -1 },
2361 { "7", -1 },
2362 { "8", -1 },
2363 { "9", -1 },
2364 { "10", -1 }
2365 };
2366
2367 return rb->set_option("Argh Size", &argh_size,INT,argh_size_option , 11, NULL);
2368}
2369
2370/*
2371Sets the amount a worm grows per food
2372*/
2373bool set_worm_food(void)
2374{
2375 static const struct opt_items worm_food_option[11] = {
2376 { "0", -1 },
2377 { "1", -1 },
2378 { "2", -1 },
2379 { "3", -1 },
2380 { "4", -1 },
2381 { "5", -1 },
2382 { "6", -1 },
2383 { "7", -1 },
2384 { "8", -1 },
2385 { "9", -1 },
2386 { "10", -1 }
2387 };
2388 return rb->set_option("Worm Growth Per Food", &worm_food,INT,worm_food_option , 11, NULL);
2389}
2390
2391/*
2392Sets the number of arghs created per food
2393*/
2394bool set_argh_per_food(void)
2395{
2396 static const struct opt_items argh_food_option[5] = {
2397 { "0", -1 },
2398 { "1", -1 },
2399 { "2", -1 },
2400 { "3", -1 },
2401 { "4", -1 },
2402 };
2403 return rb->set_option("Arghs Per Food", &arghs_per_food,INT,argh_food_option , 5, NULL);
2404}
2405
2406/*
2407Sets the number of ticks per move
2408*/
2409bool set_worm_speed(void)
2410{
2411 bool ret;
2412 static const struct opt_items speed_option[19] = {
2413 { "0", -1 },
2414 { "1", -1 },
2415 { "2", -1 },
2416 { "3", -1 },
2417 { "4", -1 },
2418 { "5", -1 },
2419 { "6", -1 },
2420 { "7", -1 },
2421 { "8", -1 },
2422 { "9", -1 },
2423 { "10", -1 },
2424 { "11", -1 },
2425 { "12", -1 },
2426 { "13", -1 },
2427 { "14", -1 },
2428 { "15", -1 },
2429 { "16", -1 },
2430 { "17", -1 },
2431 { "18", -1 },
2432 };
2433
2434
2435 speed = 20 - speed;
2436 ret = rb->set_option("Worm Speed", &speed,INT,speed_option , 19, NULL);
2437 speed = 20 - speed;
2438 return ret;
2439}
2440
2441/*
2442Sets the control style, which depends on the number of players,
2443remote control existing, etc
2444bool set_bool_options(char* string, bool* variable,
2445 char* yes_str, char* no_str, void (*function)(bool))
2446*/
2447bool set_worm_control_style(void)
2448{
2449 static const struct opt_items key1_option[2] = {
2450 { "Remote Control", -1 },
2451 { "No Rem. Control", -1 },
2452 };
2453
2454 static const struct opt_items key2_option[2] = {
2455 { "2 Key Control", -1 },
2456 { "4 Key COntrol", -1 },
2457 };
2458
2459 static const struct opt_items key3_option[1] = {
2460 { "Out of Control", -1 },
2461 };
2462
2463 if (players > 1) {
2464 rb->set_option("Control Style",&use_remote,INT, key1_option, 2, NULL);
2465 } else {
2466 if (players > 0) {
2467 rb->set_option("Control Style",&use_remote,INT, key2_option, 2, NULL);
2468 }
2469 else {
2470 rb->set_option("Control Style",&use_remote,INT, key3_option, 1, NULL);
2471 }
2472 }
2473 return false;
2474}
2475
2476void default_settings(void)
2477{ 2270{
2478 arghs_per_food = ARGHS_PER_FOOD; 2271 arghs_per_food = ARGHS_PER_FOOD;
2479 argh_size = ARGH_SIZE; 2272 argh_size = ARGH_SIZE;
@@ -2487,9 +2280,9 @@ void default_settings(void)
2487} 2280}
2488 2281
2489/* 2282/*
2490Launches the wormlet game 2283 * Launches the wormlet game
2491*/ 2284 */
2492bool launch_wormlet(void) 2285static bool launch_wormlet(void)
2493{ 2286{
2494 int game_result = 1; 2287 int game_result = 1;
2495 2288
@@ -2513,8 +2306,6 @@ bool launch_wormlet(void)
2513 return false; 2306 return false;
2514} 2307}
2515 2308
2516/* End of settings/changes etc */
2517
2518/** 2309/**
2519 * Main entry point 2310 * Main entry point
2520 */ 2311 */
@@ -2563,104 +2354,6 @@ enum plugin_status plugin_start(const void* parameter)
2563 { "Yes", -1 }, 2354 { "Yes", -1 },
2564 }; 2355 };
2565 2356
2566 static const struct opt_items num_worms_option[3] = {
2567 { "1", -1 },
2568 { "2", -1 },
2569 { "3", -1 }
2570 };
2571
2572#ifdef MULTIPLAYER
2573 static const struct opt_items num_players_option[4] = {
2574#else
2575 static const struct opt_items num_players_option[2] = {
2576#endif
2577 { "0", -1 },
2578 { "1", -1 }
2579#ifdef MULTIPLAYER
2580 ,{ "2", -1 },
2581 { "3", -1 }
2582#endif
2583 };
2584
2585 static const struct opt_items argh_size_option[9] = {
2586 { "2", -1 },
2587 { "3", -1 },
2588 { "4", -1 },
2589 { "5", -1 },
2590 { "6", -1 },
2591 { "7", -1 },
2592 { "8", -1 },
2593 { "9", -1 },
2594 { "10", -1 }
2595 };
2596
2597 static const struct opt_items food_size_option[9] = {
2598 { "2", -1 },
2599 { "3", -1 },
2600 { "4", -1 },
2601 { "5", -1 },
2602 { "6", -1 },
2603 { "7", -1 },
2604 { "8", -1 },
2605 { "9", -1 },
2606 { "10", -1 }
2607 };
2608
2609 static const struct opt_items worm_food_option[16] = {
2610 { "0", -1 },
2611 { "1", -1 },
2612 { "2", -1 },
2613 { "3", -1 },
2614 { "4", -1 },
2615 { "5", -1 },
2616 { "6", -1 },
2617 { "7", -1 },
2618 { "8", -1 },
2619 { "9", -1 },
2620 { "10", -1 },
2621 { "11", -1 },
2622 { "12", -1 },
2623 { "13", -1 },
2624 { "14", -1 },
2625 { "15", -1 }
2626 };
2627
2628 static const struct opt_items argh_food_option[9] = {
2629 { "0", -1 },
2630 { "1", -1 },
2631 { "2", -1 },
2632 { "3", -1 },
2633 { "4", -1 },
2634 { "5", -1 },
2635 { "6", -1 },
2636 { "7", -1 },
2637 { "8", -1 }
2638 };
2639
2640 static const struct opt_items speed_option[21] = {
2641 { "0", -1 },
2642 { "1", -1 },
2643 { "2", -1 },
2644 { "3", -1 },
2645 { "4", -1 },
2646 { "5", -1 },
2647 { "6", -1 },
2648 { "7", -1 },
2649 { "8", -1 },
2650 { "9", -1 },
2651 { "10", -1 },
2652 { "11", -1 },
2653 { "12", -1 },
2654 { "13", -1 },
2655 { "14", -1 },
2656 { "15", -1 },
2657 { "16", -1 },
2658 { "17", -1 },
2659 { "18", -1 },
2660 { "19", -1 },
2661 { "20", -1 }
2662 };
2663
2664 static const struct opt_items remoteonly_option[1] = { 2357 static const struct opt_items remoteonly_option[1] = {
2665 { "Remote Control", -1 } 2358 { "Remote Control", -1 }
2666 }; 2359 };
@@ -2701,23 +2394,20 @@ enum plugin_status plugin_start(const void* parameter)
2701 launch_wormlet(); 2394 launch_wormlet();
2702 break; 2395 break;
2703 case 1: 2396 case 1:
2704 new_setting = worm_count - 1; 2397 rb->set_int("Number of Worms", "", UNIT_INT, &worm_count, NULL,
2705 rb->set_option("Number of Worms", &new_setting, INT, num_worms_option, 3, NULL); 2398 1, 1, 3, NULL);
2706 if (new_setting != worm_count)
2707 worm_count = new_setting + 1;
2708 if (worm_count < players) { 2399 if (worm_count < players) {
2709 worm_count = players; 2400 worm_count = players;
2710 } 2401 }
2711 break; 2402 break;
2712 case 2: 2403 case 2:
2713 new_setting = players;
2714#ifdef MULTIPLAYER 2404#ifdef MULTIPLAYER
2715 rb->set_option("Number of Players", &new_setting, INT, num_players_option , 4, NULL); 2405 rb->set_int("Number of Players", "", UNIT_INT, &players, NULL,
2406 1, 0, 4, NULL);
2716#else 2407#else
2717 rb->set_option("Number of Players", &new_setting, INT, num_players_option , 2, NULL); 2408 rb->set_int("Number of Players", "", UNIT_INT, &players, NULL,
2409 1, 0, 2, NULL);
2718#endif 2410#endif
2719 if (new_setting != players)
2720 players = new_setting;
2721 if (players > worm_count) { 2411 if (players > worm_count) {
2722 worm_count = players; 2412 worm_count = players;
2723 } 2413 }
@@ -2726,63 +2416,55 @@ enum plugin_status plugin_start(const void* parameter)
2726 } 2416 }
2727 break; 2417 break;
2728 case 3: 2418 case 3:
2729 new_setting = use_remote;
2730 switch(players) { 2419 switch(players) {
2731 case 0: 2420 case 0:
2732 rb->set_option("Control Style",&new_setting,INT, nokey_option, 1, NULL); 2421 rb->set_option("Control Style",&use_remote,INT,
2422 nokey_option, 1, NULL);
2733 break; 2423 break;
2734 case 1: 2424 case 1:
2735 rb->set_option("Control Style",&new_setting,INT, key24_option, 2, NULL); 2425 rb->set_option("Control Style",&use_remote,INT,
2426 key24_option, 2, NULL);
2736 break; 2427 break;
2737 case 2: 2428 case 2:
2738#ifdef REMOTE 2429#ifdef REMOTE
2739 rb->set_option("Control Style",&new_setting,INT, remote_option, 2, NULL); 2430 rb->set_option("Control Style",&use_remote,INT,
2431 remote_option, 2, NULL);
2740#else 2432#else
2741 rb->set_option("Control Style",&new_setting,INT, key2_option, 1, NULL); 2433 rb->set_option("Control Style",&use_remote,INT,
2434 key2_option, 1, NULL);
2742#endif 2435#endif
2743 break; 2436 break;
2744 case 3: 2437 case 3:
2745 rb->set_option("Control Style",&new_setting,INT, remoteonly_option, 1, NULL); 2438 rb->set_option("Control Style",&use_remote,INT,
2439 remoteonly_option, 1, NULL);
2746 break; 2440 break;
2747 } 2441 }
2748 if (new_setting != use_remote)
2749 use_remote = new_setting;
2750 break; 2442 break;
2751 case 4: 2443 case 4:
2752 new_setting = worm_food; 2444 rb->set_int("Worm Growth Per Food", "", UNIT_INT, &worm_food,
2753 rb->set_option("Worm Growth Per Food", &new_setting,INT,worm_food_option , 16, NULL); 2445 NULL, 1, 0, 15, NULL);
2754 if (new_setting != worm_food)
2755 worm_food = new_setting;
2756 break; 2446 break;
2757 case 5: 2447 case 5:
2758 new_setting = speed; 2448 new_setting = 20 - speed;
2759 new_setting = 20 - new_setting; 2449 rb->set_int("Worm Speed", "", UNIT_INT, &new_setting,
2760 rb->set_option("Worm Speed", &new_setting,INT,speed_option , 21, NULL); 2450 NULL, 1, 0, 20, NULL);
2761 new_setting = 20 - new_setting; 2451 speed = 20 - new_setting;
2762 if (new_setting != speed)
2763 speed = new_setting;
2764 break; 2452 break;
2765 case 6: 2453 case 6:
2766 new_setting = arghs_per_food; 2454 rb->set_int("Arghs Per Food", "", UNIT_INT, &arghs_per_food,
2767 rb->set_option("Arghs Per Food", &new_setting,INT,argh_food_option , 9, NULL); 2455 NULL, 1, 0, 8, NULL);
2768 if (new_setting != arghs_per_food)
2769 arghs_per_food = new_setting;
2770 break; 2456 break;
2771 case 7: 2457 case 7:
2772 new_setting = argh_size-2; 2458 rb->set_int("Argh Size", "", UNIT_INT, &argh_size,
2773 rb->set_option("Argh Size", &new_setting,INT,argh_size_option , 9, NULL); 2459 NULL, 1, 2, 10, NULL);
2774 if (new_setting != argh_size)
2775 argh_size = new_setting+2;
2776 break; 2460 break;
2777 case 8: 2461 case 8:
2778 new_setting = food_size-2; 2462 rb->set_int("Food Size", "", UNIT_INT, &food_size,
2779 rb->set_option("Food Size", &new_setting,INT,food_size_option, 9, NULL); 2463 NULL, 1, 2, 10, NULL);
2780 if (new_setting != food_size)
2781 food_size = new_setting+2;
2782 break; 2464 break;
2783 case 9: 2465 case 9:
2784 new_setting = 0; 2466 new_setting = 0;
2785 rb->set_option("Reset Settings?", &new_setting,INT, noyes , 2, NULL); 2467 rb->set_option("Reset Settings?", &new_setting, INT, noyes , 2, NULL);
2786 if (new_setting == 1) 2468 if (new_setting == 1)
2787 default_settings(); 2469 default_settings();
2788 break; 2470 break;