bool quest_spider_gen_hook(char *fmt) { int x, y; int xstart = 2; int ystart = 2; if (p_ptr->inside_quest != QUEST_SPIDER) return FALSE; /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) { for (x = 0; x < cur_wid; x++) { cave_set_feat(y, x, FEAT_PERM_SOLID); } } dun_level = quest[p_ptr->inside_quest].level; /* Set the correct monster hook */ set_mon_num_hook(); /* Prepare allocation table */ get_mon_num_prep(); init_flags = INIT_CREATE_DUNGEON; process_dungeon_file_full = TRUE; process_dungeon_file(NULL, "spiders.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE); process_dungeon_file_full = FALSE; return TRUE; }
/* * Generate a quest level */ static void quest_gen(void) { int x, y; /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) { for (x = 0; x < cur_wid; x++) { place_solid_perm_bold(y, x); } } /* Set the quest level */ base_level = quest[p_ptr->inside_quest].level; dun_level = base_level; object_level = base_level; monster_level = base_level; if (record_stair) do_cmd_write_nikki(NIKKI_TO_QUEST, p_ptr->inside_quest, NULL); /* Prepare allocation table */ get_mon_num_prep(get_monster_hook(), NULL); init_flags = INIT_CREATE_DUNGEON | INIT_ASSIGN; process_dungeon_file("q_info.txt", 0, 0, MAX_HGT, MAX_WID); }
bool quest_invasion_gen_hook(char *fmt) { int x, y; int xstart = 2; int ystart = 2; if (p_ptr->inside_quest != QUEST_INVASION) return FALSE; /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) { for (x = 0; x < cur_wid; x++) { cave_set_feat(y, x, FEAT_PERM_SOLID); } } dun_level = quest[p_ptr->inside_quest].level; /* Set the correct monster hook */ set_mon_num_hook(); /* Prepare allocation table */ get_mon_num_prep(); init_flags = INIT_CREATE_DUNGEON; process_dungeon_file_full = TRUE; process_dungeon_file(NULL, "maeglin.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE); process_dungeon_file_full = FALSE; for (x = 3; x < xstart; x++) for (y = 3; y < ystart; y++) { if (cave[y][x].feat == FEAT_MARKER) { cquest.data[0] = y; cquest.data[1] = x; p_ptr->py = y; p_ptr->px = x; cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS); } } return TRUE; }
bool quest_wolves_gen_hook(char *fmt) { int x, y, i; int xstart = 2; int ystart = 2; if (p_ptr->inside_quest != QUEST_WOLVES) return FALSE; /* Just in case we didnt talk the the mayor */ if (cquest.status == QUEST_STATUS_UNTAKEN) cquest.status = QUEST_STATUS_TAKEN; /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) { for (x = 0; x < cur_wid; x++) { cave_set_feat(y, x, FEAT_PERM_SOLID); } } dun_level = quest[p_ptr->inside_quest].level; /* Set the correct monster hook */ set_mon_num_hook(); /* Prepare allocation table */ get_mon_num_prep(); init_flags = INIT_CREATE_DUNGEON; process_dungeon_file(NULL, "wolves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE); dungeon_flags2 |= DF2_NO_GENO; /* Place some random wolves */ for (i = damroll(4, 4); i > 0; ) { int flags; y = rand_int(21) + 3; x = rand_int(31) + 3; flags = f_info[cave[y][x].feat].flags1; if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) { place_monster_one(y, x, 196, 0, magik(50), MSTATUS_ENEMY); --i; } } /* Place some random wargs */ for (i = damroll(4, 4); i > 0; ) { int flags; y = rand_int(21) + 3; x = rand_int(31) + 3; flags = f_info[cave[y][x].feat].flags1; if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) { place_monster_one(y, x, 257, 0, magik(50), MSTATUS_ENEMY); --i; } } process_hooks_restart = TRUE; return TRUE; }
/* * Build the wilderness area outside of the town. */ void wilderness_gen(void) { int i, y, x; bool daytime; cave_type *c_ptr; /* Big town */ cur_hgt = MAX_HGT; cur_wid = MAX_WID; /* Assume illegal panel */ panel_row_min = cur_hgt; panel_col_min = cur_wid; /* Init the wilderness */ process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x); x = p_ptr->wilderness_x; y = p_ptr->wilderness_y; /* Prepare allocation table */ get_mon_num_prep(get_monster_hook(), NULL); /* North border */ generate_area(y - 1, x, TRUE, FALSE); for (i = 1; i < MAX_WID - 1; i++) { border.north[i] = cave[MAX_HGT - 2][i].feat; } /* South border */ generate_area(y + 1, x, TRUE, FALSE); for (i = 1; i < MAX_WID - 1; i++) { border.south[i] = cave[1][i].feat; } /* West border */ generate_area(y, x - 1, TRUE, FALSE); for (i = 1; i < MAX_HGT - 1; i++) { border.west[i] = cave[i][MAX_WID - 2].feat; } /* East border */ generate_area(y, x + 1, TRUE, FALSE); for (i = 1; i < MAX_HGT - 1; i++) { border.east[i] = cave[i][1].feat; } /* North west corner */ generate_area(y - 1, x - 1, FALSE, TRUE); border.north_west = cave[MAX_HGT - 2][MAX_WID - 2].feat; /* North east corner */ generate_area(y - 1, x + 1, FALSE, TRUE); border.north_east = cave[MAX_HGT - 2][1].feat; /* South west corner */ generate_area(y + 1, x - 1, FALSE, TRUE); border.south_west = cave[1][MAX_WID - 2].feat; /* South east corner */ generate_area(y + 1, x + 1, FALSE, TRUE); border.south_east = cave[1][1].feat; /* Leaving the dungeon by stairs */ /* (needed before the town is loaded) */ if (p_ptr->leaving_dungeon) { p_ptr->oldpy = 0; p_ptr->oldpx = 0; } /* Create terrain of the current area */ generate_area(y, x, FALSE, FALSE); /* Special boundary walls -- North */ for (i = 0; i < MAX_WID; i++) { cave[0][i].feat = FEAT_PERM_SOLID; cave[0][i].mimic = border.north[i]; } /* Special boundary walls -- South */ for (i = 0; i < MAX_WID; i++) { cave[MAX_HGT - 1][i].feat = FEAT_PERM_SOLID; cave[MAX_HGT - 1][i].mimic = border.south[i]; } /* Special boundary walls -- West */ for (i = 0; i < MAX_HGT; i++) { cave[i][0].feat = FEAT_PERM_SOLID; cave[i][0].mimic = border.west[i]; } /* Special boundary walls -- East */ for (i = 0; i < MAX_HGT; i++) { cave[i][MAX_WID - 1].feat = FEAT_PERM_SOLID; cave[i][MAX_WID - 1].mimic = border.east[i]; } /* North west corner */ cave[0][0].mimic = border.north_west; /* North east corner */ cave[0][MAX_WID - 1].mimic = border.north_east; /* South west corner */ cave[MAX_HGT - 1][0].mimic = border.south_west; /* South east corner */ cave[MAX_HGT - 1][MAX_WID - 1].mimic = border.south_east; /* Day time */ if ((turn % (10L * TOWN_DAWN)) < ((10L * TOWN_DAWN) / 2)) daytime = TRUE; else daytime = FALSE; /* Light up or darken the area */ for (y = 0; y < cur_hgt; y++) { for (x = 0; x < cur_wid; x++) { /* Get the cave grid */ c_ptr = &cave[y][x]; if (daytime) { /* Assume lit */ c_ptr->info |= (CAVE_GLOW); /* Hack -- Memorize lit grids if allowed */ if (view_perma_grids) c_ptr->info |= (CAVE_MARK); } else { /* Darken "boring" features */ if ((c_ptr->feat <= FEAT_INVIS) || ((c_ptr->feat >= FEAT_DEEP_WATER) && (c_ptr->feat <= FEAT_MOUNTAIN)) || (x == 0) || (x == cur_wid - 1) || (y == 0) || (y == cur_hgt - 1)) { /* Forget the grid */ c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK); } } } } player_place(p_ptr->oldpy, p_ptr->oldpx); p_ptr->leaving_dungeon = FALSE; /* Make some residents */ for (i = 0; i < MIN_M_ALLOC_TN; i++) { /* Make a resident */ (void)alloc_monster(3, TRUE); } /* Set rewarded quests to finished */ for (i = 0; i < max_quests; i++) { if (quest[i].status == QUEST_STATUS_REWARDED) quest[i].status = QUEST_STATUS_FINISHED; } }
/* * Load a town or generate a terrain level using "plasma" fractals. * * x and y are the coordinates of the area in the wilderness. * Border and corner are optimization flags to speed up the * generation of the fractal terrain. * If border is set then only the border of the terrain should * be generated (for initializing the border structure). * If corner is set then only the corners of the area are needed. */ static void generate_area(int y, int x, bool border, bool corner) { int road; int x1, y1; /* Number of the town (if any) */ p_ptr->town_num = wilderness[y][x].town; /* Set the base level */ base_level = wilderness[y][x].level; /* Set the dungeon level */ dun_level = 0; /* Set the monster generation level */ monster_level = base_level; /* Set the object generation level */ object_level = base_level; /* Create the town */ if (p_ptr->town_num) { /* Reset the buildings */ init_buildings(); /* Initialize the town */ if (border | corner) init_flags = INIT_CREATE_DUNGEON | INIT_ONLY_FEATURES; else init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("t_info.txt", 0, 0, MAX_HGT, MAX_WID); } else { int terrain = wilderness[y][x].terrain; u32b seed = wilderness[y][x].seed; generate_wilderness_area(terrain, seed, border, corner); } if (!corner) { /* * Place roads in the wilderness * ToDo: make the road a bit more interresting */ road = wilderness[y][x].road; if (road & ROAD_NORTH) { /* North road */ for (y1 = 1; y1 < MAX_HGT/2; y1++) { x1 = MAX_WID/2; cave[y1][x1].feat = FEAT_FLOOR; } } if (road & ROAD_SOUTH) { /* North road */ for (y1 = MAX_HGT/2; y1 < MAX_HGT - 1; y1++) { x1 = MAX_WID/2; cave[y1][x1].feat = FEAT_FLOOR; } } if (road & ROAD_EAST) { /* East road */ for (x1 = MAX_WID/2; x1 < MAX_WID - 1; x1++) { y1 = MAX_HGT/2; cave[y1][x1].feat = FEAT_FLOOR; } } if (road & ROAD_WEST) { /* West road */ for (x1 = 1; x1 < MAX_WID/2; x1++) { y1 = MAX_HGT/2; cave[y1][x1].feat = FEAT_FLOOR; } } } }