string number_as_string(int num);
string number_as_place(int num);
/*
* returns an array of the form:
* ({
* ({
* "foo",
* "bing",
* }),
* ({
* ({ <list of living objects with short "foo"> }),
* ({ <ditto for short "bing"> }),
}),
* ({
* "s1",
* "s2",
* }),
* ({
* ({ <list of pointers to objects that have a short of "s1"> }),
* ({ <ditto for objects with a short of "s2"> }),
* }),
* ({ <pointers to invisible objects> }),
* })
* The first two arrays contain living objects, the second two contain
* the rest, the last contains the pointers to invisible objects.
* NB: this_player() is _not_ included in the array if (s)he is present.
*/
mixed query_inventory(object *obs) {
mixed inv;
object ob;
mixed desc;
int i,j,z;
inv = ({ ({ }), ({ }), ({ }), ({ }), ({ }), });
if (!obs)
obs = all_inventory(this_object());
for (z = sizeof(obs)-1; z >= 0;z--) {
ob = obs[z];
if (!(desc = (string)ob->pretty_short()) || (desc == "")) {
inv[4] += ({ ob });
continue;
}
/* Remove comments when ready for hidden players - Radix
if(interactive(ob) && (int)ob->query_hidden())
{
inv[4] += ({ ob });
continue;
}
*/
if (pointerp(desc)) {
if (living(ob)) {
if (ob == this_player()) continue;
for (j=0;j<sizeof(desc);j++)
if ((i = member_array(desc[j], inv[0])) >=0)
inv[1][i] += ({ ob });
else {
inv[0] += ({ desc[j] });
inv[1] += ({ ({ ob }), });
}
continue;
}
for (j=0;j<sizeof(desc);j++)
if ((i = member_array(desc[j], inv[2])) >= 0)
inv[3][i] += ({ ob });
else {
inv[2] += ({ desc[j] });
inv[3] += ({ ({ ob }) });
}
continue;
}
if (living(ob)) {
if (ob == this_player()) continue;
if ((i = member_array(desc, inv[0])) >= 0) {
inv[1][i] += ({ ob });
continue;
}
inv[0] += ({ desc });
inv[1] += ({ ({ ob }), });
continue;
}
if ((i = member_array(desc, inv[2])) >= 0) {
inv[3][i] += ({ ob });
continue;
}
inv[2] += ({ desc });
inv[3] += ({ ({ ob }), });
}
return inv;
}
string number_as_string(int n) {
string ret;
if (!n) return "zero";
if (n<20 && n>9) return ({ "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" })[n-10];
ret = ({ "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"})[n/10];
if ((n = n%10)&&(ret!="")) ret += " ";
return ret + ({ "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"})[n];
}
string number_as_place(int n) {
if (!n) return "zero";
if (n>9 && n<20) return n+"th";
return n+((n%10 == 1)?"st":(n%10 == 2)?"nd":(n%10 == 3)?"rd":"th");
}
/*
* returns a string of the contents.
* this is crying out to be fixed....
*/
varargs string query_contents(string str, object *obs) {
int i, j, drunk;
mixed inv;
string ret;
ret = "";
inv = query_inventory(obs);
drunk = (int)this_player()->query_volume(0);
if (!sizeof(inv[0]) && !sizeof(inv[2])) return ret;
if (str) ret += str;
str = " is";
if (sizeof(inv[0]) > 1) str = " are";
for (i=sizeof(inv[0])-1; i >= 0; i--) {
if (inv[0][i][0] < '0' && inv[0][i][0] > '9')
j = sizeof(inv[1][i])*((random(drunk)/1000)+1);
else
j = sizeof(inv[1][i]);
if (j > 1) {
ret += capitalize(query_num(j, 0)) + " " +
inv[1][i][0]->pretty_plural(inv[0][i]);
str = " are";
} else {
ret += capitalize(inv[0][i]);
}
if (!i) {
ret += str + " here.\n";
break;
}
if (i == 1) {
ret += " and ";
continue;
}
ret += ", ";
}
for (i=sizeof(inv[2])-1; i>=0; i--) {
j = sizeof(inv[3][i])*((random(drunk)/1000)+1);
if (j > 1) {
ret += capitalize(query_num(j,20)) + " " +
capitalize((string)inv[3][i][0]->pretty_plural(inv[2][i])) + ".\n";
continue;
}
ret += capitalize(inv[2][i]) + ".\n";
}
return ret;
}
void list_contents(string str) {
write(query_contents(str));
}