From 369adcc1d1cccb46ebe4b72a5de1f6639abff3cc Mon Sep 17 00:00:00 2001 From: Hourier Date: Fri, 10 Jan 2020 23:42:11 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#38997=20inven=5Fitem=5Fincrease()?= =?utf8?q?=E3=80=81inven=5Ftakeoff()=20=E3=81=ABplayer=5Ftype=20*=E5=BC=95?= =?utf8?q?=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0=EF=BC=86=E5=B0=91=E3=81=97?= =?utf8?q?=E6=95=B4=E5=BD=A2=20/=20Added=20player=5Ftype=20*argument=20to?= =?utf8?q?=20inven=5Fitem=5Fincrease()=20and=20inven=5Ftakeoff()=20and=20r?= =?utf8?q?eshaped=20code=20a=20little?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/autopick.c | 44 +++++++++++++--------------- src/autopick.h | 2 +- src/birth.c | 2 +- src/bldg.c | 33 +++++++++++---------- src/cmd/cmd-basic.c | 2 +- src/cmd/cmd-item.c | 82 ++++++++++++++++++++++++++--------------------------- src/combat/melee1.c | 5 ++-- src/object.h | 4 +-- src/object2.c | 56 ++++++++++++++++-------------------- src/player-damage.c | 2 +- src/player-status.c | 3 +- src/spells-status.c | 2 +- src/spells3.c | 2 +- src/store.c | 2 +- 14 files changed, 115 insertions(+), 126 deletions(-) diff --git a/src/autopick.c b/src/autopick.c index f31aa92aa..e9c2d137f 100644 --- a/src/autopick.c +++ b/src/autopick.c @@ -1628,49 +1628,45 @@ static void auto_destroy_item(object_type *o_ptr, int autopick_idx) /* Destroy Later */ o_ptr->marked |= OM_AUTODESTROY; p_ptr->update |= PU_AUTODESTROY; - - return; } /* * Auto-destroy marked item */ -static void autopick_delayed_alter_aux(floor_type *floor_ptr, INVENTORY_IDX item) +static void autopick_delayed_alter_aux(player_type *player_ptr, INVENTORY_IDX item) { object_type *o_ptr; - o_ptr = REF_ITEM(p_ptr, p_ptr->current_floor_ptr, item); - if (o_ptr->k_idx && (o_ptr->marked & OM_AUTODESTROY)) - { - GAME_TEXT o_name[MAX_NLEN]; + if (o_ptr->k_idx == 0 || !(o_ptr->marked & OM_AUTODESTROY)) return; - /* Describe the object (with {terrible/special}) */ - object_desc(o_name, o_ptr, 0); + GAME_TEXT o_name[MAX_NLEN]; - /* Eliminate the item (from the pack) */ - if (item >= 0) - { - inven_item_increase(item, -(o_ptr->number)); - inven_item_optimize(item); - } + /* Describe the object (with {terrible/special}) */ + object_desc(o_name, o_ptr, 0); - /* Eliminate the item (from the floor) */ - else - { - delete_object_idx(floor_ptr, 0 - item); - } + /* Eliminate the item (from the pack) */ + if (item >= 0) + { + inven_item_increase(player_ptr, item, -(o_ptr->number)); + inven_item_optimize(item); + } - msg_format(_("%sを自動破壊します。", "Auto-destroying %s."), o_name); + /* Eliminate the item (from the floor) */ + else + { + delete_object_idx(player_ptr->current_floor_ptr, 0 - item); } + + msg_format(_("%sを自動破壊します。", "Auto-destroying %s."), o_name); } /* * Auto-destroy marked items in inventry and on floor */ -void autopick_delayed_alter(floor_type *floor_ptr) +void autopick_delayed_alter(player_type *owner_ptr) { INVENTORY_IDX item; @@ -1679,14 +1675,14 @@ void autopick_delayed_alter(floor_type *floor_ptr) * skipping after inven_item_optimize() */ for (item = INVEN_TOTAL - 1; item >= 0 ; item--) - autopick_delayed_alter_aux(floor_ptr, item); + autopick_delayed_alter_aux(owner_ptr, item); /* Scan the pile of objects */ item = p_ptr->current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].o_idx; while (item) { OBJECT_IDX next = p_ptr->current_floor_ptr->o_list[item].next_o_idx; - autopick_delayed_alter_aux(floor_ptr, -item); + autopick_delayed_alter_aux(owner_ptr, -item); item = next; } } diff --git a/src/autopick.h b/src/autopick.h index 0bab06d4f..6afcf84aa 100644 --- a/src/autopick.h +++ b/src/autopick.h @@ -33,7 +33,7 @@ extern errr process_autopick_file_command(char *buf); extern concptr autopick_line_from_entry(autopick_type *entry); extern int is_autopick(object_type *o_ptr); extern void autopick_alter_item(INVENTORY_IDX item, bool destroy); -extern void autopick_delayed_alter(floor_type *floor_ptr); +extern void autopick_delayed_alter(player_type *player_ptr); extern void autopick_pickup_items(grid_type *g_ptr); extern bool autopick_autoregister(object_type *o_ptr); extern void do_cmd_edit_autopick(player_type *player_ptr); diff --git a/src/birth.c b/src/birth.c index 4b54a0471..d2dd46b1c 100644 --- a/src/birth.c +++ b/src/birth.c @@ -1986,7 +1986,7 @@ static void wield_all(player_type *creature_ptr) /* Decrease the item (from the pack) */ if (item >= 0) { - inven_item_increase(item, -1); + inven_item_increase(creature_ptr, item, -1); inven_item_optimize(item); } diff --git a/src/bldg.c b/src/bldg.c index 7f81b33c0..c246d7f64 100644 --- a/src/bldg.c +++ b/src/bldg.c @@ -2873,26 +2873,23 @@ static void give_one_ability_of_object(object_type *to_ptr, object_type *from_pt } } - if (n > 0) - { - int bmax; - int tr_idx = cand[randint0(n)]; - add_flag(to_ptr->art_flags, tr_idx); - if (is_pval_flag(tr_idx)) to_ptr->pval = MAX(to_ptr->pval, 1); - bmax = MIN(3, MAX(1, 40 / (to_ptr->dd * to_ptr->ds))); - if (tr_idx == TR_BLOWS) to_ptr->pval = MIN(to_ptr->pval, bmax); - if (tr_idx == TR_SPEED) to_ptr->pval = MIN(to_ptr->pval, 4); - } - - return; + if (n <= 0) return; + + int tr_idx = cand[randint0(n)]; + add_flag(to_ptr->art_flags, tr_idx); + if (is_pval_flag(tr_idx)) to_ptr->pval = MAX(to_ptr->pval, 1); + int bmax = MIN(3, MAX(1, 40 / (to_ptr->dd * to_ptr->ds))); + if (tr_idx == TR_BLOWS) to_ptr->pval = MIN(to_ptr->pval, bmax); + if (tr_idx == TR_SPEED) to_ptr->pval = MIN(to_ptr->pval, 4); } /*! * @brief アイテム修復処理のメインルーチン / Repair broken weapon + * @param player_ptr プレーヤーへの参照ポインタ * @param bcost 基本修復費用 * @return 実際にかかった費用 */ -static PRICE repair_broken_weapon_aux(PRICE bcost) +static PRICE repair_broken_weapon_aux(player_type *player_ptr, PRICE bcost) { PRICE cost; OBJECT_IDX item, mater; @@ -3126,7 +3123,7 @@ static PRICE repair_broken_weapon_aux(PRICE bcost) calc_android_exp(p_ptr); /* Decrease material object */ - inven_item_increase(mater, -1); + inven_item_increase(player_ptr, mater, -1); inven_item_optimize(mater); /* Copyback */ @@ -3139,14 +3136,15 @@ static PRICE repair_broken_weapon_aux(PRICE bcost) /*! * @brief アイテム修復処理の過渡ルーチン / Repair broken weapon + * @param player_ptr プレーヤーへの参照ポインタ * @param bcost 基本鑑定費用 * @return 実際にかかった費用 */ -static int repair_broken_weapon(PRICE bcost) +static int repair_broken_weapon(player_type *player_ptr, PRICE bcost) { PRICE cost; screen_save(); - cost = repair_broken_weapon_aux(bcost); + cost = repair_broken_weapon_aux(player_ptr, bcost); screen_load(); return cost; } @@ -4053,13 +4051,14 @@ static void bldg_process_command(player_type *player_ptr, building_type *bldg, i case BACT_BROKEN_WEAPON: paid = TRUE; - bcost = repair_broken_weapon(bcost); + bcost = repair_broken_weapon(player_ptr, bcost); break; } if (paid) player_ptr->au -= bcost; } + /*! * @brief 施設入り口にプレイヤーが乗った際の処理 / Do building commands * @param プレーヤーへの参照ポインタ diff --git a/src/cmd/cmd-basic.c b/src/cmd/cmd-basic.c index 5b4e17593..2d8b9b03f 100644 --- a/src/cmd/cmd-basic.c +++ b/src/cmd/cmd-basic.c @@ -2463,7 +2463,7 @@ bool do_cmd_throw(player_type *creature_ptr, int mult, bool boomerang, OBJECT_ID if (item >= 0) { - inven_item_increase(item, -1); + inven_item_increase(creature_ptr, item, -1); if (!return_when_thrown) inven_item_describe(creature_ptr, item); inven_item_optimize(item); diff --git a/src/cmd/cmd-item.c b/src/cmd/cmd-item.c index ecde44eb4..76b303338 100644 --- a/src/cmd/cmd-item.c +++ b/src/cmd/cmd-item.c @@ -339,7 +339,7 @@ void do_cmd_wield(player_type *creature_ptr) /* Decrease the item (from the pack) */ if (item >= 0) { - inven_item_increase(item, -1); + inven_item_increase(creature_ptr, item, -1); inven_item_optimize(item); } /* Decrease the item (from the floor) */ @@ -356,7 +356,7 @@ void do_cmd_wield(player_type *creature_ptr) if (o_ptr->k_idx) { /* Take off existing item */ - (void)inven_takeoff(slot, 255); + (void)inven_takeoff(creature_ptr, slot, 255); } /* Wear the new stuff */ @@ -442,51 +442,51 @@ void verify_equip_slot(player_type *owner_ptr, INVENTORY_IDX item) if (item == INVEN_RARM) { - if (has_melee_weapon(owner_ptr, INVEN_LARM)) - { - o_ptr = &owner_ptr->inventory_list[INVEN_LARM]; - object_desc(o_name, o_ptr, 0); + if (!has_melee_weapon(owner_ptr, INVEN_LARM)) return; - if (!object_is_cursed(o_ptr)) - { - new_o_ptr = &owner_ptr->inventory_list[INVEN_RARM]; - object_copy(new_o_ptr, o_ptr); - owner_ptr->total_weight += o_ptr->weight; - inven_item_increase(INVEN_LARM, -((int)o_ptr->number)); - inven_item_optimize(INVEN_LARM); - if (object_allow_two_hands_wielding(o_ptr) && CAN_TWO_HANDS_WIELDING()) - msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name); - else - msg_format(_("%sを%sで構えた。", "You are wielding %s in your %s hand."), o_name, - (left_hander ? _("左手", "left") : _("右手", "right"))); - } - else - { - if (object_allow_two_hands_wielding(o_ptr) && CAN_TWO_HANDS_WIELDING()) - msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name); - } - } - } - else if (item == INVEN_LARM) - { - o_ptr = &owner_ptr->inventory_list[INVEN_RARM]; - if (o_ptr->k_idx) object_desc(o_name, o_ptr, 0); + o_ptr = &owner_ptr->inventory_list[INVEN_LARM]; + object_desc(o_name, o_ptr, 0); - if (has_melee_weapon(owner_ptr, INVEN_RARM)) + if (object_is_cursed(o_ptr)) { if (object_allow_two_hands_wielding(o_ptr) && CAN_TWO_HANDS_WIELDING()) msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name); + return; } - else if (!(empty_hands(owner_ptr, FALSE) & EMPTY_HAND_RARM) && !object_is_cursed(o_ptr)) - { - new_o_ptr = &owner_ptr->inventory_list[INVEN_LARM]; - object_copy(new_o_ptr, o_ptr); - owner_ptr->total_weight += o_ptr->weight; - inven_item_increase(INVEN_RARM, -((int)o_ptr->number)); - inven_item_optimize(INVEN_RARM); - msg_format(_("%sを持ち替えた。", "You switched hand of %s."), o_name); - } + + new_o_ptr = &owner_ptr->inventory_list[INVEN_RARM]; + object_copy(new_o_ptr, o_ptr); + owner_ptr->total_weight += o_ptr->weight; + inven_item_increase(owner_ptr, INVEN_LARM, -((int)o_ptr->number)); + inven_item_optimize(INVEN_LARM); + if (object_allow_two_hands_wielding(o_ptr) && CAN_TWO_HANDS_WIELDING()) + msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name); + else + msg_format(_("%sを%sで構えた。", "You are wielding %s in your %s hand."), o_name, + (left_hander ? _("左手", "left") : _("右手", "right"))); + return; } + + if (item != INVEN_LARM) return; + + o_ptr = &owner_ptr->inventory_list[INVEN_RARM]; + if (o_ptr->k_idx) object_desc(o_name, o_ptr, 0); + + if (has_melee_weapon(owner_ptr, INVEN_RARM)) + { + if (object_allow_two_hands_wielding(o_ptr) && CAN_TWO_HANDS_WIELDING()) + msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name); + return; + } + + if ((empty_hands(owner_ptr, FALSE) & EMPTY_HAND_RARM) || object_is_cursed(o_ptr)) return; + + new_o_ptr = &owner_ptr->inventory_list[INVEN_LARM]; + object_copy(new_o_ptr, o_ptr); + owner_ptr->total_weight += o_ptr->weight; + inven_item_increase(owner_ptr, INVEN_RARM, -((int)o_ptr->number)); + inven_item_optimize(INVEN_RARM); + msg_format(_("%sを持ち替えた。", "You switched hand of %s."), o_name); } @@ -545,7 +545,7 @@ void do_cmd_takeoff(player_type *creature_ptr) take_turn(creature_ptr, 50); /* Take off the item */ - (void)inven_takeoff(item, 255); + (void)inven_takeoff(creature_ptr, item, 255); verify_equip_slot(creature_ptr, item); calc_android_exp(creature_ptr); creature_ptr->redraw |= (PR_EQUIPPY); diff --git a/src/combat/melee1.c b/src/combat/melee1.c index f0f0061ed..725af10d6 100644 --- a/src/combat/melee1.c +++ b/src/combat/melee1.c @@ -3049,7 +3049,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) } /* Steal the items */ - inven_item_increase(i, -1); + inven_item_increase(target_ptr, i, -1); inven_item_optimize(i); obvious = TRUE; @@ -3090,7 +3090,7 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) #endif /* Steal the items */ - inven_item_increase(i, -1); + inven_item_increase(target_ptr, i, -1); inven_item_optimize(i); obvious = TRUE; @@ -4014,7 +4014,6 @@ bool make_attack_normal(player_type *target_ptr, MONSTER_IDX m_idx) } } - /* Analyze "visible" monsters only */ if (is_original_ap_and_seen(m_ptr) && !do_silly_attack) { diff --git a/src/object.h b/src/object.h index 56e724eb8..60072bf1a 100644 --- a/src/object.h +++ b/src/object.h @@ -492,7 +492,7 @@ extern OBJECT_IDX drop_near(player_type *owner_type, object_type *o_ptr, PERCENT extern void vary_item(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num); extern void inven_item_charges(player_type *owner_ptr, INVENTORY_IDX item); extern void inven_item_describe(player_type *owner_ptr, INVENTORY_IDX item); -extern void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num); +extern void inven_item_increase(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num); extern void inven_item_optimize(INVENTORY_IDX item); extern void floor_item_charges(INVENTORY_IDX item); extern void floor_item_describe(INVENTORY_IDX item); @@ -501,7 +501,7 @@ extern void floor_item_optimize(INVENTORY_IDX item); extern bool inven_carry_okay(object_type *o_ptr); extern bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr); extern s16b inven_carry(player_type *owner_ptr, object_type *o_ptr); -extern INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt); +extern INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER amt); extern void drop_from_inventory(player_type *owner_type, INVENTORY_IDX item, ITEM_NUMBER amt); extern void combine_pack(player_type *owner_ptr); extern void reorder_pack(void); diff --git a/src/object2.c b/src/object2.c index 68895de02..105390a0a 100644 --- a/src/object2.c +++ b/src/object2.c @@ -4585,7 +4585,7 @@ void vary_item(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num) { if (item >= 0) { - inven_item_increase(item, num); + inven_item_increase(owner_ptr, item, num); inven_item_describe(owner_ptr, item); inven_item_optimize(item); } @@ -4606,9 +4606,9 @@ void vary_item(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num) * @param num 増やしたい量 * @return なし */ -void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num) +void inven_item_increase(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num) { - object_type *o_ptr = &p_ptr->inventory_list[item]; + object_type *o_ptr = &owner_ptr->inventory_list[item]; /* Apply */ num += o_ptr->number; @@ -4621,31 +4621,25 @@ void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num) num -= o_ptr->number; /* Change the number and weight */ - if (num) - { - /* Add the number */ - o_ptr->number += num; + if (num != 0) return; - /* Add the weight */ - p_ptr->total_weight += (num * o_ptr->weight); - p_ptr->update |= (PU_BONUS); - p_ptr->update |= (PU_MANA); - p_ptr->update |= (PU_COMBINE); - p_ptr->window |= (PW_INVEN | PW_EQUIP); + /* Add the number */ + o_ptr->number += num; - /* Hack -- Clear temporary elemental brands if player takes off weapons */ - if (!o_ptr->number && p_ptr->ele_attack) - { - if ((item == INVEN_RARM) || (item == INVEN_LARM)) - { - if (!has_melee_weapon(p_ptr, INVEN_RARM + INVEN_LARM - item)) - { - /* Clear all temporary elemental brands */ - set_ele_attack(p_ptr, 0, 0); - } - } - } - } + /* Add the weight */ + owner_ptr->total_weight += (num * o_ptr->weight); + owner_ptr->update |= (PU_BONUS); + owner_ptr->update |= (PU_MANA); + owner_ptr->update |= (PU_COMBINE); + owner_ptr->window |= (PW_INVEN | PW_EQUIP); + + /* Hack -- Clear temporary elemental brands if player takes off weapons */ + if (o_ptr->number || !owner_ptr->ele_attack) return; + if (!(item == INVEN_RARM) && !(item == INVEN_LARM)) return; + if (has_melee_weapon(owner_ptr, INVEN_RARM + INVEN_LARM - item)) return; + + /* Clear all temporary elemental brands */ + set_ele_attack(owner_ptr, 0, 0); } @@ -5080,7 +5074,7 @@ s16b inven_carry(player_type *owner_ptr, object_type *o_ptr) * to fall to the ground.\n * Return the inventory slot into which the item is placed.\n */ -INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt) +INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER amt) { INVENTORY_IDX slot; @@ -5095,7 +5089,7 @@ INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt) /* Get the item to take off */ - o_ptr = &p_ptr->inventory_list[item]; + o_ptr = &owner_ptr->inventory_list[item]; if (amt <= 0) return (-1); /* Verify */ @@ -5134,11 +5128,11 @@ INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt) } /* Modify, Optimize */ - inven_item_increase(item, -amt); + inven_item_increase(owner_ptr, item, -amt); inven_item_optimize(item); /* Carry the object */ - slot = inven_carry(p_ptr, q_ptr); + slot = inven_carry(owner_ptr, q_ptr); #ifdef JP msg_format("%s(%c)%s。", o_name, index_to_label(slot), act); @@ -5183,7 +5177,7 @@ void drop_from_inventory(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER if (item >= INVEN_RARM) { /* Take off first */ - item = inven_takeoff(item, amt); + item = inven_takeoff(owner_ptr, item, amt); /* Access original object */ o_ptr = &owner_ptr->inventory_list[item]; diff --git a/src/player-damage.c b/src/player-damage.c index 150bec536..37665cf70 100644 --- a/src/player-damage.c +++ b/src/player-damage.c @@ -108,7 +108,7 @@ void inventory_damage(player_type *player_ptr, inven_func typ, int perc) reduce_charges(o_ptr, amt); /* Destroy "amt" items */ - inven_item_increase(i, -amt); + inven_item_increase(player_ptr, i, -amt); inven_item_optimize(i); } } diff --git a/src/player-status.c b/src/player-status.c index 60dcf824d..9ac94e59b 100644 --- a/src/player-status.c +++ b/src/player-status.c @@ -4990,8 +4990,9 @@ void update_creature(player_type *creature_ptr) if (creature_ptr->update & (PU_AUTODESTROY)) { creature_ptr->update &= ~(PU_AUTODESTROY); - autopick_delayed_alter(floor_ptr); + autopick_delayed_alter(creature_ptr); } + if (creature_ptr->update & (PU_COMBINE)) { creature_ptr->update &= ~(PU_COMBINE); diff --git a/src/spells-status.c b/src/spells-status.c index e1ab47122..b0611a88f 100644 --- a/src/spells-status.c +++ b/src/spells-status.c @@ -472,7 +472,7 @@ bool cosmic_cast_off(player_type *creature_ptr, object_type *o_ptr) object_type forge; object_copy(&forge, o_ptr); - inven_item_increase(inv, (0 - o_ptr->number)); + inven_item_increase(creature_ptr, inv, (0 - o_ptr->number)); inven_item_optimize(inv); OBJECT_IDX o_idx = drop_near(creature_ptr, &forge, 0, creature_ptr->y, creature_ptr->x); o_ptr = &creature_ptr->current_floor_ptr->o_list[o_idx]; diff --git a/src/spells3.c b/src/spells3.c index b4ad32960..61827e2fd 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -1601,7 +1601,7 @@ bool artifact_scroll(player_type *caster_ptr) if (item >= 0) { - inven_item_increase(item, 1 - (o_ptr->number)); + inven_item_increase(caster_ptr, item, 1 - (o_ptr->number)); } else { diff --git a/src/store.c b/src/store.c index 9d124de7b..89bfc92ea 100644 --- a/src/store.c +++ b/src/store.c @@ -5087,7 +5087,7 @@ static void store_sell(player_type *owner_ptr) q_ptr->timeout = 0; /* Take the item from the player, describe the result */ - inven_item_increase(item, -amt); + inven_item_increase(owner_ptr, item, -amt); inven_item_describe(owner_ptr, item); /* If items remain, auto-inscribe before optimizing */ -- 2.11.0