/*																				*/
/*																				*/
/*				File:		  	say.c											*/
/*				Function:	say											*/
/*				Returns:	  	void											*/
/*				Parameters:	key - int - text to say					*/
/*																				*/
/*																				*/
/*				Function:	saynam										*/
/*				Returns:	  	void											*/
/*				Parameters:	key - int - text to say					*/
/*								ival - int - name to say				*/
/*																				*/
/*				Function:	sayval										*/
/*				Returns:	  	void											*/
/*				Parameters:	key - int - text to say					*/
/*								ival - int - value to say				*/
/*																				*/
/*				Function:	sayx											*/
/*				Returns:	  	void											*/
/*				Parameters:	ikey - int - text to say				*/
/*								evl - int - name or value to say		*/
/*								mode - int - which type to say		*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "advm.h"
#include "values.h"
#include "string.h"
#include "defcom.h"

#include "text.h"
#include "object.h"
#include "place.h"
#include "rdtext.h"
#include "eval.h"
#include "bitval.h"
#include "ref.h"
#include "where.h"


void label_600(i,zcode)
int i;
char zcode [];


	{
	char zsub[161];

	trace3("SAY600: i = %d, zcode = *%s*, ztext = \n  *%s*\n",i,zcode,ztext);
	assert(strlen(zcode)+strlen(ztext) < sizeof(ztext));
	strncpy(zsub, ztext, i);
	strcpy(zsub+i,zcode);
	strcat(zsub, ztext+i+1);
	strcpy(ztext,zsub);
	}


void sayx(ikey, evl, mode)
int ikey, evl, mode;

	{
	int valuta;
	int key [2];
#define key1 key[0]
#define key2 key[1]
	int i,j,k,ijk,jj;
	char zcode[16];

	trace3("SAY: key = %d, evl = %d, mode = %d\n",ikey,evl,mode);
	if (mode == 3)
		valuta = evl;
	switch (ikey)
		{
		case 4001:
					printf ("\n");
					return;
		case 4002:
					printf ("Ok.\n");
		case 4000:
					return;
		}
	key1 = 0;
	key2 = ikey;
	if (object(key2))
		{
		if (where(key2) != inhand)											 
			{
			if (eval(key2) < 0)
				return;
			key1 += 10*(eval(key2)+1);
			}
		}
	if (place(key2))
		{
		if ( ((i = bitval(status)) & lookng) ||
				(!(i & fast) && (!(i & brief) || !(bitval(key2) & been) ) ) )
			key1 += 10;
		}
	if (!object(key2) && !place(key2) && !text(key2))
		{
		printf ("Glitch!  Bad SAY - key = %d at rec %d.%03d after loc %d\n",
					key2,rec2,rec1,bp);
		return;
		}
	for (;;)
		{
		if (rdtext(key))
			return;
		key1++;
		if (!strncmp(ztext, ">$<", 3))
			continue;
		if (mode != 1)
			{
			char *p;

			if (p=strchr (ztext, '#'))
				{
				i = p-ztext;
				if (mode != 3)
					{
					for (j=0; j<2; j++)
						if (evl == argwrd[j])
							{
							if (j == 1 && defflg)
								{
								evl = ref(evl);
								break;
								}
							strncpy(zcode, zarg[j], sizeof(zarg[j])-1);
							strupr(zcode);
							label_600(i,zcode);
							break;
							}
					if (j>1 || (j==1 && defflg)) /* so break doesn't do this loop */
					 for (j=0; j<symcnt; j++)
						if (filkey[j] == evl)
							{
							for (ijk = 0; ijk < 6; ijk++)
								zcode[ijk] = toupper(zword[j][ijk] ^ 75);
							zcode[6] = 0;
							label_600(i,zcode);
							break;
							}
					}
				else
					{
					/* label 500 */
					itoa(valuta, zcode, 10);
					label_600(i,zcode);
					}
				}
			}
		/* label 1000 */
		printf("\n%s",ztext);
		}


	}


void say (key)
int key;

	{
	sayx (key,0,1);
	}


void saynam(key, ival)
int key;
int ival;

	{
	sayx(key, ival, 2);
	}


void sayval (key, ival)
int key;
int ival;

	{
	sayx(key, ival, 3);
	}


