OSDN Git Service

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