OSDN Git Service

[Refactor] #38844 inventory を player_type 構造体に inventory_list に改名して取り込み (コメントの修正は後日)
[hengband/hengband.git] / src / player-status.c
1 #include "angband.h"
2 #include "util.h"
3
4 #include "player-move.h"
5 #include "player-status.h"
6 #include "player-effects.h"
7 #include "player-skill.h"
8 #include "floor.h"
9 #include "floor-events.h"
10 #include "feature.h"
11 #include "artifact.h"
12 #include "avatar.h"
13 #include "spells-status.h"
14 #include "object.h"
15 #include "object-hook.h"
16 #include "monster.h"
17 #include "monster-status.h"
18 #include "monsterrace-hook.h"
19 #include "mutation.h"
20 #include "patron.h"
21 #include "realm-hex.h"
22 #include "cmd-pet.h"
23 #include "cmd-spell.h"
24 #include "dungeon.h"
25
26 /*!
27  * @var horror_desc
28  * @brief ELDRITCH HORROR効果時のモンスターの形容メッセージ(通常時)
29  */
30 static concptr horror_desc[MAX_SAN_HORROR] =
31 {
32 #ifdef JP
33         "忌まわしい",
34         "底知れぬ",
35         "ぞっとする",
36         "破滅的な",
37         "冒涜的な",
38
39         "いやな",
40         "恐ろしい",
41         "不潔な",
42         "容赦のない",
43         "おぞましい",
44
45         "地獄の",
46         "身の毛もよだつ",
47         "地獄の",
48         "忌まわしい",
49         "悪夢のような",
50
51         "嫌悪を感じる",
52         "罰当たりな",
53         "恐い",
54         "不浄な",
55         "言うもおぞましい",
56 #else
57         "abominable",
58         "abysmal",
59         "appalling",
60         "baleful",
61         "blasphemous",
62
63         "disgusting",
64         "dreadful",
65         "filthy",
66         "grisly",
67         "hideous",
68
69         "hellish",
70         "horrible",
71         "infernal",
72         "loathsome",
73         "nightmarish",
74
75         "repulsive",
76         "sacrilegious",
77         "terrible",
78         "unclean",
79         "unspeakable",
80 #endif
81
82 };
83
84 /*!
85  * @var funny_desc
86  * @brief ELDRITCH HORROR効果時のモンスターの形容メッセージ(幻覚状態時)
87  */
88 static concptr funny_desc[MAX_SAN_FUNNY] =
89 {
90 #ifdef JP
91         "間抜けな",
92         "滑稽な",
93         "ばからしい",
94         "無味乾燥な",
95         "馬鹿げた",
96
97         "笑える",
98         "ばかばかしい",
99         "ぶっとんだ",
100         "いかした",
101         "ポストモダンな",
102
103         "ファンタスティックな",
104         "ダダイズム的な",
105         "キュビズム的な",
106         "宇宙的な",
107         "卓越した",
108
109         "理解不能な",
110         "ものすごい",
111         "驚くべき",
112         "信じられない",
113         "カオティックな",
114
115         "野性的な",
116         "非常識な",
117 #else
118         "silly",
119         "hilarious",
120         "absurd",
121         "insipid",
122         "ridiculous",
123
124         "laughable",
125         "ludicrous",
126         "far-out",
127         "groovy",
128         "postmodern",
129
130         "fantastic",
131         "dadaistic",
132         "cubistic",
133         "cosmic",
134         "awesome",
135
136         "incomprehensible",
137         "fabulous",
138         "amazing",
139         "incredible",
140         "chaotic",
141
142         "wild",
143         "preposterous",
144 #endif
145
146 };
147
148 /*!
149  * @var funny_comments
150  * @brief ELDRITCH HORROR効果時の幻覚時間延長を示す錯乱表現
151  */
152 static concptr funny_comments[MAX_SAN_COMMENT] =
153 {
154 #ifdef JP
155         /* nuke me */
156           "最高だぜ!",
157           "うひょー!",
158           "いかすぜ!",
159           "すんばらしい!",
160           "ぶっとびー!"
161   #else
162           "Wow, cosmic, man!",
163           "Rad!",
164           "Groovy!",
165           "Cool!",
166           "Far out!"
167   #endif
168
169 };
170
171
172 /*!
173  * @brief 基本必要経験値テーブル /
174  * Base experience levels, may be adjusted up for race and/or class
175  */
176 const s32b player_exp[PY_MAX_LEVEL] =
177 {
178         10,
179         25,
180         45,
181         70,
182         100,
183         140,
184         200,
185         280,
186         380,/*10*/
187         500,
188         650,
189         850,
190         1100,
191         1400,
192         1800,
193         2300,
194         2900,
195         3600,
196         4400,/*20*/
197         5400,
198         6800,
199         8400,
200         10200,
201         12500,
202         17500,
203         25000,
204         35000L,
205         50000L,
206         75000L,/*30*/
207         100000L,
208         150000L,
209         200000L,
210         275000L,
211         350000L,
212         450000L,
213         550000L,
214         700000L,
215         850000L,
216         1000000L,/*40*/
217         1250000L,
218         1500000L,
219         1800000L,
220         2100000L,
221         2400000L,
222         2700000L,
223         3000000L,
224         3500000L,
225         4000000L,
226         4500000L,/*50*/
227         5000000L
228 };
229
230
231 /*!
232  * @brief 基本必要強化値テーブル(アンドロイド専用)
233  */
234 const s32b player_exp_a[PY_MAX_LEVEL] =
235 {
236         20,
237         50,
238         100,
239         170,
240         280,
241         430,
242         650,
243         950,
244         1400,/*10*/
245         1850,
246         2300,
247         2900,
248         3600,
249         4400,
250         5400,
251         6800,
252         8400,
253         10400,
254         12500,/*20*/
255         17500,
256         25000,
257         35000,
258         50000L,
259         75000L,
260         100000L,
261         150000L,
262         200000L,
263         275000L,
264         350000L,/*30*/
265         450000L,
266         550000L,
267         650000L,
268         800000L,
269         950000L,
270         1100000L,
271         1250000L,
272         1400000L,
273         1550000L,
274         1700000L,/*40*/
275         1900000L,
276         2100000L,
277         2300000L,
278         2550000L,
279         2800000L,
280         3050000L,
281         3300000L,
282         3700000L,
283         4100000L,
284         4500000L,/*50*/
285         5000000L
286 };
287
288
289 /*
290  * Return alignment title
291  */
292 concptr your_alignment(void)
293 {
294         if (p_ptr->align > 150) return _("大善", "Lawful");
295         else if (p_ptr->align > 50) return _("中善", "Good");
296         else if (p_ptr->align > 10) return _("小善", "Neutral Good");
297         else if (p_ptr->align > -11) return _("中立", "Neutral");
298         else if (p_ptr->align > -51) return _("小悪", "Neutral Evil");
299         else if (p_ptr->align > -151) return _("中悪", "Evil");
300         else return _("大悪", "Chaotic");
301 }
302
303
304 /*
305  * Return proficiency level of weapons and misc. skills (except riding)
306  */
307 int weapon_exp_level(int weapon_exp)
308 {
309         if (weapon_exp < WEAPON_EXP_BEGINNER) return EXP_LEVEL_UNSKILLED;
310         else if (weapon_exp < WEAPON_EXP_SKILLED) return EXP_LEVEL_BEGINNER;
311         else if (weapon_exp < WEAPON_EXP_EXPERT) return EXP_LEVEL_SKILLED;
312         else if (weapon_exp < WEAPON_EXP_MASTER) return EXP_LEVEL_EXPERT;
313         else return EXP_LEVEL_MASTER;
314 }
315
316
317 /*
318  * Return proficiency level of riding
319  */
320 int riding_exp_level(int riding_exp)
321 {
322         if (riding_exp < RIDING_EXP_BEGINNER) return EXP_LEVEL_UNSKILLED;
323         else if (riding_exp < RIDING_EXP_SKILLED) return EXP_LEVEL_BEGINNER;
324         else if (riding_exp < RIDING_EXP_EXPERT) return EXP_LEVEL_SKILLED;
325         else if (riding_exp < RIDING_EXP_MASTER) return EXP_LEVEL_EXPERT;
326         else return EXP_LEVEL_MASTER;
327 }
328
329
330 /*
331  * Return proficiency level of spells
332  */
333 int spell_exp_level(int spell_exp)
334 {
335         if (spell_exp < SPELL_EXP_BEGINNER) return EXP_LEVEL_UNSKILLED;
336         else if (spell_exp < SPELL_EXP_SKILLED) return EXP_LEVEL_BEGINNER;
337         else if (spell_exp < SPELL_EXP_EXPERT) return EXP_LEVEL_SKILLED;
338         else if (spell_exp < SPELL_EXP_MASTER) return EXP_LEVEL_EXPERT;
339         else return EXP_LEVEL_MASTER;
340 }
341
342 /*!
343  * @brief プレイヤーの全ステータスを更新する /
344  * Calculate the players current "state", taking into account
345  * not only race/class intrinsics, but also objects being worn
346  * and temporary spell effects.
347  * @return なし
348  * @details
349  * <pre>
350  * See also calc_mana() and calc_hitpoints().
351  *
352  * Take note of the new "speed code", in particular, a very strong
353  * player will start slowing down as soon as he reaches 150 pounds,
354  * but not until he reaches 450 pounds will he be half as fast as
355  * a normal kobold.  This both hurts and helps the player, hurts
356  * because in the old days a player could just avoid 300 pounds,
357  * and helps because now carrying 300 pounds is not very painful.
358  *
359  * The "weapon" and "bow" do *not* add to the bonuses to hit or to
360  * damage, since that would affect non-combat things.  These values
361  * are actually added in later, at the appropriate place.
362  *
363  * This function induces various "status" messages.
364  * </pre>
365  */
366 void calc_bonuses(void)
367 {
368         int i, j, hold;
369         int new_speed;
370         int default_hand = 0;
371         int empty_hands_status = empty_hands(TRUE);
372         int extra_blows[2];
373         object_type *o_ptr;
374         BIT_FLAGS flgs[TR_FLAG_SIZE];
375         bool omoi = FALSE;
376         bool yoiyami = FALSE;
377         bool down_saving = FALSE;
378
379 #if 0
380         bool have_dd_s = FALSE, have_dd_t = FALSE;
381 #endif
382         bool have_sw = FALSE, have_kabe = FALSE;
383         bool easy_2weapon = FALSE;
384         bool riding_levitation = FALSE;
385         OBJECT_IDX this_o_idx, next_o_idx = 0;
386         const player_race *tmp_rp_ptr;
387
388         /* Save the old vision stuff */
389         bool old_telepathy = p_ptr->telepathy;
390         bool old_esp_animal = p_ptr->esp_animal;
391         bool old_esp_undead = p_ptr->esp_undead;
392         bool old_esp_demon = p_ptr->esp_demon;
393         bool old_esp_orc = p_ptr->esp_orc;
394         bool old_esp_troll = p_ptr->esp_troll;
395         bool old_esp_giant = p_ptr->esp_giant;
396         bool old_esp_dragon = p_ptr->esp_dragon;
397         bool old_esp_human = p_ptr->esp_human;
398         bool old_esp_evil = p_ptr->esp_evil;
399         bool old_esp_good = p_ptr->esp_good;
400         bool old_esp_nonliving = p_ptr->esp_nonliving;
401         bool old_esp_unique = p_ptr->esp_unique;
402         bool old_see_inv = p_ptr->see_inv;
403         bool old_mighty_throw = p_ptr->mighty_throw;
404
405         /* Current feature under player. */
406         feature_type *f_ptr = &f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat];
407
408         /* Save the old armor class */
409         ARMOUR_CLASS old_dis_ac = p_ptr->dis_ac;
410         ARMOUR_CLASS old_dis_to_a = p_ptr->dis_to_a;
411
412
413         /* Clear extra blows/shots */
414         extra_blows[0] = extra_blows[1] = 0;
415
416         /* Clear the stat modifiers */
417         for (i = 0; i < A_MAX; i++) p_ptr->stat_add[i] = 0;
418
419
420         /* Clear the Displayed/Real armor class */
421         p_ptr->dis_ac = p_ptr->ac = 0;
422
423         /* Clear the Displayed/Real Bonuses */
424         p_ptr->dis_to_h[0] = p_ptr->to_h[0] = 0;
425         p_ptr->dis_to_h[1] = p_ptr->to_h[1] = 0;
426         p_ptr->dis_to_d[0] = p_ptr->to_d[0] = 0;
427         p_ptr->dis_to_d[1] = p_ptr->to_d[1] = 0;
428         p_ptr->dis_to_h_b = p_ptr->to_h_b = 0;
429         p_ptr->dis_to_a = p_ptr->to_a = 0;
430         p_ptr->to_h_m = 0;
431         p_ptr->to_d_m = 0;
432
433         p_ptr->to_m_chance = 0;
434
435         /* Clear the Extra Dice Bonuses */
436         p_ptr->to_dd[0] = p_ptr->to_ds[0] = 0;
437         p_ptr->to_dd[1] = p_ptr->to_ds[1] = 0;
438
439         /* Start with "normal" speed */
440         new_speed = 110;
441
442         /* Start with a single blow per current_world_ptr->game_turn */
443         p_ptr->num_blow[0] = 1;
444         p_ptr->num_blow[1] = 1;
445
446         /* Start with a single shot per current_world_ptr->game_turn */
447         p_ptr->num_fire = 100;
448
449         /* Reset the "xtra" tval */
450         p_ptr->tval_xtra = 0;
451
452         /* Reset the "ammo" tval */
453         p_ptr->tval_ammo = 0;
454
455         /* Clear all the flags */
456         p_ptr->cursed = 0L;
457         p_ptr->bless_blade = FALSE;
458         p_ptr->xtra_might = FALSE;
459         p_ptr->impact[0] = FALSE;
460         p_ptr->impact[1] = FALSE;
461         p_ptr->pass_wall = FALSE;
462         p_ptr->kill_wall = FALSE;
463         p_ptr->dec_mana = FALSE;
464         p_ptr->easy_spell = FALSE;
465         p_ptr->heavy_spell = FALSE;
466         p_ptr->see_inv = FALSE;
467         p_ptr->free_act = FALSE;
468         p_ptr->slow_digest = FALSE;
469         p_ptr->regenerate = FALSE;
470         p_ptr->can_swim = FALSE;
471         p_ptr->levitation = FALSE;
472         p_ptr->hold_exp = FALSE;
473         p_ptr->telepathy = FALSE;
474         p_ptr->esp_animal = FALSE;
475         p_ptr->esp_undead = FALSE;
476         p_ptr->esp_demon = FALSE;
477         p_ptr->esp_orc = FALSE;
478         p_ptr->esp_troll = FALSE;
479         p_ptr->esp_giant = FALSE;
480         p_ptr->esp_dragon = FALSE;
481         p_ptr->esp_human = FALSE;
482         p_ptr->esp_evil = FALSE;
483         p_ptr->esp_good = FALSE;
484         p_ptr->esp_nonliving = FALSE;
485         p_ptr->esp_unique = FALSE;
486         p_ptr->lite = FALSE;
487         p_ptr->sustain_str = FALSE;
488         p_ptr->sustain_int = FALSE;
489         p_ptr->sustain_wis = FALSE;
490         p_ptr->sustain_con = FALSE;
491         p_ptr->sustain_dex = FALSE;
492         p_ptr->sustain_chr = FALSE;
493         p_ptr->resist_acid = FALSE;
494         p_ptr->resist_elec = FALSE;
495         p_ptr->resist_fire = FALSE;
496         p_ptr->resist_cold = FALSE;
497         p_ptr->resist_pois = FALSE;
498         p_ptr->resist_conf = FALSE;
499         p_ptr->resist_sound = FALSE;
500         p_ptr->resist_lite = FALSE;
501         p_ptr->resist_dark = FALSE;
502         p_ptr->resist_chaos = FALSE;
503         p_ptr->resist_disen = FALSE;
504         p_ptr->resist_shard = FALSE;
505         p_ptr->resist_nexus = FALSE;
506         p_ptr->resist_blind = FALSE;
507         p_ptr->resist_neth = FALSE;
508         p_ptr->resist_time = FALSE;
509         p_ptr->resist_water = FALSE;
510         p_ptr->resist_fear = FALSE;
511         p_ptr->reflect = FALSE;
512         p_ptr->sh_fire = FALSE;
513         p_ptr->sh_elec = FALSE;
514         p_ptr->sh_cold = FALSE;
515         p_ptr->anti_magic = FALSE;
516         p_ptr->anti_tele = FALSE;
517         p_ptr->warning = FALSE;
518         p_ptr->mighty_throw = FALSE;
519         p_ptr->see_nocto = FALSE;
520
521         p_ptr->immune_acid = FALSE;
522         p_ptr->immune_elec = FALSE;
523         p_ptr->immune_fire = FALSE;
524         p_ptr->immune_cold = FALSE;
525
526         p_ptr->ryoute = FALSE;
527         p_ptr->migite = FALSE;
528         p_ptr->hidarite = FALSE;
529         p_ptr->no_flowed = FALSE;
530
531         if (p_ptr->mimic_form) tmp_rp_ptr = &mimic_info[p_ptr->mimic_form];
532         else tmp_rp_ptr = &race_info[p_ptr->prace];
533
534         /* Base infravision (purely racial) */
535         p_ptr->see_infra = tmp_rp_ptr->infra;
536
537         /* Base skill -- disarming */
538         p_ptr->skill_dis = tmp_rp_ptr->r_dis + cp_ptr->c_dis + ap_ptr->a_dis;
539
540         /* Base skill -- magic devices */
541         p_ptr->skill_dev = tmp_rp_ptr->r_dev + cp_ptr->c_dev + ap_ptr->a_dev;
542
543         /* Base skill -- saving throw */
544         p_ptr->skill_sav = tmp_rp_ptr->r_sav + cp_ptr->c_sav + ap_ptr->a_sav;
545
546         /* Base skill -- stealth */
547         p_ptr->skill_stl = tmp_rp_ptr->r_stl + cp_ptr->c_stl + ap_ptr->a_stl;
548
549         /* Base skill -- searching ability */
550         p_ptr->skill_srh = tmp_rp_ptr->r_srh + cp_ptr->c_srh + ap_ptr->a_srh;
551
552         /* Base skill -- searching frequency */
553         p_ptr->skill_fos = tmp_rp_ptr->r_fos + cp_ptr->c_fos + ap_ptr->a_fos;
554
555         /* Base skill -- combat (normal) */
556         p_ptr->skill_thn = tmp_rp_ptr->r_thn + cp_ptr->c_thn + ap_ptr->a_thn;
557
558         /* Base skill -- combat (shooting) */
559         p_ptr->skill_thb = tmp_rp_ptr->r_thb + cp_ptr->c_thb + ap_ptr->a_thb;
560
561         /* Base skill -- combat (throwing) */
562         p_ptr->skill_tht = tmp_rp_ptr->r_thb + cp_ptr->c_thb + ap_ptr->a_thb;
563
564         /* Base skill -- digging */
565         p_ptr->skill_dig = 0;
566
567         if (has_melee_weapon(INVEN_RARM)) p_ptr->migite = TRUE;
568         if (has_melee_weapon(INVEN_LARM))
569         {
570                 p_ptr->hidarite = TRUE;
571                 if (!p_ptr->migite) default_hand = 1;
572         }
573
574         if (CAN_TWO_HANDS_WIELDING())
575         {
576                 if (p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
577                         object_allow_two_hands_wielding(&p_ptr->inventory_list[INVEN_RARM]))
578                 {
579                         p_ptr->ryoute = TRUE;
580                 }
581                 else if (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
582                         object_allow_two_hands_wielding(&p_ptr->inventory_list[INVEN_LARM]))
583                 {
584                         p_ptr->ryoute = TRUE;
585                 }
586                 else
587                 {
588                         switch (p_ptr->pclass)
589                         {
590                         case CLASS_MONK:
591                         case CLASS_FORCETRAINER:
592                         case CLASS_BERSERKER:
593                                 if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
594                                 {
595                                         p_ptr->migite = TRUE;
596                                         p_ptr->ryoute = TRUE;
597                                 }
598                                 break;
599                         }
600                 }
601         }
602
603         if (!p_ptr->migite && !p_ptr->hidarite)
604         {
605                 if (empty_hands_status & EMPTY_HAND_RARM) p_ptr->migite = TRUE;
606                 else if (empty_hands_status == EMPTY_HAND_LARM)
607                 {
608                         p_ptr->hidarite = TRUE;
609                         default_hand = 1;
610                 }
611         }
612
613         if (p_ptr->special_defense & KAMAE_MASK)
614         {
615                 if (!(empty_hands_status & EMPTY_HAND_RARM))
616                 {
617                         set_action(ACTION_NONE);
618                 }
619         }
620
621         switch (p_ptr->pclass)
622         {
623         case CLASS_WARRIOR:
624                 if (p_ptr->lev > 29) p_ptr->resist_fear = TRUE;
625                 if (p_ptr->lev > 44) p_ptr->regenerate = TRUE;
626                 break;
627         case CLASS_PALADIN:
628                 if (p_ptr->lev > 39) p_ptr->resist_fear = TRUE;
629                 break;
630         case CLASS_CHAOS_WARRIOR:
631                 if (p_ptr->lev > 29) p_ptr->resist_chaos = TRUE;
632                 if (p_ptr->lev > 39) p_ptr->resist_fear = TRUE;
633                 break;
634         case CLASS_MINDCRAFTER:
635                 if (p_ptr->lev > 9) p_ptr->resist_fear = TRUE;
636                 if (p_ptr->lev > 19) p_ptr->sustain_wis = TRUE;
637                 if (p_ptr->lev > 29) p_ptr->resist_conf = TRUE;
638                 if (p_ptr->lev > 39) p_ptr->telepathy = TRUE;
639                 break;
640         case CLASS_MONK:
641         case CLASS_FORCETRAINER:
642                 /* Unencumbered Monks become faster every 10 levels */
643                 if (!(heavy_armor()))
644                 {
645                         if (!(prace_is_(RACE_KLACKON) ||
646                                 prace_is_(RACE_SPRITE) ||
647                                 (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)))
648                                 new_speed += (p_ptr->lev) / 10;
649
650                         /* Free action if unencumbered at level 25 */
651                         if (p_ptr->lev > 24)
652                                 p_ptr->free_act = TRUE;
653                 }
654                 break;
655         case CLASS_SORCERER:
656                 p_ptr->to_a -= 50;
657                 p_ptr->dis_to_a -= 50;
658                 break;
659         case CLASS_BARD:
660                 p_ptr->resist_sound = TRUE;
661                 break;
662         case CLASS_SAMURAI:
663                 if (p_ptr->lev > 29) p_ptr->resist_fear = TRUE;
664                 break;
665         case CLASS_BERSERKER:
666                 p_ptr->shero = 1;
667                 p_ptr->sustain_str = TRUE;
668                 p_ptr->sustain_dex = TRUE;
669                 p_ptr->sustain_con = TRUE;
670                 p_ptr->regenerate = TRUE;
671                 p_ptr->free_act = TRUE;
672                 new_speed += 2;
673                 if (p_ptr->lev > 29) new_speed++;
674                 if (p_ptr->lev > 39) new_speed++;
675                 if (p_ptr->lev > 44) new_speed++;
676                 if (p_ptr->lev > 49) new_speed++;
677                 p_ptr->to_a += 10 + p_ptr->lev / 2;
678                 p_ptr->dis_to_a += 10 + p_ptr->lev / 2;
679                 p_ptr->skill_dig += (100 + p_ptr->lev * 8);
680                 if (p_ptr->lev > 39) p_ptr->reflect = TRUE;
681                 p_ptr->redraw |= PR_STATUS;
682                 break;
683         case CLASS_MIRROR_MASTER:
684                 if (p_ptr->lev > 39) p_ptr->reflect = TRUE;
685                 break;
686         case CLASS_NINJA:
687                 /* Unencumbered Ninjas become faster every 10 levels */
688                 if (heavy_armor())
689                 {
690                         new_speed -= (p_ptr->lev) / 10;
691                         p_ptr->skill_stl -= (p_ptr->lev) / 10;
692                 }
693                 else if ((!p_ptr->inventory_list[INVEN_RARM].k_idx || p_ptr->migite) &&
694                         (!p_ptr->inventory_list[INVEN_LARM].k_idx || p_ptr->hidarite))
695                 {
696                         new_speed += 3;
697                         if (!(prace_is_(RACE_KLACKON) ||
698                                 prace_is_(RACE_SPRITE) ||
699                                 (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)))
700                                 new_speed += (p_ptr->lev) / 10;
701                         p_ptr->skill_stl += (p_ptr->lev) / 10;
702
703                         /* Free action if unencumbered at level 25 */
704                         if (p_ptr->lev > 24)
705                                 p_ptr->free_act = TRUE;
706                 }
707                 if ((!p_ptr->inventory_list[INVEN_RARM].k_idx || p_ptr->migite) &&
708                         (!p_ptr->inventory_list[INVEN_LARM].k_idx || p_ptr->hidarite))
709                 {
710                         p_ptr->to_a += p_ptr->lev / 2 + 5;
711                         p_ptr->dis_to_a += p_ptr->lev / 2 + 5;
712                 }
713                 p_ptr->slow_digest = TRUE;
714                 p_ptr->resist_fear = TRUE;
715                 if (p_ptr->lev > 19) p_ptr->resist_pois = TRUE;
716                 if (p_ptr->lev > 24) p_ptr->sustain_dex = TRUE;
717                 if (p_ptr->lev > 29) p_ptr->see_inv = TRUE;
718                 if (p_ptr->lev > 44)
719                 {
720                         p_ptr->oppose_pois = 1;
721                         p_ptr->redraw |= PR_STATUS;
722                 }
723                 p_ptr->see_nocto = TRUE;
724                 break;
725         }
726
727         /***** Races ****/
728         if (p_ptr->mimic_form)
729         {
730                 switch (p_ptr->mimic_form)
731                 {
732                 case MIMIC_DEMON:
733                         p_ptr->hold_exp = TRUE;
734                         p_ptr->resist_chaos = TRUE;
735                         p_ptr->resist_neth = TRUE;
736                         p_ptr->resist_fire = TRUE;
737                         p_ptr->oppose_fire = 1;
738                         p_ptr->see_inv = TRUE;
739                         new_speed += 3;
740                         p_ptr->redraw |= PR_STATUS;
741                         p_ptr->to_a += 10;
742                         p_ptr->dis_to_a += 10;
743                         break;
744                 case MIMIC_DEMON_LORD:
745                         p_ptr->hold_exp = TRUE;
746                         p_ptr->resist_chaos = TRUE;
747                         p_ptr->resist_neth = TRUE;
748                         p_ptr->immune_fire = TRUE;
749                         p_ptr->resist_acid = TRUE;
750                         p_ptr->resist_fire = TRUE;
751                         p_ptr->resist_cold = TRUE;
752                         p_ptr->resist_elec = TRUE;
753                         p_ptr->resist_pois = TRUE;
754                         p_ptr->resist_conf = TRUE;
755                         p_ptr->resist_disen = TRUE;
756                         p_ptr->resist_nexus = TRUE;
757                         p_ptr->resist_fear = TRUE;
758                         p_ptr->sh_fire = TRUE;
759                         p_ptr->see_inv = TRUE;
760                         p_ptr->telepathy = TRUE;
761                         p_ptr->levitation = TRUE;
762                         p_ptr->kill_wall = TRUE;
763                         new_speed += 5;
764                         p_ptr->to_a += 20;
765                         p_ptr->dis_to_a += 20;
766                         break;
767                 case MIMIC_VAMPIRE:
768                         p_ptr->resist_dark = TRUE;
769                         p_ptr->hold_exp = TRUE;
770                         p_ptr->resist_neth = TRUE;
771                         p_ptr->resist_cold = TRUE;
772                         p_ptr->resist_pois = TRUE;
773                         p_ptr->see_inv = TRUE;
774                         new_speed += 3;
775                         p_ptr->to_a += 10;
776                         p_ptr->dis_to_a += 10;
777                         if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
778                         break;
779                 }
780         }
781         else
782         {
783                 switch (p_ptr->prace)
784                 {
785                 case RACE_ELF:
786                         p_ptr->resist_lite = TRUE;
787                         break;
788                 case RACE_HOBBIT:
789                         p_ptr->hold_exp = TRUE;
790                         break;
791                 case RACE_GNOME:
792                         p_ptr->free_act = TRUE;
793                         break;
794                 case RACE_DWARF:
795                         p_ptr->resist_blind = TRUE;
796                         break;
797                 case RACE_HALF_ORC:
798                         p_ptr->resist_dark = TRUE;
799                         break;
800                 case RACE_HALF_TROLL:
801                         p_ptr->sustain_str = TRUE;
802
803                         if (p_ptr->lev > 14)
804                         {
805                                 /* High level trolls heal fast... */
806                                 p_ptr->regenerate = TRUE;
807
808                                 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_BERSERKER)
809                                 {
810                                         p_ptr->slow_digest = TRUE;
811                                         /* Let's not make Regeneration
812                                          * a disadvantage for the poor warriors who can
813                                          * never learn a spell that satisfies hunger (actually
814                                          * neither can rogues, but half-trolls are not
815                                          * supposed to play rogues) */
816                                 }
817                         }
818                         break;
819                 case RACE_AMBERITE:
820                         p_ptr->sustain_con = TRUE;
821                         p_ptr->regenerate = TRUE;  /* Amberites heal fast... */
822                         break;
823                 case RACE_HIGH_ELF:
824                         p_ptr->resist_lite = TRUE;
825                         p_ptr->see_inv = TRUE;
826                         break;
827                 case RACE_BARBARIAN:
828                         p_ptr->resist_fear = TRUE;
829                         break;
830                 case RACE_HALF_OGRE:
831                         p_ptr->resist_dark = TRUE;
832                         p_ptr->sustain_str = TRUE;
833                         break;
834                 case RACE_HALF_GIANT:
835                         p_ptr->sustain_str = TRUE;
836                         p_ptr->resist_shard = TRUE;
837                         break;
838                 case RACE_HALF_TITAN:
839                         p_ptr->resist_chaos = TRUE;
840                         break;
841                 case RACE_CYCLOPS:
842                         p_ptr->resist_sound = TRUE;
843                         break;
844                 case RACE_YEEK:
845                         p_ptr->resist_acid = TRUE;
846                         if (p_ptr->lev > 19) p_ptr->immune_acid = TRUE;
847                         break;
848                 case RACE_KLACKON:
849                         p_ptr->resist_conf = TRUE;
850                         p_ptr->resist_acid = TRUE;
851
852                         /* Klackons become faster */
853                         new_speed += (p_ptr->lev) / 10;
854                         break;
855                 case RACE_KOBOLD:
856                         p_ptr->resist_pois = TRUE;
857                         break;
858                 case RACE_NIBELUNG:
859                         p_ptr->resist_disen = TRUE;
860                         p_ptr->resist_dark = TRUE;
861                         break;
862                 case RACE_DARK_ELF:
863                         p_ptr->resist_dark = TRUE;
864                         if (p_ptr->lev > 19) p_ptr->see_inv = TRUE;
865                         break;
866                 case RACE_DRACONIAN:
867                         p_ptr->levitation = TRUE;
868                         if (p_ptr->lev > 4) p_ptr->resist_fire = TRUE;
869                         if (p_ptr->lev > 9) p_ptr->resist_cold = TRUE;
870                         if (p_ptr->lev > 14) p_ptr->resist_acid = TRUE;
871                         if (p_ptr->lev > 19) p_ptr->resist_elec = TRUE;
872                         if (p_ptr->lev > 34) p_ptr->resist_pois = TRUE;
873                         break;
874                 case RACE_MIND_FLAYER:
875                         p_ptr->sustain_int = TRUE;
876                         p_ptr->sustain_wis = TRUE;
877                         if (p_ptr->lev > 14) p_ptr->see_inv = TRUE;
878                         if (p_ptr->lev > 29) p_ptr->telepathy = TRUE;
879                         break;
880                 case RACE_IMP:
881                         p_ptr->resist_fire = TRUE;
882                         if (p_ptr->lev > 9) p_ptr->see_inv = TRUE;
883                         break;
884                 case RACE_GOLEM:
885                         p_ptr->slow_digest = TRUE;
886                         p_ptr->free_act = TRUE;
887                         p_ptr->see_inv = TRUE;
888                         p_ptr->resist_pois = TRUE;
889                         if (p_ptr->lev > 34) p_ptr->hold_exp = TRUE;
890                         break;
891                 case RACE_SKELETON:
892                         p_ptr->resist_shard = TRUE;
893                         p_ptr->hold_exp = TRUE;
894                         p_ptr->see_inv = TRUE;
895                         p_ptr->resist_pois = TRUE;
896                         if (p_ptr->lev > 9) p_ptr->resist_cold = TRUE;
897                         break;
898                 case RACE_ZOMBIE:
899                         p_ptr->resist_neth = TRUE;
900                         p_ptr->hold_exp = TRUE;
901                         p_ptr->see_inv = TRUE;
902                         p_ptr->resist_pois = TRUE;
903                         p_ptr->slow_digest = TRUE;
904                         if (p_ptr->lev > 4) p_ptr->resist_cold = TRUE;
905                         break;
906                 case RACE_VAMPIRE:
907                         p_ptr->resist_dark = TRUE;
908                         p_ptr->hold_exp = TRUE;
909                         p_ptr->resist_neth = TRUE;
910                         p_ptr->resist_cold = TRUE;
911                         p_ptr->resist_pois = TRUE;
912                         if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
913                         break;
914                 case RACE_SPECTRE:
915                         p_ptr->levitation = TRUE;
916                         p_ptr->free_act = TRUE;
917                         p_ptr->resist_neth = TRUE;
918                         p_ptr->hold_exp = TRUE;
919                         p_ptr->see_inv = TRUE;
920                         p_ptr->resist_pois = TRUE;
921                         p_ptr->slow_digest = TRUE;
922                         p_ptr->resist_cold = TRUE;
923                         p_ptr->pass_wall = TRUE;
924                         if (p_ptr->lev > 34) p_ptr->telepathy = TRUE;
925                         break;
926                 case RACE_SPRITE:
927                         p_ptr->levitation = TRUE;
928                         p_ptr->resist_lite = TRUE;
929
930                         /* Sprites become faster */
931                         new_speed += (p_ptr->lev) / 10;
932                         break;
933                 case RACE_BEASTMAN:
934                         p_ptr->resist_conf = TRUE;
935                         p_ptr->resist_sound = TRUE;
936                         break;
937                 case RACE_ENT:
938                         /* Ents dig like maniacs, but only with their hands. */
939                         if (!p_ptr->inventory_list[INVEN_RARM].k_idx)
940                                 p_ptr->skill_dig += p_ptr->lev * 10;
941                         /* Ents get tougher and stronger as they age, but lose dexterity. */
942                         if (p_ptr->lev > 25) p_ptr->stat_add[A_STR]++;
943                         if (p_ptr->lev > 40) p_ptr->stat_add[A_STR]++;
944                         if (p_ptr->lev > 45) p_ptr->stat_add[A_STR]++;
945
946                         if (p_ptr->lev > 25) p_ptr->stat_add[A_DEX]--;
947                         if (p_ptr->lev > 40) p_ptr->stat_add[A_DEX]--;
948                         if (p_ptr->lev > 45) p_ptr->stat_add[A_DEX]--;
949
950                         if (p_ptr->lev > 25) p_ptr->stat_add[A_CON]++;
951                         if (p_ptr->lev > 40) p_ptr->stat_add[A_CON]++;
952                         if (p_ptr->lev > 45) p_ptr->stat_add[A_CON]++;
953                         break;
954                 case RACE_ANGEL:
955                         p_ptr->levitation = TRUE;
956                         p_ptr->see_inv = TRUE;
957                         break;
958                 case RACE_DEMON:
959                         p_ptr->resist_fire = TRUE;
960                         p_ptr->resist_neth = TRUE;
961                         p_ptr->hold_exp = TRUE;
962                         if (p_ptr->lev > 9) p_ptr->see_inv = TRUE;
963                         if (p_ptr->lev > 44)
964                         {
965                                 p_ptr->oppose_fire = 1;
966                                 p_ptr->redraw |= PR_STATUS;
967                         }
968                         break;
969                 case RACE_DUNADAN:
970                         p_ptr->sustain_con = TRUE;
971                         break;
972                 case RACE_S_FAIRY:
973                         p_ptr->levitation = TRUE;
974                         break;
975                 case RACE_KUTAR:
976                         p_ptr->resist_conf = TRUE;
977                         break;
978                 case RACE_ANDROID:
979                         p_ptr->slow_digest = TRUE;
980                         p_ptr->free_act = TRUE;
981                         p_ptr->resist_pois = TRUE;
982                         p_ptr->hold_exp = TRUE;
983                         break;
984                 case RACE_MERFOLK:
985                         p_ptr->resist_water = TRUE;
986                         break;
987                 default:
988                         /* Do nothing */
989                         ;
990                 }
991         }
992
993         if (p_ptr->ult_res || (p_ptr->special_defense & KATA_MUSOU))
994         {
995                 p_ptr->see_inv = TRUE;
996                 p_ptr->free_act = TRUE;
997                 p_ptr->slow_digest = TRUE;
998                 p_ptr->regenerate = TRUE;
999                 p_ptr->levitation = TRUE;
1000                 p_ptr->hold_exp = TRUE;
1001                 p_ptr->telepathy = TRUE;
1002                 p_ptr->lite = TRUE;
1003                 p_ptr->sustain_str = TRUE;
1004                 p_ptr->sustain_int = TRUE;
1005                 p_ptr->sustain_wis = TRUE;
1006                 p_ptr->sustain_con = TRUE;
1007                 p_ptr->sustain_dex = TRUE;
1008                 p_ptr->sustain_chr = TRUE;
1009                 p_ptr->resist_acid = TRUE;
1010                 p_ptr->resist_elec = TRUE;
1011                 p_ptr->resist_fire = TRUE;
1012                 p_ptr->resist_cold = TRUE;
1013                 p_ptr->resist_pois = TRUE;
1014                 p_ptr->resist_conf = TRUE;
1015                 p_ptr->resist_sound = TRUE;
1016                 p_ptr->resist_lite = TRUE;
1017                 p_ptr->resist_dark = TRUE;
1018                 p_ptr->resist_chaos = TRUE;
1019                 p_ptr->resist_disen = TRUE;
1020                 p_ptr->resist_shard = TRUE;
1021                 p_ptr->resist_nexus = TRUE;
1022                 p_ptr->resist_blind = TRUE;
1023                 p_ptr->resist_neth = TRUE;
1024                 p_ptr->resist_fear = TRUE;
1025                 p_ptr->reflect = TRUE;
1026                 p_ptr->sh_fire = TRUE;
1027                 p_ptr->sh_elec = TRUE;
1028                 p_ptr->sh_cold = TRUE;
1029                 p_ptr->to_a += 100;
1030                 p_ptr->dis_to_a += 100;
1031         }
1032         /* Temporary shield */
1033         else if (p_ptr->tsubureru || p_ptr->shield || p_ptr->magicdef)
1034         {
1035                 p_ptr->to_a += 50;
1036                 p_ptr->dis_to_a += 50;
1037         }
1038
1039         if (p_ptr->tim_res_nether)
1040         {
1041                 p_ptr->resist_neth = TRUE;
1042         }
1043         if (p_ptr->tim_sh_fire)
1044         {
1045                 p_ptr->sh_fire = TRUE;
1046         }
1047         if (p_ptr->tim_res_time)
1048         {
1049                 p_ptr->resist_time = TRUE;
1050         }
1051
1052         /* Sexy Gal */
1053         if (p_ptr->pseikaku == SEIKAKU_SEXY) p_ptr->cursed |= (TRC_AGGRAVATE);
1054
1055         if (p_ptr->pseikaku == SEIKAKU_NAMAKE) p_ptr->to_m_chance += 10;
1056         if (p_ptr->pseikaku == SEIKAKU_KIREMONO) p_ptr->to_m_chance -= 3;
1057         if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) p_ptr->to_m_chance++;
1058
1059         if (p_ptr->pseikaku == SEIKAKU_CHARGEMAN)
1060         {
1061                 p_ptr->to_m_chance += 5;
1062                 p_ptr->resist_conf = TRUE;
1063         }
1064
1065         /* Lucky man */
1066         if (p_ptr->pseikaku == SEIKAKU_LUCKY) p_ptr->muta3 |= MUT3_GOOD_LUCK;
1067
1068         if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)
1069         {
1070                 p_ptr->resist_blind = TRUE;
1071                 p_ptr->resist_conf = TRUE;
1072                 p_ptr->hold_exp = TRUE;
1073                 if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
1074
1075                 if ((p_ptr->prace != RACE_KLACKON) && (p_ptr->prace != RACE_SPRITE))
1076                         /* Munchkin become faster */
1077                         new_speed += (p_ptr->lev) / 10 + 5;
1078         }
1079
1080         if (music_singing(MUSIC_WALL))
1081         {
1082                 p_ptr->kill_wall = TRUE;
1083         }
1084
1085         /* Hack -- apply racial/class stat maxes */
1086         /* Apply the racial modifiers */
1087         for (i = 0; i < A_MAX; i++)
1088         {
1089                 /* Modify the stats for "race" */
1090                 p_ptr->stat_add[i] += (tmp_rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i]);
1091         }
1092
1093
1094         /* I'm adding the mutations here for the lack of a better place... */
1095         if (p_ptr->muta3)
1096         {
1097                 /* Hyper Strength */
1098                 if (p_ptr->muta3 & MUT3_HYPER_STR)
1099                 {
1100                         p_ptr->stat_add[A_STR] += 4;
1101                 }
1102
1103                 /* Puny */
1104                 if (p_ptr->muta3 & MUT3_PUNY)
1105                 {
1106                         p_ptr->stat_add[A_STR] -= 4;
1107                 }
1108
1109                 /* Living computer */
1110                 if (p_ptr->muta3 & MUT3_HYPER_INT)
1111                 {
1112                         p_ptr->stat_add[A_INT] += 4;
1113                         p_ptr->stat_add[A_WIS] += 4;
1114                 }
1115
1116                 /* Moronic */
1117                 if (p_ptr->muta3 & MUT3_MORONIC)
1118                 {
1119                         p_ptr->stat_add[A_INT] -= 4;
1120                         p_ptr->stat_add[A_WIS] -= 4;
1121                 }
1122
1123                 if (p_ptr->muta3 & MUT3_RESILIENT)
1124                 {
1125                         p_ptr->stat_add[A_CON] += 4;
1126                 }
1127
1128                 if (p_ptr->muta3 & MUT3_XTRA_FAT)
1129                 {
1130                         p_ptr->stat_add[A_CON] += 2;
1131                         new_speed -= 2;
1132                 }
1133
1134                 if (p_ptr->muta3 & MUT3_ALBINO)
1135                 {
1136                         p_ptr->stat_add[A_CON] -= 4;
1137                 }
1138
1139                 if (p_ptr->muta3 & MUT3_FLESH_ROT)
1140                 {
1141                         p_ptr->stat_add[A_CON] -= 2;
1142                         p_ptr->stat_add[A_CHR] -= 1;
1143                         p_ptr->regenerate = FALSE;
1144                         /* Cancel innate regeneration */
1145                 }
1146
1147                 if (p_ptr->muta3 & MUT3_SILLY_VOI)
1148                 {
1149                         p_ptr->stat_add[A_CHR] -= 4;
1150                 }
1151
1152                 if (p_ptr->muta3 & MUT3_BLANK_FAC)
1153                 {
1154                         p_ptr->stat_add[A_CHR] -= 1;
1155                 }
1156
1157                 if (p_ptr->muta3 & MUT3_XTRA_EYES)
1158                 {
1159                         p_ptr->skill_fos += 15;
1160                         p_ptr->skill_srh += 15;
1161                 }
1162
1163                 if (p_ptr->muta3 & MUT3_MAGIC_RES)
1164                 {
1165                         p_ptr->skill_sav += (15 + (p_ptr->lev / 5));
1166                 }
1167
1168                 if (p_ptr->muta3 & MUT3_XTRA_NOIS)
1169                 {
1170                         p_ptr->skill_stl -= 3;
1171                 }
1172
1173                 if (p_ptr->muta3 & MUT3_INFRAVIS)
1174                 {
1175                         p_ptr->see_infra += 3;
1176                 }
1177
1178                 if (p_ptr->muta3 & MUT3_XTRA_LEGS)
1179                 {
1180                         new_speed += 3;
1181                 }
1182
1183                 if (p_ptr->muta3 & MUT3_SHORT_LEG)
1184                 {
1185                         new_speed -= 3;
1186                 }
1187
1188                 if (p_ptr->muta3 & MUT3_ELEC_TOUC)
1189                 {
1190                         p_ptr->sh_elec = TRUE;
1191                 }
1192
1193                 if (p_ptr->muta3 & MUT3_FIRE_BODY)
1194                 {
1195                         p_ptr->sh_fire = TRUE;
1196                         p_ptr->lite = TRUE;
1197                 }
1198
1199                 if (p_ptr->muta3 & MUT3_WART_SKIN)
1200                 {
1201                         p_ptr->stat_add[A_CHR] -= 2;
1202                         p_ptr->to_a += 5;
1203                         p_ptr->dis_to_a += 5;
1204                 }
1205
1206                 if (p_ptr->muta3 & MUT3_SCALES)
1207                 {
1208                         p_ptr->stat_add[A_CHR] -= 1;
1209                         p_ptr->to_a += 10;
1210                         p_ptr->dis_to_a += 10;
1211                 }
1212
1213                 if (p_ptr->muta3 & MUT3_IRON_SKIN)
1214                 {
1215                         p_ptr->stat_add[A_DEX] -= 1;
1216                         p_ptr->to_a += 25;
1217                         p_ptr->dis_to_a += 25;
1218                 }
1219
1220                 if (p_ptr->muta3 & MUT3_WINGS)
1221                 {
1222                         p_ptr->levitation = TRUE;
1223                 }
1224
1225                 if (p_ptr->muta3 & MUT3_FEARLESS)
1226                 {
1227                         p_ptr->resist_fear = TRUE;
1228                 }
1229
1230                 if (p_ptr->muta3 & MUT3_REGEN)
1231                 {
1232                         p_ptr->regenerate = TRUE;
1233                 }
1234
1235                 if (p_ptr->muta3 & MUT3_ESP)
1236                 {
1237                         p_ptr->telepathy = TRUE;
1238                 }
1239
1240                 if (p_ptr->muta3 & MUT3_LIMBER)
1241                 {
1242                         p_ptr->stat_add[A_DEX] += 3;
1243                 }
1244
1245                 if (p_ptr->muta3 & MUT3_ARTHRITIS)
1246                 {
1247                         p_ptr->stat_add[A_DEX] -= 3;
1248                 }
1249
1250                 if (p_ptr->muta3 & MUT3_MOTION)
1251                 {
1252                         p_ptr->free_act = TRUE;
1253                         p_ptr->skill_stl += 1;
1254                 }
1255
1256                 if (p_ptr->muta3 & MUT3_ILL_NORM)
1257                 {
1258                         p_ptr->stat_add[A_CHR] = 0;
1259                 }
1260         }
1261
1262         if (p_ptr->tsuyoshi)
1263         {
1264                 p_ptr->stat_add[A_STR] += 4;
1265                 p_ptr->stat_add[A_CON] += 4;
1266         }
1267
1268         /* Scan the usable p_ptr->inventory_list */
1269         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1270         {
1271                 int bonus_to_h, bonus_to_d;
1272                 o_ptr = &p_ptr->inventory_list[i];
1273                 if (!o_ptr->k_idx) continue;
1274
1275                 object_flags(o_ptr, flgs);
1276
1277                 p_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
1278                 if (o_ptr->name1 == ART_CHAINSWORD) p_ptr->cursed |= TRC_CHAINSWORD;
1279
1280                 /* Affect stats */
1281                 if (have_flag(flgs, TR_STR)) p_ptr->stat_add[A_STR] += o_ptr->pval;
1282                 if (have_flag(flgs, TR_INT)) p_ptr->stat_add[A_INT] += o_ptr->pval;
1283                 if (have_flag(flgs, TR_WIS)) p_ptr->stat_add[A_WIS] += o_ptr->pval;
1284                 if (have_flag(flgs, TR_DEX)) p_ptr->stat_add[A_DEX] += o_ptr->pval;
1285                 if (have_flag(flgs, TR_CON)) p_ptr->stat_add[A_CON] += o_ptr->pval;
1286                 if (have_flag(flgs, TR_CHR)) p_ptr->stat_add[A_CHR] += o_ptr->pval;
1287
1288                 if (have_flag(flgs, TR_MAGIC_MASTERY))    p_ptr->skill_dev += 8 * o_ptr->pval;
1289
1290                 /* Affect stealth */
1291                 if (have_flag(flgs, TR_STEALTH)) p_ptr->skill_stl += o_ptr->pval;
1292
1293                 /* Affect searching ability (factor of five) */
1294                 if (have_flag(flgs, TR_SEARCH)) p_ptr->skill_srh += (o_ptr->pval * 5);
1295
1296                 /* Affect searching frequency (factor of five) */
1297                 if (have_flag(flgs, TR_SEARCH)) p_ptr->skill_fos += (o_ptr->pval * 5);
1298
1299                 /* Affect infravision */
1300                 if (have_flag(flgs, TR_INFRA)) p_ptr->see_infra += o_ptr->pval;
1301
1302                 /* Affect digging (factor of 20) */
1303                 if (have_flag(flgs, TR_TUNNEL)) p_ptr->skill_dig += (o_ptr->pval * 20);
1304
1305                 /* Affect speed */
1306                 if (have_flag(flgs, TR_SPEED)) new_speed += o_ptr->pval;
1307
1308                 /* Affect blows */
1309                 if (have_flag(flgs, TR_BLOWS))
1310                 {
1311                         if ((i == INVEN_RARM || i == INVEN_RIGHT) && !p_ptr->ryoute) extra_blows[0] += o_ptr->pval;
1312                         else if ((i == INVEN_LARM || i == INVEN_LEFT) && !p_ptr->ryoute) extra_blows[1] += o_ptr->pval;
1313                         else { extra_blows[0] += o_ptr->pval; extra_blows[1] += o_ptr->pval; }
1314                 }
1315
1316                 /* Hack -- cause earthquakes */
1317                 if (have_flag(flgs, TR_IMPACT)) p_ptr->impact[(i == INVEN_RARM) ? 0 : 1] = TRUE;
1318
1319                 /* Various flags */
1320                 if (have_flag(flgs, TR_AGGRAVATE))   p_ptr->cursed |= TRC_AGGRAVATE;
1321                 if (have_flag(flgs, TR_DRAIN_EXP))   p_ptr->cursed |= TRC_DRAIN_EXP;
1322                 if (have_flag(flgs, TR_TY_CURSE))    p_ptr->cursed |= TRC_TY_CURSE;
1323                 if (have_flag(flgs, TR_ADD_L_CURSE)) p_ptr->cursed |= TRC_ADD_L_CURSE;
1324                 if (have_flag(flgs, TR_ADD_H_CURSE)) p_ptr->cursed |= TRC_ADD_H_CURSE;
1325                 if (have_flag(flgs, TR_DRAIN_HP))    p_ptr->cursed |= TRC_DRAIN_HP;
1326                 if (have_flag(flgs, TR_DRAIN_MANA))  p_ptr->cursed |= TRC_DRAIN_MANA;
1327                 if (have_flag(flgs, TR_CALL_ANIMAL)) p_ptr->cursed |= TRC_CALL_ANIMAL;
1328                 if (have_flag(flgs, TR_CALL_DEMON))  p_ptr->cursed |= TRC_CALL_DEMON;
1329                 if (have_flag(flgs, TR_CALL_DRAGON)) p_ptr->cursed |= TRC_CALL_DRAGON;
1330                 if (have_flag(flgs, TR_CALL_UNDEAD)) p_ptr->cursed |= TRC_CALL_UNDEAD;
1331                 if (have_flag(flgs, TR_COWARDICE))   p_ptr->cursed |= TRC_COWARDICE;
1332                 if (have_flag(flgs, TR_LOW_MELEE))   p_ptr->cursed |= TRC_LOW_MELEE;
1333                 if (have_flag(flgs, TR_LOW_AC))      p_ptr->cursed |= TRC_LOW_AC;
1334                 if (have_flag(flgs, TR_LOW_MAGIC))   p_ptr->cursed |= TRC_LOW_MAGIC;
1335                 if (have_flag(flgs, TR_FAST_DIGEST)) p_ptr->cursed |= TRC_FAST_DIGEST;
1336                 if (have_flag(flgs, TR_SLOW_REGEN))  p_ptr->cursed |= TRC_SLOW_REGEN;
1337                 if (have_flag(flgs, TR_DEC_MANA))    p_ptr->dec_mana = TRUE;
1338                 if (have_flag(flgs, TR_BLESSED))     p_ptr->bless_blade = TRUE;
1339                 if (have_flag(flgs, TR_XTRA_MIGHT))  p_ptr->xtra_might = TRUE;
1340                 if (have_flag(flgs, TR_SLOW_DIGEST)) p_ptr->slow_digest = TRUE;
1341                 if (have_flag(flgs, TR_REGEN))       p_ptr->regenerate = TRUE;
1342                 if (have_flag(flgs, TR_TELEPATHY))   p_ptr->telepathy = TRUE;
1343                 if (have_flag(flgs, TR_ESP_ANIMAL))  p_ptr->esp_animal = TRUE;
1344                 if (have_flag(flgs, TR_ESP_UNDEAD))  p_ptr->esp_undead = TRUE;
1345                 if (have_flag(flgs, TR_ESP_DEMON))   p_ptr->esp_demon = TRUE;
1346                 if (have_flag(flgs, TR_ESP_ORC))     p_ptr->esp_orc = TRUE;
1347                 if (have_flag(flgs, TR_ESP_TROLL))   p_ptr->esp_troll = TRUE;
1348                 if (have_flag(flgs, TR_ESP_GIANT))   p_ptr->esp_giant = TRUE;
1349                 if (have_flag(flgs, TR_ESP_DRAGON))  p_ptr->esp_dragon = TRUE;
1350                 if (have_flag(flgs, TR_ESP_HUMAN))   p_ptr->esp_human = TRUE;
1351                 if (have_flag(flgs, TR_ESP_EVIL))    p_ptr->esp_evil = TRUE;
1352                 if (have_flag(flgs, TR_ESP_GOOD))    p_ptr->esp_good = TRUE;
1353                 if (have_flag(flgs, TR_ESP_NONLIVING)) p_ptr->esp_nonliving = TRUE;
1354                 if (have_flag(flgs, TR_ESP_UNIQUE))  p_ptr->esp_unique = TRUE;
1355
1356                 if (have_flag(flgs, TR_SEE_INVIS))   p_ptr->see_inv = TRUE;
1357                 if (have_flag(flgs, TR_LEVITATION))     p_ptr->levitation = TRUE;
1358                 if (have_flag(flgs, TR_FREE_ACT))    p_ptr->free_act = TRUE;
1359                 if (have_flag(flgs, TR_HOLD_EXP))   p_ptr->hold_exp = TRUE;
1360                 if (have_flag(flgs, TR_WARNING)) {
1361                         if (!o_ptr->inscription || !(my_strchr(quark_str(o_ptr->inscription), '$')))
1362                                 p_ptr->warning = TRUE;
1363                 }
1364
1365                 if (have_flag(flgs, TR_TELEPORT))
1366                 {
1367                         if (object_is_cursed(o_ptr)) p_ptr->cursed |= TRC_TELEPORT;
1368                         else
1369                         {
1370                                 concptr insc = quark_str(o_ptr->inscription);
1371
1372                                 if (o_ptr->inscription && my_strchr(insc, '.'))
1373                                 {
1374                                         /*
1375                                          * {.} will stop random teleportation.
1376                                          */
1377                                 }
1378                                 else
1379                                 {
1380                                         /* Controlled random teleportation */
1381                                         p_ptr->cursed |= TRC_TELEPORT_SELF;
1382                                 }
1383                         }
1384                 }
1385
1386                 /* Immunity flags */
1387                 if (have_flag(flgs, TR_IM_FIRE)) p_ptr->immune_fire = TRUE;
1388                 if (have_flag(flgs, TR_IM_ACID)) p_ptr->immune_acid = TRUE;
1389                 if (have_flag(flgs, TR_IM_COLD)) p_ptr->immune_cold = TRUE;
1390                 if (have_flag(flgs, TR_IM_ELEC)) p_ptr->immune_elec = TRUE;
1391
1392                 /* Resistance flags */
1393                 if (have_flag(flgs, TR_RES_ACID))   p_ptr->resist_acid = TRUE;
1394                 if (have_flag(flgs, TR_RES_ELEC))   p_ptr->resist_elec = TRUE;
1395                 if (have_flag(flgs, TR_RES_FIRE))   p_ptr->resist_fire = TRUE;
1396                 if (have_flag(flgs, TR_RES_COLD))   p_ptr->resist_cold = TRUE;
1397                 if (have_flag(flgs, TR_RES_POIS))   p_ptr->resist_pois = TRUE;
1398                 if (have_flag(flgs, TR_RES_FEAR))   p_ptr->resist_fear = TRUE;
1399                 if (have_flag(flgs, TR_RES_CONF))   p_ptr->resist_conf = TRUE;
1400                 if (have_flag(flgs, TR_RES_SOUND))  p_ptr->resist_sound = TRUE;
1401                 if (have_flag(flgs, TR_RES_LITE))   p_ptr->resist_lite = TRUE;
1402                 if (have_flag(flgs, TR_RES_DARK))   p_ptr->resist_dark = TRUE;
1403                 if (have_flag(flgs, TR_RES_CHAOS))  p_ptr->resist_chaos = TRUE;
1404                 if (have_flag(flgs, TR_RES_DISEN))  p_ptr->resist_disen = TRUE;
1405                 if (have_flag(flgs, TR_RES_SHARDS)) p_ptr->resist_shard = TRUE;
1406                 if (have_flag(flgs, TR_RES_NEXUS))  p_ptr->resist_nexus = TRUE;
1407                 if (have_flag(flgs, TR_RES_BLIND))  p_ptr->resist_blind = TRUE;
1408                 if (have_flag(flgs, TR_RES_NETHER)) p_ptr->resist_neth = TRUE;
1409
1410                 if (have_flag(flgs, TR_REFLECT))  p_ptr->reflect = TRUE;
1411                 if (have_flag(flgs, TR_SH_FIRE))  p_ptr->sh_fire = TRUE;
1412                 if (have_flag(flgs, TR_SH_ELEC))  p_ptr->sh_elec = TRUE;
1413                 if (have_flag(flgs, TR_SH_COLD))  p_ptr->sh_cold = TRUE;
1414                 if (have_flag(flgs, TR_NO_MAGIC)) p_ptr->anti_magic = TRUE;
1415                 if (have_flag(flgs, TR_NO_TELE))  p_ptr->anti_tele = TRUE;
1416
1417                 /* Sustain flags */
1418                 if (have_flag(flgs, TR_SUST_STR)) p_ptr->sustain_str = TRUE;
1419                 if (have_flag(flgs, TR_SUST_INT)) p_ptr->sustain_int = TRUE;
1420                 if (have_flag(flgs, TR_SUST_WIS)) p_ptr->sustain_wis = TRUE;
1421                 if (have_flag(flgs, TR_SUST_DEX)) p_ptr->sustain_dex = TRUE;
1422                 if (have_flag(flgs, TR_SUST_CON)) p_ptr->sustain_con = TRUE;
1423                 if (have_flag(flgs, TR_SUST_CHR)) p_ptr->sustain_chr = TRUE;
1424
1425                 if (o_ptr->name2 == EGO_YOIYAMI) yoiyami = TRUE;
1426                 if (o_ptr->name2 == EGO_2WEAPON) easy_2weapon = TRUE;
1427                 if (o_ptr->name2 == EGO_RING_RES_TIME) p_ptr->resist_time = TRUE;
1428                 if (o_ptr->name2 == EGO_RING_THROW) p_ptr->mighty_throw = TRUE;
1429                 if (have_flag(flgs, TR_EASY_SPELL)) p_ptr->easy_spell = TRUE;
1430                 if (o_ptr->name2 == EGO_AMU_FOOL) p_ptr->heavy_spell = TRUE;
1431                 if (o_ptr->name2 == EGO_AMU_NAIVETY) down_saving = TRUE;
1432
1433                 if (o_ptr->curse_flags & TRC_LOW_MAGIC)
1434                 {
1435                         if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
1436                         {
1437                                 p_ptr->to_m_chance += 10;
1438                         }
1439                         else
1440                         {
1441                                 p_ptr->to_m_chance += 3;
1442                         }
1443                 }
1444
1445                 if (o_ptr->tval == TV_CAPTURE) continue;
1446
1447                 /* Modify the base armor class */
1448                 p_ptr->ac += o_ptr->ac;
1449
1450                 /* The base armor class is always known */
1451                 p_ptr->dis_ac += o_ptr->ac;
1452
1453                 /* Apply the bonuses to armor class */
1454                 p_ptr->to_a += o_ptr->to_a;
1455
1456                 /* Apply the mental bonuses to armor class, if known */
1457                 if (object_is_known(o_ptr)) p_ptr->dis_to_a += o_ptr->to_a;
1458
1459                 if (o_ptr->curse_flags & TRC_LOW_MELEE)
1460                 {
1461                         int slot = i - INVEN_RARM;
1462                         if (slot < 2)
1463                         {
1464                                 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
1465                                 {
1466                                         p_ptr->to_h[slot] -= 15;
1467                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 15;
1468                                 }
1469                                 else
1470                                 {
1471                                         p_ptr->to_h[slot] -= 5;
1472                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 5;
1473                                 }
1474                         }
1475                         else
1476                         {
1477                                 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
1478                                 {
1479                                         p_ptr->to_h_b -= 15;
1480                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 15;
1481                                 }
1482                                 else
1483                                 {
1484                                         p_ptr->to_h_b -= 5;
1485                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 5;
1486                                 }
1487                         }
1488                 }
1489
1490                 if (o_ptr->curse_flags & TRC_LOW_AC)
1491                 {
1492                         if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
1493                         {
1494                                 p_ptr->to_a -= 30;
1495                                 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 30;
1496                         }
1497                         else
1498                         {
1499                                 p_ptr->to_a -= 10;
1500                                 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 10;
1501                         }
1502                 }
1503
1504                 /* Hack -- do not apply "weapon" bonuses */
1505                 if (i == INVEN_RARM && has_melee_weapon(i)) continue;
1506                 if (i == INVEN_LARM && has_melee_weapon(i)) continue;
1507
1508                 /* Hack -- do not apply "bow" bonuses */
1509                 if (i == INVEN_BOW) continue;
1510
1511                 bonus_to_h = o_ptr->to_h;
1512                 bonus_to_d = o_ptr->to_d;
1513
1514                 if (p_ptr->pclass == CLASS_NINJA)
1515                 {
1516                         if (o_ptr->to_h > 0) bonus_to_h = (o_ptr->to_h + 1) / 2;
1517                         if (o_ptr->to_d > 0) bonus_to_d = (o_ptr->to_d + 1) / 2;
1518                 }
1519
1520                 /* To Bow and Natural attack */
1521
1522                 /* Apply the bonuses to hit/damage */
1523                 p_ptr->to_h_b += (s16b)bonus_to_h;
1524                 p_ptr->to_h_m += (s16b)bonus_to_h;
1525                 p_ptr->to_d_m += (s16b)bonus_to_d;
1526
1527                 /* Apply the mental bonuses tp hit/damage, if known */
1528                 if (object_is_known(o_ptr)) p_ptr->dis_to_h_b += (s16b)bonus_to_h;
1529
1530                 /* To Melee */
1531                 if ((i == INVEN_LEFT || i == INVEN_RIGHT) && !p_ptr->ryoute)
1532                 {
1533                         /* Apply the bonuses to hit/damage */
1534                         p_ptr->to_h[i - INVEN_RIGHT] += (s16b)bonus_to_h;
1535                         p_ptr->to_d[i - INVEN_RIGHT] += (s16b)bonus_to_d;
1536
1537                         /* Apply the mental bonuses tp hit/damage, if known */
1538                         if (object_is_known(o_ptr))
1539                         {
1540                                 p_ptr->dis_to_h[i - INVEN_RIGHT] += (s16b)bonus_to_h;
1541                                 p_ptr->dis_to_d[i - INVEN_RIGHT] += (s16b)bonus_to_d;
1542                         }
1543                 }
1544                 else if (p_ptr->migite && p_ptr->hidarite)
1545                 {
1546                         /* Apply the bonuses to hit/damage */
1547                         p_ptr->to_h[0] += (bonus_to_h > 0) ? (bonus_to_h + 1) / 2 : bonus_to_h;
1548                         p_ptr->to_h[1] += (bonus_to_h > 0) ? bonus_to_h / 2 : bonus_to_h;
1549                         p_ptr->to_d[0] += (bonus_to_d > 0) ? (bonus_to_d + 1) / 2 : bonus_to_d;
1550                         p_ptr->to_d[1] += (bonus_to_d > 0) ? bonus_to_d / 2 : bonus_to_d;
1551
1552                         /* Apply the mental bonuses tp hit/damage, if known */
1553                         if (object_is_known(o_ptr))
1554                         {
1555                                 p_ptr->dis_to_h[0] += (bonus_to_h > 0) ? (bonus_to_h + 1) / 2 : bonus_to_h;
1556                                 p_ptr->dis_to_h[1] += (bonus_to_h > 0) ? bonus_to_h / 2 : bonus_to_h;
1557                                 p_ptr->dis_to_d[0] += (bonus_to_d > 0) ? (bonus_to_d + 1) / 2 : bonus_to_d;
1558                                 p_ptr->dis_to_d[1] += (bonus_to_d > 0) ? bonus_to_d / 2 : bonus_to_d;
1559                         }
1560                 }
1561                 else
1562                 {
1563                         /* Apply the bonuses to hit/damage */
1564                         p_ptr->to_h[default_hand] += (s16b)bonus_to_h;
1565                         p_ptr->to_d[default_hand] += (s16b)bonus_to_d;
1566
1567                         /* Apply the mental bonuses to hit/damage, if known */
1568                         if (object_is_known(o_ptr))
1569                         {
1570                                 p_ptr->dis_to_h[default_hand] += (s16b)bonus_to_h;
1571                                 p_ptr->dis_to_d[default_hand] += (s16b)bonus_to_d;
1572                         }
1573                 }
1574         }
1575
1576         /* Shield skill bonus */
1577         if (object_is_armour(&p_ptr->inventory_list[INVEN_RARM]) || object_is_armour(&p_ptr->inventory_list[INVEN_LARM]))
1578         {
1579                 p_ptr->ac += p_ptr->skill_exp[GINOU_SHIELD] * (1 + p_ptr->lev / 22) / 2000;
1580                 p_ptr->dis_ac += p_ptr->skill_exp[GINOU_SHIELD] * (1 + p_ptr->lev / 22) / 2000;
1581         }
1582
1583         if (old_mighty_throw != p_ptr->mighty_throw)
1584         {
1585                 /* Redraw average damege display of Shuriken */
1586                 p_ptr->window |= PW_INVEN;
1587         }
1588
1589         if (p_ptr->cursed & TRC_TELEPORT) p_ptr->cursed &= ~(TRC_TELEPORT_SELF);
1590
1591         /* Monks get extra ac for armour _not worn_ */
1592         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER)) && !heavy_armor())
1593         {
1594                 if (!(p_ptr->inventory_list[INVEN_BODY].k_idx))
1595                 {
1596                         p_ptr->to_a += (p_ptr->lev * 3) / 2;
1597                         p_ptr->dis_to_a += (p_ptr->lev * 3) / 2;
1598                 }
1599                 if (!(p_ptr->inventory_list[INVEN_OUTER].k_idx) && (p_ptr->lev > 15))
1600                 {
1601                         p_ptr->to_a += ((p_ptr->lev - 13) / 3);
1602                         p_ptr->dis_to_a += ((p_ptr->lev - 13) / 3);
1603                 }
1604                 if (!(p_ptr->inventory_list[INVEN_LARM].k_idx) && (p_ptr->lev > 10))
1605                 {
1606                         p_ptr->to_a += ((p_ptr->lev - 8) / 3);
1607                         p_ptr->dis_to_a += ((p_ptr->lev - 8) / 3);
1608                 }
1609                 if (!(p_ptr->inventory_list[INVEN_HEAD].k_idx) && (p_ptr->lev > 4))
1610                 {
1611                         p_ptr->to_a += (p_ptr->lev - 2) / 3;
1612                         p_ptr->dis_to_a += (p_ptr->lev - 2) / 3;
1613                 }
1614                 if (!(p_ptr->inventory_list[INVEN_HANDS].k_idx))
1615                 {
1616                         p_ptr->to_a += (p_ptr->lev / 2);
1617                         p_ptr->dis_to_a += (p_ptr->lev / 2);
1618                 }
1619                 if (!(p_ptr->inventory_list[INVEN_FEET].k_idx))
1620                 {
1621                         p_ptr->to_a += (p_ptr->lev / 3);
1622                         p_ptr->dis_to_a += (p_ptr->lev / 3);
1623                 }
1624                 if (p_ptr->special_defense & KAMAE_BYAKKO)
1625                 {
1626                         p_ptr->stat_add[A_STR] += 2;
1627                         p_ptr->stat_add[A_DEX] += 2;
1628                         p_ptr->stat_add[A_CON] -= 3;
1629                 }
1630                 else if (p_ptr->special_defense & KAMAE_SEIRYU)
1631                 {
1632                 }
1633                 else if (p_ptr->special_defense & KAMAE_GENBU)
1634                 {
1635                         p_ptr->stat_add[A_INT] -= 1;
1636                         p_ptr->stat_add[A_WIS] -= 1;
1637                         p_ptr->stat_add[A_DEX] -= 2;
1638                         p_ptr->stat_add[A_CON] += 3;
1639                 }
1640                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
1641                 {
1642                         p_ptr->stat_add[A_STR] -= 2;
1643                         p_ptr->stat_add[A_INT] += 1;
1644                         p_ptr->stat_add[A_WIS] += 1;
1645                         p_ptr->stat_add[A_DEX] += 2;
1646                         p_ptr->stat_add[A_CON] -= 2;
1647                 }
1648         }
1649
1650         if (p_ptr->special_defense & KATA_KOUKIJIN)
1651         {
1652                 for (i = 0; i < A_MAX; i++)
1653                         p_ptr->stat_add[i] += 5;
1654                 p_ptr->to_a -= 50;
1655                 p_ptr->dis_to_a -= 50;
1656         }
1657
1658         /* Hack -- aura of fire also provides light */
1659         if (p_ptr->sh_fire) p_ptr->lite = TRUE;
1660
1661         /* Golems also get an intrinsic AC bonus */
1662         if (prace_is_(RACE_GOLEM) || prace_is_(RACE_ANDROID))
1663         {
1664                 p_ptr->to_a += 10 + (p_ptr->lev * 2 / 5);
1665                 p_ptr->dis_to_a += 10 + (p_ptr->lev * 2 / 5);
1666         }
1667
1668         /* Hex bonuses */
1669         if (p_ptr->realm1 == REALM_HEX)
1670         {
1671                 if (hex_spelling_any()) p_ptr->skill_stl -= (1 + CASTING_HEX_NUM(p_ptr));
1672                 if (hex_spelling(HEX_DETECT_EVIL)) p_ptr->esp_evil = TRUE;
1673                 if (hex_spelling(HEX_XTRA_MIGHT)) p_ptr->stat_add[A_STR] += 4;
1674                 if (hex_spelling(HEX_BUILDING))
1675                 {
1676                         p_ptr->stat_add[A_STR] += 4;
1677                         p_ptr->stat_add[A_DEX] += 4;
1678                         p_ptr->stat_add[A_CON] += 4;
1679                 }
1680                 if (hex_spelling(HEX_DEMON_AURA))
1681                 {
1682                         p_ptr->sh_fire = TRUE;
1683                         p_ptr->regenerate = TRUE;
1684                 }
1685                 if (hex_spelling(HEX_ICE_ARMOR))
1686                 {
1687                         p_ptr->sh_cold = TRUE;
1688                         p_ptr->to_a += 30;
1689                         p_ptr->dis_to_a += 30;
1690                 }
1691                 if (hex_spelling(HEX_SHOCK_CLOAK))
1692                 {
1693                         p_ptr->sh_elec = TRUE;
1694                         new_speed += 3;
1695                 }
1696                 for (i = INVEN_RARM; i <= INVEN_FEET; i++)
1697                 {
1698                         ARMOUR_CLASS ac = 0;
1699                         o_ptr = &p_ptr->inventory_list[i];
1700                         if (!o_ptr->k_idx) continue;
1701                         if (!object_is_armour(o_ptr)) continue;
1702                         if (!object_is_cursed(o_ptr)) continue;
1703                         ac += 5;
1704                         if (o_ptr->curse_flags & TRC_HEAVY_CURSE) ac += 7;
1705                         if (o_ptr->curse_flags & TRC_PERMA_CURSE) ac += 13;
1706                         p_ptr->to_a += (s16b)ac;
1707                         p_ptr->dis_to_a += (s16b)ac;
1708                 }
1709         }
1710
1711         /* Calculate stats */
1712         for (i = 0; i < A_MAX; i++)
1713         {
1714                 int top, use, ind;
1715
1716                 /* Extract the new "stat_use" value for the stat */
1717                 top = modify_stat_value(p_ptr->stat_max[i], p_ptr->stat_add[i]);
1718
1719                 /* Notice changes */
1720                 if (p_ptr->stat_top[i] != top)
1721                 {
1722                         /* Save the new value */
1723                         p_ptr->stat_top[i] = (s16b)top;
1724                         p_ptr->redraw |= (PR_STATS);
1725                         p_ptr->window |= (PW_PLAYER);
1726                 }
1727
1728
1729                 /* Extract the new "stat_use" value for the stat */
1730                 use = modify_stat_value(p_ptr->stat_cur[i], p_ptr->stat_add[i]);
1731
1732                 if ((i == A_CHR) && (p_ptr->muta3 & MUT3_ILL_NORM))
1733                 {
1734                         /* 10 to 18/90 charisma, guaranteed, based on level */
1735                         if (use < 8 + 2 * p_ptr->lev)
1736                         {
1737                                 use = 8 + 2 * p_ptr->lev;
1738                         }
1739                 }
1740
1741                 /* Notice changes */
1742                 if (p_ptr->stat_use[i] != use)
1743                 {
1744                         /* Save the new value */
1745                         p_ptr->stat_use[i] = (s16b)use;
1746                         p_ptr->redraw |= (PR_STATS);
1747                         p_ptr->window |= (PW_PLAYER);
1748                 }
1749
1750
1751                 /* Values: 3, 4, ..., 17 */
1752                 if (use <= 18) ind = (use - 3);
1753
1754                 /* Ranges: 18/00-18/09, ..., 18/210-18/219 */
1755                 else if (use <= 18 + 219) ind = (15 + (use - 18) / 10);
1756
1757                 /* Range: 18/220+ */
1758                 else ind = (37);
1759
1760                 /* Notice changes */
1761                 if (p_ptr->stat_ind[i] != ind)
1762                 {
1763                         /* Save the new index */
1764                         p_ptr->stat_ind[i] = (s16b)ind;
1765
1766                         /* Change in CON affects Hitpoints */
1767                         if (i == A_CON)
1768                         {
1769                                 p_ptr->update |= (PU_HP);
1770                         }
1771
1772                         /* Change in INT may affect Mana/Spells */
1773                         else if (i == A_INT)
1774                         {
1775                                 if (mp_ptr->spell_stat == A_INT)
1776                                 {
1777                                         p_ptr->update |= (PU_MANA | PU_SPELLS);
1778                                 }
1779                         }
1780
1781                         /* Change in WIS may affect Mana/Spells */
1782                         else if (i == A_WIS)
1783                         {
1784                                 if (mp_ptr->spell_stat == A_WIS)
1785                                 {
1786                                         p_ptr->update |= (PU_MANA | PU_SPELLS);
1787                                 }
1788                         }
1789
1790                         /* Change in WIS may affect Mana/Spells */
1791                         else if (i == A_CHR)
1792                         {
1793                                 if (mp_ptr->spell_stat == A_CHR)
1794                                 {
1795                                         p_ptr->update |= (PU_MANA | PU_SPELLS);
1796                                 }
1797                         }
1798
1799                         p_ptr->window |= (PW_PLAYER);
1800                 }
1801         }
1802
1803
1804         /* Apply temporary "stun" */
1805         if (p_ptr->stun > 50)
1806         {
1807                 p_ptr->to_h[0] -= 20;
1808                 p_ptr->to_h[1] -= 20;
1809                 p_ptr->to_h_b -= 20;
1810                 p_ptr->to_h_m -= 20;
1811                 p_ptr->dis_to_h[0] -= 20;
1812                 p_ptr->dis_to_h[1] -= 20;
1813                 p_ptr->dis_to_h_b -= 20;
1814                 p_ptr->to_d[0] -= 20;
1815                 p_ptr->to_d[1] -= 20;
1816                 p_ptr->to_d_m -= 20;
1817                 p_ptr->dis_to_d[0] -= 20;
1818                 p_ptr->dis_to_d[1] -= 20;
1819         }
1820         else if (p_ptr->stun)
1821         {
1822                 p_ptr->to_h[0] -= 5;
1823                 p_ptr->to_h[1] -= 5;
1824                 p_ptr->to_h_b -= 5;
1825                 p_ptr->to_h_m -= 5;
1826                 p_ptr->dis_to_h[0] -= 5;
1827                 p_ptr->dis_to_h[1] -= 5;
1828                 p_ptr->dis_to_h_b -= 5;
1829                 p_ptr->to_d[0] -= 5;
1830                 p_ptr->to_d[1] -= 5;
1831                 p_ptr->to_d_m -= 5;
1832                 p_ptr->dis_to_d[0] -= 5;
1833                 p_ptr->dis_to_d[1] -= 5;
1834         }
1835
1836         /* Wraith form */
1837         if (p_ptr->wraith_form)
1838         {
1839                 p_ptr->reflect = TRUE;
1840                 p_ptr->pass_wall = TRUE;
1841         }
1842
1843         if (p_ptr->kabenuke)
1844         {
1845                 p_ptr->pass_wall = TRUE;
1846         }
1847
1848         /* Temporary blessing */
1849         if (IS_BLESSED())
1850         {
1851                 p_ptr->to_a += 5;
1852                 p_ptr->dis_to_a += 5;
1853                 p_ptr->to_h[0] += 10;
1854                 p_ptr->to_h[1] += 10;
1855                 p_ptr->to_h_b += 10;
1856                 p_ptr->to_h_m += 10;
1857                 p_ptr->dis_to_h[0] += 10;
1858                 p_ptr->dis_to_h[1] += 10;
1859                 p_ptr->dis_to_h_b += 10;
1860         }
1861
1862         if (p_ptr->magicdef)
1863         {
1864                 p_ptr->resist_blind = TRUE;
1865                 p_ptr->resist_conf = TRUE;
1866                 p_ptr->reflect = TRUE;
1867                 p_ptr->free_act = TRUE;
1868                 p_ptr->levitation = TRUE;
1869         }
1870
1871         /* Temporary "Hero" */
1872         if (IS_HERO())
1873         {
1874                 p_ptr->to_h[0] += 12;
1875                 p_ptr->to_h[1] += 12;
1876                 p_ptr->to_h_b += 12;
1877                 p_ptr->to_h_m += 12;
1878                 p_ptr->dis_to_h[0] += 12;
1879                 p_ptr->dis_to_h[1] += 12;
1880                 p_ptr->dis_to_h_b += 12;
1881         }
1882
1883         /* Temporary "Beserk" */
1884         if (p_ptr->shero)
1885         {
1886                 p_ptr->to_h[0] += 12;
1887                 p_ptr->to_h[1] += 12;
1888                 p_ptr->to_h_b -= 12;
1889                 p_ptr->to_h_m += 12;
1890                 p_ptr->to_d[0] += 3 + (p_ptr->lev / 5);
1891                 p_ptr->to_d[1] += 3 + (p_ptr->lev / 5);
1892                 p_ptr->to_d_m += 3 + (p_ptr->lev / 5);
1893                 p_ptr->dis_to_h[0] += 12;
1894                 p_ptr->dis_to_h[1] += 12;
1895                 p_ptr->dis_to_h_b -= 12;
1896                 p_ptr->dis_to_d[0] += 3 + (p_ptr->lev / 5);
1897                 p_ptr->dis_to_d[1] += 3 + (p_ptr->lev / 5);
1898                 p_ptr->to_a -= 10;
1899                 p_ptr->dis_to_a -= 10;
1900                 p_ptr->skill_stl -= 7;
1901                 p_ptr->skill_dev -= 20;
1902                 p_ptr->skill_sav -= 30;
1903                 p_ptr->skill_srh -= 15;
1904                 p_ptr->skill_fos -= 15;
1905                 p_ptr->skill_tht -= 20;
1906                 p_ptr->skill_dig += 30;
1907         }
1908
1909         /* Temporary "fast" */
1910         if (IS_FAST())
1911         {
1912                 new_speed += 10;
1913         }
1914
1915         /* Temporary "slow" */
1916         if (p_ptr->slow)
1917         {
1918                 new_speed -= 10;
1919         }
1920
1921         /* Temporary "telepathy" */
1922         if (IS_TIM_ESP())
1923         {
1924                 p_ptr->telepathy = TRUE;
1925         }
1926
1927         if (p_ptr->ele_immune)
1928         {
1929                 if (p_ptr->special_defense & DEFENSE_ACID)
1930                         p_ptr->immune_acid = TRUE;
1931                 else if (p_ptr->special_defense & DEFENSE_ELEC)
1932                         p_ptr->immune_elec = TRUE;
1933                 else if (p_ptr->special_defense & DEFENSE_FIRE)
1934                         p_ptr->immune_fire = TRUE;
1935                 else if (p_ptr->special_defense & DEFENSE_COLD)
1936                         p_ptr->immune_cold = TRUE;
1937         }
1938
1939         /* Temporary see invisible */
1940         if (p_ptr->tim_invis)
1941         {
1942                 p_ptr->see_inv = TRUE;
1943         }
1944
1945         /* Temporary infravision boost */
1946         if (p_ptr->tim_infra)
1947         {
1948                 p_ptr->see_infra += 3;
1949         }
1950
1951         /* Temporary regeneration boost */
1952         if (p_ptr->tim_regen)
1953         {
1954                 p_ptr->regenerate = TRUE;
1955         }
1956
1957         /* Temporary levitation */
1958         if (p_ptr->tim_levitation)
1959         {
1960                 p_ptr->levitation = TRUE;
1961         }
1962
1963         /* Temporary reflection */
1964         if (p_ptr->tim_reflect)
1965         {
1966                 p_ptr->reflect = TRUE;
1967         }
1968
1969         /* Hack -- Hero/Shero -> Res fear */
1970         if (IS_HERO() || p_ptr->shero)
1971         {
1972                 p_ptr->resist_fear = TRUE;
1973         }
1974
1975
1976         /* Hack -- Telepathy Change */
1977         if (p_ptr->telepathy != old_telepathy)
1978         {
1979                 p_ptr->update |= (PU_MONSTERS);
1980         }
1981
1982         if ((p_ptr->esp_animal != old_esp_animal) ||
1983                 (p_ptr->esp_undead != old_esp_undead) ||
1984                 (p_ptr->esp_demon != old_esp_demon) ||
1985                 (p_ptr->esp_orc != old_esp_orc) ||
1986                 (p_ptr->esp_troll != old_esp_troll) ||
1987                 (p_ptr->esp_giant != old_esp_giant) ||
1988                 (p_ptr->esp_dragon != old_esp_dragon) ||
1989                 (p_ptr->esp_human != old_esp_human) ||
1990                 (p_ptr->esp_evil != old_esp_evil) ||
1991                 (p_ptr->esp_good != old_esp_good) ||
1992                 (p_ptr->esp_nonliving != old_esp_nonliving) ||
1993                 (p_ptr->esp_unique != old_esp_unique))
1994         {
1995                 p_ptr->update |= (PU_MONSTERS);
1996         }
1997
1998         /* Hack -- See Invis Change */
1999         if (p_ptr->see_inv != old_see_inv)
2000         {
2001                 p_ptr->update |= (PU_MONSTERS);
2002         }
2003
2004         /* Bloating slows the player down (a little) */
2005         if (p_ptr->food >= PY_FOOD_MAX) new_speed -= 10;
2006
2007         if (p_ptr->special_defense & KAMAE_SUZAKU) new_speed += 10;
2008
2009         if ((p_ptr->migite && (empty_hands_status & EMPTY_HAND_RARM)) ||
2010                 (p_ptr->hidarite && (empty_hands_status & EMPTY_HAND_LARM)))
2011         {
2012                 p_ptr->to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
2013                 p_ptr->dis_to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
2014         }
2015
2016         if (has_melee_weapon(INVEN_RARM) && has_melee_weapon(INVEN_LARM))
2017         {
2018                 int penalty1, penalty2;
2019                 penalty1 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - p_ptr->inventory_list[INVEN_RARM].weight) / 8);
2020                 penalty2 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - p_ptr->inventory_list[INVEN_LARM].weight) / 8);
2021                 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_QUICKTHORN) && (p_ptr->inventory_list[INVEN_LARM].name1 == ART_TINYTHORN))
2022                 {
2023                         penalty1 = penalty1 / 2 - 5;
2024                         penalty2 = penalty2 / 2 - 5;
2025                         new_speed += 7;
2026                         p_ptr->to_a += 10;
2027                         p_ptr->dis_to_a += 10;
2028                 }
2029                 if (easy_2weapon)
2030                 {
2031                         if (penalty1 > 0) penalty1 /= 2;
2032                         if (penalty2 > 0) penalty2 /= 2;
2033                 }
2034                 else if ((p_ptr->inventory_list[INVEN_LARM].tval == TV_SWORD) && ((p_ptr->inventory_list[INVEN_LARM].sval == SV_MAIN_GAUCHE) || (p_ptr->inventory_list[INVEN_LARM].sval == SV_WAKIZASHI)))
2035                 {
2036                         penalty1 = MAX(0, penalty1 - 10);
2037                         penalty2 = MAX(0, penalty2 - 10);
2038                 }
2039                 if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_MUSASI_KATANA) && (p_ptr->inventory_list[INVEN_LARM].name1 == ART_MUSASI_WAKIZASI))
2040                 {
2041                         penalty1 = MIN(0, penalty1);
2042                         penalty2 = MIN(0, penalty2);
2043                         p_ptr->to_a += 10;
2044                         p_ptr->dis_to_a += 10;
2045                 }
2046                 else
2047                 {
2048                         if ((p_ptr->inventory_list[INVEN_RARM].name1 == ART_MUSASI_KATANA) && (penalty1 > 0))
2049                                 penalty1 /= 2;
2050                         if ((p_ptr->inventory_list[INVEN_LARM].name1 == ART_MUSASI_WAKIZASI) && (penalty2 > 0))
2051                                 penalty2 /= 2;
2052                 }
2053                 if (p_ptr->inventory_list[INVEN_RARM].tval == TV_POLEARM) penalty1 += 10;
2054                 if (p_ptr->inventory_list[INVEN_LARM].tval == TV_POLEARM) penalty2 += 10;
2055                 p_ptr->to_h[0] -= (s16b)penalty1;
2056                 p_ptr->to_h[1] -= (s16b)penalty2;
2057                 p_ptr->dis_to_h[0] -= (s16b)penalty1;
2058                 p_ptr->dis_to_h[1] -= (s16b)penalty2;
2059         }
2060
2061         /* Extract the current weight (in tenth pounds) */
2062         j = p_ptr->total_weight;
2063
2064         if (!p_ptr->riding)
2065         {
2066                 /* Extract the "weight limit" (in tenth pounds) */
2067                 i = (int)weight_limit();
2068         }
2069         else
2070         {
2071                 monster_type *riding_m_ptr = &current_floor_ptr->m_list[p_ptr->riding];
2072                 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
2073                 SPEED speed = riding_m_ptr->mspeed;
2074
2075                 if (riding_m_ptr->mspeed > 110)
2076                 {
2077                         new_speed = 110 + (s16b)((speed - 110) * (p_ptr->skill_exp[GINOU_RIDING] * 3 + p_ptr->lev * 160L - 10000L) / (22000L));
2078                         if (new_speed < 110) new_speed = 110;
2079                 }
2080                 else
2081                 {
2082                         new_speed = speed;
2083                 }
2084                 new_speed += (p_ptr->skill_exp[GINOU_RIDING] + p_ptr->lev * 160L) / 3200;
2085                 if (MON_FAST(riding_m_ptr)) new_speed += 10;
2086                 if (MON_SLOW(riding_m_ptr)) new_speed -= 10;
2087                 riding_levitation = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? TRUE : FALSE;
2088                 if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC)) p_ptr->can_swim = TRUE;
2089
2090                 if (!(riding_r_ptr->flags2 & RF2_PASS_WALL)) p_ptr->pass_wall = FALSE;
2091                 if (riding_r_ptr->flags2 & RF2_KILL_WALL) p_ptr->kill_wall = TRUE;
2092
2093                 if (p_ptr->skill_exp[GINOU_RIDING] < RIDING_EXP_SKILLED) j += (p_ptr->wt * 3 * (RIDING_EXP_SKILLED - p_ptr->skill_exp[GINOU_RIDING])) / RIDING_EXP_SKILLED;
2094
2095                 /* Extract the "weight limit" */
2096                 i = 1500 + riding_r_ptr->level * 25;
2097         }
2098
2099         /* Apply "encumbrance" from weight */
2100         if (j > i) new_speed -= ((j - i) / (i / 5));
2101
2102         /* Searching slows the player down */
2103         if (p_ptr->action == ACTION_SEARCH) new_speed -= 10;
2104
2105         /* Feature bonus */
2106         if (p_ptr->prace == RACE_MERFOLK)
2107         {
2108                 if (have_flag(f_ptr->flags, FF_WATER))
2109                 {
2110                         new_speed += (2 + p_ptr->lev / 10);
2111                 }
2112                 else if (!p_ptr->levitation)
2113                 {
2114                         new_speed -= 2;
2115                 }
2116         }
2117
2118
2119         /* Actual Modifier Bonuses (Un-inflate stat bonuses) */
2120         p_ptr->to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
2121         p_ptr->to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2122         p_ptr->to_d[1] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2123         p_ptr->to_d_m += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2124         p_ptr->to_h[0] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2125         p_ptr->to_h[1] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2126         p_ptr->to_h_b += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2127         p_ptr->to_h_m += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2128         p_ptr->to_h[0] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2129         p_ptr->to_h[1] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2130         p_ptr->to_h_b += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2131         p_ptr->to_h_m += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2132
2133         /* Displayed Modifier Bonuses (Un-inflate stat bonuses) */
2134         p_ptr->dis_to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
2135         p_ptr->dis_to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2136         p_ptr->dis_to_d[1] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
2137         p_ptr->dis_to_h[0] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2138         p_ptr->dis_to_h[1] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2139         p_ptr->dis_to_h_b += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2140         p_ptr->dis_to_h[0] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2141         p_ptr->dis_to_h[1] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2142         p_ptr->dis_to_h_b += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
2143
2144
2145         /* Obtain the "hold" value */
2146         hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
2147
2148
2149         /* Examine the "current bow" */
2150         o_ptr = &p_ptr->inventory_list[INVEN_BOW];
2151
2152         /* It is hard to carholdry a heavy bow */
2153         p_ptr->heavy_shoot = is_heavy_shoot(o_ptr);
2154         if (p_ptr->heavy_shoot)
2155         {
2156                 /* Hard to wield a heavy bow */
2157                 p_ptr->to_h_b += 2 * (hold - o_ptr->weight / 10);
2158                 p_ptr->dis_to_h_b += 2 * (hold - o_ptr->weight / 10);
2159         }
2160
2161         /* Compute "extra shots" if needed */
2162         if (o_ptr->k_idx)
2163         {
2164                 p_ptr->tval_ammo = (byte_hack)bow_tval_ammo(o_ptr);
2165
2166                 /* Apply special flags */
2167                 if (o_ptr->k_idx && !p_ptr->heavy_shoot)
2168                 {
2169                         /* Extra shots */
2170                         p_ptr->num_fire = calc_num_fire(o_ptr);
2171
2172                         /* Snipers love Cross bows */
2173                         if ((p_ptr->pclass == CLASS_SNIPER) &&
2174                                 (p_ptr->tval_ammo == TV_BOLT))
2175                         {
2176                                 p_ptr->to_h_b += (10 + (p_ptr->lev / 5));
2177                                 p_ptr->dis_to_h_b += (10 + (p_ptr->lev / 5));
2178                         }
2179                 }
2180         }
2181
2182         if (p_ptr->ryoute) hold *= 2;
2183
2184         for (i = 0; i < 2; i++)
2185         {
2186                 /* Examine the "main weapon" */
2187                 o_ptr = &p_ptr->inventory_list[INVEN_RARM + i];
2188
2189                 object_flags(o_ptr, flgs);
2190
2191                 /* Assume not heavy */
2192                 p_ptr->heavy_wield[i] = FALSE;
2193                 p_ptr->icky_wield[i] = FALSE;
2194                 p_ptr->riding_wield[i] = FALSE;
2195
2196                 if (!has_melee_weapon(INVEN_RARM + i))
2197                 {
2198                         p_ptr->num_blow[i] = 1;
2199                         continue;
2200                 }
2201                 /* It is hard to hold a heavy weapon */
2202                 if (hold < o_ptr->weight / 10)
2203                 {
2204                         /* Hard to wield a heavy weapon */
2205                         p_ptr->to_h[i] += 2 * (hold - o_ptr->weight / 10);
2206                         p_ptr->dis_to_h[i] += 2 * (hold - o_ptr->weight / 10);
2207
2208                         /* Heavy weapon */
2209                         p_ptr->heavy_wield[i] = TRUE;
2210                 }
2211                 else if (p_ptr->ryoute && (hold < o_ptr->weight / 5)) omoi = TRUE;
2212
2213                 if ((i == 1) && (o_ptr->tval == TV_SWORD) && ((o_ptr->sval == SV_MAIN_GAUCHE) || (o_ptr->sval == SV_WAKIZASHI)))
2214                 {
2215                         p_ptr->to_a += 5;
2216                         p_ptr->dis_to_a += 5;
2217                 }
2218
2219                 /* Normal weapons */
2220                 if (o_ptr->k_idx && !p_ptr->heavy_wield[i])
2221                 {
2222                         int str_index, dex_index;
2223
2224                         int num = 0, wgt = 0, mul = 0, div = 0;
2225
2226                         /* Analyze the class */
2227                         switch (p_ptr->pclass)
2228                         {
2229                         case CLASS_WARRIOR:
2230                                 num = 6; wgt = 70; mul = 5; break;
2231
2232                         case CLASS_BERSERKER:
2233                                 num = 6; wgt = 70; mul = 7; break;
2234
2235                         case CLASS_MAGE:
2236                         case CLASS_HIGH_MAGE:
2237                         case CLASS_BLUE_MAGE:
2238                                 num = 3; wgt = 100; mul = 2; break;
2239
2240                         case CLASS_PRIEST:
2241                         case CLASS_MAGIC_EATER:
2242                         case CLASS_MINDCRAFTER:
2243                                 num = 5; wgt = 100; mul = 3; break;
2244
2245                         case CLASS_ROGUE:
2246                                 num = 5; wgt = 40; mul = 3; break;
2247
2248                         case CLASS_RANGER:
2249                                 num = 5; wgt = 70; mul = 4; break;
2250
2251                         case CLASS_PALADIN:
2252                         case CLASS_SAMURAI:
2253                                 num = 5; wgt = 70; mul = 4; break;
2254
2255                         case CLASS_SMITH:
2256                                 num = 5; wgt = 150; mul = 5; break;
2257
2258                         case CLASS_WARRIOR_MAGE:
2259                         case CLASS_RED_MAGE:
2260                                 num = 5; wgt = 70; mul = 3; break;
2261
2262                         case CLASS_CHAOS_WARRIOR:
2263                                 num = 5; wgt = 70; mul = 4; break;
2264
2265                         case CLASS_MONK:
2266                                 num = 5; wgt = 60; mul = 3; break;
2267
2268                         case CLASS_TOURIST:
2269                                 num = 4; wgt = 100; mul = 3; break;
2270
2271                         case CLASS_IMITATOR:
2272                                 num = 5; wgt = 70; mul = 4; break;
2273
2274                         case CLASS_BEASTMASTER:
2275                                 num = 5; wgt = 70; mul = 3; break;
2276
2277                         case CLASS_CAVALRY:
2278                                 if ((p_ptr->riding) && (have_flag(flgs, TR_RIDING))) { num = 5; wgt = 70; mul = 4; }
2279                                 else { num = 5; wgt = 100; mul = 3; }
2280                                 break;
2281
2282                         case CLASS_SORCERER:
2283                                 num = 1; wgt = 1; mul = 1; break;
2284
2285                         case CLASS_ARCHER:
2286                         case CLASS_BARD:
2287                         case CLASS_SNIPER:
2288                                 num = 4; wgt = 70; mul = 2; break;
2289
2290                         case CLASS_FORCETRAINER:
2291                                 num = 4; wgt = 60; mul = 2; break;
2292
2293                         case CLASS_MIRROR_MASTER:
2294                                 num = 3; wgt = 100; mul = 3; break;
2295
2296                         case CLASS_NINJA:
2297                                 num = 4; wgt = 20; mul = 1; break;
2298                         }
2299
2300                         /* Hex - extra mights gives +1 bonus to max blows */
2301                         if (hex_spelling(HEX_XTRA_MIGHT) || hex_spelling(HEX_BUILDING)) { num++; wgt /= 2; mul += 2; }
2302
2303                         /* Enforce a minimum "weight" (tenth pounds) */
2304                         div = ((o_ptr->weight < wgt) ? wgt : o_ptr->weight);
2305
2306                         /* Access the strength vs weight */
2307                         str_index = (adj_str_blow[p_ptr->stat_ind[A_STR]] * mul / div);
2308
2309                         if (p_ptr->ryoute && !omoi) str_index++;
2310                         if (p_ptr->pclass == CLASS_NINJA) str_index = MAX(0, str_index - 1);
2311
2312                         /* Maximal value */
2313                         if (str_index > 11) str_index = 11;
2314
2315                         /* Index by dexterity */
2316                         dex_index = (adj_dex_blow[p_ptr->stat_ind[A_DEX]]);
2317
2318                         /* Maximal value */
2319                         if (dex_index > 11) dex_index = 11;
2320
2321                         /* Use the blows table */
2322                         p_ptr->num_blow[i] = blows_table[str_index][dex_index];
2323
2324                         /* Maximal value */
2325                         if (p_ptr->num_blow[i] > num) p_ptr->num_blow[i] = (s16b)num;
2326
2327                         /* Add in the "bonus blows" */
2328                         p_ptr->num_blow[i] += (s16b)extra_blows[i];
2329
2330
2331                         if (p_ptr->pclass == CLASS_WARRIOR) p_ptr->num_blow[i] += (p_ptr->lev / 40);
2332                         else if (p_ptr->pclass == CLASS_BERSERKER)
2333                         {
2334                                 p_ptr->num_blow[i] += (p_ptr->lev / 23);
2335                         }
2336                         else if ((p_ptr->pclass == CLASS_ROGUE) && (o_ptr->weight < 50) && (p_ptr->stat_ind[A_DEX] >= 30)) p_ptr->num_blow[i] ++;
2337
2338                         if (p_ptr->special_defense & KATA_FUUJIN) p_ptr->num_blow[i] -= 1;
2339
2340                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) p_ptr->num_blow[i] = 1;
2341
2342
2343                         /* Require at least one blow */
2344                         if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1;
2345
2346                         /* Boost digging skill by weapon weight */
2347                         p_ptr->skill_dig += (o_ptr->weight / 10);
2348                 }
2349
2350                 /* Assume okay */
2351                 /* Priest weapon penalty for non-blessed edged weapons */
2352                 if ((p_ptr->pclass == CLASS_PRIEST) && (!(have_flag(flgs, TR_BLESSED))) &&
2353                         ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM)))
2354                 {
2355                         /* Reduce the real bonuses */
2356                         p_ptr->to_h[i] -= 2;
2357                         p_ptr->to_d[i] -= 2;
2358
2359                         /* Reduce the mental bonuses */
2360                         p_ptr->dis_to_h[i] -= 2;
2361                         p_ptr->dis_to_d[i] -= 2;
2362
2363                         /* Icky weapon */
2364                         p_ptr->icky_wield[i] = TRUE;
2365                 }
2366                 else if (p_ptr->pclass == CLASS_BERSERKER)
2367                 {
2368                         p_ptr->to_h[i] += p_ptr->lev / 5;
2369                         p_ptr->to_d[i] += p_ptr->lev / 6;
2370                         p_ptr->dis_to_h[i] += p_ptr->lev / 5;
2371                         p_ptr->dis_to_d[i] += p_ptr->lev / 6;
2372                         if (((i == 0) && !p_ptr->hidarite) || p_ptr->ryoute)
2373                         {
2374                                 p_ptr->to_h[i] += p_ptr->lev / 5;
2375                                 p_ptr->to_d[i] += p_ptr->lev / 6;
2376                                 p_ptr->dis_to_h[i] += p_ptr->lev / 5;
2377                                 p_ptr->dis_to_d[i] += p_ptr->lev / 6;
2378                         }
2379                 }
2380                 else if (p_ptr->pclass == CLASS_SORCERER)
2381                 {
2382                         if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER))))
2383                         {
2384                                 /* Reduce the real bonuses */
2385                                 p_ptr->to_h[i] -= 200;
2386                                 p_ptr->to_d[i] -= 200;
2387
2388                                 /* Reduce the mental bonuses */
2389                                 p_ptr->dis_to_h[i] -= 200;
2390                                 p_ptr->dis_to_d[i] -= 200;
2391
2392                                 /* Icky weapon */
2393                                 p_ptr->icky_wield[i] = TRUE;
2394                         }
2395                         else
2396                         {
2397                                 /* Reduce the real bonuses */
2398                                 p_ptr->to_h[i] -= 30;
2399                                 p_ptr->to_d[i] -= 10;
2400
2401                                 /* Reduce the mental bonuses */
2402                                 p_ptr->dis_to_h[i] -= 30;
2403                                 p_ptr->dis_to_d[i] -= 10;
2404                         }
2405                 }
2406                 /* Hex bonuses */
2407                 if (p_ptr->realm1 == REALM_HEX)
2408                 {
2409                         if (object_is_cursed(o_ptr))
2410                         {
2411                                 if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; }
2412                                 if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_h[i] += 7; p_ptr->dis_to_h[i] += 7; }
2413                                 if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_h[i] += 13; p_ptr->dis_to_h[i] += 13; }
2414                                 if (o_ptr->curse_flags & (TRC_TY_CURSE)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; }
2415                                 if (hex_spelling(HEX_RUNESWORD))
2416                                 {
2417                                         if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_d[i] += 5; p_ptr->dis_to_d[i] += 5; }
2418                                         if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_d[i] += 7; p_ptr->dis_to_d[i] += 7; }
2419                                         if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_d[i] += 13; p_ptr->dis_to_d[i] += 13; }
2420                                 }
2421                         }
2422                 }
2423                 if (p_ptr->riding)
2424                 {
2425                         if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
2426                         {
2427                                 p_ptr->to_h[i] += 15;
2428                                 p_ptr->dis_to_h[i] += 15;
2429                                 p_ptr->to_dd[i] += 2;
2430                         }
2431                         else if (!(have_flag(flgs, TR_RIDING)))
2432                         {
2433                                 int penalty;
2434                                 if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
2435                                 {
2436                                         penalty = 5;
2437                                 }
2438                                 else
2439                                 {
2440                                         penalty = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level - p_ptr->skill_exp[GINOU_RIDING] / 80;
2441                                         penalty += 30;
2442                                         if (penalty < 30) penalty = 30;
2443                                 }
2444                                 p_ptr->to_h[i] -= (s16b)penalty;
2445                                 p_ptr->dis_to_h[i] -= (s16b)penalty;
2446
2447                                 /* Riding weapon */
2448                                 p_ptr->riding_wield[i] = TRUE;
2449                         }
2450                 }
2451         }
2452
2453         if (p_ptr->riding)
2454         {
2455                 int penalty = 0;
2456
2457                 p_ptr->riding_ryoute = FALSE;
2458
2459                 if (p_ptr->ryoute || (empty_hands(FALSE) == EMPTY_HAND_NONE)) p_ptr->riding_ryoute = TRUE;
2460                 else if (p_ptr->pet_extra_flags & PF_RYOUTE)
2461                 {
2462                         switch (p_ptr->pclass)
2463                         {
2464                         case CLASS_MONK:
2465                         case CLASS_FORCETRAINER:
2466                         case CLASS_BERSERKER:
2467                                 if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !has_melee_weapon(INVEN_RARM) && !has_melee_weapon(INVEN_LARM))
2468                                         p_ptr->riding_ryoute = TRUE;
2469                                 break;
2470                         }
2471                 }
2472
2473                 if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
2474                 {
2475                         if (p_ptr->tval_ammo != TV_ARROW) penalty = 5;
2476                 }
2477                 else
2478                 {
2479                         penalty = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level - p_ptr->skill_exp[GINOU_RIDING] / 80;
2480                         penalty += 30;
2481                         if (penalty < 30) penalty = 30;
2482                 }
2483                 if (p_ptr->tval_ammo == TV_BOLT) penalty *= 2;
2484                 p_ptr->to_h_b -= (s16b)penalty;
2485                 p_ptr->dis_to_h_b -= (s16b)penalty;
2486         }
2487
2488         /* Different calculation for monks with empty hands */
2489         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) &&
2490                 (empty_hands_status & EMPTY_HAND_RARM) && !p_ptr->hidarite)
2491         {
2492                 int blow_base = p_ptr->lev + adj_dex_blow[p_ptr->stat_ind[A_DEX]];
2493                 p_ptr->num_blow[0] = 0;
2494
2495                 if (p_ptr->pclass == CLASS_FORCETRAINER)
2496                 {
2497                         if (blow_base > 18) p_ptr->num_blow[0]++;
2498                         if (blow_base > 31) p_ptr->num_blow[0]++;
2499                         if (blow_base > 44) p_ptr->num_blow[0]++;
2500                         if (blow_base > 58) p_ptr->num_blow[0]++;
2501                         if (P_PTR_KI)
2502                         {
2503                                 p_ptr->to_d[0] += P_PTR_KI / 5;
2504                                 p_ptr->dis_to_d[0] += P_PTR_KI / 5;
2505                         }
2506                 }
2507                 else
2508                 {
2509                         if (blow_base > 12) p_ptr->num_blow[0]++;
2510                         if (blow_base > 22) p_ptr->num_blow[0]++;
2511                         if (blow_base > 31) p_ptr->num_blow[0]++;
2512                         if (blow_base > 39) p_ptr->num_blow[0]++;
2513                         if (blow_base > 46) p_ptr->num_blow[0]++;
2514                         if (blow_base > 53) p_ptr->num_blow[0]++;
2515                         if (blow_base > 59) p_ptr->num_blow[0]++;
2516                 }
2517
2518                 if (heavy_armor() && (p_ptr->pclass != CLASS_BERSERKER))
2519                         p_ptr->num_blow[0] /= 2;
2520                 else
2521                 {
2522                         p_ptr->to_h[0] += (p_ptr->lev / 3);
2523                         p_ptr->dis_to_h[0] += (p_ptr->lev / 3);
2524
2525                         p_ptr->to_d[0] += (p_ptr->lev / 6);
2526                         p_ptr->dis_to_d[0] += (p_ptr->lev / 6);
2527                 }
2528
2529                 if (p_ptr->special_defense & KAMAE_BYAKKO)
2530                 {
2531                         p_ptr->to_a -= 40;
2532                         p_ptr->dis_to_a -= 40;
2533
2534                 }
2535                 else if (p_ptr->special_defense & KAMAE_SEIRYU)
2536                 {
2537                         p_ptr->to_a -= 50;
2538                         p_ptr->dis_to_a -= 50;
2539                         p_ptr->resist_acid = TRUE;
2540                         p_ptr->resist_fire = TRUE;
2541                         p_ptr->resist_elec = TRUE;
2542                         p_ptr->resist_cold = TRUE;
2543                         p_ptr->resist_pois = TRUE;
2544                         p_ptr->sh_fire = TRUE;
2545                         p_ptr->sh_elec = TRUE;
2546                         p_ptr->sh_cold = TRUE;
2547                         p_ptr->levitation = TRUE;
2548                 }
2549                 else if (p_ptr->special_defense & KAMAE_GENBU)
2550                 {
2551                         p_ptr->to_a += (p_ptr->lev*p_ptr->lev) / 50;
2552                         p_ptr->dis_to_a += (p_ptr->lev*p_ptr->lev) / 50;
2553                         p_ptr->reflect = TRUE;
2554                         p_ptr->num_blow[0] -= 2;
2555                         if ((p_ptr->pclass == CLASS_MONK) && (p_ptr->lev > 42)) p_ptr->num_blow[0]--;
2556                         if (p_ptr->num_blow[0] < 0) p_ptr->num_blow[0] = 0;
2557                 }
2558                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
2559                 {
2560                         p_ptr->to_h[0] -= (p_ptr->lev / 3);
2561                         p_ptr->to_d[0] -= (p_ptr->lev / 6);
2562
2563                         p_ptr->dis_to_h[0] -= (p_ptr->lev / 3);
2564                         p_ptr->dis_to_d[0] -= (p_ptr->lev / 6);
2565                         p_ptr->num_blow[0] /= 2;
2566                         p_ptr->levitation = TRUE;
2567                 }
2568
2569                 p_ptr->num_blow[0] += 1 + extra_blows[0];
2570         }
2571
2572         if (p_ptr->riding) p_ptr->levitation = riding_levitation;
2573
2574         p_ptr->monk_armour_aux = FALSE;
2575
2576         if (heavy_armor())
2577         {
2578                 p_ptr->monk_armour_aux = TRUE;
2579         }
2580
2581         for (i = 0; i < 2; i++)
2582         {
2583                 if (has_melee_weapon(INVEN_RARM + i))
2584                 {
2585                         OBJECT_TYPE_VALUE tval = p_ptr->inventory_list[INVEN_RARM + i].tval - TV_WEAPON_BEGIN;
2586                         OBJECT_SUBTYPE_VALUE sval = p_ptr->inventory_list[INVEN_RARM + i].sval;
2587
2588                         p_ptr->to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
2589                         p_ptr->dis_to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
2590                         if ((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER))
2591                         {
2592                                 if (!s_info[p_ptr->pclass].w_max[tval][sval])
2593                                 {
2594                                         p_ptr->to_h[i] -= 40;
2595                                         p_ptr->dis_to_h[i] -= 40;
2596                                         p_ptr->icky_wield[i] = TRUE;
2597                                 }
2598                         }
2599                         else if (p_ptr->pclass == CLASS_NINJA)
2600                         {
2601                                 if ((s_info[CLASS_NINJA].w_max[tval][sval] <= WEAPON_EXP_BEGINNER) || (p_ptr->inventory_list[INVEN_LARM - i].tval == TV_SHIELD))
2602                                 {
2603                                         p_ptr->to_h[i] -= 40;
2604                                         p_ptr->dis_to_h[i] -= 40;
2605                                         p_ptr->icky_wield[i] = TRUE;
2606                                         p_ptr->num_blow[i] /= 2;
2607                                         if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1;
2608                                 }
2609                         }
2610                 }
2611         }
2612
2613         /* Maximum speed is (+99). (internally it's 110 + 99) */
2614         /* Temporary lightspeed forces to be maximum speed */
2615         if ((p_ptr->lightspeed && !p_ptr->riding) || (new_speed > 209))
2616         {
2617                 new_speed = 209;
2618         }
2619
2620         /* Minimum speed is (-99). (internally it's 110 - 99) */
2621         if (new_speed < 11) new_speed = 11;
2622
2623         /* Display the speed (if needed) */
2624         if (p_ptr->pspeed != (byte)new_speed)
2625         {
2626                 p_ptr->pspeed = (byte)new_speed;
2627                 p_ptr->redraw |= (PR_SPEED);
2628         }
2629
2630         if (yoiyami)
2631         {
2632                 if (p_ptr->to_a > (0 - p_ptr->ac))
2633                         p_ptr->to_a = 0 - p_ptr->ac;
2634                 if (p_ptr->dis_to_a > (0 - p_ptr->dis_ac))
2635                         p_ptr->dis_to_a = 0 - p_ptr->dis_ac;
2636         }
2637
2638         /* Redraw armor (if needed) */
2639         if ((p_ptr->dis_ac != old_dis_ac) || (p_ptr->dis_to_a != old_dis_to_a))
2640         {
2641                 p_ptr->redraw |= (PR_ARMOR);
2642                 p_ptr->window |= (PW_PLAYER);
2643         }
2644
2645         if (p_ptr->ryoute && !omoi)
2646         {
2647                 int bonus_to_h = 0, bonus_to_d = 0;
2648                 bonus_to_d = ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128) / 2;
2649                 bonus_to_h = ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128) + ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
2650
2651                 p_ptr->to_h[default_hand] += MAX(bonus_to_h, 1);
2652                 p_ptr->dis_to_h[default_hand] += MAX(bonus_to_h, 1);
2653                 p_ptr->to_d[default_hand] += MAX(bonus_to_d, 1);
2654                 p_ptr->dis_to_d[default_hand] += MAX(bonus_to_d, 1);
2655         }
2656
2657         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))) p_ptr->ryoute = FALSE;
2658
2659         /* Affect Skill -- stealth (bonus one) */
2660         p_ptr->skill_stl += 1;
2661
2662         if (IS_TIM_STEALTH()) p_ptr->skill_stl += 99;
2663
2664         /* Affect Skill -- disarming (DEX and INT) */
2665         p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]];
2666         p_ptr->skill_dis += adj_int_dis[p_ptr->stat_ind[A_INT]];
2667
2668         /* Affect Skill -- magic devices (INT) */
2669         p_ptr->skill_dev += adj_int_dev[p_ptr->stat_ind[A_INT]];
2670
2671         /* Affect Skill -- saving throw (WIS) */
2672         p_ptr->skill_sav += adj_wis_sav[p_ptr->stat_ind[A_WIS]];
2673
2674         /* Affect Skill -- digging (STR) */
2675         p_ptr->skill_dig += adj_str_dig[p_ptr->stat_ind[A_STR]];
2676
2677         /* Affect Skill -- disarming (Level, by Class) */
2678         p_ptr->skill_dis += ((cp_ptr->x_dis * p_ptr->lev / 10) + (ap_ptr->a_dis * p_ptr->lev / 50));
2679
2680         /* Affect Skill -- magic devices (Level, by Class) */
2681         p_ptr->skill_dev += ((cp_ptr->x_dev * p_ptr->lev / 10) + (ap_ptr->a_dev * p_ptr->lev / 50));
2682
2683         /* Affect Skill -- saving throw (Level, by Class) */
2684         p_ptr->skill_sav += ((cp_ptr->x_sav * p_ptr->lev / 10) + (ap_ptr->a_sav * p_ptr->lev / 50));
2685
2686         /* Affect Skill -- stealth (Level, by Class) */
2687         p_ptr->skill_stl += (cp_ptr->x_stl * p_ptr->lev / 10);
2688
2689         /* Affect Skill -- search ability (Level, by Class) */
2690         p_ptr->skill_srh += (cp_ptr->x_srh * p_ptr->lev / 10);
2691
2692         /* Affect Skill -- search frequency (Level, by Class) */
2693         p_ptr->skill_fos += (cp_ptr->x_fos * p_ptr->lev / 10);
2694
2695         /* Affect Skill -- combat (normal) (Level, by Class) */
2696         p_ptr->skill_thn += ((cp_ptr->x_thn * p_ptr->lev / 10) + (ap_ptr->a_thn * p_ptr->lev / 50));
2697
2698         /* Affect Skill -- combat (shooting) (Level, by Class) */
2699         p_ptr->skill_thb += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
2700
2701         /* Affect Skill -- combat (throwing) (Level, by Class) */
2702         p_ptr->skill_tht += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
2703
2704
2705         if ((prace_is_(RACE_S_FAIRY)) && (p_ptr->pseikaku != SEIKAKU_SEXY) && (p_ptr->cursed & TRC_AGGRAVATE))
2706         {
2707                 p_ptr->cursed &= ~(TRC_AGGRAVATE);
2708                 p_ptr->skill_stl = MIN(p_ptr->skill_stl - 3, (p_ptr->skill_stl + 2) / 2);
2709         }
2710
2711         /* Limit Skill -- stealth from 0 to 30 */
2712         if (p_ptr->skill_stl > 30) p_ptr->skill_stl = 30;
2713         if (p_ptr->skill_stl < 0) p_ptr->skill_stl = 0;
2714
2715         /* Limit Skill -- digging from 1 up */
2716         if (p_ptr->skill_dig < 1) p_ptr->skill_dig = 1;
2717
2718         if (p_ptr->anti_magic && (p_ptr->skill_sav < (90 + p_ptr->lev))) p_ptr->skill_sav = 90 + p_ptr->lev;
2719
2720         if (p_ptr->tsubureru) p_ptr->skill_sav = 10;
2721
2722         if ((p_ptr->ult_res || p_ptr->resist_magic || p_ptr->magicdef) && (p_ptr->skill_sav < (95 + p_ptr->lev))) p_ptr->skill_sav = 95 + p_ptr->lev;
2723
2724         if (down_saving) p_ptr->skill_sav /= 2;
2725
2726         /* Hack -- Each elemental immunity includes resistance */
2727         if (p_ptr->immune_acid) p_ptr->resist_acid = TRUE;
2728         if (p_ptr->immune_elec) p_ptr->resist_elec = TRUE;
2729         if (p_ptr->immune_fire) p_ptr->resist_fire = TRUE;
2730         if (p_ptr->immune_cold) p_ptr->resist_cold = TRUE;
2731
2732
2733         /* Hack -- handle "xtra" mode */
2734         if (character_xtra) return;
2735
2736         /* Take note when "heavy bow" changes */
2737         if (p_ptr->old_heavy_shoot != p_ptr->heavy_shoot)
2738         {
2739                 if (p_ptr->heavy_shoot)
2740                 {
2741                         msg_print(_("こんな重い弓を装備しているのは大変だ。", "You have trouble wielding such a heavy bow."));
2742                 }
2743                 else if (p_ptr->inventory_list[INVEN_BOW].k_idx)
2744                 {
2745                         msg_print(_("この弓なら装備していても辛くない。", "You have no trouble wielding your bow."));
2746                 }
2747                 else
2748                 {
2749                         msg_print(_("重い弓を装備からはずして体が楽になった。", "You feel relieved to put down your heavy bow."));
2750                 }
2751
2752                 /* Save it */
2753                 p_ptr->old_heavy_shoot = p_ptr->heavy_shoot;
2754         }
2755
2756         for (i = 0; i < 2; i++)
2757         {
2758                 /* Take note when "heavy weapon" changes */
2759                 if (p_ptr->old_heavy_wield[i] != p_ptr->heavy_wield[i])
2760                 {
2761                         if (p_ptr->heavy_wield[i])
2762                         {
2763                                 msg_print(_("こんな重い武器を装備しているのは大変だ。", "You have trouble wielding such a heavy weapon."));
2764                         }
2765                         else if (has_melee_weapon(INVEN_RARM + i))
2766                         {
2767                                 msg_print(_("これなら装備していても辛くない。", "You have no trouble wielding your weapon."));
2768                         }
2769                         else if (p_ptr->heavy_wield[1 - i])
2770                         {
2771                                 msg_print(_("まだ武器が重い。", "You have still trouble wielding a heavy weapon."));
2772                         }
2773                         else
2774                         {
2775                                 msg_print(_("重い武器を装備からはずして体が楽になった。", "You feel relieved to put down your heavy weapon."));
2776                         }
2777
2778                         /* Save it */
2779                         p_ptr->old_heavy_wield[i] = p_ptr->heavy_wield[i];
2780                 }
2781
2782                 /* Take note when "heavy weapon" changes */
2783                 if (p_ptr->old_riding_wield[i] != p_ptr->riding_wield[i])
2784                 {
2785                         if (p_ptr->riding_wield[i])
2786                         {
2787                                 msg_print(_("この武器は乗馬中に使うにはむかないようだ。", "This weapon is not suitable for use while riding."));
2788                         }
2789                         else if (!p_ptr->riding)
2790                         {
2791                                 msg_print(_("この武器は徒歩で使いやすい。", "This weapon was not suitable for use while riding."));
2792                         }
2793                         else if (has_melee_weapon(INVEN_RARM + i))
2794                         {
2795                                 msg_print(_("これなら乗馬中にぴったりだ。", "This weapon is suitable for use while riding."));
2796                         }
2797                         /* Save it */
2798                         p_ptr->old_riding_wield[i] = p_ptr->riding_wield[i];
2799                 }
2800
2801                 /* Take note when "illegal weapon" changes */
2802                 if (p_ptr->old_icky_wield[i] != p_ptr->icky_wield[i])
2803                 {
2804                         if (p_ptr->icky_wield[i])
2805                         {
2806                                 msg_print(_("今の装備はどうも自分にふさわしくない気がする。", "You do not feel comfortable with your weapon."));
2807                                 if (is_loading_now)
2808                                 {
2809                                         chg_virtue(V_FAITH, -1);
2810                                 }
2811                         }
2812                         else if (has_melee_weapon(INVEN_RARM + i))
2813                         {
2814                                 msg_print(_("今の装備は自分にふさわしい気がする。", "You feel comfortable with your weapon."));
2815                         }
2816                         else
2817                         {
2818                                 msg_print(_("装備をはずしたら随分と気が楽になった。", "You feel more comfortable after removing your weapon."));
2819                         }
2820
2821                         /* Save it */
2822                         p_ptr->old_icky_wield[i] = p_ptr->icky_wield[i];
2823                 }
2824         }
2825
2826         if (p_ptr->riding && (p_ptr->old_riding_ryoute != p_ptr->riding_ryoute))
2827         {
2828                 if (p_ptr->riding_ryoute)
2829                 {
2830 #ifdef JP
2831                         msg_format("%s馬を操れない。", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "両手がふさがっていて" : "");
2832 #else
2833                         msg_print("You are using both hand for fighting, and you can't control a riding pet.");
2834 #endif
2835                 }
2836                 else
2837                 {
2838 #ifdef JP
2839                         msg_format("%s馬を操れるようになった。", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "手が空いて" : "");
2840 #else
2841                         msg_print("You began to control riding pet with one hand.");
2842 #endif
2843                 }
2844
2845                 p_ptr->old_riding_ryoute = p_ptr->riding_ryoute;
2846         }
2847
2848         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_NINJA)) && (p_ptr->monk_armour_aux != p_ptr->monk_notify_aux))
2849         {
2850                 if (heavy_armor())
2851                 {
2852                         msg_print(_("装備が重くてバランスを取れない。", "The weight of your armor disrupts your balance."));
2853                         if (is_loading_now)
2854                         {
2855                                 chg_virtue(V_HARMONY, -1);
2856                         }
2857                 }
2858                 else
2859                 {
2860                         msg_print(_("バランスがとれるようになった。", "You regain your balance."));
2861                 }
2862
2863                 p_ptr->monk_notify_aux = p_ptr->monk_armour_aux;
2864         }
2865
2866         for (i = 0; i < INVEN_PACK; i++)
2867         {
2868 #if 0
2869                 if ((p_ptr->inventory_list[i].tval == TV_SORCERY_BOOK) && (p_ptr->inventory_list[i].sval == 2)) have_dd_s = TRUE;
2870                 if ((p_ptr->inventory_list[i].tval == TV_TRUMP_BOOK) && (p_ptr->inventory_list[i].sval == 1)) have_dd_t = TRUE;
2871 #endif
2872                 if ((p_ptr->inventory_list[i].tval == TV_NATURE_BOOK) && (p_ptr->inventory_list[i].sval == 2)) have_sw = TRUE;
2873                 if ((p_ptr->inventory_list[i].tval == TV_CRAFT_BOOK) && (p_ptr->inventory_list[i].sval == 2)) have_kabe = TRUE;
2874         }
2875
2876         for (this_o_idx = current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].o_idx; this_o_idx; this_o_idx = next_o_idx)
2877         {
2878                 o_ptr = &current_floor_ptr->o_list[this_o_idx];
2879                 next_o_idx = o_ptr->next_o_idx;
2880
2881 #if 0
2882                 if ((o_ptr->tval == TV_SORCERY_BOOK) && (o_ptr->sval == 3)) have_dd_s = TRUE;
2883                 if ((o_ptr->tval == TV_TRUMP_BOOK) && (o_ptr->sval == 1)) have_dd_t = TRUE;
2884 #endif
2885                 if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2)) have_sw = TRUE;
2886                 if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2)) have_kabe = TRUE;
2887         }
2888
2889         if (p_ptr->pass_wall && !p_ptr->kill_wall) p_ptr->no_flowed = TRUE;
2890 #if 0
2891         if (have_dd_s && ((p_ptr->realm1 == REALM_SORCERY) || (p_ptr->realm2 == REALM_SORCERY) || (p_ptr->pclass == CLASS_SORCERER)))
2892         {
2893                 const magic_type *s_ptr = &mp_ptr->info[REALM_SORCERY - 1][SPELL_DD_S];
2894                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
2895         }
2896
2897         if (have_dd_t && ((p_ptr->realm1 == REALM_TRUMP) || (p_ptr->realm2 == REALM_TRUMP) || (p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE)))
2898         {
2899                 const magic_type *s_ptr = &mp_ptr->info[REALM_TRUMP - 1][SPELL_DD_T];
2900                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
2901         }
2902 #endif
2903         if (have_sw && ((p_ptr->realm1 == REALM_NATURE) || (p_ptr->realm2 == REALM_NATURE) || (p_ptr->pclass == CLASS_SORCERER)))
2904         {
2905                 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE - 1][SPELL_SW];
2906                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
2907         }
2908
2909         if (have_kabe && ((p_ptr->realm1 == REALM_CRAFT) || (p_ptr->realm2 == REALM_CRAFT) || (p_ptr->pclass == CLASS_SORCERER)))
2910         {
2911                 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT - 1][SPELL_KABE];
2912                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
2913         }
2914 }
2915
2916
2917 static void calc_alignment(void)
2918 {
2919         MONSTER_IDX m_idx;
2920         p_ptr->align = 0;
2921         int i, j, neutral[2];
2922
2923         for (m_idx = m_max - 1; m_idx >= 1; m_idx--)
2924         {
2925                 monster_type *m_ptr;
2926                 monster_race *r_ptr;
2927                 m_ptr = &current_floor_ptr->m_list[m_idx];
2928                 if (!monster_is_valid(m_ptr)) continue;
2929                 r_ptr = &r_info[m_ptr->r_idx];
2930
2931                 if (is_pet(m_ptr))
2932                 {
2933                         if (r_ptr->flags3 & RF3_GOOD) p_ptr->align += r_ptr->level;
2934                         if (r_ptr->flags3 & RF3_EVIL) p_ptr->align -= r_ptr->level;
2935                 }
2936         }
2937
2938         if (p_ptr->mimic_form)
2939         {
2940                 switch (p_ptr->mimic_form)
2941                 {
2942                 case MIMIC_DEMON:
2943                         p_ptr->align -= 200;
2944                         break;
2945                 case MIMIC_DEMON_LORD:
2946                         p_ptr->align -= 200;
2947                         break;
2948                 }
2949         }
2950         else
2951         {
2952                 switch (p_ptr->prace)
2953                 {
2954                 case RACE_ANGEL:
2955                         p_ptr->align += 200;
2956                         break;
2957                 case RACE_DEMON:
2958                         p_ptr->align -= 200;
2959                         break;
2960                 }
2961         }
2962
2963         for (i = 0; i < 2; i++)
2964         {
2965                 if (has_melee_weapon(INVEN_RARM + i))
2966                 {
2967                         if (p_ptr->inventory_list[INVEN_RARM + i].name1 == ART_IRON_BALL) p_ptr->align -= 1000;
2968                 }
2969         }
2970
2971         /* Determine player alignment */
2972         for (i = 0, j = 0; i < 8; i++)
2973         {
2974                 switch (p_ptr->vir_types[i])
2975                 {
2976                 case V_JUSTICE:
2977                         p_ptr->align += p_ptr->virtues[i] * 2;
2978                         break;
2979                 case V_CHANCE:
2980                         /* Do nothing */
2981                         break;
2982                 case V_NATURE:
2983                 case V_HARMONY:
2984                         neutral[j++] = i;
2985                         break;
2986                 case V_UNLIFE:
2987                         p_ptr->align -= p_ptr->virtues[i];
2988                         break;
2989                 default:
2990                         p_ptr->align += p_ptr->virtues[i];
2991                         break;
2992                 }
2993         }
2994
2995         for (i = 0; i < j; i++)
2996         {
2997                 if (p_ptr->align > 0)
2998                 {
2999                         p_ptr->align -= p_ptr->virtues[neutral[i]] / 2;
3000                         if (p_ptr->align < 0) p_ptr->align = 0;
3001                 }
3002                 else if (p_ptr->align < 0)
3003                 {
3004                         p_ptr->align += p_ptr->virtues[neutral[i]] / 2;
3005                         if (p_ptr->align > 0) p_ptr->align = 0;
3006                 }
3007         }
3008 }
3009
3010 /*!
3011  * @brief プレイヤーの最大HPを計算する /
3012  * Calculate the players (maximal) hit points
3013  * Adjust current hitpoints if necessary
3014  * @return なし
3015  * @details
3016  */
3017 static void calc_hitpoints(void)
3018 {
3019         int bonus, mhp;
3020         byte tmp_hitdie;
3021
3022         /* Un-inflate "half-hitpoint bonus per level" value */
3023         bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128) * p_ptr->lev / 4;
3024
3025         /* Calculate hitpoints */
3026         mhp = p_ptr->player_hp[p_ptr->lev - 1];
3027
3028         if (p_ptr->mimic_form)
3029         {
3030                 if (p_ptr->pclass == CLASS_SORCERER)
3031                         tmp_hitdie = mimic_info[p_ptr->mimic_form].r_mhp / 2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
3032                 else
3033                         tmp_hitdie = mimic_info[p_ptr->mimic_form].r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
3034                 mhp = mhp * tmp_hitdie / p_ptr->hitdie;
3035         }
3036
3037         if (p_ptr->pclass == CLASS_SORCERER)
3038         {
3039                 if (p_ptr->lev < 30)
3040                         mhp = (mhp * (45 + p_ptr->lev) / 100);
3041                 else
3042                         mhp = (mhp * 75 / 100);
3043                 bonus = (bonus * 65 / 100);
3044         }
3045
3046         mhp += bonus;
3047
3048         if (p_ptr->pclass == CLASS_BERSERKER)
3049         {
3050                 mhp = mhp * (110 + (((p_ptr->lev + 40) * (p_ptr->lev + 40) - 1550) / 110)) / 100;
3051         }
3052
3053         /* Always have at least one hitpoint per level */
3054         if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1;
3055
3056         /* Factor in the hero / superhero settings */
3057         if (IS_HERO()) mhp += 10;
3058         if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER)) mhp += 30;
3059         if (p_ptr->tsuyoshi) mhp += 50;
3060
3061         /* Factor in the hex spell settings */
3062         if (hex_spelling(HEX_XTRA_MIGHT)) mhp += 15;
3063         if (hex_spelling(HEX_BUILDING)) mhp += 60;
3064
3065         /* New maximum hitpoints */
3066         if (p_ptr->mhp != mhp)
3067         {
3068                 /* Enforce maximum */
3069                 if (p_ptr->chp >= mhp)
3070                 {
3071                         p_ptr->chp = mhp;
3072                         p_ptr->chp_frac = 0;
3073                 }
3074
3075 #ifdef JP
3076                 /* レベルアップの時は上昇量を表示する */
3077                 if ((level_up == 1) && (mhp > p_ptr->mhp))
3078                 {
3079                         msg_format("最大ヒット・ポイントが %d 増加した!", (mhp - p_ptr->mhp));
3080                 }
3081 #endif
3082                 /* Save the new max-hitpoints */
3083                 p_ptr->mhp = mhp;
3084
3085                 /* Display hitpoints (later) */
3086                 p_ptr->redraw |= (PR_HP);
3087                 p_ptr->window |= (PW_PLAYER);
3088         }
3089 }
3090
3091 /*!
3092  * @brief プレイヤーの光源半径を計算する / Extract and set the current "lite radius"
3093  * @return なし
3094  * @details
3095  * SWD: Experimental modification: multiple light sources have additive effect.
3096  */
3097 static void calc_torch(void)
3098 {
3099         int i;
3100         POSITION rad;
3101         object_type *o_ptr;
3102         BIT_FLAGS flgs[TR_FLAG_SIZE];
3103
3104         /* Assume no light */
3105         p_ptr->cur_lite = 0;
3106
3107         /* Loop through all wielded items */
3108         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
3109         {
3110                 o_ptr = &p_ptr->inventory_list[i];
3111                 /* Skip empty slots */
3112                 if (!o_ptr->k_idx) continue;
3113
3114                 if (o_ptr->name2 == EGO_LITE_SHINE) p_ptr->cur_lite++;
3115
3116                 /* Need Fuels */
3117                 if (o_ptr->name2 != EGO_LITE_DARKNESS)
3118                 {
3119                         if (o_ptr->tval == TV_LITE)
3120                         {
3121                                 if ((o_ptr->sval == SV_LITE_TORCH) && !(o_ptr->xtra4 > 0)) continue;
3122                                 if ((o_ptr->sval == SV_LITE_LANTERN) && !(o_ptr->xtra4 > 0)) continue;
3123                         }
3124                 }
3125                 object_flags(o_ptr, flgs);
3126
3127                 /* calc the lite_radius */
3128
3129                 rad = 0;
3130                 if (have_flag(flgs, TR_LITE_1) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 1;
3131                 if (have_flag(flgs, TR_LITE_2) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 2;
3132                 if (have_flag(flgs, TR_LITE_3) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 3;
3133                 if (have_flag(flgs, TR_LITE_M1)) rad -= 1;
3134                 if (have_flag(flgs, TR_LITE_M2)) rad -= 2;
3135                 if (have_flag(flgs, TR_LITE_M3)) rad -= 3;
3136                 p_ptr->cur_lite += rad;
3137         }
3138
3139         /* max radius is 14 (was 5) without rewriting other code -- */
3140         /* see current_floor_ptr->grid_array.c:update_lite() and defines.h:LITE_MAX */
3141         if (d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS && p_ptr->cur_lite > 1)
3142                 p_ptr->cur_lite = 1;
3143
3144         /*
3145          * check if the player doesn't have light radius,
3146          * but does weakly glow as an intrinsic.
3147          */
3148         if (p_ptr->cur_lite <= 0 && p_ptr->lite) p_ptr->cur_lite++;
3149
3150         if (p_ptr->cur_lite > 14) p_ptr->cur_lite = 14;
3151         if (p_ptr->cur_lite < 0) p_ptr->cur_lite = 0;
3152
3153         /* end experimental mods */
3154
3155         /* Notice changes in the "lite radius" */
3156         if (p_ptr->old_lite != p_ptr->cur_lite)
3157         {
3158                 /* Hack -- PU_MON_LITE for monsters' darkness */
3159                 p_ptr->update |= (PU_LITE | PU_MON_LITE | PU_MONSTERS);
3160
3161                 /* Remember the old lite */
3162                 p_ptr->old_lite = p_ptr->cur_lite;
3163
3164                 if ((p_ptr->cur_lite > 0) && (p_ptr->special_defense & NINJA_S_STEALTH))
3165                         set_superstealth(FALSE);
3166         }
3167 }
3168
3169 /*!
3170  * @brief プレイヤーの現在学習可能な魔法数を計算し、増減に応じて魔法の忘却、再学習を処置する。 /
3171  * Calculate number of spells player should have, and forget,
3172  * or remember, spells until that number is properly reflected.
3173  * @return なし
3174  * @details
3175  * Note that this function induces various "status" messages,
3176  * which must be bypasses until the character is created.
3177  */
3178 static void calc_spells(void)
3179 {
3180         int i, j, k, levels;
3181         int num_allowed;
3182         int num_boukyaku = 0;
3183
3184         const magic_type        *s_ptr;
3185         REALM_IDX which;
3186         int bonus = 0;
3187
3188         concptr p;
3189
3190         /* Hack -- must be literate */
3191         if (!mp_ptr->spell_book) return;
3192
3193         /* Hack -- wait for creation */
3194         if (!character_generated) return;
3195
3196         /* Hack -- handle "xtra" mode */
3197         if (character_xtra) return;
3198
3199         if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
3200         {
3201                 p_ptr->new_spells = 0;
3202                 return;
3203         }
3204
3205         p = spell_category_name(mp_ptr->spell_book);
3206
3207         /* Determine the number of spells allowed */
3208         levels = p_ptr->lev - mp_ptr->spell_first + 1;
3209
3210         /* Hack -- no negative spells */
3211         if (levels < 0) levels = 0;
3212
3213         /* Extract total allowed spells */
3214         num_allowed = (adj_mag_study[p_ptr->stat_ind[mp_ptr->spell_stat]] * levels / 2);
3215
3216         if ((p_ptr->pclass != CLASS_SAMURAI) && (mp_ptr->spell_book != TV_LIFE_BOOK))
3217         {
3218                 bonus = 4;
3219         }
3220         if (p_ptr->pclass == CLASS_SAMURAI)
3221         {
3222                 num_allowed = 32;
3223         }
3224         else if (p_ptr->realm2 == REALM_NONE)
3225         {
3226                 num_allowed = (num_allowed + 1) / 2;
3227                 if (num_allowed > (32 + bonus)) num_allowed = 32 + bonus;
3228         }
3229         else if ((p_ptr->pclass == CLASS_MAGE) || (p_ptr->pclass == CLASS_PRIEST))
3230         {
3231                 if (num_allowed > (96 + bonus)) num_allowed = 96 + bonus;
3232         }
3233         else
3234         {
3235                 if (num_allowed > (80 + bonus)) num_allowed = 80 + bonus;
3236         }
3237
3238         /* Count the number of spells we know */
3239         for (j = 0; j < 64; j++)
3240         {
3241                 /* Count known spells */
3242                 if ((j < 32) ?
3243                         (p_ptr->spell_forgotten1 & (1L << j)) :
3244                         (p_ptr->spell_forgotten2 & (1L << (j - 32))))
3245                 {
3246                         num_boukyaku++;
3247                 }
3248         }
3249
3250         /* See how many spells we must forget or may learn */
3251         p_ptr->new_spells = num_allowed + p_ptr->add_spells + num_boukyaku - p_ptr->learned_spells;
3252
3253         /* Forget spells which are too hard */
3254         for (i = 63; i >= 0; i--)
3255         {
3256                 /* Efficiency -- all done */
3257                 if (!p_ptr->spell_learned1 && !p_ptr->spell_learned2) break;
3258
3259                 /* Access the spell */
3260                 j = p_ptr->spell_order[i];
3261
3262                 /* Skip non-spells */
3263                 if (j >= 99) continue;
3264
3265
3266                 /* Get the spell */
3267                 if (!is_magic((j < 32) ? p_ptr->realm1 : p_ptr->realm2))
3268                 {
3269                         if (j < 32)
3270                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
3271                         else
3272                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][j % 32];
3273                 }
3274                 else if (j < 32)
3275                         s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][j];
3276                 else
3277                         s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][j % 32];
3278
3279                 /* Skip spells we are allowed to know */
3280                 if (s_ptr->slevel <= p_ptr->lev) continue;
3281
3282                 /* Is it known? */
3283                 if ((j < 32) ?
3284                         (p_ptr->spell_learned1 & (1L << j)) :
3285                         (p_ptr->spell_learned2 & (1L << (j - 32))))
3286                 {
3287                         /* Mark as forgotten */
3288                         if (j < 32)
3289                         {
3290                                 p_ptr->spell_forgotten1 |= (1L << j);
3291                                 which = p_ptr->realm1;
3292                         }
3293                         else
3294                         {
3295                                 p_ptr->spell_forgotten2 |= (1L << (j - 32));
3296                                 which = p_ptr->realm2;
3297                         }
3298
3299                         /* No longer known */
3300                         if (j < 32)
3301                         {
3302                                 p_ptr->spell_learned1 &= ~(1L << j);
3303                                 which = p_ptr->realm1;
3304                         }
3305                         else
3306                         {
3307                                 p_ptr->spell_learned2 &= ~(1L << (j - 32));
3308                                 which = p_ptr->realm2;
3309                         }
3310
3311 #ifdef JP
3312                         msg_format("%sの%sを忘れてしまった。", do_spell(which, j % 32, SPELL_NAME), p);
3313 #else
3314                         msg_format("You have forgotten the %s of %s.", p, do_spell(which, j % 32, SPELL_NAME));
3315 #endif
3316
3317
3318                         /* One more can be learned */
3319                         p_ptr->new_spells++;
3320                 }
3321         }
3322
3323
3324         /* Forget spells if we know too many spells */
3325         for (i = 63; i >= 0; i--)
3326         {
3327                 /* Stop when possible */
3328                 if (p_ptr->new_spells >= 0) break;
3329
3330                 /* Efficiency -- all done */
3331                 if (!p_ptr->spell_learned1 && !p_ptr->spell_learned2) break;
3332
3333                 /* Get the (i+1)th spell learned */
3334                 j = p_ptr->spell_order[i];
3335
3336                 /* Skip unknown spells */
3337                 if (j >= 99) continue;
3338
3339                 /* Forget it (if learned) */
3340                 if ((j < 32) ?
3341                         (p_ptr->spell_learned1 & (1L << j)) :
3342                         (p_ptr->spell_learned2 & (1L << (j - 32))))
3343                 {
3344                         /* Mark as forgotten */
3345                         if (j < 32)
3346                         {
3347                                 p_ptr->spell_forgotten1 |= (1L << j);
3348                                 which = p_ptr->realm1;
3349                         }
3350                         else
3351                         {
3352                                 p_ptr->spell_forgotten2 |= (1L << (j - 32));
3353                                 which = p_ptr->realm2;
3354                         }
3355
3356                         /* No longer known */
3357                         if (j < 32)
3358                         {
3359                                 p_ptr->spell_learned1 &= ~(1L << j);
3360                                 which = p_ptr->realm1;
3361                         }
3362                         else
3363                         {
3364                                 p_ptr->spell_learned2 &= ~(1L << (j - 32));
3365                                 which = p_ptr->realm2;
3366                         }
3367
3368 #ifdef JP
3369                         msg_format("%sの%sを忘れてしまった。", do_spell(which, j % 32, SPELL_NAME), p);
3370 #else
3371                         msg_format("You have forgotten the %s of %s.", p, do_spell(which, j % 32, SPELL_NAME));
3372 #endif
3373
3374
3375                         /* One more can be learned */
3376                         p_ptr->new_spells++;
3377                 }
3378         }
3379
3380
3381         /* Check for spells to remember */
3382         for (i = 0; i < 64; i++)
3383         {
3384                 /* None left to remember */
3385                 if (p_ptr->new_spells <= 0) break;
3386
3387                 /* Efficiency -- all done */
3388                 if (!p_ptr->spell_forgotten1 && !p_ptr->spell_forgotten2) break;
3389
3390                 /* Get the next spell we learned */
3391                 j = p_ptr->spell_order[i];
3392
3393                 /* Skip unknown spells */
3394                 if (j >= 99) break;
3395
3396                 /* Access the spell */
3397                 if (!is_magic((j < 32) ? p_ptr->realm1 : p_ptr->realm2))
3398                 {
3399                         if (j < 32)
3400                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
3401                         else
3402                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][j % 32];
3403                 }
3404                 else if (j < 32)
3405                         s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][j];
3406                 else
3407                         s_ptr = &mp_ptr->info[p_ptr->realm2 - 1][j % 32];
3408
3409                 /* Skip spells we cannot remember */
3410                 if (s_ptr->slevel > p_ptr->lev) continue;
3411
3412                 /* First set of spells */
3413                 if ((j < 32) ?
3414                         (p_ptr->spell_forgotten1 & (1L << j)) :
3415                         (p_ptr->spell_forgotten2 & (1L << (j - 32))))
3416                 {
3417                         /* No longer forgotten */
3418                         if (j < 32)
3419                         {
3420                                 p_ptr->spell_forgotten1 &= ~(1L << j);
3421                                 which = p_ptr->realm1;
3422                         }
3423                         else
3424                         {
3425                                 p_ptr->spell_forgotten2 &= ~(1L << (j - 32));
3426                                 which = p_ptr->realm2;
3427                         }
3428
3429                         /* Known once more */
3430                         if (j < 32)
3431                         {
3432                                 p_ptr->spell_learned1 |= (1L << j);
3433                                 which = p_ptr->realm1;
3434                         }
3435                         else
3436                         {
3437                                 p_ptr->spell_learned2 |= (1L << (j - 32));
3438                                 which = p_ptr->realm2;
3439                         }
3440
3441 #ifdef JP
3442                         msg_format("%sの%sを思い出した。", do_spell(which, j % 32, SPELL_NAME), p);
3443 #else
3444                         msg_format("You have remembered the %s of %s.", p, do_spell(which, j % 32, SPELL_NAME));
3445 #endif
3446
3447
3448                         /* One less can be learned */
3449                         p_ptr->new_spells--;
3450                 }
3451         }
3452
3453         k = 0;
3454
3455         if (p_ptr->realm2 == REALM_NONE)
3456         {
3457                 /* Count spells that can be learned */
3458                 for (j = 0; j < 32; j++)
3459                 {
3460                         if (!is_magic(p_ptr->realm1)) s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
3461                         else s_ptr = &mp_ptr->info[p_ptr->realm1 - 1][j];
3462
3463                         /* Skip spells we cannot remember */
3464                         if (s_ptr->slevel > p_ptr->lev) continue;
3465
3466                         /* Skip spells we already know */
3467                         if (p_ptr->spell_learned1 & (1L << j))
3468                         {
3469                                 continue;
3470                         }
3471
3472                         /* Count it */
3473                         k++;
3474                 }
3475                 if (k > 32) k = 32;
3476                 if ((p_ptr->new_spells > k) &&
3477                         ((mp_ptr->spell_book == TV_LIFE_BOOK) || (mp_ptr->spell_book == TV_HISSATSU_BOOK)))
3478                 {
3479                         p_ptr->new_spells = (s16b)k;
3480                 }
3481         }
3482
3483         if (p_ptr->new_spells < 0) p_ptr->new_spells = 0;
3484
3485         /* Spell count changed */
3486         if (p_ptr->old_spells != p_ptr->new_spells)
3487         {
3488                 /* Message if needed */
3489                 if (p_ptr->new_spells)
3490                 {
3491 #ifdef JP
3492                         if (p_ptr->new_spells < 10) {
3493                                 msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p);
3494                         }
3495                         else {
3496                                 msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p);
3497                         }
3498 #else
3499                         msg_format("You can learn %d more %s%s.",
3500                                 p_ptr->new_spells, p,
3501                                 (p_ptr->new_spells != 1) ? "s" : "");
3502 #endif
3503
3504                 }
3505
3506                 /* Save the new_spells value */
3507                 p_ptr->old_spells = p_ptr->new_spells;
3508
3509                 /* Redraw Study Status */
3510                 p_ptr->redraw |= (PR_STUDY);
3511
3512                 /* Redraw object recall */
3513                 p_ptr->window |= (PW_OBJECT);
3514         }
3515 }
3516
3517 /*!
3518  * @brief プレイヤーの最大MPを計算する /
3519  * Calculate maximum mana.  You do not need to know any spells.
3520  * Note that mana is lowered by heavy (or inappropriate) armor.
3521  * @return なし
3522  * @details
3523  * This function induces status messages.
3524  */
3525 static void calc_mana(void)
3526 {
3527         int msp, levels, cur_wgt, max_wgt;
3528
3529         object_type *o_ptr;
3530
3531
3532         /* Hack -- Must be literate */
3533         if (!mp_ptr->spell_book) return;
3534
3535         if ((p_ptr->pclass == CLASS_MINDCRAFTER) ||
3536                 (p_ptr->pclass == CLASS_MIRROR_MASTER) ||
3537                 (p_ptr->pclass == CLASS_BLUE_MAGE))
3538         {
3539                 levels = p_ptr->lev;
3540         }
3541         else
3542         {
3543                 if (mp_ptr->spell_first > p_ptr->lev)
3544                 {
3545                         /* Save new mana */
3546                         p_ptr->msp = 0;
3547
3548                         /* Display mana later */
3549                         p_ptr->redraw |= (PR_MANA);
3550                         return;
3551                 }
3552
3553                 /* Extract "effective" player level */
3554                 levels = (p_ptr->lev - mp_ptr->spell_first) + 1;
3555         }
3556
3557         if (p_ptr->pclass == CLASS_SAMURAI)
3558         {
3559                 msp = (adj_mag_mana[p_ptr->stat_ind[mp_ptr->spell_stat]] + 10) * 2;
3560                 if (msp) msp += (msp * rp_ptr->r_adj[mp_ptr->spell_stat] / 20);
3561         }
3562         else
3563         {
3564                 /* Extract total mana */
3565                 msp = adj_mag_mana[p_ptr->stat_ind[mp_ptr->spell_stat]] * (levels + 3) / 4;
3566
3567                 /* Hack -- usually add one mana */
3568                 if (msp) msp++;
3569
3570                 if (msp) msp += (msp * rp_ptr->r_adj[mp_ptr->spell_stat] / 20);
3571
3572                 if (msp && (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)) msp += msp / 2;
3573
3574                 /* Hack: High mages have a 25% mana bonus */
3575                 if (msp && (p_ptr->pclass == CLASS_HIGH_MAGE)) msp += msp / 4;
3576
3577                 if (msp && (p_ptr->pclass == CLASS_SORCERER)) msp += msp * (25 + p_ptr->lev) / 100;
3578         }
3579
3580         /* Only mages are affected */
3581         if (mp_ptr->spell_xtra & MAGIC_GLOVE_REDUCE_MANA)
3582         {
3583                 BIT_FLAGS flgs[TR_FLAG_SIZE];
3584
3585                 /* Assume player is not encumbered by gloves */
3586                 p_ptr->cumber_glove = FALSE;
3587
3588                 /* Get the gloves */
3589                 o_ptr = &p_ptr->inventory_list[INVEN_HANDS];
3590
3591                 /* Examine the gloves */
3592                 object_flags(o_ptr, flgs);
3593
3594                 /* Normal gloves hurt mage-type spells */
3595                 if (o_ptr->k_idx &&
3596                         !(have_flag(flgs, TR_FREE_ACT)) &&
3597                         !(have_flag(flgs, TR_DEC_MANA)) &&
3598                         !(have_flag(flgs, TR_EASY_SPELL)) &&
3599                         !((have_flag(flgs, TR_MAGIC_MASTERY)) && (o_ptr->pval > 0)) &&
3600                         !((have_flag(flgs, TR_DEX)) && (o_ptr->pval > 0)))
3601                 {
3602                         /* Encumbered */
3603                         p_ptr->cumber_glove = TRUE;
3604
3605                         /* Reduce mana */
3606                         msp = (3 * msp) / 4;
3607                 }
3608         }
3609
3610
3611         /* Assume player not encumbered by armor */
3612         p_ptr->cumber_armor = FALSE;
3613
3614         /* Weigh the armor */
3615         cur_wgt = 0;
3616         if (p_ptr->inventory_list[INVEN_RARM].tval > TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_RARM].weight;
3617         if (p_ptr->inventory_list[INVEN_LARM].tval > TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_LARM].weight;
3618         cur_wgt += p_ptr->inventory_list[INVEN_BODY].weight;
3619         cur_wgt += p_ptr->inventory_list[INVEN_HEAD].weight;
3620         cur_wgt += p_ptr->inventory_list[INVEN_OUTER].weight;
3621         cur_wgt += p_ptr->inventory_list[INVEN_HANDS].weight;
3622         cur_wgt += p_ptr->inventory_list[INVEN_FEET].weight;
3623
3624         /* Subtract a percentage of maximum mana. */
3625         switch (p_ptr->pclass)
3626         {
3627                 /* For these classes, mana is halved if armour
3628                  * is 30 pounds over their weight limit. */
3629         case CLASS_MAGE:
3630         case CLASS_HIGH_MAGE:
3631         case CLASS_BLUE_MAGE:
3632         case CLASS_MONK:
3633         case CLASS_FORCETRAINER:
3634         case CLASS_SORCERER:
3635         {
3636                 if (p_ptr->inventory_list[INVEN_RARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_RARM].weight;
3637                 if (p_ptr->inventory_list[INVEN_LARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_LARM].weight;
3638                 break;
3639         }
3640
3641         /* Mana halved if armour is 40 pounds over weight limit. */
3642         case CLASS_PRIEST:
3643         case CLASS_BARD:
3644         case CLASS_TOURIST:
3645         {
3646                 if (p_ptr->inventory_list[INVEN_RARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_RARM].weight * 2 / 3;
3647                 if (p_ptr->inventory_list[INVEN_LARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_LARM].weight * 2 / 3;
3648                 break;
3649         }
3650
3651         case CLASS_MINDCRAFTER:
3652         case CLASS_BEASTMASTER:
3653         case CLASS_MIRROR_MASTER:
3654         {
3655                 if (p_ptr->inventory_list[INVEN_RARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_RARM].weight / 2;
3656                 if (p_ptr->inventory_list[INVEN_LARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_LARM].weight / 2;
3657                 break;
3658         }
3659
3660         /* Mana halved if armour is 50 pounds over weight limit. */
3661         case CLASS_ROGUE:
3662         case CLASS_RANGER:
3663         case CLASS_RED_MAGE:
3664         case CLASS_WARRIOR_MAGE:
3665         {
3666                 if (p_ptr->inventory_list[INVEN_RARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_RARM].weight / 3;
3667                 if (p_ptr->inventory_list[INVEN_LARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_LARM].weight / 3;
3668                 break;
3669         }
3670
3671         /* Mana halved if armour is 60 pounds over weight limit. */
3672         case CLASS_PALADIN:
3673         case CLASS_CHAOS_WARRIOR:
3674         {
3675                 if (p_ptr->inventory_list[INVEN_RARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_RARM].weight / 5;
3676                 if (p_ptr->inventory_list[INVEN_LARM].tval <= TV_SWORD) cur_wgt += p_ptr->inventory_list[INVEN_LARM].weight / 5;
3677                 break;
3678         }
3679
3680         /* For new classes created, but not yet added to this formula. */
3681         default:
3682         {
3683                 break;
3684         }
3685         }
3686
3687         /* Determine the weight allowance */
3688         max_wgt = mp_ptr->spell_weight;
3689
3690         /* Heavy armor penalizes mana by a percentage.  -LM- */
3691         if ((cur_wgt - max_wgt) > 0)
3692         {
3693                 /* Encumbered */
3694                 p_ptr->cumber_armor = TRUE;
3695
3696                 /* Subtract a percentage of maximum mana. */
3697                 switch (p_ptr->pclass)
3698                 {
3699                         /* For these classes, mana is halved if armour
3700                          * is 30 pounds over their weight limit. */
3701                 case CLASS_MAGE:
3702                 case CLASS_HIGH_MAGE:
3703                 case CLASS_BLUE_MAGE:
3704                 {
3705                         msp -= msp * (cur_wgt - max_wgt) / 600;
3706                         break;
3707                 }
3708
3709                 /* Mana halved if armour is 40 pounds over weight limit. */
3710                 case CLASS_PRIEST:
3711                 case CLASS_MINDCRAFTER:
3712                 case CLASS_BEASTMASTER:
3713                 case CLASS_BARD:
3714                 case CLASS_FORCETRAINER:
3715                 case CLASS_TOURIST:
3716                 case CLASS_MIRROR_MASTER:
3717                 {
3718                         msp -= msp * (cur_wgt - max_wgt) / 800;
3719                         break;
3720                 }
3721
3722                 case CLASS_SORCERER:
3723                 {
3724                         msp -= msp * (cur_wgt - max_wgt) / 900;
3725                         break;
3726                 }
3727
3728                 /* Mana halved if armour is 50 pounds over weight limit. */
3729                 case CLASS_ROGUE:
3730                 case CLASS_RANGER:
3731                 case CLASS_MONK:
3732                 case CLASS_RED_MAGE:
3733                 {
3734                         msp -= msp * (cur_wgt - max_wgt) / 1000;
3735                         break;
3736                 }
3737
3738                 /* Mana halved if armour is 60 pounds over weight limit. */
3739                 case CLASS_PALADIN:
3740                 case CLASS_CHAOS_WARRIOR:
3741                 case CLASS_WARRIOR_MAGE:
3742                 {
3743                         msp -= msp * (cur_wgt - max_wgt) / 1200;
3744                         break;
3745                 }
3746
3747                 case CLASS_SAMURAI:
3748                 {
3749                         p_ptr->cumber_armor = FALSE;
3750                         break;
3751                 }
3752
3753                 /* For new classes created, but not yet added to this formula. */
3754                 default:
3755                 {
3756                         msp -= msp * (cur_wgt - max_wgt) / 800;
3757                         break;
3758                 }
3759                 }
3760         }
3761
3762         /* Mana can never be negative */
3763         if (msp < 0) msp = 0;
3764
3765
3766         /* Maximum mana has changed */
3767         if (p_ptr->msp != msp)
3768         {
3769                 /* Enforce maximum */
3770                 if ((p_ptr->csp >= msp) && (p_ptr->pclass != CLASS_SAMURAI))
3771                 {
3772                         p_ptr->csp = msp;
3773                         p_ptr->csp_frac = 0;
3774                 }
3775
3776 #ifdef JP
3777                 /* レベルアップの時は上昇量を表示する */
3778                 if ((level_up == 1) && (msp > p_ptr->msp))
3779                 {
3780                         msg_format("最大マジック・ポイントが %d 増加した!", (msp - p_ptr->msp));
3781                 }
3782 #endif
3783                 /* Save new mana */
3784                 p_ptr->msp = msp;
3785
3786                 /* Display mana later */
3787                 p_ptr->redraw |= (PR_MANA);
3788                 p_ptr->window |= (PW_PLAYER | PW_SPELL);
3789         }
3790
3791
3792         /* Hack -- handle "xtra" mode */
3793         if (character_xtra) return;
3794
3795         /* Take note when "glove state" changes */
3796         if (p_ptr->old_cumber_glove != p_ptr->cumber_glove)
3797         {
3798                 if (p_ptr->cumber_glove)
3799                 {
3800                         msg_print(_("手が覆われて呪文が唱えにくい感じがする。", "Your covered hands feel unsuitable for spellcasting."));
3801                 }
3802                 else
3803                 {
3804                         msg_print(_("この手の状態なら、ぐっと呪文が唱えやすい感じだ。", "Your hands feel more suitable for spellcasting."));
3805                 }
3806
3807                 /* Save it */
3808                 p_ptr->old_cumber_glove = p_ptr->cumber_glove;
3809         }
3810
3811
3812         /* Take note when "armor state" changes */
3813         if (p_ptr->old_cumber_armor != p_ptr->cumber_armor)
3814         {
3815                 if (p_ptr->cumber_armor)
3816                 {
3817                         msg_print(_("装備の重さで動きが鈍くなってしまっている。", "The weight of your equipment encumbers your movement."));
3818                 }
3819                 else
3820                 {
3821                         msg_print(_("ぐっと楽に体を動かせるようになった。", "You feel able to move more freely."));
3822                 }
3823
3824                 /* Save it */
3825                 p_ptr->old_cumber_armor = p_ptr->cumber_armor;
3826         }
3827 }
3828
3829 /*!
3830  * @brief 装備中の射撃武器の威力倍率を返す /
3831  * calcurate the fire rate of target object
3832  * @param o_ptr 計算する射撃武器のアイテム情報参照ポインタ
3833  * @return 射撃倍率の値(100で1.00倍)
3834  */
3835 s16b calc_num_fire(object_type *o_ptr)
3836 {
3837         int extra_shots = 0;
3838         int i;
3839         int num = 0;
3840         OBJECT_TYPE_VALUE tval_ammo = bow_tval_ammo(o_ptr);
3841         object_type *q_ptr;
3842         BIT_FLAGS flgs[TR_FLAG_SIZE];
3843
3844         /* Scan the usable p_ptr->inventory_list */
3845         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
3846         {
3847                 q_ptr = &p_ptr->inventory_list[i];
3848                 if (!q_ptr->k_idx) continue;
3849
3850                 /* Do not apply current equip */
3851                 if (i == INVEN_BOW) continue;
3852
3853                 object_flags(q_ptr, flgs);
3854
3855                 /* Boost shots */
3856                 if (have_flag(flgs, TR_XTRA_SHOTS)) extra_shots++;
3857         }
3858
3859         object_flags(o_ptr, flgs);
3860         if (have_flag(flgs, TR_XTRA_SHOTS)) extra_shots++;
3861
3862         if (o_ptr->k_idx && !is_heavy_shoot(o_ptr))
3863         {
3864                 num = 100;
3865                 /* Extra shots */
3866                 num += (extra_shots * 100);
3867
3868                 /* Hack -- Rangers love Bows */
3869                 if ((p_ptr->pclass == CLASS_RANGER) &&
3870                         (tval_ammo == TV_ARROW))
3871                 {
3872                         num += (p_ptr->lev * 4);
3873                 }
3874
3875                 if ((p_ptr->pclass == CLASS_CAVALRY) &&
3876                         (tval_ammo == TV_ARROW))
3877                 {
3878                         num += (p_ptr->lev * 3);
3879                 }
3880
3881                 if (p_ptr->pclass == CLASS_ARCHER)
3882                 {
3883                         if (tval_ammo == TV_ARROW)
3884                                 num += ((p_ptr->lev * 5) + 50);
3885                         else if ((tval_ammo == TV_BOLT) || (tval_ammo == TV_SHOT))
3886                                 num += (p_ptr->lev * 4);
3887                 }
3888
3889                 /*
3890                  * Addendum -- also "Reward" high level warriors,
3891                  * with _any_ missile weapon -- TY
3892                  */
3893                 if (p_ptr->pclass == CLASS_WARRIOR &&
3894                         (tval_ammo <= TV_BOLT) &&
3895                         (tval_ammo >= TV_SHOT))
3896                 {
3897                         num += (p_ptr->lev * 2);
3898                 }
3899                 if ((p_ptr->pclass == CLASS_ROGUE) &&
3900                         (tval_ammo == TV_SHOT))
3901                 {
3902                         num += (p_ptr->lev * 4);
3903                 }
3904         }
3905         return (s16b)num;
3906 }
3907
3908 /*!
3909  * @brief プレイヤーの所持重量制限を計算する /
3910  * Computes current weight limit.
3911  * @return 制限重量(ポンド)
3912  */
3913 WEIGHT weight_limit(void)
3914 {
3915         WEIGHT i;
3916
3917         /* Weight limit based only on strength */
3918         i = (WEIGHT)adj_str_wgt[p_ptr->stat_ind[A_STR]] * 50; /* Constant was 100 */
3919         if (p_ptr->pclass == CLASS_BERSERKER) i = i * 3 / 2;
3920
3921         /* Return the result */
3922         return i;
3923 }
3924
3925 /*!
3926  * @brief プレイヤーが現在右手/左手に武器を持っているか判定する /
3927  * @param i 判定する手のID(右手:0 左手:1)
3928  * @return 持っているならばTRUE
3929  */
3930 bool has_melee_weapon(int i)
3931 {
3932         return ((p_ptr->inventory_list[i].k_idx && object_is_melee_weapon(&p_ptr->inventory_list[i])) ? TRUE : FALSE);
3933 }
3934
3935 /*!
3936  * @brief プレイヤーの現在開いている手の状態を返す
3937  * @param riding_control 乗馬中により片手を必要としている状態ならばTRUEを返す。
3938  * @return 開いている手のビットフラグ
3939  */
3940 BIT_FLAGS16 empty_hands(bool riding_control)
3941 {
3942         BIT_FLAGS16 status = EMPTY_HAND_NONE;
3943
3944         if (!p_ptr->inventory_list[INVEN_RARM].k_idx) status |= EMPTY_HAND_RARM;
3945         if (!p_ptr->inventory_list[INVEN_LARM].k_idx) status |= EMPTY_HAND_LARM;
3946
3947         if (riding_control && (status != EMPTY_HAND_NONE) && p_ptr->riding && !(p_ptr->pet_extra_flags & PF_RYOUTE))
3948         {
3949                 if (status & EMPTY_HAND_LARM) status &= ~(EMPTY_HAND_LARM);
3950                 else if (status & EMPTY_HAND_RARM) status &= ~(EMPTY_HAND_RARM);
3951         }
3952
3953         return status;
3954 }
3955
3956
3957 /*!
3958  * @brief プレイヤーが防具重量制限のある職業時にペナルティを受ける状態にあるかどうかを返す。
3959  * @return ペナルティが適用されるならばTRUE。
3960  */
3961 bool heavy_armor(void)
3962 {
3963         WEIGHT monk_arm_wgt = 0;
3964
3965         if ((p_ptr->pclass != CLASS_MONK) && (p_ptr->pclass != CLASS_FORCETRAINER) && (p_ptr->pclass != CLASS_NINJA)) return FALSE;
3966
3967         /* Weight the armor */
3968         if (p_ptr->inventory_list[INVEN_RARM].tval > TV_SWORD) monk_arm_wgt += p_ptr->inventory_list[INVEN_RARM].weight;
3969         if (p_ptr->inventory_list[INVEN_LARM].tval > TV_SWORD) monk_arm_wgt += p_ptr->inventory_list[INVEN_LARM].weight;
3970         monk_arm_wgt += p_ptr->inventory_list[INVEN_BODY].weight;
3971         monk_arm_wgt += p_ptr->inventory_list[INVEN_HEAD].weight;
3972         monk_arm_wgt += p_ptr->inventory_list[INVEN_OUTER].weight;
3973         monk_arm_wgt += p_ptr->inventory_list[INVEN_HANDS].weight;
3974         monk_arm_wgt += p_ptr->inventory_list[INVEN_FEET].weight;
3975
3976         return (monk_arm_wgt > (100 + (p_ptr->lev * 4)));
3977 }
3978
3979 /*!
3980  * @brief p_ptr->update のフラグに応じた更新をまとめて行う / Handle "p_ptr->update"
3981  * @return なし
3982  * @details 更新処理の対象はプレイヤーの能力修正/光源寿命/HP/MP/魔法の学習状態、他多数の外界の状態判定。
3983  */
3984 void update_creature(player_type *creature_ptr)
3985 {
3986         if (!creature_ptr->update) return;
3987
3988         /* Actually do auto-destroy */
3989         if (creature_ptr->update & (PU_AUTODESTROY))
3990         {
3991                 creature_ptr->update &= ~(PU_AUTODESTROY);
3992                 autopick_delayed_alter();
3993         }
3994         if (creature_ptr->update & (PU_COMBINE))
3995         {
3996                 creature_ptr->update &= ~(PU_COMBINE);
3997                 combine_pack();
3998         }
3999
4000         /* Reorder the pack */
4001         if (creature_ptr->update & (PU_REORDER))
4002         {
4003                 creature_ptr->update &= ~(PU_REORDER);
4004                 reorder_pack();
4005         }
4006
4007         if (creature_ptr->update & (PU_BONUS))
4008         {
4009                 creature_ptr->update &= ~(PU_BONUS);
4010                 calc_alignment();
4011                 calc_bonuses();
4012         }
4013
4014         if (creature_ptr->update & (PU_TORCH))
4015         {
4016                 creature_ptr->update &= ~(PU_TORCH);
4017                 calc_torch();
4018         }
4019
4020         if (creature_ptr->update & (PU_HP))
4021         {
4022                 creature_ptr->update &= ~(PU_HP);
4023                 calc_hitpoints();
4024         }
4025
4026         if (creature_ptr->update & (PU_MANA))
4027         {
4028                 creature_ptr->update &= ~(PU_MANA);
4029                 calc_mana();
4030         }
4031
4032         if (creature_ptr->update & (PU_SPELLS))
4033         {
4034                 creature_ptr->update &= ~(PU_SPELLS);
4035                 calc_spells();
4036         }
4037
4038         /* Character is not ready yet, no screen updates */
4039         if (!character_generated) return;
4040
4041         /* Character is in "icky" mode, no screen updates */
4042         if (character_icky) return;
4043
4044         if (creature_ptr->update & (PU_UN_LITE))
4045         {
4046                 creature_ptr->update &= ~(PU_UN_LITE);
4047                 forget_lite();
4048         }
4049
4050         if (creature_ptr->update & (PU_UN_VIEW))
4051         {
4052                 creature_ptr->update &= ~(PU_UN_VIEW);
4053                 forget_view();
4054         }
4055
4056         if (creature_ptr->update & (PU_VIEW))
4057         {
4058                 creature_ptr->update &= ~(PU_VIEW);
4059                 update_view();
4060         }
4061
4062         if (creature_ptr->update & (PU_LITE))
4063         {
4064                 creature_ptr->update &= ~(PU_LITE);
4065                 update_lite();
4066         }
4067
4068
4069         if (creature_ptr->update & (PU_FLOW))
4070         {
4071                 creature_ptr->update &= ~(PU_FLOW);
4072                 update_flow();
4073         }
4074
4075         if (creature_ptr->update & (PU_DISTANCE))
4076         {
4077                 creature_ptr->update &= ~(PU_DISTANCE);
4078
4079                 /* Still need to call update_monsters(FALSE) after update_mon_lite() */
4080                 /* creature_ptr->update &= ~(PU_MONSTERS); */
4081
4082                 update_monsters(TRUE);
4083         }
4084
4085         if (creature_ptr->update & (PU_MON_LITE))
4086         {
4087                 creature_ptr->update &= ~(PU_MON_LITE);
4088                 update_mon_lite();
4089         }
4090
4091         /*
4092          * Mega-Hack -- Delayed visual update
4093          * Only used if update_view(), update_lite() or update_mon_lite() was called
4094          */
4095         if (creature_ptr->update & (PU_DELAY_VIS))
4096         {
4097                 creature_ptr->update &= ~(PU_DELAY_VIS);
4098                 delayed_visual_update();
4099         }
4100
4101         if (creature_ptr->update & (PU_MONSTERS))
4102         {
4103                 creature_ptr->update &= ~(PU_MONSTERS);
4104                 update_monsters(FALSE);
4105         }
4106 }
4107
4108 /*!
4109  * @brief プレイヤーが魔道書を一冊も持っていないかを判定する
4110  * @return 魔道書を一冊も持っていないならTRUEを返す
4111  */
4112 bool player_has_no_spellbooks(void)
4113 {
4114         int i;
4115         object_type *o_ptr;
4116
4117         for (i = 0; i < INVEN_PACK; i++)
4118         {
4119                 o_ptr = &p_ptr->inventory_list[i];
4120                 if (o_ptr->k_idx && check_book_realm(o_ptr->tval, o_ptr->sval)) return FALSE;
4121         }
4122
4123         for (i = current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].o_idx; i; i = o_ptr->next_o_idx)
4124         {
4125                 o_ptr = &current_floor_ptr->o_list[i];
4126                 if (o_ptr->k_idx && (o_ptr->marked & OM_FOUND) && check_book_realm(o_ptr->tval, o_ptr->sval)) return FALSE;
4127         }
4128
4129         return TRUE;
4130 }
4131
4132 void take_turn(player_type *creature_ptr, PERCENTAGE need_cost)
4133 {
4134         creature_ptr->energy_use = (ENERGY)need_cost;
4135 }
4136
4137 void free_turn(player_type *creature_ptr)
4138 {
4139         creature_ptr->energy_use = 0;
4140 }
4141
4142 /*!
4143  * @brief プレイヤーを指定座標に配置する / Place the player in the dungeon XXX XXX
4144  * @param x 配置先X座標
4145  * @param y 配置先Y座標
4146  * @return 配置に成功したらTRUE
4147  */
4148 bool player_place(POSITION y, POSITION x)
4149 {
4150         /* Paranoia XXX XXX */
4151         if (current_floor_ptr->grid_array[y][x].m_idx != 0) return FALSE;
4152
4153         /* Save player location */
4154         p_ptr->y = y;
4155         p_ptr->x = x;
4156
4157         /* Success */
4158         return TRUE;
4159 }
4160
4161 /*!
4162  * @brief 種族アンバライトが出血時パターンの上に乗った際のペナルティ処理
4163  * @return なし
4164  */
4165 void wreck_the_pattern(void)
4166 {
4167         int to_ruin = 0;
4168         POSITION r_y, r_x;
4169         int pattern_type = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
4170
4171         if (pattern_type == PATTERN_TILE_WRECKED)
4172         {
4173                 /* Ruined already */
4174                 return;
4175         }
4176
4177         msg_print(_("パターンを血で汚してしまった!", "You bleed on the Pattern!"));
4178         msg_print(_("何か恐ろしい事が起こった!", "Something terrible happens!"));
4179
4180         if (!IS_INVULN()) take_hit(DAMAGE_NOESCAPE, damroll(10, 8), _("パターン損壊", "corrupting the Pattern"), -1);
4181         to_ruin = randint1(45) + 35;
4182
4183         while (to_ruin--)
4184         {
4185                 scatter(&r_y, &r_x, p_ptr->y, p_ptr->x, 4, 0);
4186
4187                 if (pattern_tile(r_y, r_x) &&
4188                         (f_info[current_floor_ptr->grid_array[r_y][r_x].feat].subtype != PATTERN_TILE_WRECKED))
4189                 {
4190                         cave_set_feat(r_y, r_x, feat_pattern_corrupted);
4191                 }
4192         }
4193
4194         cave_set_feat(p_ptr->y, p_ptr->x, feat_pattern_corrupted);
4195 }
4196
4197
4198 /*!
4199  * @brief ELDRITCH_HORRORによるプレイヤーの精神破壊処理
4200  * @param m_ptr ELDRITCH_HORRORを引き起こしたモンスターの参照ポインタ
4201  * @param necro 暗黒領域魔法の詠唱失敗によるものならばTRUEを返す
4202  * @return なし
4203  */
4204 void sanity_blast(monster_type *m_ptr, bool necro)
4205 {
4206         int power = 100;
4207
4208         if (p_ptr->inside_battle || !character_dungeon) return;
4209
4210         if (!necro && m_ptr)
4211         {
4212                 GAME_TEXT m_name[MAX_NLEN];
4213                 monster_race *r_ptr = &r_info[m_ptr->ap_r_idx];
4214
4215                 power = r_ptr->level / 2;
4216
4217                 monster_desc(m_name, m_ptr, 0);
4218
4219                 if (!(r_ptr->flags1 & RF1_UNIQUE))
4220                 {
4221                         if (r_ptr->flags1 & RF1_FRIENDS)
4222                                 power /= 2;
4223                 }
4224                 else power *= 2;
4225
4226                 if (!is_loading_now)
4227                         return; /* No effect yet, just loaded... */
4228
4229                 if (!m_ptr->ml)
4230                         return; /* Cannot see it for some reason */
4231
4232                 if (!(r_ptr->flags2 & RF2_ELDRITCH_HORROR))
4233                         return;
4234
4235                 if (is_pet(m_ptr))
4236                         return; /* Pet eldritch horrors are safe most of the time */
4237
4238                 if (randint1(100) > power) return;
4239
4240                 if (saving_throw(p_ptr->skill_sav - power))
4241                 {
4242                         return; /* Save, no adverse effects */
4243                 }
4244
4245                 if (p_ptr->image)
4246                 {
4247                         /* Something silly happens... */
4248                         msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"),
4249                                 funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
4250
4251                         if (one_in_(3))
4252                         {
4253                                 msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
4254                                 p_ptr->image = p_ptr->image + randint1(r_ptr->level);
4255                         }
4256
4257                         return; /* Never mind; we can't see it clearly enough */
4258                 }
4259
4260                 /* Something frightening happens... */
4261                 msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"),
4262                         horror_desc[randint0(MAX_SAN_HORROR)], m_name);
4263
4264                 r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
4265
4266                 /* Demon characters are unaffected */
4267                 if (prace_is_(RACE_IMP) || prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)) return;
4268                 if (p_ptr->wizard) return;
4269
4270                 /* Undead characters are 50% likely to be unaffected */
4271                 if (prace_is_(RACE_SKELETON) || prace_is_(RACE_ZOMBIE)
4272                         || prace_is_(RACE_VAMPIRE) || prace_is_(RACE_SPECTRE) ||
4273                         (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD))
4274                 {
4275                         if (saving_throw(25 + p_ptr->lev)) return;
4276                 }
4277         }
4278         else if (!necro)
4279         {
4280                 monster_race *r_ptr;
4281                 GAME_TEXT m_name[MAX_NLEN];
4282                 concptr desc;
4283
4284                 get_mon_num_prep(get_nightmare, NULL);
4285
4286                 r_ptr = &r_info[get_mon_num(MAX_DEPTH)];
4287                 power = r_ptr->level + 10;
4288                 desc = r_name + r_ptr->name;
4289
4290                 get_mon_num_prep(NULL, NULL);
4291
4292 #ifndef JP
4293                 if (!(r_ptr->flags1 & RF1_UNIQUE))
4294                         sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc);
4295                 else
4296 #endif
4297                         sprintf(m_name, "%s", desc);
4298
4299                 if (!(r_ptr->flags1 & RF1_UNIQUE))
4300                 {
4301                         if (r_ptr->flags1 & RF1_FRIENDS) power /= 2;
4302                 }
4303                 else power *= 2;
4304
4305                 if (saving_throw(p_ptr->skill_sav * 100 / power))
4306                 {
4307                         msg_format(_("夢の中で%sに追いかけられた。", "%^s chases you through your dreams."), m_name);
4308                         /* Safe */
4309                         return;
4310                 }
4311
4312                 if (p_ptr->image)
4313                 {
4314                         /* Something silly happens... */
4315                         msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"),
4316                                 funny_desc[randint0(MAX_SAN_FUNNY)], m_name);
4317
4318                         if (one_in_(3))
4319                         {
4320                                 msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]);
4321                                 p_ptr->image = p_ptr->image + randint1(r_ptr->level);
4322                         }
4323
4324                         /* Never mind; we can't see it clearly enough */
4325                         return;
4326                 }
4327
4328                 /* Something frightening happens... */
4329                 msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"),
4330                         horror_desc[randint0(MAX_SAN_HORROR)], desc);
4331
4332                 r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;
4333
4334                 if (!p_ptr->mimic_form)
4335                 {
4336                         switch (p_ptr->prace)
4337                         {
4338                                 /* Demons may make a saving throw */
4339                         case RACE_IMP:
4340                         case RACE_DEMON:
4341                                 if (saving_throw(20 + p_ptr->lev)) return;
4342                                 break;
4343                                 /* Undead may make a saving throw */
4344                         case RACE_SKELETON:
4345                         case RACE_ZOMBIE:
4346                         case RACE_SPECTRE:
4347                         case RACE_VAMPIRE:
4348                                 if (saving_throw(10 + p_ptr->lev)) return;
4349                                 break;
4350                         }
4351                 }
4352                 else
4353                 {
4354                         /* Demons may make a saving throw */
4355                         if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)
4356                         {
4357                                 if (saving_throw(20 + p_ptr->lev)) return;
4358                         }
4359                         /* Undead may make a saving throw */
4360                         else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD)
4361                         {
4362                                 if (saving_throw(10 + p_ptr->lev)) return;
4363                         }
4364                 }
4365         }
4366         else
4367         {
4368                 msg_print(_("ネクロノミコンを読んで正気を失った!", "Your sanity is shaken by reading the Necronomicon!"));
4369         }
4370
4371         if (saving_throw(p_ptr->skill_sav - power))
4372         {
4373                 return;
4374         }
4375
4376         do {
4377                 (void)do_dec_stat(A_INT);
4378         } while (randint0(100) > p_ptr->skill_sav && one_in_(2));
4379
4380         do {
4381                 (void)do_dec_stat(A_WIS);
4382         } while (randint0(100) > p_ptr->skill_sav && one_in_(2));
4383
4384         switch (randint1(21))
4385         {
4386         case 1:
4387                 if (!(p_ptr->muta3 & MUT3_MORONIC) && one_in_(5))
4388                 {
4389                         if ((p_ptr->stat_use[A_INT] < 4) && (p_ptr->stat_use[A_WIS] < 4))
4390                         {
4391                                 msg_print(_("あなたは完璧な馬鹿になったような気がした。しかしそれは元々だった。", "You current_world_ptr->game_turn into an utter moron!"));
4392                         }
4393                         else
4394                         {
4395                                 msg_print(_("あなたは完璧な馬鹿になった!", "You current_world_ptr->game_turn into an utter moron!"));
4396                         }
4397
4398                         if (p_ptr->muta3 & MUT3_HYPER_INT)
4399                         {
4400                                 msg_print(_("あなたの脳は生体コンピュータではなくなった。", "Your brain is no longer a living computer."));
4401                                 p_ptr->muta3 &= ~(MUT3_HYPER_INT);
4402                         }
4403                         p_ptr->muta3 |= MUT3_MORONIC;
4404                 }
4405                 break;
4406         case 2:
4407         case 3:
4408         case 4:
4409                 if (!(p_ptr->muta2 & MUT2_COWARDICE) && !p_ptr->resist_fear)
4410                 {
4411                         msg_print(_("あなたはパラノイアになった!", "You become paranoid!"));
4412
4413                         /* Duh, the following should never happen, but anyway... */
4414                         if (p_ptr->muta3 & MUT3_FEARLESS)
4415                         {
4416                                 msg_print(_("あなたはもう恐れ知らずではなくなった。", "You are no longer fearless."));
4417                                 p_ptr->muta3 &= ~(MUT3_FEARLESS);
4418                         }
4419
4420                         p_ptr->muta2 |= MUT2_COWARDICE;
4421                 }
4422                 break;
4423         case 5:
4424         case 6:
4425         case 7:
4426                 if (!(p_ptr->muta2 & MUT2_HALLU) && !p_ptr->resist_chaos)
4427                 {
4428                         msg_print(_("幻覚をひき起こす精神錯乱に陥った!", "You are afflicted by a hallucinatory insanity!"));
4429                         p_ptr->muta2 |= MUT2_HALLU;
4430                 }
4431                 break;
4432         case 8:
4433         case 9:
4434         case 10:
4435                 if (!(p_ptr->muta2 & MUT2_BERS_RAGE))
4436                 {
4437                         msg_print(_("激烈な感情の発作におそわれるようになった!", "You become subject to fits of berserk rage!"));
4438                         p_ptr->muta2 |= MUT2_BERS_RAGE;
4439                 }
4440                 break;
4441         case 11:
4442         case 12:
4443         case 13:
4444         case 14:
4445         case 15:
4446         case 16:
4447                 /* Brain smash */
4448                 if (!p_ptr->resist_conf)
4449                 {
4450                         (void)set_confused(p_ptr->confused + randint0(4) + 4);
4451                 }
4452                 if (!p_ptr->free_act)
4453                 {
4454                         (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4);
4455                 }
4456                 if (!p_ptr->resist_chaos)
4457                 {
4458                         (void)set_image(p_ptr->image + randint0(250) + 150);
4459                 }
4460                 break;
4461         case 17:
4462         case 18:
4463         case 19:
4464         case 20:
4465         case 21:
4466                 /* Amnesia */
4467                 if (lose_all_info())
4468                         msg_print(_("あまりの恐怖に全てのことを忘れてしまった!", "You forget everything in your utmost terror!"));
4469                 break;
4470         }
4471
4472         p_ptr->update |= PU_BONUS;
4473         handle_stuff();
4474 }
4475
4476
4477 /*!
4478  * @brief プレイヤーの経験値について整合性のためのチェックと調整を行う /
4479  * Advance experience levels and print experience
4480  * @return なし
4481  */
4482 void check_experience(void)
4483 {
4484         bool level_reward = FALSE;
4485         bool level_mutation = FALSE;
4486         bool level_inc_stat = FALSE;
4487         bool android = (p_ptr->prace == RACE_ANDROID ? TRUE : FALSE);
4488         PLAYER_LEVEL old_lev = p_ptr->lev;
4489
4490         /* Hack -- lower limit */
4491         if (p_ptr->exp < 0) p_ptr->exp = 0;
4492         if (p_ptr->max_exp < 0) p_ptr->max_exp = 0;
4493         if (p_ptr->max_max_exp < 0) p_ptr->max_max_exp = 0;
4494
4495         /* Hack -- upper limit */
4496         if (p_ptr->exp > PY_MAX_EXP) p_ptr->exp = PY_MAX_EXP;
4497         if (p_ptr->max_exp > PY_MAX_EXP) p_ptr->max_exp = PY_MAX_EXP;
4498         if (p_ptr->max_max_exp > PY_MAX_EXP) p_ptr->max_max_exp = PY_MAX_EXP;
4499
4500         /* Hack -- maintain "max" experience */
4501         if (p_ptr->exp > p_ptr->max_exp) p_ptr->max_exp = p_ptr->exp;
4502
4503         /* Hack -- maintain "max max" experience */
4504         if (p_ptr->max_exp > p_ptr->max_max_exp) p_ptr->max_max_exp = p_ptr->max_exp;
4505
4506         /* Redraw experience */
4507         p_ptr->redraw |= (PR_EXP);
4508         handle_stuff();
4509
4510
4511         /* Lose levels while possible */
4512         while ((p_ptr->lev > 1) &&
4513                 (p_ptr->exp < ((android ? player_exp_a : player_exp)[p_ptr->lev - 2] * p_ptr->expfact / 100L)))
4514         {
4515                 /* Lose a level */
4516                 p_ptr->lev--;
4517                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4518                 p_ptr->redraw |= (PR_LEV | PR_TITLE);
4519                 p_ptr->window |= (PW_PLAYER);
4520                 handle_stuff();
4521         }
4522
4523
4524         /* Gain levels while possible */
4525         while ((p_ptr->lev < PY_MAX_LEVEL) &&
4526                 (p_ptr->exp >= ((android ? player_exp_a : player_exp)[p_ptr->lev - 1] * p_ptr->expfact / 100L)))
4527         {
4528                 /* Gain a level */
4529                 p_ptr->lev++;
4530
4531                 /* Save the highest level */
4532                 if (p_ptr->lev > p_ptr->max_plv)
4533                 {
4534                         p_ptr->max_plv = p_ptr->lev;
4535
4536                         if ((p_ptr->pclass == CLASS_CHAOS_WARRIOR) ||
4537                                 (p_ptr->muta2 & MUT2_CHAOS_GIFT))
4538                         {
4539                                 level_reward = TRUE;
4540                         }
4541                         if (p_ptr->prace == RACE_BEASTMAN)
4542                         {
4543                                 if (one_in_(5)) level_mutation = TRUE;
4544                         }
4545                         level_inc_stat = TRUE;
4546
4547                         do_cmd_write_nikki(NIKKI_LEVELUP, p_ptr->lev, NULL);
4548                 }
4549
4550                 sound(SOUND_LEVEL);
4551
4552                 msg_format(_("レベル %d にようこそ。", "Welcome to level %d."), p_ptr->lev);
4553
4554                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4555                 p_ptr->redraw |= (PR_LEV | PR_TITLE | PR_EXP);
4556                 p_ptr->window |= (PW_PLAYER | PW_SPELL | PW_INVEN);
4557
4558                 /* HPとMPの上昇量を表示 */
4559                 level_up = 1;
4560                 handle_stuff();
4561
4562                 level_up = 0;
4563
4564                 if (level_inc_stat)
4565                 {
4566                         if (!(p_ptr->max_plv % 10))
4567                         {
4568                                 int choice;
4569                                 screen_save();
4570                                 while (1)
4571                                 {
4572                                         int n;
4573                                         char tmp[32];
4574
4575                                         cnv_stat(p_ptr->stat_max[0], tmp);
4576                                         prt(format(_("        a) 腕力 (現在値 %s)", "        a) Str (cur %s)"), tmp), 2, 14);
4577                                         cnv_stat(p_ptr->stat_max[1], tmp);
4578                                         prt(format(_("        b) 知能 (現在値 %s)", "        a) Int (cur %s)"), tmp), 3, 14);
4579                                         cnv_stat(p_ptr->stat_max[2], tmp);
4580                                         prt(format(_("        c) 賢さ (現在値 %s)", "        a) Wis (cur %s)"), tmp), 4, 14);
4581                                         cnv_stat(p_ptr->stat_max[3], tmp);
4582                                         prt(format(_("        d) 器用 (現在値 %s)", "        a) Dex (cur %s)"), tmp), 5, 14);
4583                                         cnv_stat(p_ptr->stat_max[4], tmp);
4584                                         prt(format(_("        e) 耐久 (現在値 %s)", "        a) Con (cur %s)"), tmp), 6, 14);
4585                                         cnv_stat(p_ptr->stat_max[5], tmp);
4586                                         prt(format(_("        f) 魅力 (現在値 %s)", "        a) Chr (cur %s)"), tmp), 7, 14);
4587
4588                                         prt("", 8, 14);
4589                                         prt(_("        どの能力値を上げますか?", "        Which stat do you want to raise?"), 1, 14);
4590
4591                                         while (1)
4592                                         {
4593                                                 choice = inkey();
4594                                                 if ((choice >= 'a') && (choice <= 'f')) break;
4595                                         }
4596                                         for (n = 0; n < A_MAX; n++)
4597                                                 if (n != choice - 'a')
4598                                                         prt("", n + 2, 14);
4599                                         if (get_check(_("よろしいですか?", "Are you sure? "))) break;
4600                                 }
4601                                 do_inc_stat(choice - 'a');
4602                                 screen_load();
4603                         }
4604                         else if (!(p_ptr->max_plv % 2))
4605                                 do_inc_stat(randint0(6));
4606                 }
4607
4608                 if (level_mutation)
4609                 {
4610                         msg_print(_("あなたは変わった気がする...", "You feel different..."));
4611                         (void)gain_mutation(p_ptr, 0);
4612                         level_mutation = FALSE;
4613                 }
4614
4615                 /*
4616                  * 報酬でレベルが上ると再帰的に check_experience() が
4617                  * 呼ばれるので順番を最後にする。
4618                  */
4619                 if (level_reward)
4620                 {
4621                         gain_level_reward(0);
4622                         level_reward = FALSE;
4623                 }
4624
4625                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4626                 p_ptr->redraw |= (PR_LEV | PR_TITLE);
4627                 p_ptr->window |= (PW_PLAYER | PW_SPELL);
4628                 handle_stuff();
4629         }
4630
4631         /* Load an autopick preference file */
4632         if (old_lev != p_ptr->lev) autopick_load_pref(FALSE);
4633 }
4634
4635 /*!
4636  * @brief 現在の修正後能力値を3~17及び18/xxx形式に変換する / Converts stat num into a six-char (right justified) string
4637  * @param val 能力値
4638  * @param out_val 出力先文字列ポインタ
4639  * @return なし
4640  */
4641 void cnv_stat(int val, char *out_val)
4642 {
4643         /* Above 18 */
4644         if (val > 18)
4645         {
4646                 int bonus = (val - 18);
4647
4648                 if (bonus >= 220)
4649                 {
4650                         sprintf(out_val, "18/%3s", "***");
4651                 }
4652                 else if (bonus >= 100)
4653                 {
4654                         sprintf(out_val, "18/%03d", bonus);
4655                 }
4656                 else
4657                 {
4658                         sprintf(out_val, " 18/%02d", bonus);
4659                 }
4660         }
4661
4662         /* From 3 to 18 */
4663         else
4664         {
4665                 sprintf(out_val, "    %2d", val);
4666         }
4667 }
4668
4669 /*!
4670  * @brief 能力値現在値から3~17及び18/xxx様式に基づく加減算を行う。
4671  * Modify a stat value by a "modifier", return new value
4672  * @param value 現在値
4673  * @param amount 加減算値
4674  * @return 加減算後の値
4675  * @details
4676  * <pre>
4677  * Stats go up: 3,4,...,17,18,18/10,18/20,...,18/220
4678  * Or even: 18/13, 18/23, 18/33, ..., 18/220
4679  * Stats go down: 18/220, 18/210,..., 18/10, 18, 17, ..., 3
4680  * Or even: 18/13, 18/03, 18, 17, ..., 3
4681  * </pre>
4682  */
4683 s16b modify_stat_value(int value, int amount)
4684 {
4685         int    i;
4686
4687         /* Reward */
4688         if (amount > 0)
4689         {
4690                 /* Apply each point */
4691                 for (i = 0; i < amount; i++)
4692                 {
4693                         /* One point at a time */
4694                         if (value < 18) value++;
4695
4696                         /* Ten "points" at a time */
4697                         else value += 10;
4698                 }
4699         }
4700
4701         /* Penalty */
4702         else if (amount < 0)
4703         {
4704                 /* Apply each point */
4705                 for (i = 0; i < (0 - amount); i++)
4706                 {
4707                         /* Ten points at a time */
4708                         if (value >= 18 + 10) value -= 10;
4709
4710                         /* Hack -- prevent weirdness */
4711                         else if (value > 18) value = 18;
4712
4713                         /* One point at a time */
4714                         else if (value > 3) value--;
4715                 }
4716         }
4717
4718         /* Return new value */
4719         return (s16b)(value);
4720 }
4721
4722
4723 /*!
4724  * @brief スコアを計算する /
4725  * Hack -- Calculates the total number of points earned         -JWT-
4726  * @return なし
4727  * @details
4728  */
4729 long calc_score(void)
4730 {
4731         int i, mult = 100;
4732         DEPTH max_dl = 0;
4733         u32b point, point_h, point_l;
4734         int arena_win = MIN(p_ptr->arena_number, MAX_ARENA_MONS);
4735
4736         if (!preserve_mode) mult += 10;
4737         if (!autoroller) mult += 10;
4738         if (!smart_learn) mult -= 20;
4739         if (smart_cheat) mult += 30;
4740         if (ironman_shops) mult += 50;
4741         if (ironman_small_levels) mult += 10;
4742         if (ironman_empty_levels) mult += 20;
4743         if (!powerup_home) mult += 50;
4744         if (ironman_rooms) mult += 100;
4745         if (ironman_nightmare) mult += 100;
4746
4747         if (mult < 5) mult = 5;
4748
4749         for (i = 0; i < max_d_idx; i++)
4750                 if (max_dlv[i] > max_dl)
4751                         max_dl = max_dlv[i];
4752
4753         point_l = (p_ptr->max_max_exp + (100 * max_dl));
4754         point_h = point_l / 0x10000L;
4755         point_l = point_l % 0x10000L;
4756         point_h *= mult;
4757         point_l *= mult;
4758         point_h += point_l / 0x10000L;
4759         point_l %= 0x10000L;
4760
4761         point_l += ((point_h % 100) << 16);
4762         point_h /= 100;
4763         point_l /= 100;
4764
4765         point = (point_h << 16) + (point_l);
4766         if (p_ptr->arena_number >= 0)
4767                 point += (arena_win * arena_win * (arena_win > 29 ? 1000 : 100));
4768
4769         if (ironman_downward) point *= 2;
4770         if (p_ptr->pclass == CLASS_BERSERKER)
4771         {
4772                 if (p_ptr->prace == RACE_SPECTRE)
4773                         point = point / 5;
4774         }
4775
4776         if ((p_ptr->pseikaku == SEIKAKU_MUNCHKIN) && point)
4777         {
4778                 point = 1;
4779                 if (p_ptr->total_winner) point = 2;
4780         }
4781         if (easy_band) point = (0 - point);
4782
4783         return point;
4784 }
4785