diff options
Diffstat (limited to 'src/modules.c')
-rw-r--r-- | src/modules.c | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/src/modules.c b/src/modules.c new file mode 100644 index 00000000..39b41d20 --- /dev/null +++ b/src/modules.c @@ -0,0 +1,274 @@ +/* File: modules.c */ + +/* Purpose: T-engine modules */ + +/* + * Copyright (c) 2003 DarkGod + * + * This software may be copied and distributed for educational, research, and + * not for profit purposes provided that this copyright and statement are + * included in all such copies. + */ + +#include "angband.h" + +static void module_reset_dir_aux(cptr *dir, cptr new_path) +{ + char buf[1024]; + + /* Build the new path */ + strnfmt(buf, sizeof (buf), "%s%s%s", *dir, PATH_SEP, new_path); + + string_free(*dir); + *dir = string_make(buf); + + /* Make it if needed */ + if (!private_check_user_directory(*dir)) + quit(format("Unable to create module dir %s\n", *dir)); +} + +void module_reset_dir(cptr dir, cptr new_path) +{ + cptr *d = 0; + char buf[1025]; + + if (!strcmp(dir, "apex")) d = &ANGBAND_DIR_APEX; + if (!strcmp(dir, "core")) d = &ANGBAND_DIR_CORE; + if (!strcmp(dir, "dngn")) d = &ANGBAND_DIR_DNGN; + if (!strcmp(dir, "data")) d = &ANGBAND_DIR_DATA; + if (!strcmp(dir, "edit")) d = &ANGBAND_DIR_EDIT; + if (!strcmp(dir, "file")) d = &ANGBAND_DIR_FILE; + if (!strcmp(dir, "help")) d = &ANGBAND_DIR_HELP; + if (!strcmp(dir, "info")) d = &ANGBAND_DIR_INFO; + if (!strcmp(dir, "scpt")) d = &ANGBAND_DIR_SCPT; + if (!strcmp(dir, "patch")) d = &ANGBAND_DIR_PATCH; + if (!strcmp(dir, "pref")) d = &ANGBAND_DIR_PREF; + if (!strcmp(dir, "xtra")) d = &ANGBAND_DIR_XTRA; + if (!strcmp(dir, "user")) d = &ANGBAND_DIR_USER; + if (!strcmp(dir, "note")) d = &ANGBAND_DIR_NOTE; + if (!strcmp(dir, "cmov")) d = &ANGBAND_DIR_CMOV; + if ( +#ifdef PRIVATE_USER_PATH_APEX + !strcmp(dir, "apex") || +#endif + !strcmp(dir, "user") || + !strcmp(dir, "note") || + !strcmp(dir, "cmov")) + { + char user_path[1024]; + /* copied from init_file_paths */ + path_parse(user_path, 1024, PRIVATE_USER_PATH); + strcat(user_path, USER_PATH_VERSION); + strnfmt(buf, 1024, "%s%s%s", user_path, PATH_SEP, new_path); + string_free(*d); + *d = string_make(buf); + } +#ifdef PRIVATE_USER_PATH_DATA + else if (!strcmp(dir, "data")) + { + module_reset_dir_aux(&ANGBAND_DIR_DATA, new_path); + } +#endif + else if (!strcmp(dir, "save")) + { + module_reset_dir_aux(&ANGBAND_DIR_SAVE, new_path); + } + else + { + /* Build the new path */ + strnfmt(buf, 1024, "%s%s%s%s%s", ANGBAND_DIR_MODULES, PATH_SEP, new_path, PATH_SEP, dir); + + string_free(*d); + *d = string_make(buf); + } +} + +static void dump_modules(int sel, int max) +{ + int i; + + char buf[40], pre = ' ', post = ')'; + cptr name; + + char ind; + + + for (i = 0; i < max; i++) + { + ind = I2A(i % 26); + if (i >= 26) ind = toupper(ind); + + if (sel == i) + { + pre = '['; + post = ']'; + } + else + { + pre = ' '; + post = ')'; + } + + call_lua("get_module_name", "(d)", "s", i, &name); + strnfmt(buf, 40, "%c%c%c %s", pre, ind, post, name); + + if (sel == i) + { + call_lua("get_module_desc", "(d)", "s", i, &name); + print_desc_aux(name, 5, 0); + + c_put_str(TERM_L_BLUE, buf, 10 + (i / 4), 20 * (i % 4)); + } + else + put_str(buf, 10 + (i / 4), 20 * (i % 4)); + } +} + +static void activate_module() +{ + /* Initialize the module table */ + call_lua("assign_current_module", "(s)", "", game_module); + + /* Do misc inits */ + call_lua("get_module_info", "(s)", "d", "max_plev", &max_plev); + call_lua("get_module_info", "(s)", "d", "death_dungeon", &DUNGEON_DEATH); + + call_lua("get_module_info", "(s)", "d", "random_artifact_weapon_chance", &RANDART_WEAPON); + call_lua("get_module_info", "(s)", "d", "random_artifact_armor_chance", &RANDART_ARMOR); + call_lua("get_module_info", "(s)", "d", "random_artifact_jewelry_chance", &RANDART_JEWEL); + + call_lua("get_module_info", "(s,d)", "d", "version", 1, &VERSION_MAJOR); + call_lua("get_module_info", "(s,d)", "d", "version", 2, &VERSION_MINOR); + call_lua("get_module_info", "(s,d)", "d", "version", 3, &VERSION_PATCH); + version_major = VERSION_MAJOR; + version_minor = VERSION_MINOR; + version_patch = VERSION_PATCH; + + /* Change window name if needed */ + if (strcmp(game_module, "ToME")) + { + strnfmt(angband_term_name[0], 79, "T-Engine: %s", game_module); + Term_xtra(TERM_XTRA_RENAME_MAIN_WIN, 0); + } + + /* Reprocess the player name, just in case */ + process_player_base(); +} + +/* Did the player force a module on command line */ +cptr force_module = NULL; + +/* Display possible modules and select one */ +bool_ select_module() +{ + s32b k, sel, max; + + /* Init some lua */ + init_lua(); + + /* Some ports need to separate the module scripts from the installed mods, + so we need to check for these in two different places */ + if(!tome_dofile_anywhere(ANGBAND_DIR_CORE, "mods_aux.lua", FALSE)) + tome_dofile_anywhere(ANGBAND_DIR_MODULES, "mods_aux.lua", TRUE); + if(!tome_dofile_anywhere(ANGBAND_DIR_CORE, "modules.lua", FALSE)) + tome_dofile_anywhere(ANGBAND_DIR_MODULES, "modules.lua", TRUE); + + /* Grab the savefiles */ + call_lua("max_modules", "()", "d", &max); + + /* No need to bother the player if there is only one module */ + sel = -1; + if (force_module) + call_lua("find_module", "(s)", "d", force_module, &sel); + if (max == 1) + sel = 0; + if (sel != -1) + { + cptr tmp; + + /* Process the module */ + call_lua("init_module", "(d)", "", sel); + call_lua("get_module_name", "(d)", "s", sel, &tmp); + game_module = string_make(tmp); + + activate_module(); + + return FALSE; + } + + sel = 0; + + /* Preprocess the basic prefs, we need them to have movement keys */ + process_pref_file("pref.prf"); + + while (TRUE) + { + /* Clear screen */ + Term_clear(); + + /* Let the user choose */ + c_put_str(TERM_YELLOW, "Welcome to ToME, you must select a module to play,", 1, 12); + c_put_str(TERM_YELLOW, "either ToME official module or third party ones.", 2, 13); + put_str("Press 8/2/4/6 to move, Return to select and Esc to quit.", 4, 3); + + dump_modules(sel, max); + + k = inkey(); + + if (k == ESCAPE) + { + quit(NULL); + } + if (k == '6') + { + sel++; + if (sel >= max) sel = 0; + continue; + } + else if (k == '4') + { + sel--; + if (sel < 0) sel = max - 1; + continue; + } + else if (k == '2') + { + sel += 4; + if (sel >= max) sel = sel % max; + continue; + } + else if (k == '8') + { + sel -= 4; + if (sel < 0) sel = (sel + max - 1) % max; + continue; + } + else if (k == '\r') + { + if (sel < 26) k = I2A(sel); + else k = toupper(I2A(sel)); + } + + { + int x; + cptr tmp; + + if (islower(k)) x = A2I(k); + else x = A2I(tolower(k)) + 26; + + if ((x < 0) || (x >= max)) continue; + + /* Process the module */ + call_lua("init_module", "(d)", "", x); + call_lua("get_module_name", "(d)", "s", x, &tmp); + game_module = string_make(tmp); + + activate_module(); + + return (FALSE); + } + } + + /* Shouldnt happen */ + return (FALSE); +} |