OSDN Git Service

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