Player icon indicating copy to clipboard operation
Player copied to clipboard

More accurate battle animation shake

Open mateofio opened this issue 5 years ago • 3 comments

With dynrpg, we can perfect the screen and target shake feature from battle animations.

A quick dump shows some very strange behavior.

The values are strength, speed, x, y, and time.

This is an animation which does screen shake on frame 1.

SHAKE SCREEN: 3 4 -4 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 29
SHAKE SCREEN: 3 4 -4 0 28
SHAKE SCREEN: 3 4 -1 0 27
SHAKE SCREEN: 3 4 2 0 26
SHAKE SCREEN: 3 4 5 0 25
SHAKE SCREEN: 3 4 7 0 24
SHAKE SCREEN: 3 4 5 0 23
SHAKE SCREEN: 3 4 2 0 22
SHAKE SCREEN: 3 4 -1 0 21
SHAKE SCREEN: 3 4 -4 0 20
SHAKE SCREEN: 3 4 -6 0 19
SHAKE SCREEN: 3 4 -6 0 18
SHAKE SCREEN: 3 4 -3 0 17
SHAKE SCREEN: 3 4 3 0 15
SHAKE SCREEN: 3 4 6 0 14
SHAKE SCREEN: 3 4 6 0 13
SHAKE SCREEN: 3 4 4 0 12
SHAKE SCREEN: 3 4 1 0 11
SHAKE SCREEN: 3 4 -2 0 10
SHAKE SCREEN: 3 4 -5 0 9
SHAKE SCREEN: 3 4 -7 0 8
SHAKE SCREEN: 3 4 -5 0 7
SHAKE SCREEN: 3 4 -2 0 6
SHAKE SCREEN: 3 4 1 0 5
SHAKE SCREEN: 3 4 4 0 4
SHAKE SCREEN: 3 4 6 0 3
SHAKE SCREEN: 3 4 6 0 2
SHAKE SCREEN: 3 4 3 0 1

Target shake on frame 1

SHAKE MONSTER: 3 4 -4 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 30
SHAKE MONSTER: 3 4 -6 0 29
SHAKE MONSTER: 3 4 -6 0 28
SHAKE MONSTER: 3 4 -4 0 27
SHAKE MONSTER: 3 4 -1 0 26
SHAKE MONSTER: 3 4 2 0 25
SHAKE MONSTER: 3 4 5 0 24
SHAKE MONSTER: 3 4 7 0 23
SHAKE MONSTER: 3 4 5 0 22
SHAKE MONSTER: 3 4 2 0 21
SHAKE MONSTER: 3 4 -1 0 20
SHAKE MONSTER: 3 4 -4 0 19
SHAKE MONSTER: 3 4 -6 0 18
SHAKE MONSTER: 3 4 -6 0 17
SHAKE MONSTER: 3 4 -3 0 16
SHAKE MONSTER: 3 4 3 0 14
SHAKE MONSTER: 3 4 6 0 13
SHAKE MONSTER: 3 4 6 0 12
SHAKE MONSTER: 3 4 4 0 11
SHAKE MONSTER: 3 4 1 0 10
SHAKE MONSTER: 3 4 -2 0 9
SHAKE MONSTER: 3 4 -5 0 8
SHAKE MONSTER: 3 4 -7 0 7
SHAKE MONSTER: 3 4 -5 0 6
SHAKE MONSTER: 3 4 -2 0 5
SHAKE MONSTER: 3 4 1 0 4
SHAKE MONSTER: 3 4 4 0 3
SHAKE MONSTER: 3 4 6 0 2
SHAKE MONSTER: 3 4 6 0 1

It looks like when you cause a shake, it animates 1 frame, gets stuck for 9 frames, and then animates down normally after that.

Wtf 2k3??

mateofio avatar Apr 10 '20 06:04 mateofio

More test cases:

An animation with 40 frames which does a screen shake on frames 1, 3, and 5

SHAKE SCREEN: 3 4 -4 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 29
SHAKE SCREEN: 3 4 -4 0 28
SHAKE SCREEN: 3 4 -1 0 27
SHAKE SCREEN: 3 4 2 0 26
SHAKE SCREEN: 3 4 5 0 25
SHAKE SCREEN: 3 4 7 0 24
SHAKE SCREEN: 3 4 5 0 23
SHAKE SCREEN: 3 4 2 0 22
SHAKE SCREEN: 3 4 -1 0 21
SHAKE SCREEN: 3 4 -4 0 20
SHAKE SCREEN: 3 4 -6 0 19
SHAKE SCREEN: 3 4 -6 0 18
SHAKE SCREEN: 3 4 -3 0 17
SHAKE SCREEN: 3 4 3 0 15
SHAKE SCREEN: 3 4 6 0 14
SHAKE SCREEN: 3 4 6 0 13
SHAKE SCREEN: 3 4 4 0 12
SHAKE SCREEN: 3 4 1 0 11
SHAKE SCREEN: 3 4 -2 0 10
SHAKE SCREEN: 3 4 -5 0 9
SHAKE SCREEN: 3 4 -7 0 8
SHAKE SCREEN: 3 4 -5 0 7
SHAKE SCREEN: 3 4 -2 0 6
SHAKE SCREEN: 3 4 1 0 5
SHAKE SCREEN: 3 4 4 0 4
SHAKE SCREEN: 3 4 6 0 3
SHAKE SCREEN: 3 4 6 0 2
SHAKE SCREEN: 3 4 3 0 1

