5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
7 * This software may be copied and distributed for educational, research,
8 * and not for profit purposes provided that this copyright and statement
9 * are included in all such copies. Other copyrights may also apply.
12 /* Purpose: misc code */
20 * Converts stat num into a six-char (right justified) string
22 void cnv_stat(int val, char *out_val)
27 int bonus = (val - 18);
31 sprintf(out_val, "18/%3s", "***");
33 else if (bonus >= 100)
35 sprintf(out_val, "18/%03d", bonus);
39 sprintf(out_val, " 18/%02d", bonus);
46 sprintf(out_val, " %2d", val);
53 * Modify a stat value by a "modifier", return new value
55 * Stats go up: 3,4,...,17,18,18/10,18/20,...,18/220
56 * Or even: 18/13, 18/23, 18/33, ..., 18/220
58 * Stats go down: 18/220, 18/210,..., 18/10, 18, 17, ..., 3
59 * Or even: 18/13, 18/03, 18, 17, ..., 3
61 s16b modify_stat_value(int value, int amount)
68 /* Apply each point */
69 for (i = 0; i < amount; i++)
71 /* One point at a time */
72 if (value < 18) value++;
74 /* Ten "points" at a time */
82 /* Apply each point */
83 for (i = 0; i < (0 - amount); i++)
85 /* Ten points at a time */
86 if (value >= 18+10) value -= 10;
88 /* Hack -- prevent weirdness */
89 else if (value > 18) value = 18;
91 /* One point at a time */
92 else if (value > 3) value--;
96 /* Return new value */
103 * Print character info at given row, column in a 13 char field
105 static void prt_field(cptr info, int row, int col)
107 /* Dump 13 spaces to clear */
108 c_put_str(TERM_WHITE, " ", row, col);
110 /* Dump the info itself */
111 c_put_str(TERM_L_BLUE, info, row, col);
116 * Whether daytime or not
118 bool is_daytime(void)
120 s32b len = TURNS_PER_TICK * TOWN_DAWN;
121 if ((turn % len) < (len / 2))
128 * Extract day, hour, min
130 void extract_day_hour_min(int *day, int *hour, int *min)
132 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
133 s32b turn_in_today = (turn + A_DAY / 4) % A_DAY;
135 switch (p_ptr->start_race)
141 *day = (turn - A_DAY * 3 / 4) / A_DAY + 1;
144 *day = (turn + A_DAY / 4) / A_DAY + 1;
147 *hour = (24 * turn_in_today / A_DAY) % 24;
148 *min = (1440 * turn_in_today / A_DAY) % 60;
158 /* Dump 13 spaces to clear */
159 c_put_str(TERM_WHITE, " ", ROW_DAY, COL_DAY);
161 extract_day_hour_min(&day, &hour, &min);
163 /* Dump the info itself */
165 if (day < 1000) c_put_str(TERM_WHITE, format("%2d日目", day), ROW_DAY, COL_DAY);
166 else c_put_str(TERM_WHITE, "***日目", ROW_DAY, COL_DAY);
168 if (day < 1000) c_put_str(TERM_WHITE, format("Day%3d", day), ROW_DAY, COL_DAY);
169 else c_put_str(TERM_WHITE, "Day***", ROW_DAY, COL_DAY);
172 c_put_str(TERM_WHITE, format("%2d:%02d", hour, min), ROW_DAY, COL_DAY+7);
178 if (p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)
179 && (quest[p_ptr->inside_quest].flags & QUEST_FLAG_PRESET))
185 else if (p_ptr->wild_mode)
191 else if (p_ptr->inside_arena)
197 else if (p_ptr->inside_battle)
201 return "Monster Arena";
203 else if (!dun_level && p_ptr->town_num)
204 return town[p_ptr->town_num].name;
206 return d_name+d_info[dungeon_type].name;
212 static void prt_dungeon(void)
217 /* Dump 13 spaces to clear */
218 c_put_str(TERM_WHITE, " ", ROW_DUNGEON, COL_DUNGEON);
220 dungeon_name = map_name();
222 col = COL_DUNGEON + 6 - strlen(dungeon_name)/2;
223 if (col < 0) col = 0;
225 /* Dump the info itself */
226 c_put_str(TERM_L_UMBER, format("%s",dungeon_name),
234 * Print character stat in given row, column
236 static void prt_stat(int stat)
240 /* Display "injured" stat */
241 if (p_ptr->stat_cur[stat] < p_ptr->stat_max[stat])
243 put_str(stat_names_reduced[stat], ROW_STAT + stat, 0);
244 cnv_stat(p_ptr->stat_use[stat], tmp);
245 c_put_str(TERM_YELLOW, tmp, ROW_STAT + stat, COL_STAT + 6);
248 /* Display "healthy" stat */
251 put_str(stat_names[stat], ROW_STAT + stat, 0);
252 cnv_stat(p_ptr->stat_use[stat], tmp);
253 c_put_str(TERM_L_GREEN, tmp, ROW_STAT + stat, COL_STAT + 6);
256 /* Indicate natural maximum */
257 if (p_ptr->stat_max[stat] == p_ptr->stat_max_max[stat])
260 /* 日本語にかぶらないように表示位置を変更 */
261 put_str("!", ROW_STAT + stat, 5);
263 put_str("!", ROW_STAT + stat, 3);
271 * Data structure for status bar
273 #define BAR_TSUYOSHI 0
274 #define BAR_HALLUCINATION 1
275 #define BAR_BLINDNESS 2
276 #define BAR_PARALYZE 3
277 #define BAR_CONFUSE 4
278 #define BAR_POISONED 5
280 #define BAR_LEVITATE 7
281 #define BAR_REFLECTION 8
282 #define BAR_PASSWALL 9
283 #define BAR_WRAITH 10
284 #define BAR_PROTEVIL 11
285 #define BAR_KAWARIMI 12
286 #define BAR_MAGICDEFENSE 13
287 #define BAR_EXPAND 14
288 #define BAR_STONESKIN 15
289 #define BAR_MULTISHADOW 16
290 #define BAR_REGMAGIC 17
291 #define BAR_ULTIMATE 18
292 #define BAR_INVULN 19
293 #define BAR_IMMACID 20
294 #define BAR_RESACID 21
295 #define BAR_IMMELEC 22
296 #define BAR_RESELEC 23
297 #define BAR_IMMFIRE 24
298 #define BAR_RESFIRE 25
299 #define BAR_IMMCOLD 26
300 #define BAR_RESCOLD 27
301 #define BAR_RESPOIS 28
302 #define BAR_RESNETH 29
303 #define BAR_RESTIME 30
304 #define BAR_DUSTROBE 31
305 #define BAR_SHFIRE 32
307 #define BAR_SHHOLY 34
308 #define BAR_EYEEYE 35
309 #define BAR_BLESSED 36
310 #define BAR_HEROISM 37
311 #define BAR_BERSERK 38
312 #define BAR_ATTKFIRE 39
313 #define BAR_ATTKCOLD 40
314 #define BAR_ATTKELEC 41
315 #define BAR_ATTKACID 42
316 #define BAR_ATTKPOIS 43
317 #define BAR_ATTKCONF 44
318 #define BAR_SENSEUNSEEN 45
319 #define BAR_TELEPATHY 46
320 #define BAR_REGENERATION 47
321 #define BAR_INFRAVISION 48
322 #define BAR_STEALTH 49
323 #define BAR_SUPERSTEALTH 50
324 #define BAR_RECALL 51
326 #define BAR_SHCOLD 53
327 #define BAR_SHELEC 54
328 #define BAR_SHSHADOW 55
331 #define BAR_ANTIMULTI 58
332 #define BAR_ANTITELE 59
333 #define BAR_ANTIMAGIC 60
334 #define BAR_PATIENCE 61
335 #define BAR_REVENGE 62
336 #define BAR_RUNESWORD 63
337 #define BAR_VAMPILIC 64
339 #define BAR_ESP_EVIL 66
348 {TERM_YELLOW, "つ", "つよし"},
349 {TERM_VIOLET, "幻", "幻覚"},
350 {TERM_L_DARK, "盲", "盲目"},
351 {TERM_RED, "痺", "麻痺"},
352 {TERM_VIOLET, "乱", "混乱"},
353 {TERM_GREEN, "毒", "毒"},
354 {TERM_BLUE, "恐", "恐怖"},
355 {TERM_L_BLUE, "浮", "浮遊"},
356 {TERM_SLATE, "反", "反射"},
357 {TERM_SLATE, "壁", "壁抜け"},
358 {TERM_L_DARK, "幽", "幽体"},
359 {TERM_SLATE, "邪", "防邪"},
360 {TERM_VIOLET, "変", "変わり身"},
361 {TERM_YELLOW, "魔", "魔法鎧"},
362 {TERM_L_UMBER, "伸", "伸び"},
363 {TERM_WHITE, "石", "石肌"},
364 {TERM_L_BLUE, "分", "分身"},
365 {TERM_SLATE, "防", "魔法防御"},
366 {TERM_YELLOW, "究", "究極"},
367 {TERM_YELLOW, "無", "無敵"},
368 {TERM_L_GREEN, "酸", "酸免疫"},
369 {TERM_GREEN, "酸", "耐酸"},
370 {TERM_L_BLUE, "電", "電免疫"},
371 {TERM_BLUE, "電", "耐電"},
372 {TERM_L_RED, "火", "火免疫"},
373 {TERM_RED, "火", "耐火"},
374 {TERM_WHITE, "冷", "冷免疫"},
375 {TERM_SLATE, "冷", "耐冷"},
376 {TERM_GREEN, "毒", "耐毒"},
377 {TERM_L_DARK, "獄", "耐地獄"},
378 {TERM_L_BLUE, "時", "耐時間"},
379 {TERM_L_DARK, "鏡", "鏡オーラ"},
380 {TERM_L_RED, "オ", "火オーラ"},
381 {TERM_WHITE, "闘", "闘気"},
382 {TERM_WHITE, "聖", "聖オーラ"},
383 {TERM_VIOLET, "目", "目には目"},
384 {TERM_WHITE, "祝", "祝福"},
385 {TERM_WHITE, "勇", "勇"},
386 {TERM_RED, "狂", "狂乱"},
387 {TERM_L_RED, "火", "魔剣火"},
388 {TERM_WHITE, "冷", "魔剣冷"},
389 {TERM_L_BLUE, "電", "魔剣電"},
390 {TERM_SLATE, "酸", "魔剣酸"},
391 {TERM_L_GREEN, "毒", "魔剣毒"},
392 {TERM_RED, "乱", "混乱打撃"},
393 {TERM_L_BLUE, "視", "透明視"},
394 {TERM_ORANGE, "テ", "テレパシ"},
395 {TERM_L_BLUE, "回", "回復"},
396 {TERM_L_RED, "赤", "赤外"},
397 {TERM_UMBER, "隠", "隠密"},
398 {TERM_YELLOW, "隠", "超隠密"},
399 {TERM_WHITE, "帰", "帰還"},
400 {TERM_WHITE, "現", "現実変容"},
402 {TERM_WHITE, "オ", "氷オーラ"},
403 {TERM_BLUE, "オ", "電オーラ"},
404 {TERM_L_DARK, "オ", "影オーラ"},
405 {TERM_YELLOW, "腕", "腕力強化"},
406 {TERM_RED, "肉", "肉体強化"},
407 {TERM_L_DARK, "殖", "反増殖"},
408 {TERM_ORANGE, "テ", "反テレポ"},
409 {TERM_RED, "魔", "反魔法"},
410 {TERM_SLATE, "我", "我慢"},
411 {TERM_SLATE, "宣", "宣告"},
412 {TERM_L_DARK, "剣", "魔剣化"},
413 {TERM_RED, "吸", "吸血打撃"},
414 {TERM_WHITE, "回", "回復"},
415 {TERM_L_DARK, "感", "邪悪感知"},
420 {TERM_YELLOW, "Ts", "Tsuyoshi"},
421 {TERM_VIOLET, "Ha", "Halluc"},
422 {TERM_L_DARK, "Bl", "Blind"},
423 {TERM_RED, "Pa", "Paralyzed"},
424 {TERM_VIOLET, "Cf", "Confused"},
425 {TERM_GREEN, "Po", "Poisoned"},
426 {TERM_BLUE, "Af", "Afraid"},
427 {TERM_L_BLUE, "Lv", "Levit"},
428 {TERM_SLATE, "Rf", "Reflect"},
429 {TERM_SLATE, "Pw", "PassWall"},
430 {TERM_L_DARK, "Wr", "Wraith"},
431 {TERM_SLATE, "Ev", "PrtEvl"},
432 {TERM_VIOLET, "Kw", "Kawarimi"},
433 {TERM_YELLOW, "Md", "MgcArm"},
434 {TERM_L_UMBER, "Eh", "Expand"},
435 {TERM_WHITE, "Ss", "StnSkn"},
436 {TERM_L_BLUE, "Ms", "MltShdw"},
437 {TERM_SLATE, "Rm", "ResMag"},
438 {TERM_YELLOW, "Ul", "Ultima"},
439 {TERM_YELLOW, "Iv", "Invuln"},
440 {TERM_L_GREEN, "IAc", "ImmAcid"},
441 {TERM_GREEN, "Ac", "Acid"},
442 {TERM_L_BLUE, "IEl", "ImmElec"},
443 {TERM_BLUE, "El", "Elec"},
444 {TERM_L_RED, "IFi", "ImmFire"},
445 {TERM_RED, "Fi", "Fire"},
446 {TERM_WHITE, "ICo", "ImmCold"},
447 {TERM_SLATE, "Co", "Cold"},
448 {TERM_GREEN, "Po", "Pois"},
449 {TERM_L_DARK, "Nt", "Nthr"},
450 {TERM_L_BLUE, "Ti", "Time"},
451 {TERM_L_DARK, "Mr", "Mirr"},
452 {TERM_L_RED, "SFi", "SFire"},
453 {TERM_WHITE, "Fo", "Force"},
454 {TERM_WHITE, "Ho", "Holy"},
455 {TERM_VIOLET, "Ee", "EyeEye"},
456 {TERM_WHITE, "Bs", "Bless"},
457 {TERM_WHITE, "He", "Hero"},
458 {TERM_RED, "Br", "Berserk"},
459 {TERM_L_RED, "BFi", "BFire"},
460 {TERM_WHITE, "BCo", "BCold"},
461 {TERM_L_BLUE, "BEl", "BElec"},
462 {TERM_SLATE, "BAc", "BAcid"},
463 {TERM_L_GREEN, "BPo", "BPois"},
464 {TERM_RED, "TCf", "TchCnf"},
465 {TERM_L_BLUE, "Se", "SInv"},
466 {TERM_ORANGE, "Te", "Telepa"},
467 {TERM_L_BLUE, "Rg", "Regen"},
468 {TERM_L_RED, "If", "Infr"},
469 {TERM_UMBER, "Sl", "Stealth"},
470 {TERM_YELLOW, "Stlt", "Stealth"},
471 {TERM_WHITE, "Rc", "Recall"},
472 {TERM_WHITE, "Al", "Alter"},
474 {TERM_WHITE, "SCo", "SCold"},
475 {TERM_BLUE, "SEl", "SElec"},
476 {TERM_L_DARK, "SSh", "SShadow"},
477 {TERM_YELLOW, "EMi", "ExMight"},
478 {TERM_RED, "Bu", "BuildUp"},
479 {TERM_L_DARK, "AMl", "AntiMulti"},
480 {TERM_ORANGE, "AT", "AntiTele"},
481 {TERM_RED, "AM", "AntiMagic"},
482 {TERM_SLATE, "Pa", "Patience"},
483 {TERM_SLATE, "Rv", "Revenge"},
484 {TERM_L_DARK, "Rs", "RuneSword"},
485 {TERM_RED, "Vm", "Vampiric"},
486 {TERM_WHITE, "Cu", "Cure"},
487 {TERM_L_DARK, "ET", "EvilTele"},
492 #define ADD_FLG(FLG) (bar_flags[FLG / 32] |= (1L << (FLG % 32)))
493 #define IS_FLG(FLG) (bar_flags[FLG / 32] & (1L << (FLG % 32)))
499 static void prt_status(void)
502 int wid, hgt, row_statbar, max_col_statbar;
503 int i, col = 0, num = 0;
506 Term_get_size(&wid, &hgt);
507 row_statbar = hgt + ROW_STATBAR;
508 max_col_statbar = wid + MAX_COL_STATBAR;
510 Term_erase(0, row_statbar, max_col_statbar);
512 bar_flags[0] = bar_flags[1] = bar_flags[2] = 0L;
515 if (p_ptr->tsuyoshi) ADD_FLG(BAR_TSUYOSHI);
518 if (p_ptr->image) ADD_FLG(BAR_HALLUCINATION);
521 if (p_ptr->blind) ADD_FLG(BAR_BLINDNESS);
524 if (p_ptr->paralyzed) ADD_FLG(BAR_PARALYZE);
527 if (p_ptr->confused) ADD_FLG(BAR_CONFUSE);
530 if (p_ptr->poisoned) ADD_FLG(BAR_POISONED);
532 /* Times see-invisible */
533 if (p_ptr->tim_invis) ADD_FLG(BAR_SENSEUNSEEN);
536 if (IS_TIM_ESP()) ADD_FLG(BAR_TELEPATHY);
538 /* Timed regenerate */
539 if (p_ptr->tim_regen) ADD_FLG(BAR_REGENERATION);
541 /* Timed infra-vision */
542 if (p_ptr->tim_infra) ADD_FLG(BAR_INFRAVISION);
544 /* Protection from evil */
545 if (p_ptr->protevil) ADD_FLG(BAR_PROTEVIL);
547 /* Invulnerability */
548 if (IS_INVULN()) ADD_FLG(BAR_INVULN);
551 if (p_ptr->wraith_form) ADD_FLG(BAR_WRAITH);
554 if (p_ptr->kabenuke) ADD_FLG(BAR_PASSWALL);
556 if (p_ptr->tim_reflect) ADD_FLG(BAR_REFLECTION);
559 if (IS_HERO()) ADD_FLG(BAR_HEROISM);
561 /* Super Heroism / berserk */
562 if (p_ptr->shero) ADD_FLG(BAR_BERSERK);
565 if (IS_BLESSED()) ADD_FLG(BAR_BLESSED);
568 if (p_ptr->magicdef) ADD_FLG(BAR_MAGICDEFENSE);
570 if (p_ptr->tsubureru) ADD_FLG(BAR_EXPAND);
572 if (p_ptr->shield) ADD_FLG(BAR_STONESKIN);
574 if (p_ptr->special_defense & NINJA_KAWARIMI) ADD_FLG(BAR_KAWARIMI);
577 if (p_ptr->special_defense & DEFENSE_ACID) ADD_FLG(BAR_IMMACID);
578 if (IS_OPPOSE_ACID()) ADD_FLG(BAR_RESACID);
580 /* Oppose Lightning */
581 if (p_ptr->special_defense & DEFENSE_ELEC) ADD_FLG(BAR_IMMELEC);
582 if (IS_OPPOSE_ELEC()) ADD_FLG(BAR_RESELEC);
585 if (p_ptr->special_defense & DEFENSE_FIRE) ADD_FLG(BAR_IMMFIRE);
586 if (IS_OPPOSE_FIRE()) ADD_FLG(BAR_RESFIRE);
589 if (p_ptr->special_defense & DEFENSE_COLD) ADD_FLG(BAR_IMMCOLD);
590 if (IS_OPPOSE_COLD()) ADD_FLG(BAR_RESCOLD);
593 if (IS_OPPOSE_POIS()) ADD_FLG(BAR_RESPOIS);
596 if (p_ptr->word_recall) ADD_FLG(BAR_RECALL);
599 if (p_ptr->alter_reality) ADD_FLG(BAR_ALTER);
602 if (p_ptr->afraid) ADD_FLG(BAR_AFRAID);
605 if (p_ptr->tim_res_time) ADD_FLG(BAR_RESTIME);
607 if (p_ptr->multishadow) ADD_FLG(BAR_MULTISHADOW);
609 /* Confusing Hands */
610 if (p_ptr->special_attack & ATTACK_CONFUSE) ADD_FLG(BAR_ATTKCONF);
612 if (p_ptr->resist_magic) ADD_FLG(BAR_REGMAGIC);
614 /* Ultimate-resistance */
615 if (p_ptr->ult_res) ADD_FLG(BAR_ULTIMATE);
618 if (p_ptr->tim_levitation) ADD_FLG(BAR_LEVITATE);
620 if (p_ptr->tim_res_nether) ADD_FLG(BAR_RESNETH);
622 if (p_ptr->dustrobe) ADD_FLG(BAR_DUSTROBE);
625 if (p_ptr->special_attack & ATTACK_FIRE) ADD_FLG(BAR_ATTKFIRE);
626 if (p_ptr->special_attack & ATTACK_COLD) ADD_FLG(BAR_ATTKCOLD);
627 if (p_ptr->special_attack & ATTACK_ELEC) ADD_FLG(BAR_ATTKELEC);
628 if (p_ptr->special_attack & ATTACK_ACID) ADD_FLG(BAR_ATTKACID);
629 if (p_ptr->special_attack & ATTACK_POIS) ADD_FLG(BAR_ATTKPOIS);
630 if (p_ptr->special_defense & NINJA_S_STEALTH) ADD_FLG(BAR_SUPERSTEALTH);
632 if (p_ptr->tim_sh_fire) ADD_FLG(BAR_SHFIRE);
635 if (IS_TIM_STEALTH()) ADD_FLG(BAR_STEALTH);
637 if (p_ptr->tim_sh_touki) ADD_FLG(BAR_TOUKI);
640 if (p_ptr->tim_sh_holy) ADD_FLG(BAR_SHHOLY);
642 /* An Eye for an Eye */
643 if (p_ptr->tim_eyeeye) ADD_FLG(BAR_EYEEYE);
646 if (p_ptr->realm1 == REALM_HEX)
648 if (hex_spelling(HEX_BLESS)) ADD_FLG(BAR_BLESSED);
649 if (hex_spelling(HEX_DEMON_AURA)) { ADD_FLG(BAR_SHFIRE); ADD_FLG(BAR_REGENERATION); }
650 if (hex_spelling(HEX_XTRA_MIGHT)) ADD_FLG(BAR_MIGHT);
651 if (hex_spelling(HEX_DETECT_EVIL)) ADD_FLG(BAR_ESP_EVIL);
652 if (hex_spelling(HEX_ICE_ARMOR)) ADD_FLG(BAR_SHCOLD);
653 if (hex_spelling(HEX_RUNESWORD)) ADD_FLG(BAR_RUNESWORD);
654 if (hex_spelling(HEX_BUILDING)) ADD_FLG(BAR_BUILD);
655 if (hex_spelling(HEX_ANTI_TELE)) ADD_FLG(BAR_ANTITELE);
656 if (hex_spelling(HEX_SHOCK_CLOAK)) ADD_FLG(BAR_SHELEC);
657 if (hex_spelling(HEX_SHADOW_CLOAK)) ADD_FLG(BAR_SHSHADOW);
658 if (hex_spelling(HEX_CONFUSION)) ADD_FLG(BAR_ATTKCONF);
659 if (hex_spelling(HEX_EYE_FOR_EYE)) ADD_FLG(BAR_EYEEYE);
660 if (hex_spelling(HEX_ANTI_MULTI)) ADD_FLG(BAR_ANTIMULTI);
661 if (hex_spelling(HEX_VAMP_BLADE)) ADD_FLG(BAR_VAMPILIC);
662 if (hex_spelling(HEX_ANTI_MAGIC)) ADD_FLG(BAR_ANTIMAGIC);
663 if (hex_spelling(HEX_CURE_LIGHT) ||
664 hex_spelling(HEX_CURE_SERIOUS) ||
665 hex_spelling(HEX_CURE_CRITICAL)) ADD_FLG(BAR_CURE);
667 if (p_ptr->magic_num2[2])
669 if (p_ptr->magic_num2[1] == 1) ADD_FLG(BAR_PATIENCE);
670 if (p_ptr->magic_num2[1] == 2) ADD_FLG(BAR_REVENGE);
674 /* Calcurate length */
675 for (i = 0; bar[i].sstr; i++)
679 col += strlen(bar[i].lstr) + 1;
684 /* If there are not excess spaces for long strings, use short one */
685 if (col - 1 > max_col_statbar)
690 for (i = 0; bar[i].sstr; i++)
694 col += strlen(bar[i].sstr);
698 /* If there are excess spaces for short string, use more */
699 if (col - 1 <= max_col_statbar - (num-1))
707 /* Centering display column */
708 col = (max_col_statbar - col) / 2;
710 /* Display status bar */
711 for (i = 0; bar[i].sstr; i++)
716 if (space == 2) str = bar[i].lstr;
717 else str = bar[i].sstr;
719 c_put_str(bar[i].attr, str, row_statbar, col);
721 if (space > 0) col++;
722 if (col > max_col_statbar) break;
730 * Prints "title", including "wizard" or "winner" as needed.
732 static void prt_title(void)
750 else if (p_ptr->total_winner || (p_ptr->lev > PY_MAX_LEVEL))
752 if (p_ptr->arena_number > MAX_ARENA_MONS + 2)
775 my_strcpy(str, player_title[p_ptr->pclass][(p_ptr->lev - 1) / 5], sizeof(str));
779 prt_field(p, ROW_TITLE, COL_TITLE);
786 static void prt_level(void)
791 sprintf(tmp, "%5d", p_ptr->lev);
793 sprintf(tmp, "%6d", p_ptr->lev);
797 if (p_ptr->lev >= p_ptr->max_plv)
800 put_str("レベル ", ROW_LEVEL, 0);
801 c_put_str(TERM_L_GREEN, tmp, ROW_LEVEL, COL_LEVEL + 7);
803 put_str("LEVEL ", ROW_LEVEL, 0);
804 c_put_str(TERM_L_GREEN, tmp, ROW_LEVEL, COL_LEVEL + 6);
811 put_str("xレベル", ROW_LEVEL, 0);
812 c_put_str(TERM_YELLOW, tmp, ROW_LEVEL, COL_LEVEL + 7);
814 put_str("Level ", ROW_LEVEL, 0);
815 c_put_str(TERM_YELLOW, tmp, ROW_LEVEL, COL_LEVEL + 6);
823 * Display the experience
825 static void prt_exp(void)
829 if ((!exp_need)||(p_ptr->prace == RACE_ANDROID))
832 (void)sprintf(out_val, "%7ld", (long)p_ptr->exp);
834 (void)sprintf(out_val, "%8ld", (long)p_ptr->exp);
839 if (p_ptr->lev >= PY_MAX_LEVEL)
841 (void)sprintf(out_val, "********");
846 (void)sprintf(out_val, "%7ld", (long)(player_exp [p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
848 (void)sprintf(out_val, "%8ld", (long)(player_exp [p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp);
853 if (p_ptr->exp >= p_ptr->max_exp)
856 if (p_ptr->prace == RACE_ANDROID) put_str("強化 ", ROW_EXP, 0);
857 else put_str("経験 ", ROW_EXP, 0);
858 c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 5);
860 if (p_ptr->prace == RACE_ANDROID) put_str("Cst ", ROW_EXP, 0);
861 else put_str("EXP ", ROW_EXP, 0);
862 c_put_str(TERM_L_GREEN, out_val, ROW_EXP, COL_EXP + 4);
869 put_str("x経験", ROW_EXP, 0);
870 c_put_str(TERM_YELLOW, out_val, ROW_EXP, COL_EXP + 5);
872 put_str("Exp ", ROW_EXP, 0);
873 c_put_str(TERM_YELLOW, out_val, ROW_EXP, COL_EXP + 4);
880 * Prints current gold
882 static void prt_gold(void)
887 put_str("$ ", ROW_GOLD, COL_GOLD);
889 put_str("AU ", ROW_GOLD, COL_GOLD);
892 sprintf(tmp, "%9ld", (long)p_ptr->au);
893 c_put_str(TERM_L_GREEN, tmp, ROW_GOLD, COL_GOLD + 3);
901 static void prt_ac(void)
906 /* AC の表示方式を変更している */
907 put_str(" AC( )", ROW_AC, COL_AC);
908 sprintf(tmp, "%5d", p_ptr->dis_ac + p_ptr->dis_to_a);
909 c_put_str(TERM_L_GREEN, tmp, ROW_AC, COL_AC + 6);
911 put_str("Cur AC ", ROW_AC, COL_AC);
912 sprintf(tmp, "%5d", p_ptr->dis_ac + p_ptr->dis_to_a);
913 c_put_str(TERM_L_GREEN, tmp, ROW_AC, COL_AC + 7);
920 * Prints Cur/Max hit points
922 static void prt_hp(void)
924 /* ヒットポイントの表示方法を変更 */
930 /* put_str(" HP・MP", ROW_HPMP, COL_HPMP); */
932 put_str("HP", ROW_CURHP, COL_CURHP);
935 sprintf(tmp, "%4ld", (long int)p_ptr->chp);
937 if (p_ptr->chp >= p_ptr->mhp)
939 color = TERM_L_GREEN;
941 else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10)
950 c_put_str(color, tmp, ROW_CURHP, COL_CURHP+3);
953 put_str( "/", ROW_CURHP, COL_CURHP + 7 );
956 sprintf(tmp, "%4ld", (long int)p_ptr->mhp);
957 color = TERM_L_GREEN;
959 c_put_str(color, tmp, ROW_CURHP, COL_CURHP + 8 );
964 * Prints players max/cur spell points
966 static void prt_sp(void)
968 /* マジックポイントの表示方法を変更している */
973 /* Do not show mana unless it matters */
974 if (!mp_ptr->spell_book) return;
977 /* put_str(" MP / 最大", ROW_MAXSP, COL_MAXSP); */
980 put_str("MP", ROW_CURSP, COL_CURSP);
982 put_str("SP", ROW_CURSP, COL_CURSP);
986 sprintf(tmp, "%4ld", (long int)p_ptr->csp);
988 if (p_ptr->csp >= p_ptr->msp)
990 color = TERM_L_GREEN;
992 else if (p_ptr->csp > (p_ptr->msp * mana_warn) / 10)
1001 c_put_str(color, tmp, ROW_CURSP, COL_CURSP+3);
1004 put_str( "/", ROW_CURSP, COL_CURSP + 7 );
1007 sprintf(tmp, "%4ld", (long int)p_ptr->msp);
1008 color = TERM_L_GREEN;
1010 c_put_str(color, tmp, ROW_CURSP, COL_CURSP + 8);
1015 * Prints depth in stat area
1017 static void prt_depth(void)
1020 int wid, hgt, row_depth, col_depth;
1021 byte attr = TERM_WHITE;
1023 Term_get_size(&wid, &hgt);
1024 col_depth = wid + COL_DEPTH;
1025 row_depth = hgt + ROW_DEPTH;
1030 strcpy(depths, "地上");
1032 strcpy(depths, "Surf.");
1035 else if (p_ptr->inside_quest && !dungeon_type)
1038 strcpy(depths, "地上");
1040 strcpy(depths, "Quest");
1046 if (depth_in_feet) (void)sprintf(depths, "%d ft", dun_level * 50);
1047 else (void)sprintf(depths, "%d 階", dun_level);
1049 if (depth_in_feet) (void)sprintf(depths, "%d ft", dun_level * 50);
1050 else (void)sprintf(depths, "Lev %d", dun_level);
1054 /* Get color of level based on feeling -JSV- */
1055 switch (p_ptr->feeling)
1057 case 0: attr = TERM_SLATE; break; /* Unknown */
1058 case 1: attr = TERM_L_BLUE; break; /* Special */
1059 case 2: attr = TERM_VIOLET; break; /* Horrible visions */
1060 case 3: attr = TERM_RED; break; /* Very dangerous */
1061 case 4: attr = TERM_L_RED; break; /* Very bad feeling */
1062 case 5: attr = TERM_ORANGE; break; /* Bad feeling */
1063 case 6: attr = TERM_YELLOW; break; /* Nervous */
1064 case 7: attr = TERM_L_UMBER; break; /* Luck is turning */
1065 case 8: attr = TERM_L_WHITE; break; /* Don't like */
1066 case 9: attr = TERM_WHITE; break; /* Reasonably safe */
1067 case 10: attr = TERM_WHITE; break; /* Boring place */
1071 /* Right-Adjust the "depth", and clear old values */
1072 c_prt(attr, format("%7s", depths), row_depth, col_depth);
1077 * Prints status of hunger
1079 static void prt_hunger(void)
1081 if(p_ptr->wizard && p_ptr->inside_arena) return;
1083 /* Fainting / Starving */
1084 if (p_ptr->food < PY_FOOD_FAINT)
1087 c_put_str(TERM_RED, "衰弱 ", ROW_HUNGRY, COL_HUNGRY);
1089 c_put_str(TERM_RED, "Weak ", ROW_HUNGRY, COL_HUNGRY);
1095 else if (p_ptr->food < PY_FOOD_WEAK)
1098 c_put_str(TERM_ORANGE, "衰弱 ", ROW_HUNGRY, COL_HUNGRY);
1100 c_put_str(TERM_ORANGE, "Weak ", ROW_HUNGRY, COL_HUNGRY);
1106 else if (p_ptr->food < PY_FOOD_ALERT)
1109 c_put_str(TERM_YELLOW, "空腹 ", ROW_HUNGRY, COL_HUNGRY);
1111 c_put_str(TERM_YELLOW, "Hungry", ROW_HUNGRY, COL_HUNGRY);
1117 else if (p_ptr->food < PY_FOOD_FULL)
1119 c_put_str(TERM_L_GREEN, " ", ROW_HUNGRY, COL_HUNGRY);
1123 else if (p_ptr->food < PY_FOOD_MAX)
1126 c_put_str(TERM_L_GREEN, "満腹 ", ROW_HUNGRY, COL_HUNGRY);
1128 c_put_str(TERM_L_GREEN, "Full ", ROW_HUNGRY, COL_HUNGRY);
1137 c_put_str(TERM_GREEN, "食過ぎ", ROW_HUNGRY, COL_HUNGRY);
1139 c_put_str(TERM_GREEN, "Gorged", ROW_HUNGRY, COL_HUNGRY);
1147 * Prints Searching, Resting, Paralysis, or 'count' status
1148 * Display is always exactly 10 characters wide (see below)
1150 * This function was a major bottleneck when resting, so a lot of
1151 * the text formatting code was optimized in place below.
1153 static void prt_state(void)
1155 byte attr = TERM_WHITE;
1162 if (command_rep > 999)
1165 sprintf(text, "%2d00", command_rep / 100);
1167 (void)sprintf(text, "%2d00", command_rep / 100);
1174 sprintf(text, " %2d", command_rep);
1176 (void)sprintf(text, " %2d", command_rep);
1185 switch(p_ptr->action)
1192 strcpy(text, "Sear");
1200 /* Start with "Rest" */
1208 /* Extensive (timed) rest */
1209 if (resting >= 1000)
1214 text[1] = '0' + (i % 10);
1215 text[0] = '0' + (i / 10);
1218 /* Long (timed) rest */
1219 else if (resting >= 100)
1222 text[3] = '0' + (i % 10);
1224 text[2] = '0' + (i % 10);
1225 text[1] = '0' + (i / 10);
1228 /* Medium (timed) rest */
1229 else if (resting >= 10)
1232 text[3] = '0' + (i % 10);
1233 text[2] = '0' + (i / 10);
1236 /* Short (timed) rest */
1237 else if (resting > 0)
1240 text[3] = '0' + (i);
1243 /* Rest until healed */
1244 else if (resting == -1)
1246 text[0] = text[1] = text[2] = text[3] = '*';
1249 /* Rest until done */
1250 else if (resting == -2)
1252 text[0] = text[1] = text[2] = text[3] = '&';
1261 strcpy(text, "lear");
1263 if (new_mane) attr = TERM_L_RED;
1271 strcpy(text, "fish");
1278 for (i = 0; i < MAX_KAMAE; i++)
1279 if (p_ptr->special_defense & (KAMAE_GENBU << i)) break;
1282 case 0: attr = TERM_GREEN;break;
1283 case 1: attr = TERM_WHITE;break;
1284 case 2: attr = TERM_L_BLUE;break;
1285 case 3: attr = TERM_L_RED;break;
1287 strcpy(text, kamae_shurui[i].desc);
1293 for (i = 0; i < MAX_KATA; i++)
1294 if (p_ptr->special_defense & (KATA_IAI << i)) break;
1295 strcpy(text, kata_shurui[i].desc);
1303 strcpy(text, "Sing");
1307 case ACTION_HAYAGAKE:
1312 strcpy(text, "Fast");
1321 strcpy(text, "Spel");
1333 /* Display the info (or blanks) */
1334 c_put_str(attr, format("%5.5s",text), ROW_STATE, COL_STATE);
1339 * Prints the speed of a character. -CJS-
1341 static void prt_speed(void)
1343 int i = p_ptr->pspeed;
1344 bool is_fast = IS_FAST();
1346 byte attr = TERM_WHITE;
1348 int wid, hgt, row_speed, col_speed;
1350 Term_get_size(&wid, &hgt);
1351 col_speed = wid + COL_SPEED;
1352 row_speed = hgt + ROW_SPEED;
1354 /* Hack -- Visually "undo" the Search Mode Slowdown */
1355 if (p_ptr->action == ACTION_SEARCH && !p_ptr->lightspeed) i += 10;
1362 monster_type *m_ptr = &m_list[p_ptr->riding];
1363 if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE;
1364 else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET;
1365 else attr = TERM_GREEN;
1367 else if ((is_fast && !p_ptr->slow) || p_ptr->lightspeed) attr = TERM_YELLOW;
1368 else if (p_ptr->slow && !is_fast) attr = TERM_VIOLET;
1369 else attr = TERM_L_GREEN;
1371 sprintf(buf, "%s(+%d)", (p_ptr->riding ? "乗馬" : "加速"), (i - 110));
1373 sprintf(buf, "Fast(+%d)", (i - 110));
1383 monster_type *m_ptr = &m_list[p_ptr->riding];
1384 if (MON_FAST(m_ptr) && !MON_SLOW(m_ptr)) attr = TERM_L_BLUE;
1385 else if (MON_SLOW(m_ptr) && !MON_FAST(m_ptr)) attr = TERM_VIOLET;
1386 else attr = TERM_RED;
1388 else if (is_fast && !p_ptr->slow) attr = TERM_YELLOW;
1389 else if (p_ptr->slow && !is_fast) attr = TERM_VIOLET;
1390 else attr = TERM_L_UMBER;
1392 sprintf(buf, "%s(-%d)", (p_ptr->riding ? "乗馬" : "減速"), (110 - i));
1394 sprintf(buf, "Slow(-%d)", (110 - i));
1397 else if (p_ptr->riding)
1403 strcpy(buf, "Riding");
1407 /* Display the speed */
1408 c_put_str(attr, format("%-9s", buf), row_speed, col_speed);
1412 static void prt_study(void)
1414 int wid, hgt, row_study, col_study;
1416 Term_get_size(&wid, &hgt);
1417 col_study = wid + COL_STUDY;
1418 row_study = hgt + ROW_STUDY;
1420 if (p_ptr->new_spells)
1423 put_str("学習", row_study, col_study);
1425 put_str("Stud", row_study, col_study);
1431 put_str(" ", row_study, col_study);
1436 static void prt_imitation(void)
1438 int wid, hgt, row_study, col_study;
1440 Term_get_size(&wid, &hgt);
1441 col_study = wid + COL_STUDY;
1442 row_study = hgt + ROW_STUDY;
1444 if (p_ptr->pclass == CLASS_IMITATOR)
1446 if (p_ptr->mane_num)
1449 if (new_mane) attr = TERM_L_RED;
1450 else attr = TERM_WHITE;
1452 c_put_str(attr, "まね", row_study, col_study);
1454 c_put_str(attr, "Imit", row_study, col_study);
1459 put_str(" ", row_study, col_study);
1465 static void prt_cut(void)
1472 c_put_str(TERM_L_RED, "致命傷 ", ROW_CUT, COL_CUT);
1474 c_put_str(TERM_L_RED, "Mortal wound", ROW_CUT, COL_CUT);
1481 c_put_str(TERM_RED, "ひどい深手 ", ROW_CUT, COL_CUT);
1483 c_put_str(TERM_RED, "Deep gash ", ROW_CUT, COL_CUT);
1490 c_put_str(TERM_RED, "重傷 ", ROW_CUT, COL_CUT);
1492 c_put_str(TERM_RED, "Severe cut ", ROW_CUT, COL_CUT);
1499 c_put_str(TERM_ORANGE, "大変な傷 ", ROW_CUT, COL_CUT);
1501 c_put_str(TERM_ORANGE, "Nasty cut ", ROW_CUT, COL_CUT);
1508 c_put_str(TERM_ORANGE, "ひどい傷 ", ROW_CUT, COL_CUT);
1510 c_put_str(TERM_ORANGE, "Bad cut ", ROW_CUT, COL_CUT);
1517 c_put_str(TERM_YELLOW, "軽傷 ", ROW_CUT, COL_CUT);
1519 c_put_str(TERM_YELLOW, "Light cut ", ROW_CUT, COL_CUT);
1526 c_put_str(TERM_YELLOW, "かすり傷 ", ROW_CUT, COL_CUT);
1528 c_put_str(TERM_YELLOW, "Graze ", ROW_CUT, COL_CUT);
1534 put_str(" ", ROW_CUT, COL_CUT);
1540 static void prt_stun(void)
1542 int s = p_ptr->stun;
1547 c_put_str(TERM_RED, "意識不明瞭 ", ROW_STUN, COL_STUN);
1549 c_put_str(TERM_RED, "Knocked out ", ROW_STUN, COL_STUN);
1556 c_put_str(TERM_ORANGE, "ひどく朦朧 ", ROW_STUN, COL_STUN);
1558 c_put_str(TERM_ORANGE, "Heavy stun ", ROW_STUN, COL_STUN);
1565 c_put_str(TERM_ORANGE, "朦朧 ", ROW_STUN, COL_STUN);
1567 c_put_str(TERM_ORANGE, "Stun ", ROW_STUN, COL_STUN);
1573 put_str(" ", ROW_STUN, COL_STUN);
1580 * Redraw the "monster health bar" -DRS-
1581 * Rather extensive modifications by -BEN-
1583 * The "monster health bar" provides visual feedback on the "health"
1584 * of the monster currently being "tracked". There are several ways
1585 * to "track" a monster, including targetting it, attacking it, and
1586 * affecting it (and nobody else) with a ranged attack.
1588 * Display the monster health bar (affectionately known as the
1589 * "health-o-meter"). Clear health bar if nothing is being tracked.
1590 * Auto-track current target monster when bored. Note that the
1591 * health-bar stops tracking any monster that "disappears".
1593 static void health_redraw(bool riding)
1597 monster_type *m_ptr;
1601 health_who = p_ptr->riding;
1602 row = ROW_RIDING_INFO;
1603 col = COL_RIDING_INFO;
1607 health_who = p_ptr->health_who;
1612 m_ptr = &m_list[health_who];
1614 if (p_ptr->wizard && p_ptr->inside_battle)
1619 Term_putstr(col - 2, row, 12, TERM_WHITE, " / ");
1620 Term_putstr(col - 2, row + 1, 12, TERM_WHITE, " / ");
1621 Term_putstr(col - 2, row + 2, 12, TERM_WHITE, " / ");
1622 Term_putstr(col - 2, row + 3, 12, TERM_WHITE, " / ");
1626 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));
1627 Term_putstr(col - 1, row, 5, TERM_WHITE, format("%5d", m_list[1].hp));
1628 Term_putstr(col + 5, row, 6, TERM_WHITE, format("%5d", m_list[1].max_maxhp));
1633 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));
1634 Term_putstr(col - 1, row + 1, 5, TERM_WHITE, format("%5d", m_list[2].hp));
1635 Term_putstr(col + 5, row + 1, 6, TERM_WHITE, format("%5d", m_list[2].max_maxhp));
1640 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));
1641 Term_putstr(col - 1, row + 2, 5, TERM_WHITE, format("%5d", m_list[3].hp));
1642 Term_putstr(col + 5, row + 2, 6, TERM_WHITE, format("%5d", m_list[3].max_maxhp));
1647 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));
1648 Term_putstr(col - 1, row + 3, 5, TERM_WHITE, format("%5d", m_list[4].hp));
1649 Term_putstr(col + 5, row + 3, 6, TERM_WHITE, format("%5d", m_list[4].max_maxhp));
1658 /* Erase the health bar */
1659 Term_erase(col, row, 12);
1662 /* Tracking an unseen monster */
1663 else if (!m_ptr->ml)
1665 /* Indicate that the monster health is "unknown" */
1666 Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1669 /* Tracking a hallucinatory monster */
1670 else if (p_ptr->image)
1672 /* Indicate that the monster health is "unknown" */
1673 Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1676 /* Tracking a dead monster (???) */
1677 else if (m_ptr->hp < 0)
1679 /* Indicate that the monster health is "unknown" */
1680 Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1683 /* Tracking a visible monster */
1686 /* Extract the "percent" of health */
1687 int pct = 100L * m_ptr->hp / m_ptr->maxhp;
1688 int pct2 = 100L * m_ptr->hp / m_ptr->max_maxhp;
1690 /* Convert percent into "health" */
1691 int len = (pct2 < 10) ? 1 : (pct2 < 90) ? (pct2 / 10 + 1) : 10;
1693 /* Default to almost dead */
1694 byte attr = TERM_RED;
1697 if (MON_INVULNER(m_ptr)) attr = TERM_WHITE;
1700 else if (MON_CSLEEP(m_ptr)) attr = TERM_BLUE;
1703 else if (MON_MONFEAR(m_ptr)) attr = TERM_VIOLET;
1706 else if (pct >= 100) attr = TERM_L_GREEN;
1708 /* Somewhat Wounded */
1709 else if (pct >= 60) attr = TERM_YELLOW;
1712 else if (pct >= 25) attr = TERM_ORANGE;
1715 else if (pct >= 10) attr = TERM_L_RED;
1717 /* Default to "unknown" */
1718 Term_putstr(col, row, 12, TERM_WHITE, "[----------]");
1720 /* Dump the current "health" (use '*' symbols) */
1721 Term_putstr(col + 1, row, len, attr, "**********");
1729 * Display basic info (mostly left of map)
1731 static void prt_frame_basic(void)
1735 /* Race and Class */
1736 if (p_ptr->mimic_form)
1737 prt_field(mimic_info[p_ptr->mimic_form].title, ROW_RACE, COL_RACE);
1741 my_strcpy(str, rp_ptr->title, sizeof(str));
1742 prt_field(str, ROW_RACE, COL_RACE);
1744 /* prt_field(cp_ptr->title, ROW_CLASS, COL_CLASS); */
1745 /* prt_field(ap_ptr->title, ROW_SEIKAKU, COL_SEIKAKU); */
1751 /* Level/Experience */
1756 for (i = 0; i < 6; i++) prt_stat(i);
1774 health_redraw(FALSE);
1775 health_redraw(TRUE);
1780 * Display extra info (mostly below map)
1782 static void prt_frame_extra(void)
1807 * Hack -- display inventory in sub-windows
1809 static void fix_inven(void)
1814 for (j = 0; j < 8; j++)
1819 if (!angband_term[j]) continue;
1821 /* No relevant flags */
1822 if (!(window_flag[j] & (PW_INVEN))) continue;
1825 Term_activate(angband_term[j]);
1827 /* Display inventory */
1840 * Print monster info in line
1842 * nnn : number or unique(U) or wanted unique(W)
1843 * X : symbol of monster
1844 * LV : monster lv if known
1845 * name: name of monster
1847 static void print_monster_line(int x, int y, monster_type* m_ptr, int n_same){
1850 int r_idx = m_ptr->ap_r_idx;
1851 monster_race* r_ptr = &r_info[r_idx];
1855 //Number of 'U'nique
1856 if(r_ptr->flags1&RF1_UNIQUE){//unique
1857 bool is_kubi = FALSE;
1858 for(i=0;i<MAX_KUBI;i++){
1859 if(kubi_r_idx[i] == r_idx){
1864 Term_addstr(-1, TERM_WHITE, is_kubi?" W":" U");
1866 sprintf(buf, "%3d", n_same);
1867 Term_addstr(-1, TERM_WHITE, buf);
1870 Term_addstr(-1, TERM_WHITE, " ");
1871 //Term_add_bigch(r_ptr->d_attr, r_ptr->d_char);
1872 //Term_addstr(-1, TERM_WHITE, "/");
1873 Term_add_bigch(r_ptr->x_attr, r_ptr->x_char);
1875 if (r_ptr->r_tkills && !(m_ptr->mflag2 & MFLAG2_KAGE)){
1876 sprintf(buf, " %2d", r_ptr->level);
1880 Term_addstr(-1, TERM_WHITE, buf);
1882 sprintf(buf, " %s ", r_name+r_ptr->name);
1883 Term_addstr(-1, TERM_WHITE, buf);
1885 //Term_addstr(-1, TERM_WHITE, look_mon_desc(m_ptr, 0));
1889 max_lines : 最大何行描画するか.
1891 void print_monster_list(int x, int y, int max_lines){
1893 monster_type* last_mons = NULL;
1894 monster_type* m_ptr = NULL;
1898 for(i=0;i<temp_n;i++){
1899 cave_type* c_ptr = &cave[temp_y[i]][temp_x[i]];
1900 if(!c_ptr->m_idx || !m_list[c_ptr->m_idx].ml)continue;//no mons or cannot look
1901 m_ptr = &m_list[c_ptr->m_idx];
1902 if(is_pet(m_ptr))continue;//pet
1903 if(!m_ptr->r_idx)continue;//dead?
1906 int r_idx = m_ptr->ap_r_idx;
1907 monster_race* r_ptr = &r_info[r_idx];
1908 cptr name = (r_name + r_ptr->name);
1909 cptr ename = (r_name + r_ptr->name);
1910 //ミミック類や「それ」等は、一覧に出てはいけない
1911 if(r_ptr->flags1&RF1_CHAR_CLEAR)continue;
1912 if((r_ptr->flags1&RF1_NEVER_MOVE)&&(r_ptr->flags2&RF2_CHAR_MULTI))continue;
1914 if((strcmp(name, "生ける虚無『ヌル』")==0)||
1915 (strcmp(ename, "Null the Living Void")==0))continue;
1916 //"金無垢の指輪"は、一覧に出てはいけない
1917 if((strcmp(name, "金無垢の指輪")==0)||
1918 (strcmp(ename, "Plain Gold Ring")==0))continue;
1922 //ソート済みなので同じモンスターは連続する.これを利用して同じモンスターをカウント,まとめて表示する.
1923 if(!last_mons){//先頭モンスター
1929 if(last_mons->ap_r_idx == m_ptr->ap_r_idx){
1931 continue;//表示処理を次に回す
1933 //print last mons info
1934 print_monster_line(x, line++, last_mons, n_same);
1937 if(line-y-1==max_lines){//残り1行
1941 if(line-y-1==max_lines && i!=temp_n){
1942 Term_gotoxy(x, line);
1943 Term_addstr(-1, TERM_WHITE, "-- and more --");
1945 if(last_mons)print_monster_line(x, line++, last_mons, n_same);
1949 * Hack -- display monster list in sub-windows
1951 static void fix_monster_list(void)
1957 for (j = 0; j < 8; j++)
1962 if (!angband_term[j]) continue;
1964 /* No relevant flags */
1965 if (!(window_flag[j] & (PW_MONSTER_LIST))) continue;
1968 Term_activate(angband_term[j]);
1969 Term_get_size(&w, &h);
1973 target_set_prepare_look();//モンスター一覧を生成,ソート
1974 print_monster_list(0, 0, h);
1988 * Hack -- display equipment in sub-windows
1990 static void fix_equip(void)
1995 for (j = 0; j < 8; j++)
2000 if (!angband_term[j]) continue;
2002 /* No relevant flags */
2003 if (!(window_flag[j] & (PW_EQUIP))) continue;
2006 Term_activate(angband_term[j]);
2008 /* Display equipment */
2021 * Hack -- display equipment in sub-windows
2023 static void fix_spell(void)
2028 for (j = 0; j < 8; j++)
2033 if (!angband_term[j]) continue;
2035 /* No relevant flags */
2036 if (!(window_flag[j] & (PW_SPELL))) continue;
2039 Term_activate(angband_term[j]);
2041 /* Display spell list */
2042 display_spell_list();
2054 * Hack -- display character in sub-windows
2056 static void fix_player(void)
2061 for (j = 0; j < 8; j++)
2066 if (!angband_term[j]) continue;
2068 /* No relevant flags */
2069 if (!(window_flag[j] & (PW_PLAYER))) continue;
2072 Term_activate(angband_term[j]);
2076 /* Display player */
2090 * Hack -- display recent messages in sub-windows
2092 * XXX XXX XXX Adjust for width and split messages
2094 static void fix_message(void)
2101 for (j = 0; j < 8; j++)
2106 if (!angband_term[j]) continue;
2108 /* No relevant flags */
2109 if (!(window_flag[j] & (PW_MESSAGE))) continue;
2112 Term_activate(angband_term[j]);
2115 Term_get_size(&w, &h);
2118 for (i = 0; i < h; i++)
2120 /* Dump the message on the appropriate line */
2121 Term_putstr(0, (h - 1) - i, -1, (byte)((i < now_message) ? TERM_WHITE : TERM_SLATE), message_str((s16b)i));
2124 Term_locate(&x, &y);
2126 /* Clear to end of line */
2127 Term_erase(x, y, 255);
2140 * Hack -- display overhead view in sub-windows
2142 * Note that the "player" symbol does NOT appear on the map.
2144 static void fix_overhead(void)
2151 for (j = 0; j < 8; j++)
2157 if (!angband_term[j]) continue;
2159 /* No relevant flags */
2160 if (!(window_flag[j] & (PW_OVERHEAD))) continue;
2163 Term_activate(angband_term[j]);
2165 /* Full map in too small window is useless */
2166 Term_get_size(&wid, &hgt);
2167 if (wid > COL_MAP + 2 && hgt > ROW_MAP + 2)
2170 display_map(&cy, &cx);
2183 * Hack -- display dungeon view in sub-windows
2185 static void fix_dungeon(void)
2190 for (j = 0; j < 8; j++)
2195 if (!angband_term[j]) continue;
2197 /* No relevant flags */
2198 if (!(window_flag[j] & (PW_DUNGEON))) continue;
2201 Term_activate(angband_term[j]);
2203 /* Redraw dungeon view */
2216 * Hack -- display monster recall in sub-windows
2218 static void fix_monster(void)
2223 for (j = 0; j < 8; j++)
2228 if (!angband_term[j]) continue;
2230 /* No relevant flags */
2231 if (!(window_flag[j] & (PW_MONSTER))) continue;
2234 Term_activate(angband_term[j]);
2236 /* Display monster race info */
2237 if (p_ptr->monster_race_idx) display_roff(p_ptr->monster_race_idx);
2249 * Hack -- display object recall in sub-windows
2251 static void fix_object(void)
2256 for (j = 0; j < 8; j++)
2261 if (!angband_term[j]) continue;
2263 /* No relevant flags */
2264 if (!(window_flag[j] & (PW_OBJECT))) continue;
2267 Term_activate(angband_term[j]);
2269 /* Display monster race info */
2270 if (p_ptr->object_kind_idx) display_koff(p_ptr->object_kind_idx);
2282 * Calculate number of spells player should have, and forget,
2283 * or remember, spells until that number is properly reflected.
2285 * Note that this function induces various "status" messages,
2286 * which must be bypasses until the character is created.
2288 static void calc_spells(void)
2290 int i, j, k, levels;
2292 int num_boukyaku = 0;
2294 const magic_type *s_ptr;
2301 /* Hack -- must be literate */
2302 if (!mp_ptr->spell_book) return;
2304 /* Hack -- wait for creation */
2305 if (!character_generated) return;
2307 /* Hack -- handle "xtra" mode */
2308 if (character_xtra) return;
2310 if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
2312 p_ptr->new_spells = 0;
2316 p = spell_category_name(mp_ptr->spell_book);
2318 /* Determine the number of spells allowed */
2319 levels = p_ptr->lev - mp_ptr->spell_first + 1;
2321 /* Hack -- no negative spells */
2322 if (levels < 0) levels = 0;
2324 /* Extract total allowed spells */
2325 num_allowed = (adj_mag_study[p_ptr->stat_ind[mp_ptr->spell_stat]] * levels / 2);
2327 if ((p_ptr->pclass != CLASS_SAMURAI) && (mp_ptr->spell_book != TV_LIFE_BOOK))
2331 if (p_ptr->pclass == CLASS_SAMURAI)
2335 else if (p_ptr->realm2 == REALM_NONE)
2337 num_allowed = (num_allowed+1)/2;
2338 if (num_allowed>(32+bonus)) num_allowed = 32+bonus;
2340 else if ((p_ptr->pclass == CLASS_MAGE) || (p_ptr->pclass == CLASS_PRIEST))
2342 if (num_allowed>(96+bonus)) num_allowed = 96+bonus;
2346 if (num_allowed>(80+bonus)) num_allowed = 80+bonus;
2349 /* Count the number of spells we know */
2350 for (j = 0; j < 64; j++)
2352 /* Count known spells */
2354 (p_ptr->spell_forgotten1 & (1L << j)) :
2355 (p_ptr->spell_forgotten2 & (1L << (j - 32))))
2361 /* See how many spells we must forget or may learn */
2362 p_ptr->new_spells = num_allowed + p_ptr->add_spells + num_boukyaku - p_ptr->learned_spells;
2364 /* Forget spells which are too hard */
2365 for (i = 63; i >= 0; i--)
2367 /* Efficiency -- all done */
2368 if (!p_ptr->spell_learned1 && !p_ptr->spell_learned2) break;
2370 /* Access the spell */
2371 j = p_ptr->spell_order[i];
2373 /* Skip non-spells */
2374 if (j >= 99) continue;
2378 if (!is_magic((j < 32) ? p_ptr->realm1 : p_ptr->realm2))
2381 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
2383 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][j%32];
2386 s_ptr = &mp_ptr->info[p_ptr->realm1-1][j];
2388 s_ptr = &mp_ptr->info[p_ptr->realm2-1][j%32];
2390 /* Skip spells we are allowed to know */
2391 if (s_ptr->slevel <= p_ptr->lev) continue;
2395 (p_ptr->spell_learned1 & (1L << j)) :
2396 (p_ptr->spell_learned2 & (1L << (j - 32))))
2398 /* Mark as forgotten */
2401 p_ptr->spell_forgotten1 |= (1L << j);
2402 which = p_ptr->realm1;
2406 p_ptr->spell_forgotten2 |= (1L << (j - 32));
2407 which = p_ptr->realm2;
2410 /* No longer known */
2413 p_ptr->spell_learned1 &= ~(1L << j);
2414 which = p_ptr->realm1;
2418 p_ptr->spell_learned2 &= ~(1L << (j - 32));
2419 which = p_ptr->realm2;
2424 msg_format("%sの%sを忘れてしまった。",
2425 do_spell(which, j%32, SPELL_NAME), p );
2427 msg_format("You have forgotten the %s of %s.", p,
2428 do_spell(which, j%32, SPELL_NAME));
2432 /* One more can be learned */
2433 p_ptr->new_spells++;
2438 /* Forget spells if we know too many spells */
2439 for (i = 63; i >= 0; i--)
2441 /* Stop when possible */
2442 if (p_ptr->new_spells >= 0) break;
2444 /* Efficiency -- all done */
2445 if (!p_ptr->spell_learned1 && !p_ptr->spell_learned2) break;
2447 /* Get the (i+1)th spell learned */
2448 j = p_ptr->spell_order[i];
2450 /* Skip unknown spells */
2451 if (j >= 99) continue;
2453 /* Forget it (if learned) */
2455 (p_ptr->spell_learned1 & (1L << j)) :
2456 (p_ptr->spell_learned2 & (1L << (j - 32))))
2458 /* Mark as forgotten */
2461 p_ptr->spell_forgotten1 |= (1L << j);
2462 which = p_ptr->realm1;
2466 p_ptr->spell_forgotten2 |= (1L << (j - 32));
2467 which = p_ptr->realm2;
2470 /* No longer known */
2473 p_ptr->spell_learned1 &= ~(1L << j);
2474 which = p_ptr->realm1;
2478 p_ptr->spell_learned2 &= ~(1L << (j - 32));
2479 which = p_ptr->realm2;
2484 msg_format("%sの%sを忘れてしまった。",
2485 do_spell(which, j%32, SPELL_NAME), p );
2487 msg_format("You have forgotten the %s of %s.", p,
2488 do_spell(which, j%32, SPELL_NAME));
2492 /* One more can be learned */
2493 p_ptr->new_spells++;
2498 /* Check for spells to remember */
2499 for (i = 0; i < 64; i++)
2501 /* None left to remember */
2502 if (p_ptr->new_spells <= 0) break;
2504 /* Efficiency -- all done */
2505 if (!p_ptr->spell_forgotten1 && !p_ptr->spell_forgotten2) break;
2507 /* Get the next spell we learned */
2508 j = p_ptr->spell_order[i];
2510 /* Skip unknown spells */
2513 /* Access the spell */
2514 if (!is_magic((j < 32) ? p_ptr->realm1 : p_ptr->realm2))
2517 s_ptr = &technic_info[p_ptr->realm1 - MIN_TECHNIC][j];
2519 s_ptr = &technic_info[p_ptr->realm2 - MIN_TECHNIC][j%32];
2522 s_ptr = &mp_ptr->info[p_ptr->realm1-1][j];
2524 s_ptr = &mp_ptr->info[p_ptr->realm2-1][j%32];
2526 /* Skip spells we cannot remember */
2527 if (s_ptr->slevel > p_ptr->lev) continue;
2529 /* First set of spells */
2531 (p_ptr->spell_forgotten1 & (1L << j)) :
2532 (p_ptr->spell_forgotten2 & (1L << (j - 32))))
2534 /* No longer forgotten */
2537 p_ptr->spell_forgotten1 &= ~(1L << j);
2538 which = p_ptr->realm1;
2542 p_ptr->spell_forgotten2 &= ~(1L << (j - 32));
2543 which = p_ptr->realm2;
2546 /* Known once more */
2549 p_ptr->spell_learned1 |= (1L << j);
2550 which = p_ptr->realm1;
2554 p_ptr->spell_learned2 |= (1L << (j - 32));
2555 which = p_ptr->realm2;
2560 msg_format("%sの%sを思い出した。",
2561 do_spell(which, j%32, SPELL_NAME), p );
2563 msg_format("You have remembered the %s of %s.",
2564 p, do_spell(which, j%32, SPELL_NAME));
2568 /* One less can be learned */
2569 p_ptr->new_spells--;
2575 if (p_ptr->realm2 == REALM_NONE)
2577 /* Count spells that can be learned */
2578 for (j = 0; j < 32; j++)
2580 if (!is_magic(p_ptr->realm1)) s_ptr = &technic_info[p_ptr->realm1-MIN_TECHNIC][j];
2581 else s_ptr = &mp_ptr->info[p_ptr->realm1-1][j];
2583 /* Skip spells we cannot remember */
2584 if (s_ptr->slevel > p_ptr->lev) continue;
2586 /* Skip spells we already know */
2587 if (p_ptr->spell_learned1 & (1L << j))
2596 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;
2599 if (p_ptr->new_spells < 0) p_ptr->new_spells = 0;
2601 /* Spell count changed */
2602 if (p_ptr->old_spells != p_ptr->new_spells)
2604 /* Message if needed */
2605 if (p_ptr->new_spells)
2609 if( p_ptr->new_spells < 10 ){
2610 msg_format("あと %d つの%sを学べる。", p_ptr->new_spells, p);
2612 msg_format("あと %d 個の%sを学べる。", p_ptr->new_spells, p);
2615 msg_format("You can learn %d more %s%s.",
2616 p_ptr->new_spells, p,
2617 (p_ptr->new_spells != 1) ? "s" : "");
2622 /* Save the new_spells value */
2623 p_ptr->old_spells = p_ptr->new_spells;
2625 /* Redraw Study Status */
2626 p_ptr->redraw |= (PR_STUDY);
2628 /* Redraw object recall */
2629 p_ptr->window |= (PW_OBJECT);
2635 * Calculate maximum mana. You do not need to know any spells.
2636 * Note that mana is lowered by heavy (or inappropriate) armor.
2638 * This function induces status messages.
2640 static void calc_mana(void)
2642 int msp, levels, cur_wgt, max_wgt;
2647 /* Hack -- Must be literate */
2648 if (!mp_ptr->spell_book) return;
2650 if ((p_ptr->pclass == CLASS_MINDCRAFTER) ||
2651 (p_ptr->pclass == CLASS_MIRROR_MASTER) ||
2652 (p_ptr->pclass == CLASS_BLUE_MAGE))
2654 levels = p_ptr->lev;
2658 if(mp_ptr->spell_first > p_ptr->lev)
2663 /* Display mana later */
2664 p_ptr->redraw |= (PR_MANA);
2668 /* Extract "effective" player level */
2669 levels = (p_ptr->lev - mp_ptr->spell_first) + 1;
2672 if (p_ptr->pclass == CLASS_SAMURAI)
2674 msp = (adj_mag_mana[p_ptr->stat_ind[mp_ptr->spell_stat]] + 10) * 2;
2675 if (msp) msp += (msp * rp_ptr->r_adj[mp_ptr->spell_stat] / 20);
2679 /* Extract total mana */
2680 msp = adj_mag_mana[p_ptr->stat_ind[mp_ptr->spell_stat]] * (levels+3) / 4;
2682 /* Hack -- usually add one mana */
2685 if (msp) msp += (msp * rp_ptr->r_adj[mp_ptr->spell_stat] / 20);
2687 if (msp && (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)) msp += msp/2;
2689 /* Hack: High mages have a 25% mana bonus */
2690 if (msp && (p_ptr->pclass == CLASS_HIGH_MAGE)) msp += msp / 4;
2692 if (msp && (p_ptr->pclass == CLASS_SORCERER)) msp += msp*(25+p_ptr->lev)/100;
2695 /* Only mages are affected */
2696 if (mp_ptr->spell_xtra & MAGIC_GLOVE_REDUCE_MANA)
2698 u32b flgs[TR_FLAG_SIZE];
2700 /* Assume player is not encumbered by gloves */
2701 p_ptr->cumber_glove = FALSE;
2703 /* Get the gloves */
2704 o_ptr = &inventory[INVEN_HANDS];
2706 /* Examine the gloves */
2707 object_flags(o_ptr, flgs);
2709 /* Normal gloves hurt mage-type spells */
2711 !(have_flag(flgs, TR_FREE_ACT)) &&
2712 !(have_flag(flgs, TR_DEC_MANA)) &&
2713 !(have_flag(flgs, TR_EASY_SPELL)) &&
2714 !((have_flag(flgs, TR_MAGIC_MASTERY)) && (o_ptr->pval > 0)) &&
2715 !((have_flag(flgs, TR_DEX)) && (o_ptr->pval > 0)))
2718 p_ptr->cumber_glove = TRUE;
2721 msp = (3 * msp) / 4;
2726 /* Assume player not encumbered by armor */
2727 p_ptr->cumber_armor = FALSE;
2729 /* Weigh the armor */
2731 if(inventory[INVEN_RARM].tval> TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight;
2732 if(inventory[INVEN_LARM].tval> TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight;
2733 cur_wgt += inventory[INVEN_BODY].weight;
2734 cur_wgt += inventory[INVEN_HEAD].weight;
2735 cur_wgt += inventory[INVEN_OUTER].weight;
2736 cur_wgt += inventory[INVEN_HANDS].weight;
2737 cur_wgt += inventory[INVEN_FEET].weight;
2739 /* Subtract a percentage of maximum mana. */
2740 switch (p_ptr->pclass)
2742 /* For these classes, mana is halved if armour
2743 * is 30 pounds over their weight limit. */
2745 case CLASS_HIGH_MAGE:
2746 case CLASS_BLUE_MAGE:
2748 case CLASS_FORCETRAINER:
2749 case CLASS_SORCERER:
2751 if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight;
2752 if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight;
2756 /* Mana halved if armour is 40 pounds over weight limit. */
2761 if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight*2/3;
2762 if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight*2/3;
2766 case CLASS_MINDCRAFTER:
2767 case CLASS_BEASTMASTER:
2768 case CLASS_MIRROR_MASTER:
2770 if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight/2;
2771 if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight/2;
2775 /* Mana halved if armour is 50 pounds over weight limit. */
2778 case CLASS_RED_MAGE:
2779 case CLASS_WARRIOR_MAGE:
2781 if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight/3;
2782 if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight/3;
2786 /* Mana halved if armour is 60 pounds over weight limit. */
2788 case CLASS_CHAOS_WARRIOR:
2790 if (inventory[INVEN_RARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_RARM].weight/5;
2791 if (inventory[INVEN_LARM].tval <= TV_SWORD) cur_wgt += inventory[INVEN_LARM].weight/5;
2795 /* For new classes created, but not yet added to this formula. */
2802 /* Determine the weight allowance */
2803 max_wgt = mp_ptr->spell_weight;
2805 /* Heavy armor penalizes mana by a percentage. -LM- */
2806 if ((cur_wgt - max_wgt) > 0)
2809 p_ptr->cumber_armor = TRUE;
2811 /* Subtract a percentage of maximum mana. */
2812 switch (p_ptr->pclass)
2814 /* For these classes, mana is halved if armour
2815 * is 30 pounds over their weight limit. */
2817 case CLASS_HIGH_MAGE:
2818 case CLASS_BLUE_MAGE:
2820 msp -= msp * (cur_wgt - max_wgt) / 600;
2824 /* Mana halved if armour is 40 pounds over weight limit. */
2826 case CLASS_MINDCRAFTER:
2827 case CLASS_BEASTMASTER:
2829 case CLASS_FORCETRAINER:
2831 case CLASS_MIRROR_MASTER:
2833 msp -= msp * (cur_wgt - max_wgt) / 800;
2837 case CLASS_SORCERER:
2839 msp -= msp * (cur_wgt - max_wgt) / 900;
2843 /* Mana halved if armour is 50 pounds over weight limit. */
2847 case CLASS_RED_MAGE:
2849 msp -= msp * (cur_wgt - max_wgt) / 1000;
2853 /* Mana halved if armour is 60 pounds over weight limit. */
2855 case CLASS_CHAOS_WARRIOR:
2856 case CLASS_WARRIOR_MAGE:
2858 msp -= msp * (cur_wgt - max_wgt) / 1200;
2864 p_ptr->cumber_armor = FALSE;
2868 /* For new classes created, but not yet added to this formula. */
2871 msp -= msp * (cur_wgt - max_wgt) / 800;
2877 /* Mana can never be negative */
2878 if (msp < 0) msp = 0;
2881 /* Maximum mana has changed */
2882 if (p_ptr->msp != msp)
2884 /* Enforce maximum */
2885 if ((p_ptr->csp >= msp) && (p_ptr->pclass != CLASS_SAMURAI))
2888 p_ptr->csp_frac = 0;
2892 /* レベルアップの時は上昇量を表示する */
2893 if ((level_up == 1) && (msp > p_ptr->msp))
2895 msg_format("最大マジック・ポイントが %d 増加した!",
2896 (msp - p_ptr->msp));
2902 /* Display mana later */
2903 p_ptr->redraw |= (PR_MANA);
2906 p_ptr->window |= (PW_PLAYER);
2907 p_ptr->window |= (PW_SPELL);
2911 /* Hack -- handle "xtra" mode */
2912 if (character_xtra) return;
2914 /* Take note when "glove state" changes */
2915 if (p_ptr->old_cumber_glove != p_ptr->cumber_glove)
2918 if (p_ptr->cumber_glove)
2921 msg_print("手が覆われて呪文が唱えにくい感じがする。");
2923 msg_print("Your covered hands feel unsuitable for spellcasting.");
2930 msg_print("この手の状態なら、ぐっと呪文が唱えやすい感じだ。");
2932 msg_print("Your hands feel more suitable for spellcasting.");
2938 p_ptr->old_cumber_glove = p_ptr->cumber_glove;
2942 /* Take note when "armor state" changes */
2943 if (p_ptr->old_cumber_armor != p_ptr->cumber_armor)
2946 if (p_ptr->cumber_armor)
2949 msg_print("装備の重さで動きが鈍くなってしまっている。");
2951 msg_print("The weight of your equipment encumbers your movement.");
2958 msg_print("ぐっと楽に体を動かせるようになった。");
2960 msg_print("You feel able to move more freely.");
2966 p_ptr->old_cumber_armor = p_ptr->cumber_armor;
2973 * Calculate the players (maximal) hit points
2974 * Adjust current hitpoints if necessary
2976 static void calc_hitpoints(void)
2981 /* Un-inflate "half-hitpoint bonus per level" value */
2982 bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128) * p_ptr->lev / 4;
2984 /* Calculate hitpoints */
2985 mhp = p_ptr->player_hp[p_ptr->lev - 1];
2987 if (p_ptr->mimic_form)
2989 if (p_ptr->pclass == CLASS_SORCERER)
2990 tmp_hitdie = mimic_info[p_ptr->mimic_form].r_mhp/2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
2992 tmp_hitdie = mimic_info[p_ptr->mimic_form].r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
2993 mhp = mhp * tmp_hitdie / p_ptr->hitdie;
2996 if (p_ptr->pclass == CLASS_SORCERER)
2998 if (p_ptr->lev < 30)
2999 mhp = (mhp * (45+p_ptr->lev) / 100);
3001 mhp = (mhp * 75 / 100);
3002 bonus = (bonus * 65 / 100);
3007 if (p_ptr->pclass == CLASS_BERSERKER)
3009 mhp = mhp*(110+(((p_ptr->lev + 40) * (p_ptr->lev + 40) - 1550) / 110))/100;
3012 /* Always have at least one hitpoint per level */
3013 if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1;
3015 /* Factor in the hero / superhero settings */
3016 if (IS_HERO()) mhp += 10;
3017 if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER)) mhp += 30;
3018 if (p_ptr->tsuyoshi) mhp += 50;
3020 /* Factor in the hex spell settings */
3021 if (hex_spelling(HEX_XTRA_MIGHT)) mhp += 15;
3022 if (hex_spelling(HEX_BUILDING)) mhp += 60;
3024 /* New maximum hitpoints */
3025 if (p_ptr->mhp != mhp)
3027 /* Enforce maximum */
3028 if (p_ptr->chp >= mhp)
3031 p_ptr->chp_frac = 0;
3035 /* レベルアップの時は上昇量を表示する */
3036 if ((level_up == 1) && (mhp > p_ptr->mhp))
3038 msg_format("最大ヒット・ポイントが %d 増加した!",
3039 (mhp - p_ptr->mhp) );
3042 /* Save the new max-hitpoints */
3045 /* Display hitpoints (later) */
3046 p_ptr->redraw |= (PR_HP);
3049 p_ptr->window |= (PW_PLAYER);
3056 * Extract and set the current "lite radius"
3058 * SWD: Experimental modification: multiple light sources have additive effect.
3061 static void calc_torch(void)
3065 u32b flgs[TR_FLAG_SIZE];
3067 /* Assume no light */
3068 p_ptr->cur_lite = 0;
3070 /* Loop through all wielded items */
3071 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
3073 o_ptr = &inventory[i];
3074 /* Skip empty slots */
3075 if (!o_ptr->k_idx) continue;
3077 if (o_ptr->name2 == EGO_LITE_SHINE) p_ptr->cur_lite++;
3080 if (o_ptr->name2 != EGO_LITE_DARKNESS)
3082 if (o_ptr->tval == TV_LITE)
3084 if((o_ptr->sval == SV_LITE_TORCH) && !(o_ptr->xtra4 > 0)) continue;
3085 if((o_ptr->sval == SV_LITE_LANTERN) && !(o_ptr->xtra4 > 0)) continue;
3089 /* Extract the flags */
3090 object_flags(o_ptr, flgs);
3092 /* calc the lite_radius */
3095 if (have_flag(flgs, TR_LITE_1) && o_ptr->name2 != EGO_LITE_DARKNESS) rad += 1;
3096 if (have_flag(flgs, TR_LITE_2) && o_ptr->name2 != EGO_LITE_DARKNESS) rad += 2;
3097 if (have_flag(flgs, TR_LITE_3) && o_ptr->name2 != EGO_LITE_DARKNESS) rad += 3;
3098 if (have_flag(flgs, TR_LITE_M1)) rad -= 1;
3099 if (have_flag(flgs, TR_LITE_M2)) rad -= 2;
3100 if (have_flag(flgs, TR_LITE_M3)) rad -= 3;
3101 p_ptr->cur_lite += rad;
3104 /* max radius is 14 (was 5) without rewriting other code -- */
3105 /* see cave.c:update_lite() and defines.h:LITE_MAX */
3106 if (d_info[dungeon_type].flags1 & DF1_DARKNESS && p_ptr->cur_lite > 1)
3107 p_ptr->cur_lite = 1;
3110 * check if the player doesn't have light radius,
3111 * but does weakly glow as an intrinsic.
3113 if (p_ptr->cur_lite <= 0 && p_ptr->lite) p_ptr->cur_lite++;
3115 if (p_ptr->cur_lite > 14) p_ptr->cur_lite = 14;
3116 if (p_ptr->cur_lite < 0) p_ptr->cur_lite = 0;
3118 /* end experimental mods */
3120 /* Notice changes in the "lite radius" */
3121 if (p_ptr->old_lite != p_ptr->cur_lite)
3124 /* Hack -- PU_MON_LITE for monsters' darkness */
3125 p_ptr->update |= (PU_LITE | PU_MON_LITE | PU_MONSTERS);
3127 /* Remember the old lite */
3128 p_ptr->old_lite = p_ptr->cur_lite;
3130 if ((p_ptr->cur_lite > 0) && (p_ptr->special_defense & NINJA_S_STEALTH))
3131 set_superstealth(FALSE);
3138 * Computes current weight limit.
3140 u32b weight_limit(void)
3144 /* Weight limit based only on strength */
3145 i = (u32b)adj_str_wgt[p_ptr->stat_ind[A_STR]] * 50; /* Constant was 100 */
3146 if (p_ptr->pclass == CLASS_BERSERKER) i = i * 3 / 2;
3148 /* Return the result */
3153 bool buki_motteruka(int i)
3155 return ((inventory[i].k_idx && object_is_melee_weapon(&inventory[i])) ? TRUE : FALSE);
3158 bool is_heavy_shoot(object_type *o_ptr)
3160 int hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
3161 /* It is hard to carholdry a heavy bow */
3162 return (hold < o_ptr->weight / 10);
3165 int bow_tval_ammo(object_type *o_ptr)
3167 /* Analyze the launcher */
3168 switch (o_ptr->sval)
3196 /* calcurate the fire rate of target object */
3197 s16b calc_num_fire(object_type *o_ptr)
3199 int extra_shots = 0;
3202 int tval_ammo = bow_tval_ammo(o_ptr);
3204 u32b flgs[TR_FLAG_SIZE];
3206 /* Scan the usable inventory */
3207 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
3209 q_ptr = &inventory[i];
3211 /* Skip non-objects */
3212 if (!q_ptr->k_idx) continue;
3214 /* Do not apply current equip */
3215 if (i == INVEN_BOW) continue;
3217 /* Extract the item flags */
3218 object_flags(q_ptr, flgs);
3221 if (have_flag(flgs, TR_XTRA_SHOTS)) extra_shots++;
3224 object_flags(o_ptr, flgs);
3225 if (have_flag(flgs, TR_XTRA_SHOTS)) extra_shots++;
3227 if (o_ptr->k_idx && !is_heavy_shoot(o_ptr))
3231 num += (extra_shots * 100);
3233 /* Hack -- Rangers love Bows */
3234 if ((p_ptr->pclass == CLASS_RANGER) &&
3235 (tval_ammo == TV_ARROW))
3237 num += (p_ptr->lev * 4);
3240 if ((p_ptr->pclass == CLASS_CAVALRY) &&
3241 (tval_ammo == TV_ARROW))
3243 num += (p_ptr->lev * 3);
3246 if (p_ptr->pclass == CLASS_ARCHER)
3248 if (tval_ammo == TV_ARROW)
3249 num += ((p_ptr->lev * 5)+50);
3250 else if ((tval_ammo == TV_BOLT) || (tval_ammo == TV_SHOT))
3251 num += (p_ptr->lev * 4);
3255 * Addendum -- also "Reward" high level warriors,
3256 * with _any_ missile weapon -- TY
3258 if (p_ptr->pclass == CLASS_WARRIOR &&
3259 (tval_ammo <= TV_BOLT) &&
3260 (tval_ammo >= TV_SHOT))
3262 num += (p_ptr->lev * 2);
3264 if ((p_ptr->pclass == CLASS_ROGUE) &&
3265 (tval_ammo == TV_SHOT))
3267 num += (p_ptr->lev * 4);
3274 * Calculate the players current "state", taking into account
3275 * not only race/class intrinsics, but also objects being worn
3276 * and temporary spell effects.
3278 * See also calc_mana() and calc_hitpoints().
3280 * Take note of the new "speed code", in particular, a very strong
3281 * player will start slowing down as soon as he reaches 150 pounds,
3282 * but not until he reaches 450 pounds will he be half as fast as
3283 * a normal kobold. This both hurts and helps the player, hurts
3284 * because in the old days a player could just avoid 300 pounds,
3285 * and helps because now carrying 300 pounds is not very painful.
3287 * The "weapon" and "bow" do *not* add to the bonuses to hit or to
3288 * damage, since that would affect non-combat things. These values
3289 * are actually added in later, at the appropriate place.
3291 * This function induces various "status" messages.
3293 void calc_bonuses(void)
3295 int i, j, hold, neutral[2];
3297 int default_hand = 0;
3298 int empty_hands_status = empty_hands(TRUE);
3301 u32b flgs[TR_FLAG_SIZE];
3303 bool yoiyami = FALSE;
3304 bool down_saving = FALSE;
3306 bool have_dd_s = FALSE, have_dd_t = FALSE;
3308 bool have_sw = FALSE, have_kabe = FALSE;
3309 bool easy_2weapon = FALSE;
3310 bool riding_levitation = FALSE;
3311 s16b this_o_idx, next_o_idx = 0;
3312 const player_race *tmp_rp_ptr;
3314 /* Save the old vision stuff */
3315 bool old_telepathy = p_ptr->telepathy;
3316 bool old_esp_animal = p_ptr->esp_animal;
3317 bool old_esp_undead = p_ptr->esp_undead;
3318 bool old_esp_demon = p_ptr->esp_demon;
3319 bool old_esp_orc = p_ptr->esp_orc;
3320 bool old_esp_troll = p_ptr->esp_troll;
3321 bool old_esp_giant = p_ptr->esp_giant;
3322 bool old_esp_dragon = p_ptr->esp_dragon;
3323 bool old_esp_human = p_ptr->esp_human;
3324 bool old_esp_evil = p_ptr->esp_evil;
3325 bool old_esp_good = p_ptr->esp_good;
3326 bool old_esp_nonliving = p_ptr->esp_nonliving;
3327 bool old_esp_unique = p_ptr->esp_unique;
3328 bool old_see_inv = p_ptr->see_inv;
3329 bool old_mighty_throw = p_ptr->mighty_throw;
3331 /* Save the old armor class */
3332 bool old_dis_ac = p_ptr->dis_ac;
3333 bool old_dis_to_a = p_ptr->dis_to_a;
3336 /* Clear extra blows/shots */
3337 extra_blows[0] = extra_blows[1] = 0;
3339 /* Clear the stat modifiers */
3340 for (i = 0; i < 6; i++) p_ptr->stat_add[i] = 0;
3343 /* Clear the Displayed/Real armor class */
3344 p_ptr->dis_ac = p_ptr->ac = 0;
3346 /* Clear the Displayed/Real Bonuses */
3347 p_ptr->dis_to_h[0] = p_ptr->to_h[0] = 0;
3348 p_ptr->dis_to_h[1] = p_ptr->to_h[1] = 0;
3349 p_ptr->dis_to_d[0] = p_ptr->to_d[0] = 0;
3350 p_ptr->dis_to_d[1] = p_ptr->to_d[1] = 0;
3351 p_ptr->dis_to_h_b = p_ptr->to_h_b = 0;
3352 p_ptr->dis_to_a = p_ptr->to_a = 0;
3356 p_ptr->to_m_chance = 0;
3358 /* Clear the Extra Dice Bonuses */
3359 p_ptr->to_dd[0] = p_ptr->to_ds[0] = 0;
3360 p_ptr->to_dd[1] = p_ptr->to_ds[1] = 0;
3362 /* Start with "normal" speed */
3365 /* Start with a single blow per turn */
3366 p_ptr->num_blow[0] = 1;
3367 p_ptr->num_blow[1] = 1;
3369 /* Start with a single shot per turn */
3370 p_ptr->num_fire = 100;
3372 /* Reset the "xtra" tval */
3373 p_ptr->tval_xtra = 0;
3375 /* Reset the "ammo" tval */
3376 p_ptr->tval_ammo = 0;
3378 /* Clear all the flags */
3380 p_ptr->bless_blade = FALSE;
3381 p_ptr->xtra_might = FALSE;
3382 p_ptr->impact[0] = FALSE;
3383 p_ptr->impact[1] = FALSE;
3384 p_ptr->pass_wall = FALSE;
3385 p_ptr->kill_wall = FALSE;
3386 p_ptr->dec_mana = FALSE;
3387 p_ptr->easy_spell = FALSE;
3388 p_ptr->heavy_spell = FALSE;
3389 p_ptr->see_inv = FALSE;
3390 p_ptr->free_act = FALSE;
3391 p_ptr->slow_digest = FALSE;
3392 p_ptr->regenerate = FALSE;
3393 p_ptr->can_swim = FALSE;
3394 p_ptr->levitation = FALSE;
3395 p_ptr->hold_exp = FALSE;
3396 p_ptr->telepathy = FALSE;
3397 p_ptr->esp_animal = FALSE;
3398 p_ptr->esp_undead = FALSE;
3399 p_ptr->esp_demon = FALSE;
3400 p_ptr->esp_orc = FALSE;
3401 p_ptr->esp_troll = FALSE;
3402 p_ptr->esp_giant = FALSE;
3403 p_ptr->esp_dragon = FALSE;
3404 p_ptr->esp_human = FALSE;
3405 p_ptr->esp_evil = FALSE;
3406 p_ptr->esp_good = FALSE;
3407 p_ptr->esp_nonliving = FALSE;
3408 p_ptr->esp_unique = FALSE;
3409 p_ptr->lite = FALSE;
3410 p_ptr->sustain_str = FALSE;
3411 p_ptr->sustain_int = FALSE;
3412 p_ptr->sustain_wis = FALSE;
3413 p_ptr->sustain_con = FALSE;
3414 p_ptr->sustain_dex = FALSE;
3415 p_ptr->sustain_chr = FALSE;
3416 p_ptr->resist_acid = FALSE;
3417 p_ptr->resist_elec = FALSE;
3418 p_ptr->resist_fire = FALSE;
3419 p_ptr->resist_cold = FALSE;
3420 p_ptr->resist_pois = FALSE;
3421 p_ptr->resist_conf = FALSE;
3422 p_ptr->resist_sound = FALSE;
3423 p_ptr->resist_lite = FALSE;
3424 p_ptr->resist_dark = FALSE;
3425 p_ptr->resist_chaos = FALSE;
3426 p_ptr->resist_disen = FALSE;
3427 p_ptr->resist_shard = FALSE;
3428 p_ptr->resist_nexus = FALSE;
3429 p_ptr->resist_blind = FALSE;
3430 p_ptr->resist_neth = FALSE;
3431 p_ptr->resist_time = FALSE;
3432 p_ptr->resist_fear = FALSE;
3433 p_ptr->reflect = FALSE;
3434 p_ptr->sh_fire = FALSE;
3435 p_ptr->sh_elec = FALSE;
3436 p_ptr->sh_cold = FALSE;
3437 p_ptr->anti_magic = FALSE;
3438 p_ptr->anti_tele = FALSE;
3439 p_ptr->warning = FALSE;
3440 p_ptr->mighty_throw = FALSE;
3441 p_ptr->see_nocto = FALSE;
3443 p_ptr->immune_acid = FALSE;
3444 p_ptr->immune_elec = FALSE;
3445 p_ptr->immune_fire = FALSE;
3446 p_ptr->immune_cold = FALSE;
3448 p_ptr->ryoute = FALSE;
3449 p_ptr->migite = FALSE;
3450 p_ptr->hidarite = FALSE;
3451 p_ptr->no_flowed = FALSE;
3453 p_ptr->align = friend_align;
3455 if (p_ptr->mimic_form) tmp_rp_ptr = &mimic_info[p_ptr->mimic_form];
3456 else tmp_rp_ptr = &race_info[p_ptr->prace];
3458 /* Base infravision (purely racial) */
3459 p_ptr->see_infra = tmp_rp_ptr->infra;
3461 /* Base skill -- disarming */
3462 p_ptr->skill_dis = tmp_rp_ptr->r_dis + cp_ptr->c_dis + ap_ptr->a_dis;
3464 /* Base skill -- magic devices */
3465 p_ptr->skill_dev = tmp_rp_ptr->r_dev + cp_ptr->c_dev + ap_ptr->a_dev;
3467 /* Base skill -- saving throw */
3468 p_ptr->skill_sav = tmp_rp_ptr->r_sav + cp_ptr->c_sav + ap_ptr->a_sav;
3470 /* Base skill -- stealth */
3471 p_ptr->skill_stl = tmp_rp_ptr->r_stl + cp_ptr->c_stl + ap_ptr->a_stl;
3473 /* Base skill -- searching ability */
3474 p_ptr->skill_srh = tmp_rp_ptr->r_srh + cp_ptr->c_srh + ap_ptr->a_srh;
3476 /* Base skill -- searching frequency */
3477 p_ptr->skill_fos = tmp_rp_ptr->r_fos + cp_ptr->c_fos + ap_ptr->a_fos;
3479 /* Base skill -- combat (normal) */
3480 p_ptr->skill_thn = tmp_rp_ptr->r_thn + cp_ptr->c_thn + ap_ptr->a_thn;
3482 /* Base skill -- combat (shooting) */
3483 p_ptr->skill_thb = tmp_rp_ptr->r_thb + cp_ptr->c_thb + ap_ptr->a_thb;
3485 /* Base skill -- combat (throwing) */
3486 p_ptr->skill_tht = tmp_rp_ptr->r_thb + cp_ptr->c_thb + ap_ptr->a_thb;
3488 /* Base skill -- digging */
3489 p_ptr->skill_dig = 0;
3491 if (buki_motteruka(INVEN_RARM)) p_ptr->migite = TRUE;
3492 if (buki_motteruka(INVEN_LARM))
3494 p_ptr->hidarite = TRUE;
3495 if (!p_ptr->migite) default_hand = 1;
3498 if (CAN_TWO_HANDS_WIELDING())
3500 if (p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
3501 object_allow_two_hands_wielding(&inventory[INVEN_RARM]))
3503 p_ptr->ryoute = TRUE;
3505 else if (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
3506 object_allow_two_hands_wielding(&inventory[INVEN_LARM]))
3508 p_ptr->ryoute = TRUE;
3512 switch (p_ptr->pclass)
3515 case CLASS_FORCETRAINER:
3516 case CLASS_BERSERKER:
3517 if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
3519 p_ptr->migite = TRUE;
3520 p_ptr->ryoute = TRUE;
3527 if (!p_ptr->migite && !p_ptr->hidarite)
3529 if (empty_hands_status & EMPTY_HAND_RARM) p_ptr->migite = TRUE;
3530 else if (empty_hands_status == EMPTY_HAND_LARM)
3532 p_ptr->hidarite = TRUE;
3537 if (p_ptr->special_defense & KAMAE_MASK)
3539 if (!(empty_hands_status & EMPTY_HAND_RARM))
3541 set_action(ACTION_NONE);
3545 switch (p_ptr->pclass)
3548 if (p_ptr->lev > 29) p_ptr->resist_fear = TRUE;
3549 if (p_ptr->lev > 44) p_ptr->regenerate = TRUE;
3552 if (p_ptr->lev > 39) p_ptr->resist_fear = TRUE;
3554 case CLASS_CHAOS_WARRIOR:
3555 if (p_ptr->lev > 29) p_ptr->resist_chaos = TRUE;
3556 if (p_ptr->lev > 39) p_ptr->resist_fear = TRUE;
3558 case CLASS_MINDCRAFTER:
3559 if (p_ptr->lev > 9) p_ptr->resist_fear = TRUE;
3560 if (p_ptr->lev > 19) p_ptr->sustain_wis = TRUE;
3561 if (p_ptr->lev > 29) p_ptr->resist_conf = TRUE;
3562 if (p_ptr->lev > 39) p_ptr->telepathy = TRUE;
3565 case CLASS_FORCETRAINER:
3566 /* Unencumbered Monks become faster every 10 levels */
3567 if (!(heavy_armor()))
3569 if (!(prace_is_(RACE_KLACKON) ||
3570 prace_is_(RACE_SPRITE) ||
3571 (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)))
3572 new_speed += (p_ptr->lev) / 10;
3574 /* Free action if unencumbered at level 25 */
3575 if (p_ptr->lev > 24)
3576 p_ptr->free_act = TRUE;
3579 case CLASS_SORCERER:
3581 p_ptr->dis_to_a -= 50;
3584 p_ptr->resist_sound = TRUE;
3587 if (p_ptr->lev > 29) p_ptr->resist_fear = TRUE;
3589 case CLASS_BERSERKER:
3591 p_ptr->sustain_str = TRUE;
3592 p_ptr->sustain_dex = TRUE;
3593 p_ptr->sustain_con = TRUE;
3594 p_ptr->regenerate = TRUE;
3595 p_ptr->free_act = TRUE;
3597 if (p_ptr->lev > 29) new_speed++;
3598 if (p_ptr->lev > 39) new_speed++;
3599 if (p_ptr->lev > 44) new_speed++;
3600 if (p_ptr->lev > 49) new_speed++;
3601 p_ptr->to_a += 10+p_ptr->lev/2;
3602 p_ptr->dis_to_a += 10+p_ptr->lev/2;
3603 p_ptr->skill_dig += (100+p_ptr->lev*8);
3604 if (p_ptr->lev > 39) p_ptr->reflect = TRUE;
3605 p_ptr->redraw |= PR_STATUS;
3607 case CLASS_MIRROR_MASTER:
3608 if (p_ptr->lev > 39) p_ptr->reflect = TRUE;
3611 /* Unencumbered Ninjas become faster every 10 levels */
3614 new_speed -= (p_ptr->lev) / 10;
3615 p_ptr->skill_stl -= (p_ptr->lev)/10;
3617 else if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
3618 (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
3621 if (!(prace_is_(RACE_KLACKON) ||
3622 prace_is_(RACE_SPRITE) ||
3623 (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)))
3624 new_speed += (p_ptr->lev) / 10;
3625 p_ptr->skill_stl += (p_ptr->lev)/10;
3627 /* Free action if unencumbered at level 25 */
3628 if (p_ptr->lev > 24)
3629 p_ptr->free_act = TRUE;
3631 if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
3632 (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
3634 p_ptr->to_a += p_ptr->lev/2+5;
3635 p_ptr->dis_to_a += p_ptr->lev/2+5;
3637 p_ptr->slow_digest = TRUE;
3638 p_ptr->resist_fear = TRUE;
3639 if (p_ptr->lev > 19) p_ptr->resist_pois = TRUE;
3640 if (p_ptr->lev > 24) p_ptr->sustain_dex = TRUE;
3641 if (p_ptr->lev > 29) p_ptr->see_inv = TRUE;
3642 if (p_ptr->lev > 44)
3644 p_ptr->oppose_pois = 1;
3645 p_ptr->redraw |= PR_STATUS;
3647 p_ptr->see_nocto = TRUE;
3652 if (p_ptr->mimic_form)
3654 switch (p_ptr->mimic_form)
3657 p_ptr->hold_exp = TRUE;
3658 p_ptr->resist_chaos = TRUE;
3659 p_ptr->resist_neth = TRUE;
3660 p_ptr->resist_fire = TRUE;
3661 p_ptr->oppose_fire = 1;
3662 p_ptr->see_inv=TRUE;
3664 p_ptr->redraw |= PR_STATUS;
3666 p_ptr->dis_to_a += 10;
3667 p_ptr->align -= 200;
3669 case MIMIC_DEMON_LORD:
3670 p_ptr->hold_exp = TRUE;
3671 p_ptr->resist_chaos = TRUE;
3672 p_ptr->resist_neth = TRUE;
3673 p_ptr->immune_fire = TRUE;
3674 p_ptr->resist_acid = TRUE;
3675 p_ptr->resist_fire = TRUE;
3676 p_ptr->resist_cold = TRUE;
3677 p_ptr->resist_elec = TRUE;
3678 p_ptr->resist_pois = TRUE;
3679 p_ptr->resist_conf = TRUE;
3680 p_ptr->resist_disen = TRUE;
3681 p_ptr->resist_nexus = TRUE;
3682 p_ptr->resist_fear = TRUE;
3683 p_ptr->sh_fire = TRUE;
3684 p_ptr->see_inv = TRUE;
3685 p_ptr->telepathy = TRUE;
3686 p_ptr->levitation = TRUE;
3687 p_ptr->kill_wall = TRUE;
3690 p_ptr->dis_to_a += 20;
3691 p_ptr->align -= 200;
3694 p_ptr->resist_dark = TRUE;
3695 p_ptr->hold_exp = TRUE;
3696 p_ptr->resist_neth = TRUE;
3697 p_ptr->resist_cold = TRUE;
3698 p_ptr->resist_pois = TRUE;
3699 p_ptr->see_inv = TRUE;
3702 p_ptr->dis_to_a += 10;
3703 if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
3709 switch (p_ptr->prace)
3712 p_ptr->resist_lite = TRUE;
3715 p_ptr->hold_exp = TRUE;
3718 p_ptr->free_act = TRUE;
3721 p_ptr->resist_blind = TRUE;
3724 p_ptr->resist_dark = TRUE;
3726 case RACE_HALF_TROLL:
3727 p_ptr->sustain_str = TRUE;
3729 if (p_ptr->lev > 14)
3731 /* High level trolls heal fast... */
3732 p_ptr->regenerate = TRUE;
3734 if (p_ptr->pclass == CLASS_WARRIOR || p_ptr->pclass == CLASS_BERSERKER)
3736 p_ptr->slow_digest = TRUE;
3737 /* Let's not make Regeneration
3738 * a disadvantage for the poor warriors who can
3739 * never learn a spell that satisfies hunger (actually
3740 * neither can rogues, but half-trolls are not
3741 * supposed to play rogues) */
3746 p_ptr->sustain_con = TRUE;
3747 p_ptr->regenerate = TRUE; /* Amberites heal fast... */
3750 p_ptr->resist_lite = TRUE;
3751 p_ptr->see_inv = TRUE;
3753 case RACE_BARBARIAN:
3754 p_ptr->resist_fear = TRUE;
3756 case RACE_HALF_OGRE:
3757 p_ptr->resist_dark = TRUE;
3758 p_ptr->sustain_str = TRUE;
3760 case RACE_HALF_GIANT:
3761 p_ptr->sustain_str = TRUE;
3762 p_ptr->resist_shard = TRUE;
3764 case RACE_HALF_TITAN:
3765 p_ptr->resist_chaos = TRUE;
3768 p_ptr->resist_sound = TRUE;
3771 p_ptr->resist_acid = TRUE;
3772 if (p_ptr->lev > 19) p_ptr->immune_acid = TRUE;
3775 p_ptr->resist_conf = TRUE;
3776 p_ptr->resist_acid = TRUE;
3778 /* Klackons become faster */
3779 new_speed += (p_ptr->lev) / 10;
3782 p_ptr->resist_pois = TRUE;
3785 p_ptr->resist_disen = TRUE;
3786 p_ptr->resist_dark = TRUE;
3789 p_ptr->resist_dark = TRUE;
3790 if (p_ptr->lev > 19) p_ptr->see_inv = TRUE;
3792 case RACE_DRACONIAN:
3793 p_ptr->levitation = TRUE;
3794 if (p_ptr->lev > 4) p_ptr->resist_fire = TRUE;
3795 if (p_ptr->lev > 9) p_ptr->resist_cold = TRUE;
3796 if (p_ptr->lev > 14) p_ptr->resist_acid = TRUE;
3797 if (p_ptr->lev > 19) p_ptr->resist_elec = TRUE;
3798 if (p_ptr->lev > 34) p_ptr->resist_pois = TRUE;
3800 case RACE_MIND_FLAYER:
3801 p_ptr->sustain_int = TRUE;
3802 p_ptr->sustain_wis = TRUE;
3803 if (p_ptr->lev > 14) p_ptr->see_inv = TRUE;
3804 if (p_ptr->lev > 29) p_ptr->telepathy = TRUE;
3807 p_ptr->resist_fire = TRUE;
3808 if (p_ptr->lev > 9) p_ptr->see_inv = TRUE;
3811 p_ptr->slow_digest = TRUE;
3812 p_ptr->free_act = TRUE;
3813 p_ptr->see_inv = TRUE;
3814 p_ptr->resist_pois = TRUE;
3815 if (p_ptr->lev > 34) p_ptr->hold_exp = TRUE;
3818 p_ptr->resist_shard = TRUE;
3819 p_ptr->hold_exp = TRUE;
3820 p_ptr->see_inv = TRUE;
3821 p_ptr->resist_pois = TRUE;
3822 if (p_ptr->lev > 9) p_ptr->resist_cold = TRUE;
3825 p_ptr->resist_neth = TRUE;
3826 p_ptr->hold_exp = TRUE;
3827 p_ptr->see_inv = TRUE;
3828 p_ptr->resist_pois = TRUE;
3829 p_ptr->slow_digest = TRUE;
3830 if (p_ptr->lev > 4) p_ptr->resist_cold = TRUE;
3833 p_ptr->resist_dark = TRUE;
3834 p_ptr->hold_exp = TRUE;
3835 p_ptr->resist_neth = TRUE;
3836 p_ptr->resist_cold = TRUE;
3837 p_ptr->resist_pois = TRUE;
3838 if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
3841 p_ptr->levitation = TRUE;
3842 p_ptr->free_act = TRUE;
3843 p_ptr->resist_neth = TRUE;
3844 p_ptr->hold_exp = TRUE;
3845 p_ptr->see_inv = TRUE;
3846 p_ptr->resist_pois = TRUE;
3847 p_ptr->slow_digest = TRUE;
3848 p_ptr->resist_cold = TRUE;
3849 p_ptr->pass_wall = TRUE;
3850 if (p_ptr->lev > 34) p_ptr->telepathy = TRUE;
3853 p_ptr->levitation = TRUE;
3854 p_ptr->resist_lite = TRUE;
3856 /* Sprites become faster */
3857 new_speed += (p_ptr->lev) / 10;
3860 p_ptr->resist_conf = TRUE;
3861 p_ptr->resist_sound = TRUE;
3864 /* Ents dig like maniacs, but only with their hands. */
3865 if (!inventory[INVEN_RARM].k_idx)
3866 p_ptr->skill_dig += p_ptr->lev * 10;
3867 /* Ents get tougher and stronger as they age, but lose dexterity. */
3868 if (p_ptr->lev > 25) p_ptr->stat_add[A_STR]++;
3869 if (p_ptr->lev > 40) p_ptr->stat_add[A_STR]++;
3870 if (p_ptr->lev > 45) p_ptr->stat_add[A_STR]++;
3872 if (p_ptr->lev > 25) p_ptr->stat_add[A_DEX]--;
3873 if (p_ptr->lev > 40) p_ptr->stat_add[A_DEX]--;
3874 if (p_ptr->lev > 45) p_ptr->stat_add[A_DEX]--;
3876 if (p_ptr->lev > 25) p_ptr->stat_add[A_CON]++;
3877 if (p_ptr->lev > 40) p_ptr->stat_add[A_CON]++;
3878 if (p_ptr->lev > 45) p_ptr->stat_add[A_CON]++;
3881 p_ptr->levitation = TRUE;
3882 p_ptr->see_inv = TRUE;
3883 p_ptr->align += 200;
3886 p_ptr->resist_fire = TRUE;
3887 p_ptr->resist_neth = TRUE;
3888 p_ptr->hold_exp = TRUE;
3889 if (p_ptr->lev > 9) p_ptr->see_inv = TRUE;
3890 if (p_ptr->lev > 44)
3892 p_ptr->oppose_fire = 1;
3893 p_ptr->redraw |= PR_STATUS;
3895 p_ptr->align -= 200;
3898 p_ptr->sustain_con = TRUE;
3901 p_ptr->levitation = TRUE;
3904 p_ptr->resist_conf = TRUE;
3907 p_ptr->slow_digest = TRUE;
3908 p_ptr->free_act = TRUE;
3909 p_ptr->resist_pois = TRUE;
3910 p_ptr->hold_exp = TRUE;
3918 if (p_ptr->ult_res || (p_ptr->special_defense & KATA_MUSOU))
3920 p_ptr->see_inv = TRUE;
3921 p_ptr->free_act = TRUE;
3922 p_ptr->slow_digest = TRUE;
3923 p_ptr->regenerate = TRUE;
3924 p_ptr->levitation = TRUE;
3925 p_ptr->hold_exp = TRUE;
3926 p_ptr->telepathy = TRUE;
3928 p_ptr->sustain_str = TRUE;
3929 p_ptr->sustain_int = TRUE;
3930 p_ptr->sustain_wis = TRUE;
3931 p_ptr->sustain_con = TRUE;
3932 p_ptr->sustain_dex = TRUE;
3933 p_ptr->sustain_chr = TRUE;
3934 p_ptr->resist_acid = TRUE;
3935 p_ptr->resist_elec = TRUE;
3936 p_ptr->resist_fire = TRUE;
3937 p_ptr->resist_cold = TRUE;
3938 p_ptr->resist_pois = TRUE;
3939 p_ptr->resist_conf = TRUE;
3940 p_ptr->resist_sound = TRUE;
3941 p_ptr->resist_lite = TRUE;
3942 p_ptr->resist_dark = TRUE;
3943 p_ptr->resist_chaos = TRUE;
3944 p_ptr->resist_disen = TRUE;
3945 p_ptr->resist_shard = TRUE;
3946 p_ptr->resist_nexus = TRUE;
3947 p_ptr->resist_blind = TRUE;
3948 p_ptr->resist_neth = TRUE;
3949 p_ptr->resist_fear = TRUE;
3950 p_ptr->reflect = TRUE;
3951 p_ptr->sh_fire = TRUE;
3952 p_ptr->sh_elec = TRUE;
3953 p_ptr->sh_cold = TRUE;
3955 p_ptr->dis_to_a += 100;
3957 /* Temporary shield */
3958 else if (p_ptr->tsubureru || p_ptr->shield || p_ptr->magicdef)
3961 p_ptr->dis_to_a += 50;
3964 if (p_ptr->tim_res_nether)
3966 p_ptr->resist_neth = TRUE;
3968 if (p_ptr->tim_sh_fire)
3970 p_ptr->sh_fire = TRUE;
3972 if (p_ptr->tim_res_time)
3974 p_ptr->resist_time = TRUE;
3978 if (p_ptr->pseikaku == SEIKAKU_SEXY) p_ptr->cursed |= (TRC_AGGRAVATE);
3979 if (p_ptr->pseikaku == SEIKAKU_NAMAKE) p_ptr->to_m_chance += 10;
3980 if (p_ptr->pseikaku == SEIKAKU_KIREMONO) p_ptr->to_m_chance -= 3;
3981 if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) p_ptr->to_m_chance++;
3984 if (p_ptr->pseikaku == SEIKAKU_LUCKY) p_ptr->muta3 |= MUT3_GOOD_LUCK;
3986 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN)
3988 p_ptr->resist_blind = TRUE;
3989 p_ptr->resist_conf = TRUE;
3990 p_ptr->hold_exp = TRUE;
3991 if (p_ptr->pclass != CLASS_NINJA) p_ptr->lite = TRUE;
3993 if ((p_ptr->prace != RACE_KLACKON) && (p_ptr->prace != RACE_SPRITE))
3994 /* Munchkin become faster */
3995 new_speed += (p_ptr->lev) / 10 + 5;
3998 if (music_singing(MUSIC_WALL))
4000 p_ptr->kill_wall = TRUE;
4003 /* Hack -- apply racial/class stat maxes */
4004 /* Apply the racial modifiers */
4005 for (i = 0; i < 6; i++)
4007 /* Modify the stats for "race" */
4008 p_ptr->stat_add[i] += (tmp_rp_ptr->r_adj[i] + cp_ptr->c_adj[i] + ap_ptr->a_adj[i]);
4012 /* I'm adding the mutations here for the lack of a better place... */
4015 /* Hyper Strength */
4016 if (p_ptr->muta3 & MUT3_HYPER_STR)
4018 p_ptr->stat_add[A_STR] += 4;
4022 if (p_ptr->muta3 & MUT3_PUNY)
4024 p_ptr->stat_add[A_STR] -= 4;
4027 /* Living computer */
4028 if (p_ptr->muta3 & MUT3_HYPER_INT)
4030 p_ptr->stat_add[A_INT] += 4;
4031 p_ptr->stat_add[A_WIS] += 4;
4035 if (p_ptr->muta3 & MUT3_MORONIC)
4037 p_ptr->stat_add[A_INT] -= 4;
4038 p_ptr->stat_add[A_WIS] -= 4;
4041 if (p_ptr->muta3 & MUT3_RESILIENT)
4043 p_ptr->stat_add[A_CON] += 4;
4046 if (p_ptr->muta3 & MUT3_XTRA_FAT)
4048 p_ptr->stat_add[A_CON] += 2;
4052 if (p_ptr->muta3 & MUT3_ALBINO)
4054 p_ptr->stat_add[A_CON] -= 4;
4057 if (p_ptr->muta3 & MUT3_FLESH_ROT)
4059 p_ptr->stat_add[A_CON] -= 2;
4060 p_ptr->stat_add[A_CHR] -= 1;
4061 p_ptr->regenerate = FALSE;
4062 /* Cancel innate regeneration */
4065 if (p_ptr->muta3 & MUT3_SILLY_VOI)
4067 p_ptr->stat_add[A_CHR] -= 4;
4070 if (p_ptr->muta3 & MUT3_BLANK_FAC)
4072 p_ptr->stat_add[A_CHR] -= 1;
4075 if (p_ptr->muta3 & MUT3_XTRA_EYES)
4077 p_ptr->skill_fos += 15;
4078 p_ptr->skill_srh += 15;
4081 if (p_ptr->muta3 & MUT3_MAGIC_RES)
4083 p_ptr->skill_sav += (15 + (p_ptr->lev / 5));
4086 if (p_ptr->muta3 & MUT3_XTRA_NOIS)
4088 p_ptr->skill_stl -= 3;
4091 if (p_ptr->muta3 & MUT3_INFRAVIS)
4093 p_ptr->see_infra += 3;
4096 if (p_ptr->muta3 & MUT3_XTRA_LEGS)
4101 if (p_ptr->muta3 & MUT3_SHORT_LEG)
4106 if (p_ptr->muta3 & MUT3_ELEC_TOUC)
4108 p_ptr->sh_elec = TRUE;
4111 if (p_ptr->muta3 & MUT3_FIRE_BODY)
4113 p_ptr->sh_fire = TRUE;
4117 if (p_ptr->muta3 & MUT3_WART_SKIN)
4119 p_ptr->stat_add[A_CHR] -= 2;
4121 p_ptr->dis_to_a += 5;
4124 if (p_ptr->muta3 & MUT3_SCALES)
4126 p_ptr->stat_add[A_CHR] -= 1;
4128 p_ptr->dis_to_a += 10;
4131 if (p_ptr->muta3 & MUT3_IRON_SKIN)
4133 p_ptr->stat_add[A_DEX] -= 1;
4135 p_ptr->dis_to_a += 25;
4138 if (p_ptr->muta3 & MUT3_WINGS)
4140 p_ptr->levitation = TRUE;
4143 if (p_ptr->muta3 & MUT3_FEARLESS)
4145 p_ptr->resist_fear = TRUE;
4148 if (p_ptr->muta3 & MUT3_REGEN)
4150 p_ptr->regenerate = TRUE;
4153 if (p_ptr->muta3 & MUT3_ESP)
4155 p_ptr->telepathy = TRUE;
4158 if (p_ptr->muta3 & MUT3_LIMBER)
4160 p_ptr->stat_add[A_DEX] += 3;
4163 if (p_ptr->muta3 & MUT3_ARTHRITIS)
4165 p_ptr->stat_add[A_DEX] -= 3;
4168 if (p_ptr->muta3 & MUT3_MOTION)
4170 p_ptr->free_act = TRUE;
4171 p_ptr->skill_stl += 1;
4174 if (p_ptr->muta3 & MUT3_ILL_NORM)
4176 p_ptr->stat_add[A_CHR] = 0;
4180 if (p_ptr->tsuyoshi)
4182 p_ptr->stat_add[A_STR] += 4;
4183 p_ptr->stat_add[A_CON] += 4;
4186 /* Scan the usable inventory */
4187 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4189 int bonus_to_h, bonus_to_d;
4190 o_ptr = &inventory[i];
4192 /* Skip non-objects */
4193 if (!o_ptr->k_idx) continue;
4195 /* Extract the item flags */
4196 object_flags(o_ptr, flgs);
4198 p_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
4199 if (o_ptr->name1 == ART_CHAINSWORD) p_ptr->cursed |= TRC_CHAINSWORD;
4202 if (have_flag(flgs, TR_STR)) p_ptr->stat_add[A_STR] += o_ptr->pval;
4203 if (have_flag(flgs, TR_INT)) p_ptr->stat_add[A_INT] += o_ptr->pval;
4204 if (have_flag(flgs, TR_WIS)) p_ptr->stat_add[A_WIS] += o_ptr->pval;
4205 if (have_flag(flgs, TR_DEX)) p_ptr->stat_add[A_DEX] += o_ptr->pval;
4206 if (have_flag(flgs, TR_CON)) p_ptr->stat_add[A_CON] += o_ptr->pval;
4207 if (have_flag(flgs, TR_CHR)) p_ptr->stat_add[A_CHR] += o_ptr->pval;
4209 if (have_flag(flgs, TR_MAGIC_MASTERY)) p_ptr->skill_dev += 8*o_ptr->pval;
4211 /* Affect stealth */
4212 if (have_flag(flgs, TR_STEALTH)) p_ptr->skill_stl += o_ptr->pval;
4214 /* Affect searching ability (factor of five) */
4215 if (have_flag(flgs, TR_SEARCH)) p_ptr->skill_srh += (o_ptr->pval * 5);
4217 /* Affect searching frequency (factor of five) */
4218 if (have_flag(flgs, TR_SEARCH)) p_ptr->skill_fos += (o_ptr->pval * 5);
4220 /* Affect infravision */
4221 if (have_flag(flgs, TR_INFRA)) p_ptr->see_infra += o_ptr->pval;
4223 /* Affect digging (factor of 20) */
4224 if (have_flag(flgs, TR_TUNNEL)) p_ptr->skill_dig += (o_ptr->pval * 20);
4227 if (have_flag(flgs, TR_SPEED)) new_speed += o_ptr->pval;
4230 if (have_flag(flgs, TR_BLOWS))
4232 if((i == INVEN_RARM || i == INVEN_RIGHT) && !p_ptr->ryoute) extra_blows[0] += o_ptr->pval;
4233 else if((i == INVEN_LARM || i == INVEN_LEFT) && !p_ptr->ryoute) extra_blows[1] += o_ptr->pval;
4234 else {extra_blows[0] += o_ptr->pval; extra_blows[1] += o_ptr->pval;}
4237 /* Hack -- cause earthquakes */
4238 if (have_flag(flgs, TR_IMPACT)) p_ptr->impact[(i == INVEN_RARM) ? 0 : 1] = TRUE;
4241 if (have_flag(flgs, TR_AGGRAVATE)) p_ptr->cursed |= TRC_AGGRAVATE;
4242 if (have_flag(flgs, TR_DRAIN_EXP)) p_ptr->cursed |= TRC_DRAIN_EXP;
4243 if (have_flag(flgs, TR_TY_CURSE)) p_ptr->cursed |= TRC_TY_CURSE;
4244 if (have_flag(flgs, TR_ADD_L_CURSE)) p_ptr->cursed |= TRC_ADD_L_CURSE;
4245 if (have_flag(flgs, TR_ADD_H_CURSE)) p_ptr->cursed |= TRC_ADD_H_CURSE;
4246 if (have_flag(flgs, TR_DRAIN_HP)) p_ptr->cursed |= TRC_DRAIN_HP;
4247 if (have_flag(flgs, TR_DRAIN_MANA)) p_ptr->cursed |= TRC_DRAIN_MANA;
4248 if (have_flag(flgs, TR_CALL_ANIMAL)) p_ptr->cursed |= TRC_CALL_ANIMAL;
4249 if (have_flag(flgs, TR_CALL_DEMON)) p_ptr->cursed |= TRC_CALL_DEMON;
4250 if (have_flag(flgs, TR_CALL_DRAGON)) p_ptr->cursed |= TRC_CALL_DRAGON;
4251 if (have_flag(flgs, TR_CALL_UNDEAD)) p_ptr->cursed |= TRC_CALL_UNDEAD;
4252 if (have_flag(flgs, TR_COWARDICE)) p_ptr->cursed |= TRC_COWARDICE;
4253 if (have_flag(flgs, TR_LOW_MELEE)) p_ptr->cursed |= TRC_LOW_MELEE;
4254 if (have_flag(flgs, TR_LOW_AC)) p_ptr->cursed |= TRC_LOW_AC;
4255 if (have_flag(flgs, TR_LOW_MAGIC)) p_ptr->cursed |= TRC_LOW_MAGIC;
4256 if (have_flag(flgs, TR_FAST_DIGEST)) p_ptr->cursed |= TRC_FAST_DIGEST;
4257 if (have_flag(flgs, TR_SLOW_REGEN)) p_ptr->cursed |= TRC_SLOW_REGEN;
4258 if (have_flag(flgs, TR_DEC_MANA)) p_ptr->dec_mana = TRUE;
4259 if (have_flag(flgs, TR_BLESSED)) p_ptr->bless_blade = TRUE;
4260 if (have_flag(flgs, TR_XTRA_MIGHT)) p_ptr->xtra_might = TRUE;
4261 if (have_flag(flgs, TR_SLOW_DIGEST)) p_ptr->slow_digest = TRUE;
4262 if (have_flag(flgs, TR_REGEN)) p_ptr->regenerate = TRUE;
4263 if (have_flag(flgs, TR_TELEPATHY)) p_ptr->telepathy = TRUE;
4264 if (have_flag(flgs, TR_ESP_ANIMAL)) p_ptr->esp_animal = TRUE;
4265 if (have_flag(flgs, TR_ESP_UNDEAD)) p_ptr->esp_undead = TRUE;
4266 if (have_flag(flgs, TR_ESP_DEMON)) p_ptr->esp_demon = TRUE;
4267 if (have_flag(flgs, TR_ESP_ORC)) p_ptr->esp_orc = TRUE;
4268 if (have_flag(flgs, TR_ESP_TROLL)) p_ptr->esp_troll = TRUE;
4269 if (have_flag(flgs, TR_ESP_GIANT)) p_ptr->esp_giant = TRUE;
4270 if (have_flag(flgs, TR_ESP_DRAGON)) p_ptr->esp_dragon = TRUE;
4271 if (have_flag(flgs, TR_ESP_HUMAN)) p_ptr->esp_human = TRUE;
4272 if (have_flag(flgs, TR_ESP_EVIL)) p_ptr->esp_evil = TRUE;
4273 if (have_flag(flgs, TR_ESP_GOOD)) p_ptr->esp_good = TRUE;
4274 if (have_flag(flgs, TR_ESP_NONLIVING)) p_ptr->esp_nonliving = TRUE;
4275 if (have_flag(flgs, TR_ESP_UNIQUE)) p_ptr->esp_unique = TRUE;
4277 if (have_flag(flgs, TR_SEE_INVIS)) p_ptr->see_inv = TRUE;
4278 if (have_flag(flgs, TR_LEVITATION)) p_ptr->levitation = TRUE;
4279 if (have_flag(flgs, TR_FREE_ACT)) p_ptr->free_act = TRUE;
4280 if (have_flag(flgs, TR_HOLD_EXP)) p_ptr->hold_exp = TRUE;
4281 if (have_flag(flgs, TR_WARNING)){
4282 if (!o_ptr->inscription || !(my_strchr(quark_str(o_ptr->inscription),'$')))
4283 p_ptr->warning = TRUE;
4286 if (have_flag(flgs, TR_TELEPORT))
4288 if (object_is_cursed(o_ptr)) p_ptr->cursed |= TRC_TELEPORT;
4291 cptr insc = quark_str(o_ptr->inscription);
4293 if (o_ptr->inscription && my_strchr(insc, '.'))
4296 * {.} will stop random teleportation.
4301 /* Controlled random teleportation */
4302 p_ptr->cursed |= TRC_TELEPORT_SELF;
4307 /* Immunity flags */
4308 if (have_flag(flgs, TR_IM_FIRE)) p_ptr->immune_fire = TRUE;
4309 if (have_flag(flgs, TR_IM_ACID)) p_ptr->immune_acid = TRUE;
4310 if (have_flag(flgs, TR_IM_COLD)) p_ptr->immune_cold = TRUE;
4311 if (have_flag(flgs, TR_IM_ELEC)) p_ptr->immune_elec = TRUE;
4313 /* Resistance flags */
4314 if (have_flag(flgs, TR_RES_ACID)) p_ptr->resist_acid = TRUE;
4315 if (have_flag(flgs, TR_RES_ELEC)) p_ptr->resist_elec = TRUE;
4316 if (have_flag(flgs, TR_RES_FIRE)) p_ptr->resist_fire = TRUE;
4317 if (have_flag(flgs, TR_RES_COLD)) p_ptr->resist_cold = TRUE;
4318 if (have_flag(flgs, TR_RES_POIS)) p_ptr->resist_pois = TRUE;
4319 if (have_flag(flgs, TR_RES_FEAR)) p_ptr->resist_fear = TRUE;
4320 if (have_flag(flgs, TR_RES_CONF)) p_ptr->resist_conf = TRUE;
4321 if (have_flag(flgs, TR_RES_SOUND)) p_ptr->resist_sound = TRUE;
4322 if (have_flag(flgs, TR_RES_LITE)) p_ptr->resist_lite = TRUE;
4323 if (have_flag(flgs, TR_RES_DARK)) p_ptr->resist_dark = TRUE;
4324 if (have_flag(flgs, TR_RES_CHAOS)) p_ptr->resist_chaos = TRUE;
4325 if (have_flag(flgs, TR_RES_DISEN)) p_ptr->resist_disen = TRUE;
4326 if (have_flag(flgs, TR_RES_SHARDS)) p_ptr->resist_shard = TRUE;
4327 if (have_flag(flgs, TR_RES_NEXUS)) p_ptr->resist_nexus = TRUE;
4328 if (have_flag(flgs, TR_RES_BLIND)) p_ptr->resist_blind = TRUE;
4329 if (have_flag(flgs, TR_RES_NETHER)) p_ptr->resist_neth = TRUE;
4331 if (have_flag(flgs, TR_REFLECT)) p_ptr->reflect = TRUE;
4332 if (have_flag(flgs, TR_SH_FIRE)) p_ptr->sh_fire = TRUE;
4333 if (have_flag(flgs, TR_SH_ELEC)) p_ptr->sh_elec = TRUE;
4334 if (have_flag(flgs, TR_SH_COLD)) p_ptr->sh_cold = TRUE;
4335 if (have_flag(flgs, TR_NO_MAGIC)) p_ptr->anti_magic = TRUE;
4336 if (have_flag(flgs, TR_NO_TELE)) p_ptr->anti_tele = TRUE;
4339 if (have_flag(flgs, TR_SUST_STR)) p_ptr->sustain_str = TRUE;
4340 if (have_flag(flgs, TR_SUST_INT)) p_ptr->sustain_int = TRUE;
4341 if (have_flag(flgs, TR_SUST_WIS)) p_ptr->sustain_wis = TRUE;
4342 if (have_flag(flgs, TR_SUST_DEX)) p_ptr->sustain_dex = TRUE;
4343 if (have_flag(flgs, TR_SUST_CON)) p_ptr->sustain_con = TRUE;
4344 if (have_flag(flgs, TR_SUST_CHR)) p_ptr->sustain_chr = TRUE;
4346 if (o_ptr->name2 == EGO_YOIYAMI) yoiyami = TRUE;
4347 if (o_ptr->name2 == EGO_2WEAPON) easy_2weapon = TRUE;
4348 if (o_ptr->name2 == EGO_RING_RES_TIME) p_ptr->resist_time = TRUE;
4349 if (o_ptr->name2 == EGO_RING_THROW) p_ptr->mighty_throw = TRUE;
4350 if (have_flag(flgs, TR_EASY_SPELL)) p_ptr->easy_spell = TRUE;
4351 if (o_ptr->name2 == EGO_AMU_FOOL) p_ptr->heavy_spell = TRUE;
4352 if (o_ptr->name2 == EGO_AMU_NAIVETY) down_saving = TRUE;
4354 if (o_ptr->curse_flags & TRC_LOW_MAGIC)
4356 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4358 p_ptr->to_m_chance += 10;
4362 p_ptr->to_m_chance += 3;
4366 if (o_ptr->tval == TV_CAPTURE) continue;
4368 /* Modify the base armor class */
4369 p_ptr->ac += o_ptr->ac;
4371 /* The base armor class is always known */
4372 p_ptr->dis_ac += o_ptr->ac;
4374 /* Apply the bonuses to armor class */
4375 p_ptr->to_a += o_ptr->to_a;
4377 /* Apply the mental bonuses to armor class, if known */
4378 if (object_is_known(o_ptr)) p_ptr->dis_to_a += o_ptr->to_a;
4380 if (o_ptr->curse_flags & TRC_LOW_MELEE)
4382 int slot = i - INVEN_RARM;
4385 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4387 p_ptr->to_h[slot] -= 15;
4388 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 15;
4392 p_ptr->to_h[slot] -= 5;
4393 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 5;
4398 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4400 p_ptr->to_h_b -= 15;
4401 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 15;
4406 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 5;
4411 if (o_ptr->curse_flags & TRC_LOW_AC)
4413 if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
4416 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 30;
4421 if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 10;
4425 /* Hack -- do not apply "weapon" bonuses */
4426 if (i == INVEN_RARM && buki_motteruka(i)) continue;
4427 if (i == INVEN_LARM && buki_motteruka(i)) continue;
4429 /* Hack -- do not apply "bow" bonuses */
4430 if (i == INVEN_BOW) continue;
4432 bonus_to_h = o_ptr->to_h;
4433 bonus_to_d = o_ptr->to_d;
4435 if (p_ptr->pclass == CLASS_NINJA)
4437 if (o_ptr->to_h > 0) bonus_to_h = (o_ptr->to_h+1)/2;
4438 if (o_ptr->to_d > 0) bonus_to_d = (o_ptr->to_d+1)/2;
4441 /* To Bow and Natural attack */
4443 /* Apply the bonuses to hit/damage */
4444 p_ptr->to_h_b += bonus_to_h;
4445 p_ptr->to_h_m += bonus_to_h;
4446 p_ptr->to_d_m += bonus_to_d;
4448 /* Apply the mental bonuses tp hit/damage, if known */
4449 if (object_is_known(o_ptr)) p_ptr->dis_to_h_b += bonus_to_h;
4452 if ((i == INVEN_LEFT || i == INVEN_RIGHT) && !p_ptr->ryoute)
4454 /* Apply the bonuses to hit/damage */
4455 p_ptr->to_h[i-INVEN_RIGHT] += bonus_to_h;
4456 p_ptr->to_d[i-INVEN_RIGHT] += bonus_to_d;
4458 /* Apply the mental bonuses tp hit/damage, if known */
4459 if (object_is_known(o_ptr))
4461 p_ptr->dis_to_h[i-INVEN_RIGHT] += bonus_to_h;
4462 p_ptr->dis_to_d[i-INVEN_RIGHT] += bonus_to_d;
4465 else if (p_ptr->migite && p_ptr->hidarite)
4467 /* Apply the bonuses to hit/damage */
4468 p_ptr->to_h[0] += (bonus_to_h > 0) ? (bonus_to_h+1)/2 : bonus_to_h;
4469 p_ptr->to_h[1] += (bonus_to_h > 0) ? bonus_to_h/2 : bonus_to_h;
4470 p_ptr->to_d[0] += (bonus_to_d > 0) ? (bonus_to_d+1)/2 : bonus_to_d;
4471 p_ptr->to_d[1] += (bonus_to_d > 0) ? bonus_to_d/2 : bonus_to_d;
4473 /* Apply the mental bonuses tp hit/damage, if known */
4474 if (object_is_known(o_ptr))
4476 p_ptr->dis_to_h[0] += (bonus_to_h > 0) ? (bonus_to_h+1)/2 : bonus_to_h;
4477 p_ptr->dis_to_h[1] += (bonus_to_h > 0) ? bonus_to_h/2 : bonus_to_h;
4478 p_ptr->dis_to_d[0] += (bonus_to_d > 0) ? (bonus_to_d+1)/2 : bonus_to_d;
4479 p_ptr->dis_to_d[1] += (bonus_to_d > 0) ? bonus_to_d/2 : bonus_to_d;
4484 /* Apply the bonuses to hit/damage */
4485 p_ptr->to_h[default_hand] += bonus_to_h;
4486 p_ptr->to_d[default_hand] += bonus_to_d;
4488 /* Apply the mental bonuses to hit/damage, if known */
4489 if (object_is_known(o_ptr))
4491 p_ptr->dis_to_h[default_hand] += bonus_to_h;
4492 p_ptr->dis_to_d[default_hand] += bonus_to_d;
4497 if (old_mighty_throw != p_ptr->mighty_throw)
4499 /* Redraw average damege display of Shuriken */
4500 p_ptr->window |= PW_INVEN;
4503 if (p_ptr->cursed & TRC_TELEPORT) p_ptr->cursed &= ~(TRC_TELEPORT_SELF);
4505 /* Monks get extra ac for armour _not worn_ */
4506 if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER)) && !heavy_armor())
4508 if (!(inventory[INVEN_BODY].k_idx))
4510 p_ptr->to_a += (p_ptr->lev * 3) / 2;
4511 p_ptr->dis_to_a += (p_ptr->lev * 3) / 2;
4513 if (!(inventory[INVEN_OUTER].k_idx) && (p_ptr->lev > 15))
4515 p_ptr->to_a += ((p_ptr->lev - 13) / 3);
4516 p_ptr->dis_to_a += ((p_ptr->lev - 13) / 3);
4518 if (!(inventory[INVEN_LARM].k_idx) && (p_ptr->lev > 10))
4520 p_ptr->to_a += ((p_ptr->lev - 8) / 3);
4521 p_ptr->dis_to_a += ((p_ptr->lev - 8) / 3);
4523 if (!(inventory[INVEN_HEAD].k_idx) && (p_ptr->lev > 4))
4525 p_ptr->to_a += (p_ptr->lev - 2) / 3;
4526 p_ptr->dis_to_a += (p_ptr->lev -2) / 3;
4528 if (!(inventory[INVEN_HANDS].k_idx))
4530 p_ptr->to_a += (p_ptr->lev / 2);
4531 p_ptr->dis_to_a += (p_ptr->lev / 2);
4533 if (!(inventory[INVEN_FEET].k_idx))
4535 p_ptr->to_a += (p_ptr->lev / 3);
4536 p_ptr->dis_to_a += (p_ptr->lev / 3);
4538 if (p_ptr->special_defense & KAMAE_BYAKKO)
4540 p_ptr->stat_add[A_STR] += 2;
4541 p_ptr->stat_add[A_DEX] += 2;
4542 p_ptr->stat_add[A_CON] -= 3;
4544 else if (p_ptr->special_defense & KAMAE_SEIRYU)
4547 else if (p_ptr->special_defense & KAMAE_GENBU)
4549 p_ptr->stat_add[A_INT] -= 1;
4550 p_ptr->stat_add[A_WIS] -= 1;
4551 p_ptr->stat_add[A_DEX] -= 2;
4552 p_ptr->stat_add[A_CON] += 3;
4554 else if (p_ptr->special_defense & KAMAE_SUZAKU)
4556 p_ptr->stat_add[A_STR] -= 2;
4557 p_ptr->stat_add[A_INT] += 1;
4558 p_ptr->stat_add[A_WIS] += 1;
4559 p_ptr->stat_add[A_DEX] += 2;
4560 p_ptr->stat_add[A_CON] -= 2;
4564 if (p_ptr->special_defense & KATA_KOUKIJIN)
4566 for (i = 0; i < 6; i++)
4567 p_ptr->stat_add[i] += 5;
4569 p_ptr->dis_to_a -= 50;
4572 /* Hack -- aura of fire also provides light */
4573 if (p_ptr->sh_fire) p_ptr->lite = TRUE;
4575 /* Golems also get an intrinsic AC bonus */
4576 if (prace_is_(RACE_GOLEM) || prace_is_(RACE_ANDROID))
4578 p_ptr->to_a += 10 + (p_ptr->lev * 2 / 5);
4579 p_ptr->dis_to_a += 10 + (p_ptr->lev * 2 / 5);
4583 if (p_ptr->realm1 == REALM_HEX)
4585 if (hex_spelling_any()) p_ptr->skill_stl -= (1 + p_ptr->magic_num2[0]);
4586 if (hex_spelling(HEX_DETECT_EVIL)) p_ptr->esp_evil = TRUE;
4587 if (hex_spelling(HEX_XTRA_MIGHT)) p_ptr->stat_add[A_STR] += 4;
4588 if (hex_spelling(HEX_BUILDING))
4590 p_ptr->stat_add[A_STR] += 4;
4591 p_ptr->stat_add[A_DEX] += 4;
4592 p_ptr->stat_add[A_CON] += 4;
4594 if (hex_spelling(HEX_DEMON_AURA))
4596 p_ptr->sh_fire = TRUE;
4597 p_ptr->regenerate = TRUE;
4599 if (hex_spelling(HEX_ICE_ARMOR))
4601 p_ptr->sh_cold = TRUE;
4603 p_ptr->dis_to_a += 30;
4605 if (hex_spelling(HEX_SHOCK_CLOAK))
4607 p_ptr->sh_elec = TRUE;
4610 for (i = INVEN_RARM; i <= INVEN_FEET; i++)
4613 o_ptr = &inventory[i];
4614 if (!o_ptr->k_idx) continue;
4615 if (!object_is_armour(o_ptr)) continue;
4616 if (!object_is_cursed(o_ptr)) continue;
4618 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) ac += 7;
4619 if (o_ptr->curse_flags & TRC_PERMA_CURSE) ac += 13;
4621 p_ptr->dis_to_a += ac;
4625 /* Calculate stats */
4626 for (i = 0; i < 6; i++)
4630 /* Extract the new "stat_use" value for the stat */
4631 top = modify_stat_value(p_ptr->stat_max[i], p_ptr->stat_add[i]);
4633 /* Notice changes */
4634 if (p_ptr->stat_top[i] != top)
4636 /* Save the new value */
4637 p_ptr->stat_top[i] = top;
4639 /* Redisplay the stats later */
4640 p_ptr->redraw |= (PR_STATS);
4643 p_ptr->window |= (PW_PLAYER);
4647 /* Extract the new "stat_use" value for the stat */
4648 use = modify_stat_value(p_ptr->stat_cur[i], p_ptr->stat_add[i]);
4650 if ((i == A_CHR) && (p_ptr->muta3 & MUT3_ILL_NORM))
4652 /* 10 to 18/90 charisma, guaranteed, based on level */
4653 if (use < 8 + 2 * p_ptr->lev)
4655 use = 8 + 2 * p_ptr->lev;
4659 /* Notice changes */
4660 if (p_ptr->stat_use[i] != use)
4662 /* Save the new value */
4663 p_ptr->stat_use[i] = use;
4665 /* Redisplay the stats later */
4666 p_ptr->redraw |= (PR_STATS);
4669 p_ptr->window |= (PW_PLAYER);
4673 /* Values: 3, 4, ..., 17 */
4674 if (use <= 18) ind = (use - 3);
4676 /* Ranges: 18/00-18/09, ..., 18/210-18/219 */
4677 else if (use <= 18+219) ind = (15 + (use - 18) / 10);
4679 /* Range: 18/220+ */
4682 /* Notice changes */
4683 if (p_ptr->stat_ind[i] != ind)
4685 /* Save the new index */
4686 p_ptr->stat_ind[i] = ind;
4688 /* Change in CON affects Hitpoints */
4691 p_ptr->update |= (PU_HP);
4694 /* Change in INT may affect Mana/Spells */
4695 else if (i == A_INT)
4697 if (mp_ptr->spell_stat == A_INT)
4699 p_ptr->update |= (PU_MANA | PU_SPELLS);
4703 /* Change in WIS may affect Mana/Spells */
4704 else if (i == A_WIS)
4706 if (mp_ptr->spell_stat == A_WIS)
4708 p_ptr->update |= (PU_MANA | PU_SPELLS);
4712 /* Change in WIS may affect Mana/Spells */
4713 else if (i == A_CHR)
4715 if (mp_ptr->spell_stat == A_CHR)
4717 p_ptr->update |= (PU_MANA | PU_SPELLS);
4722 p_ptr->window |= (PW_PLAYER);
4727 /* Apply temporary "stun" */
4728 if (p_ptr->stun > 50)
4730 p_ptr->to_h[0] -= 20;
4731 p_ptr->to_h[1] -= 20;
4732 p_ptr->to_h_b -= 20;
4733 p_ptr->to_h_m -= 20;
4734 p_ptr->dis_to_h[0] -= 20;
4735 p_ptr->dis_to_h[1] -= 20;
4736 p_ptr->dis_to_h_b -= 20;
4737 p_ptr->to_d[0] -= 20;
4738 p_ptr->to_d[1] -= 20;
4739 p_ptr->to_d_m -= 20;
4740 p_ptr->dis_to_d[0] -= 20;
4741 p_ptr->dis_to_d[1] -= 20;
4743 else if (p_ptr->stun)
4745 p_ptr->to_h[0] -= 5;
4746 p_ptr->to_h[1] -= 5;
4749 p_ptr->dis_to_h[0] -= 5;
4750 p_ptr->dis_to_h[1] -= 5;
4751 p_ptr->dis_to_h_b -= 5;
4752 p_ptr->to_d[0] -= 5;
4753 p_ptr->to_d[1] -= 5;
4755 p_ptr->dis_to_d[0] -= 5;
4756 p_ptr->dis_to_d[1] -= 5;
4760 if (p_ptr->wraith_form)
4762 p_ptr->reflect = TRUE;
4763 p_ptr->pass_wall = TRUE;
4766 if (p_ptr->kabenuke)
4768 p_ptr->pass_wall = TRUE;
4771 /* Temporary blessing */
4775 p_ptr->dis_to_a += 5;
4776 p_ptr->to_h[0] += 10;
4777 p_ptr->to_h[1] += 10;
4778 p_ptr->to_h_b += 10;
4779 p_ptr->to_h_m += 10;
4780 p_ptr->dis_to_h[0] += 10;
4781 p_ptr->dis_to_h[1] += 10;
4782 p_ptr->dis_to_h_b += 10;
4785 if (p_ptr->magicdef)
4787 p_ptr->resist_blind = TRUE;
4788 p_ptr->resist_conf = TRUE;
4789 p_ptr->reflect = TRUE;
4790 p_ptr->free_act = TRUE;
4791 p_ptr->levitation = TRUE;
4794 /* Temporary "Hero" */
4797 p_ptr->to_h[0] += 12;
4798 p_ptr->to_h[1] += 12;
4799 p_ptr->to_h_b += 12;
4800 p_ptr->to_h_m += 12;
4801 p_ptr->dis_to_h[0] += 12;
4802 p_ptr->dis_to_h[1] += 12;
4803 p_ptr->dis_to_h_b += 12;
4806 /* Temporary "Beserk" */
4809 p_ptr->to_h[0] += 12;
4810 p_ptr->to_h[1] += 12;
4811 p_ptr->to_h_b -= 12;
4812 p_ptr->to_h_m += 12;
4813 p_ptr->to_d[0] += 3+(p_ptr->lev/5);
4814 p_ptr->to_d[1] += 3+(p_ptr->lev/5);
4815 p_ptr->to_d_m += 3+(p_ptr->lev/5);
4816 p_ptr->dis_to_h[0] += 12;
4817 p_ptr->dis_to_h[1] += 12;
4818 p_ptr->dis_to_h_b -= 12;
4819 p_ptr->dis_to_d[0] += 3+(p_ptr->lev/5);
4820 p_ptr->dis_to_d[1] += 3+(p_ptr->lev/5);
4822 p_ptr->dis_to_a -= 10;
4823 p_ptr->skill_stl -= 7;
4824 p_ptr->skill_dev -= 20;
4825 p_ptr->skill_sav -= 30;
4826 p_ptr->skill_srh -= 15;
4827 p_ptr->skill_fos -= 15;
4828 p_ptr->skill_tht -= 20;
4829 p_ptr->skill_dig += 30;
4832 /* Temporary "fast" */
4838 /* Temporary "slow" */
4844 /* Temporary "telepathy" */
4847 p_ptr->telepathy = TRUE;
4850 if (p_ptr->ele_immune)
4852 if (p_ptr->special_defense & DEFENSE_ACID)
4853 p_ptr->immune_acid = TRUE;
4854 else if (p_ptr->special_defense & DEFENSE_ELEC)
4855 p_ptr->immune_elec = TRUE;
4856 else if (p_ptr->special_defense & DEFENSE_FIRE)
4857 p_ptr->immune_fire = TRUE;
4858 else if (p_ptr->special_defense & DEFENSE_COLD)
4859 p_ptr->immune_cold = TRUE;
4862 /* Temporary see invisible */
4863 if (p_ptr->tim_invis)
4865 p_ptr->see_inv = TRUE;
4868 /* Temporary infravision boost */
4869 if (p_ptr->tim_infra)
4871 p_ptr->see_infra+=3;
4874 /* Temporary regeneration boost */
4875 if (p_ptr->tim_regen)
4877 p_ptr->regenerate = TRUE;
4880 /* Temporary levitation */
4881 if (p_ptr->tim_levitation)
4883 p_ptr->levitation = TRUE;
4886 /* Temporary reflection */
4887 if (p_ptr->tim_reflect)
4889 p_ptr->reflect = TRUE;
4892 /* Hack -- Hero/Shero -> Res fear */
4893 if (IS_HERO() || p_ptr->shero)
4895 p_ptr->resist_fear = TRUE;
4899 /* Hack -- Telepathy Change */
4900 if (p_ptr->telepathy != old_telepathy)
4902 p_ptr->update |= (PU_MONSTERS);
4905 if ((p_ptr->esp_animal != old_esp_animal) ||
4906 (p_ptr->esp_undead != old_esp_undead) ||
4907 (p_ptr->esp_demon != old_esp_demon) ||
4908 (p_ptr->esp_orc != old_esp_orc) ||
4909 (p_ptr->esp_troll != old_esp_troll) ||
4910 (p_ptr->esp_giant != old_esp_giant) ||
4911 (p_ptr->esp_dragon != old_esp_dragon) ||
4912 (p_ptr->esp_human != old_esp_human) ||
4913 (p_ptr->esp_evil != old_esp_evil) ||
4914 (p_ptr->esp_good != old_esp_good) ||
4915 (p_ptr->esp_nonliving != old_esp_nonliving) ||
4916 (p_ptr->esp_unique != old_esp_unique))
4918 p_ptr->update |= (PU_MONSTERS);
4921 /* Hack -- See Invis Change */
4922 if (p_ptr->see_inv != old_see_inv)
4924 p_ptr->update |= (PU_MONSTERS);
4927 /* Bloating slows the player down (a little) */
4928 if (p_ptr->food >= PY_FOOD_MAX) new_speed -= 10;
4930 if (p_ptr->special_defense & KAMAE_SUZAKU) new_speed += 10;
4932 if ((p_ptr->migite && (empty_hands_status & EMPTY_HAND_RARM)) ||
4933 (p_ptr->hidarite && (empty_hands_status & EMPTY_HAND_LARM)))
4935 p_ptr->to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
4936 p_ptr->dis_to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
4939 if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM))
4941 int penalty1, penalty2;
4942 penalty1 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - inventory[INVEN_RARM].weight) / 8);
4943 penalty2 = ((100 - p_ptr->skill_exp[GINOU_NITOURYU] / 160) - (130 - inventory[INVEN_LARM].weight) / 8);
4944 if ((inventory[INVEN_RARM].name1 == ART_QUICKTHORN) && (inventory[INVEN_LARM].name1 == ART_TINYTHORN))
4946 penalty1 = penalty1 / 2 - 5;
4947 penalty2 = penalty2 / 2 - 5;
4950 p_ptr->dis_to_a += 10;
4954 if (penalty1 > 0) penalty1 /= 2;
4955 if (penalty2 > 0) penalty2 /= 2;
4957 else if ((inventory[INVEN_LARM].tval == TV_SWORD) && ((inventory[INVEN_LARM].sval == SV_MAIN_GAUCHE) || (inventory[INVEN_LARM].sval == SV_WAKIZASHI)))
4959 penalty1 = MAX(0, penalty1 - 10);
4960 penalty2 = MAX(0, penalty2 - 10);
4962 if ((inventory[INVEN_RARM].name1 == ART_MUSASI_KATANA) && (inventory[INVEN_LARM].name1 == ART_MUSASI_WAKIZASI))
4964 penalty1 = MIN(0, penalty1);
4965 penalty2 = MIN(0, penalty2);
4967 p_ptr->dis_to_a += 10;
4971 if ((inventory[INVEN_RARM].name1 == ART_MUSASI_KATANA) && (penalty1 > 0))
4973 if ((inventory[INVEN_LARM].name1 == ART_MUSASI_WAKIZASI) && (penalty2 > 0))
4976 if (inventory[INVEN_RARM].tval == TV_POLEARM) penalty1 += 10;
4977 if (inventory[INVEN_LARM].tval == TV_POLEARM) penalty2 += 10;
4978 p_ptr->to_h[0] -= penalty1;
4979 p_ptr->to_h[1] -= penalty2;
4980 p_ptr->dis_to_h[0] -= penalty1;
4981 p_ptr->dis_to_h[1] -= penalty2;
4984 /* Extract the current weight (in tenth pounds) */
4985 j = p_ptr->total_weight;
4989 /* Extract the "weight limit" (in tenth pounds) */
4990 i = (int)weight_limit();
4994 monster_type *riding_m_ptr = &m_list[p_ptr->riding];
4995 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
4996 int speed = riding_m_ptr->mspeed;
4998 if (riding_m_ptr->mspeed > 110)
5000 new_speed = 110 + (s16b)((speed - 110) * (p_ptr->skill_exp[GINOU_RIDING] * 3 + p_ptr->lev * 160L - 10000L) / (22000L));
5001 if (new_speed < 110) new_speed = 110;
5007 new_speed += (p_ptr->skill_exp[GINOU_RIDING] + p_ptr->lev *160L)/3200;
5008 if (MON_FAST(riding_m_ptr)) new_speed += 10;
5009 if (MON_SLOW(riding_m_ptr)) new_speed -= 10;
5010 riding_levitation = (riding_r_ptr->flags7 & RF7_CAN_FLY) ? TRUE : FALSE;
5011 if (riding_r_ptr->flags7 & (RF7_CAN_SWIM | RF7_AQUATIC)) p_ptr->can_swim = TRUE;
5013 if (!(riding_r_ptr->flags2 & RF2_PASS_WALL)) p_ptr->pass_wall = FALSE;
5014 if (riding_r_ptr->flags2 & RF2_KILL_WALL) p_ptr->kill_wall = TRUE;
5016 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;
5018 /* Extract the "weight limit" */
5019 i = 1500 + riding_r_ptr->level * 25;
5022 /* XXX XXX XXX Apply "encumbrance" from weight */
5023 if (j > i) new_speed -= ((j - i) / (i / 5));
5025 /* Searching slows the player down */
5026 if (p_ptr->action == ACTION_SEARCH) new_speed -= 10;
5028 /* Actual Modifier Bonuses (Un-inflate stat bonuses) */
5029 p_ptr->to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
5030 p_ptr->to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
5031 p_ptr->to_d[1] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
5032 p_ptr->to_d_m += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
5033 p_ptr->to_h[0] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5034 p_ptr->to_h[1] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5035 p_ptr->to_h_b += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5036 p_ptr->to_h_m += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5037 p_ptr->to_h[0] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5038 p_ptr->to_h[1] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5039 p_ptr->to_h_b += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5040 p_ptr->to_h_m += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5042 /* Displayed Modifier Bonuses (Un-inflate stat bonuses) */
5043 p_ptr->dis_to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
5044 p_ptr->dis_to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
5045 p_ptr->dis_to_d[1] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);
5046 p_ptr->dis_to_h[0] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5047 p_ptr->dis_to_h[1] += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5048 p_ptr->dis_to_h_b += ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
5049 p_ptr->dis_to_h[0] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5050 p_ptr->dis_to_h[1] += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5051 p_ptr->dis_to_h_b += ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128);
5054 /* Obtain the "hold" value */
5055 hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
5058 /* Examine the "current bow" */
5059 o_ptr = &inventory[INVEN_BOW];
5061 /* It is hard to carholdry a heavy bow */
5062 p_ptr->heavy_shoot = is_heavy_shoot(o_ptr);
5063 if (p_ptr->heavy_shoot)
5065 /* Hard to wield a heavy bow */
5066 p_ptr->to_h_b += 2 * (hold - o_ptr->weight / 10);
5067 p_ptr->dis_to_h_b += 2 * (hold - o_ptr->weight / 10);
5070 /* Compute "extra shots" if needed */
5073 p_ptr->tval_ammo = bow_tval_ammo(o_ptr);
5075 /* Apply special flags */
5076 if (o_ptr->k_idx && !p_ptr->heavy_shoot)
5079 p_ptr->num_fire = calc_num_fire(o_ptr);
5081 /* Snipers love Cross bows */
5082 if ((p_ptr->pclass == CLASS_SNIPER) &&
5083 (p_ptr->tval_ammo == TV_BOLT))
5085 p_ptr->to_h_b += (10 + (p_ptr->lev / 5));
5086 p_ptr->dis_to_h_b += (10 + (p_ptr->lev / 5));
5094 for(i = 0 ; i < 2 ; i++)
5096 /* Examine the "main weapon" */
5097 o_ptr = &inventory[INVEN_RARM+i];
5099 object_flags(o_ptr, flgs);
5101 /* Assume not heavy */
5102 p_ptr->heavy_wield[i] = FALSE;
5103 p_ptr->icky_wield[i] = FALSE;
5104 p_ptr->riding_wield[i] = FALSE;
5106 if (!buki_motteruka(INVEN_RARM+i)) {p_ptr->num_blow[i]=1;continue;}
5107 /* It is hard to hold a heavy weapon */
5108 if (hold < o_ptr->weight / 10)
5110 /* Hard to wield a heavy weapon */
5111 p_ptr->to_h[i] += 2 * (hold - o_ptr->weight / 10);
5112 p_ptr->dis_to_h[i] += 2 * (hold - o_ptr->weight / 10);
5115 p_ptr->heavy_wield[i] = TRUE;
5117 else if (p_ptr->ryoute && (hold < o_ptr->weight/5)) omoi = TRUE;
5119 if ((i == 1) && (o_ptr->tval == TV_SWORD) && ((o_ptr->sval == SV_MAIN_GAUCHE) || (o_ptr->sval == SV_WAKIZASHI)))
5122 p_ptr->dis_to_a += 5;
5125 /* Normal weapons */
5126 if (o_ptr->k_idx && !p_ptr->heavy_wield[i])
5128 int str_index, dex_index;
5130 int num = 0, wgt = 0, mul = 0, div = 0;
5132 /* Analyze the class */
5133 switch (p_ptr->pclass)
5137 num = 6; wgt = 70; mul = 5; break;
5140 case CLASS_BERSERKER:
5141 num = 6; wgt = 70; mul = 7; break;
5145 case CLASS_HIGH_MAGE:
5146 case CLASS_BLUE_MAGE:
5147 num = 3; wgt = 100; mul = 2; break;
5149 /* Priest, Mindcrafter, Magic-Eater */
5151 case CLASS_MAGIC_EATER:
5152 case CLASS_MINDCRAFTER:
5153 num = 5; wgt = 100; mul = 3; break;
5157 num = 5; wgt = 40; mul = 3; break;
5161 num = 5; wgt = 70; mul = 4; break;
5166 num = 5; wgt = 70; mul = 4; break;
5170 num = 5; wgt = 150; mul = 5; break;
5173 case CLASS_WARRIOR_MAGE:
5174 case CLASS_RED_MAGE:
5175 num = 5; wgt = 70; mul = 3; break;
5178 case CLASS_CHAOS_WARRIOR:
5179 num = 5; wgt = 70; mul = 4; break;
5183 num = 5; wgt = 60; mul = 3; break;
5187 num = 4; wgt = 100; mul = 3; break;
5190 case CLASS_IMITATOR:
5191 num = 5; wgt = 70; mul = 4; break;
5194 case CLASS_BEASTMASTER:
5195 num = 5; wgt = 70; mul = 3; break;
5199 if ((p_ptr->riding) && (have_flag(flgs, TR_RIDING))) {num = 5; wgt = 70; mul = 4;}
5200 else {num = 5; wgt = 100; mul = 3;}
5204 case CLASS_SORCERER:
5205 num = 1; wgt = 1; mul = 1; break;
5207 /* Archer, Bard, Sniper */
5211 num = 4; wgt = 70; mul = 2; break;
5214 case CLASS_FORCETRAINER:
5215 num = 4; wgt = 60; mul = 2; break;
5218 case CLASS_MIRROR_MASTER:
5219 num = 3; wgt = 100; mul = 3; break;
5223 num = 4; wgt = 20; mul = 1; break;
5226 /* Hex - extra mights gives +1 bonus to max blows */
5227 if (hex_spelling(HEX_XTRA_MIGHT) || hex_spelling(HEX_BUILDING)) { num++; wgt /= 2; mul += 2; }
5229 /* Enforce a minimum "weight" (tenth pounds) */
5230 div = ((o_ptr->weight < wgt) ? wgt : o_ptr->weight);
5232 /* Access the strength vs weight */
5233 str_index = (adj_str_blow[p_ptr->stat_ind[A_STR]] * mul / div);
5235 if (p_ptr->ryoute && !omoi) str_index++;
5236 if (p_ptr->pclass == CLASS_NINJA) str_index = MAX(0, str_index-1);
5239 if (str_index > 11) str_index = 11;
5241 /* Index by dexterity */
5242 dex_index = (adj_dex_blow[p_ptr->stat_ind[A_DEX]]);
5245 if (dex_index > 11) dex_index = 11;
5247 /* Use the blows table */
5248 p_ptr->num_blow[i] = blows_table[str_index][dex_index];
5251 if (p_ptr->num_blow[i] > num) p_ptr->num_blow[i] = num;
5253 /* Add in the "bonus blows" */
5254 p_ptr->num_blow[i] += extra_blows[i];
5257 if (p_ptr->pclass == CLASS_WARRIOR) p_ptr->num_blow[i] += (p_ptr->lev / 40);
5258 else if (p_ptr->pclass == CLASS_BERSERKER)
5260 p_ptr->num_blow[i] += (p_ptr->lev / 23);
5262 else if ((p_ptr->pclass == CLASS_ROGUE) && (o_ptr->weight < 50) && (p_ptr->stat_ind[A_DEX] >= 30)) p_ptr->num_blow[i] ++;
5264 if (p_ptr->special_defense & KATA_FUUJIN) p_ptr->num_blow[i] -= 1;
5266 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DOKUBARI)) p_ptr->num_blow[i] = 1;
5269 /* Require at least one blow */
5270 if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1;
5272 /* Boost digging skill by weapon weight */
5273 p_ptr->skill_dig += (o_ptr->weight / 10);
5277 /* Priest weapon penalty for non-blessed edged weapons */
5278 if ((p_ptr->pclass == CLASS_PRIEST) && (!(have_flag(flgs, TR_BLESSED))) &&
5279 ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM)))
5281 /* Reduce the real bonuses */
5282 p_ptr->to_h[i] -= 2;
5283 p_ptr->to_d[i] -= 2;
5285 /* Reduce the mental bonuses */
5286 p_ptr->dis_to_h[i] -= 2;
5287 p_ptr->dis_to_d[i] -= 2;
5290 p_ptr->icky_wield[i] = TRUE;
5292 else if (p_ptr->pclass == CLASS_BERSERKER)
5294 p_ptr->to_h[i] += p_ptr->lev/5;
5295 p_ptr->to_d[i] += p_ptr->lev/6;
5296 p_ptr->dis_to_h[i] += p_ptr->lev/5;
5297 p_ptr->dis_to_d[i] += p_ptr->lev/6;
5298 if (((i == 0) && !p_ptr->hidarite) || p_ptr->ryoute)
5300 p_ptr->to_h[i] += p_ptr->lev/5;
5301 p_ptr->to_d[i] += p_ptr->lev/6;
5302 p_ptr->dis_to_h[i] += p_ptr->lev/5;
5303 p_ptr->dis_to_d[i] += p_ptr->lev/6;
5306 else if (p_ptr->pclass == CLASS_SORCERER)
5308 if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER))))
5310 /* Reduce the real bonuses */
5311 p_ptr->to_h[i] -= 200;
5312 p_ptr->to_d[i] -= 200;
5314 /* Reduce the mental bonuses */
5315 p_ptr->dis_to_h[i] -= 200;
5316 p_ptr->dis_to_d[i] -= 200;
5319 p_ptr->icky_wield[i] = TRUE;
5323 /* Reduce the real bonuses */
5324 p_ptr->to_h[i] -= 30;
5325 p_ptr->to_d[i] -= 10;
5327 /* Reduce the mental bonuses */
5328 p_ptr->dis_to_h[i] -= 30;
5329 p_ptr->dis_to_d[i] -= 10;
5333 if (p_ptr->realm1 == REALM_HEX)
5335 if (object_is_cursed(o_ptr))
5337 if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; }
5338 if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_h[i] += 7; p_ptr->dis_to_h[i] += 7; }
5339 if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_h[i] += 13; p_ptr->dis_to_h[i] += 13; }
5340 if (o_ptr->curse_flags & (TRC_TY_CURSE)) { p_ptr->to_h[i] += 5; p_ptr->dis_to_h[i] += 5; }
5341 if (hex_spelling(HEX_RUNESWORD))
5343 if (o_ptr->curse_flags & (TRC_CURSED)) { p_ptr->to_d[i] += 5; p_ptr->dis_to_d[i] += 5; }
5344 if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) { p_ptr->to_d[i] += 7; p_ptr->dis_to_d[i] += 7; }
5345 if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) { p_ptr->to_d[i] += 13; p_ptr->dis_to_d[i] += 13; }
5351 if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE)))
5353 p_ptr->to_h[i] +=15;
5354 p_ptr->dis_to_h[i] +=15;
5355 p_ptr->to_dd[i] += 2;
5357 else if (!(have_flag(flgs, TR_RIDING)))
5360 if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
5366 penalty = r_info[m_list[p_ptr->riding].r_idx].level - p_ptr->skill_exp[GINOU_RIDING] / 80;
5368 if (penalty < 30) penalty = 30;
5370 p_ptr->to_h[i] -= penalty;
5371 p_ptr->dis_to_h[i] -= penalty;
5374 p_ptr->riding_wield[i] = TRUE;
5383 p_ptr->riding_ryoute = FALSE;
5385 if (p_ptr->ryoute || (empty_hands(FALSE) == EMPTY_HAND_NONE)) p_ptr->riding_ryoute = TRUE;
5386 else if (p_ptr->pet_extra_flags & PF_RYOUTE)
5388 switch (p_ptr->pclass)
5391 case CLASS_FORCETRAINER:
5392 case CLASS_BERSERKER:
5393 if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
5394 p_ptr->riding_ryoute = TRUE;
5399 if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
5401 if (p_ptr->tval_ammo != TV_ARROW) penalty = 5;
5405 penalty = r_info[m_list[p_ptr->riding].r_idx].level - p_ptr->skill_exp[GINOU_RIDING] / 80;
5407 if (penalty < 30) penalty = 30;
5409 if (p_ptr->tval_ammo == TV_BOLT) penalty *= 2;
5410 p_ptr->to_h_b -= penalty;
5411 p_ptr->dis_to_h_b -= penalty;
5414 /* Different calculation for monks with empty hands */
5415 if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) &&
5416 (empty_hands_status & EMPTY_HAND_RARM) && !p_ptr->hidarite)
5418 int blow_base = p_ptr->lev + adj_dex_blow[p_ptr->stat_ind[A_DEX]];
5419 p_ptr->num_blow[0] = 0;
5421 if (p_ptr->pclass == CLASS_FORCETRAINER)
5423 if (blow_base > 18) p_ptr->num_blow[0]++;
5424 if (blow_base > 31) p_ptr->num_blow[0]++;
5425 if (blow_base > 44) p_ptr->num_blow[0]++;
5426 if (blow_base > 58) p_ptr->num_blow[0]++;
5427 if (p_ptr->magic_num1[0])
5429 p_ptr->to_d[0] += (p_ptr->magic_num1[0]/5);
5430 p_ptr->dis_to_d[0] += (p_ptr->magic_num1[0]/5);
5435 if (blow_base > 12) p_ptr->num_blow[0]++;
5436 if (blow_base > 22) p_ptr->num_blow[0]++;
5437 if (blow_base > 31) p_ptr->num_blow[0]++;
5438 if (blow_base > 39) p_ptr->num_blow[0]++;
5439 if (blow_base > 46) p_ptr->num_blow[0]++;
5440 if (blow_base > 53) p_ptr->num_blow[0]++;
5441 if (blow_base > 59) p_ptr->num_blow[0]++;
5444 if (heavy_armor() && (p_ptr->pclass != CLASS_BERSERKER))
5445 p_ptr->num_blow[0] /= 2;
5448 p_ptr->to_h[0] += (p_ptr->lev / 3);
5449 p_ptr->dis_to_h[0] += (p_ptr->lev / 3);
5451 p_ptr->to_d[0] += (p_ptr->lev / 6);
5452 p_ptr->dis_to_d[0] += (p_ptr->lev / 6);
5455 if (p_ptr->special_defense & KAMAE_BYAKKO)
5458 p_ptr->dis_to_a -= 40;
5461 else if (p_ptr->special_defense & KAMAE_SEIRYU)
5464 p_ptr->dis_to_a -= 50;
5465 p_ptr->resist_acid = TRUE;
5466 p_ptr->resist_fire = TRUE;
5467 p_ptr->resist_elec = TRUE;
5468 p_ptr->resist_cold = TRUE;
5469 p_ptr->resist_pois = TRUE;
5470 p_ptr->sh_fire = TRUE;
5471 p_ptr->sh_elec = TRUE;
5472 p_ptr->sh_cold = TRUE;
5473 p_ptr->levitation = TRUE;
5475 else if (p_ptr->special_defense & KAMAE_GENBU)
5477 p_ptr->to_a += (p_ptr->lev*p_ptr->lev)/50;
5478 p_ptr->dis_to_a += (p_ptr->lev*p_ptr->lev)/50;
5479 p_ptr->reflect = TRUE;
5480 p_ptr->num_blow[0] -= 2;
5481 if ((p_ptr->pclass == CLASS_MONK) && (p_ptr->lev > 42)) p_ptr->num_blow[0]--;
5482 if (p_ptr->num_blow[0] < 0) p_ptr->num_blow[0] = 0;
5484 else if (p_ptr->special_defense & KAMAE_SUZAKU)
5486 p_ptr->to_h[0] -= (p_ptr->lev / 3);
5487 p_ptr->to_d[0] -= (p_ptr->lev / 6);
5489 p_ptr->dis_to_h[0] -= (p_ptr->lev / 3);
5490 p_ptr->dis_to_d[0] -= (p_ptr->lev / 6);
5491 p_ptr->num_blow[0] /= 2;
5492 p_ptr->levitation = TRUE;
5495 p_ptr->num_blow[0] += 1+extra_blows[0];
5498 if (p_ptr->riding) p_ptr->levitation = riding_levitation;
5500 monk_armour_aux = FALSE;
5504 monk_armour_aux = TRUE;
5507 for (i = 0; i < 2; i++)
5509 if (buki_motteruka(INVEN_RARM+i))
5511 int tval = inventory[INVEN_RARM+i].tval - TV_WEAPON_BEGIN;
5512 int sval = inventory[INVEN_RARM+i].sval;
5514 p_ptr->to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
5515 p_ptr->dis_to_h[i] += (p_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
5516 if ((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER))
5518 if (!s_info[p_ptr->pclass].w_max[tval][sval])
5520 p_ptr->to_h[i] -= 40;
5521 p_ptr->dis_to_h[i] -= 40;
5522 p_ptr->icky_wield[i] = TRUE;
5525 else if (p_ptr->pclass == CLASS_NINJA)
5527 if ((s_info[CLASS_NINJA].w_max[tval][sval] <= WEAPON_EXP_BEGINNER) || (inventory[INVEN_LARM-i].tval == TV_SHIELD))
5529 p_ptr->to_h[i] -= 40;
5530 p_ptr->dis_to_h[i] -= 40;
5531 p_ptr->icky_wield[i] = TRUE;
5532 p_ptr->num_blow[i] /= 2;
5533 if (p_ptr->num_blow[i] < 1) p_ptr->num_blow[i] = 1;
5537 if (inventory[INVEN_RARM + i].name1 == ART_IRON_BALL) p_ptr->align -= 1000;
5541 /* Maximum speed is (+99). (internally it's 110 + 99) */
5542 /* Temporary lightspeed forces to be maximum speed */
5543 if ((p_ptr->lightspeed && !p_ptr->riding) || (new_speed > 209))
5548 /* Minimum speed is (-99). (internally it's 110 - 99) */
5549 if (new_speed < 11) new_speed = 11;
5551 /* Display the speed (if needed) */
5552 if (p_ptr->pspeed != (byte)new_speed)
5554 p_ptr->pspeed = (byte)new_speed;
5555 p_ptr->redraw |= (PR_SPEED);
5560 if (p_ptr->to_a > (0 - p_ptr->ac))
5561 p_ptr->to_a = 0 - p_ptr->ac;
5562 if (p_ptr->dis_to_a > (0 - p_ptr->dis_ac))
5563 p_ptr->dis_to_a = 0 - p_ptr->dis_ac;
5566 /* Redraw armor (if needed) */
5567 if ((p_ptr->dis_ac != old_dis_ac) || (p_ptr->dis_to_a != old_dis_to_a))
5570 p_ptr->redraw |= (PR_ARMOR);
5573 p_ptr->window |= (PW_PLAYER);
5577 if (p_ptr->ryoute && !omoi)
5579 int bonus_to_h=0, bonus_to_d=0;
5580 bonus_to_d = ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128)/2;
5581 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);
5583 p_ptr->to_h[default_hand] += MAX(bonus_to_h,1);
5584 p_ptr->dis_to_h[default_hand] += MAX(bonus_to_h,1);
5585 p_ptr->to_d[default_hand] += MAX(bonus_to_d,1);
5586 p_ptr->dis_to_d[default_hand] += MAX(bonus_to_d,1);
5589 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;
5591 /* Affect Skill -- stealth (bonus one) */
5592 p_ptr->skill_stl += 1;
5594 if (IS_TIM_STEALTH()) p_ptr->skill_stl += 99;
5596 /* Affect Skill -- disarming (DEX and INT) */
5597 p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]];
5598 p_ptr->skill_dis += adj_int_dis[p_ptr->stat_ind[A_INT]];
5600 /* Affect Skill -- magic devices (INT) */
5601 p_ptr->skill_dev += adj_int_dev[p_ptr->stat_ind[A_INT]];
5603 /* Affect Skill -- saving throw (WIS) */
5604 p_ptr->skill_sav += adj_wis_sav[p_ptr->stat_ind[A_WIS]];
5606 /* Affect Skill -- digging (STR) */
5607 p_ptr->skill_dig += adj_str_dig[p_ptr->stat_ind[A_STR]];
5609 /* Affect Skill -- disarming (Level, by Class) */
5610 p_ptr->skill_dis += ((cp_ptr->x_dis * p_ptr->lev / 10) + (ap_ptr->a_dis * p_ptr->lev / 50));
5612 /* Affect Skill -- magic devices (Level, by Class) */
5613 p_ptr->skill_dev += ((cp_ptr->x_dev * p_ptr->lev / 10) + (ap_ptr->a_dev * p_ptr->lev / 50));
5615 /* Affect Skill -- saving throw (Level, by Class) */
5616 p_ptr->skill_sav += ((cp_ptr->x_sav * p_ptr->lev / 10) + (ap_ptr->a_sav * p_ptr->lev / 50));
5618 /* Affect Skill -- stealth (Level, by Class) */
5619 p_ptr->skill_stl += (cp_ptr->x_stl * p_ptr->lev / 10);
5621 /* Affect Skill -- search ability (Level, by Class) */
5622 p_ptr->skill_srh += (cp_ptr->x_srh * p_ptr->lev / 10);
5624 /* Affect Skill -- search frequency (Level, by Class) */
5625 p_ptr->skill_fos += (cp_ptr->x_fos * p_ptr->lev / 10);
5627 /* Affect Skill -- combat (normal) (Level, by Class) */
5628 p_ptr->skill_thn += ((cp_ptr->x_thn * p_ptr->lev / 10) + (ap_ptr->a_thn * p_ptr->lev / 50));
5630 /* Affect Skill -- combat (shooting) (Level, by Class) */
5631 p_ptr->skill_thb += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
5633 /* Affect Skill -- combat (throwing) (Level, by Class) */
5634 p_ptr->skill_tht += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
5637 if ((prace_is_(RACE_S_FAIRY)) && (p_ptr->pseikaku != SEIKAKU_SEXY) && (p_ptr->cursed & TRC_AGGRAVATE))
5639 p_ptr->cursed &= ~(TRC_AGGRAVATE);
5640 p_ptr->skill_stl = MIN(p_ptr->skill_stl - 3, (p_ptr->skill_stl + 2) / 2);
5643 /* Limit Skill -- stealth from 0 to 30 */
5644 if (p_ptr->skill_stl > 30) p_ptr->skill_stl = 30;
5645 if (p_ptr->skill_stl < 0) p_ptr->skill_stl = 0;
5647 /* Limit Skill -- digging from 1 up */
5648 if (p_ptr->skill_dig < 1) p_ptr->skill_dig = 1;
5650 if (p_ptr->anti_magic && (p_ptr->skill_sav < (90 + p_ptr->lev))) p_ptr->skill_sav = 90 + p_ptr->lev;
5652 if (p_ptr->tsubureru) p_ptr->skill_sav = 10;
5654 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;
5656 if (down_saving) p_ptr->skill_sav /= 2;
5658 /* Hack -- Each elemental immunity includes resistance */
5659 if (p_ptr->immune_acid) p_ptr->resist_acid = TRUE;
5660 if (p_ptr->immune_elec) p_ptr->resist_elec = TRUE;
5661 if (p_ptr->immune_fire) p_ptr->resist_fire = TRUE;
5662 if (p_ptr->immune_cold) p_ptr->resist_cold = TRUE;
5664 /* Determine player alignment */
5665 for (i = 0, j = 0; i < 8; i++)
5667 switch (p_ptr->vir_types[i])
5670 p_ptr->align += p_ptr->virtues[i] * 2;
5680 p_ptr->align -= p_ptr->virtues[i];
5683 p_ptr->align += p_ptr->virtues[i];
5688 for (i = 0; i < j; i++)
5690 if (p_ptr->align > 0)
5692 p_ptr->align -= p_ptr->virtues[neutral[i]] / 2;
5693 if (p_ptr->align < 0) p_ptr->align = 0;
5695 else if (p_ptr->align < 0)
5697 p_ptr->align += p_ptr->virtues[neutral[i]] / 2;
5698 if (p_ptr->align > 0) p_ptr->align = 0;
5702 /* Hack -- handle "xtra" mode */
5703 if (character_xtra) return;
5705 /* Take note when "heavy bow" changes */
5706 if (p_ptr->old_heavy_shoot != p_ptr->heavy_shoot)
5709 if (p_ptr->heavy_shoot)
5712 msg_print("こんな重い弓を装備しているのは大変だ。");
5714 msg_print("You have trouble wielding such a heavy bow.");
5718 else if (inventory[INVEN_BOW].k_idx)
5721 msg_print("この弓なら装備していても辛くない。");
5723 msg_print("You have no trouble wielding your bow.");
5730 msg_print("重い弓を装備からはずして体が楽になった。");
5732 msg_print("You feel relieved to put down your heavy bow.");
5738 p_ptr->old_heavy_shoot = p_ptr->heavy_shoot;
5741 for (i = 0 ; i < 2 ; i++)
5743 /* Take note when "heavy weapon" changes */
5744 if (p_ptr->old_heavy_wield[i] != p_ptr->heavy_wield[i])
5747 if (p_ptr->heavy_wield[i])
5750 msg_print("こんな重い武器を装備しているのは大変だ。");
5752 msg_print("You have trouble wielding such a heavy weapon.");
5756 else if (buki_motteruka(INVEN_RARM+i))
5759 msg_print("これなら装備していても辛くない。");
5761 msg_print("You have no trouble wielding your weapon.");
5765 else if (p_ptr->heavy_wield[1-i])
5768 msg_print("まだ武器が重い。");
5770 msg_print("You have still trouble wielding a heavy weapon.");
5777 msg_print("重い武器を装備からはずして体が楽になった。");
5779 msg_print("You feel relieved to put down your heavy weapon.");
5785 p_ptr->old_heavy_wield[i] = p_ptr->heavy_wield[i];
5788 /* Take note when "heavy weapon" changes */
5789 if (p_ptr->old_riding_wield[i] != p_ptr->riding_wield[i])
5792 if (p_ptr->riding_wield[i])
5795 msg_print("この武器は乗馬中に使うにはむかないようだ。");
5797 msg_print("This weapon is not suitable for use while riding.");
5801 else if (!p_ptr->riding)
5804 msg_print("この武器は徒歩で使いやすい。");
5806 msg_print("This weapon was not suitable for use while riding.");
5810 else if (buki_motteruka(INVEN_RARM+i))
5813 msg_print("これなら乗馬中にぴったりだ。");
5815 msg_print("This weapon is suitable for use while riding.");
5820 p_ptr->old_riding_wield[i] = p_ptr->riding_wield[i];
5823 /* Take note when "illegal weapon" changes */
5824 if (p_ptr->old_icky_wield[i] != p_ptr->icky_wield[i])
5827 if (p_ptr->icky_wield[i])
5830 msg_print("今の装備はどうも自分にふさわしくない気がする。");
5832 msg_print("You do not feel comfortable with your weapon.");
5836 chg_virtue(V_FAITH, -1);
5839 else if (buki_motteruka(INVEN_RARM+i))
5842 msg_print("今の装備は自分にふさわしい気がする。");
5844 msg_print("You feel comfortable with your weapon.");
5851 msg_print("装備をはずしたら随分と気が楽になった。");
5853 msg_print("You feel more comfortable after removing your weapon.");
5859 p_ptr->old_icky_wield[i] = p_ptr->icky_wield[i];
5863 if (p_ptr->riding && (p_ptr->old_riding_ryoute != p_ptr->riding_ryoute))
5866 if (p_ptr->riding_ryoute)
5869 msg_format("%s馬を操れない。", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "両手がふさがっていて" : "");
5871 msg_print("You are using both hand for fighting, and you can't control a riding pet.");
5877 msg_format("%s馬を操れるようになった。", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "手が空いて" : "");
5879 msg_print("You began to control riding pet with one hand.");
5883 p_ptr->old_riding_ryoute = p_ptr->riding_ryoute;
5886 if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_NINJA)) && (monk_armour_aux != monk_notify_aux))
5891 msg_print("装備が重くてバランスを取れない。");
5893 msg_print("The weight of your armor disrupts your balance.");
5898 chg_virtue(V_HARMONY, -1);
5903 msg_print("バランスがとれるようになった。");
5905 msg_print("You regain your balance.");
5908 monk_notify_aux = monk_armour_aux;
5911 for (i = 0; i < INVEN_PACK; i++)
5914 if ((inventory[i].tval == TV_SORCERY_BOOK) && (inventory[i].sval == 2)) have_dd_s = TRUE;
5915 if ((inventory[i].tval == TV_TRUMP_BOOK) && (inventory[i].sval == 1)) have_dd_t = TRUE;
5917 if ((inventory[i].tval == TV_NATURE_BOOK) && (inventory[i].sval == 2)) have_sw = TRUE;
5918 if ((inventory[i].tval == TV_CRAFT_BOOK) && (inventory[i].sval == 2)) have_kabe = TRUE;
5920 for (this_o_idx = cave[py][px].o_idx; this_o_idx; this_o_idx = next_o_idx)
5924 /* Acquire object */
5925 o_ptr = &o_list[this_o_idx];
5927 /* Acquire next object */
5928 next_o_idx = o_ptr->next_o_idx;
5931 if ((o_ptr->tval == TV_SORCERY_BOOK) && (o_ptr->sval == 3)) have_dd_s = TRUE;
5932 if ((o_ptr->tval == TV_TRUMP_BOOK) && (o_ptr->sval == 1)) have_dd_t = TRUE;
5934 if ((o_ptr->tval == TV_NATURE_BOOK) && (o_ptr->sval == 2)) have_sw = TRUE;
5935 if ((o_ptr->tval == TV_CRAFT_BOOK) && (o_ptr->sval == 2)) have_kabe = TRUE;
5938 if (p_ptr->pass_wall && !p_ptr->kill_wall) p_ptr->no_flowed = TRUE;
5940 if (have_dd_s && ((p_ptr->realm1 == REALM_SORCERY) || (p_ptr->realm2 == REALM_SORCERY) || (p_ptr->pclass == CLASS_SORCERER)))
5942 const magic_type *s_ptr = &mp_ptr->info[REALM_SORCERY-1][SPELL_DD_S];
5943 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5946 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)))
5948 const magic_type *s_ptr = &mp_ptr->info[REALM_TRUMP-1][SPELL_DD_T];
5949 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5952 if (have_sw && ((p_ptr->realm1 == REALM_NATURE) || (p_ptr->realm2 == REALM_NATURE) || (p_ptr->pclass == CLASS_SORCERER)))
5954 const magic_type *s_ptr = &mp_ptr->info[REALM_NATURE-1][SPELL_SW];
5955 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5958 if (have_kabe && ((p_ptr->realm1 == REALM_CRAFT) || (p_ptr->realm2 == REALM_CRAFT) || (p_ptr->pclass == CLASS_SORCERER)))
5960 const magic_type *s_ptr = &mp_ptr->info[REALM_CRAFT-1][SPELL_KABE];
5961 if (p_ptr->lev >= s_ptr->slevel) p_ptr->no_flowed = TRUE;
5968 * Handle "p_ptr->notice"
5970 void notice_stuff(void)
5973 if (!p_ptr->notice) return;
5976 /* Actually do auto-destroy */
5977 if (p_ptr->notice & (PN_AUTODESTROY))
5979 p_ptr->notice &= ~(PN_AUTODESTROY);
5980 autopick_delayed_alter();
5983 /* Combine the pack */
5984 if (p_ptr->notice & (PN_COMBINE))
5986 p_ptr->notice &= ~(PN_COMBINE);
5990 /* Reorder the pack */
5991 if (p_ptr->notice & (PN_REORDER))
5993 p_ptr->notice &= ~(PN_REORDER);
6000 * Handle "p_ptr->update"
6002 void update_stuff(void)
6005 if (!p_ptr->update) return;
6008 if (p_ptr->update & (PU_BONUS))
6010 p_ptr->update &= ~(PU_BONUS);
6014 if (p_ptr->update & (PU_TORCH))
6016 p_ptr->update &= ~(PU_TORCH);
6020 if (p_ptr->update & (PU_HP))
6022 p_ptr->update &= ~(PU_HP);
6026 if (p_ptr->update & (PU_MANA))
6028 p_ptr->update &= ~(PU_MANA);
6032 if (p_ptr->update & (PU_SPELLS))
6034 p_ptr->update &= ~(PU_SPELLS);
6039 /* Character is not ready yet, no screen updates */
6040 if (!character_generated) return;
6043 /* Character is in "icky" mode, no screen updates */
6044 if (character_icky) return;
6047 if (p_ptr->update & (PU_UN_LITE))
6049 p_ptr->update &= ~(PU_UN_LITE);
6053 if (p_ptr->update & (PU_UN_VIEW))
6055 p_ptr->update &= ~(PU_UN_VIEW);
6059 if (p_ptr->update & (PU_VIEW))
6061 p_ptr->update &= ~(PU_VIEW);
6065 if (p_ptr->update & (PU_LITE))
6067 p_ptr->update &= ~(PU_LITE);
6072 if (p_ptr->update & (PU_FLOW))
6074 p_ptr->update &= ~(PU_FLOW);
6078 if (p_ptr->update & (PU_DISTANCE))
6080 p_ptr->update &= ~(PU_DISTANCE);
6082 /* Still need to call update_monsters(FALSE) after update_mon_lite() */
6083 /* p_ptr->update &= ~(PU_MONSTERS); */
6085 update_monsters(TRUE);
6088 if (p_ptr->update & (PU_MON_LITE))
6090 p_ptr->update &= ~(PU_MON_LITE);
6095 * Mega-Hack -- Delayed visual update
6096 * Only used if update_view(), update_lite() or update_mon_lite() was called
6098 if (p_ptr->update & (PU_DELAY_VIS))
6100 p_ptr->update &= ~(PU_DELAY_VIS);
6101 delayed_visual_update();
6104 if (p_ptr->update & (PU_MONSTERS))
6106 p_ptr->update &= ~(PU_MONSTERS);
6107 update_monsters(FALSE);
6113 * Handle "p_ptr->redraw"
6115 void redraw_stuff(void)
6118 if (!p_ptr->redraw) return;
6121 /* Character is not ready yet, no screen updates */
6122 if (!character_generated) return;
6125 /* Character is in "icky" mode, no screen updates */
6126 if (character_icky) return;
6130 /* Hack -- clear the screen */
6131 if (p_ptr->redraw & (PR_WIPE))
6133 p_ptr->redraw &= ~(PR_WIPE);
6139 if (p_ptr->redraw & (PR_MAP))
6141 p_ptr->redraw &= ~(PR_MAP);
6146 if (p_ptr->redraw & (PR_BASIC))
6148 p_ptr->redraw &= ~(PR_BASIC);
6149 p_ptr->redraw &= ~(PR_MISC | PR_TITLE | PR_STATS);
6150 p_ptr->redraw &= ~(PR_LEV | PR_EXP | PR_GOLD);
6151 p_ptr->redraw &= ~(PR_ARMOR | PR_HP | PR_MANA);
6152 p_ptr->redraw &= ~(PR_DEPTH | PR_HEALTH | PR_UHEALTH);
6158 if (p_ptr->redraw & (PR_EQUIPPY))
6160 p_ptr->redraw &= ~(PR_EQUIPPY);
6161 print_equippy(); /* To draw / delete equippy chars */
6164 if (p_ptr->redraw & (PR_MISC))
6166 p_ptr->redraw &= ~(PR_MISC);
6167 prt_field(rp_ptr->title, ROW_RACE, COL_RACE);
6168 /* prt_field(cp_ptr->title, ROW_CLASS, COL_CLASS); */
6172 if (p_ptr->redraw & (PR_TITLE))
6174 p_ptr->redraw &= ~(PR_TITLE);
6178 if (p_ptr->redraw & (PR_LEV))
6180 p_ptr->redraw &= ~(PR_LEV);
6184 if (p_ptr->redraw & (PR_EXP))
6186 p_ptr->redraw &= ~(PR_EXP);
6190 if (p_ptr->redraw & (PR_STATS))
6192 p_ptr->redraw &= ~(PR_STATS);
6201 if (p_ptr->redraw & (PR_STATUS))
6203 p_ptr->redraw &= ~(PR_STATUS);
6207 if (p_ptr->redraw & (PR_ARMOR))
6209 p_ptr->redraw &= ~(PR_ARMOR);
6213 if (p_ptr->redraw & (PR_HP))
6215 p_ptr->redraw &= ~(PR_HP);
6219 if (p_ptr->redraw & (PR_MANA))
6221 p_ptr->redraw &= ~(PR_MANA);
6225 if (p_ptr->redraw & (PR_GOLD))
6227 p_ptr->redraw &= ~(PR_GOLD);
6231 if (p_ptr->redraw & (PR_DEPTH))
6233 p_ptr->redraw &= ~(PR_DEPTH);
6237 if (p_ptr->redraw & (PR_HEALTH))
6239 p_ptr->redraw &= ~(PR_HEALTH);
6240 health_redraw(FALSE);
6243 if (p_ptr->redraw & (PR_UHEALTH))
6245 p_ptr->redraw &= ~(PR_UHEALTH);
6246 health_redraw(TRUE);
6250 if (p_ptr->redraw & (PR_EXTRA))
6252 p_ptr->redraw &= ~(PR_EXTRA);
6253 p_ptr->redraw &= ~(PR_CUT | PR_STUN);
6254 p_ptr->redraw &= ~(PR_HUNGER);
6255 p_ptr->redraw &= ~(PR_STATE | PR_SPEED | PR_STUDY | PR_IMITATION | PR_STATUS);
6259 if (p_ptr->redraw & (PR_CUT))
6261 p_ptr->redraw &= ~(PR_CUT);
6265 if (p_ptr->redraw & (PR_STUN))
6267 p_ptr->redraw &= ~(PR_STUN);
6271 if (p_ptr->redraw & (PR_HUNGER))
6273 p_ptr->redraw &= ~(PR_HUNGER);
6277 if (p_ptr->redraw & (PR_STATE))
6279 p_ptr->redraw &= ~(PR_STATE);
6283 if (p_ptr->redraw & (PR_SPEED))
6285 p_ptr->redraw &= ~(PR_SPEED);
6289 if (p_ptr->pclass == CLASS_IMITATOR)
6291 if (p_ptr->redraw & (PR_IMITATION))
6293 p_ptr->redraw &= ~(PR_IMITATION);
6297 else if (p_ptr->redraw & (PR_STUDY))
6299 p_ptr->redraw &= ~(PR_STUDY);
6306 * Handle "p_ptr->window"
6308 void window_stuff(void)
6316 if (!p_ptr->window) return;
6319 for (j = 0; j < 8; j++)
6321 /* Save usable flags */
6322 if (angband_term[j]) mask |= window_flag[j];
6325 /* Apply usable flags */
6326 p_ptr->window &= mask;
6329 if (!p_ptr->window) return;
6332 /* Display inventory */
6333 if (p_ptr->window & (PW_INVEN))
6335 p_ptr->window &= ~(PW_INVEN);
6339 /* Display equipment */
6340 if (p_ptr->window & (PW_EQUIP))
6342 p_ptr->window &= ~(PW_EQUIP);
6346 /* Display spell list */
6347 if (p_ptr->window & (PW_SPELL))
6349 p_ptr->window &= ~(PW_SPELL);
6353 /* Display player */
6354 if (p_ptr->window & (PW_PLAYER))
6356 p_ptr->window &= ~(PW_PLAYER);
6360 /* Display monster list */
6361 if (p_ptr->window & (PW_MONSTER_LIST))
6363 p_ptr->window &= ~(PW_MONSTER_LIST);
6367 /* Display overhead view */
6368 if (p_ptr->window & (PW_MESSAGE))
6370 p_ptr->window &= ~(PW_MESSAGE);
6374 /* Display overhead view */
6375 if (p_ptr->window & (PW_OVERHEAD))
6377 p_ptr->window &= ~(PW_OVERHEAD);
6381 /* Display overhead view */
6382 if (p_ptr->window & (PW_DUNGEON))
6384 p_ptr->window &= ~(PW_DUNGEON);
6388 /* Display monster recall */
6389 if (p_ptr->window & (PW_MONSTER))
6391 p_ptr->window &= ~(PW_MONSTER);
6395 /* Display object recall */
6396 if (p_ptr->window & (PW_OBJECT))
6398 p_ptr->window &= ~(PW_OBJECT);
6405 * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
6407 void handle_stuff(void)
6410 if (p_ptr->update) update_stuff();
6413 if (p_ptr->redraw) redraw_stuff();
6416 if (p_ptr->window) window_stuff();
6420 s16b empty_hands(bool riding_control)
6422 s16b status = EMPTY_HAND_NONE;
6424 if (!inventory[INVEN_RARM].k_idx) status |= EMPTY_HAND_RARM;
6425 if (!inventory[INVEN_LARM].k_idx) status |= EMPTY_HAND_LARM;
6427 if (riding_control && (status != EMPTY_HAND_NONE) && p_ptr->riding && !(p_ptr->pet_extra_flags & PF_RYOUTE))
6429 if (status & EMPTY_HAND_LARM) status &= ~(EMPTY_HAND_LARM);
6430 else if (status & EMPTY_HAND_RARM) status &= ~(EMPTY_HAND_RARM);
6437 bool heavy_armor(void)
6439 u16b monk_arm_wgt = 0;
6441 if ((p_ptr->pclass != CLASS_MONK) && (p_ptr->pclass != CLASS_FORCETRAINER) && (p_ptr->pclass != CLASS_NINJA)) return FALSE;
6443 /* Weight the armor */
6444 if(inventory[INVEN_RARM].tval > TV_SWORD) monk_arm_wgt += inventory[INVEN_RARM].weight;
6445 if(inventory[INVEN_LARM].tval > TV_SWORD) monk_arm_wgt += inventory[INVEN_LARM].weight;
6446 monk_arm_wgt += inventory[INVEN_BODY].weight;
6447 monk_arm_wgt += inventory[INVEN_HEAD].weight;
6448 monk_arm_wgt += inventory[INVEN_OUTER].weight;
6449 monk_arm_wgt += inventory[INVEN_HANDS].weight;
6450 monk_arm_wgt += inventory[INVEN_FEET].weight;
6452 return (monk_arm_wgt > (100 + (p_ptr->lev * 4)));
6455 void update_playtime(void)
6457 /* Check if the game has started */
6458 if (start_time != 0)
6460 u32b tmp = time(NULL);
6461 playtime += (tmp - start_time);