Commands in black are safe enough to use which, at most, can crash the game when you use them incorrectly. (Save the level before you test it and nothing can go wrong if you only use these commands.)
Commands in
blue are not optimal for use in custom levels, because they only work in the real game.
Commands in
orange are a bit dangerous to use and
may corrupt your save data if you don't use them correctly.
Commands in
red shouldn't be used
at all, because these
will corrupt your save data.
If I don't know what a command does, I have not coloured it, so that may happen if I know what it does.
squeak(colour)
- makes a crewmate squeak (or makes a terminal sound)text(colour,x,y,lines)
- creates a text box (which doesn't appear until you use speak_active or speak)position(center/centerx/centery/colour,above/colour,below)
- overrides the x,y of the text command (sets the position of the text box)endtext
- makes a text box disappear (fade out)endtextfast
- makes a text box disappear immediately (without fading out)speak
- shows a text box, without removing old text boxes. Also pauses the script until you press action (unless there's a backgroundtext command above it, see below)speak_active
- shows a text box, and removes any old text box. Also pauses the script until you press action (unless there's a backgroundtext command above it, see below)backgroundtext
- if you put this command on the line above speak or speak_active, the game will not wait until you press action after creating the text box. This can be used to create multiple text boxes at the same time, like this:squeak(player)
text(gray,0,0,1)
This is text box one.
backgroundtext
speak_active
text(gray,0,50,1)
This is text box two!
backgroundtext
speak
text(gray,0,100,1)
They will appear all at once!
speak
endtext
Normally, a text box in internal scripting looks like this:
squeak(color)
text(color,x,y,lines)
[The text]
position(x[,x])
speak_active
After the last text box, or before a delay after a text box, use 'endtext', to make the text box disappear. You don't have to do this in between text boxes.
changeplayercolour(colour)
- changes the colour of 
changecolour(colour a,colour b)
- changes the colour of the crewmate with colour a into colour b (note: this only works with crewmates who have been created using the createcrewman command)alarmon
- turns the alarm onalarmoff
- turns the alarm offcutscene()
- makes cutscene bars appearendcutscene()
- makes cutscene bars disappearuntilbars()
- wait until cutscene()/endcutscene() is completedcustomifflag(n,script)
- same as ifflag(n,script) in simplified scriptingifflag(n,script) - same as ifflag(n,script) in simplified scripting, but loads an internal scriptloadscript(script) - load an internal scriptiftrinkets(n,script) - same as iftrinkets(n,script) in simplfied scripting, but loads an internal scriptiftrinketsless(n,script) - same as iftrinketsless(n,script) in simplfied scripting, but loads an internal script
blue because: these four commands can only load scripts from the real game, and there are equivalents which load custom scripts instead of built-in scriptscustomiftrinkets(n,script)
- same as iftrinkets(n,script) in simplfied scriptingcustomiftrinketsless(n,script)
- same as iftrinketsless(n,script) in simplfied scriptingcreatecrewman(x,y,colour,mood,direction)
- creates a crewmate (not rescuable)createentity(x,y,n,meta,meta) - creates an entity, I have a list of them, so if you want, I can post it here
orange because: it is possible to create a teleporter with this command, which destroys your save data if you touch itvvvvvvman()
- you know what it doesundovvvvvvman()
- back to normalhideplayer()
- makes
invisibleshowplayer()
- makes
visiblegamestate(x) - changes the gamestate (there is a list of gamestates in this topic)
orange because: some gamestates destroy your save file, and it can really glitch the game if you don't use it correctlygamemode(x) - gamemode(teleporter) to show the map, gamemode(game) to hide it
blue because: It shows teleporters of the main gameblackout() - should make the screen black, but freezes the screenblackon() - unfreezes the screen
blue because: these two commands should make the screen black, but that only works in the real game for some reason. If you want to make the screen black, use fadeout() and fadein()fadeout()
- fades the screen to blackfadein()
- fades backuntilfade()
- wait until fadeout()/fadein() is completedgotoroom(x,y)
- teleport (without any effects) to room x+1,y+1gotoposition(x,y,z)
- teleport (without any effects) to position x,y in this room, and z is whether you are flipped or not, 1 for flipped, 0 for normal (you can also use gotoposition(x,y), then you will have normal gravity by default)flash(x)
- makes the screen white, you can change the time how long the screen should stay white (just flash won't work, you have to use flash(5) in combination with playef(9) and shake(20) if you want a normal flash)play(x)
- play a song, but the song numbers are different:0 - Path Complete
1 - Pushing Onwards
2 - Positive Force
3 - Potential For Anything
4 - Passion For Exploring
5 - Pause
6 - Presenting VVVVVV
7 - Plenary
8 - Predestined Fate
9 - ecroF evitisoP
10 - Popular Potpurri
11 - Pipe Dream
12 - Pressure Cooker
13 - Paced Energy
14 - Piercing The Sky
jukebox(x)
- makes a jukebox terminal white and turns off the color of all the other terminals (in custom levels, it just seems to turn off the white color of all activated terminals).musicfadeout()
- fades the music outmusicfadein()
- opposite of musicfadeout() (doesn't seem to work)stopmusic()
- stops the music at onceresumemusic()
- opposite of stopmusic() (doesn't seem to work)playef(x,n)
- play a sound effect (I have a list) I don't know what the n does, but just use playef(x) without the second argument until I found out what it doeschangemood(colour,mood)
- changes the mood of a crewmate (0 for happy, 1 for sad, only works for crewmates created with createcrewman)everybodysad()
- makes everybody sad (only for crewmates created with createcrewman +
)changetile(colour,tile)
- changes the tile of a crewmate (you can change it to any sprite in sprites.png, and it only works for crewmates created with createcrewman)face(a,b)
- makes the face of crewmate a point to crewmate b (only works with crewmates created with createcrewman)companion(x) - I don't know exactly how this works
blue because: I have read it only works on 
changeai(crewmate,followplayer/followpurple/followyellow/followred/followgreen/followblue/faceplayer/followposition,x/panic/faceleft/faceright)
- can change the face direction of a crewmate or the walking behaviourchangedir(colour,direction)
- just like changeai(colour,faceleft/faceright), this changes face direction, 0 is left, 1 is rightwalk(left/right,x)
- makes
walkflipgravity(colour)
- flips the gravity of a certain crewmate (it won't always work on yourself)changegravity
- haven't tested itflipme - makes
flip/go to the ceiling (?) Doesn't have anything to do with flipping Viridian
It has something to do with text boxes in flip mode.tofloor
- makes
go to the floor. This has always worked for me, actually.flip
- make
flip either way, this always works.foundtrinket(x)
- makes a trinket foundruntrinketscript - Play Passion For Exploring?
blue because: you can just use play(4) to play Passion For Exploring, and I guess this will do something different when used in the real game.altstates(x) - changes the layout of some rooms, like the trinket room in the ship before and after the explosion, and the secret lab entrance
blue because: custom levels don't support altstates at all.createlastrescued(x,y) - creates the last rescued crewmate at position x,y (?)rescued(colour) - makes someone rescuedmissing(colour) - makes someone missing
blue because: I think these only work for crewmates in the real gamefinalmode(x,y) - final level (46,54)
blue because: why would you want to use the final level in custom levels?setcheckpoint()
- sets the checkpoint to the current locationtextboxactive
- no idea what this does.ifexplored(x,y,script) - if x+1,y+1 is explored, go to script
blue because: I guess it loads an internal script, but I think you can use ifexplored(x,y,stop) and customiftrinkets(0,customscript) to go to a script if an area has not been explored yetiflast(crewmate,script) - if crewmate x was rescued last, go to script (it uses numbers here: 2:
3:
4:
5
(I don't know the number for
and
)
blue because: I think these only work for crewmates in the real gameifskip(x) - if you skip the cutscenes in No Death Mode, go to script x
blue because: you can't skip cutscenes in custom levelsifcrewlost(a,b) - if crewmate a is lost, go to script b
blue because: I think these only work for crewmates in the real game, and if it does work, it probably loads an internal scriptshowcoordinates(x,y)
- show coordinates x,y on the maphidecoordinates(x,y)
- hide coordinates x,y on the map -NOTE: This works for the map for custom levels in 2.1
showship - show the ship on the map?hideship - hide the ship on the map?
blue because: I guess that if you have made the ship at the exact same location as in the real game, that you can make the ship purple, but otherwise: no.showsecretlab - show the secret lab on the map?hidesecretlab - hide the secret lab on the map?
blue because: again, only if you have made the secret lab at the exact same location as in the real game, this command makes sense.showteleporters() - show the teleporters on the map (I guess it only shows the teleporter in Space Station 1)hideteleporters() - hide the teleporters on the mapshowtargets() - show the targets on the map (unknown teleporters which show up as ?s)hidetargets() - hide the targets on the mapshowtrinkets() - show the trinkets on the map?hidetrinkets() - hide the trinkets on the map?
blue because: There is no way you have all teleporters or trinkets at the same location as in the real game, but maybe hidetrinkets can be used to hide all trinkets from the map, if the map in 2.1 shows trinkets (I have no idea what a 2.1 map looks like)hascontrol()
- makes the player have control, however doesn't work in the middle of scriptsnocontrol()
- the opposite of hascontrol()specialline(x) - special dialogs, with text(colour,0,0,0) before it?
blue because: I have never seen any of the lines below these commands (they're talking about lollipops
) and I don't know when you see themdestroy(gravitylines)
- same behaviour as simplified commanddestroy(warptokens)
- same behaviour as simplified commanddestroy(platforms)
- same (glitchy) behaviour as simplified commanddelay(x)
- same behaviour as simplified commandflag(x,on/off)
- same behaviour as simplified commandtelesave() - saves your game (in the regular teleporter save, so don't use it!)
red because: this is one of the two commands in this list which you really shouldn't use, to make a long story short: it destroys your teleporter save, regardless of how you use it.befadein()
- instantly fade in from fadeout()createactivityzone(colour) - creates a zone where you are standing which says "Press ACTION to talk to (Crewmate)"
blue because: you can't control what happens if you press entercreaterescuedcrew() - creates all rescued crewmates
blue because: crewmates rescued with rescued(colour), so you have to put that command in a script box after you rescue a certain crewmate to make this work.trinketyellowcontrol() - diolog of
when he gives you a trinket in the real gametrinketbluecontrol() - dialog of
when she gives you a trinket in the real game
blue because: I don't think there is a purpose for using this in a custom levelrollcredits() - makes the credits roll.
red because: It destroys your save after the credits are completed!teleportscript(levelonecomplete) - used to set a script which is run when you use a teleporter (in this case levelonecomplete)
blue because: It loads an internal script, and you can't really use teleporters, and if you make them with createentity(x,y,14,0,0), you'll have to touch the teleporter which corrupts your save dataclearteleportscript() - clears the teleporter script set with teleporterscript(x)
blue because: It is useless without teleportscript(x) and this command isn't even used in the game itself!moveplayer(x,y)
- moves the player x pixels to the right and y pixels down (and of course you can also use negative numbers to make him move up or to the left)do(n)
- unused command, starts a loop block which will repeat n timesloop
- put this at the end of the loop blockcutscene()
untilbars()
squeak(terminal)
text(gray,0,0,1)
You will hear 3 coin sounds in a row.
position(center)
speak_active
endtext
do(3)
playef(4)
delay(20)
loop
squeak(terminal)
text(gray,0,0,1)
The loop has ended.
position(center)
speak_active
endtext
endcutscene()
untilbars()
leavesecretlab() - turn off "secret lab mode"
blue because: the secret lab is not accessible in custom levels.Some commands I'm not sure about if they exist or not:
ifwarp(x)Some new ones which I will test:
resumemusic()musicfadein()That's all I know for now...
Important: if you have to specify a certain crewmate, don't use their names, because that won't work. Use their colours:
= cyan or player
= blue
= red
= yellow
= green
= purple
= gray or terminalHOW TO USE INTERNAL COMMANDS:
There are two methods to do it. Those methods are listed below, and I attached an example with those two methods as a vvvvvv level.
--- METHOD 1 - THE SAY(-1) METHOD ---
say(-1)
text(1,0,0,4)
say(5)
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(5)
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(5)
...
It has to end with:
...
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(4)
endtext
endcutscene()
untilbars()
loadscript(stop)
You don't have to use say(5) if you want to use less than 4 commands in a row, you can use say(4) to have 3 commands in a row, say(3) to have 2 commands in a row, et cetera. For example:
say(-1)
text(1,0,0,4)
say(4)
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(5)
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(2)
{internal command}
text(1,0,0,4)
say(4)
endtext
endcutscene()
untilbars()
loadscript(stop)
Text boxes in internal scripting are a bit hard to do, because you can only use 4 lines in a row. There's a post somewhere else in this topic which explains how to do it. This post is already REALLY long.
--- METHOD 2 - WITHOUT CUTSCENE BARS---
If you want to use internal commands without cutscene bars, put this in the script box
which Viridian walks through:
iftrinkets(0,script2)
Then make a new script. In this case the new script is called 'script2' (you can use any name using a-z or 0-9, note that A-Z and some special characters should not be used). Delete the script box, so that Viridian doesn't activate it directly. The script has to be activated by the script containing iftrinkets(0,script2).
The second script should look like this:
say(5)
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(5)
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(5)
...
It has to end with:
...
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(2)
endtext
loadscript(stop)
text(1,0,0,4)
Note that in the last part of this script, there has to be
one blank line after the last text(1,0,0,4). Not 0, because then things get deleted because of a bug in the script editor, and not more than 1, because then it won't work. 'text(1,0,0,4)' has to be the second last line, and the last line has to be empty.
Just like in the say(-1) method, you don't have to use say(5) if you want to use less than 4 commands in a row, you can use say(4) to have 3 commands in a row, say(3) to have 2 commands in a row, et cetera. For example:
say(4)
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(5)
{internal command}
{internal command}
{internal command}
{internal command}
text(1,0,0,4)
say(2)
{internal command}
text(1,0,0,4)
say(2)
endtext
loadscript(stop)
text(1,0,0,4)
(copy pasting from Distractionware)