Dark and Light Elves

Console Commands

As most mod developers who have worked on multiplayer mods know, UI scripts are run only client-side, but there's still a lot you can do with them if you can script for a server-client scenario.

Files

Commands

You enter commands through the chat console. When you press ENTER in-game, a horizontal textbox appears near the bottom of the screen, and you use it to type messages to other players in Multiplayer or enter built-in commands (e.g. cheat codes) in Single Player.

Any of the following commands and subcommand options can be abbreviated to 3 or more letters each. For example "/inventory drop" can be abbreviated to "/inv drop" or "/inv dro", etc. Commands are not case sensitive.

MP = multiplayer, SP = single player

All commands that are marked as SP-enabled means that they affect the currently selected party member rather than your hero/party leader. For example, "/inventory drop" will drop all the items in the selected party member's inventory to the ground.

  • /CAMERA... (using this command requires Ikkyo's dsdll)
    • /CAMERA TEST
      Sets the azimuth (-50 to 90) and distance (0 to 18) to preset values preferred by this mod's author [MP, SP]
    • /CAMERA AZIMUTH integer_min integer_max
      Sets the (angular) azimuth range if the min and max values fall in the -87 to 90 inclusive range [MP, SP]
    • /CAMERA DISTANCE integer_min integer_max
      Sets the distance range if the min and max values fall in the 0+ range, although keep in mind that 20 as a max allows a pretty far zoom already! [MP, SP]
  • /GHOST...
    • /GHOST GETTIMER
      find out whether or not the host has changed the ghost timeout duration [MP] (not sure this command works properly!)
    • /GHOST SETTIMER integer
      change ghost timeout duration [MP host only]
  • /GIVE string
    generate items by specifying a pcontent string as the parameter [MP, SP] (similar to the DSMOD give command, except items are spawned on the ground)
  • /GOLD integer
    give hero [MP, SP] the specified amount of gold
  • /INVENTORY...
    • /INVENTORY DELETE
      delete hero inventory contents [MP, SP]
    • /INVENTORY DROP
      drop hero inventory contents [MP, SP]
    • /INVENTORY UNLOCK
      attempts to unlock the hero's [MP, SP] or selected party member's [SP] frozen inventory screen (even though that problem should not be caused by this mod if you're using the most current version)
  • /NAME string
    change hero [MP host only, SP] or selected party member [SP] name
  • /PARTY...
    • /PARTY ADD string
      Adds the hireable npc or pack animal whose template is specified by the string parameter to your party [MP host only, SP]

How To Extend It

Familiarize yourself with skrit's StringTool class, because you'll probably want to do a fair amount of string parsing. Also, keep in mind that this isn't a tutorial on UI scripting (which is nearly identical to component scripting anyway).

To add new commands, edit or remove existing commands, edit the contents of the following functions (in the skrit files):

  • bool ProcessCommandMP$( string command$, string input$, int elements$ )
  • bool ProcessCommandSP$( string command$, string input$, int elements$ )
A command string looks something like this...
/command parameter1 parameter2 etc..
In this case, the first letter is the forward slash, which I call the "bang". Some Dungeon Siege commands start with + or - (e.g., +zool), and maybe you want to, instead, add commands whose effects can be turned on or off by specifying a + or - bang, respectively.

The parameters...

  • command$ is the substring from input$ that contains the bang and command name
  • input$ is the entire command string, including the bang and command name (to get individual parameters, use the StringTool.GetDelimitedValue( input$, INDEX, ' ', "") call, where INDEX is an integer greater than 1, which will return the whitespace delimited string at the specified index)
  • elements$ is the number of whitespace-delimited substrings in input$ (that means the number of parameters is elements$ - 1)
Let's take a look at a simplified version of the processing of the command /ghost settimer F, where F is a nonnegative float or integer value, which is added by this mod's TEST addon resource file, in k_inc_console_mp.skrit. It is a server-side, multiplayer-only command with multiple parameters:
//match the first three letters of the command name
if ( StringTool.SameNoCase(command$, "ghost", 3) ) {
	//check if there are at least two parameters, and
	//check if this command is being executed by the host
	if ( (elements$ > 2) && IsServerLocal() ) {
		//get the first parameter (subcommand)
		command$ = StringTool.GetDelimitedString(input$, 1, ' ', "");
		
		//match first three letters of the subcommand
		if ( StringTool.SameNoCase(command$, "settimer", 3) ) {
			//get the second parameter (duration)
			float duration$ = StringTool.GetDelimitedFloat(
				input$, 2, ' ', -1.0);
			if ( duration$ > -1.0 ) {
				Server.SSetGhostTimeout(duration$);
			}
		}
	}
}

Origin Ramblings

Xaa mentioned something about catching cheat commands at the source by monitoring input for his siegelet project Mageworld in his Saga of My Little Pony thread. Although no specifics were mentioned, the concept percolated in the back of my mind for a while. Monsoon's UI mod added a separate chat box for altering player character names, and when I had trouble adding a new chat box UI control of my own for a different thing, I figured that I could just jury rig the existing chat box to process additional text of my choosing. I later realized that this was probably the gist of how you add your own skrit-driven commands.