Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - LoveLess

#1
A big part of what makes me love EFU is Halfbrood's work. This place wouldnt be the same without him
#2
Or alternatively, some special bags that dont count towards the max but have limited things they can carry. Like ones that can ONLY hold books.
#3
The pack limit was introduced because people would use them as inventory extensions to an extreme, having sixty or more bags in their inventory. Doing this you can easily increase the size of your pack exponentially, to several times the original maximum size. This is not what the DMs thought people's packs should be like.

It would be somewhat nice if inside QAs, the penalty for being overburdened by potions, bags, etc was at least less harsh since you need to at least be able to carry it to the end of the quest. As of right now the pack limit is less than the max, to avoid the penalty in quests.
#4
Screen Shots & Obituaries / Re: Clarissant of Llancarfan
September 17, 2024, 03:51:18 PM
The lealest of paladins
#5
Suggestions / Lower level quests
September 17, 2024, 03:31:14 PM
Just a small recommendation since I notice the lower level PCs have more trouble getting groups together than those doing board work:

Is it possible to lower the quest timers for non-board quests? Like those in the Gutters and around town, to much lower cooldowns? Something like 3 or 4 hours might be around a good time. It should allow players to gather up groups with a greater freedom and regularity to do the content.
#6
Suggestions / Travel Dialogue Destinations
April 22, 2024, 08:43:58 PM
Just a small quality of life, you can currently hear every other part of the dialogue when the speaker is talking to the NPC, except what destination the player chooses at the end.

It would be nice if the player spoke it around them like the other dialogue options just for a small convenience.
#7
Screen Shots & Obituaries / Re: Cosine Mevura
April 05, 2024, 01:46:28 AM
killed the music
#8
Suggestions / Project Star Chart
March 20, 2024, 05:52:33 PM
It doesn't allow you to recast it while it's up, stating that you already have it in the combat log. This shouldn't be needed as the game won't let these stack since they are the same effect from the same script, much like you cant have two One With the Land giving you double skill bonuses. A bit annoying when you want to recast a spell that's about to run out of time anyway.

Would like it to just remove that check entirely and let it be cast, or remove the old cast if there's some other reason I am missing.
#9
Suggestions / Re: Spells Suggestions Thread
March 07, 2024, 06:57:27 AM
Horizikaul's boom added to Bard's first circle spell list. Would be cool for mage or evoker style bards and it's even sonic damage. It's only 4d4 at level 8.
#10
Player Workshop / Re: Expanded Item Tooltips
February 20, 2024, 08:46:13 PM
//expands tooltip of the selected item
void ExpandItemTooltip(object oTarget);

