diff options
Diffstat (limited to 'src/cmd3.c')
-rw-r--r-- | src/cmd3.c | 2331 |
1 files changed, 0 insertions, 2331 deletions
diff --git a/src/cmd3.c b/src/cmd3.c deleted file mode 100644 index 02dbc1c4..00000000 --- a/src/cmd3.c +++ /dev/null @@ -1,2331 +0,0 @@ -/* File: cmd3.c */ - -/* Purpose: Inventory commands */ - -/* - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke - * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. - */ - -#include "angband.h" - - -/* - * Display p_ptr->inventory - */ -void do_cmd_inven(void) -{ - char out_val[160]; - - - /* Note that we are in "p_ptr->inventory" mode */ - command_wrk = FALSE; - - /* Save the screen */ - character_icky = TRUE; - Term_save(); - - /* Hack -- show empty slots */ - item_tester_full = TRUE; - - /* Display the p_ptr->inventory */ - show_inven(); - - /* Hack -- hide empty slots */ - item_tester_full = FALSE; - - - { - s32b total_weight = calc_total_weight(); - - strnfmt(out_val, 160, - "Inventory: carrying %ld.%ld pounds (%ld%% of capacity). Command: ", - total_weight / 10, total_weight % 10, - (total_weight * 100) / ((weight_limit()) / 2)); - } - - /* Get a command */ - prt(out_val, 0, 0); - - /* Get a new command */ - command_new = inkey(); - - /* Restore the screen */ - Term_load(); - character_icky = FALSE; - - - /* Process "Escape" */ - if (command_new == ESCAPE) - { - /* Reset stuff */ - command_new = 0; - } - - /* Process normal keys */ - else - { - /* Mega-Hack -- Don't disable keymaps for this key */ - request_command_inven_mode = TRUE; - } -} - - -/* - * Display equipment - */ -void do_cmd_equip(void) -{ - char out_val[160]; - - - /* Note that we are in "equipment" mode */ - command_wrk = TRUE; - - /* Save the screen */ - character_icky = TRUE; - Term_save(); - - /* Hack -- show empty slots */ - item_tester_full = TRUE; - - /* Display the equipment */ - show_equip(); - - /* Hack -- undo the hack above */ - item_tester_full = FALSE; - - /* Build a prompt */ - { - s32b total_weight = calc_total_weight(); - - /* Build a prompt */ - strnfmt(out_val, 160, - "Equipment: carrying %ld.%ld pounds (%ld%% of capacity). Command: ", - total_weight / 10, total_weight % 10, - (total_weight * 100) / ((weight_limit()) / 2)); - } - - /* Get a command */ - prt(out_val, 0, 0); - - /* Get a new command */ - command_new = inkey(); - - /* Restore the screen */ - Term_load(); - character_icky = FALSE; - - - /* Process "Escape" */ - if (command_new == ESCAPE) - { - /* Reset stuff */ - command_new = 0; - } - - /* Process normal keys */ - else - { - /* Mega-Hack -- Don't disable keymaps for this key */ - request_command_inven_mode = TRUE; - } -} - - -/* - * The "wearable" tester - */ -static bool_ item_tester_hook_wear(object_type *o_ptr) -{ - u32b f1, f2, f3, f4, f5, esp; - int slot = wield_slot(o_ptr); - - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - /* Only one ultimate at a time */ - if (f4 & TR4_ULTIMATE) - { - int i; - - for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) - { - object_type *q_ptr = &p_ptr->inventory[i]; - - /* Extract the flags */ - object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if (!q_ptr->k_idx) continue; - - if (f4 & TR4_ULTIMATE) return (FALSE); - } - } - - if ((slot < INVEN_WIELD) || ((p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_WIELD) && (p_ptr->melee_style != SKILL_MASTERY))) - return (FALSE); - - /* Check for a usable slot */ - if (slot >= INVEN_WIELD) return (TRUE); - - /* Assume not wearable */ - return (FALSE); -} - - -bool_ is_slot_ok(int slot) -{ - if ((slot >= INVEN_WIELD) && (slot < INVEN_TOTAL)) - { - return (TRUE); - } - else - { - return (FALSE); - } -} - - -/* - * Wield or wear a single item from the pack or floor - */ -void do_cmd_wield(void) -{ - int item, slot, num = 1; - - object_type forge; - - object_type *q_ptr; - - object_type *o_ptr, *i_ptr; - - cptr act; - - char o_name[80]; - - cptr q, s; - - u32b f1, f2, f3, f4, f5, esp; - - - /* Restrict the choices */ - item_tester_hook = item_tester_hook_wear; - - /* Get an item */ - q = "Wear/Wield which item? "; - s = "You have nothing you can wear or wield."; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Check the slot */ - slot = wield_slot(o_ptr); - - /* Prevent wielding into a cursed slot */ - if (cursed_p(&p_ptr->inventory[slot])) - { - /* Describe it */ - object_desc(o_name, &p_ptr->inventory[slot], FALSE, 0); - - /* Message */ - msg_format("The %s you are %s appears to be cursed.", - o_name, describe_use(slot)); - - /* Cancel the command */ - return; - } - - if ((cursed_p(o_ptr)) && (wear_confirm) - && (object_known_p(o_ptr) || (o_ptr->ident & (IDENT_SENSE)))) - { - char dummy[512]; - - /* Describe it */ - object_desc(o_name, o_ptr, FALSE, 0); - - strnfmt(dummy, 512, "Really use the %s {cursed}? ", o_name); - if (!(get_check(dummy))) - return; - } - - /* Can we wield */ - if (process_hooks(HOOK_WIELD, "(d)", item)) return; - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - /* Two handed weapons can't be wielded with a shield */ - if ((is_slot_ok(slot - INVEN_WIELD + INVEN_ARM)) && - (f4 & TR4_MUST2H) && - (p_ptr->inventory[slot - INVEN_WIELD + INVEN_ARM].k_idx != 0)) - { - object_desc(o_name, o_ptr, FALSE, 0); - msg_format("You cannot wield your %s with a shield.", o_name); - return; - } - - if (is_slot_ok(slot - INVEN_ARM + INVEN_WIELD)) - { - i_ptr = &p_ptr->inventory[slot - INVEN_ARM + INVEN_WIELD]; - - /* Extract the flags */ - object_flags(i_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - /* Prevent shield from being put on if wielding 2H */ - if ((f4 & TR4_MUST2H) && (i_ptr->k_idx) && - (p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_ARM)) - { - object_desc(o_name, o_ptr, FALSE, 0); - msg_format("You cannot wield your %s with a two-handed weapon.", o_name); - return; - } - - if ((p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_ARM) && - (f4 & TR4_COULD2H)) - { - if (!get_check("Are you sure you want to restrict your fighting? ")) - { - return; - } - } - } - - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if ((is_slot_ok(slot - INVEN_WIELD + INVEN_ARM)) && - (p_ptr->inventory[slot - INVEN_WIELD + INVEN_ARM].k_idx != 0) && - (f4 & TR4_COULD2H)) - { - if (!get_check("Are you sure you want to use this weapon with a shield?")) - { - return; - } - } - - /* Can we take off existing item */ - if (slot != INVEN_AMMO) - { - if (p_ptr->inventory[slot].k_idx) - if (process_hooks(HOOK_TAKEOFF, "(d)", slot)) return; - } - else - { - if (p_ptr->inventory[slot].k_idx) - if (!object_similar(&p_ptr->inventory[slot], o_ptr)) - if (process_hooks(HOOK_TAKEOFF, "(d)", slot)) return; - } - - /* Take a turn */ - energy_use = 100; - - /* Get local object */ - q_ptr = &forge; - - /* Obtain local object */ - object_copy(q_ptr, o_ptr); - - if (slot == INVEN_AMMO) num = o_ptr->number; - - /* Modify quantity */ - q_ptr->number = num; - - /* Decrease the item */ - inc_stack_size_ex(item, -num, OPTIMIZE, NO_DESCRIBE); - - /* Access the wield slot */ - o_ptr = &p_ptr->inventory[slot]; - - /* Take off existing item */ - if (slot != INVEN_AMMO) - { - if (o_ptr->k_idx) - { - /* Take off existing item */ - (void)inven_takeoff(slot, 255, FALSE); - } - } - else - { - if (o_ptr->k_idx) - { - if (!object_similar(o_ptr, q_ptr)) - { - /* Take off existing item */ - (void)inven_takeoff(slot, 255, FALSE); - } - else - { - q_ptr->number += o_ptr->number; - } - } - } - - - /* Wear the new stuff */ - object_copy(o_ptr, q_ptr); - - /* Increment the equip counter by hand */ - equip_cnt++; - - /* Where is the item now */ - if (slot == INVEN_WIELD) - { - act = "You are wielding"; - } - else if (( slot == INVEN_BOW ) && (o_ptr->tval == TV_INSTRUMENT)) - { - act = "You are holding"; - } - else if (slot == INVEN_BOW) - { - act = "You are shooting with"; - } - else if (slot == INVEN_LITE) - { - act = "Your light source is"; - } - else if (slot == INVEN_AMMO) - { - act = "In your quiver you have"; - } - else if (slot == INVEN_TOOL) - { - act = "You are using"; - } - else - { - act = "You are wearing"; - } - - /* Describe the result */ - object_desc(o_name, o_ptr, TRUE, 3); - - /* Message */ - msg_format("%s %s (%c).", act, o_name, index_to_label(slot)); - - /* Cursed! */ - if (cursed_p(o_ptr)) - { - /* Warn the player */ - msg_print("Oops! It feels deathly cold!"); - - /* Note the curse */ - o_ptr->ident |= (IDENT_SENSE); - o_ptr->sense = SENSE_CURSED; - } - - /* Take care of item sets */ - if (o_ptr->name1) - { - wield_set(o_ptr->name1, a_info[o_ptr->name1].set, FALSE); - } - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Recalculate torch */ - p_ptr->update |= (PU_TORCH); - - /* Recalculate hitpoint */ - p_ptr->update |= (PU_HP); - - /* Recalculate mana */ - p_ptr->update |= (PU_MANA | PU_SPELLS); - - /* Redraw monster hitpoint */ - p_ptr->redraw |= (PR_MH); - - p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); -} - - - -/* - * Take off an item - */ -void do_cmd_takeoff(void) -{ - int item; - - object_type *o_ptr; - - cptr q, s; - - - /* Get an item */ - q = "Take off which item? "; - s = "You are not wearing anything to take off."; - if (!get_item(&item, q, s, (USE_EQUIP))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Can we take it off */ - if (process_hooks(HOOK_TAKEOFF, "(d)", item)) return; - - /* Item is cursed */ - if (cursed_p(o_ptr) && (!wizard)) - { - /* Oops */ - msg_print("Hmmm, it seems to be cursed."); - - /* Nope */ - return; - } - - - /* Take a partial turn */ - energy_use = 50; - - /* Take off the item */ - (void)inven_takeoff(item, 255, FALSE); - - /* Recalculate hitpoint */ - p_ptr->update |= (PU_HP); - - p_ptr->redraw |= (PR_MH); -} - - -/* - * Drop an item - */ -void do_cmd_drop(void) -{ - int item, amt = 1; - - object_type *o_ptr; - - u32b f1, f2, f3, f4, f5, esp; - - cptr q, s; - - - /* Get an item */ - q = "Drop which item? "; - s = "You have nothing to drop."; - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN))) return; - - /* Get the item */ - o_ptr = get_object(item); - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - /* Can we drop */ - if (process_hooks(HOOK_DROP, "(d)", item)) return; - - /* Hack -- Cannot remove cursed items */ - if (cursed_p(o_ptr)) - { - if (item >= INVEN_WIELD) - { - /* Oops */ - msg_print("Hmmm, it seems to be cursed."); - - /* Nope */ - return; - } - else - { - if (f4 & TR4_CURSE_NO_DROP) - { - /* Oops */ - msg_print("Hmmm, you seem to be unable to drop it."); - - /* Nope */ - return; - } - } - } - - - /* See how many items */ - if (o_ptr->number > 1) - { - /* Get a quantity */ - amt = get_quantity(NULL, o_ptr->number); - - /* Allow user abort */ - if (amt <= 0) return; - } - - /* Take a partial turn */ - energy_use = 50; - - /* Drop (some of) the item */ - inven_drop(item, amt, p_ptr->py, p_ptr->px, FALSE); -} - - -/* - * Destroy an item - */ -void do_cmd_destroy(void) -{ - int item, amt = 1; - - int old_number; - - bool_ force = FALSE; - - object_type *o_ptr; - - char o_name[80]; - - char out_val[160]; - - cptr q, s; - - u32b f1, f2, f3, f4, f5, esp; - - - /* Hack -- force destruction */ - if (command_arg > 0) force = TRUE; - - - /* Get an item */ - q = "Destroy which item? "; - s = "You have nothing to destroy."; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_AUTO))) return; - - /* Get the item */ - o_ptr = get_object(item); - - - /* See how many items */ - if (o_ptr->number > 1) - { - /* Get a quantity */ - amt = get_quantity(NULL, o_ptr->number); - - /* Allow user abort */ - if (amt <= 0) return; - } - - - /* Describe the object */ - old_number = o_ptr->number; - o_ptr->number = amt; - object_desc(o_name, o_ptr, TRUE, 3); - o_ptr->number = old_number; - - /* Verify unless quantity given */ - if (!force) - { - if (!((auto_destroy) && (object_value(o_ptr) < 1))) - { - /* Make a verification */ - strnfmt(out_val, 160, "Really destroy %s? ", o_name); - if (!get_check(out_val)) return; - } - } - - /* Take no time, just like the automatizer */ - energy_use = 0; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if ((f4 & TR4_CURSE_NO_DROP) && cursed_p(o_ptr)) - { - /* Oops */ - msg_print("Hmmm, you seem to be unable to destroy it."); - - /* Nope */ - return; - } - - - /* Artifacts cannot be destroyed */ - if (artifact_p(o_ptr) || o_ptr->art_name) - { - byte feel = SENSE_SPECIAL; - - energy_use = 0; - - /* Message */ - msg_format("You cannot destroy %s.", o_name); - - /* Hack -- Handle icky artifacts */ - if (cursed_p(o_ptr)) feel = SENSE_TERRIBLE; - - /* Hack -- inscribe the artifact */ - o_ptr->sense = feel; - - /* We have "felt" it (again) */ - o_ptr->ident |= (IDENT_SENSE); - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP); - - /* Done */ - return; - } - - /* Message */ - msg_format("You destroy %s.", o_name); - sound(SOUND_DESTITEM); - - /* Create an automatizer rule */ - if (automatizer_create) - { - automatizer_add_rule(o_ptr, TRUE); - } - - /* - * Hack -- If rods or wand are destroyed, the total maximum timeout or - * charges of the stack needs to be reduced, unless all the items are - * being destroyed. -LM- - */ - if ((o_ptr->tval == TV_WAND) && (amt < o_ptr->number)) - { - o_ptr->pval -= o_ptr->pval * amt / o_ptr->number; - } - - /* Eru wont be happy */ - if (f3 & TR3_BLESSED) - inc_piety(GOD_ERU, -10 * k_info[o_ptr->k_idx].level); - - /* Eliminate the item */ - inc_stack_size(item, -amt); -} - - -/* - * Observe an item which has been *identify*-ed - */ -void do_cmd_observe(void) -{ - int item; - - object_type *o_ptr; - - char o_name[80]; - - cptr q, s; - - - /* Get an item */ - q = "Examine which item? "; - s = "You have nothing to examine."; - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Description */ - object_desc(o_name, o_ptr, TRUE, 3); - - /* Describe */ - cmsg_format(TERM_L_BLUE, "%s", o_name); - - /* Describe it fully */ - if (!object_out_desc(o_ptr, NULL, FALSE, TRUE)) msg_print("You see nothing special."); -} - - - -/* - * Remove the inscription from an object - * XXX Mention item (when done)? - */ -void do_cmd_uninscribe(void) -{ - int item; - - object_type *o_ptr; - - cptr q, s; - - - /* Get an item */ - q = "Un-inscribe which item? "; - s = "You have nothing to un-inscribe."; - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Nothing to remove */ - if (!o_ptr->note) - { - msg_print("That item had no inscription to remove."); - return; - } - - /* Message */ - msg_print("Inscription removed."); - - /* Remove the incription */ - o_ptr->note = 0; - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP); -} - - -/* - * Inscribe an object with a comment - */ -void do_cmd_inscribe(void) -{ - int item; - - object_type *o_ptr; - - char o_name[80]; - - char out_val[80]; - - cptr q, s; - - - /* Get an item */ - q = "Inscribe which item? "; - s = "You have nothing to inscribe."; - if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Describe the activity */ - object_desc(o_name, o_ptr, TRUE, 3); - - /* Message */ - msg_format("Inscribing %s.", o_name); - msg_print(NULL); - - /* Start with nothing */ - strcpy(out_val, ""); - - /* Use old inscription */ - if (o_ptr->note) - { - /* Start with the old inscription */ - strcpy(out_val, quark_str(o_ptr->note)); - } - - /* Get a new inscription (possibly empty) */ - if (get_string("Inscription: ", out_val, 80)) - { - /* Save the inscription */ - o_ptr->note = quark_add(out_val); - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP); - } -} - - - -/* - * An "item_tester_hook" for refilling lanterns - */ -static bool_ item_tester_refill_lantern(object_type *o_ptr) -{ - /* Flasks of oil are okay */ - if (o_ptr->tval == TV_FLASK) return (TRUE); - - /* Lanterns are okay */ - if ((o_ptr->tval == TV_LITE) && - (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE); - - /* Assume not okay */ - return (FALSE); -} - - -/* - * Refill the players lamp (from the pack or floor) - */ -static void do_cmd_refill_lamp(void) -{ - int item; - - object_type *o_ptr; - object_type *j_ptr; - - cptr q, s; - - - /* Restrict the choices */ - item_tester_hook = item_tester_refill_lantern; - - /* Get an item */ - q = "Refill with which flask? "; - s = "You have no flasks of oil."; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Take a partial turn */ - energy_use = 50; - - /* Access the lantern */ - j_ptr = &p_ptr->inventory[INVEN_LITE]; - - /* Refuel */ - if (o_ptr->tval == TV_FLASK) - j_ptr->timeout += o_ptr->pval; - else - j_ptr->timeout += o_ptr->timeout; - - /* Message */ - msg_print("You fuel your lamp."); - - /* Comment */ - if (j_ptr->timeout >= FUEL_LAMP) - { - j_ptr->timeout = FUEL_LAMP; - msg_print("Your lamp is full."); - } - - /* Decrease the item stack */ - inc_stack_size(item, -1); - - /* Recalculate torch */ - p_ptr->update |= (PU_TORCH); -} - - -/* - * An "item_tester_hook" for refilling torches - */ -static bool_ item_tester_refill_torch(object_type *o_ptr) -{ - /* Torches are okay */ - if ((o_ptr->tval == TV_LITE) && - (o_ptr->sval == SV_LITE_TORCH)) return (TRUE); - - /* Assume not okay */ - return (FALSE); -} - - -/* - * Refuel the players torch (from the pack or floor) - */ -static void do_cmd_refill_torch(void) -{ - int item; - - object_type *o_ptr; - - object_type *j_ptr; - - cptr q, s; - - - /* Restrict the choices */ - item_tester_hook = item_tester_refill_torch; - - /* Get an item */ - q = "Refuel with which torch? "; - s = "You have no extra torches."; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item */ - o_ptr = get_object(item); - - /* Take a partial turn */ - energy_use = 50; - - /* Access the primary torch */ - j_ptr = &p_ptr->inventory[INVEN_LITE]; - - /* Refuel */ - j_ptr->timeout += o_ptr->timeout + 5; - - /* Message */ - msg_print("You combine the torches."); - - /* Over-fuel message */ - if (j_ptr->timeout >= FUEL_TORCH) - { - j_ptr->timeout = FUEL_TORCH; - msg_print("Your torch is fully fueled."); - } - - /* Refuel message */ - else - { - msg_print("Your torch glows more brightly."); - } - - /* Decrease the item stack */ - inc_stack_size(item, -1); - - /* Recalculate torch */ - p_ptr->update |= (PU_TORCH); -} - - -/* - * Refill the players lamp, or restock his torches - */ -void do_cmd_refill(void) -{ - object_type *o_ptr; - - u32b f1, f2, f3, f4, f5, esp; - - - /* Get the light */ - o_ptr = &p_ptr->inventory[INVEN_LITE]; - - /* It is nothing */ - if (o_ptr->tval != TV_LITE) - { - msg_print("You are not wielding a light."); - return; - } - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if (f4 & TR4_FUEL_LITE) - { - /* It's a torch */ - if (o_ptr->sval == SV_LITE_TORCH || - o_ptr->sval == SV_LITE_TORCH_EVER) - { - do_cmd_refill_torch(); - } - - /* It's a lamp */ - else if (o_ptr->sval == SV_LITE_LANTERN || - o_ptr->sval == SV_LITE_DWARVEN || - o_ptr->sval == SV_LITE_FEANORIAN) - { - do_cmd_refill_lamp(); - } - } - - /* No torch to refill */ - else - { - msg_print("Your light cannot be refilled."); - } -} - - -/* - * Target command - */ -void do_cmd_target(void) -{ - /* Target set */ - if (target_set(TARGET_KILL)) - { - msg_print("Target Selected."); - } - - /* Target aborted */ - else - { - msg_print("Target Aborted."); - } -} - - - -/* - * Look command - */ -void do_cmd_look(void) -{ - /* Look around */ - if (target_set(TARGET_LOOK)) - { - msg_print("Target Selected."); - } -} - - - -/* - * Allow the player to examine other sectors on the map - */ -void do_cmd_locate(void) -{ - int dir, y1, x1, y2, x2; - int panel_hgt, panel_wid; - char tmp_val[80]; - char out_val[160]; - - - /* Retrieve size of the Angband window */ - Term_get_size(&panel_wid, &panel_hgt); - - /* Calcurate size of the dungeon map area */ - panel_hgt = (panel_hgt - (ROW_MAP + 1)) / 2; - panel_wid = (panel_wid - (COL_MAP + 1)) / 2; - - /* Start at current panel */ - y2 = y1 = panel_row_min; - x2 = x1 = panel_col_min; - - /* Show panels until done */ - while (1) - { - /* Describe the location */ - if ((y2 == y1) && (x2 == x1)) - { - tmp_val[0] = '\0'; - } - else - { - strnfmt(tmp_val, 80, "%s%s of", - ((y2 < y1) ? " North" : (y2 > y1) ? " South" : ""), - ((x2 < x1) ? " West" : (x2 > x1) ? " East" : "")); - } - - /* Prepare to ask which way to look */ - if ((panel_hgt == PANEL_HGT) && (panel_wid == PANEL_WID)) - { - /* Avoid surprising the standard screen users */ - strnfmt(out_val, 160, - "Map sector [%d,%d], which is%s your sector. Direction?", - y2 / panel_hgt, x2 / panel_wid, tmp_val); - } - - /* Big screen */ - else - { - /* Panels are measured by current map area size */ - strnfmt(out_val, 160, - "Map sector [%d(%02d),%d(%02d)], which is%s your sector. Direction?", - y2 / panel_hgt, y2 % panel_hgt, - x2 / panel_wid, x2 % panel_wid, tmp_val); - } - - /* Assume no direction */ - dir = 0; - - /* Get a direction */ - while (!dir) - { - char ch; - - /* Get a command (or cancel) */ - if (!get_com(out_val, &ch)) break; - - /* Extract the action (if any) */ - dir = get_keymap_dir(ch); - - /* Error */ - if (!dir) bell(); - } - - /* No direction */ - if (!dir) break; - - /* Apply the motion */ - if (change_panel(ddy[dir], ddx[dir])) - { - y2 = panel_row_min; - x2 = panel_col_min; - } - } - - /* Recenter the map around the player */ - verify_panel(); - - /* Update stuff */ - p_ptr->update |= (PU_MONSTERS); - - /* Redraw map */ - p_ptr->redraw |= (PR_MAP); - - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ - handle_stuff(); -} - - - - - - -/* - * The table of "symbol info" -- each entry is a string of the form - * "X:desc" where "X" is the trigger, and "desc" is the "info". - */ -static cptr ident_info[] = -{ - " :A dark grid", - "!:A potion (or oil)", - "\":An amulet (or necklace)", - "#:A wall (or secret door)", - "$:Treasure (gold or gems)", - "%:A vein (magma or quartz)", - /* "&:unused", */ - "':An open door", - "(:Soft armor", - "):A shield", - "*:A vein with treasure", - "+:A closed door", - ",:Food (or mushroom patch)", - "-:A wand (or rod)", - ".:Floor", - "/:A polearm (Axe/Pike/etc)", - "0:An altar", - "1:Entrance to General Store", - "2:Entrance to Armory", - "3:Entrance to Weaponsmith", - "4:Entrance to Temple", - "5:Entrance to Alchemy shop", - "6:Entrance to Magic store", - "7:Entrance to Black Market", - "8:Entrance to your home", - "9:Entrance to Bookstore", - "::Rubble", - ";:A glyph of warding / explosive rune", - "<:An up staircase", - "=:A ring", - ">:A down staircase", - "?:A scroll", - "@:You", - "A:Angel", - "B:Bird", - "C:Canine", - "D:Ancient Dragon/Wyrm", - "E:Elemental", - "F:Dragon Fly", - "G:Ghost", - "H:Hybrid", - "I:Insect", - "J:Snake", - "K:Killer Beetle", - "L:Lich", - "M:Multi-Headed Reptile", - /* "N:unused", */ - "O:Ogre", - "P:Giant Humanoid", - "Q:Quylthulg (Pulsing Flesh Mound)", - "R:Reptile/Amphibian", - "S:Spider/Scorpion/Tick", - "T:Troll", - "U:Major Demon", - "V:Vampire", - "W:Wight/Wraith/etc", - "X:Xorn/Xaren/etc", - "Y:Yeti", - "Z:Zephyr Hound", - "[:Hard armor", - "\\:A hafted weapon (mace/whip/etc)", - "]:Misc. armor", - "^:A trap", - "_:A staff", - /* "`:unused", */ - "a:Ant", - "b:Bat", - "c:Centipede", - "d:Dragon", - "e:Floating Eye", - "f:Feline", - "g:Golem", - "h:Hobbit/Elf/Dwarf", - "i:Icky Thing", - "j:Jelly", - "k:Kobold", - "l:Louse", - "m:Mold", - "n:Naga", - "o:Orc", - "p:Person/Human", - "q:Quadruped", - "r:Rodent", - "s:Skeleton", - "t:Townsperson", - "u:Minor Demon", - "v:Vortex", - "w:Worm/Worm-Mass", - /* "x:unused", */ - "y:Yeek", - "z:Zombie/Mummy", - "{:A missile (arrow/bolt/shot)", - "|:An edged weapon (sword/dagger/etc)", - "}:A launcher (bow/crossbow/sling)", - "~:A tool (or miscellaneous item)", - NULL -}; - - - -/* - * Sorting hook -- Comp function -- see below - * - * We use "u" to point to array of monster indexes, - * and "v" to select the type of sorting to perform on "u". - */ -static bool_ ang_sort_comp_hook(vptr u, vptr v, int a, int b) -{ - u16b *who = (u16b*)(u); - - u16b *why = (u16b*)(v); - - int w1 = who[a]; - - int w2 = who[b]; - - int z1, z2; - - - /* Sort by player kills */ - if (*why >= 4) - { - /* Extract player kills */ - z1 = r_info[w1].r_pkills; - z2 = r_info[w2].r_pkills; - - /* Compare player kills */ - if (z1 < z2) return (TRUE); - if (z1 > z2) return (FALSE); - } - - - /* Sort by total kills */ - if (*why >= 3) - { - /* Extract total kills */ - z1 = r_info[w1].r_tkills; - z2 = r_info[w2].r_tkills; - - /* Compare total kills */ - if (z1 < z2) return (TRUE); - if (z1 > z2) return (FALSE); - } - - - /* Sort by monster level */ - if (*why >= 2) - { - /* Extract levels */ - z1 = r_info[w1].level; - z2 = r_info[w2].level; - - /* Compare levels */ - if (z1 < z2) return (TRUE); - if (z1 > z2) return (FALSE); - } - - - /* Sort by monster experience */ - if (*why >= 1) - { - /* Extract experience */ - z1 = r_info[w1].mexp; - z2 = r_info[w2].mexp; - - /* Compare experience */ - if (z1 < z2) return (TRUE); - if (z1 > z2) return (FALSE); - } - - - /* Compare indexes */ - return (w1 <= w2); -} - - -/* - * Sorting hook -- Swap function -- see below - * - * We use "u" to point to array of monster indexes, - * and "v" to select the type of sorting to perform. - */ -static void ang_sort_swap_hook(vptr u, vptr v, int a, int b) -{ - u16b *who = (u16b*)(u); - - u16b holder; - - - /* XXX XXX */ - v = v ? v : 0; - - /* Swap */ - holder = who[a]; - who[a] = who[b]; - who[b] = holder; -} - - - -/* - * Hack -- Display the "name" and "attr/chars" of a monster race - */ -static void roff_top(int r_idx) -{ - monster_race *r_ptr = &r_info[r_idx]; - - byte a1, a2; - - char c1, c2; - - - /* Access the chars */ - c1 = r_ptr->d_char; - c2 = r_ptr->x_char; - - /* Access the attrs */ - a1 = r_ptr->d_attr; - a2 = r_ptr->x_attr; - - - /* Clear the top line */ - Term_erase(0, 0, 255); - - /* Reset the cursor */ - Term_gotoxy(0, 0); - - /* A title (use "The" for non-uniques) */ - if (!(r_ptr->flags1 & (RF1_UNIQUE))) - { - Term_addstr( -1, TERM_WHITE, "The "); - } - - /* Dump the name */ - Term_addstr( -1, TERM_WHITE, (r_name + r_ptr->name)); - - /* Append the "standard" attr/char info */ - Term_addstr( -1, TERM_WHITE, " ('"); - Term_addch(a1, c1); - if (use_bigtile && (a1 & 0x80)) Term_addch(255, 255); - Term_addstr( -1, TERM_WHITE, "')"); - - /* Append the "optional" attr/char info */ - Term_addstr( -1, TERM_WHITE, "/('"); - Term_addch(a2, c2); - if (use_bigtile && (a2 & 0x80)) Term_addch(255, 255); - Term_addstr( -1, TERM_WHITE, "'):"); -} - - -/* - * Identify a character, allow recall of monsters - * - * Several "special" responses recall "multiple" monsters: - * ^A (all monsters) - * ^U (all unique monsters) - * ^N (all non-unique monsters) - * ^M (case insensitive name search) - * - * The responses may be sorted in several ways, see below. - * - * Note that the player ghosts are ignored. XXX XXX XXX - */ -void do_cmd_query_symbol(void) -{ - int i, n, r_idx; - - char sym, query; - - char buf[128]; - - - bool_ all = FALSE; - - bool_ uniq = FALSE; - - bool_ norm = FALSE; - - - bool_ name = FALSE; - - char temp[80] = ""; - - - bool_ recall = FALSE; - - - u16b why = 0; - - u16b *who; - - - /* Get a character, or abort */ - if (!get_com("Enter character to be identified, " - "or (Ctrl-A, Ctrl-U, Ctrl-N, Ctrl-M):", &sym)) return; - - /* Find that character info, and describe it */ - for (i = 0; ident_info[i]; ++i) - { - if (sym == ident_info[i][0]) break; - } - - /* Describe */ - if (sym == KTRL('A')) - { - all = TRUE; - strcpy(buf, "Full monster list."); - } - else if (sym == KTRL('U')) - { - all = uniq = TRUE; - strcpy(buf, "Unique monster list."); - } - else if (sym == KTRL('N')) - { - all = norm = TRUE; - strcpy(buf, "Non-unique monster list."); - } - else if (sym == KTRL('M')) - { - all = name = TRUE; - if (!get_string("Name:", temp, 70)) return; - strnfmt(buf, 128, "Monsters with a name \"%s\"", temp); - strlower(temp); - } - else if (ident_info[i]) - { - strnfmt(buf, 128, "%c - %s.", sym, ident_info[i] + 2); - } - else - { - strnfmt(buf, 128, "%c - %s.", sym, "Unknown Symbol"); - } - - /* Display the result */ - prt(buf, 0, 0); - - /* Allocate the "who" array */ - C_MAKE(who, max_r_idx, u16b); - - /* Collect matching monsters */ - for (n = 0, i = 1; i < max_r_idx; i++) - { - monster_race *r_ptr = &r_info[i]; - - /* Nothing to recall */ - if (!cheat_know && !r_ptr->r_sights) continue; - - /* Require non-unique monsters if needed */ - if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue; - - /* Require unique monsters if needed */ - if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue; - - /* Require monsters with the name requested if needed */ - if (name) - { - char mon_name[80]; - - strcpy(mon_name, r_name + r_ptr->name); - strlower(mon_name); - - if (!strstr(mon_name, temp)) continue; - } - - /* Collect "appropriate" monsters */ - if (all || (r_ptr->d_char == sym)) who[n++] = i; - } - - /* Nothing to recall */ - if (!n) - { - /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); - - return; - } - - - /* Prompt XXX XXX XXX */ - put_str("Recall details? (k/p/y/n): ", 0, 40); - - /* Query */ - query = inkey(); - - /* Restore */ - prt(buf, 0, 0); - - - /* Sort by kills (and level) */ - if (query == 'k') - { - why = 4; - query = 'y'; - } - - /* Sort by level */ - if (query == 'p') - { - why = 2; - query = 'y'; - } - - /* Catch "escape" */ - if (query != 'y') - { - /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); - - return; - } - - - /* Sort if needed */ - if (why) - { - /* Select the sort method */ - ang_sort_comp = ang_sort_comp_hook; - ang_sort_swap = ang_sort_swap_hook; - - /* Sort the array */ - ang_sort(who, &why, n); - } - - - /* Start at the end */ - i = n - 1; - - /* Scan the monster memory */ - while (1) - { - /* Extract a race */ - r_idx = who[i]; - - /* Hack -- Auto-recall */ - monster_race_track(r_idx, 0); - - /* Hack -- Handle stuff */ - handle_stuff(); - - /* Hack -- Begin the prompt */ - roff_top(r_idx); - - /* Hack -- Complete the prompt */ - Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC]"); - - /* Interact */ - while (1) - { - /* Recall */ - if (recall) - { - /* Save the screen */ - character_icky = TRUE; - Term_save(); - - /* Recall on screen */ - screen_roff(who[i], 0, 0); - - /* Hack -- Complete the prompt (again) */ - Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC]"); - } - - /* Command */ - query = inkey(); - - /* Unrecall */ - if (recall) - { - /* Restore */ - Term_load(); - character_icky = FALSE; - } - - /* Normal commands */ - if (query != 'r') break; - - /* Toggle recall */ - recall = !recall; - } - - /* Stop scanning */ - if (query == ESCAPE) break; - - /* Move to "prev" monster */ - if (query == '-') - { - if (++i == n) - { - i = 0; - if (!expand_list) break; - } - } - - /* Move to "next" monster */ - else - { - if (i-- == 0) - { - i = n - 1; - if (!expand_list) break; - } - } - } - - /* Re-display the identity */ - prt(buf, 0, 0); - - /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); -} - - -/* - * research_mon - * -KMW- - */ -bool_ research_mon() -{ - int i, n, r_idx; - - char sym, query; - - char buf[128]; - - - s16b oldkills; - - byte oldwake; - - bool_ oldcheat; - - - bool_ all = FALSE; - - bool_ uniq = FALSE; - - bool_ norm = FALSE; - - bool_ notpicked; - - - bool_ recall = FALSE; - - u16b why = 0; - - monster_race *r2_ptr; - - u16b *who; - - - /* Hack -- Remember "cheat_know" flag */ - oldcheat = cheat_know; - - - /* Get a character, or abort */ - if (!get_com("Enter character of monster: ", &sym)) return (TRUE); - - /* Allocate the "who" array */ - C_MAKE(who, max_r_idx, u16b); - - /* Find that character info, and describe it */ - for (i = 0; ident_info[i]; ++i) - { - if (sym == ident_info[i][0]) break; - } - - if (ident_info[i]) - { - strnfmt(buf, 128, "%c - %s.", sym, ident_info[i] + 2); - } - else - { - strnfmt(buf, 128, "%c - %s.", sym, "Unknown Symbol"); - } - - /* Display the result */ - prt(buf, 16, 10); - - - /* Collect matching monsters */ - for (n = 0, i = 1; i < max_r_idx; i++) - { - monster_race *r_ptr = &r_info[i]; - - /* Hack -- Force "cheat_know" */ - cheat_know = TRUE; - - /* Nothing to recall */ - if (!cheat_know && !r_ptr->r_sights) continue; - - /* Require non-unique monsters if needed */ - if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue; - - /* Require unique monsters if needed */ - if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue; - - /* Collect "appropriate" monsters */ - if (all || (r_ptr->d_char == sym)) who[n++] = i; - } - - /* Nothing to recall */ - if (!n) - { - /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); - - /* Restore the "cheat_know" flag */ - cheat_know = oldcheat; - - return (TRUE); - } - - - /* Sort by level */ - why = 2; - query = 'y'; - - /* Sort if needed */ - if (why) - { - /* Select the sort method */ - ang_sort_comp = ang_sort_comp_hook; - ang_sort_swap = ang_sort_swap_hook; - - /* Sort the array */ - ang_sort(who, &why, n); - } - - - /* Start at the end */ - i = n - 1; - - notpicked = TRUE; - - /* Scan the monster memory */ - while (notpicked) - { - /* Extract a race */ - r_idx = who[i]; - - /* Hack -- Auto-recall */ - monster_race_track(r_idx, 0); - - /* Hack -- Handle stuff */ - handle_stuff(); - - /* Hack -- Begin the prompt */ - roff_top(r_idx); - - /* Hack -- Complete the prompt */ - Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC, space to continue]"); - - /* Interact */ - while (1) - { - /* Recall */ - if (recall) - { - /* Save the screen */ - character_icky = TRUE; - Term_save(); - - /* Recall on screen */ - r2_ptr = &r_info[r_idx]; - - oldkills = r2_ptr->r_tkills; - oldwake = r2_ptr->r_wake; - screen_roff(who[i], 0, 1); - r2_ptr->r_tkills = oldkills; - r2_ptr->r_wake = oldwake; - r2_ptr->r_sights = 1; - cheat_know = oldcheat; - notpicked = FALSE; - break; - - } - - /* Command */ - query = inkey(); - - /* Unrecall */ - if (recall) - { - /* Restore */ - Term_load(); - character_icky = FALSE; - } - - /* Normal commands */ - if (query != 'r') break; - - /* Toggle recall */ - recall = !recall; - } - - /* Stop scanning */ - if (query == ESCAPE) break; - - /* Move to "prev" monster */ - if (query == '-') - { - if (++i == n) - { - i = 0; - if (!expand_list) break; - } - } - - /* Move to "next" monster */ - else - { - if (i-- == 0) - { - i = n - 1; - if (!expand_list) break; - } - } - } - - - /* Re-display the identity */ - /* prt(buf, 5, 5);*/ - - /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); - - /* Restore the "cheat_know" flag */ - cheat_know = oldcheat; - - return (notpicked); -} - - -/* - * Try to "sense" the grid's mana - */ -bool_ do_cmd_sense_grid_mana() -{ - int chance, i; - - - /* Take (a lot of) time */ - energy_use = 200; - - /* Base chance of success */ - chance = p_ptr->skill_dev; - - /* Confusion hurts skill */ - if (p_ptr->confused) chance = chance / 2; - - /* Hight mana grids are harder */ - chance = chance - (cave[p_ptr->py][p_ptr->px].mana / 10); - - /* Give everyone a (slight) chance */ - if ((chance < USE_DEVICE) && (rand_int(USE_DEVICE - chance + 1) == 0)) - { - chance = USE_DEVICE; - } - - /* Roll for usage */ - if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE)) - { - if (flush_failure) flush(); - msg_print("You failed to sense the grid's mana."); - sound(SOUND_FAIL); - return FALSE; - } - - /* Try to give an "average" value */ - i = (101 - p_ptr->skill_dev) / 2; - i = (i < 1) ? 1 : (i > 50) ? 50 : i; - - if (wizard) - { - msg_format("Grid's mana: %d.", cave[p_ptr->py][p_ptr->px].mana); - msg_format("Average grid's mana: %d.", (cave[p_ptr->py][p_ptr->px].mana / i) * i); - } - else - { - msg_format("Average Area's mana: %d", (cave[p_ptr->py][p_ptr->px].mana / i) * i); - } - return TRUE; -} - - -/* - * Calculate the weight of the portable holes - */ -s32b portable_hole_weight(void) -{ - s32b weight, i; - - store_type *st_ptr = &town_info[TOWN_RANDOM].store[STORE_HOME]; - - - /* Sum the objects in the appropriate home */ - for (i = 0, weight = 0; i < st_ptr->stock_num; i++) - { - object_type *o_ptr = &st_ptr->stock[i]; - - weight += (o_ptr->weight * o_ptr->number); - } - - /* Multiply the sum with 1.5 */ - weight = (weight * 3) / 2 + 2; - - return (weight); -} - - -/* - * Calculate and set the weight of the portable holes - */ -void set_portable_hole_weight(void) -{ - s32b weight, i, j; - - /* Calculate the weight of items in home */ - weight = portable_hole_weight(); - - /* Set the weight of portable holes in the shops, ... */ - for (i = 1; i < max_towns; i++) - { - for (j = 0; j < max_st_idx; j++) - { - store_type *st_ptr = &town_info[i].store[j]; - int k; - - for (k = 0; k < st_ptr->stock_num; k++) - { - object_type *o_ptr = &st_ptr->stock[k]; - - if ((o_ptr->tval == TV_TOOL) && - (o_ptr->sval == SV_PORTABLE_HOLE)) - o_ptr->weight = weight; - } - } - } - - /* ... in the object list, ... */ - for (i = 1; i < o_max; i++) - { - object_type *o_ptr = &o_list[i]; - - if ((o_ptr->tval == TV_TOOL) && - (o_ptr->sval == SV_PORTABLE_HOLE)) o_ptr->weight = weight; - } - - /* ... and in the p_ptr->inventory to the appropriate value */ - for (i = 0; i < INVEN_TOTAL; i++) - { - object_type *o_ptr = &p_ptr->inventory[i]; - - /* Skip non-objects */ - if ((o_ptr->tval == TV_TOOL) && - (o_ptr->sval == SV_PORTABLE_HOLE)) o_ptr->weight = weight; - } -} - - -/* - * Use a portable hole - */ -void do_cmd_portable_hole(void) -{ - cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px]; - - int feat, special, town_num; - - /* Is it currently wielded? */ - if (!p_ptr->inventory[INVEN_TOOL].k_idx || - (p_ptr->inventory[INVEN_TOOL].tval != TV_TOOL) || - (p_ptr->inventory[INVEN_TOOL].sval != SV_PORTABLE_HOLE)) - { - /* No, it isn't */ - msg_print("You have to wield a portable hole to use your abilities"); - return; - } - - /* Mega-hack: Saving the old values, and then... */ - feat = c_ptr->feat; - special = c_ptr->special; - town_num = p_ptr->town_num; - - /* ... change the current grid to the home in town #1 */ - /* DG -- use the first random town, since random towns cannot have houses */ - /* - * pelpel -- This doesn't affect LoS, so we can manipulate - * terrain feature without calling cave_set_feat() - */ - c_ptr->feat = FEAT_SHOP; - c_ptr->special = STORE_HOME; - p_ptr->town_num = TOWN_RANDOM; - - /* Now use the portable hole */ - do_cmd_store(); - - /* Mega-hack part II: change the current grid to the original value */ - c_ptr->feat = feat; - c_ptr->special = special; - p_ptr->town_num = town_num; - - set_portable_hole_weight(); - - /* Recalculate bonuses */ - p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); - p_ptr->update |= (PU_BONUS); -} - - -/* - * Try to add a CLI action. - */ -void cli_add(cptr active, cptr trigger, cptr descr) -{ - s16b num; - cli_comm *cli_ptr, *old_ptr; - - /* Too many macros. */ - if (cli_total >= CLI_MAX) return; - - /* First try to read active as a number. */ - if (strtol(active, 0, 0)) - { - num = strtol(active, 0, 0); - } - /* Then try to read it as a character. */ - else if (strlen(active) == 1) - { - num = active[0]; - } - /* Give up if it doesn't work. */ - else - { - return; - } - - /* Dump the macro. */ - cli_ptr = cli_info + cli_total; - old_ptr = cli_info + cli_total - 1; - - /* - * Trim 's from the ends of a token. This turns '@' into @ and - * ''' into '. This may be the intent of the code in tokenize(), - * but I've left it for lack of comments to back me up. - */ - if (strchr(trigger, '\'')) - { - char temp[80], *t; - cptr s; - for (s = trigger, t = temp; ; s++, t++) - { - /* tokenize() causes each ' to be followed by another character, - * and then another '. Trim the 's here. */ - if (*s == '\'') - { - *t = *(++s); - s++; - } - else - { - *t = *s; - } - if (*t == '\0') break; - } - cli_ptr->comm = string_make(temp); - } - else - { - cli_ptr->comm = string_make(trigger); - } - - /* First try copying everything across. */ - cli_ptr->key = num; - cli_ptr->descrip = string_make(descr); - - /* Take description for the previous record if appropriate. */ - if ((cli_total > 0) && (old_ptr->key == cli_ptr->key) && (cli_ptr->descrip == 0)) - { - cli_ptr->descrip = old_ptr->descrip; - } - - /* Accept the macro. */ - if (cli_ptr->key && cli_ptr->comm && cli_ptr->descrip) cli_total++; -} - - - -/* - * Get a string using CLI completion. - */ -bool_ get_string_cli(cptr prompt, char *buf, int len) -{ - bool_ res; - - - /* Paranoia XXX XXX XXX */ - msg_print(NULL); - - /* Display prompt */ - prt(prompt, 0, 0); - - /* Ask the user for a string */ - askfor_aux_complete = TRUE; - res = askfor_aux(buf, len); - askfor_aux_complete = FALSE; - - /* Clear prompt */ - prt("", 0, 0); - - /* Result */ - return (res); -} - - -/* - * Do a command line command - * - * This is a wrapper around process command to provide a "reverse keymap" - * whereby a set of keypresses is mapped to one. - * - * This is useful because command_cmd is a s16b, and so allows each command a - * unique representation. - * - * See defines.h for a list of the codes used. - */ -void do_cmd_cli(void) -{ - char buff[80]; - - cli_comm *cli_ptr; - - /* Clear the input buffer */ - strcpy(buff, ""); - - /* Accept command */ - if (!get_string_cli("Command: ", buff, 30)) return; - - - /* Analyse the input */ - for (cli_ptr = cli_info; cli_ptr->comm; cli_ptr++) - { - if (!strcmp(buff, cli_ptr->comm)) - { - /* Process the command without keymaps or macros. */ - command_new = cli_ptr->key; - return; - } - } - - msg_format("No such command: %s", buff); -} - - -/* - * Display on-line help for the CLI commands - */ -void do_cmd_cli_help() -{ - int i, j; - - FILE *fff; - - char file_name[1024]; - - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; - - /* Open a new file */ - fff = my_fopen(file_name, "w"); - - for (i = 0, j = -1; i < cli_total; i++) - { - if (j < i - 1) fprintf(fff, "/"); - fprintf(fff, "[[[[[G%s]", cli_info[i].comm); - if (cli_info[i].descrip != cli_info[i + 1].descrip) - { - fprintf(fff, " %s\n", cli_info[i].descrip); - j = i; - } - } - - /* Close the file */ - my_fclose(fff); - - /* Enter "icky" mode */ - character_icky = TRUE; - - /* Save the screen */ - Term_save(); - - /* Display the file contents */ - show_file(file_name, "Command line help", 0, 0); - - /* Restore the screen */ - Term_load(); - - /* Leave "icky" mode */ - character_icky = FALSE; - - /* Remove the file */ - fd_kill(file_name); -} - - -/* - * Dump screen shot in HTML - */ -void do_cmd_html_dump() -{ - char tmp_val[81]; - bool_ html = TRUE; - term_win *save; - - /* Save the screen */ - save = Term_save_to(); - - if (wizard && get_check("WIZARD MODE: Do an help file dump?")) - html = FALSE; - - /* Ask for a file */ - if (html) - { - strcpy(tmp_val, "dummy.htm"); - if (!get_string("File(you can post it to http://angband.oook.cz/): ", tmp_val, 80)) - { - /* Now restore the screen to initial state */ - Term_load_from(save, TRUE); - Term_fresh(); - return; - } - } - else - { - strcpy(tmp_val, "dummy.txt"); - if (!get_string("File: ", tmp_val, 80)) - { - /* Now restore the screen to initial state */ - Term_load_from(save, TRUE); - Term_fresh(); - return; - } - } - - /* Now restore the screen to dump it */ - Term_load_from(save, TRUE); - - if (html) - html_screenshot(tmp_val); - else - help_file_screenshot(tmp_val); - - Term_erase(0, 0, 255); - msg_print("Dump saved."); - Term_fresh(); - fix_message(); -} |