#include <lib.h>
#include <events.h>
inherit LIB_ITEM;
inherit LIB_ROLL;
inherit LIB_SHAKE;
inherit LIB_CONSULT;
int Denominator = 6;
int Result = 6;
string BaseLong;
int SetDenominator(int denom){
    if(!denom) return;
    else return Denominator = denom;
}
string SetLong(string str){
    item::SetLong(str);
    if(!BaseLong) BaseLong = str;
    return BaseLong;
}
static void create(){
    item::create();
    SetKeyName("die");
    SetId(({"dado","bone", "alea"}));
    SetShort("a six-sided die");
    SetLong("A typical die used for games of chance. It is orange and marked "
      "with numbers rather than dots.");
    SetDenominator(6);
    SetNoCondition(1);
}
void init(){
    item::init();
    if(member_array("d"+Denominator,GetId()) == -1){
        SetId(GetId()+({ "d"+Denominator }) );
    }
}
int doRoll(){
    Result = random(Denominator)+1;
    SetLong(BaseLong + "\nThe die's result is: "+Result+".\n");
    return Result;
}
int eventMove(mixed dest){
    int ret;
    if(ret = (item::eventMove(dest))){
        doRoll();
    }
    return ret;
}
varargs mixed eventResults(mixed args){
    if(intp(args)){
        say("The result of "+this_player()->GetName()+"'s roll is: "+args);
        write("The result of your roll is: "+args);
    }
    return args;
}
varargs mixed eventRoll(object where){
    object dude = this_player();
    string extrathing = "";
    doRoll();
    if(where == environment(this_player())) where = 0;
    if(!where) eventMove(environment(this_player()));
    else {
        if(objectp(where)) extrathing = " on "+where->GetShort();
        if(!inherits(LIB_SURFACE,where) || !eventMove(where)){
            extrathing = "";
            eventMove(environment(this_player()));
        }
    }
    write("You roll your "+strip_article(GetShort())+extrathing+", and the result is: "+Result);
    say(dude->GetName()+" rolls "+possessive(dude)+" "+strip_article(GetShort())+extrathing+", "
      "and the result is: "+Result);
    return Result;
}
varargs mixed eventShake(object dude, string foo){
    write("You shake your "+strip_article(GetShort())+".");
    say(dude->GetName()+" shakes "+possessive(dude)+" "+strip_article(GetShort())+".");
    doRoll();
    return 1;
}
varargs mixed eventConsult(object dude, string foo){
    write("The die result is: \n"+Result);
    say(dude->GetName()+" consults "+possessive(dude)+" "+strip_article(GetShort())+".");
    return 1;
}
varargs mixed CanConsult(object who, string component){
    return 1;
}
varargs mixed CanShake(object who, string component){
    return 1;
}