OSDN Git Service

Add Doxygen comments to status view functions in xtra1.c.
[hengband/hengband.git] / src / xtra1.c
1 /*!
2  * @file xtra1.c
3  * @brief 雑多なその他の処理1 / misc code
4  * @date 2014/08/17
5  * @author
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n
7  * This software may be copied and distributed for educational, research, and\n
8  * not for profit purposes provided that this copyright and statement are\n
9  * included in all such copies.\n
10  * 2014 Deskull rearranged comment for Doxygen.
11  */
12
13 #include "angband.h"
14
15 /*!
16  * @brief 現在の修正後能力値を3~17及び18/xxx形式に変換する / Converts stat num into a six-char (right justified) string
17  * @param val 能力値
18  * @param out_val 出力先文字列ポインタ
19  * @return なし
20  */
21 void cnv_stat(int val, char *out_val)
22 {
23         /* Above 18 */
24         if (val > 18)
25         {
26                 int bonus = (val - 18);
27
28                 if (bonus >= 220)
29                 {
30                         sprintf(out_val, "18/%3s", "***");
31                 }
32                 else if (bonus >= 100)
33                 {
34                         sprintf(out_val, "18/%03d", bonus);
35                 }
36                 else
37                 {
38                         sprintf(out_val, " 18/%02d", bonus);
39                 }
40         }
41
42         /* From 3 to 18 */
43         else
44         {
45                 sprintf(out_val, "    %2d", val);
46         }
47 }
48
49 /*!
50  * @brief 能力値現在値から3~17及び18/xxx様式に基づく加減算を行う。
51  * Modify a stat value by a "modifier", return new value
52  * @param value 現在値
53  * @param amount 加減算値
54  * @return 加減算後の値
55  * @details
56  * <pre>
57  * Stats go up: 3,4,...,17,18,18/10,18/20,...,18/220
58  * Or even: 18/13, 18/23, 18/33, ..., 18/220
59  * Stats go down: 18/220, 18/210,..., 18/10, 18, 17, ..., 3
60  * Or even: 18/13, 18/03, 18, 17, ..., 3
61  * </pre>
62  */
63 s16b modify_stat_value(int value, int amount)
64 {
65         int    i;
66
67         /* Reward */
68         if (amount > 0)
69         {
70                 /* Apply each point */
71                 for (i = 0; i < amount; i++)
72                 {
73                         /* One point at a time */
74                         if (value < 18) value++;
75
76                         /* Ten "points" at a time */
77                         else value += 10;
78                 }
79         }
80
81         /* Penalty */
82         else if (amount < 0)
83         {
84                 /* Apply each point */
85                 for (i = 0; i < (0 - amount); i++)
86                 {
87                         /* Ten points at a time */
88                         if (value >= 18+10) value -= 10;
89
90                         /* Hack -- prevent weirdness */
91                         else if (value > 18) value = 18;
92
93                         /* One point at a time */
94                         else if (value > 3) value--;
95                 }
96         }
97
98         /* Return new value */
99         return (value);
100 }
101
102
103
104 /*!
105  * @brief 画面左の能力値表示を行うために指定位置から13キャラ分を空白消去後指定のメッセージを明るい青で描画する /
106  * Print character info at given row, column in a 13 char field
107  * @param info 表示文字列
108  * @param row 描画列
109  * @param col 描画行
110  * @return なし
111  */
112 static void prt_field(cptr info, int row, int col)
113 {
114         /* Dump 13 spaces to clear */
115         c_put_str(TERM_WHITE, "             ", row, col);
116
117         /* Dump the info itself */
118         c_put_str(TERM_L_BLUE, info, row, col);
119 }
120
121
122 /*!
123  * @brief ゲーム時間が日中かどうかを返す /
124  * Whether daytime or not
125  * @param 日中ならばTRUE、夜ならばFALSE
126  */
127 bool is_daytime(void)
128 {
129         s32b len = TURNS_PER_TICK * TOWN_DAWN;
130         if ((turn % len) < (len / 2))
131                 return TRUE;
132         else
133                 return FALSE;
134 }
135
136 /*!
137  * @brief 現在の日数、時刻を返す /
138  * Extract day, hour, min
139  * @param day 日数を返すための参照ポインタ
140  * @param hour 時数を返すための参照ポインタ
141  * @param min 分数を返すための参照ポインタ
142  */
143 void extract_day_hour_min(int *day, int *hour, int *min)
144 {
145         const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
146         s32b turn_in_today = (turn + A_DAY / 4) % A_DAY;
147
148         switch (p_ptr->start_race)
149         {
150         case RACE_VAMPIRE:
151         case RACE_SKELETON:
152         case RACE_ZOMBIE:
153         case RACE_SPECTRE:
154                 *day = (turn - A_DAY * 3 / 4) / A_DAY + 1;
155                 break;
156         default:
157                 *day = (turn + A_DAY / 4) / A_DAY + 1;
158                 break;
159         }
160         *hour = (24 * turn_in_today / A_DAY) % 24;
161         *min = (1440 * turn_in_today / A_DAY) % 60;
162 }
163
164 /*!
165  * @brief ゲーム時刻を表示する /
166  * Print time
167  * @return なし
168  */
169 void prt_time(void)
170 {
171         int day, hour, min;
172
173         /* Dump 13 spaces to clear */
174         c_put_str(TERM_WHITE, "             ", ROW_DAY, COL_DAY);
175
176         extract_day_hour_min(&day, &hour, &min);
177
178         /* Dump the info itself */
179         if (day < 1000) c_put_str(TERM_WHITE, format(_("%2d日目", "Day%3d"), day), ROW_DAY, COL_DAY);
180         else c_put_str(TERM_WHITE, _("***日目", "Day***"), ROW_DAY, COL_DAY);
181
182         c_put_str(TERM_WHITE, format("%2d:%02d", hour, min), ROW_DAY, COL_DAY+7);
183 }
184
185 /*!
186  * @brief 現在のマップ名を返す /
187  * @return マップ名の文字列参照ポインタ
188  */
189 cptr map_name(void)
190 {
191         if (p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)
192             && (quest[p_ptr->inside_quest].flags & QUEST_FLAG_PRESET))
193                 return _("クエスト", "Quest");
194         else if (p_ptr->wild_mode)
195                 return _("地上", "Surface");
196         else if (p_ptr->inside_arena)
197                 return _("アリーナ", "Arena");
198         else if (p_ptr->inside_battle)
199                 return _("闘技場", "Monster Arena");
200         else if (!dun_level && p_ptr->town_num)
201                 return town[p_ptr->town_num].name;
202         else
203                 return d_name+d_info[dungeon_type].name;
204 }
205
206 /*!
207  * @brief 現在のマップ名を描画する / Print dungeon
208  * @return なし
209  */
210 static void prt_dungeon(void)
211 {
212         cptr dungeon_name;
213         int col;
214
215         /* Dump 13 spaces to clear */
216         c_put_str(TERM_WHITE, "             ", ROW_DUNGEON, COL_DUNGEON);
217
218         dungeon_name = map_name();
219
220         col = COL_DUNGEON + 6 - strlen(dungeon_name)/2;
221         if (col < 0) col = 0;
222
223         /* Dump the info itself */
224         c_put_str(TERM_L_UMBER, format("%s",dungeon_name),
225                   ROW_DUNGEON, col);
226 }
227
228
229 /*
230  * Print character stat in given row, column
231  */
232 static void prt_stat(int stat)
233 {
234         char tmp[32];
235
236         /* Display "injured" stat */
237         if (p_ptr->stat_cur[stat] < p_ptr->stat_max[stat])
238         {
239                 put_str(stat_names_reduced[stat], ROW_STAT + stat, 0);
240                 cnv_stat(p_ptr->stat_use[stat], tmp);
241                 c_put_str(TERM_YELLOW, tmp, ROW_STAT + stat, COL_STAT + 6);
242         }
243
244         /* Display "healthy" stat */
245         else
246         {
247                 put_str(stat_names[stat], ROW_STAT + stat, 0);
248                 cnv_stat(p_ptr->stat_use[stat], tmp);
249                 c_put_str(TERM_L_GREEN, tmp, ROW_STAT + stat, COL_STAT + 6);
250         }
251
252         /* Indicate natural maximum */
253         if (p_ptr->stat_max[stat] == p_ptr->stat_max_max[stat])
254         {
255 #ifdef JP
256                 /* 日本語にかぶらないように表示位置を変更 */
257                 put_str("!", ROW_STAT + stat, 5);
258 #else
259                 put_str("!", ROW_STAT + stat, 3);
260 #endif
261
262         }
263 }
264
265
266 /*
267  *  Data structure for status bar
268  */
269 #define BAR_TSUYOSHI 0
270 #define BAR_HALLUCINATION 1
271 #define BAR_BLINDNESS 2
272 #define BAR_PARALYZE 3
273 #define BAR_CONFUSE 4
274 #define BAR_POISONED 5
275 #define BAR_AFRAID 6
276 #define BAR_LEVITATE 7
277 #define BAR_REFLECTION 8
278 #define BAR_PASSWALL 9
279 #define BAR_WRAITH 10
280 #define BAR_PROTEVIL 11
281 #define BAR_KAWARIMI 12
282 #define BAR_MAGICDEFENSE 13
283 #define BAR_EXPAND 14
284 #define BAR_STONESKIN 15
285 #define BAR_MULTISHADOW 16
286 #define BAR_REGMAGIC 17
287 #define BAR_ULTIMATE 18
288 #define BAR_INVULN 19
289 #define BAR_IMMACID 20
290 #define BAR_RESACID 21
291 #define BAR_IMMELEC 22
292 #define BAR_RESELEC 23
293 #define BAR_IMMFIRE 24
294 #define BAR_RESFIRE 25
295 #define BAR_IMMCOLD 26
296 #define BAR_RESCOLD 27
297 #define BAR_RESPOIS 28
298 #define BAR_RESNETH 29
299 #define BAR_RESTIME 30
300 #define BAR_DUSTROBE 31
301 #define BAR_SHFIRE 32
302 #define BAR_TOUKI 33
303 #define BAR_SHHOLY 34
304 #define BAR_EYEEYE 35
305 #define BAR_BLESSED 36
306 #define BAR_HEROISM 37
307 #define BAR_BERSERK 38
308 #define BAR_ATTKFIRE 39
309 #define BAR_ATTKCOLD 40
310 #define BAR_ATTKELEC 41
311 #define BAR_ATTKACID 42
312 #define BAR_ATTKPOIS 43
313 #define BAR_ATTKCONF 44
314 #define BAR_SENSEUNSEEN 45
315 #define BAR_TELEPATHY 46
316 #define BAR_REGENERATION 47
317 #define BAR_INFRAVISION 48
318 #define BAR_STEALTH 49
319 #define BAR_SUPERSTEALTH 50
320 #define BAR_RECALL 51
321 #define BAR_ALTER 52
322 #define BAR_SHCOLD 53
323 #define BAR_SHELEC 54
324 #define BAR_SHSHADOW 55
325 #define BAR_MIGHT 56
326 #define BAR_BUILD 57
327 #define BAR_ANTIMULTI 58
328 #define BAR_ANTITELE 59
329 #define BAR_ANTIMAGIC 60
330 #define BAR_PATIENCE 61
331 #define BAR_REVENGE 62
332 #define BAR_RUNESWORD 63
333 #define BAR_VAMPILIC 64
334 #define BAR_CURE 65
335 #define BAR_ESP_EVIL 66
336
337 static struct {
338         byte attr;
339         cptr sstr;
340         cptr lstr;
341 } bar[]
342 #ifdef JP
343 = {
344         {TERM_YELLOW, "つ", "つよし"},
345         {TERM_VIOLET, "幻", "幻覚"},
346         {TERM_L_DARK, "盲", "盲目"},
347         {TERM_RED, "痺", "麻痺"},
348         {TERM_VIOLET, "乱", "混乱"},
349         {TERM_GREEN, "毒", "毒"},
350         {TERM_BLUE, "恐", "恐怖"},
351         {TERM_L_BLUE, "浮", "浮遊"},
352         {TERM_SLATE, "反", "反射"},
353         {TERM_SLATE, "壁", "壁抜け"},
354         {TERM_L_DARK, "幽", "幽体"},
355         {TERM_SLATE, "邪", "防邪"},
356         {TERM_VIOLET, "変", "変わり身"},
357         {TERM_YELLOW, "魔", "魔法鎧"},
358         {TERM_L_UMBER, "伸", "伸び"},
359         {TERM_WHITE, "石", "石肌"},
360         {TERM_L_BLUE, "分", "分身"},
361         {TERM_SLATE, "防", "魔法防御"},
362         {TERM_YELLOW, "究", "究極"},
363         {TERM_YELLOW, "無", "無敵"},
364         {TERM_L_GREEN, "酸", "酸免疫"},
365         {TERM_GREEN, "酸", "耐酸"},
366         {TERM_L_BLUE, "電", "電免疫"},
367         {TERM_BLUE, "電", "耐電"},
368         {TERM_L_RED, "火", "火免疫"},
369         {TERM_RED, "火", "耐火"},
370         {TERM_WHITE, "冷", "冷免疫"},
371         {TERM_SLATE, "冷", "耐冷"},
372         {TERM_GREEN, "毒", "耐毒"},
373         {TERM_L_DARK, "獄", "耐地獄"},
374         {TERM_L_BLUE, "時", "耐時間"},
375         {TERM_L_DARK, "鏡", "鏡オーラ"},
376         {TERM_L_RED, "オ", "火オーラ"},
377         {TERM_WHITE, "闘", "闘気"},
378         {TERM_WHITE, "聖", "聖オーラ"},
379         {TERM_VIOLET, "目", "目には目"},
380         {TERM_WHITE, "祝", "祝福"},
381         {TERM_WHITE, "勇", "勇"},
382         {TERM_RED, "狂", "狂乱"},
383         {TERM_L_RED, "火", "魔剣火"},
384         {TERM_WHITE, "冷", "魔剣冷"},
385         {TERM_L_BLUE, "電", "魔剣電"},
386         {TERM_SLATE, "酸", "魔剣酸"},
387         {TERM_L_GREEN, "毒", "魔剣毒"},
388         {TERM_RED, "乱", "混乱打撃"},
389         {TERM_L_BLUE, "視", "透明視"},
390         {TERM_ORANGE, "テ", "テレパシ"},
391         {TERM_L_BLUE, "回", "回復"},
392         {TERM_L_RED, "赤", "赤外"},
393         {TERM_UMBER, "隠", "隠密"},
394         {TERM_YELLOW, "隠", "超隠密"},
395         {TERM_WHITE, "帰", "帰還"},
396         {TERM_WHITE, "現", "現実変容"},
397         /* Hex */
398         {TERM_WHITE, "オ", "氷オーラ"},
399         {TERM_BLUE, "オ", "電オーラ"},
400         {TERM_L_DARK, "オ", "影オーラ"},
401         {TERM_YELLOW, "腕", "腕力強化"},
402         {TERM_RED, "肉", "肉体強化"},
403         {TERM_L_DARK, "殖", "反増殖"},
404         {TERM_ORANGE, "テ", "反テレポ"},
405         {TERM_RED, "魔", "反魔法"},
406         {TERM_SLATE, "我", "我慢"},
407         {TERM_SLATE, "宣", "宣告"},
408         {TERM_L_DARK, "剣", "魔剣化"},
409         {TERM_RED, "吸", "吸血打撃"},
410         {TERM_WHITE, "回", "回復"},
411         {TERM_L_DARK, "感", "邪悪感知"},
412         {0, NULL, NULL}
413 };
414 #else
415 = {
416         {TERM_YELLOW, "Ts", "Tsuyoshi"},
417         {TERM_VIOLET, "Ha", "Halluc"},
418         {TERM_L_DARK, "Bl", "Blind"},
419         {TERM_RED, "Pa", "Paralyzed"},
420         {TERM_VIOLET, "Cf", "Confused"},
421         {TERM_GREEN, "Po", "Poisoned"},
422         {TERM_BLUE, "Af", "Afraid"},
423         {TERM_L_BLUE, "Lv", "Levit"},
424         {TERM_SLATE, "Rf", "Reflect"},
425         {TERM_SLATE, "Pw", "PassWall"},
426         {TERM_L_DARK, "Wr", "Wraith"},
427         {TERM_SLATE, "Ev", "PrtEvl"},
428         {TERM_VIOLET, "Kw", "Kawarimi"},
429         {TERM_YELLOW, "Md", "MgcArm"},
430         {TERM_L_UMBER, "Eh", "Expand"},
431         {TERM_WHITE, "Ss", "StnSkn"},
432         {TERM_L_BLUE, "Ms", "MltShdw"},
433         {TERM_SLATE, "Rm", "ResMag"},
434         {TERM_YELLOW, "Ul", "Ultima"},
435         {TERM_YELLOW, "Iv", "Invuln"},
436         {TERM_L_GREEN, "IAc", "ImmAcid"},
437         {TERM_GREEN, "Ac", "Acid"},
438         {TERM_L_BLUE, "IEl", "ImmElec"},
439         {TERM_BLUE, "El", "Elec"},
440         {TERM_L_RED, "IFi", "ImmFire"},
441         {TERM_RED, "Fi", "Fire"},
442         {TERM_WHITE, "ICo", "ImmCold"},
443         {TERM_SLATE, "Co", "Cold"},
444         {TERM_GREEN, "Po", "Pois"},
445         {TERM_L_DARK, "Nt", "Nthr"},
446         {TERM_L_BLUE, "Ti", "Time"},
447         {TERM_L_DARK, "Mr", "Mirr"},
448         {TERM_L_RED, "SFi", "SFire"},
449         {TERM_WHITE, "Fo", "Force"},
450         {TERM_WHITE, "Ho", "Holy"},
451         {TERM_VIOLET, "Ee", "EyeEye"},
452         {TERM_WHITE, "Bs", "Bless"},
453         {TERM_WHITE, "He", "Hero"},
454         {TERM_RED, "Br", "Berserk"},
455         {TERM_L_RED, "BFi", "BFire"},
456         {TERM_WHITE, "BCo", "BCold"},
457         {TERM_L_BLUE, "BEl", "BElec"},
458         {TERM_SLATE, "BAc", "BAcid"},
459         {TERM_L_GREEN, "BPo", "BPois"},
460         {TERM_RED, "TCf", "TchCnf"},
461         {TERM_L_BLUE, "Se", "SInv"},
462         {TERM_ORANGE, "Te", "Telepa"},
463         {TERM_L_BLUE, "Rg", "Regen"},
464         {TERM_L_RED, "If", "Infr"},
465         {TERM_UMBER, "Sl", "Stealth"},
466         {TERM_YELLOW, "Stlt", "Stealth"},
467         {TERM_WHITE, "Rc", "Recall"},
468         {TERM_WHITE, "Al", "Alter"},
469         /* Hex */
470         {TERM_WHITE, "SCo", "SCold"},
471         {TERM_BLUE, "SEl", "SElec"},
472         {TERM_L_DARK, "SSh", "SShadow"},
473         {TERM_YELLOW, "EMi", "ExMight"},
474         {TERM_RED, "Bu", "BuildUp"},
475         {TERM_L_DARK, "AMl", "AntiMulti"},
476         {TERM_ORANGE, "AT", "AntiTele"},
477         {TERM_RED, "AM", "AntiMagic"},
478         {TERM_SLATE, "Pa", "Patience"},
479         {TERM_SLATE, "Rv", "Revenge"},
480         {TERM_L_DARK, "Rs", "RuneSword"},
481         {TERM_RED, "Vm", "Vampiric"},
482         {TERM_WHITE, "Cu", "Cure"},
483         {TERM_L_DARK, "ET", "EvilTele"},
484         {0, NULL, NULL}
485 };
486 #endif
487
488 #define ADD_FLG(FLG) (bar_flags[FLG / 32] |= (1L << (FLG % 32)))
489 #define IS_FLG(FLG) (bar_flags[FLG / 32] & (1L << (FLG % 32)))
490
491
492 /*
493  *  Show status bar
494  */
495 static void prt_status(void)
496 {
497         u32b bar_flags[3];
498         int wid, hgt, row_statbar, max_col_statbar;
499         int i, col = 0, num = 0;
500         int space = 2;
501
502         Term_get_size(&wid, &hgt);
503         row_statbar = hgt + ROW_STATBAR;
504         max_col_statbar = wid + MAX_COL_STATBAR;
505
506         Term_erase(0, row_statbar, max_col_statbar);
507
508         bar_flags[0] = bar_flags[1] = bar_flags[2] = 0L;
509
510         /* Tsuyoshi  */
511         if (p_ptr->tsuyoshi) ADD_FLG(BAR_TSUYOSHI);
512
513         /* Hallucinating */
514         if (p_ptr->image) ADD_FLG(BAR_HALLUCINATION);
515
516         /* Blindness */
517         if (p_ptr->blind) ADD_FLG(BAR_BLINDNESS);
518
519         /* Paralysis */
520         if (p_ptr->paralyzed) ADD_FLG(BAR_PARALYZE);
521
522         /* Confusion */
523         if (p_ptr->confused) ADD_FLG(BAR_CONFUSE);
524
525         /* Posioned */
526         if (p_ptr->poisoned) ADD_FLG(BAR_POISONED);
527
528         /* Times see-invisible */
529         if (p_ptr->tim_invis) ADD_FLG(BAR_SENSEUNSEEN);
530
531         /* Timed esp */
532         if (IS_TIM_ESP()) ADD_FLG(BAR_TELEPATHY);
533
534         /* Timed regenerate */
535         if (p_ptr->tim_regen) ADD_FLG(BAR_REGENERATION);
536
537         /* Timed infra-vision */
538         if (p_ptr->tim_infra) ADD_FLG(BAR_INFRAVISION);
539
540         /* Protection from evil */
541         if (p_ptr->protevil) ADD_FLG(BAR_PROTEVIL);
542
543         /* Invulnerability */
544         if (IS_INVULN()) ADD_FLG(BAR_INVULN);
545
546         /* Wraith form */
547         if (p_ptr->wraith_form) ADD_FLG(BAR_WRAITH);
548
549         /* Kabenuke */
550         if (p_ptr->kabenuke) ADD_FLG(BAR_PASSWALL);
551
552         if (p_ptr->tim_reflect) ADD_FLG(BAR_REFLECTION);
553
554         /* Heroism */
555         if (IS_HERO()) ADD_FLG(BAR_HEROISM);
556
557         /* Super Heroism / berserk */
558         if (p_ptr->shero) ADD_FLG(BAR_BERSERK);
559
560         /* Blessed */
561         if (IS_BLESSED()) ADD_FLG(BAR_BLESSED);
562
563         /* Shield */
564         if (p_ptr->magicdef) ADD_FLG(BAR_MAGICDEFENSE);
565
566         if (p_ptr->tsubureru) ADD_FLG(BAR_EXPAND);
567
568         if (p_ptr->shield) ADD_FLG(BAR_STONESKIN);
569         
570         if (p_ptr->special_defense & NINJA_KAWARIMI) ADD_FLG(BAR_KAWARIMI);
571
572         /* Oppose Acid */
573         if (p_ptr->special_defense & DEFENSE_ACID) ADD_FLG(BAR_IMMACID);
574         if (IS_OPPOSE_ACID()) ADD_FLG(BAR_RESACID);
575
576         /* Oppose Lightning */
577         if (p_ptr->special_defense & DEFENSE_ELEC) ADD_FLG(BAR_IMMELEC);
578         if (IS_OPPOSE_ELEC()) ADD_FLG(BAR_RESELEC);
579
580         /* Oppose Fire */
581         if (p_ptr->special_defense & DEFENSE_FIRE) ADD_FLG(BAR_IMMFIRE);
582         if (IS_OPPOSE_FIRE()) ADD_FLG(BAR_RESFIRE);
583
584         /* Oppose Cold */
585         if (p_ptr->special_defense & DEFENSE_COLD) ADD_FLG(BAR_IMMCOLD);
586         if (IS_OPPOSE_COLD()) ADD_FLG(BAR_RESCOLD);
587
588         /* Oppose Poison */
589         if (IS_OPPOSE_POIS()) ADD_FLG(BAR_RESPOIS);
590
591         /* Word of Recall */
592         if (p_ptr->word_recall) ADD_FLG(BAR_RECALL);
593
594         /* Alter realiry */
595         if (p_ptr->alter_reality) ADD_FLG(BAR_ALTER);
596
597         /* Afraid */
598         if (p_ptr->afraid) ADD_FLG(BAR_AFRAID);
599
600         /* Resist time */
601         if (p_ptr->tim_res_time) ADD_FLG(BAR_RESTIME);
602
603         if (p_ptr->multishadow) ADD_FLG(BAR_MULTISHADOW);
604
605         /* Confusing Hands */
606         if (p_ptr->special_attack & ATTACK_CONFUSE) ADD_FLG(BAR_ATTKCONF);
607
608         if (p_ptr->resist_magic) ADD_FLG(BAR_REGMAGIC);
609
610         /* Ultimate-resistance */
611         if (p_ptr->ult_res) ADD_FLG(BAR_ULTIMATE);
612
613         /* tim levitation */
614         if (p_ptr->tim_levitation) ADD_FLG(BAR_LEVITATE);
615
616         if (p_ptr->tim_res_nether) ADD_FLG(BAR_RESNETH);
617
618         if (p_ptr->dustrobe) ADD_FLG(BAR_DUSTROBE);
619
620         /* Mahouken */
621         if (p_ptr->special_attack & ATTACK_FIRE) ADD_FLG(BAR_ATTKFIRE);
622         if (p_ptr->special_attack & ATTACK_COLD) ADD_FLG(BAR_ATTKCOLD);
623         if (p_ptr->special_attack & ATTACK_ELEC) ADD_FLG(BAR_ATTKELEC);
624         if (p_ptr->special_attack & ATTACK_ACID) ADD_FLG(BAR_ATTKACID);
625         if (p_ptr->special_attack & ATTACK_POIS) ADD_FLG(BAR_ATTKPOIS);
626         if (p_ptr->special_defense & NINJA_S_STEALTH) ADD_FLG(BAR_SUPERSTEALTH);
627
628         if (p_ptr->tim_sh_fire) ADD_FLG(BAR_SHFIRE);
629
630         /* tim stealth */
631         if (IS_TIM_STEALTH()) ADD_FLG(BAR_STEALTH);
632
633         if (p_ptr->tim_sh_touki) ADD_FLG(BAR_TOUKI);
634
635         /* Holy aura */
636         if (p_ptr->tim_sh_holy) ADD_FLG(BAR_SHHOLY);
637
638         /* An Eye for an Eye */
639         if (p_ptr->tim_eyeeye) ADD_FLG(BAR_EYEEYE);
640
641         /* Hex spells */
642         if (p_ptr->realm1 == REALM_HEX)
643         {
644                 if (hex_spelling(HEX_BLESS)) ADD_FLG(BAR_BLESSED);
645                 if (hex_spelling(HEX_DEMON_AURA)) { ADD_FLG(BAR_SHFIRE); ADD_FLG(BAR_REGENERATION); }
646                 if (hex_spelling(HEX_XTRA_MIGHT)) ADD_FLG(BAR_MIGHT);
647                 if (hex_spelling(HEX_DETECT_EVIL)) ADD_FLG(BAR_ESP_EVIL);
648                 if (hex_spelling(HEX_ICE_ARMOR)) ADD_FLG(BAR_SHCOLD);
649                 if (hex_spelling(HEX_RUNESWORD)) ADD_FLG(BAR_RUNESWORD);
650                 if (hex_spelling(HEX_BUILDING)) ADD_FLG(BAR_BUILD);
651                 if (hex_spelling(HEX_ANTI_TELE)) ADD_FLG(BAR_ANTITELE);
652                 if (hex_spelling(HEX_SHOCK_CLOAK)) ADD_FLG(BAR_SHELEC);
653                 if (hex_spelling(HEX_SHADOW_CLOAK)) ADD_FLG(BAR_SHSHADOW);
654                 if (hex_spelling(HEX_CONFUSION)) ADD_FLG(BAR_ATTKCONF);
655                 if (hex_spelling(HEX_EYE_FOR_EYE)) ADD_FLG(BAR_EYEEYE);
656                 if (hex_spelling(HEX_ANTI_MULTI)) ADD_FLG(BAR_ANTIMULTI);
657                 if (hex_spelling(HEX_VAMP_BLADE)) ADD_FLG(BAR_VAMPILIC);
658                 if (hex_spelling(HEX_ANTI_MAGIC)) ADD_FLG(BAR_ANTIMAGIC);
659                 if (hex_spelling(HEX_CURE_LIGHT) ||
660                         hex_spelling(HEX_CURE_SERIOUS) ||
661                         hex_spelling(HEX_CURE_CRITICAL)) ADD_FLG(BAR_CURE);
662
663                 if (p_ptr->magic_num2[2])
664                 {
665                         if (p_ptr->magic_num2[1] == 1) ADD_FLG(BAR_PATIENCE);
666                         if (p_ptr->magic_num2[1] == 2) ADD_FLG(BAR_REVENGE);
667                 }
668         }
669
670         /* Calcurate length */
671         for (i = 0; bar[i].sstr; i++)
672         {
673                 if (IS_FLG(i))
674                 {
675                         col += strlen(bar[i].lstr) + 1;
676                         num++;
677                 }
678         }
679
680         /* If there are not excess spaces for long strings, use short one */
681         if (col - 1 > max_col_statbar)
682         {
683                 space = 0;
684                 col = 0;
685
686                 for (i = 0; bar[i].sstr; i++)
687                 {
688                         if (IS_FLG(i))
689                         {
690                                 col += strlen(bar[i].sstr);
691                         }
692                 }
693
694                 /* If there are excess spaces for short string, use more */
695                 if (col - 1 <= max_col_statbar - (num-1))
696                 {
697                         space = 1;
698                         col += num - 1;
699                 }
700         }
701
702
703         /* Centering display column */
704         col = (max_col_statbar - col) / 2;
705
706         /* Display status bar */
707         for (i = 0; bar[i].sstr; i++)
708         {
709                 if (IS_FLG(i))
710                 {
711                         cptr str;
712                         if (space == 2) str = bar[i].lstr;
713                         else str = bar[i].sstr;
714
715                         c_put_str(bar[i].attr, str, row_statbar, col);
716                         col += strlen(str);
717                         if (space > 0) col++;
718                         if (col > max_col_statbar) break;
719                 }
720         }
721 }
722
723
724
725 /*
726  * Prints "title", including "wizard" or "winner" as needed.
727  */
728 static void prt_title(void)
729 {
730         cptr p = "";
731         char str[14];
732
733         /* Wizard */
734         if (p_ptr->wizard)
735         {
736 #ifdef JP
737                 /* 英日切り替え機能 称号 */
738                 p = "[ウィザード]";
739 #else
740                 p = "[=-WIZARD-=]";
741 #endif
742
743         }
744
745         /* Winner */
746         else if (p_ptr->total_winner || (p_ptr->lev > PY_MAX_LEVEL))
747         {
748                 if (p_ptr->arena_number > MAX_ARENA_MONS + 2)
749                 {
750 #ifdef JP
751                         /* 英日切り替え機能 称号 */
752                         p = "*真・勝利者*";
753 #else
754                         p = "*TRUEWINNER*";
755 #endif
756                 }
757                 else
758                 {
759 #ifdef JP
760                         /* 英日切り替え機能 称号 */
761                         p = "***勝利者***";
762 #else
763                         p = "***WINNER***";
764 #endif
765                 }
766         }
767
768         /* Normal */
769         else
770         {
771                 my_strcpy(str, player_title[p_ptr->pclass][(p_ptr->lev - 1) / 5], sizeof(str));
772                 p = str;
773         }
774
775         prt_field(p, ROW_TITLE, COL_TITLE);
776 }
777
778
779 /*
780  * Prints level
781  */
782 static void prt_level(void)
783 {
784         char tmp[32];
785
786         sprintf(tmp, _("%5d", "%6d"), p_ptr->lev);
787
788         if (p_ptr->lev >= p_ptr->max_plv)
789         {
790 #ifdef JP
791                 put_str("レベル ", ROW_LEVEL, 0);
792                 c_put_str(TERM_L_GREEN, tmp, ROW_LEVEL, COL_LEVEL + 7);
793 #else
794                 put_str("LEVEL ", ROW_LEVEL, 0);
795                 c_put_str(TERM_L_GREEN, tmp, ROW_LEVEL, COL_LEVEL + 6);
796 #endif
797
798         }
799         else
800         {
801 #ifdef JP
802                 put_str("xレベル", ROW_LEVEL, 0);
803                 c_put_str(TERM_YELLOW, tmp, ROW_LEVEL, COL_LEVEL + 7);
804 #else
805                 put_str("Level ", ROW_LEVEL, 0);
806                 c_put_str(TERM_YELLOW, tmp, ROW_LEVEL, COL_LEVEL + 6);
807 #endif
808
809         }
810 }
811
812
813 /*
814  * Display the experience
815  */
816 static void prt_exp(void)
817 {
818         char out_val[32];
819
820         if ((!exp_need)||(p_ptr->prace == RACE_ANDROID))
821         {
822                 (void)sprintf(out_val, _("%7ld", "%8ld"), (long)p_ptr->exp);
823         }
824         else
825         {
826                 if (p_ptr->lev >= PY_MAX_LEVEL)
827                 {
828                         (void)sprintf(out_val, "********");
829                 }
830                 else
831                 {
832 #ifdef JP
833                         (void)sprintf(out_val, "%7ld", (long)(player_exp [p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
834 #else      
835                         (void)sprintf(out_val, "%8ld", (long)(player_exp [p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
836 #endif
837                 }
838         }
839
840         if (p_ptr->exp >= p_ptr->max_exp)
841         {
842 #ifdef JP
843                 if (p_ptr->prace == RACE_ANDROID) put_str("強化 ", ROW_EXP, 0);
844                 else put_str("経験 ", ROW_EXP, 0);
845                 c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 5);
846 #else
847                 if (p_ptr->prace == RACE_ANDROID) put_str("Cst ", ROW_EXP, 0);
848                 else put_str("EXP ", ROW_EXP, 0);
849                 c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 4);
850 #endif
851
852         }
853         else
854         {
855 #ifdef JP
856                 put_str("x経験", ROW_EXP, 0);
857                 c_put_str(TERM_YELLOW, out_val, ROW_EXP, COL_EXP + 5);
858 #else
859                 put_str("Exp ", ROW_EXP, 0);
860                 c_put_str(TERM_YELLOW, out_val, ROW_EXP, COL_EXP + 4);
861 #endif
862
863         }
864 }
865
866 /*
867  * Prints current gold
868  */
869 static void prt_gold(void)
870 {
871         char tmp[32];
872         put_str(_("$ ", "AU "), ROW_GOLD, COL_GOLD);
873         sprintf(tmp, "%9ld", (long)p_ptr->au);
874         c_put_str(TERM_L_GREEN, tmp, ROW_GOLD, COL_GOLD + 3);
875 }
876
877
878
879 /*
880  * Prints current AC
881  */
882 static void prt_ac(void)
883 {
884         char tmp[32];
885
886 #ifdef JP
887 /* AC の表示方式を変更している */
888         put_str(" AC(     )", ROW_AC, COL_AC);
889         sprintf(tmp, "%5d", p_ptr->dis_ac + p_ptr->dis_to_a);
890         c_put_str(TERM_L_GREEN, tmp, ROW_AC, COL_AC + 6);
891 #else
892         put_str("Cur AC ", ROW_AC, COL_AC);
893         sprintf(tmp, "%5d", p_ptr->dis_ac + p_ptr->dis_to_a);
894         c_put_str(TERM_L_GREEN, tmp, ROW_AC, COL_AC + 7);
895 #endif
896
897 }
898
899
900 /*
901  * Prints Cur/Max hit points
902  */
903 static void prt_hp(void)
904 {
905 /* ヒットポイントの表示方法を変更 */
906         char tmp[32];
907   
908         byte color;
909   
910         /* タイトル */
911 /*      put_str(" HP・MP", ROW_HPMP, COL_HPMP); */
912
913         put_str("HP", ROW_CURHP, COL_CURHP);
914
915         /* 現在のヒットポイント */
916         sprintf(tmp, "%4ld", (long int)p_ptr->chp);
917
918         if (p_ptr->chp >= p_ptr->mhp)
919         {
920                 color = TERM_L_GREEN;
921         }
922         else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
923         {
924                 color = TERM_YELLOW;
925         }
926         else
927         {
928                 color = TERM_RED;
929         }
930
931         c_put_str(color, tmp, ROW_CURHP, COL_CURHP+3);
932
933         /* 区切り */
934         put_str( "/", ROW_CURHP, COL_CURHP + 7 );
935
936         /* 最大ヒットポイント */
937         sprintf(tmp, "%4ld", (long int)p_ptr->mhp);
938         color = TERM_L_GREEN;
939
940         c_put_str(color, tmp, ROW_CURHP, COL_CURHP + 8 );
941 }
942
943
944 /*
945  * Prints players max/cur spell points
946  */
947 static void prt_sp(void)
948 {
949 /* マジックポイントの表示方法を変更している */
950         char tmp[32];
951         byte color;
952
953
954         /* Do not show mana unless it matters */
955         if (!mp_ptr->spell_book) return;
956
957         /* タイトル */
958 /*      put_str(" MP / 最大", ROW_MAXSP, COL_MAXSP); */
959         put_str(_("MP", "SP"), ROW_CURSP, COL_CURSP);
960
961         /* 現在のマジックポイント */
962         sprintf(tmp, "%4ld", (long int)p_ptr->csp);
963
964         if (p_ptr->csp >= p_ptr->msp)
965         {
966                 color = TERM_L_GREEN;
967         }
968         else if (p_ptr->csp > (p_ptr->msp * mana_warn) / 10)
969         {
970                 color = TERM_YELLOW;
971         }
972         else
973         {
974                 color = TERM_RED;
975         }
976
977         c_put_str(color, tmp, ROW_CURSP, COL_CURSP+3);
978
979         /* 区切り */
980         put_str( "/", ROW_CURSP, COL_CURSP + 7 );
981
982         /* 最大マジックポイント */
983         sprintf(tmp, "%4ld", (long int)p_ptr->msp);
984         color = TERM_L_GREEN;
985
986         c_put_str(color, tmp, ROW_CURSP, COL_CURSP + 8);
987 }
988
989
990 /*
991  * Prints depth in stat area
992  */
993 static void prt_depth(void)
994 {
995         char depths[32];
996         int wid, hgt, row_depth, col_depth;
997         byte attr = TERM_WHITE;
998
999         Term_get_size(&wid, &hgt);
1000         col_depth = wid + COL_DEPTH;
1001         row_depth = hgt + ROW_DEPTH;
1002
1003         if (!dun_level)
1004         {
1005                 strcpy(depths, _("地上", "Surf."));
1006         }
1007         else if (p_ptr->inside_quest && !dungeon_type)
1008         {
1009                 strcpy(depths, _("地上", "Quest"));
1010         }
1011         else
1012         {
1013                 if (depth_in_feet) (void)sprintf(depths, _("%d ft", "%d ft"), dun_level * 50);
1014                 else (void)sprintf(depths, _("%d 階", "Lev %d"), dun_level);
1015
1016                 /* Get color of level based on feeling  -JSV- */
1017                 switch (p_ptr->feeling)
1018                 {
1019                 case  0: attr = TERM_SLATE;   break; /* Unknown */
1020                 case  1: attr = TERM_L_BLUE;  break; /* Special */
1021                 case  2: attr = TERM_VIOLET;  break; /* Horrible visions */
1022                 case  3: attr = TERM_RED;     break; /* Very dangerous */
1023                 case  4: attr = TERM_L_RED;   break; /* Very bad feeling */
1024                 case  5: attr = TERM_ORANGE;  break; /* Bad feeling */
1025                 case  6: attr = TERM_YELLOW;  break; /* Nervous */
1026                 case  7: attr = TERM_L_UMBER; break; /* Luck is turning */
1027                 case  8: attr = TERM_L_WHITE; break; /* Don't like */
1028                 case  9: attr = TERM_WHITE;   break; /* Reasonably safe */
1029                 case 10: attr = TERM_WHITE;   break; /* Boring place */
1030                 }
1031         }
1032
1033         /* Right-Adjust the "depth", and clear old values */
1034         c_prt(attr, format("%7s", depths), row_depth, col_depth);
1035 }
1036
1037
1038 /*
1039  * Prints status of hunger
1040  */
1041 static void prt_hunger(void)
1042 {
1043         if(p_ptr->wizard && p_ptr->inside_arena) return;
1044
1045         /* Fainting / Starving */
1046         if (p_ptr->food < PY_FOOD_FAINT)
1047         {
1048                 c_put_str(TERM_RED, _("衰弱  ", "Weak  "), ROW_HUNGRY, COL_HUNGRY);
1049         }
1050
1051         /* Weak */
1052         else if (p_ptr->food < PY_FOOD_WEAK)
1053         {
1054                 c_put_str(TERM_ORANGE, _("衰弱  ", "Weak  "), ROW_HUNGRY, COL_HUNGRY);
1055         }
1056
1057         /* Hungry */
1058         else if (p_ptr->food < PY_FOOD_ALERT)
1059         {
1060                 c_put_str(TERM_YELLOW, _("空腹  ", "Hungry"), ROW_HUNGRY, COL_HUNGRY);
1061         }
1062
1063         /* Normal */
1064         else if (p_ptr->food < PY_FOOD_FULL)
1065         {
1066                 c_put_str(TERM_L_GREEN, "      ", ROW_HUNGRY, COL_HUNGRY);
1067         }
1068
1069         /* Full */
1070         else if (p_ptr->food < PY_FOOD_MAX)
1071         {
1072                 c_put_str(TERM_L_GREEN, _("満腹  ", "Full  "), ROW_HUNGRY, COL_HUNGRY);
1073         }
1074
1075         /* Gorged */
1076         else
1077         {
1078                 c_put_str(TERM_GREEN, _("食過ぎ", "Gorged"), ROW_HUNGRY, COL_HUNGRY);
1079         }
1080 }
1081
1082
1083 /*
1084  * Prints Searching, Resting, Paralysis, or 'count' status
1085  * Display is always exactly 10 characters wide (see below)
1086  *
1087  * This function was a major bottleneck when resting, so a lot of
1088  * the text formatting code was optimized in place below.
1089  */
1090 static void prt_state(void)
1091 {
1092         byte attr = TERM_WHITE;
1093
1094         char text[5];
1095
1096         /* Repeating */
1097         if (command_rep)
1098         {
1099                 if (command_rep > 999)
1100                 {
1101                         (void)sprintf(text, "%2d00", command_rep / 100);
1102                 }
1103                 else
1104                 {
1105                         (void)sprintf(text, "  %2d", command_rep);
1106                 }
1107         }
1108
1109         /* Action */
1110         else
1111         {
1112                 switch(p_ptr->action)
1113                 {
1114                         case ACTION_SEARCH:
1115                         {
1116                                 strcpy(text, _("探索", "Sear"));
1117                                 break;
1118                         }
1119                         case ACTION_REST:
1120                         {
1121                                 int i;
1122
1123                                 /* Start with "Rest" */
1124                                 strcpy(text, _("    ", "    "));
1125
1126                                 /* Extensive (timed) rest */
1127                                 if (resting >= 1000)
1128                                 {
1129                                         i = resting / 100;
1130                                         text[3] = '0';
1131                                         text[2] = '0';
1132                                         text[1] = '0' + (i % 10);
1133                                         text[0] = '0' + (i / 10);
1134                                 }
1135
1136                                 /* Long (timed) rest */
1137                                 else if (resting >= 100)
1138                                 {
1139                                         i = resting;
1140                                         text[3] = '0' + (i % 10);
1141                                         i = i / 10;
1142                                         text[2] = '0' + (i % 10);
1143                                         text[1] = '0' + (i / 10);
1144                                 }
1145
1146                                 /* Medium (timed) rest */
1147                                 else if (resting >= 10)
1148                                 {
1149                                         i = resting;
1150                                         text[3] = '0' + (i % 10);
1151                                         text[2] = '0' + (i / 10);
1152                                 }
1153
1154                                 /* Short (timed) rest */
1155                                 else if (resting > 0)
1156                                 {
1157                                         i = resting;
1158                                         text[3] = '0' + (i);
1159                                 }
1160
1161                                 /* Rest until healed */
1162                                 else if (resting == -1)
1163                                 {
1164                                         text[0] = text[1] = text[2] = text[3] = '*';
1165                                 }
1166
1167                                 /* Rest until done */
1168                                 else if (resting == -2)
1169                                 {
1170                                         text[0] = text[1] = text[2] = text[3] = '&';
1171                                 }
1172                                 break;
1173                         }
1174                         case ACTION_LEARN:
1175                         {
1176                                 strcpy(text, _("学習", "lear"));
1177                                 if (new_mane) attr = TERM_L_RED;
1178                                 break;
1179                         }
1180                         case ACTION_FISH:
1181                         {
1182                                 strcpy(text, _("釣り", "fish"));
1183                                 break;
1184                         }
1185                         case ACTION_KAMAE:
1186                         {
1187                                 int i;
1188                                 for (i = 0; i < MAX_KAMAE; i++)
1189                                         if (p_ptr->special_defense & (KAMAE_GENBU << i)) break;
1190                                 switch (i)
1191                                 {
1192                                         case 0: attr = TERM_GREEN;break;
1193                                         case 1: attr = TERM_WHITE;break;
1194                                         case 2: attr = TERM_L_BLUE;break;
1195                                         case 3: attr = TERM_L_RED;break;
1196                                 }
1197                                 strcpy(text, kamae_shurui[i].desc);
1198                                 break;
1199                         }
1200                         case ACTION_KATA:
1201                         {
1202                                 int i;
1203                                 for (i = 0; i < MAX_KATA; i++)
1204                                         if (p_ptr->special_defense & (KATA_IAI << i)) break;
1205                                 strcpy(text, kata_shurui[i].desc);
1206                                 break;
1207                         }
1208                         case ACTION_SING:
1209                         {
1210                                 strcpy(text, _("歌  ", "Sing"));
1211                                 break;
1212                         }
1213                         case ACTION_HAYAGAKE:
1214                         {
1215                                 strcpy(text, _("速駆", "Fast"));
1216                                 break;
1217                         }
1218                         case ACTION_SPELL:
1219                         {
1220                                 strcpy(text, _("詠唱", "Spel"));
1221                                 break;
1222                         }
1223                         default:
1224                         {
1225                                 strcpy(text, "    ");
1226                                 break;
1227                         }
1228                 }
1229         }
1230
1231         /* Display the info (or blanks) */
1232         c_put_str(attr, format("%5.5s",text), ROW_STATE, COL_STATE);
1233 }
1234
1235
1236 /*
1237  * Prints the speed of a character.                     -CJS-
1238  */
1239 static void prt_speed(void)
1240 {
1241         int i = p_ptr->pspeed;
1242         bool is_fast = IS_FAST();
1243
1244         byte attr = TERM_WHITE;
1245         char buf[32] = "";
1246         int wid, hgt, row_speed, col_speed;
1247
1248         Term_get_size(&wid, &hgt);
1249         col_speed = wid + COL_SPEED;
1250         row_speed = hgt + ROW_SPEED;
1251
1252         /* Hack -- Visually "undo" the Search Mode Slowdown */
1253         if (p_ptr->action == ACTION_SEARCH && !p_ptr->lightspeed) i += 10;
1254
1255         /* Fast */
1256         if (i > 110)
1257         {
1258                 if (p_ptr->riding)
1259                 {
1260                         monster_type *m_ptr = &m_list[p_ptr->riding];
1261                         if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE;
1262                         else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET;
1263                         else attr = TERM_GREEN;
1264                 }
1265                 else if ((is_fast && !p_ptr->slow) || p_ptr->lightspeed) attr = TERM_YELLOW;
1266                 else if (p_ptr->slow && !is_fast) attr = TERM_VIOLET;
1267                 else attr = TERM_L_GREEN;
1268 #ifdef JP
1269                 sprintf(buf, "%s(+%d)", (p_ptr->riding ? "乗馬" : "加速"), (i - 110));
1270 #else
1271                 sprintf(buf, "Fast(+%d)", (i - 110));
1272 #endif
1273
1274         }
1275
1276         /* Slow */
1277         else if (i < 110)
1278         {
1279                 if (p_ptr->riding)
1280                 {
1281                         monster_type *m_ptr = &m_list[p_ptr->riding];
1282                         if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE;
1283                         else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET;
1284                         else attr = TERM_RED;
1285                 }
1286                 else if (is_fast && !p_ptr->slow) attr = TERM_YELLOW;
1287                 else if (p_ptr->slow && !is_fast) attr = TERM_VIOLET;
1288                 else attr = TERM_L_UMBER;
1289 #ifdef JP
1290                 sprintf(buf, "%s(-%d)", (p_ptr->riding ? "乗馬" : "減速"), (110 - i));
1291 #else
1292                 sprintf(buf, "Slow(-%d)", (110 - i));
1293 #endif
1294         }
1295         else if (p_ptr->riding)
1296         {
1297                 attr = TERM_GREEN;
1298                 strcpy(buf, _("乗馬中", "Riding"));
1299         }
1300
1301         /* Display the speed */
1302         c_put_str(attr, format("%-9s", buf), row_speed, col_speed);
1303 }
1304
1305
1306 static void prt_study(void)
1307 {
1308         int wid, hgt, row_study, col_study;
1309
1310         Term_get_size(&wid, &hgt);
1311         col_study = wid + COL_STUDY;
1312         row_study = hgt + ROW_STUDY;
1313
1314         if (p_ptr->new_spells)
1315         {
1316                 put_str(_("学習", "Stud"), row_study, col_study);
1317         }
1318         else
1319         {
1320                 put_str("    ", row_study, col_study);
1321         }
1322 }
1323
1324
1325 static void prt_imitation(void)
1326 {
1327         int wid, hgt, row_study, col_study;
1328
1329         Term_get_size(&wid, &hgt);
1330         col_study = wid + COL_STUDY;
1331         row_study = hgt + ROW_STUDY;
1332
1333         if (p_ptr->pclass == CLASS_IMITATOR)
1334         {
1335                 if (p_ptr->mane_num)
1336                 {
1337                         byte attr;
1338                         if (new_mane) attr = TERM_L_RED;
1339                         else attr = TERM_WHITE;
1340                         c_put_str(attr, _("まね", "Imit"), row_study, col_study);
1341                 }
1342                 else
1343                 {
1344                         put_str("    ", row_study, col_study);
1345                 }
1346         }
1347 }
1348
1349
1350 static void prt_cut(void)
1351 {
1352         int c = p_ptr->cut;
1353
1354         if (c > 1000)
1355         {
1356                 c_put_str(TERM_L_RED, _("致命傷      ", "Mortal wound"), ROW_CUT, COL_CUT);
1357         }
1358         else if (c > 200)
1359         {
1360                 c_put_str(TERM_RED, _("ひどい深手  ", "Deep gash   "), ROW_CUT, COL_CUT);
1361         }
1362         else if (c > 100)
1363         {
1364                 c_put_str(TERM_RED, _("重傷        ", "Severe cut  "), ROW_CUT, COL_CUT);
1365         }
1366         else if (c > 50)
1367         {
1368                 c_put_str(TERM_ORANGE, _("大変な傷    ", "Nasty cut   "), ROW_CUT, COL_CUT);
1369         }
1370         else if (c > 25)
1371         {
1372                 c_put_str(TERM_ORANGE, _("ひどい傷    ", "Bad cut     "), ROW_CUT, COL_CUT);
1373         }
1374         else if (c > 10)
1375         {
1376                 c_put_str(TERM_YELLOW, _("軽傷        ", "Light cut   "), ROW_CUT, COL_CUT);
1377         }
1378         else if (c)
1379         {
1380                 c_put_str(TERM_YELLOW, _("かすり傷    ", "Graze       "), ROW_CUT, COL_CUT);
1381         }
1382         else
1383         {
1384                 put_str("            ", ROW_CUT, COL_CUT);
1385         }
1386 }
1387
1388
1389
1390 static void prt_stun(void)
1391 {
1392         int s = p_ptr->stun;
1393
1394         if (s > 100)
1395         {
1396                 c_put_str(TERM_RED, _("意識不明瞭  ", "Knocked out "), ROW_STUN, COL_STUN);
1397         }
1398         else if (s > 50)
1399         {
1400                 c_put_str(TERM_ORANGE, _("ひどく朦朧  ", "Heavy stun  "), ROW_STUN, COL_STUN);
1401         }
1402         else if (s)
1403         {
1404                 c_put_str(TERM_ORANGE, _("朦朧        ", "Stun        "), ROW_STUN, COL_STUN);
1405         }
1406         else
1407         {
1408                 put_str("            ", ROW_STUN, COL_STUN);
1409         }
1410 }
1411
1412
1413
1414 /*
1415  * Redraw the "monster health bar"      -DRS-
1416  * Rather extensive modifications by    -BEN-
1417  *
1418  * The "monster health bar" provides visual feedback on the "health"
1419  * of the monster currently being "tracked".  There are several ways
1420  * to "track" a monster, including targetting it, attacking it, and
1421  * affecting it (and nobody else) with a ranged attack.
1422  *
1423  * Display the monster health bar (affectionately known as the
1424  * "health-o-meter").  Clear health bar if nothing is being tracked.
1425  * Auto-track current target monster when bored.  Note that the
1426  * health-bar stops tracking any monster that "disappears".
1427  */
1428 static void health_redraw(bool riding)
1429 {
1430         s16b health_who;
1431         int row, col;
1432         monster_type *m_ptr;
1433
1434         if (riding)
1435         {
1436                 health_who = p_ptr->riding;
1437                 row = ROW_RIDING_INFO;
1438                 col = COL_RIDING_INFO;
1439         }
1440         else
1441         {
1442                 health_who = p_ptr->health_who;
1443                 row = ROW_INFO;
1444                 col = COL_INFO;
1445         }
1446
1447         m_ptr = &m_list[health_who];
1448
1449         if (p_ptr->wizard && p_ptr->inside_battle)
1450         {
1451                 row = ROW_INFO - 2;
1452                 col = COL_INFO + 2;
1453
1454                 Term_putstr(col - 2, row, 12, TERM_WHITE, "      /     ");
1455                 Term_putstr(col - 2, row + 1, 12, TERM_WHITE, "      /     ");
1456                 Term_putstr(col - 2, row + 2, 12, TERM_WHITE, "      /     ");
1457                 Term_putstr(col - 2, row + 3, 12, TERM_WHITE, "      /     ");
1458
1459                 if(m_list[1].r_idx)
1460                 {
1461                         Term_putstr(col - 2, row, 2, r_info[m_list[1].r_idx].x_attr, format("%c", r_info[m_list[1].r_idx].x_char));
1462                         Term_putstr(col - 1, row, 5, TERM_WHITE, format("%5d", m_list[1].hp));
1463                         Term_putstr(col + 5, row, 6, TERM_WHITE, format("%5d", m_list[1].max_maxhp));
1464                 }
1465
1466                 if(m_list[2].r_idx)
1467                 {
1468                         Term_putstr(col - 2, row + 1, 2, r_info[m_list[2].r_idx].x_attr, format("%c", r_info[m_list[2].r_idx].x_char));
1469                         Term_putstr(col - 1, row + 1, 5, TERM_WHITE, format("%5d", m_list[2].hp));
1470                         Term_putstr(col + 5, row + 1, 6, TERM_WHITE, format("%5d", m_list[2].max_maxhp));
1471                 }
1472
1473                 if(m_list[3].r_idx)
1474                 {
1475                         Term_putstr(col - 2, row + 2, 2, r_info[m_list[3].r_idx].x_attr, format("%c", r_info[m_list[3].r_idx].x_char));
1476                         Term_putstr(col - 1, row + 2, 5, TERM_WHITE, format("%5d", m_list[3].hp));
1477                         Term_putstr(col + 5, row + 2, 6, TERM_WHITE, format("%5d", m_list[3].max_maxhp));
1478                 }
1479
1480                 if(m_list[4].r_idx)
1481                 {
1482                         Term_putstr(col - 2, row + 3, 2, r_info[m_list[4].r_idx].x_attr, format("%c", r_info[m_list[4].r_idx].x_char));
1483                         Term_putstr(col - 1, row + 3, 5, TERM_WHITE, format("%5d", m_list[4].hp));
1484                         Term_putstr(col + 5, row + 3, 6, TERM_WHITE, format("%5d", m_list[4].max_maxhp));
1485                 }
1486         }
1487         else
1488         {
1489
1490                 /* Not tracking */
1491                 if (!health_who)
1492                 {
1493                         /* Erase the health bar */
1494                         Term_erase(col, row, 12);
1495                 }
1496
1497                 /* Tracking an unseen monster */
1498                 else if (!m_ptr->ml)
1499                 {
1500                         /* Indicate that the monster health is "unknown" */
1501                         Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1502                 }
1503
1504                 /* Tracking a hallucinatory monster */
1505                 else if (p_ptr->image)
1506                 {
1507                         /* Indicate that the monster health is "unknown" */
1508                         Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1509                 }
1510
1511                 /* Tracking a dead monster (???) */
1512                 else if (m_ptr->hp < 0)
1513                 {
1514                         /* Indicate that the monster health is "unknown" */
1515                         Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1516                 }
1517
1518                 /* Tracking a visible monster */
1519                 else
1520                 {
1521                         /* Extract the "percent" of health */
1522                         int pct = 100L * m_ptr->hp / m_ptr->maxhp;
1523                         int pct2 = 100L * m_ptr->hp / m_ptr->max_maxhp;
1524
1525                         /* Convert percent into "health" */
1526                         int len = (pct2 < 10) ? 1 : (pct2 < 90) ? (pct2 / 10 + 1) : 10;
1527
1528                         /* Default to almost dead */
1529                         byte attr = TERM_RED;
1530
1531                         /* Invulnerable */
1532                         if (MON_INVULNER(m_ptr)) attr = TERM_WHITE;
1533
1534                         /* Asleep */
1535                         else if (MON_CSLEEP(m_ptr)) attr = TERM_BLUE;
1536
1537                         /* Afraid */
1538                         else if (MON_MONFEAR(m_ptr)) attr = TERM_VIOLET;
1539
1540                         /* Healthy */
1541                         else if (pct >= 100) attr = TERM_L_GREEN;
1542
1543                         /* Somewhat Wounded */
1544                         else if (pct >= 60) attr = TERM_YELLOW;
1545
1546                         /* Wounded */
1547                         else if (pct >= 25) attr = TERM_ORANGE;
1548
1549                         /* Badly wounded */
1550                         else if (pct >= 10) attr = TERM_L_RED;
1551
1552                         /* Default to "unknown" */
1553                         Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1554
1555                         /* Dump the current "health" (use '*' symbols) */
1556                         Term_putstr(col + 1, row, len, attr, "**********");
1557                 }
1558         }
1559 }
1560
1561
1562
1563 /*
1564  * Display basic info (mostly left of map)
1565  */
1566 static void prt_frame_basic(void)
1567 {
1568         int i;
1569
1570         /* Race and Class */
1571         if (p_ptr->mimic_form)
1572                 prt_field(mimic_info[p_ptr->mimic_form].title, ROW_RACE, COL_RACE);
1573         else
1574         {
1575                 char str[14];
1576                 my_strcpy(str, rp_ptr->title, sizeof(str));
1577                 prt_field(str, ROW_RACE, COL_RACE);
1578         }
1579 /*      prt_field(cp_ptr->title, ROW_CLASS, COL_CLASS); */
1580 /*      prt_field(ap_ptr->title, ROW_SEIKAKU, COL_SEIKAKU); */
1581
1582
1583         /* Title */
1584         prt_title();
1585
1586         /* Level/Experience */
1587         prt_level();
1588         prt_exp();
1589
1590         /* All Stats */
1591         for (i = 0; i < 6; i++) prt_stat(i);
1592
1593         /* Armor */
1594         prt_ac();
1595
1596         /* Hitpoints */
1597         prt_hp();
1598
1599         /* Spellpoints */
1600         prt_sp();
1601
1602         /* Gold */
1603         prt_gold();
1604
1605         /* Current depth */
1606         prt_depth();
1607
1608         /* Special */
1609         health_redraw(FALSE);
1610         health_redraw(TRUE);
1611 }
1612
1613
1614 /*
1615  * Display extra info (mostly below map)
1616  */
1617 static void prt_frame_extra(void)
1618 {
1619         /* Cut/Stun */
1620         prt_cut();
1621         prt_stun();
1622
1623         /* Food */
1624         prt_hunger();
1625
1626         /* State */
1627         prt_state();
1628
1629         /* Speed */
1630         prt_speed();
1631
1632         /* Study spells */
1633         prt_study();
1634
1635         prt_imitation();
1636
1637         prt_status();
1638 }
1639
1640
1641 /*
1642  * Hack -- display inventory in sub-windows
1643  */
1644 static void fix_inven(void)
1645 {
1646         int j;
1647
1648         /* Scan windows */
1649         for (j = 0; j < 8; j++)
1650         {
1651                 term *old = Term;
1652
1653                 /* No window */
1654                 if (!angband_term[j]) continue;
1655
1656                 /* No relevant flags */
1657                 if (!(window_flag[j] & (PW_INVEN))) continue;
1658
1659                 /* Activate */
1660                 Term_activate(angband_term[j]);
1661
1662                 /* Display inventory */
1663                 display_inven();
1664
1665                 /* Fresh */
1666                 Term_fresh();
1667
1668                 /* Restore */
1669                 Term_activate(old);
1670         }
1671 }
1672
1673
1674 /*
1675  * Print monster info in line
1676  * nnn X LV name
1677  *  nnn : number or unique(U) or wanted unique(W)
1678  *  X   : symbol of monster
1679  *  LV  : monster lv if known
1680  *  name: name of monster
1681  */
1682 static void print_monster_line(int x, int y, monster_type* m_ptr, int n_same){
1683         char buf[256];
1684         int i;
1685         int r_idx = m_ptr->ap_r_idx;
1686         monster_race* r_ptr = &r_info[r_idx];
1687  
1688         Term_gotoxy(x, y);
1689         if(!r_ptr)return;
1690         //Number of 'U'nique
1691         if(r_ptr->flags1&RF1_UNIQUE){//unique
1692                 bool is_kubi = FALSE;
1693                 for(i=0;i<MAX_KUBI;i++){
1694                         if(kubi_r_idx[i] == r_idx){
1695                                 is_kubi = TRUE;
1696                                 break;
1697                         }
1698                 }
1699                 Term_addstr(-1, TERM_WHITE, is_kubi?"  W":"  U");
1700         }else{
1701                 sprintf(buf, "%3d", n_same);
1702                 Term_addstr(-1, TERM_WHITE, buf);
1703         }
1704         //symbol
1705         Term_addstr(-1, TERM_WHITE, " ");
1706         //Term_add_bigch(r_ptr->d_attr, r_ptr->d_char);
1707         //Term_addstr(-1, TERM_WHITE, "/");
1708         Term_add_bigch(r_ptr->x_attr, r_ptr->x_char);
1709         //LV
1710         if (r_ptr->r_tkills && !(m_ptr->mflag2 & MFLAG2_KAGE)){
1711                 sprintf(buf, " %2d", r_ptr->level);
1712         }else{
1713                 strcpy(buf, " ??");
1714         }
1715         Term_addstr(-1, TERM_WHITE, buf);
1716         //name
1717         sprintf(buf, " %s ", r_name+r_ptr->name);
1718         Term_addstr(-1, TERM_WHITE, buf);
1719  
1720         //Term_addstr(-1, TERM_WHITE, look_mon_desc(m_ptr, 0));
1721 }
1722
1723  /*
1724         max_lines : 最大何行描画するか.
1725 */
1726 void print_monster_list(int x, int y, int max_lines){
1727         int line = y;
1728         monster_type* last_mons = NULL;
1729         monster_type* m_ptr = NULL;
1730         int n_same = 0;
1731         int i;
1732
1733         for(i=0;i<temp_n;i++){
1734                 cave_type* c_ptr = &cave[temp_y[i]][temp_x[i]];
1735                 if(!c_ptr->m_idx || !m_list[c_ptr->m_idx].ml)continue;//no mons or cannot look
1736                 m_ptr = &m_list[c_ptr->m_idx];
1737                 if(is_pet(m_ptr))continue;//pet
1738                 if(!m_ptr->r_idx)continue;//dead?
1739                 {
1740                         /*
1741                         int r_idx = m_ptr->ap_r_idx;
1742                         monster_race* r_ptr = &r_info[r_idx];
1743                         cptr name = (r_name + r_ptr->name);
1744                         cptr ename = (r_name + r_ptr->name);
1745                         //ミミック類や「それ」等は、一覧に出てはいけない
1746                         if(r_ptr->flags1&RF1_CHAR_CLEAR)continue;
1747                         if((r_ptr->flags1&RF1_NEVER_MOVE)&&(r_ptr->flags2&RF2_CHAR_MULTI))continue;
1748                         //『ヌル』は、一覧に出てはいけない
1749                         if((strcmp(name, "生ける虚無『ヌル』")==0)||
1750                            (strcmp(ename, "Null the Living Void")==0))continue;
1751                         //"金無垢の指輪"は、一覧に出てはいけない
1752                         if((strcmp(name, "金無垢の指輪")==0)||
1753                                 (strcmp(ename, "Plain Gold Ring")==0))continue;
1754                         */
1755                 }
1756
1757                 //ソート済みなので同じモンスターは連続する.これを利用して同じモンスターをカウント,まとめて表示する.
1758                 if(!last_mons){//先頭モンスター
1759                         last_mons = m_ptr;
1760                         n_same = 1;
1761                         continue;
1762                 }
1763                 //same race?
1764                 if(last_mons->ap_r_idx == m_ptr->ap_r_idx){
1765                         n_same++;
1766                         continue;//表示処理を次に回す
1767                 }
1768                 //print last mons info
1769                 print_monster_line(x, line++, last_mons, n_same);
1770                 n_same = 1;
1771                 last_mons = m_ptr;
1772                 if(line-y-1==max_lines){//残り1行
1773                         break;
1774                 }
1775         }
1776         if(line-y-1==max_lines && i!=temp_n){
1777                 Term_gotoxy(x, line);
1778                 Term_addstr(-1, TERM_WHITE, "-- and more --");
1779         }else{
1780                 if(last_mons)print_monster_line(x, line++, last_mons, n_same);
1781         }
1782 }
1783 /*
1784  * Hack -- display monster list in sub-windows
1785  */
1786 static void fix_monster_list(void)
1787 {
1788         int j;
1789         int w, h;
1790
1791         /* Scan windows */
1792         for (j = 0; j < 8; j++)
1793         {
1794                 term *old = Term;
1795
1796                 /* No window */
1797                 if (!angband_term[j]) continue;
1798
1799                 /* No relevant flags */
1800                 if (!(window_flag[j] & (PW_MONSTER_LIST))) continue;
1801
1802                 /* Activate */
1803                 Term_activate(angband_term[j]);
1804                 Term_get_size(&w, &h);
1805
1806                 Term_clear();
1807
1808                 target_set_prepare_look();//モンスター一覧を生成,ソート
1809                 print_monster_list(0, 0, h);
1810
1811                 /* Fresh */
1812                 Term_fresh();
1813
1814                 /* Restore */
1815                 Term_activate(old);
1816         }
1817 }
1818
1819
1820
1821
1822 /*
1823  * Hack -- display equipment in sub-windows
1824  */
1825 static void fix_equip(void)
1826 {
1827         int j;
1828
1829         /* Scan windows */
1830         for (j = 0; j < 8; j++)
1831         {
1832                 term *old = Term;
1833
1834                 /* No window */
1835                 if (!angband_term[j]) continue;
1836
1837                 /* No relevant flags */
1838                 if (!(window_flag[j] & (PW_EQUIP))) continue;
1839
1840                 /* Activate */
1841                 Term_activate(angband_term[j]);
1842
1843                 /* Display equipment */
1844                 display_equip();
1845
1846                 /* Fresh */
1847                 Term_fresh();
1848
1849                 /* Restore */
1850                 Term_activate(old);
1851         }
1852 }
1853
1854
1855 /*
1856  * Hack -- display equipment in sub-windows
1857  */
1858 static void fix_spell(void)
1859 {
1860         int j;
1861
1862         /* Scan windows */
1863         for (j = 0; j < 8; j++)
1864         {
1865                 term *old = Term;
1866
1867                 /* No window */
1868                 if (!angband_term[j]) continue;
1869
1870                 /* No relevant flags */
1871                 if (!(window_flag[j] & (PW_SPELL))) continue;
1872
1873                 /* Activate */
1874                 Term_activate(angband_term[j]);
1875
1876                 /* Display spell list */
1877                 display_spell_list();
1878
1879                 /* Fresh */
1880                 Term_fresh();
1881
1882                 /* Restore */
1883                 Term_activate(old);
1884         }
1885 }
1886
1887
1888 /*
1889  * Hack -- display character in sub-windows
1890  */
1891 static void fix_player(void)
1892 {
1893         int j;
1894
1895         /* Scan windows */
1896         for (j = 0; j < 8; j++)
1897         {
1898                 term *old = Term;
1899
1900                 /* No window */
1901                 if (!angband_term[j]) continue;
1902
1903                 /* No relevant flags */
1904                 if (!(window_flag[j] & (PW_PLAYER))) continue;
1905
1906                 /* Activate */
1907                 Term_activate(angband_term[j]);
1908
1909                 update_playtime();
1910
1911                 /* Display player */
1912                 display_player(0);
1913
1914                 /* Fresh */
1915                 Term_fresh();
1916
1917                 /* Restore */
1918                 Term_activate(old);
1919         }
1920 }
1921
1922
1923
1924 /*
1925  * Hack -- display recent messages in sub-windows
1926  *
1927  * XXX XXX XXX Adjust for width and split messages
1928  */
1929 static void fix_message(void)
1930 {
1931         int j, i;
1932         int w, h;
1933         int x, y;
1934
1935         /* Scan windows */
1936         for (j = 0; j < 8; j++)
1937         {
1938                 term *old = Term;
1939
1940                 /* No window */
1941                 if (!angband_term[j]) continue;
1942
1943                 /* No relevant flags */
1944                 if (!(window_flag[j] & (PW_MESSAGE))) continue;
1945
1946                 /* Activate */
1947                 Term_activate(angband_term[j]);
1948
1949                 /* Get size */
1950                 Term_get_size(&w, &h);
1951
1952                 /* Dump messages */
1953                 for (i = 0; i < h; i++)
1954                 {
1955                         /* Dump the message on the appropriate line */
1956                         Term_putstr(0, (h - 1) - i, -1, (byte)((i < now_message) ? TERM_WHITE : TERM_SLATE), message_str((s16b)i));
1957
1958                         /* Cursor */
1959                         Term_locate(&x, &y);
1960
1961                         /* Clear to end of line */
1962                         Term_erase(x, y, 255);
1963                 }
1964
1965                 /* Fresh */
1966                 Term_fresh();
1967
1968                 /* Restore */
1969                 Term_activate(old);
1970         }
1971 }
1972
1973
1974 /*
1975  * Hack -- display overhead view in sub-windows
1976  *
1977  * Note that the "player" symbol does NOT appear on the map.
1978  */
1979 static void fix_overhead(void)
1980 {
1981         int j;
1982
1983         int cy, cx;
1984
1985         /* Scan windows */
1986         for (j = 0; j < 8; j++)
1987         {
1988                 term *old = Term;
1989                 int wid, hgt;
1990
1991                 /* No window */
1992                 if (!angband_term[j]) continue;
1993
1994                 /* No relevant flags */
1995                 if (!(window_flag[j] & (PW_OVERHEAD))) continue;
1996
1997                 /* Activate */
1998                 Term_activate(angband_term[j]);
1999
2000                 /* Full map in too small window is useless  */
2001                 Term_get_size(&wid, &hgt);
2002                 if (wid > COL_MAP + 2 && hgt > ROW_MAP + 2)
2003                 {
2004                         /* Redraw map */
2005                         display_map(&cy, &cx);
2006
2007                         /* Fresh */
2008                         Term_fresh();
2009                 }
2010
2011                 /* Restore */
2012                 Term_activate(old);
2013         }
2014 }
2015
2016
2017 /*
2018  * Hack -- display dungeon view in sub-windows
2019  */
2020 static void fix_dungeon(void)
2021 {
2022         int j;
2023
2024         /* Scan windows */
2025         for (j = 0; j < 8; j++)
2026         {
2027                 term *old = Term;
2028
2029                 /* No window */
2030                 if (!angband_term[j]) continue;
2031
2032                 /* No relevant flags */
2033                 if (!(window_flag[j] & (PW_DUNGEON))) continue;
2034
2035                 /* Activate */
2036                 Term_activate(angband_term[j]);
2037
2038                 /* Redraw dungeon view */
2039                 display_dungeon();
2040
2041                 /* Fresh */
2042                 Term_fresh();
2043
2044                 /* Restore */
2045                 Term_activate(old);
2046         }
2047 }
2048
2049
2050 /*
2051  * Hack -- display monster recall in sub-windows
2052  */
2053 static void fix_monster(void)
2054 {
2055         int j;
2056
2057         /* Scan windows */
2058         for (j = 0; j < 8; j++)
2059         {
2060                 term *old = Term;
2061
2062                 /* No window */
2063                 if (!angband_term[j]) continue;
2064
2065                 /* No relevant flags */
2066                 if (!(window_flag[j] & (PW_MONSTER))) continue;
2067
2068                 /* Activate */
2069                 Term_activate(angband_term[j]);
2070
2071                 /* Display monster race info */
2072                 if (p_ptr->monster_race_idx) display_roff(p_ptr->monster_race_idx);
2073
2074                 /* Fresh */
2075                 Term_fresh();
2076
2077                 /* Restore */
2078                 Term_activate(old);
2079         }
2080 }
2081
2082
2083 /*
2084  * Hack -- display object recall in sub-windows
2085  */
2086 static void fix_object(void)
2087 {
2088         int j;
2089
2090         /* Scan windows */
2091         for (j = 0; j < 8; j++)
2092         {
2093                 term *old = Term;
2094
2095                 /* No window */
2096                 if (!angband_term[j]) continue;
2097
2098                 /* No relevant flags */
2099                 if (!(window_flag[j] & (PW_OBJECT))) continue;
2100
2101                 /* Activate */
2102                 Term_activate(angband_term[j]);
2103
2104                 /* Display monster race info */
2105                 if (p_ptr->object_kind_idx) display_koff(p_ptr->object_kind_idx);
2106
2107                 /* Fresh */
2108                 Term_fresh();
2109
2110                 /* Restore */
2111                 Term_activate(old);
2112         }
2113 }
2114
2115
2116 /*
2117  * Calculate number of spells player should have, and forget,
2118  * or remember, spells until that number is properly reflected.
2119  *
2120  * Note that this function induces various "status" messages,
2121  * which must be bypasses until the character is created.
2122  */
2123 static void calc_spells(void)
2124 {
2125         int                     i, j, k, levels;
2126         int                     num_allowed;
2127         int         num_boukyaku = 0;
2128
2129         const magic_type        *s_ptr;
2130         int which;
2131         int bonus = 0;
2132
2133
2134         cptr p;
2135
2136         /* Hack -- must be literate */
2137         if (!mp_ptr->spell_book) return;
2138
2139         /* Hack -- wait for creation */
2140         if (!character_generated) return;
2141
2142         /* Hack -- handle "xtra" mode */
2143         if (character_xtra) return;
2144
2145         if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
2146         {
2147                 p_ptr->new_spells = 0;
2148                 return;
2149         }
2150
2151         p = spell_category_name(mp_ptr->spell_book);
2152
2153         /* Determine the number of spells allowed */
2154         levels = p_ptr->lev - mp_ptr->spell_first + 1;
2155
2156         /* Hack -- no negative spells */
2157         if (levels < 0) levels = 0;
2158
2159         /* Extract total allowed spells */
2160         num_allowed = (adj_mag_study[p_ptr->stat_ind[mp_ptr->spell_stat]] * levels / 2);
2161
2162         if ((p_ptr->pclass != CLASS_SAMURAI) && (mp_ptr->spell_book != TV_LIFE_BOOK))
2163         {
2164                 bonus = 4;
2165         }
2166         if (p_ptr->pclass == CLASS_SAMURAI)
2167         {
2168                 num_allowed = 32;
2169         }
2170         else if (p_ptr->realm2 == REALM_NONE)
2171         {
2172                 num_allowed = (num_allowed+1)/2;
2173                 if (num_allowed>(32+bonus)) num_allowed = 32+bonus;
2174         }
2175         else if ((p_ptr->pclass == CLASS_MAGE) || (p_ptr->pclass == CLASS_PRIEST))
2176         {
2177                 if (num_allowed>(96+bonus)) num_allowed = 96+bonus;
2178         }
2179         else
2180         {
2181                 if (num_allowed>(80+bonus)) num_allowed = 80+bonus;
2182         }
2183
2184         /* Count the number of spells we know */
2185         for (j = 0; j < 64; j++)
2186         {
2187                 /* Count known spells */
2188                 if ((j < 32) ?
2189                     (p_ptr->spell_forgotten1 & (1L << j)) :
2190                     (p_ptr->spell_forgotten2 & (1L << (j - 32))))
2191                 {
2192                         num_boukyaku++;
2193                 }
2194         }
2195
2196         /* See how many spells we must forget or may learn */
2197         p_ptr->new_spells = num_allowed + p_ptr->add_spells + num_boukyaku - p_ptr->learned_spells;
2198
2199         /* Forget spells which are too hard */
2200         for (i = 63; i >= 0; i--)
2201         {
2202                 /* Efficiency -- all done */
2203                 if (!p_ptr->spell_learned1 && !p_ptr->spell_learned2) break;
2204
2205                 /* Access the spell */
2206                 j = p_ptr->spell_order[i];
2207
2208                 /* Skip non-spells */
2209                 if (j >= 99) continue;
2210
2211
2212                 /* Get the spell */
2213                 if (!is_magic((j < 32) ? p_ptr->realm1 : p_ptr->realm2))
2214                 {
2215                         if (j < 32)
2216                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
2217                         else
2218                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][j%32];
2219                 }
2220                 else if (j < 32)
2221                         s_ptr = &mp_ptr->info[p_ptr->realm1-1][j];
2222                 else
2223                         s_ptr = &mp_ptr->info[p_ptr->realm2-1][j%32];
2224
2225                 /* Skip spells we are allowed to know */
2226                 if (s_ptr->slevel <= p_ptr->lev) continue;
2227
2228                 /* Is it known? */
2229                 if ((j < 32) ?
2230                     (p_ptr->spell_learned1 & (1L << j)) :
2231                     (p_ptr->spell_learned2 & (1L << (j - 32))))
2232                 {
2233                         /* Mark as forgotten */
2234                         if (j < 32)
2235                         {
2236                                 p_ptr->spell_forgotten1 |= (1L << j);
2237                                 which = p_ptr->realm1;
2238                         }
2239                         else
2240                         {
2241                                 p_ptr->spell_forgotten2 |= (1L << (j - 32));
2242                                 which = p_ptr->realm2;
2243                         }
2244
2245                         /* No longer known */
2246                         if (j < 32)
2247                         {
2248                                 p_ptr->spell_learned1 &= ~(1L << j);
2249                                 which = p_ptr->realm1;
2250                         }
2251                         else
2252                         {
2253                                 p_ptr->spell_learned2 &= ~(1L << (j - 32));
2254                                 which = p_ptr->realm2;
2255                         }
2256
2257                         /* Message */
2258 #ifdef JP
2259                         msg_format("%sの%sを忘れてしまった。",
2260                                    do_spell(which, j%32, SPELL_NAME), p );
2261 #else
2262                         msg_format("You have forgotten the %s of %s.", p,
2263                         do_spell(which, j%32, SPELL_NAME));
2264 #endif
2265
2266
2267                         /* One more can be learned */
2268                         p_ptr->new_spells++;
2269                 }
2270         }
2271
2272
2273         /* Forget spells if we know too many spells */
2274         for (i = 63; i >= 0; i--)
2275         {
2276                 /* Stop when possible */
2277                 if (p_ptr->new_spells >= 0) break;
2278
2279                 /* Efficiency -- all done */
2280                 if (!p_ptr->spell_learned1 && !p_ptr->spell_learned2) break;
2281
2282                 /* Get the (i+1)th spell learned */
2283                 j = p_ptr->spell_order[i];
2284
2285                 /* Skip unknown spells */
2286                 if (j >= 99) continue;
2287
2288                 /* Forget it (if learned) */
2289                 if ((j < 32) ?
2290                     (p_ptr->spell_learned1 & (1L << j)) :
2291                     (p_ptr->spell_learned2 & (1L << (j - 32))))
2292                 {
2293                         /* Mark as forgotten */
2294                         if (j < 32)
2295                         {
2296                                 p_ptr->spell_forgotten1 |= (1L << j);
2297                                 which = p_ptr->realm1;
2298                         }
2299                         else
2300                         {
2301                                 p_ptr->spell_forgotten2 |= (1L << (j - 32));
2302                                 which = p_ptr->realm2;
2303                         }
2304
2305                         /* No longer known */
2306                         if (j < 32)
2307                         {
2308                                 p_ptr->spell_learned1 &= ~(1L << j);
2309                                 which = p_ptr->realm1;
2310                         }
2311                         else
2312                         {
2313                                 p_ptr->spell_learned2 &= ~(1L << (j - 32));
2314                                 which = p_ptr->realm2;
2315                         }
2316
2317                         /* Message */
2318 #ifdef JP
2319                         msg_format("%sの%sを忘れてしまった。",
2320                                    do_spell(which, j%32, SPELL_NAME), p );
2321 #else
2322                         msg_format("You have forgotten the %s of %s.", p,
2323                                    do_spell(which, j%32, SPELL_NAME));
2324 #endif
2325
2326
2327                         /* One more can be learned */
2328                         p_ptr->new_spells++;
2329                 }
2330         }
2331
2332
2333         /* Check for spells to remember */
2334         for (i = 0; i < 64; i++)
2335         {
2336                 /* None left to remember */
2337                 if (p_ptr->new_spells <= 0) break;
2338
2339                 /* Efficiency -- all done */
2340                 if (!p_ptr->spell_forgotten1 && !p_ptr->spell_forgotten2) break;
2341
2342                 /* Get the next spell we learned */
2343                 j = p_ptr->spell_order[i];
2344
2345                 /* Skip unknown spells */
2346                 if (j >= 99) break;
2347
2348                 /* Access the spell */
2349                 if (!is_magic((j < 32) ? p_ptr->realm1 : p_ptr->realm2))
2350                 {
2351                         if (j < 32)
2352                                 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
2353                         else
2354                                 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][j%32];
2355                 }
2356                 else if (j<32)
2357                         s_ptr = &mp_ptr->info[p_ptr->realm1-1][j];
2358                 else
2359                         s_ptr = &mp_ptr->info[p_ptr->realm2-1][j%32];
2360
2361                 /* Skip spells we cannot remember */
2362                 if (s_ptr->slevel > p_ptr->lev) continue;
2363
2364                 /* First set of spells */
2365                 if ((j < 32) ?
2366                     (p_ptr->spell_forgotten1 & (1L << j)) :
2367                     (p_ptr->spell_forgotten2 & (1L << (j - 32))))
2368                 {
2369                         /* No longer forgotten */
2370                         if (j < 32)
2371                         {
2372                                 p_ptr->spell_forgotten1 &= ~(1L << j);
2373                                 which = p_ptr->realm1;
2374                         }
2375                         else
2376                         {
2377                                 p_ptr->spell_forgotten2 &= ~(1L << (j - 32));
2378                                 which = p_ptr->realm2;
2379                         }
2380
2381                         /* Known once more */
2382                         if (j < 32)
2383                         {
2384                                 p_ptr->spell_learned1 |= (1L << j);
2385                                 which = p_ptr->realm1;
2386                         }
2387                         else
2388                         {
2389                                 p_ptr->spell_learned2 |= (1L << (j - 32));
2390                                 which = p_ptr->realm2;
2391                         }
2392
2393                         /* Message */
2394 #ifdef JP
2395                         msg_format("%sの%sを思い出した。",
2396                                    do_spell(which, j%32, SPELL_NAME), p );
2397 #else
2398                         msg_format("You have remembered the %s of %s.",
2399                                    p, do_spell(which, j%32, SPELL_NAME));
2400 #endif
2401
2402
2403                         /* One less can be learned */
2404                         p_ptr->new_spells--;
2405                 }
2406         }
2407
2408         k = 0;
2409
2410         if (p_ptr->realm2 == REALM_NONE)
2411         {
2412                 /* Count spells that can be learned */
2413                 for (j = 0; j < 32; j++)
2414                 {
2415                         if (!is_magic(p_ptr->realm1)) s_ptr = &technic_info[p_ptr->realm1-MIN_TECHNIC][j];
2416                         else s_ptr = &mp_ptr->info[p_ptr->realm1-1][j];
2417
2418                         /* Skip spells we cannot remember */
2419                         if (s_ptr->slevel > p_ptr->lev) continue;
2420
2421                         /* Skip spells we already know */
2422                         if (p_ptr->spell_learned1 & (1L << j))
2423                         {
2424                                 continue;
2425                         }
2426
2427                         /* Count it */
2428                         k++;
2429                 }
2430                 if (k > 32) k = 32;
2431                 if ((p_ptr->new_spells > k) && ((mp_ptr->spell_book == TV_LIFE_BOOK) || (mp_ptr->spell_book == TV_HISSATSU_BOOK))) p_ptr->new_spells = k;
2432         }
2433
2434         if (p_ptr->new_spells < 0) p_ptr->new_spells = 0;
2435
2436         /* Spell count changed */
2437         if (p_ptr->old_spells != p_ptr->new_spells)
2438         {
2439                 /* Message if needed */
2440                 if (p_ptr->new_spells)
2441                 {
2442                         /* Message */
2443 #ifdef JP
2444                         if( p_ptr->new_spells < 10 ){
2445                                 msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p);
2446                         }else{
2447                                 msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p);
2448                         }
2449 #else
2450                         msg_format("You can learn %d more %s%s.",
2451                                    p_ptr->new_spells, p,
2452                                    (p_ptr->new_spells != 1) ? "s" : "");
2453 #endif
2454
2455                 }
2456
2457                 /* Save the new_spells value */
2458                 p_ptr->old_spells = p_ptr->new_spells;
2459
2460                 /* Redraw Study Status */
2461                 p_ptr->redraw |= (PR_STUDY);
2462
2463                 /* Redraw object recall */
2464                 p_ptr->window |= (PW_OBJECT);
2465         }
2466 }
2467
2468
2469 /*
2470  * Calculate maximum mana.  You do not need to know any spells.
2471  * Note that mana is lowered by heavy (or inappropriate) armor.
2472  *
2473  * This function induces status messages.
2474  */
2475 static void calc_mana(void)
2476 {
2477         int             msp, levels, cur_wgt, max_wgt;
2478
2479         object_type     *o_ptr;
2480
2481
2482         /* Hack -- Must be literate */
2483         if (!mp_ptr->spell_book) return;
2484
2485         if ((p_ptr->pclass == CLASS_MINDCRAFTER) ||
2486             (p_ptr->pclass == CLASS_MIRROR_MASTER) ||
2487             (p_ptr->pclass == CLASS_BLUE_MAGE))
2488         {
2489                 levels = p_ptr->lev;
2490         }
2491         else
2492         {
2493                 if(mp_ptr->spell_first > p_ptr->lev)
2494                 {
2495                         /* Save new mana */
2496                         p_ptr->msp = 0;
2497
2498                         /* Display mana later */
2499                         p_ptr->redraw |= (PR_MANA);
2500                         return;
2501                 }
2502
2503                 /* Extract "effective" player level */
2504                 levels = (p_ptr->lev - mp_ptr->spell_first) + 1;
2505         }
2506
2507         if (p_ptr->pclass == CLASS_SAMURAI)
2508         {
2509                 msp = (adj_mag_mana[p_ptr->stat_ind[mp_ptr->spell_stat]] + 10) * 2;
2510                 if (msp) msp += (msp * rp_ptr->r_adj[mp_ptr->spell_stat] / 20);
2511         }
2512         else
2513         {
2514                 /* Extract total mana */
2515                 msp = adj_mag_mana[p_ptr->stat_ind[mp_ptr->spell_stat]] * (levels+3) / 4;
2516
2517                 /* Hack -- usually add one mana */
2518                 if (msp) msp++;
2519
2520                 if (msp) msp += (msp * rp_ptr->r_adj[mp_ptr->spell_stat] / 20);
2521
2522                 if (msp && (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)) msp += msp/2;
2523
2524                 /* Hack: High mages have a 25% mana bonus */
2525                 if (msp && (p_ptr->pclass == CLASS_HIGH_MAGE)) msp += msp / 4;
2526
2527                 if (msp && (p_ptr->pclass == CLASS_SORCERER)) msp += msp*(25+p_ptr->lev)/100;
2528         }
2529
2530         /* Only mages are affected */
2531         if (mp_ptr->spell_xtra & MAGIC_GLOVE_REDUCE_MANA)
2532         {
2533                 u32b flgs[TR_FLAG_SIZE];
2534
2535                 /* Assume player is not encumbered by gloves */
2536                 p_ptr->cumber_glove = FALSE;
2537
2538                 /* Get the gloves */
2539                 o_ptr = &inventory[INVEN_HANDS];
2540
2541                 /* Examine the gloves */
2542                 object_flags(o_ptr, flgs);
2543
2544                 /* Normal gloves hurt mage-type spells */
2545                 if (o_ptr->k_idx &&
2546                     !(have_flag(flgs, TR_FREE_ACT)) &&
2547                         !(have_flag(flgs, TR_DEC_MANA)) &&
2548                         !(have_flag(flgs, TR_EASY_SPELL)) &&
2549                         !((have_flag(flgs, TR_MAGIC_MASTERY)) && (o_ptr->pval > 0)) &&
2550                     !((have_flag(flgs, TR_DEX)) && (o_ptr->pval > 0)))
2551                 {
2552                         /* Encumbered */
2553                         p_ptr->cumber_glove = TRUE;
2554
2555                         /* Reduce mana */
2556                         msp = (3 * msp) / 4;
2557                 }
2558         }
2559
2560
2561         /* Assume player not encumbered by armor */
2562         p_ptr->cumber_armor = FALSE;
2563
2564         /* Weigh the armor */
2565         cur_wgt = 0;
2566         if(inventory[INVEN_RARM].tval> TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight;
2567         if(inventory[INVEN_LARM].tval> TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight;
2568         cur_wgt += inventory[INVEN_BODY].weight;
2569         cur_wgt += inventory[INVEN_HEAD].weight;
2570         cur_wgt += inventory[INVEN_OUTER].weight;
2571         cur_wgt += inventory[INVEN_HANDS].weight;
2572         cur_wgt += inventory[INVEN_FEET].weight;
2573
2574         /* Subtract a percentage of maximum mana. */
2575         switch (p_ptr->pclass)
2576         {
2577                 /* For these classes, mana is halved if armour 
2578                  * is 30 pounds over their weight limit. */
2579                 case CLASS_MAGE:
2580                 case CLASS_HIGH_MAGE:
2581                 case CLASS_BLUE_MAGE:
2582                 case CLASS_MONK:
2583                 case CLASS_FORCETRAINER:
2584                 case CLASS_SORCERER:
2585                 {
2586                         if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight;
2587                         if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight;
2588                         break;
2589                 }
2590
2591                 /* Mana halved if armour is 40 pounds over weight limit. */
2592                 case CLASS_PRIEST:
2593                 case CLASS_BARD:
2594                 case CLASS_TOURIST:
2595                 {
2596                         if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight*2/3;
2597                         if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight*2/3;
2598                         break;
2599                 }
2600
2601                 case CLASS_MINDCRAFTER:
2602                 case CLASS_BEASTMASTER:
2603                 case CLASS_MIRROR_MASTER:
2604                 {
2605                         if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight/2;
2606                         if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight/2;
2607                         break;
2608                 }
2609
2610                 /* Mana halved if armour is 50 pounds over weight limit. */
2611                 case CLASS_ROGUE:
2612                 case CLASS_RANGER:
2613                 case CLASS_RED_MAGE:
2614                 case CLASS_WARRIOR_MAGE:
2615                 {
2616                         if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight/3;
2617                         if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight/3;
2618                         break;
2619                 }
2620
2621                 /* Mana halved if armour is 60 pounds over weight limit. */
2622                 case CLASS_PALADIN:
2623                 case CLASS_CHAOS_WARRIOR:
2624                 {
2625                         if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight/5;
2626                         if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight/5;
2627                         break;
2628                 }
2629
2630                 /* For new classes created, but not yet added to this formula. */
2631                 default:
2632                 {
2633                         break;
2634                 }
2635         }
2636
2637         /* Determine the weight allowance */
2638         max_wgt = mp_ptr->spell_weight;
2639
2640         /* Heavy armor penalizes mana by a percentage.  -LM- */
2641         if ((cur_wgt - max_wgt) > 0)
2642         {
2643                 /* Encumbered */
2644                 p_ptr->cumber_armor = TRUE;
2645
2646                 /* Subtract a percentage of maximum mana. */
2647                 switch (p_ptr->pclass)
2648                 {
2649                         /* For these classes, mana is halved if armour 
2650                          * is 30 pounds over their weight limit. */
2651                         case CLASS_MAGE:
2652                         case CLASS_HIGH_MAGE:
2653                         case CLASS_BLUE_MAGE:
2654                         {
2655                                 msp -= msp * (cur_wgt - max_wgt) / 600;
2656                                 break;
2657                         }
2658
2659                         /* Mana halved if armour is 40 pounds over weight limit. */
2660                         case CLASS_PRIEST:
2661                         case CLASS_MINDCRAFTER:
2662                         case CLASS_BEASTMASTER:
2663                         case CLASS_BARD:
2664                         case CLASS_FORCETRAINER:
2665                         case CLASS_TOURIST:
2666                         case CLASS_MIRROR_MASTER:
2667                         {
2668                                 msp -= msp * (cur_wgt - max_wgt) / 800;
2669                                 break;
2670                         }
2671
2672                         case CLASS_SORCERER:
2673                         {
2674                                 msp -= msp * (cur_wgt - max_wgt) / 900;
2675                                 break;
2676                         }
2677
2678                         /* Mana halved if armour is 50 pounds over weight limit. */
2679                         case CLASS_ROGUE:
2680                         case CLASS_RANGER:
2681                         case CLASS_MONK:
2682                         case CLASS_RED_MAGE:
2683                         {
2684                                 msp -= msp * (cur_wgt - max_wgt) / 1000;
2685                                 break;
2686                         }
2687
2688                         /* Mana halved if armour is 60 pounds over weight limit. */
2689                         case CLASS_PALADIN:
2690                         case CLASS_CHAOS_WARRIOR:
2691                         case CLASS_WARRIOR_MAGE:
2692                         {
2693                                 msp -= msp * (cur_wgt - max_wgt) / 1200;
2694                                 break;
2695                         }
2696
2697                         case CLASS_SAMURAI:
2698                         {
2699                                 p_ptr->cumber_armor = FALSE;
2700                                 break;
2701                         }
2702
2703                         /* For new classes created, but not yet added to this formula. */
2704                         default:
2705                         {
2706                                 msp -= msp * (cur_wgt - max_wgt) / 800;
2707                                 break;
2708                         }
2709                 }
2710         }
2711
2712         /* Mana can never be negative */
2713         if (msp < 0) msp = 0;
2714
2715
2716         /* Maximum mana has changed */
2717         if (p_ptr->msp != msp)
2718         {
2719                 /* Enforce maximum */
2720                 if ((p_ptr->csp >= msp) && (p_ptr->pclass != CLASS_SAMURAI))
2721                 {
2722                         p_ptr->csp = msp;
2723                         p_ptr->csp_frac = 0;
2724                 }
2725
2726 #ifdef JP
2727                 /* レベルアップの時は上昇量を表示する */
2728                 if ((level_up == 1) && (msp > p_ptr->msp))
2729                 {
2730                         msg_format("最大マジック・ポイントが %d 増加した!",
2731                                    (msp - p_ptr->msp));
2732                 }
2733 #endif
2734                 /* Save new mana */
2735                 p_ptr->msp = msp;
2736
2737                 /* Display mana later */
2738                 p_ptr->redraw |= (PR_MANA);
2739
2740                 /* Window stuff */
2741                 p_ptr->window |= (PW_PLAYER);
2742                 p_ptr->window |= (PW_SPELL);
2743         }
2744
2745
2746         /* Hack -- handle "xtra" mode */
2747         if (character_xtra) return;
2748
2749         /* Take note when "glove state" changes */
2750         if (p_ptr->old_cumber_glove != p_ptr->cumber_glove)
2751         {
2752                 /* Message */
2753                 if (p_ptr->cumber_glove)
2754                 {
2755                         msg_print(_("手が覆われて呪文が唱えにくい感じがする。", "Your covered hands feel unsuitable for spellcasting."));
2756                 }
2757                 else
2758                 {
2759                         msg_print(_("この手の状態なら、ぐっと呪文が唱えやすい感じだ。", "Your hands feel more suitable for spellcasting."));
2760                 }
2761
2762                 /* Save it */
2763                 p_ptr->old_cumber_glove = p_ptr->cumber_glove;
2764         }
2765
2766
2767         /* Take note when "armor state" changes */
2768         if (p_ptr->old_cumber_armor != p_ptr->cumber_armor)
2769         {
2770                 /* Message */
2771                 if (p_ptr->cumber_armor)
2772                 {
2773                         msg_print(_("装備の重さで動きが鈍くなってしまっている。", "The weight of your equipment encumbers your movement."));
2774                 }
2775                 else
2776                 {
2777                         msg_print(_("ぐっと楽に体を動かせるようになった。", "You feel able to move more freely."));
2778                 }
2779
2780                 /* Save it */
2781                 p_ptr->old_cumber_armor = p_ptr->cumber_armor;
2782         }
2783 }
2784
2785
2786
2787 /*
2788  * Calculate the players (maximal) hit points
2789  * Adjust current hitpoints if necessary
2790  */
2791 static void calc_hitpoints(void)
2792 {
2793         int bonus, mhp;
2794         byte tmp_hitdie;
2795
2796         /* Un-inflate "half-hitpoint bonus per level" value */
2797         bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128) * p_ptr->lev / 4;
2798
2799         /* Calculate hitpoints */
2800         mhp = p_ptr->player_hp[p_ptr->lev - 1];
2801
2802         if (p_ptr->mimic_form)
2803         {
2804                 if (p_ptr->pclass == CLASS_SORCERER)
2805                         tmp_hitdie = mimic_info[p_ptr->mimic_form].r_mhp/2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
2806                 else
2807                         tmp_hitdie = mimic_info[p_ptr->mimic_form].r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
2808                 mhp = mhp * tmp_hitdie / p_ptr->hitdie;
2809         }
2810
2811         if (p_ptr->pclass == CLASS_SORCERER)
2812         {
2813                 if (p_ptr->lev < 30)
2814                         mhp = (mhp * (45+p_ptr->lev) / 100);
2815                 else
2816                         mhp = (mhp * 75 / 100);
2817                 bonus = (bonus * 65 / 100);
2818         }
2819
2820         mhp += bonus;
2821
2822         if (p_ptr->pclass == CLASS_BERSERKER)
2823         {
2824                 mhp = mhp*(110+(((p_ptr->lev + 40) * (p_ptr->lev + 40) - 1550) / 110))/100;
2825         }
2826
2827         /* Always have at least one hitpoint per level */
2828         if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1;
2829
2830         /* Factor in the hero / superhero settings */
2831         if (IS_HERO()) mhp += 10;
2832         if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER)) mhp += 30;
2833         if (p_ptr->tsuyoshi) mhp += 50;
2834
2835         /* Factor in the hex spell settings */
2836         if (hex_spelling(HEX_XTRA_MIGHT)) mhp += 15;
2837         if (hex_spelling(HEX_BUILDING)) mhp += 60;
2838
2839         /* New maximum hitpoints */
2840         if (p_ptr->mhp != mhp)
2841         {
2842                 /* Enforce maximum */
2843                 if (p_ptr->chp >= mhp)
2844                 {
2845                         p_ptr->chp = mhp;
2846                         p_ptr->chp_frac = 0;
2847                 }
2848
2849 #ifdef JP
2850                 /* レベルアップの時は上昇量を表示する */
2851                 if ((level_up == 1) && (mhp > p_ptr->mhp))
2852                 {
2853                         msg_format("最大ヒット・ポイントが %d 増加した!",
2854                                    (mhp - p_ptr->mhp) );
2855                 }
2856 #endif
2857                 /* Save the new max-hitpoints */
2858                 p_ptr->mhp = mhp;
2859
2860                 /* Display hitpoints (later) */
2861                 p_ptr->redraw |= (PR_HP);
2862
2863                 /* Window stuff */
2864                 p_ptr->window |= (PW_PLAYER);
2865         }
2866 }
2867
2868
2869
2870 /*
2871  * Extract and set the current "lite radius"
2872  *
2873  * SWD: Experimental modification: multiple light sources have additive effect.
2874  *
2875  */
2876 static void calc_torch(void)
2877 {
2878         int i, rad;
2879         object_type *o_ptr;
2880         u32b flgs[TR_FLAG_SIZE];
2881
2882         /* Assume no light */
2883         p_ptr->cur_lite = 0;
2884
2885         /* Loop through all wielded items */
2886         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2887         {
2888                 o_ptr = &inventory[i];
2889                 /* Skip empty slots */
2890                 if (!o_ptr->k_idx) continue;
2891                 
2892                 if (o_ptr->name2 == EGO_LITE_SHINE) p_ptr->cur_lite++;
2893                 
2894                 /* Need Fuels */
2895                 if (o_ptr->name2 != EGO_LITE_DARKNESS)
2896                 {
2897                         if (o_ptr->tval == TV_LITE)
2898                         {
2899                                 if((o_ptr->sval == SV_LITE_TORCH) && !(o_ptr->xtra4 > 0)) continue;
2900                                 if((o_ptr->sval == SV_LITE_LANTERN) && !(o_ptr->xtra4 > 0)) continue;
2901                         }
2902                 }
2903
2904                 /* Extract the flags */
2905                 object_flags(o_ptr, flgs);
2906
2907                 /* calc the lite_radius */
2908                 
2909                 rad = 0;
2910                 if (have_flag(flgs, TR_LITE_1) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 1;
2911                 if (have_flag(flgs, TR_LITE_2) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 2;
2912                 if (have_flag(flgs, TR_LITE_3) && o_ptr->name2 != EGO_LITE_DARKNESS)  rad += 3;
2913                 if (have_flag(flgs, TR_LITE_M1)) rad -= 1;
2914                 if (have_flag(flgs, TR_LITE_M2)) rad -= 2;
2915                 if (have_flag(flgs, TR_LITE_M3)) rad -= 3;
2916                 p_ptr->cur_lite += rad;
2917         }
2918
2919         /* max radius is 14 (was 5) without rewriting other code -- */
2920         /* see cave.c:update_lite() and defines.h:LITE_MAX */
2921         if (d_info[dungeon_type].flags1 & DF1_DARKNESS && p_ptr->cur_lite > 1)
2922                 p_ptr->cur_lite = 1;
2923
2924         /*
2925          * check if the player doesn't have light radius, 
2926          * but does weakly glow as an intrinsic.
2927          */
2928         if (p_ptr->cur_lite <= 0 && p_ptr->lite) p_ptr->cur_lite++;
2929
2930         if (p_ptr->cur_lite > 14) p_ptr->cur_lite = 14;
2931         if (p_ptr->cur_lite < 0) p_ptr->cur_lite = 0;
2932
2933         /* end experimental mods */
2934
2935         /* Notice changes in the "lite radius" */
2936         if (p_ptr->old_lite != p_ptr->cur_lite)
2937         {
2938                 /* Update stuff */
2939                 /* Hack -- PU_MON_LITE for monsters' darkness */
2940                 p_ptr->update |= (PU_LITE | PU_MON_LITE | PU_MONSTERS);
2941
2942                 /* Remember the old lite */
2943                 p_ptr->old_lite = p_ptr->cur_lite;
2944
2945                 if ((p_ptr->cur_lite > 0) && (p_ptr->special_defense & NINJA_S_STEALTH))
2946                         set_superstealth(FALSE);
2947         }
2948 }
2949
2950
2951
2952 /*
2953  * Computes current weight limit.
2954  */
2955 u32b weight_limit(void)
2956 {
2957         u32b i;
2958
2959         /* Weight limit based only on strength */
2960         i = (u32b)adj_str_wgt[p_ptr->stat_ind[A_STR]] * 50; /* Constant was 100 */
2961         if (p_ptr->pclass == CLASS_BERSERKER) i = i * 3 / 2;
2962
2963         /* Return the result */
2964         return i;
2965 }
2966
2967
2968 bool buki_motteruka(int i)
2969 {
2970         return ((inventory[i].k_idx && object_is_melee_weapon(&inventory[i])) ? TRUE : FALSE);
2971 }
2972
2973 bool is_heavy_shoot(object_type *o_ptr)
2974 {
2975         int hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
2976         /* It is hard to carholdry a heavy bow */
2977         return (hold < o_ptr->weight / 10);
2978 }
2979
2980 int bow_tval_ammo(object_type *o_ptr)
2981 {
2982         /* Analyze the launcher */
2983         switch (o_ptr->sval)
2984         {
2985                 case SV_SLING:
2986                 {
2987                         return TV_SHOT;
2988                 }
2989
2990                 case SV_SHORT_BOW:
2991                 case SV_LONG_BOW:
2992                 case SV_NAMAKE_BOW:
2993                 {
2994                         return TV_ARROW;
2995                 }
2996
2997                 case SV_LIGHT_XBOW:
2998                 case SV_HEAVY_XBOW:
2999                 {
3000                         return TV_BOLT;
3001                 }
3002                 case SV_CRIMSON:
3003                 {
3004                         return TV_NO_AMMO;
3005                 }
3006         }
3007         
3008         return 0;
3009 }
3010
3011 /* calcurate the fire rate of target object */
3012 s16b calc_num_fire(object_type *o_ptr)
3013 {
3014         int extra_shots = 0;
3015         int i;
3016         int num = 0;
3017         int tval_ammo = bow_tval_ammo(o_ptr);
3018         object_type *q_ptr;
3019         u32b flgs[TR_FLAG_SIZE];
3020         
3021         /* Scan the usable inventory */
3022         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
3023         {
3024                 q_ptr = &inventory[i];
3025
3026                 /* Skip non-objects */
3027                 if (!q_ptr->k_idx) continue;
3028                 
3029                 /* Do not apply current equip */
3030                 if (i == INVEN_BOW) continue;
3031
3032                 /* Extract the item flags */
3033                 object_flags(q_ptr, flgs);
3034
3035                 /* Boost shots */
3036                 if (have_flag(flgs, TR_XTRA_SHOTS)) extra_shots++;
3037         }
3038         
3039         object_flags(o_ptr, flgs);
3040         if (have_flag(flgs, TR_XTRA_SHOTS)) extra_shots++;
3041         
3042         if (o_ptr->k_idx && !is_heavy_shoot(o_ptr))
3043         {
3044                 num = 100;
3045                 /* Extra shots */
3046                 num += (extra_shots * 100);
3047
3048                 /* Hack -- Rangers love Bows */
3049                 if ((p_ptr->pclass == CLASS_RANGER) && 
3050                                         (tval_ammo == TV_ARROW))
3051                 {
3052                         num += (p_ptr->lev * 4);
3053                 }
3054
3055                 if ((p_ptr->pclass == CLASS_CAVALRY) &&
3056                     (tval_ammo == TV_ARROW))
3057                 {
3058                         num += (p_ptr->lev * 3);
3059                 }
3060
3061                 if (p_ptr->pclass == CLASS_ARCHER)
3062                 {
3063                         if (tval_ammo == TV_ARROW)
3064                                 num += ((p_ptr->lev * 5)+50);
3065                         else if ((tval_ammo == TV_BOLT) || (tval_ammo == TV_SHOT))
3066                                 num += (p_ptr->lev * 4);
3067                 }
3068
3069                 /*
3070                  * Addendum -- also "Reward" high level warriors,
3071                  * with _any_ missile weapon -- TY
3072                  */
3073                 if (p_ptr->pclass == CLASS_WARRIOR &&
3074                    (tval_ammo <= TV_BOLT) &&
3075                    (tval_ammo >= TV_SHOT))
3076                 {
3077                         num += (p_ptr->lev * 2);
3078                 }
3079                 if ((p_ptr->pclass == CLASS_ROGUE) &&
3080                     (tval_ammo == TV_SHOT))
3081                 {
3082                         num += (p_ptr->lev * 4);
3083                 }
3084         }
3085         return num;
3086 }
3087
3088 /*
3089  * Calculate the players current "state", taking into account
3090  * not only race/class intrinsics, but also objects being worn
3091  * and temporary spell effects.
3092  *
3093  * See also calc_mana() and calc_hitpoints().
3094  *
3095  * Take note of the new "speed code", in particular, a very strong
3096  * player will start slowing down as soon as he reaches 150 pounds,
3097  * but not until he reaches 450 pounds will he be half as fast as
3098  * a normal kobold.  This both hurts and helps the player, hurts
3099  * because in the old days a player could just avoid 300 pounds,
3100  * and helps because now carrying 300 pounds is not very painful.
3101  *
3102  * The "weapon" and "bow" do *not* add to the bonuses to hit or to
3103  * damage, since that would affect non-combat things.  These values
3104  * are actually added in later, at the appropriate place.
3105  *
3106  * This function induces various "status" messages.
3107  */
3108 void calc_bonuses(void)
3109 {
3110         int             i, j, hold, neutral[2];
3111         int             new_speed;
3112         int             default_hand = 0;
3113         int             empty_hands_status = empty_hands(TRUE);
3114         int             extra_blows[2];
3115         object_type     *o_ptr;
3116         u32b flgs[TR_FLAG_SIZE];
3117         bool            omoi = FALSE;
3118         bool            yoiyami = FALSE;
3119         bool            down_saving = FALSE;
3120 #if 0
3121         bool            have_dd_s = FALSE, have_dd_t = FALSE;
3122 #endif
3123         bool            have_sw = FALSE, have_kabe = FALSE;
3124         bool            easy_2weapon = FALSE;
3125         bool            riding_levitation = FALSE;
3126         s16b this_o_idx, next_o_idx = 0;
3127         const player_race *tmp_rp_ptr;
3128
3129         /* Save the old vision stuff */
3130         bool old_telepathy = p_ptr->telepathy;
3131         bool old_esp_animal = p_ptr->esp_animal;
3132         bool old_esp_undead = p_ptr->esp_undead;
3133         bool old_esp_demon = p_ptr->esp_demon;
3134         bool old_esp_orc = p_ptr->esp_orc;
3135         bool old_esp_troll = p_ptr->esp_troll;
3136         bool old_esp_giant = p_ptr->esp_giant;
3137         bool old_esp_dragon = p_ptr->esp_dragon;
3138         bool old_esp_human = p_ptr->esp_human;
3139         bool old_esp_evil = p_ptr->esp_evil;
3140         bool old_esp_good = p_ptr->esp_good;
3141         bool old_esp_nonliving = p_ptr->esp_nonliving;
3142         bool old_esp_unique = p_ptr->esp_unique;
3143         bool old_see_inv = p_ptr->see_inv;
3144         bool old_mighty_throw = p_ptr->mighty_throw;
3145
3146         /* Save the old armor class */
3147         bool old_dis_ac = p_ptr->dis_ac;
3148         bool old_dis_to_a = p_ptr->dis_to_a;
3149
3150
3151         /* Clear extra blows/shots */
3152         extra_blows[0] = extra_blows[1] = 0;
3153
3154         /* Clear the stat modifiers */
3155         for (i = 0; i < 6; i++) p_ptr->stat_add[i] = 0;
3156
3157
3158         /* Clear the Displayed/Real armor class */
3159         p_ptr->dis_ac = p_ptr->ac = 0;
3160
3161         /* Clear the Displayed/Real Bonuses */
3162         p_ptr->dis_to_h[0] = p_ptr->to_h[0] = 0;
3163         p_ptr->dis_to_h[1] = p_ptr->to_h[1] = 0;
3164         p_ptr->dis_to_d[0] = p_ptr->to_d[0] = 0;
3165         p_ptr->dis_to_d[1] = p_ptr->to_d[1] = 0;
3166         p_ptr->dis_to_h_b = p_ptr->to_h_b = 0;
3167         p_ptr->dis_to_a = p_ptr->to_a = 0;
3168         p_ptr->to_h_m = 0;
3169         p_ptr->to_d_m = 0;
3170
3171         p_ptr->to_m_chance = 0;
3172
3173         /* Clear the Extra Dice Bonuses */
3174         p_ptr->to_dd[0] = p_ptr->to_ds[0] = 0;
3175         p_ptr->to_dd[1] = p_ptr->to_ds[1] = 0;
3176
3177         /* Start with "normal" speed */
3178         new_speed = 110;
3179
3180         /* Start with a single blow per turn */
3181         p_ptr->num_blow[0] = 1;
3182         p_ptr->num_blow[1] = 1;
3183
3184         /* Start with a single shot per turn */
3185         p_ptr->num_fire = 100;
3186
3187         /* Reset the "xtra" tval */
3188         p_ptr->tval_xtra = 0;
3189
3190         /* Reset the "ammo" tval */
3191         p_ptr->tval_ammo = 0;
3192
3193         /* Clear all the flags */
3194         p_ptr->cursed = 0L;
3195         p_ptr->bless_blade = FALSE;
3196         p_ptr->xtra_might = FALSE;
3197         p_ptr->impact[0] = FALSE;
3198         p_ptr->impact[1] = FALSE;
3199         p_ptr->pass_wall = FALSE;
3200         p_ptr->kill_wall = FALSE;
3201         p_ptr->dec_mana = FALSE;
3202         p_ptr->easy_spell = FALSE;
3203         p_ptr->heavy_spell = FALSE;
3204         p_ptr->see_inv = FALSE;
3205         p_ptr->free_act = FALSE;
3206         p_ptr->slow_digest = FALSE;
3207         p_ptr->regenerate = FALSE;
3208         p_ptr->can_swim = FALSE;
3209         p_ptr->levitation = FALSE;
3210         p_ptr->hold_exp = FALSE;
3211         p_ptr->telepathy = FALSE;
3212         p_ptr->esp_animal = FALSE;
3213         p_ptr->esp_undead = FALSE;
3214         p_ptr->esp_demon = FALSE;
3215         p_ptr->esp_orc = FALSE;
3216         p_ptr->esp_troll = FALSE;
3217         p_ptr->esp_giant = FALSE;
3218         p_ptr->esp_dragon = FALSE;
3219         p_ptr->esp_human = FALSE;
3220         p_ptr->esp_evil = FALSE;
3221         p_ptr->esp_good = FALSE;
3222         p_ptr->esp_nonliving = FALSE;
3223         p_ptr->esp_unique = FALSE;
3224         p_ptr->lite = FALSE;
3225         p_ptr->sustain_str = FALSE;
3226         p_ptr->sustain_int = FALSE;
3227         p_ptr->sustain_wis = FALSE;
3228         p_ptr->sustain_con = FALSE;
3229         p_ptr->sustain_dex = FALSE;
3230         p_ptr->sustain_chr = FALSE;
3231         p_ptr->resist_acid = FALSE;
3232         p_ptr->resist_elec = FALSE;
3233         p_ptr->resist_fire = FALSE;
3234         p_ptr->resist_cold = FALSE;
3235         p_ptr->resist_pois = FALSE;
3236         p_ptr->resist_conf = FALSE;
3237         p_ptr->resist_sound = FALSE;
3238         p_ptr->resist_lite = FALSE;
3239         p_ptr->resist_dark = FALSE;
3240         p_ptr->resist_chaos = FALSE;
3241         p_ptr->resist_disen = FALSE;
3242         p_ptr->resist_shard = FALSE;
3243         p_ptr->resist_nexus = FALSE;
3244         p_ptr->resist_blind = FALSE;
3245         p_ptr->resist_neth = FALSE;
3246         p_ptr->resist_time = FALSE;
3247         p_ptr->resist_fear = FALSE;
3248         p_ptr->reflect = FALSE;
3249         p_ptr->sh_fire = FALSE;
3250         p_ptr->sh_elec = FALSE;
3251         p_ptr->sh_cold = FALSE;
3252         p_ptr->anti_magic = FALSE;
3253         p_ptr->anti_tele = FALSE;
3254         p_ptr->warning = FALSE;
3255         p_ptr->mighty_throw = FALSE;
3256         p_ptr->see_nocto = FALSE;
3257
3258         p_ptr->immune_acid = FALSE;
3259         p_ptr->immune_elec = FALSE;
3260         p_ptr->immune_fire = FALSE;
3261         p_ptr->immune_cold = FALSE;
3262
3263         p_ptr->ryoute = FALSE;
3264         p_ptr->migite = FALSE;
3265         p_ptr->hidarite = FALSE;
3266         p_ptr->no_flowed = FALSE;
3267
3268         p_ptr->align = friend_align;
3269
3270         if (p_ptr->mimic_form) tmp_rp_ptr = &mimic_info[p_ptr->mimic_form];
3271         else tmp_rp_ptr = &race_info[p_ptr->prace];
3272
3273         /* Base infravision (purely racial) */
3274         p_ptr->see_infra = tmp_rp_ptr->infra;
3275
3276         /* Base skill -- disarming */
3277         p_ptr->skill_dis = tmp_rp_ptr->r_dis + cp_ptr->c_dis + ap_ptr->a_dis;
3278
3279         /* Base skill -- magic devices */
3280         p_ptr->skill_dev = tmp_rp_ptr->r_dev + cp_ptr->c_dev + ap_ptr->a_dev;
3281
3282         /* Base skill -- saving throw */
3283         p_ptr->skill_sav = tmp_rp_ptr->r_sav + cp_ptr->c_sav + ap_ptr->a_sav;
3284
3285         /* Base skill -- stealth */
3286         p_ptr->skill_stl = tmp_rp_ptr->r_stl + cp_ptr->c_stl + ap_ptr->a_stl;
3287
3288         /* Base skill -- searching ability */
3289         p_ptr->skill_srh = tmp_rp_ptr->r_srh + cp_ptr->c_srh + ap_ptr->a_srh;
3290
3291         /* Base skill -- searching frequency */
3292         p_ptr->skill_fos = tmp_rp_ptr->r_fos + cp_ptr->c_fos + ap_ptr->a_fos;
3293
3294         /* Base skill -- combat (normal) */
3295         p_ptr->skill_thn = tmp_rp_ptr->r_thn + cp_ptr->c_thn + ap_ptr->a_thn;
3296
3297         /* Base skill -- combat (shooting) */
3298         p_ptr->skill_thb = tmp_rp_ptr->r_thb + cp_ptr->c_thb + ap_ptr->a_thb;
3299
3300         /* Base skill -- combat (throwing) */
3301         p_ptr->skill_tht = tmp_rp_ptr->r_thb + cp_ptr->c_thb + ap_ptr->a_thb;
3302
3303         /* Base skill -- digging */
3304         p_ptr->skill_dig = 0;
3305
3306         if (buki_motteruka(INVEN_RARM)) p_ptr->migite = TRUE;
3307         if (buki_motteruka(INVEN_LARM))
3308         {
3309                 p_ptr->hidarite = TRUE;
3310                 if (!p_ptr->migite) default_hand = 1;
3311         }
3312
3313         if (CAN_TWO_HANDS_WIELDING())
3314         {
3315                 if (p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
3316                         object_allow_two_hands_wielding(&inventory[INVEN_RARM]))
3317                 {
3318                         p_ptr->ryoute = TRUE;
3319                 }
3320                 else if (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
3321                         object_allow_two_hands_wielding(&inventory[INVEN_LARM]))
3322                 {
3323                         p_ptr->ryoute = TRUE;
3324                 }
3325                 else
3326                 {
3327                         switch (p_ptr->pclass)
3328                         {
3329                         case CLASS_MONK:
3330                         case CLASS_FORCETRAINER:
3331                         case CLASS_BERSERKER:
3332                                 if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
3333                                 {
3334                                         p_ptr->migite = TRUE;
3335                                         p_ptr->ryoute = TRUE;
3336                                 }
3337                                 break;
3338                         }
3339                 }
3340         }
3341
3342         if (!p_ptr->migite && !p_ptr->hidarite)
3343         {
3344                 if (empty_hands_status & EMPTY_HAND_RARM) p_ptr->migite = TRUE;
3345                 else if (empty_hands_status == EMPTY_HAND_LARM)
3346                 {
3347                         p_ptr->hidarite = TRUE;
3348                         default_hand = 1;
3349                 }
3350         }
3351
3352         if (p_ptr->special_defense & KAMAE_MASK)
3353         {
3354                 if (!(empty_hands_status & EMPTY_HAND_RARM))
3355                 {
3356                         set_action(ACTION_NONE);
3357                 }
3358         }
3359
3360         switch (p_ptr->pclass)
3361         {
3362                 case CLASS_WARRIOR:
3363                         if (p_ptr->lev > 29) p_ptr->resist_fear = TRUE;
3364                         if (p_ptr->lev > 44) p_ptr->regenerate = TRUE;
3365                         break;
3366                 case CLASS_PALADIN:
3367                         if (p_ptr->lev > 39) p_ptr->resist_fear = TRUE;
3368                         break;
3369                 case CLASS_CHAOS_WARRIOR:
3370                         if (p_ptr->lev > 29) p_ptr->resist_chaos = TRUE;
3371                         if (p_ptr->lev > 39) p_ptr->resist_fear = TRUE;
3372                         break;
3373                 case CLASS_MINDCRAFTER:
3374                         if (p_ptr->lev >  9) p_ptr->resist_fear = TRUE;
3375                         if (p_ptr->lev > 19) p_ptr->sustain_wis = TRUE;
3376                         if (p_ptr->lev > 29) p_ptr->resist_conf = TRUE;
3377                         if (p_ptr->lev > 39) p_ptr->telepathy = TRUE;
3378                         break;
3379                 case CLASS_MONK:
3380                 case CLASS_FORCETRAINER:
3381                         /* Unencumbered Monks become faster every 10 levels */
3382                         if (!(heavy_armor()))
3383                         {
3384                                 if (!(prace_is_(RACE_KLACKON) ||
3385                                       prace_is_(RACE_SPRITE) ||
3386                                       (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)))
3387                                         new_speed += (p_ptr->lev) / 10;
3388
3389                                 /* Free action if unencumbered at level 25 */
3390                                 if  (p_ptr->lev > 24)
3391                                         p_ptr->free_act = TRUE;
3392                         }
3393                         break;
3394                 case CLASS_SORCERER:
3395                         p_ptr->to_a -= 50;
3396                         p_ptr->dis_to_a -= 50;
3397                         break;
3398                 case CLASS_BARD:
3399                         p_ptr->resist_sound = TRUE;
3400                         break;
3401                 case CLASS_SAMURAI:
3402                         if (p_ptr->lev > 29) p_ptr->resist_fear = TRUE;
3403                         break;
3404                 case CLASS_BERSERKER:
3405                         p_ptr->shero = 1;
3406                         p_ptr->sustain_str = TRUE;
3407                         p_ptr->sustain_dex = TRUE;
3408                         p_ptr->sustain_con = TRUE;
3409                         p_ptr->regenerate = TRUE;
3410                         p_ptr->free_act = TRUE;
3411                         new_speed += 2;
3412                         if (p_ptr->lev > 29) new_speed++;
3413                         if (p_ptr->lev > 39) new_speed++;
3414                         if (p_ptr->lev > 44) new_speed++;
3415                         if (p_ptr->lev > 49) new_speed++;
3416                         p_ptr->to_a += 10+p_ptr->lev/2;
3417                         p_ptr->dis_to_a += 10+p_ptr->lev/2;
3418                         p_ptr->skill_dig += (100+p_ptr->lev*8);
3419                         if (p_ptr->lev > 39) p_ptr->reflect = TRUE;
3420                         p_ptr->redraw |= PR_STATUS;
3421                         break;
3422                 case CLASS_MIRROR_MASTER:
3423                         if (p_ptr->lev > 39) p_ptr->reflect = TRUE;
3424                         break;
3425                 case CLASS_NINJA:
3426                         /* Unencumbered Ninjas become faster every 10 levels */
3427                         if (heavy_armor())
3428                         {
3429                                 new_speed -= (p_ptr->lev) / 10;
3430                                 p_ptr->skill_stl -= (p_ptr->lev)/10;
3431                         }
3432                         else if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
3433                                  (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
3434                         {
3435                                 new_speed += 3;
3436                                 if (!(prace_is_(RACE_KLACKON) ||
3437                                       prace_is_(RACE_SPRITE) ||
3438                                       (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)))
3439                                         new_speed += (p_ptr->lev) / 10;
3440                                 p_ptr->skill_stl += (p_ptr->lev)/10;
3441
3442                                 /* Free action if unencumbered at level 25 */
3443                                 if  (p_ptr->lev > 24)
3444                                         p_ptr->free_act = TRUE;
3445                         }
3446                         if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
3447                             (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
3448                         {
3449                                 p_ptr->to_a += p_ptr->lev/2+5;
3450                                 p_ptr->dis_to_a += p_ptr->lev/2+5;
3451                         }
3452                         p_ptr->slow_digest = TRUE;
3453                         p_ptr->resist_fear = TRUE;
3454                         if (p_ptr->lev > 19) p_ptr->resist_pois = TRUE;
3455                         if (p_ptr->lev > 24) p_ptr->sustain_dex = TRUE;
3456                         if (p_ptr->lev > 29) p_ptr->see_inv = TRUE;
3457                         if (p_ptr->lev > 44)
3458                         {
3459                                 p_ptr->oppose_pois = 1;
3460                                 p_ptr->redraw |= PR_STATUS;
3461                         }
3462                         p_ptr->see_nocto = TRUE;
3463                         break;
3464         }
3465
3466         /***** Races ****/
3467         if (p_ptr->mimic_form)
3468         {
3469                 switch (p_ptr->mimic_form)
3470                 {
3471                 case MIMIC_DEMON:
3472                         p_ptr->hold_exp = TRUE;
3473                         p_ptr->resist_chaos = TRUE;
3474                         p_ptr->resist_neth = TRUE;
3475                         p_ptr->resist_fire = TRUE;
3476                         p_ptr->oppose_fire = 1;
3477                         p_ptr->see_inv=TRUE;
3478                         new_speed += 3;
3479                         p_ptr->redraw |= PR_STATUS;
3480                         p_ptr->to_a += 10;
3481                         p_ptr->dis_to_a += 10;
3482                         p_ptr->align -= 200;
3483                         break;
3484                 case MIMIC_DEMON_LORD:
3485                         p_ptr->hold_exp = TRUE;
3486                         p_ptr->resist_chaos = TRUE;
3487                         p_ptr->resist_neth = TRUE;
3488                         p_ptr->immune_fire = TRUE;
3489                         p_ptr->resist_acid = TRUE;
3490                         p_ptr->resist_fire = TRUE;
3491                         p_ptr->resist_cold = TRUE;
3492                         p_ptr->resist_elec = TRUE;
3493                         p_ptr->resist_pois = TRUE;
3494                         p_ptr->resist_conf = TRUE;
3495                         p_ptr->resist_disen = TRUE;
3496                         p_ptr->resist_nexus = TRUE;
3497                         p_ptr->resist_fear = TRUE;
3498                         p_ptr->sh_fire = TRUE;
3499                         p_ptr->see_inv = TRUE;
3500                         p_ptr->telepathy = TRUE;
3501                         p_ptr->levitation = TRUE;
3502                         p_ptr->kill_wall = TRUE;
3503                         new_speed += 5;
3504                         p_ptr->to_a += 20;
3505                         p_ptr->dis_to_a += 20;
3506                         p_ptr->align -= 200;
3507                         break;
3508                 case MIMIC_VAMPIRE:
3509                         p_ptr->resist_dark = TRUE;
3510                         p_ptr->hold_exp = TRUE;
3511                         p_ptr->resist_neth = TRUE;
3512                         p_ptr->resist_cold = TRUE;
3513                         p_ptr->resist_pois = TRUE;
3514                         p_ptr->see_inv = TRUE;
3515                         new_speed += 3;
3516                         p_ptr->to_a += 10;
3517                         p_ptr->dis_to_a += 10;
3518                         if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
3519                         break;
3520                 }
3521         }
3522         else
3523         {
3524                 switch (p_ptr->prace)
3525                 {
3526                 case RACE_ELF:
3527                         p_ptr->resist_lite = TRUE;
3528                         break;
3529                 case RACE_HOBBIT:
3530                         p_ptr->hold_exp = TRUE;
3531                         break;
3532                 case RACE_GNOME:
3533                         p_ptr->free_act = TRUE;
3534                         break;
3535                 case RACE_DWARF:
3536                         p_ptr->resist_blind = TRUE;
3537                         break;
3538                 case RACE_HALF_ORC:
3539                         p_ptr->resist_dark = TRUE;
3540                         break;
3541                 case RACE_HALF_TROLL:
3542                         p_ptr->sustain_str = TRUE;
3543
3544                         if (p_ptr->lev > 14)
3545                         {
3546                                 /* High level trolls heal fast... */
3547                                 p_ptr->regenerate = TRUE;
3548
3549                                 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_BERSERKER)
3550                                 {
3551                                         p_ptr->slow_digest = TRUE;
3552                                         /* Let's not make Regeneration
3553                                          * a disadvantage for the poor warriors who can
3554                                          * never learn a spell that satisfies hunger (actually
3555                                          * neither can rogues, but half-trolls are not
3556                                          * supposed to play rogues) */
3557                                 }
3558                         }
3559                         break;
3560                 case RACE_AMBERITE:
3561                         p_ptr->sustain_con = TRUE;
3562                         p_ptr->regenerate = TRUE;  /* Amberites heal fast... */
3563                         break;
3564                 case RACE_HIGH_ELF:
3565                         p_ptr->resist_lite = TRUE;
3566                         p_ptr->see_inv = TRUE;
3567                         break;
3568                 case RACE_BARBARIAN:
3569                         p_ptr->resist_fear = TRUE;
3570                         break;
3571                 case RACE_HALF_OGRE:
3572                         p_ptr->resist_dark = TRUE;
3573                         p_ptr->sustain_str = TRUE;
3574                         break;
3575                 case RACE_HALF_GIANT:
3576                         p_ptr->sustain_str = TRUE;
3577                         p_ptr->resist_shard = TRUE;
3578                         break;
3579                 case RACE_HALF_TITAN:
3580                         p_ptr->resist_chaos = TRUE;
3581                         break;
3582                 case RACE_CYCLOPS:
3583                         p_ptr->resist_sound = TRUE;
3584                         break;
3585                 case RACE_YEEK:
3586                         p_ptr->resist_acid = TRUE;
3587                         if (p_ptr->lev > 19) p_ptr->immune_acid = TRUE;
3588                         break;
3589                 case RACE_KLACKON:
3590                         p_ptr->resist_conf = TRUE;
3591                         p_ptr->resist_acid = TRUE;
3592
3593                         /* Klackons become faster */
3594                         new_speed += (p_ptr->lev) / 10;
3595                         break;
3596                 case RACE_KOBOLD:
3597                         p_ptr->resist_pois = TRUE;
3598                         break;
3599                 case RACE_NIBELUNG:
3600                         p_ptr->resist_disen = TRUE;
3601                         p_ptr->resist_dark = TRUE;
3602                         break;
3603                 case RACE_DARK_ELF:
3604                         p_ptr->resist_dark = TRUE;
3605                         if (p_ptr->lev > 19) p_ptr->see_inv = TRUE;
3606                         break;
3607                 case RACE_DRACONIAN:
3608                         p_ptr->levitation = TRUE;
3609                         if (p_ptr->lev >  4) p_ptr->resist_fire = TRUE;
3610                         if (p_ptr->lev >  9) p_ptr->resist_cold = TRUE;
3611                         if (p_ptr->lev > 14) p_ptr->resist_acid = TRUE;
3612                         if (p_ptr->lev > 19) p_ptr->resist_elec = TRUE;
3613                         if (p_ptr->lev > 34) p_ptr->resist_pois = TRUE;
3614                         break;
3615                 case RACE_MIND_FLAYER:
3616                         p_ptr->sustain_int = TRUE;
3617                         p_ptr->sustain_wis = TRUE;
3618                         if (p_ptr->lev > 14) p_ptr->see_inv = TRUE;
3619                         if (p_ptr->lev > 29) p_ptr->telepathy = TRUE;
3620                         break;
3621                 case RACE_IMP:
3622                         p_ptr->resist_fire = TRUE;
3623                         if (p_ptr->lev > 9) p_ptr->see_inv = TRUE;
3624                         break;
3625                 case RACE_GOLEM:
3626                         p_ptr->slow_digest = TRUE;
3627                         p_ptr->free_act = TRUE;
3628                         p_ptr->see_inv = TRUE;
3629                         p_ptr->resist_pois = TRUE;
3630                         if (p_ptr->lev > 34) p_ptr->hold_exp = TRUE;
3631                         break;
3632                 case RACE_SKELETON:
3633                         p_ptr->resist_shard = TRUE;
3634                         p_ptr->hold_exp = TRUE;
3635                         p_ptr->see_inv = TRUE;
3636                         p_ptr->resist_pois = TRUE;
3637                         if (p_ptr->lev > 9) p_ptr->resist_cold = TRUE;
3638                         break;
3639                 case RACE_ZOMBIE:
3640                         p_ptr->resist_neth = TRUE;
3641                         p_ptr->hold_exp = TRUE;
3642                         p_ptr->see_inv = TRUE;
3643                         p_ptr->resist_pois = TRUE;
3644                         p_ptr->slow_digest = TRUE;
3645                         if (p_ptr->lev > 4) p_ptr->resist_cold = TRUE;
3646                         break;
3647                 case RACE_VAMPIRE:
3648                         p_ptr->resist_dark = TRUE;
3649                         p_ptr->hold_exp = TRUE;
3650                         p_ptr->resist_neth = TRUE;
3651                         p_ptr->resist_cold = TRUE;
3652                         p_ptr->resist_pois = TRUE;
3653                         if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
3654                         break;
3655                 case RACE_SPECTRE:
3656                         p_ptr->levitation = TRUE;
3657                         p_ptr->free_act = TRUE;
3658                         p_ptr->resist_neth = TRUE;
3659                         p_ptr->hold_exp = TRUE;
3660                         p_ptr->see_inv = TRUE;
3661                         p_ptr->resist_pois = TRUE;
3662                         p_ptr->slow_digest = TRUE;
3663                         p_ptr->resist_cold = TRUE;
3664                         p_ptr->pass_wall = TRUE;
3665                         if (p_ptr->lev > 34) p_ptr->telepathy = TRUE;
3666                         break;
3667                 case RACE_SPRITE:
3668                         p_ptr->levitation = TRUE;
3669                         p_ptr->resist_lite = TRUE;
3670
3671                         /* Sprites become faster */
3672                         new_speed += (p_ptr->lev) / 10;
3673                         break;
3674                 case RACE_BEASTMAN:
3675                         p_ptr->resist_conf  = TRUE;
3676                         p_ptr->resist_sound = TRUE;
3677                         break;
3678                 case RACE_ENT:
3679                         /* Ents dig like maniacs, but only with their hands. */
3680                         if (!inventory[INVEN_RARM].k_idx) 
3681                                 p_ptr->skill_dig += p_ptr->lev * 10;
3682                         /* Ents get tougher and stronger as they age, but lose dexterity. */
3683                         if (p_ptr->lev > 25) p_ptr->stat_add[A_STR]++;
3684                         if (p_ptr->lev > 40) p_ptr->stat_add[A_STR]++;
3685                         if (p_ptr->lev > 45) p_ptr->stat_add[A_STR]++;
3686
3687                         if (p_ptr->lev > 25) p_ptr->stat_add[A_DEX]--;
3688                         if (p_ptr->lev > 40) p_ptr->stat_add[A_DEX]--;
3689                         if (p_ptr->lev > 45) p_ptr->stat_add[A_DEX]--;
3690
3691                         if (p_ptr->lev > 25) p_ptr->stat_add[A_CON]++;
3692                         if (p_ptr->lev > 40) p_ptr->stat_add[A_CON]++;
3693                         if (p_ptr->lev > 45) p_ptr->stat_add[A_CON]++;
3694                         break;
3695                 case RACE_ANGEL:
3696                         p_ptr->levitation = TRUE;
3697                         p_ptr->see_inv = TRUE;
3698                         p_ptr->align += 200;
3699                         break;
3700                 case RACE_DEMON:
3701                         p_ptr->resist_fire  = TRUE;
3702                         p_ptr->resist_neth  = TRUE;
3703                         p_ptr->hold_exp = TRUE;
3704                         if (p_ptr->lev > 9) p_ptr->see_inv = TRUE;
3705                         if (p_ptr->lev > 44)
3706                         {
3707                                 p_ptr->oppose_fire = 1;
3708                                 p_ptr->redraw |= PR_STATUS;
3709                         }
3710                         p_ptr->align -= 200;
3711                         break;
3712                 case RACE_DUNADAN:
3713                         p_ptr->sustain_con = TRUE;
3714                         break;
3715                 case RACE_S_FAIRY:
3716                         p_ptr->levitation = TRUE;
3717                         break;
3718                 case RACE_KUTAR:
3719                         p_ptr->resist_conf = TRUE;
3720                         break;
3721                 case RACE_ANDROID:
3722                         p_ptr->slow_digest = TRUE;
3723                         p_ptr->free_act = TRUE;
3724                         p_ptr->resist_pois = TRUE;
3725                         p_ptr->hold_exp = TRUE;
3726                         break;
3727                 default:
3728                         /* Do nothing */
3729                         ;
3730                 }
3731         }
3732
3733         if (p_ptr->ult_res || (p_ptr->special_defense & KATA_MUSOU))
3734         {
3735                 p_ptr->see_inv = TRUE;
3736                 p_ptr->free_act = TRUE;
3737                 p_ptr->slow_digest = TRUE;
3738                 p_ptr->regenerate = TRUE;
3739                 p_ptr->levitation = TRUE;
3740                 p_ptr->hold_exp = TRUE;
3741                 p_ptr->telepathy = TRUE;
3742                 p_ptr->lite = TRUE;
3743                 p_ptr->sustain_str = TRUE;
3744                 p_ptr->sustain_int = TRUE;
3745                 p_ptr->sustain_wis = TRUE;
3746                 p_ptr->sustain_con = TRUE;
3747                 p_ptr->sustain_dex = TRUE;
3748                 p_ptr->sustain_chr = TRUE;
3749                 p_ptr->resist_acid = TRUE;
3750                 p_ptr->resist_elec = TRUE;
3751                 p_ptr->resist_fire = TRUE;
3752                 p_ptr->resist_cold = TRUE;
3753                 p_ptr->resist_pois = TRUE;
3754                 p_ptr->resist_conf = TRUE;
3755                 p_ptr->resist_sound = TRUE;
3756                 p_ptr->resist_lite = TRUE;
3757                 p_ptr->resist_dark = TRUE;
3758                 p_ptr->resist_chaos = TRUE;
3759                 p_ptr->resist_disen = TRUE;
3760                 p_ptr->resist_shard = TRUE;
3761                 p_ptr->resist_nexus = TRUE;
3762                 p_ptr->resist_blind = TRUE;
3763                 p_ptr->resist_neth = TRUE;
3764                 p_ptr->resist_fear = TRUE;
3765                 p_ptr->reflect = TRUE;
3766                 p_ptr->sh_fire = TRUE;
3767                 p_ptr->sh_elec = TRUE;
3768                 p_ptr->sh_cold = TRUE;
3769                 p_ptr->to_a += 100;
3770                 p_ptr->dis_to_a += 100;
3771         }
3772         /* Temporary shield */
3773         else if (p_ptr->tsubureru || p_ptr->shield || p_ptr->magicdef)
3774         {
3775                 p_ptr->to_a += 50;
3776                 p_ptr->dis_to_a += 50;
3777         }
3778
3779         if (p_ptr->tim_res_nether)
3780         {
3781                 p_ptr->resist_neth = TRUE;
3782         }
3783         if (p_ptr->tim_sh_fire)
3784         {
3785                 p_ptr->sh_fire = TRUE;
3786         }
3787         if (p_ptr->tim_res_time)
3788         {
3789                 p_ptr->resist_time = TRUE;
3790         }
3791
3792         /* Sexy Gal */
3793         if (p_ptr->pseikaku == SEIKAKU_SEXY) p_ptr->cursed |= (TRC_AGGRAVATE);
3794         if (p_ptr->pseikaku == SEIKAKU_NAMAKE) p_ptr->to_m_chance += 10;
3795         if (p_ptr->pseikaku == SEIKAKU_KIREMONO) p_ptr->to_m_chance -= 3;
3796         if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) p_ptr->to_m_chance++;
3797
3798         /* Lucky man */
3799         if (p_ptr->pseikaku == SEIKAKU_LUCKY) p_ptr->muta3 |= MUT3_GOOD_LUCK;
3800
3801         if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)
3802         {
3803                 p_ptr->resist_blind = TRUE;
3804                 p_ptr->resist_conf  = TRUE;
3805                 p_ptr->hold_exp = TRUE;
3806                 if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
3807
3808                 if ((p_ptr->prace != RACE_KLACKON) && (p_ptr->prace != RACE_SPRITE))
3809                         /* Munchkin become faster */
3810                         new_speed += (p_ptr->lev) / 10 + 5;
3811         }
3812
3813         if (music_singing(MUSIC_WALL))
3814         {
3815                 p_ptr->kill_wall = TRUE;
3816         }
3817
3818         /* Hack -- apply racial/class stat maxes */
3819         /* Apply the racial modifiers */
3820         for (i = 0; i < 6; i++)
3821         {
3822                 /* Modify the stats for "race" */
3823                 p_ptr->stat_add[i] += (tmp_rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i]);
3824         }
3825
3826
3827         /* I'm adding the mutations here for the lack of a better place... */
3828         if (p_ptr->muta3)
3829         {
3830                 /* Hyper Strength */
3831                 if (p_ptr->muta3 & MUT3_HYPER_STR)
3832                 {
3833                         p_ptr->stat_add[A_STR] += 4;
3834                 }
3835
3836                 /* Puny */
3837                 if (p_ptr->muta3 & MUT3_PUNY)
3838                 {
3839                         p_ptr->stat_add[A_STR] -= 4;
3840                 }
3841
3842                 /* Living computer */
3843                 if (p_ptr->muta3 & MUT3_HYPER_INT)
3844                 {
3845                         p_ptr->stat_add[A_INT] += 4;
3846                         p_ptr->stat_add[A_WIS] += 4;
3847                 }
3848
3849                 /* Moronic */
3850                 if (p_ptr->muta3 & MUT3_MORONIC)
3851                 {
3852                         p_ptr->stat_add[A_INT] -= 4;
3853                         p_ptr->stat_add[A_WIS] -= 4;
3854                 }
3855
3856                 if (p_ptr->muta3 & MUT3_RESILIENT)
3857                 {
3858                         p_ptr->stat_add[A_CON] += 4;
3859                 }
3860
3861                 if (p_ptr->muta3 & MUT3_XTRA_FAT)
3862                 {
3863                         p_ptr->stat_add[A_CON] += 2;
3864                         new_speed -= 2;
3865                 }
3866
3867                 if (p_ptr->muta3 & MUT3_ALBINO)
3868                 {
3869                         p_ptr->stat_add[A_CON] -= 4;
3870                 }
3871
3872                 if (p_ptr->muta3 & MUT3_FLESH_ROT)
3873                 {
3874                         p_ptr->stat_add[A_CON] -= 2;
3875                         p_ptr->stat_add[A_CHR] -= 1;
3876                         p_ptr->regenerate = FALSE;
3877                         /* Cancel innate regeneration */
3878                 }
3879
3880                 if (p_ptr->muta3 & MUT3_SILLY_VOI)
3881                 {
3882                         p_ptr->stat_add[A_CHR] -= 4;
3883                 }
3884
3885                 if (p_ptr->muta3 & MUT3_BLANK_FAC)
3886                 {
3887                         p_ptr->stat_add[A_CHR] -= 1;
3888                 }
3889
3890                 if (p_ptr->muta3 & MUT3_XTRA_EYES)
3891                 {
3892                         p_ptr->skill_fos += 15;
3893                         p_ptr->skill_srh += 15;
3894                 }
3895
3896                 if (p_ptr->muta3 & MUT3_MAGIC_RES)
3897                 {
3898                         p_ptr->skill_sav += (15 + (p_ptr->lev / 5));
3899                 }
3900
3901                 if (p_ptr->muta3 & MUT3_XTRA_NOIS)
3902                 {
3903                         p_ptr->skill_stl -= 3;
3904                 }
3905
3906                 if (p_ptr->muta3 & MUT3_INFRAVIS)
3907                 {
3908                         p_ptr->see_infra += 3;
3909                 }
3910
3911                 if (p_ptr->muta3 & MUT3_XTRA_LEGS)
3912                 {
3913                         new_speed += 3;
3914                 }
3915
3916                 if (p_ptr->muta3 & MUT3_SHORT_LEG)
3917                 {
3918                         new_speed -= 3;
3919                 }
3920
3921                 if (p_ptr->muta3 & MUT3_ELEC_TOUC)
3922                 {
3923                         p_ptr->sh_elec = TRUE;
3924                 }
3925
3926                 if (p_ptr->muta3 & MUT3_FIRE_BODY)
3927                 {
3928                         p_ptr->sh_fire = TRUE;
3929                         p_ptr->lite = TRUE;
3930                 }
3931
3932                 if (p_ptr->muta3 & MUT3_WART_SKIN)
3933                 {
3934                         p_ptr->stat_add[A_CHR] -= 2;
3935                         p_ptr->to_a += 5;
3936                         p_ptr->dis_to_a += 5;
3937                 }
3938
3939                 if (p_ptr->muta3 & MUT3_SCALES)
3940                 {
3941                         p_ptr->stat_add[A_CHR] -= 1;
3942                         p_ptr->to_a += 10;
3943                         p_ptr->dis_to_a += 10;
3944                 }
3945
3946                 if (p_ptr->muta3 & MUT3_IRON_SKIN)
3947                 {
3948                         p_ptr->stat_add[A_DEX] -= 1;
3949                         p_ptr->to_a += 25;
3950                         p_ptr->dis_to_a += 25;
3951                 }
3952
3953                 if (p_ptr->muta3 & MUT3_WINGS)
3954                 {
3955                         p_ptr->levitation = TRUE;
3956                 }
3957
3958                 if (p_ptr->muta3 & MUT3_FEARLESS)
3959                 {
3960                         p_ptr->resist_fear = TRUE;
3961                 }
3962
3963                 if (p_ptr->muta3 & MUT3_REGEN)
3964                 {
3965                         p_ptr->regenerate = TRUE;
3966                 }
3967
3968                 if (p_ptr->muta3 & MUT3_ESP)
3969                 {
3970                         p_ptr->telepathy = TRUE;
3971                 }
3972
3973                 if (p_ptr->muta3 & MUT3_LIMBER)
3974                 {
3975                         p_ptr->stat_add[A_DEX] += 3;
3976                 }
3977
3978                 if (p_ptr->muta3 & MUT3_ARTHRITIS)
3979                 {
3980                         p_ptr->stat_add[A_DEX] -= 3;
3981                 }
3982
3983                 if (p_ptr->muta3 & MUT3_MOTION)
3984                 {
3985                         p_ptr->free_act = TRUE;
3986                         p_ptr->skill_stl += 1;
3987                 }
3988
3989                 if (p_ptr->muta3 & MUT3_ILL_NORM)
3990                 {
3991                         p_ptr->stat_add[A_CHR] = 0;
3992                 }
3993         }
3994
3995         if (p_ptr->tsuyoshi)
3996         {
3997                 p_ptr->stat_add[A_STR] += 4;
3998                 p_ptr->stat_add[A_CON] += 4;
3999         }
4000
4001         /* Scan the usable inventory */
4002         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4003         {
4004                 int bonus_to_h, bonus_to_d;
4005                 o_ptr = &inventory[i];
4006
4007                 /* Skip non-objects */
4008                 if (!o_ptr->k_idx) continue;
4009
4010                 /* Extract the item flags */
4011                 object_flags(o_ptr, flgs);
4012
4013                 p_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
4014                 if (o_ptr->name1 == ART_CHAINSWORD) p_ptr->cursed |= TRC_CHAINSWORD;
4015
4016                 /* Affect stats */
4017                 if (have_flag(flgs, TR_STR)) p_ptr->stat_add[A_STR] += o_ptr->pval;
4018                 if (have_flag(flgs, TR_INT)) p_ptr->stat_add[A_INT] += o_ptr->pval;
4019                 if (have_flag(flgs, TR_WIS)) p_ptr->stat_add[A_WIS] += o_ptr->pval;
4020                 if (have_flag(flgs, TR_DEX)) p_ptr->stat_add[A_DEX] += o_ptr->pval;
4021                 if (have_flag(flgs, TR_CON)) p_ptr->stat_add[A_CON] += o_ptr->pval;
4022                 if (have_flag(flgs, TR_CHR)) p_ptr->stat_add[A_CHR] += o_ptr->pval;
4023
4024                 if (have_flag(flgs, TR_MAGIC_MASTERY))    p_ptr->skill_dev += 8*o_ptr->pval;
4025
4026                 /* Affect stealth */
4027                 if (have_flag(flgs, TR_STEALTH)) p_ptr->skill_stl += o_ptr->pval;
4028
4029                 /* Affect searching ability (factor of five) */
4030                 if (have_flag(flgs, TR_SEARCH)) p_ptr->skill_srh += (o_ptr->pval * 5);
4031
4032                 /* Affect searching frequency (factor of five) */
4033                 if (have_flag(flgs, TR_SEARCH)) p_ptr->skill_fos += (o_ptr->pval * 5);
4034
4035                 /* Affect infravision */
4036                 if (have_flag(flgs, TR_INFRA)) p_ptr->see_infra += o_ptr->pval;
4037
4038                 /* Affect digging (factor of 20) */
4039                 if (have_flag(flgs, TR_TUNNEL)) p_ptr->skill_dig += (o_ptr->pval * 20);
4040
4041                 /* Affect speed */
4042                 if (have_flag(flgs, TR_SPEED)) new_speed += o_ptr->pval;
4043
4044                 /* Affect blows */
4045                 if (have_flag(flgs, TR_BLOWS))
4046                 {
4047                         if((i == INVEN_RARM || i == INVEN_RIGHT) && !p_ptr->ryoute) extra_blows[0] += o_ptr->pval;
4048                         else if((i == INVEN_LARM || i == INVEN_LEFT) && !p_ptr->ryoute) extra_blows[1] += o_ptr->pval;
4049                         else {extra_blows[0] += o_ptr->pval; extra_blows[1] += o_ptr->pval;}
4050                 }
4051
4052                 /* Hack -- cause earthquakes */
4053                 if (have_flag(flgs, TR_IMPACT)) p_ptr->impact[(i == INVEN_RARM) ? 0 : 1] = TRUE;
4054
4055                 /* Various flags */
4056                 if (have_flag(flgs, TR_AGGRAVATE))   p_ptr->cursed |= TRC_AGGRAVATE;
4057                 if (have_flag(flgs, TR_DRAIN_EXP))   p_ptr->cursed |= TRC_DRAIN_EXP;
4058                 if (have_flag(flgs, TR_TY_CURSE))    p_ptr->cursed |= TRC_TY_CURSE;
4059                 if (have_flag(flgs, TR_ADD_L_CURSE)) p_ptr->cursed |= TRC_ADD_L_CURSE;
4060                 if (have_flag(flgs, TR_ADD_H_CURSE)) p_ptr->cursed |= TRC_ADD_H_CURSE;
4061                 if (have_flag(flgs, TR_DRAIN_HP))    p_ptr->cursed |= TRC_DRAIN_HP;
4062                 if (have_flag(flgs, TR_DRAIN_MANA))  p_ptr->cursed |= TRC_DRAIN_MANA;
4063                 if (have_flag(flgs, TR_CALL_ANIMAL)) p_ptr->cursed |= TRC_CALL_ANIMAL;
4064                 if (have_flag(flgs, TR_CALL_DEMON))  p_ptr->cursed |= TRC_CALL_DEMON;
4065                 if (have_flag(flgs, TR_CALL_DRAGON)) p_ptr->cursed |= TRC_CALL_DRAGON;
4066                 if (have_flag(flgs, TR_CALL_UNDEAD)) p_ptr->cursed |= TRC_CALL_UNDEAD;
4067                 if (have_flag(flgs, TR_COWARDICE))   p_ptr->cursed |= TRC_COWARDICE;
4068                 if (have_flag(flgs, TR_LOW_MELEE))   p_ptr->cursed |= TRC_LOW_MELEE;
4069                 if (have_flag(flgs, TR_LOW_AC))      p_ptr->cursed |= TRC_LOW_AC;
4070                 if (have_flag(flgs, TR_LOW_MAGIC))   p_ptr->cursed |= TRC_LOW_MAGIC;
4071                 if (have_flag(flgs, TR_FAST_DIGEST)) p_ptr->cursed |= TRC_FAST_DIGEST;
4072                 if (have_flag(flgs, TR_SLOW_REGEN))  p_ptr->cursed |= TRC_SLOW_REGEN;
4073                 if (have_flag(flgs, TR_DEC_MANA))    p_ptr->dec_mana = TRUE;
4074                 if (have_flag(flgs, TR_BLESSED))     p_ptr->bless_blade = TRUE;
4075                 if (have_flag(flgs, TR_XTRA_MIGHT))  p_ptr->xtra_might = TRUE;
4076                 if (have_flag(flgs, TR_SLOW_DIGEST)) p_ptr->slow_digest = TRUE;
4077                 if (have_flag(flgs, TR_REGEN))       p_ptr->regenerate = TRUE;
4078                 if (have_flag(flgs, TR_TELEPATHY))   p_ptr->telepathy = TRUE;
4079                 if (have_flag(flgs, TR_ESP_ANIMAL))  p_ptr->esp_animal = TRUE;
4080                 if (have_flag(flgs, TR_ESP_UNDEAD))  p_ptr->esp_undead = TRUE;
4081                 if (have_flag(flgs, TR_ESP_DEMON))   p_ptr->esp_demon = TRUE;
4082                 if (have_flag(flgs, TR_ESP_ORC))     p_ptr->esp_orc = TRUE;
4083                 if (have_flag(flgs, TR_ESP_TROLL))   p_ptr->esp_troll = TRUE;
4084                 if (have_flag(flgs, TR_ESP_GIANT))   p_ptr->esp_giant = TRUE;
4085                 if (have_flag(flgs, TR_ESP_DRAGON))  p_ptr->esp_dragon = TRUE;
4086                 if (have_flag(flgs, TR_ESP_HUMAN))   p_ptr->esp_human = TRUE;
4087                 if (have_flag(flgs, TR_ESP_EVIL))    p_ptr->esp_evil = TRUE;
4088                 if (have_flag(flgs, TR_ESP_GOOD))    p_ptr->esp_good = TRUE;
4089                 if (have_flag(flgs, TR_ESP_NONLIVING)) p_ptr->esp_nonliving = TRUE;
4090                 if (have_flag(flgs, TR_ESP_UNIQUE))  p_ptr->esp_unique = TRUE;
4091
4092                 if (have_flag(flgs, TR_SEE_INVIS))   p_ptr->see_inv = TRUE;
4093                 if (have_flag(flgs, TR_LEVITATION))     p_ptr->levitation = TRUE;
4094                 if (have_flag(flgs, TR_FREE_ACT))    p_ptr->free_act = TRUE;
4095                 if (have_flag(flgs, TR_HOLD_EXP))   p_ptr->hold_exp = TRUE;
4096                 if (have_flag(flgs, TR_WARNING)){
4097                         if (!o_ptr->inscription || !(my_strchr(quark_str(o_ptr->inscription),'$')))
4098                           p_ptr->warning = TRUE;
4099                 }
4100
4101                 if (have_flag(flgs, TR_TELEPORT))
4102                 {
4103                         if (object_is_cursed(o_ptr)) p_ptr->cursed |= TRC_TELEPORT;
4104                         else
4105                         {
4106                                 cptr insc = quark_str(o_ptr->inscription);
4107
4108                                 if (o_ptr->inscription && my_strchr(insc, '.'))
4109                                 {
4110                                         /*
4111                                          * {.} will stop random teleportation.
4112                                          */
4113                                 }
4114                                 else
4115                                 {
4116                                         /* Controlled random teleportation */
4117                                         p_ptr->cursed |= TRC_TELEPORT_SELF;
4118                                 }
4119                         }
4120                 }
4121
4122                 /* Immunity flags */
4123                 if (have_flag(flgs, TR_IM_FIRE)) p_ptr->immune_fire = TRUE;
4124                 if (have_flag(flgs, TR_IM_ACID)) p_ptr->immune_acid = TRUE;
4125                 if (have_flag(flgs, TR_IM_COLD)) p_ptr->immune_cold = TRUE;
4126                 if (have_flag(flgs, TR_IM_ELEC)) p_ptr->immune_elec = TRUE;
4127
4128                 /* Resistance flags */
4129                 if (have_flag(flgs, TR_RES_ACID))   p_ptr->resist_acid = TRUE;
4130                 if (have_flag(flgs, TR_RES_ELEC))   p_ptr->resist_elec = TRUE;
4131                 if (have_flag(flgs, TR_RES_FIRE))   p_ptr->resist_fire = TRUE;
4132                 if (have_flag(flgs, TR_RES_COLD))   p_ptr->resist_cold = TRUE;
4133                 if (have_flag(flgs, TR_RES_POIS))   p_ptr->resist_pois = TRUE;
4134                 if (have_flag(flgs, TR_RES_FEAR))   p_ptr->resist_fear = TRUE;
4135                 if (have_flag(flgs, TR_RES_CONF))   p_ptr->resist_conf = TRUE;
4136                 if (have_flag(flgs, TR_RES_SOUND))  p_ptr->resist_sound = TRUE;
4137                 if (have_flag(flgs, TR_RES_LITE))   p_ptr->resist_lite = TRUE;
4138                 if (have_flag(flgs, TR_RES_DARK))   p_ptr->resist_dark = TRUE;
4139                 if (have_flag(flgs, TR_RES_CHAOS))  p_ptr->resist_chaos = TRUE;
4140                 if (have_flag(flgs, TR_RES_DISEN))  p_ptr->resist_disen = TRUE;
4141                 if (have_flag(flgs, TR_RES_SHARDS)) p_ptr->resist_shard = TRUE;
4142                 if (have_flag(flgs, TR_RES_NEXUS))  p_ptr->resist_nexus = TRUE;
4143                 if (have_flag(flgs, TR_RES_BLIND))  p_ptr->resist_blind = TRUE;
4144                 if (have_flag(flgs, TR_RES_NETHER)) p_ptr->resist_neth = TRUE;
4145
4146                 if (have_flag(flgs, TR_REFLECT))  p_ptr->reflect = TRUE;
4147                 if (have_flag(flgs, TR_SH_FIRE))  p_ptr->sh_fire = TRUE;
4148                 if (have_flag(flgs, TR_SH_ELEC))  p_ptr->sh_elec = TRUE;
4149                 if (have_flag(flgs, TR_SH_COLD))  p_ptr->sh_cold = TRUE;
4150                 if (have_flag(flgs, TR_NO_MAGIC)) p_ptr->anti_magic = TRUE;
4151                 if (have_flag(flgs, TR_NO_TELE))  p_ptr->anti_tele = TRUE;
4152
4153                 /* Sustain flags */
4154                 if (have_flag(flgs, TR_SUST_STR)) p_ptr->sustain_str = TRUE;
4155                 if (have_flag(flgs, TR_SUST_INT)) p_ptr->sustain_int = TRUE;
4156                 if (have_flag(flgs, TR_SUST_WIS)) p_ptr->sustain_wis = TRUE;
4157                 if (have_flag(flgs, TR_SUST_DEX)) p_ptr->sustain_dex = TRUE;
4158                 if (have_flag(flgs, TR_SUST_CON)) p_ptr->sustain_con = TRUE;
4159                 if (have_flag(flgs, TR_SUST_CHR)) p_ptr->sustain_chr = TRUE;
4160
4161                 if (o_ptr->name2 == EGO_YOIYAMI) yoiyami = TRUE;
4162                 if (o_ptr->name2 == EGO_2WEAPON) easy_2weapon = TRUE;
4163                 if (o_ptr->name2 == EGO_RING_RES_TIME) p_ptr->resist_time = TRUE;
4164                 if (o_ptr->name2 == EGO_RING_THROW) p_ptr->mighty_throw = TRUE;
4165                 if (have_flag(flgs, TR_EASY_SPELL)) p_ptr->easy_spell = TRUE;
4166                 if (o_ptr->name2 == EGO_AMU_FOOL) p_ptr->heavy_spell = TRUE;
4167                 if (o_ptr->name2 == EGO_AMU_NAIVETY) down_saving = TRUE;
4168
4169                 if (o_ptr->curse_flags & TRC_LOW_MAGIC)
4170                 {
4171                         if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4172                         {
4173                                 p_ptr->to_m_chance += 10;
4174                         }
4175                         else
4176                         {
4177                                 p_ptr->to_m_chance += 3;
4178                         }
4179                 }
4180
4181                 if (o_ptr->tval == TV_CAPTURE) continue;
4182
4183                 /* Modify the base armor class */
4184                 p_ptr->ac += o_ptr->ac;
4185
4186                 /* The base armor class is always known */
4187                 p_ptr->dis_ac += o_ptr->ac;
4188
4189                 /* Apply the bonuses to armor class */
4190                 p_ptr->to_a += o_ptr->to_a;
4191
4192                 /* Apply the mental bonuses to armor class, if known */
4193                 if (object_is_known(o_ptr)) p_ptr->dis_to_a += o_ptr->to_a;
4194
4195                 if (o_ptr->curse_flags & TRC_LOW_MELEE)
4196                 {
4197                         int slot = i - INVEN_RARM;
4198                         if (slot < 2)
4199                         {
4200                                 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4201                                 {
4202                                         p_ptr->to_h[slot] -= 15;
4203                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 15;
4204                                 }
4205                                 else
4206                                 {
4207                                         p_ptr->to_h[slot] -= 5;
4208                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 5;
4209                                 }
4210                         }
4211                         else
4212                         {
4213                                 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4214                                 {
4215                                         p_ptr->to_h_b -= 15;
4216                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 15;
4217                                 }
4218                                 else
4219                                 {
4220                                         p_ptr->to_h_b -= 5;
4221                                         if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 5;
4222                                 }
4223                         }
4224                 }
4225
4226                 if (o_ptr->curse_flags & TRC_LOW_AC)
4227                 {
4228                         if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4229                         {
4230                                 p_ptr->to_a -= 30;
4231                                 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 30;
4232                         }
4233                         else
4234                         {
4235                                 p_ptr->to_a -= 10;
4236                                 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 10;
4237                         }
4238                 }
4239
4240                 /* Hack -- do not apply "weapon" bonuses */
4241                 if (i == INVEN_RARM && buki_motteruka(i)) continue;
4242                 if (i == INVEN_LARM && buki_motteruka(i)) continue;
4243
4244                 /* Hack -- do not apply "bow" bonuses */
4245                 if (i == INVEN_BOW) continue;
4246
4247                 bonus_to_h = o_ptr->to_h;
4248                 bonus_to_d = o_ptr->to_d;
4249
4250                 if (p_ptr->pclass == CLASS_NINJA)
4251                 {
4252                         if (o_ptr->to_h > 0) bonus_to_h = (o_ptr->to_h+1)/2;
4253                         if (o_ptr->to_d > 0) bonus_to_d = (o_ptr->to_d+1)/2;
4254                 }
4255
4256                 /* To Bow and Natural attack */
4257
4258                 /* Apply the bonuses to hit/damage */
4259                 p_ptr->to_h_b += bonus_to_h;
4260                 p_ptr->to_h_m += bonus_to_h;
4261                 p_ptr->to_d_m += bonus_to_d;
4262
4263                 /* Apply the mental bonuses tp hit/damage, if known */
4264                 if (object_is_known(o_ptr)) p_ptr->dis_to_h_b += bonus_to_h;
4265
4266                 /* To Melee */
4267                 if ((i == INVEN_LEFT || i == INVEN_RIGHT) && !p_ptr->ryoute)
4268                 {
4269                         /* Apply the bonuses to hit/damage */
4270                         p_ptr->to_h[i-INVEN_RIGHT] += bonus_to_h;
4271                         p_ptr->to_d[i-INVEN_RIGHT] += bonus_to_d;
4272
4273                         /* Apply the mental bonuses tp hit/damage, if known */
4274                         if (object_is_known(o_ptr))
4275                         {
4276                                 p_ptr->dis_to_h[i-INVEN_RIGHT] += bonus_to_h;
4277                                 p_ptr->dis_to_d[i-INVEN_RIGHT] += bonus_to_d;
4278                         }
4279                 }
4280                 else if (p_ptr->migite && p_ptr->hidarite)
4281                 {
4282                         /* Apply the bonuses to hit/damage */
4283                         p_ptr->to_h[0] += (bonus_to_h > 0) ? (bonus_to_h+1)/2 : bonus_to_h;
4284                         p_ptr->to_h[1] += (bonus_to_h > 0) ? bonus_to_h/2 : bonus_to_h;
4285                         p_ptr->to_d[0] += (bonus_to_d > 0) ? (bonus_to_d+1)/2 : bonus_to_d;
4286                         p_ptr->to_d[1] += (bonus_to_d > 0) ? bonus_to_d/2 : bonus_to_d;
4287
4288                         /* Apply the mental bonuses tp hit/damage, if known */
4289                         if (object_is_known(o_ptr))
4290                         {
4291                                 p_ptr->dis_to_h[0] += (bonus_to_h > 0) ? (bonus_to_h+1)/2 : bonus_to_h;
4292                                 p_ptr->dis_to_h[1] += (bonus_to_h > 0) ? bonus_to_h/2 : bonus_to_h;
4293                                 p_ptr->dis_to_d[0] += (bonus_to_d > 0) ? (bonus_to_d+1)/2 : bonus_to_d;
4294                                 p_ptr->dis_to_d[1] += (bonus_to_d > 0) ? bonus_to_d/2 : bonus_to_d;
4295                         }
4296                 }
4297                 else
4298                 {
4299                         /* Apply the bonuses to hit/damage */
4300                         p_ptr->to_h[default_hand] += bonus_to_h;
4301                         p_ptr->to_d[default_hand] += bonus_to_d;
4302
4303                         /* Apply the mental bonuses to hit/damage, if known */
4304                         if (object_is_known(o_ptr))
4305                         {
4306                                 p_ptr->dis_to_h[default_hand] += bonus_to_h;
4307                                 p_ptr->dis_to_d[default_hand] += bonus_to_d;
4308                         }
4309                 }
4310         }
4311
4312         if (old_mighty_throw != p_ptr->mighty_throw)
4313         {
4314                 /* Redraw average damege display of Shuriken */
4315                 p_ptr->window |= PW_INVEN;
4316         }
4317
4318         if (p_ptr->cursed & TRC_TELEPORT) p_ptr->cursed &= ~(TRC_TELEPORT_SELF);
4319
4320         /* Monks get extra ac for armour _not worn_ */
4321         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER)) && !heavy_armor())
4322         {
4323                 if (!(inventory[INVEN_BODY].k_idx))
4324                 {
4325                         p_ptr->to_a += (p_ptr->lev * 3) / 2;
4326                         p_ptr->dis_to_a += (p_ptr->lev * 3) / 2;
4327                 }
4328                 if (!(inventory[INVEN_OUTER].k_idx) && (p_ptr->lev > 15))
4329                 {
4330                         p_ptr->to_a += ((p_ptr->lev - 13) / 3);
4331                         p_ptr->dis_to_a += ((p_ptr->lev - 13) / 3);
4332                 }
4333                 if (!(inventory[INVEN_LARM].k_idx) && (p_ptr->lev > 10))
4334                 {
4335                         p_ptr->to_a += ((p_ptr->lev - 8) / 3);
4336                         p_ptr->dis_to_a += ((p_ptr->lev - 8) / 3);
4337                 }
4338                 if (!(inventory[INVEN_HEAD].k_idx) && (p_ptr->lev > 4))
4339                 {
4340                         p_ptr->to_a += (p_ptr->lev - 2) / 3;
4341                         p_ptr->dis_to_a += (p_ptr->lev -2) / 3;
4342                 }
4343                 if (!(inventory[INVEN_HANDS].k_idx))
4344                 {
4345                         p_ptr->to_a += (p_ptr->lev / 2);
4346                         p_ptr->dis_to_a += (p_ptr->lev / 2);
4347                 }
4348                 if (!(inventory[INVEN_FEET].k_idx))
4349                 {
4350                         p_ptr->to_a += (p_ptr->lev / 3);
4351                         p_ptr->dis_to_a += (p_ptr->lev / 3);
4352                 }
4353                 if (p_ptr->special_defense & KAMAE_BYAKKO)
4354                 {
4355                         p_ptr->stat_add[A_STR] += 2;
4356                         p_ptr->stat_add[A_DEX] += 2;
4357                         p_ptr->stat_add[A_CON] -= 3;
4358                 }
4359                 else if (p_ptr->special_defense & KAMAE_SEIRYU)
4360                 {
4361                 }
4362                 else if (p_ptr->special_defense & KAMAE_GENBU)
4363                 {
4364                         p_ptr->stat_add[A_INT] -= 1;
4365                         p_ptr->stat_add[A_WIS] -= 1;
4366                         p_ptr->stat_add[A_DEX] -= 2;
4367                         p_ptr->stat_add[A_CON] += 3;
4368                 }
4369                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
4370                 {
4371                         p_ptr->stat_add[A_STR] -= 2;
4372                         p_ptr->stat_add[A_INT] += 1;
4373                         p_ptr->stat_add[A_WIS] += 1;
4374                         p_ptr->stat_add[A_DEX] += 2;
4375                         p_ptr->stat_add[A_CON] -= 2;
4376                 }
4377         }
4378
4379         if (p_ptr->special_defense & KATA_KOUKIJIN)
4380         {
4381                 for (i = 0; i < 6; i++)
4382                         p_ptr->stat_add[i] += 5;
4383                 p_ptr->to_a -= 50;
4384                 p_ptr->dis_to_a -= 50;
4385         }
4386
4387         /* Hack -- aura of fire also provides light */
4388         if (p_ptr->sh_fire) p_ptr->lite = TRUE;
4389
4390         /* Golems also get an intrinsic AC bonus */
4391         if (prace_is_(RACE_GOLEM) || prace_is_(RACE_ANDROID))
4392         {
4393                 p_ptr->to_a += 10 + (p_ptr->lev * 2 / 5);
4394                 p_ptr->dis_to_a += 10 + (p_ptr->lev * 2 / 5);
4395         }
4396
4397         /* Hex bonuses */
4398         if (p_ptr->realm1 == REALM_HEX)
4399         {
4400                 if (hex_spelling_any()) p_ptr->skill_stl -= (1 + p_ptr->magic_num2[0]);
4401                 if (hex_spelling(HEX_DETECT_EVIL)) p_ptr->esp_evil = TRUE;
4402                 if (hex_spelling(HEX_XTRA_MIGHT)) p_ptr->stat_add[A_STR] += 4;
4403                 if (hex_spelling(HEX_BUILDING))
4404                 {
4405                         p_ptr->stat_add[A_STR] += 4;
4406                         p_ptr->stat_add[A_DEX] += 4;
4407                         p_ptr->stat_add[A_CON] += 4;
4408                 }
4409                 if (hex_spelling(HEX_DEMON_AURA))
4410                 {
4411                         p_ptr->sh_fire = TRUE;
4412                         p_ptr->regenerate = TRUE;
4413                 }
4414                 if (hex_spelling(HEX_ICE_ARMOR))
4415                 {
4416                         p_ptr->sh_cold = TRUE; 
4417                         p_ptr->to_a += 30;
4418                         p_ptr->dis_to_a += 30;
4419                 }
4420                 if (hex_spelling(HEX_SHOCK_CLOAK))
4421                 {
4422                         p_ptr->sh_elec = TRUE;
4423                         new_speed += 3;
4424                 }
4425                 for (i = INVEN_RARM; i <= INVEN_FEET; i++)
4426                 {
4427                         int ac = 0;
4428                         o_ptr = &inventory[i];
4429                         if (!o_ptr->k_idx) continue;
4430                         if (!object_is_armour(o_ptr)) continue;
4431                         if (!object_is_cursed(o_ptr)) continue;
4432                         ac += 5;
4433                         if (o_ptr->curse_flags & TRC_HEAVY_CURSE) ac += 7;
4434                         if (o_ptr->curse_flags & TRC_PERMA_CURSE) ac += 13;
4435                         p_ptr->to_a += ac;
4436                         p_ptr->dis_to_a += ac;
4437                 }
4438         }
4439
4440         /* Calculate stats */
4441         for (i = 0; i < 6; i++)
4442         {
4443                 int top, use, ind;
4444
4445                 /* Extract the new "stat_use" value for the stat */
4446                 top = modify_stat_value(p_ptr->stat_max[i], p_ptr->stat_add[i]);
4447
4448                 /* Notice changes */
4449                 if (p_ptr->stat_top[i] != top)
4450                 {
4451                         /* Save the new value */
4452                         p_ptr->stat_top[i] = top;
4453
4454                         /* Redisplay the stats later */
4455                         p_ptr->redraw |= (PR_STATS);
4456
4457                         /* Window stuff */
4458                         p_ptr->window |= (PW_PLAYER);
4459                 }
4460
4461
4462                 /* Extract the new "stat_use" value for the stat */
4463                 use = modify_stat_value(p_ptr->stat_cur[i], p_ptr->stat_add[i]);
4464
4465                 if ((i == A_CHR) && (p_ptr->muta3 & MUT3_ILL_NORM))
4466                 {
4467                         /* 10 to 18/90 charisma, guaranteed, based on level */
4468                         if (use < 8 + 2 * p_ptr->lev)
4469                         {
4470                                 use = 8 + 2 * p_ptr->lev;
4471                         }
4472                 }
4473
4474                 /* Notice changes */
4475                 if (p_ptr->stat_use[i] != use)
4476                 {
4477                         /* Save the new value */
4478                         p_ptr->stat_use[i] = use;
4479
4480                         /* Redisplay the stats later */
4481                         p_ptr->redraw |= (PR_STATS);
4482
4483                         /* Window stuff */
4484                         p_ptr->window |= (PW_PLAYER);
4485                 }
4486
4487
4488                 /* Values: 3, 4, ..., 17 */
4489                 if (use <= 18) ind = (use - 3);
4490
4491                 /* Ranges: 18/00-18/09, ..., 18/210-18/219 */
4492                 else if (use <= 18+219) ind = (15 + (use - 18) / 10);
4493
4494                 /* Range: 18/220+ */
4495                 else ind = (37);
4496
4497                 /* Notice changes */
4498                 if (p_ptr->stat_ind[i] != ind)
4499                 {
4500                         /* Save the new index */
4501                         p_ptr->stat_ind[i] = ind;
4502
4503                         /* Change in CON affects Hitpoints */
4504                         if (i == A_CON)
4505                         {
4506                                 p_ptr->update |= (PU_HP);
4507                         }
4508
4509                         /* Change in INT may affect Mana/Spells */
4510                         else if (i == A_INT)
4511                         {
4512                                 if (mp_ptr->spell_stat == A_INT)
4513                                 {
4514                                         p_ptr->update |= (PU_MANA | PU_SPELLS);
4515                                 }
4516                         }
4517
4518                         /* Change in WIS may affect Mana/Spells */
4519                         else if (i == A_WIS)
4520                         {
4521                                 if (mp_ptr->spell_stat == A_WIS)
4522                                 {
4523                                         p_ptr->update |= (PU_MANA | PU_SPELLS);
4524                                 }
4525                         }
4526
4527                         /* Change in WIS may affect Mana/Spells */
4528                         else if (i == A_CHR)
4529                         {
4530                                 if (mp_ptr->spell_stat == A_CHR)
4531                                 {
4532                                         p_ptr->update |= (PU_MANA | PU_SPELLS);
4533                                 }
4534                         }
4535
4536                         /* Window stuff */
4537                         p_ptr->window |= (PW_PLAYER);
4538                 }
4539         }
4540
4541
4542         /* Apply temporary "stun" */
4543         if (p_ptr->stun > 50)
4544         {
4545                 p_ptr->to_h[0] -= 20;
4546                 p_ptr->to_h[1] -= 20;
4547                 p_ptr->to_h_b  -= 20;
4548                 p_ptr->to_h_m  -= 20;
4549                 p_ptr->dis_to_h[0] -= 20;
4550                 p_ptr->dis_to_h[1] -= 20;
4551                 p_ptr->dis_to_h_b  -= 20;
4552                 p_ptr->to_d[0] -= 20;
4553                 p_ptr->to_d[1] -= 20;
4554                 p_ptr->to_d_m -= 20;
4555                 p_ptr->dis_to_d[0] -= 20;
4556                 p_ptr->dis_to_d[1] -= 20;
4557         }
4558         else if (p_ptr->stun)
4559         {
4560                 p_ptr->to_h[0] -= 5;
4561                 p_ptr->to_h[1] -= 5;
4562                 p_ptr->to_h_b -= 5;
4563                 p_ptr->to_h_m -= 5;
4564                 p_ptr->dis_to_h[0] -= 5;
4565                 p_ptr->dis_to_h[1] -= 5;
4566                 p_ptr->dis_to_h_b -= 5;
4567                 p_ptr->to_d[0] -= 5;
4568                 p_ptr->to_d[1] -= 5;
4569                 p_ptr->to_d_m -= 5;
4570                 p_ptr->dis_to_d[0] -= 5;
4571                 p_ptr->dis_to_d[1] -= 5;
4572         }
4573
4574         /* Wraith form */
4575         if (p_ptr->wraith_form)
4576         {
4577                 p_ptr->reflect = TRUE;
4578                 p_ptr->pass_wall = TRUE;
4579         }
4580
4581         if (p_ptr->kabenuke)
4582         {
4583                 p_ptr->pass_wall = TRUE;
4584         }
4585
4586         /* Temporary blessing */
4587         if (IS_BLESSED())
4588         {
4589                 p_ptr->to_a += 5;
4590                 p_ptr->dis_to_a += 5;
4591                 p_ptr->to_h[0] += 10;
4592                 p_ptr->to_h[1] += 10;
4593                 p_ptr->to_h_b  += 10;
4594                 p_ptr->to_h_m  += 10;
4595                 p_ptr->dis_to_h[0] += 10;
4596                 p_ptr->dis_to_h[1] += 10;
4597                 p_ptr->dis_to_h_b += 10;
4598         }
4599
4600         if (p_ptr->magicdef)
4601         {
4602                 p_ptr->resist_blind = TRUE;
4603                 p_ptr->resist_conf = TRUE;
4604                 p_ptr->reflect = TRUE;
4605                 p_ptr->free_act = TRUE;
4606                 p_ptr->levitation = TRUE;
4607         }
4608
4609         /* Temporary "Hero" */
4610         if (IS_HERO())
4611         {
4612                 p_ptr->to_h[0] += 12;
4613                 p_ptr->to_h[1] += 12;
4614                 p_ptr->to_h_b  += 12;
4615                 p_ptr->to_h_m  += 12;
4616                 p_ptr->dis_to_h[0] += 12;
4617                 p_ptr->dis_to_h[1] += 12;
4618                 p_ptr->dis_to_h_b  += 12;
4619         }
4620
4621         /* Temporary "Beserk" */
4622         if (p_ptr->shero)
4623         {
4624                 p_ptr->to_h[0] += 12;
4625                 p_ptr->to_h[1] += 12;
4626                 p_ptr->to_h_b  -= 12;
4627                 p_ptr->to_h_m  += 12;
4628                 p_ptr->to_d[0] += 3+(p_ptr->lev/5);
4629                 p_ptr->to_d[1] += 3+(p_ptr->lev/5);
4630                 p_ptr->to_d_m  += 3+(p_ptr->lev/5);
4631                 p_ptr->dis_to_h[0] += 12;
4632                 p_ptr->dis_to_h[1] += 12;
4633                 p_ptr->dis_to_h_b  -= 12;
4634                 p_ptr->dis_to_d[0] += 3+(p_ptr->lev/5);
4635                 p_ptr->dis_to_d[1] += 3+(p_ptr->lev/5);
4636                 p_ptr->to_a -= 10;
4637                 p_ptr->dis_to_a -= 10;
4638                 p_ptr->skill_stl -= 7;
4639                 p_ptr->skill_dev -= 20;
4640                 p_ptr->skill_sav -= 30;
4641                 p_ptr->skill_srh -= 15;
4642                 p_ptr->skill_fos -= 15;
4643                 p_ptr->skill_tht -= 20;
4644                 p_ptr->skill_dig += 30;
4645         }
4646
4647         /* Temporary "fast" */
4648         if (IS_FAST())
4649         {
4650                 new_speed += 10;
4651         }
4652
4653         /* Temporary "slow" */
4654         if (p_ptr->slow)
4655         {
4656                 new_speed -= 10;
4657         }
4658
4659         /* Temporary "telepathy" */
4660         if (IS_TIM_ESP())
4661         {
4662                 p_ptr->telepathy = TRUE;
4663         }
4664
4665         if (p_ptr->ele_immune)
4666         {
4667                 if (p_ptr->special_defense & DEFENSE_ACID)
4668                         p_ptr->immune_acid = TRUE;
4669                 else if (p_ptr->special_defense & DEFENSE_ELEC)
4670                         p_ptr->immune_elec = TRUE;
4671                 else if (p_ptr->special_defense & DEFENSE_FIRE)
4672                         p_ptr->immune_fire = TRUE;
4673                 else if (p_ptr->special_defense & DEFENSE_COLD)
4674                         p_ptr->immune_cold = TRUE;
4675         }
4676
4677         /* Temporary see invisible */
4678         if (p_ptr->tim_invis)
4679         {
4680                 p_ptr->see_inv = TRUE;
4681         }
4682
4683         /* Temporary infravision boost */
4684         if (p_ptr->tim_infra)
4685         {
4686                 p_ptr->see_infra+=3;
4687         }
4688
4689         /* Temporary regeneration boost */
4690         if (p_ptr->tim_regen)
4691         {
4692                 p_ptr->regenerate = TRUE;
4693         }
4694
4695         /* Temporary levitation */
4696         if (p_ptr->tim_levitation)
4697         {
4698                 p_ptr->levitation = TRUE;
4699         }
4700
4701         /* Temporary reflection */
4702         if (p_ptr->tim_reflect)
4703         {
4704                 p_ptr->reflect = TRUE;
4705         }
4706
4707         /* Hack -- Hero/Shero -> Res fear */
4708         if (IS_HERO() || p_ptr->shero)
4709         {
4710                 p_ptr->resist_fear = TRUE;
4711         }
4712
4713
4714         /* Hack -- Telepathy Change */
4715         if (p_ptr->telepathy != old_telepathy)
4716         {
4717                 p_ptr->update |= (PU_MONSTERS);
4718         }
4719
4720         if ((p_ptr->esp_animal != old_esp_animal) ||
4721             (p_ptr->esp_undead != old_esp_undead) ||
4722             (p_ptr->esp_demon != old_esp_demon) ||
4723             (p_ptr->esp_orc != old_esp_orc) ||
4724             (p_ptr->esp_troll != old_esp_troll) ||
4725             (p_ptr->esp_giant != old_esp_giant) ||
4726             (p_ptr->esp_dragon != old_esp_dragon) ||
4727             (p_ptr->esp_human != old_esp_human) ||
4728             (p_ptr->esp_evil != old_esp_evil) ||
4729             (p_ptr->esp_good != old_esp_good) ||
4730             (p_ptr->esp_nonliving != old_esp_nonliving) ||
4731             (p_ptr->esp_unique != old_esp_unique))
4732         {
4733                 p_ptr->update |= (PU_MONSTERS);
4734         }
4735
4736         /* Hack -- See Invis Change */
4737         if (p_ptr->see_inv != old_see_inv)
4738         {
4739                 p_ptr->update |= (PU_MONSTERS);
4740         }
4741
4742         /* Bloating slows the player down (a little) */
4743         if (p_ptr->food >= PY_FOOD_MAX) new_speed -= 10;
4744
4745         if (p_ptr->special_defense & KAMAE_SUZAKU) new_speed += 10;
4746
4747         if ((p_ptr->migite && (empty_hands_status & EMPTY_HAND_RARM)) ||
4748             (p_ptr->hidarite && (empty_hands_status & EMPTY_HAND_LARM)))
4749         {
4750                 p_ptr->to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
4751                 p_ptr->dis_to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
4752         }
4753
4754         if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM))
4755         {
4756                 int penalty1, penalty2;
4757                 penalty1 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - inventory[INVEN_RARM].weight) / 8);
4758                 penalty2 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - inventory[INVEN_LARM].weight) / 8);
4759                 if ((inventory[INVEN_RARM].name1 == ART_QUICKTHORN) && (inventory[INVEN_LARM].name1 == ART_TINYTHORN))
4760                 {
4761                         penalty1 = penalty1 / 2 - 5;
4762                         penalty2 = penalty2 / 2 - 5;
4763                         new_speed += 7;
4764                         p_ptr->to_a += 10;
4765                         p_ptr->dis_to_a += 10;
4766                 }
4767                 if (easy_2weapon)
4768                 {
4769                         if (penalty1 > 0) penalty1 /= 2;
4770                         if (penalty2 > 0) penalty2 /= 2;
4771                 }
4772                 else if ((inventory[INVEN_LARM].tval == TV_SWORD) && ((inventory[INVEN_LARM].sval == SV_MAIN_GAUCHE) || (inventory[INVEN_LARM].sval == SV_WAKIZASHI)))
4773                 {
4774                         penalty1 = MAX(0, penalty1 - 10);
4775                         penalty2 = MAX(0, penalty2 - 10);
4776                 }
4777                 if ((inventory[INVEN_RARM].name1 == ART_MUSASI_KATANA) && (inventory[INVEN_LARM].name1 == ART_MUSASI_WAKIZASI))
4778                 {
4779                         penalty1 = MIN(0, penalty1);
4780                         penalty2 = MIN(0, penalty2);
4781                         p_ptr->to_a += 10;
4782                         p_ptr->dis_to_a += 10;
4783                 }
4784                 else
4785                 {
4786                         if ((inventory[INVEN_RARM].name1 == ART_MUSASI_KATANA) && (penalty1 > 0))
4787                                 penalty1 /= 2;
4788                         if ((inventory[INVEN_LARM].name1 == ART_MUSASI_WAKIZASI) && (penalty2 > 0))
4789                                 penalty2 /= 2;
4790                 }
4791                 if (inventory[INVEN_RARM].tval == TV_POLEARM) penalty1 += 10;
4792                 if (inventory[INVEN_LARM].tval == TV_POLEARM) penalty2 += 10;
4793                 p_ptr->to_h[0] -= penalty1;
4794                 p_ptr->to_h[1] -= penalty2;
4795                 p_ptr->dis_to_h[0] -= penalty1;
4796                 p_ptr->dis_to_h[1] -= penalty2;
4797         }
4798
4799         /* Extract the current weight (in tenth pounds) */
4800         j = p_ptr->total_weight;
4801
4802         if (!p_ptr->riding)
4803         {
4804                 /* Extract the "weight limit" (in tenth pounds) */
4805                 i = (int)weight_limit();
4806         }
4807         else
4808         {
4809                 monster_type *riding_m_ptr = &m_list[p_ptr->riding];
4810                 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
4811                 int speed = riding_m_ptr->mspeed;
4812
4813                 if (riding_m_ptr->mspeed > 110)
4814                 {
4815                         new_speed = 110 + (s16b)((speed - 110) * (p_ptr->skill_exp[GINOU_RIDING] * 3 + p_ptr->lev * 160L - 10000L) / (22000L));
4816                         if (new_speed < 110) new_speed = 110;
4817                 }
4818                 else
4819                 {
4820                         new_speed = speed;
4821                 }
4822                 new_speed += (p_ptr->skill_exp[GINOU_RIDING] + p_ptr->lev *160L)/3200;
4823                 if (MON_FAST(riding_m_ptr)) new_speed += 10;
4824                 if (MON_SLOW(riding_m_ptr)) new_speed -= 10;
4825                 riding_levitation = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? TRUE : FALSE;
4826                 if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC)) p_ptr->can_swim = TRUE;
4827
4828                 if (!(riding_r_ptr->flags2 & RF2_PASS_WALL)) p_ptr->pass_wall = FALSE;
4829                 if (riding_r_ptr->flags2 & RF2_KILL_WALL) p_ptr->kill_wall = TRUE;
4830
4831                 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;
4832
4833                 /* Extract the "weight limit" */
4834                 i = 1500 + riding_r_ptr->level * 25;
4835         }
4836
4837         /* XXX XXX XXX Apply "encumbrance" from weight */
4838         if (j > i) new_speed -= ((j - i) / (i / 5));
4839
4840         /* Searching slows the player down */
4841         if (p_ptr->action == ACTION_SEARCH) new_speed -= 10;
4842
4843         /* Actual Modifier Bonuses (Un-inflate stat bonuses) */
4844         p_ptr->to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
4845         p_ptr->to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
4846         p_ptr->to_d[1] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
4847         p_ptr->to_d_m  += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
4848         p_ptr->to_h[0] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4849         p_ptr->to_h[1] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4850         p_ptr->to_h_b  += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4851         p_ptr->to_h_m  += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4852         p_ptr->to_h[0] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4853         p_ptr->to_h[1] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4854         p_ptr->to_h_b  += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4855         p_ptr->to_h_m  += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4856
4857         /* Displayed Modifier Bonuses (Un-inflate stat bonuses) */
4858         p_ptr->dis_to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
4859         p_ptr->dis_to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
4860         p_ptr->dis_to_d[1] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
4861         p_ptr->dis_to_h[0] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4862         p_ptr->dis_to_h[1] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4863         p_ptr->dis_to_h_b  += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
4864         p_ptr->dis_to_h[0] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4865         p_ptr->dis_to_h[1] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4866         p_ptr->dis_to_h_b  += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
4867
4868
4869         /* Obtain the "hold" value */
4870         hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
4871
4872
4873         /* Examine the "current bow" */
4874         o_ptr = &inventory[INVEN_BOW];
4875
4876         /* It is hard to carholdry a heavy bow */
4877         p_ptr->heavy_shoot = is_heavy_shoot(o_ptr);
4878         if (p_ptr->heavy_shoot)
4879         {
4880                 /* Hard to wield a heavy bow */
4881                 p_ptr->to_h_b  += 2 * (hold - o_ptr->weight / 10);
4882                 p_ptr->dis_to_h_b  += 2 * (hold - o_ptr->weight / 10);
4883         }
4884
4885         /* Compute "extra shots" if needed */
4886         if (o_ptr->k_idx)
4887         {
4888                 p_ptr->tval_ammo = bow_tval_ammo(o_ptr);
4889
4890                 /* Apply special flags */
4891                 if (o_ptr->k_idx && !p_ptr->heavy_shoot)
4892                 {
4893                         /* Extra shots */
4894                         p_ptr->num_fire = calc_num_fire(o_ptr);
4895
4896                         /* Snipers love Cross bows */
4897                         if ((p_ptr->pclass == CLASS_SNIPER) &&
4898                                 (p_ptr->tval_ammo == TV_BOLT))
4899                         {
4900                                 p_ptr->to_h_b += (10 + (p_ptr->lev / 5));
4901                                 p_ptr->dis_to_h_b += (10 + (p_ptr->lev / 5));
4902                         }
4903                 }
4904         }
4905
4906         if (p_ptr->ryoute)
4907                 hold *= 2;
4908
4909         for(i = 0 ; i < 2 ; i++)
4910         {
4911                 /* Examine the "main weapon" */
4912                 o_ptr = &inventory[INVEN_RARM+i];
4913
4914                 object_flags(o_ptr, flgs);
4915
4916                 /* Assume not heavy */
4917                 p_ptr->heavy_wield[i] = FALSE;
4918                 p_ptr->icky_wield[i] = FALSE;
4919                 p_ptr->riding_wield[i] = FALSE;
4920
4921                 if (!buki_motteruka(INVEN_RARM+i)) {p_ptr->num_blow[i]=1;continue;}
4922                 /* It is hard to hold a heavy weapon */
4923                 if (hold < o_ptr->weight / 10)
4924                 {
4925                         /* Hard to wield a heavy weapon */
4926                         p_ptr->to_h[i] += 2 * (hold - o_ptr->weight / 10);
4927                         p_ptr->dis_to_h[i] += 2 * (hold - o_ptr->weight / 10);
4928
4929                         /* Heavy weapon */
4930                         p_ptr->heavy_wield[i] = TRUE;
4931                 }
4932                 else if (p_ptr->ryoute && (hold < o_ptr->weight/5)) omoi = TRUE;
4933
4934                 if ((i == 1) && (o_ptr->tval == TV_SWORD) && ((o_ptr->sval == SV_MAIN_GAUCHE) || (o_ptr->sval == SV_WAKIZASHI)))
4935                 {
4936                         p_ptr->to_a += 5;
4937                         p_ptr->dis_to_a += 5;
4938                 }
4939
4940                 /* Normal weapons */
4941                 if (o_ptr->k_idx && !p_ptr->heavy_wield[i])
4942                 {
4943                         int str_index, dex_index;
4944
4945                         int num = 0, wgt = 0, mul = 0, div = 0;
4946
4947                         /* Analyze the class */
4948                         switch (p_ptr->pclass)
4949                         {
4950                                 /* Warrior */
4951                                 case CLASS_WARRIOR:
4952                                         num = 6; wgt = 70; mul = 5; break;
4953
4954                                 /* Berserker */
4955                                 case CLASS_BERSERKER:
4956                                         num = 6; wgt = 70; mul = 7; break;
4957
4958                                 /* Mage */
4959                                 case CLASS_MAGE:
4960                                 case CLASS_HIGH_MAGE:
4961                                 case CLASS_BLUE_MAGE:
4962                                         num = 3; wgt = 100; mul = 2; break;
4963
4964                                 /* Priest, Mindcrafter, Magic-Eater */
4965                                 case CLASS_PRIEST:
4966                                 case CLASS_MAGIC_EATER:
4967                                 case CLASS_MINDCRAFTER:
4968                                         num = 5; wgt = 100; mul = 3; break;
4969
4970                                 /* Rogue */
4971                                 case CLASS_ROGUE:
4972                                         num = 5; wgt = 40; mul = 3; break;
4973
4974                                 /* Ranger */
4975                                 case CLASS_RANGER:
4976                                         num = 5; wgt = 70; mul = 4; break;
4977
4978                                 /* Paladin */
4979                                 case CLASS_PALADIN:
4980                                 case CLASS_SAMURAI:
4981                                         num = 5; wgt = 70; mul = 4; break;
4982
4983                                 /* Weaponsmith */
4984                                 case CLASS_SMITH:
4985                                         num = 5; wgt = 150; mul = 5; break;
4986
4987                                 /* Warrior-Mage */
4988                                 case CLASS_WARRIOR_MAGE:
4989                                 case CLASS_RED_MAGE:
4990                                         num = 5; wgt = 70; mul = 3; break;
4991
4992                                 /* Chaos Warrior */
4993                                 case CLASS_CHAOS_WARRIOR:
4994                                         num = 5; wgt = 70; mul = 4; break;
4995
4996                                 /* Monk */
4997                                 case CLASS_MONK:
4998                                         num = 5; wgt = 60; mul = 3; break;
4999
5000                                 /* Tourist */
5001                                 case CLASS_TOURIST:
5002                                         num = 4; wgt = 100; mul = 3; break;
5003
5004                                 /* Imitator */
5005                                 case CLASS_IMITATOR:
5006                                         num = 5; wgt = 70; mul = 4; break;
5007
5008                                 /* Beastmaster */
5009                                 case CLASS_BEASTMASTER:
5010                                         num = 5; wgt = 70; mul = 3; break;
5011
5012                                 /* Cavalry */
5013                                 case CLASS_CAVALRY:
5014                                         if ((p_ptr->riding) && (have_flag(flgs, TR_RIDING))) {num = 5; wgt = 70; mul = 4;}
5015                                         else {num = 5; wgt = 100; mul = 3;}
5016                                         break;
5017
5018                                 /* Sorcerer */
5019                                 case CLASS_SORCERER:
5020                                         num = 1; wgt = 1; mul = 1; break;
5021
5022                                 /* Archer, Bard, Sniper */
5023                                 case CLASS_ARCHER:
5024                                 case CLASS_BARD:
5025                                 case CLASS_SNIPER:
5026                                         num = 4; wgt = 70; mul = 2; break;
5027
5028                                 /* ForceTrainer */
5029                                 case CLASS_FORCETRAINER:
5030                                         num = 4; wgt = 60; mul = 2; break;
5031
5032                                 /* Mirror Master */
5033                                 case CLASS_MIRROR_MASTER:
5034                                         num = 3; wgt = 100; mul = 3; break;
5035
5036                                 /* Ninja */
5037                                 case CLASS_NINJA:
5038                                         num = 4; wgt = 20; mul = 1; break;
5039                         }
5040
5041                         /* Hex - extra mights gives +1 bonus to max blows */
5042                         if (hex_spelling(HEX_XTRA_MIGHT) || hex_spelling(HEX_BUILDING)) { num++; wgt /= 2; mul += 2; }
5043
5044                         /* Enforce a minimum "weight" (tenth pounds) */
5045                         div = ((o_ptr->weight < wgt) ? wgt : o_ptr->weight);
5046
5047                         /* Access the strength vs weight */
5048                         str_index = (adj_str_blow[p_ptr->stat_ind[A_STR]] * mul / div);
5049
5050                         if (p_ptr->ryoute && !omoi) str_index++;
5051                         if (p_ptr->pclass == CLASS_NINJA) str_index = MAX(0, str_index-1);
5052
5053                         /* Maximal value */
5054                         if (str_index > 11) str_index = 11;
5055
5056                         /* Index by dexterity */
5057                         dex_index = (adj_dex_blow[p_ptr->stat_ind[A_DEX]]);
5058
5059                         /* Maximal value */
5060                         if (dex_index > 11) dex_index = 11;
5061
5062                         /* Use the blows table */
5063                         p_ptr->num_blow[i] = blows_table[str_index][dex_index];
5064
5065                         /* Maximal value */
5066                         if (p_ptr->num_blow[i] > num) p_ptr->num_blow[i] = num;
5067
5068                         /* Add in the "bonus blows" */
5069                         p_ptr->num_blow[i] += extra_blows[i];
5070
5071
5072                         if (p_ptr->pclass == CLASS_WARRIOR) p_ptr->num_blow[i] += (p_ptr->lev / 40);
5073                         else if (p_ptr->pclass == CLASS_BERSERKER)
5074                         {
5075                                 p_ptr->num_blow[i] += (p_ptr->lev / 23);
5076                         }
5077                         else if ((p_ptr->pclass == CLASS_ROGUE) && (o_ptr->weight < 50) && (p_ptr->stat_ind[A_DEX] >= 30)) p_ptr->num_blow[i] ++;
5078
5079                         if (p_ptr->special_defense & KATA_FUUJIN) p_ptr->num_blow[i] -= 1;
5080
5081                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) p_ptr->num_blow[i] = 1;
5082
5083
5084                         /* Require at least one blow */
5085                         if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1;
5086
5087                         /* Boost digging skill by weapon weight */
5088                         p_ptr->skill_dig += (o_ptr->weight / 10);
5089                 }
5090
5091                 /* Assume okay */
5092                 /* Priest weapon penalty for non-blessed edged weapons */
5093                 if ((p_ptr->pclass == CLASS_PRIEST) && (!(have_flag(flgs, TR_BLESSED))) &&
5094                     ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM)))
5095                 {
5096                         /* Reduce the real bonuses */
5097                         p_ptr->to_h[i] -= 2;
5098                         p_ptr->to_d[i] -= 2;
5099
5100                         /* Reduce the mental bonuses */
5101                         p_ptr->dis_to_h[i] -= 2;
5102                         p_ptr->dis_to_d[i] -= 2;
5103
5104                         /* Icky weapon */
5105                         p_ptr->icky_wield[i] = TRUE;
5106                 }
5107                 else if (p_ptr->pclass == CLASS_BERSERKER)
5108                 {
5109                         p_ptr->to_h[i] += p_ptr->lev/5;
5110                         p_ptr->to_d[i] += p_ptr->lev/6;
5111                         p_ptr->dis_to_h[i] += p_ptr->lev/5;
5112                         p_ptr->dis_to_d[i] += p_ptr->lev/6;
5113                         if (((i == 0) && !p_ptr->hidarite) || p_ptr->ryoute)
5114                         {
5115                                 p_ptr->to_h[i] += p_ptr->lev/5;
5116                                 p_ptr->to_d[i] += p_ptr->lev/6;
5117                                 p_ptr->dis_to_h[i] += p_ptr->lev/5;
5118                                 p_ptr->dis_to_d[i] += p_ptr->lev/6;
5119                         }
5120                 }
5121                 else if (p_ptr->pclass == CLASS_SORCERER)
5122                 {
5123                         if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER))))
5124                         {
5125                                 /* Reduce the real bonuses */
5126                                 p_ptr->to_h[i] -= 200;
5127                                 p_ptr->to_d[i] -= 200;
5128
5129                                 /* Reduce the mental bonuses */
5130                                 p_ptr->dis_to_h[i] -= 200;
5131                                 p_ptr->dis_to_d[i] -= 200;
5132
5133                                 /* Icky weapon */
5134                                 p_ptr->icky_wield[i] = TRUE;
5135                         }
5136                         else
5137                         {
5138                                 /* Reduce the real bonuses */
5139                                 p_ptr->to_h[i] -= 30;
5140                                 p_ptr->to_d[i] -= 10;
5141
5142                                 /* Reduce the mental bonuses */
5143                                 p_ptr->dis_to_h[i] -= 30;
5144                                 p_ptr->dis_to_d[i] -= 10;
5145                         }
5146                 }
5147                 /* Hex bonuses */
5148                 if (p_ptr->realm1 == REALM_HEX)
5149                 {
5150                         if (object_is_cursed(o_ptr))
5151                         {
5152                                 if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; }
5153                                 if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_h[i] += 7; p_ptr->dis_to_h[i] += 7; }
5154                                 if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_h[i] += 13; p_ptr->dis_to_h[i] += 13; }
5155                                 if (o_ptr->curse_flags & (TRC_TY_CURSE)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; }
5156                                 if (hex_spelling(HEX_RUNESWORD))
5157                                 {
5158                                         if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_d[i] += 5; p_ptr->dis_to_d[i] += 5; }
5159                                         if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_d[i] += 7; p_ptr->dis_to_d[i] += 7; }
5160                                         if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_d[i] += 13; p_ptr->dis_to_d[i] += 13; }
5161                                 }
5162                         }
5163                 }
5164                 if (p_ptr->riding)
5165                 {
5166                         if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
5167                         {
5168                                 p_ptr->to_h[i] +=15;
5169                                 p_ptr->dis_to_h[i] +=15;
5170                                 p_ptr->to_dd[i] += 2;
5171                         }
5172                         else if (!(have_flag(flgs, TR_RIDING)))
5173                         {
5174                                 int penalty;
5175                                 if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
5176                                 {
5177                                         penalty = 5;
5178                                 }
5179                                 else
5180                                 {
5181                                         penalty = r_info[m_list[p_ptr->riding].r_idx].level - p_ptr->skill_exp[GINOU_RIDING] / 80;
5182                                         penalty += 30;
5183                                         if (penalty < 30) penalty = 30;
5184                                 }
5185                                 p_ptr->to_h[i] -= penalty;
5186                                 p_ptr->dis_to_h[i] -= penalty;
5187
5188                                 /* Riding weapon */
5189                                 p_ptr->riding_wield[i] = TRUE;
5190                         }
5191                 }
5192         }
5193
5194         if (p_ptr->riding)
5195         {
5196                 int penalty = 0;
5197
5198                 p_ptr->riding_ryoute = FALSE;
5199
5200                 if (p_ptr->ryoute || (empty_hands(FALSE) == EMPTY_HAND_NONE)) p_ptr->riding_ryoute = TRUE;
5201                 else if (p_ptr->pet_extra_flags & PF_RYOUTE)
5202                 {
5203                         switch (p_ptr->pclass)
5204                         {
5205                         case CLASS_MONK:
5206                         case CLASS_FORCETRAINER:
5207                         case CLASS_BERSERKER:
5208                                 if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
5209                                         p_ptr->riding_ryoute = TRUE;
5210                                 break;
5211                         }
5212                 }
5213
5214                 if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
5215                 {
5216                         if (p_ptr->tval_ammo != TV_ARROW) penalty = 5;
5217                 }
5218                 else
5219                 {
5220                         penalty = r_info[m_list[p_ptr->riding].r_idx].level - p_ptr->skill_exp[GINOU_RIDING] / 80;
5221                         penalty += 30;
5222                         if (penalty < 30) penalty = 30;
5223                 }
5224                 if (p_ptr->tval_ammo == TV_BOLT) penalty *= 2;
5225                 p_ptr->to_h_b -= penalty;
5226                 p_ptr->dis_to_h_b -= penalty;
5227         }
5228
5229         /* Different calculation for monks with empty hands */
5230         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) &&
5231                 (empty_hands_status & EMPTY_HAND_RARM) && !p_ptr->hidarite)
5232         {
5233                 int blow_base = p_ptr->lev + adj_dex_blow[p_ptr->stat_ind[A_DEX]];
5234                 p_ptr->num_blow[0] = 0;
5235
5236                 if (p_ptr->pclass == CLASS_FORCETRAINER)
5237                 {
5238                         if (blow_base > 18) p_ptr->num_blow[0]++;
5239                         if (blow_base > 31) p_ptr->num_blow[0]++;
5240                         if (blow_base > 44) p_ptr->num_blow[0]++;
5241                         if (blow_base > 58) p_ptr->num_blow[0]++;
5242                         if (p_ptr->magic_num1[0])
5243                         {
5244                                 p_ptr->to_d[0] += (p_ptr->magic_num1[0]/5);
5245                                 p_ptr->dis_to_d[0] += (p_ptr->magic_num1[0]/5);
5246                         }
5247                 }
5248                 else
5249                 {
5250                         if (blow_base > 12) p_ptr->num_blow[0]++;
5251                         if (blow_base > 22) p_ptr->num_blow[0]++;
5252                         if (blow_base > 31) p_ptr->num_blow[0]++;
5253                         if (blow_base > 39) p_ptr->num_blow[0]++;
5254                         if (blow_base > 46) p_ptr->num_blow[0]++;
5255                         if (blow_base > 53) p_ptr->num_blow[0]++;
5256                         if (blow_base > 59) p_ptr->num_blow[0]++;
5257                 }
5258
5259                 if (heavy_armor() && (p_ptr->pclass != CLASS_BERSERKER))
5260                         p_ptr->num_blow[0] /= 2;
5261                 else
5262                 {
5263                         p_ptr->to_h[0] += (p_ptr->lev / 3);
5264                         p_ptr->dis_to_h[0] += (p_ptr->lev / 3);
5265
5266                         p_ptr->to_d[0] += (p_ptr->lev / 6);
5267                         p_ptr->dis_to_d[0] += (p_ptr->lev / 6);
5268                 }
5269
5270                 if (p_ptr->special_defense & KAMAE_BYAKKO)
5271                 {
5272                         p_ptr->to_a -= 40;
5273                         p_ptr->dis_to_a -= 40;
5274                         
5275                 }
5276                 else if (p_ptr->special_defense & KAMAE_SEIRYU)
5277                 {
5278                         p_ptr->to_a -= 50;
5279                         p_ptr->dis_to_a -= 50;
5280                         p_ptr->resist_acid = TRUE;
5281                         p_ptr->resist_fire = TRUE;
5282                         p_ptr->resist_elec = TRUE;
5283                         p_ptr->resist_cold = TRUE;
5284                         p_ptr->resist_pois = TRUE;
5285                         p_ptr->sh_fire = TRUE;
5286                         p_ptr->sh_elec = TRUE;
5287                         p_ptr->sh_cold = TRUE;
5288                         p_ptr->levitation = TRUE;
5289                 }
5290                 else if (p_ptr->special_defense & KAMAE_GENBU)
5291                 {
5292                         p_ptr->to_a += (p_ptr->lev*p_ptr->lev)/50;
5293                         p_ptr->dis_to_a += (p_ptr->lev*p_ptr->lev)/50;
5294                         p_ptr->reflect = TRUE;
5295                         p_ptr->num_blow[0] -= 2;
5296                         if ((p_ptr->pclass == CLASS_MONK) && (p_ptr->lev > 42)) p_ptr->num_blow[0]--;
5297                         if (p_ptr->num_blow[0] < 0) p_ptr->num_blow[0] = 0;
5298                 }
5299                 else if (p_ptr->special_defense & KAMAE_SUZAKU)
5300                 {
5301                         p_ptr->to_h[0] -= (p_ptr->lev / 3);
5302                         p_ptr->to_d[0] -= (p_ptr->lev / 6);
5303
5304                         p_ptr->dis_to_h[0] -= (p_ptr->lev / 3);
5305                         p_ptr->dis_to_d[0] -= (p_ptr->lev / 6);
5306                         p_ptr->num_blow[0] /= 2;
5307                         p_ptr->levitation = TRUE;
5308                 }
5309
5310                 p_ptr->num_blow[0] += 1+extra_blows[0];
5311         }
5312
5313         if (p_ptr->riding) p_ptr->levitation = riding_levitation;
5314
5315         monk_armour_aux = FALSE;
5316
5317         if (heavy_armor())
5318         {
5319                 monk_armour_aux = TRUE;
5320         }
5321
5322         for (i = 0; i < 2; i++)
5323         {
5324                 if (buki_motteruka(INVEN_RARM+i))
5325                 {
5326                         int tval = inventory[INVEN_RARM+i].tval - TV_WEAPON_BEGIN;
5327                         int sval = inventory[INVEN_RARM+i].sval;
5328
5329                         p_ptr->to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
5330                         p_ptr->dis_to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
5331                         if ((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER))
5332                         {
5333                                 if (!s_info[p_ptr->pclass].w_max[tval][sval])
5334                                 {
5335                                         p_ptr->to_h[i] -= 40;
5336                                         p_ptr->dis_to_h[i] -= 40;
5337                                         p_ptr->icky_wield[i] = TRUE;
5338                                 }
5339                         }
5340                         else if (p_ptr->pclass == CLASS_NINJA)
5341                         {
5342                                 if ((s_info[CLASS_NINJA].w_max[tval][sval] <= WEAPON_EXP_BEGINNER) || (inventory[INVEN_LARM-i].tval == TV_SHIELD))
5343                                 {
5344                                         p_ptr->to_h[i] -= 40;
5345                                         p_ptr->dis_to_h[i] -= 40;
5346                                         p_ptr->icky_wield[i] = TRUE;
5347                                         p_ptr->num_blow[i] /= 2;
5348                                         if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1;
5349                                 }
5350                         }
5351
5352                         if (inventory[INVEN_RARM + i].name1 == ART_IRON_BALL) p_ptr->align -= 1000;
5353                 }
5354         }
5355
5356         /* Maximum speed is (+99). (internally it's 110 + 99) */
5357         /* Temporary lightspeed forces to be maximum speed */
5358         if ((p_ptr->lightspeed && !p_ptr->riding) || (new_speed > 209))
5359         {
5360                 new_speed = 209;
5361         }
5362
5363         /* Minimum speed is (-99). (internally it's 110 - 99) */
5364         if (new_speed < 11) new_speed = 11;
5365
5366         /* Display the speed (if needed) */
5367         if (p_ptr->pspeed != (byte)new_speed)
5368         {
5369                 p_ptr->pspeed = (byte)new_speed;
5370                 p_ptr->redraw |= (PR_SPEED);
5371         }
5372
5373         if (yoiyami)
5374         {
5375                 if (p_ptr->to_a > (0 - p_ptr->ac))
5376                         p_ptr->to_a = 0 - p_ptr->ac;
5377                 if (p_ptr->dis_to_a > (0 - p_ptr->dis_ac))
5378                         p_ptr->dis_to_a = 0 - p_ptr->dis_ac;
5379         }
5380
5381         /* Redraw armor (if needed) */
5382         if ((p_ptr->dis_ac != old_dis_ac) || (p_ptr->dis_to_a != old_dis_to_a))
5383         {
5384                 /* Redraw */
5385                 p_ptr->redraw |= (PR_ARMOR);
5386
5387                 /* Window stuff */
5388                 p_ptr->window |= (PW_PLAYER);
5389         }
5390
5391
5392         if (p_ptr->ryoute && !omoi)
5393         {
5394                 int bonus_to_h=0, bonus_to_d=0;
5395                 bonus_to_d = ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128)/2;
5396                 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);
5397
5398                 p_ptr->to_h[default_hand] += MAX(bonus_to_h,1);
5399                 p_ptr->dis_to_h[default_hand] += MAX(bonus_to_h,1);
5400                 p_ptr->to_d[default_hand] += MAX(bonus_to_d,1);
5401                 p_ptr->dis_to_d[default_hand] += MAX(bonus_to_d,1);
5402         }
5403
5404         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;
5405
5406         /* Affect Skill -- stealth (bonus one) */
5407         p_ptr->skill_stl += 1;
5408
5409         if (IS_TIM_STEALTH()) p_ptr->skill_stl += 99;
5410
5411         /* Affect Skill -- disarming (DEX and INT) */
5412         p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]];
5413         p_ptr->skill_dis += adj_int_dis[p_ptr->stat_ind[A_INT]];
5414
5415         /* Affect Skill -- magic devices (INT) */
5416         p_ptr->skill_dev += adj_int_dev[p_ptr->stat_ind[A_INT]];
5417
5418         /* Affect Skill -- saving throw (WIS) */
5419         p_ptr->skill_sav += adj_wis_sav[p_ptr->stat_ind[A_WIS]];
5420
5421         /* Affect Skill -- digging (STR) */
5422         p_ptr->skill_dig += adj_str_dig[p_ptr->stat_ind[A_STR]];
5423
5424         /* Affect Skill -- disarming (Level, by Class) */
5425         p_ptr->skill_dis += ((cp_ptr->x_dis * p_ptr->lev / 10) + (ap_ptr->a_dis * p_ptr->lev / 50));
5426
5427         /* Affect Skill -- magic devices (Level, by Class) */
5428         p_ptr->skill_dev += ((cp_ptr->x_dev * p_ptr->lev / 10) + (ap_ptr->a_dev * p_ptr->lev / 50));
5429
5430         /* Affect Skill -- saving throw (Level, by Class) */
5431         p_ptr->skill_sav += ((cp_ptr->x_sav * p_ptr->lev / 10) + (ap_ptr->a_sav * p_ptr->lev / 50));
5432
5433         /* Affect Skill -- stealth (Level, by Class) */
5434         p_ptr->skill_stl += (cp_ptr->x_stl * p_ptr->lev / 10);
5435
5436         /* Affect Skill -- search ability (Level, by Class) */
5437         p_ptr->skill_srh += (cp_ptr->x_srh * p_ptr->lev / 10);
5438
5439         /* Affect Skill -- search frequency (Level, by Class) */
5440         p_ptr->skill_fos += (cp_ptr->x_fos * p_ptr->lev / 10);
5441
5442         /* Affect Skill -- combat (normal) (Level, by Class) */
5443         p_ptr->skill_thn += ((cp_ptr->x_thn * p_ptr->lev / 10) + (ap_ptr->a_thn * p_ptr->lev / 50));
5444
5445         /* Affect Skill -- combat (shooting) (Level, by Class) */
5446         p_ptr->skill_thb += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
5447
5448         /* Affect Skill -- combat (throwing) (Level, by Class) */
5449         p_ptr->skill_tht += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
5450
5451
5452         if ((prace_is_(RACE_S_FAIRY)) && (p_ptr->pseikaku != SEIKAKU_SEXY) && (p_ptr->cursed & TRC_AGGRAVATE))
5453         {
5454                 p_ptr->cursed &= ~(TRC_AGGRAVATE);
5455                 p_ptr->skill_stl = MIN(p_ptr->skill_stl - 3, (p_ptr->skill_stl + 2) / 2);
5456         }
5457
5458         /* Limit Skill -- stealth from 0 to 30 */
5459         if (p_ptr->skill_stl > 30) p_ptr->skill_stl = 30;
5460         if (p_ptr->skill_stl < 0) p_ptr->skill_stl = 0;
5461
5462         /* Limit Skill -- digging from 1 up */
5463         if (p_ptr->skill_dig < 1) p_ptr->skill_dig = 1;
5464
5465         if (p_ptr->anti_magic && (p_ptr->skill_sav < (90 + p_ptr->lev))) p_ptr->skill_sav = 90 + p_ptr->lev;
5466
5467         if (p_ptr->tsubureru) p_ptr->skill_sav = 10;
5468
5469         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;
5470
5471         if (down_saving) p_ptr->skill_sav /= 2;
5472
5473         /* Hack -- Each elemental immunity includes resistance */
5474         if (p_ptr->immune_acid) p_ptr->resist_acid = TRUE;
5475         if (p_ptr->immune_elec) p_ptr->resist_elec = TRUE;
5476         if (p_ptr->immune_fire) p_ptr->resist_fire = TRUE;
5477         if (p_ptr->immune_cold) p_ptr->resist_cold = TRUE;
5478
5479         /* Determine player alignment */
5480         for (i = 0, j = 0; i < 8; i++)
5481         {
5482                 switch (p_ptr->vir_types[i])
5483                 {
5484                 case V_JUSTICE:
5485                         p_ptr->align += p_ptr->virtues[i] * 2;
5486                         break;
5487                 case V_CHANCE:
5488                         /* Do nothing */
5489                         break;
5490                 case V_NATURE:
5491                 case V_HARMONY:
5492                         neutral[j++] = i;
5493                         break;
5494                 case V_UNLIFE:
5495                         p_ptr->align -= p_ptr->virtues[i];
5496                         break;
5497                 default:
5498                         p_ptr->align += p_ptr->virtues[i];
5499                         break;
5500                 }
5501         }
5502
5503         for (i = 0; i < j; i++)
5504         {
5505                 if (p_ptr->align > 0)
5506                 {
5507                         p_ptr->align -= p_ptr->virtues[neutral[i]] / 2;
5508                         if (p_ptr->align < 0) p_ptr->align = 0;
5509                 }
5510                 else if (p_ptr->align < 0)
5511                 {
5512                         p_ptr->align += p_ptr->virtues[neutral[i]] / 2;
5513                         if (p_ptr->align > 0) p_ptr->align = 0;
5514                 }
5515         }
5516
5517         /* Hack -- handle "xtra" mode */
5518         if (character_xtra) return;
5519
5520         /* Take note when "heavy bow" changes */
5521         if (p_ptr->old_heavy_shoot != p_ptr->heavy_shoot)
5522         {
5523                 /* Message */
5524                 if (p_ptr->heavy_shoot)
5525                 {
5526                         msg_print(_("こんな重い弓を装備しているのは大変だ。", "You have trouble wielding such a heavy bow."));
5527                 }
5528                 else if (inventory[INVEN_BOW].k_idx)
5529                 {
5530                         msg_print(_("この弓なら装備していても辛くない。", "You have no trouble wielding your bow."));
5531                 }
5532                 else
5533                 {
5534                         msg_print(_("重い弓を装備からはずして体が楽になった。", "You feel relieved to put down your heavy bow."));
5535                 }
5536
5537                 /* Save it */
5538                 p_ptr->old_heavy_shoot = p_ptr->heavy_shoot;
5539         }
5540
5541         for (i = 0 ; i < 2 ; i++)
5542         {
5543                 /* Take note when "heavy weapon" changes */
5544                 if (p_ptr->old_heavy_wield[i] != p_ptr->heavy_wield[i])
5545                 {
5546                         /* Message */
5547                         if (p_ptr->heavy_wield[i])
5548                         {
5549                                 msg_print(_("こんな重い武器を装備しているのは大変だ。", "You have trouble wielding such a heavy weapon."));
5550                         }
5551                         else if (buki_motteruka(INVEN_RARM+i))
5552                         {
5553                                 msg_print(_("これなら装備していても辛くない。", "You have no trouble wielding your weapon."));
5554                         }
5555                         else if (p_ptr->heavy_wield[1-i])
5556                         {
5557                                 msg_print(_("まだ武器が重い。", "You have still trouble wielding a heavy weapon."));
5558                         }
5559                         else
5560                         {
5561                                 msg_print(_("重い武器を装備からはずして体が楽になった。", "You feel relieved to put down your heavy weapon."));
5562                         }
5563
5564                         /* Save it */
5565                         p_ptr->old_heavy_wield[i] = p_ptr->heavy_wield[i];
5566                 }
5567
5568                 /* Take note when "heavy weapon" changes */
5569                 if (p_ptr->old_riding_wield[i] != p_ptr->riding_wield[i])
5570                 {
5571                         /* Message */
5572                         if (p_ptr->riding_wield[i])
5573                         {
5574                                 msg_print(_("この武器は乗馬中に使うにはむかないようだ。", "This weapon is not suitable for use while riding."));
5575                         }
5576                         else if (!p_ptr->riding)
5577                         {
5578                                 msg_print(_("この武器は徒歩で使いやすい。", "This weapon was not suitable for use while riding."));
5579                         }
5580                         else if (buki_motteruka(INVEN_RARM+i))
5581                         {
5582                                 msg_print(_("これなら乗馬中にぴったりだ。", "This weapon is suitable for use while riding."));
5583                         }
5584                         /* Save it */
5585                         p_ptr->old_riding_wield[i] = p_ptr->riding_wield[i];
5586                 }
5587
5588                 /* Take note when "illegal weapon" changes */
5589                 if (p_ptr->old_icky_wield[i] != p_ptr->icky_wield[i])
5590                 {
5591                         /* Message */
5592                         if (p_ptr->icky_wield[i])
5593                         {
5594                                 msg_print(_("今の装備はどうも自分にふさわしくない気がする。", "You do not feel comfortable with your weapon."));
5595                                 if (hack_mind)
5596                                 {
5597                                         chg_virtue(V_FAITH, -1);
5598                                 }
5599                         }
5600                         else if (buki_motteruka(INVEN_RARM+i))
5601                         {
5602                                 msg_print(_("今の装備は自分にふさわしい気がする。", "You feel comfortable with your weapon."));
5603                         }
5604                         else
5605                         {
5606                                 msg_print(_("装備をはずしたら随分と気が楽になった。", "You feel more comfortable after removing your weapon."));
5607                         }
5608
5609                         /* Save it */
5610                         p_ptr->old_icky_wield[i] = p_ptr->icky_wield[i];
5611                 }
5612         }
5613
5614         if (p_ptr->riding && (p_ptr->old_riding_ryoute != p_ptr->riding_ryoute))
5615         {
5616                 /* Message */
5617                 if (p_ptr->riding_ryoute)
5618                 {
5619 #ifdef JP
5620                         msg_format("%s馬を操れない。", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "両手がふさがっていて" : "");
5621 #else
5622                         msg_print("You are using both hand for fighting, and you can't control a riding pet.");
5623 #endif
5624                 }
5625                 else
5626                 {
5627 #ifdef JP
5628                         msg_format("%s馬を操れるようになった。", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "手が空いて" : "");
5629 #else
5630                         msg_print("You began to control riding pet with one hand.");
5631 #endif
5632                 }
5633
5634                 p_ptr->old_riding_ryoute = p_ptr->riding_ryoute;
5635         }
5636
5637         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_NINJA)) && (monk_armour_aux != monk_notify_aux))
5638         {
5639                 if (heavy_armor())
5640                 {
5641                         msg_print(_("装備が重くてバランスを取れない。", "The weight of your armor disrupts your balance."));
5642                         if (hack_mind)
5643                         {
5644                                 chg_virtue(V_HARMONY, -1);
5645                         }
5646                 }
5647                 else
5648                 {
5649                         msg_print(_("バランスがとれるようになった。", "You regain your balance."));
5650                 }
5651                 
5652                 monk_notify_aux = monk_armour_aux;
5653         }
5654
5655         for (i = 0; i < INVEN_PACK; i++)
5656         {
5657 #if 0
5658                 if ((inventory[i].tval == TV_SORCERY_BOOK) && (inventory[i].sval == 2)) have_dd_s = TRUE;
5659                 if ((inventory[i].tval == TV_TRUMP_BOOK) && (inventory[i].sval == 1)) have_dd_t = TRUE;
5660 #endif
5661                 if ((inventory[i].tval == TV_NATURE_BOOK) && (inventory[i].sval == 2)) have_sw = TRUE;
5662                 if ((inventory[i].tval == TV_CRAFT_BOOK) && (inventory[i].sval == 2)) have_kabe = TRUE;
5663         }
5664         for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
5665         {
5666                 object_type *o_ptr;
5667
5668                 /* Acquire object */
5669                 o_ptr = &o_list[this_o_idx];
5670
5671                 /* Acquire next object */
5672                 next_o_idx = o_ptr->next_o_idx;
5673
5674 #if 0
5675                 if ((o_ptr->tval == TV_SORCERY_BOOK) && (o_ptr->sval == 3)) have_dd_s = TRUE;
5676                 if ((o_ptr->tval == TV_TRUMP_BOOK) && (o_ptr->sval == 1)) have_dd_t = TRUE;
5677 #endif
5678                 if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2)) have_sw = TRUE;
5679                 if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2)) have_kabe = TRUE;
5680         }
5681
5682         if (p_ptr->pass_wall && !p_ptr->kill_wall) p_ptr->no_flowed = TRUE;
5683 #if 0
5684         if (have_dd_s && ((p_ptr->realm1 == REALM_SORCERY) || (p_ptr->realm2 == REALM_SORCERY) || (p_ptr->pclass == CLASS_SORCERER)))
5685         {
5686                 const magic_type *s_ptr = &mp_ptr->info[REALM_SORCERY-1][SPELL_DD_S];
5687                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5688         }
5689
5690         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)))
5691         {
5692                 const magic_type *s_ptr = &mp_ptr->info[REALM_TRUMP-1][SPELL_DD_T];
5693                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5694         }
5695 #endif
5696         if (have_sw && ((p_ptr->realm1 == REALM_NATURE) || (p_ptr->realm2 == REALM_NATURE) || (p_ptr->pclass == CLASS_SORCERER)))
5697         {
5698                 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE-1][SPELL_SW];
5699                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5700         }
5701
5702         if (have_kabe && ((p_ptr->realm1 == REALM_CRAFT) || (p_ptr->realm2 == REALM_CRAFT) || (p_ptr->pclass == CLASS_SORCERER)))
5703         {
5704                 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT-1][SPELL_KABE];
5705                 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5706         }
5707 }
5708
5709
5710
5711 /*
5712  * Handle "p_ptr->notice"
5713  */
5714 void notice_stuff(void)
5715 {
5716         /* Notice stuff */
5717         if (!p_ptr->notice) return;
5718
5719
5720         /* Actually do auto-destroy */
5721         if (p_ptr->notice & (PN_AUTODESTROY))
5722         {
5723                 p_ptr->notice &= ~(PN_AUTODESTROY);
5724                 autopick_delayed_alter();
5725         }
5726
5727         /* Combine the pack */
5728         if (p_ptr->notice & (PN_COMBINE))
5729         {
5730                 p_ptr->notice &= ~(PN_COMBINE);
5731                 combine_pack();
5732         }
5733
5734         /* Reorder the pack */
5735         if (p_ptr->notice & (PN_REORDER))
5736         {
5737                 p_ptr->notice &= ~(PN_REORDER);
5738                 reorder_pack();
5739         }
5740 }
5741
5742
5743 /*
5744  * Handle "p_ptr->update"
5745  */
5746 void update_stuff(void)
5747 {
5748         /* Update stuff */
5749         if (!p_ptr->update) return;
5750
5751
5752         if (p_ptr->update & (PU_BONUS))
5753         {
5754                 p_ptr->update &= ~(PU_BONUS);
5755                 calc_bonuses();
5756         }
5757
5758         if (p_ptr->update & (PU_TORCH))
5759         {
5760                 p_ptr->update &= ~(PU_TORCH);
5761                 calc_torch();
5762         }
5763
5764         if (p_ptr->update & (PU_HP))
5765         {
5766                 p_ptr->update &= ~(PU_HP);
5767                 calc_hitpoints();
5768         }
5769
5770         if (p_ptr->update & (PU_MANA))
5771         {
5772                 p_ptr->update &= ~(PU_MANA);
5773                 calc_mana();
5774         }
5775
5776         if (p_ptr->update & (PU_SPELLS))
5777         {
5778                 p_ptr->update &= ~(PU_SPELLS);
5779                 calc_spells();
5780         }
5781
5782
5783         /* Character is not ready yet, no screen updates */
5784         if (!character_generated) return;
5785
5786
5787         /* Character is in "icky" mode, no screen updates */
5788         if (character_icky) return;
5789
5790
5791         if (p_ptr->update & (PU_UN_LITE))
5792         {
5793                 p_ptr->update &= ~(PU_UN_LITE);
5794                 forget_lite();
5795         }
5796
5797         if (p_ptr->update & (PU_UN_VIEW))
5798         {
5799                 p_ptr->update &= ~(PU_UN_VIEW);
5800                 forget_view();
5801         }
5802
5803         if (p_ptr->update & (PU_VIEW))
5804         {
5805                 p_ptr->update &= ~(PU_VIEW);
5806                 update_view();
5807         }
5808
5809         if (p_ptr->update & (PU_LITE))
5810         {
5811                 p_ptr->update &= ~(PU_LITE);
5812                 update_lite();
5813         }
5814
5815
5816         if (p_ptr->update & (PU_FLOW))
5817         {
5818                 p_ptr->update &= ~(PU_FLOW);
5819                 update_flow();
5820         }
5821
5822         if (p_ptr->update & (PU_DISTANCE))
5823         {
5824                 p_ptr->update &= ~(PU_DISTANCE);
5825
5826                 /* Still need to call update_monsters(FALSE) after update_mon_lite() */ 
5827                 /* p_ptr->update &= ~(PU_MONSTERS); */
5828
5829                 update_monsters(TRUE);
5830         }
5831
5832         if (p_ptr->update & (PU_MON_LITE))
5833         {
5834                 p_ptr->update &= ~(PU_MON_LITE);
5835                 update_mon_lite();
5836         }
5837
5838         /*
5839          * Mega-Hack -- Delayed visual update
5840          * Only used if update_view(), update_lite() or update_mon_lite() was called
5841          */
5842         if (p_ptr->update & (PU_DELAY_VIS))
5843         {
5844                 p_ptr->update &= ~(PU_DELAY_VIS);
5845                 delayed_visual_update();
5846         }
5847
5848         if (p_ptr->update & (PU_MONSTERS))
5849         {
5850                 p_ptr->update &= ~(PU_MONSTERS);
5851                 update_monsters(FALSE);
5852         }
5853 }
5854
5855
5856 /*
5857  * Handle "p_ptr->redraw"
5858  */
5859 void redraw_stuff(void)
5860 {
5861         /* Redraw stuff */
5862         if (!p_ptr->redraw) return;
5863
5864
5865         /* Character is not ready yet, no screen updates */
5866         if (!character_generated) return;
5867
5868
5869         /* Character is in "icky" mode, no screen updates */
5870         if (character_icky) return;
5871
5872
5873
5874         /* Hack -- clear the screen */
5875         if (p_ptr->redraw & (PR_WIPE))
5876         {
5877                 p_ptr->redraw &= ~(PR_WIPE);
5878                 msg_print(NULL);
5879                 Term_clear();
5880         }
5881
5882
5883         if (p_ptr->redraw & (PR_MAP))
5884         {
5885                 p_ptr->redraw &= ~(PR_MAP);
5886                 prt_map();
5887         }
5888
5889
5890         if (p_ptr->redraw & (PR_BASIC))
5891         {
5892                 p_ptr->redraw &= ~(PR_BASIC);
5893                 p_ptr->redraw &= ~(PR_MISC | PR_TITLE | PR_STATS);
5894                 p_ptr->redraw &= ~(PR_LEV | PR_EXP | PR_GOLD);
5895                 p_ptr->redraw &= ~(PR_ARMOR | PR_HP | PR_MANA);
5896                 p_ptr->redraw &= ~(PR_DEPTH | PR_HEALTH | PR_UHEALTH);
5897                 prt_frame_basic();
5898                 prt_time();
5899                 prt_dungeon();
5900         }
5901
5902         if (p_ptr->redraw & (PR_EQUIPPY))
5903         {
5904                 p_ptr->redraw &= ~(PR_EQUIPPY);
5905                 print_equippy(); /* To draw / delete equippy chars */
5906         }
5907
5908         if (p_ptr->redraw & (PR_MISC))
5909         {
5910                 p_ptr->redraw &= ~(PR_MISC);
5911                 prt_field(rp_ptr->title, ROW_RACE, COL_RACE);
5912 /*              prt_field(cp_ptr->title, ROW_CLASS, COL_CLASS); */
5913
5914         }
5915
5916         if (p_ptr->redraw & (PR_TITLE))
5917         {
5918                 p_ptr->redraw &= ~(PR_TITLE);
5919                 prt_title();
5920         }
5921
5922         if (p_ptr->redraw & (PR_LEV))
5923         {
5924                 p_ptr->redraw &= ~(PR_LEV);
5925                 prt_level();
5926         }
5927
5928         if (p_ptr->redraw & (PR_EXP))
5929         {
5930                 p_ptr->redraw &= ~(PR_EXP);
5931                 prt_exp();
5932         }
5933
5934         if (p_ptr->redraw & (PR_STATS))
5935         {
5936                 p_ptr->redraw &= ~(PR_STATS);
5937                 prt_stat(A_STR);
5938                 prt_stat(A_INT);
5939                 prt_stat(A_WIS);
5940                 prt_stat(A_DEX);
5941                 prt_stat(A_CON);
5942                 prt_stat(A_CHR);
5943         }
5944
5945         if (p_ptr->redraw & (PR_STATUS))
5946         {
5947                 p_ptr->redraw &= ~(PR_STATUS);
5948                 prt_status();
5949         }
5950
5951         if (p_ptr->redraw & (PR_ARMOR))
5952         {
5953                 p_ptr->redraw &= ~(PR_ARMOR);
5954                 prt_ac();
5955         }
5956
5957         if (p_ptr->redraw & (PR_HP))
5958         {
5959                 p_ptr->redraw &= ~(PR_HP);
5960                 prt_hp();
5961         }
5962
5963         if (p_ptr->redraw & (PR_MANA))
5964         {
5965                 p_ptr->redraw &= ~(PR_MANA);
5966                 prt_sp();
5967         }
5968
5969         if (p_ptr->redraw & (PR_GOLD))
5970         {
5971                 p_ptr->redraw &= ~(PR_GOLD);
5972                 prt_gold();
5973         }
5974
5975         if (p_ptr->redraw & (PR_DEPTH))
5976         {
5977                 p_ptr->redraw &= ~(PR_DEPTH);
5978                 prt_depth();
5979         }
5980
5981         if (p_ptr->redraw & (PR_HEALTH))
5982         {
5983                 p_ptr->redraw &= ~(PR_HEALTH);
5984                 health_redraw(FALSE);
5985         }
5986
5987         if (p_ptr->redraw & (PR_UHEALTH))
5988         {
5989                 p_ptr->redraw &= ~(PR_UHEALTH);
5990                 health_redraw(TRUE);
5991         }
5992
5993
5994         if (p_ptr->redraw & (PR_EXTRA))
5995         {
5996                 p_ptr->redraw &= ~(PR_EXTRA);
5997                 p_ptr->redraw &= ~(PR_CUT | PR_STUN);
5998                 p_ptr->redraw &= ~(PR_HUNGER);
5999                 p_ptr->redraw &= ~(PR_STATE | PR_SPEED | PR_STUDY | PR_IMITATION | PR_STATUS);
6000                 prt_frame_extra();
6001         }
6002
6003         if (p_ptr->redraw & (PR_CUT))
6004         {
6005                 p_ptr->redraw &= ~(PR_CUT);
6006                 prt_cut();
6007         }
6008
6009         if (p_ptr->redraw & (PR_STUN))
6010         {
6011                 p_ptr->redraw &= ~(PR_STUN);
6012                 prt_stun();
6013         }
6014
6015         if (p_ptr->redraw & (PR_HUNGER))
6016         {
6017                 p_ptr->redraw &= ~(PR_HUNGER);
6018                 prt_hunger();
6019         }
6020
6021         if (p_ptr->redraw & (PR_STATE))
6022         {
6023                 p_ptr->redraw &= ~(PR_STATE);
6024                 prt_state();
6025         }
6026
6027         if (p_ptr->redraw & (PR_SPEED))
6028         {
6029                 p_ptr->redraw &= ~(PR_SPEED);
6030                 prt_speed();
6031         }
6032
6033         if (p_ptr->pclass == CLASS_IMITATOR)
6034         {
6035                 if (p_ptr->redraw & (PR_IMITATION))
6036                 {
6037                         p_ptr->redraw &= ~(PR_IMITATION);
6038                         prt_imitation();
6039                 }
6040         }
6041         else if (p_ptr->redraw & (PR_STUDY))
6042         {
6043                 p_ptr->redraw &= ~(PR_STUDY);
6044                 prt_study();
6045         }
6046 }
6047
6048
6049 /*
6050  * Handle "p_ptr->window"
6051  */
6052 void window_stuff(void)
6053 {
6054         int j;
6055
6056         u32b mask = 0L;
6057
6058
6059         /* Nothing to do */
6060         if (!p_ptr->window) return;
6061
6062         /* Scan windows */
6063         for (j = 0; j < 8; j++)
6064         {
6065                 /* Save usable flags */
6066                 if (angband_term[j]) mask |= window_flag[j];
6067         }
6068
6069         /* Apply usable flags */
6070         p_ptr->window &= mask;
6071
6072         /* Nothing to do */
6073         if (!p_ptr->window) return;
6074
6075
6076         /* Display inventory */
6077         if (p_ptr->window & (PW_INVEN))
6078         {
6079                 p_ptr->window &= ~(PW_INVEN);
6080                 fix_inven();
6081         }
6082
6083         /* Display equipment */
6084         if (p_ptr->window & (PW_EQUIP))
6085         {
6086                 p_ptr->window &= ~(PW_EQUIP);
6087                 fix_equip();
6088         }
6089
6090         /* Display spell list */
6091         if (p_ptr->window & (PW_SPELL))
6092         {
6093                 p_ptr->window &= ~(PW_SPELL);
6094                 fix_spell();
6095         }
6096
6097         /* Display player */
6098         if (p_ptr->window & (PW_PLAYER))
6099         {
6100                 p_ptr->window &= ~(PW_PLAYER);
6101                 fix_player();
6102         }
6103         
6104         /* Display monster list */
6105         if (p_ptr->window & (PW_MONSTER_LIST))
6106         {
6107                 p_ptr->window &= ~(PW_MONSTER_LIST);
6108                 fix_monster_list();
6109         }
6110         
6111         /* Display overhead view */
6112         if (p_ptr->window & (PW_MESSAGE))
6113         {
6114                 p_ptr->window &= ~(PW_MESSAGE);
6115                 fix_message();
6116         }
6117
6118         /* Display overhead view */
6119         if (p_ptr->window & (PW_OVERHEAD))
6120         {
6121                 p_ptr->window &= ~(PW_OVERHEAD);
6122                 fix_overhead();
6123         }
6124
6125         /* Display overhead view */
6126         if (p_ptr->window & (PW_DUNGEON))
6127         {
6128                 p_ptr->window &= ~(PW_DUNGEON);
6129                 fix_dungeon();
6130         }
6131
6132         /* Display monster recall */
6133         if (p_ptr->window & (PW_MONSTER))
6134         {
6135                 p_ptr->window &= ~(PW_MONSTER);
6136                 fix_monster();
6137         }
6138
6139         /* Display object recall */
6140         if (p_ptr->window & (PW_OBJECT))
6141         {
6142                 p_ptr->window &= ~(PW_OBJECT);
6143                 fix_object();
6144         }
6145 }
6146
6147
6148 /*
6149  * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
6150  */
6151 void handle_stuff(void)
6152 {
6153         /* Update stuff */
6154         if (p_ptr->update) update_stuff();
6155
6156         /* Redraw stuff */
6157         if (p_ptr->redraw) redraw_stuff();
6158
6159         /* Window stuff */
6160         if (p_ptr->window) window_stuff();
6161 }
6162
6163
6164 s16b empty_hands(bool riding_control)
6165 {
6166         s16b status = EMPTY_HAND_NONE;
6167
6168         if (!inventory[INVEN_RARM].k_idx) status |= EMPTY_HAND_RARM;
6169         if (!inventory[INVEN_LARM].k_idx) status |= EMPTY_HAND_LARM;
6170
6171         if (riding_control && (status != EMPTY_HAND_NONE) && p_ptr->riding && !(p_ptr->pet_extra_flags & PF_RYOUTE))
6172         {
6173                 if (status & EMPTY_HAND_LARM) status &= ~(EMPTY_HAND_LARM);
6174                 else if (status & EMPTY_HAND_RARM) status &= ~(EMPTY_HAND_RARM);
6175         }
6176
6177         return status;
6178 }
6179
6180
6181 bool heavy_armor(void)
6182 {
6183         u16b monk_arm_wgt = 0;
6184
6185         if ((p_ptr->pclass != CLASS_MONK) && (p_ptr->pclass != CLASS_FORCETRAINER) && (p_ptr->pclass != CLASS_NINJA)) return FALSE;
6186
6187         /* Weight the armor */
6188         if(inventory[INVEN_RARM].tval > TV_SWORD) monk_arm_wgt += inventory[INVEN_RARM].weight;
6189         if(inventory[INVEN_LARM].tval > TV_SWORD) monk_arm_wgt += inventory[INVEN_LARM].weight;
6190         monk_arm_wgt += inventory[INVEN_BODY].weight;
6191         monk_arm_wgt += inventory[INVEN_HEAD].weight;
6192         monk_arm_wgt += inventory[INVEN_OUTER].weight;
6193         monk_arm_wgt += inventory[INVEN_HANDS].weight;
6194         monk_arm_wgt += inventory[INVEN_FEET].weight;
6195
6196         return (monk_arm_wgt > (100 + (p_ptr->lev * 4)));
6197 }
6198
6199 void update_playtime(void)
6200 {
6201         /* Check if the game has started */
6202         if (start_time != 0)
6203         {
6204                 u32b tmp = time(NULL);
6205                 playtime += (tmp - start_time);
6206                 start_time = tmp;
6207         }
6208 }