OSDN Git Service

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