OSDN Git Service

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