OSDN Git Service

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