// Reworked the whole thing. Instead of storing a bunch of almost
// identical arrays and mappings, I let the queries take care of it all.
// Flode - March 1997
#include "parse_command.h"
mixed *items;
int *cur_desc;
void create()
{
items = ({ });
cur_desc = ({ });
}
string short()
{
int i;
string *ret = ({ });
for(i=0;i<sizeof(cur_desc);i++)
ret += ( pointerp(items[i*3]) ? ({ items[cur_desc[i]*3][0] }) :
({ items[cur_desc[i]*3] }) );
return query_multiple_short(ret);
}
string *pretty_short()
{
int i;
string *ret = ({ });
for(i=0;i<sizeof(cur_desc);i++)
ret += ( pointerp(items[i*3]) ? ({items[cur_desc[i]*3][0] }) :
({ items[cur_desc[i]*3] }) );
return ret;
}
string query_plural()
{
int i;
string *ret = ({ });
for(i=0;i<sizeof(cur_desc);i++)
ret += ( pointerp(items[i*3]) ? ({ pluralize(items[cur_desc[i]*3][0]) }) :
({ pluralize(items[cur_desc[i]*3]) }) );
return query_multiple_short(ret);
}
string *pretty_plural()
{
int i;
string *ret = ({ });
for(i=0;i<sizeof(cur_desc);i++)
ret += ( pointerp(items[i*3]) ? ({ pluralize(items[cur_desc[i]*3][0]) }) :
({ pluralize(items[cur_desc[i]*3]) }) );
return ret;
}
string long()
{
int i;
string ret = "";
for(i=0;i<sizeof(cur_desc);i++)
ret += items[cur_desc[i]*3+1];
return ret;
}
int *query_cur_desc() { return cur_desc; }
mapping query_verbs()
{
mapping verb = ([ ]);
int i,j;
string s,*bits;
for(i=0;i<sizeof(items);i+=3)
if(!pointerp(items[i]))
{
bits = explode(items[i]," ");
s = bits[sizeof(bits)-1];
if(!verb[s])
verb[s] = ({ bits[0..sizeof(bits)-2], i/3 });
else
verb[s] += ({ bits[0..sizeof(bits)-2], i/3 });
}
else for(j=0;j<sizeof(items[i]);j++)
{
bits = explode(items[i][j]," ");
s = bits[sizeof(bits)-1];
if(!verb[s])
verb[s] = ({ bits[0..sizeof(bits)-2], i/3 });
else
verb[s] += ({ bits[0..sizeof(bits)-2], i/3 });
}
return verb;
}
mapping query_plurals()
{
mapping plural = ([ ]);
int i,j;
string s,*bits;
for(i=0;i<sizeof(items);i+=3)
if(!items[i+2])
if(!pointerp(items[i]))
{
bits = explode(items[i]," ");
s = pluralize(bits[sizeof(bits)-1]);
if(!plural[s])
plural[s] = ({ bits[0..sizeof(bits)-2], i/3 });
else
plural[s] += ({ bits[0..sizeof(bits)-2], i/3 });
}
else for(j=0;j<sizeof(items[i]);j++)
{
bits = explode(items[i][j]," ");
s = bits[sizeof(bits)-1];
if(!plural[s])
plural[s] = ({ bits[0..sizeof(bits)-2], i/3 });
else
plural[s] += ({ bits[0..sizeof(bits)-2], i/3 });
}
return plural;
}
string *query_lng()
{
int i;
string *ret = ({ });
for(i=0;i<sizeof(items);i+=3)
ret += ({ items[i+1] });
return ret;
}
string *query_shrt()
{
int i;
string *ret = ({ });
for(i=0;i<sizeof(items);i+=3)
ret += (pointerp(items[i]) ? ({ items[i][0] }) : ({ items[i] }) );
return ret;
}
int drop() { return 1; }
int get() { return 1; }
varargs void setup_item(mixed nam,mixed long,int no_plural)
{
int i,j;
string str;
if(pointerp(long))
{
if(j=member_array("long",long))
str = long[i+1];
}
else
str = long;
if(!str) str = "You see nothing special.\n";
items += ({ nam, str, no_plural });
}
/* If addition then keeps existing desc and adds desc,
otherwise it completely rewrites description */
varargs int modify_item(string str, string desc, int addition)
{
string new1;
int i;
if ((i=member_array(str, query_shrt())) == -1)
return 0;
if (!desc)
return 0;
if (addition)
{ new1 = items[i*3+1];
new1 += desc;
items[i*3+1]=new1;
}
else
items[i*3+1] = desc;
return 1;
}
/* Old doesn't work.
int modify_item(string str, mixed long)
{
int i,j;
if((i=member_array(str, query_shrt())) == -1)
return 0;
if(pointerp(long))
{
if(j=member_array("long"),long)
items[j*3+1] = long[i+1];
}
else items[j*3+1] = long[i+1];
return 1;
}
*/
int remove_item(string str)
{
int i;
if((i=member_array(str, query_shrt())) == -1)
return 0;
items = delete(items, i*3, 3);
return 1;
}
string *parse_command_id_list()
{
int i, j;
string *ret = ({ });
string *bits;
for(i=0;i<sizeof(items);i+=3)
if(!pointerp(items[i]))
{
bits = explode(items[i]," ");
ret += ({ bits[sizeof(bits)-1] });
}
else for(j=0;j<sizeof(items[i]);j++)
{
bits = explode(items[i][j]," ");
ret += ({ bits[sizeof(bits)-1] });
}
return ret;
}
string *parse_command_plural_id_list()
{
int i, j;
string *ret = ({ });
string *bits;
for(i=0;i<sizeof(items);i+=3)
if(items[i+2])
ret += ({ "no plural" });
else
if(!pointerp(items[i]))
{
bits = explode(items[i]," ");
ret += ({ pluralize(bits[sizeof(bits)-1]) });
}
else for(j=0;j<sizeof(items[i]);j++)
{
bits = explode(items[i][j]," ");
ret += ({ bits[sizeof(bits)-1] });
}
return ret;
}
string *parse_command_adjectiv_id_list()
{
int i, j;
string *ret = ({ });
string *bits;
for(i=0;i<sizeof(items);i+=3)
if(!pointerp(items[i]))
{
bits = explode(items[i]," ");
ret += bits[0..sizeof(bits)-2];
}
else for(j=0;j<sizeof(items[i]);j++)
{
bits = explode(items[i][j]," ");
ret += bits[0..sizeof(bits)-2];
}
return ret;
}
object query_parse_id(mixed *arr)
{
string *bits;
mixed stuff;
int i, j;
if(arr[P_THING] == 0)
{
bits = explode(arr[P_STR], " ");
if(!(stuff = query_plurals()[bits[sizeof(bits)-1]]))
if(!(stuff = query_verbs()[bits[sizeof(bits)-1]]))
return 0;
cur_desc = ({ });
for(j=0;j<sizeof(stuff);j+=2)
{
for(i=0;i<sizeof(bits)-2;i++)
if(member_array(bits[i], stuff[j]) == -1)
break;
if(i<sizeof(bits)-2)
continue;
cur_desc += ({ stuff[j+1] });
}
return this_object();
}
if(arr[P_THING] < 0)
{
bits = explode(arr[P_STR], " ");
if(!(stuff = query_verbs()[bits[sizeof(bits)-1]]))
return 0;
for(j=0;j<sizeof(stuff);j+=2)
{
for(i=0;i<sizeof(bits)-2;i++)
if(member_array(bits[i], stuff[j]) == -1)
break;
if(i<sizeof(bits)-2 || ++arr[P_THING] != 0)
continue;
cur_desc = ({ stuff[j+1] });
arr[P_THING] = -10321;
return this_object();
}
return 0;
}
bits = explode(arr[P_STR], " ");
if(!(stuff = query_plurals()[bits[sizeof(bits)-1]]))
if(!(stuff = query_verbs()[bits[sizeof(bits)-1]]))
return 0;
cur_desc = ({ });
for(j=0;j<sizeof(stuff);j+=2)
{
for(i=0;i<sizeof(bits)-2;i++)
if(member_array(bits[i], stuff[j]) == -1)
break;
if(i<sizeof(bits)-2)
continue;
cur_desc += ({ stuff[j+1] });
arr[P_THING]--;
if(arr[P_THING] <= 0)
{
arr[P_THING] = -10786;
return this_object();
}
}
return this_object();
}
void dest_me()
{
destruct(this_object());
}
void dwep()
{
destruct(this_object());
}
int move() { return 1; }