git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5584 c06c8d41-db1a-0410-9941-cceddc491573
RDLF4VIJMMHHL2OCQEXOK6HNCS5QX3FZF3S4IHPY3OZUKC2FZ24AC XFJZEHZRAE5VVAQH7BRFOX6I2CWZHMRKIZ6AOXU52PGDCTUZ2J5QC O2XPBLHUM6FOTLUIVPTPHYPMDZDL3STCZX2PHAFDDAL3OIGBO6XQC 7KBQYZSNXBMQGEEOAZI6YU34XZ5ECFGTJA32QIJDZP2NYS3SF3IQC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC 226KYCTMLIXUKD734QATY3JKWUUKC5Q3O75JT5EWIX6BKR7ANZSAC M3CHZA76JC34OROJ2A3HD5KBAFYMU3D7HYZPXT6UOD5DUNIDWT7QC LX2YKPU73XMOVRWVEYQ4QRCVXLBYLVVGTEYGKA6WO5IORK27RMGAC 3XL4DKV7PSWAU3ZBJSKZFJ2VUYABC47I7KKWGIRCJYXULQD453MQC ZQDY7M2M4OW4JW5RFQDCFVZJWSC64UWFHX3KUDH44KSVV3C4NFXAC GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC 5XSXMOBGXFLTIQE6WDXWWFVDOTUPZSIQ2FWT3YI5QMVU6D76IUYQC M6MBPHNAERUXYJ7KHK5FE2B44CLBY4M5MR5KY74HVDFNHVLOEQIAC X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC JJULXW764V5C2HJKZNWQAEWB6QM5YZADD7ZCE35LYTBFEM6PMYCAC TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC 2PEJPMEOH6N4U5TLKLGIN4MWLEVTSJDSMA4MOOKKN2QVJBGNGIVQC NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC JD3FMKAAAUQZSNPGFLVX7F5H5SWGUSYOFZU4X5W4XYNV6HUKDBKAC W6DKUJ4NYAURDPGBAY7WX36BFUAD5LFE2JKFSFAYTHLSDO33WDNAC TXF4NRVICF3RMD3VQARDJKGOGBGIJNO6FKOV5POTF73XQHNB6WVAC C7EEMEI6FU6L2VWZBTDCZO5ZTB2N5TCNGSMIBZTN6NZRE7BUBFPQC UW6UG6U4J27IFH2472MBAU6BT7AUKO5YW7YOTYZ5KX4JRHUNORUAC MED2SJP7F7BIPCRUXOJRTELR3EOKRN5PFOO2LLMQOEIJLID3LTOAC // 'unfriendly' is percentage chance summoned elemental goes// postal on the caster (after taking into account// chance of that happening to unskilled casters// anyway)bool summon_elemental(int pow, int restricted_type,unsigned char unfriendly){monster_type mon = MONS_PROGRAM_BUG;struct dist smove;int dir_x;int dir_y;int targ_x;int targ_y;int numsc = std::min(2 + (random2(pow) / 5), 6);bool any_elemental = (restricted_type == 0);while (true){mpr("Summon from material in which direction?", MSGCH_PROMPT);direction( smove, DIR_DIR, TARG_ANY );if (!smove.isValid){canned_msg(MSG_OK);return (false);}dir_x = smove.dx;dir_y = smove.dy;targ_x = you.x_pos + dir_x;targ_y = you.y_pos + dir_y;if (mgrd[ targ_x ][ targ_y ] != NON_MONSTER){if (player_monster_visible(&menv[mgrd[targ_x][targ_y]]))mpr("There's something there already!");else{mpr("Something seems to disrupt your summoning.");return 0;}}else if (dir_x == 0 && dir_y == 0)mpr("You can't summon an elemental from yourself!");else if ((any_elemental || restricted_type == MONS_EARTH_ELEMENTAL)&& (grd[ targ_x ][ targ_y ] == DNGN_ROCK_WALL|| grd[ targ_x ][ targ_y ] == DNGN_CLEAR_ROCK_WALL)){if (targ_x <= 6 || targ_x >= 74 || targ_y <= 6 || targ_y >= 64){mpr("That wall won't yield to your beckoning.");// XXX: Should this cost a turn?}else{mon = MONS_EARTH_ELEMENTAL;break;}}elsebreak;}
if (mon == MONS_EARTH_ELEMENTAL){grd[ targ_x ][ targ_y ] = DNGN_FLOOR;}else if (env.cgrid[ targ_x ][ targ_y ] != EMPTY_CLOUD&& env.cloud[env.cgrid[ targ_x ][ targ_y ]].type == CLOUD_FIRE&& (any_elemental || restricted_type == MONS_FIRE_ELEMENTAL)){mon = MONS_FIRE_ELEMENTAL;delete_cloud( env.cgrid[ targ_x ][ targ_y ] );}else if (grd[ targ_x ][ targ_y ] == DNGN_LAVA&& (any_elemental || restricted_type == MONS_FIRE_ELEMENTAL)){mon = MONS_FIRE_ELEMENTAL;}else if ((grd[ targ_x ][ targ_y ] == DNGN_DEEP_WATER|| grd[ targ_x ][ targ_y ] == DNGN_SHALLOW_WATER|| grd[ targ_x ][ targ_y ] == DNGN_FOUNTAIN_BLUE)&& (any_elemental || restricted_type == MONS_WATER_ELEMENTAL)){mon = MONS_WATER_ELEMENTAL;}else if (grd[ targ_x ][ targ_y ] >= DNGN_FLOOR&& env.cgrid[ targ_x ][ targ_y ] == EMPTY_CLOUD&& (any_elemental || restricted_type == MONS_AIR_ELEMENTAL)){mon = MONS_AIR_ELEMENTAL;}// Found something to summon?if (mon == MONS_PROGRAM_BUG){canned_msg(MSG_NOTHING_HAPPENS);return (false);}// silly - ice for water? 15jan2000 {dlb}// little change here to help with the above... and differentiate// elements a bit... {bwr}// - Water elementals are now harder to be made reliably friendly.// - Air elementals are harder because they're more dynamic/dangerous.// - Earth elementals are more static and easy to tame (as before).// - Fire elementals fall in between the two (10 is still fairly easy).const bool friendly = ((mon != MONS_FIRE_ELEMENTAL|| random2(10) < you.skills[SK_FIRE_MAGIC])&& (mon != MONS_WATER_ELEMENTAL|| random2((you.species == SP_MERFOLK) ? 5 : 15)< you.skills[SK_ICE_MAGIC])&& (mon != MONS_AIR_ELEMENTAL|| random2(15) < you.skills[SK_AIR_MAGIC])&& (mon != MONS_EARTH_ELEMENTAL|| random2(5) < you.skills[SK_EARTH_MAGIC])&& random2(100) >= unfriendly);if (create_monster(mgen_data(mon,friendly ? BEH_FRIENDLY : BEH_HOSTILE,numsc, coord_def(targ_x, targ_y),friendly ? you.pet_target : MHITYOU)) != -1){return (false);}if (!friendly)mpr( "The elemental doesn't seem to appreciate being summoned." );return (true);} // end summon_elemental()
// 'unfriendly' is percentage chance summoned elemental goes// postal on the caster (after taking into account// chance of that happening to unskilled casters// anyway).bool summon_elemental(int pow, bool god_gift,monster_type restricted_type,int unfriendly){monster_type mon = MONS_PROGRAM_BUG;struct dist smove;int dir_x;int dir_y;int targ_x;int targ_y;const int dur = std::min(2 + (random2(pow) / 5), 6);const bool any_elemental = (restricted_type == MONS_PROGRAM_BUG);while (true){mpr("Summon from material in which direction?", MSGCH_PROMPT);direction(smove, DIR_DIR, TARG_ANY);if (!smove.isValid){canned_msg(MSG_OK);return (false);}dir_x = smove.dx;dir_y = smove.dy;targ_x = you.x_pos + dir_x;targ_y = you.y_pos + dir_y;if (mgrd[targ_x][targ_y] != NON_MONSTER){if (player_monster_visible(&menv[mgrd[targ_x][targ_y]]))mpr("There's something there already!");else{mpr("Something seems to disrupt your summoning.");return (false);}}else if (dir_x == 0 && dir_y == 0)mpr("You can't summon an elemental from yourself!");else if ((any_elemental || restricted_type == MONS_EARTH_ELEMENTAL)&& (grd[ targ_x ][ targ_y ] == DNGN_ROCK_WALL|| grd[ targ_x ][ targ_y ] == DNGN_CLEAR_ROCK_WALL)){if (targ_x <= 6 || targ_x >= 74 || targ_y <= 6 || targ_y >= 64){mpr("That wall won't yield to your beckoning.");// XXX: Should this cost a turn?}else{mon = MONS_EARTH_ELEMENTAL;break;}}elsebreak;}if (mon == MONS_EARTH_ELEMENTAL){grd[targ_x][targ_y] = DNGN_FLOOR;}else if (env.cgrid[targ_x][targ_y] != EMPTY_CLOUD&& env.cloud[env.cgrid[targ_x][targ_y]].type == CLOUD_FIRE&& (any_elemental || restricted_type == MONS_FIRE_ELEMENTAL)){mon = MONS_FIRE_ELEMENTAL;delete_cloud(env.cgrid[targ_x][targ_y]);}else if (grd[targ_x][targ_y] == DNGN_LAVA&& (any_elemental || restricted_type == MONS_FIRE_ELEMENTAL)){mon = MONS_FIRE_ELEMENTAL;}else if ((grd[targ_x][targ_y] == DNGN_DEEP_WATER|| grd[targ_x][targ_y] == DNGN_SHALLOW_WATER|| grd[targ_x][targ_y] == DNGN_FOUNTAIN_BLUE)&& (any_elemental || restricted_type == MONS_WATER_ELEMENTAL)){mon = MONS_WATER_ELEMENTAL;}else if (grd[targ_x][targ_y] >= DNGN_FLOOR&& env.cgrid[targ_x][targ_y] == EMPTY_CLOUD&& (any_elemental || restricted_type == MONS_AIR_ELEMENTAL)){mon = MONS_AIR_ELEMENTAL;}// Found something to summon?if (mon == MONS_PROGRAM_BUG){canned_msg(MSG_NOTHING_HAPPENS);return (false);}// silly - ice for water? 15jan2000 {dlb}// little change here to help with the above... and differentiate// elements a bit... {bwr}// - Water elementals are now harder to be made reliably friendly.// - Air elementals are harder because they're more dynamic/dangerous.// - Earth elementals are more static and easy to tame (as before).// - Fire elementals fall in between the two (10 is still fairly easy).const bool friendly = ((mon != MONS_FIRE_ELEMENTAL|| random2(10) < you.skills[SK_FIRE_MAGIC])&& (mon != MONS_WATER_ELEMENTAL|| random2((you.species == SP_MERFOLK) ? 5 : 15)< you.skills[SK_ICE_MAGIC])&& (mon != MONS_AIR_ELEMENTAL|| random2(15) < you.skills[SK_AIR_MAGIC])&& (mon != MONS_EARTH_ELEMENTAL|| random2(5) < you.skills[SK_EARTH_MAGIC])&& random2(100) >= unfriendly);if (create_monster(mgen_data(mon,friendly ? BEH_FRIENDLY : BEH_HOSTILE,dur, coord_def(targ_x, targ_y),friendly ? you.pet_target : MHITYOU)) != -1){canned_msg(MSG_NOTHING_HAPPENS);return (false);}mpr("An elemental appears!");if (!friendly)mpr("It doesn't seem to appreciate being summoned.");return (true);}