static int start_keybd(int c, int d) { if (d) { if (c == KEY_EXIT) return start_action(GUI_BACK, 0); if (c == SDLK_c && config_cheat()) { set_cheat(); return goto_state(&st_start); } else if (c == KEY_LEVELSHOTS && config_cheat()) { char *dir = concat_string("Screenshots/shot-", set_id(curr_set()), NULL); int i; fs_mkdir(dir); /* Iterate over all levels, taking a screenshot of each. */ for (i = 0; i < MAXLVL; i++) if (level_exists(i)) level_snap(i, dir); free(dir); } else if (config_tst_d(CONFIG_KEY_SCORE_NEXT, c)) return start_score(+1); } return 1; }
static int handle_key_dn(SDL_Event *e) { int d = 1; int c = e->key.keysym.sym; /* SDL made me do it. */ #ifdef __APPLE__ if (c == SDLK_q && e->key.keysym.mod & KMOD_META) return 0; #endif #ifdef WIN32 if (c == SDLK_F4 && e->key.keysym.mod & KMOD_ALT) return 0; #endif switch (c) { case KEY_SCREENSHOT: shot_prep(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: if (config_cheat()) toggle_wire(); break; case KEY_LERP: if (config_cheat()) toggle_lerp(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), +1.0f); /* FIXME: SDL_EnableUNICODE() is not available */ /*if (SDL_EnableUNICODE(-1)) d = st_keybd(e->key.keysym.unicode, 1); else*/ d = st_keybd(e->key.keysym.sym, 1); } return d; }
static int handle_key_dn(SDL_Event *e) { int d = 1; int c = e->key.keysym.sym; /* SDL made me do it. */ #ifdef __APPLE__ if (c == SDLK_q && e->key.keysym.mod & KMOD_GUI) return 0; #endif #ifdef _WIN32 if (c == SDLK_F4 && e->key.keysym.mod & KMOD_ALT) return 0; #endif switch (c) { case KEY_SCREENSHOT: shot(); break; case KEY_FPS: config_tgl_d(CONFIG_FPS); break; case KEY_WIREFRAME: if (config_cheat()) toggle_wire(); break; case KEY_RESOURCES: if (config_cheat()) { light_load(); mtrl_reload(); } break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case KEY_EXIT: d = st_keybd(KEY_EXIT, 1); break; default: if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), -1.0f); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y0), +1.0f); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), -1.0f); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X0), +1.0f); else d = st_keybd(e->key.keysym.sym, 1); } return d; }
int progress_play(struct level *l) { if (l && (level_opened(l) || config_cheat())) { level = l; next = NULL; status = GAME_NONE; coins = 0; timer = 0; goal = goal_i = level_goal(level); if (same_goal_e) same_goal_e = 0; else goal_e = (mode != MODE_CHALLENGE && level_completed(level) && config_get_d(CONFIG_LOCK_GOALS) == 0) || goal == 0; prev = curr; time_rank = RANK_LAST; goal_rank = RANK_LAST; coin_rank = RANK_LAST; return init_level(); } return 0; }
static void set_load_hs(void) { struct set *s = SET_GET(sets, curr); fs_file fp; if ((fp = fs_open(config_cheat() ? s->cheat_scores : s->user_scores, "r"))) { char buf[MAXSTR]; if (fs_gets(buf, sizeof (buf), fp)) { strip_newline(buf); if (sscanf(buf, "version %d", &score_version) == 1) { switch (score_version) { case 2: set_load_hs_v2(fp, s, buf, sizeof (buf)); break; } } else set_load_hs_v1(fp, s, buf, sizeof (buf)); } fs_close(fp); } }
void set_store_hs(void) { const struct set *s = SET_GET(sets, curr); fs_file fp; if ((fp = fs_open(config_cheat() ? s->cheat_scores : s->user_scores, "w"))) { int i; fs_printf(fp, "version %d\nset %s\n", SCORE_VERSION, s->id); put_score(fp, &s->time_score); put_score(fp, &s->coin_score); for (i = 0; i < s->count; i++) { const struct level *l = &level_v[i]; int flags = 0; if (l->is_locked) flags |= LEVEL_LOCKED; if (l->is_completed) flags |= LEVEL_COMPLETED; fs_printf(fp, "level %d %d %s\n", flags, l->version_num, l->file); put_score(fp, &l->scores[SCORE_TIME]); put_score(fp, &l->scores[SCORE_GOAL]); put_score(fp, &l->scores[SCORE_COIN]); } fs_close(fp); } }
static void gui_level(int id, int i) { struct level *l = get_level(i); const GLubyte *fore = 0; const GLubyte *back = 0; int jd; if (!l) { gui_label(id, " ", GUI_SML, gui_blk, gui_blk); return; } if (level_opened(l)) { fore = level_bonus(l) ? gui_grn : gui_wht; back = level_completed(l) ? fore : gui_yel; } jd = gui_label(id, level_name(l), GUI_SML, back, fore); if (level_opened(l) || config_cheat()) gui_set_state(jd, START_LEVEL, i); }
static int play_loop_keybd(int c, int d) { if (d) { if (config_tst_d(CONFIG_KEY_CAMERA_R, c)) rot_set(DIR_R, 1.0f, 0); if (config_tst_d(CONFIG_KEY_CAMERA_L, c)) rot_set(DIR_L, 1.0f, 0); if (config_tst_d(CONFIG_KEY_ROTATE_FAST, c)) fast_rotate = 1; keybd_camera(c); if (config_tst_d(CONFIG_KEY_RESTART, c) && progress_same_avail()) { if (progress_same()) goto_state(&st_play_ready); } if (c == KEY_EXIT) goto_state(&st_pause); } else { if (config_tst_d(CONFIG_KEY_CAMERA_R, c)) rot_clr(DIR_R); if (config_tst_d(CONFIG_KEY_CAMERA_L, c)) rot_clr(DIR_L); if (config_tst_d(CONFIG_KEY_ROTATE_FAST, c)) fast_rotate = 0; } if (d && c == KEY_LOOKAROUND && config_cheat()) return goto_state(&st_look); if (d && c == KEY_POSE) show_hud = !show_hud; if (d && c == SDLK_c && config_cheat()) { progress_stat(GAME_GOAL); return goto_state(&st_goal); } return 1; }
static void start_over_level(int i) { struct level *l = get_level(i); if (level_opened(l) || config_cheat()) { gui_set_image(shot_id, level_shot(l)); set_score_board(level_score(l, SCORE_COIN), -1, level_score(l, SCORE_TIME), -1, level_score(l, SCORE_GOAL), -1); if (file_id) gui_set_label(file_id, level_file(l)); } }
static int title_gui(void) { int id, jd, kd; /* Build the title GUI. */ if ((id = gui_vstack(0))) { if ((jd = gui_label(id, " Neverball ", GUI_LRG, 0, 0))) gui_set_fill(jd); gui_space(id); if ((jd = gui_hstack(id))) { gui_filler(jd); if ((kd = gui_varray(jd))) { if (config_cheat()) play_id = gui_start(kd, sgettext("menu^Cheat"), GUI_MED, TITLE_PLAY, 0); else play_id = gui_start(kd, sgettext("menu^Play"), GUI_MED, TITLE_PLAY, 0); gui_state(kd, sgettext("menu^Replay"), GUI_MED, TITLE_DEMO, 0); gui_state(kd, sgettext("menu^Help"), GUI_MED, TITLE_HELP, 0); gui_state(kd, sgettext("menu^Options"), GUI_MED, TITLE_CONF, 0); gui_state(kd, sgettext("menu^Exit"), GUI_MED, GUI_BACK, 0); /* Hilight the start button. */ gui_set_hilite(play_id, 1); } gui_filler(jd); } gui_layout(id, 0, 0); } return id; }
static int start_action(int tok, int val) { audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: return goto_state(&st_set); case START_CHALLENGE: if (config_cheat()) { progress_init(curr_mode() == MODE_CHALLENGE ? MODE_NORMAL : MODE_CHALLENGE); gui_toggle(challenge_id); return 1; } else { progress_init(MODE_CHALLENGE); return start_action(START_LEVEL, 0); } break; case GUI_SCORE: gui_score_set(val); start_over(gui_active(), 0); return 1; case START_LOCK_GOALS: config_set_d(CONFIG_LOCK_GOALS, val); return goto_state(&st_start); case START_LEVEL: if (progress_play(get_level(val))) return goto_state(&st_level); break; } return 1; }
static int loop(void) { SDL_Event e; int d = 1; int c; /* Process SDL events. */ while (d && SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: return 0; case SDL_MOUSEMOTION: st_point(+e.motion.x, -e.motion.y + config_get_d(CONFIG_HEIGHT), +e.motion.xrel, config_get_d(CONFIG_MOUSE_INVERT) ? +e.motion.yrel : -e.motion.yrel); break; case SDL_MOUSEBUTTONDOWN: d = st_click(e.button.button, 1); break; case SDL_MOUSEBUTTONUP: d = st_click(e.button.button, 0); break; case SDL_KEYDOWN: c = e.key.keysym.sym; if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), -JOY_MAX); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), +JOY_MAX); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), -JOY_MAX); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), +JOY_MAX); else switch (c) { case SDLK_F10: shot(); break; case SDLK_F9: config_tgl_d(CONFIG_FPS); break; case SDLK_F8: config_tgl_d(CONFIG_NICE); break; case SDLK_F7: if (config_cheat()) toggle_wire(); break; case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 1); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 1); break; default: if (SDL_EnableUNICODE(-1)) d = st_keybd(e.key.keysym.unicode, 1); else d = st_keybd(e.key.keysym.sym, 1); } break; case SDL_KEYUP: c = e.key.keysym.sym; if (config_tst_d(CONFIG_KEY_FORWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 1); else if (config_tst_d(CONFIG_KEY_BACKWARD, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_Y), 1); else if (config_tst_d(CONFIG_KEY_LEFT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 1); else if (config_tst_d(CONFIG_KEY_RIGHT, c)) st_stick(config_get_d(CONFIG_JOYSTICK_AXIS_X), 1); else switch (c) { case SDLK_RETURN: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_A), 0); break; case SDLK_ESCAPE: d = st_buttn(config_get_d(CONFIG_JOYSTICK_BUTTON_EXIT), 0); break; default: d = st_keybd(e.key.keysym.sym, 0); } case SDL_ACTIVEEVENT: if (e.active.state == SDL_APPINPUTFOCUS) if (e.active.gain == 0 && video_get_grab()) goto_pause(); break; case SDL_JOYAXISMOTION: st_stick(e.jaxis.axis, e.jaxis.value); break; case SDL_JOYBUTTONDOWN: d = st_buttn(e.jbutton.button, 1); break; case SDL_JOYBUTTONUP: d = st_buttn(e.jbutton.button, 0); break; } } /* Process events via the tilt sensor API. */ if (tilt_stat()) { int b; int s; st_angle((int) tilt_get_x(), (int) tilt_get_z()); while (tilt_get_button(&b, &s)) { const int X = config_get_d(CONFIG_JOYSTICK_AXIS_X); const int Y = config_get_d(CONFIG_JOYSTICK_AXIS_Y); const int L = config_get_d(CONFIG_JOYSTICK_DPAD_L); const int R = config_get_d(CONFIG_JOYSTICK_DPAD_R); const int U = config_get_d(CONFIG_JOYSTICK_DPAD_U); const int D = config_get_d(CONFIG_JOYSTICK_DPAD_D); if (b == L || b == R || b == U || b == D) { static int pad[4] = { 0, 0, 0, 0 }; /* Track the state of the D-pad buttons. */ if (b == L) pad[0] = s; else if (b == R) pad[1] = s; else if (b == U) pad[2] = s; else if (b == D) pad[3] = s; /* Convert D-pad button events into joystick axis motion. */ if (pad[0] && !pad[1]) st_stick(X, -JOY_MAX); else if (pad[1] && !pad[0]) st_stick(X, +JOY_MAX); else st_stick(X, 1); if (pad[2] && !pad[3]) st_stick(Y, -JOY_MAX); else if (pad[3] && !pad[2]) st_stick(Y, +JOY_MAX); else st_stick(Y, 1); } else d = st_buttn(b, s); } } return d; }
void config_save(void) { fs_file fh; if (dirty && (fh = fs_open(USER_CONFIG_FILE, "w"))) { int i; /* Write out integer options. */ for (i = 0; i < ARRAYSIZE(option_d); i++) { const char *s = NULL; /* Translate some integers to strings. */ if (i == CONFIG_MOUSE_CAMERA_1 || i == CONFIG_MOUSE_CAMERA_2 || i == CONFIG_MOUSE_CAMERA_3 || i == CONFIG_MOUSE_CAMERA_TOGGLE || i == CONFIG_MOUSE_CAMERA_L || i == CONFIG_MOUSE_CAMERA_R) { s = config_mouse_name(option_d[i].cur); } else if (i == CONFIG_KEY_FORWARD || i == CONFIG_KEY_BACKWARD || i == CONFIG_KEY_LEFT || i == CONFIG_KEY_RIGHT || i == CONFIG_KEY_CAMERA_1 || i == CONFIG_KEY_CAMERA_2 || i == CONFIG_KEY_CAMERA_3 || i == CONFIG_KEY_CAMERA_TOGGLE || i == CONFIG_KEY_CAMERA_R || i == CONFIG_KEY_CAMERA_L || i == CONFIG_KEY_PAUSE || i == CONFIG_KEY_RESTART || i == CONFIG_KEY_SCORE_NEXT || i == CONFIG_KEY_ROTATE_FAST) { s = SDL_GetKeyName((SDLKey) option_d[i].cur); } else if (i == CONFIG_CHEAT) { if (!config_cheat()) continue; } if (s) fs_printf(fh, "%-25s %s\n", option_d[i].name, s); else fs_printf(fh, "%-25s %d\n", option_d[i].name, option_d[i].cur); } /* Write out string options. */ for (i = 0; i < ARRAYSIZE(option_s); i++) { if (option_s[i].cur && *option_s[i].cur) fs_printf(fh, "%-25s %s\n", option_s[i].name, option_s[i].cur); } fs_close(fh); } dirty = 0; }
static int title_action(int tok, int val) { static const char keyphrase[] = "xyzzy"; static char queue[sizeof (keyphrase)] = ""; size_t queue_len = strlen(queue); audio_play(AUD_MENU, 1.0f); switch (tok) { case GUI_BACK: return 0; break; case TITLE_PLAY: if (strlen(config_get_s(CONFIG_PLAYER)) == 0) return goto_name(&st_set, &st_title, 0); else return goto_state(&st_set); break; case TITLE_HELP: return goto_state(&st_help); break; case TITLE_DEMO: return goto_state(&st_demo); break; case TITLE_CONF: return goto_state(&st_conf); break; case GUI_CHAR: /* Let the queue fill up. */ if (queue_len < sizeof (queue) - 1) { queue[queue_len] = (char) val; queue[queue_len + 1] = '\0'; } /* Advance the queue before adding the new element. */ else { int k; for (k = 1; k < queue_len; k++) queue[k - 1] = queue[k]; queue[queue_len - 1] = (char) val; } if (strcmp(queue, keyphrase) == 0) { config_set_cheat(); gui_set_label(play_id, sgettext("menu^Cheat")); gui_pulse(play_id, 1.2f); } else if (config_cheat()) { config_clr_cheat(); gui_set_label(play_id, sgettext("menu^Play")); gui_pulse(play_id, 1.2f); } break; } return 1; }
static int set_load(struct set *s, const char *filename) { fs_file fin; char *scores, *level_name; /* Skip "Misc" set when not in dev mode. */ if (strcmp(filename, SET_MISC) == 0 && !config_cheat()) return 0; fin = fs_open(filename, "r"); if (!fin) { log_printf("Failure to load set file %s\n", filename); //senquack - added error reporting: log_printf(fs_error()); return 0; } memset(s, 0, sizeof (struct set)); /* Set some sane values in case the scores are missing. */ score_init_hs(&s->time_score, 359999, 0); score_init_hs(&s->coin_score, 359999, 0); SAFECPY(s->file, filename); if (read_line(&s->name, fin) && read_line(&s->desc, fin) && read_line(&s->id, fin) && read_line(&s->shot, fin) && read_line(&scores, fin)) { sscanf(scores, "%d %d %d %d %d %d", &s->time_score.timer[RANK_HARD], &s->time_score.timer[RANK_MEDM], &s->time_score.timer[RANK_EASY], &s->coin_score.coins[RANK_HARD], &s->coin_score.coins[RANK_MEDM], &s->coin_score.coins[RANK_EASY]); free(scores); s->user_scores = concat_string("Scores/", s->id, ".txt", NULL); s->cheat_scores = concat_string("Scores/", s->id, "-cheat.txt", NULL); s->count = 0; while (s->count < MAXLVL && read_line(&level_name, fin)) { s->level_name_v[s->count] = level_name; s->count++; } fs_close(fin); return 1; } free(s->name); free(s->desc); free(s->id); free(s->shot); fs_close(fin); return 0; }
static int start_gui(void) { int w = video.device_w; int h = video.device_h; int i, j; int id, jd, kd, ld; if ((id = gui_vstack(0))) { if ((jd = gui_hstack(id))) { gui_label(jd, set_name(curr_set()), GUI_SML, gui_yel, gui_red); gui_filler(jd); gui_start(jd, _("Back"), GUI_SML, GUI_BACK, 0); } gui_space(id); if ((jd = gui_harray(id))) { if (config_cheat()) { if ((kd = gui_vstack(jd))) { shot_id = gui_image(kd, set_shot(curr_set()), 6 * w / 16, 6 * h / 16); file_id = gui_label(kd, " ", GUI_SML, gui_yel, gui_red); } } else { shot_id = gui_image(jd, set_shot(curr_set()), 7 * w / 16, 7 * h / 16); } if ((kd = gui_varray(jd))) { for (i = 0; i < 5; i++) if ((ld = gui_harray(kd))) for (j = 4; j >= 0; j--) gui_level(ld, i * 5 + j); challenge_id = gui_state(kd, _("Challenge"), GUI_SML, START_CHALLENGE, 0); gui_set_hilite(challenge_id, curr_mode() == MODE_CHALLENGE); } } gui_space(id); gui_score_board(id, (GUI_SCORE_COIN | GUI_SCORE_TIME | GUI_SCORE_GOAL), 0, 0); gui_space(id); if ((jd = gui_hstack(id))) { gui_filler(jd); if ((kd = gui_harray(jd))) { int btn0, btn1; btn0 = gui_state(kd, _("Unlocked"), GUI_SML, START_LOCK_GOALS, 0); btn1 = gui_state(kd, _("Locked"), GUI_SML, START_LOCK_GOALS, 1); if (config_get_d(CONFIG_LOCK_GOALS)) gui_set_hilite(btn1, 1); else gui_set_hilite(btn0, 1); } gui_space(jd); gui_label(jd, _("Goal State in Completed Levels"), GUI_SML, 0, 0); gui_filler(jd); } gui_layout(id, 0, 0); if (file_id) gui_set_trunc(file_id, TRUNC_HEAD); set_score_board(NULL, -1, NULL, -1, NULL, -1); } return id; }