OSDN Git Service

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