#pragma no_clone
#pragma no_inherit
#pragma strict_types
#pragma no_shadow

#include "gem.h"

string *gem_arr = ({});
int *rarity_arr = ({});

static nomask void
create()
{
     string *gems, gem_file;
     int i, rarity, pos;

     setuid();
     seteuid(getuid());

     gems = get_dir(GEM_OBJ_DIR);

     for (i = 0; i < sizeof(gems); i++)
     {
         if (gems[i][-2..] != ".c")
     {
         continue;
     }

         gem_file = GEM_OBJ_DIR + gems[i][..-3];

         if (strlen(catch(rarity = gem_file->query_gem_rarity())))
     {
             continue;
     }

         // To mogloby byc bardziej wydajne ale mniejsza z tym :P
         rarity_arr = sort_array(rarity_arr + ({ rarity }));
         pos = member_array(rarity, rarity_arr);

         if (pos < 1)
     {
             gem_arr = ({ gem_file }) + gem_arr;
     }
         else
     {
             gem_arr = gem_arr[..pos] + ({ gem_file }) + gem_arr[(pos + 1)..];
     }
     }
}

nomask varargs string *
query_gems(int rarity = -1)
{
    int i;

    if (rarity == -1)
    {
        return gem_arr + ({});
    }

    for (i = sizeof(rarity_arr) - 1; i >= 0; i--)
    {
        if (rarity_arr[i] < rarity)
    {
            return gem_arr[(i + 1)..];
    }
    }

    return gem_arr + ({});
}

nomask varargs object
random_gem(int rarity = -1)
{
    string *gems = query_gems(rarity);

    if (!sizeof(gems))
    {
        return 0;
    }

    setuid();
    seteuid(getuid());
    return clone_object(gems[random(sizeof(gems))]);
}

nomask varargs object
random_gem_by_rarity(int rarity = -1)
{
    int i, j, sum, ran;
    string *gems = query_gems(rarity);

    if (!sizeof(gems))
    {
        return 0;
    }

    // Powinno sie zapiasc sume?
    for (i = 0; i < sizeof(gems); i++)
    {
        sum += rarity_arr[i];
    }

    ran = random(sum);

    for (i = 0; i < sizeof(rarity_arr); i++)
    {
        j += rarity_arr[i];

        if (j >= ran)
    {
        setuid();
        seteuid(getuid());
            return clone_object(gems[i]);
    }
    }

    /* Should never get here */
}
