States don't have a limit - you can put state 2 (running) on frame 321 and it'd still work; whether it has bugs or not is another issue. However, certain actions are hardcoded to specific frames, and overall you cannot exceed 400 frames (that is, frame 0 - 399).
This is my personal note of important hardcoded frames for type 0 objects aka characters (does not include specific cases like Firzen's frame 290 mix)
I didn't use the standard lingo that Marti used, but you'll understand what I'm typing:
Code:
0 - 0 = standing
5 - 8 = walking
9 - 11 = running
12 - 15 = heavy_walking
16 - 18 = heavy_running
19 - 19 = heavy stop_run
20 - 20 = light1
25 - 25 = light2
30 - 30 = jump_light
35 - 35 = run_light
40 - 40 = dash_light
45 - 45 = throw light
50 - 50 = heavy_throw
52 - 52 = air throw light
55 - 55 = drinking
60 - 60 = punch1
65 - 65 = punch2
70 - 70 = superpunch
80 - 80 = jump atk
85 - 85 = run atk
90 - 90 = dash atk
94 - 94 = landing (state 100)
100 - 100 = Rowing Standard
102 - 102 = Rolling
108 - 108 = Rowing Back
110 - 110 = Defend (turning, goes into 111)
111 - 111 = hit_defend (goes into 111)
112 - 112 = broken_defend
115 - 115 = Wpn_Pickup
116 - 116 = Heavy_Pickup
180 - 185 = Falling std, trajectory-based //182 flip
186 - 191 = Falling bck, trajectory-based //188 flip (default)
200 - 202 = ice (has hardcoded ice property)
203 - 206 = fire (trajectory-based; 203 204 rising, 205 206 falling)
210 - 210 = Jump
212 - 212 = Jumping (if from next: 212, automatically apply jump stats. if from 999 don't apply.)
213 - 214 = dash (213/216 & 214/217)
215 - 215 = crouch1 (from state 6 or jump, hit D to roll)
216 - 217 = dashback (213/216 & 214/217)
218 - 218 = stop_run
219 - 219 = crouch2 (default landing)
220 - 220 = injure (fall 1-20)
222 - 222 = injure2 (fall 21-40)
224 - 224 = injure2 back (fall 21-40)
226 - 229 = DOP (fall 41-60)
230 - 230 = lying //hit_front (face up)
231 - 231 = lying2 //hit_back (face down); default
245 - 245 = Transformback
I only included the starting frame for some cases, because in those cases only the starting frame matters.
"95 dash_defend", "207 tired" and "399 dummy" are never used in the game.
I didn't include 120-123 "catching", 130-144 "picked_caught" and 232-234 "throw_lying_man" frames, because LF2's catching mechanics are actually custom frames, not hardcoded defaults. Notably, picked caught 133-144 are all just to accommodate Louis' whirlwind throw.