summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/mon-pick.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/mon-pick.cc')
-rw-r--r--crawl-ref/source/mon-pick.cc157
1 files changed, 157 insertions, 0 deletions
diff --git a/crawl-ref/source/mon-pick.cc b/crawl-ref/source/mon-pick.cc
index 9c8e17620a..d7989c10c2 100644
--- a/crawl-ref/source/mon-pick.cc
+++ b/crawl-ref/source/mon-pick.cc
@@ -17,6 +17,7 @@
#include "externs.h"
#include "branch.h"
#include "misc.h"
+#include "mon-util.h"
#include "place.h"
// NB - When adding new branches or levels above 50, you must
@@ -35,6 +36,134 @@ int mons_level(int mcls, const level_id &place)
return monster_level;
}
+typedef int (*mons_level_function)(int);
+
+struct global_level_info
+{
+ mons_level_function level_func;
+ branch_type branch;
+ int avg_depth;
+};
+
+static int mons_misc_level(int mcls)
+{
+ switch(mons_char(mcls))
+ {
+ case '&':
+ return 35;
+
+ case '1':
+ return 30;
+
+ case '2':
+ return 25;
+
+ case '3':
+ return 20;
+
+ case '4':
+ return 15;
+
+ case '5':
+ return 10;
+ }
+
+ if (mons_is_unique(mcls))
+ return (mons_type_hit_dice(mcls) * 14 / 10 + 1);
+
+ switch(mcls)
+ {
+ case MONS_HUMAN:
+ case MONS_ELF:
+ return 1;
+
+ case MONS_BIG_FISH:
+ case MONS_GIANT_GOLDFISH:
+ case MONS_JELLYFISH:
+ return 8;
+
+ case MONS_ANT_LARVA:
+ return 10;
+
+ case MONS_ELECTRICAL_EEL:
+ case MONS_LAVA_FISH:
+ case MONS_LAVA_SNAKE:
+ case MONS_LAVA_WORM:
+ case MONS_SALAMANDER:
+ case MONS_HOG:
+ return 14;
+
+ case MONS_FIRE_VORTEX:
+ return 18;
+
+ case MONS_MINOTAUR:
+ case MONS_BALL_LIGHTNING:
+ case MONS_ORANGE_STATUE:
+ case MONS_SILVER_STATUE:
+ case MONS_ICE_STATUE:
+ case MONS_SPATIAL_VORTEX:
+ case MONS_MOLTEN_GARGOYLE:
+ case MONS_WATER_ELEMENTAL:
+ return 20;
+
+ case MONS_METAL_GARGOYLE:
+ case MONS_VAULT_GUARD:
+ return 24;
+
+ case MONS_QUEEN_ANT:
+ return 25;
+
+ case MONS_ANGEL:
+ return 27;
+
+ case MONS_DAEVA:
+ return 28;
+ }
+
+ return 0;
+}
+
+static global_level_info g_lev_infos[] = {
+ {mons_standard_level, BRANCH_MAIN_DUNGEON, 1},
+ {mons_misc_level, BRANCH_MAIN_DUNGEON, 1},
+ {mons_mineorc_level, BRANCH_ORCISH_MINES, 8},
+ {mons_lair_level, BRANCH_LAIR, 10},
+ {mons_hallelf_level, BRANCH_ELVEN_HALLS, 11},
+ {mons_swamp_level, BRANCH_SWAMP, 14},
+ {mons_shoals_level, BRANCH_SHOALS, 14},
+ {mons_pitsnake_level, BRANCH_SNAKE_PIT, 15},
+ {mons_pitslime_level, BRANCH_SLIME_PITS, 16},
+ {mons_crypt_level, BRANCH_CRYPT, 19},
+ {mons_tomb_level, BRANCH_TOMB, 21},
+ {mons_hallzot_level, BRANCH_HALL_OF_ZOT, 27},
+ {mons_dis_level, BRANCH_DIS, 29},
+ {mons_gehenna_level, BRANCH_GEHENNA, 29},
+ {mons_cocytus_level, BRANCH_COCYTUS, 29},
+ {mons_tartarus_level, BRANCH_TARTARUS, 29},
+
+ {NULL, NUM_BRANCHES, 0}
+};
+
+int mons_global_level(int mcls)
+{
+ for (int i = 0; g_lev_infos[i].level_func != NULL; i++)
+ {
+ int level = (*g_lev_infos[i].level_func)(mcls);
+ int rel_level = level - absdungeon_depth(g_lev_infos[i].branch, 1);
+
+ if (g_lev_infos[i].branch == BRANCH_HALL_OF_ZOT)
+ rel_level++;
+
+ if (level >= 1 && level < 99 && rel_level != 0)
+ {
+ level = rel_level + g_lev_infos[i].avg_depth - 1;
+ return (level);
+ }
+ }
+
+ return (0);
+}
+
// higher values returned means the monster is "more common"
// a return value of zero means the monster will never appear {dlb}
int mons_rarity(int mcls, const level_id &place)
@@ -1423,6 +1552,9 @@ int mons_pitslime_level(int mcls)
mlev += 5;
break;
+ case MONS_ROYAL_JELLY:
+ mlev += 6;
+
default:
mlev += 0;
break;
@@ -1525,6 +1657,7 @@ int mons_crypt_level(int mcls)
case MONS_REAPER:
case MONS_ANCIENT_LICH:
case MONS_LICH:
+ case MONS_CURSE_SKULL:
mlev += 5;
break;
@@ -1836,6 +1969,10 @@ int mons_tomb_level(int mcls)
mlev += 3;
break;
+ case MONS_GREATER_MUMMY:
+ mlev += 4;
+ break;
+
default:
mlev += 99;
}
@@ -1892,6 +2029,8 @@ int mons_shoals_level(int mcls)
case MONS_GIANT_BAT:
break;
+ case MONS_MERFOLK:
+ case MONS_MERMAID:
case MONS_CENTAUR:
case MONS_ETTIN:
case MONS_SHEEP:
@@ -1932,8 +2071,12 @@ int mons_shoals_rare(int mcls)
case MONS_ETTIN:
case MONS_SHEEP:
+ case MONS_MERFOLK:
return 50;
+ case MONS_MERMAID:
+ return 40;
+
case MONS_HIPPOGRIFF:
case MONS_GIANT_BAT:
case MONS_BUTTERFLY:
@@ -1974,6 +2117,9 @@ int mons_swamp_level(int mcls)
case MONS_RAT:
case MONS_SWAMP_DRAKE:
case MONS_WORM:
+ case MONS_SWAMP_WORM:
+ case MONS_MERFOLK:
+ case MONS_MERMAID:
mlev++;
break;
@@ -2051,6 +2197,7 @@ int mons_swamp_rare(int mcls)
return 61;
case MONS_SLIME_CREATURE:
+ case MONS_MERFOLK:
return 54;
case MONS_SNAKE:
@@ -2078,6 +2225,7 @@ int mons_swamp_rare(int mcls)
case MONS_KOMODO_DRAGON:
case MONS_VERY_UGLY_THING:
case MONS_VAPOUR:
+ case MONS_MERMAID:
return 15;
case MONS_PHANTOM:
@@ -2140,6 +2288,7 @@ int mons_hallzot_level(int mcls)
case MONS_SKELETAL_DRAGON:
case MONS_STORM_DRAGON:
case MONS_CURSE_TOE:
+ case MONS_ORB_GUARDIAN:
mlev += 5;
break;
case MONS_DEATH_COB:
@@ -2526,6 +2675,12 @@ int mons_standard_level(int mcls)
case MONS_TITAN:
return 30;
+ case MONS_DEEP_ELF_BLADEMASTER:
+ case MONS_DEEP_ELF_MASTER_ARCHER:
+ return 33;
+
+ case MONS_MERFOLK:
+ case MONS_MERMAID:
case MONS_BIG_FISH:
case MONS_ELECTRICAL_EEL:
case MONS_GIANT_GOLDFISH:
@@ -2548,6 +2703,8 @@ int mons_standard_rare(int mcls)
{
// "another lava thing" has no stats! (GDL)
// case MONS_ANOTHER_LAVA_THING:
+ case MONS_MERFOLK:
+ case MONS_MERMAID:
case MONS_BIG_FISH:
case MONS_ELECTRICAL_EEL:
case MONS_GIANT_GOLDFISH: