Might still need some tweaks but overall looks great!
And… we need more tiles (kraken head + tentacles).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10691 c06c8d41-db1a-0410-9941-cceddc491573
JESCFNNBKC7BW3XYLJLAF6RLMP5VCXIUUXQUGEZBF4FYPNMEGNJAC
X62UCLFYBDIBBE6KP6SWRBYDMYG4WMRDLQTN7ZBQT4S544H4STPQC
CN2WE5O23XAZADER25N555J44CCXIYB6YYHBLHEBQS6DAIKZEGNAC
PC6K5OQF3BWPMWTIN5JXAKHTZF453JQOELDWRUOSBZXR256FTUYQC
NHCEH7ZFP3IFRMZMC25ZA2X5ZSS3MOCHCYLVCSVY7RTY62WX7UAQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
SKWBAGSAB625IIN4UP3NCPRX2H3KCPC2LULHS2A7JVRLO3EUBJDAC
2FHNLTLN3DVVD67N4QMAQ2LO7YY4GVZWXJAOIWGCCYYGIX7UHSVQC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
QFWRKRPFS7TWZYFMIXWU24RS6DAUQPJS47O4HY456PXQJDOYNDWQC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
QDWDUURSNLMT6AXNNJ3DEQCWAKCAIHV6MP5F7QGIBGXOG2BI2NPQC
IYMUEJG2VI3TV7HVAZIU2L4DVQY7VNSIFVV4I3QIVP7H66EVJISAC
3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC
V633AMMPMHJB5ZLP5IHFXCT6FCENVTPX25TY7T5MF2QZLDDN24HAC
VOR2QOT3R3BC3H74GMW4PUBY77QBJXE5QGQNBIINBE3MPSH6CXWQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
PQYLCUBDA6P4UY7X3NLIUUKMJ5GTQTB5X64VNSQVMCFS6ONMXXOQC
AYU5OVG2HZO46KDAPKUWAVHS5HTYFKUWIMIRMTHAXVVFEDJE7YPAC
3HGELZU7NELOQ635HZO6IJIYLBSNCJ5VPH46IE22KA3OSLEFK7AQC
GLHWVF2JPHBL7NV3D3CNHPIQSHZQPREVUJT6ZN43OBKBX5HL5NKQC
GZ4FB5VKL4C22KK3GSKQPLJYMRGLFXUDCOBNEBC2OKK6KVZL3OSQC
22MF6OUN62WDBJR5QFNJTKU7Q5TIQ76XWCEIRBFWAZDMZUSKJGCAC
TVC7W7C2XKBQSD2IJFMWFVGXZAOD4EUOW43NAQTOF5KFMAUOJABQC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC
ARP25R4B66WPY56X77RRYLHDTIVGZCG2GQGV5WX2UX3DUAS2SAAQC
3UHMSNL7FEGVWYDX6AAJD2XQUQQ3HJMMTDR66IORZPYP5MJ2L7AQC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
BGJ7P65JV2OFVXMGAJDHV5Y36TR7JOFDWJUZJBHUBD7SCQMDRBEAC
LOAPDCDZDTOXBCNX7IQBCACP7TCMVUBNZVUTUCLX5VXM7MEFPQBQC
LHYTGOCNDWX3CVD2HSQ6LAYC6NLKKI6ZKKNWZ5IQWP6YP5PQEVWQC
LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
75NDCBXLYKGPW5VFJ2CLA226U5RJQCWUGR4KD3JM5NR6KHZQB2AQC
Y56C5OMUQ5XF2G6DKDV4R5MED44UOIUPTBBQVWQBUHYIXYA5MOZAC
4RFKVDJKTCRBZU6WPJ2E5OVI5IRPY3UTRPOBLC5QHY4CQJJTLZKQC
VRFQK6S2TXOFFO5K5HRDXPR7QEKKAZAVCASSIJVPWQ4GE26UOGTQC
KVPP3CYPEFADQCL5Y56ELSUBA47SFNAJNCSVCSOK2GF67DHVMBCQC
QSPLWL6QWR5RGGORC4XJ3ICIII5JY6MLQFSD7JOI2QL664KNK5VQC
UWYK2M6I6P6EFAVHLWQGDK77STFO3SPO5SVOF5WZTOKUH2O6BBHQC
LFJAIJGMBJHZQIYSLDJ57N56WFUY67LVM3GRWOPIDIVNELEQU5EAC
JZCODQCOUBBBPPR4TLOAPIB4BQLDY3ORTJXTWEQSUJVJ7DMK7FVAC
TDAVD56MGLFSMJLPLSYLEVW7MBRMT7V5BNII4TRWVDIHH47CD2OAC
YL67KHG3TAZXJCWGRZPVASD6RS2SQ3V5KMIUK4E6PV43V2NBOLEAC
M7WTOF3BVX5MGA7AQZB22YEFWCSL7RLW54PQM3MTRLCKUCUZZEUAC
EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC
case SPELL_KRAKEN_TENTACLES:
{
int kraken_index = monster_index(monster);
if (invalid_monster_index(duration))
{
mpr("Error! Kraken is not a part of the current environment!",
MSGCH_ERROR);
return;
}
sumcount2 = random2(9); // up to eight tentacles
if (sumcount2 == 0)
return;
for (sumcount = 0; sumcount < MAX_MONSTERS; ++sumcount)
if (menv[sumcount].type == MONS_KRAKEN_TENTACLE
&& (int) menv[sumcount].number == kraken_index)
{
// Reduce by tentacles already placed.
sumcount2--;
}
for (sumcount = sumcount2; sumcount > 0; --sumcount)
{
// Tentacles aren't really summoned (controlled by spell_cast
// being passed to summon_type), so I'm not sure what the
// abjuration value (3) is doing there. (jpeg)
if (-1 == create_monster(
mgen_data(MONS_KRAKEN_TENTACLE, SAME_ATTITUDE(monster),
3, spell_cast, monster->pos(), monster->foe, 0, god,
MONS_PROGRAM_BUG, kraken_index, monster->colour,
you.your_level, PROX_CLOSE_TO_PLAYER,
you.level_type)))
{
sumcount2--;
}
}
if (sumcount2 == 1)
mpr("A tentacle rises from the water!");
else if (sumcount2 > 1)
mpr("Tentacles burst out of the water!");
return;
}
static int _tentacle_too_far(monsters *head, monsters *tentacle)
{
// The Shoals produce no disjoint bodies of water.
// If this ever changes, we'd need to check if the head and tentacle
// are still in the same pool.
// XXX: Actually, using Feawn's Sunlight power you can separate pools...
return grid_distance(head->pos(), tentacle->pos()) > LOS_RADIUS;
}
void mons_relocated(monsters *monster)
{
if (monster->type == MONS_KRAKEN)
{
int headnum = monster_index(monster);
if (invalid_monster_index(headnum))
return;
for (int i = 0; i < MAX_MONSTERS; ++i)
{
monsters *tentacle = &menv[i];
if (tentacle->type == MONS_KRAKEN_TENTACLE
&& (int) tentacle->number == headnum
&& _tentacle_too_far(monster, tentacle))
{
monster_die(tentacle, KILL_RESET, -1, true, false);
}
}
}
else if (monster->type == MONS_KRAKEN_TENTACLE)
{
if (invalid_monster_index(monster->number)
|| menv[monster->number].type!=MONS_KRAKEN
|| _tentacle_too_far(&menv[monster->number], monster))
{
monster_die(monster, KILL_RESET, -1, true, false);
}
}
}
static int _destroy_tentacles(monsters *head)
{
int tent = 0;
int headnum = monster_index(head);
if (invalid_monster_index(headnum))
return 0;
for (int i = 0; i < MAX_MONSTERS; ++i)
{
monsters *monster = &menv[i];
if (monster->type == MONS_KRAKEN_TENTACLE
&& (int)monster->number == headnum)
{
if (mons_near(monster))
tent++;
monster->hurt(monster, INSTANT_DEATH);
}
}
return tent;
}
},
// A kraken and its tentacles get a random colour at creation.
{
MONS_KRAKEN, 'X', DARKGREY, "kraken",
M_COLD_BLOOD | M_SPELLCASTER,
MR_NO_FLAGS,
1500, 20, MONS_KRAKEN, MONS_KRAKEN, MH_NATURAL, -3,
{ {AT_BITE, AF_PLAIN, 15}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 20, 10, 10, 0 },
20, 0, MST_KRAKEN, CE_CLEAN, Z_NOZOMBIE, S_SILENT, I_ANIMAL,
HT_WATER, 10, DEFAULT_ENERGY, MONUSE_NOTHING, MONEAT_NOTHING, SIZE_HUGE
{
MONS_KRAKEN_TENTACLE, 'w', DARKGREY, "tentacle",
M_COLD_BLOOD | M_NO_EXP_GAIN,
MR_RES_ASPHYX,
0, 10, MONS_KRAKEN_TENTACLE, MONS_KRAKEN_TENTACLE, MH_NATURAL, MAG_IMMUNE,
{ {AT_HIT, AF_PLAIN, 15}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 5, 3, 5, 0 },
5, 7, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT, I_ANIMAL,
HT_WATER, 10, DEFAULT_ENERGY, MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
},
// Need to set a name for the player ghost.
if (mid >= MAX_MONSTERS || menv[mid].type != MONS_KRAKEN)
{
for (mid = 0; mid < MAX_MONSTERS; mid++)
{
if (menv[mid].type == MONS_KRAKEN && menv[mid].alive())
{
menv[mid].colour = random_choose(GREEN, LIGHTGREY,
LIGHTGREEN, LIGHTCYAN,
LIGHTRED, YELLOW, WHITE,
-1);
return;
}
}
}
if (mid >= MAX_MONSTERS)
{
mpr("Couldn't find player kraken!");
return;
}
}
// FIXME: This is a bit useless, seeing how you cannot set the
// ghost's stats, brand or level.
kraken
"... Kraken, also called the Crab-fish, which [according to the pilots of
Norway] is not that huge, for heads and tails counted, he is no larger than
our Öland is wide [i.e. less than 16 km] ... He stays at the sea floor,
constantly surrounded by innumerable small fishes, who serve as his food and
are fed by him in return: for his meal, if I remember correctly what E.
Pontoppidan writes, lasts no longer than three months, and another three are
then needed to digest it. His excrements nurture in the following an army of
lesser fish, and for this reason, fishermen plumb after his resting place
... Gradually, Kraken ascends to the surface, and when he is at ten to
twelve fathoms, the boats had better move out of his vicinity, as he will
shortly thereafter burst up, like a floating island, spurting water from his
dreadful nostrils and making ring waves around him, which can reach many
miles. Could one doubt that this is the Leviathan of Job?"
-Jacob Wallenberg, "Min son på galejan", 1781.
%%%%