OSDN Git Service

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