/** * Ask for a "user pref file" and process it. * * This function should only be used by standard interaction commands, * in which a standard "Command:" prompt is present on the given row. * * Allow absolute file names? XXX XXX XXX */ static void do_cmd_pref_file_hack(long row) { char ftmp[80]; screen_save(); /* Prompt */ prt("Command: Load a user pref file", row, 0); /* Prompt */ prt("File: ", row + 2, 0); /* Default filename */ strnfmt(ftmp, sizeof ftmp, "%s.prf", player_safe_name(player, true)); /* Ask for a file (or cancel) */ if (askfor_aux(ftmp, sizeof ftmp, NULL)) { /* Process the given filename */ if (process_pref_file(ftmp, false, true) == false) { /* Mention failure */ prt("", 0, 0); msg("Failed to load '%s'!", ftmp); } else { /* Mention success */ prt("", 0, 0); msg("Loaded '%s'.", ftmp); } } screen_load(); }
/** * Ask for a "user pref file" and process it. * * This function should only be used by standard interaction commands, * in which a standard "Command:" prompt is present on the given row. * * Allow absolute file names? XXX XXX XXX */ static void do_cmd_pref_file_hack(long row) { char ftmp[80]; screen_save(); /* Prompt */ prt("Command: Load a user pref file", row, 0); /* Prompt */ prt("File: ", row + 2, 0); /* Get the filesystem-safe name and append .prf */ player_safe_name(ftmp, sizeof(ftmp), player->full_name, true); my_strcat(ftmp, ".prf", sizeof(ftmp)); /* Ask for a file (or cancel) */ if (askfor_aux(ftmp, sizeof ftmp, NULL)) { /* Process the given filename */ if (process_pref_file(ftmp, false, true) == false) { /* Mention failure */ prt("", 0, 0); msg("Failed to load '%s'!", ftmp); } else { /* Mention success */ prt("", 0, 0); msg("Loaded '%s'.", ftmp); } } screen_load(); }
/* * Hack -- save a screen dump to a file in html format */ static void do_cmd_save_screen_html(int mode) { size_t i; ang_file *fff; char file_name[1024]; char tmp_val[256]; typedef void (*dump_func)(ang_file *); dump_func dump_visuals [] = { dump_monsters, dump_features, dump_objects, dump_flavors, dump_colors }; if (mode == 0) my_strcpy(tmp_val, "dump.html", sizeof(tmp_val)); else my_strcpy(tmp_val, "dump.txt", sizeof(tmp_val)); /* Ask for a file */ if (!get_string("File: ", tmp_val, sizeof(tmp_val))) return; /* Save current preferences */ path_build(file_name, 1024, ANGBAND_DIR_USER, "dump.prf"); fff = file_open(file_name, MODE_WRITE, (mode == 0 ? FTYPE_HTML : FTYPE_TEXT)); /* Check for failure */ if (!fff) { msg("Screen dump failed."); message_flush(); return; } /* Dump all the visuals */ for (i = 0; i < N_ELEMENTS(dump_visuals); i++) dump_visuals[i](fff); file_close(fff); /* Dump the screen with raw character attributes */ reset_visuals(FALSE); do_cmd_redraw(); html_screenshot(tmp_val, mode); /* Recover current graphics settings */ reset_visuals(TRUE); process_pref_file(file_name, TRUE, FALSE); file_delete(file_name); do_cmd_redraw(); msg("HTML screen dump saved."); message_flush(); }
/** * Load another file. */ static enum parser_error parse_prefs_load(struct parser *p) { struct prefs_data *d = parser_priv(p); const char *file; assert(d != NULL); if (d->bypass) return PARSE_ERROR_NONE; file = parser_getstr(p, "file"); (void)process_pref_file(file, TRUE, d->user); return PARSE_ERROR_NONE; }
/* Display possible modules and select one */ bool select_module() { s32b k, sel, max; /* Hack */ use_color = TRUE; /* Init some lua */ init_lua(); /* Some ports need to separate the module scripts from the installed mods, so we need to check for these in two different places */ if(!tome_dofile_anywhere(ANGBAND_DIR_CORE, "mods_aux.lua", FALSE)) tome_dofile_anywhere(ANGBAND_DIR_MODULES, "mods_aux.lua", TRUE); if(!tome_dofile_anywhere(ANGBAND_DIR_CORE, "modules.lua", FALSE)) tome_dofile_anywhere(ANGBAND_DIR_MODULES, "modules.lua", TRUE); /* Grab the savefiles */ call_lua("max_modules", "()", "d", &max); /* No need to bother the player if there is only one module */ sel = -1; if (force_module) call_lua("find_module", "(s)", "d", force_module, &sel); if (max == 1) sel = 0; if (sel != -1) { cptr tmp; /* Process the module */ call_lua("init_module", "(d)", "", sel); call_lua("get_module_name", "(d)", "s", sel, &tmp); game_module = string_make(tmp); activate_module(); return FALSE; } sel = 0; /* Preprocess the basic prefs, we need them to have movement keys */ process_pref_file("pref.prf"); while (TRUE) { /* Clear screen */ Term_clear(); /* Let the user choose */ c_put_str(TERM_YELLOW, "Welcome to ToME, you must select a module to play,", 1, 12); c_put_str(TERM_YELLOW, "either ToME official module or third party ones.", 2, 13); put_str("Press 8/2/4/6 to move, Return to select and Esc to quit.", 4, 3); dump_modules(sel, max); k = inkey(); if (k == ESCAPE) { quit(NULL); } if (k == '6') { sel++; if (sel >= max) sel = 0; continue; } else if (k == '4') { sel--; if (sel < 0) sel = max - 1; continue; } else if (k == '2') { sel += 4; if (sel >= max) sel = sel % max; continue; } else if (k == '8') { sel -= 4; if (sel < 0) sel = (sel + max - 1) % max; continue; } else if (k == '\r') { if (sel < 26) k = I2A(sel); else k = toupper(I2A(sel)); } { int x; cptr tmp; if (islower(k)) x = A2I(k); else x = A2I(tolower(k)) + 26; if ((x < 0) || (x >= max)) continue; /* Process the module */ call_lua("init_module", "(d)", "", x); call_lua("get_module_name", "(d)", "s", x, &tmp); game_module = string_make(tmp); activate_module(); return (FALSE); } } /* Shouldnt happen */ return (FALSE); }
/* * Hack -- main Angband initialization entry point * * Verify some files, display the "news.txt" file, create * the high score file, initialize all internal arrays, and * load the basic "user pref files". * * Be very careful to keep track of the order in which things * are initialized, in particular, the only thing *known* to * be available when this function is called is the "z-term.c" * package, and that may not be fully initialized until the * end of this function, when the default "user pref files" * are loaded and "Term_xtra(TERM_XTRA_REACT,0)" is called. * * Note that this function attempts to verify the "news" file, * and the game aborts (cleanly) on failure, since without the * "news" file, it is likely that the "lib" folder has not been * correctly located. Otherwise, the news file is displayed for * the user. * * Note that this function attempts to verify (or create) the * "high score" file, and the game aborts (cleanly) on failure, * since one of the most common "extraction" failures involves * failing to extract all sub-directories (even empty ones), such * as by failing to use the "-d" option of "pkunzip", or failing * to use the "save empty directories" option with "Compact Pro". * This error will often be caught by the "high score" creation * code below, since the "lib/apex" directory, being empty in the * standard distributions, is most likely to be "lost", making it * impossible to create the high score file. * * Note that various things are initialized by this function, * including everything that was once done by "init_some_arrays". * * This initialization involves the parsing of special files * in the "lib/data" and sometimes the "lib/edit" directories. * * Note that the "template" files are initialized first, since they * often contain errors. This means that macros and message recall * and things like that are not available until after they are done. * * We load the default "user pref files" here in case any "color" * changes are needed before character creation. * * Note that the "graf-xxx.prf" file must be loaded separately, * if needed, in the first (?) pass through "TERM_XTRA_REACT". */ bool init_angband(void) { event_signal(EVENT_ENTER_INIT); /* Initialize the menus */ /* This must occur before preference files are read(?) */ init_cmd4_c(); /*** Initialize some arrays ***/ /* Initialize size info */ event_signal_string(EVENT_INITSTATUS, "Initializing array sizes..."); if (init_z_info()) quit("Cannot initialize sizes"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (features)"); if (init_f_info()) quit("Cannot initialize features"); /* Initialize object info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (objects)"); if (init_k_info()) quit("Cannot initialize objects"); /* Initialize ego-item info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (ego-items)"); if (init_e_info()) quit("Cannot initialize ego-items"); /* Initialize monster info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monsters)"); if (init_r_info()) quit("Cannot initialize monsters"); /* Initialize artifact info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (artifacts)"); if (init_a_info()) quit("Cannot initialize artifacts"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (vaults)"); if (init_v_info()) quit("Cannot initialize vaults"); /* Initialize history info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (histories)"); if (init_h_info()) quit("Cannot initialize histories"); /* Initialize race info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (races)"); if (init_p_info()) quit("Cannot initialize races"); /* Initialize class info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (classes)"); if (init_c_info()) quit("Cannot initialize classes"); /* Initialize owner info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (owners)"); if (init_b_info()) quit("Cannot initialize owners"); /* Initialize flavor info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (flavors)"); if (init_flavor_info()) quit("Cannot initialize flavors"); /* Initialize spell info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spells)"); if (init_s_info()) quit("Cannot initialize spells"); /* Initialize spellbook info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (spellbooks)"); init_books(); /* Initialise store stocking data */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (store stocks)"); init_stores(); /* Initialise random name data */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (random names)"); init_names(); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (other)"); if (init_other()) quit("Cannot initialize other stuff"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (alloc)"); if (init_alloc()) quit("Cannot initialize alloc stuff"); /*** Load default user pref files ***/ /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Loading basic user pref file..."); /* Process that file */ (void)process_pref_file("pref.prf"); /* Done */ event_signal_string(EVENT_INITSTATUS, "Initialization complete"); /* Sneakily init command list */ cmd_init(); /* Ask for a "command" until we get one we like. */ while (1) { game_command command_req; cmd_get(CMD_INIT, &command_req, TRUE); if (command_req.command == CMD_QUIT) { quit(NULL); } else if (command_req.command == CMD_NEWGAME) { event_signal(EVENT_LEAVE_INIT); return TRUE; } else if (command_req.command == CMD_LOADFILE) { event_signal(EVENT_LEAVE_INIT); /* In future we might want to pass back or set the savefile path here. */ return FALSE; } } }
/* * Hack -- main Angband initialization entry point * * Verify some files, display the "news.txt" file, create * the high score file, initialize all internal arrays, and * load the basic "user pref files". * * Be very careful to keep track of the order in which things * are initialized, in particular, the only thing *known* to * be available when this function is called is the "z-term.c" * package, and that may not be fully initialized until the * end of this function, when the default "user pref files" * are loaded and "Term_xtra(TERM_XTRA_REACT,0)" is called. * * Note that this function attempts to verify the "news" file, * and the game aborts (cleanly) on failure, since without the * "news" file, it is likely that the "lib" folder has not been * correctly located. Otherwise, the news file is displayed for * the user. * * Note that this function attempts to verify (or create) the * "high score" file, and the game aborts (cleanly) on failure, * since one of the most common "extraction" failures involves * failing to extract all sub-directories (even empty ones), such * as by failing to use the "-d" option of "pkunzip", or failing * to use the "save empty directories" option with "Compact Pro". * This error will often be caught by the "high score" creation * code below, since the "lib/apex" directory, being empty in the * standard distributions, is most likely to be "lost", making it * impossible to create the high score file. * * Note that various things are initialized by this function, * including everything that was once done by "init_some_arrays". * * This initialization involves the parsing of special files * in the "lib/data" and sometimes the "lib/edit" directories. * * Note that the "template" files are initialized first, since they * often contain errors. This means that macros and message recall * and things like that are not available until after they are done. * * We load the default "user pref files" here in case any "color" * changes are needed before character creation. * * Note that the "graf-xxx.prf" file must be loaded separately, * if needed, in the first (?) pass through "TERM_XTRA_REACT". */ bool init_angband(void) { /* If we have a savefile, use that for game mode instead */ if (savefile[0]) { load_gamemode(); } /* Which game are we playing? */ if (game_mode == 0) { get_game_mode(); } event_signal(EVENT_ENTER_INIT); /*** Initialize some arrays ***/ /* Initialize size info */ event_signal_string(EVENT_INITSTATUS, "Initializing array sizes..."); if (init_z_info()) quit("Cannot initialize sizes"); /* Prepare some things according to the game being played */ init_game_mode(); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (features)"); if (init_f_info()) quit("Cannot initialize features"); /* Initialize object info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (objects)"); if (init_k_info()) quit("Cannot initialize objects"); /* Initialize object info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (ghosts)"); if (init_t_info()) quit("Cannot initialize ghosts"); /* Initialize artifact info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (artifacts)"); if (init_a_info()) quit("Cannot initialize artifacts"); /* Initialize ego-item info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (ego-items)"); if (init_e_info()) quit("Cannot initialize ego-items"); /* Initialize monster info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (monsters)"); if (init_r_info()) quit("Cannot initialize monsters"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (vaults)"); if (init_v_info()) quit("Cannot initialize vaults"); /* Initialize history info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (histories)"); if (init_h_info()) quit("Cannot initialize histories"); /* Initialize race info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (races)"); if (init_p_info()) quit("Cannot initialize races"); /* Initialize class info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (classes)"); if (init_c_info()) quit("Cannot initialize classes"); /* Initialize owner info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (owners)"); if (init_b_info()) quit("Cannot initialize owners"); /* Initialize flavor info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (flavors)"); if (init_flavor_info()) quit("Cannot initialize flavors"); /* Initialize flavor info */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (quests)"); if (init_q_info()) quit("Cannot initialize quests"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (other)"); if (init_other()) quit("Cannot initialize other stuff"); /* Initialize some other arrays */ event_signal_string(EVENT_INITSTATUS, "Initializing arrays... (alloc)"); if (init_alloc()) quit("Cannot initialize alloc stuff"); /*** Load default user pref files ***/ /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Loading basic user pref file..."); /* Process that file */ (void)process_pref_file("pref.prf"); /* Initialize feature info */ event_signal_string(EVENT_INITSTATUS, "Initializing Random Artifact Tables...]"); if (init_n_info()) quit("Cannot initialize random name generator list"); /*Build the randart probability tables based on the standard Artifact Set*/ build_randart_tables(); /* Done */ event_signal_string(EVENT_INITSTATUS, "Initialization complete"); /* Sneakily init command list */ cmd_init(); /* Ask for a "command" until we get one we like. */ while (1) { game_command command_req; cmd_get(CMD_INIT, &command_req, TRUE); if (command_req.command == CMD_QUIT) { quit(NULL); } else if (command_req.command == CMD_NEWGAME) { event_signal(EVENT_LEAVE_INIT); return TRUE; } else if (command_req.command == CMD_LOADFILE) { event_signal(EVENT_LEAVE_INIT); /* In future we might want to pass back or set the savefile path here. */ return FALSE; } } }
/* * Open the "user pref file" and parse it. */ static errr process_pref_file_aux(cptr name) { FILE *fp; char buf[1024]; char old[1024]; int line = -1; errr err = 0; bool bypass = FALSE; /* Open the file */ fp = my_fopen(name, "r"); /* No such file */ if (!fp) return (-1); /* Process the file */ while (0 == my_fgets(fp, buf, sizeof(buf))) { /* Count lines */ line++; /* Skip "empty" lines */ if (!buf[0]) continue; /* Skip "blank" lines */ if (isspace((unsigned char)buf[0])) continue; /* Skip comments */ if (buf[0] == '#') continue; /* Save a copy */ my_strcpy(old, buf, sizeof(old)); /* Process "?:<expr>" */ if ((buf[0] == '?') && (buf[1] == ':')) { char f; cptr v; char *s; /* Start */ s = buf + 2; /* Parse the expr */ v = process_pref_file_expr(&s, &f); /* Set flag */ bypass = (streq(v, "0") ? TRUE : FALSE); /* Continue */ continue; } /* Apply conditionals */ if (bypass) continue; /* Process "%:<file>" */ if (buf[0] == '%') { /* Process that file if allowed */ (void)process_pref_file(buf + 2); /* Continue */ continue; } /* Process the line */ err = process_pref_file_command(buf); /* Oops */ if (err) break; } /* Error */ if (err) { /* Print error message */ /* ToDo: Add better error messages */ msg_format("Error %d in line %d of file '%s'.", err, line, name); msg_format("Parsing '%s'", old); message_flush(); } /* Close the file */ my_fclose(fp); /* Result */ return (err); }
/* * Interact with "macros" * * Note that the macro "action" must be defined before the trigger. * * Could use some helpful instructions on this page. XXX XXX XXX */ void do_cmd_macros(void) { s32b i; char tmp[1024]; char buf[1024]; s32b mode; /* Roguelike */ if (rogue_like_commands) { mode = KEYMAP_MODE_ROGUE; } /* Original */ else { mode = KEYMAP_MODE_ORIG; } /* Enter "icky" mode */ character_icky++; /* Save screen */ Term_save(); /* Process requests until done */ while (1) { /* Clear screen */ Term_clear(); /* Describe */ prt("Interact with Macros", 2, 0); /* Describe that action */ prt("Current action (if any) shown below:", 20, 0); /* Analyze the current action */ ascii_to_text(buf, macro__buf); /* Display the current action */ prt(buf, 22, 0); /* Selections */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_MACROS prt("(2) Append macros to a file", 5, 5); prt("(3) Query a macro", 6, 5); prt("(4) Create a macro", 7, 5); prt("(5) Remove a macro", 8, 5); prt("(6) Append keymaps to a file", 9, 5); prt("(7) Query a keymap", 10, 5); prt("(8) Create a keymap", 11, 5); prt("(9) Remove a keymap", 12, 5); prt("(0) Enter a new action", 13, 5); #endif /* ALLOW_MACROS */ /* Prompt */ prt("Command: ", 16, 0); /* Get a command */ i = inkey(); /* Leave */ if (i == ESCAPE) break; /* Load a 'macro' file */ else if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 16, 0); /* Prompt */ prt("File: ", 18, 0); /* Default filename */ strnfmt(tmp, 1024, "%s.prf", player_name); /* Ask for a file */ if (!askfor_aux(tmp, 80)) continue; /* Process the given filename */ if (0 != process_pref_file(tmp)) { /* Prompt */ msg_print("Could not load file!"); } } #ifdef ALLOW_MACROS /* Save macros */ else if (i == '2') { /* Prompt */ prt("Command: Append macros to a file", 16, 0); /* Prompt */ prt("File: ", 18, 0); /* Default filename */ strnfmt(tmp, 1024, "%s.prf", player_name); /* Ask for a file */ if (!askfor_aux(tmp, 80)) continue; /* Dump the macros */ (void)macro_dump(tmp); /* Prompt */ msg_print("Appended macros."); } /* Query a macro */ else if (i == '3') { s32b k; /* Prompt */ prt("Command: Query a macro", 16, 0); /* Prompt */ prt("Trigger: ", 18, 0); /* Get a macro trigger */ do_cmd_macro_aux(buf, TRUE); /* Acquire action */ k = macro_find_exact(buf); /* Nothing found */ if (k < 0) { /* Prompt */ msg_print("Found no macro."); } /* Found one */ else { /* Obtain the action */ strcpy(macro__buf, macro__act[k]); /* Analyze the current action */ ascii_to_text(buf, macro__buf); /* Display the current action */ prt(buf, 22, 0); /* Prompt */ msg_print("Found a macro."); } } /* Create a macro */ else if (i == '4') { /* Prompt */ prt("Command: Create a macro", 16, 0); /* Prompt */ prt("Trigger: ", 18, 0); /* Get a macro trigger */ do_cmd_macro_aux(buf, TRUE); /* Clear */ clear_from(20); /* Prompt */ prt("Action: ", 20, 0); /* Convert to text */ ascii_to_text(tmp, macro__buf); /* Get an encoded action */ if (askfor_aux(tmp, 80)) { /* Convert to ascii */ text_to_ascii(macro__buf, tmp); /* Link the macro */ macro_add(buf, macro__buf); /* Prompt */ msg_print("Added a macro."); } } /* Remove a macro */ else if (i == '5') { /* Prompt */ prt("Command: Remove a macro", 16, 0); /* Prompt */ prt("Trigger: ", 18, 0); /* Get a macro trigger */ do_cmd_macro_aux(buf, TRUE); /* Link the macro */ macro_add(buf, buf); /* Prompt */ msg_print("Removed a macro."); } /* Save keymaps */ else if (i == '6') { /* Prompt */ prt("Command: Append keymaps to a file", 16, 0); /* Prompt */ prt("File: ", 18, 0); /* Default filename */ strnfmt(tmp, 1024, "%s.prf", player_name); /* Ask for a file */ if (!askfor_aux(tmp, 80)) continue; /* Dump the macros */ (void)keymap_dump(tmp); /* Prompt */ msg_print("Appended keymaps."); } /* Query a keymap */ else if (i == '7') { cptr act; /* Prompt */ prt("Command: Query a keymap", 16, 0); /* Prompt */ prt("Keypress: ", 18, 0); /* Get a keymap trigger */ do_cmd_macro_aux_keymap(buf); /* Look up the keymap */ act = keymap_act[mode][(byte)(buf[0])]; /* Nothing found */ if (!act) { /* Prompt */ msg_print("Found no keymap."); } /* Found one */ else { /* Obtain the action */ strcpy(macro__buf, act); /* Analyze the current action */ ascii_to_text(buf, macro__buf); /* Display the current action */ prt(buf, 22, 0); /* Prompt */ msg_print("Found a keymap."); } } /* Create a keymap */ else if (i == '8') { /* Prompt */ prt("Command: Create a keymap", 16, 0); /* Prompt */ prt("Keypress: ", 18, 0); /* Get a keymap trigger */ do_cmd_macro_aux_keymap(buf); /* Clear */ clear_from(20); /* Prompt */ prt("Action: ", 20, 0); /* Convert to text */ ascii_to_text(tmp, macro__buf); /* Get an encoded action */ if (askfor_aux(tmp, 80)) { /* Convert to ascii */ text_to_ascii(macro__buf, tmp); /* Free old keymap */ string_free(keymap_act[mode][(byte)(buf[0])]); /* Make new keymap */ keymap_act[mode][(byte)(buf[0])] = string_make(macro__buf); /* Prompt */ msg_print("Added a keymap."); } } /* Remove a keymap */ else if (i == '9') { /* Prompt */ prt("Command: Remove a keymap", 16, 0); /* Prompt */ prt("Keypress: ", 18, 0); /* Get a keymap trigger */ do_cmd_macro_aux_keymap(buf); /* Free old keymap */ string_free(keymap_act[mode][(byte)(buf[0])]); /* Make new keymap */ keymap_act[mode][(byte)(buf[0])] = NULL; /* Prompt */ msg_print("Removed a keymap."); } /* Enter a new action */ else if (i == '0') { /* Prompt */ prt("Command: Enter a new action", 16, 0); /* Go to the correct location */ Term_gotoxy(0, 22); /* Hack -- limit the value */ tmp[80] = '\0'; /* Get an encoded action */ if (!askfor_aux(buf, 80)) continue; /* Extract an action */ text_to_ascii(macro__buf, buf); } #endif /* ALLOW_MACROS */ /* Oops */ else { /* Oops */ bell(); } /* Flush messages */ msg_print(NULL); } /* Load screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
/* * Interact with "colors" */ void do_cmd_colors(void) { s32b i; PHYSFS_file *fff; char tmp[160]; char buf[1024]; /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Interact until done */ while (1) { /* Clear screen */ Term_clear(); /* Ask for a choice */ prt("Interact with Colors", 2, 0); /* Give some choices */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_COLORS prt("(2) Dump colors", 5, 5); prt("(3) Modify colors", 6, 5); # ifdef SUPPORT_GAMMA prt("(4) Gamma correction", 7, 5); # endif /* SUPPORT_GAMMA */ #endif /* Prompt */ prt("Command: ", 8, 0); /* Prompt */ i = inkey(); /* Done */ if (i == ESCAPE) break; /* Load a 'pref' file */ if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 8, 0); /* Prompt */ prt("File: ", 10, 0); /* Default file */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Query */ if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); /* Mega-Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Mega-Hack -- redraw */ Term_redraw(); } #ifdef ALLOW_COLORS /* Dump colors */ else if (i == '2') { /* Prompt */ prt("Command: Dump colors", 8, 0); /* Prompt */ prt("File: ", 10, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Color redefinitions\n\n"); /* Dump colors */ for (i = 0; i < 256; i++) { s32b kv = angband_color_table[i][0]; s32b rv = angband_color_table[i][1]; s32b gv = angband_color_table[i][2]; s32b bv = angband_color_table[i][3]; cptr name = "unknown"; /* Skip non-entries */ if (!kv && !rv && !gv && !bv) continue; /* Extract the color name */ name = color_names[i]; /* Dump a comment */ fprintf(fff, "# Color '%s'\n", name); /* Dump the monster attr/char info */ fprintf(fff, "V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n", i, kv, rv, gv, bv); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped color redefinitions."); } /* Edit colors */ else if (i == '3') { static byte a = 0; /* Prompt */ prt("Command: Modify colors", 8, 0); /* Hack -- query until done */ while (1) { cptr name; /* Clear */ clear_from(10); /* Exhibit the normal colors */ for (i = 0; i < 16; i++) { /* Exhibit this color */ Term_putstr(i*4, 20, -1, a, "###"); /* Exhibit all colors */ Term_putstr(i*4, 22, -1, i, format("%3d", i)); } /* Describe the color */ name = ((color_names[a]) ? color_names[a] : "undefined"); /* Describe the color */ Term_putstr(5, 10, -1, TERM_WHITE, format("Color = %d, Name = %s", a, name)); /* Label the Current values */ Term_putstr(5, 12, -1, TERM_WHITE, format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x", angband_color_table[a][0], angband_color_table[a][1], angband_color_table[a][2], angband_color_table[a][3])); /* Prompt */ Term_putstr(0, 14, -1, TERM_WHITE, "Command (n/N/k/K/r/R/g/G/b/B): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') a = (byte)(a + 1); if (i == 'N') a = (byte)(a - 1); if (i == 'k') angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1); if (i == 'K') angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1); if (i == 'r') angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1); if (i == 'R') angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1); if (i == 'g') angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1); if (i == 'G') angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1); if (i == 'b') angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1); if (i == 'B') angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1); /* Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Hack -- redraw */ Term_redraw(); } } # ifdef SUPPORT_GAMMA /* Gamma correction */ else if (i == '4') { s32b gamma; /* Prompt */ prt("Command: Gamma correction", 8, 0); /* gamma_val isn't set - assume 1.0 */ if (gamma_val == 0) gamma = 10; /* It's set - convert to usual notation (times 10) */ else gamma = 2560 / gamma_val; /* Hack -- query until done */ while (1) { /* Clear */ clear_from(10); /* Exhibit the normal colors */ for (i = 0; i < 16; i++) { /* Exhibit all colors */ Term_putstr(i*4, 22, -1, i, format("%3d", i)); } /* Describe the gamma */ Term_putstr(5, 10, -1, TERM_WHITE, format("Gamma = %d.%d", gamma / 10, gamma % 10)); /* Prompt */ Term_putstr(0, 12, -1, TERM_WHITE, "Command (g/G): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'g') gamma = (byte)(gamma + 1); else if (i == 'G') gamma = (byte)(gamma - 1); else continue; /* Force limits ([1.0, 2.5]) */ if (gamma < 10) gamma = 10; if (gamma > 25) gamma = 25; /* Hack - 1.0 means no correction */ if (gamma == 10) gamma_val = 0; /* otherwise, calculate gamma_val */ else gamma_val = 2560 / gamma; /* Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); /* Hack -- redraw */ Term_redraw(); } } # endif /* SUPPORT_GAMMA */ #endif /* Unknown option */ else { bell(); } /* Flush messages */ msg_print(NULL); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }
/* * Interact with "visuals" */ void do_cmd_visuals(void) { s32b i; PHYSFS_file *fff; char tmp[160]; char buf[1024]; /* Enter "icky" mode */ character_icky++; /* Save the screen */ Term_save(); /* Interact until done */ while (1) { /* Clear screen */ Term_clear(); /* Ask for a choice */ prt("Interact with Visuals", 2, 0); /* Give some choices */ prt("(1) Load a user pref file", 4, 5); #ifdef ALLOW_VISUALS prt("(2) Dump monster attr/chars", 5, 5); prt("(3) Dump object attr/chars", 6, 5); prt("(4) Dump feature attr/chars", 7, 5); prt("(5) (unused)", 8, 5); prt("(6) Change monster attr/chars", 9, 5); prt("(7) Change object attr/chars", 10, 5); prt("(8) Change feature attr/chars", 11, 5); prt("(9) (unused)", 12, 5); #endif prt("(0) Reset visuals", 13, 5); /* Prompt */ prt("Command: ", 15, 0); /* Prompt */ i = inkey(); /* Done */ if (i == ESCAPE) break; /* Load a 'pref' file */ else if (i == '1') { /* Prompt */ prt("Command: Load a user pref file", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Query */ if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ (void)process_pref_file(tmp); } #ifdef ALLOW_VISUALS /* Dump monster attr/chars */ else if (i == '2') { /* Prompt */ prt("Command: Dump monster attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Monster attr/char definitions\n\n"); /* Dump monsters */ for (i = 0; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; /* Skip non-entries */ if (!r_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (r_ptr->name)); /* Dump the monster attr/char info */ fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped monster attr/chars."); } /* Dump object attr/chars */ else if (i == '3') { /* Prompt */ prt("Command: Dump object attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Object attr/char definitions\n\n"); /* Dump objects */ for (i = 0; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; /* Skip non-entries */ if (!k_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (k_ptr->name)); /* Dump the object attr/char info */ fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped object attr/chars."); } /* Dump feature attr/chars */ else if (i == '4') { /* Prompt */ prt("Command: Dump feature attr/chars", 15, 0); /* Prompt */ prt("File: ", 17, 0); /* Default filename */ strnfmt(tmp, 160, "user-%s.prf", ANGBAND_SYS); /* Get a filename */ if (!askfor_aux(tmp, 70)) continue; /* Build the filename */ path_build(buf, 1024, TENGINE_DIR_USER, tmp); /* Append to the file */ fff = my_fopen(buf, "a"); /* Failure */ if (!fff) continue; /* Start dumping */ fprintf(fff, "\n\n"); fprintf(fff, "# Feature attr/char definitions\n\n"); /* Dump features */ for (i = 0; i < max_f_idx; i++) { feature_type *f_ptr = &f_info[i]; /* Skip non-entries */ if (!f_ptr->name) continue; /* Dump a comment */ fprintf(fff, "# %s\n", (f_ptr->name)); /* Dump the feature attr/char info */ fprintf(fff, "F:%d:0x%02X:0x%02X\n\n", i, (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char)); } /* All done */ fprintf(fff, "\n\n\n\n"); /* Close */ my_fclose(fff); /* Message */ msg_print("Dumped feature attr/chars."); } /* Modify monster attr/chars */ else if (i == '6') { static s32b r = 0; /* Prompt */ prt("Command: Change monster attr/chars", 15, 0); /* Hack -- query until done */ while (1) { monster_race *r_ptr = &r_info[r]; byte da = (r_ptr->d_attr); char dc = (r_ptr->d_char); byte ca = (r_ptr->x_attr); char cc = (r_ptr->x_char); /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Monster = %d, Name = %-40.40s", r, (r_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') r = (r + max_r_idx + 1) % max_r_idx; if (i == 'N') r = (r + max_r_idx - 1) % max_r_idx; if (i == 'a') r_ptr->x_attr = (byte)(ca + 1); if (i == 'A') r_ptr->x_attr = (byte)(ca - 1); if (i == 'c') r_ptr->x_char = (byte)(cc + 1); if (i == 'C') r_ptr->x_char = (byte)(cc - 1); } } /* Modify object attr/chars */ else if (i == '7') { static s32b k = 0; /* Prompt */ prt("Command: Change object attr/chars", 15, 0); /* Hack -- query until done */ while (1) { object_kind *k_ptr = &k_info[k]; byte da = (byte)k_ptr->d_attr; char dc = (byte)k_ptr->d_char; byte ca = (byte)k_ptr->x_attr; char cc = (byte)k_ptr->x_char; /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Object = %d, Name = %-40.40s", k, (k_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') k = (k + max_k_idx + 1) % max_k_idx; if (i == 'N') k = (k + max_k_idx - 1) % max_k_idx; if (i == 'a') k_info[k].x_attr = (byte)(ca + 1); if (i == 'A') k_info[k].x_attr = (byte)(ca - 1); if (i == 'c') k_info[k].x_char = (byte)(cc + 1); if (i == 'C') k_info[k].x_char = (byte)(cc - 1); } } /* Modify feature attr/chars */ else if (i == '8') { static s32b f = 0; /* Prompt */ prt("Command: Change feature attr/chars", 15, 0); /* Hack -- query until done */ while (1) { feature_type *f_ptr = &f_info[f]; byte da = (byte)f_ptr->d_attr; char dc = (byte)f_ptr->d_char; byte ca = (byte)f_ptr->x_attr; char cc = (byte)f_ptr->x_char; /* Label the object */ Term_putstr(5, 17, -1, TERM_WHITE, format("Terrain = %d, Name = %-40.40s", f, (f_ptr->name))); /* Label the Default values */ Term_putstr(10, 19, -1, TERM_WHITE, format("Default attr/char = %3u / %3u", da, (dc & 0xFF))); Term_putstr(40, 19, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 19, da, dc); if (use_bigtile) { if (da & 0x80) Term_putch(44, 19, 255, 127); else Term_putch(44, 19, 0, ' '); } /* Label the Current values */ Term_putstr(10, 20, -1, TERM_WHITE, format("Current attr/char = %3u / %3u", ca, (cc & 0xFF))); Term_putstr(40, 20, -1, TERM_WHITE, "<< ? >>"); Term_putch(43, 20, ca, cc); if (use_bigtile) { if (ca & 0x80) Term_putch(44, 20, 255, 127); else Term_putch(44, 20, 0, ' '); } /* Prompt */ Term_putstr(0, 22, -1, TERM_WHITE, "Command (n/N/a/A/c/C/d): "); /* Get a command */ i = inkey(); /* All done */ if (i == ESCAPE) break; /* Analyze */ if (i == 'n') f = (f + max_f_idx + 1) % max_f_idx; if (i == 'N') f = (f + max_f_idx - 1) % max_f_idx; if (i == 'a') f_info[f].x_attr = (byte)(ca + 1); if (i == 'A') f_info[f].x_attr = (byte)(ca - 1); if (i == 'c') f_info[f].x_char = (byte)(cc + 1); if (i == 'C') f_info[f].x_char = (byte)(cc - 1); if (i == 'd') { f_info[f].x_char = f_ptr->d_char; f_info[f].x_attr = f_ptr->d_attr; } } } #endif /* Reset visuals */ else if (i == '0') { /* Reset */ reset_visuals(); /* Message */ msg_print("Visual attr/char tables reset."); } /* Unknown option */ else { bell(); } /* Flush messages */ msg_print(NULL); } /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky--; }