X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_em%2Finput.c;h=ad5ee68f4652e8cdda4a09cd9950876b2c1e47ed;hb=536e46a4eadb99140f58a8b09a7e25ca02b50680;hp=ada3aba4f7e3726427b6f628d6924878c7350110;hpb=095207353ef58a65f5146e6ddc7eefb51bfe0f55;p=rocksndiamonds.git diff --git a/src/game_em/input.c b/src/game_em/input.c index ada3aba4..ad5ee68f 100644 --- a/src/game_em/input.c +++ b/src/game_em/input.c @@ -44,8 +44,6 @@ static int input_esc; static struct timeval tv1; static struct timeval tv2; -static unsigned char keymatrix[32]; - static int player_mode; static char player_name[32]; static int player_level; @@ -94,29 +92,25 @@ static void drawmenu(int pos) break; case 5: - title_string(10, 1, 13, "played"); + title_string(10, 3, 13, "played"); title_string(10, 14, 26, "score"); - title_string(10, 27, 39, "won"); + title_string(10, 27, 37, "won"); break; case 6: sprintf(buffer, "%d", 0); - title_string(11, 1, 13, buffer); + title_string(11, 3, 13, buffer); sprintf(buffer, "%d", 0); title_string(11, 14, 26, buffer); sprintf(buffer, "%d", 0); - title_string(11, 27, 39, buffer); + title_string(11, 27, 37, buffer); break; } } -/* bring it all together */ -int game_start(void) +void game_init_vars(void) { - int x,y; - char name[MAXNAME+2]; - int temp; - int pos; + int x, y; Random = 1684108901; @@ -152,152 +146,229 @@ int game_start(void) player_level = 0; input_pause = 1 * 0; +} + +int game_play_init(int level_nr, char *filename) +{ + if (filename != NULL) + { + player_level = level_nr; + + if (cave_convert(filename) != 0) + return 1; + } + else /* !!! SOON OBSOLETE !!! */ + { + char name[MAXNAME+2]; + + name[MAXNAME] = 0; + snprintf(name, MAXNAME+2, "%s/lev%02d", EM_LVL_DIR, player_level); + + if (name[MAXNAME]) + snprintf_overflow("read a level in cave/"); + + if (cave_convert(name) != 0) + return 1; + } + + game_initscreen(); + game_blitscore(); + game_animscreen(); - while (1) + return 0; +} + +int game_menu_loop(boolean init, byte action) +{ + static int temp = -1; + static int pos = -1; + + if (init) { + temp = 1; pos = 4; - title_initscreen(); + return 0; + } + + input_eventloop(); - for (temp = 0; temp < 7; temp++) - drawmenu(temp); /* display all lines */ + if (input_die) + return 1; - title_blitants(4 + pos); + if (input_refresh) + blitscreen(); + if (!input_pause) + { title_blitscore(); title_animscreen(); - temp = 1; - while (1) + ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = 0; + + readjoy(action); + + if (temp == 0) { - input_eventloop(); - if (input_die) return(0); - if (input_refresh) blitscreen(); + if (ply1.joy_fire) + return 2; - if (!input_pause) + if (ply1.joy_e && player_level < 99) { - title_blitants(4 + pos); - title_blitscore(); - title_animscreen(); - - ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = 0; - - readjoy(); - - if (temp == 0) - { - if (ply1.joy_fire) - break; - - if (ply1.joy_e && player_level < 99) - { - player_level++; - drawmenu(2); - } - - if (ply1.joy_w && player_level > 0) - { - player_level--; - drawmenu(2); - } - - if (ply1.joy_n && pos > 0) - { - drawmenu(pos); - pos--; - title_blitants(4 + pos); - } - - if (ply1.joy_s && pos < 4) - { - drawmenu(pos); - pos++; - title_blitants(4 + pos); - } - } - - temp = (ply1.joy_n || - ply1.joy_e || - ply1.joy_s || - ply1.joy_w || - ply1.joy_fire); + player_level++; + drawmenu(2); + } + + if (ply1.joy_w && player_level > 0) + { + player_level--; + drawmenu(2); + } + + if (ply1.joy_n && pos > 0) + { + drawmenu(pos); + pos--; + } + + if (ply1.joy_s && pos < 4) + { + drawmenu(pos); + pos++; } } - name[MAXNAME] = 0; - snprintf(name, MAXNAME+2, "%s/lev%02d", EM_LVL_DIR, player_level); + temp = (ply1.joy_n || ply1.joy_e || ply1.joy_s || ply1.joy_w || + ply1.joy_fire); + } - if (name[MAXNAME]) - snprintf_overflow("read a level in cave/"); + return 0; +} + +int game_play_loop(byte action) +{ + input_eventloop(); - if (cave_convert(name)) - continue; + if (input_die || input_esc) + return 1; - game_initscreen(); - game_blitscore(); + if (input_refresh) + blitscreen(); + + if (!input_pause) + { game_animscreen(); - while (1) + frame = (frame - 1) & 7; + + readjoy(action); + +#if 1 + if (input_esc) + return 1; +#endif + + if (frame == 7) { - input_eventloop(); + synchro_1(); + synchro_2(); + } - if (input_die || input_esc) - break; + if (frame == 6) + { + synchro_3(); + sound_play(); + game_blitscore(); + } + } - if (input_refresh) - blitscreen(); + return 0; +} - if (!input_pause) - { - game_animscreen(); +void game_menu_init(void) +{ + int i; - frame = (frame - 1) & 7; + title_initscreen(); - readjoy(); + for (i = 0; i < 7; i++) + drawmenu(i); /* display all lines */ - if (frame == 7) - { - synchro_1(); - synchro_2(); - } + title_blitscore(); + title_animscreen(); - if (frame == 6) - { - synchro_3(); - sound_play(); - game_blitscore(); - } - } + game_menu_loop(1, 0); +} + +int game_loop(byte action) +{ +#if 0 + printf("::: action == 0x%02x\n", action); +#endif + + if (em_game_status == EM_GAME_STATUS_MENU) + { + int result = game_menu_loop(0, action); + + if (result == 1) + { + /* exit program */ + + return 1; + } + + if (result == 2) + { + /* start playing */ + + em_game_status = EM_GAME_STATUS_PLAY; + if (game_play_init(player_level, NULL) != 0) + em_game_status = EM_GAME_STATUS_MENU; + } + } + else if (em_game_status == EM_GAME_STATUS_PLAY) + { + if (game_play_loop(action) != 0) + { + /* stop playing */ + + if (skip_menu) + return 1; + + em_game_status = EM_GAME_STATUS_MENU; + game_menu_init(); } } + + return 0; } -/* read input device for players - */ -void readjoy(void) + +/* read input device for players */ + +void readjoy(byte action) { - unsigned int i; unsigned int north = 0, east = 0, south = 0, west = 0, fire = 0; - for (i = 0; i < 3; i++) - if (keymatrix[northKeyCode[i] >> 3] & 1 << (northKeyCode[i] & 7)) - north = 1; + if (action & JOY_LEFT) + west = 1; - for (i = 0; i < 3; i++) - if (keymatrix[eastKeyCode[i] >> 3] & 1 << (eastKeyCode[i] & 7)) - east = 1; + if (action & JOY_RIGHT) + east = 1; - for (i = 0; i < 3; i++) - if (keymatrix[southKeyCode[i] >> 3] & 1 << (southKeyCode[i] & 7)) - south = 1; + if (action & JOY_UP) + north = 1; - for (i = 0; i < 3; i++) - if (keymatrix[westKeyCode[i] >> 3] & 1 << (westKeyCode[i] & 7)) - west = 1; + if (action & JOY_DOWN) + south = 1; - for (i = 0; i < 3; i++) - if (keymatrix[fireKeyCode[i] >> 3] & 1 << (fireKeyCode[i] & 7)) - fire = 1; + if (action & JOY_BUTTON_1) + fire = 1; + +#if 0 + if (action & JOY_BUTTON_2) + input_esc = 1; +#endif ply1.joy_fire = fire; if (ply1.joy_stick || (north | east | south | west)) @@ -309,22 +380,14 @@ void readjoy(void) } } -/* handle events from x windows and block until the next frame - */ + +/* handle events from x windows and block until the next frame */ + void input_eventloop(void) { - XEvent event; - unsigned int i; unsigned long count; - if (input_pause) - { - XPeekEvent(display, &event); /* block until an event arrives */ - - if (gettimeofday(&tv1, 0) == -1) - tv1.tv_usec = 0; - } - else + if (!input_pause) { XSync(display, False); /* block until all graphics are drawn */ @@ -348,50 +411,9 @@ void input_eventloop(void) } } + input_esc = 0; input_die = 0; input_refresh = 0; - lastKeySym = NoSymbol; - - while (XPending(display)) - { - /* drain the event queue */ - XNextEvent(display, &event); - - switch(event.xany.type) - { - case KeyPress: - XLookupString(&event.xkey, (char *)&count, 1, &lastKeySym, 0); - break; - - case Expose: - if (event.xexpose.window == xwindow && event.xexpose.count == 0) - input_refresh = 1; - break; - - case ClientMessage: - if (event.xclient.window == xwindow && - (Atom)event.xclient.data.l[0] == deleteAtom) - input_die = 1; - break; - - case EnterNotify: - if (event.xcrossing.window == xwindow) - input_pause = 0; - break; - - case LeaveNotify: - if (event.xcrossing.window == xwindow) - input_pause = 1; - break; - } - } - - XQueryKeymap(display, keymatrix); /* read the keyboard */ - - input_esc = 0; - for (i = 0; i < 1; i++) - if (keymatrix[escKeyCode[i] >> 3] & 1 << (escKeyCode[i] & 7)) - input_esc = 1; } #endif