/** * Place some staircases near walls. * \param c the current chunk * \param feat the stair terrain type * \param num number of staircases to place * \param walls number of walls to surround the stairs (negotiable) */ void alloc_stairs(struct chunk *c, int feat, int num) { int i; /* Place "num" stairs */ for (i = 0; i < num; i++) { int y, x; bool done = false; /* Find the best possible place for the stairs */ if (cave_find_in_range(c, &y, 1, c->height - 2, &x, 1, c->width - 2, square_suits_stairs_well)) { place_stairs(c, y, x, feat); } else if (cave_find_in_range(c, &y, 1, c->height - 2, &x, 1, c->width - 2, square_suits_stairs_ok)) { place_stairs(c, y, x, feat); } else { int walls = 6; /* Gradually reduce number of walls if having trouble */ while (!done) { int j; /* Try hard to find a square with the given number of walls */ for (j = 0; j < 1000; j++) { int total_walls = 0; cave_find_in_range(c, &y, 1, c->height - 2, &x, 1, c->width - 2, square_isempty); if (square_isvault(c, y, x)|| square_isno_stairs(c, y, x)) { continue; } total_walls = square_num_walls_adjacent(c, y, x) + square_num_walls_diagonal(c, y, x); if (total_walls == walls) { place_stairs(c, y, x, feat); done = true; break; } } /* Require fewer walls */ if (walls) walls--; } } } }
/** * Determine whether the given coordinate is a valid starting location. * \param c current chunk * \param y co-ordinates * \param x co-ordinates * \return success */ static bool find_start(struct chunk *c, int *y, int *x) { /* Find the best possible place */ if (cave_find_in_range(c, y, 1, c->height - 2, x, 1, c->width - 2, square_suits_stairs_well)) { return true; } else if (cave_find_in_range(c, y, 1, c->height - 2, x, 1, c->width - 2, square_suits_stairs_ok)) { return true; } else { int walls = 6; /* Gradually reduce number of walls if having trouble */ while (walls >= 0) { int j; /* Try hard to find a square with the given number of walls */ for (j = 0; j < 10000; j++) { int total_walls = 0; cave_find_in_range(c, y, 1, c->height - 2, x, 1, c->width - 2, square_isempty); if (square_isvault(c, *y, *x)|| square_isno_stairs(c, *y, *x)) { continue; } total_walls = square_num_walls_adjacent(c, *y, *x) + square_num_walls_diagonal(c, *y, *x); if (total_walls == walls) { return true; } } walls--; } } return false; }
/* * This will get data on an object * It gets a lot of stuff, pretty much everything that I * thought was reasonable to get. However, you might have * a much different opinion. Luckily, I tried to make it * trivial to add new items to log. */ static void get_obj_data(const struct object *obj, int y, int x, bool mon, bool uniq) { bool vault = square_isvault(cave, y, x); int number = obj->number; static int lvl; struct artifact *art; double gold_temp = 0; assert(obj->kind); /* get player depth */ lvl = player->depth; /* check for some stuff that we will use regardless of type */ /* originally this was armor, but I decided to generalize it */ /* has free action (hack: don't include Inertia)*/ if (of_has(obj->flags, OF_FREE_ACT) && !((obj->tval == TV_AMULET) && (!strstr(obj->kind->name, "Inertia")))) { /* add the stats */ add_stats(ST_FA_EQUIPMENT, vault, mon, number); /* record first level */ first_find(ST_FF_FA); } /* has see invis */ if (of_has(obj->flags, OF_SEE_INVIS)){ add_stats(ST_SI_EQUIPMENT, vault, mon, number); first_find(ST_FF_SI); } /* has at least one basic resist */ if ((obj->el_info[ELEM_ACID].res_level == 1) || (obj->el_info[ELEM_ELEC].res_level == 1) || (obj->el_info[ELEM_COLD].res_level == 1) || (obj->el_info[ELEM_FIRE].res_level == 1)){ add_stats(ST_RESIST_EQUIPMENT, vault, mon, number); } /* has rbase */ if ((obj->el_info[ELEM_ACID].res_level == 1) && (obj->el_info[ELEM_ELEC].res_level == 1) && (obj->el_info[ELEM_COLD].res_level == 1) && (obj->el_info[ELEM_FIRE].res_level == 1)) add_stats(ST_RBASE_EQUIPMENT, vault, mon, number); /* has resist poison */ if (obj->el_info[ELEM_POIS].res_level == 1){ add_stats(ST_RPOIS_EQUIPMENT, vault, mon, number); first_find(ST_FF_RPOIS); } /* has resist nexus */ if (obj->el_info[ELEM_NEXUS].res_level == 1){ add_stats(ST_RNEXUS_EQUIPMENT, vault, mon, number); first_find(ST_FF_RNEXUS); } /* has resist blind */ if (of_has(obj->flags, OF_PROT_BLIND)){ add_stats(ST_RBLIND_EQUIPMENT, vault, mon, number); first_find(ST_FF_RBLIND); } /* has resist conf */ if (of_has(obj->flags, OF_PROT_CONF)){ add_stats(ST_RCONF_EQUIPMENT, vault, mon, number); first_find(ST_FF_RCONF); } /* has speed */ if (obj->modifiers[OBJ_MOD_SPEED] != 0) add_stats(ST_SPEED_EQUIPMENT, vault, mon, number); /* has telepathy */ if (of_has(obj->flags, OF_TELEPATHY)){ add_stats(ST_TELEP_EQUIPMENT, vault, mon, number); first_find(ST_FF_TELEP); } switch(obj->tval){ /* armor */ case TV_BOOTS: case TV_GLOVES: case TV_HELM: case TV_CROWN: case TV_SHIELD: case TV_CLOAK: case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR:{ /* do not include artifacts */ if (obj->artifact) break; /* add to armor total */ add_stats(ST_ARMORS, vault, mon, number); /* check if bad, good, or average */ if (obj->to_a < 0) add_stats(ST_BAD_ARMOR, vault, mon, number); if (obj->to_h == 0) add_stats(ST_AVERAGE_ARMOR, vault, mon, number); if (obj->to_h > 0) add_stats(ST_GOOD_ARMOR, vault, mon, number); /* has str boost */ if (obj->modifiers[OBJ_MOD_STR] != 0) add_stats(ST_STR_ARMOR, vault, mon, number); /* has dex boost */ if (obj->modifiers[OBJ_MOD_DEX] != 0) add_stats(ST_DEX_ARMOR, vault, mon, number); /* has int boost */ if (obj->modifiers[OBJ_MOD_INT] != 0) add_stats(ST_INT_ARMOR, vault, mon, number); if (obj->modifiers[OBJ_MOD_WIS] != 0) add_stats(ST_WIS_ARMOR, vault, mon, number); if (obj->modifiers[OBJ_MOD_CON] != 0) add_stats(ST_CON_ARMOR, vault, mon, number); if (of_has(obj->flags, OF_LIGHT_CURSE)) add_stats(ST_CURSED_ARMOR, vault, mon, number); break; } /* weapons */ case TV_DIGGING: case TV_HAFTED: case TV_POLEARM: case TV_SWORD:{ /* do not include artifacts */ if (obj->artifact) break; /* add to weapon total */ add_stats(ST_WEAPONS, vault, mon, number); /* check if bad, good, or average */ if ((obj->to_h < 0) && (obj->to_d < 0)) add_stats(ST_BAD_WEAPONS, vault, mon, number); if ((obj->to_h == 0) && (obj->to_d == 0)) add_stats(ST_AVERAGE_WEAPONS, vault, mon, number); if ((obj->to_h > 0) && (obj->to_d > 0)) add_stats(ST_GOOD_WEAPONS, vault, mon, number); /* Egos by name - changes results a little */ if (obj->ego) { /* slay evil */ if (strstr(obj->ego->name, "of Slay Evil")) add_stats(ST_SLAYEVIL_WEAPONS, vault, mon, number); /* slay weapons */ else if (strstr(obj->ego->name, "of Slay")) add_stats(ST_SLAY_WEAPONS, vault, mon, number); /* kill flag */ if (strstr(obj->ego->name, "of *Slay")) add_stats(ST_KILL_WEAPONS, vault, mon, number); /* determine westernesse by flags */ if (strstr(obj->ego->name, "Westernesse")) add_stats(ST_WESTERNESSE_WEAPONS, vault, mon, number); /* determine defender by flags */ if (strstr(obj->ego->name, "Defender")) add_stats(ST_DEFENDER_WEAPONS, vault, mon, number); /* determine gondolin by flags */ if (strstr(obj->ego->name, "Gondolin")) add_stats(ST_GONDOLIN_WEAPONS, vault, mon, number); /* determine holy avenger by flags */ if (strstr(obj->ego->name, "Avenger")) add_stats(ST_HOLY_WEAPONS, vault, mon, number); /* is morgul */ if (strstr(obj->ego->name, "Morgul")) add_stats(ST_MORGUL_WEAPONS, vault, mon, number); } /* branded weapons */ if (obj->brands) add_stats(ST_BRAND_WEAPONS, vault, mon, number); /* extra blows */ if (obj->modifiers[OBJ_MOD_BLOWS] > 0) add_stats(ST_XTRABLOWS_WEAPONS, vault, mon, number); /* telepathy */ if (of_has(obj->flags, OF_TELEPATHY)) add_stats(ST_TELEP_WEAPONS, vault, mon, number); /* is a top of the line weapon */ if (((obj->tval == TV_HAFTED) && (!strstr(obj->kind->name, "Disruption"))) || ((obj->tval == TV_POLEARM) && (!strstr(obj->kind->name, "Slicing"))) || ((obj->tval == TV_SWORD) && (!strstr(obj->kind->name, "Chaos")))) { add_stats(ST_HUGE_WEAPONS, vault, mon, number); /* is uber need to fix ACB if ((of_has(obj->flags, OF_SLAY_EVIL)) || (obj->modifiers[OBJ_MOD_BLOWS] > 0)) add_stats(ST_UBWE, vault, mon, number); */ } break; } /* launchers */ case TV_BOW:{ /* do not include artifacts */ if (obj->artifact) break; /* add to launcher total */ add_stats(ST_BOWS, vault, mon, number); /* check if bad, average, good, or very good */ if ((obj->to_h < 0) && (obj->to_d < 0)) add_stats(ST_BAD_BOWS, vault, mon, number); if ((obj->to_h == 0) && (obj->to_d == 0)) add_stats(ST_AVERAGE_BOWS, vault, mon, number); if ((obj->to_h > 0) && (obj->to_d > 0)) add_stats(ST_GOOD_BOWS, vault, mon, number); if ((obj->to_h > 15) || (obj->to_d > 15)) add_stats(ST_VERYGOOD_BOWS, vault, mon, number); /* check long bows and xbows for xtra might and/or shots */ if (obj->pval > 2) { if (obj->modifiers[OBJ_MOD_SHOTS] > 0) add_stats(ST_XTRASHOTS_BOWS, vault, mon, number); if (obj->modifiers[OBJ_MOD_MIGHT] > 0) add_stats(ST_XTRAMIGHT_BOWS, vault, mon, number); } /* check for buckland */ if ((obj->pval == 2) && kf_has(obj->kind->kind_flags, KF_SHOOTS_SHOTS) && (obj->modifiers[OBJ_MOD_MIGHT] > 0) && (obj->modifiers[OBJ_MOD_SHOTS] > 0)) add_stats(ST_BUCKLAND_BOWS, vault, mon, number); /* has telep */ if (of_has(obj->flags, OF_TELEPATHY)) add_stats(ST_TELEP_BOWS, vault, mon, number); /* is cursed */ if (of_has(obj->flags, OF_LIGHT_CURSE)) add_stats(ST_CURSED_BOWS, vault, mon, number); break; } /* potion */ case TV_POTION:{ /* Add total amounts */ add_stats(ST_POTIONS, vault, mon, number); /* Stat gain */ if (strstr(obj->kind->name, "Strength") || strstr(obj->kind->name, "Intelligence") || strstr(obj->kind->name, "Wisdom") || strstr(obj->kind->name, "Dexterity") || strstr(obj->kind->name, "Constitution")) { add_stats(ST_GAINSTAT_POTIONS, vault, mon, number); } else if (strstr(obj->kind->name, "Augmentation")) { /* Augmentation counts as 5 stat gain pots */ add_stats(ST_GAINSTAT_POTIONS, vault, mon, number * 5); } else if (strstr(obj->kind->name, "*Enlightenment*")) { /* *Enlight* counts as 2 stat pots */ add_stats(ST_GAINSTAT_POTIONS, vault, mon, number * 2); } else if (strstr(obj->kind->name, "Restore Mana")) { add_stats(ST_RESTOREMANA_POTIONS, vault, mon, number); } else if ((strstr(obj->kind->name, "Life")) || (strstr(obj->kind->name, "*Healing*"))) { add_stats(ST_ELVEN_RINGS, vault, mon, number); } else if (strstr(obj->kind->name, "Healing")) { add_stats(ST_HEALING_POTIONS, vault, mon, number); } break; } /* scrolls */ case TV_SCROLL:{ /* add total amounts */ add_stats(ST_SCROLLS, vault, mon, number); if (strstr(obj->kind->name, "Banishment") || strstr(obj->kind->name, "Mass Banishment") || strstr(obj->kind->name, "Rune of Protection") || strstr(obj->kind->name, "*Destruction*")) { add_stats(ST_ENDGAME_SCROLLS, vault, mon, number); } else if (strstr(obj->kind->name, "Acquirement")) { add_stats(ST_ACQUIRE_SCROLLS, vault, mon, number); } else if (strstr(obj->kind->name, "*Acquirement*")) { /* do the effect of 2 acquires */ add_stats(ST_ACQUIRE_SCROLLS, vault, mon, number * 2); } break; } /* rods */ case TV_ROD:{ /* add to total */ add_stats(ST_RODS, vault, mon, number); if (strstr(obj->kind->name, "Trap Detection") || strstr(obj->kind->name, "Treasure Detection") || strstr(obj->kind->name, "Door/Stair Location") || strstr(obj->kind->name, "Illumination") || strstr(obj->kind->name, "Light")) { add_stats(ST_UTILITY_RODS, vault, mon, number); } else if (strstr(obj->kind->name, "Teleport Other")) { add_stats(ST_TELEPOTHER_RODS, vault, mon, number); } else if (strstr(obj->kind->name, "Detection")) { add_stats(ST_DETECTALL_RODS, vault, mon, number); } else if (strstr(obj->kind->name, "Speed") || strstr(obj->kind->name, "Healing")) { add_stats(ST_ENDGAME_RODS, vault, mon, number); } break; } /* staves */ case TV_STAFF:{ add_stats(ST_STAVES, vault, mon, number); if (strstr(obj->kind->name, "Speed")) { add_stats(ST_SPEED_STAVES, vault, mon, number); } else if (strstr(obj->kind->name, "*Destruction*")) { add_stats(ST_DESTRUCTION_STAVES, vault, mon, number); } else if (strstr(obj->kind->name, "Dispel Evil") || strstr(obj->kind->name, "Power") || strstr(obj->kind->name, "Holiness")) { add_stats(ST_KILL_STAVES, vault, mon, number); } else if (strstr(obj->kind->name, "Healing") || strstr(obj->kind->name, "Banishment") || strstr(obj->kind->name, "the Magi")) { add_stats(ST_ENDGAME_STAVES, vault, mon, number); } break; } case TV_WAND:{ add_stats(ST_WANDS, vault, mon, number); if (strstr(obj->kind->name, "Teleport Other")) add_stats(ST_TELEPOTHER_WANDS, vault, mon, number); break; } case TV_RING:{ add_stats(ST_RINGS, vault, mon, number); /* is it cursed */ if (of_has(obj->flags,OF_LIGHT_CURSE)) add_stats(ST_CURSED_RINGS, vault, mon, number); if (strstr(obj->kind->name, "Speed")) { add_stats(ST_SPEEDS_RINGS, vault, mon, number); } else if ((strstr(obj->kind->name, "Strength")) || (strstr(obj->kind->name, "Intelligence")) || (strstr(obj->kind->name, "Dexterity")) || (strstr(obj->kind->name, "Constitution"))) { add_stats(ST_STAT_RINGS, vault, mon, number); } else if (strstr(obj->kind->name, "Resist Poison")) { add_stats(ST_RPOIS_RINGS, vault, mon, number); } else if (strstr(obj->kind->name, "Free Action")) { add_stats(ST_FA_RINGS, vault, mon, number); } else if (strstr(obj->kind->name, "See invisible")) { add_stats(ST_SI_RINGS, vault, mon, number); } else if ((strstr(obj->kind->name, "Flames")) || (strstr(obj->kind->name, "Ice")) || (strstr(obj->kind->name, "Acid")) || (strstr(obj->kind->name, "Lightning"))) { add_stats(ST_BRAND_RINGS, vault, mon, number); } else if ((strstr(obj->kind->name, "Fire")) || (strstr(obj->kind->name, "Adamant")) || (strstr(obj->kind->name, "Firmament"))) { add_stats(ST_ELVEN_RINGS, vault, mon, number); } else if (strstr(obj->kind->name, "Power")) { add_stats(ST_ONE_RINGS, vault, mon, number); } break; } case TV_AMULET:{ add_stats(ST_AMULETS, vault, mon, number); if (strstr(obj->kind->name, "Wisdom")) { add_stats(ST_WIS_AMULETS, vault, mon, number); } else if ((strstr(obj->kind->name, "Magi")) || (strstr(obj->kind->name, "Trickery")) || (strstr(obj->kind->name, "Weaponmastery"))) { add_stats(ST_ENDGAME_AMULETS, vault, mon, number); } else if (strstr(obj->kind->name, "ESP")) { add_stats(ST_TELEP_AMULETS, vault, mon, number); } /* is cursed */ if (of_has(obj->flags, OF_LIGHT_CURSE)) add_stats(ST_CURSED_AMULETS, vault, mon, number); break; } case TV_SHOT: case TV_ARROW: case TV_BOLT:{ add_stats(ST_AMMO, vault, mon, number); /* check if bad, average, good */ if ((obj->to_h < 0) && (obj->to_d < 0)) add_stats(ST_BAD_AMMO, vault, mon, number); if ((obj->to_h == 0) && (obj->to_d == 0)) add_stats(ST_AVERAGE_AMMO, vault, mon, number); if ((obj->to_h > 0) && (obj->to_d > 0)) add_stats(ST_GOOD_AMMO, vault, mon, number); if (obj->ego) add_stats(ST_BRANDSLAY_AMMO, vault, mon, number); if (strstr(obj->kind->name, "Seeker") || strstr(obj->kind->name, "Mithril")) { /* Mithril and seeker ammo */ add_stats(ST_VERYGOOD_AMMO, vault, mon, number); /* Ego mithril and seeker ammo */ if (obj->ego) { add_stats(ST_AWESOME_AMMO, vault, mon, number); if (strstr(obj->ego->name, "of Slay Evil")) add_stats(ST_SLAYEVIL_AMMO, vault, mon, number); if (strstr(obj->ego->name, "of Holy Might")) add_stats(ST_HOLY_AMMO, vault, mon, number); } } break; } /* prayer books and magic books have the same probability only track one of them */ case TV_MAGIC_BOOK:{ switch(obj->sval){ /* svals begin at 0 and end at 8 */ case 0:{ add_stats(ST_1ST_BOOKS, vault, mon, number); first_find(ST_FF_BOOK1); break; } case 1:{ add_stats(ST_2ND_BOOKS, vault, mon, number); first_find(ST_FF_BOOK2); break; } case 2:{ add_stats(ST_3RD_BOOKS, vault, mon, number); first_find(ST_FF_BOOK3); break; } case 3:{ add_stats(ST_4TH_BOOKS, vault, mon, number); first_find(ST_FF_BOOK4); break; } case 4:{ add_stats(ST_5TH_BOOKS, vault, mon, number); first_find(ST_FF_BOOK5); break; } case 5:{ add_stats(ST_6TH_BOOKS, vault, mon, number); first_find(ST_FF_BOOK6); break; } case 6:{ add_stats(ST_7TH_BOOKS, vault, mon, number); first_find(ST_FF_BOOK7); break; } case 7:{ add_stats(ST_8TH_BOOKS, vault, mon, number); first_find(ST_FF_BOOK8); break; } case 8:{ add_stats(ST_9TH_BOOKS, vault, mon, number); first_find(ST_FF_BOOK9); break; } } break; } } /* check to see if we have an artifact */ if (obj->artifact){ /* add to artifact level total */ art_total[lvl] += addval; /* add to the artifact iteration total */ if (iter < TRIES_SIZE) art_it[iter]++; /* Obtain the artifact info */ art = obj->artifact; //debugging, print out that we found the artifact //msg_format("Found artifact %s",art->name); /* artifact is shallow */ if (art->alloc_min < (player->depth - 20)) art_shal[lvl] += addval; /* artifact is close to the player depth */ if ((art->alloc_min >= player->depth - 20) && (art->alloc_min <= player->depth )) art_ave[lvl] += addval; /* artifact is out of depth */ if (art->alloc_min > (player->depth)) art_ood[lvl] += addval; /* check to see if it's a special artifact */ if ((obj->tval == TV_LIGHT) || (obj->tval == TV_AMULET) || (obj->tval == TV_RING)){ /* increment special artifact counter */ art_spec[lvl] += addval; } else { /* increment normal artifacts */ art_norm[lvl] += addval; /* did it come from a monster? */ if (mon) art_mon[lvl] += addval; /* did it come from a unique? */ if (uniq) art_uniq[lvl] += addval; /* was it in a vault? */ if (vault){ /* did a monster drop it ?*/ if ((mon) || (uniq)) art_mon_vault[lvl] += addval; else art_vault[lvl] += addval; } else { /* was it just lyin' on the floor? */ if ((!uniq) && (!mon)) art_floor[lvl] += addval; } } /* preserve the artifact */ if (!(clearing)) art->created = FALSE; } /* Get info on gold. */ if (obj->tval == TV_GOLD){ int temp = obj->pval; gold_temp = temp; gold_total[lvl] += (gold_temp / tries); /*From a monster? */ if ((mon) || (uniq)) gold_mon[lvl] += (gold_temp / tries); else gold_floor[lvl] += (gold_temp / tries); } }
/** * Gather whether the dungeon has disconnects in it and whether the player * is disconnected from the stairs */ void disconnect_stats(void) { int i, y, x; int **cave_dist; bool has_dsc, has_dsc_from_stairs; static int temp; static char tmp_val[100]; static char prompt[50]; long dsc_area = 0, dsc_from_stairs = 0; /* This is the prompt for no. of tries */ strnfmt(prompt, sizeof(prompt), "Num of simulations: "); /* This is the default value (50) */ strnfmt(tmp_val, sizeof(tmp_val), "%d", tries); /* Ask for the input */ if (!get_string(prompt,tmp_val,7)) return; /* Get the new value */ temp = atoi(tmp_val); /* Try at least once */ if (temp < 1) temp = 1; /* Save */ tries = temp; for (i = 1; i <= tries; i++) { /* Assume no disconnected areas */ has_dsc = FALSE; /* Assume you can't get to stairs */ has_dsc_from_stairs = TRUE; /* Make a new cave */ cave_generate(&cave, player); /* Allocate the distance array */ cave_dist = mem_zalloc(cave->height * sizeof(int*)); for (y = 0; y < cave->height; y++) cave_dist[y] = mem_zalloc(cave->width * sizeof(int)); /* Set all cave spots to inaccessible */ for (y = 0; y < cave->height; y++) for (x = 1; x < cave->width; x++) cave_dist[y][x] = -1; /* Fill the distance array with the correct distances */ calc_cave_distances(cave_dist); /* Cycle through the dungeon */ for (y = 1; y < cave->height - 1; y++) { for (x = 1; x < cave->width - 1; x++) { /* Don't care about walls */ if (square_iswall(cave, y, x)) continue; /* Can we get there? */ if (cave_dist[y][x] >= 0) { /* Is it a down stairs? */ if (square_isdownstairs(cave, y, x)) { has_dsc_from_stairs = FALSE; /* debug msg("dist to stairs: %d",cave_dist[y][x]); */ } continue; } /* Ignore vaults as they are often disconnected */ if (square_isvault(cave, y, x)) continue; /* We have a disconnected area */ has_dsc = TRUE; } } if (has_dsc_from_stairs) dsc_from_stairs++; if (has_dsc) dsc_area++; msg("Iteration: %d",i); /* Free arrays */ for (y = 0; x < cave->height; x++) mem_free(cave_dist[y]); mem_free(cave_dist); } msg("Total levels with disconnected areas: %ld",dsc_area); msg("Total levels isolated from stairs: %ld",dsc_from_stairs); /* Redraw the level */ do_cmd_redraw(); }
/** * Determine whether the given coordinate is a valid starting location. * \param c current chunk * \param y * \param x co-ordinates * \return success */ static bool square_isstart(struct chunk *c, int y, int x) { if (!square_isempty(c, y, x)) return FALSE; if (square_isvault(c, y, x)) return FALSE; return TRUE; }
/** * Determine whether the given coordinate is a valid starting location. * \param c current chunk * \param y * \param x co-ordinates * \return success */ static bool square_isstart(struct chunk *c, int y, int x) { if (!square_isempty(c, y, x)) return false; if (square_isvault(c, y, x)) return false; return true; }