A toy model for randomised gods.
We need some way to express things like: “this conduct enforces that power”, “this power clashes with that power” etc. Here, I use (something can be a power, a piety rule, a conduct, or another tag):
tags: !something -- something cannot be used tags: >something -- something must be used tags: something -- something will get much higher weight tags: &something -- unique among the somethings
Here are some examples from the actual code (abl-show.cc
). Ideally, before doing anything with random god powers, we'd move the definitions of (current) god powers to a text file. That would make testing and tweaking easier.
// The four numerical fields are: MP, HP, food, and piety. // Note: food_cost = val + random2avg( val, 2 ) // piety_cost = val + random2( (val + 1) / 2 + 1 ); // hp cost is in per-mil of maxhp (i.e. 20 = 2% of hp, rounded up)
name: what's printed on the 'a'bility screen; strings are from abl-show.cc desc: what's printed on the ^ screen; strings are listed in religion.cc -- ideally, the messages for gaining/losing the power should be listed here
function: ABIL_ZIN_IMPRISON name: Imprison cost: 5 magic, 125 food, 4 piety piety: 3 desc: call upon Zin to imprison the lawless
function: ABIL_ZIN_SANCTUARY name: "Sanctuary" cost: 7 magic, 150 food, 15 piety piety: 5 desc: call upon Zin to create a sanctuary
function: ABIL_OKAWARU_HEROISM name: Heroism cost: 2 magic, 50 food, 1 piety piety: 1 desc: gain great but temporary skills
function: ABIL_OKAWARU_FINESSE name: Finesse cost: 5 magic, 100 food, 4 piety piety: 5 desc: speed up your combat
function: ABIL_MAKHLEB_GREATER_SERVANT_OF_MAKHLEB name: Greater Servant of Makhleb cost: scaling_cost::fixed(10) health, 100 food, 5 piety piety: 5 desc: summon a greater servant of Makhleb
function: ABIL_TROG_BERSERK name: Berserk cost: 200 food piety: 1 desc: go berserk at will
function: ABIL_TROG_REGEN_MR name: Trog's Hand cost: 50 food, generic_cost::range(2, 3) piety piety: 2 desc: regenerate and be protected from hostile enchantments
function: ABIL_TROG_BROTHERS_IN_ARMS name: Brothers in Arms cost: 100 food, generic_cost::range(5, 6) piety piety: 4 desc: call in reinforcements
function: ABIL_LUGONU_CORRUPT name: "Corrupt" cost: 7 magic, scaling_cost::fixed(5) health, 500 food, generic_cost::range(10, 14) piety piety: 4 desc: corrupt the fabric of space
function: ABIL_LUGONU_ABYSS_ENTER name: "Enter the Abyss" cost: 9 magic, 500 food, generic_cost::fixed(35) piety piety: 5 desc: gate yourself to the Abyss - for a price abflag: ABFLAG_PAIN
function: ABIL_NEMELEX_STACK_FIVE name: "Stack Five" cost: 5 magic, 250 food, 10 piety piety: 5 desc: order the top five cards of a deck, losing the rest
function: ABIL_JIYVA_CURE_BAD_MUTATION name: "Cure Bad Mutation" cost: 8 magic, 200 food, 15 piety piety: 5 desc: call upon Jiyva to remove your harmful mutations
function: ABIL_FEDHAS_RAIN name: "Rain" cost: 4 magic, 150 food, 4 piety piety: 4 desc: control the weather
function: ABIL_CHEIBRIADOS_TIME_STEP name: "Step From Time" cost: 10 magic, 200 food, 10 piety piety: 5 desc: step out of the time flow
We should start with powers that can be directly used, with almost no additional coding needed (Fire/Ice Storm, Artefact, Tomb, Guardian Genie). Summon Uniques and Undying Loyalty do require some code, but I wanted two simple powers with interesting tags.
The Shoplift power is harder to code (but we will want that one anyway!); I list it here to show some tags combinations. And also some limits of the mask.
name: Fire_Storm weight: 5 costs: 40 piety, 400 hunger, 9 magic use: active piety: 5 clause: "create a fiery storm upon their foes" tags: fire, !allies labels: trademark, tactical
name: Ice_Storm weight: 5 costs: 40 piety, 400 hunger, 9 magic use: active piety: 5 clause: "create a storm of arctic fury upon their foes" tags: ice, !allies labels: trademark, tactical
name: Artefactise weight: 10 costs: 80 piety use: active piety: 5 clause: "turn the wielded item into an artefact" tags: acid, !allies labels: trademark, strategical
name: Tomb_Self weight: 10 costs: 60 piety, 300 hunger, 7 magic use: active piety: 5 clause: "entomb themselves" tags: earth labels: trademark, emergency
name: Guardian_Genie -- like amulet of guardian spirit weight: 10 -- but with better MP -> HP ratio costs: none -- for a start, say: 1 MP -> 3 HP use: passive piety: 3 clause: "avoid deadly accidents by resourcefully turning power into life" tags: labels: trademark, strategical
name: Summon_Uniques -- uniques are listed in five tiers (for **,...,****** piety) weight: 5 -- track killed uniques in a ring (if killed again, go at end) costs: 20 piety -- using the ability looks for a unique of fitting tier at the top use: active piety: 2 clause: "temporarily call vanquished heroes to fight side by side" tags: hates uniques, allies labels: trademark, tactical
name: Wordless_Magic weight: 10 costs: continuous piety, 300 hunger magic -- "continuous piety" = like Injury Mirror use: active -- you pay piety when using the power, and piety: 4 -- each casting costs piety per spell level clause: "cast like a demon, even enshrouded in silence" tags: caster, likes demons labels: trademark, tactical
name: Undying_Loyalty weight: 10 costs: none use: passive piety: 0 clause: "encourage allies to fight beyond death" tags: allies labels: trademark, strategical
name: Shoplift weight: 3 cost: 30 piety -- ideally, piety cost would increase (e.g. 10, 30, 50 per shop) use: special -- not a normal active ability: it is a new option in shops piety: 1 -- can steel thrice from a shop: at *, at *** and at ***** piety clause: "steal items from the stock of shopkeepers" labels: trademark, strategical
Here is a simple way to keep constant costs, while still having further shoplifts be more expensive. Note the weights and tags!
name: Shoplift_I weight: 3 cost: 10 piety -- 10 piety cost for the first shoplift use: shop -- needs a special hook to be used in shops piety: 1 -- first theft at * piety clause: "steal items from the stock of shopkeepers" tags: >Shoplift_II -- *forces* the other two Shoplift powers tags: >Shoplift_III labels: trademark, strategical
name: Shoplift_II -- and similarly for Shoplift_III, not listed here weight: 0 -- 0 weight - cannot be rolled randomly! cost: 30 piety -- 30 piety cost for second shoplift use: special -- not a normal active ability: it is a new option in shops piety: 3 -- second theft at *** piety clause: -- no clause or labels needed (those come from Shoplift_I) labels:
Sorted by tags. I try to provide some tags with enough powers, so that we can build gods not just from conduct or completely at random, but also along tag. Trademark powers or conducts of that tag mentioned, but the entry is not copied from above.
Trademark powers: Undying_Loyalty Summon_Uniques
name: Summon_Insects -- perhaps can recycle the Foxfire card here, at least in part weight: 10 cost: 3 piety, 3 magic, 30 hunger use: active piety: 1 clause: "can cause a multitude of insects for support" tags: allies
name: Summon_Eyes -- all kinds of eyes - very strong, but nasty if it goes wrong weight: 5 -- ability summons a single eyeball cost: 3 piety, 6 magic, 60 hunger use: active piety: 3 clause: "can rely on the help of eyeballs" tags: allies
name: Summon_Golem -- the golem has a long duration weight: 5 cost: 5 piety, 8 magic, 30 hunger use: active piety: 3 clause: "can construct a long-lasting golem" tags: allies
name: Friendly_Swap -- always works weight: 10 cost: 2 piety, 2 magic use: active piety: 1 clause: "can swap position with any friendly creature in sight" tags: allies
name: Collective_Drinks -- inspired by dtsund's Crawl Light which uses this power for Beogh weight: 10 -- potions quaffed by player also apply to all allies in a range (say 3 squares) cost: none use: passive piety: 2 clause: "apply the effects of their potions to their nearby allies" tags: allies
Piety gain: exploration_with_books
name: Book_Explosion -- re-use Trog's book burning but replace the single column of fire weight: 10 -- with a 3x3 fireball; power depends on book, as with Trog cost: none use: active piety: 2 clause: "set spellbooks ablaze into impressive balls of fire" tags: books
name: Animate_Book -- re-use Dancing Weapon code (in particular, book not gone afterwards) weight: 10 -- power from book level cost: 5 magic, 4 piety, 50 hunger use: active piety: 2 clause: "animate books, turning them into aggressive and voracious companions" tags: books
name: Cast_From_Book -- cast spell from book at 100% success and 75% power weight: 10 -- destroys book cost: 9 magic, 4 piety, 300 hunger use: active piety: 3 clause: "tear out a single page from any spellbook, casting that spell without failure and destroying the book in the process" tags: books
name: Tame_By_Book -- can enslave hostile casters by throwing a book at them weight: 5 -- always works, but duration depends on book power vs caster HD cost: none -- book is gone use: passive piety: 2 clause: "temporarily have hostile spellcasters switch allegiance by throwing spellbooks at them" tags: books
Trademark power: Tomb_Self
name: Tomb_Other -- recycle Zin's Imprison power weight: 10 -- cost etc. should be taken from Zin as well cost: 3 piety, 50 food, 5 magic use: active piety: 2 clause: "temporarily imprison their enemies" tags: earth
name: Crush -- drop down something on the target (a stone, a large rock, or a wall): weight: 10 -- choose between stone and rock depending on piety (only rock if piety>100) and monster size cost: 3 piety -- *if* a large rock is used *and* the monster dies, have a chance to place a rock wall instead use: active piety: 2 clause: "drop heavy objects on their foes" tags: earth
name: Passwall -- the spell weight: 10 cost: 3 piety, 50 food, 5 magic use: active piety: 2 clause: "pass through rock walls" tags: earth, stealth
name: Descend_Self -- Create shaft beneath player; still have to use > to go down weight: 10 -- so a two turn escape; does not work in Abyss, Pan, branch ends cost: 6 piety, 300 hunger use: active piety: 3 clause: "can create a shaft to escape from peril" tags: earth, emergency
name: Descend_Other -- Create shaft beneath a monster; the monster falls down right away weight: 10 -- does not work in Abyss, Pan, branch ends, on large/flying monsters cost: 3 piety, 5 magic, 100 hunger use: active piety: 2 clause: "can create a shaft to send monsters to the next level, apart from the large and flying ones" tags: earth
Piety gain: kill_suddenly Minor Power: Passwall
name: Ensnare -- throw nets on all enemies in sight weight: 10 -- durability of nets depends on Invocations cost: 5 piety use: active piety: 1 clause: "may ensnare all enemies in sight" tags: stealth -- good for stabbing
name: Detect_Sleepers -- like Ashenzari's monster detection (at maximal Ash piety) weight: 10 -- but only for sleeping monsters cost: 5 piety -- and don't show monster tier use: passive piety: 1 clause: "will detect targets before seeing them" tags: stealth
In principle, we have lots of knobs with piety powers: how much piety to gain from a kill (or an explored square); how much piety to lose per turn. But I believe that's not a good approach — impossible to get the information to players in a decent fashion, and it does not make balancing easier. Instead, I suggest that we follow established gods. So “piety for all kills” takes Makhleb's parameters, and “piety for exploration while carrying books” takes Ashenzari's mechanic, turning curses into books.
name: exploration desc: "wants followers to explore the world" gain: Ashenzari(1) -- number is bonded parts with Ashenzari
name: exploration_with_books desc: "wants followers to explore the world while carrying as much literature as possible" gain: Ashenzari((books-5)/3) tags: caster, books
name: sacrifice_books desc: "wants followers to keep the dungeon free of books" gain: value/30 -- made up value, I don't know what's good here tags: !caster, !books -- might fit thematically with the books tag, but not in gameplay
name: sacrifice_gold desc: "demands a tithe" gain: Zin tags: shoplift
name: kill desc: "wants followers to kill the living as well as the dead and demons" gain: Makhleb
name: kill_uniques desc: "wants followers to take on heretic heroes as quickly as possible" gain: 10 -- again, no idea -- for later (if we keep this), it'd be interesting to link piety gain to -- time between unique seen and killed, eg. gain = 5 + f(time_killed-time_seen)
name: kill_novelties desc: "only appreciates the first time kill of any breed" gain: 4 * Makhleb
name: kill_suddenly -- enemy does not wake up (stabbed to death or otherwise one-hit kill) desc: "only values kills which did not wake up the victim" gain: 7 tags: stealth
Not much here, just to have conducts in the infrastructure.
The third one just as an example of god building:
name: reduced_inventory desc: "demands worshippers to rely on faith rather than trinkets" weight: 1 effect: signature -- this is a major conduct: the player gets a second trademark power! -- (each piety star reduces inventory by four more slots)
name: no_dropping desc: "abhors at the very idea of putting things on the floor" weight: 1 effect: -- items dropped vanish (ideally, turn off autopickup and autoinscribe all items upon pickup with !d) effect: signature -- this is comparable to reduced inventory above tags: conversation -- increased chance for the conversation power
name: no_buying desc: "hates merchants and their ways" weight: 1 tags: >shoplift, sacrifice_gold -- forces shoplift power; higher chance to have gold sacrifice as piety gain
name: no_casting -- blatant Trog rip-off, but okay for a random god desc: "hates all users of magic" weight: 1 tags: !caster, books -- forbids any powers etc. befitting casters; the books effects are about unusual book use, so fit tags: >kill_casters -- forces use of (the minor) piety gain for killing casters