Skip to content

Add Ororon high jump and high_plunge.#2334

Open
jwalk-511 wants to merge 16 commits intogenshinsim:mainfrom
jwalk-511:ororon-highjump
Open

Add Ororon high jump and high_plunge.#2334
jwalk-511 wants to merge 16 commits intogenshinsim:mainfrom
jwalk-511:ororon-highjump

Conversation

@jwalk-511
Copy link
Contributor

@jwalk-511 jwalk-511 commented Feb 10, 2025

TODO: Pipeline Run

When Ororon uses a hold jump in-game, he initiates a form of NS transmission, leaping high in the air and gaining the NS Blessing status. This NS Blessing exists independently of the NS Blessing from his A1 passive but can still allow the extended Scroll of the Hero of the Cinder City 4pc effect to trigger.

While airborne, he can fall, high plunge, or aim. Aim is not implemented here. Ororon cannot cancel his high jump before reaching max height, so low_plunge is also not implemented. To prevent implementation of movement tech, Ororon is forcefully transitioned into the fall state on the frame he would open his glider.

When Ororon uses high jump, he drains 75 stamina. Stamina does not resume regeneration until he initiates another action. He does not require all 75 stamina to initiate a high jump and will drain to 0 if less than 75 stamina remains. When Ororon has drained all stamina, he is unable to initiate a normal fall cancel and will only be able to plunge Ororon can't cancel normally but can initiate an equivalent fall cancel by attempting to walk (glide) forward.

Implementation details:
Ororon's high jump code schedules a callback to a Player.exec() call as a proof of concept of forcefully changing the player's animation state. The concepts used should be applicable to any character who automatically executes an action outside of a GCSL statement, such as Mavuika Charge starting in the NA state and transitioning to the CA state, or Chasca transitioning from the charge state to a falling state upon NS expiry. This is not strictly needed for Ororon, and can be changed upon request.

GCSL notes:
jump:
param hold:

  • 0 (default): Initiates a normal jump, calls already-implemented code.
  • < 0: Sets hold to MaxHold. Fall through to below case.
  • > 0: Subtract 1. Hold=1 implies minimum length hover before fall cancel. Fall will be initiated MinFallCancelFrames + Hold frames after the jump begins.

High_Plunge:
param fall:

Other todo:

  • Min required stamina to initiate high jump (Drains 75, but able to initiate with less than 75)
  • High Plunge[fall=0].
  • Stamina drain adjustment when stamina mods are in effect (e.g. anemo resonance)
  • Update mode_gcsim.js with shortcuts for syntax highlighting (Does this need to be done for new Params?)
  • Update documentation

Code implemented:

JUMP

  • add hold parameter to JUMP action
  • Require <75 stam before using high jump. Only requires 1 ? 5? TBD
  • Automatically transition from JUMP[hold != 0] to FALL action when NS transmission expires, if user does not manually exit (through plunge or plunge[fall=1]) first)
  • Grant AirborneOroron

STAMINA

  • Remove 75 stamina.
  • Prevent stamina regen.
  • WONTDO: Stam check should actually happen a little after jump is initiated.

NS BLESSING

  • Give NS Transmission blessing status while airborne
  • Overload get_status method to identify ororon as having Nightsoul Blessing state when either he has Nightsoul Blessing status OR when he has NS Transmission status
  • Remove NS Transmission status when NS transmission ends

High PLUNGE

  • Implement AirborneOroron plunge.
  • Implement AirborneOroron plunge[fall!=0] param
  • Require AirborneOroron status to use plunge

STAMINA

  • Allow stamina to regen again after plunge
  • Allow stamina to regen again after plunge[fall=1]

NS BLESSING

  • Remove NS Transmission on plunge // Assume it happens immediately
  • Remove NS Transmission on fall // Assume it happens immediately

Notes: Stamina is probably terribly bugged and also overcomplicated. My ability to accurately test stamina drain and resume timings is hampered by https://library.keqingmains.com/evidence/combat-mechanics/damage/other/client-and-server#high-ping-interactions.
Stamina regen timing assumed to occur at plunge start frame if fall=0, or on hitting ground if fall=1. https://discord.com/channels/845087716541595668/983391844631212112/1338586013752229889

