Re-allow Trog worship for Gnolls
authorgammafunk <gammafunk@gmail.com>
Sun, 1 Oct 2017 07:23:57 +0000 (02:23 -0500)
committergammafunk <gammafunk@gmail.com>
Sun, 1 Oct 2017 07:38:13 +0000 (02:38 -0500)
Forbidding Gnolls from Trog worship was only strictly necessary because
of one extremely minor aspect of Trog's conduct, which is penance for
training magical schools, something that is involuntary for Gnolls.  The
conduct itself likely wouldn't need to exist if we e.g. forbade melee
with magical staves instead. Although Trog is not the most interesting
god choice for Gnolls, no one likes worship restrictions for very
technical reasons, and flavor-wise there's no justification either.

This commit has Trog ignore penance for Gnolls due to training spells,
but still give the usual penance for memorizing or casting spells.
Berserker is also re-enabled as a background choice. The god penance map
code needs some generalization to better handle cases like these, which
is noted in code comments.

crawl-ref/source/god-conduct.cc
crawl-ref/source/ng-restr.cc
crawl-ref/source/religion.cc

index 72ddeeb..e1687b4 100644 (file)
@@ -484,6 +484,15 @@ string get_god_dislikes(god_type which_god)
 
     for (const auto& entry : divine_peeves[which_god])
     {
+        // Trog forgives Gnolls practising spellcasting since they do it
+        // without choice. XXX: Rework the peeve_map to allow checking this.
+        if (which_god == GOD_TROG
+            && you.species == SP_GNOLL
+            && entry.first == DID_SPELL_PRACTISE)
+        {
+            continue;
+        }
+
         if (entry.second.desc)
         {
             if (entry.second.really_dislike)
@@ -1004,13 +1013,22 @@ static bool _god_likes_killing(const monster& victim)
 static void _handle_your_gods_response(conduct_type thing_done, int level,
                                        bool known, const monster* victim)
 {
+    COMPILE_CHECK(ARRAYSZ(divine_peeves) == NUM_GODS);
+    COMPILE_CHECK(ARRAYSZ(divine_likes) == NUM_GODS);
+
     // Lucy gives no piety in Abyss. :(
     // XXX: make this not a hack...? (or remove it?)
     if (you_worship(GOD_LUGONU) && player_in_branch(BRANCH_ABYSS))
         return;
 
-    COMPILE_CHECK(ARRAYSZ(divine_peeves) == NUM_GODS);
-    COMPILE_CHECK(ARRAYSZ(divine_likes) == NUM_GODS);
+    // Trog forgives Gnolls practising spellcasting since they do it without
+    // choice. XXX: Rework the peeve_map to allow checking this.
+    if (you_worship(GOD_TROG)
+        && you.species == SP_GNOLL
+        && thing_done == DID_SPELL_PRACTISE)
+    {
+        return;
+    }
 
     // If your god disliked the action, evaluate its response.
     if (auto peeve = map_find(divine_peeves[you.religion], thing_done))
index bdb7596..77264af 100644 (file)
@@ -38,10 +38,6 @@ static bool _banned_combination(job_type job, species_type species)
             return true;
         }
         break;
-    case SP_GNOLL:
-        if (job == JOB_BERSERKER)
-            return true;
-        break;
     default:
         break;
     }
index cfa30de..1517e04 100644 (file)
@@ -3089,9 +3089,6 @@ bool player_can_join_god(god_type which_god)
       return false;
     }
 
-    if (which_god == GOD_TROG && you.species == SP_GNOLL)
-        return false;
-
     return _transformed_player_can_join_god(which_god);
 }