static void spoil_spells_by_class(void) { int i, realm_idx; doc_ptr doc = doc_alloc(80); vec_ptr vec = vec_alloc(NULL); for (i = 0; i < MAX_CLASS; i++) vec_add_int(vec, i); vec_sort(vec, (vec_cmp_f)_cmp_class_name); for (i = 0; i < vec_length(vec); i++) { int class_idx = vec_get_int(vec, i); class_t *class_ptr = get_class_aux(class_idx, 0); bool class_heading = FALSE; if (class_idx == CLASS_RAGE_MAGE) continue; /* broken */ for (realm_idx = REALM_LIFE; realm_idx <= MAX_REALM; realm_idx++) { if (_check_realm(class_idx, realm_idx)) { doc_ptr cols[2]; cols[0] = doc_alloc(40); cols[1] = doc_alloc(40); _spoil_spell_book(cols[0], class_idx, realm_idx, 0); _spoil_spell_book(cols[1], class_idx, realm_idx, 1); if (class_idx != CLASS_RED_MAGE || realm_idx == REALM_ARCANE) { _spoil_spell_book(cols[0], class_idx, realm_idx, 2); _spoil_spell_book(cols[1], class_idx, realm_idx, 3); } if (!class_heading) { doc_printf(doc, "<topic:%s><color:r>%s</color>\n", class_ptr->name, class_ptr->name); doc_printf(doc, "%s\n\n", class_ptr->desc); class_heading = TRUE; } doc_printf(doc, "<color:B>%s</color>\n", realm_names[realm_idx]); doc_insert_cols(doc, cols, 2, 0); doc_free(cols[0]); doc_free(cols[1]); } } } doc_display(doc, "Spells by Class", 0); doc_free(doc); vec_free(vec); }
static void _display(rect_t r, int options) { doc_ptr doc = doc_alloc(r.cx); _list_spells(doc, options); doc_sync_term(doc, doc_range_all(doc), doc_pos_create(r.x, r.y)); doc_free(doc); }
static void spoil_artifact_desc(void) { int i,j; doc_ptr doc = doc_alloc(80); spoiler_hack = TRUE; for (i = 0; group_artifact[i].tval; i++) { if (group_artifact[i].name) { if (i) doc_insert(doc, "</indent>\n"); doc_printf(doc, "<topic:%s><style:heading>%s</style>\n <indent>\n", group_artifact[i].name, group_artifact[i].name); } for (j = 1; j < max_a_idx; ++j) { artifact_type *a_ptr = &a_info[j]; object_type forge = {0}; if (a_ptr->tval != group_artifact[i].tval) continue; if (!make_fake_artifact(&forge, j)) continue; obj_identify_fully(&forge); obj_display_doc(&forge, doc); doc_newline(doc); } } doc_display(doc, "Artifact Spoilers", 0); doc_free(doc); spoiler_hack = FALSE; }
static void spoil_mon_info() { int i; vec_ptr v = vec_alloc(NULL); doc_ptr doc = doc_alloc(80); spoiler_hack = TRUE; for (i = 1; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; if (!r_ptr->name) continue; if (r_ptr->id == MON_MONKEY_CLONE) continue; if (r_ptr->id == MON_KAGE) continue; vec_add(v, r_ptr); } vec_sort(v, (vec_cmp_f)_compare_r_level_desc); for (i = 0; i < vec_length(v); i++) { monster_race *r_ptr = vec_get(v, i); doc_printf(doc, "<topic:%s><color:r>=====================================================================</color>\n", r_name + r_ptr->name); mon_display_doc(r_ptr, doc); doc_newline(doc); } vec_free(v); doc_display(doc, "Monster Spoilers", 0); doc_free(doc); spoiler_hack = FALSE; }
static void _spoil_spells_by_realm_aux3(int realm_idx, int class1_idx, int class2_idx) { int i; doc_ptr doc = doc_alloc(80); for (i = 0; i < 4; i++) _spoil_spell_book2(doc, class1_idx, class2_idx, realm_idx, i); doc_display(doc, "Spells by Realm", 0); doc_free(doc); }
int doc_display_help_aux(cptr file_name, cptr topic, rect_t display) { int rc = _OK; FILE *fp = NULL; char path[1024]; char caption[1024]; doc_ptr doc = NULL; int top = 0; /* Check for file_name#topic from a lazy client */ if (!topic) { cptr pos = strchr(file_name, '#'); if (pos) { string_ptr name = string_copy_sn(file_name, pos - file_name); int result = doc_display_help_aux(string_buffer(name), pos + 1, display); string_free(name); return result; } } sprintf(caption, "Help file '%s'", file_name); path_build(path, sizeof(path), ANGBAND_DIR_HELP, file_name); fp = my_fopen(path, "r"); if (!fp) { cmsg_format(TERM_VIOLET, "Cannot open '%s'.", file_name); msg_print(NULL); return _OK; } doc = doc_alloc(MIN(80, display.cx)); doc_read_file(doc, fp); my_fclose(fp); if (topic) { doc_pos_t pos = doc_find_bookmark(doc, topic); if (doc_pos_is_valid(pos)) top = pos.y; } rc = doc_display_aux(doc, caption, top, display); doc_free(doc); return rc; }
static void _display_spells_to_gain(object_type *o_ptr, rect_t r) { doc_ptr doc = doc_alloc(r.cx); int i; int realm = tval2realm(o_ptr->tval); int start_idx = o_ptr->sval * _SPELLS_PER_BOOK; doc_insert(doc, "<style:table>"); doc_printf(doc, "<color:G> %-20.20s Lvl SP Fail Desc</color>\n", "Name"); for (i = start_idx; i < start_idx + _SPELLS_PER_BOOK; i++) _list_spell(doc, realm, i, i - start_idx, _FROM_BOOK); doc_insert(doc, "</style>"); doc_sync_term(doc, doc_range_all(doc), doc_pos_create(r.x, r.y)); doc_free(doc); }
void msg_line_init(const rect_t *display_rect) { if (display_rect && rect_is_valid(display_rect)) { if (_msg_line_doc) { msg_line_clear(); doc_free(_msg_line_doc); } _msg_line_rect = *display_rect; if (_msg_line_rect.x + _msg_line_rect.cx > Term->wid) _msg_line_rect.cx = Term->wid - _msg_line_rect.x; _msg_line_doc = doc_alloc(_msg_line_rect.cx); _msg_line_sync_pos = doc_cursor(_msg_line_doc); } else { rect_t r = rect_create(0, 0, MIN(72, Term->wid - 13), 10); msg_line_init(&r); } }
/** * Clean all data * * @param pGame The game's context * @return GFMRV_OK, GFMRV_ARGUMENTS_BAD, ... */ gfmRV intro_clean(gameCtx *pGame) { gfmRV rv; introCtx *pIntro; // Sanitize arguments ASSERT(pGame, GFMRV_ARGUMENTS_BAD); ASSERT(pGame->pState, GFMRV_ARGUMENTS_BAD); // Get the current state pIntro = (introCtx*)(pGame->pState); // Free the tilemap gfmSprite_free(&(pIntro->pBullet1)); gfmSprite_free(&(pIntro->pBullet2)); gfmTilemap_free(&(pIntro->pFlashFx)); gfmTilemap_free(&(pIntro->pMachineFx)); player_free(pIntro->pPl); doc_free(pIntro->pDoc); rv = GFMRV_OK; __ret: return rv; }
static void spoil_object_tables(void) { doc_ptr doc = doc_alloc(MIN(100, _term_width())); spoiler_hack = TRUE; _spoil_object_table_aux(doc, "All Objects", NULL); _spoil_object_table_aux(doc, "Weapons", object_is_melee_weapon); _spoil_object_table_aux(doc, "Shields", object_is_shield); _spoil_object_table_aux(doc, "Bows", object_is_bow); _spoil_object_table_aux(doc, "Rings", object_is_ring); _spoil_object_table_aux(doc, "Amulets", object_is_amulet); _spoil_object_table_aux(doc, "Lights", object_is_lite); _spoil_object_table_aux(doc, "Body Armor", object_is_body_armour); _spoil_object_table_aux(doc, "Cloaks", object_is_cloak); _spoil_object_table_aux(doc, "Helmets", object_is_helmet); _spoil_object_table_aux(doc, "Gloves", object_is_gloves); _spoil_object_table_aux(doc, "Boots", object_is_boots); spoiler_hack = FALSE; doc_display(doc, "Object Tables", 0); doc_free(doc); }
void monk_display_attack_info(doc_ptr doc, int hand) { _attack_t counts[MAX_MA]; int i; const int tot = 1000; int tot_dam = 0; /* Scaled by 10 */ int tot_mul = 0; int tot_to_d = 0; /* Scaled by 10 */ int blows = NUM_BLOWS(hand); /* Scaled by 100: 100 = 1.00 blows, 275 = 2.75 blows, etc */ int to_d = p_ptr->weapon_info[hand].to_d * 10; critical_t crit; doc_ptr cols[2] = {0}; cols[0] = doc_alloc(45); cols[1] = doc_alloc(35); /* First Column */ doc_printf(cols[0], "<color:G>%-14.14s %6s %5s %6s</color>\n", "Attack", "Dice", "Pct", "Dam"); _get_attack_counts(tot, counts, hand); for (i = 0; i < MAX_MA; i++) { martial_arts *ma_ptr = &ma_blows[i]; int dd = ma_ptr->dd + p_ptr->weapon_info[hand].to_dd; int ds = ma_ptr->ds + p_ptr->weapon_info[hand].to_ds; char tmp[20]; int dam = dd * (ds + 1) * 10 * counts[i].count / (2 * tot); if (counts[i].count == 0) continue; tot_dam += dam; tot_mul += counts[i].mul; tot_to_d += counts[i].to_d; sprintf(tmp, "%dd%d", dd, ds); doc_printf(cols[0], "%-14.14s %6s %3d.%1d%% %3d.%1d\n", ma_ptr->name, tmp, counts[i].count/10, counts[i].count%10, dam/10, dam%10); } doc_printf(cols[0], "<tab:8>%20s %3d.%1d\n", "Total:", tot_dam/10, tot_dam%10); crit.mul = tot_mul/tot; crit.to_d = tot_to_d*10/tot; doc_printf(cols[0], "<tab:8>%20s %3d.%02dx\n", "Criticals:", crit.mul/100, crit.mul%100); /* Account for criticals in all that follows ... */ tot_dam = tot_dam * crit.mul/100; to_d += crit.to_d; doc_printf(cols[0], "<tab:8>%20s %3d.%1d +%3d\n", "One Strike:", tot_dam/10, tot_dam%10, to_d/10); /* Second Column */ doc_insert(cols[1], "<color:y>Your Fists</color>\n"); doc_printf(cols[1], "Number of Blows: %d.%2.2d\n", blows/100, blows%100); doc_printf(cols[1], "To Hit: 0 50 100 150 200 (AC)\n"); doc_printf(cols[1], " %2d %2d %2d %2d %2d (%%)\n", hit_chance(0, 0, 0), hit_chance(0, 0, 50), hit_chance(0, 0, 100), hit_chance(0, 0, 150), hit_chance(0, 0, 200) ); doc_newline(cols[1]); doc_insert(cols[1], "<color:y>Average Damage:</color>\n"); doc_printf(cols[1], " One Strike: %d.%1d\n", (tot_dam + to_d)/10, (tot_dam + to_d)%10); /* Note: blows are scaled by 100. tot_dam and to_d by 10. So we divide by 1000 to recover the integer part ... */ doc_printf(cols[1], " One Attack: %d.%1d\n", blows*(tot_dam + to_d)/1000, ((blows*(tot_dam + to_d))/100)%10); if (display_weapon_mode == MYSTIC_ACID) { doc_printf(cols[1], " <color:r> Acid</color>: %d.%1d\n", blows*(tot_dam*20/10 + to_d + 50)/1000, ((blows*(tot_dam*20/10 + to_d + 50))/100)%10); } else if (have_flag(p_ptr->weapon_info[hand].flags, OF_BRAND_ACID)) { doc_printf(cols[1], " <color:r> Acid</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d)/1000, ((blows*(tot_dam*17/10 + to_d))/100)%10); } if (display_weapon_mode == MYSTIC_FIRE) { doc_printf(cols[1], " <color:r> Fire</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d + 30)/1000, ((blows*(tot_dam*17/10 + to_d + 30))/100)%10); } else if (have_flag(p_ptr->weapon_info[hand].flags, OF_BRAND_FIRE)) { doc_printf(cols[1], " <color:r> Fire</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d)/1000, ((blows*(tot_dam*17/10 + to_d))/100)%10); } if (display_weapon_mode == MYSTIC_COLD) { doc_printf(cols[1], " <color:r> Cold</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d + 30)/1000, ((blows*(tot_dam*17/10 + to_d + 30))/100)%10); } else if (have_flag(p_ptr->weapon_info[hand].flags, OF_BRAND_COLD)) { doc_printf(cols[1], " <color:r> Cold</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d)/1000, ((blows*(tot_dam*17/10 + to_d))/100)%10); } if (display_weapon_mode == MYSTIC_ELEC) { doc_printf(cols[1], " <color:r> Elec</color>: %d.%1d\n", blows*(tot_dam*25/10 + to_d + 70)/1000, ((blows*(tot_dam*25/10 + to_d + 70))/100)%10); } else if (have_flag(p_ptr->weapon_info[hand].flags, OF_BRAND_ELEC)) { doc_printf(cols[1], " <color:r> Elec</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d)/1000, ((blows*(tot_dam*17/10 + to_d))/100)%10); } if (display_weapon_mode == MYSTIC_POIS) { doc_printf(cols[1], " <color:r> Pois</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d + 30)/1000, ((blows*(tot_dam*17/10 + to_d + 30))/100)%10); } else if (have_flag(p_ptr->weapon_info[hand].flags, OF_BRAND_POIS)) { doc_printf(cols[1], " <color:r> Pois</color>: %d.%1d\n", blows*(tot_dam*17/10 + to_d)/1000, ((blows*(tot_dam*17/10 + to_d))/100)%10); } doc_insert_cols(doc, cols, 2, 0); doc_free(cols[0]); doc_free(cols[1]); }
static MonoDebugSourceInfo* get_docinfo (MonoPPDBFile *ppdb, MonoImage *image, int docidx) { MonoTableInfo *tables = image->tables; guint32 cols [MONO_DOCUMENT_SIZE]; const char *ptr; const char *start; const char *part_ptr; int size, part_size, partidx, nparts; char sep; GString *s; MonoDebugSourceInfo *res, *cached; mono_debugger_lock (); cached = (MonoDebugSourceInfo *)g_hash_table_lookup (ppdb->doc_hash, GUINT_TO_POINTER (docidx)); mono_debugger_unlock (); if (cached) return cached; mono_metadata_decode_row (&tables [MONO_TABLE_DOCUMENT], docidx-1, cols, MONO_DOCUMENT_SIZE); ptr = mono_metadata_blob_heap (image, cols [MONO_DOCUMENT_NAME]); size = mono_metadata_decode_blob_size (ptr, &ptr); start = ptr; // FIXME: UTF8 sep = ptr [0]; ptr ++; s = g_string_new (""); nparts = 0; while (ptr < start + size) { partidx = mono_metadata_decode_value (ptr, &ptr); if (nparts) g_string_append_c (s, sep); if (partidx) { part_ptr = mono_metadata_blob_heap (image, partidx); part_size = mono_metadata_decode_blob_size (part_ptr, &part_ptr); // FIXME: UTF8 g_string_append_len (s, part_ptr, part_size); } nparts ++; } res = g_new0 (MonoDebugSourceInfo, 1); res->source_file = g_string_free (s, FALSE); res->guid = NULL; res->hash = (guint8*)mono_metadata_blob_heap (image, cols [MONO_DOCUMENT_HASH]); mono_debugger_lock (); cached = (MonoDebugSourceInfo *)g_hash_table_lookup (ppdb->doc_hash, GUINT_TO_POINTER (docidx)); if (!cached) { g_hash_table_insert (ppdb->doc_hash, GUINT_TO_POINTER (docidx), res); } else { doc_free (res); res = cached; } mono_debugger_unlock (); return res; }
void display_innate_attack_info(doc_ptr doc, int which) { innate_attack_ptr a = &p_ptr->innate_attacks[which]; int blows, min, max, min_base, max_base, min2, max2; int i; int to_h = p_ptr->to_h_m + a->to_h; int to_d = p_ptr->to_d_m + a->to_d; int dd = a->dd + p_ptr->innate_attack_info.to_dd; int mult; doc_ptr cols[2] = {0}; blows = a->blows; if (which == 0) blows += p_ptr->innate_attack_info.xtra_blow; cols[0] = doc_alloc(60); cols[1] = doc_alloc(10); /* First Column */ if (a->flags & INNATE_NO_DAM) doc_printf(cols[0], "<color:y> %-7.7s</color>: Your %s\n", "Attack", a->name); else doc_printf(cols[0], "<color:y> %-7.7s</color>: Your %s (%dd%d)\n", "Attack", a->name, dd, a->ds); if (a->weight && !(a->flags & INNATE_NO_DAM)) doc_printf(cols[0], " %-7.7s: %d.%d lbs\n", "Weight", a->weight/10, a->weight%10); { cptr name = skills_innate_calc_name(a); doc_printf(cols[0], " %-7.7s: %s (%+d To Hit)\n", "Profic", skills_innate_describe_current(name), skills_innate_calc_bonus(name)); } doc_printf(cols[0], " %-7.7s: %d + %d = %d\n", "To Hit", a->to_h, p_ptr->to_h_m, to_h); if (!(a->flags & INNATE_NO_DAM)) doc_printf(cols[0], " %-7.7s: %d + %d = %d\n", "To Dam", a->to_d, p_ptr->to_d_m, to_d); doc_printf(cols[0], " %-7.7s: %d.%2.2d\n", "Blows", blows/100, blows%100); mult = 100; if (!(a->flags & INNATE_NO_DAM)) { doc_printf(cols[0], "<color:G> %-7.7s</color>\n", "Damage"); if (a->flags & INNATE_VORPAL) { mult = mult * 11 / 9; doc_printf(cols[0], " %-7.7s: %d.%02dx\n", "Vorpal", mult/100, mult%100); } } if (!(a->flags & INNATE_NO_DAM)) { critical_t crit = {0}; const int ct = 10 * 1000; for (i = 0; i < ct; i++) { critical_t tmp = critical_norm(a->weight, to_h, 0, 0, HAND_NONE); if (tmp.desc) { crit.mul += tmp.mul; crit.to_d += tmp.to_d; } else crit.mul += 100; } crit.mul = crit.mul / ct; crit.to_d = crit.to_d * 100 / ct; if (crit.to_d) doc_printf(cols[0], " %-7.7s: %d.%02dx + %d.%02d\n", "Crits", crit.mul/100, crit.mul%100, crit.to_d/100, crit.to_d%100); else doc_printf(cols[0], " %-7.7s: %d.%02dx\n", "Crits", crit.mul/100, crit.mul%100); crit.to_d /= 100; mult = mult * crit.mul / 100; to_d = to_d + crit.to_d; } min_base = mult * dd / 100; min = min_base + to_d; min2 = 2*(min_base + a->to_d) + p_ptr->to_d_m; max_base = mult * dd * a->ds / 100; max = max_base + to_d; max2 = 2*(max_base + a->to_d) + p_ptr->to_d_m; if (a->effect[0] == GF_OLD_CONF) /* Hack for Umber Hulk ... */ { doc_insert(cols[0], "<tab:10><color:B>Confuses</color>\n"); } else if (!(a->flags & INNATE_NO_DAM)) { doc_printf(cols[0], " %-7.7s: %d (%d-%d)\n", _effect_name(a->effect[0]), blows * (min + max)/200, blows * min/100, blows * max/100 ); } for (i = 1; i < MAX_INNATE_EFFECTS; i++) { int p = a->effect_chance[i]; char xtra[255]; if (!a->effect[i]) continue; if (!p) sprintf(xtra, "%s", ""); else sprintf(xtra, " (%d%%)", p); switch (a->effect[i]) { case GF_STEAL: doc_printf(cols[0], "<tab:10><color:B>Steals%s</color>\n", xtra); break; case GF_OLD_SLOW: doc_printf(cols[0], "<tab:10><color:B>Slows%s</color>\n", xtra); break; case GF_OLD_CONF: doc_printf(cols[0], "<tab:10><color:B>Confuses%s</color>\n", xtra); break; case GF_OLD_SLEEP: doc_printf(cols[0], "<tab:10><color:B>Sleeps%s</color>\n", xtra); break; case GF_STASIS: case GF_PARALYSIS: doc_printf(cols[0], "<tab:10><color:B>Paralyzes%s</color>\n", xtra); break; case GF_DRAIN_MANA: doc_printf(cols[0], "<tab:10><color:B>Drains Mana%s</color>\n", xtra); break; case GF_STUN: doc_printf(cols[0], "<tab:10><color:B>Stuns%s</color>\n", xtra); break; case GF_TURN_ALL: doc_printf(cols[0], "<tab:10><color:r>Terrifies%s</color>\n", xtra); break; case GF_QUAKE: doc_printf(cols[0], "<tab:10><color:B>Shatters%s</color>\n", xtra); break; default: doc_printf(cols[0], "<color:r> %-7.7s</color>: %d (%d-%d)\n", _effect_name(a->effect[i]), blows * (min2 + max2)/200, blows * min2/100, blows * max2/100 ); } } /* Second Column */ doc_insert(cols[1], "<color:G>Accuracy</color>\n"); doc_insert(cols[1], " AC Hit\n"); doc_printf(cols[1], "%3d %2d%%\n", 25, hit_chance_innate(to_h, 25)); doc_printf(cols[1], "%3d %2d%%\n", 50, hit_chance_innate(to_h, 50)); doc_printf(cols[1], "%3d %2d%%\n", 75, hit_chance_innate(to_h, 75)); doc_printf(cols[1], "%3d %2d%%\n", 100, hit_chance_innate(to_h, 100)); doc_printf(cols[1], "%3d %2d%%\n", 125, hit_chance_innate(to_h, 125)); doc_printf(cols[1], "%3d %2d%%\n", 150, hit_chance_innate(to_h, 150)); doc_printf(cols[1], "%3d %2d%%\n", 175, hit_chance_innate(to_h, 175)); doc_printf(cols[1], "%3d %2d%%\n", 200, hit_chance_innate(to_h, 200)); doc_insert_cols(doc, cols, 2, 1); doc_free(cols[0]); doc_free(cols[1]); }
void display_weapon_info(doc_ptr doc, int hand) { object_type *o_ptr = equip_obj(p_ptr->weapon_info[hand].slot); char o_name[MAX_NLEN]; u32b flgs[TR_FLAG_SIZE]; int dd; int ds; int to_d = 0; int to_h = 0; int mult; critical_t crit = {0}; int crit_pct = 0; int num_blow = NUM_BLOWS(hand); bool force = FALSE; doc_ptr cols[2] = {0}; if (p_ptr->weapon_info[hand].wield_how == WIELD_NONE) return; if (!o_ptr) return; dd = o_ptr->dd + p_ptr->weapon_info[hand].to_dd; ds = o_ptr->ds + p_ptr->weapon_info[hand].to_ds; if (object_is_known(o_ptr)) { to_d = o_ptr->to_d; to_h = o_ptr->to_h; } switch (display_weapon_mode) { case MAULER_STUNNING_BLOW: case MAULER_CRITICAL_BLOW: case MAULER_CRUSHING_BLOW: case MAULER_KNOCKBACK: num_blow = 100; break; case MAULER_KNOCKOUT_BLOW: num_blow = 100; to_h -= 50; break; case PY_POWER_ATTACK: to_h += 10; to_d += p_ptr->lev / 2; break; } weapon_flags_known(hand, flgs); if ( (have_flag(flgs, TR_FORCE_WEAPON) || p_ptr->tim_force) && (p_ptr->csp > o_ptr->dd*o_ptr->ds/5) ) { force = TRUE; } if (weaponmaster_get_toggle() == TOGGLE_SHIELD_BASH && object_is_shield(o_ptr)) { dd = 3 + p_ptr->weapon_info[hand].to_dd; ds = o_ptr->ac + p_ptr->weapon_info[hand].to_ds; if (object_is_known(o_ptr)) { to_h = o_ptr->to_a; to_d = o_ptr->to_a; to_h += 2*o_ptr->to_h; to_d += 2*o_ptr->to_d; } } mult = 100; if (have_flag(flgs, TR_VORPAL2)) mult = mult * 5 / 3; else if (have_flag(flgs, TR_VORPAL)) mult = mult * 11 / 9; mult += mult * p_ptr->weapon_info[hand].to_mult / 100; if (display_weapon_mode == MAULER_CRUSHING_BLOW) { int d = p_ptr->lev/5; int n = 10*(1 + d)/2; /* scale by 10 */ mult = mult * (50 + n)/30; } if (!have_flag(flgs, TR_ORDER)) { const int attempts = 10 * 1000; int i; int crits = 0; /* Compute Average Effects of Criticals by sampling */ for (i = 0; i < attempts; i++) { critical_t tmp = critical_norm(o_ptr->weight, to_h, p_ptr->weapon_info[hand].to_h, display_weapon_mode, hand); if (tmp.desc) { crit.mul += tmp.mul; crit.to_d += tmp.to_d; crits++; } else crit.mul += 100; } crit.mul = crit.mul / attempts; crit.to_d = crit.to_d * 100 / attempts; crit_pct = crits * 1000 / attempts; } else crit.mul = 100; /* Display in 2 columns, side by side */ cols[0] = doc_alloc(60); cols[1] = doc_alloc(10); /* Column #1 */ object_desc(o_name, o_ptr, OD_COLOR_CODED | OD_NAME_AND_ENCHANT); if (prace_is_(RACE_MON_SWORD)) doc_printf(cols[0], "<color:y> You :</color> <indent><style:indent>%s</style></indent>\n", o_name); else doc_printf(cols[0], "<color:y> Hand #%d:</color> <indent><style:indent>%s</style></indent>\n", hand+1, o_name); doc_printf(cols[0], " %-7.7s: %d.%d lbs\n", "Weight", o_ptr->weight/10, o_ptr->weight%10); if (weaponmaster_get_toggle() == TOGGLE_SHIELD_BASH) { assert(o_ptr->tval == TV_SHIELD); doc_printf(cols[0], " %-7.7s: %dd%d (%+d,%+d)\n", "Bash", dd, ds, to_h, to_d); doc_printf(cols[0], " %-7.7s: %s (%+d To Hit)\n", "Profic", skills_shield_describe_current(o_ptr->sval), skills_shield_calc_bonus(o_ptr->sval)); } else { doc_printf(cols[0], " %-7.7s: %s (%+d To Hit)\n", "Profic", skills_weapon_describe_current(o_ptr->tval, o_ptr->sval), skills_weapon_calc_bonus(o_ptr->tval, o_ptr->sval)); } doc_printf(cols[0], " %-7.7s: %d + %d = %d\n", "To Hit", to_h, p_ptr->weapon_info[hand].to_h, to_h + p_ptr->weapon_info[hand].to_h); doc_printf(cols[0], " %-7.7s: %d + %d = %d\n", "To Dam", to_d, p_ptr->weapon_info[hand].to_d, to_d + p_ptr->weapon_info[hand].to_d); doc_printf(cols[0], " %-7.7s: %d.%2.2d\n", "Blows", num_blow/100, num_blow%100); if (p_ptr->weapon_info[hand].dual_wield_pct < 1000) { doc_printf(cols[0], " %-7.7s: %d.%d%%\n", "Skill", p_ptr->weapon_info[hand].dual_wield_pct/ 10, p_ptr->weapon_info[hand].dual_wield_pct % 10); } mult = mult * crit.mul / 100; to_d = to_d + crit.to_d/100 + p_ptr->weapon_info[hand].to_d; doc_printf(cols[0], "<color:G> %-7.7s</color>\n", "Damage"); if (!have_flag(flgs, TR_ORDER)) { if (crit.to_d) { doc_printf(cols[0], " %-7.7s: %d.%02dx + %d.%02d\n", "Crits", crit.mul/100, crit.mul%100, crit.to_d/100, crit.to_d%100); } else { doc_printf(cols[0], " %-7.7s: %d.%02dx (%d.%d%%)\n", "Crits", crit.mul/100, crit.mul%100, crit_pct / 10, crit_pct % 10); } } if (p_ptr->weapon_info[hand].to_mult) { int m = 100 + p_ptr->weapon_info[hand].to_mult; doc_printf(cols[0], " %-7.7s: %d.%02dx\n", "Mauler", m / 100, m % 100); } _display_weapon_slay(mult, 100, FALSE, num_blow, dd, ds, to_d, "Normal", TERM_WHITE, cols[0]); if (force) _display_weapon_slay(mult, 100, force, num_blow, dd, ds, to_d, "Force", TERM_L_BLUE, cols[0]); if (p_ptr->tim_slay_sentient) _display_weapon_slay(mult, 200, force, num_blow, dd, ds, to_d, "Sent.", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_ANIMAL)) _display_weapon_slay(mult, 400, force, num_blow, dd, ds, to_d, "Animals", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_ANIMAL)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Animals", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_EVIL)) _display_weapon_slay(mult, 350, force, num_blow, dd, ds, to_d, "Evil", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_EVIL)) _display_weapon_slay(mult, 200, force, num_blow, dd, ds, to_d, "Evil", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_SLAY_GOOD)) _display_weapon_slay(mult, 200, force, num_blow, dd, ds, to_d, "Good", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_SLAY_LIVING)) _display_weapon_slay(mult, 200, force, num_blow, dd, ds, to_d, "Living", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_HUMAN)) _display_weapon_slay(mult, 400, force, num_blow, dd, ds, to_d, "Human", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_HUMAN)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Human", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_UNDEAD)) _display_weapon_slay(mult, 500, force, num_blow, dd, ds, to_d, "Undead", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_UNDEAD)) _display_weapon_slay(mult, 300, force, num_blow, dd, ds, to_d, "Undead", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_DEMON)) _display_weapon_slay(mult, 500, force, num_blow, dd, ds, to_d, "Demons", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_DEMON)) _display_weapon_slay(mult, 300, force, num_blow, dd, ds, to_d, "Demons", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_ORC)) _display_weapon_slay(mult, 500, force, num_blow, dd, ds, to_d, "Orcs", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_ORC)) _display_weapon_slay(mult, 300, force, num_blow, dd, ds, to_d, "Orcs", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_TROLL)) _display_weapon_slay(mult, 500, force, num_blow, dd, ds, to_d, "Trolls", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_TROLL)) _display_weapon_slay(mult, 300, force, num_blow, dd, ds, to_d, "Trolls", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_GIANT)) _display_weapon_slay(mult, 500, force, num_blow, dd, ds, to_d, "Giants", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_GIANT)) _display_weapon_slay(mult, 300, force, num_blow, dd, ds, to_d, "Giants", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_DRAGON)) _display_weapon_slay(mult, 500, force, num_blow, dd, ds, to_d, "Dragons", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_DRAGON)) _display_weapon_slay(mult, 300, force, num_blow, dd, ds, to_d, "Dragons", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_BRAND_ACID)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Acid", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_ELEC)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Elec", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_FIRE)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Fire", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_COLD)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Cold", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_POIS)) _display_weapon_slay(mult, 250, force, num_blow, dd, ds, to_d, "Poison", TERM_RED, cols[0]); if (p_ptr->weapon_info[hand].wield_how == WIELD_TWO_HANDS) { if (p_ptr->weapon_info[hand].omoi) doc_insert(cols[0], " Your weapon requires two hands to wield properly.\n"); } if (p_ptr->weapon_info[hand].info) { byte a = p_ptr->weapon_info[hand].info_attr; if (!a) a = TERM_WHITE; /* uninitialized is TERM_DARK???! */ doc_printf(cols[0], " <color:%c>%s</color>\n", attr_to_attr_char(a), p_ptr->weapon_info[hand].info); } /* Column #1 */ doc_insert(cols[1], "<color:G>Accuracy</color>\n"); doc_insert(cols[1], " AC Hit\n"); doc_printf(cols[1], "%3d %2d%%\n", 25, hit_chance(hand, to_h, 25)); doc_printf(cols[1], "%3d %2d%%\n", 50, hit_chance(hand, to_h, 50)); doc_printf(cols[1], "%3d %2d%%\n", 75, hit_chance(hand, to_h, 75)); doc_printf(cols[1], "%3d %2d%%\n", 100, hit_chance(hand, to_h, 100)); doc_printf(cols[1], "%3d %2d%%\n", 125, hit_chance(hand, to_h, 125)); doc_printf(cols[1], "%3d %2d%%\n", 150, hit_chance(hand, to_h, 150)); doc_printf(cols[1], "%3d %2d%%\n", 175, hit_chance(hand, to_h, 175)); doc_printf(cols[1], "%3d %2d%%\n", 200, hit_chance(hand, to_h, 200)); /* Assemble the result */ doc_insert_cols(doc, cols, 2, 1); doc_free(cols[0]); doc_free(cols[1]); }
static void _shooter_info_aux(doc_ptr doc, object_type *bow, object_type *arrow, int ct) { char o_name[MAX_NLEN]; u32b flgs[TR_FLAG_SIZE]; int mult; int to_h = 0; int to_d = 0; int to_h_bow = 0; int to_d_bow = 0; int to_h_xtra = p_ptr->shooter_info.dis_to_h; int to_d_xtra = p_ptr->shooter_info.dis_to_d; int dd = arrow->dd; int ds = arrow->ds; critical_t crit = {0}; int num_fire = 0; doc_ptr cols[2] = {0}; cols[0] = doc_alloc(60); cols[1] = doc_alloc(10); missile_flags_known(arrow, flgs); mult = bow_mult(bow); if (object_is_artifact(arrow)) num_fire = 100; else if (p_ptr->shooter_info.num_fire) num_fire = p_ptr->shooter_info.num_fire * 100 * 100 / bow_energy(bow->sval); if (object_is_known(bow)) { to_h_bow = bow->to_h; to_d_bow = bow->to_d; if (weaponmaster_is_(WEAPONMASTER_CROSSBOWS) && p_ptr->lev >= 15) to_d_bow += 1 + p_ptr->lev/10; } if (object_is_known(arrow)) { to_h = arrow->to_h; to_d = arrow->to_d; } if (p_ptr->big_shot) dd *= 2; { const int ct = 10 * 1000; int i; /* Compute Average Effects of Criticals by sampling */ for (i = 0; i < ct; i++) { critical_t tmp = critical_shot(arrow->weight, arrow->to_h); if (tmp.desc) { crit.mul += tmp.mul; crit.to_d += tmp.to_d; } else crit.mul += 100; } crit.mul = crit.mul / ct; crit.to_d = crit.to_d * 100 / ct; } /* First Column */ object_desc(o_name, arrow, OD_OMIT_INSCRIPTION | OD_COLOR_CODED); doc_printf(cols[0], "<color:u> Ammo #%-2d</color>: <indent><style:indent>%s</style></indent>\n", ct, o_name); doc_printf(cols[0], " %-8.8s: %d.%d lbs\n", "Weight", arrow->weight/10, arrow->weight%10); doc_printf(cols[0], " %-8.8s: %d + %d = %d\n", "To Hit", to_h, to_h_bow + to_h_xtra, to_h + to_h_bow + to_h_xtra); doc_printf(cols[0], " %-8.8s: %d + %d = %d (%s)\n", "To Dam", to_d, to_d_bow, to_d + to_d_bow, "Multiplier Applies"); doc_printf(cols[0], " <color:G>%-8.8s</color>\n", "Damage"); if (crit.to_d) { doc_printf(cols[0], " %-8.8s: %d.%02dx + %d.%02d\n", "Crits", crit.mul/100, crit.mul%100, crit.to_d/100, crit.to_d%100); } else { doc_printf(cols[0], " %-8.8s: %d.%02dx\n", "Crits", crit.mul/100, crit.mul%100); } to_d = to_d + to_d_bow; mult = mult * crit.mul / 100; to_d_xtra = to_d_xtra + crit.to_d/100; _display_missile_slay(mult, 100, num_fire, dd, ds, to_d, to_d_xtra, "Normal", TERM_WHITE, cols[0]); if (p_ptr->tim_force && p_ptr->csp > (p_ptr->msp / 30)) { mult = mult * 3 / 2; _display_missile_slay(mult, 100, num_fire, dd, ds, to_d, to_d_xtra, "Force", TERM_L_BLUE, cols[0]); } if (have_flag(flgs, TR_KILL_ANIMAL)) _display_missile_slay(mult, 270, num_fire, dd, ds, to_d, to_d_xtra, "Animals", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_ANIMAL)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Animals", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_EVIL)) _display_missile_slay(mult, 250, num_fire, dd, ds, to_d, to_d_xtra, "Evil", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_EVIL)) _display_missile_slay(mult, 150, num_fire, dd, ds, to_d, to_d_xtra, "Evil", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_HUMAN)) _display_missile_slay(mult, 270, num_fire, dd, ds, to_d, to_d_xtra, "Human", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_HUMAN)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Human", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_UNDEAD)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Undead", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_UNDEAD)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Undead", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_DEMON)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Demons", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_DEMON)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Demons", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_ORC)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Orcs", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_ORC)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Orcs", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_TROLL)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Trolls", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_TROLL)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Trolls", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_GIANT)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Giants", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_GIANT)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Giants", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_DRAGON)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Dragons", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_DRAGON)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Dragons", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_BRAND_ACID)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Acid", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_ELEC)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Elec", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_FIRE)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Fire", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_COLD)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Cold", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_POIS)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Poison", TERM_RED, cols[0]); /* Second Column */ to_h = to_h + to_h_bow + to_h_xtra; doc_insert(cols[1], " <color:G>AC Hit</color>\n"); doc_printf(cols[1], "%3d %2d%%\n", 25, bow_hit_chance(bow->sval, to_h, 25)); doc_printf(cols[1], "%3d %2d%%\n", 50, bow_hit_chance(bow->sval, to_h, 50)); doc_printf(cols[1], "%3d %2d%%\n", 100, bow_hit_chance(bow->sval, to_h, 100)); doc_printf(cols[1], "%3d %2d%%\n", 150, bow_hit_chance(bow->sval, to_h, 150)); doc_printf(cols[1], "%3d %2d%%\n", 175, bow_hit_chance(bow->sval, to_h, 175)); doc_printf(cols[1], "%3d %2d%%\n", 200, bow_hit_chance(bow->sval, to_h, 200)); doc_insert_cols(doc, cols, 2, 1); doc_free(cols[0]); doc_free(cols[1]); }