Page 1 of 1

Gozag shouldn't offer useless potions

PostPosted: Sunday, 16th July 2017, 10:56
by nago
Some days ago I was playing a Mu^Gozag and at certain point among the potions choices I had something including berserk rage.
I wasn't sure 100% if would have berserked, but I said, "why not", because the other effects included in that bundle were better than the other offers and zerk would have been a very very good thing.
To my (un)surprise, I did not zerk.

The problem is, this thing is not documented anywhere, as some god powers can bypass racial restrictions while others not, and some are so convoluted (like potion petitioning itself) that can bypass them only partially and learning by trying while using a semi-panic button isn't a very good design.

As far I cant tell, the cases where gozag potions don't work are:
* Zerk for undead|Fo (I refused to check if Vp blodless can zerk with Gozag or to updated myself in what is the situation with Vp gimmicks in trunk)
* Haste for Fo

Just to enjoy some more confusion in already over convoluted power, Heal wounds on VS does work.

So my humble proposal is either:

* remove from potions petitioning useless potions
* a much broader solution - which probably should be addressed in a specific topic: let all the gods' powers bypass racial restrictions, resolving this messy situation with all the problematic powers.
The biggest difference would be probably a huge boom for undead|Fo^Trog but I think this buff is totally worthy in order to have a much clearer and easily understandable design.

Re: Gozag shouldn't offer useless potions

PostPosted: Sunday, 16th July 2017, 20:07
by Lavandula
Potion petition itself requires 400$ to activate, but individual potion sets may go as high as 800$. It may generate potion sets player can't afford, and they are given as options. I think it can even generate three expensive sets and lock the game dead.
Spoiler: show
  Code:
bool gozag_potion_petition()
{
    CrawlVector *pots[GOZAG_MAX_POTIONS];
    int prices[GOZAG_MAX_POTIONS];

    item_def dummy;
    dummy.base_type = OBJ_POTIONS;
    dummy.quantity = 1;

    if (!you.props.exists(make_stringf(GOZAG_POTIONS_KEY, 0)))
    {
        bool affordable_potions = false;
        while (!affordable_potions)
        {
            for (int i = 0; i < GOZAG_MAX_POTIONS; i++)
            {
                prices[i] = 0;
                int multiplier = random_range(20, 30); // arbitrary

                if (!you.attribute[ATTR_GOZAG_FIRST_POTION])
                    multiplier = 0;

                string key = make_stringf(GOZAG_POTIONS_KEY, i);
                you.props.erase(key);
                you.props[key].new_vector(SV_INT, SFLAG_CONST_TYPE);
                pots[i] = &you.props[key].get_vector();

                ADD_POTIONS(*pots[i], _gozag_potion_list);
                if (coinflip())
                    ADD_POTIONS(*pots[i], _gozag_potion_list);

                for (const CrawlStoreValue& store : *pots[i])
                {
                    dummy.sub_type = store.get_int();
                    prices[i] += item_value(dummy, true);
                    dprf("%d", item_value(dummy, true));
                }
                dprf("pre: %d", prices[i]);
                prices[i] *= multiplier;
                dprf("mid: %d", prices[i]);
                prices[i] /= 10;
                dprf("post: %d", prices[i]);
                key = make_stringf(GOZAG_PRICE_KEY, i);
                you.props[key].get_int() = prices[i];

                if (prices[i] <= gozag_potion_price())
                    affordable_potions = true;
            }
        }
    }
    else
    {
        for (int i = 0; i < GOZAG_MAX_POTIONS; i++)
        {
            string key = make_stringf(GOZAG_POTIONS_KEY, i);
            pots[i] = &you.props[key].get_vector();
            key = make_stringf(GOZAG_PRICE_KEY, i);
            prices[i] = you.props[key].get_int();
        }
    }

    int keyin = 0;

    while (true)
    {
        if (crawl_state.seen_hups)
            return false;

        clear_messages();
        for (int i = 0; i < GOZAG_MAX_POTIONS; i++)
        {
            string line = make_stringf("  [%c] - %d gold - ", i + 'a',
                                       prices[i]);
            vector<string> pot_names;
            for (const CrawlStoreValue& store : *pots[i])
                pot_names.emplace_back(potion_type_name(store.get_int()));
            line += comma_separated_line(pot_names.begin(), pot_names.end());
            mpr_nojoin(MSGCH_PLAIN, line);
        }
        mprf(MSGCH_PROMPT, "Purchase which effect?");
        keyin = toalower(get_ch()) - 'a';
        if (keyin < 0 || keyin > GOZAG_MAX_POTIONS - 1)
            continue;

        if (you.gold < prices[keyin])
        {
            mpr("You don't have enough gold for that!");
            more();
            continue;
        }

        break;
    }

    ASSERT(you.gold >= prices[keyin]);
    you.del_gold(prices[keyin]);
    you.attribute[ATTR_GOZAG_GOLD_USED] += prices[keyin];

    for (auto pot : *pots[keyin])
        potionlike_effect(static_cast<potion_type>(pot.get_int()), 40);

    if (!you.attribute[ATTR_GOZAG_FIRST_POTION])
        you.attribute[ATTR_GOZAG_FIRST_POTION] = 1;

    for (int i = 0; i < GOZAG_MAX_POTIONS; i++)
    {
        string key = make_stringf(GOZAG_POTIONS_KEY, i);
        you.props.erase(key);
        key = make_stringf(GOZAG_PRICE_KEY, i);
        you.props.erase(key);
    }

    return true;
}


