Permalink
Browse files

New god: the Ieoh Jian Council

-- Gameplay Niche --

IJC is a god based on mobile melee combat, offering strong incentives
to fight groups of enemies in the open. It provides melee characters
with a strong but relatively flat power increase in the form of special
attacks triggered by moving, and offers effective positioning tools to
hybrids and ranged characters.

IJC is different from other melee focused gods in that its active
abilities are unlocked late and lacks any permanent gifts. It is instead
focused on offense and constant mobility. Its associated brand is Speed,
and to a lesser extent Flaming and Electrocution.

-- Theme --

IJC is a council of formerly mortal monks. The theme draws heavily from
Chinese imagery and traditional Chinese martial arts in particular.

-- Powers --

The god revolves around three "martial attacks" and the interactions
between them. The player is incentivized to use these special attacks
in difficult fights, and they're designed to prevent any of the three
from being overcentralizing or optimal for any particular build.

Below is a brief description of each of them, and the justification for
each particular effect.

Lunge: Triggered by moving towards an enemy. Deals extra damage against
slowed or distracted enemies.
   * It is important that constantly luring and lunging against full-speed
   monsters isn't optimal; hence, Lunge doesn't impart any status effect,
   and instead exploits monsters who are already unable to kite effectively.

Whirlwind: Triggered by moving from a tile adjacent to an enemy to another
tile adjacent to it. Can cause slow.
   * Whirlwind is the most spammable of the moves, so it is assigned a
   non-stacking, longer duration debuff so players are incentivized to
   improvise once the effect triggers. The slow lasts around six turns.

Wall Jump: Triggered by moving against a solid obstacle. It propels the
character two tiles in the opposite direction, attacking in an area of
effect. Can cause a brief distraction to onlookers.
   * Wall Jump provides the most benefit in terms of positioning and
   escape, while being the least spammable, and as such is assigned a shorter
   duration, more tactical debuff (1-3 turns).

There isn't a 1-to-1 relation between moving and attacking. Instead,
moving causes the player to trigger the appropriate martial attack a
number of times, that averages out to the same number of attacks per
aut as normal tabbing (thanks to weighted rounding).

After the three moves are unlocked, the player unlocks two active
abilities.

Serpent's Lash: Instant ability with Exhaustion and a moderate Piety
cost. Causes your next two movement actions to be instant, and boosts
your martial attacks during them. Serpent's Lash can be used as a simple
escape, but given how the geometry of the level affects Wall Jump, it's
generally more efficient to use martial attacks even when running away,
which combines well with the kit.

Heaven on Earth: Summons a storm of golden clouds. Provides a hefty
Slaying bonus and constantly triggers a powerful opaque fog, reducing
visibility and protecting against ranged monsters. The storm is very
short lived, but continuing to use martial attacks against multiple
enemies refreshes the duration and increases the slaying bonus. It
can last indefinitely if the player is able to stay in combat against
multiple enemies in the open. Heaven on Earth has explicit synergy
with Serpent's Lash, as the latter will prevent the storm from decaying
while allowing the player to build it back up quickly.
  • Loading branch information...
