/*    /lib/jump.c
 *    from the Dead Souls Object Library
 *    handles different methods of jumping
 *    created by Descartes of Borg 960117
 *    Version: @(#) jump.c 1.4@(#)
 *    Last modified: 96/12/22
 */

#include <jump.h>
#include <function.h>

private mapping Jumps = ([]);

mapping GetJumps() {
    return Jumps;
}

varargs mixed AddJump(string name, mixed saute, int type){
    Jumps[name] = ({ saute , type });
}


mixed CanJump(object who, string id, int type) {

    if( Jumps[id] && Jumps[id][1] == type ) {
        return 1;
    }
    if( !sizeof(Jumps) ) {
        return 0;
    }
    type = Jumps[keys(Jumps)[0]][1];
    switch(type) {
    case JUMP_INTO:
        return "Perhaps you mean to jump into it?";

    case JUMP_FROM:
        return "Perhaps you mean to jump from it?";

    case JUMP_THROUGH:
        return "Perhaps you mean to jump through it?";

    case JUMP_OVER:
        return "Perhaps you mean to jump over it?";

    case JUMP_ON:
        return "Perhaps you mean to jump on it?";
    }
    return 0;
}

mixed eventJump(object who, string id, int type) {
    mixed dest;

    if( Jumps[id] && Jumps[id][1] == type ) {
        dest = Jumps[id][0];
    }
    else {
        return 0;
    }
    if( stringp(dest) ) {
        string omsg, imsg;

        switch(type) {
        case JUMP_INTO:
            omsg = "$N jumps into the " + id + ".";
            imsg = "$N comes landing in.";
            break;

        case JUMP_FROM:
            omsg = "$N jumps out of here.";
            imsg = "$N comes landing in.";
            break;

        case JUMP_THROUGH:
            omsg = "$N jumps through the " + id + ".";
            imsg = "$N comes landing in.";
            break;

        case JUMP_OVER:
            omsg = "$N jumps over the " + id + ".";
            imsg = "$N comes landing in.";
            break;
        }
        who->eventMoveLiving(dest, omsg, imsg);
        return 1;
    }
    else {
        if( functionp(dest) & FP_OWNER_DESTED ) {
            return "You encountered an error in a functional.";
        }
        return evaluate(dest, who, id, type);
    }
}

mixed direct_jump_word_obj(string prep, object target, string id) {
    int type;

    switch(prep) {
    case "in": case "into":
        type = JUMP_INTO;
        break;
    case "from": case "out": case "off":
        type = JUMP_FROM;
        break;
    case "through": case "across":
        type = JUMP_THROUGH;
        break;
    case "over":
        type = JUMP_OVER;
        break;
    case "on": case "onto":
        type = JUMP_ON;
        break;
    default:
        return 0;
    }
    id = remove_article(lower_case(id));
    return CanJump(this_player(), id, type);    
}

varargs mixed direct_jump_word_word_obj(mixed args...) {
    string prep = args[0] + " " + args[1];
    string id = remove_article(lower_case(args[5]));
    int type;

    switch(prep) {
    case "out of": case "off of":
        type = JUMP_FROM;
    default:
        return 0;
    }
    return CanJump(this_player(), id, type);
}

