OSDN Git Service

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