-
For the longest time KFM has been a pretty faulty starting point that's been packed with MUGEN forever now.
I'm ready to tackle changing this!
For now this thread is to organize and figure out the scope and direction of this project.
To start, how will we circulate this to quasi replace KFM? Obviously here on Guild we will want to replace the KFM that's in our hosted MUGENs including the Starter Pack. I'd like to extend out to other places that host the program to do the same.
It probably helps that most people coming here probably get the program from here. Since Elecbyte is still down.
And of course there will be a separate release.
What all do we wish to update?
I suppose we should start by going through each portion of CNS, CMD, etc and updating/adding more notes.
Example:
You would quote the original block(s) you are updating
;---------------------------------------------------------------------------
; Taunt
; CNS difficulty: easy
[Statedef 195]
type = S
ctrl = 0
anim = 195
velset = 0,0
movetype = I
physics = S
sprpriority = 2
[State 195, 1]
type = CtrlSet
trigger1 = Time = 40
value = 1
[State 195, 2]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
Then you'd post your modified version.
Spoiler: I figure the modified version should be in spoiler to save scrolling space? (click to see content)
Imagine the original code here with improvements and/or just more notation.
While some are helping on the coding side I figure I can bring back the Graphic Arts contests so we can add optional new animations to KFM. Along with some new basics so he can have all 6 buttons mapped.
After the update to the current coding is completed we should update other aspects (note any of these I list do NOT have to wait till after the current coding is updated if a person wishes to skip ahead. Just note that old coding may be modified so be sure it wouldn't conflict)
Help me list what all should be added to KFM I'm sure I will not remember everything
2-3 variant projectile attacks
Corner Push
Juggle system
Charge moves
a 360 and/or 720
Damage Dampener?
Another thought is to have 2 versions of KFM. A starter KFM and an advanced KFM
The reason I suggest this is because many things we may add can create more coding within the character's standard code which could intimidate and confuse starting creators. An advanced KFM could be set up in a way where each palette could be a different play style. Like having popular play mechanics.
Since the graphics contest typically had prizes for the winners I am offering choices from my gift Steam library. If anyone else wishes to pool some potential prizes let me know as well.
Spoiler: What I have (click to see content)
THE KING OF FIGHTERS 2002 UNLIMITED MATCH
THE KING OF FIGHTERS '98 ULTIMATE MATCH
METAL SLUG X
Chaos on Deponia
Deponia
Goodbye Deponia
Gang Beasts (Early Access)
Gone Home With Soundtrack
Xenonauts
Sir, You Are Being Hunted
Q.U.B.E.: Director's Cut
Planetary Annihilation
Legend of Korra
Any questions, feedback, concerns, or suggestions?
-
I like it!!! It can even work for clumsy people(as I am) and learning about what each line says and understand it :D
-
About animations, I have some optionals for him:
Shock, Midnight Bliss, frozen and Z2 Dash Collision.
-
I'm down for makimg new anims for KFM, it shouldn't be that hard to do. And I like this idea, since KFM is a base that is used by coders to create chars, an update will help me a lot when I start to learn how to code chars for my full game project in the future. :3 :3 :3
As for optional anims, CvS2 chip K.O., Sangue=Passare, and KoF blowback (IDk the name, the animation in which the opponent is sent flying?), and hard knockdown.
-
I really like that idea!
How about things like:
Power Charge
Super Jump
Parry
Projectile reflect
-
That'd be done in the advanced version. Or there could be game specific versions. Like KOF98 KFM or something along that line. Using the most simplest of characters KFM as a base to give game specific code. But let's not turn this thread into a wishlist of features.
For now let's stick to the base idea. Version 1. Which should be much more basic. Focusing on updating his current build mostly. Maybe adding a new move or 2 to teach the popular ways to do them.
Combo Dampener may be too niche and it may overcomplicate the current coding too. That may need to be in a more advanced or game specific KFM.
-
I'm in for new animations, I always found that his strong basics doesn't seem like strong attacks, let's leave them as the medium buttons and sprite the fierce moves.
If we are not setting any deadline and anyone is not already into it I would like to sprite a roundhouse kick.
And I don't want any payment, is a debt I think I have to the Mugen engine.
-
Feel free to do so :) And I agree his strong attacks feel more like medium attacks.
And if you wanted to submit it to the Graphics contest when/if I post it up you still can. Right now I'm in brainstorm phase. I won't make the contest or begin really starting this till I feel I've left this up long enough to get feedback on the things I've mentioned. So probably in a week I'll get this actually moving by updating code myself and making the contest.
@AerosMugen: Would it harm your artistic vision to place a frame that can use the play through animation code? (http://mugenguild.com/forum/topics/having-animations-play-hitpause-capcom-converters-please-read-157580.0.html)
-
Another idea is to update KFM for basic coding and make Suave Dude for advanced coding. He could have projectile attacks and attack concepts that KFM doesn't have.
If you guys think this will help me learn code, I'll be happy to contribute as well, if you'll have me. :)
-
The only thing bad about the Suave Dude idea is that we'd have to make every sprite for him. Where with KFM we only have to add.
And of course you can help! I hope this project can teach you too!
-
- Remove the OTG he has with his c.HK.
- Change the CLSN style to either Capcom or SNK. It's kind of a tough call considering he's 4-button, yet feels more like he was made with Capcom in mind. If we're converting him to 6-button, then definitely Capcom.
- Change the default friction values to be the same for both standing and crouching so combos are consistent. I'd recommend either the KOF standard, .828125 (which Vans and I use), since that's the only one we can actually get from a real game, or .85 as the Phantom.of.the.Server standard (which many people are trying to be these days).
- For the standard KFM, either Jmorphman palette system (var-based) or WinMUGEN palette system (simplest).
- For the advanced KFM, palette selector like Kamekaze.
- A KOF-style MAX combo system might be appealing in the advanced KFM. This will show people how to maintain variables as well as make a custom bar.
-
There's also this: http://www.vans.trinitymugen.net/home/mugenbug.html
-
Yes, that definitely needs to be addressed. I believe it also applies to jump attacks that use gravity or veladd with a trigger that's active at Time = 0 (such as trigger1 = 1). I came to this realization while updating VC Felicia with her dash attacks and wondering why I was never getting a consistent distance.
-
The normal KFM has a problem with Smash Kung Fu Upper that must be considered.
Give him 100 life (10x less) and 1000 defence (10x more)
Hit him with Smash Kung Fu Upper.
The Smash Kung will deal 86% damage due to the line fall.damage = 70 in the code.
You guys don't want this in your fixed version.
This is the most blatant bug I can remember in his codes at the moment, but I'll make sure to keep you guys aware of more issues I can find.
-
I like the idea of having Suave Dude (or just an Advanced KFM, since a whole sprite set for Suave Dude is a tall order) serve as a niche, covering more advanced topics like projectiles and charge moves and what not. The standard KFM could just get a fairly simple upgrade, like, I dunno, maybe constrained to things already exist in KFM, but are broken. So stuff like juggle system being broken, or corner push, stuff like that. Both the bugs unique to KFM and also the general MUGEN stuff that requires workarounds to achieve the correct behavior.
For the standard KFM, either Jmorphman palette system (var-based)
I wouldn't recommend anyone using my system because it's really bad, dumb, and confusing to users. And it only exists because I personally have a huge dislike of having to select grooves or palettes or TOP bars or whatever right before the match.
-
Yeah selecting palettes before a fight starts pulls me out of the immersion of being a character fighting something. Leave groove selects and shit for something else. Kung Fu Man is really just a basic-level tutorial character, so the only updates should focus on fixing his bugs and demonstrating stuff in the docs that he doesn't cover normally, with maybe a Kung Fu Man 2.0 demonstrating more advanced code. Like how there's tutorials based on "beginner, intermediate, advanced," but with different iterations of the same character.
-
I think there might be a case to be made for maybe giving KFM a projectile, both because that's a very basic, universal fighting game feature, and because the Projectile stcrl is broken and the docs aren't that helpful in teaching a new user how to code a projectile using helpers.
Yeah selecting palettes before a fight starts pulls me out of the immersion of being a character fighting something. Leave groove selects and shit for something else
There's nowhere else to put a groove select, though!
-
Another thing to update is his throws and custom states so that they use TargetState. I was using him as an example to code a wall bounce and he was using P2StateNo in the hitdef. I think I may had used that for Ryu's throws a year back too. I remembered that MUGEN class said to use TargetState in the event both players hit each other.
As for palette selection and stuff, I think it is pretty popular and would work good as an option for a specific palette. Example hold start and press "a" to pick KFM with pal selection.
I was thinking advanced KFM might have more popular features like parries and such spread across the 12 palettes. It'd help teach how to do that kind of thing I think.
-
No selection systems please. Not in either of them. I would in fact say nothing that replicates ANYTHING in an existing game directly. Not combo system. Not any sort of commercial method. You want people to learn from the character, not sprite swap it.
Examples of attacks. KFM needs an attack that takes him into the air and back down again to show how landing works outside of jump. A projectile is a must. Probably just a simple shuriken. Perhaps something that positions him behind P2 as this is a common thing people want to do.
Yes to a re-do of the clsns. His are OK but sometimes they're badly stupid. Moving to capcom or SNK styling for them would be a much better option.
There are also a few fixes required in the common1.cns file
I would not say he should actually have the sprites for the optional animations in many cases. But the animations themselves should be in the character and left as placeholders in some way. I would say leave them commented out, but very few people know how to read an Air file these days and would never see them. All the blood type and nationality stuff is neat and should be in. But you need to make sure people can see it.
-
KFM needs an attack that takes him into the air and back down again to show how landing works outside of jump.
You mean, like the Kung Fu Knee?
-
KFM needs a reversal move where he readies himself and if his opponent hits him, he can grab and get behind them then strike! I think such reversal needs a PlayerPush value of 0.
-
No selection systems please. Not in either of them. I would in fact say nothing that replicates ANYTHING in an existing game directly. Not combo system. Not any sort of commercial method. You want people to learn from the character, not sprite swap it.
I don't think there'd be anything non game specific needed for the advanced version really. That is kind of the point of the advanced version. To show off more common things people like to do. Everything non game specific should fit nicely into vanilla KFM. Like you said, he just needs a few moves that explain common things like projectiles, rising attacks, special throws, charge moves, etc Fix some specific issues like corner push and the current faults in the CNS, common1, and the CMD
Priority would be to vanilla anyway. We'd see what we wanted in advanced KFM later if we didn't run out of steam.
As for the CLSN stuff, I'll stick to capcom since I'm more familiar with it. Get hits should retain the standing, crouching, air defaults.
I hope to get new animations for optional standards but anything missing will get a placeholder anim. Adding Messatsu's templates into the air is a good idea too.
May need to make 1 more version of default KFM. Only difference with him would be he'd have ai programmed. KFM-ai
Wouldn't want a bunch of ai triggers complicating the attacks. But it's still an important concept to teach.
So maybe if it doesn't tank the endgame could be
KFM-beginner -> KFM-beginner-ai -> KFM-intermediate - > KFM-advanced
beginner = just basic KFM improved. No new moves but air standard and current coding revamped
beginner-ai = add ai to beginner KFM
intermediate = add new special moves
advanced = add frequently used systems
-
Like you said, he just needs a few moves that explain common things like projectiles, rising attacks, special throws, charge moves, etc Fix some specific issues like corner push and the current faults in the CNS, common1, and the CMD
As mentioned by Zzyzzyxx, KFM has a rising move already, and doesn't really need another. The projectile could be a charge move to kill two birds with one stone; the special throw, however, I think might be unnecessary. KFM's normal throw already will teaches users the basics of custom state coding and targetbinds. The specifics of a special throw vs a normal throw are different, but I think those can be left to Advanced Kung Fu Man.
-
I thought that one dropped him back into jump states for some reason.
-
About the 360/720 this is the only reason I wanted to add it in. (http://mugenguild.com/forum/topics/method-simplifyingcondensing-implementation-360-720-commands-170293.0.html)
-
use the wood plank from the intro for the projectile. No need for custom sprites or whatsoever
-
Are we going to use Elecbyte's KFM or the CSed KFM one?
In any case, it would be helpful to spriters to have an image of both them.
Yes, I know they're pretty easy to find, but including it in this topic will help to organize things.
-
I'm working on Elecbyte's KFM right now. I don't see any particular reason we need the CS version. Not to mention it'd make the new sprites we have to add a tad more complicated. I sure don't wish that!
EDIT: Should I split the cns up? Or leave it all in 1 file?
IE normals, specials, supers, -2-3, helpers, etc?
-
I don't think either should be necessary in the basic KFM.
-
Are you planning on having revamped sprites, or just new animations? Rolento has a couple on his Deviantart
(http://orig00.deviantart.net/26d5/f/2012/290/6/5/revised_kfm_stance_by_callmemra-d5i4ess.gif)(http://orig10.deviantart.net/2d04/f/2013/061/e/e/kung_fu_shiro__by_callmemra-d5ws5qf.gif)(http://orig11.deviantart.net/2381/f/2012/287/3/d/kung_fu_kicker_by_callmemra-d5htxfh.gif)(http://orig00.deviantart.net/ae03/f/2014/272/f/5/kfm___j_mp_sample_by_callmemra-d80yv39.gif)(http://orig09.deviantart.net/72ce/f/2014/272/8/8/kfm___crouch_mk_sample_by_callmemra-d80yusg.gif)(http://orig06.deviantart.net/5427/f/2012/290/9/a/revised_kung_fu_palm_by_callmemra-d5i51dz.gif)
Could be a rekka and a/or super
(http://orig10.deviantart.net/87c7/f/2012/291/4/7/kfm___alternating_palm_strikes_by_callmemra-d5i877e.gif)
And Judas made a reshaded KFM that could be used as a base if he's getting revamped
(http://img.photobucket.com/albums/v471/ruinsofeden/kfm.gif)
-
Just new animations. Mostly things that will help teach users. Some new strong basics, and optional animation standards.
-
if someone wants to revamp the sprites, at least have the courtesy to draw the kimono gi skirts on top of the pants, no credible fighter will ever put his gi inside their pants, as if it was a pajama...
-
Going back to what jz mentioned, his hitboxes need to all be redone from scratch as not only do they teach bad habits, but they are extremely unfeasible for most situations, his kung fu upper will miss on most characters as well as the super variant because the boxes are so tiny. I'm not saying put me in charge of that but I'm definitely throwing my hat in the ring lol. I also think the way he does pos adds could be retooled and its a great way to tell people when to use posadds and when to use vels.
-
I'm almost finished with his air file. Tomorrow I go to work for 3 12 hour days so finished or not I'll upload what I have so you can take a look and adjust.
I'll go back and add notes in the air later. Even though most ppl won't get to read them unless they use text mode in FF3 :p
-
Well what I mean in particular can be found in pretty much any char I made last year where I have the body clsn never moving at any point and instead use pos adds to hide that, what that does is keeps the throw range effectively the same the entire time and preventing kfm from over extending his body ala kung fu blow/palm for example. But sure I'll check it out.
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
Here's the air file as of now. I've made it to Strong Kung Fu Upper 1110. I have not finished it.
Also Kamekaze, I took a look at Frank's CLSNs to get a feel and I think that's too advanced and over complicates something that should be used to teach people that are new strong foundation. I'd never even seen that method till now.
-
I'm adding some sprites in the .sff now, I'll upload it later.
-
kfm.sff: http://www.mediafire.com/download/nj9nd92vqh41v8x/kfm.sff
Sprites added:
- group 189, 195, 1230, 1600 (from Laughing KFM by Pullo);
- group 220, 420 (by Rolento/CallMeMrA, edited by me);
- group 250, 435, 605, 1005 (by Rolento/CallMeMrA);
- group 650 (from KFM-Arc by ShowBuySpirit);
- group 1220, 1450, 1500, 1550, 1551, 1552 (from kfmc by ChottoKomaru);
- group 5050 (from pkfm, Power KFM, by "noname")
- group 5052 (from King Fancy Man by "BK", edited by me)
- group 5946 (from kfm '09 by Warner)
- portrait 9000,100 by Rolento/CallMeMrA.
-
For an advanced KFM, maybe implement a configure file and a tutorial on how to code and use one? One that can change hitsparks, hitsounds and whatnot. I've been seeing config files a lot lately and would like to know how they're done myself.
-
Hi all! It's a curious topic...Some years ago I created a custom Kung Fu Man (Kung Fu Saint) to use it ad developement base for Saint Seiya Legend characters and help newbies with coding. My version includes:
- 3 fireballs (normal projectile, freezing projectile and helper projectile)
- 3 counterattacks (one absorbing energy, one releasing a wave blast and another one who counters phisically or, in case of fireball, thows back enemy's fireball)
- 3 jumps followed by diving kick (up, back and forward, like balrog)
- directionable teleport
- rolling towards / backwards
- cosmo (power) charger (by holding)
- seventh dense (2x attack & unlimited power for some seconds)
- barrier (consumes power by holding)
- directionable throw (hold forward to throw forward and viceversa)
- serial throw
- 6 new hyper moves (big fireball, damaing field, ground combo by aerial attack, aerial combo by ground attack, multiple fireballs when his life is <200 and one that causes enemy's death after 10 seconds when enemy's life is <200, can be customed as poison state too)
- hyper counterattack (if hitted by an H move, counters with the first hyper, Kung Fu Palm, but with 2x attack)
Last, but not last, the sff haas been filled with big collection of sparks, and all of these share the same palette (so if you want to change their color, just save the first spark frame, recolor tit and change it on sff to color the others too).
Sound file has been filled too, in particolar with energy and weapon effects.
I provided also .txt files with guides to change spark colors and sounds.
I could share it if you want to try him! :)
-
Yes please share anything you have! Also thanks sin! I do need to stress that I won't guarantee everything given will be used.
For example, there will be no new animations at all added to Beginner KFM besides the optional anims. Intermediate will add new basics and specials. Advanced will have a lot more stuff like config files etc
But in all 3 versions only useful new materials will be used. Things that can help teach something unique. The goal isn't to make a better KungFuMan himself. The goal will be to make him the best tool we can to teach and help ppl learn with.
Note I have yet to look into everything shared to this project. So sin, if I don't think something should be used from what you added I'll discuss it with you. Hopefully you'll agree or I'll change my mind :p
I feel I should note I came down with pneumonia so if I don't get to do much with this this week that's why.
-
You can download it from here: http://www.mediafire.com/download/85dqomxdyykv2r8/Kfs.zip (http://www.mediafire.com/download/85dqomxdyykv2r8/Kfs.zip)
-
Why don't you share the link of the character here? For sure I don't want to register only to download a character.
-
Why don't you share the link of the character here? For sure I don't want to register only to download a character.
Ok, i modified the link.
-
(http://orig00.deviantart.net/ae03/f/2014/272/f/5/kfm___j_mp_sample_by_callmemra-d80yv39.gif)
This looks like it would make a good neutral jumping normal. Showing how to differentiate between neutral and diagonal jump normals would be a good thing, since that's a very common thing in fighting games.
-
Would it be a good idea to have an alternate mode selectable via holding start? Not necessarily an evil mode or anything, just a slightly different mode just to illustrate the concept.
-
Thanks felineki I'll use it for intermediate KFM!
Hoshi: something like that will probably be in advanced. I haven't thought too deeply about advanced since I haven't even finished beginner, which will be pretty much carbon copy KFM with optional anims and updated code.
-
Looks like I'm a bit late to this party, but I like what I see.
I commissioned some Suave Dude sprites in the past with Mr. A. Maybe to have something to start with, a simple KFM edit could be made, separating Shirt from Pants, and automatically there'd be a blue pants/black jacket version of KFM, which could at a later date become the Suave Dude.
I'm not saying put me in charge of that but I'm definitely throwing my hat in the ring lol.
YES. YES. YES. Please Kame, you are a bad enough dude to save the KFMs
-
well JNP had a point(hah), unless we make an advanced kfm my pos-locked clsns would be a bit over the top for a beginner as it starts by needing to define what clsn base would be appropriate for the character and then sticking to it for all clsns where it applies. I'll still try something I suppose when I get home later.
-
Here's an Optional Animation standard I made for my character, where I used KFM as an example and made a few sprites for him. (http://mugenguild.com/forum/msg.2173548)
If you have any interest in including it as an example, I'll give you those sprites/anims.
-
Yes I can add it :)
-
Cool :)
Well, here is a link for the sprites and axis positions (https://mega.nz/#!4ZEHkaaK!B3IjRYpl8QDOlC_57GlwgrjOTEJFf0HPhHIz1NbUzaM) in a .ZIP file.
Here is the anim data:
Spoiler, click to toggle visibilty
; PacMan Left/Right
[Begin Action 17210]
17210,0, 0,0, 3
17210,1, 0,0, 3
17210,2, 0,0, 3
17210,3, 0,0, 3
17210,4, 0,0, 3
17210,5, 0,0, 3
17210,6, 0,0, 3
17210,7, 0,0, 3
; PacMan Down
[Begin Action 17211]
17211,0, 0,0, 3
17211,1, 0,0, 3
17211,2, 0,0, 3
17211,3, 0,0, 3
17211,4, 0,0, 3
17211,5, 0,0, 3
17211,6, 0,0, 3
17211,7, 0,0, 3
-
Thanks felineki I'll use it for intermediate KFM!
I've added that (under group number 605)* and a lot of other things in the .sff I've shared before. Wait, you didn't download it, did you?
* You're free to change the number of the groups of sprites I added, of course.
-
I downloaded it and even looked at all the files. But I didn't remember each one :p
-
Haven't checked yet (I'm at work and I'm working 10 hour days this week so I wouldn't have much time this week to look at it until the weekend), but the state numbering absolutely needs to be standardized:
Light: 00
Light (close): 05
Medium: 10
Medium (close): 15
Heavy: 20
Heavy (close): 25
For jump attack ANIMATIONS
Neutral: [0,1,2]0
Diagonal: [0,1,2]5
Diagonal jump attack animations should be handled in the same state i.e. 600 and 605 should both go in state 600. Trust me, it's easier this way.
Also, what about command buffering system in AKFM? I know there's been a complaint or two that the command buffering system @Vans: came up with doesn't have enough examples and I believe this would be the perfect opportunity to show how to do things with it and what's possible!
-
I haven't looked into that code so I don't know how complicated it is to implement to a character. But depending on that I intended to put it intermediate or advanced yes.
I've been having 2nd thoughts about needing to standardize 05 basics. I was doing it at 1st with Ryu but when I went back and made SF1 Ryu several of those animations would have to be changed in later iterations to be 05 frames. Kinda made me feel all attacks that are not 00 are to just be considered extra animations and not need a standard.
I know that has nothing to do with what this is accomplishing but how helpful is it to teach the 05 standard?
-
When I was coding Felicia's Head Ride, I had to have several different cases for different authors who used different numbers for basics. It was a nightmare, especially with OKOF97 and old PotS. It would be a lot nicer if some single standard was established so that anyone who wants to do something similar doesn't have to code more cases, and will ensure that existing implementations won't break later on.
The addition of the buffering system, however, makes this task trivial AND allows specials and supers to cancel out of the Head Ride state, so long as the helper number is the same as the one we use (10371).
While this is one very specific case I mentioned as an example, the fact remains that there are several other things you could do with state numbering information, such as a more precise reactable AI.
-
As I keep telling you guys, write up something about this thing that explains what the buffering system does and how it works instead of just telling people to look at your characters' code. Based on my limited understanding, it's not just something you copy-paste into a character and call a day.
Here's my recommendation since apparently telling you or Vans to do a write-up on what it does has no effect: If you're REALLY that dead-set on showing how this thing works, youshould port a vanilla KFM over to the system with as much documentation as possible as to why you're assigning which variables where. And when I talk about writing something up, I don't mean like this:
;==============================================================================;
;Introduction:
;This is a buffering system aimed at recreating the control feel of the NeoGeo
;KOF series of games.
;
;The helper is capable of providing buffering as well as PERFECT reversed
;commands.
;
;Any and all editions should be done in the BUFFER DEFINITION section.
;
;Unless you plan to modify the whole system, do not touch the numbers in the
;varsets, ever.
;
;Try to keep a list of the variables used as well as the respective commands,
;just to keep some sort of order.
;
;In addition, try to follow this list as much as possible to avoid problems:
;FUNDAMENTAL MOVEMENT = System variables (RESERVED.)
;Basic and system commands: = var(0) - var(19) (RESERVED.)
;Special move type commands: = var(20) - var(39)
;Super move type commands = var(40) - var(49)
;MISC. commands = var(50) - var(59)
;Ultimate Button Check = fvar(1)
;Scramble mode switch = fvar(2)
That's in Hotaru_LB. The last character I downloaded in this system was Rugal so I dunno if you've made the explanation more clear since then, but even I'm looking at this right now and thinking "Well what am I supposed to do now?"
-
For example, there will be no new animations at all added to Beginner KFM besides the optional anims. Intermediate will add new basics and specials. Advanced will have a lot more stuff like config files etc
But in all 3 versions only useful new materials will be used. Things that can help teach something unique. The goal isn't to make a better KungFuMan himself. The goal will be to make him the best tool we can to teach and help ppl learn with.
I think three versions is a bit excessive; I also think advanced KFM shouldn't be too elaborate, the idea behind KFM is to teach one how to code MUGEN characters. Adding in features from specific games kinda defeats the purpose. The initial versions of these Kung Fu Men should strive to be as universal as possible.
I do think it might be interesting for individual people to come up with their own specialized versions of KFM, that emulate specific features from various series/games.
-
I honestly don't have a big plan for advanced. Beginner and intermediate are definitely what you describe.
Advanced has so many things that a person could add that you're right. It should probably be used more as user submitted x style KFM. Once the 1st 2 versions are finished. And let's be honest they also have the highest chance of being finished... The interest from everyone may be gone or advanced may get too many cooks.
That doesn't mean if I'm still interested I can't make an advanced but maybe he shouldn't be on the same level as the other 2 versions.
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
All right. I have the sff and air updated.
What new does he have in the air?
All CLSN finished.
Added 5052 Diag Up Twist anim thanks to Alex's sff
Added 5946 HDBZ back breaker thanks to Alex's sff
Added the PacMan sprites/info thanks to Altoiddealer
Messatsu's identifier anims
The liedown face 1st and get up anim is in the sff for sprite groups 5050 as it was in Alex's sff. But I don't know where this actually needs to go, what the air group should be, or the timings and CLSN data for it. I'm not a KOF expert. Can I get more info on this one?
Okay, I believe this concludes the air and sff for this version with what I have to work with. Now I can start working on updating the cmd and cns.
In the meantime we need to figure out what new optional anims we wish to add. After we establish them I'll make a new Graphic Art contest.
Here's a list of the ones I think we need.
Spoiler: Collapse/Cheese Kill/Crumple - 5950, 5955, 5130, 5131 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5950.gif)
Animation number: 5950The standard cheese kill animation. Usually triggered by being KO'd by block damage, but certain MUGEN characters also trigger this animation. However, if you are coding an attack that causes a collapse, I would recommend checking if 5955 exists for the opponent, as some characters have different animations for collapse and cheese kill, and many characters do not have hitboxes on their 5950 animation. There is neither a fixed time for the animation nor a sprite requirement; however, on the last frame, do NOT set the time to be -1. Instead, put a loop that final frame, otherwise this will cause problems with special attacks that put you in this animation, and the match will not end if you're cheese killed.
Notable examples: P.o.t.S.'s Shin Gouki (Misogi), Vans's Oswald (2, his throw), and Zero-Sennin's Hibiki (Divine Spirit of Victory)
Animation number: 5955The standard collapse animation. (Usually) exactly the same as 5950 (some characters, such as Rolento, have differing collapse and cheese kill animations); this animation, unlike 5950, has CLSNs, so the collapsing player can be hit as they're falling to the ground. If you're coding a move that not only causes the opponent to collapse but also lets the player follow up their attack while the opponent is collapsing, you should avoid using 5950, because there is no guarantee that any given opponent's 5950 would contain any hitboxes. In that case, you'll have to use a custom animation made up of required sprites. Better safe than sorry!
Notable examples: none, because I just made this up. Start using it!
(http://network.mugenguild.com/jmorphman/images/optionalanims/5950SwitchingDirections.gif)
A note about characters who collapse and reverse directions: Certain characters, such as Raiden and Zangief in CvS, end up facing the opposite direction from the one they were facing at the end of their collapse animation. This poses certain problems, but they are easily fixable: if left normally, the character in question will change back to their original orientation when their get up from lie down animation plays, producing a very jarring effect. To avoid this, horizontally flip the last frame of 5950 in your .air file, and insert this into your character's -2 state:
[State -2, Switch directions after collapse]
type = Turn
trigger1 = Anim = 5950
trigger1 = AnimElemTime(AnimElemNo(0) + 1) = 0
This will cause your character to seamlessly change directions, producing a smooth flow from 5950 to the get up animation.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5950Face-down.gif)
A note about characters who collapse face-down: in certain games, such as later KOFs, the collapse animation sends the character into a face-down lie down state. If you happen to be coding a move that sends an opponent into a custom state that uses a collapse animation, you should check to make sure if the character has a face-down lie down animation, in which case the collapse animation will almost certainly have that character fall face-down. This piece of code will detect whether that is the case and change to the proper lie down animation if needed.
[State X, ChangeAnim to face-down lie down]
type = ChangeAnim
trigger1 = AnimTime = 0
trigger2 = AnimElemTime(AnimElemNo(0) + 1) = 0
value = ifElse((Anim = 5950 && SelfAnimExist(5112) || Anim = 5400 && SelfAnimExist(5112) || Anim = 6010 && SelfAnimExist(5112) || Anim =5800 && SelfAnimExist(5112) || Anim = 5130 && SelfAnimExist(5112)), 5112, 5110)
persistent = 0
Simply add to the state where the collapse animation plays, and you should be fine. Note that if you keep the opponent in a custom state as they're lying on the floor, and then return them not to their own lie down on floor state but their get up from lie down state, there is no need to include this. But there will be certain attacks that require P2 to be sent into their own lie down state when they hit the floor, so this is needed.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5130.gif)(http://network.mugenguild.com/jmorphman/images/optionalanims/5131.gif)
Animation number: 5130, 5131Essentially the same as the 5950, but seems to have fallen out of use. The only difference is that this animation is is split into two; the first, 5130, consists of the character falling to their knees (but ending just before their fall on their knees in this animation). The second, 5131, consists of the character on their knees, then collapsing to the ground. Not every character falls to their knees, so substitute it with the point where they hit the ground. Or just skip this altogether, honestly. Nobody uses this.
Notable examples: The_None's Segalow (A final day, to be exact) and BBH's Baby Bonnie Hood (Cut & Catch), although Segalow also uses 5950, so one shouldn't be too concerned if they leave these two animations out. BBH's Baby Bonnie Hood
only uses 5130 and 5131, though.
Spoiler: Super Slash Collapsing/Face-down collapse - 5330 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5330.gif)
Animation number: 5330
Pretty much exactly like 5950, except the character MUST fall forward, and lie on their stomach at the end of the animation. Furthermore, the animation should not loop or go on indefinitely, as this will break the super slash coding. In addition, a lying on stomach animation must be included (index number 5112); at the end of the super slash state, your character will be sent to state 5120, which you should override to check if you're character is lying on their stomach in order to play the correct get up animation.
Notable examples: Roque's Nakoruru (Super Slash)
Spoiler: KOF hard knockdown - 5420, 5421, 5422, 5423, 5424, 5430 (click to see content)
To replicate KOF hard knockdown behavior, the following animations are required:
(http://network.mugenguild.com/jmorphman/images/optionalanims/5420.png)
Animation number: 5420
The hitshake frame for being knocked down while standing. Consists of one frame (some characters use one of their standard get hit sprites, others have unique frames), with a time of 1.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5421.png)
Animation number: 5421
The hitshake frame for being knocked down while crouching. Consists of one frame (one of their get up from face down liedown sprite, for all characters, but it's possible someone might have a unique frame), with a time of 1.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5422.png)
Animation number: 5422
The character, crashing into the ground. Consists of one frame (some characters use one of their standard get hit sprites, others have unique frames). Timing is generally 4 ticks, but could be changed, if you want, though the code behind this will automatically proceed to the next animation in sequence after 12 ticks.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5423.gif)
Animation number: 5423
The character falling to the ground after having their face slammed into it. Some characters have only one frame for this animation; others have multiple, and will either use standard get hit sprites, or have unique frames. Timing is variable (but usually around 7-10 ticks), though the code behind this will automatically proceed to the next animation in sequence after 12 ticks.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5424.gif)
Animation number: 5424
The character rebounding off the ground. Some characters have only one frame for this animation; others have multiple, and will either use standard get hit sprites, or have unique frames. No timing requirements.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5430.gif)
Animation number: 5430
Aerial knockdowns require only this animation, the character rebounding off the ground after falling from the air. Generally consists of various gethit sprites flipped and realigned, though some characters have unique frames for this.
Notable examples: KoopaKoot's Kyo, Vans's Shingo, CrazyKoopa+Jmorphman's Ryo (this uses a variant in which 5423 is skipped for a more Capcom-ish feeling, and 5430 is not used at all)
Spoiler: Vertical spinning - 5250, 5251 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5250.gif)
Animation number: 5250
When hit by certain attacks, the character flies through the air, spinning. Mostly seen in MvC characters.
Notable examples: ??? (Jin's Saotome Cyclone does this in MvC, but I don't know any MUGEN creations that use either animation; still, if your character has sprites for it, it can't hurt to include!)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5251.gif)
Animation number: 5251
Exactly the same as 5250, but with the character's head facing down. In MvC, it uses the exact same sprites as 5250, only flipped vertically.
Notable examples: ??? (Partner tag-ins cause this in MvC, but I don't know of anything that would use it in MUGEN. But like 5250, if you have the sprites, you should put it in!)
Spoiler: Standing Guard Crush - 5910, 5911, 5912, 5915 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5910.gif)(http://network.mugenguild.com/jmorphman/images/optionalanims/5911.gif)
Animation number: 5910, 5911
If a character blocks too many attacks in a short period of time, they will be guard crushed, during which they'll stop blocking and be stunned, open to attack. The first animation ONLY consists of the character being guard crushed, the second being the the recovery animation. The last sprite in 5910 should have a time of -1. The second animation should not loop or go on indefinitely.
Notable examples: Gal129's CvS characters
(http://network.mugenguild.com/jmorphman/images/optionalanims/5912.gif)
Animation number: 5912/5915
5910 and 5911 in one continuous animation; seems to have fallen out of use. Some authors use 5915, apparently. Either way, can't find anything that uses either.
Notable examples: ???
Spoiler: Crouching Guard Crush - 5920, 5921, 5922 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5920.gif)(http://network.mugenguild.com/jmorphman/images/optionalanims/5921.gif)
Animation number: 5920, 5921
Works exactly like 5910/5911, but used when crouching. Also used when the character has been guard crushed in the air and lands.
(http://network.mugenguild.com/jmorphman/images/optionalanims/5922.gif)
Animation number: 5922
5920 and 5921 in one continuous animation, but doesn't seem to be used by anyone.
Notable examples: ???
Spoiler: Jumping Guard Crush - 5930 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5930.gif)
Animation number: 5930
Works exactly like 5912/5922, but used when airborne.
Spoiler: Throw Escape/Tech Hit - 5940 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5940cvs.gif)(http://network.mugenguild.com/jmorphman/images/optionalanims/5940kof.gif)
Animation number: 5940
The character escapes from a throw before it can be executed, pushing away the opponent. No set time length or sprite requirement, though the last frame should have a time of -1. For characters in Capcom games, this animation typically uses the same sprites as their guard crush animation; however, for KOF characters, the animation is often one of their attack animations.
Notable examples: Many characters, including ones by PotS', Vans', H'', and more
Spoiler: Throw has been escaped out of - 5945 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5945cvs.gif)(http://network.mugenguild.com/jmorphman/images/optionalanims/5945kof.gif)
Animation number: 5945
The counterpart to 5940, this is the animation that plays for the player whose throw was escaped. No set time length or sprite requirement, though the last frame should have a time of -1. For characters in Capcom games, this animation, much like 5940, typically uses the same sprites as their guard crush animation. For KOF characters, the animation is sometimes (but not always) composed of various get hit sprites; other times it uses unique sprites.
Notable examples: Many characters, including ones by PotS', Vans', H'', and more
Spoiler: Demon Transformation/Red Arremer Transformation - 5960 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5960.gif)
Animation number: 5960
If defeated by Red Arremer, the character is transformed into a demon or monster of some sort. No set time length nor sprite requirement; however, on the last frame, do NOT set the time to be -1.
Notable examples: Red Arremer by H'' (though it doesn't seem to work very well unless the character has been hard coded into Red Arremer beforehand)
Spoiler: Animal Transformation/Goddess Athena Transformation - 5965 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/5965.gif)
Animation number: 5965
If defeated by Goddess Athena, the character is transformed into an animal of some sort. No set time length nor sprite requirement; however, on the last frame, do NOT set the time to be -1.
Notable examples: Goddess Athena by Warusaki3
Spoiler: Hit by Anakaris' Pit to the Underworld/Spinning Horizontally - 7008 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/7008.gif)
Animation number: 7008
The character spins around horizontally, with the axis centered on their waist. As far as I know, only used when hit by Anakaris' Pit to the Underworld attack, so Darkstalkers characters are probably the only characters with this type of animation, although for characters originating in X-Men: Children of the Atom, their get-hits from Colossus's throw would lend themselves to this animation, if properly aligned.
Notable examples: Anakaris by Thomas Hsieh (Pit to the Underworld)
Spoiler: Seppuku - 7694 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/7694.gif)
Animation number: 7694
A form of Japanese ritual suicide by disembowelment. Bishamon has an attack that forces the player do this: the character pulls out some kind of weapon and impales themselves on it. Overall animation time should not exceed 109 ticks, but other than that, go nuts.
Notable examples: Bishamon by 3ha
Spoiler: Massive Bee Stings - 7695 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/7695.gif)
Animation number: 7695
The aftermath of being stung by a swarm of bees. Q-Bee's +B attack causes this state. Usually one or two frames, but there are no actual sprite or timing requirements.
Notable examples: Q-Bee by Misao (+B)
Spoiler: Electrocution - 7696 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/9010cpsii.gif)(http://network.mugenguild.com/jmorphman/images/optionalanims/9010cpsiii.gif)
Animation number: 7696
One of the most common animations, the result of getting shocked by an electric attack. Anim is usually either 2 or 3 frames. Animations originating from CPS-2 games typically consist of two frames, both surrounded by an aura of electricity, with one frame being a cartoony "x-ray" appearance, complete with visible skeleton. Animations originating from Street Fighter III typically consist of three frames, with no aura of electricity, the first two frames being the same as the CPS-2 ones (though minus the aura), and last one being a negative of the frame with the visible skeleton. Even so, no specific time or frame requirements.
Notable examples: P.o.t.S.'s Ryu (Denjin Hadou Ken), Zelgadis296's Donovan (Lightning Sword/Lightning Fall), many more
Animation number: 9010, 9011, 9012
9010 is exactly the same as the previous animation, although apparently some characters use it with ChangeAnim2, requiring the sprites to be numbered 9010,0 and 9010,1. Extra precaution for that would be to have a duplicate of 9010,1 in the .sff, numbered 9010,10. However, I have never even seen anyone use it this way, so I wouldn't be too worried. In any case, it doesn't hurt to have an exact copy of 7696, but numbered 9010, in your .air file, just to be safe.
9011 and 9012 are the same deal as 9010, except 9011 has its axis centered on the character's waist, and 9012 has its axis centered on the character's head. Have yet to see it used anywhere, so don't feel too bad about ignoring it.
Spoiler: Burned - 7697 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/7697.png)
Animation number: 7697
The freshly toasted aftereffect of being struck by a flaming or explosive attack. Characters usually appear scorched, some or all clothing burned away, hair singed, and the like. Generally consists of a single sprite, with a time of -1, but it's not required.
Notable examples: Zelgadis296's Donovan (Ifrit Sword), P.o.t.S.'s Lei-Lei (Chuukadan), Jesuszilla's Vampire Chronicle Felicia (Please Help Me)
Certain characters, such as B.B. Hood and Hsien-Ko/Lei-Lei drop some of their weapons during this animation (a purely aesthetic touch, though). Currently figuring out whether there should be an alternate version of this animation exactly for this purpose, and how that would all work out.
Spoiler: Bloated Up - 7780 (click to see content)
(http://network.mugenguild.com/jmorphman/images/optionalanims/7780.gif)
Animation number: 7780
An animation from Darkstalkers, where the character bloats up like a balloon until they burst. Usually only one part of the character bloats up, which can range from their cheeks (B.B. Hood), their stomachs (Talbain, Jedah), their chin (Anakaris), their hands (Demitri), their butt (Lord Raptor/Zabel) or their boobs (pretty much every single original, custom-made version of this animation ::))
Notable examples: Deuce & BBH's Jedah (San=Passare), Rei's Jedah (San=Passare)
In Darkstalkers, after a character explodes, they are split in two, along the waist. Probably should be a standard for that, huh. I'll get on it soon!
Spoiler: unsorted, incomplete descriptions (click to see content)
5132,5133 - Collapse while crouching
5132 (falling to knees)
5133 (on knees and falling to ground)
Same as 5130-5131, only for crouching.
5180,5181 - Stagger
5180 (staggering)
5181 (recovering)
Used in many games such as GGXX, Inyuasha, Mortal Kombat, and others. The character staggers back, then recovers.
5180 has no fixed time; in fact, it's recommended that it loops. 5181, however, should ideally last for 3 frames. For both anims, all frames require collision boxes.
5301 - 'Birdies'
When hit by some of Hsien-Ko's weapons and knocked out, a trio of little chibi like sprites of the character encircles himself/herself.
Example: Some of Hsien-Ko's (aka Lei-Lei's) hits cause this to appear.
9020 - SVC Version of Demitri's Midnight Bliss.
Uses the exact standard seen below
Standard setup:
(Each entry is 1 tick)
0 - Standing, Axis at feet.
1-4 - Draining, Axis at neck (or whatever Demitri holds them up by)
5 - Drained, Axis at neck (or whatever Demitri holds them up by)
Example: Demitri's Midnight Bliss in SvC
9999 - An alternate for Electrocution (Index number 7696)
12000 - An alternate for the SvC version of Demitri's Midnight Bliss.
Solely the standing animation, with no timing limits or sprite requirements, but typically one anim (to avoid special hit problems, it might be best to leave the first sprite in whatever anim you want here 12000,0, and use other numbers for the subsequent animations, such as 12002, etc). Used in conjunction with index number 12000.
12001 - An alternate for the SvC version of Demitri's Midnight Bliss.
The draining animation itself. Used in conjunction with index number 12000. Axis is at the character's neck (or whatever Demitri holds them up by).
Standard setup (Sprite Numbers are correct):
12000, 1: 18 Ticks
12000, 2: 8 Ticks
12000, 3: 8 Ticks
12000, 4: 27 Ticks
12000, 5: 27 Ticks
13000 - Alternate entry for Athena Transformation (Index number 5965)
14000 - Alternate entry for Red Arremer Transformation (Index number 5960)
15312 - Blinded
Character is blinded from something, and is open to attack. Pretty much just like Dizzy.
66660 - Alternate SvC version of the MB *again*, standing animation. (Part 1 of 3)
(Ex-Infernis' Demitri). No sprite requirements, standing animation has a time of -1. Axis at feet.
66661 - Alternate SvC version of the MB, draining, specificially the first sprite of it (Part 2 of 3).
Even though it uses only the first sprite of the drain, it uses it three times in the animation, with the first entry being normal with a timing of 10, and the next two looping, the first entry of the loop adding 2 to the axis' value, and the second being normal. Axis at the neck (or whatever). Both use a time of 5 ticks.
So if the sprite was 9020,1, you'd do this as follows:
9020, 1, 0, 0, 10
Loopstart
9020, 1, 2, 0, 5
9020, 1, 0, 0, 5
66662 - Alternate SvC version of the MB, the rest of the drain (The last 4 sprites). (Part 3 of 3)
Each have a specific time of 5 save the last, which has a time of -1. Axis at the neck (or whatever).
19030 to 19038 - Royal Judgement/Retro Mutagen
This is for Anakaris's Royal Judgement special (and Shredder's Retro Mutagen), which transforms you into a various things, depending on the character. All animations are required for the attack to work properly (if you're missing one, you'll turn back into the generic transformation for that animation). There is no need for any specific timings or sprites for all of these animations (except for the get hit).
19030 (Standing): The cursed player, standing.
19032 (Crouching): The cursed player, crouching
19034 (Walking Forward): The cursed player, walking forward.
19035 (Walking Forward): The cursed player, walking forward.
19036 (Jumping): The cursed player, jumping. Unfortunately you are limited to only one jump animation, so Guile, for instance, who has a different neutral jumping animation, can either have the neutral jump be used for all 3 directions or have the forwards/backwards one used instead.
19038 (Jump Start): The cursed player, starting a jump
19039 (Jump Landing): The cursed player, landing from a jump
19040 (Being Hit): The cursed player, being hit by an attack. From my very limited experience, this only consists of one frame with a animtime of one tick.
Example: Thomas Hsieh's Anakaris is the only Anakaris that, to my knowledge, supports this
apparently there is a hit sound: 19030,0 ???
5937 - Flip Knockout
A special gethit created by Cybaster and Balthazar for their Goku. Cybaster's explanation of how to create it is located in Goku's readme so just download that. AFAIK, no set timing or sprite requirements.
5941,5942 - Chou Kamehameha Fatality
Another special gethit created by Cybaster and Balthazar. Jeez, what showoffs. Animation 5942 is optional, but will make the entire fatality look better. And again, no set timing or sprite requirements.
5900 - Wire Damage
Simple, and straightforward. KoF related.
7591 - Choked grabbed by the neck
Axis at the neck animation for character being grabbed by the neck or choked. Notably used by Queen Beryl's grab attack, but can have other purposes.
9000-9007 - Gloomy Puppet Show
Each of these animations releates to a specific animation for the gloomy puppet show move:
-9000: WP
-9001: MP
-9002: HP
-9003: WK
-9004: MK
-9005: HK
-9006: Standing
-9007: Ending (no loop)
9015 - Burned
Alternate for the normal burned anim.
9016 - Frozen
Simple. Character is frozen.
9021 - CFJ Version of Demitri's Midnight Bliss.
Pretty straightforward: single animation, just a stance of the character turned female or sexy :P
Use sound 9021, 0 for the moaning sound when the bliss is over.
9022 - CFJ Version of Demitri's Midnight Bliss (secondary).
A secondary one some characters use.
Anything else?
-
Kung Fu Man by warner had a pretty good Midnight Bliss if you want to take a look at that.
Also, I think you missed Dcat's "MY TOE!" animation.
-
I think I even missed some from DS. Feel free to mention anything I missed. I'll check out Warner's KFM. Thanks
-
I didn't add it on purpose, I didn't know what you were going to do with KFM so I left it out.
-
Pardon my ignorance but what didn't you add? AIR data?
-
I made a custom animation for split in half in my Bullseye and some chars are compatible with it.
There are some info about it in the readme.
-
man this would had been good to work on... If i am not mistaken I think solblaze did some stuff for him as well. Ill ask him
-
I made a custom animation for split in half in my Bullseye and some chars are compatible with it.
There are some info about it in the readme.
Is it a standard that is used for a commercial game too or just for your own character? If it's just for your own character I'll have to ask that you make the appropriate KFM sprites. Like altoiddealer did for his. There are a lot of custom animation standards to implement already. I won't feel comfortable asking others to make new ones for a single character. I hope you understand.
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
Added
Electrocuted
7696, 9010, 9999
Midnight Bliss
9020, 12000, 1200166660, 66661, 66662, 9021, 9022
Thanks to Warner's KFM
He has a lot of MK specific animations too for fatalities? Is this something we should add since it's there? I mean there is no way we can make all the new ones but this is a lot as is.
-
Spoiler, click to toggle visibilty
[Data]
;Amount of life to start with
life = 1000
;attack power (more is stronger)
attack = 100
;defensive power (more is stronger)
defence = 100
;Percentage to increase defense everytime player is knocked down
fall.defence_up = 50
;Time which player lies down for, before getting up
liedown.time = 60
;Number of points for juggling
airjuggle = 15
;Default hit spark number for HitDefs
sparkno = 2
;Default guard spark number
guard.sparkno = 40
;1 to enable echo on KO
KO.echo = 0
;Volume offset (negative for softer)
volume = 0
;Variables with this index and above will not have their values
;reset to 0 between rounds or matches. There are 60 int variables,
;indexed from 0 to 59, and 40 float variables, indexed from 0 to 39.
;If omitted, then it defaults to 60 and 40 for integer and float
;variables repectively, meaning that none are persistent, i.e. all
;are reset. If you want your variables to persist between matches,
;you need to override state 5900 from common1.cns.
IntPersistIndex = 60
FloatPersistIndex = 40
[Size]
xscale = 1 ;Horizontal scaling factor.
yscale = 1 ;Vertical scaling factor.
ground.back = 15 ;Player width (back, ground)
ground.front = 16 ;Player width (front, ground)
air.back = 12 ;Player width (back, air)
air.front = 12 ;Player width (front, air)
height = 60 ;Height of player (for opponent to jump over)
attack.dist = 160 ;Default attack distance
proj.attack.dist = 90 ;Default attack distance for projectiles
proj.doscale = 0 ;Set to 1 to scale projectiles too
head.pos = -5, -90 ;Approximate position of head
mid.pos = -5, -60 ;Approximate position of midsection
shadowoffset = 0 ;Number of pixels to vertically offset the shadow
draw.offset = 0,0 ;Player drawing offset in pixels (x, y). Recommended 0,0
[Velocity]
walk.fwd = 2.4 ;Walk forward
walk.back = -2.2 ;Walk backward
run.fwd = 4.6, 0 ;Run forward (x, y)
run.back = -4.5,-3.8 ;Hop backward (x, y)
jump.neu = 0,-10.4 ;Neutral jumping velocity (x, y)
jump.back = -2.55 ;Jump back Speed (x, y)
jump.fwd = 2.5 ;Jump forward Speed (x, y)
runjump.back = -2.55,-8.1 ;Running jump speeds (opt)
runjump.fwd = 4,-8.1 ;.
airjump.neu = 0,-8.1 ;.
airjump.back = -2.55 ;Air jump speeds (opt)
airjump.fwd = 2.5 ;.
air.gethit.groundrecover = -.15,-3.5 ;Velocity for ground recovery state (x, y) **MUGEN 1.0**
air.gethit.airrecover.mul = .5,.2 ;Multiplier for air recovery velocity (x, y) **MUGEN 1.0**
air.gethit.airrecover.add = 0,-4.5 ;Velocity offset for air recovery (x, y) **MUGEN 1.0**
air.gethit.airrecover.back = -1 ;Extra x-velocity for holding back during air recovery **MUGEN 1.0**
air.gethit.airrecover.fwd = 0 ;Extra x-velocity for holding forward during air recovery **MUGEN 1.0**
air.gethit.airrecover.up = -2 ;Extra y-velocity for holding up during air recovery **MUGEN 1.0**
air.gethit.airrecover.down = 1.5 ;Extra y-velocity for holding down during air recovery **MUGEN 1.0**
[Movement]
airjump.num = 1 ;Number of air jumps allowed (opt)
airjump.height = 35 ;Minimum distance from ground before you can air jump (opt)
yaccel = .44 ;Vertical acceleration
stand.friction = .85 ;Friction coefficient when standing
crouch.friction = .82 ;Friction coefficient when crouching
stand.friction.threshold = 2 ;If player's speed drops below this threshold while standing, stop his movement **MUGEN 1.0**
crouch.friction.threshold = .05 ;If player's speed drops below this threshold while crouching, stop his movement **MUGEN 1.0**
air.gethit.groundlevel = 25 ;Y-position at which a falling player is considered to hit the ground **MUGEN 1.0**
air.gethit.groundrecover.ground.threshold = -20 ;Y-position below which falling player can use the recovery command **MUGEN 1.0**
air.gethit.groundrecover.groundlevel = 10 ;Y-position at which player in the ground recovery state touches the ground **MUGEN 1.0**
air.gethit.airrecover.threshold = -1 ;Y-velocity above which player may use the air recovery command **MUGEN 1.0**
air.gethit.airrecover.yaccel = .35 ;Vertical acceleration for player in the air recovery state **MUGEN 1.0**
air.gethit.trip.groundlevel = 15 ;Y-position at which player in the tripped state touches the ground **MUGEN 1.0**
down.bounce.offset = 0, 20 ;Offset for player bouncing off the ground (x, y) **MUGEN 1.0**
down.bounce.yaccel = .4 ;Vertical acceleration for player bouncing off the ground **MUGEN 1.0**
down.bounce.groundlevel = 12 ;Y-position at which player bouncing off the ground touches the ground again **MUGEN 1.0**
down.friction.threshold = .05 ;;If the player's speed drops below this threshold while lying down, stop his movement **MUGEN 1.0**
[Data]
;Amount of life to start with
life = 1000
;attack power (more is stronger)
attack = 100
;defensive power (more is stronger)
defence = 100
;Percentage to increase defense everytime player is knocked down
fall.defence_up = 0
;Time which player lies down for, before getting up
liedown.time = 8
;Number of points for juggling
airjuggle = 15
;Default hit spark number for HitDefs
sparkno = 2
;Default guard spark number
guard.sparkno = 40
;1 to enable echo on KO
KO.echo = 0
;volumescale offset (negative for softer)
volumescale = 0
;Variables with this index and above will not have their values
;reset to 0 between rounds or matches. There are 60 int variables,
;indexed from 0 to 59, and 40 float variables, indexed from 0 to 39.
;If omitted, then it defaults to 60 and 40 for integer and float
;variables repectively, meaning that none are persistent, i.e. all
;are reset. If you want your variables to persist between matches,
;you need to override state 5900 from common1.cns.
IntPersistIndex = 60
FloatPersistIndex = 40
[Size]
xscale = 1 ;Horizontal scaling factor.
yscale = 1 ;Vertical scaling factor.
ground.back = 15 ;Player width (back, ground)
ground.front = 16 ;Player width (front, ground)
air.back = 12 ;Player width (back, air)
air.front = 12 ;Player width (front, air)
height = 60 ;Height of player (for opponent to jump over)
attack.dist = 160 ;Default attack distance
proj.attack.dist = 90 ;Default attack distance for projectiles
proj.doscale = 0 ;Set to 1 to scale projectiles too
head.pos = -5, -90 ;Approximate position of head
mid.pos = -5, -60 ;Approximate position of midsection
shadowoffset = 0 ;Number of pixels to vertically offset the shadow
draw.offset = 0,0 ;Player drawing offset in pixels (x, y). Recommended 0,0
[Velocity]
walk.fwd = 2.4 ;Walk forward
walk.back = -2.2 ;Walk backward
run.fwd = 4.6, 0 ;Run forward (x, y)
run.back = -4.5,-3.8 ;Hop backward (x, y)
jump.neu = 0,-10.4 ;Neutral jumping velocity (x, y)
jump.back = -2.55 ;Jump back Speed (x, y)
jump.fwd = 2.5 ;Jump forward Speed (x, y)
runjump.back = -2.55,-8.1 ;Running jump speeds (opt)
runjump.fwd = 4,-8.1 ;.
airjump.neu = 0,-8.1 ;.
airjump.back = -2.55 ;Air jump speeds (opt)
airjump.fwd = 2.5 ;.
air.gethit.groundrecover = -.15,-3.5 ;Velocity for ground recovery state (x, y) **MUGEN 1.0**
air.gethit.airrecover.mul = .5,.2 ;Multiplier for air recovery velocity (x, y) **MUGEN 1.0**
air.gethit.airrecover.add = 0,-4.5 ;Velocity offset for air recovery (x, y) **MUGEN 1.0**
air.gethit.airrecover.back = -1 ;Extra x-velocity for holding back during air recovery **MUGEN 1.0**
air.gethit.airrecover.fwd = 0 ;Extra x-velocity for holding forward during air recovery **MUGEN 1.0**
air.gethit.airrecover.up = -2 ;Extra y-velocity for holding up during air recovery **MUGEN 1.0**
air.gethit.airrecover.down = 1.5 ;Extra y-velocity for holding down during air recovery **MUGEN 1.0**
[Movement]
airjump.num = 1 ;Number of air jumps allowed (opt)
airjump.height = 35 ;Minimum distance from ground before you can air jump (opt)
yaccel = .5
;Vertical acceleration
stand.friction = .828125 ;Friction coefficient when standing. Use .85 for Phantom of the Server (POTS) style
crouch.friction = .828125 ;Friction coefficient when crouching. Use .85 for Phantom of the Server (POTS) style
stand.friction.threshold = 2 ;If player's speed drops below this threshold while standing, stop his movement **MUGEN 1.0**
crouch.friction.threshold = 2 ;If player's speed drops below this threshold while crouching, stop his movement **MUGEN 1.0**
air.gethit.groundlevel = 25 ;Y-position at which a falling player is considered to hit the ground **MUGEN 1.0**
air.gethit.groundrecover.ground.threshold = -20 ;Y-position below which falling player can use the recovery command **MUGEN 1.0**
air.gethit.groundrecover.groundlevel = 10 ;Y-position at which player in the ground recovery state touches the ground **MUGEN 1.0**
air.gethit.airrecover.threshold = -1 ;Y-velocity above which player may use the air recovery command **MUGEN 1.0**
air.gethit.airrecover.yaccel = .35 ;Vertical acceleration for player in the air recovery state **MUGEN 1.0**
air.gethit.trip.groundlevel = 15 ;Y-position at which player in the tripped state touches the ground **MUGEN 1.0**
down.bounce.offset = 0, 20 ;Offset for player bouncing off the ground (x, y) **MUGEN 1.0**
down.bounce.yaccel = .4 ;Vertical acceleration for player bouncing off the ground **MUGEN 1.0**
down.bounce.groundlevel = 12 ;Y-position at which player bouncing off the ground touches the ground again **MUGEN 1.0**
down.friction.threshold = .05 ;If the player's speed drops below this threshold while lying down,
Here's my 1st changes.
Liedown time
stand and crouch friction
crouch friction threshold
falldefenceup
y accel
jump.neu
Anything else need to be updated? Anything that could be documented better for better clarity?
Also @FeLo_Llop: @Zaitsu Hatter: @Graphicus:
Since you guys seemed interested in letting this help you learn I wanted to ask if you guys understand this block and what each part does? If not I can try and clarify some things in it for you guys :) Don't be afraid to say if you don't understand what something is/does.
EDIT:
I don't feel the following need altering.
Spoiler: winquotes, lose, win, intro, taunt (click to see content)
;Default language victory quotes (optional). **MUGEN 1.0**
;If this section is included, the default language victory quotes must be in English.
[Quotes]
; Up to 100 victory quotes can be specified per language (victory0 - victory99)
victory1 = "You must defeat Tu Shou to stand a chance."
victory2 = "You need a lot of training. Come back in ten years."
victory3 = "You look familiar. Did I see you on TV?"
victory4 = "Your moves are too predictable. You want to learn Kung Fu Palm? It's not for novices."
victory5 = "That was a good workout."
victory6 = "I want to challenge more skilled fighters."
victory7 = "What do you mean my girlfriend is in another temple?"
;Alternate language victory quotes (optional).
;0 or more alternate language sections may be added, preceded by the
;ISO 639-1 code followed by a ".", e.g. "[ja.Quotes]".
;See language setting in mugen.cfg.
[ja.Quotes]
victory1 = "カンフー突き手を破らぬ限り、お前に勝ち目はない!"
victory2 = "十年早いんだぞ"
victory3 = "お前は見覚えがあるな。テレビにでも…?"
victory4 = "お前の動きは見破りやすすぎる。 なに、カンフー突き手が覚えたいんだと? 素人には無理だぞ"
victory5 = "ふー。 いい汗だった"
victory6 = "もっと強い相手に挑戦したい"
victory7 = "なんだと!彼女はここにもいないと?"
;---------------------------------------------------------------------------
; Variable usage:
; This is a record of the variables that KFM uses. Keeping a record of your
; variable usage helps you avoid careless mistakes later.
; var(1) - Used in kfm.cmd for combo condition (updated every tick)
; var(2) - Used in Kung Fu Throw (state 800) to remember if fwd was being
; held (remembered from state 800 through state 810).
;---------------------------------------------------------------------------
; Lose by Time Over
; CNS difficulty: basic
[Statedef 170]
type = S
ctrl = 0
anim = 170
velset = 0,0
[State 170, 1]
type = NotHitBy
trigger1 = 1
value = SCA
time = 1
;---------------------------------------------------------------------------
; Win state decider
; CNS difficulty: basic
[Statedef 180]
type = S
[State 180, 1]
type = ChangeState
trigger1 = Time = 0
value = 181
;---------------------------------------------------------------------------
; Win pose 1 - Bow
; CNS difficulty: basic
[Statedef 181]
type = S
ctrl = 0
anim = 181
velset = 0,0
[State 181, 1]
type = NotHitBy
trigger1 = 1
value = SCA
time = 1
;---------------------------------------------------------------------------
; Introduction
; CNS difficulty: basic
[Statedef 191]
type = S
ctrl = 0
anim = 190
velset = 0,0
[State 191, 1] ;Freeze animation until PreIntro is over
type = ChangeAnim
trigger1 = RoundState = 0
value = 190
[State 191, 2] ;Assert this until you want "round 1, fight" to begin
type = AssertSpecial
trigger1 = 1
flag = Intro
[State 191, 3] ;Change to stand state when done
type = ChangeState
trigger1 = AnimTime = 0
value = 0
; You can delete the following two controllers if you're building your own
; character using KFM. These are the wood pieces that KFM kicks.
[State 191, Wood 1]
type = Explod
trigger1 = RoundState != 0
persistent = 0
anim = 191
postype = p1
pos = 260, -90
velocity = -4.2, -7
accel = 0, .32
removetime = 48
[State 191, Wood 2]
type = Explod
trigger1 = AnimElemTime(7) = 1
anim = 192
postype = p1
pos = 60, -70
velocity = 2, -4
accel = 0, .32
removetime = 35
; You can delete the following two controllers if you're building your own
; character using KFM. These play back the sounds of the wood block being
; broken.
[State 191, Snd 1]
type = PlaySnd
trigger1 = AnimElem = 7
value = F5,2
volume = -40
[State 191, Snd 2]
type = PlaySnd
trigger1 = AnimElemTime(7) = 3
value = F5,3
volume = -80
;---------------------------------------------------------------------------
; Taunt
; CNS difficulty: easy
[Statedef 195]
type = S
ctrl = 0
anim = 195
velset = 0,0
movetype = I
physics = S
sprpriority = 2
[State 195, 1]
type = CtrlSet
trigger1 = Time = 40
value = 1
[State 195, 2]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
-
Definately want to change fall.defenceup to 0, since I can't think of any game that gives you a 50% defense increase (or any defense increase for that matter) when you're knocked down unless someone can prove me wrong.
Also yaccel of 0.44 is too floaty by most game standards. I think I recall someone saying that 0.5 and above were much better values (though this obviously involves tweaking the jump velocities)
-
Also .44 is a floaty yaccel value, I think .5 is more fit for it.
-
I think MK-based could offer something more than death anmations, f.e. a running meter.
The cns is good I suppose. Will you separate those constante from regular state into a .st file right?
About winposes, you could create a Winposes that triggers only with full life (Perfect Win).
About che taunt, you could use a range var to trigger casually two taunts (just to let know che player it can be done).
-
Mugen has a hard coded bit of behaviour if liedown time remaining is less than 10, you become completely invulnerable. I would leave it at 60, cos that doesnt' really matter, and override that state to make you get up quicker. Otherwise you make your character unhittable while down which is very very rarely intended behaviour.
You can't bypass that short of making your own lie down state, and since there is one there already, overriding it to behave differently is a better idea.
Well shucks. Editing liedowntime was worthless. Good grief all the stuff in this quoted thread makes my head spin. It's kind of hard to figure out where I should even start!
Anyway, moving on:
Definately want to change fall.defenceup to 0, since I can't think of any game that gives you a 50% defense increase (or any defense increase for that matter) when you're knocked down unless someone can prove me wrong.
Also yaccel of 0.44 is too floaty by most game standards. I think I recall someone saying that 0.5 and above were much better values (though this obviously involves tweaking the jump velocities)
Also .44 is a floaty yaccel value, I think .5 is more fit for it.
Sounds good.
I think MK-based could offer something more than death anmations, f.e. a running meter.
Game specific meters do not fit KFM. I do hope after I complete beginner and intermediate that some users will jump in and make some game specific KFM. Till then, baby steps.
The cns is good I suppose. Will you separate those constante from regular state into a .st file right?
Nah, it shouldn't be needed for KFM. I had considered it.
About winposes, you could create a Winposes that triggers only with full life (Perfect Win).
Might be good for intermediate KFM. He gets new stuff besides just optional anim standards.
About che taunt, you could use a range var to trigger casually two taunts (just to let know che player it can be done).
Not sure if it's needed but if so I'll add it to intermediate.
Maybe I should start in the common1 1st instead?
-
Hey JNP,
I understood everything from 6 to 25, and the Size and Velocity, I understood everything. Just need a bit of re-reading to make sure of anything and I've got it. :)
My inquiries lie within lines 26 to 34, that part completely went through me. What do those lines signify? I know they are comments (save 33/34) but what are they commenting on? And what function do the variables presented in lines 33 and 34 do?
In addition, I didn't understand what velocity offset is. Does it function like draw offset, but for character gravity and velocity? Or is it something totally different?
I currently have no inquiries regarding the Movement block, but that's because I'm currently a bit fatigued (cold + night + a near whole day at university = :sick:), so I'll read through it again later and have my questions for that block by then
-
;Variables with this index and above will not have their values
;reset to 0 between rounds or matches. There are 60 int variables,
;indexed from 0 to 59, and 40 float variables, indexed from 0 to 39.
;If omitted, then it defaults to 60 and 40 for integer and float
;variables repectively, meaning that none are persistent, i.e. all
;are reset. If you want your variables to persist between matches,
;you need to override state 5900 from common1.cns.
IntPersistIndex = 60
FloatPersistIndex = 40
I may be reading this incorrectly but from what I am gathering:
If you had IntPersistIndex = 58 then Var(58) and Var(59) would not reset between rounds. = 59 would just mean Var(59) wouldn't reset. Since it is set to 60 all Int variables (0-59) will reset between rounds.
Same for floats (except you only have 0 - 39 on them)
And if you wish to alter this more you should override state 5900 in common1
Someone please correct me if I am wrong.
Velocity offset?
air.gethit.airrecover.add = 0,-4.5 ;Velocity offset for air recovery (x, y) **MUGEN 1.0**
This?
-
Velocity offset?
air.gethit.airrecover.add = 0,-4.5 ;Velocity offset for air recovery (x, y) **MUGEN 1.0**
This?
Yep the air.gethit.airrecover thing. Sorry for the bad wording.
;Variables with this index and above will not have their values
;reset to 0 between rounds or matches. There are 60 int variables,
;indexed from 0 to 59, and 40 float variables, indexed from 0 to 39.
;If omitted, then it defaults to 60 and 40 for integer and float
;variables repectively, meaning that none are persistent, i.e. all
;are reset. If you want your variables to persist between matches,
;you need to override state 5900 from common1.cns.
IntPersistIndex = 60
FloatPersistIndex = 40
I may be reading this incorrectly but from what I am gathering:
If you had IntPersistIndex = 58 then Var(58) and Var(59) would not reset between rounds. = 59 would just mean Var(59) wouldn't reset. Since it is set to 60 all Int variables (0-59) will reset between rounds.
Same for floats (except you only have 0 - 39 on them)
And if you wish to alter this more you should override state 5900 in common1
Someone please correct me if I am wrong.
OK, that explains how these variables work, but I still don't get what they are there for. Do they play a crucial role in the character, what do they do to the character that makes there (IntPeristIndex and FloatPersistIndex) presence important in the .CNS?
-
air.gethit.airrecover,add adds velocity to the actual recovery. Here it's 0,-4.5
This means that there is no additional velocity given x wise when you air recover. But on the Y axis -4.5 is added. A negative number makes the character go UP. So when they air recover they bounce up a bit.
Make sense?
OK, that explains how these variables work, but I still don't get what they are there for. Do they play a crucial role in the character, what do they do to the character that makes there (IntPeristIndex and FloatPersistIndex) presence important in the .CNS?
Well with the current KFM there are only 2 variables even used.
;---------------------------------------------------------------------------
; Variable usage:
; This is a record of the variables that KFM uses. Keeping a record of your
; variable usage helps you avoid careless mistakes later.
; var(1) - Used in kfm.cmd for combo condition (updated every tick)
; var(2) - Used in Kung Fu Throw (state 800) to remember if fwd was being
; held (remembered from state 800 through state 810).
The variable is only as important as the coder needs them to be. If for some reason you didn't want vars 50-59 to reset between rounds you could easily set that here instead of having to overwrite the common1
An example off the top pf my head would be if KFM entered a rage mode. You used var(50) = 1 to trigger it. But you want him to stay in rage mode even after the round ends going into the next round. You would want to set IntPersistIndex = 50
This would make sure that var(50) doesn't reset. It'd also make sure every var higher than 50 wouldn't reset. So all the vars you don't wish to reset would go in this group of vars.
Does this explain better? Once you understand I'll try and add the clarity to KFM himself. I want to prevent confusion the best I can.
And if anyone needs to correct me or explain it better please feel free :)
-
Creators sometimes need to use a Var that the value will not reset between rounds.
Some need more of these persistent Vars than others.
So Elecbyte decided to make it adjustable.
I'm talking outta my a$$ but there can really be no other explanation
-
air.gethit.airrecover,add adds velocity to the actual recovery. Here it's 0,-4.5
This means that there is no additional velocity given x wise when you air recover. But on the Y axis -4.5 is added. A negative number makes the character go UP. So when they air recover they bounce up a bit.
Make sense?
OK then, now I get that one.
OK, that explains how these variables work, but I still don't get what they are there for. Do they play a crucial role in the character, what do they do to the character that makes there (IntPeristIndex and FloatPersistIndex) presence important in the .CNS?
Well with the current KFM there are only 2 variables even used.
;---------------------------------------------------------------------------
; Variable usage:
; This is a record of the variables that KFM uses. Keeping a record of your
; variable usage helps you avoid careless mistakes later.
; var(1) - Used in kfm.cmd for combo condition (updated every tick)
; var(2) - Used in Kung Fu Throw (state 800) to remember if fwd was being
; held (remembered from state 800 through state 810).
The variable is only as important as the coder needs them to be. If for some reason you didn't want vars 50-59 to reset between rounds you could easily set that here instead of having to overwrite the common1
An example off the top pf my head would be if KFM entered a rage mode. You used var(50) = 1 to trigger it. But you want him to stay in rage mode even after the round ends going into the next round. You would want to set IntPersistIndex = 50
This would make sure that var(50) doesn't reset. It'd also make sure every var higher than 50 wouldn't reset. So all the vars you don't wish to reset would go in this group of vars.
Does this explain better? Once you understand I'll try and add the clarity to KFM himself. I want to prevent confusion the best I can.
And if anyone needs to correct me or explain it better please feel free :)
The rage mode example persisting after a round ends made it clearer.
Thanks. :)
-
the y-velocities for jumping need to be adjusted to higher values in order to compensate for the increased yaccel value, otherwise KFM ends up having a lower jump peak and wont be able to jump over taller characters that he should be able to otherwise. For yaccel of 0.5, I find that increasing the jump y-velocity to -10.4 works for getting approximately the same peak of your jump that you would with the default value of -8.4 with the 0.44 yaccel.
-
here's some values to consider:
Ryu's Jump vel in CVS2: -7.125
y accel: .3125
Ryu's Jump vel in MVC2: -9.5
y accel: .421875
Both are lower then what you guys have suggested... Maybe a floatier jump is actually what you want?
-
Jump vel of -10.4 and yaccel of .5 seems better.
The values you have for CVS2 Ryu are the values it spits out for normal speed jumping which is quite floaty. Because normal speed is like molasses :P
If you are on the default turbo speed (2 IIRC) Ryu's vels should look more like this
jump.neu = 0, -9.25
yaccel = .49
I got this by using the same controller to play MUGEN and CVS2 at the same time. I was able to sync CVS2 Ryu and MUGEN Ryu so that their peak and landings were at the exact same spots/timings.
This looks closer to what is being implemented in KFM. In normal speed capcom games are some of the slowest. People rarely play in those speeds.
-
Oh right. I forgot no one plays cvs2 at normal speed.
-
I didn't see anything that was questionable in this. To be clear I am using Vans's fixed common1 found here (http://www.vans.trinitymugen.net/home/mugenbug.html)
Spoiler: Common1 Stand through Jump Land 0-52 (click to see content)
; Common state file for M.U.G.E.N 1.0
;
; System variables usage
; ----------------------
; Var name Type Purpose
; -------- ---- -------
; sysvar(0) Temp Set by state 5081 (HITL_SLIDE) to 1 to prevent
; showing ground hit frame in state 5110 (HIT_LIEDOWN).
; Used by guarding states.
; sysvar(1) Temp Used by state 40 (Jump Start) amd 45 (Air Jump Start)
; to keep track of which way to jump.
; Used by state 5100 and 5110 to remember downward
; velocity of player just before hitting the ground.
; Used in state 5080 for storing the anim # to display.
; The following states have special handling within MUGEN, and should be
; overridden with caution:
; Jump Start (40): airjumping bookkeeping at time = 0
; All guard states (120-155): guard handling throughout state
; Hit_trip, shaking (5070): defense increases at time = 0
; Downed get-hit (hit ground from fall) (5100):
; defense increases at time = 0, player becomes invincible if within 10
; ticks of getting up
; Hit_liedown (5110): player changes to get-up state (5120) when ready
; Hit_getup (5120): player's defence is restored to normal at time = 0
; Hitfall_recover (5200): player's defence is restored at time = 0
; Hitfall_airrecover (5210): player's defence is restored at time = 0
;---------------------------------------------------------------------------
; Stand
[Statedef 0]
type = S
physics = S
sprpriority = 0
[State 0, 1]
type = ChangeAnim
trigger1 = Anim != 0 && Anim != 5
trigger2 = Anim = 5 && AnimTime = 0 ;Turn anim over
value = 0
[State 0, 2]
type = VelSet
trigger1 = Time = 0
y = 0
[State 0, 3] ;Stop moving if low velocity or 4 ticks pass
type = VelSet
trigger1 = abs(vel x) < Const(movement.stand.friction.threshold)
trigger2 = Time = 4
x = 0
[State 0, 4] ;Are you dead?
type = ChangeState
trigger1 = !alive
value = 5050
ctrl = 0
;---------------------------------------------------------------------------
; Stand to Crouch
[Statedef 10]
type = C
physics = C
anim = 10
[State 10, 1]
type = VelMul
trigger1 = Time = 0
x = .75
[State 10, 2] ;Stop moving if low velocity
type = VelSet
trigger1 = abs(vel x) < Const(movement.crouch.friction.threshold)
x = 0
[State 10, 3]
type = ChangeState
trigger1 = AnimTime = 0
value = 11
;---------------------------------------------------------------------------
; Crouching
[Statedef 11]
type = C
physics = C
anim = 11
sprpriority = 0
[State 11, 1] ;Change from turning animation
type = ChangeAnim
trigger1 = Anim = 6 && AnimTime = 0
value = 11
[State 11, 2] ;Stop moving if low velocity
type = VelSet
trigger1 = abs(vel x) < Const(movement.crouch.friction.threshold)
x = 0
;---------------------------------------------------------------------------
; Crouch to Stand
[Statedef 12]
type = S
physics = S
anim = 12
[State 12, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
;---------------------------------------------------------------------------
; Walk
[Statedef 20]
type = S
physics = S
sprpriority = 0
[State 20, 1]
type = VelSet
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)
[State 20, 2]
type = VelSet
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)
[State 20, 3]
type = ChangeAnim
triggerall = vel x > 0
trigger1 = Anim != 20 && Anim != 5
trigger2 = Anim = 5 && AnimTime = 0
value = 20
[State 20, 4]
type = ChangeAnim
triggerall = vel x < 0
trigger1 = Anim != 21 && Anim != 5
trigger2 = Anim = 5 && AnimTime = 0
value = 21
;---------------------------------------------------------------------------
; Jump Start
[Statedef 40]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1
facep2 = 1
[State 40, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0
[State 40, 2]
type = VarSet
trigger1 = command = "holdfwd"
sysvar(1) = 1
[State 40, 3]
type = VarSet
trigger1 = command = "holdback"
sysvar(1) = -1
[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)
[State 40, 5]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = prevstateno = 100 ;RUN_FWD
trigger1 = sysvar(1) = 1
x = const(velocity.runjump.fwd.x)
[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1
;---------------------------------------------------------------------------
; AirJump Start
[Statedef 45]
type = A
physics = N
ctrl = 0
velset = 0,0
[State 45, 1]
type = ChangeAnim
trigger1 = SelfAnimExist(44)
value = 44
[State 45, 2]
type = ChangeAnim
trigger1 = !SelfAnimExist(44)
value = 41
[State 45, 3]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0
[State 45, 4]
type = VarSet
trigger1 = command = "holdfwd"
sysvar(1) = 1
[State 45, 5]
type = VarSet
trigger1 = command = "holdback"
sysvar(1) = -1
[State 45, 6]
type = VelSet
trigger1 = Time = 2
x = ifelse(sysvar(1)=0, const(velocity.airjump.neu.x), ifelse(sysvar(1)=1, const(velocity.airjump.fwd.x), const(velocity.airjump.back.x)))
y = const(velocity.airjump.y)
[State 45, 7]
type = ChangeState
trigger1 = Time = 2
value = 50
ctrl = 1
;---------------------------------------------------------------------------
; Jump Up
[Statedef 50]
type = A
physics = A
[State 50, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0
[State 50, 2]
type = ChangeAnim
trigger1 = Time = 0
value = ifelse((vel x)=0, 41, ifelse((vel x)>0, 42, 43))
[State 50, 3]
type = ChangeAnim
trigger1 = Vel y > Const720p(-8)
trigger1 = SelfAnimExist(anim + 3)
trigger1 = anim >= 41 && anim <= 43
persistent = 0
value = Anim + 3
;---------------------------------------------------------------------------
; Jump Down (empty state for compatibility)
[Statedef 51]
type = A
physics = A
[State 51, 1]
type = Null
trigger1 = 1
;---------------------------------------------------------------------------
; Jump Land
[Statedef 52]
type = S
physics = S
ctrl = 0
anim = 47
[State 52, 1]
type = VelSet
trigger1 = Time = 0
y = 0
[State 52, 2]
type = PosSet
trigger1 = Time = 0
y = 0
[State 52, 3]
type = CtrlSet
trigger1 = Time = 3
value = 1
[State 52, 4]
type = VelSet
trigger1 = abs(vel x) < Const(movement.stand.friction.threshold)
x = 0
[State 52, 5]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
Run Forward has been changed so that you cannot crouch or attack while running. And you may jump while running
Spoiler: old code (click to see content)
;---------------------------------------------------------------------------
; Run forward
[Statedef 100]
type = S
physics = S
anim = 100
sprpriority = 1
[State 100, 1]
type = VelSet
trigger1 = 1
x = const(velocity.run.fwd.x)
[State 100, 2] ;Prevent run from canceling into walk
type = AssertSpecial
trigger1 = 1
flag = NoWalk
[State 100, 3] ;Prevent from turning
type = AssertSpecial
trigger1 = 1
flag = NoAutoTurn
[State 100, 4]
type = ChangeState
trigger1 = command != "holdfwd"
value = 0
;---------------------------------------------------------------------------
; Run forward
[Statedef 100]
type = S
physics = S
anim = 100
sprpriority = 1
ctrl = 0
[State 100, 1]
type = VelSet
trigger1 = 1
x = const(velocity.run.fwd.x)
[State 100, 2] ;Prevent run from canceling into walk
type = AssertSpecial
trigger1 = 1
flag = NoWalk
[State 100, 3] ;Prevent from turning
type = AssertSpecial
trigger1 = 1
flag = NoAutoTurn
[State 100, Jump] ;allows you to jump while running
type= changestate
trigger1= command="holdfwd" && command="holdup"
value= 40
[State 100, 4]
type = ChangeState
trigger1 = command != "holdfwd"
value = 0
ctrl = 1
Spoiler: Hop Backwards seems fine (click to see content)
;---------------------------------------------------------------------------
; Hop backwards
[Statedef 105]
type = A
physics = A
ctrl = 0
anim = 105
sprpriority = 1
[State 105, 1]
type = VelSet
trigger1 = Time = 0
x = const(velocity.run.back.x)
y = const(velocity.run.back.y)
[State 105, 2]
type = CtrlSet
trigger1 = Time = 2
value = 1
[State 105, 3]
type = ChangeState
trigger1 = Vel Y > 0
trigger1 = Pos Y >= 0
value = 106
Spoiler: Hop backwards (land) uses makedust which is deprecated (click to see content)
;---------------------------------------------------------------------------
; Hop backwards (land)
[Statedef 106]
type = S
physics = S
ctrl = 0
anim = 47
[State 106, 1]
type = VelSet
trigger1 = Time = 0
y = 0
[State 106, 2]
type = PosSet
trigger1 = Time = 0
y = 0
[State 106, 3]
type = MakeDust
trigger1 = Time = 2
pos = 0, 0
spacing = 1
[State 106, 4]
type = VelSet
trigger1 = abs(vel x) < Const(movement.stand.friction.threshold)
x = 0
[State 106, 5]
type = ChangeState
trigger1 = Time = 7
value = 0
ctrl = 1
;---------------------------------------------------------------------------
; Hop backwards (land)
[Statedef 106]
type = S
physics = S
ctrl = 0
anim = 47
[State 106, 1]
type = VelSet
trigger1 = Time = 0
y = 0
[State 106, 2]
type = PosSet
trigger1 = Time = 0
y = 0
[State 106, 3]
type = Explod
trigger1 = Time = 2
anim = F120
pos = 0, 0
removetime = -2
[State 106, 4]
type = VelSet
trigger1 = abs(vel x) < Const(movement.stand.friction.threshold)
x = 0
[State 106, 5]
type = ChangeState
trigger1 = Time = 7
value = 0
ctrl = 1
Does the Guard states work correctly? I noticed that HDBZ and POTS chars override this. It looks like it is done to make sure the blocking frames transition from Stand to crouch correctly, etc.
Should I alter the guard states any?
That's it for now. Comments? Questions?
EDIT: I was wrong about the land state (52)
Now we have this bullshit code implemented in Mugen common1.cns:
[State 52, 3]
type = CtrlSet
trigger1 = Time = 3
value = 1
KFM lands on state 52, but he didn't recover control yet. He still has 3 frames where he is a sitting duck, due to the code above. The code didn't consider that he landed from a gethit state and will negate control for more 3 frames.
Any attack I perform on him in this 3-frame window WILL register as a combo and WILL be a valid combo.
Because when KFM landed after the juggle he STILL didn't have his chance to recover. That's why when you give complete freedom for juggles it's better to make every attack knock an airborne opponent down.
Would adding this fix this issue? @Zzyzzyxx:
[State 52, 3]
type = CtrlSet
triggerall = Time = 0
trigger1 = PrevStateNo = 5020 || PrevStateNo = 5030 || PrevStateNo = 5035
trigger2 = PrevStateNo = 5040 || PrevStateNo = 5050 || PrevStateNo = 5070
trigger3 = PrevStateNo = 5071 || PrevStateNo = 5200 || PrevStateNo = 5201
trigger4 = PrevStateNo = 5210
value = 1
EDIT2: Or as POTS says (http://mugenguild.com/forum/msg.895205)
;---------------------------------------------------------------------------
; Jump Land
[Statedef 52]
type = S
physics = S
ctrl = 1
anim = 47
[State 52, 1]
type = VelSet
trigger1 = Time = 0
y = 0
[State 52, 2]
type = PosSet
trigger1 = Time = 0
y = 0
[State 52, 4]
type = VelSet
trigger1 = abs(vel x) < Const(movement.stand.friction.threshold)
x = 0
[State 52, Guard]
type= changestate
trigger1= inguarddist
trigger1= ctrl && command="holdback"
value= 120
[State 52, 5]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
I think I'm finished with common1
Current KFM in link let me know if I missed anything.
Went ahead and replaced the Guard states with POTS guard states. Left the ai he implemented for them and updated his hitvelset SCTRLs by replacing them.
Spoiler: cause it's super long (click to see content)
;==========< GUARD >==========
;--- START ---
[Statedef 120]
type = U
physics = U
[State 120, Vel]
type = velset
trigger1 = !time && statetype != A
x = 0
y = 0
[State 120, Anim]
type = changeanim
trigger1 = !time
value = 120 + (statetype = C) + (statetype = A) * 2
[State 120, Type]
type = statetypeset
trigger1 = !time && statetype = S
physics = S
[State 120, Type]
type = statetypeset
trigger1 = !time && statetype = C
physics = C
[State 120, Type]
type = statetypeset
trigger1 = !time && statetype = A
physics = A
[State 120, High to Low]
type = statetypeset
trigger1 = !AIlevel && statetype = S && command = "holddown"
trigger2 = AIlevel && statetype = S && (enemynear, movetype = A) && (enemynear, statetype = C)
statetype = C
physics = C
[State 120, Low to High]
type = statetypeset
trigger1 = !AIlevel && statetype = C && command != "holddown"
trigger2 = AIlevel && statetype = C && (enemynear, movetype = A) && (enemynear, statetype != C)
statetype = S
physics = S
[State AI fix]
type = ctrlset
trigger1 = AIlevel && numenemy
value = (enemynear, time >= 120 || time >= 180)
[State 120, End]
type = changestate
trigger1 = !animtime || AIlevel
value = 130 + (statetype = C) + (statetype = A) * 2
[State 120, Stop]
type = changestate
trigger1 = (!AIlevel && command != "holdback")
trigger2 = !inguarddist
trigger3 = AIlevel && numenemy
trigger3 = enemynear, hitdefattr = SCA, AT
value = 140
;--- STAND GUARD (guarding) ---
[Statedef 130]
type = S
physics = S
[State 130, Anim]
type = changeanim
trigger1 = anim != 130
value = 130
[State AI fix]
type = ctrlset
trigger1 = AIlevel && numenemy
value = (enemynear, time >= 120 || time >= 180)
[State 130, High to Low]
type = changestate
trigger1 = !AIlevel && command = "holddown"
trigger2 = AIlevel && random < (250 * (AIlevel ** 2 / 64.0))
trigger2 = (enemynear, movetype = A) && (enemynear, statetype = C)
value = 131
[State 130, Stop Guarding]
type = changestate
trigger1 = (!AIlevel && command != "holdback")
trigger2 = !inguarddist
trigger3 = AIlevel && numenemy
trigger3 = enemynear, hitdefattr = SCA, AT
value = 140
[State 130, Snd]
type = playsnd
trigger1 = !time
trigger1 = prevstateno = 132 || (prevstateno = [154, 155])
value = 0, 52
[State 130, Dust]
type = explod
trigger1 = !time
trigger1 = prevstateno = 132 || (prevstateno = [154, 155])
anim = F120
sprpriority = -2
postype = p1
ownpal = 1
pausemovetime = -1
supermovetime = -1
;--- CROUCH GUARD (guarding) ---
[Statedef 131]
type = C
physics = C
[State 131, Anim]
type = changeanim
trigger1 = anim != 131
value = 131
[State AI fix]
type = ctrlset
trigger1 = AIlevel && numenemy
value = (enemynear, time >= 120 || time >= 180)
[State 131, Low to High]
type = changestate
trigger1 = !AIlevel && command != "holddown"
trigger2 = AIlevel && random < (125 * (AIlevel ** 2 / 64.0))
trigger2 = (enemynear, movetype = A) && (enemynear, statetype != C)
value = 130
[State 131, Stop Guarding]
type = changestate
trigger1 = (!AIlevel && command != "holdback")
trigger2 = !inguarddist
trigger3 = AIlevel && numenemy
trigger3 = enemynear, hitdefattr = SCA, AT
value = 140
;--- AIR GUARD (guarding) ---
[Statedef 132]
type = A
physics = N
[State 132, Anim]
type = changeanim
trigger1 = anim != 132
value = 132
[State 132, Accel]
type = veladd
trigger1 = 1
y = const(movement.yaccel)
[State 132, Var]
type = varset
trigger1 = 1
sysvar(0) = (pos y >= 0) && (vel y > 0)
[State 132, Vel]
type = velset
trigger1 = sysvar(0)
y = 0
[State 132, Pos]
type = posset
trigger1 = sysvar(0)
y = 0
[State AI fix]
type = ctrlset
trigger1 = AIlevel && numenemy
value = (enemynear, time >= 120 || time >= 180)
[State 132, End]
type = changestate
trigger1 = sysvar(0) && inguarddist
trigger1 = (!AIlevel && command = "holdback") || AIlevel
value = 130
[State 132, End]
type = changestate
trigger1 = sysvar(0)
value = 52
[State 132, stop guarding]
type = changestate
trigger1 = (!AIlevel && command != "holdback")
trigger2 = !inguarddist
trigger3 = AIlevel && numenemy
trigger3 = enemynear, hitdefattr = SCA, AT
value = 140
;--- GUARD (end) ---
[Statedef 140]
type = U
physics = U
ctrl = 1
[State 140, Anim]
type = changeanim
trigger1 = !time
value = 140 + (statetype = C) + (statetype = A) * 2
[State 140, Type]
type = statetypeset
trigger1 = !time && statetype = S
physics = S
[State 140, Type]
type = statetypeset
trigger1 = !time && statetype = C
physics = C
[State 140, Type]
type = statetypeset
trigger1 = !time && statetype = A
physics = A
[State 140, High to Low]
type = statetypeset
trigger1 = !AIlevel && statetype = S && command = "holddown"
trigger2 = AIlevel && random < (250 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = S && (enemynear, movetype = A) && (enemynear, statetype = C)
statetype = C
physics = C
[State 140, Low to High]
type = statetypeset
trigger1 = !AIlevel && statetype = C && command != "holddown"
trigger2 = AIlevel && random < (125 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = C && (enemynear, movetype = A) && (enemynear, statetype != C)
statetype = S
physics = S
[State 140, 5]
type = changestate
trigger1 = !animtime
value = (statetype = C) * 11 + (statetype = A) * 51
;--- SGUARDHIT (shaking) ---
[Statedef 150]
type = S
movetype = H
physics = N
velset = 0, 0
[State 150, Anim]
type = changeanim
trigger1 = 1
value = 150
[State 150, End]
type = changestate
trigger1 = hitshakeover
value = 151 + 2 * ((!AIlevel && command = "holddown") || (AIlevel && (enemynear, movetype = A) && (enemynear, statetype = C)))
[State 150, High to Low]
type = statetypeset
trigger1 = !AIlevel && statetype = S && command = "holddown"
trigger2 = AIlevel && random < (250 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = S && (enemynear, movetype = A) && (enemynear, statetype = C)
statetype = C
physics = C
[State 150, Low to High]
type = statetypeset
trigger1 = !AIlevel && statetype = C && command != "holddown"
trigger2 = AIlevel && random < (125 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = C && (enemynear, movetype = A) && (enemynear, statetype != C)
statetype = S
physics = S
;--- SGUARDHIT2 (knocked back) ---
[Statedef 151]
type = S
movetype = H
physics = S
anim = 150
[State 151, Vel]
type = velset
trigger1 = !time
x = gethitvar(xvel)* facing
[State 151, Vel]
type = velset
trigger1 = time = gethitvar(slidetime)
trigger2 = hitover
x = 0
[State 151, Ctrl]
type = ctrlset
trigger1 = time = gethitvar(ctrltime)
value = 1
[State 151, High to Low]
type = statetypeset
trigger1 = !AIlevel && statetype = S && command = "holddown"
trigger2 = AIlevel && random < (250 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = S && (enemynear, movetype = A) && (enemynear, statetype = C)
statetype = C
physics = C
[State 151, Low to High]
type = statetypeset
trigger1 = !AIlevel && statetype = C && command != "holddown"
trigger2 = AIlevel && random < (125 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = C && (enemynear, movetype = A) && (enemynear, statetype != C)
statetype = S
physics = S
[State 151, End]
type = changestate
trigger1 = hitover
value = 130
ctrl = 1
;--- CGUARDHIT (shaking) ---
[Statedef 152]
type = C
movetype = H
physics = N
velset = 0, 0
[State 152, Anim]
type = changeanim
trigger1 = 1
value = 151
[State 152, End]
type = changestate
trigger1 = hitshakeover
value = 151 + 2 * ((!AIlevel && command = "holddown") || (AIlevel && (enemynear, movetype = A) && (enemynear, statetype = C)))
[State 152, High to Low]
type = statetypeset
trigger1 = !AIlevel && statetype = S && command = "holddown"
trigger2 = AIlevel && random < (250 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = S && (enemynear, movetype = A) && (enemynear, statetype = C)
statetype = C
physics = C
[State 152, Low to High]
type = statetypeset
trigger1 = !AIlevel && statetype = C && command != "holddown"
trigger2 = AIlevel && random < (125 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = C && (enemynear, movetype = A) && (enemynear, statetype != C)
statetype = S
physics = S
;--- CGUARDHIT2 (knocked back) ---
[Statedef 153]
type = C
movetype = H
physics = C
anim = 151
[State 153, Vel]
type = velset
trigger1 = !time
x = gethitvar(xvel)* facing
[State 153, Vel]
type = velset
trigger1 = time = gethitvar(slidetime)
trigger2 = hitover
x = 0
[State 153, Ctrl]
type = ctrlset
trigger1 = time = gethitvar(ctrltime)
value = 1
[State 153, High to Low]
type = statetypeset
trigger1 = !AIlevel && statetype = S && command = "holddown"
trigger2 = AIlevel && random < (250 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = S && (enemynear, movetype = A) && (enemynear, statetype = C)
statetype = C
physics = C
[State 153, Low to High]
type = statetypeset
trigger1 = !AIlevel && statetype = C && command != "holddown"
trigger2 = AIlevel && random < (125 * (AIlevel ** 2 / 64.0))
trigger2 = statetype = C && (enemynear, movetype = A) && (enemynear, statetype != C)
statetype = S
physics = S
[State 153, End]
type = changestate
trigger1 = hitover
value = 131
ctrl = 1
;--- AGUARDHIT (shaking) ---
[Statedef 154]
type = A
movetype = H
physics = N
velset = 0, 0
[State 154, Anim]
type = changeanim
trigger1 = 1
value = 152
[State 154, End]
type = changestate
trigger1 = hitshakeover
value = 155
;--- AGUARDHIT2 (knocked away) ---
[Statedef 155]
type = A
movetype = H
physics = N
anim = 152
[State 155, Vel]
type = velset
trigger1 = !time
x = gethitvar(xvel)* facing
y = gethitvar(yvel)
[State 155, Vel]
type = veladd
trigger1 = 1
y = const(movement.yaccel)
[State 155, Ctrl]
type = ctrlset
trigger1 = time = gethitvar(ctrltime)
value = 1
[State 155, Var]
type = varset
trigger1 = 1
sysvar(0) = (pos y >= 0) && (vel y > 0)
[State 155, Vel]
type = velset
trigger1 = sysvar(0)
y = 0
[State 155, Pos]
type = posset
trigger1 = sysvar(0)
y = 0
[State 155, End]
type = changestate
trigger1 = sysvar(0) && inguarddist
trigger1 = (!AIlevel && command = "holdback") || AIlevel
value = 130
[State 155, End]
type = changestate
trigger1 = sysvar(0)
value = 52
-
First of all:
He can't attack at all while running. The triggers in his cmd for his non-aerial attacks should be ctrl || stateno = 100.
Would adding this fix this issue? @Zzyzzyxx:
[State 52, 3]
type = CtrlSet
triggerall = Time = 0
trigger1 = PrevStateNo = 5020 || PrevStateNo = 5030 || PrevStateNo = 5035
trigger2 = PrevStateNo = 5040 || PrevStateNo = 5050 || PrevStateNo = 5070
trigger3 = PrevStateNo = 5071 || PrevStateNo = 5200 || PrevStateNo = 5201
trigger4 = PrevStateNo = 5210
value = 1
EDIT2: Or as POTS says (http://mugenguild.com/forum/msg.895205)
;---------------------------------------------------------------------------
; Jump Land
[Statedef 52]
type = S
physics = S
ctrl = 1
anim = 47
[State 52, 1]
type = VelSet
trigger1 = Time = 0
y = 0
[State 52, 2]
type = PosSet
trigger1 = Time = 0
y = 0
[State 52, 4]
type = VelSet
trigger1 = abs(vel x) < Const(movement.stand.friction.threshold)
x = 0
[State 52, Guard]
type= changestate
trigger1= inguarddist
trigger1= ctrl && command="holdback"
value= 120
[State 52, 5]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
I don't think giving control at the first fame KFM lands is a good idea. I prefer the idea followed in Capcom's games, which involves the Trip Guard concept.
http://wiki.shoryuken.com/Ultra_Street_Fighter_IV/Game_Systems#Land_Frames_.2F_Trip_Guard
During landing state, most Capcom games negate control for 1 frame if the player attacks with an aerial basic during the jump.
However if he doesn't perform any action, he regains control immediately, being able to block at the first frame the player lands.
KOF series doesn't use the concept of trip guard. Your control when landing is negated for the first 2 frames, regardless of using a jump attack or not.
The code below fullfills the need of having control when landing from a gethit state, And it does much more. It also reproduces the concept of Trip Guard successfully.
[state 52, Control]
type = ctrlset
trigger1 = !time
trigger1 = !(prevstateno = [600, 699])
trigger2 = time = 2 ; 2 for SNK-style, 1 for Capcom-style. Both are good options.
value = 1
[State 52, Guard]
type = changestate
trigger1 = ctrl && command = "holdback"
trigger1 = inguarddist && (prevstateno != [600, 699])
value = 120
In addition, in my opinion, stateno 40 should be invulnerable to throws. This is how commercial games tend to do.
[state 40, Vulnerability]
type = hitby
trigger1 = 1
value = SCA, NA, SA, HA, NP, SP, HP
In addition again, make sure to fix a few syntax issues found in his code.
(http://i.imgur.com/hc5yqYy.jpg)
I don't even think that the trigger statetime actually exists. I never tested it, though.
KFM will be marked with a red cross even after you fix all codes, though. It seems to be a bug in Fighter Factory 3, which interprets the folder of char not having any .act files (KFM's case) as an actual issue. I saved KFM's (not your version, Elecbyte's one) six palettes inside his folder and Fighter Factory issue warnings disappeared, showing a green "V" signal instead.
I have serious objection about how his chain combos are handled. You know, the impossibility of cancelling crouching basics into standing basics and vice-versa, like every other fighting game with chain combos (via replacing the triggers statetype = S and statetype = C in his cmd with statetype != A. All advanced coders will agree with me.).
Some people may argue that this is an issue that should be addressed in Advanced KFM or Expert KFM. For me, this is a fundamental issue and should be addressed in the basic version. Objections?
-
Thanks, I won't have time to work on it more today but I'll make all of those changes.
Should KFM be able to attack while running? I thought that wasn't common.
And I agree on the StateType != A changes.
Also to remind myself. I didn't edit the state responsible for this.
Mugen has a hard coded bit of behaviour if liedown time remaining is less than 10, you become completely invulnerable. I would leave it at 60, cos that doesnt' really matter, and override that state to make you get up quicker. Otherwise you make your character unhittable while down which is very very rarely intended behaviour.
You can't bypass that short of making your own lie down state, and since there is one there already, overriding it to behave differently is a better idea.
-
I don't even think that the trigger statetime actually exists.
It was found by Kung_Fu_Man as an undocumented trigger, it's literally the same as time from what I can see.
-
Why did you add a CLSN1 on the fifth frame of the normal KF Palms and on the fourth of the Fast KF Palm (the frame with the blur)? It worked right before, also the blur shows the palm still hasn't reached the enemy so it shouldn't hurt; moreover, the "swing" sound plays the frame after it if it hits the enemy.
The playsnd is right, the CLSN1 you added isn't.
-
I was considering using the move to show how to have certain frames play through hit pause.
-
As I keep telling you guys, write up something about this thing that explains what the buffering system does and how it works instead of just telling people to look at your characters' code. Based on my limited understanding, it's not just something you copy-paste into a character and call a day.
Here's my recommendation since apparently telling you or Vans to do a write-up on what it does has no effect: If you're REALLY that dead-set on showing how this thing works, youshould port a vanilla KFM over to the system with as much documentation as possible as to why you're assigning which variables where. And when I talk about writing something up, I don't mean like this:
;==============================================================================;
;Introduction:
;This is a buffering system aimed at recreating the control feel of the NeoGeo
;KOF series of games.
;
;The helper is capable of providing buffering as well as PERFECT reversed
;commands.
;
;Any and all editions should be done in the BUFFER DEFINITION section.
;
;Unless you plan to modify the whole system, do not touch the numbers in the
;varsets, ever.
;
;Try to keep a list of the variables used as well as the respective commands,
;just to keep some sort of order.
;
;In addition, try to follow this list as much as possible to avoid problems:
;FUNDAMENTAL MOVEMENT = System variables (RESERVED.)
;Basic and system commands: = var(0) - var(19) (RESERVED.)
;Special move type commands: = var(20) - var(39)
;Super move type commands = var(40) - var(49)
;MISC. commands = var(50) - var(59)
;Ultimate Button Check = fvar(1)
;Scramble mode switch = fvar(2)
That's in Hotaru_LB. The last character I downloaded in this system was Rugal so I dunno if you've made the explanation more clear since then, but even I'm looking at this right now and thinking "Well what am I supposed to do now?"
Hello Jango, sorry for the late reply.
Actually, I don't recall you formally contacting me to make a tutorial on how to use the system. I did, however, offer all my help so you could implement it without any problems. Do bear in mind that I spend a very small amount of time reading forums and keeping up, I often receive too many messages to keep track of everything, I am sorry for that.
I *personally* have only recommended this system to very particular coders that I consider highly proficient in CNS coding. In my experience, coders who have enough interest in using this system have had no problems following the pointers and implementation of this code, and like I have always done, I offer personal help to the people interested in doing it.
As of late I have decided against writing tutorials for certain things as they're often not included into tutorial repositories (http://mugenguild.com/forum/index.php?msg=2151956), so I prefer to have direct contact with people who are interested in learning / implementing some of the methods and systems that I code.
For this particular system, why don't you help us out with the nooks and crannies of explaining it? I already coded the system and it's completely open source and labeled for everyone to read. Right now I'm in a stage where I can either spend time doing documentation or further fixing/creating systems, so I prefer to develop more helpful things instead.
I have discussed the possibility of creating a version of Kung Fu Man with a basic implementation of the buffering (like Jesuszilla mentioned) with KoopaKoot . I think it would much more positive if we flesh out the documentation portion as a community effort instead (if there's interest).
-
Should KFM be able to attack while running? I thought that wasn't common.
Well, in KOF, Garou, MVC, Darkstalkers and CVS you can attack while running.
In fact the only games I find you can't cancel your dash with an attack are the SF series with dashes (3 and 4)
-
@Vans: I never "formally" contacted you because I generally posted responses to your posts or JZ's posts. I figured that would be enough, especially since I know at least JZ is a regular poster here and could probably answer as well. Plus I was never really motivated to put the system into any of my characters just because it's not something that one can just copy-paste (I'm a pretty simple coder lol)
HOWEVER if you want my help writing documentation, I wouldn't mind being the guinea pig here and trying to get this thing to work. Since you mentioned you're still in the process of fixing things, I'll wait until you've got it to an ireration you're happy with, and then I'll try to make something simple yet capable of showing how to make things work in multiple scenarios (ie: something Shoto-esque). I've got a few things I'm juggling atm but once I get more stablized there, I wouldn't mind taking a crack at it.
So yeah hit up a bruva, foo
:afro:
-
If it's not overly complicated I'd love for us to add to, document, and implement the custom buffering system to KFM. I've implemented the corner push already in some of my chars I'm making. It'll need a bit more documentation for KFM as well.
I hope to get to work on him more today but I have a pretty busy day with errands. I'll try to finish the common1 this week at the very least.
Note, if any of this stuff like corner push, juggle, and/or buffering would be better in common1 let me know that as well.
Last but not least I'd forgotten you can cancel a run with a basic in most SNK games so I'll be sure to make it so when I work on the cmd file. Which I should rename the extension of as well.
-
If it's not overly complicated I'd love for us to add to, document, and implement the custom buffering system to KFM.
I *personally* have only recommended this system to very particular coders that I consider highly proficient in CNS coding.
Also both the .cmd and .cns are affected since, based on my understanding, it changes how commands are performed, or rather how commands are detected. Maybe I'm explaining it wrong, but instead of purely using the .cmd to trigger moves based on directional inputs, you're using variables that track button inputs defined in the .cmd that in turn trigger your moves.
Basically, default is triggered by command, custom is triggered by variables triggered by commands.
-
I haven't looked at it at all yet. But like, if it's something that's tough to implement but after you implement it you need to simply add x piece of code/vars to certain parts of cns and cmd then that doesn't sound too bad and fairly simple to document. If the user has to figure out and code complicated things for each new move then it shouldn't be added. Don't want to confuse the masses.
Either way it'd be a good idea to flesh it out and document it. Whether it's for KFM or simply a code archive thing.
EDIT: Basically, default is triggered by command, custom is triggered by variables triggered by commands.
That might just be in the middle. Like maybe both examples could be given for the move. The var version commented out by default sort of explaining the alternate method if you understand it and choose to use it.
-
this is a great idea, ill be following this closely. thank you all involved..
-
http://mugenguild.com/forum/topics/kung-fu-man-remix-video-added-171806.msg2212041.html#msg2212041 (http://mugenguild.com/forum/topics/kung-fu-man-remix-video-added-171806.msg2212041.html#msg2212041)
IDK if you know about this, but maybe it's worth a look, if you want.
Also, at the risk of sounding like a broken record, but is it close to the time to announce the Graphics thread contest (IDK if it was a contest or a collab thread) for this project, or do you still need a bit more time before announcing it?
-
It doesn't have any new sprite, it's just a KFM with a gameplay similar to that of the old Infinite styled characters.
-
It doesn't have any new sprite, it's just a KFM with a gameplay similar to that of the old Infinite styled characters.
I know, it's just the base idea. But at the same time, my first edit ever. so I wonder how this will end up. :)
-
Also, at the risk of sounding like a broken record, but is it close to the time to announce the Graphics thread contest (IDK if it was a contest or a collab thread) for this project, or do you still need a bit more time before announcing it?
I will announce the contest once I get a bit more done. I got sidetracked last week working on Rikuo. Right now I'm working on *exciting secret project*. I don't think it'll consume my entire week like Rikuo did last week though :P
So the goal again for this week is to finish the common1
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
New Update
First of all:
He can't attack at all while running. The triggers in his cmd for his non-aerial attacks should be ctrl || stateno = 100.
Added as a new trigger line for all standing and crouching basics.
trigger3 = stateno = 100 ; can be done while dashing
The code below fullfills the need of having control when landing from a gethit state, And it does much more. It also reproduces the concept of Trip Guard successfully.
[state 52, Control]
type = ctrlset
trigger1 = !time
trigger1 = !(prevstateno = [600, 699])
trigger2 = time = 2 ; 2 for SNK-style, 1 for Capcom-style. Both are good options.
value = 1
[State 52, Guard]
type = changestate
trigger1 = ctrl && command = "holdback"
trigger1 = inguarddist && (prevstateno != [600, 699])
value = 120
Added. Should I put a note to remove the Guard changestate if making a KOF character?
In addition, in my opinion, stateno 40 should be invulnerable to throws. This is how commercial games tend to do.
[state 40, Vulnerability]
type = hitby
trigger1 = 1
value = SCA, NA, SA, HA, NP, SP, HP
Added
In addition again, make sure to fix a few syntax issues found in his code.
Fixed all but the .act one. I added 6 pals from KFM but it didn't fix the issue. Do they need to be a certain name too?
Question 2
;volumescale offset (negative for softer)
volume = 0
was changed to
;volumescale offset (negative for softer)
volumescale = 0
This works well here to replace volume correct? As a constant I mean. I figure yes but wanted to be sure since volume is deprecated and hey, it even says volumescale in the note!
I have serious objection about how his chain combos are handled. You know, the impossibility of cancelling crouching basics into standing basics and vice-versa, like every other fighting game with chain combos (via replacing the triggers statetype = S and statetype = C in his cmd with statetype != A. All advanced coders will agree with me.).
Fixed in all standing and crouching basics.
Mugen has a hard coded bit of behaviour if liedown time remaining is less than 10, you become completely invulnerable. I would leave it at 60, cos that doesnt' really matter, and override that state to make you get up quicker. Otherwise you make your character unhittable while down which is very very rarely intended behaviour.
You can't bypass that short of making your own lie down state, and since there is one there already, overriding it to behave differently is a better idea.
So about this quote. I noticed I didn't actually see the lie down animation in the common1 and Cyanide says it's hard coded.
So to clarify this means I need to build a totally new lie down state, yes?
Also should anything be reworded or clarified for the notes at the top of the CMD file?
Spoiler, click to toggle visibilty
; The CMD file.
;
; Two parts: 1. Command definition and 2. State entry
; (state entry is after the commands def section)
;
; 1. Command definition
; ---------------------
; Note: The commands are CASE-SENSITIVE, and so are the command names.
; The eight directions are:
; B, DB, D, DF, F, UF, U, UB (all CAPS)
; corresponding to back, down-back, down, downforward, etc.
; The six buttons are:
; a, b, c, x, y, z (all lower case)
; In default key config, abc are are the bottom, and xyz are on the
; top row. For 2 button characters, we recommend you use a and b.
; For 6 button characters, use abc for kicks and xyz for punches.
;
; Each [Command] section defines a command that you can use for
; state entry, as well as in the CNS file.
; The command section should look like:
;
; [Command]
; name = some_name
; command = the_command
; time = time (optional)
; buffer.time = time (optional)
;
; - some_name
; A name to give that command. You'll use this name to refer to
; that command in the state entry, as well as the CNS. It is case-
; sensitive (QCB_a is NOT the same as Qcb_a or QCB_A).
;
; - command
; list of buttons or directions, separated by commas. Each of these
; buttons or directions is referred to as a "symbol".
; Directions and buttons can be preceded by special characters:
; slash (/) - means the key must be held down
; egs. command = /D ;hold the down direction
; command = /DB, a ;hold down-back while you press a
; tilde (~) - to detect key releases
; egs. command = ~a ;release the a button
; command = ~D, F, a ;release down, press fwd, then a
; If you want to detect "charge moves", you can specify
; the time the key must be held down for (in game-ticks)
; egs. command = ~30a ;hold a for at least 30 ticks, then release
; dollar ($) - Direction-only: detect as 4-way
; egs. command = $D ;will detect if D, DB or DF is held
; command = $B ;will detect if B, DB or UB is held
; plus (+) - Buttons only: simultaneous press
; egs. command = a+b ;press a and b at the same time
; command = x+y+z ;press x, y and z at the same time
; greater-than (>) - means there must be no other keys pressed or released
; between the previous and the current symbol.
; egs. command = a, >~a ;press a and release it without having hit
; ;or released any other keys in between
; You can combine the symbols:
; eg. command = ~30$D, a+b ;hold D, DB or DF for 30 ticks, release,
; ;then press a and b together
;
; Note: Successive direction symbols are always expanded in a manner similar
; to this example:
; command = F, F
; is expanded when MUGEN reads it, to become equivalent to:
; command = F, >~F, >F
;
; It is recommended that for most "motion" commads, eg. quarter-circle-fwd,
; you start off with a "release direction". This makes the command easier
; to do.
;
; - time (optional)
; Time allowed to do the command, given in game-ticks. The default
; value for this is set in the [Defaults] section below. A typical
; value is 15.
;
; - buffer.time (optional)
; Time that the command will be buffered for. If the command is done
; successfully, then it will be valid for this time. The simplest
; case is to set this to 1. That means that the command is valid
; only in the same tick it is performed. With a higher value, such
; as 3 or 4, you can get a "looser" feel to the command. The result
; is that combos can become easier to do because you can perform
; the command early. Attacks just as you regain control (eg. from
; getting up) also become easier to do. The side effect of this is
; that the command is continuously asserted, so it will seem as if
; you had performed the move rapidly in succession during the valid
; time. To understand this, try setting buffer.time to 30 and hit
; a fast attack, such as KFM's light punch.
; The default value for this is set in the [Defaults] section below.
; This parameter does not affect hold-only commands (eg. /F). It
; will be assumed to be 1 for those commands.
;
; If you have two or more commands with the same name, all of them will
; work. You can use it to allow multiple motions for the same move.
;
; Some common commands examples are given below.
;
; [Command] ;Quarter circle forward + x
; name = "QCF_x"
; command = ~D, DF, F, x
;
; [Command] ;Half circle back + a
; name = "HCB_a"
; command = ~F, DF, D, DB, B, a
;
; [Command] ;Two quarter circles forward + y
; name = "2QCF_y"
; command = ~D, DF, F, D, DF, F, y
;
; [Command] ;Tap b rapidly
; name = "5b"
; command = b, b, b, b, b
; time = 30
;
; [Command] ;Charge back, then forward + z
; name = "charge_B_F_z"
; command = ~60$B, F, z
; time = 10
;
; [Command] ;Charge down, then up + c
; name = "charge_D_U_c"
; command = ~60$D, U, c
; time = 10
-
If you are still looking for some optional animations for Kung Fu Man I got some.
Here's Bee Stung:
(http://i.imgur.com/NhXCVVI.png)
Here's Dash Collision:
(http://i.imgur.com/wIIVWkw.png)
And here's the Dash Collision Logo:
(http://i.imgur.com/XgIFXlr.png)
Sorry if Dash Collision looks a little wonky. I'm not much of a spriter.
-
Why did you add a CLSN1 on the fifth frame of the normal KF Palms and on the fourth of the Fast KF Palm (the frame with the blur)? It worked right before, also the blur shows the palm still hasn't reached the enemy so it shouldn't hurt; moreover, the "swing" sound plays the frame after it if it hits the enemy.
The playsnd is right, the CLSN1 you added isn't.
I was considering using the move to show how to have certain frames play through hit pause.
For Darkstalkers at least, the blur frames usually can hit. They just do have that "play through hitpause" property JNP mentioned, meaning that even when they connect, the blur frame will only be on screen for its designated X frames before proceeding to the next frame for the rest of the hitpause. Then after the hitpause ends the animation continues from there. This means that this property does have an effect on frame data, any move that features it will have a greater advantage on hit/block than the raw animation implies.
-
No, I wasn't discussing that, because I agree with you, but just in this particular case:
(http://i1066.photobucket.com/albums/u402/GodofDeath94/Blur.png)since the palm didn't travel for enough space I wouldn't put the CLSN1 there.
In these other cases, I'm fine having the red CLSN:
(http://i1066.photobucket.com/albums/u402/GodofDeath94/Blur%202.png)(http://i1066.photobucket.com/albums/u402/GodofDeath94/Blur%203.png)
-
Ah, I see. I didn't remember exactly what the blur frame on Kung Fu Palm was like.
-
Mugen has a hard coded bit of behaviour if liedown time remaining is less than 10, you become completely invulnerable. I would leave it at 60, cos that doesnt' really matter, and override that state to make you get up quicker. Otherwise you make your character unhittable while down which is very very rarely intended behaviour.
You can't bypass that short of making your own lie down state, and since there is one there already, overriding it to behave differently is a better idea.
So about this quote. I noticed I didn't actually see the lie down animation in the common1 and Cyanide says it's hard coded.
So to clarify this means I need to build a totally new lie down state, yes?
Yeah, It also makes it so that there is no hard knockdown in MUGEN ( or was it soft knockdown? I can't remember which one it doesn't have, but I had to do this for my game.)
what you want to do is find state 5110, which is the lie down state, add a change state at the very top to another state. (Like state 5111 or something) with the except same text, since it's not an issue with the text, it's that MUGEN does something hard coded when in state 5110, so to dodge the glitches MUGEN has there make it go to another state that's identical.
So:
make copy of state 5110 in the common right under state 5110, named 5111.
add
[State 5080, 1] ;Set default anim
type = changestate
trigger1 = !time
value = 5111
to the very top of state 5110.
Problem solved.
make sure that there are no references/checks for state 5110 anywhere else and if there are replace them/ add a check to 5110 as well.
at least I think that's what you should do? smarter/more experienced people can probably tell you if this is the correct solution or if there is a better way but it's worked for me so far.
-
Basic:
Recovery Rolls like in Tekken, and essentially every damn fighting game nowadays. Power charge(I'm sure thats been mentioned already) Long jump,wall jump.
Intermediate:
XCostume., Flying,changing of voice sets via variables and the snd . Max and Custom Combo Modes,
Advanced
Transformations( was briefly mentioned)
To my knowledge most of these things havent been suggested. Probably should have read over everything more.. ( I skipped pages 3 and 4)
Following this for sure!
-
In addition again, make sure to fix a few syntax issues found in his code.
Fixed all but the .act one. I added 6 pals from KFM but it didn't fix the issue. Do they need to be a certain name too?
I'm really sorry for not knowing the answer. There's someting screwed in Elecbyte KFM's sff.
I tested Morrigan by Daniel9999999, removing all the deprecated codes. She, like KFM, doesn't have separate .act files in her folder.
And Fighter Factory stopped showing issues in her. This doesn't work with Elecbyte's KFM and I really think the problem is in his sff. Or in his.def, but more in his sff. I thought that the problem was in Fighter Factory, but it doesn't seem to be the case.
I don't have any other suggestion, except recommending you to create an empty sff (or using Fighter Factory's sff that is built up when you use one of its templates) and build a vanilla sff for him.
-
When you click on the red error "x" in FF3 it takes you to the .def file. Doubt that helps. Ugh I hope I won't need to recompile the whole sff to fix this.
-
An animation i did for BC... don't seems like hes going to complete his kfm though.
(http://puu.sh/n8HpT/f35c171f18.GIF)
reference from Ryo from fatal fury.
(http://puu.sh/n8Hqk/584f403239.GIF)
arms by itself for some shadow effects if you rike.
-
:msurprised:
-
You're welcome. told you i was gonna ask solblaze LMAO
-
Wow, that's a very nice animation.
-
A athena that I have had a very good system showing what everything was. I learned a lot from it. Every attack and move is set up like this
;------------------------------------------------------------------------------;
; 立弱P (近距離)
;------------------------------------------------------------------------------;
[Statedef 200]
type = S
movetype = A
physics = S
juggle = 1
anim = 200
ctrl = 0
velset = 0, 0
sprpriority = 1
poweradd = 25
;-------[ Sounds ]-------;
[State 200: Attack SE]
type = PlaySnd
trigger1 = AnimElem = 3
value = 4, 0
;-------[ Hit Defs ]-------;
[State 200: Hit Def, 1]
type = HitDef
trigger1 = AnimElem = 3
id = 200
attr = S, NA
hitflag = MAF
guardflag = MA
priority = 3, Hit
damage = 27, 0
animtype = Light
pausetime = 3, 4
hitsound = S5, 0
guardsound = S6, 1
sparkxy = -10, Floor(-73 * const(size.yscale))
sparkno = 0 ;S6000 + Random % 8
guard.sparkno = 41 ;S6060
ground.type = High
ground.slidetime = 11
ground.hittime = 10
ground.velocity = -3.5, 0
guard.ctrltime = 9
air.velocity = -2.5, -1.1
air.hittime = 10
fall = 0
air.fall = 1
fall.recover = 1
fall.recovertime = 10
;-------[ States ]-------;
[State 200: Standing]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
;------------------------------------------------------------------------------;
I would like KFM easy to learn from his CNS and not from a doc that explains stuff all weird.
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
make copy of state 5110 in the common right under state 5110, named 5111.
add
[State 5080, 1] ;Set default anim
type = changestate
trigger1 = !time
value = 5111
to the very top of state 5110.
Problem solved.
Spoiler: Like thise? (click to see content)
;---------------------------------------------------------------------------
; Downed get-hit (lying down)
[Statedef 5110]
type = L
movetype= H
physics = N
[State 5110, 1] ;Set default anim
type = changestate
trigger1 = !time
value = 5111
;---------------------------------------------------------------------------
; Downed get-hit (lying down)
[Statedef 5111]
type = L
movetype= H
physics = N
[State 5110, EnvShake]
type = FallEnvShake
trigger1 = Time = 0
[State 5110, 1] ;For hit up/up-diag type (from state 5081)
type = ChangeAnim
persistent = 0
trigger1 = SelfAnimExist(5110 + (anim % 10))
trigger1 = anim = [5081,5089]
value = 5110 + (anim % 10)
[State 5110, 2] ;Hit ground anim (normal)
type = ChangeAnim
triggerall = time = 0
triggerall = anim != [5110,5119] ;Not already changed anim
trigger1 = anim != [5161,5169]
trigger2 = !SelfAnimExist(5170 + (anim % 10))
value = 5170
[State 5110, 3] ;Hit ground anim (for hit up)
type = ChangeAnim
triggerall = time = 0
triggerall = anim != [5110,5119] ;Not already changed anim
trigger1 = anim = [5161,5169]
trigger1 = SelfAnimExist(5170 + (anim % 10))
value = 5170 + (anim % 10)
[State 5110, 4]
type = HitFallDamage
trigger1 = Time = 0
[State 5110, 5]
type = PosSet
trigger1 = Time = 0
y = 0
[State 5110, Var] ;Get fall velocity
type = VarSet
trigger1 = Time = 0
trigger1 = GetHitVar(fall.yvel) != 0
sysvar(1) = floor(vel y)
[State 5110, 6]
type = PlaySnd
trigger1 = Time = 0
trigger1 = !SysVar(0)
value = F7, (sysvar(1) > Const720p(20)) + (sysvar(1) > Const720p(56))
[State 5110, 7]
type = Explod
trigger1 = Time = 0
trigger1 = !SysVar(0)
anim = F(60 + (sysvar(1) > Const720p(20)) + (sysvar(1) > Const720p(56)))
pos = 0, 0
sprpriority = ifelse (sysvar(1) <= Const720p(56), -10, 10)
[State 5110, 8]
type = VelSet
trigger1 = Time = 0
y = 0
[State 5110, 9] ;For hit up type
type = ChangeAnim
persistent = 0
triggerall = anim = [5171,5179]
triggerall = SelfAnimExist(5110 + (anim % 10))
trigger1 = AnimTime = 0
trigger2 = SysVar(0) ;SysVar(0) = 1 avoids hit ground anim
value = 5110 + (anim % 10)
[State 5110, 10] ;For normal
type = ChangeAnim
persistent = 0
triggerall = Anim != [5111,5119]
trigger1 = AnimTime = 0
trigger2 = SysVar(0) ;SysVar(0) = 1 avoids hit ground frame
value = 5110
[State 5110, 11] ;If just died
type = ChangeState
triggerall = !alive
trigger1 = AnimTime = 0
trigger2 = SysVar(0) ;SysVar(0) = 1 avoids hit ground frame
trigger3 = Anim = [5110,5119]
value = 5150
[State 5110, 12]
type = VarSet
trigger1 = SysVar(0)
trigger1 = Time = 0
sysvar(0) = 0
[State 5110, 13] ;Friction
type = VelMul
trigger1 = 1
x = 0.85
[State 5110, 14] ;Friction
type = VelSet
trigger1 = abs(Vel x) < Const(movement.down.friction.threshold)
persistent = 0
x = 0
[State 5110, 15]
type = ForceFeedback
trigger1 = alive
trigger1 = Time = 0
time = 8
ampl = 240
waveform = sine
[State 5110, 16]
type = ForceFeedback
trigger1 = !alive
trigger1 = Time = 0
ampl = 200, 7, -.467
time = 30
waveform = sine
make sure that there are no references/checks for state 5110 anywhere else and if there are replace them/ add a check to 5110 as well.
at least I think that's what you should do? smarter/more experienced people can probably tell you if this is the correct solution or if there is a better way but it's worked for me so far.
Did you mean I should change the below values to 5111 instead too?
[State 5101, 7] ;Hit ground
trigger1 = Vel Y > 0
trigger1 = Pos Y >= Const(movement.down.bounce.groundlevel)
type = ChangeState
value = 5110
If you are still looking for some optional animations for Kung Fu Man I got some.
Here's Bee Stung:
(http://i.imgur.com/NhXCVVI.png)
Here's Dash Collision:
(http://i.imgur.com/wIIVWkw.png)
They look great! Added (not the text that's not part of the standard)
No, I wasn't discussing that, because I agree with you, but just in this particular case:
http://i1066.photobucket.com/albums/u402/GodofDeath94/Blur.png since the palm didn't travel for enough space I wouldn't put the CLSN1 there.
In these other cases, I'm fine having the red CLSN:
]http://i1066.photobucket.com/albums/u402/GodofDeath94/Blur%202.png
http://i1066.photobucket.com/albums/u402/GodofDeath94/Blur%203.png
Went ahead and removed that CLSN1. I'll use the blur code elsewhere.
An animation i did for BC... don't seems like hes going to complete his kfm though.
Yeah I'll find a use for this in the intermediate build for sure! This shouldn't go to waste!
A athena that I have had a very good system showing what everything was. I learned a lot from it. Every attack and move is set up like this
;-------[ Sounds ]-------;
[State 200: Attack SE]
type = PlaySnd
;-------[ Hit Defs ]-------;
[State 200: Hit Def, 1]
type = HitDef
I would like KFM easy to learn from his CNS and not from a doc that explains stuff all weird.
Thank you VERY much for the suggestion! Let me get this straight however. You'd like the parts to be labeled above each SCTRL? Like in my quoted examples?
Does that really teach better? I mean PlaySnd seems kinda obvious and so does HitDef. It kind of seems a bit redundant to label them again like this. And you still have to look at the docs to see what all the parameters you can tweak underneath are.
-
I think with different labeling it could work to keep things neatly organized, but not much purpose otherwise,
-
http://network.mugenguild.com/justnopoint/stuff/kfm.rar
Okay it's time to log what has and hasn't been done yet.
As a universal fix applied everywhere I updated all deprecated triggers in all files
air is updated but not complete
completed:
- CLSNs
- Added the PacMan sprites/info thanks to Altoiddealer
- Added 5052 Diag Up Twist anim thanks to Alex's sff
- Added 5946 HDBZ back breaker thanks to Alex's sff
- Messatsu's identifier anims
- Midnight Bliss 9020, 12000, 1200166660, 66661, 66662, 9021, 9022
- Electrocuted 7696, 9010, 9999
- HDBZ Dash Collision 950
- Bee Sting 7695
incomplete:
- The liedown face 1st and get up anim is in the sff for sprite groups 5050 as it was in Alex's sff. But I don't know where this actually needs to go, what the air group should be, or the timings and CLSN data for it. I'm not a KOF expert. Can I get more info on this one?
- He has a lot of Mortal Kombat specific animations too for fatalities? Is this something we should add since it's there? I mean there is no way we can make all the new ones but this is a lot as is.
- Collapse/Cheese Kill/Crumple
- Super Slash Collapsing/Face-down collapse
- KOF hard knockdown
- Vertical spinning
- Standing Guard Crush
- Crouching Guard Crush
- Jumping Guard Crush
- Throw Escape/Tech Hit
- Throw has been escaped out of
- Demon Transformation/Red Arremer Transformation
- Animal Transformation/Goddess Athena Transformation
- Hit by Anakaris' Pit to the Underworld/Spinning Horizontally
- Seppuku
- Burned
- Bloated Up
- Collapse while crouching
- Stagger
- 'Birdies'
- Blinded
- Royal Judgement/Retro Mutagen
- HDBZ Flip Knockout
- HDBZ Chou Kamehameha Fatality
- Wire Damage
- Choked grabbed by the neck
- Gloomy Puppet Show - Doesn't need anything custom I can add this easily
- Frozen
- HDBZ/TMNT My Toe My Toe
Anything else need to be done in the AIR file?
common1.cns is completed?
What's been changed?
- The jump bug Vans discusses here (http://www.vans.trinitymugen.net/home/mugenbug.html)
- Updated Run Forward state (http://mugenguild.com/forum/msg.2207552)
- Guard states (http://mugenguild.com/forum/msg.2207602)
- Updated Land State and Jump state (immune to throws) (http://mugenguild.com/forum/msg.2212745)
- Updated Lie Down State and added new custom LieDown (http://mugenguild.com/forum/msg.2217129)
CMD completed?
- Renamed to kfm.cyd
- Updated run to allow basics to cancel it and Updated all Standing attacks to have trigger1 = statetype != A (http://mugenguild.com/forum/msg.2212745)
completed
- Change the default friction values to be the same for both standing and crouching so combos are consistent. I'd recommend either the KOF standard, .828125 (which Vans and I use), since that's the only one we can actually get from a real game, or .85 as the Phantom.of.the.Server standard (which many people are trying to be these days).
- Liedown time, stand and crouch friction, crouch friction threshold, falldefenceup, y accel, and jump.neu (http://mugenguild.com/forum/msg.2207234)
incomplete
- Update Throws to TargetState
- KFM has a problem with Smash Kung Fu Upper that must be considered.
- Remove the OTG he has with his c.HK.
- Standardize the states for basic attacks
Anything else?
I think with different labeling it could work to keep things neatly organized, but not much purpose otherwise,
The only real thing I could think that may help is to put ugly links to MUGEN Class people would have to copy paste to even use. I don't think that labeling them will help organization much. The order the SCTRLs are in helps that.
Edit: noticed this so adding it here
If for any reason at all you leave ATTR out from the attack mugen will not throw an error message or crash. It simply continues working. Except the hitdef doesn't work. This can be quite hard to diagnose as there is no error condition.
Animtype = Up where fall = 0 is also broken. The character will automatically recover as soon as their animation is complete. No keypress required. Fall = 1 resolves this to some extent, except you must press the recovery command to get out. There is no intrinsic way to have the UP animtype allow recovery after X ticks, it is either when the animation completes, or never. You need to use state -2 and targetstate to get around this, or a custom state.
Alternatively we need to get into the common1.cns and fix up some of mugens stupid stuff and release it as a community thing.
-
How about some proper working charge moves (hold d/hold b)?
:mlol: I would love to see KFM do the Blanka roll.
-
If I haven't said this or someone hasn't said this before: there should also be a tutorial on how to program hyper ports (KoF based and PotS based) and super sparks (PotS based super sparks for advanced version of KFM).
-
I suggest the possibility to directionate the throws (Lasso) with arrow keys (check Kfs I shared).
-
You could move the KF Upper changestates (in the command file) above the KF Palm ones, to make the input easier.
Like this:
;---------------------------------------------------------------------------
;Fast Kung Fu Upper (1/3 super bar)
[State -1, Fast Kung Fu Upper]
type = ChangeState
value = 1120
triggerall = command = "upper_xy"
triggerall = power >= 330
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Light Kung Fu Upper
[State -1, Light Kung Fu Upper]
type = ChangeState
value = 1100
triggerall = command = "upper_x"
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Strong Kung Fu Upper
[State -1, Strong Kung Fu Upper]
type = ChangeState
value = 1110
triggerall = command = "upper_y"
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Fast Kung Fu Palm (1/3 super bar)
[State -1, Fast Kung Fu Palm]
type = ChangeState
value = 1020
triggerall = command = "QCF_xy"
triggerall = power >= 330
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Light Kung Fu Palm
[State -1, Light Kung Fu Palm]
type = ChangeState
value = 1000
triggerall = command = "QCF_x"
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Strong Kung Fu Palm
[State -1, Strong Kung Fu Palm]
type = ChangeState
value = 1010
triggerall = command = "QCF_y"
trigger1 = var(1) ;Use combo condition (above)
instead of this:
;---------------------------------------------------------------------------
;Fast Kung Fu Palm (1/3 super bar)
[State -1, Fast Kung Fu Palm]
type = ChangeState
value = 1020
triggerall = command = "QCF_xy"
triggerall = power >= 330
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Light Kung Fu Palm
[State -1, Light Kung Fu Palm]
type = ChangeState
value = 1000
triggerall = command = "QCF_x"
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Strong Kung Fu Palm
[State -1, Strong Kung Fu Palm]
type = ChangeState
value = 1010
triggerall = command = "QCF_y"
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Fast Kung Fu Upper (1/3 super bar)
[State -1, Fast Kung Fu Upper]
type = ChangeState
value = 1120
triggerall = command = "upper_xy"
triggerall = power >= 330
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Light Kung Fu Upper
[State -1, Light Kung Fu Upper]
type = ChangeState
value = 1100
triggerall = command = "upper_x"
trigger1 = var(1) ;Use combo condition (above)
;---------------------------------------------------------------------------
;Strong Kung Fu Upper
[State -1, Strong Kung Fu Upper]
type = ChangeState
value = 1110
triggerall = command = "upper_y"
trigger1 = var(1) ;Use combo condition (above)
-
RESURRECTION
I need to hurry and release this soon
What else should be added? I'll get back to adding optional animation standards but it won't be on the 1st release. I'll add them in updates
I want to discuss the Juggle System. Which would be a better replacement to the default but keep the concept of the default?
Should I completely mimic the default by having a var that counts down from 15? And if you don't have enough points you miss?
Or should I count UP to allow more variety and control?
Counting up would look like this
This is in my attacks
[State 0, VarAdd]
type = VarAdd
trigger1 = MoveHit = 1
trigger1 = P2StateType = A
var(18) = 7; adjust to determine how many juggle points it should have
Hitdef
type = HitDef
triggerall = Var(18) <= 15; adjust for how many points it'll allow
place the below in your -2 so the var resets when P2 is no longer in hit state
[State -2, VarSet]
type = VarSet
trigger1 = P2MoveType != H
var(18) = 0
to apply to helpers remember to do this
This is in my attacks
[State 0, ParentVarAdd]
type = ParentVarAdd
trigger1 = MoveHit = 1
trigger1 = P2StateType = A
var(18) = 7; adjust to determine how many juggle points it should have
Hitdef
type = HitDef
triggerall = root,Var(18) <= 15; adjust for how many points it'll allow
More things I need to alter:
-Remove all instances of p1stateno and p2stateno from hitdef replacing with changestate and targetstate for better compatibility with hitoverride
-Add a projectile
-Add Vans's reflection standard @Vans: finish your tutorial so I can place it inside KFM!!!
-Add a charge move
Should I add the simple reverse command fix? (http://mugenguild.com/forum/topics/correcting-reversed-commands-characters-176614.0.html)
-
More things I need to alter:
-Remove all instances of p1stateno and p2stateno from hitdef replacing with changestate and targetstate for better compatibility with hitoverride
I might be wrong, but I think I remember reading it said by one or more experienced coders that p2stateno is better used for certain scenarios, and targetstate for others.
-
From my experience the only time you should use p2stateno is if you already have them locked into a throw state
-
Animation 5170 glitch (tested on Mugen 1.0)
Sometimes Mugen doesn't want to play the animation 5170. How to recreate the glitch: - try to guard an aerial attack (either basic, or special or super) while you're in air; you don't have to guard the attack (the move doesn't have to connect), but just go into one of those states; - now get hit by an attack that makes you fall on the ground. You don't have to jump for this to happen. (no, it's not because the c.HK has a Trip function, it happens with many other attacks that make the enemy fall)
Et voilà! There's a bug! Here's a video showing it. (if you can't follow what I'm doing, the video's description might help you)
You have to code every custom state in all the attacks in order to not have this problem (eg Felineki's Akuma). | [youtube]https://www.youtube.com/watch?v=RI6p0-ZHv_k[/youtube] |
as long as you're not using Sysvar(0) for anything else, but you also need to account for the fact that also these states are statetype = L, so I'd say to err on safety
[State -2, System Variable Set]
type = VarSet
trigger1 = StateType = S || Statetype = C
sysvar(0) = 0
ignorehitpause = 1
persistent = 0
-
If your updating kfm will you include the fixes to the common1 vans discovered?
-
Already applied
-
Huh, I forgot all about this project. Here's hoping to see a fixed and updated KFM. I don't know too much about coding myself, but I look forward to this ^..^
-
I am not really in a hurry to finish writing. All the code is already commented and available.
It takes a giant toll on me to ask me to write tutorials when I already take great care in commenting my code.
-
Okay, I'll just add the code as is then. Just figured since you were already making the tutorial I could use that instead since it goes a bit more in depth teaching. Which is what KFM is for.
If/when you update the tutorial I'll simply update KFM with the new info then.
-
Just a suggestion: adding localcoord separated .defs would be a good idea too.
The big 3 would be: 320, 240 for 320x240/640x480
427,240 for 427x240/854x480
426.66,320.25 for 1280x720/1920x1080
Depending on how thorough you guys want to be, the separate localcoord .defs could even point to separate .airs that use ,,scale.x,scale.y sprite scaling parameters or .cns with relevant scaling values for correcting effect scaling errors in widescreen localcoord scenarios - this would be a huge help for alot of creators wanting to start making widesceen/zoom compatible chars
-
I would need assistance there as I know nothing about using localcord and zoom stuff yet. Also it'd need to be done in a non confusing way. Don't want to over bloat the learning char.
-
nice idea, i will like to try it when u release
-
Here's the projectile code.
Any suggestions or corrections? If not I'll add the reflection code.
;---------------------------------------------------------------------------
; Board Throw
; CNS difficulty: easy
[Statedef 1500]
type = S
movetype= A
physics = S
poweradd= 60
velset = 0,0
anim = 1500
ctrl = 0
sprpriority = 2
[State 1030, Button Detect]
type = VarSet
trigger1 = !Time && !AILevel
var(2) = cond((command = "Board Throwx"), 0, 1);this sets the var depending on button pressed when using the move
[State 0, Helper]
type = Helper
trigger1 = AnimElem = 3
name = "Board"
ID = 1510
stateno = 1510
pos = 20,-60
postype = p1 ;p2,front,back,left,right
facing = 1
ownpal = 1
[State 1420, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
;---------------------------------------------------------------------------
; Board Projectile Helper
; CNS difficulty: hard
[Statedef 1510]
type = A
movetype= A
physics = N
;juggle = 6 Note that if you actually use juggle points for the helper they will only add to the helper's juggle points. Not the root's (KFM's)
anim = 1510
ctrl = 0
sprpriority = 5
hitcountpersist = 1
movehitpersist = 1
;IF this was a fireball you would use this. As a piece of wood we will allow it to cast a shadow
;[State 1061, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
;ignorehitpause = 1
[State 1050, Button Detect]
type = VarSet
trigger1= !Time && !PrevStateNo
var(2) = Root, var(2) ;sets the helper var to be the same as the root's var
[State 1033, VelSet]
type = VelSet
trigger1 = Time >= 0
x = Cond(var(2) = 1, 6,3) ;If Var(2) is 1 then this moves faster, if not 1 it moves slower
y = 0
[State 1061, Velocity]
type = VelSet
trigger1 = Movecontact ;stop moving when the board connects
x = 0
y = 0
[State 1061, NotHitBy]
type = NotHitBy
trigger1 = Time >= 0
time = 1
value = SCA, NA, SA, HA, NT, ST, HT ; The helper can't be hit by anything except Projectiles
ignorehitpause = 1
[State 1061, HitBy]
type = HitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP ; Only Projectiles will hit. This allows other projectiles to destroy this one
time = 1
ignorehitpause = 1
[State 1061, HitOverride]
type = HitOverride
trigger1 = Time >= 0
slot = 1
time = 1
stateno = 1511 ; when hit the Projectile will go to this state. It's destroyed state
attr = SCA, AA, AP, AT
ignorehitpause = 1
[State 1061, Hitdef]
type = HitDef
trigger1 = AnimElem = 1
attr = A, SP ; VERY IMPORTANT always remember to set your attr to NP, SP, or HP (Normal, Special, Hyper Projectile)
animtype = hard
damage = ceil(ifElse(root,fvar(11) * 20 < 7, 7, root,fvar(11) * 20)), 0
priority = 4,Hit
guardflag = MA
hitflag = MAF
pausetime = 0,10
sparkxy = 0,0
hitsound = 5,2
guardsound = 6,0
ground.type = high
air.type = low
ground.slidetime = 16 ;20
ground.hittime = 16 ;20
ground.velocity = -7.8,0
guard.velocity = -7.5
air.velocity = -5.8,-3
airguard.velocity = -5, -4
envshake.time = 5
envshake.ampl = 4
envshake.freq = 176
fall.envshake.time = 10
fall.envshake.ampl = 4
fall.envshake.freq = 176
yaccel = 0.5
air.fall = 0
fall.recover = 1
ground.cornerpush.veloff = 0
air.cornerpush.veloff = 0
down.cornerpush.veloff = 0
airguard.cornerpush.veloff = 0
guard.cornerpush.veloff = 0
getpower = cond(p2movetype=H,40,140), 10 ; if P2 already in a hit state you get less power from hitting them
givepower = 35,35
[State 3001, Guardshake]
type = envshake
trigger1 = moveguarded
time = 4
ampl = 6
freq = 176
ignorehitpause = 1
[State 1061, Fade]
type = changestate
trigger1 = movecontact ;destroyed state
value = 1511
ignorehitpause=1
;---------------------------------------------------------------------------
; DESTROY Board Projectile Helper
; CNS difficulty: hard
[Statedef 1511]
type = A
movetype= A
physics = N
anim = 1511
ctrl = 0
sprpriority = 5
;[State 1002, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
[State 191, Snd 1]
type = PlaySnd
trigger1 = !Time
value = F5,2
volumescale = -40
[State 0, DestroySelf]
type = DestroySelf
trigger1 = p2movetype != H
trigger1 = time >= 27 ;This destroys the projectile when time = 27 which is the end of the board break animation. But ONLY when P2 is NOT in a hit state. While in a hit state this will stay on the final frame so any hits that follow will add to the combo counter
Also this will be a charge command to show the best way to code charge commands.
Is this the best way to code them?
http://mugenguild.com/forum/topics/charge-characters-and-vars-the-struggle-178606.msg2330964.html;topicseen#msg2330964
-
Hey I got it!
It wasn't as easy to follow as you suggested @Vans: The tutorial REALLY helped me understand the projectile part. But I had to reverse engineer a lot of the reflector helper. You should label the states in Japanese and english to avoid confusion. Also there is a ton of Athena specific code littered in the reflector code and not all is labeled what is actually needed and what is Athena specific.
I still have to comb through this and remove some Athena specific stuff and maybe add some KFM specific things. I also still need to clarify what some of this is, why it is here, and what it does exactly. In it's current form many people won't understand how to use this.
Any assistance would be welcomed.
I'll tag @JMorphMan: @JesusZilla: and @Kamekaze: because I think all of you have used this method and may be able to help as well.
Here's the code:
Spoiler, click to toggle visibilty
;---------------------------------------------------------------------------
; Light Kung Fu Zankou
; CNS difficulty: easy
[Statedef 1400]
type = S
movetype= A
physics = N
juggle = 4
poweradd= 50
velset = 0,0
anim = 1400
ctrl = 0
sprpriority = 2
[State 1400, 1]
type = PlaySnd
trigger1 = AnimElem = 3
value = 0, 3
[State 1400, Friction]
type = VelMul
trigger1 = 1
x = 0.5
[State 1000: Helper]
type = helper
trigger1 = !NumHelper(1435)
trigger1 = AnimElem = 4
id = 1435
pos = 0,0 ;50
postype = p1
facing = 1
stateno = 1435
keyctrl = 0
ownpal = 1
supermovetime = 0
pausemovetime = 0
persistent = 0
[State 1400, 2]
type = HitDef
trigger1 = Time = 0
attr = S, SA
animtype = Hard
damage = 100, 6
priority = 4
guardflag = MA
pausetime = 12,12
sparkxy = 0,-65
hitsound = 5,3
guardsound = 6,0
ground.type = Low
ground.slidetime = 12
ground.hittime = 17
ground.velocity = -9
ground.cornerpush.veloff = -15 ;To push far away when p2 is in corner
guard.velocity = -9
air.velocity = -2,-5
airguard.velocity = -3.5,-4.5
air.fall = 1
[State 1400, 3]
type = PosAdd
trigger1 = AnimElem = 2
trigger2 = AnimElem = 3
trigger3 = AnimElem = 4
x = 10
[State 1400, 4]
type = VelSet
trigger1 = AnimElem = 4
x = 2
[State 1400, 5]
type = PosAdd
trigger1 = AnimElem = 8
x = 10
[State 1400, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
;---------------------------------------------------------------------------
; Strong Kung Fu Zankou
; CNS difficulty: easy
[Statedef 1410]
type = S
movetype= A
physics = N
juggle = 4
poweradd= 50
velset = 0,0
anim = 1410
ctrl = 0
sprpriority = 2
[State 1410, 1]
type = PlaySnd
trigger1 = AnimElem = 3
value = 0, 3
[State 1410, Friction]
type = VelMul
trigger1 = 1
x = 0.65
[State 1000: Helper]
type = helper
trigger1 = !NumHelper(1435)
trigger1 = AnimElem = 4
id = 1435
pos = 0,0 ;50
postype = p1
facing = 1
stateno = 1435
keyctrl = 0
ownpal = 1
supermovetime = 0
pausemovetime = 0
persistent = 0
[State 1410, 2]
type = HitDef
trigger1 = Time = 0
attr = S, SA
animtype = Hard
damage = 100, 6
priority = 4
guardflag = MA
pausetime = 12,12
sparkxy = 0,-65
hitsound = 5,3
guardsound = 6,0
ground.type = Low
ground.slidetime = 12
ground.hittime = 17
ground.velocity = -9
ground.cornerpush.veloff = -15 ;To push far away when p2 is in corner
guard.velocity = -9
air.velocity = -2,-5
airguard.velocity = -3.5,-4.5
air.fall = 1
[State 1410, 3]
type = PosAdd
trigger1 = AnimElem = 2
trigger2 = AnimElem = 3
trigger3 = AnimElem = 4
x = 10
[State 1410, 4]
type = VelSet
trigger1 = AnimElem = 3
x = 8
[State 1410, 5]
type = PosAdd
trigger1 = AnimElem = 9
x = 10
[State 1410, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
;---------------------------------------------------------------------------
; Far Kung Fu Zankou
; CNS difficulty: easy
[Statedef 1420]
type = S
movetype= A
physics = N
juggle = 6
poweradd= -330
velset = 0,0
anim = 1420
ctrl = 0
sprpriority = 2
[State 1420, Afterimage]
type = AfterImage
trigger1 = Time = 0
length = 13
PalBright = 30, 30, 0
PalContrast = 70, 70, 20
PalAdd = -10,-10,-10
PalMul = .85,.85,.50
TimeGap = 1
FrameGap = 2
Trans = Add
time = 2
[State 1420, Afterimage]
type = AfterImageTime
trigger1 = AnimElemTime(8) < 0
time = 2
[State 1420, Blink Yellow]
type = PalFX
trigger1 = Time = 0
time = 20
add = 32,16,0
sinadd = 64,32,5,3
[State 1000: Helper]
type = helper
trigger1 = !NumHelper(1435)
trigger1 = AnimElem = 4
id = 1435
pos = 0,0 ;50
postype = p1
facing = 1
stateno = 1435
keyctrl = 0
ownpal = 1
supermovetime = 0
pausemovetime = 0
persistent = 0
[State 1420, 1]
type = PlaySnd
trigger1 = AnimElem = 3
value = 0, 3
[State 1420, Friction]
type = VelMul
trigger1 = 1
x = 0.7
[State 1420, 2]
type = HitDef
trigger1 = AnimElemTime(4) = -2
attr = S, SA
animtype = Hard
damage = 25, 2
getpower = 0
priority = 4
guardflag = MA
pausetime = 9,9
sparkxy = -15,-45
hitsound = 5,2
guardsound = 6,0
ground.type = Low
ground.slidetime = 22
ground.hittime = 24
ground.velocity = -7
ground.cornerpush.veloff = -8 ;To push far away when p2 is in corner
guard.velocity = -9
air.velocity = -5,-4
airguard.velocity = -3.5,-4.5
[State 1420, 2]
type = HitDef
trigger1 = AnimElem = 4
attr = S, SA
animtype = Hard
damage = 100, 8
getpower = 0
priority = 5
guardflag = MA
pausetime = 12,12
sparkxy = 0,-65
hitsound = 5,3
guardsound = 6,0
ground.type = Low
ground.slidetime = 22
ground.hittime = 24
ground.velocity = -5,-4
ground.cornerpush.veloff = -15 ;To push far away when p2 is in corner
guard.velocity = -9
air.velocity = -5,-4
airguard.velocity = -3.5,-4.5
fall = 1
[State 1420, 3]
type = PosAdd
trigger1 = AnimElem = 2
trigger2 = AnimElem = 3
trigger3 = AnimElem = 4
x = 10
[State 1420, 4]
type = VelSet
trigger1 = AnimElemTime(3) = [1,2]
x = 20
[State 1420, 5]
type = PosAdd
trigger1 = AnimElem = 10
x = 10
[State 1420, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
;---------------------------------------------------------------------------
;Reflector Helper
[Statedef 1435]
type = S
movetype = A
physics = N
ctrl = 0
velset = 0, 0
anim = 1430
sprpriority = 4
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで ;
;sysvar(0) = 262144 ;
;=======================================;
[State 1430, COMPATIBILITY]
type = VarSet
trigger1 = !time && !prevstateno
sysvar(0) = 262144
;=======================================;
[State 1301, REFLECTOR]
type = ReversalDef
trigger1 = time = 0
reversal.attr = SCA,NP,SP,HP
pausetime = 0,0
sparkno = -1
sparkxy = 0,0
p1stateno = stateno+1
p2stateno = stateno+2
id = 1435
numhits = 0
[State 1000, projs only]
type = HitBy
trigger1 = 1
value = SCA, NP, SP, HP
ignorehitpause = 1
[State 10012, override]
type = HitOverride
trigger1 = !time
attr = SCA, AA, AP, AT
stateno = stateno+1
time = -1
ignorehitpause = 1
[State 10005]
type = BindToParent
trigger1 = 1
pos = 0,0
ignorehitpause = 1
[State 7001, Assert]
type = AssertSpecial
trigger1 = 1
flag = noshadow
ignorehitpause = 1
[State 1000, DestroySelf]
type = DestroySelf
trigger1 = root, StateNo = [1400,1420]
trigger1 = root, AnimElemTime(5) >=0
trigger2 = root, MoveType = H
;---------------------------
;Successful Reflection
[Statedef 1436]
type = S
movetype = I
physics = N
ctrl = 0
velset = 0, 0
anim = 1
sprpriority = 4
[State 1205, VarSet]
type = VarSet
trigger1 = numtarget
var(0) = target,ID
persistent = 0
ignorehitpause = 1
[State -2, DEBUG]
type = DisplayToClipboard
trigger1 = 1
text = "var(0) = %d proj = %d ID = %d";Buff = %d GNDTYPE = %d"
params = var(0),numprojid(262144),gethitvar(chainid)
ignorehitpause = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで ;
;sysvar(0) = 262144 ;
;sysvar(1) = SPECIAL ;
;=======================================;
[State 106, VarSet]
type = VarSet
;RETURNING YOUR OWN PROJECTILE
;自分の飛び道具を跳ね返す。
trigger1 = Gethitvar(chainid)&2**17
sysvar(1) = sysvar(0)
[State 1206, ChangeState]
type = ChangeState
trigger1 = PlayerIDExist(var(0))
trigger1 = (PlayerID(var(0)),sysvar(0)=131072)
;RETURNING YOUR OWN PROJECTILE
;自分の飛び道具を跳ね返す。
trigger2 = Gethitvar(chainid)&2**17
value = 1441
ctrl = 0
;=======================================;
[State 1000, DestroySelf]
type = DestroySelf
trigger1 = time = 30
;---------------------------
;Reflecting A Helper projectile
[Statedef 1437]
physics = N
movetype = I
ctrl = 0
[State -2, DEBUG]
type = DisplayToClipboard
trigger1 = 1
text = "sysvar(0) = %d pao pao cafe = %d";Buff = %d GNDTYPE = %d"
params = sysvar(0),sysvar(0)&2**17
ignorehitpause = 1
[State 1580]
type = SelfState
trigger1 = sysvar(0)&2**17
value = sysvar(1)
ctrl = 0
[State 1580]
type = DestroySelf
trigger1 = IsHelper
trigger1 = time = 5
ignorehitpause = 1
[State 1580]
type = SelfState
trigger1 = !IsHelper
value = 0
ctrl = 1
[State 811, Anim]
Type = ChangeAnim2
Trigger1 = !Time
Value = 1
;---------------------------
;Special Reflection
[Statedef 1441]
type = S
movetype = A
physics = N
ctrl = 0
velset = 0, 0
sprpriority = 4
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで ;
;sysvar(0) = 262144 ;
;=======================================;
[State 1000, INFORMATION SHARING] ;
type = Projectile ;
trigger1 = sysvar(1)&2**18 ;
projid = sysvar(0) ;
projanim = 1 ;
projhitanim = -1 ;
projremanim = -1 ;
projremovetime = 2 ;
projscale = 0,0 ;
projpriority = 0 ;
velocity = 0,0 ;
postype = p1 ;
offset = 0,0 ;
persistent = 0 ;
ignorehitpause = 1 ;
;=======================================;
[State 1000, ChangeAnim]
type = ChangeAnim
trigger1 = !time
value = 1
[State 1211, StateTypeSet]
type = StateTypeSet
trigger1 = root,movetype = H
trigger2 = cond(PlayerIDExist(var(0)),(PlayerID(var(0)),movetype=I),0)
movetype = I ;I,A,H
[State 200, Punch Attempt Sound]
type = Playsnd
trigger1 = !time
value = 4,3
channel = 3
persistent = 0
[State 1211, PosSet]
type = PosSet
trigger1 = !time || time
trigger1 = PlayerIDExist(var(0))
x = PlayerID(var(0)),Pos X
y = PlayerID(var(0)),Pos Y
[State 1000, DestroySelf]
type = DestroySelf
trigger1 = time > 2
trigger1 = !PlayerIDExist(var(0))
;---------------------------------------------------------------------------
; Board Throw
; CNS difficulty: easy
[Statedef 1500]
type = S
movetype= A
physics = S
poweradd= 60
velset = 0,0
anim = 1500
ctrl = 0
sprpriority = 2
[State 1030, Button Detect]
type = VarSet
trigger1 = !Time && !AILevel
var(2) = cond((command = "Board Throwx"), 0, 1);this sets the var depending on button pressed when using the move
[State 0, Helper]
type = Helper
trigger1 = AnimElem = 3
name = "Board"
ID = 1510
stateno = 1510
pos = 20,-60
postype = p1 ;p2,front,back,left,right
facing = 1
ownpal = 1
[State 1420, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
;---------------------------------------------------------------------------
; Board Projectile Helper
; CNS difficulty: hard
[Statedef 1510]
type = A
movetype= A
physics = N
;juggle = 6 Note that if you actually use juggle points for the helper they will only add to the helper's juggle points. Not the root's (KFM's)
anim = 1510
ctrl = 0
sprpriority = 5
hitcountpersist = 1
movehitpersist = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;=======================================;
[State 1005, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1005, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = 1520 ; use the stateno your reflected projectile is located at
;=======================================;
;IF this was a fireball you would use this. As a piece of wood we will allow it to cast a shadow
;[State 1061, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
;ignorehitpause = 1
[State 1050, Button Detect]
type = VarSet
trigger1= !Time && !PrevStateNo
var(2) = Root, var(2) ;sets the helper var to be the same as the root's var
[State 1033, VelSet]
type = VelSet
trigger1 = Time >= 0
x = Cond(var(2) = 1, 6,3) ;If Var(2) is 1 then this moves faster, if not 1 it moves slower
y = 0
[State 1061, Velocity]
type = VelSet
trigger1 = Movecontact ;stop moving when the board connects
x = 0
y = 0
[State 1061, NotHitBy]
type = NotHitBy
trigger1 = Time >= 0
time = 1
value = SCA, NA, SA, HA, NT, ST, HT ; The helper can't be hit by anything except Projectiles
ignorehitpause = 1
[State 1061, HitBy]
type = HitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP ; Only Projectiles will hit. This allows other projectiles to destroy this one
time = 1
ignorehitpause = 1
[State 1061, HitOverride]
type = HitOverride
trigger1 = Time >= 0
slot = 1
time = 1
stateno = 1511 ; when hit the Projectile will go to this state. It's destroyed state
attr = SCA, AA, AP, AT
ignorehitpause = 1
[State 1061, Hitdef]
type = HitDef
trigger1 = AnimElem = 1
id = 1510 ;set as same as stateno
attr = A, SP ; VERY IMPORTANT always remember to set your attr to NP, SP, or HP (Normal, Special, Hyper Projectile)
animtype = hard
damage = ceil(ifElse(root,fvar(11) * 20 < 7, 7, root,fvar(11) * 20)), 0
priority = 4,Hit
guardflag = MA
hitflag = MAF
pausetime = 0,10
sparkxy = 0,0
hitsound = 5,2
guardsound = 6,0
ground.type = high
air.type = low
ground.slidetime = 16 ;20
ground.hittime = 16 ;20
ground.velocity = -7.8,0
guard.velocity = -7.5
air.velocity = -5.8,-3
airguard.velocity = -5, -4
envshake.time = 5
envshake.ampl = 4
envshake.freq = 176
fall.envshake.time = 10
fall.envshake.ampl = 4
fall.envshake.freq = 176
yaccel = 0.5
air.fall = 0
fall.recover = 1
ground.cornerpush.veloff = 0
air.cornerpush.veloff = 0
down.cornerpush.veloff = 0
airguard.cornerpush.veloff = 0
guard.cornerpush.veloff = 0
getpower = cond(p2movetype=H,40,140), 10 ; if P2 already in a hit state you get less power from hitting them
givepower = 35,35
[State 3001, Guardshake]
type = envshake
trigger1 = moveguarded
time = 4
ampl = 6
freq = 176
ignorehitpause = 1
[State 1061, Fade]
type = changestate
trigger1 = movecontact ;destroyed state
value = 1511
ignorehitpause=1
;---------------------------------------------------------------------------
; DESTROY Board Projectile Helper
; CNS difficulty: easy
[Statedef 1511]
type = A
movetype= A
physics = N
anim = 1511
ctrl = 0
sprpriority = 5
;[State 1002, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
[State 191, Snd 1]
type = PlaySnd
trigger1 = !Time
value = F5,2
volumescale = -40
[State 0, DestroySelf]
type = DestroySelf
trigger1 = p2movetype != H
trigger1 = time >= 27 ;This destroys the projectile when time = 27 which is the end of the board break animation. But ONLY when P2 is NOT in a hit state. While in a hit state this will stay on the final frame so any hits that follow will add to the combo counter
;---------------------------------------------------------------------------
; REFLECTED Board Projectile Helper
; CNS difficulty: hard
[Statedef 1520]
type = A
movetype= A
physics = N
;juggle = 6 Note that if you actually use juggle points for the helper they will only add to the helper's juggle points. Not the root's (KFM's)
anim = 1510
ctrl = 0
sprpriority = 5
hitcountpersist = 1
movehitpersist = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;=======================================;
[State 1005, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1005, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = 1510 ; Use the StateNo you use to fire your projectile
;=======================================;
[State 1007, Turn];turn the projectile around
type = Turn
trigger1 = !time
;IF this was a fireball you would use this. As a piece of wood we will allow it to cast a shadow
;[State 1061, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
;ignorehitpause = 1
[State 1033, VelSet]
type = VelSet
trigger1 = Time >= 0
x = Cond(var(2) = 1, 6,3) ;If Var(2) is 1 then this moves faster, if not 1 it moves slower
y = 0
[State 1061, Velocity]
type = VelSet
trigger1 = Movecontact ;stop moving when the board connects
x = 0
y = 0
[State 1061, NotHitBy]
type = NotHitBy
trigger1 = Time >= 0
time = 1
value = SCA, NA, SA, HA, NT, ST, HT ; The helper can't be hit by anything except Projectiles
ignorehitpause = 1
[State 1061, HitBy]
type = HitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP ; Only Projectiles will hit. This allows other projectiles to destroy this one
time = 1
ignorehitpause = 1
[State 1061, HitOverride]
type = HitOverride
trigger1 = Time >= 0
slot = 1
time = 1
stateno = 1511 ; when hit the Projectile will go to this state. It's destroyed state
attr = SCA, AA, AP, AT
ignorehitpause = 1
[State 1061, Hitdef]
type = HitDef
trigger1 = AnimElem = 1
affectteam = F ; This makes the projectile hurt your own team/char
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;=======================================;
id = sysvar(0)
;=======================================;
attr = A, SP ; VERY IMPORTANT always remember to set your attr to NP, SP, or HP (Normal, Special, Hyper Projectile)
animtype = hard
damage = ceil(ifElse(root,fvar(11) * 20 < 7, 7, root,fvar(11) * 20)), 0
priority = 4,Hit
guardflag = MA
hitflag = MAF
pausetime = 0,10
sparkxy = 0,0
hitsound = 5,2
guardsound = 6,0
ground.type = high
air.type = low
ground.slidetime = 16 ;20
ground.hittime = 16 ;20
ground.velocity = -7.8,0
guard.velocity = -7.5
air.velocity = -5.8,-3
airguard.velocity = -5, -4
envshake.time = 5
envshake.ampl = 4
envshake.freq = 176
fall.envshake.time = 10
fall.envshake.ampl = 4
fall.envshake.freq = 176
yaccel = 0.5
air.fall = 0
fall.recover = 1
ground.cornerpush.veloff = 0
air.cornerpush.veloff = 0
down.cornerpush.veloff = 0
airguard.cornerpush.veloff = 0
guard.cornerpush.veloff = 0
getpower = cond(p2movetype=H,40,140), 10 ; if P2 already in a hit state you get less power from hitting them
givepower = 35,35
[State 3001, Guardshake]
type = envshake
trigger1 = moveguarded
time = 4
ampl = 6
freq = 176
ignorehitpause = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで;
;sysvar(0) = 262144 ;
;=======================================;
[State 1007, Turn]
type = Turn
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
persistent = 0
ignorehitpause = 1
[State 1206, ChangeState]
type = ChangeState
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
value = sysvar(1)
ctrl = 0
ignorehitpause = 1
;=======================================;
[State 1061, Fade]
type = changestate
trigger1 = movecontact ;destroyed state
value = 1511
ignorehitpause=1
-
I didn't need to remake anything he had lol. I copy pasted it and changed one state no because my shredder has a built in stun system. Otherwise I could have left it as it was and thus far it's worked fine. Not sure what happened with your implementation to cause you to re-write a few things. I'm at work atm so I'll investigate what you wrote later on.
-
My states are labeled, man. Every single piece that belongs to the reflector and the projectiles are labeled and are designed to be copied and pasted.
If you see an afterimage, then yeah, it probably does not belong to the reflector.
My code is far less "littered" than ANYTHING Phantom.of.the.Server ever coded and people have no issues copying the code there. Don't be so dramatic.
-
Vans' reflector, when removing comments, is like 3 SCTRLs and one line in a HitDef. What is so hard to understand?
-
Note that I also changed some stuff since this uses a physical attack to reflect and not a projectile/energy shield. I may should note the removed states since this method will be used far less than a shield type.
Mostly it was vars. The juggle limiter stuff was pretty obvious. I'm trying to keep vars to as much of minimum as I can for teaching purposes.
I also need to note what to do to make the fireball not reflect at all.
Ninja edit:
No it's not all labeled
;---------------------------
;消えろ
[Statedef 1208]
That did not tell me WHAT the state is. I had to look at the code and anim info. Not a big deal but it does take more time than simply saying it's the kill reflector anim.
I'm not being dramatic, I haven't done this stuff as long as you so it takes longer. There are 13 states in the reflector alone. It looks like this in FF3
(http://justnopoint.com/mugen/guild/whu.png)
I'm legit trying to help this be implemented so more people can use it. I apologize that I am not as talented but if I'm having trouble then so would many others. I figured you guys would be able to add more notes to this for clarity. But you don't have to. I was just trying to work together so we have correct and well worded notes. It'll get done either way. I just trusted you guys more with it than me is all.
-
I don't know how you got 13. when I implemented it in my shredder there was 4. If you want to download it and see its 1004,10041,1002 and 1006. mine is stripped of anything athena used, which was only the afterimage tbh.
1004 - state with reversal
10041- state of reflected projectile that is redirected to own selfstate handling reflectiong
1002- state helper goes to after reversal (1004)
1006 - override incase of not helper based projectile.
-
I didn't implement all of them. And I counted the actual state that makes the helper. 1200-1240 (or was it just through 1211 and I'm getting it mixed up with fireball states, looking again that may be it) are all reflector states in Athena. I got it down to 5
;---------------------------
;飛び道具
[Statedef 1209]
The above is the only japanese only state I still have. Looking into it I didn't need it either. It was for Athena's fireball. Okay so now I know the only states needed had the English and Japanese names. I'll remove that state from my KFM as it's useless and it'll make it a lot clearer.
That was my main source of confusion. All those states being mixed in together and I couldn't read the labels. Thank you that helped it a ton on it's own!
-
State 1205 is the reflector itself, the object that clashes with projectiles.
State 1206 is the state the reflector goes to when it comes into contact with a projectile.
This state uses a dummy animation, so the actual "fade out" effect is spawned as an extra helper.
State 1207 is a custom state that checks if the reflected projectile is compatible, and if it is, it sends them to the appropriate behavior.
State 1208 is a fade out animation used for the reflector.
State 1209 is a fake projectile in the reflector when it is reflecting a non-compatible projectile. This is the old reflector implementation.
State 1210 is the fade out animation for projectile 1209.
State 1211 is a special required state for the reflector that prevents guarding bugs.
I am still preparing a more detailed writeup, because a tutorial for writing a reflector requires a tutorial on how to write an old reflector first and nobody really wrote a tutorial for that. I'm not entirely sure if you have attempted to write one, but I'm guessing it is not the case.
Note that I also changed some stuff since this uses a physical attack to reflect and not a projectile/energy shield. I may should note the removed states since this method will be used far less than a shield type.
Correct, you're trying to do something different without having studied the code beforehand. This in itself adds a layer of difficulty.
Ninja edit:
No it's not all labeled
;---------------------------
;消えろ
[Statedef 1208]
That did not tell me WHAT the state is. I had to look at the code and anim info. Not a big deal but it does take more time than simply saying it's the kill reflector anim.
That's what we all do when we're coding something? Also, that state has a label x3
I'm legit trying to help this be implemented so more people can use it. I apologize that I am not as talented but if I'm having trouble then so would many others. I figured you guys would be able to add more notes to this for clarity. But you don't have to. I was just trying to work together so we have correct and well worded notes. It'll get done either way. I just trusted you guys more with it than me is all.
It took you a couple of hours to look at the logic and understand it, while it took me exactly 3 full weeks (over months) to solve the reflector problem. I would say that my code was a big success in this case!
Cut me a little slack here, if you go around publicly saying my code is cluttered people will think it really is horrible when it's the exact opposite, I design it so you can copy and paste it. I don't have a ton of free time as I did before to be active as I would wish to writing notes and info and help in addition to the time I spend solving the problems and giving it to other people.
It takes a long time man, and it takes long time to bring it down to essentials.
Try to see it from my point of view. I was just sitting trying to study for an article I have to write for college and then I see someone with a big voice calling my code unreadable. :/
-
I do apologize for that. From my POV I thought you guys were making fun of me for having difficulties. I promise you I am VERY happy with all the work you put in. It took a bit but I got it working and it works fantastically! You really brought something great to the table with this.
And I totally understand NOT having time to make tutorials. How often do I keep saying I'm going to add to MUGEN Class and it's MUCH simpler to add to.
So I was in the wrong with how I came off. The issue that got us clashing here I suppose was mostly the wording when you said that it's all coded and noted well. Which, yes it is. It really is. I just don't know japanese so I didn't know those states were not needed since they were all mixed in. I totally missed that one of the states I kept wasn't even accessed in my code. It had by far the bulk of Athena specific stuff I thought I'd have to clean up :P
Thank you for your time. If you like I can do the typical reflector code tutorial for you. Had to code one in Piccolo, Gotenks and now in KFM so I know how they work in the old and new way.
-
(http://justnopoint.com/mugen/guild/whu.png)
Thats really uneeded, why putting only japanese names on stuff? Whats the reasoning behind making code less readable by everyone? at most it could have both english and japanese.
This wouldnt pass on Unit testing anywhere.
Wasnt the point of this to be a simple tutorial character? I dont see how anyone would assume only the english ones were important when the whole thing is filled with japanese.
Alternatively to have changing languages an easier method would be to just mark the tutorial pieces with a comment stating " Tutorial for reflector 1/3" then 2/3 then 3/3 etc, that way anyone that first opens it, even if they see a bunch of japanese will be able to tell that the reflector is all contained within a certain area.
-
Will you update his stage too? :P
-
Does it have errors? I've never seen anyone complain or talk about bugs in it.
-
This wouldnt pass on Unit testing anywhere
Unit tests don't cover comments, dumbass.
-
This wouldnt pass on Unit testing anywhere
Unit tests don't cover comments, dumbass.
If your development team is not setting up for pickup of other developers? Sure. If they are worth anything they are supposed to be going over their naming procedures to make sure that the code is easily picked up by any other team members, part of the reason unit tests are supposed to be covered by developers that are not the ones that first wrote them, it certainly isnt going to be covered in system , acceptance or Integration.
Nice mature display there, crybaby.
-
That's not what unit testing is. Scrub.
-
Considering that I literally spent all day today writing unit tests comments are completely irrelevant. Unit tests covers functionality within given preset data. In this case to go with that analogy the unit test would cover all 3 stages of the reflection. 1. can it be reflected. 2. does the item have a reflected state defined. 3. does the helper use affectteam = f aka will it hit the root back. More importantly, unit tests are designed to help refactor code and keep code simplified which this reflect does
The reason its in english and japanese is because it covers both english and japanese communities of mugen. If you would like other languages by all means we can add them so that anyone can read it in their native tongue. It was an honest mistake that he forgot the english on one of those states and everyone else has accepted that lol.
part of the reason unit tests are supposed to be covered by developers that are not the ones that first wrote them, it certainly isnt going to be covered in system , acceptance or Integration.
Except devs are expected to write their own tests in every team I've been in (most recent being part of IHS Markit aka fortune 500 tech comapny) so That's also not entirely the case.
-
Unit tests don't cover comments, dumbass.
Might wanna simmer down, there.
-
Does it have errors? I've never seen anyone complain or talk about bugs in it.
Not really, just curious/joking. That background always looked weird but it has a certain charm.
-
Considering that I literally spent all day today writing unit tests comments are completely irrelevant. Unit tests covers functionality within given preset data. In this case to go with that analogy the unit test would cover all 3 stages of the reflection. 1. can it be reflected. 2. does the item have a reflected state defined. 3. does the helper use affectteam = f aka will it hit the root back.
The reason its in english and japanese is because it covers both english and japanese communities of mugen. If you would like other languages by all means we can add them so that anyone can read it in their native tongue. It was an honest mistake that he forgot the english on one of those states and everyone else has accepted that lol.
Thats completely understandable but I was just suggesting another naming procedure that would have eased it up.
Kame, unit testing purpose is to guarantee coverage of the base procedures, but they can cover naming procedures( and should) as well as any stray comments if they are non understandable for the dev that is reviewing them. If they're just covering actions while ignoring everything else they are not being very effective since no other dev will be able to pickup on it easily and get several doubts along the way.
if you get a new dev doing your unit testing and they dont understand what you are doing because you have named everything in japanese, they have every reason to raise a flag. JNP did.
If jz wants to just keep soiling himself with insults instead of talking he's welcome to it, but he only fouls his own image with it. I offered only constructive criticism.
The whole agressivity thing over this is a bit ridiculous.
-
..
You have described a Code Review not a Unit Test.
And yes this would not pass muster during a code review.
-
coverage of base procedures don't include comments either. The naming convention of a unit test is supposed to inform anyone testing what the goal and parameters are eg "CanReflect_HelperIsNotReflectable_ReflectFalse()". Comments if anything are peer reviewed which is what I guess you did but are inconsequential to a successful test being ran. But that's just semantics at this point I guess.
-
..
You have described a Code Review not a Unit Test.
And yes this would not pass muster during a code review.
Thanks for clarifying that Aok, we usually ran them in tandem so I mightve boggled the names together.
-
If your development team is not setting up for pickup of other developers? Sure. If they are worth anything they are supposed to be going over their naming procedures to make sure that the code is easily picked up by any other team members, part of the reason unit tests are supposed to be covered by developers that are not the ones that first wrote them, it certainly isnt going to be covered in system , acceptance or Integration.
Nice mature display there, crybaby.
Hello Iced, thank you for the feedback. If you pay me, I'll gladly translate all of my one-liner Statedef labels to English, Spanish and Japanese as I am fully fluent in these three languages.
I suppose I made a mistake in deciding which way I wanted to comment my code, in my personal characters.
I should also mention that over 60% of the MUGEN community does not speak English as the vast majority understands either Spanish or Japanese, not English. And the asian speaking community is not a community that will ask other people for help, only look at the code. Would anybody try to defend the Spanish or the Eastern communities if my code was labeled in English or are we just stretching an issue far beyond what it should be?
The English mugen community is the MINORITY here, people.
One label in Japanese will not make the entire code unreadable, if anyone so desires they can just ask me what they mean or pass through to Google translator as they're merely one-liners, not explanations of the way the logic works.
Let's be reasonable here, I am not getting paid to follow anybody's standards.
-
You displayed code to the english community you got feedback based on its understandability. Its up to you how you take feedback or not at all.
No one forces you to do anything up to any standards, thats why we have people like Chuchoryu, we dont force him either, but we can give you feedback and you do whatever you want with it.
I mean, we could just blindly praise it, that could be a thing, but Ive known you for years and I think you rather have open feedback rather than people going "Well Im not paying him so I better not reply pointing out that this is confusing for beginners".
Thanks for all the development Vans but Im not sure that getting so angry at feedback that insults start being thrown around seems productive.
Toodles.
-
I fully agree, Iced. It is far more productive to spend this time writing a tutorial or solving another problem instead of arguing whether Japanese one-liners would pass a professional code review or not.
I am not angry and I never insulted anybody. However, I do want to point out that a Mugen Guild administrator calling my code unreadable or littered in public before asking me a question directly is not exactly right, either. We are all role models here, a voice giving out such a strong statement and judgement regarding a piece of code can scare people away from attempting to use it or read it, this goes against the "sharing" aspect of this forum.
If you want to give me pointers on how to present my code better, then by all means, I made a topic purely dedicated to the reflector and it has exactly 0 replies in it. (http://mugenguild.com/forum/topics/tutorial-%E9%A3%9B%E3%81%B3%E9%81%93%E5%85%B7%E3%82%92%E8%B7%B3%E3%81%AD%E8%BF%94%E3%81%97%E6%96%B9%E6%B3%95-projectile-reflection-178433.0.html)
I'm trying my best to produce notes in 3 languages so that it is easier for people to follow, the code itself is already easier than most code shared and produced 5 or 7 years ago. Go a little easier on me, I again plead you to see it from my point of view.
This is a wip topic for Kung Fu Man, so let's not derail it any further. :P
-
(http://alwayswith.nl/wp-content/uploads/2016/04/popcorntime-image1.jpg)
-
Vans, I really wanted to drop this. I was being pedantic about your phrasing that everything was noted and easy to apply. And I never said your code was unreadable in fact I said I read the code to figure out what went where. I couldn't read the Japanese labels so instead of instantly knowing a state wasn't needed I had to be sure by following the state paths. That are spread through the reflector states.
I'd rather you stop making it an issue that I thought it was more difficult than you had implied. What I said was accurate to how I felt but I apologized. I don't expect an apology but I'd rather you not keep on painting me as someone trying to hurt your image by me stating something with facts.
You said it was all noted and easy to apply. Obviously you didn't mean that to the degree I thought you did. Likewise you're making what I said too big of a deal too. I may be admin but I'm also a learning creator trying to make things easier for others. I only wanted assistance adding more notes and to be sure I only added the essentials. I had no idea mentioning it was slightly tougher to read would be an issue.
-
Vans isn't the one making it an issue, Iced is. That's who Vans was replying to, not you. I thought you two settled it pages ago, so I'm confused as to why you're replying like that, JNP.
-
Try to see it from my point of view. I was just sitting trying to study for an article I have to write for college and then I see someone with a big voice calling my code unreadable. :/
However, I do want to point out that a Mugen Guild administrator calling my code unreadable or littered in public before asking me a question directly is not exactly right, either. We are all role models here, a voice giving out such a strong statement and judgement regarding a piece of code can scare people away from attempting to use it or read it, this goes against the "sharing" aspect of this forum.
I thought he was reiterating this again for some reason.
-
Anyway, I got it all finished and notated. I think it's pretty clear now. Feel free to add to it or make corrections.
Spoiler: Kung Fu Zankou (click to see content)
;The Kung Fu Zankou will teach you how to properly make a move that acts as a projectile reflector
;See State 1500 for details on the actual projectile
;---------------------------------------------------------------------------
; Light Kung Fu Zankou
; CNS difficulty: easy
[Statedef 1400]
type = S
movetype= A
physics = N
juggle = 4
poweradd= 50
velset = 0,0
anim = 1400
ctrl = 0
sprpriority = 2
[State 1400, 1]
type = PlaySnd
trigger1 = AnimElem = 3
value = 0, 3
[State 1400, Friction]
type = VelMul
trigger1 = 1
x = 0.5
;---------------------------------------------------
;This helper will act as a reflector
[State 1400: Helper]
type = helper
trigger1 = !NumHelper(1435);use this trigger so the helper will not be created multiple times in 1 move
trigger1 = AnimElem = 4
id = 1435
pos = 0,0 ;50
postype = p1
facing = 1
stateno = 1435
keyctrl = 0
ownpal = 1
supermovetime = 0
pausemovetime = 0
persistent = 0
;---------------------------------------------------
[State 1400, 2]
type = HitDef
trigger1 = Time = 0
attr = S, SA
animtype = Hard
damage = 100, 6
priority = 4
guardflag = MA
pausetime = 12,12
sparkxy = 0,-65
hitsound = 5,3
guardsound = 6,0
ground.type = Low
ground.slidetime = 12
ground.hittime = 17
ground.velocity = -9
ground.cornerpush.veloff = -15 ;To push far away when p2 is in corner
guard.velocity = -9
air.velocity = -2,-5
airguard.velocity = -3.5,-4.5
air.fall = 1
[State 1400, 3]
type = PosAdd
trigger1 = AnimElem = 2
trigger2 = AnimElem = 3
trigger3 = AnimElem = 4
x = 10
[State 1400, 4]
type = VelSet
trigger1 = AnimElem = 4
x = 2
[State 1400, 5]
type = PosAdd
trigger1 = AnimElem = 8
x = 10
[State 1400, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
Spoiler: Reflector Helper (click to see content)
;---------------------------------------------------------------------------
;This is the helper created in Kung Fu Zankou
;this state sets a sysvar that the projectile "talks" to and destroys
;---------------------------------------------------------------------------
;Reflector Helper
; CNS difficulty: hard
[Statedef 1435]
type = S
movetype = A
physics = N
ctrl = 0
velset = 0, 0
anim = 1430
sprpriority = 4
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで ;
;sysvar(0) = 262144 ;
;=======================================;
[State 1435, COMPATIBILITY]
type = VarSet
trigger1 = !time && !prevstateno
sysvar(0) = 262144
;=======================================;
[State 1435, REFLECTOR]
type = ReversalDef
trigger1 = time = 0
reversal.attr = SCA,NP,SP,HP
pausetime = 0,0
sparkno = -1
sparkxy = 0,0
p1stateno = 1436
p2stateno = 1437
id = 1435
numhits = 0
[State 1435, projs only]
type = HitBy
trigger1 = 1
value = SCA, NP, SP, HP
ignorehitpause = 1
[State 1435, override]
type = HitOverride
trigger1 = !time
attr = SCA, AA, AP, AT
stateno = 1436
time = -1
ignorehitpause = 1
[State 1435]
type = BindToParent
trigger1 = 1
pos = 0,0
ignorehitpause = 1
[State 1435, Assert];redundant since it wouldn't cast a shadow anyway because there is no sprite in anim 1430. You'd want this if they used an energy shield to reflect
type = AssertSpecial
trigger1 = 1
flag = noshadow
ignorehitpause = 1
[State 1435, DestroySelf]
type = DestroySelf
trigger1 = root, StateNo = [1400,1420]
trigger1 = root, AnimElemTime(5) >=0
trigger2 = root, MoveType = H
Spoiler: Successful Reflection (click to see content)
;---------------------------
;Successful Reflection
[Statedef 1436]
type = S
movetype = I
physics = N
ctrl = 0
velset = 0, 0
anim = 1
sprpriority = 4
[State 1436, VarSet]
type = VarSet
trigger1 = numtarget
var(0) = target,ID
persistent = 0
ignorehitpause = 1
[State 1436, DEBUG]
type = DisplayToClipboard
trigger1 = 1
text = "var(0) = %d proj = %d ID = %d";Buff = %d GNDTYPE = %d"
params = var(0),numprojid(262144),gethitvar(chainid)
ignorehitpause = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで ;
;sysvar(0) = 262144 ;
;sysvar(1) = SPECIAL ;
;=======================================;
[State 1436, VarSet]
type = VarSet
;RETURNING YOUR OWN PROJECTILE
;自分の飛び道具を跳ね返す。
trigger1 = Gethitvar(chainid)&2**17
sysvar(1) = sysvar(0)
[State 1436, ChangeState]
type = ChangeState
trigger1 = PlayerIDExist(var(0))
trigger1 = (PlayerID(var(0)),sysvar(0)=131072)
;RETURNING YOUR OWN PROJECTILE
;自分の飛び道具を跳ね返す。
trigger2 = Gethitvar(chainid)&2**17
value = 1441
ctrl = 0
;=======================================;
[State 1436, DestroySelf]
type = DestroySelf
trigger1 = time = 30
Spoiler: Reflecting A Helper projectile (click to see content)
;---------------------------
;Reflecting A Helper projectile
[Statedef 1437]
physics = N
movetype = I
ctrl = 0
[State 1437, DEBUG]
type = DisplayToClipboard
trigger1 = 1
text = "sysvar(0) = %d pao pao cafe = %d";Buff = %d GNDTYPE = %d"
params = sysvar(0),sysvar(0)&2**17
ignorehitpause = 1
[State 1437]
type = SelfState
trigger1 = sysvar(0)&2**17
value = sysvar(1)
ctrl = 0
[State 1437]
type = DestroySelf
trigger1 = IsHelper
trigger1 = time = 5
ignorehitpause = 1
[State 1437]
type = SelfState
trigger1 = !IsHelper
value = 0
ctrl = 1
[State 1437, Anim]
Type = ChangeAnim2
Trigger1 = !Time
Value = 1 ;don't forget to add this anim to your .air -1,-1, 0,0, 1
;the anim number does not have to be 1
Spoiler: Special Reflection (click to see content)
;---------------------------
;Special Reflection
[Statedef 1441]
type = S
movetype = A
physics = N
ctrl = 0
velset = 0, 0
sprpriority = 5
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで ;
;sysvar(0) = 262144 ;
;=======================================;
[State 1441, INFORMATION SHARING] ;
type = Projectile ;
trigger1 = sysvar(1)&2**18 ;
projid = sysvar(0) ;
projanim = 1 ;
projhitanim = -1 ;
projremanim = -1 ;
projremovetime = 2 ;
projscale = 0,0 ;
projpriority = 0 ;
velocity = 0,0 ;
postype = p1 ;
offset = 0,0 ;
persistent = 0 ;
ignorehitpause = 1 ;
;=======================================;
[State 1441, ChangeAnim]
type = ChangeAnim
trigger1 = !time
value = 1
[State 1441, StateTypeSet]
type = StateTypeSet
trigger1 = root,movetype = H
trigger2 = cond(PlayerIDExist(var(0)),(PlayerID(var(0)),movetype=I),0)
movetype = I ;I,A,H
[State 1441, PosSet]
type = PosSet
trigger1 = !time || time
trigger1 = PlayerIDExist(var(0))
x = PlayerID(var(0)),Pos X
y = PlayerID(var(0)),Pos Y
[State 1441, DestroySelf]
type = DestroySelf
trigger1 = time > 2
trigger1 = !PlayerIDExist(var(0))
Spoiler: Board Throw (click to see content)
;---------------------------------------------------------------------------
; Board Throw
; CNS difficulty: easy
;in this state we learn how to make your character throw a projectile
;Helpers are the best way to create a projectile
;the actual Projectile controllers are far too limited
[Statedef 1500]
type = S
movetype= A
physics = S
poweradd= 60
velset = 0,0
anim = 1500
ctrl = 0
sprpriority = 2
[State 1500, Button Detect]
type = VarSet
trigger1 = !Time && !AILevel
var(2) = cond((command = "Board Throwx"), 0, 1);this sets the var depending on button pressed when using the move
[State 1500, 1]
type = PlaySnd
trigger1 = AnimElem = 3
value = 0, 4
;This is the helper that we use for the projectile. In this case a solid piece of wood
[State 1500, Helper]
type = Helper
trigger1 = AnimElem = 3
name = "Board"
ID = 1510
stateno = 1510
pos = 20,-60
postype = p1 ;p2,front,back,left,right
facing = 1
ownpal = 1
[State 1500, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
Spoiler: Board Projectile Helper (click to see content)
;---------------------------------------------------------------------------
; Board Projectile Helper
; CNS difficulty: hard
[Statedef 1510]
type = A
movetype= A
physics = N
;juggle = 6 Note that if you actually use juggle points for the helper they will only add to the helper's juggle points. Not the root's (KFM's)
anim = 1510
ctrl = 0
sprpriority = 5
hitcountpersist = 1
movehitpersist = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;=======================================;
[State 1510, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1510, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = 1520 ; use the stateno your reflected projectile is located at
;If you do NOT wish for the projectile to be reflected then set it back to the original projectile state
;in this case 1510
;=======================================;
;IF this was a fireball you would use this. As a piece of wood we will allow it to cast a shadow
;[State 1510, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
;ignorehitpause = 1
[State 1510, Button Detect]
type = VarSet
trigger1= !Time && !PrevStateNo
var(2) = Root, var(2) ;sets the helper var to be the same as the root's var
[State 1510, VelSet]
type = VelSet
trigger1 = Time >= 0
x = Cond(var(2) = 1, 6,3) ;If Var(2) is 1 then this moves faster, if not 1 it moves slower
y = 0
[State 1510, Velocity]
type = VelSet
trigger1 = Movecontact ;stop moving when the board connects
x = 0
y = 0
[State 1510, NotHitBy]
type = NotHitBy
trigger1 = Time >= 0
time = 1
value = SCA, NA, SA, HA, NT, ST, HT ; The helper can't be hit by anything except Projectiles
ignorehitpause = 1
[State 1510, HitBy]
type = HitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP ; Only Projectiles will hit. This allows other projectiles to destroy this one
time = 1
ignorehitpause = 1
[State 1510, HitOverride]
type = HitOverride
trigger1 = Time >= 0
slot = 1
time = 1
stateno = 1511 ; when hit the Projectile will go to this state. It's destroyed state
attr = SCA, AA, AP, AT
ignorehitpause = 1
[State 1510, Hitdef]
type = HitDef
trigger1 = AnimElem = 1
id = 1510 ;set as same as stateno
attr = A, SP ; VERY IMPORTANT always remember to set your attr to NP, SP, or HP (Normal, Special, Hyper Projectile)
animtype = hard
damage = ceil(ifElse(root,fvar(11) * 20 < 7, 7, root,fvar(11) * 20)), 0
priority = 4,Hit
guardflag = MA
hitflag = MAF
pausetime = 0,10
sparkxy = 0,0
hitsound = 5,2
guardsound = 6,0
ground.type = high
air.type = low
ground.slidetime = 16 ;20
ground.hittime = 16 ;20
ground.velocity = -7.8,0
guard.velocity = -7.5
air.velocity = -5.8,-3
airguard.velocity = -5, -4
envshake.time = 5
envshake.ampl = 4
envshake.freq = 176
fall.envshake.time = 10
fall.envshake.ampl = 4
fall.envshake.freq = 176
yaccel = 0.5
air.fall = 0
fall.recover = 1
ground.cornerpush.veloff = 0
air.cornerpush.veloff = 0
down.cornerpush.veloff = 0
airguard.cornerpush.veloff = 0
guard.cornerpush.veloff = 0
getpower = cond(p2movetype=H,40,140), 10 ; if P2 already in a hit state you get less power from hitting them
givepower = 35,35
[State 1510, Guardshake]
type = envshake
trigger1 = moveguarded
time = 4
ampl = 6
freq = 176
ignorehitpause = 1
[State 1510, Fade]
type = changestate
trigger1 = movecontact ;destroyed state
value = 1511
ignorehitpause=1
[State 1520, End];this destroys the projectile when it goes too far
type = DestroySelf
trigger1 = pos x != [-200,200]
Spoiler: DESTROY Board Projectile Helper (click to see content)
;---------------------------------------------------------------------------
; DESTROY Board Projectile Helper
; CNS difficulty: easy
[Statedef 1511]
type = A
movetype= A
physics = N
anim = 1511
ctrl = 0
sprpriority = 5
;[State 1511, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
[State 1511, Snd 1]
type = PlaySnd
trigger1 = !Time
value = F5,2
[State 1511, Snd 1]
type = PlaySnd
trigger1 = Time = 3
value = F5,3
[State 1511, DestroySelf]
type = DestroySelf
trigger1 = p2movetype != H
trigger1 = time >= 27 ;This destroys the projectile when time = 27 which is the end of the board break animation. But ONLY when P2 is NOT in a hit state. While in a hit state this will stay on the final frame so any hits that follow will add to the combo counter
Spoiler: REFLECTED Board Projectile Helper (click to see content)
;---------------------------------------------------------------------------
; REFLECTED Board Projectile Helper
; CNS difficulty: hard
[Statedef 1520]
type = A
movetype= A
physics = N
;juggle = 6 Note that if you actually use juggle points for the helper they will only add to the helper's juggle points. Not the root's (KFM's)
anim = 1510
ctrl = 0
sprpriority = 5
hitcountpersist = 1
movehitpersist = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;=======================================;
[State 1520, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1520, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = 1510 ; Use the StateNo you use to fire your projectile
;=======================================;
[State 1520, Turn];turn the projectile around
type = Turn
trigger1 = !time
;IF this was a fireball you would use this. As a piece of wood we will allow it to cast a shadow
;[State 1061, NoShadow]
;type = AssertSpecial
;trigger1 = 1
;flag = noshadow
;ignorehitpause = 1
[State 1520, VelSet]
type = VelSet
trigger1 = Time >= 0
x = Cond(var(2) = 1, 6,3) ;If Var(2) is 1 then this moves faster, if not 1 it moves slower
y = 0
[State 1520, Velocity]
type = VelSet
trigger1 = Movecontact ;stop moving when the board connects
x = 0
y = 0
[State 1520, NotHitBy]
type = NotHitBy
trigger1 = Time >= 0
time = 1
value = SCA, NA, SA, HA, NT, ST, HT ; The helper can't be hit by anything except Projectiles
ignorehitpause = 1
[State 1520, HitBy]
type = HitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP ; Only Projectiles will hit. This allows other projectiles to destroy this one
time = 1
ignorehitpause = 1
[State 1520, HitOverride]
type = HitOverride
trigger1 = Time >= 0
slot = 1
time = 1
stateno = 1511 ; when hit the Projectile will go to this state. It's destroyed state
attr = SCA, AA, AP, AT
ignorehitpause = 1
[State 1520, Hitdef]
type = HitDef
trigger1 = AnimElem = 1
affectteam = F ; This makes the projectile hurt your own team/char
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;=======================================;
id = sysvar(0)
;=======================================;
attr = A, SP ; VERY IMPORTANT always remember to set your attr to NP, SP, or HP (Normal, Special, Hyper Projectile)
animtype = hard
damage = ceil(ifElse(root,fvar(11) * 20 < 7, 7, root,fvar(11) * 20)), 0
priority = 4,Hit
guardflag = MA
hitflag = MAF
pausetime = 0,10
sparkxy = 0,0
hitsound = 5,2
guardsound = 6,0
ground.type = high
air.type = low
ground.slidetime = 16 ;20
ground.hittime = 16 ;20
ground.velocity = -7.8,0
guard.velocity = -7.5
air.velocity = -5.8,-3
airguard.velocity = -5, -4
envshake.time = 5
envshake.ampl = 4
envshake.freq = 176
fall.envshake.time = 10
fall.envshake.ampl = 4
fall.envshake.freq = 176
yaccel = 0.5
air.fall = 0
fall.recover = 1
ground.cornerpush.veloff = 0
air.cornerpush.veloff = 0
down.cornerpush.veloff = 0
airguard.cornerpush.veloff = 0
guard.cornerpush.veloff = 0
getpower = cond(p2movetype=H,40,140), 10 ; if P2 already in a hit state you get less power from hitting them
givepower = 35,35
[State 1520, Guardshake]
type = envshake
trigger1 = moveguarded
time = 4
ampl = 6
freq = 176
ignorehitpause = 1
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY ;
;飛び道具を跳ね返し行動設定 ;
;by Vans ;
;GUIDE: ;
;FOR PROJECTILE / 飛び道具で ;
;sysvar(0) = 131072 ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで;
;sysvar(0) = 262144 ;
;=======================================;
[State 1520, Turn]
type = Turn
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
persistent = 0
ignorehitpause = 1
[State 1520, ChangeState]
type = ChangeState
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
value = sysvar(1)
ctrl = 0
ignorehitpause = 1
;=======================================;
[State 1520, Fade]
type = changestate
trigger1 = movecontact ;destroyed state
value = 1511
ignorehitpause=1
[State 1520, End]
type = DestroySelf
trigger1 = pos x != [-200,200]
Spoiler: .cmd (click to see content)
;---------------------------------------------------------------------------
;Board Throw
[State -1, Board Throw]
type = ChangeState
value = 1500
triggerall = command = "Board Throwx" || command = "Board Throwy"
trigger1 = ctrl
trigger1 = !NumHelper(1510);this prevents you from throwing more than 1 while another is alive
trigger2 = Numhelper(1510)
trigger2 = helper(1510), StateNo = 1511
trigger2 = ctrl;trigger2s allow you to throw another while the 1st board is in it's hit state
All I need to do now is make the EX Projectile that hits multiple times and test it with the reflector. Then I'll be finished with this portion. @JMorphMan: Didn't you come up with a good way to have multi hitting projectiles get destroyed in the manner they should? The reflector may need to be adapted to that as well, not sure yet.
After that I only need to add charge coding, Juggle Points, and reversed command fix and I think he'll be ready for release!
-
@Vans: What about the sealing property done by Chizuru? Do you have a tutorial for that? Also, will it be implemented into this KFM update?
-
He hasn't yet. What does it do? Is it something that's typically in fighters like projectile reflection?
-
Seals the usage of all special and super moves. Not quite as common, but at least it's not Nicotine's control reversal. :P
-
Is this something we feel should be a standard? There are a lot of things that need standards to work. And the more we stuff into KFM the harder he will be to learn with.
@DW: @Niitris:
-
hello everybody.
i already released a 0101 DOS Kfm with new stuff.
This new one in project is welcome.
-
^And you posted that why...?
Is this something we feel should be a standard? There are a lot of things that need standards to work. And the more we stuff into KFM the harder he will be to learn with.
@DW: @Niitris:
Should it be a standard? No, but I feel the same way about the reflection stuff.
As for it making KFM harder to learn from, I don't see it. There's more, yeah, but one will only take from him what they want. It just gives more options overall. Also, since you're doing a pretty good job of labeling everything, it shouldn't be difficult. One need only apply themselves.
EDIT:
Let me clarify. It being a standard, yes. As far as the var(s) used and everything, so everything matches up. It has to be that way if it's going to work. I didn't explain that well enough. I more so mean that it isn't something that HAS to be implemented, though, would be nice to include. So people who may want to implement it, have a primer in which to apply it from. The reflection and the sealing.
-
All I need to do now is make the EX Projectile that hits multiple times and test it with the reflector. Then I'll be finished with this portion. @JMorphMan: Didn't you come up with a good way to have multi hitting projectiles get destroyed in the manner they should? The reflector may need to be adapted to that as well, not sure yet.
I recently updated Guile to fix his EX projectile (which hits twice), and it more or less behaves the way multi-hit special projectiles do in SFA and CvS (where they die immediately after colliding with another any other projectile, including single hit ones, even if they're supposed to hit multiple times). But I'm not sure if that behavior should be used for Kung Fu Man; perhaps a more simple projectile behavior would be best, like the one from SFIV (wherein a projectile has a certain number of hits, and when it's exhausted all of its possible hits, whether by hitting an opponent or colliding with a projectile or what have you, it dies).
The latter just seems more simple and intuitive, and it's also how multi-hit super projectiles work in SFA and CvS. there is a smallish issue, though (http://mugenguild.com/forum/msg.2302031)).]And also there's a small issue that the former method has in MUGEN because MUGEN sucks.[/url]
-
I've created a "Burned" sprite for your Kung Fu Man:
(http://i.imgur.com/QlazqHH.png)
Also, I realized that I never gave you the code for Dash Collision. The code was original made by Team Z2, I only edited a little to make it compatible with Kung Fu Man.
First put this in the AIR file:
; Dash Collision - HDBZ
[Begin Action 950]
950,0, 0,0, -1
; Grabbing when win
[Begin Action 951]
Clsn1: 1
Clsn1[0] = 1, -86, 83, 0
800,0, 0,0, 1
;Dash Collision check
[Begin Action 128950]
-1,0, 0,0, -1
Then put this block of code in Statedef -2 (or Statedef 100 if you want):
;==| DASH COLLISION ACTIVATION |================================================
[State -2, Dash Coll]
type = Changestate
triggerall = enemy,stateno=100 || enemy,stateno=950
triggerall = p2bodydist X = [-30,30]
trigger1 = enemy,selfanimexist(128950)
value = 950
;===============================================================================
Finally, add Statedef 950, 951, and 952 anywhere in kfm.cns
;===========================================================================
; DASH COLLISION
;===========================================================================
[Statedef 950]
type = S
physics = N
movetype = A
anim = 950
ctrl = 0
velset = 0,0
sprpriority = 2
[State 800, ABORT]
type = Changestate
trigger1 = p2stateno != 950 && p2stateno != 951 && time >= 4 && time<50
value = 952 ;when it fails
ctrl = 1
[State 1000]
type = PosAdd
trigger1 = P2bodydist X < 10
X = -8
[State 1000]
type = PosAdd
trigger1 = P2bodydist X < 25
X = -5
[State 1000]
type = PosAdd
trigger1 = P2bodydist X < 35
X = -2
[State 1000]
type = PosAdd
trigger1 = P2bodydist X < 40
X = -1
[State 1000]
type = width
trigger1 = 1
edge = 50,40
[State 800, Grab SND]
type = PlaySnd
trigger1 = time=5
value = 0,3
[State 4500, 1];Scream
type = PlaySnd
trigger1 = time=5
value = 5,0
volume = 255
[State 1000, shake]
type = EnvShake
trigger1 = !(time%4)
time = 8
freq = 20
ampl = 1+0.1*time
[State 800, count]
type = VarSet
trigger1 = !time
var(30) = 0
[State 800, count]
type = VarAdd
trigger1 = command="x" || command="y" || command="z" || command="a" || command="b" || command="c" || command="start"
;trigger2 = command = "up" || command = "down" || command = "back" || command = "fwd"
var(30) = 1
[State 800, count]
type = Changestate
triggerall = time = 80
trigger1 = var(30) > enemy,var(30)
value = 951
[State 800, count]
type = Changestate
triggerall = time = 80
trigger1 = var(30) < enemy,var(30)
value = 0
ctrl = 0
[State 800, count]
type = Changestate
triggerall = time = 80
trigger1 = var(30) = enemy,var(30)
value = 105
ctrl = 0
;Grabbing
[Statedef 951]
type = S
movetype = A
physics = S
juggle = 15
velset = 0,0
ctrl = 0
anim = 951
sprpriority = 1
facep2 = 1
poweradd = 20
[State 800, Do_not Guard]
type = attackdist
trigger1 = 1
value = 0
[State 800, hit]
type = hitdef
trigger1 = animelem=1
attr = S,NT
hitflag = M-
priority = 1,Miss
sparkno = -1
p1facing = 1
p2facing = 1
p1stateno = 810
guard.dist = 0
fall = 1
fall.recover = 0
;Abort Dash Collision to avoid bugs
[Statedef 952]
type = S
physics = N
movetype = A
ctrl = 1
velset = 0,0
sprpriority = 2
[State 0, ChangeState]
type = ChangeState
trigger1 = 1
value = 0
ctrl = 1
There, you're done.
-
Also, I realized that I never gave you the code for Dash Collision. The code was original made by Team Z2, I only edited a little to make it compatible with Kung Fu Man.
Bro, do you realize that JNP is a member of Team Z2?? ;)
-
Is this something we feel should be a standard? There are a lot of things that need standards to work. And the more we stuff into KFM the harder he will be to learn with.
@DW: @Niitris:
I don't think it should be. I wrote a small tutorial in Chizuru on how to add the compatibility, maybe I should make a post in the forum?
Anyway, I got it all finished and notated. I think it's pretty clear now. Feel free to add to it or make corrections.
It looks very good!
As for multi-hitting projectiles, I believe there shouldn't be too much of an issue with those. When one of those collide with a reflector, then they would automatically be sent to the reflected behavior. At this point, this state can specify if the projectile should lose "health", keep full life or do something else. I tested the reflector with projectiles such as Sakura's hadouken from Street Fighter Alpha 3 and a fully charged Kaiser Wave from Rugal.
One thing that does need to be done with a little more care is a reflector that stays alive for a fixed amount of time (like Aegis Reflector). However, the only issue in this case is that the reflected projectiles could theoretically cancel each other (think of the Aegis Reflector being bombarded with a bullet hell, some of those bullets will clash with themselves).
By the way, there's something very special I wanted to mention about State 1441.
If you look at the reflector, the logic of the states is as follows (if it comes in contact with a compatible projectile):
Reflector => Succesful reflection => Special reflection.
The "Special reflection" state is very important as it fixes a MUGEN bug:
In MUGEN it is impossible to block one of your own objects, even if it has the flag of affectteam = F.
What this state does is that it takes the (now dead) reflector object and it "sticks" to the reflected projectile. What this does is that it allows P2 to detect a "hostile" object and thus allowing them to block.
This state is very important.
-
Yeah I was kinda worried about multihitters. Wasn't sure if I needed to code how they act or what yet. Nice to know it'll all depend on how I coded the reflected one.
I'm waking up and getting ready for work so I'm going off memory but state 1441 uses the projectile that was made in the reflection to do this? That's pretty neat. Another thing I should teach that JMM agreed would be better is the explod method for destroyed fireballs. Basically I'd make an invisible explod get fired with the helper. When the helper leaves its attack state the explod plays it's getting destroyed anim. This would fix the issue where killing a helper with reversaldef doesn't create the destroyed anim of the fireball. Like the only good thing about using the projectile controllers for fireballs lol
For reflection you'd simply code the explod to go invisible again in the reflected state.
I've created a "Burned" sprite for your Kung Fu Man:
(http://i.imgur.com/QlazqHH.png)
Awesome thank you! And yeah, if I thought it was needed I'd easily put the code for dash collision. I'm just putting in optional anims to represent them. I'm not adding code to activate them all :)
This does remind me that I need to share the updated dash collision code. There's a bug in the old code. Me and XG fixed it.
-
Ah, I see.
You can also use a projectile controller to play animations if need be, I sometimes use those as glorified explods so I can have afterimage effects on them.
-
I wrote a small tutorial in Chizuru on how to add the compatibility, maybe I should make a post in the forum?
Please do.
-
will you release everything as a full character?
-
Yes I'll release this as a full character and replace the KFM in the MUGEN programs we host including the starter pack. I'll also add the character Training to default MUGEN and supply links to resources like fighter factory and useful areas of mfg. The only thing I'm unsure of is what to do with the hires KFM. I'll probably have to update him too but I worry how much I'll need to tweak for him. And I worry that I'll miss something that I tweaked in this one. The year downtime won't help me remember it all well :p
-
Yes! i'll get home and try to help you by doing some edits for compatibility, i love doing this.
-
One question: Are these characters updated every time a code comes out?
-
I don't fully understand the question.
-
I don't fully understand the question.
What I'm saying is that if you update it little by little the character.
-
Oh, yes when I release it I'll update as needed.
-
Oh, yes when I release it I'll update as needed.
Ah, thanks for answering jiji.
-
Woah, just found this under Projects. Seems awesome updating KFM. I don't have anything substantial to add but the project is amazing. JNP, you're doing a incredible work.
-
[State 52, Assert: NoWalk]
type = AssertSpecial
trigger1 = Anim != 5
flag = NoWalk
ignoreHitPause = 1
[State 52, ChangeAnim to Turning]
type = ChangeAnim
trigger1 = ctrl && P2Dist x < 0
trigger1 = Anim != 5
value = 5
[State 52, Turn]
type = Turn
trigger1 = Anim = 5 && AnimElem = 1
Added this to jump landing state to fix an issue with landing
-
The normal KFM has a problem with Smash Kung Fu Upper that must be considered.
Give him 100 life (10x less) and 1000 defence (10x more)
Hit him with Smash Kung Fu Upper.
The Smash Kung will deal 86% damage due to the line fall.damage = 70 in the code.
You guys don't want this in your fixed version.
This is the most blatant bug I can remember in his codes at the moment, but I'll make sure to keep you guys aware of more issues I can find.
@Zzyzzyxx: So I was going through this thread trying to make a changelog (would have been much better had I done this as I was updating) and saw this. I looked and had never dealt with this issue. Either I forgot or I had no idea how to fix it (probably that one since I jumped on this project too soon when I was learning)
Anyway, my solution was to give the move an ID if it connects and add this to the -2
;===============continued from Smash Kung Fu Upper connecting================
;This creates an explod when P2 hits the ground if they have ID 3051
[State -2, Explod]
type = Explod
trigger1 = NumExplod(3051)<2 ;This limits the number of times the explod is created. It will only create the explod if less than 2 are alive
trigger1 = NumTarget(3051) ;This tells it which ID the opponent should have
trigger1 = target,Pos Y >= 0
trigger1 = target,Vel Y > 0
anim = 1
ID = 3051
removetime = -1 ;this means the explod will stay forever
ignorehitpause = 1
;this removes the above explods
[State -2, RemoveExplod]
type = RemoveExplod
trigger1 = P2MoveType != H ;remove the explod if the opponent is no longer in a hitstate
id = 3051
ignorehitpause = 1
;This removes life from the opponent when the land after being hit by Smash Kung Fu Upper
;you will use this method instead of fall.damage because this method will scale in accordance with the opponent's defence properly
[State -2, TargetLifeAdd]
type = TargetLifeAdd
trigger1 = NumExplod(3051)=1 ;This uses the explod as the limiter. If there is 1 explod it is true
trigger1 = NumTarget(3051)
trigger1 = target,Pos Y >= 0
trigger1 = target,Vel Y > 0
value = -70 ;this is how much life you remove from the opponent
ID = -1
kill = 1 ;This means it can kill the opponent
I couldn't think of a way to make the lifeadd trigger only occur once while in -2. It would trigger constantly as the opponent hit the ground and bounced. So I used an explod as a limiter instead of needing to make a custom state.
-
I'm not fully following the issue, but P2's current life could also be stored as a Var to be used as the trigger.
Explod technique wouldn't work for that, though, because you wouldn't be able to remove the explod (Unless you don't mind Explods persisting heh)
Kung Fu Upper
Type = VarSet
trigger1 = numtarget(3051)
var(10) = target(3051),Life
State -2
Type = TargetLifeAdd
trigger1 = NumTarget(3051)
trigger1 = target(3051),Pos Y >= 0
trigger1 = target(3015),Vel Y > 0
trigger1 = var(10) = target(3051),Life
value = -70
ID = -1
kill = 1
-
I did remove the explod though. It's in the code. Removeexplod triggers when p2 is no longer in a hit state. I prefer to save variables for other things and use explods in simple scenarios like this.
EDIT: Unless you're asking what the issue is with fall.damage in which case if the opponent sets his defense to 1000 for example and sets their life to 100 the fall.damage does not scale the damage at all. It still takes off 70 life points. TargetLifeAdd does still scale in accordance to the opponent's defence
-
I did remove the explod though. It's in the code. Removeexplod triggers when p2 is no longer in a hit state. I prefer to save variables for other things and use explods in simple scenarios like this.
EDIT: Unless you're asking what the issue is with fall.damage in which case if the opponent sets his defense to 1000 for example and sets their life to 100 the fall.damage does not scale the damage at all. It still takes off 70 life points. TargetLifeAdd does still scale in accordance to the opponent's defence
Sorry I'm really just wasting time with my comment heh
I was just proposing another way to do the same thing. And about the Explod comment, what I meant was with my suggestion :)
Logging P2's life value at the time of impact, to check later, would not work with an Explod... well, I guess it could if it were like
type = RemoveExplod
trigger1 = numtarget(3051)
trigger1 = P2MoveType != H
id = target(3051),Life + 70 ;the sticky part with what I was suggesting
ignorehitpause = 1
-
Ah yeah that's a good alternative. Like I said I just prefer explods for these things. We have a limited amount of vars so I'd rather teach an alternate method to store data. I feel it's better to be stingy with vars because you never know when you might need more later.