summaryrefslogblamecommitdiff
path: root/npc/functions/estate.txt
blob: e0290a12dc4aa97d0b16746c2ab71e52424388b6 (plain) (tree)






































                                                                                             

                                                                          


                                                         
                                                                                      










                                                                                      
                                                                                        







                                                                                                                                           



                                          








                                                                           
                                                             






                                                             
                                                              








                                                                                                                                           













































































                                                                                                              

























































































                                                                                                 
// TMW2: Moubootaur Legends scripts.
// Author:
//    Jesusalva
// Description:
//    Real Estate System
//    Script Helpers
//    WARNING: They affect directly the real estate global variables!

// This function reduces payment accordingly
// realestate_payment ( amount )
function	script	realestate_payment	{
    REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-getarg(0);
    if (REAL_ESTATE_CREDITS < 0) {
        Zeny+=REAL_ESTATE_CREDITS;
        REAL_ESTATE_CREDITS=0;
    }
    return;
}

// Generate unique name for setcells
// realestate_cellname ( estate_id, object_id )
function	script	realestate_cellname	{
    return "RESObj_"+getarg(0)+"_"+getarg(1);
}

// Generate sell price for furniture based on original price and estate ID
// realestate_sellprice ( estate_id, price )
function	script	realestate_sellprice	{
    .@timeleft=$ESTATE_RENTTIME[getarg(0)]-gettimetick(2); // Number of seconds
    .@daysleft=.@timeleft/86400; // Number of days left of rent
    .@weeksleft=.@timeleft/604800; // Number of weeks left of rent

    //debugmes "Your contract is valid for %d weeks more - %d days", .@weeksleft, .@daysleft;
    //debugmes "The divisor is %d", max(1, 8-.@weeksleft);

    return (getarg(1)/max(1, 8-.@weeksleft)) - max(0, 60-.@daysleft);
}

// This will toggle if mobilia was purchased or not, in the right group
// And as an added bonus, will tell the correct Script to reload NPCs
// realestate_togglemobilia ( estate_id, layer_id, object_id{, npc_file} )
function	script	realestate_togglemobilia	{
    switch (getarg(1)) {
        case 1:
            $ESTATE_MOBILIA_64[getarg(0)] = $ESTATE_MOBILIA_64[getarg(0)] ^ getarg(2);
            break;
        case 2:
            $ESTATE_MOBILIA_4[getarg(0)] = $ESTATE_MOBILIA_4[getarg(0)] ^ getarg(2);
            break;
        case 3:
            $ESTATE_MOBILIA_8[getarg(0)] = $ESTATE_MOBILIA_8[getarg(0)] ^ getarg(2);
            break;
        case 4:
            $ESTATE_MOBILIA_32[getarg(0)] = $ESTATE_MOBILIA_32[getarg(0)] ^ getarg(2);
            break;
        case 5:
            $ESTATE_MOBILIA_128[getarg(0)] = $ESTATE_MOBILIA_128[getarg(0)] ^ getarg(2);
            break;
        case 6:
            $ESTATE_MOBILIA_2[getarg(0)] = $ESTATE_MOBILIA_2[getarg(0)] ^ getarg(2);
            break;
        default:
            debugmes("[ERROR] [CRITICAL] [REAL ESTATE]: Object %d have Invalid Collision Type: %d (must range 1~6)", getarg(2), getarg(1));
            break;
    }
    if (getarg(3, "error") != "error") {
        // Reload NPCs on the meanwhile
        donpcevent getarg(3)+"::OnReload";
    }
    return;
}


// Like the previous function, but returns true if player have said mobilia
// realestate_hasmobilia ( estate_id, layer_id, object_id )
function	script	realestate_hasmobilia	{
    switch (getarg(1)) {
        case 1:
            return $ESTATE_MOBILIA_64[getarg(0)] & getarg(2);
        case 2:
            return $ESTATE_MOBILIA_4[getarg(0)] & getarg(2);
        case 3:
            return $ESTATE_MOBILIA_8[getarg(0)] & getarg(2);
        case 4:
            return $ESTATE_MOBILIA_32[getarg(0)] & getarg(2);
        case 5:
            return $ESTATE_MOBILIA_128[getarg(0)] & getarg(2);
        case 6:
            return $ESTATE_MOBILIA_2[getarg(0)] & getarg(2);
        default:
            debugmes("[ERROR] [CRITICAL] [REAL ESTATE]: Object %d have Invalid Collision Type: %d (must range 1~6)", getarg(2), getarg(1));
            return false;
    }
    return false;
}



//////////////////////////////////////////////////////////////////////////////
///////////// Dialog Helpers
// "If you copy-paste the same line too often, make a function for it"


