4 * @brief
\83v
\83\8c\83C
\83\84\81[
\82Ì
\8bR
\8fæ/
\89º
\94n
\8f\88\97\9d\94»
\92è
\r
5 * @param c_ptr
\83v
\83\8c\83C
\83\84\81[
\82Ì
\88Ú
\93®
\90æ
\83}
\83X
\82Ì
\8d\
\91¢
\91Ì
\8eQ
\8fÆ
\83|
\83C
\83\93\83^
\r
6 * @param now_riding TRUE
\82È
\82ç
\89º
\94n
\8f\88\97\9d\81AFALSE
\82È
\82ç
\82Î
\8bR
\8fæ
\8f\88\97\9d\r
7 * @return
\89Â
\94\
\82È
\82ç
\82ÎTRUE
\82ð
\95Ô
\82·
\r
9 bool player_can_ride_aux(cave_type *c_ptr, bool now_riding)
\r
12 bool old_character_xtra = character_xtra;
\r
13 MONSTER_IDX old_riding = p_ptr->riding;
\r
14 bool old_riding_ryoute = p_ptr->riding_ryoute;
\r
15 bool old_old_riding_ryoute = p_ptr->old_riding_ryoute;
\r
16 bool old_pf_ryoute = (p_ptr->pet_extra_flags & PF_RYOUTE) ? TRUE : FALSE;
\r
18 /* Hack -- prevent "icky" message */
\r
19 character_xtra = TRUE;
\r
21 if (now_riding) p_ptr->riding = c_ptr->m_idx;
\r
25 p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
\r
26 p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
\r
31 p_can_enter = player_can_enter(c_ptr->feat, CEM_P_CAN_ENTER_PATTERN);
\r
33 p_ptr->riding = old_riding;
\r
34 if (old_pf_ryoute) p_ptr->pet_extra_flags |= (PF_RYOUTE);
\r
35 else p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
\r
36 p_ptr->riding_ryoute = old_riding_ryoute;
\r
37 p_ptr->old_riding_ryoute = old_old_riding_ryoute;
\r
41 character_xtra = old_character_xtra;
\r
48 * @brief
\83y
\83b
\83g
\82É
\82È
\82Á
\82Ä
\82¢
\82é
\83\82\83\93\83X
\83^
\81[
\82ð
\83\
\81[
\83g
\82·
\82é
\82½
\82ß
\82Ì
\94ä
\8ar
\8f\88\97\9d\r
49 * @param u
\83\82\83\93\83X
\83^
\81[
\82Ì
\8d\
\91¢
\91Ì
\94z
\97ñ
\r
50 * @param v
\96¢
\8eg
\97p
\r
51 * @param a
\94ä
\8ar
\91Î
\8fÛ
\82Ì
\83\82\83\93\83X
\83^
\81[ID1
\r
52 * @param b
\94ä
\8ar
\91Î
\8fÛ
\82Ì
\83\82\83\93\83X
\83^
\81[ID2
\r
53 * @return 2
\94Ô
\96Ú
\82ª
\91å
\82È
\82ç
\82ÎTRUE
\82ð
\95Ô
\82·
\r
55 static bool ang_sort_comp_pet_dismiss(vptr u, vptr v, int a, int b)
\r
57 u16b *who = (u16b*)(u);
\r
62 monster_type *m_ptr1 = &m_list[w1];
\r
63 monster_type *m_ptr2 = &m_list[w2];
\r
64 monster_race *r_ptr1 = &r_info[m_ptr1->r_idx];
\r
65 monster_race *r_ptr2 = &r_info[m_ptr2->r_idx];
\r
70 if (w1 == p_ptr->riding) return TRUE;
\r
71 if (w2 == p_ptr->riding) return FALSE;
\r
73 if (m_ptr1->nickname && !m_ptr2->nickname) return TRUE;
\r
74 if (m_ptr2->nickname && !m_ptr1->nickname) return FALSE;
\r
76 if (!m_ptr1->parent_m_idx && m_ptr2->parent_m_idx) return TRUE;
\r
77 if (!m_ptr2->parent_m_idx && m_ptr1->parent_m_idx) return FALSE;
\r
79 if ((r_ptr1->flags1 & RF1_UNIQUE) && !(r_ptr2->flags1 & RF1_UNIQUE)) return TRUE;
\r
80 if ((r_ptr2->flags1 & RF1_UNIQUE) && !(r_ptr1->flags1 & RF1_UNIQUE)) return FALSE;
\r
82 if (r_ptr1->level > r_ptr2->level) return TRUE;
\r
83 if (r_ptr2->level > r_ptr1->level) return FALSE;
\r
85 if (m_ptr1->hp > m_ptr2->hp) return TRUE;
\r
86 if (m_ptr2->hp > m_ptr1->hp) return FALSE;
\r
93 * @brief
\83y
\83b
\83g
\82Ì
\88Û
\8e\9d\83R
\83X
\83g
\8cv
\8eZ
\r
94 * @return
\88Û
\8e\9d\83R
\83X
\83g(%)
\r
96 int calculate_upkeep(void)
\r
98 s32b old_friend_align = friend_align;
\r
100 bool have_a_unique = FALSE;
\r
101 s32b total_friend_levels = 0;
\r
106 for (m_idx = m_max - 1; m_idx >= 1; m_idx--)
\r
108 monster_type *m_ptr;
\r
109 monster_race *r_ptr;
\r
111 m_ptr = &m_list[m_idx];
\r
112 if (!m_ptr->r_idx) continue;
\r
113 r_ptr = &r_info[m_ptr->r_idx];
\r
118 if (r_ptr->flags1 & RF1_UNIQUE)
\r
120 if (p_ptr->pclass == CLASS_CAVALRY)
\r
122 if (p_ptr->riding == m_idx)
\r
123 total_friend_levels += (r_ptr->level + 5) * 2;
\r
124 else if (!have_a_unique && (r_info[m_ptr->r_idx].flags7 & RF7_RIDING))
\r
125 total_friend_levels += (r_ptr->level + 5) * 7 / 2;
\r
127 total_friend_levels += (r_ptr->level + 5) * 10;
\r
128 have_a_unique = TRUE;
\r
131 total_friend_levels += (r_ptr->level + 5) * 10;
\r
134 total_friend_levels += r_ptr->level;
\r
136 /* Determine pet alignment */
\r
137 if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level;
\r
138 if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level;
\r
141 if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
\r
145 upkeep_factor = (total_friend_levels - (p_ptr->lev * 80 / (cp_ptr->pet_upkeep_div)));
\r
146 if (upkeep_factor < 0) upkeep_factor = 0;
\r
147 if (upkeep_factor > 1000) upkeep_factor = 1000;
\r
148 return upkeep_factor;
\r
155 * @brief
\83y
\83b
\83g
\82ð
\8aJ
\95ú
\82·
\82é
\83R
\83}
\83\93\83h
\82Ì
\83\81\83C
\83\93\83\8b\81[
\83`
\83\93\r
158 void do_cmd_pet_dismiss(void)
\r
160 monster_type *m_ptr;
\r
161 bool all_pets = FALSE;
\r
162 MONSTER_IDX pet_ctr;
\r
171 cu = Term->scr->cu;
\r
172 cv = Term->scr->cv;
\r
176 /* Allocate the "who" array */
\r
177 C_MAKE(who, max_m_idx, MONSTER_IDX);
\r
179 /* Process the monsters (backwards) */
\r
180 for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
\r
182 if (is_pet(&m_list[pet_ctr]))
\r
183 who[max_pet++] = pet_ctr;
\r
186 /* Select the sort method */
\r
187 ang_sort_comp = ang_sort_comp_pet_dismiss;
\r
188 ang_sort_swap = ang_sort_swap_hook;
\r
190 ang_sort(who, &dummy_why, max_pet);
\r
192 /* Process the monsters (backwards) */
\r
193 for (i = 0; i < max_pet; i++)
\r
196 char friend_name[80];
\r
199 /* Access the monster */
\r
201 m_ptr = &m_list[pet_ctr];
\r
203 delete_this = FALSE;
\r
204 kakunin = ((pet_ctr == p_ptr->riding) || (m_ptr->nickname));
\r
205 monster_desc(friend_name, m_ptr, MD_ASSUME_VISIBLE);
\r
209 /* Hack -- health bar for this monster */
\r
210 health_track(pet_ctr);
\r
212 /* Hack -- handle stuff */
\r
215 msg_format(_("%s
\82ð
\95ú
\82µ
\82Ü
\82·
\82©
\81H [Yes/No/Unnamed (%d
\91Ì)]", "Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, max_pet - i);
\r
218 move_cursor_relative(m_ptr->fy, m_ptr->fx);
\r
224 if (ch == 'Y' || ch == 'y')
\r
226 delete_this = TRUE;
\r
230 msg_format(_("
\96{
\93\96\82É
\82æ
\82ë
\82µ
\82¢
\82Å
\82·
\82©
\81H (%s) ", "Are you sure? (%s) "), friend_name);
\r
232 if (ch != 'Y' && ch != 'y')
\r
233 delete_this = FALSE;
\r
238 if (ch == 'U' || ch == 'u')
\r
244 if (ch == ESCAPE || ch == 'N' || ch == 'n')
\r
251 if ((all_pets && !kakunin) || (!all_pets && delete_this))
\r
253 if (record_named_pet && m_ptr->nickname)
\r
257 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
\r
258 do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DISMISS, m_name);
\r
261 if (pet_ctr == p_ptr->riding)
\r
263 msg_format(_("%s
\82©
\82ç
\8d~
\82è
\82½
\81B", "You have got off %s. "), friend_name);
\r
267 /* Update the monsters */
\r
268 p_ptr->update |= (PU_BONUS | PU_MONSTERS);
\r
269 p_ptr->redraw |= (PR_EXTRA | PR_UHEALTH);
\r
272 /* HACK : Add the line to message buffer */
\r
273 msg_format(_("%s
\82ð
\95ú
\82µ
\82½
\81B", "Dismissed %s."), friend_name);
\r
274 p_ptr->window |= (PW_MESSAGE);
\r
277 delete_monster_idx(pet_ctr);
\r
282 Term->scr->cu = cu;
\r
283 Term->scr->cv = cv;
\r
286 C_KILL(who, max_m_idx, MONSTER_IDX);
\r
289 msg_format("%d
\91Ì
\82Ì
\83y
\83b
\83g
\82ð
\95ú
\82µ
\82Ü
\82µ
\82½
\81B", Dismissed);
\r
291 msg_format("You have dismissed %d pet%s.", Dismissed,
\r
292 (Dismissed == 1 ? "" : "s"));
\r
294 if (Dismissed == 0 && all_pets)
\r
295 msg_print(_("'U'nnamed
\82Í
\81A
\8fæ
\94n
\88È
\8aO
\82Ì
\96¼
\91O
\82Ì
\82È
\82¢
\83y
\83b
\83g
\82¾
\82¯
\82ð
\91S
\82Ä
\89ð
\95ú
\82µ
\82Ü
\82·
\81B", "'U'nnamed means all your pets except named pets and your mount."));
\r
301 * @brief
\83y
\83b
\83g
\82©
\82ç
\8bR
\8fæ/
\89º
\94n
\82·
\82é
\83R
\83}
\83\93\83h
\82Ì
\83\81\83C
\83\93\83\8b\81[
\83`
\83\93 /
\r
302 * @param force
\8b
\90§
\93I
\82É
\8bR
\8fæ/
\89º
\94n
\82·
\82é
\82È
\82ç
\82ÎTRUE
\r
303 * @return
\8bR
\8fæ/
\89º
\94n
\82Å
\82«
\82½
\82çTRUE
\r
305 bool do_riding(bool force)
\r
309 monster_type *m_ptr;
\r
311 if (!get_rep_dir2(&dir)) return FALSE;
\r
312 y = p_ptr->y + ddy[dir];
\r
313 x = p_ptr->x + ddx[dir];
\r
314 c_ptr = &cave[y][x];
\r
316 if (p_ptr->special_defense & KATA_MUSOU) set_action(ACTION_NONE);
\r
320 /* Skip non-empty grids */
\r
321 if (!player_can_ride_aux(c_ptr, FALSE))
\r
323 msg_print(_("
\82»
\82¿
\82ç
\82É
\82Í
\8d~
\82è
\82ç
\82ê
\82Ü
\82¹
\82ñ
\81B", "You cannot go to that direction."));
\r
327 if (!pattern_seq(p_ptr->y, p_ptr->x, y, x)) return FALSE;
\r
332 p_ptr->energy_use = 100;
\r
335 msg_print(_("
\83\82\83\93\83X
\83^
\81[
\82ª
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82Ä
\82¢
\82é
\81I", "There is a monster in the way!"));
\r
337 py_attack(y, x, 0);
\r
342 p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
\r
343 p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
\r
347 if (p_ptr->confused)
\r
349 msg_print(_("
\8d¬
\97\90\82µ
\82Ä
\82¢
\82Ä
\8fæ
\82ê
\82È
\82¢
\81I", "You are too confused!"));
\r
353 m_ptr = &m_list[c_ptr->m_idx];
\r
355 if (!c_ptr->m_idx || !m_ptr->ml)
\r
357 msg_print(_("
\82»
\82Ì
\8fê
\8f\8a\82É
\82Í
\83\82\83\93\83X
\83^
\81[
\82Í
\82¢
\82Ü
\82¹
\82ñ
\81B", "Here is no monster."));
\r
360 if (!is_pet(m_ptr) && !force)
\r
362 msg_print(_("
\82»
\82Ì
\83\82\83\93\83X
\83^
\81[
\82Í
\83y
\83b
\83g
\82Å
\82Í
\82 \82è
\82Ü
\82¹
\82ñ
\81B", "That monster is not a pet."));
\r
365 if (!(r_info[m_ptr->r_idx].flags7 & RF7_RIDING))
\r
367 msg_print(_("
\82»
\82Ì
\83\82\83\93\83X
\83^
\81[
\82É
\82Í
\8fæ
\82ê
\82È
\82³
\82»
\82¤
\82¾
\81B", "This monster doesn't seem suitable for riding."));
\r
371 if (!pattern_seq(p_ptr->y, p_ptr->x, y, x)) return FALSE;
\r
373 if (!player_can_ride_aux(c_ptr, TRUE))
\r
375 /* Feature code (applying "mimic" field) */
\r
376 feature_type *f_ptr = &f_info[get_feat_mimic(c_ptr)];
\r
378 msg_format("
\82»
\82Ì
\83\82\83\93\83X
\83^
\81[
\82Í%s
\82Ì%s
\82É
\82¢
\82é
\81B", f_name + f_ptr->name,
\r
379 ((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) ||
\r
380 (!have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_TREE))) ?
\r
381 "
\92\86" : "
\8fã");
\r
383 msg_format("This monster is %s the %s.",
\r
384 ((!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) ||
\r
385 (!have_flag(f_ptr->flags, FF_LOS) && !have_flag(f_ptr->flags, FF_TREE))) ?
\r
386 "in" : "on", f_name + f_ptr->name);
\r
391 if (r_info[m_ptr->r_idx].level > randint1((p_ptr->skill_exp[GINOU_RIDING] / 50 + p_ptr->lev / 2 + 20)))
\r
393 msg_print(_("
\82¤
\82Ü
\82
\8fæ
\82ê
\82È
\82©
\82Á
\82½
\81B", "You failed to ride."));
\r
394 p_ptr->energy_use = 100;
\r
398 if (MON_CSLEEP(m_ptr))
\r
401 monster_desc(m_name, m_ptr, 0);
\r
402 (void)set_monster_csleep(c_ptr->m_idx, 0);
\r
403 msg_format(_("%s
\82ð
\8bN
\82±
\82µ
\82½
\81B", "You have waked %s up."), m_name);
\r
406 if (p_ptr->action == ACTION_KAMAE) set_action(ACTION_NONE);
\r
408 p_ptr->riding = c_ptr->m_idx;
\r
410 /* Hack -- remove tracked monster */
\r
411 if (p_ptr->riding == p_ptr->health_who) health_track(0);
\r
414 p_ptr->energy_use = 100;
\r
416 /* Mega-Hack -- Forget the view and lite */
\r
417 p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE);
\r
419 /* Update the monsters */
\r
420 p_ptr->update |= (PU_BONUS);
\r
423 p_ptr->redraw |= (PR_MAP | PR_EXTRA);
\r
425 p_ptr->redraw |= (PR_UHEALTH);
\r
427 /* Move the player */
\r
428 (void)move_player_effect(y, x, MPE_HANDLE_STUFF | MPE_ENERGY_USE | MPE_DONT_PICKUP | MPE_DONT_SWAP_MON);
\r
434 * @brief
\83y
\83b
\83g
\82É
\96¼
\91O
\82ð
\82Â
\82¯
\82é
\83R
\83}
\83\93\83h
\82Ì
\83\81\83C
\83\93\83\8b\81[
\83`
\83\93\r
437 static void do_name_pet(void)
\r
439 monster_type *m_ptr;
\r
442 bool old_name = FALSE;
\r
443 bool old_target_pet = target_pet;
\r
446 if (!target_set(TARGET_KILL))
\r
448 target_pet = old_target_pet;
\r
451 target_pet = old_target_pet;
\r
453 if (cave[target_row][target_col].m_idx)
\r
455 m_ptr = &m_list[cave[target_row][target_col].m_idx];
\r
457 if (!is_pet(m_ptr))
\r
460 msg_print(_("
\82»
\82Ì
\83\82\83\93\83X
\83^
\81[
\82Í
\83y
\83b
\83g
\82Å
\82Í
\82È
\82¢
\81B", "This monster is not a pet."));
\r
463 if (r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE)
\r
465 msg_print(_("
\82»
\82Ì
\83\82\83\93\83X
\83^
\81[
\82Ì
\96¼
\91O
\82Í
\95Ï
\82¦
\82ç
\82ê
\82È
\82¢
\81I", "You cannot change name of this monster!"));
\r
468 monster_desc(m_name, m_ptr, 0);
\r
471 msg_format(_("%s
\82É
\96¼
\91O
\82ð
\82Â
\82¯
\82é
\81B", "Name %s."), m_name);
\r
474 /* Start with nothing */
\r
475 strcpy(out_val, "");
\r
477 /* Use old inscription */
\r
478 if (m_ptr->nickname)
\r
480 /* Start with the old inscription */
\r
481 strcpy(out_val, quark_str(m_ptr->nickname));
\r
485 /* Get a new inscription (possibly empty) */
\r
486 if (get_string(_("
\96¼
\91O: ", "Name: "), out_val, 15))
\r
490 /* Save the inscription */
\r
491 m_ptr->nickname = quark_add(out_val);
\r
492 if (record_named_pet)
\r
494 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
\r
495 do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_NAME, m_name);
\r
500 if (record_named_pet && old_name)
\r
502 monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE);
\r
503 do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_UNNAME, m_name);
\r
505 m_ptr->nickname = 0;
\r
513 * @brief
\83y
\83b
\83g
\82É
\8aÖ
\82·
\82é
\83R
\83}
\83\93\83h
\83\8a\83X
\83g
\82Ì
\83\81\83C
\83\93\83\8b\81[
\83`
\83\93 /
\r
514 * Issue a pet command
\r
517 void do_cmd_pet(void)
\r
519 COMMAND_CODE i = 0;
\r
522 cptr power_desc[36];
\r
527 monster_type *m_ptr;
\r
529 PET_COMMAND_IDX mode = 0;
\r
532 char target_buf[160];
\r
534 int menu_line = use_menu ? 1 : 0;
\r
538 power_desc[num] = _("
\83y
\83b
\83g
\82ð
\95ú
\82·", "dismiss pets");
\r
539 powers[num++] = PET_DISMISS;
\r
542 sprintf(target_buf, "
\83y
\83b
\83g
\82Ì
\83^
\81[
\83Q
\83b
\83g
\82ð
\8ew
\92è (
\8c»
\8dÝ
\81F%s)",
\r
543 (pet_t_m_idx ? (p_ptr->image ? "
\89½
\82©
\8aï
\96
\82È
\95¨" : (r_name + r_info[m_list[pet_t_m_idx].ap_r_idx].name)) : "
\8ew
\92è
\82È
\82µ"));
\r
545 sprintf(target_buf, "specify a target of pet (now:%s)",
\r
546 (pet_t_m_idx ? (p_ptr->image ? "something strange" : (r_name + r_info[m_list[pet_t_m_idx].ap_r_idx].name)) : "nothing"));
\r
548 power_desc[num] = target_buf;
\r
549 powers[num++] = PET_TARGET;
\r
550 power_desc[num] = _("
\8bß
\82
\82É
\82¢
\82ë", "stay close");
\r
552 if (p_ptr->pet_follow_distance == PET_CLOSE_DIST) mode = num;
\r
553 powers[num++] = PET_STAY_CLOSE;
\r
554 power_desc[num] = _("
\82Â
\82¢
\82Ä
\97\88\82¢", "follow me");
\r
556 if (p_ptr->pet_follow_distance == PET_FOLLOW_DIST) mode = num;
\r
557 powers[num++] = PET_FOLLOW_ME;
\r
558 power_desc[num] = _("
\93G
\82ð
\8c©
\82Â
\82¯
\82Ä
\93|
\82¹", "seek and destroy");
\r
560 if (p_ptr->pet_follow_distance == PET_DESTROY_DIST) mode = num;
\r
561 powers[num++] = PET_SEEK_AND_DESTROY;
\r
562 power_desc[num] = _("
\8f
\82µ
\97£
\82ê
\82Ä
\82¢
\82ë", "give me space");
\r
564 if (p_ptr->pet_follow_distance == PET_SPACE_DIST) mode = num;
\r
565 powers[num++] = PET_ALLOW_SPACE;
\r
566 power_desc[num] = _("
\97£
\82ê
\82Ä
\82¢
\82ë", "stay away");
\r
568 if (p_ptr->pet_follow_distance == PET_AWAY_DIST) mode = num;
\r
569 powers[num++] = PET_STAY_AWAY;
\r
571 if (p_ptr->pet_extra_flags & PF_OPEN_DOORS)
\r
573 power_desc[num] = _("
\83h
\83A
\82ð
\8aJ
\82¯
\82é (
\8c»
\8dÝ:ON)", "pets open doors (now On)");
\r
577 power_desc[num] = _("
\83h
\83A
\82ð
\8aJ
\82¯
\82é (
\8c»
\8dÝ:OFF)", "pets open doors (now Off)");
\r
579 powers[num++] = PET_OPEN_DOORS;
\r
581 if (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS)
\r
583 power_desc[num] = _("
\83A
\83C
\83e
\83\80\82ð
\8fE
\82¤ (
\8c»
\8dÝ:ON)", "pets pick up items (now On)");
\r
587 power_desc[num] = _("
\83A
\83C
\83e
\83\80\82ð
\8fE
\82¤ (
\8c»
\8dÝ:OFF)", "pets pick up items (now Off)");
\r
589 powers[num++] = PET_TAKE_ITEMS;
\r
591 if (p_ptr->pet_extra_flags & PF_TELEPORT)
\r
593 power_desc[num] = _("
\83e
\83\8c\83|
\81[
\83g
\8cn
\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:ON)", "allow teleport (now On)");
\r
597 power_desc[num] = _("
\83e
\83\8c\83|
\81[
\83g
\8cn
\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:OFF)", "allow teleport (now Off)");
\r
599 powers[num++] = PET_TELEPORT;
\r
601 if (p_ptr->pet_extra_flags & PF_ATTACK_SPELL)
\r
603 power_desc[num] = _("
\8dU
\8c\82\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:ON)", "allow cast attack spell (now On)");
\r
607 power_desc[num] = _("
\8dU
\8c\82\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:OFF)", "allow cast attack spell (now Off)");
\r
609 powers[num++] = PET_ATTACK_SPELL;
\r
611 if (p_ptr->pet_extra_flags & PF_SUMMON_SPELL)
\r
613 power_desc[num] = _("
\8f¢
\8a«
\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:ON)", "allow cast summon spell (now On)");
\r
617 power_desc[num] = _("
\8f¢
\8a«
\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:OFF)", "allow cast summon spell (now Off)");
\r
619 powers[num++] = PET_SUMMON_SPELL;
\r
621 if (p_ptr->pet_extra_flags & PF_BALL_SPELL)
\r
623 power_desc[num] = _("
\83v
\83\8c\83C
\83\84\81[
\82ð
\8aª
\82«
\8d\9e\82Þ
\94Í
\88Í
\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:ON)", "allow involve player in area spell (now On)");
\r
627 power_desc[num] = _("
\83v
\83\8c\83C
\83\84\81[
\82ð
\8aª
\82«
\8d\9e\82Þ
\94Í
\88Í
\96\82\96@
\82ð
\8eg
\82¤ (
\8c»
\8dÝ:OFF)", "allow involve player in area spell (now Off)");
\r
629 powers[num++] = PET_BALL_SPELL;
\r
633 power_desc[num] = _("
\83y
\83b
\83g
\82©
\82ç
\8d~
\82è
\82é", "get off a pet");
\r
637 power_desc[num] = _("
\83y
\83b
\83g
\82É
\8fæ
\82é", "ride a pet");
\r
639 powers[num++] = PET_RIDING;
\r
640 power_desc[num] = _("
\83y
\83b
\83g
\82É
\96¼
\91O
\82ð
\82Â
\82¯
\82é", "name pets");
\r
641 powers[num++] = PET_NAME;
\r
645 if ((p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
\r
646 object_allow_two_hands_wielding(&inventory[INVEN_RARM])) ||
\r
647 (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
\r
648 object_allow_two_hands_wielding(&inventory[INVEN_LARM])))
\r
650 if (p_ptr->pet_extra_flags & PF_RYOUTE)
\r
652 power_desc[num] = _("
\95\90\8aí
\82ð
\95Ð
\8eè
\82Å
\8e\9d\82Â", "use one hand to control a riding pet");
\r
656 power_desc[num] = _("
\95\90\8aí
\82ð
\97¼
\8eè
\82Å
\8e\9d\82Â", "use both hands for a weapon");
\r
659 powers[num++] = PET_RYOUTE;
\r
663 switch (p_ptr->pclass)
\r
666 case CLASS_FORCETRAINER:
\r
667 case CLASS_BERSERKER:
\r
668 if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
\r
670 if (p_ptr->pet_extra_flags & PF_RYOUTE)
\r
672 power_desc[num] = _("
\95Ð
\8eè
\82Å
\8ai
\93¬
\82·
\82é", "use one hand to control a riding pet");
\r
676 power_desc[num] = _("
\97¼
\8eè
\82Å
\8ai
\93¬
\82·
\82é", "use both hands for melee");
\r
679 powers[num++] = PET_RYOUTE;
\r
681 else if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
\r
683 if (p_ptr->pet_extra_flags & PF_RYOUTE)
\r
685 power_desc[num] = _("
\8ai
\93¬
\82ð
\8ds
\82í
\82È
\82¢", "use one hand to control a riding pet");
\r
689 power_desc[num] = _("
\8ai
\93¬
\82ð
\8ds
\82¤", "use one hand for melee");
\r
692 powers[num++] = PET_RYOUTE;
\r
699 #ifdef ALLOW_REPEAT
\r
700 if (!(repeat_pull(&i) && (i >= 0) && (i < num)))
\r
702 #endif /* ALLOW_REPEAT */
\r
704 /* Nothing chosen yet */
\r
707 /* No redraw yet */
\r
712 /* Save the screen */
\r
715 /* Build a prompt */
\r
716 strnfmt(out_val, 78, _("(
\83R
\83}
\83\93\83h
\81AESC=
\8fI
\97¹)
\83R
\83}
\83\93\83h
\82ð
\91I
\82ñ
\82Å
\82
\82¾
\82³
\82¢:", "(Command, ESC=exit) Choose command from menu."));
\r
720 /* Build a prompt */
\r
721 strnfmt(out_val, 78,
\r
722 _("(
\83R
\83}
\83\93\83h %c-%c
\81A'*'=
\88ê
\97\97\81AESC=
\8fI
\97¹)
\83R
\83}
\83\93\83h
\82ð
\91I
\82ñ
\82Å
\82
\82¾
\82³
\82¢:", "(Command %c-%c, *=List, ESC=exit) Select a command: "),
\r
723 I2A(0), I2A(num - 1));
\r
726 choice = (always_show_list || use_menu) ? ESCAPE : 1;
\r
728 /* Get a command from the user */
\r
733 if (choice == ESCAPE) choice = ' ';
\r
734 else if (!get_com(out_val, &choice, TRUE)) break;
\r
736 if (use_menu && (choice != ' '))
\r
747 menu_line += (num - 1);
\r
776 if (menu_line > num) menu_line -= num;
\r
779 /* Request redraw */
\r
780 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
\r
782 /* Show the list */
\r
783 if (!redraw || use_menu)
\r
786 PET_COMMAND_IDX ctr = 0;
\r
791 /* Save the screen */
\r
792 if (!use_menu) screen_save();
\r
797 for (ctr = 0; ctr < num; ctr++)
\r
799 /* Letter/number for power selection */
\r
801 sprintf(buf, "%c%s ", (ctr == mode) ? '*' : ' ', (ctr == (menu_line - 1)) ? _("
\81t", "> ") : " ");
\r
803 sprintf(buf, "%c%c) ", (ctr == mode) ? '*' : ' ', I2A(ctr));
\r
805 strcat(buf, power_desc[ctr]);
\r
807 prt(buf, y + ctr, x);
\r
810 prt("", y + MIN(ctr, 17), x);
\r
813 /* Hide the list */
\r
819 /* Restore the screen */
\r
830 ask = (isupper(choice));
\r
833 if (ask) choice = (char)tolower(choice);
\r
835 /* Extract request */
\r
836 i = (islower(choice) ? A2I(choice) : -1);
\r
839 /* Totally Illegal */
\r
840 if ((i < 0) || (i >= num))
\r
850 strnfmt(buf, 78, _("%s
\82ð
\8eg
\82¢
\82Ü
\82·
\82©
\81H ", "Use %s? "), power_desc[i]);
\r
852 /* Belay that order */
\r
853 if (!get_check(buf)) continue;
\r
856 /* Stop the loop */
\r
860 /* Restore the screen */
\r
861 if (redraw) screen_load();
\r
863 /* Abort if needed */
\r
866 p_ptr->energy_use = 0;
\r
870 #ifdef ALLOW_REPEAT
\r
873 #endif /* ALLOW_REPEAT */
\r
877 case PET_DISMISS: /* Dismiss pets */
\r
879 /* Check pets (backwards) */
\r
880 for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
\r
882 /* Player has pet */
\r
883 if (is_pet(&m_list[pet_ctr])) break;
\r
888 msg_print(_("
\83y
\83b
\83g
\82ª
\82¢
\82È
\82¢
\81I", "You have no pets!"));
\r
891 do_cmd_pet_dismiss();
\r
892 (void)calculate_upkeep();
\r
897 project_length = -1;
\r
898 if (!target_set(TARGET_KILL)) pet_t_m_idx = 0;
\r
901 cave_type *c_ptr = &cave[target_row][target_col];
\r
902 if (c_ptr->m_idx && (m_list[c_ptr->m_idx].ml))
\r
904 pet_t_m_idx = cave[target_row][target_col].m_idx;
\r
905 p_ptr->pet_follow_distance = PET_DESTROY_DIST;
\r
907 else pet_t_m_idx = 0;
\r
909 project_length = 0;
\r
914 case PET_STAY_CLOSE:
\r
916 p_ptr->pet_follow_distance = PET_CLOSE_DIST;
\r
921 case PET_FOLLOW_ME:
\r
923 p_ptr->pet_follow_distance = PET_FOLLOW_DIST;
\r
927 /* "Seek and destoy" */
\r
928 case PET_SEEK_AND_DESTROY:
\r
930 p_ptr->pet_follow_distance = PET_DESTROY_DIST;
\r
933 /* "Give me space" */
\r
934 case PET_ALLOW_SPACE:
\r
936 p_ptr->pet_follow_distance = PET_SPACE_DIST;
\r
940 case PET_STAY_AWAY:
\r
942 p_ptr->pet_follow_distance = PET_AWAY_DIST;
\r
945 /* flag - allow pets to open doors */
\r
946 case PET_OPEN_DOORS:
\r
948 if (p_ptr->pet_extra_flags & PF_OPEN_DOORS) p_ptr->pet_extra_flags &= ~(PF_OPEN_DOORS);
\r
949 else p_ptr->pet_extra_flags |= (PF_OPEN_DOORS);
\r
952 /* flag - allow pets to pickup items */
\r
953 case PET_TAKE_ITEMS:
\r
955 if (p_ptr->pet_extra_flags & PF_PICKUP_ITEMS)
\r
957 p_ptr->pet_extra_flags &= ~(PF_PICKUP_ITEMS);
\r
958 for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--)
\r
960 /* Access the monster */
\r
961 m_ptr = &m_list[pet_ctr];
\r
965 monster_drop_carried_objects(m_ptr);
\r
969 else p_ptr->pet_extra_flags |= (PF_PICKUP_ITEMS);
\r
973 /* flag - allow pets to teleport */
\r
976 if (p_ptr->pet_extra_flags & PF_TELEPORT) p_ptr->pet_extra_flags &= ~(PF_TELEPORT);
\r
977 else p_ptr->pet_extra_flags |= (PF_TELEPORT);
\r
980 /* flag - allow pets to cast attack spell */
\r
981 case PET_ATTACK_SPELL:
\r
983 if (p_ptr->pet_extra_flags & PF_ATTACK_SPELL) p_ptr->pet_extra_flags &= ~(PF_ATTACK_SPELL);
\r
984 else p_ptr->pet_extra_flags |= (PF_ATTACK_SPELL);
\r
987 /* flag - allow pets to cast attack spell */
\r
988 case PET_SUMMON_SPELL:
\r
990 if (p_ptr->pet_extra_flags & PF_SUMMON_SPELL) p_ptr->pet_extra_flags &= ~(PF_SUMMON_SPELL);
\r
991 else p_ptr->pet_extra_flags |= (PF_SUMMON_SPELL);
\r
994 /* flag - allow pets to cast attack spell */
\r
995 case PET_BALL_SPELL:
\r
997 if (p_ptr->pet_extra_flags & PF_BALL_SPELL) p_ptr->pet_extra_flags &= ~(PF_BALL_SPELL);
\r
998 else p_ptr->pet_extra_flags |= (PF_BALL_SPELL);
\r
1004 (void)do_riding(FALSE);
\r
1016 if (p_ptr->pet_extra_flags & PF_RYOUTE) p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
\r
1017 else p_ptr->pet_extra_flags |= (PF_RYOUTE);
\r
1018 p_ptr->update |= (PU_BONUS);
\r
1027 * @brief
\83y
\83b
\83g
\82Ì
\91P
\88«
\91®
\90«
\82É
\89\9e\82¶
\82½
\88Û
\8e\9d\83R
\83X
\83g
\82Ì
\93r
\92\86\8cv
\8eZ
\8f\88\97\9d\r
1028 * @param m_ptr
\8cv
\8eZ
\8aî
\8f\80\82Æ
\82È
\82é
\83\82\83\93\83X
\83^
\81[
\82Ì
\8d\
\91¢
\91Ì
\8eQ
\8fÆ
\83|
\83C
\83\93\83^
\r
1029 * @param inc m_ptr
\82Å
\8ew
\92è
\82µ
\82½
\83\82\83\93\83X
\83^
\81[
\82ð
\88Û
\8e\9d\83R
\83X
\83g
\8cv
\8eZ
\82É
\89Á
\82¦
\82é
\82È
\82çTRUE
\81A
\8aO
\82·
\82È
\82çFALSE
\82ð
\8ew
\92è
\r
1030 * @return
\82È
\82µ
\r
1032 void check_pets_num_and_align(monster_type *m_ptr, bool inc)
\r
1034 s32b old_friend_align = friend_align;
\r
1035 monster_race *r_ptr = &r_info[m_ptr->r_idx];
\r
1040 if (r_ptr->flags3 & RF3_GOOD) friend_align += r_ptr->level;
\r
1041 if (r_ptr->flags3 & RF3_EVIL) friend_align -= r_ptr->level;
\r
1046 if (r_ptr->flags3 & RF3_GOOD) friend_align -= r_ptr->level;
\r
1047 if (r_ptr->flags3 & RF3_EVIL) friend_align += r_ptr->level;
\r
1050 if (old_friend_align != friend_align) p_ptr->update |= (PU_BONUS);
\r
1056 * @brief
\83v
\83\8c\83C
\83\84\81[
\82Ì
\97\8e\94n
\94»
\92è
\8f\88\97\9d\r
1057 * @param dam
\97\8e\94n
\94»
\92è
\82ð
\94
\82µ
\82½
\8dÛ
\82É
\8eó
\82¯
\82½
\83_
\83\81\81[
\83W
\97Ê
\r
1058 * @param force TRUE
\82È
\82ç
\82Î
\8b
\90§
\93I
\82É
\97\8e\94n
\82·
\82é
\r
1059 * @return
\8eÀ
\8dÛ
\82É
\97\8e\94n
\82µ
\82½
\82çTRUE
\82ð
\95Ô
\82·
\r
1061 bool rakuba(HIT_POINT dam, bool force)
\r
1063 int i, y, x, oy, ox;
\r
1064 int sn = 0, sy = 0, sx = 0;
\r
1066 monster_type *m_ptr = &m_list[p_ptr->riding];
\r
1067 monster_race *r_ptr = &r_info[m_ptr->r_idx];
\r
1068 bool fall_dam = FALSE;
\r
1070 if (!p_ptr->riding) return FALSE;
\r
1071 if (p_ptr->wild_mode) return FALSE;
\r
1073 if (dam >= 0 || force)
\r
1077 int cur = p_ptr->skill_exp[GINOU_RIDING];
\r
1078 int max = s_info[p_ptr->pclass].s_max[GINOU_RIDING];
\r
1079 int ridinglevel = r_ptr->level;
\r
1081 /*
\97\8e\94n
\82Ì
\82µ
\82â
\82·
\82³ */
\r
1082 int rakubalevel = r_ptr->level;
\r
1083 if (p_ptr->riding_ryoute) rakubalevel += 20;
\r
1085 if ((cur < max) && (max > 1000) &&
\r
1086 (dam / 2 + ridinglevel) > (cur / 30 + 10))
\r
1090 if (ridinglevel > (cur / 100 + 15))
\r
1091 inc += 1 + (ridinglevel - cur / 100 - 15);
\r
1095 p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
\r
1098 /*
\83\8c\83x
\83\8b\82Ì
\92á
\82¢
\8fæ
\94n
\82©
\82ç
\82Í
\97\8e\94n
\82µ
\82É
\82
\82¢ */
\r
1099 if (randint0(dam / 2 + rakubalevel * 2) < cur / 30 + 10)
\r
1101 if ((((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY)) && !p_ptr->riding_ryoute) || !one_in_(p_ptr->lev*(p_ptr->riding_ryoute ? 2 : 3) + 30))
\r
1108 /* Check around the player */
\r
1109 for (i = 0; i < 8; i++)
\r
1113 /* Access the location */
\r
1114 y = p_ptr->y + ddy_ddd[i];
\r
1115 x = p_ptr->x + ddx_ddd[i];
\r
1117 c_ptr = &cave[y][x];
\r
1119 if (c_ptr->m_idx) continue;
\r
1121 /* Skip non-empty grids */
\r
1122 if (!cave_have_flag_grid(c_ptr, FF_MOVE) && !cave_have_flag_grid(c_ptr, FF_CAN_FLY))
\r
1124 if (!player_can_ride_aux(c_ptr, FALSE)) continue;
\r
1127 if (cave_have_flag_grid(c_ptr, FF_PATTERN)) continue;
\r
1129 /* Count "safe" grids */
\r
1132 /* Randomize choice */
\r
1133 if (randint0(sn) > 0) continue;
\r
1135 /* Save the safe location */
\r
1140 monster_desc(m_name, m_ptr, 0);
\r
1142 msg_format("%s
\82©
\82ç
\90U
\82è
\97\8e\82Æ
\82³
\82ê
\82»
\82¤
\82É
\82È
\82Á
\82Ä
\81A
\95Ç
\82É
\82Ô
\82Â
\82©
\82Á
\82½
\81B", m_name);
\r
1143 take_hit(DAMAGE_NOESCAPE, r_ptr->level + 3, "
\95Ç
\82Ö
\82Ì
\8fÕ
\93Ë", -1);
\r
1145 msg_format("You have nearly fallen from %s, but bumped into wall.", m_name);
\r
1146 take_hit(DAMAGE_NOESCAPE, r_ptr->level + 3, "bumping into wall", -1);
\r
1157 /* Redraw the old spot */
\r
1158 lite_spot(oy, ox);
\r
1160 /* Redraw the new spot */
\r
1161 lite_spot(p_ptr->y, p_ptr->x);
\r
1163 /* Check for new panel */
\r
1167 p_ptr->riding = 0;
\r
1168 p_ptr->pet_extra_flags &= ~(PF_RYOUTE);
\r
1169 p_ptr->riding_ryoute = p_ptr->old_riding_ryoute = FALSE;
\r
1173 p_ptr->update |= (PU_BONUS);
\r
1175 /* Update stuff */
\r
1176 p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_MONSTERS);
\r
1178 /* Window stuff */
\r
1179 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
1181 p_ptr->redraw |= (PR_EXTRA);
\r
1183 /* Update health track of mount */
\r
1184 p_ptr->redraw |= (PR_UHEALTH);
\r
1186 if (p_ptr->levitation && !force)
\r
1188 monster_desc(m_name, m_ptr, 0);
\r
1189 msg_format(_("%s
\82©
\82ç
\97\8e\82¿
\82½
\82ª
\81A
\8bó
\92\86\82Å
\82¤
\82Ü
\82
\91Ì
\90¨
\82ð
\97§
\82Ä
\92¼
\82µ
\82Ä
\92\85\92n
\82µ
\82½
\81B", "You are thrown from %s, but make a good landing."), m_name);
\r
1193 take_hit(DAMAGE_NOESCAPE, r_ptr->level + 3, _("
\97\8e\94n", "Falling from riding"), -1);
\r
1197 /* Move the player */
\r
1198 if (sy && !p_ptr->is_dead)
\r
1199 (void)move_player_effect(p_ptr->y, p_ptr->x, MPE_DONT_PICKUP | MPE_DONT_SWAP_MON);
\r