Congratulations to your first 1st MUGEN release!
Here is a list of basic MUGEN things for you to do to make your Emperor Sinzross more stable:
- The most basic part of a MUGEN character's sprite file (.sff) is the MUGEN Required Sprites.
According to Elecbyte: "
Every character must have what is called "required sprites". These are
sprites that you may not necessarily be using for your animations, but must always be included in
the character's SFF." Even you have made your MUGEN character "un-throw-able", you still need
to include all the MUGEN Required Sprites. In your Emperor Sinzross case, I could find only a
sprite (group 5150 image 0) which is suitable for filling up the missing MUGEN Required Sprites.
You may just insert this 5150,0 sprite for all the missing 5000,0.....to......5070,20 MUGEN Required
Sprites, into your "Sin.sff" MUGEN file. You can open Kung Fu Man (KFM) "kfm.sff" MUGEN file to
see how those 000,0.....to......5070,20 MUGEN Required Sprites are inserted. You may also want
to study Elecbyte's official MUGEN Required Sprites document here:
http://www.elecbyte.com/mugendocs/spr.html
- The most basic part of a MUGEN character's animation file (.air) is the MUGEN collision boxes.
While there is no strict rule about how to make a MUGEN collision box, you should make each
box as consistent as possible -- like, for the stance animation Action 0, the collision boxes can
be made with same sizes and same positions -- in your Emperor Sinzross case, I found that your
animations have some MUGEN collision boxes inconsistency, for example your stance animation
Action 0:
* collision boxes have some gaps
To make your stance animation Action 0 MUGEN collision boxes more consistent, you may want to
change to this:
* collision boxes should NOT have any gaps
And, just like the MUGEN Required Sprites, some MUGEN animations are required too.
In your "Sin.air" MUGEN file, these MUGEN required animations are missing:
=> Action 5, Action 150, Action 152, Action 5070, Action 5200, Action 5210, Action 5300
You may also want to study Elecbyte's official MUGEN animations document here:
http://www.elecbyte.com/mugendocs/air.html
!!! I say the MUGEN Required Sprites and animations are very important because your MUGEN character's Enemies can still put you into some MUGEN Custom States by non-throw moves like this:
- I found that most of your Emperor Sinzross' command get-hit states return to the stance state
Statedef 0 at their ends, when a MUGEN Enemy tries to attack it and send it up into the air, after
the get-hit states return to the stance state Statedef 0, the position is shifted that makes
your Emperor Sinzross look like it is floating above ground:
In this case, you can try to force your Emperor Sinzross'
stance to stay on ground all the times by adding a PosSet MUGEN State Controller to Statedef 0 like
this:
- Code:
-
[State 0, PosSet]
type = PosSet
trigger1 = 1
y = 0
ignorehitpause = 1
And you also need to add the above MUGEN code to all the 5xxx get-hit states in your custom
"Common.cns" MUGEN file, because the position shifting also happens to those 5xxx get-hit states.
!!! for your MUGEN convenience, in your Emperor Sinzross case you can simplify the PosSet adding workload by adding it to the Statedef -3 area in your "Sin.cns" MUGEN file like this:
- Code:
-
[Statedef -3]
[State -3, PosSet]
type = PosSet
trigger1 = MoveType != H
trigger1 = StateNo = [0, 4999] ; for stance state and all other idle and attack states
; it is alright to have big range like this because
; all of the moves are on-ground only
trigger2 = MoveType = H
trigger2 = StateNo >= 5000
y = 0
ignorehitpause = 1
!!! please read http://www.elecbyte.com/mugendocs/sctrls.html to know about what "PosSet" is for
Now, after the basic MUGEN things, is the time for the moves of your your Emperor Sinzross.
- in the forward running state, Statedef 100, upon its end, it tries to change to Statedef 101, which
doesn't exist in your "*.cns" MUGEN files; a MUGEN character entering a non-existing state shall go
wild like this:
!!! you can either A) add the missing Statedef 101 back to your "Common.cns" MUGEN file or B) change your Statedef 100 to make it return to just the stance state Statedef 0:
=> change this Statedef 100 MUGEN code from:
- Code:
-
[State 100, 5]
type = ChangeState
triggerall = var(5)<=0
trigger1 = command != "holdfwd"
triggerall = !ailevel
value = 101
=> to this Statedef 100 MUGEN code:
- Code:
-
[State 100, 5]
type = ChangeState
triggerall = var(5)<=0
trigger1 = command != "holdfwd"
triggerall = !ailevel
value = 0
ctrl = 1
- next, the normal attacks:
1) you may need to re-do the attacks collision boxes according to the stance example above
2) the damage of "X - Flick" is just too much -- 2-hit dealing 200/1000 MUGEN life bar, you may
want to make it smaller to like damage = 10 rather than damage = 100, and fall.damage = 10
rather than fall.damage = 20
3) on the other hand, the damage of "Y - Medium Slash" is just too little, you may want to change
from damage = 10 to damage = 35
4) about the "Z - High Slash", its damage is fine, but it has a big problem -- you can spam it on
your MUGEN victim in a non-stop manner (we call it an "infinite"), which is greatly considered
a very "cheap" feature in MUGEN:
You can fix the "infinite/cheapness" by, for example, this:
A) make the "Z - High Slash" Statedef 200 and its returning Statedef 0 remember the HitCount:
- Code:
-
[Statedef 0,Stand]
type = S
physics = S
sprpriority = 0
hitcountpersist = 0 + (PrevStateNo = 200 || P2MoveType = H) ; add this line
- Code:
-
[Statedef 200]
type = S
movetype = a
physics = s
ctrl = 0
anim = 200
hitcountpersist = 0 + (PrevStateNo = 0 || P2MoveType = H) ; add this line
* please read http://www.elecbyte.com/mugendocs/cns.html to know about what
"hitcountpersist" is for
B) tune your "Z - High Slash" Statedef 200 HitDef like this:
- Code:
-
[State 200, HitDef]
type = HitDef
triggerall = HitCount < 4 ; to avoid or restrict the "infinite/cheapness"
trigger1 = AnimElem = 2 ^^ AnimElem = 4 ^^ AnimElem = 6 ^^ AnimElem = 7 ; change AnimElem = 1 tp
; AnimElem = 2 to fix the
; "first frame attack can't
; "be guarded" MUGEN bug
attr = S, NA
damage = 20
guardflag = MA
pausetime = 3,12
hitsound = S4,1
guardsound = S5,0
sparkno = 1
sparkxy = -5, -70
animtype = Hard
ground.type = Low
ground.slidetime = 3
ground.hittime = 15
ground.velocity = -6.0 ; makes the attack look more natural
air.velocity = -2,-3
ground.cornerPush.velOff = -5.5 ; makes the attack look more natural
guard.cornerPush.velOff = -5.5 ; makes the attack look more natural
air.cornerPush.velOff = -5.5 ; makes the attack look more natural
!!! please read http://www.elecbyte.com/mugendocs/trigger.html to know about what "HitCount" is for
5) the "A - Bite" doesn't hit a thin MUGEN Enemy like Kung Fu Man (KFM):
You can fix it by A) re-do the red collision box to extend it closer to your Emperor Sinzross'
center, or B) add a Width MUGEN State Controller to Statedef 201 like this:
- Code:
-
[State 201, Width]
type = Width
trigger1 = AnimElem = 2
player = 30, 0
The result is like this now:
6) the "B - Lick" and "C - Tentacles" suffer from the same "infinite/cheapness" problem so you
may want follow the above way to fix
- next, the special moves:
the damages of Fire Breathe Medium/Heavy are too high, in the Flame1 Statedef 7201, change
damage = 40 to damage = 20, and in the Flame2 Statedef 7202, change damage = 50 to
damage = 17
!!! for special moves in common practice, you can add a "chip damage", meaning when your MUGEN Enemy is guarding your special moves, some small damages are done to them, so in your Emperor Sinzross case, for the Fire Breathe all versions, you can use damage = 30,5 for Light and damage = 20,5 for Medium and damage = 17,5 for Heavy; and then do the same thing to Spikes Near/Medium/Far
- next, the hyper moves:
1) for the "Hyper Throw" Statedef 3000 HitDef, you can change attr = S, NT to attr = S, HT
because N is for Normal and H is for Hyper
2) for the "Hyper Throw", in Statedef 3001, the Explod (visual effects) is using anim = 802 but
there is no animation Action 802 in your "Sin.air" MUGEN file, so you may just disable this Explod
by this changing type = Explod to type = Null ;Explod
3) for the "Hyper Throw", when your MUGEN Victim is being thrown, its ChangeAnim2 custom
animation Action 3011 is missing, you must add it back by something like this to your "Sin.air"
MUGEN file:
- Code:
-
; Hyper Throw 1 for Victim
[Begin Action 3011]
5000,0, 0,0, -1
and then, the MUGEN Victim's vertical Y-positions are off during the throw:
!!! the whole Throw Statedef 3001 state needs to be fixed like this:
- Code:
-
;Throw
[Statedef 3001]
type = S
movetype = a
physics = s
ctrl = 0
anim = 3001
[State 3001, Explod]
type = Explod
trigger1 = AnimElem = 6
trigger2 = AnimElem = 11
trigger3 = AnimElem = 16
trigger4 = AnimElem = 21
trigger5 = AnimElem = 26
anim = 802
ID = 802
pos = 17,0
postype = p1 ;p2,front,back,left,right
facing = 1
bindtime = 1
removetime = 12
shadow = -1
[State 3001, Width 1-27]
type = Width
trigger1 = AnimElemTime(1) >= 0 && AnimElemTime(27) < 0
edge = 60,0
[State 3001, Bind 1]
type = TargetBind
trigger1 = AnimElemTime(1) >= 0 && AnimElemTime(2) < 0
pos = 100, 0
[State 3001, Bind 2]
type = TargetBind
trigger1 = AnimElemTime(2) >= 0 && AnimElemTime(3) < 0
pos = 100, -80
[State 3001, Bind 3]
type = TargetBind
trigger1 = AnimElemTime(3) >= 0 && AnimElemTime(4) < 0
trigger2 = AnimElemTime(8) >= 0 && AnimElemTime(9) < 0
trigger3 = AnimElemTime(13) >= 0 && AnimElemTime(14) < 0
trigger4 = AnimElemTime(18) >= 0 && AnimElemTime(19) < 0
trigger5 = AnimElemTime(23) >= 0 && AnimElemTime(24) < 0
pos = 100, -50+(40*(AnimElemTime(8) >= 0 && AnimElemTime(9) < 0))
[State 3001, Bind 4]
type = TargetBind
trigger1 = AnimElemTime(4) >= 0 && AnimElemTime(5) < 0
trigger2 = AnimElemTime(9) >= 0 && AnimElemTime(10) < 0
trigger3 = AnimElemTime(14) >= 0 && AnimElemTime(15) < 0
trigger4 = AnimElemTime(19) >= 0 && AnimElemTime(20) < 0
trigger5 = AnimElemTime(24) >= 0 && AnimElemTime(25) < 0
pos = 100, -50
[State 3001, Bind 5]
type = TargetBind
trigger1 = AnimElemTime(5) >= 0 && AnimElemTime(6) < 0
trigger2 = AnimElemTime(10) >= 0 && AnimElemTime(11) < 0
trigger3 = AnimElemTime(15) >= 0 && AnimElemTime(16) < 0
trigger4 = AnimElemTime(20) >= 0 && AnimElemTime(21) < 0
trigger5 = AnimElemTime(25) >= 0 && AnimElemTime(26) < 0
pos = 100, -80
[State 3001, Bind 6]
type = TargetBind
trigger1 = AnimElemTime(6) >= 0 && AnimElemTime(7) < 0
trigger2 = AnimElemTime(11) >= 0 && AnimElemTime(12) < 0
trigger3 = AnimElemTime(16) >= 0 && AnimElemTime(17) < 0
trigger4 = AnimElemTime(21) >= 0 && AnimElemTime(22) < 0
trigger5 = AnimElemTime(26) >= 0 && AnimElemTime(27) < 0
pos = 100, 0
[State 3001, Bind 7]
type = TargetBind
trigger1 = AnimElemTime(7) >= 0 && AnimElemTime(8) < 0
trigger2 = AnimElemTime(12) >= 0 && AnimElemTime(13) < 0
trigger3 = AnimElemTime(17) >= 0 && AnimElemTime(18) < 0
trigger4 = AnimElemTime(22) >= 0 && AnimElemTime(23) < 0
pos = 100, -10
[State 3001, Bind 8]
type = Null;TargetBind
trigger1 = AnimElemTime(2) >= 0 && AnimElemTime(3) < 0
pos = 100, 50
[State 3001, Bind 9]
type = Null;TargetBind
trigger1 = AnimElemTime(3) >= 0 && AnimElemTime(4) < 0
trigger2 = AnimElemTime(8) >= 0 && AnimElemTime(9) < 0
trigger3 = AnimElemTime(13) >= 0 && AnimElemTime(14) < 0
trigger4 = AnimElemTime(18) >= 0 && AnimElemTime(19) < 0
trigger5 = AnimElemTime(23) >= 0 && AnimElemTime(24) < 0
pos = 100, 50
[State 3001, Bind 10]
type = Null;TargetBind
trigger1 = AnimElemTime(4) >= 0 && AnimElemTime(5) < 0
trigger2 = AnimElemTime(9) >= 0 && AnimElemTime(10) < 0
trigger3 = AnimElemTime(14) >= 0 && AnimElemTime(15) < 0
trigger4 = AnimElemTime(19) >= 0 && AnimElemTime(20) < 0
trigger5 = AnimElemTime(24) >= 0 && AnimElemTime(25) < 0
pos = 100, -10
[State 3001, Bind 11]
type = TargetBind
trigger1 = AnimElemTime(5) >= 0 && AnimElemTime(6) < 0
trigger2 = AnimElemTime(10) >= 0 && AnimElemTime(11) < 0
trigger3 = AnimElemTime(15) >= 0 && AnimElemTime(16) < 0
trigger4 = AnimElemTime(20) >= 0 && AnimElemTime(21) < 0
trigger5 = AnimElemTime(25) >= 0 && AnimElemTime(26) < 0
trigger6 = AnimElemTime(5) >= 0 && AnimElemTime(6) < 0
trigger7 = AnimElemTime(10) >= 0 && AnimElemTime(11) < 0
trigger8 = AnimElemTime(15) >= 0 && AnimElemTime(16) < 0
trigger9 = AnimElemTime(20) >= 0 && AnimElemTime(21) < 0
trigger10 = AnimElemTime(25) >= 0 && AnimElemTime(26) < 0
pos = 100, -100
[State 3001, Bind 12]
type = Null;TargetBind
trigger1 = AnimElemTime(6) >= 0 && AnimElemTime(7) < 0
trigger2 = AnimElemTime(11) >= 0 && AnimElemTime(12) < 0
trigger3 = AnimElemTime(16) >= 0 && AnimElemTime(17) < 0
trigger4 = AnimElemTime(21) >= 0 && AnimElemTime(22) < 0
trigger5 = AnimElemTime(26) >= 0 && AnimElemTime(27) < 0
pos = 100, -80
[State 3001, Bind 13]
type = TargetBind
trigger1 = AnimElemTime(7) >= 0 && AnimElemTime(8) < 0
trigger2 = AnimElemTime(12) >= 0 && AnimElemTime(13) < 0
trigger3 = AnimElemTime(17) >= 0 && AnimElemTime(18) < 0
trigger4 = AnimElemTime(22) >= 0 && AnimElemTime(23) < 0
pos = 100, -10
[State 3001, Bind 14]
type = Null;TargetBind
trigger1 = AnimElemTime(2) >= 0 && AnimElemTime(3) < 0
pos = 100, 50
[State 3001, Bind 15]
type = Null;TargetBind
trigger1 = AnimElemTime(3) >= 0 && AnimElemTime(4) < 0
trigger2 = AnimElemTime(8) >= 0 && AnimElemTime(9) < 0
trigger3 = AnimElemTime(13) >= 0 && AnimElemTime(14) < 0
trigger4 = AnimElemTime(18) >= 0 && AnimElemTime(19) < 0
trigger5 = AnimElemTime(23) >= 0 && AnimElemTime(24) < 0
pos = 100, 50
[State 3001, Bind 16]
type = Null;TargetBind
trigger1 = AnimElemTime(4) >= 0 && AnimElemTime(5) < 0
trigger2 = AnimElemTime(9) >= 0 && AnimElemTime(10) < 0
trigger3 = AnimElemTime(14) >= 0 && AnimElemTime(15) < 0
trigger4 = AnimElemTime(19) >= 0 && AnimElemTime(20) < 0
trigger5 = AnimElemTime(24) >= 0 && AnimElemTime(25) < 0
pos = 100, -10
[State 3001, Bind 17]
type = TargetBind
trigger1 = AnimElemTime(5) >= 0 && AnimElemTime(6) < 0
trigger2 = AnimElemTime(10) >= 0 && AnimElemTime(11) < 0
trigger3 = AnimElemTime(15) >= 0 && AnimElemTime(16) < 0
trigger4 = AnimElemTime(20) >= 0 && AnimElemTime(21) < 0
trigger5 = AnimElemTime(25) >= 0 && AnimElemTime(26) < 0
pos = 100, -100
[State 3001, Bind 18]
type = Null;TargetBind
trigger1 = AnimElemTime(6) >= 0 && AnimElemTime(7) < 0
trigger2 = AnimElemTime(11) >= 0 && AnimElemTime(12) < 0
trigger3 = AnimElemTime(16) >= 0 && AnimElemTime(17) < 0
trigger4 = AnimElemTime(21) >= 0 && AnimElemTime(22) < 0
trigger5 = AnimElemTime(26) >= 0 && AnimElemTime(27) < 0
pos = 100, -80
[State 3001, Bind 19]
type = TargetBind
trigger1 = AnimElemTime(7) >= 0 && AnimElemTime(8) < 0
trigger2 = AnimElemTime(12) >= 0 && AnimElemTime(13) < 0
trigger3 = AnimElemTime(17) >= 0 && AnimElemTime(18) < 0
trigger4 = AnimElemTime(22) >= 0 && AnimElemTime(23) < 0
pos = 100, -10
[State 3001, TargetFacing]
type = TargetFacing
trigger1 = AnimElem = 6
trigger2 = AnimElem = 11
trigger3 = AnimElem = 16
trigger4 = AnimElem = 21
trigger5 = AnimElem = 26
value = 1
[State 3001, TargetFacing]
type = TargetFacing
trigger1 = AnimElem = 8
trigger2 = AnimElem = 13
trigger3 = AnimElem = 18
trigger4 = AnimElem = 23
value = -1
[State 3001, Explod]
type = Explod
trigger1 = AnimElem = 6
trigger2 = AnimElem = 11
trigger3 = AnimElem = 16
trigger4 = AnimElem = 21
trigger5 = AnimElem = 26
anim = F61
pos = 70,0
postype = p1 ;p2,front,back,left,right
facing = 1
bindtime = 1
removetime = 12
[State 3001, PlaySnd]
type = PlaySnd
trigger1 = AnimElem = 6
trigger2 = AnimElem = 11
trigger3 = AnimElem = 16
trigger4 = AnimElem = 21
trigger5 = AnimElem = 26
value = S5,3
[State 3001, EnvShake]
type = EnvShake
trigger1 = AnimElem = 6
trigger2 = AnimElem = 11
trigger3 = AnimElem = 16
trigger4 = AnimElem = 21
trigger5 = AnimElem = 26
time = 10
freq = 60
ampl = -10
phase = 0
[State 3001, Hit]
type = TargetLifeAdd
trigger1 = AnimElem = 6
trigger2 = AnimElem = 11
trigger3 = AnimElem = 16
trigger4 = AnimElem = 21
trigger5 = AnimElem = 26
value = -100
[State 3001, ChangeState]
type = ChangeState
trigger1 = !animtime
value = 0
ctrl = 1
After a fix above, the TargetBinds should give better vertical Y-positions to the MUGEN Victim now:
!!! also the Hyper Throw damage too high too.....you may need to change TargetLifeAdd
value = -150 to value = -100 like in the above
4) for the "Tongue Saw" hyper move, the damage looks alright, yet, the initial black screen doesn't
work as expected, so you may want to change the MUGEN Trigger for the Assert MUGEN state
controller in your Statedef 3300 like this:
- Code:
-
[State 3300, assertspecial]
type = assertspecial
trigger1 = time = [0,40] ; AnimElem = 2
flag = noBG
flag2 = noFG
ignorehitpause = 1
Also, the damages are too high again, and you can do the similar adjustment like this:
=> for the first 1st HitDef MUGEN state controller: change damage = 20 to damage = 20,5
=> for the second 2nd HitDef MUGEN state controller: change damage = 200 to damage = 100,5
5) for the "Hyper Spikes" hyper move, the damages are also too high, and you can do the similar
adjustment like this:
=> for the Statedef 7100 spikes MUGEN Helper, change damage = 10 to damage = 3,1
=> for the Statedef 7101 spikes MUGEN Helper, change damage = 20 to damage = 5,2
=> for the Statedef 7102 spikes MUGEN Helper, change damage = 30 to damage = 10,3
=> for the Statedef 7103 spikes MUGEN Helper, change damage = 100 to damage = 13,2
About your Emperor Sinzross MUGEN A.I., it shall be made after all of the above MUGEN issues have been addressed. Well, actually in my MUGEN opinion MUGEN A.I. is the hardest thing to code, as it requires you to understand fully all the MUGEN coding (i.e. how to use all available MUGEN Triggers to read and react to MUGEN Enemy's moves, sometimes it needs to do complicated MUGEN-wise physics calculations and fighting games logic, or even to try to "remember" MUGEN Enemy's moves) and to have great experience against many different other MUGEN characters (i.e. you play Emperor Sinzross to fight many others). So, I suggest you first try to make your Emperor Sinzross more stable, before doing MUGEN A.I. Oh by the way, I tried MUGEN Watch Mode and found your Emperor Sinzross is already quite strong against some other MUGEN characters that have custom MUGEN A.I., mainly due to the high attack damages, and higher than normal defence (you used defence = 700 in your "Sin.cns" MUGEN file....that is just TOO MUCH....), and Emperor Sinzross' being not being to get thrown. These can be considered some "boss trait".
For now, please get the MUGEN basics done first, and make your Emperor Sinzross more stable. After that with more MUGEN making experience, you can try to make your Emperor Sinzross more interesting! I believe you can do it!