/* * 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(); }
int test_prefs(void *state) { bool error = FALSE; graphics_mode *mode; /* This is a bit of a hack to ensure we have a player struct set up */ /* Otherwise race/class dependent graphics will crash */ cmdq_push(CMD_BIRTH_RESET); cmdq_execute(CMD_BIRTH); event_add_handler(EVENT_MESSAGE, getmsg, &error); for (mode = graphics_modes; mode; mode = mode->pNext) { /* Skip 'normal' */ if (mode->grafID == 0) continue; printf("Testing mode '%s'.\n", mode->menuname); /* Load pref file */ use_graphics = mode->grafID; reset_visuals(TRUE); } eq(error, FALSE); ok; }
static void visuals_reset(const char *title, int row) { /* Reset */ reset_visuals(true); /* Message */ prt("", 0, 0); msg("Visual attr/char tables reset."); event_signal(EVENT_MESSAGE_FLUSH); }
static void visuals_reset(const char *title, int row) { /* Reset */ reset_visuals(true); /* Message */ prt("", 0, 0); msg("Visual attr/char tables reset."); message_flush(); }
void mimic_race(int new_race, const char *msg) { int old_race = p_ptr->mimic_form; if (p_ptr->prace != RACE_DOPPELGANGER) return; if (p_ptr->tim_mimic) return; if (new_race == old_race) return; if (msg) msg_print(msg); if (old_race == RACE_HUMAN || old_race == RACE_DEMIGOD) { int i, idx; for (i = 0; i < MAX_DEMIGOD_POWERS; i++) { idx = p_ptr->demigod_power[i]; if (idx >= 0) { mut_unlock(idx); mut_lose(idx); /* Lose the mutation, but not the choice! p_ptr->demigod_power[i] = -1; */ } } } /* Shifting form causes mutations to vanish! */ mut_lose_all(); if (new_race == MIMIC_NONE) msg_print("You resume your true form."); else { race_t *race_ptr = get_race_t_aux(new_race, 0); if (is_a_vowel(race_ptr->name[0])) msg_format("You turn into an %s!", race_ptr->name); else msg_format("You turn into a %s!", race_ptr->name); } p_ptr->mimic_form = new_race; p_ptr->expfact = calc_exp_factor(); check_experience(); if (new_race == RACE_HUMAN || new_race == RACE_DEMIGOD) { get_race_t()->gain_level(p_ptr->lev); /* This is OK ... Just make sure we get to choose racial powers on mimicry */ } if (new_race == RACE_BEASTMAN) { int i; mut_gain_random(mut_good_pred); for (i = 2; i <= p_ptr->lev; i++) { if (one_in_(5)) mut_gain_random(NULL); } } p_ptr->redraw |= (PR_BASIC | PR_STATUS | PR_MAP); p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA); equip_on_change_race(); reset_visuals(); handle_stuff(); }
/* * Make screen dump to buffer */ cptr make_screen_dump(void) { BUF *screen_buf; int y, x, i; cptr ret; byte a = 0, old_a = 0; char c = ' '; static cptr html_head[] = { "<html>\n<body text=\"#ffffff\" bgcolor=\"#000000\">\n", "<pre>", 0, }; static cptr html_foot[] = { "</pre>\n", "</body>\n</html>\n", 0, }; bool old_use_graphics = use_graphics; int wid, hgt; Term_get_size(&wid, &hgt); /* Alloc buffer */ screen_buf = buf_new(); if (screen_buf == NULL) return (NULL); if (old_use_graphics) { /* Clear -more- prompt first */ msg_print(NULL); use_graphics = FALSE; reset_visuals(); /* Redraw everything */ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); /* Hack -- update */ handle_stuff(); } for (i = 0; html_head[i]; i++) buf_sprintf(screen_buf, html_head[i]); /* Dump the screen */ for (y = 0; y < hgt; y++) { /* Start the row */ if (y != 0) buf_sprintf(screen_buf, "\n"); /* Dump each row */ for (x = 0; x < wid - 1; x++) { int rv, gv, bv; cptr cc = NULL; /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); switch (c) { case '&': cc = "&"; break; case '<': cc = "<"; break; case '>': cc = ">"; break; #ifdef WINDOWS case 0x1f: c = '.'; break; case 0x7f: c = (a == 0x09) ? '%' : '#'; break; #endif } a = a & 0x0F; if ((y == 0 && x == 0) || a != old_a) { rv = angband_color_table[a][1]; gv = angband_color_table[a][2]; bv = angband_color_table[a][3]; buf_sprintf(screen_buf, "%s<font color=\"#%02x%02x%02x\">", ((y == 0 && x == 0) ? "" : "</font>"), rv, gv, bv); old_a = a; } if (cc) buf_sprintf(screen_buf, "%s", cc); else buf_sprintf(screen_buf, "%c", c); } } buf_sprintf(screen_buf, "</font>"); for (i = 0; html_foot[i]; i++) buf_sprintf(screen_buf, html_foot[i]); /* Screen dump size is too big ? */ if (screen_buf->size + 1> SCREEN_BUF_SIZE) { ret = NULL; } else { /* Terminate string */ buf_append(screen_buf, "", 1); ret = string_make(screen_buf->data); } /* Free buffer */ buf_delete(screen_buf); if (old_use_graphics) { use_graphics = TRUE; reset_visuals(); /* Redraw everything */ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); /* Hack -- update */ handle_stuff(); } return ret; }
/* * 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--; }