static nh_bool option_change_callback(struct nh_option_desc *option) { if (!strcmp(option->name, "classic_status") || !strcmp(option->name, "darkmsg") || !strcmp(option->name, "frame") || !strcmp(option->name, "frame_hp_color") || !strcmp(option->name, "status3") || !strcmp(option->name, "sidebar")) { rebuild_ui(); return TRUE; } else if (!strcmp(option->name, "showexp") || !strcmp(option->name, "showscore") || !strcmp(option->name, "time")) { curses_update_status(NULL); } else if (!strcmp(option->name, "darkroom") || !strcmp(option->name, "hilite_peaceful") || !strcmp(option->name, "hilite_pet") || !strcmp(option->name, "mapcolors")) { draw_map(player.x, player.y); } else if (!strcmp(option->name, "darkgray")) { set_darkgray(); draw_map(player.x, player.y); } else if (!strcmp(option->name, "dungeon_name")) { settings.dungeon_name = option->value.e; rebuild_ui(); } else if (!strcmp(option->name, "menu_headings")) { settings.menu_headings = option->value.e; } else if (!strcmp(option->name, "graphics")) { settings.graphics = option->value.e; switch_graphics(option->value.e); if (ui_flags.ingame) { draw_map(player.x, player.y); redraw_game_windows(); } } else if (!strcmp(option->name, "scores_top")) { settings.end_top = option->value.i; } else if (!strcmp(option->name, "scores_around")) { settings.end_around = option->value.i; } else if (!strcmp(option->name, "optstyle")) { settings.optstyle = option->value.e; } else if (!strcmp(option->name, "msgheight")) { settings.msgheight = option->value.i; rebuild_ui(); } else if (!strcmp(option->name, "msghistory")) { settings.msghistory = option->value.i; alloc_hist_array(); } #if defined(PDCURSES) && defined(WIN32) else if (!strcmp(option->name, "win_width")) { settings.win_width = option->value.i; resize_term(settings.win_height, settings.win_width); handle_resize(); } else if (!strcmp(option->name, "win_height")) { settings.win_height = option->value.i; resize_term(settings.win_height, settings.win_width); handle_resize(); } #endif else if (!strcmp(option->name, "name")) { if (option->value.s) strcpy(settings.plname, option->value.s); else settings.plname[0] = '\0'; } else return FALSE; return TRUE; }
nh_bool curses_set_option(const char *name, union nh_optvalue value) { nh_bool game_option = FALSE; struct nh_option_desc *option = nhlib_find_option(curses_options, name); if (!option) { if (game_is_running) return nh_set_option(name, value); /* If the game is not running, update our local copy of options. */ if (!nh_options || !(option = nhlib_find_option(nh_options, name))) { return FALSE; } game_option = TRUE; } if ((int)option->type == OPTTYPE_KEYMAP) { return FALSE; } if (!nhlib_option_value_ok(option, value)) return FALSE; nhlib_copy_option_value(option, value); if (game_option) return TRUE; /* In case the option affects graphics; this is pretty cheap if we don't do it every turn */ mark_mapwin_for_full_refresh(); if (option->type == OPTTYPE_BOOL) { nh_bool *var = nhlib_find_boolopt(boolopt_map, option->name); if (!var) { curses_impossible("missing boolean option"); return FALSE; } *var = value.b; if (!strcmp(option->name, "status3")) { rebuild_ui(); } else if (!strcmp(option->name, "darkgray")) { set_darkgray(); draw_map(player.x, player.y); } else if (!strcmp(option->name, "mouse")) { uncursed_enable_mouse(option->value.b); } } else if (!strcmp(option->name, "comment")) { /* do nothing */ } else if (!strcmp(option->name, "tileset")) { if (settings.tileset) free(settings.tileset); settings.tileset = malloc(strlen(option->value.s) + 1); strcpy(settings.tileset, option->value.s); rebuild_ui(); } else if (!strcmp(option->name, "border")) { settings.whichframes = option->value.e; rebuild_ui(); } else if (!strcmp(option->name, "menu_headings")) { settings.menu_headings = option->value.e; } else if (!strcmp(option->name, "palette")) { settings.palette = option->value.e; setup_palette(); if (ui_flags.initialized) { /* * - We don't want to install a palette as a result of the default * setting of "palette", because some terminals cannot handle a * palette reset, and thus we need to ensure that we've loaded * the user's palette setting before palette initialization. * * - Besides, clear() will crash with an uninitialized libuncursed. * So we have to delay this anyway. */ clear(); refresh(); rebuild_ui(); } } else if (!strcmp(option->name, "animation")) { settings.animation = option->value.e; } else if (!strcmp(option->name, "sidebar")) { settings.sidebar = option->value.e; rebuild_ui(); } else if (!strcmp(option->name, "scores_top")) { settings.end_top = option->value.i; } else if (!strcmp(option->name, "scores_around")) { settings.end_around = option->value.i; } else if (!strcmp(option->name, "networkmotd")) { settings.show_motd = option->value.e; } else if (!strcmp(option->name, "menupaging")) { settings.menupaging = option->value.e; } else if (!strcmp(option->name, "optstyle")) { settings.optstyle = option->value.e; } else if (!strcmp(option->name, "msgheight")) { settings.msgheight = option->value.i; rebuild_ui(); } else if (!strcmp(option->name, "msghistory")) { settings.msghistory = option->value.i; alloc_hist_array(); } else return FALSE; return TRUE; }