git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6648 c06c8d41-db1a-0410-9941-cceddc491573
5XNQ3SSNBFXFNWA6DPM74W6FH65NX665P3DMH6YCWVFOPZTJSYCQC
CYNUFLTFZNYY3KTA6USUXYIZNVIXH2TDSXKFFXDORMBZVD7TRDSAC
GO242VCYZMGMPK5ILYRKUCRPMLL2NBXX26VAFB47HRK2CGI3D7QAC
FVKF37R37QZRNUKHBLKGKA3YU2YH3DDQZR54QCARFBZWIVRWSSCAC
F6H5PXCHNY6JFQSKO2Z54DHU55BCBA7XZDYDU6IDTVKPJHINP2IQC
WLK4WO7OQBDIOL3IU3QWGQ545NZEMGOTL7PFGUESY2QGJDZO3W5AC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
2O3C3MTT2ZBYIFGPJ4MF5R4AXBYUHOEN62KAUWFWF6JWHIIVLRNQC
ZCRK2DJ5VKECRQXZTWT4NUDL2VT5ZHUK7NT6NQPLRJ56TDX5PJSAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
VJDLV4PF2ZJ46NERO4LZUX5JE2CD5XBOBQCYYPTFWTHLUEYDUOYAC
GF5VGZLKKWIATLVLTUJR4LVEQZAKR7CWMLNFMJXA67WLHP7JNUUAC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC
AREBCIU2RU2RNHBWD4GARWEBKSL7HDFGDLII22H56OJO2AQUOMLQC
KATZLWENEIQMKKWIV4ZLXJ5HFUW6SU5K4ZU6NENBOL4XAAVTDUKAC
UASSVST2AY5625MS67C4FMEVQFXEVTG2SOIHW4AVWE22PLP27VUQC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
SWE3F3BLKHYMJEJLXNFH3MR2E6VDEYXJ6DL7QLPP47BJEKEUCAMAC
FIYBXLWALQINNQTHG2KNDUUTAQAZRDDLXW2XOVSKDKBADJ3XCJ4AC
3NFVCXRVGHN2CHLLWFZES5RBS4R2BCDS4EEQNSDCFYIFQWQK7MUQC
ENQRCBNN7MKP6FFQAZ62FYXEVWCRJB5747LTYMZGRGINXQL6HT5AC
2OPTG7FWHLKQYXJIL4BDN3UW67CV3SKILQE6NTOA3YBYI5V7SQSQC
JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC
LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC
SJOTTUZMA3UTGT5D6LKUTBDP2CZFXT24FB5IAWCUFHSHLLACM75QC
OK6A6PMHOYIQIPXK32AKOH55QRFWQA43BJWHUOCZA2VIJ6NROHMQC
NLQNXH3SVJ52CWXEV35FSSZP32VHC4QFGN3HINF4KO5GZHZMOBKQC
M6J5C74JDM5ZYIDPN7QXUCP6L44S2Z5XTRJMZBBRYOHA62IGYXKAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
AIIVH43Z5X3GTPFY4FXQRZPG6Y7QPH2KJ47VM2Q43PCGGD5MTMOAC
PSCYVKJ7DGXAL3V5U4O6AJTRV6Q3N3SHQWAZ73VIPRTE4W64F2XAC
TO43FWKHNIA5MVDOFXYHQODTLBQYEZKX5UIUGID57436UF7G2EXQC
YF2GZWXNV6NVFFEBEOYS67JQJQK2IUS5BZMGJW3XQPYIJYHQJCEQC
VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC
MJWFTUS66PTCNEYXEJA3CUJFXNWXIKDD6H3V24PW7HK64NSVOFSAC
BFZZ7DFLZM4WNHQOKWDJENZOLMXH3UPHZ437BMISYJ3VSO2Y57WQC
57E4T664CXRFPVW2BZBYI33UIHFS4PSEZURZYPSYSZK5DRLJJ5CQC
EFWEYIB2R3DPD3JWIPU6LS6SFLPMYN7J7X4GBZR7DJWKHJ3UELSAC
B7DNCNY7SXL5WAW5B3XZP5KIQSBWOJ3N2YW46WOUQKTRBRRZ7YOQC
E2YM2FO7CSSXLACZBBQPCC2LZN6KNVVJOIWQN4YZYE3NG4T5DR5AC
XKAJWK6MPHS3ZCZIPPLTIMOPF6AROGLRDDCS6EFE3IGE4AHT7MYQC
SHSIZVHSB4RPTLGMFJXUDVHF3FTEZZYCRIH4CBZP4MXOBR3HC4QAC
OFH2B2UZBK43QLFQBZ54FOCFLFNE54BZVDNCEUGDTBCUGNVZULIQC
TPZWAV3USKO7RX4IGHLZKVPRN36K33PJPSZYL6FZMX4XBHTYOQYAC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
JK3HFJG76OOQHJMXJUSZRTR5CX5ZMS52LRVBLOR7E2NBI6PRSHHAC
4FQAKUKUO6PCAZ3N4HUR5XL6E4VA5UQUZ3AEDGRBLVY7W2LMWI7QC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
KFWX5LI235XQYQOSUSSAKKQUNB2OCN3NOYP6E7D3HSM2UOSBGYHQC
SEXTAB43OKE5D5NNPNNPJXWR3CLJVRL7VSLMKDATDRLNX4FI3AFQC
3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC
I67HCZISOEMUYFEUA6VOJOO2L4TYK73IB4FSTY4CHDR7GZD6CS6QC
SW3RLYFNRT3IJBK6LYKHKP2J2YDU7SXQWAJZX7U6S7ICYW43OMNQC
HAI4YDKI72OBDT5KMMVCO3DOU765OPWCU7GTRKTALFNSDOI4R2LAC
XYBPIU6AQ77EID4VNOMI7KQZULZI4VBZHHIGBRYO7QRJVCODEKYAC
AFY6BHEVU67PXCVX6M3KUG5DTLOJTDGF3D4CQ4S7OMIB35WDSJAAC
VO5CYD7Z4FYFDT6DGVBX6RT3PHLRSUJA6TWV3GPYVE7QCSJ3JEAAC
22YVHM74WBJNJE4PA5CBEUTDWM6FAGGGILI26A4LXAURX55TNRKAC
75M6AVUSS3G5EJECJJRB67V5UYDOIV26FZNB2FFCMBZ33EK7FVIQC
TFHMBVXTRA2LXBHE7L7OEWK37JQN5DWZ3HOACMN7PRWVJNCS4TYQC
32S5UVZCXZ5QWH4NDB23MHOPLVPON3VKIWH6EEY42SRPBFZUUXSQC
N5FAAVHNKQZJV2G3JFRW7WKTXB3A4YY6GTVIMBCG5RSA65TKVBGQC
NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC
EAQJ2VSSFA3MKDR7ELP7M5VHTHGN2DCBPPZHXRAXDRKKAX2R6SHQC
SNRNR7OJX2MRRSYXSX3FC2CKM7HAGRQS2XMUUTOOBRHJZO2B5MTAC
ABLV37FMURRJPEZV2VRKOUYAKEMLI7E6RA4PDAII2EJ5L7WBHKZQC
TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
Y4NA3JSN63RLATF4NNBPSR5CWF5Z7UEMWCGVX4B6NOAR47CGM4GQC
OVLN3RPH65K6TZHPINT2O42WI4BHLW7OTFQFPRSYHZU4UAAMER6QC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
DS2GZKISEP2DM2VU6EJ525Q7W3WVOKJXG5PY2OY4VNFCLBHVVOTAC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
23PFLB2E4QHL5SF3Q2YV5FXRH6MFHENEU2ACVC572ZCYDXCBZVQAC
VS3WVE6ORJ76O3TRRJCR4JJVFVRKKFK5YHZ6AA4AU63DWM3KR3UAC
G4TVXOLIF5X2MWV7I4UPT3MSQHRMGME6QRIIFAQ64C45JGYK7SIAC
M6MBPHNAERUXYJ7KHK5FE2B44CLBY4M5MR5KY74HVDFNHVLOEQIAC
LSAVA5BJQO4Z2MYXVQOM4AOXTCLKDNQMOS3DZ4SDNO4LI422LA3AC
DH3YTI6VVI727SQXO4CXSDCSBG2UN3UAWLFULBGRLBVH22ACRXIAC
LCCGXSFIDQFIRXHGRJWOELNPQOHHCXCWXS366GOULDFPQVOKAIJAC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC
A76PWKCRXRSTV6CZAGRYV7XW4IA43K2ZM7TCZUZ5JMXITTTOM7RQC
CUB27EJDQG66FF2YCKOV4HU3LAJVJIHUJ5QYLURRDIEVGPK666DQC
IXLNOTBJGHKESBCTME6QAR6XVWFNCHYGMS62V62ZJEA7VLQHXO2QC
35KOQQV4ZBNNIAXGKPOYHOWTN7RBQY7HRZTVMR3WAS4GOYFBM6PQC
MKAR2SIMUA65TXXLYZJFUYAOVGBYJF25YJ2UBANSCPOYYUOFG7PAC
SJXOZ6J66G3S5VYGIZ3YHEUCKUF5554YEFUYLVBH7X4ALYSXKTGQC
QHQ3XPTZT5KCOGNPTZS62XEBHO7NQUXZ2YZ2GGBDAJJ4JMT2N3XQC
SQDS2YBPOYDDDCW3GGARBZ2HQIUHCQKL7SSHKFQWDENOL5YNNVNQC
RCLZVH5IZLUUJU3XDIW4GUDJ5G73DOI3EEMRKNMCNPSSEDBU5YFAC
BW3XFNOS6LDAQLHOZ6RXARCMKCY5JVLVDSXDSSAX4DSYM3FANQBAC
KQNIGKATHT4YSPJFPJGIGPD6VNR5B753SE2JN2LCXZZJNHCGY3DQC
ILOED4VB4I6VPAUTR75ZWX6MXDYXB5DO2EDK2UH67O3HNKWV23RQC
GTPAKUU3R5AS3LQNCCZIP3BWV473RM4EB2AIS4FXAJRXHEOVH2PAC
47NSOFQMBZCDIBHEAZSENFUGDSQCX3GJHFBUZ65ARDKCYIZ435LAC
ZP2KE7A2LE7Z2S7AC45WE4CXDSEVDTWIMV2EM4IBUKXYJIDU6R7QC
ATDAT2AONG2BDLZFBJZB4WVNRUFQAU7RDIVUBAZ6STAV62NX5R4AC
EJ4GIPFSSQCQASUMRF4CR2WPUQOTEHFRGLOYEZ7BH6YEMIR6DN4QC
TLA5UN6LZPXGKERI27EFY4HKIIU3VU5Y7ZU54WXL6ANBUV2VOTMQC
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
F4WAQJD7KLOXHZOTOT6WG26PVIDHYNVS3AV6ZNXGAS7PDR4HBWQAC
QLMCSREGK2UUAPXZSZQKLZOLM4BCB7PAVCSR3DLFQS3EW3IMWQSQC
H5BVKRORNXTCJKFXQPTFWDURKSUFW24CGSJXBGZCJUP4DHMSVDBQC
LVCBY444HPB4RRFMUAZPHVZ67IC3L6DB27AEMCW3DEXHLBF73TMQC
7V4DCKFJCNBXFODMKJ6H3MCDUTSD4XVQ7D4D6XFCD4JNF4HCE4KAC
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
JEWGBHOQGDSWMLT4FZTQWUKTBJJWY5CSRAQQUOWIZ7U4QBJ6ZLBQC
AMBBZGB4EP4MA2ILKQSAY4O2XQAIH673JHCDQ6N4MBGL2MAZGXNAC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
KIJYTJG2XG7T4HEVZTCL2T4XDSMVLXDJMYYRRK6GY5PY7CGJLJTAC
ZGUJWUFJ4NFFJ6PGXLFGQWCWBCZHPWGWI44NJHJEVPRG5L36PADQC
RWSXCNYUGDSMP2GKN22HROC5Q2GHSAVJJUDRT3Z53WU2DAI4IZOQC
VIFZ6DO6GWJGYMXJZKFZ2JYNPHNE74H3OFAOCPISQG7M7A4LCOHAC
5HJJGIOOIIQNCRIL33ZQAY6S57MPTSTG27UETJW3HE3BUUPUKPQAC
YMLVBQ6M27MECUVMU3BQP3WSGR7GW4XJMQIHLGHHWMVXHMMIXOYAC
PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC
XKKLLU7B6AMFPCH5CZRWEC43IQJCER5BZISYGD2DTQS4T6MFWWAAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
7VVRO5HMNNOXVRLBLJUCHUJP6MDIRMC2BWCO7MWH4OLQRM3LMTMQC
NOUBFP52ZBOQO4GNLDSLUGRFA2JXMDMXU4PW7LECEJJTQFNI3BBQC
23KINGGZGEVCKOXZQAKJHHCEF7XOJCAJTQT7VEDSS55YMYQM3Z4AC
65PB6QZNUDTUKE3I6YJAUXWHJRC3EKC4CPFHE2FRQDQIBN53DUPQC
7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC
CPTUVTBSOJMAUKMS5RFOAEZEVJGPFHMJA2DJWMDTYN7PFNZUGPWQC
EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
5YEDO56TF245ZLVPTBO2ILSNGXBU2UYLNHHW74E7YQ35EA3NQXFQC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
I2G7DP3TJL4RDMYKNXAA67P3VRSO3RF7FHZWA5CYINSEWEQE2YSQC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
NRMSQFTORG3GC7HQBIN5DHB5GLWXM6IQO6PTXD4C7LBQWJIHYIGAC
FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC
5P6MEKBISK6NI4MULM75HHFBQW5MXITSZJDGLLIDKJ7G24F7XYNAC
NSQ7BSO5C6QSTHWAIDTQ3XMYN5DENKKPUAA2GE6KQJRWQSDEU4NAC
FXVDNB6MAAOSEP37HP7CIPPXNS7FDECN3GCRMT5UFFCKLHIL6IVAC
};
class rectangle_iterator :
public std::iterator<std::forward_iterator_tag, coord_def>
{
public:
rectangle_iterator( const coord_def& corner1, const coord_def& corner2 );
explicit rectangle_iterator( int x_border_dist, int y_border_dist = -1 );
operator bool() const;
coord_def operator *() const;
const coord_def* operator->() const;
rectangle_iterator& operator ++ ();
rectangle_iterator operator ++ (int);
private:
coord_def current, topleft, bottomright;
}
rectangle_iterator::rectangle_iterator( const coord_def& corner1,
const coord_def& corner2 )
{
topleft.x = std::min(corner1.x, corner2.x);
topleft.y = std::min(corner1.y, corner2.y); // not really necessary
bottomright.x = std::max(corner1.x, corner2.x);
bottomright.y = std::max(corner1.y, corner2.y);
current = topleft;
}
rectangle_iterator::rectangle_iterator( int x_border_dist, int y_border_dist )
{
if ( y_border_dist < 0 )
y_border_dist = x_border_dist;
topleft.set( x_border_dist, y_border_dist );
bottomright.set( GXM - x_border_dist, GYM - y_border_dist );
current = topleft;
}
rectangle_iterator::operator bool() const
{
return current.y > bottomright.y;
}
coord_def rectangle_iterator::operator *() const
{
return current;
}
const coord_def* rectangle_iterator::operator->() const
{
return ¤t;
}
rectangle_iterator& rectangle_iterator::operator ++()
{
if ( current.x == bottomright.x )
{
current.x = topleft.x;
current.y++;
}
else
{
current.x++;
}
return *this;
if (you.duration[DUR_SILENCE] > 0
&& distance(x, y, you.x_pos, you.y_pos) <= 36) // (6 * 6)
{
return (true);
}
else
{
//else // FIXME: implement, and let monsters cast, too
// for (int i = 0; i < MAX_SILENCES; i++)
// {
// if (distance(x, y, silencer[i].x, silencer[i].y) <= 36)
// return (true);
// }
return (false);
}
// FIXME: implement for monsters
return (you.duration[DUR_SILENCE] > 0 && distance(p, you.pos()) <= 6*6);
if (!grid_is_solid(grd(*ri)) && env.cgrid(*ri) == EMPTY_CLOUD)
place_cloud( CLOUD_FIRE, *ri, 1 + random2(6), KC_YOU );
}
// Place fire clouds all around you
for ( adjacent_iterator ai; ai; ++ai )
if (!grid_is_solid(grd(*ai)) && env.cgrid(*ai) == EMPTY_CLOUD)
place_cloud( CLOUD_FIRE, *ai, 1 + random2(6), KC_YOU );
if (fmenv->type == MONS_PLAYER_GHOST
&& fmenv->hit_points < fmenv->max_hit_points / 2)
{
mpr("The ghost fades into the shadows.");
monster_teleport(fmenv, true);
continue;
}
if (fmenv->type == MONS_PLAYER_GHOST
&& fmenv->hit_points < fmenv->max_hit_points / 2)
{
mpr("The ghost fades into the shadows.");
monster_teleport(fmenv, true);
if (make_changes && mgrd[you.x_pos][you.y_pos] != NON_MONSTER)
monster_teleport(&menv[mgrd[you.x_pos][you.y_pos]], true, true);
if (make_changes && mgrd(you.pos()) != NON_MONSTER)
monster_teleport(&menv[mgrd(you.pos())], true, true);
for (int x = X_BOUND_1; x <= X_BOUND_2; ++x)
for (int y = Y_BOUND_1; y <= Y_BOUND_2; ++y)
for ( radius_iterator ri(you.pos(), radius, false, false); ri; ++ri )
{
const dungeon_feature_type grid = grd(*ri);
if (grid == DNGN_ROCK_WALL
|| grid == DNGN_STONE_WALL
|| grid == DNGN_PERMAROCK_WALL )
if (distance(x,y,you.x_pos,you.y_pos) < radius2)
{
dungeon_feature_type grid = grd[x][y];
if (grid == DNGN_ROCK_WALL
|| grid == DNGN_STONE_WALL
|| grid == DNGN_PERMAROCK_WALL )
{
grd[x][y]
= static_cast<dungeon_feature_type>(grid + clear_plus);
something_happened = true;
}
}
grd(*ri)
= static_cast<dungeon_feature_type>(grid + clear_plus);
something_happened = true;
for (int x = you.x_pos - 8; x <= you.x_pos + 8; x++)
for (int y = you.y_pos - 8; y <= you.y_pos + 8; y++)
{
if (!in_bounds(x,y) || !see_grid(x, y))
continue;
for ( radius_iterator ri(you.pos(), 8); ri; ++ri )
{
if ( mgrd(*ri) == NON_MONSTER )
continue;
mons = &menv[mid];
if (!found_monsters)
found_monsters = true;
// Can not be affected in these states.
if (_recite_mons_useless(mons))
continue;
// Check if audience can listen.
if (!_recite_mons_useless( &menv[mgrd(*ri)] ) )
if (!found_monsters)
mprf(MSGCH_DIAGNOSTICS, "No audience found!");
else
mprf(MSGCH_DIAGNOSTICS, "No sensible audience found!");
if (!found_monsters)
mprf(MSGCH_DIAGNOSTICS, "No audience found!");
else
mprf(MSGCH_DIAGNOSTICS, "No sensible audience found!");
for (int dx = -radius; dx <= radius; ++dx)
for (int dy = -radius; dy <= radius; ++dy)
{
if (dx == 0 && dy == 0)
continue;
if (dx*dx + dy*dy > radius*radius + 1)
continue;
const int rx = you.x_pos + dx;
const int ry = you.y_pos + dy;
if (!in_bounds(rx, ry))
continue;
for (radius_iterator ri(you.pos(), radius, false, false, false); ri; ++ri)
{
if ( *ri == you.pos() )
continue;
if (grd[rx][ry] == DNGN_FLOOR && trap_at_xy(coord_def(rx,ry)) == -1
&& one_chance_in(4 - power_level))
{
if (you.level_type == LEVEL_ABYSS)
grd[rx][ry] = coinflip() ? DNGN_DEEP_WATER : DNGN_LAVA;
else
place_specific_trap(rx, ry, TRAP_RANDOM);
}
if (grd(*ri) == DNGN_FLOOR && trap_at_xy(*ri) == -1
&& one_chance_in(4 - power_level))
{
if (you.level_type == LEVEL_ABYSS)
grd(*ri) = coinflip() ? DNGN_DEEP_WATER : DNGN_LAVA;
else
place_specific_trap(ri->x, ri->y, TRAP_RANDOM);
if (!in_bounds(*ri)
|| env.cgrid(*ri) != EMPTY_CLOUD
|| grid_is_solid(grd(*ri))
|| is_sanctuary(*ri) && !is_harmless_cloud(cloud.type))
if (!in_bounds(*ai)
|| env.cgrid(*ai) != EMPTY_CLOUD
|| grid_is_solid(grd(*ai))
|| is_sanctuary(*ai) && !is_harmless_cloud(cloud.type))
for (i = 5; i < (GXM - 5); i++)
for (j = 5; j < (GYM - 5); j++)
{
temp_rand = random2(4000);
for ( rectangle_iterator ri(5); ri; ++ri )
{
grd(*ri) =
static_cast<dungeon_feature_type>(
random_choose_weighted(3000, DNGN_FLOOR,
600, DNGN_ROCK_WALL,
300, DNGN_STONE_WALL,
100, DNGN_METAL_WALL,
1, DNGN_CLOSED_DOOR,
0));
}
const int x1 = 10 + random2(GXM - 20);
const int y1 = 10 + random2(GYM - 20);
const int x2 = x1 + 1 + random2(10);
const int y2 = y1 + 1 + random2(10);
// Pick the corners
coord_def tl( 10 + random2(GXM - 20), 10 + random2(GYM - 20) );
coord_def br( tl.x + 1 + random2(10), tl.y + 1 + random2(10) );
for (int i = x1; room_ok && i < x2; i++)
for (int j = y1; room_ok && j < y2; j++)
{
if (grd[i][j] != DNGN_UNSEEN)
room_ok = false;
}
// Check if the room is taken.
for ( rectangle_iterator ri(tl, br); ri && room_ok; ++ri )
if (grd(*ri) != DNGN_UNSEEN)
room_ok = false;
{
for (int i = x1; i < x2; i++)
for (int j = y1; j < y2; j++)
grd[i][j] = DNGN_FLOOR;
}
for ( rectangle_iterator ri(tl,br); ri; ++ri )
grd(*ri) = DNGN_FLOOR;
for (int i = gx1; i <= gx2; i++)
for (int j = gy1; j <= gy2; j++)
for ( rectangle_iterator ri(topleft, bottomright); ri; ++ri )
{
if (grd(*ri) == DNGN_UNSEEN && x_chance_in_y(thickness + 1, 100))
if (!placed_abyssal_rune && abyssal_rune_roll != -1
&& you.char_direction != GDT_GAME_START
&& one_chance_in(abyssal_rune_roll))
{
thing_created = items(1, OBJ_MISCELLANY,
MISC_RUNE_OF_ZOT, true, 51, 51);
placed_abyssal_rune = true;
thing_created = items(1, OBJ_MISCELLANY,
MISC_RUNE_OF_ZOT, true, 51, 51);
placed_abyssal_rune = true;
}
else
{
thing_created = items(1, OBJ_RANDOM, OBJ_RANDOM,
true, items_level, 250);
}
}
else
{
thing_created = items(1, OBJ_RANDOM, OBJ_RANDOM,
true, items_level, 250);
}
for (int i = gx1; i <= gx2; i++)
for (int j = gy1; j <= gy2; j++)
{
if (grd[i][j] == DNGN_UNSEEN)
grd[i][j] = replaced[random2(5)];
for ( rectangle_iterator ri(topleft, bottomright); ri; ++ri )
{
if (grd(*ri) == DNGN_UNSEEN)
grd(*ri) = replaced[random2(5)];
// Don't place exit under items.
if (exits_wanted > 0 && igrd[i][j] == NON_ITEM)
{
grd[i][j] = DNGN_EXIT_ABYSS;
exits_wanted--;
// Don't place exit under items.
if (exits_wanted > 0 && igrd(*ri) == NON_ITEM)
{
grd(*ri) = DNGN_EXIT_ABYSS;
exits_wanted--;
do
{
grd[i][j] = static_cast<dungeon_feature_type>(
DNGN_ALTAR_ZIN + random2(NUM_GODS-1) );
}
while (grd[i][j] == DNGN_ALTAR_ZIN
|| grd[i][j] == DNGN_ALTAR_SHINING_ONE
|| grd[i][j] == DNGN_ALTAR_ELYVILON);
grd(*ri) = static_cast<dungeon_feature_type>(
DNGN_ALTAR_ZIN + random2(NUM_GODS-1) );
}
while (grd(*ri) == DNGN_ALTAR_ZIN
|| grd(*ri) == DNGN_ALTAR_SHINING_ONE
|| grd(*ri) == DNGN_ALTAR_ELYVILON);
coord_def pos;
for (pos.x = 0; pos.x < LOS_DIAMETER; pos.x++)
for (pos.y = 0; pos.y < LOS_DIAMETER; pos.y++)
{
if (fprops(pos) == FPROP_SANCTUARY_1
|| fprops(pos) == FPROP_SANCTUARY_2)
{
fprops(pos) = FPROP_NONE;
}
}
}
for (int i = 5; i < (GXM - 5); i++)
for (int j = 5; j < (GYM - 5); j++)
{
// Don't modify terrain by player.
if (grid_distance(i, j, you.x_pos, you.y_pos) <= 10)
continue;
for (rectangle_iterator ri(5); ri; ++ri )
{
// Don't modify terrain by player.
if (grid_distance(*ri, you.pos()) <= 10)
continue;
if (mgrd[i][j] != NON_MONSTER)
_abyss_lose_monster( menv[ mgrd[i][j] ] );
}
if (mgrd(*ri) != NON_MONSTER)
_abyss_lose_monster( menv[ mgrd(*ri) ] );
}
if ((grd[x][y] == DNGN_FLOOR
|| grd[x][y] == DNGN_SHALLOW_WATER)
&& mgrd[x][y] == NON_MONSTER
&& env.cgrid[x][y] == EMPTY_CLOUD)
if ((grd(newspot) == DNGN_FLOOR
|| grd(newspot) == DNGN_SHALLOW_WATER)
&& mgrd(newspot) == NON_MONSTER
&& env.cgrid(newspot) == EMPTY_CLOUD)
for (i = 10; i < (GXM - 9); i++)
for (j = 10; j < (GYM - 9); j++)
{
grd[i][j] = DNGN_UNSEEN; // So generate_area will pick it up.
igrd[i][j] = NON_ITEM;
mgrd[i][j] = NON_MONSTER;
env.cgrid[i][j] = EMPTY_CLOUD;
}
for ( rectangle_iterator ri(10); ri; ++ri )
{
grd(*ri) = DNGN_UNSEEN; // So generate_area will pick it up.
igrd(*ri) = NON_ITEM;
mgrd(*ri) = NON_MONSTER;
env.cgrid(*ri) = EMPTY_CLOUD;
}
for (int xi = -1; xi <= 1; ++xi)
for (int yi = -1; yi <= 1; ++yi)
{
if (!xi && !yi)
continue;
const coord_def n(c.x + xi, c.y + yi);
if (!in_bounds(n))
continue;
if (!grid_is_opaque(grd(n)))
return (false);
}
for (adjacent_iterator ai(c); ai; ++ai)
if ( !grid_is_opaque(grd(c)) )
return (false);
for (int y = MAPGEN_BORDER; y < GYM - MAPGEN_BORDER; ++y)
for (int x = MAPGEN_BORDER; x < GXM - MAPGEN_BORDER; ++x)
for ( rectangle_iterator ri(MAPGEN_BORDER); ri; ++ri )
{
int distance = GXM * GXM + GYM * GYM;
for (int i = 0, size = corrupt_seeds.size(); i < size; ++i)
{
const int dist = (*ri - corrupt_seeds[i]).rdist();
if (dist < distance)
distance = dist;
}
if ((distance < 6 || one_chance_in(1 + distance - 6))
&& _is_grid_corruptible(*ri))
const coord_def c(x, y);
int distance = GXM * GXM + GYM * GYM;
for (int i = 0, size = corrupt_seeds.size(); i < size; ++i)
{
const int dist = (c - corrupt_seeds[i]).rdist();
if (dist < distance)
distance = dist;
}
if ((distance < 6 || one_chance_in(1 + distance - 6))
&& _is_grid_corruptible(c))
{
_corrupt_square(oenv, c);
}
_corrupt_square(oenv, *ri);