void ExpandItemTooltip(object oTarget)
{
    string sTooltip, sBaseItemType, s2daLookup, sAspect, sPrename;
    int nAspectID;

    int nBaseItemType = GetBaseItemType(oTarget);

    if (nBaseItemType == BASE_ITEM_BLANK_POTION || nBaseItemType == BASE_ITEM_BLANK_SCROLL ||  nBaseItemType == BASE_ITEM_BLANK_WAND
    ||  nBaseItemType == BASE_ITEM_ENCHANTED_POTION || nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || nBaseItemType == BASE_ITEM_ENCHANTED_WAND
    ||  nBaseItemType == BASE_ITEM_POTIONS || nBaseItemType == BASE_ITEM_SPELLSCROLL || nBaseItemType == BASE_ITEM_MAGICWAND) {
        return;
    }

    //turn this to FALSE when not testing
    int nFeedback = TRUE;

    if(GetLocalInt(oTarget, "nTooltipName") == FALSE)
        sPrename = GetName(oTarget, FALSE);
    else
        sPrename = GetLocalString(oTarget, "sTooltipPrename");

    if(!JsonGetLength(RegExpMatch("</c>", sPrename))) {
        //sPrename = ColorString(sPrename, Orange());
    }

    itemproperty iprpTarget = GetFirstItemProperty(oTarget);

    // base item type
    // moved above aspect to break the color between name/aspect
    // removed extra padding
    s2daLookup = Get2DAString("baseitems", "Name", GetBaseItemType(oTarget));
    sBaseItemType = GetStringByStrRef(StringToInt(s2daLookup));
    sTooltip += sBaseItemType;

    if (GetLocalInt(oTarget, "nAspectID"))
    {
        // We want to skip no aspect given and "None" entirely
        if(nAspectID > 1)
        {
            //string sAspect = GetAspectName(GetLocalInt(oTarget, "nAspectID"));
            sTooltip += "\n" + sAspect;
        }
    }

    float fWeight = IntToFloat(GetWeight(oTarget)) * 0.1f;
    if(fWeight > 0.5) // dont show weight if this or below
        sTooltip += "\n" + "Weight: " + FloatToString(fWeight, 4, 1);

    int nCharges = GetItemCharges(oTarget);
    if(nCharges > 0)
        sTooltip += "\n" + "Charges: " + IntToString(nCharges);

    while(GetIsItemPropertyValid(iprpTarget))
    {
        // if it has a duration, it is only temporary
        if(GetItemPropertyDurationRemaining(iprpTarget))
        {
            iprpTarget = GetNextItemProperty(oTarget);
            continue;
        }

        int nType = GetItemPropertyType(iprpTarget);

        // item types we want to skip and not print to the tooltip
        switch(nType){
            // base item weight reduction
            case 11 : iprpTarget = GetNextItemProperty(oTarget); continue;
            // additional weight
            case 81 : iprpTarget = GetNextItemProperty(oTarget); continue;
            // secret properties
            case 87 : iprpTarget = GetNextItemProperty(oTarget); continue;
        }

        int nSubtype = GetItemPropertySubType(iprpTarget);
        int nCostTable = GetItemPropertyCostTable(iprpTarget);
        int nCostTableValue = GetItemPropertyCostTableValue(iprpTarget);
        int nParam1 = GetItemPropertyParam1(iprpTarget);
        int nParam1Value = GetItemPropertyParam1Value(iprpTarget);

        string sParam1, sParam1Value, sType, sCostTable, sCostTableValue, sSubtype;
        string sBadstrref = "Bad Strref";

        sType = Get2DAString("ItemProps", "StringRef", nType);

        sSubtype = Get2DAString("itempropdef", "SubTypeResRef", nType);

        sSubtype = Get2DAString(sSubtype, "Name", nSubtype);
        sParam1 = Get2DAString("iprp_paramtable", "TableResRef", nParam1);
        sParam1Value = Get2DAString(sParam1, "Name", nParam1Value);

        sCostTable = Get2DAString("iprp_costtable", "Name", nCostTable);
        sCostTableValue = Get2DAString(sCostTable, "Name", nCostTableValue);

        // used for exceptions
        int nSkip = FALSE;

        // formatting for the new string that will be saved
        // define exceptions here that you want to rename/alter
        sTooltip += "\n";
        if((nType == 65) ||
           (nType == 64) ||
           (nType == 63)) 
        {
            // only useable by for class, alignment, race
            sTooltip += "OUB: ";
        }
        else if(nType == 1)
        {
            // armor class bonus
            nSkip = TRUE;
            sTooltip += GetStringByStrRef(StringToInt(sCostTableValue)) + " AC";
        }
        else if(nType == 2 || nType == 3 || nType == 4 || nType == 5)
        {
            // armor class bonus vs specific
            nSkip = TRUE;
            // bonus
            sTooltip += GetStringByStrRef(StringToInt(sCostTableValue)) + " AC";
            // versus what
            sTooltip += " vs. " + GetStringByStrRef(StringToInt(sSubtype));
        }
        else if(nType == 13) // spell slot for classes
        {
            sTooltip += "Spell Slot: ";
        }
        else if(nType == 15  || // cast spell iprp
                nType == 20) // damage immunity
        {
            // do nothing, leave blank
        }
        else if(nType == 37)
        {
            // used for broad immunities like crit, sneak, minda ffecting, etc
            sTooltip += "Immunity: ";
        }
        else if(nType == 40 || nType == 41)
        {
            // saves item property, comment out if you want it gone
            sTooltip += "Save vs. ";
        }
        else if(nType == 52)
        {
            // skills item property, comment out if you want it gone
            //sTooltip += "Skill: ";
        }
        else if(nType == 56)
        {
            // generic Attack Bonus
            nSkip = TRUE;
            sTooltip += GetStringByStrRef(StringToInt(sCostTableValue))  + " Attack Bonus";
        }
        else if(nType == 57 || nType == 58 ||nType == 59)
        {
            // Attack Bonus vs specific
            nSkip = TRUE;
            // bonus
            sTooltip += GetStringByStrRef(StringToInt(sCostTableValue)) + " AB";
            // versus what
            sTooltip += " vs. " + GetStringByStrRef(StringToInt(sSubtype));
        }
        else if(nType == 16)
        {
            // generic damage bonus
            nSkip = TRUE;
            // bonus
            string sDamageBonus = GetStringByStrRef(StringToInt(sCostTableValue));
            sTooltip += "+" + GetSubString(sDamageBonus, 0, FindSubString(sDamageBonus, "Damage"));
            // type
            sTooltip += GetStringByStrRef(StringToInt(sSubtype)) + " Damage";
        }
        else if(nType == 17 || nType == 18 ||nType == 19)
        {
            // specific damage bonus vs

            nSkip = TRUE;
            // bonus
            string sDamageBonus = GetStringByStrRef(StringToInt(sCostTableValue));
            sTooltip += "+" + GetSubString(sDamageBonus, 0, FindSubString(sDamageBonus, "Damage"));
            // type
            sTooltip += GetStringByStrRef(StringToInt(sParam1Value));
            // versus what
            sTooltip += " vs. " + GetStringByStrRef(StringToInt(sSubtype));
        }
        else
        {
            // non exception, print as tlk defines
            sTooltip += GetStringByStrRef(StringToInt(sType));

            if((nSubtype != 255)     ||
               (nParam1Value != 255) ||
               (nCostTableValue != 255) )
            {
                // add to anything with subtypes, excluding exceptions listed above
                sTooltip += ": ";
            }
        }

        string sFeedback;
        sFeedback += "nType: " + IntToString(nType) + " = " + GetStringByStrRef(StringToInt(sType)) + "\n";

        // find values assigned from 2das and tlk
        // this is everything from what alignment vs, to what value, and what spell is used
        if((nSubtype != 255 ||
           nParam1Value != 255 ||
           nCostTableValue != 255)
           && !nSkip)
        {

            if(nSubtype == 335)
            {
                sTooltip += "Unique Power (Self Only)";
            }
            else if(nSubtype != 255)
            {
                string sSubtypestrref = GetStringByStrRef(StringToInt(sSubtype));
                if(FindSubString(sSubtypestrref, sBadstrref, 0) != 0)
                {
                    sTooltip += sSubtypestrref;
                }

                if(nSubtype == 329)
                    sTooltip += "(Use)";
            }

            if(nParam1Value != 255)
            {
                string sParamstrref = GetStringByStrRef(StringToInt(sParam1Value));
                if(FindSubString(sParamstrref, sBadstrref, 0) != 0)
                {
                    sTooltip += " ";
                    sTooltip += sParamstrref;
                }
            }

            if(nCostTableValue != 255)
            {
                string sCoststrref = GetStringByStrRef(StringToInt(sCostTableValue));
                if(FindSubString(sCoststrref, sBadstrref, 0) != 0)
                {
                    sTooltip += " ";
                    sTooltip += sCoststrref;
                }
            }
        }

        sFeedback += "nSubtype: " + IntToString(nSubtype) + " = " + GetStringByStrRef(StringToInt(sSubtype)) + "\n";
        sFeedback += "nCostTable: " + IntToString(nCostTable) + " = " + GetStringByStrRef(StringToInt(sCostTable)) + "\n";
        sFeedback += "nCostTableValue: " + IntToString(nCostTableValue) + " = " + GetStringByStrRef(StringToInt(sCostTableValue)) + "\n";
        sFeedback += "nParam1: " + IntToString(nParam1) + " = " + GetStringByStrRef(StringToInt(sParam1)) + "\n";
        sFeedback += "nParam1Value: " + IntToString(nParam1Value) + " = " + GetStringByStrRef(StringToInt(sParam1Value));     

        if(nFeedback == TRUE)
            //SendMessageToAllDMs(sFeedback);
            SendMessageToPC(GetFirstPC(), sFeedback);

        //end, loop back with next property
        iprpTarget = GetNextItemProperty(oTarget);
    }

    SetObjectTextBubbleOverride(oTarget, OBJECT_UI_TEXT_BUBBLE_OVERRIDE_REPLACE, sPrename + "\n" + sTooltip);
}

Made more exceptions for the longest names I could find like Use, Attack Bonus, Armor Bonus, and Saves. Shorted up skills and more item properties. Will no longer show the weight of items that have a weight 0.5 or less.
#11
Suggestions / Re: Spells Suggestions Thread
February 19, 2024, 08:47:42 AM
Astral Blade - When it kills a target from the astral damage, can it add a cleave attack to the queue? Your blade was in alignment with the heavens this swing, cleaving through one foe and striking another.

Something fun to add since I've noticed it actually kills things with the 2 or 3 astral damage more often than you would expect, preventing characters with Cleave from triggering an additional attack at all, since it's considered a spell not an attack. Thought a fun compromise would be to just give it cleave in general when only that small bit of damage manages to kill a target, give it a bit more fun.
#12
Player Workshop / Re: Expanded Item Tooltips
February 19, 2024, 07:22:15 AM
//expands tooltip of the selected item
void ExpandItemTooltip(object oTarget);

void ExpandItemTooltip(object oTarget)
{
    string sTooltip, sBaseItemType, s2daLookup, sAspect, sPrename;
    int nAspectID;

    //turn this to FALSE when not testing
    int nFeedback = FALSE;

    if(GetLocalInt(oTarget, "nTooltipName") == FALSE)
        sPrename = GetName(oTarget, FALSE);
    else
        sPrename = GetLocalString(oTarget, "sTooltipPrename");

    if(!JsonGetLength(RegExpMatch("</c>", sPrename))) {
        sPrename = ColorString(sPrename, Orange());
    }

    itemproperty iprpTarget = GetFirstItemProperty(oTarget);

    // base item type
    // moved above aspect to break the color between name/aspect
    // removed extra padding
    s2daLookup = Get2DAString("baseitems", "Name", GetBaseItemType(oTarget));
    sBaseItemType = GetStringByStrRef(StringToInt(s2daLookup));
    sTooltip += "Item Type: " + sBaseItemType;

    if (GetLocalInt(oTarget, "nAspectID"))
    {
        // We want to skip no aspect given and "None" entirely
        if(nAspectID > 1)
        {
            string sAspect = GetAspectName(GetLocalInt(oTarget, "nAspectID"));
            sTooltip += "\n" + sAspect;
        }
    }

    float fWeight = IntToFloat(GetWeight(oTarget)) * 0.1f;
    if(fWeight > 0.1) // dont show weight if it's 0.1 or less
        sTooltip += "\n" + "Weight: " + FloatToString(fWeight, 4, 1);

    int nCharges = GetItemCharges(oTarget);
    if(nCharges > 0)
        sTooltip += "\n" + "Charges: " + IntToString(nCharges);

    while(GetIsItemPropertyValid(iprpTarget))
    {
        if(GetItemPropertyDurationRemaining(iprpTarget))
        {
            iprpTarget = GetNextItemProperty(oTarget);
            continue;
        }

        int nType = GetItemPropertyType(iprpTarget);

        // item types we want to skip and not print to the tooltip
        switch(nType){
            // base item weight reduction
            case 11 : iprpTarget = GetNextItemProperty(oTarget); continue;
            // additional weight
            case 81 : iprpTarget = GetNextItemProperty(oTarget); continue;
            // secret properties
            case 87 : iprpTarget = GetNextItemProperty(oTarget); continue;
        }

        int nSubtype = GetItemPropertySubType(iprpTarget);
        int nCostTable = GetItemPropertyCostTable(iprpTarget);
        int nCostTableValue = GetItemPropertyCostTableValue(iprpTarget);
        int nParam1 = GetItemPropertyParam1(iprpTarget);
        int nParam1Value = GetItemPropertyParam1Value(iprpTarget);

        string sParam1, sParam1Value, sType, sCostTable, sCostTableValue, sSubtype;
        string sBadstrref = "Bad Strref";

        sType = Get2DAString("ItemProps", "StringRef", nType);

        sSubtype = Get2DAString("itempropdef", "SubTypeResRef", nType);

        sSubtype = Get2DAString(sSubtype, "Name", nSubtype);
        sParam1 = Get2DAString("iprp_paramtable", "TableResRef", nParam1);
        sParam1Value = Get2DAString(sParam1, "Name", nParam1Value);

        sCostTable = Get2DAString("iprp_costtable", "Name", nCostTable);
        sCostTableValue = Get2DAString(sCostTable, "Name", nCostTableValue);

        // formatting for the new string that will be saved
        // define exceptions here that you want to rename/alter
        sTooltip += "\n";
        if((nType == 65) ||
           (nType == 64) ||
           (nType == 63))  // only useable by for class, alignment, race
        {
            sTooltip += "Only Useable By";
        }
        else if(nType == 13) // spell slot for classes
        {
            sTooltip += "Bonus Spell Slot";
        }
        else if(nType == 15) // cast spell iprp
        {
            sTooltip += "Use";
        }
        else
        {
            sTooltip += GetStringByStrRef(StringToInt(sType));
        }

        string sFeedback;
        sFeedback += "nType: " + IntToString(nType) + " = " + GetStringByStrRef(StringToInt(sType)) + "\n";

        if((nSubtype != 255) ||
           (nParam1Value != 255) ||
           (nCostTableValue != 255))
        {
            sTooltip += ": ";

            if(nSubtype == 335)
            {
                sTooltip += "Unique Power (Self Only)";
            }
            else if(nSubtype != 255)
            {
                string sSubtypestrref = GetStringByStrRef(StringToInt(sSubtype));
                if(FindSubString(sSubtypestrref, sBadstrref, 0) != 0)
                {
                    sTooltip += sSubtypestrref;
                }

                if(nSubtype == 329)
                    sTooltip += ",";
            }

            if(nParam1Value != 255)
            {
                string sParamstrref = GetStringByStrRef(StringToInt(sParam1Value));
                if(FindSubString(sParamstrref, sBadstrref, 0) != 0)
                {
                    sTooltip += " ";
                    sTooltip += GetStringByStrRef(StringToInt(sParam1Value));
                }
            }

            if(nCostTableValue != 255)
            {
                string sCoststrref = GetStringByStrRef(StringToInt(sCostTableValue));
                if(FindSubString(sCoststrref, sBadstrref, 0) != 0)
                {
                    sTooltip += " ";
                    sTooltip += GetStringByStrRef(StringToInt(sCostTableValue));
                }
            }

            sFeedback += "nSubtype: " + IntToString(nSubtype) + " = " + GetStringByStrRef(StringToInt(sSubtype)) + "\n";
            sFeedback += "nCostTable: " + IntToString(nCostTable) + " = " + GetStringByStrRef(StringToInt(sCostTable)) + "\n";
            sFeedback += "nCostTableValue: " + IntToString(nCostTableValue) + " = " + GetStringByStrRef(StringToInt(sCostTableValue)) + "\n";
            sFeedback += "nParam1: " + IntToString(nParam1) + " = " + GetStringByStrRef(StringToInt(sParam1)) + "\n";
            sFeedback += "nParam1Value: " + IntToString(nParam1Value) + " = " + GetStringByStrRef(StringToInt(sParam1Value));
        }
        //end, loop back with next property
        iprpTarget = GetNextItemProperty(oTarget);

        if(nFeedback == TRUE)
            SendMessageToAllDMs(sFeedback);
    }

    SetObjectTextBubbleOverride(oTarget, OBJECT_UI_TEXT_BUBBLE_OVERRIDE_REPLACE, sPrename + "\n" + sTooltip);

}

