summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/ng-restr.cc
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-10-24 12:42:13 +0200
committerRobert Vollmert <rvollmert@gmx.net>2009-10-24 14:31:30 +0200
commit394fb595f6d03fa9d266ed28726975e0b59bc798 (patch)
tree3a84b6c9ced49b07af9212a3447770ae53897ed5 /crawl-ref/source/ng-restr.cc
parentea81f9787b7cba7a18ec7c098fcd0fe37fe7daef (diff)
downloadcrawl-ref-394fb595f6d03fa9d266ed28726975e0b59bc798.tar.gz
crawl-ref-394fb595f6d03fa9d266ed28726975e0b59bc798.zip
Extract newgame character restrictions from newgame.cc.
The functions in the new ng-restr.cc are "pure": They don't access global state; data is passed in via the new and incomplete newgame_def. Eventually, new_game should be split into something like newgame_def choose_game(); that doesn't access "you", and void setup_game(newgame_def); that sets up the player. Also get rid of player_size in favour of player::body_size. Rename player_size_type to size_part_type since it's not really player-specific (used in actor::body_size). Move parts of player_genus, player::has_claws, body_size out into species.cc.
Diffstat (limited to 'crawl-ref/source/ng-restr.cc')
-rw-r--r--crawl-ref/source/ng-restr.cc929
1 files changed, 929 insertions, 0 deletions
diff --git a/crawl-ref/source/ng-restr.cc b/crawl-ref/source/ng-restr.cc
new file mode 100644
index 0000000000..fc43191023
--- /dev/null
+++ b/crawl-ref/source/ng-restr.cc
@@ -0,0 +1,929 @@
+/*
+ * File: ng-restr.cc
+ * Summary: Character choice restrictions.
+ *
+ * The functions in this file are "pure": They don't
+ * access any global data.
+ */
+
+#include "AppHdr.h"
+
+#include "ng-restr.h"
+#include "newgame.h"
+#include "species.h"
+#include "jobs.h"
+
+char_choice_restriction class_allowed(species_type speci,
+ job_type char_class)
+{
+ switch (char_class)
+ {
+ case JOB_FIGHTER:
+ switch (speci)
+ {
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_DEEP_DWARF:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_OGRE:
+ case SP_RED_DRACONIAN:
+ case SP_MUMMY:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_GLADIATOR:
+ switch (speci)
+ {
+ case SP_DEEP_ELF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_RED_DRACONIAN:
+ case SP_GHOUL:
+ case SP_MUMMY:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_MONK:
+ switch (speci)
+ {
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_RED_DRACONIAN:
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_BERSERKER:
+ switch (speci)
+ {
+ case SP_DEMIGOD:
+ return (CC_BANNED);
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_RED_DRACONIAN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_PALADIN:
+ switch (speci)
+ {
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_BANNED);
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_KENKU:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_PRIEST:
+ switch (speci)
+ {
+ case SP_DEMIGOD:
+ return (CC_BANNED);
+ case SP_DEEP_ELF:
+ case SP_DEEP_DWARF:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_KENKU:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_CHAOS_KNIGHT:
+ switch (speci)
+ {
+ case SP_DEMIGOD:
+ return (CC_BANNED);
+ case SP_DEEP_ELF:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_KENKU:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_DEATH_KNIGHT:
+ switch (speci)
+ {
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_KENKU:
+ case SP_GHOUL:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_HEALER:
+ switch (speci)
+ {
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_BANNED);
+ case SP_DEEP_ELF:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_CRUSADER:
+ switch (speci)
+ {
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_REAVER:
+ switch (speci)
+ {
+ case SP_HUMAN:
+ case SP_SLUDGE_ELF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_RED_DRACONIAN:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_WIZARD:
+ switch (speci)
+ {
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_OGRE:
+ case SP_MINOTAUR:
+ case SP_GHOUL:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_CONJURER:
+ switch (speci)
+ {
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_ENCHANTER:
+ switch (speci)
+ {
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_RED_DRACONIAN:
+ case SP_DEMONSPAWN:
+ case SP_GHOUL:
+ case SP_MUMMY:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_SUMMONER:
+ switch (speci)
+ {
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_RED_DRACONIAN:
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_GHOUL:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_NECROMANCER:
+ switch (speci)
+ {
+ case SP_HIGH_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_GHOUL:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_WARPER:
+ switch (speci)
+ {
+ case SP_HUMAN:
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_RED_DRACONIAN:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_TRANSMUTER:
+ switch (speci)
+ {
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_FIRE_ELEMENTALIST:
+ switch (speci)
+ {
+ case SP_DEEP_DWARF:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_ICE_ELEMENTALIST:
+ switch (speci)
+ {
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_AIR_ELEMENTALIST:
+ switch (speci)
+ {
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_EARTH_ELEMENTALIST:
+ switch (speci)
+ {
+ case SP_HIGH_ELF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_SPRIGGAN:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_RED_DRACONIAN:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_VENOM_MAGE:
+ switch (speci)
+ {
+ case SP_HIGH_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_HALFLING:
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_STALKER:
+ switch (speci)
+ {
+ case SP_HIGH_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_RED_DRACONIAN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_THIEF:
+ return (CC_RESTRICTED);
+
+ case JOB_ASSASSIN:
+ switch (speci)
+ {
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_RED_DRACONIAN:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_HUNTER:
+ switch (speci)
+ {
+ case SP_DEEP_DWARF:
+ case SP_KOBOLD:
+ case SP_NAGA:
+ case SP_RED_DRACONIAN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_ARTIFICER:
+ switch (speci)
+ {
+ case SP_CENTAUR:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_OGRE:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ return (CC_RESTRICTED);
+ default:
+ return (CC_UNRESTRICTED);
+ }
+
+ case JOB_WANDERER:
+ return (CC_RESTRICTED);
+
+ default:
+ return (CC_BANNED);
+ }
+}
+
+bool is_good_combination(species_type spc, job_type cls, bool good)
+{
+ const char_choice_restriction restrict = class_allowed(spc, cls);
+
+ if (good)
+ return (restrict == CC_UNRESTRICTED);
+
+ return (restrict != CC_BANNED);
+}
+
+// Is the given book restricted for the character defined by ng?
+// Only uses ng.species.
+char_choice_restriction book_restriction(startup_book_type booktype,
+ const newgame_def &ng)
+{
+ ASSERT(is_valid_species(ng.species));
+ switch (booktype)
+ {
+ case SBT_FIRE: // Fire
+ switch (ng.species)
+ {
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_HILL_ORC:
+ case SP_KOBOLD:
+ case SP_NAGA:
+ case SP_OGRE:
+ case SP_KENKU:
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ return (CC_UNRESTRICTED);
+
+ default:
+ if (species_genus(ng.species) == GENPC_DRACONIAN)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+ }
+ break;
+
+ case SBT_COLD: // Ice
+ switch (ng.species)
+ {
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_KOBOLD:
+ case SP_NAGA:
+ case SP_OGRE:
+ case SP_KENKU:
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ return (CC_UNRESTRICTED);
+
+ default:
+ if (species_genus(ng.species) == GENPC_DRACONIAN)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+ }
+ break;
+
+ case SBT_SUMM: // Summoning
+ switch (ng.species)
+ {
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_KOBOLD:
+ case SP_NAGA:
+ case SP_OGRE:
+ case SP_KENKU:
+ case SP_MUMMY:
+ case SP_VAMPIRE:
+ return (CC_UNRESTRICTED);
+
+ default:
+ return (CC_RESTRICTED);
+ }
+ break;
+
+ default:
+ return (CC_RESTRICTED);
+ }
+}
+
+// Is the given god restricted for the character defined by ng?
+// Only uses ng.species and ng.job.
+char_choice_restriction weapon_restriction(weapon_type wpn,
+ const newgame_def &ng)
+{
+ ASSERT(is_valid_species(ng.species));
+ ASSERT(is_valid_job(ng.job));
+ switch (wpn)
+ {
+ case WPN_UNARMED:
+ if (species_has_claws(ng.species))
+ return (CC_UNRESTRICTED);
+ return (CC_BANNED);
+
+ case WPN_SHORT_SWORD:
+ switch (ng.species)
+ {
+ case SP_NAGA:
+ case SP_VAMPIRE:
+ // The fighter's heavy armour hinders stabbing.
+ if (ng.job == JOB_FIGHTER)
+ return (CC_RESTRICTED);
+ // else fall through
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ // Sludge elves have bad aptitudes with short swords (110) but are
+ // still better with them than any other starting weapon.
+ case SP_SLUDGE_ELF:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ return (CC_UNRESTRICTED);
+
+ default:
+ return (CC_RESTRICTED);
+ }
+
+ // Maces and hand axes usually share the same restrictions.
+ case WPN_MACE:
+ if (ng.species == SP_TROLL)
+ return (CC_UNRESTRICTED);
+ if (ng.species == SP_VAMPIRE)
+ return (CC_RESTRICTED);
+ // else fall-through
+ case WPN_HAND_AXE:
+ switch (ng.species)
+ {
+ case SP_HUMAN:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MUMMY:
+ case SP_CENTAUR:
+ case SP_NAGA:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_VAMPIRE:
+ return (CC_UNRESTRICTED);
+
+ default:
+ return (species_genus(ng.species) == GENPC_DRACONIAN ? CC_UNRESTRICTED
+ : CC_RESTRICTED);
+ }
+
+ case WPN_SPEAR:
+ switch (ng.species)
+ {
+ case SP_HUMAN:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_DEMIGOD:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ return (CC_UNRESTRICTED);
+
+ default:
+ return (species_genus(ng.species) == GENPC_DRACONIAN ? CC_UNRESTRICTED
+ : CC_RESTRICTED);
+ }
+
+ case WPN_TRIDENT:
+ if (ng.species != SP_MERFOLK
+ && (ng.job != JOB_GLADIATOR
+ || species_size(ng.species, PSIZE_BODY) < SIZE_MEDIUM))
+ {
+ return (CC_BANNED);
+ }
+
+ // Tridents are strictly better than spears, so unrestrict them
+ // for some species whose Polearm aptitudes are not too bad.
+ switch (ng.species)
+ {
+ case SP_MOUNTAIN_DWARF:
+ case SP_OGRE:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_UNRESTRICTED);
+ default:
+ break;
+ }
+
+ // Both are polearms, right?
+ return (weapon_restriction(WPN_SPEAR, ng));
+
+ case WPN_ANKUS:
+ if (species_genus(ng.species) == GENPC_OGRE)
+ return (CC_UNRESTRICTED);
+ // intentional fall-through
+ default:
+ return (CC_BANNED);
+ }
+}
+
+// Is the given god restricted for the character defined by ng?
+// Only uses ng.species and ng.job.
+char_choice_restriction religion_restriction(god_type god,
+ const newgame_def &ng)
+{
+ ASSERT(is_valid_species(ng.species));
+ ASSERT(is_valid_job(ng.job));
+
+ // Sanity check.
+ if (ng.species == SP_DEMIGOD)
+ return (CC_BANNED);
+
+ switch (god)
+ {
+ case GOD_BEOGH:
+ if (ng.species == SP_HILL_ORC)
+ return (CC_UNRESTRICTED);
+ return (CC_BANNED);
+
+ case GOD_ZIN:
+ switch (ng.species)
+ {
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_BANNED);
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_MINOTAUR:
+ case SP_OGRE:
+ return (CC_UNRESTRICTED);
+ default:
+ return (CC_RESTRICTED);
+ }
+
+ case GOD_YREDELEMNUL:
+ switch (ng.species)
+ {
+ case SP_HILL_ORC:
+ // Restrict in favour of Beogh, else unrestricted.
+ if (ng.job == JOB_PRIEST)
+ return (CC_RESTRICTED);
+ return (CC_UNRESTRICTED);
+
+ case SP_DEEP_ELF:
+ case SP_KENKU:
+ // Unrestrict these only for Priests as Zin is worse, but
+ // Necromancy (DK) the better choice.
+ if (ng.job == JOB_PRIEST)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_UNRESTRICTED);
+ default:
+ if (species_genus(ng.species) == GENPC_DRACONIAN)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+ }
+
+ case GOD_XOM:
+ switch (ng.species)
+ {
+ case SP_MOUNTAIN_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_KENKU:
+ case SP_DEMONSPAWN:
+ return (CC_UNRESTRICTED);
+ default:
+ if (species_genus(ng.species) == GENPC_DRACONIAN)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+ }
+
+ case GOD_MAKHLEB:
+ switch (ng.species)
+ {
+ case SP_HUMAN:
+ case SP_HIGH_ELF:
+ case SP_DEEP_ELF:
+ case SP_SLUDGE_ELF:
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ case SP_NAGA:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_DEMONSPAWN:
+ case SP_MUMMY:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_UNRESTRICTED);
+ default:
+ if (species_genus(ng.species) == GENPC_DRACONIAN)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+ }
+
+ case GOD_LUGONU:
+ switch (ng.species)
+ {
+ case SP_HUMAN:
+ case SP_MOUNTAIN_DWARF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ case SP_SPRIGGAN:
+ case SP_CENTAUR:
+ case SP_OGRE:
+ case SP_TROLL:
+ case SP_MINOTAUR:
+ case SP_DEMONSPAWN:
+ case SP_GHOUL:
+ case SP_VAMPIRE:
+ return (CC_UNRESTRICTED);
+ default:
+ if (species_genus(ng.species) == GENPC_DRACONIAN)
+ return (CC_UNRESTRICTED);
+ return (CC_RESTRICTED);
+ }
+
+ default:
+ return (CC_RESTRICTED);
+ }
+}