Also, what does "useless" even mean? Is potion set with berserk useful for DE caster? Is heal wounds useful for character with full health?

duvessa wrote:I would go the other way: don't let any gods' powers bypass racial restrictions. No potion petition for Mu, no Trog's Hand regeneration for DD.

And definitely no heal-on-kill from Makhleb.
Sequell says that nobody have beaten the game as DD without divine healing since removal of yellow wands. I'm not sure if it's outright impossible, probably just blatantly grindy, defined by luck and plagued by backtracking.
!lg * sp=DD god=ash|chei|dith|fedhas|hepliaklqana|kikubaaqudgha|nemelex|oka|qazlal|uskayaw|xom|yredelemnul|veh|sif|wu|zin|"" won 0.19|0.20|0.21

Re: Gozag shouldn't offer useless potions

PostPosted: Sunday, 16th July 2017, 22:06
by nago
duvessa wrote:
nago wrote:* a much broader solution - which probably should be addressed in a specific topic: let all the gods' powers bypass racial restrictions, resolving this messy situation with all the problematic powers.
I would go the other way: don't let any gods' powers bypass racial restrictions. No potion petition for Mu, no Trog's Hand regeneration for DD.


I don't think it would be the right step, as it would make certain gods much less attractive for certain races (e.g. gozag for mummy, ely for VS), effectively reducing the sensible choices for the player.

The opposite solution, while being a buff for some combo, would be more interesting, gameplay-wise.

Lavandula wrote:Also, what does "useless" even mean? Is potion set with berserk useful for DE caster? Is heal wounds useful for character with full health?


Under certain circumstances !zerk for a DE caster would be useful.

But the problem I pointed out is another: certain potion bundles may contain potion(s) that don't have any effect ever for that race, such the examples I already made: haste for a Fo (they *can't* haste) or zerk for a undead (they *can't* zerk). Thus, useless: they give no real effect.

This is a problem especially because the player *can't* know that beforehand unless knowing already.
Secondarily, it's a minor balance problem because that 100% useless potion is taking the place of a potentially useful potion, thus making that bundle less attractive than the other two.

Re: Gozag shouldn't offer useless potions

PostPosted: Monday, 17th July 2017, 04:32
by VeryAngryFelid
Removing gozag's potions from mummies will increase choices, it's like Makh for DD IMHO, too superior to other gods

Re: Gozag shouldn't offer useless potions

PostPosted: Monday, 17th July 2017, 07:23
by nago
VeryAngryFelid wrote:Removing gozag's potions from mummies will increase choices, it's like Makh for DD IMHO, too superior to other gods


This is certainly true if you find both altars at same time.

But differently from DD, a Kiku|Oka|Trog|Nemelex|Whateverdecentgod D:2 is still a very good choice to Mu in most cases and it is bad to wait for a Gozag altar, because is not like a cat can reliably get a Mu to Lair godless.

Removing gozag potion from Mu would make a D:2 gozag altar not actually attractive to them because the god wouldn't do anything for a very very long time - much after the char had find some better god somewhere else

Re: Gozag shouldn't offer useless potions

PostPosted: Monday, 17th July 2017, 07:27
by nago
nago wrote:
VeryAngryFelid wrote:Removing gozag's potions from mummies will increase choices, it's like Makh for DD IMHO, too superior to other gods


This is certainly true if you find both altars at same time.

But differently from DD, a Kiku|Oka|Trog|Nemelex|Whateverdecentgod D:2 is still a very good choice to Mu in most cases and it is bad to wait for a Gozag altar, because is not like a cat can reliably get a Mu to Lair godless.

Removing gozag potion from Mu would make a D:2 gozag altar not actually attractive to them because the god wouldn't do anything for a very very long time - much after the char had find some better god somewhere else



Potion petition itself requires 400$ to activate, but individual potion sets may go as high as 800$. It may generate potion sets player can't afford, and they are given as options. I think it can even generate three expensive sets and lock the game dead.


I missed this part: I think the first part should be written in the description ('[...]the actual cost of the sets offered may go up $$$) if there isn't already written. Or just increase the cost of calling potion petitioning to the max possible, that would be a slight nerf to a very strong power and make that much more clearer.
The second part is a straight bug if it actually happens.

Re: Gozag shouldn't offer useless potions

PostPosted: Thursday, 20th July 2017, 00:06
by Doesnt
if a petition with no potion sets less than or equal to the entry fee of using the ability (400 normally, 0 on the first one) would be created, the game flips the table and starts over until it gets an offer that has at least one potion set on it that isn't above the entry fee

if i understand the code correctly this actually means the first use is slightly stronger than normal because it won't veto a set that has been overly blessed with good potion combos

relevant code here: https://github.com/crawl/crawl/blob/mas ... 4074-L4109

Re: Gozag shouldn't offer useless potions

PostPosted: Wednesday, 23rd August 2017, 14:41
by nago