All pastes #2049873 Raw Edit

Something

public text v1 · immutable
#2049873 ·published 2011-04-23 19:57 UTC
rendered paste body
/*

[Item-parser Syntax Information]

1. [Keyword] separates into two groups
   - [Property Keywords] : [Type], [Name], [Class], [Quality], [Flag], [Level], [Prefix], [Suffix]
   - [Stat Keywords] : [Number or Alias]

2. [Keyword] must be surrounded by '[' and ']'

3. [Property Keywords] must be placed first

4. Insert '#' symbol between [Property Keywords] and [Stat Keywords]

5. Use '+', '-', '*', '/', '(', ')', '&&', '||', '>', '>=', '<', '<=', '==', '!=' symbols for comparison

6. Use '//' symbol for comment

*/

Include("libs/common/NTItemAlias.ntl");

var _NTIP_CheckList = new Array();

function NTIPOpenFile(filepath)
{
    var _nipfile;
    var _line;

    _nipfile = FileOpen(filepath, 0);

    if(!_nipfile)
        return false;

    while(!_nipfile.eof)
    {
        _line = NTIPParseLineInt(_nipfile.ReadLine());

        if(_line)
            _NTIP_CheckList.push(_line);
    }

    _nipfile.Close();

    return true;
}

function NTIPCheckItem(item)
{
    var i;
    var _identified;
    var _result = 0;

    _identified = item.itemflag & 0x10;

    for(i = 0 ; i < _NTIP_CheckList.length ; i++)
    {
        if(_NTIP_CheckList[i][0].length > 0)
        {
            if(eval(_NTIP_CheckList[i][0]))
            {
                if(_NTIP_CheckList[i][1].length > 0)
                {
                    if(eval(_NTIP_CheckList[i][1]))
                    {
                        if(_NTIP_CheckList[i][2] && _NTIP_CheckList[i][2]["MaxQuantity"] && !isNaN(_NTIP_CheckList[i][2]["MaxQuantity"]))
                        {
                            if(NTIP_CheckQuantityOwned(_NTIP_CheckList[i][0],_NTIP_CheckList[i][1], false) < _NTIP_CheckList[i][2]["MaxQuantity"])
                            {
                                //Print("I need more of these "+NTC_ItemQualityToMGRColor[item.quality] + item.itemdesc.split("\n")[0].substring(3));
                                return 1;
                            }
                            else
                            {
                                //Print("I already have enough of these "+NTC_ItemQualityToMGRColor[item.quality] + item.itemdesc.split("\n")[0].substring(3)+" in my stash!");
                                return 0;
                            }
                        }
                        else
                        {
                            //Print("No maximum for this item");
                            return 1;
                        }
                    }
                    else if(!_identified && _result == 0)
                        _result = -1;
                }
                else
                {
                    if(_NTIP_CheckList[i][2] && _NTIP_CheckList[i][2]["MaxQuantity"] && !isNaN(_NTIP_CheckList[i][2]["MaxQuantity"]))
                    {
                        if(NTIP_CheckQuantityOwned(_NTIP_CheckList[i][0], null, false) < _NTIP_CheckList[i][2]["MaxQuantity"])
                        {
                            //Print("I need more of these "+NTC_ItemQualityToMGRColor[item.quality] + item.itemdesc.split("\n")[0].substring(3));
                            return 1;
                        }
                        else
                        {
                            //Print("I already have enough of these "+NTC_ItemQualityToMGRColor[item.quality] + item.itemdesc.split("\n")[0].substring(3)+" in my stash!");
                            return 0;
                        }
                    }
                    else
                    {
                        //Print("No maximum for this item");
                        return 1;
                    }
                }
            }
        }
        else if(_NTIP_CheckList[i][1].length > 0)
        {
            if(eval(_NTIP_CheckList[i][1]))
            {
                if(_NTIP_CheckList[i][2] && _NTIP_CheckList[i][2]["MaxQuantity"] && !isNaN(_NTIP_CheckList[i][2]["MaxQuantity"]))
                {
                    if(NTIP_CheckQuantityOwned(null, _NTIP_CheckList[i][1], false) < _NTIP_CheckList[i][2]["MaxQuantity"])
                    {
                        //Print("I need more of these "+NTC_ItemQualityToMGRColor[item.quality] + item.itemdesc.split("\n")[0].substring(3));
                        return 1;
                    }
                    else
                    {
                        //Print("I already have enough of these "+NTC_ItemQualityToMGRColor[item.quality] + item.itemdesc.split("\n")[0].substring(3)+" in my stash!");
                        return 0;
                    }
                }
                else
                {
                    return 1;
                }
            }
            else if(!_identified && _result == 0)
                _result = -1;
        }
    }

    return _result;
}