Implement Hold Param for Jump.
Add NS Blessing on Held Jump.
Add Airborne Ororon State.
Add High_Plunge and High_Plunge[fall=1], allowable while ororon has AirborneOroron.

Todo: Frames
Most packages don't use Characters, they use charWrappers.
I can't overload charWrapper, so just require check for 2 statuses instead.
Ororon test config validates frames and animation state changes work as expected.
Ororon can high_plunge before he can use fall cancel, so added lines to allow delay of fall cancel if triggered too early.
@jwalk-511 jwalk-511 marked this pull request as draft February 11, 2025 03:38
Updated fall->jump cancels, plunge->jump cancel, plunge hitmarks, and manually added plunge talent curves.
@jwalk-511 jwalk-511 marked this pull request as ready for review February 13, 2025 18:18
@imring imring added area: internal Related to artifacts/weapons/characters kind: game alignment Missing mechanic from the game labels Feb 16, 2025
Remove test config.
Modify enter/exit of transmission status to be handled by method calls within nightsoul.go.
Refactored Ororon to use above method calls instead of modifying status directly.
…ding NS duration on refresh

Removed independent NS transmission.
- Ororon does not exit blessing on A1 exit if jump blessing is active.
- Ororon does not exit blessing on Jump exit if A1 blessing is active
- Remove all references to nightsoul.NightsoulTransmissionBlessingKey
Fix A1 NS duration refresh.
- Call A1EnterBlessing every time.
- Add check to A1ExitBlessing to return early if A1EnterBlessing has been called again since last call.
Fix lint
- Remove constant return NIL from private method.
Comment on lines +28 to +37
// Plunge -> X
plungeFrames = frames.InitAbilSlice(66) // Default is From plunge animation start to swap icon un-gray
plungeFrames[action.ActionAttack] = 68
plungeFrames[action.ActionAim] = 66
plungeFrames[action.ActionSkill] = 65
plungeFrames[action.ActionBurst] = 65
plungeFrames[action.ActionDash] = 53
plungeFrames[action.ActionJump] = 82
plungeFrames[action.ActionWalk] = 80
plungeFrames[action.ActionSwap] = 66
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

source?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Source shared in ororon.go review comment

c.QueueCharTask(func() {
h := c.Core.Player
// Apply stamina reduction mods.
stamDrain := h.AbilStamCost(c.Index, action.ActionJump, map[string]int{"hold": 1})
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but there's the map from the Jump method

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's true; I was trying to make the function just a little bit more lightweight by only passing the hold integer as a parameter, rather than the entire p map. But the fact that I have to re-construct the map and pass it to h.AbilStamCost probably cancels that out anyway

Comment on lines 36 to 50
// Hold Jump
jumpHoldFrames = make([][]int, 2)
// Hold Jump -> X
jumpHoldFrames[0] = frames.InitAbilSlice(60 * 10) // set to very high number for most abilities
jumpHoldFrames[0][action.ActionHighPlunge] = plungeCancelFrames
// Fall -> X
jumpHoldFrames[1] = frames.InitAbilSlice(fallFrames)
jumpHoldFrames[1][action.ActionAttack] = 45
jumpHoldFrames[1][action.ActionAim] = 46
jumpHoldFrames[1][action.ActionSkill] = 45
jumpHoldFrames[1][action.ActionBurst] = 46
jumpHoldFrames[1][action.ActionDash] = 46
jumpHoldFrames[1][action.ActionJump] = 45
jumpHoldFrames[1][action.ActionWalk] = 47
jumpHoldFrames[1][action.ActionSwap] = 44
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move jump frames to jump.go

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

frames source?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Frames source for fall->x and for low_plunge->x: https://docs.google.com/spreadsheets/d/1ru_C_1vh_0k3u-NdJFcq079N_vstn055PVsL66eCoN8/edit?gid=2018562987#gid=2018562987

jumpHoldFrames[1] corresponds to fall frames, which is used by both low_plunge[fall=1] and by high_jump, when the jump is allowed to expire naturally. I left it in ororon.go to make it more obvious it wasn't only for jump.go

I'll move frames to jump.go anyway

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think anyone's verified the frames I counted yet.
Once they are verified, I think they should be added to the main oro frames sheet, and then I can link that within the comments in the code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: internal Related to artifacts/weapons/characters kind: game alignment Missing mechanic from the game

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants