Aller au contenu

Photo

Get item level: The short formula


  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1
Kato -

Kato -
  • Members
  • 392 messages
Hi,

I remember to have seen a quick formula for retrieving the level of an item, instead of the long 'if' or switch checking all levels. However, IIRC it was on the old forums(I think it was posted by Axe), so I should have made a note of it...

Does anyone know the formula?

Thank you!

Kato

#2
Lightfoot8

Lightfoot8
  • Members
  • 2 535 messages
Item level??

Are you asking for a Item Level Restriction fromula?

If you are, after looking at the progression, I do not know if there is a simple one.

#3
Kato -

Kato -
  • Members
  • 392 messages
Yes, I meant ILR, sorry. The formula I have seen needed the item gold value as a parameter and returned the item level after checking in the 2DA. 

Modifié par Kato_Yang, 22 octobre 2011 - 03:29 .


#4
FunkySwerve

FunkySwerve
  • Members
  • 1 308 messages
Taken from an ooooold post of mine:

if (iGPValue > 4000000) iItemLevel = 40; else if (iGPValue > 3800000) iItemLevel = 39; else if (iGPValue > 3600000) iItemLevel = 38; else if (iGPValue > 3400000) iItemLevel = 37; else if (iGPValue > 3200000) iItemLevel = 36; else if (iGPValue > 3000000) iItemLevel = 35; else if (iGPValue > 2800000) iItemLevel = 34; else if (iGPValue > 2600000) iItemLevel = 33; else if (iGPValue > 2400000) iItemLevel = 32; else if (iGPValue > 2200000) iItemLevel = 31; else if (iGPValue > 2000000) iItemLevel = 30; else if (iGPValue > 1800000) iItemLevel = 29; else if (iGPValue > 1600000) iItemLevel = 28; else if (iGPValue > 1400000) iItemLevel = 27; else if (iGPValue > 1200000) iItemLevel = 26; else if (iGPValue > 1000000) iItemLevel = 25; else if (iGPValue > 750000) iItemLevel = 24; else if (iGPValue > 500000) iItemLevel = 23; else if (iGPValue > 250000) iItemLevel = 22; else if (iGPValue > 130000) iItemLevel = 21; else if (iGPValue > 110000) iItemLevel = 20; else if (iGPValue > 90000) iItemLevel = 19; else if (iGPValue > 75000) iItemLevel = 18; else if (iGPValue > 65000) iItemLevel = 17; else if (iGPValue > 50000) iItemLevel = 16; else if (iGPValue > 40000) iItemLevel = 15; else if (iGPValue > 35000) iItemLevel = 14; else if (iGPValue > 30000) iItemLevel = 13; else if (iGPValue > 25000) iItemLevel = 12; else if (iGPValue > 19500) iItemLevel = 11; else if (iGPValue > 15000) iItemLevel = 10; else if (iGPValue > 12000) iItemLevel = 9; else if (iGPValue > 9000) iItemLevel = 8; else if (iGPValue > 6500) iItemLevel = 7; else if (iGPValue > 5000) iItemLevel = 6; else if (iGPValue > 3500) iItemLevel = 5; else if (iGPValue > 2500) iItemLevel = 4; else if (iGPValue > 1500) iItemLevel = 3; else if (iGPValue > 1000) iItemLevel = 2;

These days, it's probably smarter to loop checking the 2da (itemvalue.2da) - the caching is much improved, and it's good normalization to only store data in one place. That way, if you or someone else winds up modding the 2da, the function will still work.

Funky

#5
Kato -

Kato -
  • Members
  • 392 messages
Thanks Funky, I'll try to retrieve (or setup) the formula and I'll post it if I do. Otherwise, I'll use the one you posted. :)

Kato

Modifié par Kato_Yang, 22 octobre 2011 - 05:49 .


#6
FunkySwerve

FunkySwerve
  • Members
  • 1 308 messages
Eh...I'm not even sure that one uses bioware's values - my post took it from someplace I linked in it, which purported to use bioware values, but with the links no longer working, I have no way of checking, other than going to the 2da. And, if I'm going to do that...

int GetItemLevel(object oItem) {
    int i, nMax, nValue = GetGoldPieceValue(oItem);
    for (i = 0; i < 39; i++) {
        nMax = StringToInt(Get2DAString("ITEMVALUE", "MAXSINGLEITEMVALUE", i));
        if (nMax >= nValue)
            break;
    }
    return i + 1;
}

EDIT: Lest you be confused, the i is row value - 0 is level one. This function will never return a 40 - 39 is considered the highest in our setup - everything else is handled by variable. If you want it to go up to 40, just add an = in the for loop, like so:
for (i = 0; i <= 39; i++) {

That's the code I yanked from our !itemlevel SIMTools command.  I'm not totally sure about that, because we don't use it that often, as our ILR is mostly handled by variables, but it's likely to be correct. The only reason for my uncertainty is the existance of the TOTAL VALUEFILTER column in that 2da. If you're curious, here's our full !itemlevel code:

            if (sCText == "itemlevel") {
                DeleteLocalString(oCPC, "FKY_CHAT_LOCAL_CTEXT");
                oCTarget = GetLocalObject(oCPC, "FKY_CHAT_TARGET");

                if (!GetIsObjectValid(oCTarget)) {
                    FloatingTextStringOnCreature(COLOR_GOLD + REQUIRES_TARGET + COLOR_END, oCPC, FALSE);
                    SetLocalString(oCPC, "FKY_CHAT_COMMAND", OBJECT_TARGET + "!" + sCText);

                    if (!GetIsObjectValid(GetItemPossessedBy(oCPC, "fky_chat_target")))
                        CreateItemOnObject("fky_chat_target", oCPC);
                    return;
                } else
                    DeleteLocalObject(oCPC, "FKY_CHAT_TARGET");

                if (GetObjectType(oCTarget) != OBJECT_TYPE_ITEM) {
                    FloatingTextStringOnCreature(COLOR_RED + "You can only check requirements on items!" + COLOR_END, oCPC, FALSE);
                    return;
                }


                string sMessage = "Requirements for " + GetName(oCTarget) + ":\\n";

                int i, nMax, nValue = GetGoldPieceValue(oCTarget);
                int nLevel = GetLocalInt(oCTarget, "HCLevel");

                if (nLevel)
                    sMessage += COLOR_ORANGE + "    Requires level " + IntToString((nLevel > 46 ? 41 : nLevel - 6)) +
                        " for a hardcore character to use.\\n";

                nLevel = GetLocalInt(oCTarget, "ILR");
                if (nLevel <= 0) {
                    for (i = 0; i < 39; i++) {
                        nMax = StringToInt(Get2DAString("ITEMVALUE", "MAXSINGLEITEMVALUE", i));
                        if (nMax >= nValue)
                            break;
                    }

                    nLevel = i + 1;
                }
                sMessage += COLOR_LT_YELLOW + "    Requires level " + IntToString(nLevel) + " to use.\\n";

                if (GetBaseItemType(oCTarget) != BASE_ITEM_SCROLL && GetBaseItemType(oCTarget) != BASE_ITEM_SPELLSCROLL) {
                    nLevel = -1;
                    for (i = 0; i < 64; i++) {
                        nMax = StringToInt(Get2DAString("SKILLVSITEMCOST", "DeviceCostMax", i));
                        if (nMax >= nValue) {
                            nLevel = StringToInt(Get2DAString("SKILLVSITEMCOST", "SkillReq_class", i));
                            break;
                        }
                    }

                    if (nLevel > 0)
                        sMessage += COLOR_LT_YELLOW + "    Requires UMD " + IntToString(nLevel) + "/" +
                            IntToString(nLevel + 5) + "/" + IntToString(nLevel + 10) + " to use.\\n";
                    else
                        sMessage += COLOR_LT_YELLOW + "    Cannot be used with UMD.\\n";
                }

                SendSystemMessage(oCPC, sMessage);

            }


Funky

Modifié par FunkySwerve, 22 octobre 2011 - 08:38 .


#7
Kato -

Kato -
  • Members
  • 392 messages
Many thanks once more, Funky!