// Internal function
function NTIP_CheckQuantityOwned(item_type, item_stats, check_inventory_too)
{
    var _nb = 0;
    var _items = me.GetItems();
    if (!_items)
    {
        Print("I can't find my items!");
        return 0;
    }
    for(var i = 0 ; i < _items.length ; i++)
    {
        if(_items[i].mode == 0 && _items[i].itemloc == 4)
        {
            var item = _items[i];
            if((item_type != null && item_type.length > 0 && eval(item_type)) || item_type == null)
                if((item_stats != null && item_stats.length > 0 && eval(item_stats)) || item_stats == null)
                    _nb++;
        }
        else if(check_inventory_too && _items[i].mode == 0 && _items[i].itemloc == 0)
        {
            var item = _items[i];
            if((item_type != null && item_type.length > 0 && eval(item_type)) || item_type == null)
                if((item_stats != null && item_stats.length > 0 && eval(item_stats)) || item_stats == null)
                    if(NTConfig_Columns[_items[i].y][_items[i].x] > 0) // we check only space that is supposed to be free
                        _nb++;
        }
    }
    //Print("I have "+_nb+" of these.");
    return _nb;
}

function NTIPParseLineInt(input)
{
    var i;
    var _start, _end;
    var _section, _keyword;
    var _result;

    _end = input.indexOf("//");
    if(_end != -1)
        input = input.substring(0, _end);

    input = input.replace(/ |;/g, "").toLowerCase();

    if(input.length < 5)
        return null;

    _result = input.split("#");

    if(_result[0] && _result[0].length > 4)
    {
        _section = _result[0].split("[");

        _result[0] = _section[0];

        for(i = 1 ; i < _section.length ; i++)
        {
            _end = _section[i].indexOf("]") + 1;

            switch(_section[i][0])
            {
            case 't':
                _result[0] += "item.itemtype";
                break;
            case 'n':
                _result[0] += "item.classid";
                break;
            case 'c':
                _result[0] += "item.itemclass";
                break;
            case 'q':
                _result[0] += "item.quality";
                break;
            case 'f':
                if(_section[i][_end] == '!')
                    _result[0] += "!(item.itemflag&";
                else
                    _result[0] += "(item.itemflag&";

                _end += 2;
                break;
            case 'l':
                _result[0] += "item.itemlevel";
                break;
            case 'p':
                _result[0] += "item.itemprefix";
                break;
            case 's':
                _result[0] += "item.itemsuffix";
                break;
            default:
                Print("Unknown Keyword : " + input);
                break;
            }

            for(_start = _end ; _end < _section[i].length ; _end++)
            {
                if(!NTIPIsSyntaxInt(_section[i][_end]))
                    break;
            }

            _result[0] += _section[i].substring(_start, _end);

            for(_start = _end ; _end < _section[i].length ; _end++)
            {
                if(NTIPIsSyntaxInt(_section[i][_end]))
                    break;
            }

            _keyword = _section[i].substring(_start, _end);

            if(isNaN(_keyword))
            {
                switch(_section[i][0])
                {
                case 't':
                    _result[0] += _NTIPAliasType[_keyword];
                    break;
                case 'n':
                    _result[0] += _NTIPAliasClassID[_keyword];
                    break;
                case 'c':
                    _result[0] += _NTIPAliasClass[_keyword];
                    break;
                case 'q':
                    _result[0] += _NTIPAliasQuality[_keyword];
                    break;
                case 'f':
                    _result[0] += _NTIPAliasFlag[_keyword] + ")";
                    break;
                }
            }
            else
            {
                if(_section[i][0] == 'f')
                    _result[0] += _keyword + ")";
                else
                    _result[0] += _keyword;
            }

            _result[0] += _section[i].substring(_end);
        }
    }
    else
        _result[0] = "";

    if(_result[1] && _result[1].length > 4)
    {
        _section = _result[1].split("[");

        _result[1] = _section[0];

        for(i = 1 ; i < _section.length ; i++)
        {
            _end = _section[i].indexOf("]");

            _keyword = _section[i].substring(0, _end);

            if(isNaN(_keyword))
                _result[1] += "item.GetStat(" + _NTIPAliasStat[_keyword] + ")";
            else
                _result[1] += "item.GetStat(" + _keyword + ")";

            _result[1] += _section[i].substring(_end+1);
        }
    }
    else
        _result[1] = "";

    if(_result[2] && _result[2].replace(/^\s+|\s+$/, "").length > 0)
    {
        _section = _result[2].split("[");
        _result[2] = new Array();

        for(i = 1 ; i < _section.length ; i++)
        {
            _end = _section[i].indexOf("]");

            _keyword = _section[i].substring(0, _end);

            if(_keyword.toLowerCase().replace(/^\s+|\s+$/, "") == "maxquantity")
            {
                _end = _section[i].split("==")[1].replace(/^\s+|\s+$/, "").indexOf("//");
                if(_end == -1)
                    _end = _section[i].split("==")[1].replace(/^\s+|\s+$/, "").length;
                var _quantity = parseInt(_section[i].split("==")[1].replace(/^\s+|\s+$/, "").substring(0, _end));
                _result[2]["MaxQuantity"] = _quantity;
            }
            else
            {
                Print("Error in your NIP file : unknown 3rd part keyword.");
            }
        }
    }

    return _result;
}

function NTIPIsSyntaxInt(ch)
{
    return (ch == '!' || ch == '%' || ch == '&' || (ch >= '(' && ch <= '+') || ch == '-' || ch == '/' || (ch >= ':' && ch <= '?') || ch == '|');
}