/
rogue24b3/
rogue24b3/data/
/***************************************************************************\
[*]    ___    ____   ____   __   __  ____ [*]   ROGUE: ROM With Attitude  [*]
[*]   /#/ )  /#/  ) /#/  ) /#/  /#/ /#/   [*]    All rights reserved      [*]
[*]  /#/ <  /#/  / /#/ _  /#/  /#/ /#/--  [*]   Copyright(C) 2000-2001    [*]
[*] /#/   \(#(__/ (#(__/ (#(__/#/ (#(___  [*] Kenneth Conley (Mendanbar)  [*]
[*]  Expression of Digital Creativity..   [*]  scmud@mad.scientist.com    [*]
[-]---------------------------------------+-+-----------------------------[-]
[*] File: pueblo.c							  [*]
[*] Usage: Pueblo Funtions						  [*]
\***************************************************************************/

#include "merc.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "pueblo.h"

ACMD(do_pmusic) {
    char arg[MSL];
    char buf[MSL];
    int i, x;

      const char *def_music[][2] = {
	{ "FF2 World",		"ff2world.mid"	},
	{ "FF3 Main",		"ff3main.mid"	},
	{ "FF3 World",		"ff3wld.mid"	},
	{ "DragonLance",	"dragonl.mid"	},
	{ "FF2 Cecil",		"ff2cecil.mid"	},
	{ "Organ Theme",	"organ.mid"	},
	{ "FF5 Theme",		"ff5theme.mid"	},
	{ "Aeris Theme",	"aeris.mid"	},
	{ "Sephiroth",		"sephiroth.mid"	},
	{ "FF7 World",		"ff7world.mid"	},
	{ "FF7 Ancients",	"ancients.mid"	},
	{ "Heroic Song",	"heroic.mid"	},
	{ "Crystal Prelude",	"prelude.mid"	},
	{ "FF8 Landing",	"landing.mid"	},
	{ "FF8 Find your Way",	"findyourway.mid"},
        { "\n", "\n"}
        };

        argument = one_argument(argument, arg);

        if (IS_NPC(ch) || (!IS_SET(ch->act,PLR_PUEBLO) &&
		!IS_SET(ch->act, PLR_MSP))) {
        send_to_char("Huh?\n\r",ch);
        }
        else if (!arg || !*arg) {
	send_to_char("The following pre-set music is availible...\n\r",ch);
        for (i = 0; *def_music[i][0] != '\n'; i++) {
		sprintf(buf,"  %2d. %-25s  `y%s`n\r\n",i,def_music[i][0],
			IS_STAFF(ch) ? def_music[i][1] : "");
                send_to_char(buf,ch);
        }
                send_to_char(   "\r\nUsage: pmusic <number>\r\n", ch);
        } else if (!isdigit(*arg))
                send_to_char(   "Usage: pmusic <number>\r\n"
			"Type \"pmusic\" without arguments for a list of pre-set music.\r\n",ch);
        else {
        i = atoi(arg);
        if (i < 0) {
                send_to_char("The number cannot be negative.\r\n", ch);
        } else {
           for (x = 0; *def_music[x][0] != '\n'; x++);

                if (i >= x) {
		// Subtract 1 to account for the NULL line...
		sprintf(buf,"The range for the pmusic number is 0-%d.\r\n", x-1);
                send_to_char(buf,ch);
                } else {
		sprintf(buf,"Activating Music: %s, Infinate Loop...\n\r",def_music[i][0]);
		send_to_char(buf,ch);
		music_to_char(ch, def_music[i][1]);
                        }
                }
        }
}

ACMD(do_pstop) {
	if (IS_NPC(ch) || (!IS_SET(ch->act,PLR_PUEBLO) &&
		!IS_SET(ch->act, PLR_MSP))) {
	send_to_char("Huh?\n\r",ch); return;
	}
	send_to_char("Deactivating Music: Please Standby...\n\r",ch);
	if (IS_SET(ch->act, PLR_PUEBLO))
	send_to_char("</xch_mudtext><img xch_mode=html>"
			"<img xch_sound=stop>"
			"<br><img xch_mode=text>",ch);
	else if (IS_SET(ch->act, PLR_MSP))
		send_to_char("!!MUSIC(Off)\r\n",ch);
    return;
}

ACMD(do_volume) {
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    sh_int	value;

	argument = one_argument( argument, arg );

	if (IS_NPC(ch)) {
		send_to_char("Not on NPCs.\n\r",ch);
		return;
	}
	if (!IS_SET(ch->act, PLR_PUEBLO) && !IS_SET(ch->act, PLR_MSP)) {
		send_to_char("Huh?\n\r",ch);
		return;
	}
	if (arg[0] == '\0') {
		sprintf(buf, "Syntax: volume <0-100>\n\r"
			"Your current volume level is %d%%.\r\n",
			ch->pcdata->volume);
		send_to_char(buf, ch);
		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;
	sprintf(buf,"Pueblo Volume set to %d.\n\r", value);
	send_to_char(buf,ch);
	sound(PUEBLO_V_TEST, ch, 0, 0, TO_CHAR, POS_DEAD);
	return;
}

void image_to_char(CHAR_DATA *ch, const char *image)
{
	char buf[MSL];

	if (!ch || !image) return;
	if (PLR_FLAGGED(ch, PLR_PUEBLO)) {
		sprintf(buf, "</xch_mudtext><img xch_mode=html>");
		sprintf(buf+strlen(buf), "<img src=\"%s%s\">",
			PUEBLO_DIR, image);
		strcat(buf, "<br><img xch_mode=text>");
		send_to_char(buf, ch);
	}
}

void music_to_char(CHAR_DATA *ch, const char *sound)
{
	char buf[MSL];

	if (!ch || !sound) return;
	if (IS_SET(ch->act, PLR_PUEBLO)) {
		sprintf(buf, "</xch_mudtext><img xch_mode=html>");
		sprintf(buf + strlen(buf), "<img xch_sound=loop xch_volume=%d src=\"%s%s\">",
			ch->pcdata->volume, PUEBLO_DIR, sound);
		strcat(buf, "<br><img xch_mode=text>");
		send_to_char(buf, ch);
	} else if (IS_SET(ch->act, PLR_MSP)) {
		sprintf(buf, "!!MUSIC(%s V=%d L=-1 U=%s)\r\n", sound, ch->pcdata->volume, PUEBLO_DIR);
		send_to_char(buf, ch);
        }
}

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 (PLR_FLAGGED(ch, PLR_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 (PLR_FLAGGED(ch, PLR_MSP)) {
		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);
	}
    }
}