YesNoOk
avatar

The CMD file (Read 36786 times)

Started by JustNoPoint, October 20, 2015, 05:59:50 pm
Share this topic:
The CMD file
#1  October 20, 2015, 05:59:50 pm
  • ******
    • www.justnopoint.com/
; 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.
;
Code:
; [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

;-| Button Remapping |-----------------------------------------------------
; This section lets you remap the player's buttons (to easily change the
; button configuration). The format is:
;   old_button = new_button
; If new_button is left blank, the button cannot be pressed.
Code:
[Remap]
x = x
y = y
z = z
a = a
b = b
c = c
s = s

;-| Default Values |-------------------------------------------------------
[Defaults]
; Default value for the "time" parameter of a Command. Minimum 1.
command.time = 15

; Default value for the "buffer.time" parameter of a Command. Minimum 1,
; maximum 30.
command.buffer.time = 3

;-| Super Motions |--------------------------------------------------------
;The following two have the same name, but different motion.
;Either one will be detected by a "command = TripleKFPalm" trigger.
;Time is set to 20 (instead of default of 15) to make the move
;easier to do.
;
Spoiler: KFM's Commands (click to see content)

;---------------------------------------------------------------------------
; 2. State entry
; --------------
; This is where you define what commands bring you to what states.
;
; Each state entry block looks like:
;   [State -1, Label]           ;Change Label to any name you want to use to
;                               ;identify the state with.
;   type = ChangeState          ;Don't change this
;   value = new_state_number
;   trigger1 = command = command_name
;   . . .  (any additional triggers)
;
; - new_state_number is the number of the state to change to
; - command_name is the name of the command (from the section above)
; - Useful triggers to know:
;   - statetype
;       S, C or A : current state-type of player (stand, crouch, air)
;   - ctrl
;       0 or 1 : 1 if player has control. Unless "interrupting" another
;                move, you'll want ctrl = 1
;   - stateno
;       number of state player is in - useful for "move interrupts"
;   - movecontact
;       0 or 1 : 1 if player's last attack touched the opponent
;                useful for "move interrupts"
;
; Note: The order of state entry is important.
;   State entry with a certain command must come before another state
;   entry with a command that is the subset of the first.
;   For example, command "fwd_a" must be listed before "a", and
;   "fwd_ab" should come before both of the others.
;
; For reference on triggers, see CNS documentation.
;
; Just for your information (skip if you're not interested):
; This part is an extension of the CNS. "State -1" is a special state
; that is executed once every game-tick, regardless of what other state
; you are in.


; Don't remove the following line. It's required by the CMD standard.
Code:
[Statedef -1]
Spoiler: KFM's statedef -1 (click to see content)
Last Edit: October 21, 2015, 06:56:30 am by Just No Point
Re: The .cmd file
#2  October 20, 2015, 06:01:00 pm
  • ******
    • www.justnopoint.com/
Charge motions that look like this:

Code:
[Command]
name = "ChargeBF_X"
command = ~30$B,$F,x

Why this is wrong: On the surface, this may seem to be fine. If you've played with a charge character before, then you'll know that holding DB or UB will also count toward the B charge (same applies to DB and DF for D charges). However, if you try to shift for directional input from holding D to DB or UB, you will still retain the charge. Mugen, however, considers this as a new input and you will lose the charge if this were to occur.

Solution: Rather than using Mugen's native command buffer, you'll have to build your own. First, alter the above command to the following:

Code:
[Command]
name = "ChargeBF_X"
command = ~$B,$F,x

You'll want to build your charge input buffer using two variables: one for determining how long the direction was held, and the other that tells Mugen how long the charge should be held in the command buffer. The first part is easy. First, make sure the following is in your CMD file:

Code:
[Command]
name = "holdback";Required (do not remove)
command = /$B
time = 1

Next, in your State -2, add the following.

Code:
[State -2, Back Charge Increment]
type = VarAdd
trigger1 = command = "holdback"
var(0) = 1
ignorehitpause = 1

[State -2, Back Charge Reset]
type = VarSet
trigger1 = command != "holdback"
var(0) = 0

This will increment the variable's value for each tick that you are holding the direction to be charged, and resets it back to 0 when the direction is no longer held. For the second part:

Code:
[State -2, Back Charge Buffer Activation]
type = VarSet
trigger1 = var(0) >= 50 ;Change this value to the minimum time you want the direction to be held for.
var(1) = 35

[State -2, Back Charge Buffer Decrement]
type = VarAdd
trigger1 = var(0) < 50 && var(1) > 0 ;Change the value of 50 to whatever you set the value above to.
var(1) = -1

What this does is it tells Mugen to register the back command in the input buffer once it has been held for at least 50 ticks (roughly 5/6 of a second). Once the direction is released, you will then have 35 ticks (a little more than half a second) to complete the charge motion. Finally, in your CMD file, locate the changestate for the special requiring the charge motion and add the lines noted below:

Code:
[State -1, Sonic Boom]
type = ChangeState
value = 1100
triggerall = (statetype != A)
triggerall = var(1)>16 ;ADD THIS LINE
triggerall = ctrl
trigger1 = command = "ChargeBF_X"

The above will limit the window to complete the charge motion to 19 (35-16) ticks, all you simply have to do is complete the motion. The 16 can be changed to a smaller value if you need more time to complete the motion, such as with a B,F,B,F motion. For vertical charge motions (D,U), simply repeat the above steps using two different variables and making necessary alterations to account for holding down rather than back. For motions that require a DB charge (such as Vega/Claw's Scarlet Terror and Flying Barcelona Special), simply use the variables for both horizontal and vertical charges.

(parts of code based on code used by P.o.t.S. and Jmorphman)
Re: The .cmd file
#3  October 20, 2015, 06:04:21 pm
  • ******
    • www.justnopoint.com/
There is a limit to how many commands a character can have. I tried to search for that info but couldn't find it. Anyone remember off hand?

Also

Statedef -1 is in the CMD file.
Mugen constantly monitors these Statedefs without the character having to be in them.

The CMD controls the controls. The input from the keyboard/controller is matched up to commands in the Command Definitions, then the State Entry kicks in. Command Definitions section has [Remap], [Defaults], and [Command]. There can be a maximum of ?? Command names.
The State Entry, Statedef -1, part is usually where you see all of the ChangeStates and AI code. 
Commands can also be read as triggers which allows you to sneak in statedef -1 style changestates inside the CNS file. The name has to be inside the CMD file for it to work though.

If youre having trouble making the commands work, there's a common mess up.
As I mentioned, mugen is constantly searching statedef -1. It's also looking at button inputs to match against the command definitions. Because people arent super precise pressing buttons, Mugen gives us some leeway. While you may think you pressed F,D,DF, A, in reality you may have pressed, F,DF,D,DF,F, A. If you notice the first set of inputs is hidden inside the second set. Mugen lets that activate the command which will go down the line to the changestate. If both sets are actually a named command, both will be triggered in the order their listed.
Meaning if  F,D,DF, A  is above  F,DF,D,DF,F, A. Mugen checks it first to see if any ChangeStates with that name can be activated. If not, Mugen will check if any Changestates F,DF,D,DF,F, A. can activate.
The way to make sure you can do all of your moves properly is to make sure the most complex input commands are at the top Going a step further you'd need to make sure your most complex ChangeStates are at the top of the State Entry section. This isnt always the case but it's important and just good practice.
Last Edit: October 20, 2015, 06:24:54 pm by Just No Point
Re: The CMD file
#4  October 20, 2015, 06:09:18 pm
  • ******
    • www.justnopoint.com/
Something to mention. The .cmd extension for command files. Not a problem when mugen first came out, everyone used .BAT instead, or .COM. But now .CMD is used as part of the OS and is one of the ways people do limited batch scripting. Because of this, there have been mentions of things like the windows restore stripping .CMD files out of the system when it occurs. Possibly as an anti virus/malware thing. We should be moving to a new extension for these files to A: Make them text rather than something you have to right click to look at and B: To prevent them getting wiped.

As most of the extensions are pretty arbitrary and mugen and FF both look at what the file is within the .def in order to define it, you could simply make up your own standard.

I'm using a .CYD file now, I can't find that as an extension for anything that might attempt to use it.
Re: The .cmd file
#5  October 23, 2015, 01:41:30 pm
  • ****
  • stillRetired.
  • Formerly Known As Genesis
    • USA
    • www.mediafire.com/folder/7j1slkpa7lm0w/Public_Works
Re: The CMD file
#6  May 25, 2016, 08:59:12 pm
  • ******
  • Hedgehog Whisperer
  • Red Bull addict
    • Spain
    • xgargoyle.mgbr.net
Some notes to be added, when coding AI on the CMD.
Although it's barely commented on the CNS documentation, it's quite easy to overlook it or even misunderstand it.

Suppose you want the AI to randomly perform a fireball with different versions (light, medium, strong) and you want to consolidate everything in a single state:
1000 - Light fireball
1002 - Medium fireball
1004 - Strong fireball

Quote
[State -1, AI Attack]
type = ChangeState
trigger1 = whatever
value = 1000+(2*random%3)
The expression above will evaluate in some cases to 1001, giving an error if the state does not exist, or automatically going to the wrong state

To correct it, you will need to remove arithmetic expressions and use IfElse instead
Quote
[State -1, AI Attack]
type = ChangeState
trigger1 = whatever
value = IfElse((random%3=0),1000,(IfElse((random%2=0),1002,1004)))
This will correctly change to states 1000, 1002 and 1004 with a 33% of odds
XGargoyle: Battle posing since 1979
http://xgargoyle.mgbr.net
http://www.pandorabots.com/pandora/talk?botid=e71c0d43fe35093a  <-- Please click that link
http://paypal.me/XGargoyle  <-- Donations welcome!
Last Edit: May 25, 2016, 09:02:17 pm by XGargoyle
Re: The CMD file
#7  May 25, 2016, 09:20:41 pm
  • **
  • always trying to edit mugen chars as original game
very nice doc I hope that someone provide us with tutorial on  "command helper" to avoid mugen command buffers
also Some notes to be added, there exist another side effect of the buffer.time set with higher value that is if a player has a throw move defined with an input command that has highier buffer.time value the throw will always prioritirise against the opponent's throw at the sametime so if you want to cheat against every opponent's throw able to be hited  you should do that set with higher value even if the opponent's throw has higher priority in the ATTR clause in their hitdef
Last Edit: May 26, 2016, 12:26:48 pm by concord23
Re: The CMD file
#8  May 27, 2016, 08:44:10 pm
  • *****
  • Thanks and God bless
    • USA
    • ricepigeon.neocities.org
Something to mention. The .cmd extension for command files. Not a problem when mugen first came out, everyone used .BAT instead, or .COM. But now .CMD is used as part of the OS and is one of the ways people do limited batch scripting. Because of this, there have been mentions of things like the windows restore stripping .CMD files out of the system when it occurs. Possibly as an anti virus/malware thing. We should be moving to a new extension for these files to A: Make them text rather than something you have to right click to look at and B: To prevent them getting wiped.

As most of the extensions are pretty arbitrary and mugen and FF both look at what the file is within the .def in order to define it, you could simply make up your own standard.

I'm using a .CYD file now, I can't find that as an extension for anything that might attempt to use it.

Stemming from this issue, certain web browsers, mainly Chrome, will block downloads that contain any files with a .CMD extension. I experienced this a few months ago with one of my own characters.
Re: The CMD file
#9  January 17, 2017, 12:07:11 am
  • avatar
  • *
    • USA
Quote
[State -1, AI Attack]
type = ChangeState
trigger1 = whatever
value = 1000+(2*random%3)
The expression above will evaluate in some cases to 1001, giving an error if the state does not exist, or automatically going to the wrong state

To correct it, you will need to remove arithmetic expressions and use IfElse instead
Or you could try putting the parentheses in the correct place:
Code:
value = 1000+2*(random%3)
Re: The CMD file
#10  July 13, 2017, 06:24:54 pm
  • avatar
  • Greek Geek
  • I have a pen...
    • Greece
Sorry for posting in a dead thread fellas but I have a question.
Can you assign new_button to be a command?
Re: The CMD file
#11  July 13, 2017, 08:23:21 pm
  • *****
  • Estoy siempre listo para un desafío.
    • Puerto Rico
    • im41784@yahoo.com
Re: The CMD file
#12  July 18, 2017, 05:21:25 pm
  • avatar
  • Greek Geek
  • I have a pen...
    • Greece
So basically there is the Button Remap Segment in a CMD file

[Remap] ; Old Button on the Left and New on the Right
x = x
y = y
z = z
a = a
b = b
c = c
s = s

Is it possible to change a button from any segment and make it a command from the CMD file? Like Z being a Shortcut for x+y

; Example
[Command]
name = "2QCFxy"
command = ~D, F, D, F, x+y
time = 30
Re: The CMD file
#13  July 18, 2017, 08:50:45 pm
  • ******
  • If you’re gonna reach for a star...
  • reach for the lowest one you can.
    • USA
    • network.mugenguild.com/jmorphman
You can definitely use z as a shortcut, but not using the button remapping feature. The best way to accomplish what you're asking would be to make a copy of the command, but replace "x+y" with "z"

so it'd look like this:
Code:
[Command]
name = "2QCFxy"
command = ~D, F, D, F, z
time = 30
You'd just need to add this to the cmd and you should be all set!
Re: The CMD file
#14  July 20, 2017, 02:58:29 pm
  • avatar
  • Greek Geek
  • I have a pen...
    • Greece
thanks for that. it works fine