// Rent_Available Label
// Returns true regardless of player decision
// realestate_rent ( estate_id, price, <rent time> )
function	script	realestate_rent	{
    .id=getarg(0);
    .price=getarg(1);
    .time=getarg(2, 2592000); // Defaults to 30 days

    do
    {
        mesc l("This Real Estate is available for rent for only @@ GP!", format_number(.price));
        .@gp=REAL_ESTATE_CREDITS+Zeny;
        mesc l("You currently have: @@ GP and mobiliary credits", format_number(.@gp));
        next;
        select
            rif(.@gp > .price, l("Rent it! Make it mine!")),
            l("Information"),
            l("Don't rent it");

        // You want to rent
        if (@menu == 1) {
            if ($ESTATE_RENTTIME[.id] > gettimetick(2)) {
                mesc l("Somebody already rented it before you!");
                close;
            }
            REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-.price;
            if (REAL_ESTATE_CREDITS < 0) {
                Zeny+=REAL_ESTATE_CREDITS;
                REAL_ESTATE_CREDITS=0;
            }

            // Payment done, you can now acquire the house for a month
            $ESTATE_RENTTIME[.id]=gettimetick(2)+.time;

            // If you're not the previous owner
            // Remove previous owner furniture and reset room password
            if ($ESTATE_OWNER[.id] != getcharid(3)) {
                /*
                $ESTATE_MOBILIA_2[.id]=0;
                $ESTATE_MOBILIA_4[.id]=0;
                $ESTATE_MOBILIA_8[.id]=0;
                $ESTATE_MOBILIA_32[.id]=0;
                $ESTATE_MOBILIA_64[.id]=0;
                $ESTATE_MOBILIA_128[.id]=0;
                */
                $ESTATE_PASSWORD$[.id]="";
                $ESTATE_DOORBELL[.id]=false;
            }

            // Register your info so you can manage it
            $ESTATE_OWNER[.id]=getcharid(3);
            $ESTATE_OWNERNAME$[.id]=strcharinfo(0);

            mesc l("Rent successful for 30 days!");
        } else if (@menu == 2) {
            mesc l("You can rent this house to make it yours.") + " " + l("The rent lasts 30 days.");
            mesc l("Then you'll be able to buy furniture and utility.");
            mesc l("The door is password-protected, so your friends can enter but strangers stay outside.");
            next;
            mesc l("Both rent and furniture are bought using money, however, there are mobiliary credits.");
            mesc l("Mobiliary Credits is a special currency which can only be used on real estate.");
            mesc l("It's obtained with ADMINS or by selling furniture. It is sumed to money and used first.");
            next;
        }
    } while (@menu == 2);
    return true;
}





// L_Manage Label
// Returns true regardless of player decision
// realestate_manage ( estate_id, price, <rent time> )
function	script	realestate_manage	{
    .id=getarg(0);
    .price=getarg(1);
    .time=getarg(2, 2592000); // Defaults to 30 days

    do
    {
        mesc l("@@'s Estate", strcharinfo(0));
        mesc ".:: "+ l("Managment Menu") + " ::.";

        .@gp=REAL_ESTATE_CREDITS+Zeny;
        mesc l("Rent time available: @@", FuzzyTime($ESTATE_RENTTIME[.id]));
        mesc l("Total Credits and GP: @@", format_number(.@gp));
        mes "";
        mesc l("Rent Renew Price: @@ GP", format_number(.price));
        mesc l("Room password: @@", $ESTATE_PASSWORD$[.id]);
        if ($ESTATE_DOORBELL[.id])
            mesc l("Doorbell is disabled"), 1;

        next;
        select
            l("Leave"),
            l("Enable/disable doorbell"),
            l("Set room password"),
            rif(.@gp >= .price && $ESTATE_RENTTIME[.id] < gettimetick(2)+.time, l("Renew Rent")),
            rif($@GM_OVERRIDE, l("Destroy all mobilia")),
            rif($@GM_OVERRIDE, l("Expire rent time"));

        switch (@menu) {
            case 1:
                break;
            case 2:
                $ESTATE_DOORBELL[.id]=!$ESTATE_DOORBELL[.id];
                break;
            case 3:
                mesc l("(Leave the password blank to disable)");
                mesc l("Current Room password: @@", $ESTATE_PASSWORD$[.id]);
                mesc l("Input new password: ");
                input .@password$;
                mesc l("Repeat new password: ");
                input .@passwordc$;
                if (.@password$ == .@passwordc$) {
                    $ESTATE_PASSWORD$[.id]=.@password$;
                    mesc l("Password changed with success!"), 3;
                } else {
                    mesc l("The passwords doesn't match."), 1;
                }
                break;
            case 4:
                // The check is performed before showing the menu option
                // I guess it could be hacked, but I'll probably see negative GP...
                REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-.price;
                if (REAL_ESTATE_CREDITS < 0) {
                    Zeny+=REAL_ESTATE_CREDITS;
                    REAL_ESTATE_CREDITS=0;
                }

                // Payment done, you can now acquire the house for a month
                // If you lost the rent on the meanwhile, it'll renew
                // If you lost the rent and somebody else rented it, you lose the GP
                $ESTATE_RENTTIME[.id]+=.time;
                break;
            case 5:
                mesc l("Are you sure? This cannot be undone!"), 1;
                next;
                if (validatepin()) {
                    $ESTATE_MOBILIA_2[.id]=0;
                    $ESTATE_MOBILIA_4[.id]=0;
                    $ESTATE_MOBILIA_8[.id]=0;
                    $ESTATE_MOBILIA_32[.id]=0;
                    $ESTATE_MOBILIA_64[.id]=0;
                    $ESTATE_MOBILIA_128[.id]=0;
                    $ESTATE_PASSWORD$[.id]="";
                    $ESTATE_DOORBELL[.id]=false;
                }
            case 6:
                mesc l("Are you sure? This cannot be undone!"), 1;
                next;
                if (validatepin()) {
                    $ESTATE_RENTTIME[.id]=gettimetick(2);
                }
        }
    } while (@menu != 1);
    return true;
}