/***************************************************************************\
[*] ___ ____ ____ __ __ ____ [*] ROGUE: ROM With Attitude [*]
[*] /#/ ) /#/ ) /#/ ) /#/ /#/ /#/ [*] All rights reserved [*]
[*] /#/ < /#/ / /#/ _ /#/ /#/ /#/-- [*] Copyright(C) 2000-2001 [*]
[*] /#/ \(#(__/ (#(__/ (#(__/#/ (#(___ [*] Kenneth Conley (Mendanbar) [*]
[*] Expression of Digital Creativity.. [*] scmud@mad.scientist.com [*]
[-]---------------------------------------+-+-----------------------------[-]
[*] File: pueblo.cpp [*]
[*] Usage: Sound/Music Funtions for MSP and Pueblo [*]
\***************************************************************************/
#include "merc.h"
#include "db.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "pueblo.h"
ACMD(do_pmusic) {
int i, x;
char arg[MAX_STRING_LENGTH];
argument = one_argument(argument, arg);
if (!DESC_FLAGGED(ch->desc, DESC_PUEBLO | DESC_MSPON)) {
ch->Send("You do not have Pueblo or MSP enabled.\n\r");
return;
}
if (!arg || !*arg) {
ch->Send("The following pre-set music is availible...\n\r");
for (i = 0; i < maxPSong; i++)
ch->Send(" %3d. %-25s `y%s`n\n\r", i+1, pmusic_table[i].name,
IS_STAFF(ch) ? pmusic_table[i].fname : "");
ch->Send("\n\rUsage: pmusic <number>\n\r");
} else if (!isdigit(*arg)) {
ch->Send("Usage: pmusic <number>\n\r"
"Type 'pmusic' without an argument for a list of songs.\n\r");
} else {
if ((i = (atoi(arg)-1)) < 0)
ch->Send("The number cannot be negative.\n\r");
else {
if (i >= maxPSong)
ch->Send("The range for the pmusic number is 1-%d.\n\r", maxPSong);
else {
ch->Send("Activating Music: %s, Infinite Loop...\n\r", pmusic_table[i].name);
music_to_char(ch, pmusic_table[i].fname);
}
}
}
}
ACMD(do_pstop) {
if (IS_NPC(ch))
return;
if (!DESC_FLAGGED(ch->desc, DESC_PUEBLO | DESC_MSPON)) {
ch->Send("You do not have Pueblo or MSP enabled.\n\r");
return;
}
send_to_char("Deactivating Music: Please Standby...\n\r",ch);
if (DESC_FLAGGED(ch->desc, DESC_PUEBLO))
ch->Send("</xch_mudtext><img xch_mode=html>"
"<img xch_sound=stop>""<br><img xch_mode=text>");
else if (DESC_FLAGGED(ch->desc, DESC_MSPON))
ch->Send("!!MUSIC(Off)\r\n");
return;
}
ACMD(do_volume) {
SInt16 value = 0;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch)) {
send_to_char("Not on NPCs.\n\r",ch);
return;
}
if (!DESC_FLAGGED(ch->desc, DESC_PUEBLO | DESC_MSPON)) {
send_to_char("You do not need to set your volume.\n\r",ch);
return;
}
if (arg[0] == '\0') {
ch->Send("Syntax: volume <0-100>\n\r"
"Your current volume level is %d%%.\r\n", ch->pcdata->volume);
return;
}
if ((atoi(arg) > 100) || (atoi(arg) < 1)) {
send_to_char("Value must be within 0-100\n\r",ch);
return;
}
value = atoi(arg);
ch->pcdata->volume = value;
ch->Send("Pueblo Volume set to %d.\n\r", value);
sound(PUEBLO_V_TEST, ch, 0, 0, TO_CHAR, POS_DEAD);
return;
}
void image_to_char(CHAR_DATA *ch, const char *image) {
if (!ch || !image)
return;
if (DESC_FLAGGED(ch->desc, DESC_PUEBLO)) {
ch->Send("</xch_mudtext><img xch_mode=html>");
ch->Send("<img src=\"%s%s\">", PUEBLO_DIR, image);
ch->Send("<br><img xch_mode=text>");
}
}
void music_to_char(CHAR_DATA *ch, const char *sound) {
if (!ch || !sound)
return;
if (DESC_FLAGGED(ch->desc, DESC_PUEBLO)) {
ch->Send("</xch_mudtext><img xch_mode=html>"
"<img xch_sound=loop xch_volume=%d src=\"%s%s\">"
"<br><img xch_mode=text>",
ch->pcdata->volume, PUEBLO_DIR, sound);
} else if (DESC_FLAGGED(ch->desc, DESC_MSPON))
ch->Send("!!MUSIC(%s V=%d L=-1 U=%s)\r\n", sound, ch->pcdata->volume, PUEBLO_DIR);
}
ACMD(do_sound) {
char arg[MIL];
CHAR_DATA *vict;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!arg[0] || !argument[0]) {
send_to_char("Usage: sound <char/room/all> <filename>\r\n", ch);
return;
}
if (str_infix(".wav", argument) && str_infix(".mid", argument))
strcat(argument, ".wav");
if (!str_cmp(arg, "room")) {
ch->Send("Sending %s to room.\r\n", argument);
sound(argument, ch, 0, 0, TO_ROOM | TO_CHAR, POS_DEAD);
} else if (!str_cmp(arg, "all")) {
ch->Send("Sending %s to all.\r\n", argument);
sound(argument, ch, 0, 0, TO_ALL | TO_CHAR, POS_DEAD);
} else if ((vict = get_char_world(ch, arg)) != NULL && !IS_NPC(ch)) {
ch->Send("Sending %s to %s.\r\n", argument, vict->name);
sound(argument, ch, 0, vict, TO_VICT, POS_DEAD);
} else
send_to_char("Usage: sound <char/room/all> <filename>\r\n", ch);
}
#define SENDOK(ch) \
((ch)->desc && ((ch)->position >= min_pos) && !IS_NPC(ch))
void perform_sound(char *sound, CHAR_DATA *ch) {
char buf[MAX_STRING_LENGTH];
if (!*sound || !ch)
return;
if (ch->desc) {
if (DESC_FLAGGED(ch->desc, DESC_PUEBLO)) {
sprintf(buf, "</xch_mudtext><img xch_mode=html>");
sprintf(buf + strlen(buf), "<img xch_sound=play xch_volume=%d src=\"%s%s\">",
ch->pcdata->volume, PUEBLO_DIR, sound);
strcat(buf, "<br><img xch_mode=text>");
} else if (DESC_FLAGGED(ch->desc, DESC_MSPON)) {
sprintf(buf, "!!SOUND(%s V=%d U=%s)\r\n", sound, ch->pcdata->volume, PUEBLO_DIR);
} else
return; // Don't write anything to buffer if nothing to write.
write_to_buffer(ch->desc, buf, 0);
}
return;
}
void sound( char *str, CHAR_DATA *ch, OBJ_DATA *obj,
void *vict_obj, int type, int min_pos)
{
CHAR_DATA *to;
DESCRIPTOR_DATA *d;
ROOM_INDEX_DATA *room;
if (!*str)
return;
if (str_infix(".wav", str) && str_infix(".mid", str))
strcat(str, ".wav"); // assume sound file.
if (IS_SET(type, TO_CHAR)) {
if (ch && SENDOK(ch))
perform_sound(str, ch);
}
if (IS_SET(type, TO_VICT)) {
if ((to = (CHAR_DATA *)vict_obj) && SENDOK(to))
perform_sound(str, to);
}
if (IS_SET(type, TO_ALL | TO_ZONE)) {
for (d = descriptor_list; d; d = d->next) {
if (d->character && SENDOK(d->character) && (d->character != ch) &&
((IS_SET(type, TO_ALL) || (d->character->in_room->area == ch->in_room->area))))
perform_sound(str, d->character);
}
}
if (IS_SET(type, TO_ROOM | TO_NOTVICT)) {
if (ch && IN_ROOM(ch) != NULL)
room = IN_ROOM(ch);
else if (obj && IN_ROOM(obj) != NULL)
room = IN_ROOM(obj);
else {
mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: no valid target to sound()");
return;
}
for (to = room->people; to; to = to->next_in_room) {
if (SENDOK(to) && (to != ch) && (IS_SET(type, TO_ROOM) || (to != vict_obj)))
perform_sound(str, to);
}
}
}