summaryrefslogblamecommitdiff
path: root/npc/functions/time.txt
blob: a7f344123672d554e4d746706a58ded6d9bd1b0b (plain) (tree)
1
2
3
4
5
6
7
8
9



                                 
                            



                                                                                  
                                            
                     
                                 











                                
                                               
                    
                                         
                      
                                               
                 
             
 






























                                                            

                                                


                                         

                               


































































                                                                                               
function	script	now	{
    return gettimetick(2);
}

// Composite time for quests
// Max value is 16,777,215, so we reduce 1514772000 which is the number of seconds
// elapsed from 01/01/1970 00:00 CET to 01/01/2018 00:00 GMT -0200
// That would only hold 194 days, or 6.47 months, so we reduce 6 in 6 months when
// we hit limit, looping monthly
// This value is NOT reversable to FuzzyTime
// santime( {limit} )
function	script	santime	{
    .@limit=getarg(0, 16777214);
    .@base=1514772000;
    .@red=(60*60*24*30*6);
    .@val=gettimetick(2)-.@base;
    do
    {
        .@val-=.@red;
    } while (.@val > .@limit);

    return .@val;
}

// Grace period when santime is reset: 3 months
// gcsantime( time )
function	script	gcsantime	{
    .@m=(60*60*24*30);
    if (santime() < .@m*3 && getarg(0) > .@m*5)
        return 1;
    return 0;
}

function	script	time_from_ms	{
    return now() + (getarg(0) / 1000);
}

function	script	time_from_seconds	{
    return now() + getarg(0);
}

function	script	time_from_minutes	{
    return now() + (getarg(0) * 60);
}

function	script	time_from_hours	{
    return now() + (getarg(0) * 3600);
}

function	script	time_from_days	{
    return now() + (getarg(0) * 86400);
}


// FuzzyTime(<unix timestamp>{, <options>{, <precision>}})
//     gives time in a human-readable  format
//
//     <options> is bitmasked:
//     1  do not show "ago" when in past
//     2  do not show "in" when in the future
//     4  show "from now" instead of "in" when in the future
//
//     <precision> is the number of units to show,
//     by default uses two (eg. 2m30s or 1h20m).
//     Use '99' for max precision

function	script	FuzzyTime	{
    .@future = getarg(0, now());
    .@options = getarg(1, 3);
    .@precision = getarg(2, 2);
    .@diff = (.@future - now());

    // check if in the past, or in the future
    if (.@diff < 0) {
        .@diff *= -1;
        .@past = true;
    }

    .@diff = max(1, .@diff);

    if (.@diff >= 31536000) {
        .@years = (.@diff / 31536000);
        .@diff = (++.@s == .@precision ? 0 : (.@diff % 31536000));
        .@ret$ += sprintf("%d %s", .@years, (.@years > 1 ? "years" : "year"));
    }

    if (.@diff >= 86400) {
        .@days = (.@diff / 86400);
        .@diff = (++.@s == .@precision ? 0 : (.@diff % 86400));

        if (.@s > 1) {
            .@ret$ += (.@diff > 0 ? ", " : " and ");
        }

        .@ret$ += sprintf("%d %s", .@days, (.@days > 1 ? "days" : "day"));
    }

    if (.@diff >= 3600) {
        .@hours = (.@diff / 3600);
        .@diff = (++.@s == .@precision ? 0 : (.@diff % 3600));

        if (.@s > 1) {
            .@ret$ += (.@diff > 0 ? ", " : (.@s >= 3 ? ", " : " ") + "and ");
        }

        .@ret$ += sprintf("%d %s", .@hours, (.@hours > 1 ? "hours" : "hour"));
    }

    if (.@diff >= 60) {
        .@minutes = (.@diff / 60);
        .@diff = (++.@s == .@precision ? 0 : (.@diff % 60));

        if (.@s > 1) {
            .@ret$ += (.@diff > 0 ? ", " : (.@s >= 3 ? ", " : " ") + "and ");
        }

        .@ret$ += sprintf("%d %s", .@minutes, (.@minutes > 1 ? "minutes" : "minute"));
    }

    if (.@diff >= 1) {
        if (++.@s > 1) {
            .@ret$ += (.@s >= 3 ? ", " : " ") + "and ";
        }

        .@ret$ += sprintf("%d %s", .@diff, (.@diff > 1 ? "seconds" : "second"));
    }

    if (.@past && !(.@options & 1)) {
        .@ret$ += " ago";
    }

    if (!(.@past) && !(.@options & 2)) {
        .@ret$ = ((.@options & 4) ? sprintf("%s from now", .@ret$) : sprintf("in %s", .@ret$));
    }

    return .@ret$;
}