/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************/
#include <sys/types.h>
#if !defined(WIN32)
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "music.h"
#include "recycle.h"
#include "interp.h"
int channel_songs[MAX_GLOBAL + 1];
struct song_data song_table[MAX_SONGS];
void song_update ( void )
{
OBJ_DATA *obj;
CHAR_DATA *victim;
ROOM_INDEX_DATA *room;
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
char *line;
int i;
/* do the global song, if any */
if ( channel_songs[1] >= MAX_SONGS )
channel_songs[1] = -1;
if ( channel_songs[1] > -1 )
{
if ( channel_songs[0] >= MAX_LINES ||
channel_songs[0] >= song_table[channel_songs[1]].lines )
{
channel_songs[0] = -1;
/* advance songs */
for ( i = 1; i < MAX_GLOBAL; i++ )
channel_songs[i] = channel_songs[i + 1];
channel_songs[MAX_GLOBAL] = -1;
}
else
{
if ( channel_songs[0] < 0 )
{
sprintf ( buf, "Music: %s, %s",
song_table[channel_songs[1]].group,
song_table[channel_songs[1]].name );
channel_songs[0] = 0;
}
else
{
sprintf ( buf, "Music: '%s'",
song_table[channel_songs[1]].
lyrics[channel_songs[0]] );
channel_songs[0]++;
}
for ( d = descriptor_list; d != NULL; d = d->next )
{
victim = d->original ? d->original : d->character;
if ( d->connected == CON_PLAYING &&
!IS_SET ( victim->comm, COMM_NOMUSIC ) &&
!IS_SET ( victim->comm, COMM_QUIET ) )
act_new ( "$t", d->character, buf, NULL, TO_CHAR,
POS_SLEEPING );
}
}
}
for ( obj = object_list; obj != NULL; obj = obj->next )
{
if ( obj->item_type != ITEM_JUKEBOX || obj->value[1] < 0 )
continue;
if ( obj->value[1] >= MAX_SONGS )
{
obj->value[1] = -1;
continue;
}
/* find which room to play in */
if ( ( room = obj->in_room ) == NULL )
{
if ( obj->carried_by == NULL )
continue;
else if ( ( room = obj->carried_by->in_room ) == NULL )
continue;
}
if ( obj->value[0] < 0 )
{
sprintf ( buf, "$p starts playing %s, %s.",
song_table[obj->value[1]].group,
song_table[obj->value[1]].name );
if ( room->people != NULL )
act ( buf, room->people, obj, NULL, TO_ALL );
obj->value[0] = 0;
continue;
}
else
{
if ( obj->value[0] >= MAX_LINES ||
obj->value[0] >= song_table[obj->value[1]].lines )
{
obj->value[0] = -1;
/* scroll songs forward */
obj->value[1] = obj->value[2];
obj->value[2] = obj->value[3];
obj->value[3] = obj->value[4];
obj->value[4] = -1;
continue;
}
line = song_table[obj->value[1]].lyrics[obj->value[0]];
obj->value[0]++;
}
sprintf ( buf, "$p bops: '%s'", line );
if ( room->people != NULL )
act ( buf, room->people, obj, NULL, TO_ALL );
}
}
void load_songs ( void )
{
FILE *fp;
int count = 0, lines, i;
char letter;
/* reset global */
for ( i = 0; i <= MAX_GLOBAL; i++ )
channel_songs[i] = -1;
if ( ( fp = file_open ( MUSIC_FILE, "r" ) ) == NULL )
{
bug ( "Couldn't open music file, no songs available.", 0 );
file_close ( fp );
return;
}
for ( count = 0; count < MAX_SONGS; count++ )
{
letter = fread_letter ( fp );
if ( letter == '#' )
{
if ( count < MAX_SONGS )
song_table[count].name = NULL;
file_close ( fp );
return;
}
else
ungetc ( letter, fp );
song_table[count].group = fread_string ( fp );
song_table[count].name = fread_string ( fp );
/* read lyrics */
lines = 0;
for ( ;; )
{
letter = fread_letter ( fp );
if ( letter == '~' )
{
song_table[count].lines = lines;
break;
}
else
ungetc ( letter, fp );
if ( lines >= MAX_LINES )
{
bug ( "Too many lines in a song -- limit is %d.",
MAX_LINES );
break;
}
song_table[count].lyrics[lines] = fread_string_eol ( fp );
lines++;
}
}
}
CH_CMD ( do_play )
{
OBJ_DATA *juke;
char *str, arg[MAX_INPUT_LENGTH];
int song, i;
bool global = FALSE;
str = one_argument ( argument, arg );
for ( juke = ch->in_room->contents; juke != NULL;
juke = juke->next_content )
if ( juke->item_type == ITEM_JUKEBOX && can_see_obj ( ch, juke ) )
break;
if ( argument[0] == '\0' )
{
chsend ( "Play what?\n\r", ch );
return;
}
if ( juke == NULL )
{
chsend ( "You see nothing to play.\n\r", ch );
return;
}
if ( !str_cmp ( arg, "list" ) )
{
BUFFER *buffer;
char buf[MAX_STRING_LENGTH];
int col = 0;
bool artist = FALSE, match = FALSE;
buffer = new_buf ( );
argument = str;
argument = one_argument ( argument, arg );
if ( !str_cmp ( arg, "artist" ) )
artist = TRUE;
if ( argument[0] != '\0' )
match = TRUE;
sprintf ( buf, "%s has the following songs available:\n\r",
juke->short_descr );
add_buf ( buffer, capitalize ( buf ) );
for ( i = 0; i < MAX_SONGS; i++ )
{
if ( song_table[i].name == NULL )
break;
if ( artist &&
( !match || !str_prefix ( argument, song_table[i].group ) ) )
sprintf ( buf, "%-39s %-39s\n\r", song_table[i].group,
song_table[i].name );
else if ( !artist &&
( !match ||
!str_prefix ( argument, song_table[i].name ) ) )
sprintf ( buf, "%-35s ", song_table[i].name );
else
continue;
add_buf ( buffer, buf );
if ( !artist && ++col % 2 == 0 )
add_buf ( buffer, "\n\r" );
}
if ( !artist && col % 2 != 0 )
add_buf ( buffer, "\n\r" );
page_to_char ( buf_string ( buffer ), ch );
free_buf ( buffer );
return;
}
if ( !str_cmp ( arg, "loud" ) )
{
argument = str;
global = TRUE;
}
if ( argument[0] == '\0' )
{
chsend ( "Play what?\n\r", ch );
return;
}
if ( ( global &&channel_songs[MAX_GLOBAL] >
-1 ) ||( !global &&juke->value[4] > -1 ) )
{
chsend ( "The jukebox is full up right now.\n\r", ch );
return;
}
for ( song = 0; song < MAX_SONGS; song++ )
{
if ( song_table[song].name == NULL )
{
chsend ( "That song isn't available.\n\r", ch );
return;
}
if ( !str_prefix ( argument, song_table[song].name ) )
break;
}
if ( song >= MAX_SONGS )
{
chsend ( "That song isn't available.\n\r", ch );
return;
}
chsend ( "Coming right up.\n\r", ch );
if ( global )
{
for ( i = 1; i <= MAX_GLOBAL; i++ )
if ( channel_songs[i] < 0 )
{
if ( i == 1 )
channel_songs[0] = -1;
channel_songs[i] = song;
return;
}
}
else
{
for ( i = 1; i < 5; i++ )
if ( juke->value[i] < 0 )
{
if ( i == 1 )
juke->value[0] = -1;
juke->value[i] = song;
return;
}
}
}