-+-+-+-+-+-+-+-+ START OF PART 42 -+-+-+-+-+-+-+-+ Xstatic int scr_state, scr_left, scr_base; Xstatic int wear_low, wear_high; X X/* Draw the inventory screen. */ Xstatic void inven_screen(new_scr) Xint new_scr; X`7B X register int line; X X if (new_scr != scr_state) X `7B X scr_state = new_scr; X switch(new_scr) X`09`7B X`09case BLANK_SCR: X`09 line = 0; X`09 break; X`09case HELP_SCR: X`09 if (scr_left > 52) X`09 scr_left = 52; X`09 prt(" ESC: exit", 1, scr_left); X`09 prt(" w : wear or wield object", 2, scr_left); X`09 prt(" t : take off item", 3, scr_left); X`09 prt(" d : drop object", 4, scr_left); X`09 prt(" x : exchange weapons", 5, scr_left); X`09 prt(" i : inventory of pack", 6, scr_left); X`09 prt(" e : list used equipment", 7, scr_left); X`09 line = 7; X`09 break; X`09case INVEN_SCR: X`09 scr_left = show_inven(0, inven_ctr - 1, show_weight_flag, scr_left, X`09`09`09`09CNIL); X`09 line = inven_ctr; X`09 break; X`09case WEAR_SCR: X`09 scr_left = show_inven(wear_low, wear_high, show_weight_flag, X`09`09`09`09scr_left, CNIL); X`09 line = wear_high - wear_low + 1; X`09 break; X`09case EQUIP_SCR: X`09 scr_left = show_equip(show_weight_flag, scr_left); X`09 line = equip_ctr; X`09 break; X`09`7D X if (line >= scr_base) X`09`7B X`09 scr_base = line + 1; X`09 erase_line(scr_base, scr_left); X`09`7D X else X`09`7B X`09 while (++line <= scr_base) X`09 erase_line(line, scr_left); X`09`7D X `7D X`7D X X/* This does all the work. */ Xvoid inven_command(command) Xchar command; X`7B X register int slot, item; X int tmp, tmp2, selecting, from, to; X char *prompt, *swap, *disp, *string; X char which, query; X bigvtype prt1, prt2; X register inven_type *i_ptr; X inven_type tmp_obj; X#ifdef ATARIST_MWC X int32u holder; X#endif X X free_turn_flag = TRUE; X save_screen(); X /* Take up where we left off after a previous inventory command. -CJS- */ X if (doing_inven) X `7B X /* If the screen has been flushed, we need to redraw. If the command i Vs X`09 a simple ' ' to recover the screen, just quit. Otherwise, check and X`09 see what the user wants. */ X if (screen_change) X`09`7B X`09 if (command == ' ' `7C`7C !get_check("Continuing with inventory command V?")) X`09 `7B X`09 doing_inven = FALSE; X`09 return; X`09 `7D X`09 scr_left = 50; X`09 scr_base = 0; X`09`7D X tmp = scr_state; X scr_state = WRONG_SCR; X inven_screen(tmp); X `7D X else X `7B X scr_left = 50; X scr_base = 0; X /* this forces exit of inven_command() if selecting is not set true */ X scr_state = BLANK_SCR; X `7D X do X `7B X if (isupper((int)command)) X`09command = tolower((int)command); X X /* Simple command getting and screen selection. */ X selecting = FALSE; X switch(command) X`09`7B X`09case 'i':`09 /* Inventory`09 */ X`09 if (inven_ctr == 0) X`09 msg_print("You are not carrying anything."); X`09 else X`09 inven_screen(INVEN_SCR); X`09 break; X`09case 'e':`09 /* Equipment`09 */ X`09 if (equip_ctr == 0) X`09 msg_print("You are not using any equipment."); X`09 else X`09 inven_screen(EQUIP_SCR); X`09 break; X`09case 't':`09 /* Take off`09 */ X`09 if (equip_ctr == 0) X`09 msg_print("You are not using any equipment."); X`09 /* don't print message restarting inven command after taking off X`09 something, it is confusing */ X`09 else if (inven_ctr >= INVEN_WIELD && !doing_inven) X`09 msg_print("You will have to drop something first."); X`09 else X`09 `7B X`09 if (scr_state != BLANK_SCR) X`09`09inven_screen(EQUIP_SCR); X`09 selecting = TRUE; X`09 `7D X`09 break; X`09case 'd':`09`09/* Drop */ X`09 if (inven_ctr == 0 && equip_ctr == 0) X`09 msg_print("But you're not carrying anything."); X`09 else if (cave`5Bchar_row`5D`5Bchar_col`5D.tptr != 0) X`09 msg_print("There's no room to drop anything here."); X`09 else X`09 `7B X`09 selecting = TRUE; X`09 if ((scr_state == EQUIP_SCR && equip_ctr > 0) `7C`7C inven_ctr == 0 V) X`09`09`7B X`09`09 if (scr_state != BLANK_SCR) X`09`09 inven_screen(EQUIP_SCR); X`09`09 command = 'r';`09/* Remove - or take off and drop. */ X`09`09`7D X`09 else if (scr_state != BLANK_SCR) X`09`09inven_screen(INVEN_SCR); X`09 `7D X`09 break; X`09case 'w':`09 /* Wear/wield`09 */ X`09 for (wear_low = 0; X`09 wear_low < inven_ctr && inventory`5Bwear_low`5D.tval > TV_MAX_WEAR V; X`09 wear_low++) X`09 ; X`09 for(wear_high = wear_low; X`09 wear_high < inven_ctr && inventory`5Bwear_high`5D.tval >=TV_MIN_WEA VR; X`09 wear_high++) X`09 ; X`09 wear_high--; X`09 if (wear_low > wear_high) X`09 msg_print("You have nothing to wear or wield."); X`09 else X`09 `7B X`09 if (scr_state != BLANK_SCR && scr_state != INVEN_SCR) X`09`09inven_screen(WEAR_SCR); X`09 selecting = TRUE; X`09 `7D X`09 break; X`09case 'x': X`09 if (inventory`5BINVEN_WIELD`5D.tval == TV_NOTHING && X`09 inventory`5BINVEN_AUX`5D.tval == TV_NOTHING) X`09 msg_print("But you are wielding no weapons."); X#ifdef ATARIST_MWC X`09 else if ((holder = TR_CURSED) & inventory`5BINVEN_WIELD`5D.flags) X#else X`09 else if (TR_CURSED & inventory`5BINVEN_WIELD`5D.flags) X#endif X`09 `7B X`09 objdes(prt1, &inventory`5BINVEN_WIELD`5D, FALSE); X`09 (void) sprintf(prt2, X`09`09 "The %s you are wielding appears to be cursed.", prt1); X`09 msg_print(prt2); X`09 `7D X`09 else X`09 `7B X`09 free_turn_flag = FALSE; X`09 tmp_obj = inventory`5BINVEN_AUX`5D; X`09 inventory`5BINVEN_AUX`5D = inventory`5BINVEN_WIELD`5D; X`09 inventory`5BINVEN_WIELD`5D = tmp_obj; X`09 if (scr_state == EQUIP_SCR) X`09`09scr_left = show_equip(show_weight_flag, scr_left); X`09 py_bonuses(&inventory`5BINVEN_AUX`5D, -1);`09 /* Subtract bonuses * V/ X`09 py_bonuses(&inventory`5BINVEN_WIELD`5D, 1);`09 /* Add bonuses V */ X`09 if (inventory`5BINVEN_WIELD`5D.tval != TV_NOTHING) X`09`09`7B X`09`09 (void) strcpy(prt1, "Primary weapon : "); X`09`09 objdes(prt2, &inventory`5BINVEN_WIELD`5D, TRUE); X`09`09 msg_print(strcat(prt1, prt2)); X`09`09`7D X`09 else X`09`09msg_print("No primary weapon."); X`09 /* this is a new weapon, so clear the heavy flag */ X`09 weapon_heavy = FALSE; X`09 check_strength(); X`09 `7D X`09 break; X`09case ' ':`09/* Dummy command to return again to main prompt. */ X`09 break; X`09case '?': X`09 inven_screen(HELP_SCR); X`09 break; X`09default: X`09 /* Nonsense command`09`09`09`09`09 */ X`09 bell(); X`09 break; X`09`7D X X /* Clear the doing_inven flag here, instead of at beginning, so that X`09 can use it to control when messages above appear. */ X doing_inven = 0; X X /* Keep looking for objects to drop/wear/take off/throw off */ X which = 'z'; X while (selecting && free_turn_flag) X`09`7B X`09 swap = ""; X`09 if (command == 'w') X`09 `7B X`09 from = wear_low; X`09 to = wear_high; X`09 prompt = "Wear/Wield"; X`09 `7D X`09 else X`09 `7B X`09 from = 0; X`09 if (command == 'd') X`09`09`7B X`09`09 to = inven_ctr - 1; X`09`09 prompt = "Drop"; X`09`09 if (equip_ctr > 0) X`09`09 swap = ", / for Equip"; X`09`09`7D X`09 else X`09`09`7B X`09`09 to = equip_ctr - 1; X`09`09 if (command == 't') X`09`09 prompt = "Take off"; X`09`09 else`09/* command == 'r' */ X`09`09 `7B X`09`09 prompt = "Throw off"; X`09`09 if (inven_ctr > 0) X`09`09`09swap = ", / for Inven"; X`09`09 `7D X`09`09`7D X`09 `7D X`09 if (from > to) X`09 selecting = FALSE; X`09 else X`09 `7B X`09 if (scr_state == BLANK_SCR) X`09`09disp = ", * to list"; X`09 else X`09`09disp = ""; X`09 (void) sprintf(prt1, X`09`09 "(%c-%c%s%s, space to break, ESC to exit) %s which one?", X`09`09 from+'a', to+'a', disp, swap, prompt); X X`09 /* Abort everything. */ X`09 if (!get_com(prt1, &which)) X`09`09`7B X`09`09 selecting = FALSE; X`09`09 which = ESCAPE; X`09`09`7D X`09 /* Draw the screen and maybe exit to main prompt. */ X`09 else if (which == ' ' `7C`7C which == '*') X`09`09`7B X`09`09 if (command == 't' `7C`7C command == 'r') X`09`09 inven_screen(EQUIP_SCR); X`09`09 else if (command == 'w' && scr_state != INVEN_SCR) X`09`09 inven_screen(WEAR_SCR); X`09`09 else X`09`09 inven_screen(INVEN_SCR); X`09`09 if (which == ' ') X`09`09 selecting = FALSE; X`09`09`7D X`09 /* Swap screens (for drop) */ X`09 else if (which == '/' && swap`5B0`5D) X`09`09`7B X`09`09 if (command == 'd') X`09`09 command = 'r'; X`09`09 else X`09`09 command = 'd'; X`09`09 if (scr_state == EQUIP_SCR) X`09`09 inven_screen(INVEN_SCR); X`09`09 else if (scr_state == INVEN_SCR) X`09`09 inven_screen(EQUIP_SCR); X`09`09`7D X`09 else if ((which < from + 'a' `7C`7C which > to + 'a') X`09`09 && (which < from + 'A' `7C`7C which > to + 'A')) X`09`09bell(); X`09 else /* Found an item! */ X`09`09`7B X`09`09 if (isupper((int)which)) X`09`09 item = which - 'A'; X`09`09 else X`09`09 item = which - 'a'; X`09`09 if (command == 'r' `7C`7C command == 't') X`09`09 `7B X`09`09 /* Get its place in the equipment list. */ X`09`09 tmp = item; X`09`09 item = 21; X`09`09 do X`09`09`09`7B X`09`09`09 item++; X`09`09`09 if (inventory`5Bitem`5D.tval != TV_NOTHING) X`09`09`09 tmp--; X`09`09`09`7D X`09`09 while (tmp >= 0); X`09`09 if (isupper((int)which) && !verify(prompt, item)) X`09`09`09item = -1; X#ifdef ATARIST_MWC X`09`09 else if ((holder = TR_CURSED) & inventory`5Bitem`5D.flags) X#else X`09`09 else if (TR_CURSED & inventory`5Bitem`5D.flags) X#endif X`09`09`09`7B X`09`09`09 msg_print("Hmmm, it seems to be cursed."); X`09`09`09 item = -1; X`09`09`09`7D X`09`09 else if (command == 't' && X`09`09`09 !inven_check_num(&inventory`5Bitem`5D)) X`09`09`09`7B X`09`09`09 if (cave`5Bchar_row`5D`5Bchar_col`5D.tptr != 0) X`09`09`09 `7B X`09`09`09 msg_print("You can't carry it."); X`09`09`09 item = -1; X`09`09`09 `7D X`09`09`09 else if (get_check("You can't carry it. Drop it?")) X`09`09`09 command = 'r'; X`09`09`09 else X`09`09`09 item = -1; X`09`09`09`7D X`09`09 if (item >= 0) X`09`09`09`7B X`09`09`09 if (command == 'r') X`09`09`09 `7B X`09`09`09 inven_drop(item, TRUE); X`09`09`09 /* As a safety measure, set the player's inven X`09`09`09`09 weight to 0, when the last object is dropped*/ X`09`09`09 if (inven_ctr == 0 && equip_ctr == 0) X`09`09`09`09inven_weight = 0; X`09`09`09 `7D X`09`09`09 else X`09`09`09 `7B X`09`09`09 slot = inven_carry(&inventory`5Bitem`5D); X`09`09`09 takeoff(item, slot); X`09`09`09 `7D X`09`09`09 check_strength(); X`09`09`09 free_turn_flag = FALSE; X`09`09`09 if (command == 'r') X`09`09`09 selecting = FALSE; X`09`09`09`7D X`09`09 `7D X`09`09 else if (command == 'w') X`09`09 `7B X`09`09 /* Wearing. Go to a bit of trouble over replacing X`09`09`09 existing equipment. */ X`09`09 if (isupper((int)which) && !verify(prompt, item)) X`09`09`09item = -1; X`09`09 else switch(inventory`5Bitem`5D.tval) X`09`09`09`7B /* Slot for equipment`09 */ X`09`09`09case TV_SLING_AMMO: case TV_BOLT: case TV_ARROW: X`09`09`09case TV_BOW: case TV_HAFTED: case TV_POLEARM: X`09`09`09case TV_SWORD: case TV_DIGGING: case TV_SPIKE: X`09`09`09 slot = INVEN_WIELD; break; X`09`09`09case TV_LIGHT: slot = INVEN_LIGHT; break; X`09`09`09case TV_BOOTS: slot = INVEN_FEET; break; X`09`09`09case TV_GLOVES: slot = INVEN_HANDS; break; X`09`09`09case TV_CLOAK: slot = INVEN_OUTER; break; X`09`09`09case TV_HELM: slot = INVEN_HEAD; break; X`09`09`09case TV_SHIELD: slot = INVEN_ARM; break; X`09`09`09case TV_HARD_ARMOR: case TV_SOFT_ARMOR: X`09`09`09 slot = INVEN_BODY; break; X`09`09`09case TV_AMULET: slot = INVEN_NECK; break; X`09`09`09case TV_RING: X`09`09`09 if (inventory`5BINVEN_RIGHT`5D.tval == TV_NOTHING) X`09`09`09 slot = INVEN_RIGHT; X`09`09`09 else if (inventory`5BINVEN_LEFT`5D.tval == TV_NOTHING) X`09`09`09 slot = INVEN_LEFT; X`09`09`09 else X`09`09`09 `7B X`09`09`09 slot = 0; X`09`09`09 /* Rings. Give some choice over where they go. */ X`09`09`09 do X`09`09`09`09`7B X`09`09`09`09 if (!get_com( X`09`09`09 "Put ring on which hand (l/r/L/R)?", &query)) X`09`09`09`09 `7B X`09`09`09`09 item = -1; X`09`09`09`09 slot = -1; X`09`09`09`09 `7D X`09`09`09`09 else if (query == 'l') X`09`09`09`09 slot = INVEN_LEFT; X`09`09`09`09 else if (query == 'r') X`09`09`09`09 slot = INVEN_RIGHT; X`09`09`09`09 else X`09`09`09`09 `7B X`09`09`09`09 if (query == 'L') X`09`09`09`09`09slot = INVEN_LEFT; X`09`09`09`09 else if (query == 'R') X`09`09`09`09`09slot = INVEN_RIGHT; X`09`09`09`09 else X`09`09`09`09`09bell(); X`09`09`09`09 if (slot && !verify("Replace", slot)) X`09`09`09`09`09slot = 0; X`09`09`09`09 `7D X`09`09`09`09`7D X`09`09`09 while(slot == 0); X`09`09`09 `7D X`09`09`09 break; X`09`09`09default: X`09`09 msg_print("IMPOSSIBLE: I don't see how you can use that."); X`09`09`09 item = -1; X`09`09`09 break; X`09`09`09`7D X`09`09 if (item >= 0 && inventory`5Bslot`5D.tval != TV_NOTHING) X`09`09`09`7B X#ifdef ATARIST_MWC X`09`09`09 if ((holder = TR_CURSED) & inventory`5Bslot`5D.flags) X#else X`09`09`09 if (TR_CURSED & inventory`5Bslot`5D.flags) X#endif X`09`09`09 `7B X`09`09`09 objdes(prt1, &inventory`5Bslot`5D, FALSE); X`09`09`09 (void) sprintf(prt2, "The %s you are ", prt1); X`09`09`09 if (slot == INVEN_HEAD) X`09`09`09`09(void) strcat(prt2, "wielding "); X`09`09`09 else X`09`09`09`09(void) strcat(prt2, "wearing "); X`09`09`09 msg_print(strcat(prt2, "appears to be cursed.")); X`09`09`09 item = -1; X`09`09`09 `7D X`09`09`09 else if (inventory`5Bitem`5D.subval == ITEM_GROUP_MIN && X`09`09`09`09 inventory`5Bitem`5D.number > 1 && X`09`09`09`09 !inven_check_num(&inventory`5Bslot`5D)) X`09`09`09 `7B X`09`09`09 /* this can happen if try to wield a torch, and X`09`09`09`09 have more than one in your inventory */ X`09`09`09 msg_print("You will have to drop something first."); +-+-+-+-+-+-+-+- END OF PART 42 +-+-+-+-+-+-+-+-