OSDN Git Service

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