X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Finit2.c;h=2b18c02562e09241e5ddcfd9b12ebb90596c6c1a;hb=52cf2aa925c00e45d0ddf8eee956eb1af5f29b2d;hp=9675322bffb984d24ddeb6e6ec3cc3d5db41cc97;hpb=4d533cfdd56a7c66244fe99c9b0b3e07622effca;p=hengband%2Fhengband.git diff --git a/src/init2.c b/src/init2.c index 9675322bf..2b18c0256 100644 --- a/src/init2.c +++ b/src/init2.c @@ -1,5 +1,13 @@ /* File: init2.c */ +/* + * Copyright (c) 1997 Ben Harrison + * + * 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. Other copyrights may also apply. + */ + /* Purpose: Initialization (part 2) -BEN- */ #include "angband.h" @@ -173,7 +181,7 @@ void init_file_paths(char *path) #ifdef PRIVATE_USER_PATH /* Build the path to the user specific directory */ - path_build(buf, 1024, PRIVATE_USER_PATH, VERSION_NAME); + path_build(buf, sizeof(buf), PRIVATE_USER_PATH, VERSION_NAME); /* Build a relative path name */ ANGBAND_DIR_USER = string_make(buf); @@ -245,29 +253,22 @@ int error_line; /* - * Hack -- help initialize the fake "name" and "text" arrays when - * parsing an "ascii" template file. - */ -u32b fake_name_size; -u32b fake_text_size; - - -/* * Standard error message text */ cptr err_str[PARSE_ERROR_MAX] = { NULL, #ifdef JP - "ʸˡ¥¨¥é¡¼", - "¸Å¤¤¥Õ¥¡¥¤¥ë", - "µ­Ï¿¥Ø¥Ã¥À¤¬¤Ê¤¤", - "ÉÔϢ³¥ì¥³¡¼¥É", - "¤ª¤«¤·¤Ê¥Õ¥é¥°Â¸ºß", - "̤ÄêµÁÌ¿Îá", - "¥á¥â¥êÉÔ­", - "ºÂɸÈϰϳ°", - "°ú¿ôÉÔ­", + "ʸˡ¥¨¥é¡¼", + "¸Å¤¤¥Õ¥¡¥¤¥ë", + "µ­Ï¿¥Ø¥Ã¥À¤¬¤Ê¤¤", + "ÉÔϢ³¥ì¥³¡¼¥É", + "¤ª¤«¤·¤Ê¥Õ¥é¥°Â¸ºß", + "̤ÄêµÁÌ¿Îá", + "¥á¥â¥êÉÔ­", + "ºÂɸÈϰϳ°", + "°ú¿ôÉÔ­", + "̤ÄêµÁÃÏ·Á¥¿¥°", #else "parse error", "obsolete file", @@ -278,6 +279,7 @@ cptr err_str[PARSE_ERROR_MAX] = "out of memory", "coordinates out of bounds", "too few arguments", + "undefined terrain tag", #endif }; @@ -308,7 +310,7 @@ static errr check_modification_date(int fd, cptr template_file) struct stat txt_stat, raw_stat; /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_EDIT, template_file); + path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, template_file); /* Access stats on text file */ if (stat(buf, &txt_stat)) @@ -352,7 +354,6 @@ static errr init_info_raw(int fd, header *head) (test.v_major != head->v_major) || (test.v_minor != head->v_minor) || (test.v_patch != head->v_patch) || - (test.v_extra != head->v_extra) || (test.info_num != head->info_num) || (test.info_len != head->info_len) || (test.head_size != head->head_size) || @@ -393,6 +394,17 @@ static errr init_info_raw(int fd, header *head) fd_read(fd, head->text_ptr, head->text_size); } + + if (head->tag_size) + { + /* Allocate the "*_tag" array */ + C_MAKE(head->tag_ptr, head->tag_size, char); + + /* Read the "*_tag" array */ + fd_read(fd, head->tag_ptr, head->tag_size); + } + + /* Success */ return (0); } @@ -427,7 +439,7 @@ static void init_header(header *head, int num, int len) * even if the string happens to be empty (everyone has a unique '\0'). */ static errr init_info(cptr filename, header *head, - void **info, char **name, char **text) + void **info, char **name, char **text, char **tag) { int fd; @@ -447,9 +459,9 @@ static errr init_info(cptr filename, header *head, /* Build the filename */ #ifdef JP - path_build(buf, 1024, ANGBAND_DIR_DATA, format("%s_j.raw", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format("%s_j.raw", filename)); #else - path_build(buf, 1024, ANGBAND_DIR_DATA, format("%s.raw", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format("%s.raw", filename)); #endif @@ -461,7 +473,7 @@ static errr init_info(cptr filename, header *head, { #ifdef CHECK_MODIFICATION_TIME - err = check_modification_date(fd, format("%s_j.txt", filename)); + err = check_modification_date(fd, format("%s.txt", filename)); #endif /* CHECK_MODIFICATION_TIME */ @@ -479,33 +491,31 @@ static errr init_info(cptr filename, header *head, { /*** Make the fake arrays ***/ - /* Assume the size of "*_name" and "*_text" */ - fake_name_size = FAKE_NAME_SIZE; - fake_text_size = FAKE_TEXT_SIZE; - /* Allocate the "*_info" array */ C_MAKE(head->info_ptr, head->info_size, char); /* Hack -- make "fake" arrays */ - if (name) C_MAKE(head->name_ptr, fake_name_size, char); - if (text) C_MAKE(head->text_ptr, fake_text_size, char); + if (name) C_MAKE(head->name_ptr, FAKE_NAME_SIZE, char); + if (text) C_MAKE(head->text_ptr, FAKE_TEXT_SIZE, char); + if (tag) C_MAKE(head->tag_ptr, FAKE_TAG_SIZE, char); if (info) (*info) = head->info_ptr; if (name) (*name) = head->name_ptr; if (text) (*text) = head->text_ptr; + if (tag) (*tag) = head->tag_ptr; /*** Load the ascii template file ***/ /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_EDIT, format("%s_j.txt", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, format("%s.txt", filename)); /* Open the file */ fp = my_fopen(buf, "r"); /* Parse it */ #ifdef JP - if (!fp) quit(format("'%s_j.txt'¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤Ç¤­¤Þ¤»¤ó¡£", filename)); + if (!fp) quit(format("'%s.txt'¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤Ç¤­¤Þ¤»¤ó¡£", filename)); #else if (!fp) quit(format("Cannot open '%s.txt' file.", filename)); #endif @@ -524,16 +534,16 @@ static errr init_info(cptr filename, header *head, #ifdef JP /* Error string */ - oops = ((err > 0) ? err_str[err] : "̤ÃΤÎ"); + oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : "̤ÃΤÎ"); /* Oops */ - msg_format("'%s_j.txt'¥Õ¥¡¥¤¥ë¤Î %d ¹ÔÌܤ˥¨¥é¡¼¡£", filename, error_line); + msg_format("'%s.txt'¥Õ¥¡¥¤¥ë¤Î %d ¹ÔÌܤ˥¨¥é¡¼¡£", filename, error_line); msg_format("¥ì¥³¡¼¥É %d ¤Ï '%s' ¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹¡£", error_idx, oops); msg_format("¹½Ê¸ '%s'¡£", buf); msg_print(NULL); /* Quit */ - quit(format("'%s_j.txt'¥Õ¥¡¥¤¥ë¤Ë¥¨¥é¡¼", filename)); + quit(format("'%s.txt'¥Õ¥¡¥¤¥ë¤Ë¥¨¥é¡¼", filename)); #else /* Error string */ oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : "unknown"); @@ -551,6 +561,14 @@ static errr init_info(cptr filename, header *head, } + /*** Make final retouch on fake tags ***/ + + if (head->retouch) + { + (*head->retouch)(head); + } + + /*** Dump the binary image file ***/ /* File type is "DATA" */ @@ -558,25 +576,31 @@ static errr init_info(cptr filename, header *head, /* Build the filename */ #ifdef JP - path_build(buf, 1024, ANGBAND_DIR_DATA, format("%s_j.raw", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format("%s_j.raw", filename)); #else - path_build(buf, 1024, ANGBAND_DIR_DATA, format("%s.raw", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format("%s.raw", filename)); #endif + /* Grab permissions */ + safe_setuid_grab(); + /* Kill the old file */ (void)fd_kill(buf); /* Attempt to create the raw file */ fd = fd_make(buf, mode); + /* Drop permissions */ + safe_setuid_drop(); + /* Dump to the file */ if (fd >= 0) { /* Dump it */ fd_write(fd, (cptr)(head), head->head_size); - /* Dump the "*_info" array */ + /* Dump the "*_info" array */ fd_write(fd, head->info_ptr, head->info_size); /* Dump the "*_name" array */ @@ -585,6 +609,9 @@ static errr init_info(cptr filename, header *head, /* Dump the "*_text" array */ fd_write(fd, head->text_ptr, head->text_size); + /* Dump the "*_tag" array */ + fd_write(fd, head->tag_ptr, head->tag_size); + /* Close */ (void)fd_close(fd); } @@ -596,12 +623,9 @@ static errr init_info(cptr filename, header *head, C_KILL(head->info_ptr, head->info_size, char); /* Hack -- Free the "fake" arrays */ - if (name) C_KILL(head->name_ptr, fake_name_size, char); - if (text) C_KILL(head->text_ptr, fake_text_size, char); - - /* Forget the array sizes */ - fake_name_size = 0; - fake_text_size = 0; + if (name) C_KILL(head->name_ptr, FAKE_NAME_SIZE, char); + if (text) C_KILL(head->text_ptr, FAKE_TEXT_SIZE, char); + if (tag) C_KILL(head->tag_ptr, FAKE_TAG_SIZE, char); #endif /* ALLOW_TEMPLATES */ @@ -610,9 +634,9 @@ static errr init_info(cptr filename, header *head, /* Build the filename */ #ifdef JP - path_build(buf, 1024, ANGBAND_DIR_DATA, format("%s_j.raw", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format("%s_j.raw", filename)); #else - path_build(buf, 1024, ANGBAND_DIR_DATA, format("%s.raw", filename)); + path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, format("%s.raw", filename)); #endif @@ -647,6 +671,7 @@ static errr init_info(cptr filename, header *head, if (info) (*info) = head->info_ptr; if (name) (*name) = head->name_ptr; if (text) (*text) = head->text_ptr; + if (tag) (*tag) = head->tag_ptr; /* Success */ return (0); @@ -666,10 +691,13 @@ static errr init_f_info(void) /* Save a pointer to the parsing function */ f_head.parse_info_txt = parse_f_info; + /* Save a pointer to the retouch fake tags */ + f_head.retouch = retouch_f_info; + #endif /* ALLOW_TEMPLATES */ return init_info("f_info", &f_head, - (void*)&f_info, (void*)&f_name, (void*)&f_text); + (void*)&f_info, &f_name, NULL, &f_tag); } @@ -689,7 +717,7 @@ static errr init_k_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("k_info", &k_head, - (void*)&k_info, (void*)&k_name, (void*)&k_text); + (void*)&k_info, &k_name, &k_text, NULL); } @@ -710,7 +738,7 @@ static errr init_a_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("a_info", &a_head, - (void*)&a_info, (void*)&a_name, (void*)&a_text); + (void*)&a_info, &a_name, &a_text, NULL); } @@ -731,7 +759,7 @@ static errr init_e_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("e_info", &e_head, - (void*)&e_info, (void*)&e_name, (void*)&e_text); + (void*)&e_info, &e_name, &e_text, NULL); } @@ -752,7 +780,7 @@ static errr init_r_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("r_info", &r_head, - (void*)&r_info, (void*)&r_name, (void*)&r_text); + (void*)&r_info, &r_name, &r_text, NULL); } @@ -773,7 +801,7 @@ static errr init_d_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("d_info", &d_head, - (void*)&d_info, (void*)&d_name, (void*)&d_text); + (void*)&d_info, &d_name, &d_text, NULL); } @@ -796,7 +824,7 @@ errr init_v_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("v_info", &v_head, - (void*)&v_info, (void*)&v_name, (void*)&v_text); + (void*)&v_info, &v_name, &v_text, NULL); } @@ -816,7 +844,7 @@ static errr init_s_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("s_info", &s_head, - (void*)&s_info, (void*)&s_name, (void*)&s_text); + (void*)&s_info, NULL, NULL, NULL); } @@ -836,7 +864,7 @@ static errr init_m_info(void) #endif /* ALLOW_TEMPLATES */ return init_info("m_info", &m_head, - (void*)&m_info, (void*)&m_name, (void*)&m_text); + (void*)&m_info, NULL, NULL, NULL); } @@ -896,16 +924,14 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_FOOD, SV_FOOD_RATION }, { TV_FOOD, SV_FOOD_RATION }, - { TV_LITE, SV_LITE_TORCH }, - { TV_LITE, SV_LITE_TORCH }, + { TV_POTION, SV_POTION_WATER }, + { TV_POTION, SV_POTION_WATER }, { TV_LITE, SV_LITE_LANTERN }, { TV_LITE, SV_LITE_LANTERN }, - { TV_FLASK, 0 }, - { TV_FLASK, 0 }, - + { TV_FOOD, SV_FOOD_WAYBREAD }, + { TV_FOOD, SV_FOOD_WAYBREAD }, { TV_CAPTURE, 0 }, - { TV_FIGURINE, 0 }, { TV_SHOT, SV_AMMO_NORMAL }, @@ -1011,30 +1037,30 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_BOW, SV_SLING }, { TV_BOW, SV_SHORT_BOW }, - { TV_BOW, SV_LONG_BOW }, { TV_BOW, SV_LIGHT_XBOW }, { TV_SHOT, SV_AMMO_NORMAL }, { TV_SHOT, SV_AMMO_NORMAL }, - { TV_ARROW, SV_AMMO_NORMAL }, + { TV_ARROW, SV_AMMO_NORMAL }, { TV_BOLT, SV_AMMO_NORMAL }, { TV_BOLT, SV_AMMO_NORMAL }, - - { TV_BOW, SV_LONG_BOW }, { TV_BOW, SV_LIGHT_XBOW }, + { TV_ARROW, SV_AMMO_NORMAL }, { TV_BOLT, SV_AMMO_NORMAL }, - { TV_BOW, SV_SHORT_BOW }, + { TV_BOW, SV_LIGHT_XBOW }, + { TV_SWORD, SV_DAGGER }, { TV_SWORD, SV_TANTO }, { TV_SWORD, SV_RAPIER }, - { TV_SWORD, SV_SMALL_SWORD }, + { TV_SWORD, SV_SHORT_SWORD }, { TV_SWORD, SV_LONG_SWORD }, { TV_SWORD, SV_SCIMITAR }, + { TV_SWORD, SV_BROAD_SWORD }, { TV_HISSATSU_BOOK, 0 }, { TV_HISSATSU_BOOK, 0 }, @@ -1077,14 +1103,14 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_LIFE_BOOK, 0 }, { TV_LIFE_BOOK, 0 }, - { TV_LIFE_BOOK, 0 }, - { TV_LIFE_BOOK, 0 }, - - { TV_LIFE_BOOK, 1 }, - { TV_LIFE_BOOK, 1 }, { TV_LIFE_BOOK, 1 }, { TV_LIFE_BOOK, 1 }, + { TV_CRUSADE_BOOK, 0 }, + { TV_CRUSADE_BOOK, 0 }, + { TV_CRUSADE_BOOK, 1 }, + { TV_CRUSADE_BOOK, 1 }, + { TV_HAFTED, SV_WHIP }, { TV_HAFTED, SV_MACE }, { TV_HAFTED, SV_BALL_AND_CHAIN }, @@ -1132,7 +1158,7 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_SCROLL, SV_SCROLL_DETECT_INVIS }, { TV_SCROLL, SV_SCROLL_RECHARGING }, - { TV_SCROLL, SV_SCROLL_SATISFY_HUNGER }, + { TV_SCROLL, SV_SCROLL_TELEPORT }, { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL }, { TV_SCROLL, SV_SCROLL_WORD_OF_RECALL }, @@ -1166,9 +1192,9 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_SCROLL, SV_SCROLL_ENCHANT_ARMOR }, { TV_SCROLL, SV_SCROLL_RECHARGING }, - { TV_SCROLL, SV_SCROLL_SATISFY_HUNGER }, - { TV_SCROLL, SV_SCROLL_SATISFY_HUNGER }, - { TV_SCROLL, SV_SCROLL_SATISFY_HUNGER } + { TV_SCROLL, SV_SCROLL_PHASE_DOOR }, + { TV_SCROLL, SV_SCROLL_ENCHANT_WEAPON_TO_HIT }, + { TV_SCROLL, SV_SCROLL_ENCHANT_WEAPON_TO_DAM }, }, @@ -1176,7 +1202,7 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = /* Magic-User store */ { TV_RING, SV_RING_PROTECTION }, - { TV_RING, SV_RING_FEATHER_FALL }, + { TV_RING, SV_RING_LEVITATION_FALL }, { TV_RING, SV_RING_PROTECTION }, { TV_RING, SV_RING_RESIST_FIRE }, @@ -1342,10 +1368,10 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_ARCANE_BOOK, 2 }, { TV_ARCANE_BOOK, 3 }, - { TV_ENCHANT_BOOK, 0 }, - { TV_ENCHANT_BOOK, 0 }, - { TV_ENCHANT_BOOK, 1 }, - { TV_ENCHANT_BOOK, 1 }, + { TV_CRAFT_BOOK, 0 }, + { TV_CRAFT_BOOK, 0 }, + { TV_CRAFT_BOOK, 1 }, + { TV_CRAFT_BOOK, 1 }, { TV_DAEMON_BOOK, 0 }, { TV_DAEMON_BOOK, 0 }, @@ -1356,6 +1382,11 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = { TV_MUSIC_BOOK, 0 }, { TV_MUSIC_BOOK, 1 }, { TV_MUSIC_BOOK, 1 }, + + { TV_HEX_BOOK, 0 }, + { TV_HEX_BOOK, 0 }, + { TV_HEX_BOOK, 1 }, + { TV_HEX_BOOK, 1 }, }, { @@ -1402,7 +1433,7 @@ static byte store_table[MAX_STORES][STORE_CHOICES][2] = static errr init_misc(void) { /* Initialize the values */ - process_dungeon_file("misc_j.txt", 0, 0, 0, 0); + process_dungeon_file("misc.txt", 0, 0, 0, 0); return 0; } @@ -1563,6 +1594,165 @@ static errr init_quests(void) } +static bool feat_tag_is_not_found = FALSE; + + +s16b f_tag_to_index_in_init(cptr str) +{ + s16b feat = f_tag_to_index(str); + + if (feat < 0) feat_tag_is_not_found = TRUE; + + return feat; +} + + +/* + * Initialize feature variables + */ +static errr init_feat_variables(void) +{ + int i; + + /* Nothing */ + feat_none = f_tag_to_index_in_init("NONE"); + + /* Floor */ + feat_floor = f_tag_to_index_in_init("FLOOR"); + + /* Objects */ + feat_glyph = f_tag_to_index_in_init("GLYPH"); + feat_explosive_rune = f_tag_to_index_in_init("EXPLOSIVE_RUNE"); + feat_mirror = f_tag_to_index_in_init("MIRROR"); + + /* Doors */ + feat_door[DOOR_DOOR].open = f_tag_to_index_in_init("OPEN_DOOR"); + feat_door[DOOR_DOOR].broken = f_tag_to_index_in_init("BROKEN_DOOR"); + feat_door[DOOR_DOOR].closed = f_tag_to_index_in_init("CLOSED_DOOR"); + + /* Locked doors */ + for (i = 1; i < MAX_LJ_DOORS; i++) + { + s16b door = f_tag_to_index(format("LOCKED_DOOR_%d", i)); + if (door < 0) break; + feat_door[DOOR_DOOR].locked[i - 1] = door; + } + if (i == 1) return PARSE_ERROR_UNDEFINED_TERRAIN_TAG; + feat_door[DOOR_DOOR].num_locked = i - 1; + + /* Jammed doors */ + for (i = 0; i < MAX_LJ_DOORS; i++) + { + s16b door = f_tag_to_index(format("JAMMED_DOOR_%d", i)); + if (door < 0) break; + feat_door[DOOR_DOOR].jammed[i] = door; + } + if (!i) return PARSE_ERROR_UNDEFINED_TERRAIN_TAG; + feat_door[DOOR_DOOR].num_jammed = i; + + /* Glass doors */ + feat_door[DOOR_GLASS_DOOR].open = f_tag_to_index_in_init("OPEN_GLASS_DOOR"); + feat_door[DOOR_GLASS_DOOR].broken = f_tag_to_index_in_init("BROKEN_GLASS_DOOR"); + feat_door[DOOR_GLASS_DOOR].closed = f_tag_to_index_in_init("CLOSED_GLASS_DOOR"); + + /* Locked glass doors */ + for (i = 1; i < MAX_LJ_DOORS; i++) + { + s16b door = f_tag_to_index(format("LOCKED_GLASS_DOOR_%d", i)); + if (door < 0) break; + feat_door[DOOR_GLASS_DOOR].locked[i - 1] = door; + } + if (i == 1) return PARSE_ERROR_UNDEFINED_TERRAIN_TAG; + feat_door[DOOR_GLASS_DOOR].num_locked = i - 1; + + /* Jammed glass doors */ + for (i = 0; i < MAX_LJ_DOORS; i++) + { + s16b door = f_tag_to_index(format("JAMMED_GLASS_DOOR_%d", i)); + if (door < 0) break; + feat_door[DOOR_GLASS_DOOR].jammed[i] = door; + } + if (!i) return PARSE_ERROR_UNDEFINED_TERRAIN_TAG; + feat_door[DOOR_GLASS_DOOR].num_jammed = i; + + /* Curtains */ + feat_door[DOOR_CURTAIN].open = f_tag_to_index_in_init("OPEN_CURTAIN"); + feat_door[DOOR_CURTAIN].broken = feat_door[DOOR_CURTAIN].open; + feat_door[DOOR_CURTAIN].closed = f_tag_to_index_in_init("CLOSED_CURTAIN"); + feat_door[DOOR_CURTAIN].locked[0] = feat_door[DOOR_CURTAIN].closed; + feat_door[DOOR_CURTAIN].num_locked = 1; + feat_door[DOOR_CURTAIN].jammed[0] = feat_door[DOOR_CURTAIN].closed; + feat_door[DOOR_CURTAIN].num_jammed = 1; + + /* Stairs */ + feat_up_stair = f_tag_to_index_in_init("UP_STAIR"); + feat_down_stair = f_tag_to_index_in_init("DOWN_STAIR"); + feat_entrance = f_tag_to_index_in_init("ENTRANCE"); + + /* Normal traps */ + init_normal_traps(); + + /* Special traps */ + feat_trap_open = f_tag_to_index_in_init("TRAP_OPEN"); + feat_trap_armageddon = f_tag_to_index_in_init("TRAP_ARMAGEDDON"); + feat_trap_piranha = f_tag_to_index_in_init("TRAP_PIRANHA"); + + /* Rubble */ + feat_rubble = f_tag_to_index_in_init("RUBBLE"); + + /* Seams */ + feat_magma_vein = f_tag_to_index_in_init("MAGMA_VEIN"); + feat_quartz_vein = f_tag_to_index_in_init("QUARTZ_VEIN"); + + /* Walls */ + feat_granite = f_tag_to_index_in_init("GRANITE"); + feat_permanent = f_tag_to_index_in_init("PERMANENT"); + + /* Glass floor */ + feat_glass_floor = f_tag_to_index_in_init("GLASS_FLOOR"); + + /* Glass walls */ + feat_glass_wall = f_tag_to_index_in_init("GLASS_WALL"); + feat_permanent_glass_wall = f_tag_to_index_in_init("PERMANENT_GLASS_WALL"); + + /* Pattern */ + feat_pattern_start = f_tag_to_index_in_init("PATTERN_START"); + feat_pattern_1 = f_tag_to_index_in_init("PATTERN_1"); + feat_pattern_2 = f_tag_to_index_in_init("PATTERN_2"); + feat_pattern_3 = f_tag_to_index_in_init("PATTERN_3"); + feat_pattern_4 = f_tag_to_index_in_init("PATTERN_4"); + feat_pattern_end = f_tag_to_index_in_init("PATTERN_END"); + feat_pattern_old = f_tag_to_index_in_init("PATTERN_OLD"); + feat_pattern_exit = f_tag_to_index_in_init("PATTERN_EXIT"); + feat_pattern_corrupted = f_tag_to_index_in_init("PATTERN_CORRUPTED"); + + /* Various */ + feat_black_market = f_tag_to_index_in_init("BLACK_MARKET"); + feat_town = f_tag_to_index_in_init("TOWN"); + + /* Terrains */ + feat_deep_water = f_tag_to_index_in_init("DEEP_WATER"); + feat_shallow_water = f_tag_to_index_in_init("SHALLOW_WATER"); + feat_deep_lava = f_tag_to_index_in_init("DEEP_LAVA"); + feat_shallow_lava = f_tag_to_index_in_init("SHALLOW_LAVA"); + feat_dirt = f_tag_to_index_in_init("DIRT"); + feat_grass = f_tag_to_index_in_init("GRASS"); + feat_flower = f_tag_to_index_in_init("FLOWER"); + feat_brake = f_tag_to_index_in_init("BRAKE"); + feat_tree = f_tag_to_index_in_init("TREE"); + feat_mountain = f_tag_to_index_in_init("MOUNTAIN"); + feat_swamp = f_tag_to_index_in_init("SWAMP"); + + /* Unknown grid (not detected) */ + feat_undetected = f_tag_to_index_in_init("UNDETECTED"); + + /* Wilderness terrains */ + init_wilderness_terrains(); + + return feat_tag_is_not_found ? PARSE_ERROR_UNDEFINED_TERRAIN_TAG : 0; +} + + /* * Initialize some other arrays */ @@ -1579,8 +1769,14 @@ static errr init_other(void) /* Allocate and Wipe the monster list */ C_MAKE(m_list, max_m_idx, monster_type); - /* Allocate and Wipe the max dungeon level */ - C_MAKE(max_dlv, max_d_idx, s16b); + /* Allocate and Wipe the monster process list */ + for (i = 0; i < MAX_MTIMED; i++) + { + C_MAKE(mproc_list[i], max_m_idx, s16b); + } + + /* Allocate and Wipe the max dungeon level */ + C_MAKE(max_dlv, max_d_idx, s16b); /* Allocate and wipe each line of the cave */ for (i = 0; i < MAX_HGT; i++) @@ -1601,7 +1797,7 @@ static errr init_other(void) C_MAKE(macro__buf, 1024, char); /* Quark variables */ - C_MAKE(quark__str, QUARK_MAX, cptr); + quark_init(); /* Message variables */ C_MAKE(message__ptr, MESSAGE_MAX, u16b); @@ -1617,47 +1813,6 @@ static errr init_other(void) C_MAKE(inventory, INVEN_TOTAL, object_type); - /*** Pre-allocate the basic "auto-inscriptions" ***/ - - /* The "basic" feelings */ -#ifdef JP - (void)quark_add("¼ö¤ï¤ì¤Æ¤¤¤ë"); - (void)quark_add("²õ¤ì¤Æ¤¤¤ë"); - (void)quark_add("ÊÂ"); - (void)quark_add("¾å¼Á"); -#else - (void)quark_add("cursed"); - (void)quark_add("broken"); - (void)quark_add("average"); - (void)quark_add("good"); -#endif - - - /* The "extra" feelings */ -#ifdef JP - (void)quark_add("¹âµéÉÊ"); - (void)quark_add("̵²ÁÃÍ"); - (void)quark_add("ÆÃÊÌÀ½"); - (void)quark_add("¶²¤í¤·¤¤"); -#else - (void)quark_add("excellent"); - (void)quark_add("worthless"); - (void)quark_add("special"); - (void)quark_add("terrible"); -#endif - - - /* Some extra strings */ -#ifdef JP - (void)quark_add("¼ö¤¤¤Ê¤·"); - (void)quark_add("Çä½ÐÃæ"); -#else - (void)quark_add("uncursed"); - (void)quark_add("on sale"); -#endif - - - /*** Prepare the options ***/ /* Scan the options */ @@ -1703,6 +1858,14 @@ static errr init_other(void) } } + /* + * Set the "default" window flags + * Window 1 : Display messages + * Window 2 : Display inven/equip + */ + window_flag[1] = 1L << 6; + window_flag[2] = 1L << 0; + /*** Pre-allocate space for the "format()" buffer ***/ @@ -1715,6 +1878,121 @@ static errr init_other(void) } +/* + * Initialize some other arrays + */ +static errr init_object_alloc(void) +{ + int i, j; + object_kind *k_ptr; + alloc_entry *table; + s16b num[MAX_DEPTH]; + s16b aux[MAX_DEPTH]; + + + /*** Analyze object allocation info ***/ + + /* Clear the "aux" array */ + (void)C_WIPE(&aux, MAX_DEPTH, s16b); + + /* Clear the "num" array */ + (void)C_WIPE(&num, MAX_DEPTH, s16b); + + /* Free the old "alloc_kind_table" (if it exists) */ + if (alloc_kind_table) + { + C_KILL(alloc_kind_table, alloc_kind_size, alloc_entry); + } + + /* Size of "alloc_kind_table" */ + alloc_kind_size = 0; + + /* Scan the objects */ + for (i = 1; i < max_k_idx; i++) + { + k_ptr = &k_info[i]; + + /* Scan allocation pairs */ + for (j = 0; j < 4; j++) + { + /* Count the "legal" entries */ + if (k_ptr->chance[j]) + { + /* Count the entries */ + alloc_kind_size++; + + /* Group by level */ + num[k_ptr->locale[j]]++; + } + } + } + + /* Collect the level indexes */ + for (i = 1; i < MAX_DEPTH; i++) + { + /* Group by level */ + num[i] += num[i-1]; + } + + /* Paranoia */ +#ifdef JP +if (!num[0]) quit("Ä®¤Î¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¡ª"); +#else + if (!num[0]) quit("No town objects!"); +#endif + + + + /*** Initialize object allocation info ***/ + + /* Allocate the alloc_kind_table */ + C_MAKE(alloc_kind_table, alloc_kind_size, alloc_entry); + + /* Access the table entry */ + table = alloc_kind_table; + + /* Scan the objects */ + for (i = 1; i < max_k_idx; i++) + { + k_ptr = &k_info[i]; + + /* Scan allocation pairs */ + for (j = 0; j < 4; j++) + { + /* Count the "legal" entries */ + if (k_ptr->chance[j]) + { + int p, x, y, z; + + /* Extract the base level */ + x = k_ptr->locale[j]; + + /* Extract the base probability */ + p = (100 / k_ptr->chance[j]); + + /* Skip entries preceding our locale */ + y = (x > 0) ? num[x-1] : 0; + + /* Skip previous entries at this locale */ + z = y + aux[x]; + + /* Load the entry */ + table[z].index = i; + table[z].level = x; + table[z].prob1 = p; + table[z].prob2 = p; + table[z].prob3 = p; + + /* Another entry complete for this locale */ + aux[x]++; + } + } + } + + /* Success */ + return (0); +} + /* * Initialize some other arrays @@ -1735,7 +2013,7 @@ static errr init_alloc(void) for (i = 1; i < max_r_idx; i++) { elements[i].tag = r_info[i].level; - elements[i].pointer = (void*)i; + elements[i].index = i; } tag_sort(elements, max_r_idx); @@ -1752,7 +2030,7 @@ static errr init_alloc(void) for (i = 1; i < max_r_idx; i++) { /* Get the i'th race */ - r_ptr = &r_info[(int)elements[i].pointer]; + r_ptr = &r_info[elements[i].index]; /* Count valid pairs */ if (r_ptr->rarity) @@ -1766,7 +2044,7 @@ static errr init_alloc(void) p = (100 / r_ptr->rarity); /* Load the entry */ - alloc_race_table[i].index = (int)elements[i].pointer; + alloc_race_table[i].index = elements[i].index; alloc_race_table[i].level = x; alloc_race_table[i].prob1 = p; alloc_race_table[i].prob2 = p; @@ -1774,6 +2052,9 @@ static errr init_alloc(void) } } + /* Free the "r_info" array */ + C_KILL(elements, max_r_idx, tag_type); + #else /* SORT_R_INFO */ int j; @@ -1983,7 +2264,7 @@ void init_angband(void) { int fd = -1; - int mode = 0644; + int mode = 0664; FILE *fp; @@ -1994,9 +2275,9 @@ void init_angband(void) /* Build the filename */ #ifdef JP - path_build(buf, 1024, ANGBAND_DIR_FILE, "news_j.txt"); + path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news_j.txt"); #else - path_build(buf, 1024, ANGBAND_DIR_FILE, "news.txt"); + path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news.txt"); #endif @@ -2031,9 +2312,9 @@ void init_angband(void) /* Build the filename */ #ifdef JP - path_build(buf, 1024, ANGBAND_DIR_FILE, "news_j.txt"); + path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news_j.txt"); #else - path_build(buf, 1024, ANGBAND_DIR_FILE, "news.txt"); + path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, "news.txt"); #endif @@ -2046,7 +2327,7 @@ void init_angband(void) int i = 0; /* Dump the file to the screen */ - while (0 == my_fgets(fp, buf, 1024)) + while (0 == my_fgets(fp, buf, sizeof(buf))) { /* Display and advance */ Term_putstr(0, i++, -1, TERM_WHITE, buf); @@ -2057,13 +2338,13 @@ void init_angband(void) } /* Flush it */ - Term_fresh(); + Term_flush(); /*** Verify (or create) the "high score" file ***/ /* Build the filename */ - path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw"); + path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw"); /* Attempt to open the high score file */ fd = fd_open(buf, O_RDONLY); @@ -2074,9 +2355,15 @@ void init_angband(void) /* File type is "DATA" */ FILE_TYPE(FILE_TYPE_DATA); + /* Grab permissions */ + safe_setuid_grab(); + /* Create a new high score file */ fd = fd_make(buf, mode); + /* Drop permissions */ + safe_setuid_drop(); + /* Failure */ if (fd < 0) { @@ -2115,28 +2402,15 @@ if (init_misc()) quit(" #endif -#ifdef USE_SCRIPT -#ifdef JP -note("[¥¹¥¯¥ê¥×¥È¤ò½é´ü²½¤·¤Æ¤¤¤Þ¤¹... ]"); -#else - note("[Initializing scripts... ]"); -#endif - -#ifdef JP -if (init_script()) quit("¥¹¥¯¥ê¥×¥È¤ò½é´ü²½¤Ç¤­¤Þ¤»¤ó"); -#else - if (init_script()) quit("Cannot initialize scripts"); -#endif - -#endif /* USE_SCRIPT */ - /* Initialize feature info */ #ifdef JP note("[¥Ç¡¼¥¿¤Î½é´ü²½Ãæ... (ÃÏ·Á)]"); if (init_f_info()) quit("ÃÏ·Á½é´ü²½ÉÔǽ"); + if (init_feat_variables()) quit("ÃÏ·Á½é´ü²½ÉÔǽ"); #else note("[Initializing arrays... (features)]"); if (init_f_info()) quit("Cannot initialize features"); + if (init_feat_variables()) quit("Cannot initialize features"); #endif @@ -2269,6 +2543,14 @@ if (init_quests()) quit(" #endif + /* Initialize vault info */ +#ifdef JP + if (init_v_info()) quit("vault ½é´ü²½ÉÔǽ"); +#else + if (init_v_info()) quit("Cannot initialize vaults"); +#endif + + /* Initialize some other arrays */ #ifdef JP note("[¥Ç¡¼¥¿¤Î½é´ü²½Ãæ... (¤½¤Î¾)]"); @@ -2307,24 +2589,12 @@ note("[ /* Process that file */ process_pref_file(buf); - /* Access the "user" pref file */ - sprintf(buf, "user.prf"); - - /* Process that file */ - process_pref_file(buf); - /* Access the "basic" system pref file */ sprintf(buf, "pref-%s.prf", ANGBAND_SYS); /* Process that file */ process_pref_file(buf); - /* Access the "user" system pref file */ - sprintf(buf, "user-%s.prf", ANGBAND_SYS); - - /* Process that file */ - process_pref_file(buf); - /* Done */ #ifdef JP note("[½é´ü²½½ªÎ»]"); @@ -2333,3 +2603,21 @@ note("[ #endif } + +/* + * Get check sum in string form + */ +cptr get_check_sum(void) +{ + return format("%02x%02x%02x%02x%02x%02x%02x%02x%02x", + f_head.v_extra, + k_head.v_extra, + a_head.v_extra, + e_head.v_extra, + r_head.v_extra, + d_head.v_extra, + m_head.v_extra, + s_head.v_extra, + v_head.v_extra); +} +