veeenu / eldenring-practice-tool

Elden Ring speedrunning practice tool
GNU Affero General Public License v3.0
229 stars 12 forks source link

No Damage bugged on status effects #111

Open JeanNicolasdeLamballerie opened 4 months ago

JeanNicolasdeLamballerie commented 4 months ago

I haven't extensively looked at this to check if other status effects/ enemy status effects affect this, but at the very least Frost triggers damage in no damage mode; here's a clip of Mitch practicing with it enabled :

https://clips.twitch.tv/UglySpinelessDinosaurWoofer-6GTLgcdClnnETgVO

I quickly looked through the code, and I'm nowhere near familiar enough with the codebase to understand how everything is organized yet, but it seems that this option is just set by just a single flag in memory (?), I didn't see any pointer function or anything of the kind. Maybe there is another flag somewhere defining status effect damage ?

(I haven't run the codegen/ python scripts, so I'm not sure if there is anything more complex going on there)

If you have any idea where to start looking, I wouldn't mind trying to find something that might fix this behavior.

veeenu commented 4 months ago

This is an unfortunate behavior, but it's been known for years. The no damage flag applies only to direct hits and not to statuses, and yeah, you're correct that it is a single flag.

I don't think we can do anything about it save from very complicated implementations, but it's never been a big issue practice wise (you still get a lot more practice time than you would otherwise on account that the damage comes only from status effects).

I'm open to alternative solutions provided they are as simple as possible (which makes me a bit skeptical).

JeanNicolasdeLamballerie commented 4 months ago

That's unfortunate.. Sorry, I didn't know that was a known issue.

I'll try to look up if a cheatengine table somewhere somehow managed to go around this behavior.

Maybe it is possible to get around the problem by making the current weapon status effect application 0, or making the resistances near infinite as a secondary flag, or somehow correcting the status effect itself to not do damage (if this lives in memory to begin with). It defeats the purpose of practicing how many hits get an application, but if the two flags are separate, that shouldn't be an issue. I also wonder if it's possible to simply heal the boss hp on the application, or regularly check to set their hp to the maximum value again. I do doubt any of these solutions (except making the weapon status application 0, maayyyybe) would be realistic anyway, but I can give it a try.

veeenu commented 4 months ago

The "heal boss" thing seems like a good idea. I would put it in target.rs which is the place that receives a handle to the targeted character which could be used to set its HP. In the future I want to look for a better way of acquiring entity pointers but this should do it for the time being.

JeanNicolasdeLamballerie commented 4 months ago

Okay, I'll try to setup a build and start checking if I can make something work this evening. I'll keep you updated.

d9j commented 4 months ago

it i's unrealted issue... but has anyone tried to run in on wine/crossover on apple silicon

veeenu commented 4 months ago

it i's unrealted issue... but has anyone tried to run in on wine/crossover on apple silicon

I had no idea it was even possible, and I expect the performance to be very ugly on account of the different instruction set. I do have an apple silicon machine so I guess I could try but this sounds like a very very long shot.

d9j commented 4 months ago

it i's unrealted issue... but has anyone tried to run in on wine/crossover on apple silicon

I had no idea it was even possible, and I expect the performance to be very ugly on account of the different instruction set. I do have an apple silicon machine so I guess I could try but this sounds like a very very long shot.

game itself runs fine… almost perfect . But i couldn’t get any popular mods running

JeanNicolasdeLamballerie commented 4 months ago

So !

I've got a first very basic implementation working, I just simply directly went into target and set the HP (I'm guessing on every render) based on the max hp value. This is basically a one-liner, so that's no problem.

        epc.hp.write([v_max_hp, s, v_max_hp])?;

This works perfectly; the hp does go down for a micro second, so technically some low-hp enemies might die from perfectly aligned procs, but that's really such a specific usecase that we can disregard it. For any other use case (except self-inflicted damage, but I expect users to be able to drink their flasks) it works as intended. It will heal bosses that aren't at full HP like Malenia phase 2, but that's not really a problem.

But I am not sure how you would like to handle the separation of concerns. Within this naive implementation, we need Target to be turned on for it to work. We can somehow add a conditional based on whether no-damage is turned on to enable/disable it, and from a code perspective, I like it a lot living there because we're indeed targeting the enemy, but from a user point of view, it seems counterintuitive that you'd need both target and no-damage to be turned on for it to work.

I'm not sure how the different flags interact with each other, but it's surely possible to also call target (or just the subset chain of pointers related to hp) from wherever the no-damage flag lives. But this also means calling code from target outside of it, which I'm not necessarily a big fan of.

Do you have any preference on how to handle this ?

Finally, considering we're, at the core, manually setting the HP of the boss, this could mean including some kind of HP slider for the user to set the hp to whatever value they'd like it to, which can be useful for bosses having a second phase triggering at some hp value, (e.g Rellana). And might be buggy on bosses having a cutscene when their HP crosses a specific value, like Maliketh or Godrick, but we'll cross that bridge when and if we need to.

Is that a feature you'd like to add, maybe within the no-damage flag? It would justify a bit better using target-related code.

veeenu commented 4 months ago

game itself runs fine… almost perfect . But i couldn’t get any popular mods running

That's unsurprising, unfortunately. The architectures are way too different.

[...] Do you have any preference on how to handle this ?

Finally, considering we're, at the core, manually setting the HP of the boss, this could mean including some kind of HP slider for the user to set the hp to whatever value they'd like it to, [...]

Is that a feature you'd like to add, maybe within the no-damage flag? It would justify a bit better using target-related code.

That's great work, thank you!

I have been thinking that we could turn the "target entity info" button into something else, maybe having a button for enabling/disabling it and another button that spawns a popup that allows you to control stuff for the entity itself (e.g. HP/MP, stats, whatever). It's fairly involved though and I want to merge #106 first, but that's the direction I'd like to go towards.

JeanNicolasdeLamballerie commented 4 months ago

That seems like a reasonable way to handle it. This way, we can split target in two and on one side lazily retrieve the info of the targeted, and on the other side process a bunch of flags with some triggering visual effects, and others functional effects.

I'll look at how that could look in the meantime then :)