OSDN Git Service

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