OSDN Git Service

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