OSDN Git Service

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