OSDN Git Service

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