PabloMansanet authored and PleasingFungus committed Feb 9, 2017
1 parent 71b7943 commit 0c5bb27cdc96ae43922ca6d2cacd5819ac3192bd
Showing with 979 additions and 26 deletions.
  1. +35 −0 crawl-ref/source/ability.cc
  2. +2 −0 crawl-ref/source/areas.cc
  3. +7 −0 crawl-ref/source/cloud.cc
  4. +6 −0 crawl-ref/source/colour.cc
  5. +1 −0 crawl-ref/source/colour.h
  6. +1 −1 crawl-ref/source/contrib/sqlite
  7. +4 −0 crawl-ref/source/dat/database/godname.txt
  8. +4 −0 crawl-ref/source/dat/database/godspeak.txt
  9. +12 −0 crawl-ref/source/dat/descript/ability.txt
  10. +5 −0 crawl-ref/source/dat/descript/features.txt
  11. +36 −0 crawl-ref/source/dat/descript/gods.txt
  12. +11 −0 crawl-ref/source/dat/descript/status.txt
  13. +1 −1 crawl-ref/source/dat/vim/syntax/levdes.vim
  14. +2 −0 crawl-ref/source/defines.h
  15. +4 −0 crawl-ref/source/describe-god.cc
  16. +7 −0 crawl-ref/source/duration-data.h
  17. +20 −1 crawl-ref/source/enum.h
  18. +1 −0 crawl-ref/source/feature-data.h
  19. +11 −1 crawl-ref/source/fight.cc
  20. +3 −1 crawl-ref/source/fight.h
  21. +11 −1 crawl-ref/source/god-conduct.cc
  22. +370 −0 crawl-ref/source/god-passive.cc
  23. +12 −0 crawl-ref/source/god-passive.h
  24. +118 −0 crawl-ref/source/god-wrath.cc
  25. +31 −7 crawl-ref/source/main.cc
  26. +135 −5 crawl-ref/source/melee-attack.cc
  27. +8 −1 crawl-ref/source/melee-attack.h
  28. +13 −1 crawl-ref/source/message.cc
  29. +1 −0 crawl-ref/source/message.h
  30. +2 −1 crawl-ref/source/mon-act.cc
  31. +3 −0 crawl-ref/source/mon-behv.cc
  32. +2 −1 crawl-ref/source/mon-ench.cc
  33. +1 −0 crawl-ref/source/mon-info.cc
  34. +1 −0 crawl-ref/source/mon-info.h
  35. +1 −0 crawl-ref/source/output.cc
  36. +3 −2 crawl-ref/source/player-act.cc
  37. +2 −0 crawl-ref/source/player.cc
  38. +35 −0 crawl-ref/source/religion.cc
  39. +1 −0 crawl-ref/source/religion.h
  40. +1 −0 crawl-ref/source/rltiles/dc-feat.txt
  41. +2 −0 crawl-ref/source/rltiles/dc-invocations.txt
  42. +5 −0 crawl-ref/source/rltiles/dc-misc.txt
  43. BIN crawl-ref/source/rltiles/dngn/altars/ieoh_jian.png
  44. BIN crawl-ref/source/rltiles/effect/cloud_gold_dust0.png
  45. BIN crawl-ref/source/rltiles/effect/cloud_gold_dust1.png
  46. BIN crawl-ref/source/rltiles/effect/cloud_gold_dust2.png
  47. BIN crawl-ref/source/rltiles/effect/cloud_gold_dust3.png
  48. BIN crawl-ref/source/rltiles/gui/invocations/ieoh_jian_heaven_on_earth.png
  49. BIN crawl-ref/source/rltiles/gui/invocations/ieoh_jian_serpents_lash.png
  50. +24 −0 crawl-ref/source/status.cc
  51. +3 −1 crawl-ref/source/status.h
  52. +11 −0 crawl-ref/source/terrain.cc
  53. +1 −0 crawl-ref/source/terrain.h
  54. +7 −0 crawl-ref/source/tilepick.cc
  55. +2 −1 crawl-ref/source/timed-effects.cc