A battle animation does shake on frame 1, animation is only 1 frame long

SHAKE SCREEN: 3 4 -4 0 29
SHAKE SCREEN: 3 4 -4 0 28
SHAKE SCREEN: 3 4 -1 0 27
SHAKE SCREEN: 3 4 2 0 26
SHAKE SCREEN: 3 4 5 0 25
SHAKE SCREEN: 3 4 7 0 24
SHAKE SCREEN: 3 4 5 0 23
SHAKE SCREEN: 3 4 2 0 22
SHAKE SCREEN: 3 4 -1 0 21
SHAKE SCREEN: 3 4 -4 0 20
SHAKE SCREEN: 3 4 -6 0 19
SHAKE SCREEN: 3 4 -6 0 18
SHAKE SCREEN: 3 4 -3 0 17
SHAKE SCREEN: 3 4 3 0 15
SHAKE SCREEN: 3 4 6 0 14
SHAKE SCREEN: 3 4 6 0 13
SHAKE SCREEN: 3 4 4 0 12
SHAKE SCREEN: 3 4 1 0 11
SHAKE SCREEN: 3 4 -2 0 10
SHAKE SCREEN: 3 4 -5 0 9
SHAKE SCREEN: 3 4 -7 0 8
SHAKE SCREEN: 3 4 -5 0 7
SHAKE SCREEN: 3 4 -2 0 6
SHAKE SCREEN: 3 4 1 0 5
SHAKE SCREEN: 3 4 4 0 4
SHAKE SCREEN: 3 4 6 0 3
SHAKE SCREEN: 3 4 6 0 2
SHAKE SCREEN: 3 4 3 0 1

A battle animation doing a screen shake on frame 1, animation lasts 2 frames

SHAKE SCREEN: 3 4 -4 0 30
SHAKE SCREEN: 3 4 -6 0 30
SHAKE SCREEN: 3 4 -6 0 29
SHAKE SCREEN: 3 4 -4 0 28
SHAKE SCREEN: 3 4 -1 0 27
SHAKE SCREEN: 3 4 2 0 26
SHAKE SCREEN: 3 4 5 0 25
SHAKE SCREEN: 3 4 7 0 24
SHAKE SCREEN: 3 4 5 0 23
SHAKE SCREEN: 3 4 2 0 22
SHAKE SCREEN: 3 4 -1 0 21
SHAKE SCREEN: 3 4 -4 0 20
SHAKE SCREEN: 3 4 -6 0 19
SHAKE SCREEN: 3 4 -6 0 18
SHAKE SCREEN: 3 4 -3 0 17
SHAKE SCREEN: 3 4 3 0 15
SHAKE SCREEN: 3 4 6 0 14
SHAKE SCREEN: 3 4 6 0 13
SHAKE SCREEN: 3 4 4 0 12
SHAKE SCREEN: 3 4 1 0 11
SHAKE SCREEN: 3 4 -2 0 10
SHAKE SCREEN: 3 4 -5 0 9
SHAKE SCREEN: 3 4 -7 0 8
SHAKE SCREEN: 3 4 -5 0 7
SHAKE SCREEN: 3 4 -2 0 6
SHAKE SCREEN: 3 4 1 0 5
SHAKE SCREEN: 3 4 4 0 4
SHAKE SCREEN: 3 4 6 0 3
SHAKE SCREEN: 3 4 6 0 2
SHAKE SCREEN: 3 4 3 0 1

mateofio avatar Apr 10 '20 06:04 mateofio

Some more investigation on how battle animations work.

Update Order

  1. Animate screen effects / weather / map battle animation
    • This explains why map battle animation screen effects and sounds continue into the start of the battle.
  2. Animate battle animations on party members
  3. Animate battle animations on monsters

Animation play length

For battles only, RPG_RT will do the following:

num_frames = 0
if (animation_target != -2 && !animation.effects.empty()) {
    num_frames = 2 * max(20, animation.effects.back().start_frame);
}

This explains the strange 40 frame limit behavior for battle animations.

Flash

For target and screen flash, RPG_RT actually pre-animates the (R,G,B,I) effect into a buffer and then each frame just forces the effects to these values. Screen effects are updated before animations, so while the screen update will animate the effects, the next call to battle animation update will force it back to the values in the animation.

https://github.com/fmatthew5876/DynRPG/blob/master/AnimationCurrent.h#L27

This explains why battle animations don't use the normal screen effects time chunks. It also explains why flash is disabled when a battle animation runs.

Shake

For target and screen shake, RPG_RT does similar thing, except this time it just animates the shake effect scope into a buffer. Only if it's 1 or 2, does RPG_RT force the effect on the screen or target.

https://github.com/fmatthew5876/DynRPG/blob/master/AnimationCurrent.h#L29

mateofio avatar May 02 '20 17:05 mateofio

Is this resolved because it has patch available or not? @fmatthew5876

Ghabry avatar Jul 12 '21 18:07 Ghabry