int do_cmd_activate_skill_aux() { char which; int max = 0, i, start = 0; int ret; bool mode = FALSE; int *p; cptr *p_desc; C_MAKE(p, max_s_idx + max_ab_idx, int); C_MAKE(p_desc, max_s_idx + max_ab_idx, cptr); /* Count the max */ /* More than 1 melee skill ? */ if (get_melee_skills() > 1) { p_desc[max] = "Change melee mode"; p[max++] = 0; } for (i = 1; i < max_s_idx; i++) { if (s_info[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN))) { int j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (s_info[i].action_mkey == p[j]) { next = TRUE; break; } } if (next) continue; p_desc[max] = s_text + s_info[i].action_desc; p[max++] = s_info[i].action_mkey; } } for (i = 0; i < max_ab_idx; i++) { if (ab_info[i].action_mkey && ab_info[i].acquired) { int j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (ab_info[i].action_mkey == p[j]) { next = TRUE; break; } } if (next) continue; p_desc[max] = ab_text + ab_info[i].action_desc; p[max++] = ab_info[i].action_mkey; } } if (!max) { msg_print("You don't have any activable skills or abilities."); return -1; } character_icky = TRUE; Term_save(); while (1) { print_skill_batch(p, p_desc, start, max, mode); which = inkey(); if (which == ESCAPE) { ret = -1; break; } else if (which == '*' || which == '?' || which == ' ') { mode = (mode) ? FALSE : TRUE; Term_load(); character_icky = FALSE; } else if (which == '+') { start += 20; if (start >= max) start -= 20; Term_load(); character_icky = FALSE; } else if (which == '-') { start -= 20; if (start < 0) start += 20; Term_load(); character_icky = FALSE; } else if (which == '@') { char buf[80]; strcpy(buf, "Cast a spell"); if (!get_string("Skill action? ", buf, 79)) return FALSE; /* Find the skill it is related to */ for (i = 0; i < max; i++) { if (!strcmp(buf, p_desc[i])) break; } if ((i < max)) { ret = p[i]; break; } } else { which = tolower(which); if (start + A2I(which) >= max) { bell(); continue; } if (start + A2I(which) < 0) { bell(); continue; } ret = p[start + A2I(which)]; break; } } Term_load(); character_icky = FALSE; C_FREE(p, max_s_idx + max_ab_idx, int); C_FREE(p_desc, max_s_idx + max_ab_idx, cptr); return ret; }
s32b do_cmd_activate_skill_aux(s32b type) { s32b which; s32b max = 0, i, start = 0; s32b ret = 0, x_idx; bool mode = easy_inven; s32b *p; cptr *p_desc; C_MAKE(p, max_s_idx + max_ab_idx, s32b); C_MAKE(p_desc, max_s_idx + max_ab_idx, cptr); /* Count the max */ /* More than 1 combat skill ? */ if (get_combat_num() > 1) { p_desc[max] = "Change combat mode"; p[max++] = 0; } for (i = 1; i < max_s_idx; i++) { x_idx = s_info[i].action_mkey[type]; if (x_idx && get_skill(i) && (!s_info[i].hidden)) { s32b j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (x_idx == p[j]) { next = TRUE; break; } } if (next) continue; if(process_hooks(HOOK_MKEY_HIDE, "(d,d)", x_idx, type)) continue; p_desc[max] = s_info[i].action_desc[type]; p[max++] = x_idx; } } for (i = 0; i < max_ab_idx; i++) { x_idx = ab_info[i].action_mkey[type]; if (x_idx && ab_info[i].acquired) { s32b j; bool next = FALSE; /* Already got it ? */ for (j = 0; j < max; j++) { if (x_idx == p[j]) { next = TRUE; break; } } if (next) continue; if(process_hooks(HOOK_MKEY_HIDE, "(d,d)", x_idx, type)) continue; p_desc[max] = ab_info[i].action_desc[type]; p[max++] = x_idx; } } if (!max) { msg_print("You don't have any activable skills or abilities."); return -1; } character_icky++; Term_save(); while (1) { print_skill_batch(p, p_desc, start, max, mode); which = inkey(); if (which == ESCAPE) { ret = -1; break; } else if (which == '*' || which == '?' || which == ' ') { mode = (mode) ? FALSE : TRUE; Term_load(); Term_save(); } else if (which == '+') { start += 20; if (start >= max) start -= 20; Term_load(); Term_save(); } else if (which == '-') { start -= 20; if (start < 0) start += 20; Term_load(); Term_save(); } else if (which == '@') { char buf[80]; strcpy(buf, "Cast a spell"); if (!get_string("Skill action? ", buf, 79)) break; /* Find the skill it is related to */ for (i = 0; i < max; i++) { if (!strcmp(buf, p_desc[i])) break; } if ((i < max)) { ret = p[i]; break; } } else { which = tolower(which); if (start + A2I(which) >= max) { bell(); continue; } if (start + A2I(which) < 0) { bell(); continue; } ret = p[start + A2I(which)]; break; } } Term_load(); character_icky--; C_FREE(p, max_s_idx + max_ab_idx, s32b); C_FREE(p_desc, max_s_idx + max_ab_idx, cptr); return ret; }