@@ -184,6 +184,7 @@ static skill_type _invo_skill()
case GOD_GOZAG:
case GOD_RU:
case GOD_TROG:
case GOD_IEOH_JIAN:
return SK_NONE; // ugh
default:
return SK_INVOCATIONS;
@@ -627,6 +628,12 @@ static const ability_def Ability_List[] =
{ ABIL_HEPLIAKLQANA_IDENTITY, "Ancestor Identity",
0, 0, 0, 0, {FAIL_INVO}, abflag::INSTANT },
// Ieoh Jian
{ ABIL_IEOH_JIAN_SERPENTS_LASH, "Serpent's Lash",
0, 0, 0, 4, {FAIL_INVO}, abflag::EXHAUSTION | abflag::INSTANT },
{ ABIL_IEOH_JIAN_HEAVEN_ON_EARTH, "Heaven On Earth",
0, 0, 0, 20, {FAIL_INVO, piety_breakpoint(5), 0, 1}, abflag::NONE },
{ ABIL_STOP_RECALL, "Stop Recall", 0, 0, 0, 0, {FAIL_INVO}, abflag::NONE },
{ ABIL_RENOUNCE_RELIGION, "Renounce Religion",
0, 0, 0, 0, {FAIL_INVO}, abflag::NONE },
@@ -3066,6 +3073,34 @@ static spret_type _do_ability(const ability_def& abil, bool fail)
hepliaklqana_choose_identity();
break;
case ABIL_IEOH_JIAN_SERPENTS_LASH:
if (you.attribute[ATTR_SERPENTS_LASH])
{
mpr("You're already lashing out.");
return SPRET_ABORT;
}
if (you.duration[DUR_EXHAUSTED])
{
mpr("You're too exhausted to lash out.");
return SPRET_ABORT;
}
fail_check();
mprf(MSGCH_GOD, "Your muscles tense, ready for explosive movement...");
you.attribute[ATTR_SERPENTS_LASH] = 2;
you.redraw_status_lights = true;
return SPRET_SUCCESS;
case ABIL_IEOH_JIAN_HEAVEN_ON_EARTH:
fail_check();
mprf(MSGCH_GOD, "The air is filled with shimmering golden clouds! You feel the urge to strike!");
ieoh_jian_sifu_message(" says: The storm will not ease as long as you keep fighting, disciple!");
for (radius_iterator ai(you.pos(), 2, C_SQUARE); ai; ++ai)
big_cloud(CLOUD_GOLD_DUST, &you, *ai, 10 + random2(5), 50 + random2(30), 4);
you.attribute[ATTR_HEAVEN_ON_EARTH] = 12;
you.duration[DUR_HEAVEN_ON_EARTH] = IEOH_JIAN_HEAVEN_TICK_TIME;
invalidate_agrid(true);
break;
case ABIL_RENOUNCE_RELIGION:
fail_check();
if (yesno("Really renounce your faith, foregoing its fabulous benefits?",
@@ -568,6 +568,8 @@ int player::halo_radius() const
if (player_equip_unrand(UNRAND_EOS))
size = max(size, 3);
else if (you.attribute[ATTR_HEAVEN_ON_EARTH] > 0)
size = max(size, 1);
return size;
}
@@ -280,6 +280,13 @@ static const cloud_data clouds[] = {
BEAM_NONE, {}, // beam & damage
true, // opacity
},
// CLOUD_GOLD_DUST,
{ "gold", nullptr, // terse, verbose name
ETC_HOLY, // colour
{ TILE_CLOUD_GOLD_DUST, CTVARY_DUR }, // tile
BEAM_NONE, {}, // beam & damage
true, // opacity
},
};
COMPILE_CHECK(ARRAYSZ(clouds) == NUM_CLOUD_TYPES);
@@ -655,6 +655,12 @@ void init_element_colours()
40, GREEN,
40, LIGHTGREEN,
0));
add_element_colour(_create_random_element_colour_calc(
ETC_IEOH_JIAN, "ieoh_jian",
40, LIGHTRED,
40, YELLOW,
10, WHITE,
0));
// redefined by Lua later
add_element_colour(new element_colour_calc(
ETC_DISCO, "disco", _etc_random
@@ -63,6 +63,7 @@ enum element_type
ETC_SHINING, // shining gold (Gozag)
#endif
ETC_PAKELLAS, // Pakellas altar colours
ETC_IEOH_JIAN, // Ieoh Jian Chinese takeaway colours
ETC_AWOKEN_FOREST, // Angry trees.
ETC_DISCO = 96,
ETC_FIRST_LUA = ETC_DISCO, // colour indices have to be <128
Submodule sqlite updated 1 files
+1,620 −3,356 sqlite3.c
@@ -79,6 +79,10 @@ Hepliaklqana lastname
Hepliaklqana the Forgotten
%%%%
Ieoh Jian lastname
the Ieoh Jian Council
%%%%
Xom lastname
w:280
@@ -568,6 +568,10 @@ Gozag welcome
Gozag says: Greed is good.
%%%%
Ieoh Jian welcome
The Council says: Follow the Path!
%%%%
Ru welcome
Ru says: Sacrifice that you might gain great power!
@@ -871,6 +871,18 @@ Ancestor Identity ability
Recalls who your ancestor preferred to be known as, correcting their name and
gender. This does not take any time.
%%%%
Serpent's Lash ability
Move at supernatural speeds for a short distance. After using this ability,
the next two movement actions are instant. Martial attacks performed under the
effect of Serpent's Lash are more effective.
%%%%
Heaven On Earth ability
Beseeches the Council to flood the surroundings with a storm of heavenly
clouds. The clouds inspire you to strike strong and true, and hitting enemies
with martial attacks will keep the storm raging for longer.
%%%%
Hop ability
Hops toward a chosen destination, landing somewhere nearby. After using this
@@ -136,6 +136,11 @@ A glowing silver altar of Zin
An altar to Zin the Law-Giver, made from silver as pristine as Zin's followers
are expected to be, and glowing gently.
%%%%
An ornate altar of the Ieoh Jian Council
An red and gold altar to the Ieoh Jian Council. Sharp slivers of steel drift
through the quiet air surrounding it.
%%%%
########################################################################
### Terrain
########################################################################
@@ -68,6 +68,15 @@ ancestor into the world; as they explore and form new experiences, they will
find themselves able to shape and control their ancestor's memory, eventually
bringing them into the ranks of the mythical heroes.
%%%%
Ieoh Jian
The Ieoh Jian Council is a congregation of martial monks, ascended to divinity
after battling their way out of the afterlife. Disciples of the Council are
able to execute acrobatic martial maneuvers, such as wall jumps, spinning
attacks and punishing lunges. They will eventually become able to request
help in the form of a storm of heavenly clouds. Followers unlock these
abilities through practice, so they do not benefit from training Invocations.
%%%%
Jiyva
Jiyva is the ancient deity of the slimes. Followers are expected to
@@ -300,6 +309,26 @@ mutations. As their piety grows, Jiyva will, with increasing frequency, drop
jellies into the dungeon; rearrange followers' attributes based on their skills
and armour; and mutate followers to better reflect Jiyva's image.
%%%%
Ieoh Jian powers
Disciples of the Council learn to perform three martial techniques:
....... ...<lightred>@</lightred>... (*) <lightred>Whirlwind</lightred>: Strike by moving between two tiles
...<lightred>@</lightred>O.. --> ....O.. adjacent to an enemy. May slow down foes.
....... .......
..x.... ..x.... (**) <lightred>Wall Jump</lightred>: Moving into a wall jumps away from
..x<lightred>@</lightred>... --> ..x..<lightred>@</lightred>. it, striking all enemies adjacent to the landing spot.
..x.... ..x.... May distract any witnessing foes.
....... ....... (***) <lightred>Lunge</lightred>: Moving towards enemies in one of the eight
..<lightred>@</lightred>.O.. --> ...<lightred>@</lightred>O.. cardinal directions deals extra damage, especially
....... ....... if it they are slowed or distracted.
Disciples of the Council will also be taught to move at unfathomable speeds for
short distances, and become able to summon a storm of golden clouds to increase
their precision and damage for as long as they keep using their martial attacks.
%%%%
Kikubaaqudgha powers
Kikubaaqudgha will send corpses to followers, and enhance servants' necromantic
@@ -520,6 +549,13 @@ too, will find their own bodies becoming unstable; regularly transmuting into
strange forms and acquiring debilitating mutations, as well as having any gifts
of slime mutations stripped away from them.
%%%%
Ieoh Jian wrath
Those who turn against the Council must be prepared to endure death by a
thousand cuts. No hiding place is secure, no disguise perfect enough to avoid
the sudden spring of traps, the flying daggers and the armies of animated
weapons that will ambush the betrayer.
%%%%
Kikubaaqudgha wrath
Kikubaaqudgha's wrath brings forth all the dread powers of necromancy. Victims
@@ -676,3 +676,14 @@ maintain and intensify the ray, at the cost of 1 MP per turn; any other action,
including recasting the spell, will end it.
# XXX: also cover Ray+, Ray++?
%%%%
Serp status
You are moving at supernatural speed, causing any movement actions to become
instant.
%%%%
Hevn status
Heavenly clouds are boosting your damage and precision. Performing martial
attacks against multiple enemies will prevent the storm from settling.
%%%%
@@ -57,7 +57,7 @@ syn region desNameline start=/^NAME:/ end=/$/ contains=desDec,desVaultname keepe
syn match desVaultname /\w*/ contained
syn match desGod contained /ashenzari\|beogh\|cheibriados\|dithmenos\|elyvilon/
syn match desGod contained /fedhas\|gozag\|hepliaklqana\|jiyva\|kikubaaqudgha/
syn match desGod contained /fedhas\|gozag\|hepliaklqana\|ieoh_jian\|jiyva\|kikubaaqudgha/
syn match desGod contained /lugonu\|makhleb\|nemelex_xobeh\|okawaru\|pakellas/
syn match desGod contained /qazlal\|ru\|sif_muna\|trog\|uskayaw\|vehumet\|xom/
syn match desGod contained /yredelemnul\|zin\|the_shining_one/
@@ -165,6 +165,8 @@ const int INVALID_ABSDEPTH = -1000;
const int UNUSABLE_SKILL = -99;
const int IEOH_JIAN_HEAVEN_TICK_TIME = 10;
//#define DEBUG_MIMIC
#ifdef DEBUG_MIMIC
#define FEATURE_MIMIC_CHANCE 1
@@ -231,6 +231,10 @@ static const char *divine_title[][8] =
// Hepliaklqana -- memory/ancestry theme
{"Damnatio Memoriae", "Hazy", "@Adj@ Child", "Storyteller",
"Brooding", "Anamnesiscian", "Grand Scion", "Unforgettable"},
// Ieoh Jian -- animal/chinese martial arts monk theme
{"Wooden Rat", "Young Dog", "Young Crane", "Young Tiger",
"Young Dragon", "Red Sash", "Golden Sash", "Sifu"},
};
COMPILE_CHECK(ARRAYSZ(divine_title) == NUM_GODS);
@@ -2,6 +2,8 @@
* Status defaults for durations.
*/
#include "god-passive.h"
static void _end_weapon_brand()
{
you.duration[DUR_EXCRUCIATING_WOUNDS] = 1;
@@ -542,6 +544,11 @@ static const duration_def duration_data[] =
"can't hop", "",
"", D_NO_FLAGS,
{{ "You are ready to hop once more." }}},
{ DUR_HEAVEN_ON_EARTH,
0, "", "", "", "", D_NO_FLAGS,
{{ "", []() {
ieoh_jian_heaven_tick();
}}}},
// The following are visible in wizmode only, or are handled
// specially in the status lights and/or the % or @ screens.
View
@@ -442,6 +442,10 @@ enum ability_type
ABIL_HEPLIAKLQANA_HEXER_ENGLACIATION,
#endif
// Ieoh Jian
ABIL_IEOH_JIAN_SERPENTS_LASH = 1280,
ABIL_IEOH_JIAN_HEAVEN_ON_EARTH,
// For both Yred and Beogh
ABIL_STOP_RECALL = 1500,
@@ -566,6 +570,8 @@ enum attribute_type
#endif
ATTR_PAKELLAS_EXTRA_MP, // MP to be collected to get a !magic from P
ATTR_DIVINE_ENERGY, // Divine energy from Sif to cast with no MP.
ATTR_SERPENTS_LASH, // Remaining turns in which you can move instantly.
ATTR_HEAVEN_ON_EARTH, // Measures the strength of the Heaven on Earth effect.
NUM_ATTRIBUTES
};
@@ -942,6 +948,7 @@ enum cloud_type
CLOUD_FLUFFY,
CLOUD_XOM_TRAIL,
CLOUD_SALT,
CLOUD_GOLD_DUST,
NUM_CLOUD_TYPES,
// Random per-square.
@@ -1725,8 +1732,8 @@ enum dungeon_feature_type
DNGN_ALTAR_PAKELLAS,
DNGN_ALTAR_USKAYAW,
DNGN_ALTAR_HEPLIAKLQANA,
DNGN_ENDLESS_SALT,
DNGN_ALTAR_IEOH_JIAN,
#endif
NUM_FEATURES
@@ -1923,6 +1930,7 @@ enum duration_type
DUR_CHANNEL_ENERGY,
DUR_SPWPN_PROTECTION,
DUR_NO_HOP,
DUR_HEAVEN_ON_EARTH,
NUM_DURATIONS
};
@@ -2099,6 +2107,7 @@ enum enchant_type
ENCH_INFESTATION,
ENCH_STILL_WINDS,
ENCH_RING_OF_THUNDER,
ENCH_DISTRACTED_ACROBATICS,
// Update enchant_names[] in mon-ench.cc when adding or removing
// enchantments.
NUM_ENCHANTMENTS
@@ -2225,6 +2234,7 @@ enum god_type
GOD_PAKELLAS,
GOD_USKAYAW,
GOD_HEPLIAKLQANA,
GOD_IEOH_JIAN,
NUM_GODS, // always after last god
GOD_RANDOM = 100,
@@ -5282,6 +5292,15 @@ enum deck_rarity_type
DECK_RARITY_LEGENDARY,
};
enum ieoh_jian_attack_type
{
IEOH_JIAN_ATTACK_NONE,
IEOH_JIAN_ATTACK_LUNGE,
IEOH_JIAN_ATTACK_WHIRLWIND,
IEOH_JIAN_ATTACK_WALL_JUMP,
IEOH_JIAN_ATTACK_TRIGGERED_AUX,
};
enum timed_effect_type
{
TIMER_CORPSES,
@@ -504,6 +504,7 @@ ALTAR(DNGN_ALTAR_ECUMENICAL, "faded altar of an unknown god", "altar_ecumenical"
ALTAR(DNGN_ALTAR_PAKELLAS, "oddly glowing altar of Pakellas", "altar_pakellas", ETC_PAKELLAS),
ALTAR(DNGN_ALTAR_USKAYAW, "hide-covered altar of Uskayaw", "altar_uskayaw", ETC_INCARNADINE),
ALTAR(DNGN_ALTAR_HEPLIAKLQANA, "hazy altar of Hepliaklqana", "altar_hepliaklqana", LIGHTGREEN),
ALTAR(DNGN_ALTAR_IEOH_JIAN, "ornate altar of the Ieoh Jian Council", "altar_ieoh_jian", ETC_IEOH_JIAN),
#define FOUNTAIN(enum, name, vaultname, colour)\
{\
View
@@ -738,15 +738,25 @@ void get_cleave_targets(const actor &attacker, const coord_def& def,
* @param effective_attack_number ?
*/
void attack_cleave_targets(actor &attacker, list<actor*> &targets,
int attack_number, int effective_attack_number)
int attack_number, int effective_attack_number,
ieoh_jian_attack_type ieoh_jian_attack)
{
if (ieoh_jian_attack == IEOH_JIAN_ATTACK_WHIRLWIND
|| ieoh_jian_attack == IEOH_JIAN_ATTACK_WALL_JUMP
|| ieoh_jian_attack == IEOH_JIAN_ATTACK_TRIGGERED_AUX)
{
return; // IJC AOE attacks don't cleave.
}
while (attacker.alive() && !targets.empty())
{
actor* def = targets.front();
if (def && def->alive() && !_dont_harm(attacker, *def))
{
melee_attack attck(&attacker, def, attack_number,
++effective_attack_number, true);
attck.ieoh_jian_attack = ieoh_jian_attack;
attck.attack();
}
targets.pop_front();
Oops, something went wrong.

0 comments on commit 0c5bb27

Please sign in to comment.