static void print_players(const Set *players) { ListElmt *member; /***************************************************************************** * * * Display the skills for each player in the set of players. * * * *****************************************************************************/ for (member = list_head(players); member != NULL; member = list_next(member)){ fprintf(stdout, "Player %c\n", *(char *)((KSet *)list_data(member))->key); print_skills(&((KSet *)list_data(member))->set); } return; }
/* * Interreact with skills */ void do_cmd_skill() { int sel = 0, start = 0, max; char c; int table[MAX_SKILLS][2]; int i; int wid, hgt; s16b skill_points_save; s32b *skill_values_save; s32b *skill_mods_save; s16b *skill_rates_save; s16b *skill_invest; s32b *skill_bonus; recalc_skills(TRUE); /* Save the screen */ screen_save(); /* Allocate arrays to save skill values */ C_MAKE(skill_values_save, MAX_SKILLS, s32b); C_MAKE(skill_mods_save, MAX_SKILLS, s32b); C_MAKE(skill_rates_save, MAX_SKILLS, s16b); C_MAKE(skill_invest, MAX_SKILLS, s16b); C_MAKE(skill_bonus, MAX_SKILLS, s32b); /* Save skill points */ skill_points_save = p_ptr->skill_points; /* Save skill values */ for (i = 0; i < max_s_idx; i++) { skill_type *s_ptr = &s_info[i]; skill_values_save[i] = s_ptr->value; skill_mods_save[i] = s_ptr->mod; skill_rates_save[i] = s_ptr->rate; skill_invest[i] = 0; } /* Clear the screen */ Term_clear(); /* Initialise the skill list */ init_table(table, &max, FALSE); while (TRUE) { Term_get_size(&wid, &hgt); /* Display list of skills */ recalc_skills_theory(skill_invest, skill_values_save, skill_mods_save, skill_bonus); print_skills(table, max, sel, start); /* Wait for user input */ c = inkey(); /* Leave the skill screen */ if (c == ESCAPE) break; /* Expand / collapse list of skills */ else if (c == '\r') { if (s_info[table[sel][0]].dev) s_info[table[sel][0]].dev = FALSE; else s_info[table[sel][0]].dev = TRUE; init_table(table, &max, FALSE); } /* Next page */ else if (c == 'n') { sel += (hgt - 7); if (sel >= max) sel = max - 1; } /* Previous page */ else if (c == 'p') { sel -= (hgt - 7); if (sel < 0) sel = 0; } /* Select / increase a skill */ else { int dir; /* Allow use of numpad / arrow keys / roguelike keys */ dir = get_keymap_dir(c); /* Move cursor down */ if (dir == 2) sel++; /* Move cursor up */ if (dir == 8) sel--; /* Miscellaneous skills cannot be increased/decreased as a group */ if (table[sel][0] == SKILL_MISC) continue; /* Increase the current skill */ if (dir == 6) increase_skill(table[sel][0], skill_invest); /* Decrease the current skill */ if (dir == 4) decrease_skill(table[sel][0], skill_invest); /* XXX XXX XXX Wizard mode commands outside of wizard2.c */ /* Increase the skill */ if (wizard && (c == '+')) skill_bonus[table[sel][0]] += SKILL_STEP; /* Decrease the skill */ if (wizard && (c == '-')) skill_bonus[table[sel][0]] -= SKILL_STEP; /* Contextual help */ if (c == '?') exec_lua(format("ingame_help('select_context', 'skill', '%s')", s_info[table[sel][0]].name + s_name)); ; /* Handle boundaries and scrolling */ if (sel < 0) sel = max - 1; if (sel >= max) sel = 0; if (sel < start) start = sel; if (sel >= start + (hgt - 7)) start = sel - (hgt - 7) + 1; } } /* Some skill points are spent */ if (p_ptr->skill_points != skill_points_save) { /* Flush input as we ask an important and irreversible question */ flush(); /* Ask we can commit the change */ if (msg_box("Save and use these skill values? (y/n)", (int)(hgt / 2), (int)(wid / 2)) != 'y') { /* User declines -- restore the skill values before exiting */ /* Restore skill points */ p_ptr->skill_points = skill_points_save; /* Restore skill values */ for (i = 0; i < max_s_idx; i++) { skill_type *s_ptr = &s_info[i]; s_ptr->value = skill_values_save[i]; s_ptr->mod = skill_mods_save[i]; s_ptr->rate = skill_rates_save[i]; } } } /* Free arrays to save skill values */ C_FREE(skill_values_save, MAX_SKILLS, s32b); C_FREE(skill_mods_save, MAX_SKILLS, s32b); C_FREE(skill_rates_save, MAX_SKILLS, s16b); C_FREE(skill_invest, MAX_SKILLS, s16b); C_FREE(skill_bonus, MAX_SKILLS, s32b); /* Load the screen */ screen_load(); recalc_skills(FALSE); }
int main(int argc, char **argv) { Set skills, players, covering; char skills_array[SKILLS_COUNT], subids_array[PLAYER_COUNT]; KSet player_array[PLAYER_COUNT]; int retval, i; /***************************************************************************** * * * Create the set of skills. * * * *****************************************************************************/ fprintf(stdout, "Creating the set of skills\n"); set_init(&skills, match_skill, NULL); skills_array[0] = 'a'; skills_array[1] = 'b'; skills_array[2] = 'c'; skills_array[3] = 'd'; skills_array[4] = 'e'; skills_array[5] = 'f'; skills_array[6] = 'g'; skills_array[7] = 'h'; skills_array[8] = 'i'; skills_array[9] = 'j'; skills_array[10] = 'k'; skills_array[11] = 'l'; for (i = 0; i < SKILLS_COUNT; i++) { if (set_insert(&skills, &skills_array[i]) != 0) return 1; } print_skills(&skills); /***************************************************************************** * * * Create some player sets with certain skills. * * * *****************************************************************************/ fprintf(stdout, "Creating the player subsets\n"); set_init(&players, match_key, NULL); subids_array[0] = '1'; subids_array[1] = '2'; subids_array[2] = '3'; subids_array[3] = '4'; subids_array[4] = '5'; subids_array[5] = '6'; subids_array[6] = '7'; subids_array[7] = '8'; for (i = 0; i < PLAYER_COUNT; i++) { player_array[i].key = &subids_array[i]; set_init(&player_array[i].set, match_skill, NULL); switch (i) { case 0: if (set_insert(&player_array[i].set, &skills_array[0]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[1]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[2]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[3]) != 0) return 1; break; case 1: if (set_insert(&player_array[i].set, &skills_array[4]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[5]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[6]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[7]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[8]) != 0) return 1; break; case 2: if (set_insert(&player_array[i].set, &skills_array[9]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[10]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[11]) != 0) return 1; break; case 3: if (set_insert(&player_array[i].set, &skills_array[0]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[4]) != 0) return 1; break; case 4: if (set_insert(&player_array[i].set, &skills_array[1]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[5]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[6]) != 0) return 1; break; case 5: if (set_insert(&player_array[i].set, &skills_array[2]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[3]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[6]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[7]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[10]) != 0) return 1; if (set_insert(&player_array[i].set, &skills_array[11]) != 0) return 1; break; default: if (set_insert(&player_array[i].set, &skills_array[11]) != 0) return 1; } if (set_insert(&players, &player_array[i]) != 0) return 1; } print_players(&players); /***************************************************************************** * * * Compute the set covering. * * * *****************************************************************************/ fprintf(stdout, "Generating the cover\n"); if ((retval = cover(&skills, &players, &covering)) != 0) return 1; if (retval == 1) fprintf(stderr, "The set could not be covered\n"); else print_players(&covering); /***************************************************************************** * * * Destroy the sets. * * * *****************************************************************************/ fprintf(stdout, "Destroying the sets\n"); for (i = 0; i < PLAYER_COUNT; i++) set_destroy(&player_array[i].set); set_destroy(&skills); return 0; }