Updated with some exceptions and hopefully clean up a lot of the erroneous items that there are currently. Also moved Item Type to be above the aspect of an item, replacing the blank space that used to be there and it looks better there I think. Alternatively can comment it out.

Updated from the one Abala most recently posted to discord.
#13
Player Workshop / Re: Expanded Item Tooltips
February 18, 2024, 09:52:41 PM
This is because some people are still running 8193.35, which will not show these expanded tooltips in an inventory. If they are on 8193.36, it will show on both the ground and in inventories. They would need to update to the latest version of Enhanced Edition.
#14
Player Workshop / Re: Expanded Item Tooltips
February 18, 2024, 02:12:48 AM
This was added tentatively to EFU, so if you see any issues or errors with it, please post here so I can try to fix them

This also includes any suggestions regarding it, or what is bad about the design/change.

There's nothing I can do about how wide or tall the box can get, unfortunately. That's always been an issue with long named objects.
#15
Suggestions / Re: Spells Suggestions Thread
February 03, 2024, 06:52:10 PM
Can the spell Prayer cast your selected Turn Undead in addition to it's base effects? And maybe double the duration of Prayer for Priests, to give them some more incentive to use it?

Other ideas for some buffs to it might be for good/neutral, players heal 1d4 health per round. And enemies take 1d4 negative damage per round? Both perhaps?