//drain: Do drain hit points from player schtick void drain() { Monster* monster; int cnt; struct Room *room; Monster **dp; bool in_passage; Monster *drainee[40]; //First count how many things we need to spread the hit points among cnt = 0; if (game->level().get_tile(game->hero().position()) == DOOR) room = game->level().get_passage(game->hero().position()); else room = NULL; in_passage = game->hero().room()->is_gone(); dp = drainee; for (auto it = game->level().monsters.begin(); it != game->level().monsters.end(); ++it) { monster = *it; if (monster->room() == game->hero().room() || monster->room() == room || (in_passage && game->level().get_tile(monster->position()) == DOOR && game->level().get_passage(monster->position()) == game->hero().room())) { *dp++ = monster; } } if ((cnt = dp - drainee) == 0) { msg("you have a tingling feeling"); return; } *dp = NULL; cnt = game->hero().drain_hp() / cnt + 1; //Now zot all of the monsters for (dp = drainee; *dp; dp++) { monster = *dp; if (!monster->decrease_hp(cnt, true)) killed_by_hero(monster, game->hero().can_see_monster(monster)); else monster->start_run(); } }