I would like for my bard class to be able to cast certain songs outside of combat that normally have to be cast while in combat.
If they, and/or their group, is not in combat the song will still provide the buffs however I want it to be where if the tick times down and they do not engage in battle, then the buff wears off.
Code:
ACMD(do_song_group3)
{
struct char_data *tch, *k;
struct follow_type *f, *f_next;
int percent, prob, percentsonc, probsonc, inspiretick;
if (ch == NULL)
return;
if ((IS_NPC(ch)) && (AFF_FLAGGED(ch, AFF_CHARM))) {
act("$n looks puzzled.", FALSE, ch, 0, 0, TO_ROOM);
return;
}
if (!IS_NPC(ch) && !GET_TOT_SKILL(ch, SKILL_SONG_GROUP3)) {
send_to_char(ch, "%s", NOPROFICIENCY);
return;
}
if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_PEACEFUL)) {
send_to_char(ch, "%s", PEACE_ROOM_WARNING);
return;
}
if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_SOUNDPROOF)) {
send_to_char(ch, "The accoustics in this area are too poor to sing effectively.\r\n");
return;
}
if (GET_MANA(ch) <= 19) {
send_to_char(ch, "You haven't the energy to sing that song!\r\n");
return;
}
if (GET_MOVE(ch) <= 9) {
send_to_char(ch, "Your movement points are too low to sing that song!\r\n");
return;
}
if (!AFF_FLAGGED(ch, AFF_GROUP)) {
send_to_char(ch, "You have no group to inspire!\r\n");
return;
}
if (AFF_FLAGGED(ch, AFF_SILENCE)) {
send_to_char(ch, "You vocal cords are too tight to sing!\r\n");
return;
}
if (!FIGHTING(ch)) {
send_to_char(ch, "You feel temporarily inspired by song!\r\n");
return;
}
if ((IS_SET(MSC2_FLAGS(ch), MSC2_SANG_GROUP)) || (IS_SET(MSC2_FLAGS(ch), MSC2_SONG_GROUP1)) ||
(IS_SET(MSC2_FLAGS(ch), MSC2_SONG_GROUP2)) || (IS_SET(MSC2_FLAGS(ch), MSC2_SONG_GROUP3))) {
send_to_char(ch, "You are not yet prepared to consider another melody right now.\r\n");
return;
}
percent = rand_number(1, 20); /* 101% is a complete failure */
prob = 25;
if ((percent + ((GET_TOT_CHA(ch)) / 2)) >= (prob)) {
send_to_char(ch, "@gYou calmly close your eyes and begin to sing, the notes that follow fall flat.@n\r\n");
act("@g$n calmly closes $s eyes and begins to sing, but all you hear is a dull, flat melody.@n", FALSE, ch, 0, ch, TO_ROOM);
GET_MANA(ch) -= 10;
GET_MOVE(ch) -= 5;
GET_WAIT_STATE(ch) = 1 * PULSE_VIOLENCE;
if (rand_number(1, 101) < SG_MIN)
skill_gain(ch, SKILL_SONG_GROUP3);
return;
}
if ((percent + ((GET_TOT_CHA(ch)) / 2)) < (prob)) {
send_to_char(ch, "@GYou calmly close your eyes and begin to sing a war sonnet...@n\r\n");
act("@G$n calmly closes $s eyes and begins to sing a war sonnet...@n", FALSE, ch, 0, ch, TO_ROOM);
GET_MANA(ch) -= 20;
GET_MOVE(ch) -= 10;
GET_WAIT_STATE(ch) = 1 * PULSE_VIOLENCE;
}
if (ch->master != NULL)
k = ch->master;
else
k = ch;
{
for (f = k->followers; f; f = f_next) {
f_next = f->next;
tch = f->follower;
if (IN_ROOM(tch) != IN_ROOM(ch))
continue;
if (!AFF_FLAGGED(ch, AFF_GROUP)) {
send_to_char(ch, "You have no group to inspire!\r\n");
return;
}
if (!AFF_FLAGGED(tch, AFF_GROUP)) {
continue;
}
if (!FIGHTING(tch)) {
send_to_char(tch, "@gYou and your group must be in battle to be inspired!@n\r\n");
continue;
}
if ((IS_SET(MSC2_FLAGS(tch), MSC2_SANG_GROUP)) || (IS_SET(MSC2_FLAGS(tch), MSC2_SONG_GROUP1)) ||
(IS_SET(MSC2_FLAGS(tch), MSC2_SONG_GROUP2)) || (IS_SET(MSC2_FLAGS(tch), MSC2_SONG_GROUP3))) {
send_to_char(ch, "Your group is not ready to hear another song.\r\n");
return;
}
if (GET_RESIST(tch, RESIST_TYPE_SONC) >= 100) {
send_to_char(ch, "Your friend is deaf, they will never hear you.\r\n");
continue;
}
if (GET_RESIST(tch, RESIST_TYPE_SONC) <= 99) {
percentsonc = rand_number(1, 99);
probsonc = (GET_RESIST(tch, RESIST_TYPE_SONC));
if (percentsonc < probsonc) {
send_to_char(ch, "Your friend couldn't hear you, perhaps you should sing louder.\r\n");
continue;
}
}
if (ch == tch)
continue;
/* If the Bard is the Leader of the Group */
SET_BIT(MSC2_FLAGS(tch), MSC2_SONG_GROUP3);
SET_BIT(MSC2_FLAGS(tch), MSC2_SANG_GROUP);
SET_BIT(MSC2_FLAGS(ch), MSC2_SONG_GROUP3);
SET_BIT(MSC2_FLAGS(ch), MSC2_SANG_GROUP);
SET_BIT(MSC2_FLAGS(k), MSC2_SONG_GROUP3);
SET_BIT(MSC2_FLAGS(k), MSC2_SANG_GROUP);
if (ch != tch) {
send_to_char(tch, "@GYou feel inspired!@n\r\n");
}
if ((ch == tch) || (k != ch)) {
send_to_char(ch, "@GYou feel inspired!@n\r\n");
}
}
/* If the Bard is not the Leader of the Group */
if ((k != ch) && AFF_FLAGGED(k, AFF_GROUP))
SET_BIT(MSC2_FLAGS(ch), MSC2_SONG_GROUP3);
SET_BIT(MSC2_FLAGS(ch), MSC2_SANG_GROUP);
SET_BIT(MSC2_FLAGS(k), MSC2_SONG_GROUP3);
SET_BIT(MSC2_FLAGS(k), MSC2_SANG_GROUP);
send_to_char(k, "@GYou feel inspired!@n\r\n");
return;
}
}