OSDN Git Service

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