KCJ4Z24PD7ZAWJ2F63IFXZOWHFT5OKSMKQ5Z3T3J6BQLVBLBAFMQC
R6G4CLUA3PYWYUZVWIOTAVUGR43B65CPAPPSCT4NXB4XAJDUKQSQC
QAD5QRQDRHBP2SKJXPYAHIJOUUBXQTJEAMJUU274I3UY2WW7FEXQC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
FXVDNB6MAAOSEP37HP7CIPPXNS7FDECN3GCRMT5UFFCKLHIL6IVAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
Y6YXZ7CF7TJ5WIYFGQA7OFF52P3V5YHKTMUOSBIPAFCRCMNPGSZQC
AVSWNOP23Z2QCLQGXFDZV7TI4RC3XSXHIX2HDXFHXGKDEZSSIGJQC
2XSNHF7JXHEKABVMXDAU25QKFHJHH256GR4WLYAHKSPF4XLBJW4QC
26TGZ3ARBTOI4GTW4LO7R25QYQP3KDY75D4RFWUUFB3OBWVOIDMQC
WXSNNK2RXP3DQFAEQGQUZJHFWXJC7ZKG2WURZGL566UDM4YXFSWQC
LFIEDWOSNPS5D6EUWPUPOBBN5CEHVF2MLNOSPXEIVMRZ77A5BH4AC
LUH6GAJODIQXNPBEHMSUTKH3KA3DYVRCKZ6GJJ4HHNHOIMMUEP6QC
HB27XKFYVYIEQZGBCEZ6LKPUBMXLIPDAAS636GJ5TULIQ7KND5KQC
KBNY5FWKTEAKABFCLPC3QFKFSVZKAGXINPCIFV6WDSWFO4VCKNTAC
7EI4HMXZ7TAWZKFZG2SXHDAX3FWFBCZLUAKOALPRFF72FS7NKVBQC
SLDR32H45VDN74AVZ2JDPLNK7AZWXDS2YRTLMGK7E3FYW6OWOFJAC
RWCCZ64BG3HSOTM54ANIGENC3F3AIR42LJFRYSAKMCPCIUSOZY5QC
////////////////////////////////////////////////////////////////////////////
static int _lugonu_warp_monster(coord_def where, int pow, int, actor *)
{
if (!in_bounds(where))
return (0);
monsters* mon = monster_at(where);
if (mon == NULL)
return (0);
if (!mons_friendly(mon))
behaviour_event(mon, ME_ANNOY, MHITYOU);
if (check_mons_resist_magic(mon, pow * 2))
{
mprf("%s %s.",
mon->name(DESC_CAP_THE).c_str(), mons_resist_string(mon));
return (1);
}
const int damage = 1 + random2(pow / 6);
if (mon->type == MONS_BLINK_FROG)
mon->heal(damage, false);
else if (!check_mons_resist_magic(mon, pow))
{
mon->hurt(&you, damage);
if (!mon->alive())
return (1);
}
mon->blink();
return (1);
}
static void _lugonu_warp_area(int pow)
{
apply_area_around_square( _lugonu_warp_monster, you.pos(), pow );
}
void lugonu_bends_space()
{
const int pow = 4 + skill_bump(SK_INVOCATIONS);
const bool area_warp = random2(pow) > 9;
mprf("Space bends %saround you!", area_warp? "sharply " : "");
if (area_warp)
_lugonu_warp_area(pow);
random_blink(false, true);
const int damage = roll_dice(1, 4);
ouch(damage, NON_MONSTER, KILLED_BY_WILD_MAGIC, "a spatial distortion");
}
////////////////////////////////////////////////////////////////////////
void chronos_time_step(int pow) // pow is the number of turns to skip
{
coord_def old_pos = you.pos();
mpr("You step out of the flow of time.");
you.flash_colour = LIGHTCYAN;
viewwindow(true, true);
you.moveto(coord_def(0, 0));
you.duration[DUR_TIME_STEP] = pow;
you.time_taken = 10;
while(you.duration[DUR_TIME_STEP]-- > 0)
{
run_environment_effects();
handle_monsters();
manage_clouds();
}
// Update corpses, etc. This does also shift monsters, but only by a tiny bit.
update_level(pow*10);
#ifndef USE_TILE
delay(1000);
#endif
you.flash_colour = 0;
you.moveto(old_pos);
you.duration[DUR_TIME_STEP] = 0;
viewwindow(true, false);
mpr("You return into the normal time flow.");
}
}
////////////////////////////////////////////////////////////////////////////
static int _lugonu_warp_monster(coord_def where, int pow, int, actor *)
{
if (!in_bounds(where))
return (0);
monsters* mon = monster_at(where);
if (mon == NULL)
return (0);
if (!mons_friendly(mon))
behaviour_event(mon, ME_ANNOY, MHITYOU);
if (check_mons_resist_magic(mon, pow * 2))
{
mprf("%s %s.",
mon->name(DESC_CAP_THE).c_str(), mons_resist_string(mon));
return (1);
}
const int damage = 1 + random2(pow / 6);
if (mon->type == MONS_BLINK_FROG)
mon->heal(damage, false);
else if (!check_mons_resist_magic(mon, pow))
{
mon->hurt(&you, damage);
if (!mon->alive())
return (1);
}
mon->blink();
return (1);
}
static void _lugonu_warp_area(int pow)
{
apply_area_around_square( _lugonu_warp_monster, you.pos(), pow );
}
static void _lugonu_bends_space()
{
const int pow = 4 + skill_bump(SK_INVOCATIONS);
const bool area_warp = random2(pow) > 9;
mprf("Space bends %saround you!", area_warp? "sharply " : "");
if (area_warp)
_lugonu_warp_area(pow);
random_blink(false, true);
const int damage = roll_dice(1, 4);
ouch(damage, NON_MONSTER, KILLED_BY_WILD_MAGIC, "a spatial distortion");
static void _chronos_time_step(int pow) // pow is the number of turns to skip
{
coord_def old_pos = you.pos();
mpr("You step out of the flow of time.");
you.flash_colour = LIGHTCYAN;
viewwindow(true, true);
you.moveto(coord_def(0, 0));
you.duration[DUR_TIME_STEP] = pow;
you.time_taken = 10;
while(you.duration[DUR_TIME_STEP]-- > 0)
{
run_environment_effects();
handle_monsters();
manage_clouds();
}
// Update corpses, etc. This does also shift monsters, but only by a tiny bit.
update_level(pow*10);
#ifndef USE_TILE
delay(1000);
#endif
you.flash_colour = 0;
you.moveto(old_pos);
you.duration[DUR_TIME_STEP] = 0;
viewwindow(true, false);
mpr("You return into the normal time flow.");
}