// Example of coding script routines for MUSHclient in Jscript // ---------------------------------------------------------- // Error codes returned by various functions // ---------------------------------------------------------- var eOK = 0; // No error var eWorldOpen = 30001; // The world is already open var eWorldClosed = 30002; // The world is closed, this action cannot be performed var eNoNameSpecified = 30003; // No name has been specified where one is required var eCannotPlaySound = 30004; // The sound file could not be played var eTriggerNotFound = 30005; // The specified trigger name does not exist var eTriggerAlreadyExists = 30006; // Attempt to add a trigger that already exists var eTriggerCannotBeEmpty = 30007; // The trigger "match" string cannot be empty var eInvalidObjectLabel = 30008; // The name of this object is invalid var eScriptNameNotLocated = 30009; // Script name is not in the script file var eAliasNotFound = 30010; // The specified alias name does not exist var eAliasAlreadyExists = 30011; // Attempt to add a alias that already exists var eAliasCannotBeEmpty = 30012; // The alias "match" string cannot be empty var eCouldNotOpenFile = 30013; // Unable to open requested file var eLogFileNotOpen = 30014; // Log file was not open var eLogFileAlreadyOpen = 30015; // Log file was already open var eLogFileBadWrite = 30016; // Bad write to log file var eTimerNotFound = 30017; // The specified timer name does not exist var eTimerAlreadyExists = 30018; // Attempt to add a timer that already exists var eVariableNotFound = 30019; // Attempt to delete a variable that does not exist var eCommandNotEmpty = 30020; // Attempt to use SetCommand with a non-empty command window var eBadRegularExpression = 30021; // Bad regular expression syntax var eTimeInvalid = 30022; // Time given to AddTimer is invalid var eBadMapItem = 30023; // Direction given to AddToMapper is invalid var eNoMapItems = 30024; // No items in mapper var eUnknownOption = 30025; // Option name not found var eOptionOutOfRange = 30026; // New value for option is out of range var eTriggerSequenceOutOfRange = 30027; // Trigger sequence value invalid var eTriggerSendToInvalid = 30028; // Where to send trigger text to is invalid var eTriggerLabelNotSpecified = 30029; // Trigger label not specified/invalid for 'send to variable' var ePluginFileNotFound = 30030; // File name specified for plugin not found var eProblemsLoadingPlugin = 30031; // There was a parsing or other problem loading the plugin var ePluginCannotSetOption = 30032; // Plugin is not allowed to set this option var ePluginCannotGetOption = 30033; // Plugin is not allowed to get this option var eNoSuchPlugin = 30034; // Requested plugin is not installed var eNotAPlugin = 30035; // Only a plugin can do this var eNoSuchRoutine = 30036; // Plugin does not support that subroutine (subroutine not in script) var ePluginDoesNotSaveState = 30037; // Plugin does not support saving state var ePluginCouldNotSaveState = 30037; // Plugin could not save state (eg. no state directory) var ePluginDisabled = 30039; // Plugin is currently disabled var eErrorCallingPluginRoutine = 30040; // Could not call plugin routine var eCommandsNestedTooDeeply = 30041; // Calls to "Execute" nested too deeply var eCannotCreateChatSocket = 30042; // Unable to create socket for chat connection var eCannotLookupDomainName = 30043; // Unable to do DNS (domain name) lookup for chat connection var eNoChatConnections = 30044; // No chat connections open var eChatPersonNotFound = 30045; // Requested chat person not connected var eBadParameter = 30046; // General problem with a parameter to a script call var eChatAlreadyListening = 30047; // Already listening for incoming chats var eChatIDNotFound = 30048; // Chat session with that ID not found var eChatAlreadyConnected = 30049; // Already connected to that server/port var eClipboardEmpty = 30050; // Cannot get (text from the) clipboard var eFileNotFound = 30051; // Cannot open the specified file var eAlreadyTransferringFile = 30052; // Already transferring a file var eNotTransferringFile = 30053; // Not transferring a file var eNoSuchCommand = 30054; // There is not a command of that name var eArrayAlreadyExists = 30055; // That array already exists var eBadKeyName = 30056; // That name is not permitted for a key var eArrayDoesNotExist = 30056; // That array does not exist var eArrayNotEvenNumberOfValues = 30057; // Values to be imported into array are not in pairs var eImportedWithDuplicates = 30058; // Import succeeded, however some values were overwritten var eBadDelimiter = 30059; // Import/export delimiter must be a single character, other than backslash var eSetReplacingExistingValue = 30060; // Array element set, existing value overwritten var eKeyDoesNotExist = 30061; // Array key does not exist var eCannotImport = 30062; // Cannot import because cannot find unused temporary character // ---------------------------------------------------------- // Flags for AddTrigger // ---------------------------------------------------------- var eEnabled = 1; // enable trigger var eOmitFromLog = 2; // omit from log file var eOmitFromOutput = 4; // omit trigger from output var eKeepEvaluating = 8; // keep evaluating var eIgnoreCase = 16; // ignore case when matching var eTriggerRegularExpression = 32; // trigger uses regular expression var eExpandVariables = 512; // expand variables like @direction var eReplace = 1024; // replace existing trigger of same name var eTemporary = 16384; // temporary - do not save to world file // ---------------------------------------------------------- // Colours for AddTrigger // ---------------------------------------------------------- var NOCHANGE = -1; var custom1 = 0; var custom2 = 1; var custom3 = 2; var custom4 = 3; var custom5 = 4; var custom6 = 5; var custom7 = 6; var custom8 = 7; var custom9 = 8; var custom10 = 9; var custom11 = 10; var custom12 = 11; var custom13 = 12; var custom14 = 13; var custom15 = 14; var custom16 = 15; // ---------------------------------------------------------- // Flags for AddAlias // ---------------------------------------------------------- // var eEnabled = 1; // same as for AddTrigger var eIgnoreAliasCase = 32; // ignore case when matching var eOmitFromLogFile = 64; // omit this alias from the log file var eAliasRegularExpression = 128; // alias is regular expressions var eExpandVariables = 512; // same as for AddTrigger // var eReplace = 1024; // same as for AddTrigger var eAliasSpeedWalk = 2048; // interpret send string as a speed walk string var eAliasQueue = 4096; // queue this alias for sending at the speedwalking delay interval var eAliasMenu = 8192; // this alias appears on the alias menu // var eTemporary = 16384; // same as for AddTrigger // ---------------------------------------------------------- // Flags for AddTimer // ---------------------------------------------------------- // var eEnabled = 1; // same as for AddTrigger var eAtTime = 2; // if not set, time is "every" var eOneShot = 4; // if set, timer only fires once var eTimerSpeedWalk = 8; // timer does a speed walk when it fires var eTimerNote = 16; // timer does a world.note when it fires var eActiveWhenClosed = 32; // timer fires even when world is disconnected // var eReplace = 1024; // same as for AddTrigger // var eTemporary = 16384; // same as for AddTrigger // ---------------------------------------------------------- // Example showing iterating through all triggers with labels // ---------------------------------------------------------- function showtriggers () { triggerlist = new VBArray(world.GetTriggerList()).toArray(); if (triggerlist) // if not empty for (i = 0; i < triggerlist.length; i++) world.note(triggerlist [i]); } // end of showtriggers // ----------------------------------------------- // Example showing iterating through all variables // ------------------------------------------------ function showvariables () { variablelist = new VBArray(world.GetVariableList()).toArray(); if (variablelist) // if not empty for (i = 0; i < variablelist.length; i++) world.note(variablelist [i] + " = " + world.GetVariable(variablelist [i])); } // end of showvariables // ---------------------------------------------------------- // Example showing iterating through all aliases with labels // ---------------------------------------------------------- function showaliases () { aliaslist = new VBArray(world.GetAliasList()).toArray(); if (aliaslist) // if not empty for (i = 0; i < aliaslist.length; i++) world.note(aliaslist [i]); } // end of showaliases // --------------------------------------------------------- // Example showing running a script on world open // --------------------------------------------------------- function OnWorldOpen () { world.note ("---------- World Open ------------"); } // end of OnWorldOpen // --------------------------------------------------------- // Example showing running a script on world close // --------------------------------------------------------- function OnWorldClose () { world.note ("---------- World Close ------------"); } // end of OnWorldClose // --------------------------------------------------------- // Example showing running a script on world connect // --------------------------------------------------------- function OnWorldConnect () { world.note ("---------- World Connect ------------"); } // end of OnWorldConnect // --------------------------------------------------------- // Example showing running a script on world disconnect // --------------------------------------------------------- function OnWorldDisconnect () { world.note ("---------- World Disconnect ------------"); } // end of OnWorldDisconnect // --------------------------------------------------------- // Example showing running a script on an alias // // This script is designed to be called by an alias: ^teleport(.*)$ // // This alias SHOULD have "regular expression" checked. // // It is for teleporting (going to) a room by number // // The room is entered by name and looked up in the variables // list. // --------------------------------------------------------- function OnTeleport (thename, theoutput, wildcardsVB) { var sDestination; var sHelp = ""; var iSubscript; var iRoom; var mylistsa; // safe array var mylistvba; // vb array var sRoomList; // jscript array wildcards = VBArray(wildcardsVB).toArray(); sDestination = wildcards [0]; // remove leading spaces from destination while (sDestination.substr (0, 1) == " ") sDestination = sDestination.substr (1); // if nothing entered echo possible destinations if (sDestination == "") { world.note ("-------- TELEPORT destinations ----------"); mylistsa = world.GetVariableList (); // find list of all variables if (mylistsa != null) { mylistvba = new VBArray(mylistsa); sRoomList = mylistvba.toArray (); // loop through each variable, and add to help if it starts with "teleport_" for (iSubscript = mylistvba.lbound (); iSubscript <= mylistvba.ubound (); iSubscript++) { if (sRoomList [iSubscript].substr (0, 9) == "teleport_") { if (sHelp != "") sHelp += ", "; sHelp = sHelp + sRoomList [iSubscript].substr (9); } // variable starts with "teleport_" } // loop through sRoomList } // having at least one room // if no destinations found, tell them if (sHelp == "") sHelp = "" world.note (sHelp); return; } // no destination supplied // get contents of the destination variable iRoom = world.GetVariable ("teleport_" + sDestination.toLowerCase ()); // if not found, or invalid name, that isn't in the list if (iRoom == null) { world.note ("******** Destination " + sDestination + " unknown *********"); return; } world.note ("------> Teleporting to " + sDestination); world.send ("@teleport #" + iRoom); } // end of OnTeleport // --------------------------------------------------------- // Example showing running a script on an alias // // This script is designed to be called by an alias: ^add_teleport(|\s*(\w*)\s*(\d*))$ // // This alias SHOULD have "regular expression" checked. // // It is for adding a room to the list of rooms to teleport to (by // the earlier script). // // eg. ADD_TELEPORT dungeon 1234 // // --------------------------------------------------------- function OnAddTeleport (thename, theoutput, wildcardsVB) { var sDestination var iRoom var iStatus var sCurrentLocation wildcards = VBArray(wildcardsVB).toArray(); // wildcard one is the destination sDestination = wildcards [1] // remove leading spaces from destination while (sDestination.substr (0, 1) == " ") sDestination = sDestination.substr (1); // if nothing entered tell them command syntax if (sDestination == "") { world.note ("Syntax: add_teleport name dbref"); world.note (" eg. add_teleport LandingBay 4421"); return; } // wildcard 2 is the room to go to iRoom= wildcards [2] // remove leading spaces from destination while (iRoom.substr (0, 1) == " ") iRoom = iRoom.substr (1); // add room and destination location to variable list iStatus = world.SetVariable ("teleport_" + sDestination, iRoom); if (iStatus != 0) { world.note ("Room name must be alphabetic, you entered: " + sDestination); return; } world.note ("Teleport location " + sDestination + "(#" + iRoom + ") added to teleport list"); } // end of OnAddTeleport // ------------------------------------------ // Example showing a script called by a timer // ------------------------------------------- function OnTimer (strTimerName) { world.note ("Timer has fired!"); } // end of OnTimer // -------------------------------------------- // Example showing a script called by a trigger // Should be connected to a trigger matching on: <*hp *m *mv>* // (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>) // it may need to be changed depending on the MUD prompt format). // -------------------------------------------- function OnStats (strTriggerName, trig_line, wildcardsVB) { wildcards = VBArray(wildcardsVB).toArray(); iHP = wildcards [0] iMana = wildcards [1] iMV = wildcards [2] world.Note ("Your HP are " + iHP); world.Note ("Your Mana is " + iMana); world.Note ("Your movement points are " + iMV); } // end of OnStats // -------------------------------------------- // Subroutine to be called to repeat a command. // // Call from the alias: ^#(\d+)\s+(.+)$ // Regular Expression: checked // // Example of use: #10 give sword to Trispis // This would send "give sword to Trispis" 10 times // -------------------------------------------- function OnRepeat (strAliasName, strOutput, wildcardsVB) { wildcards = VBArray(wildcardsVB).toArray(); for (i = 1; i <= wildcards [0]; i++) world.Send (wildcards [1]); } // end of OnRepeat // -------------------------------------------- // Example showing iterating through all worlds // -------------------------------------------- function showworlds () { worldlist = new VBArray(world.GetworldList()).toArray(); if (worldlist) // if not empty for (i = 0; i < worldlist.length; i++) world.note(worldlist [i]); } // end of showworlds // -------------------------------------------------- // Example showing sending a message to another world // -------------------------------------------------- function SendToWorld (name, message) { var otherworld otherworld = world.getworld (name); if (otherworld == null) { world.note ("World " + name + " is not open"); return; } otherworld.send (message); } // -------------------------------------------- // Example trigger routine that just shows what was passed to it // -------------------------------------------- function ExampleTrigger (thename, theoutput, wildcardsVB) { wildcards = VBArray(wildcardsVB).toArray(); world.note ("Trigger " + thename + " fired."); world.note ("Matching line was: " + theoutput); for (i = 0; i < 10; i++) if (wildcards [i] != "") world.note ("Wildcard " + i + " = " + wildcards [i]); } /**************** WEAPON COMPARISON Compares two weapons and returns the result. Alias (MUST be regular expression): ^compare (.+)\s(\d+d\d+)\s(\d+)/(\d+)\s(.+)\s(\d+d\d+)\s(\d+)/(\d+)(|.+)$ Syntax: compare d
/ d
/ [action] Example: --> "compare dagger 2d2 4/2 sword 4d6 5/5" would compare the dagger to the sword and report which one's the best you can also include an action... --> "compare mace 6d7 2/3 pickaxe 2d12 1/4 say" would say the best weapon NOTE: action can be multiple words (e.g "tell vryce") ****************/ function CompareWeapons(alias_name, alias_output, wildcardsVB) { //Collect wildcards into a Javascript array wildcards = VBArray(wildcardsVB).toArray(); //General variables var sendmud = AllToUpper(wildcards[8].replace(/^\W+/,'')).replace(/\W+$/,''); //Weapon one variables var name1 = AllToUpper(wildcards[0]); var num1 = parseInt(wildcards[1].substr(0,1)); var dice1 = parseInt(wildcards[1].substr(2)); var hit1 = parseInt(wildcards[2]); var dam1 = parseInt(wildcards[3]); var max1 = (num1*dice1)+dam1; var min1 = num1+dam1; var avg1 = (max1+min1)/2; var score1 = avg1+(hit1/2); var weap1stat = name1 + ": " + num1 + "d" + dice1 + " hr(" + hit1 + ") dr(" + dam1 + ") min(" + min1 + ") max(" + max1 + ") avg(" + avg1 + ")"; //Weapon two variables var name2 = AllToUpper(wildcards[4]); var num2 = parseInt(wildcards[5].substr(0,1)); var dice2 = parseInt(wildcards[5].substr(2)); var hit2 = parseInt(wildcards[6]); var dam2 = parseInt(wildcards[7]); var max2 = (num2*dice2)+dam2; var min2 = num2+dam2; var avg2 = (max2+min2)/2; var score2 = avg2+(hit2/2); var weap2stat = name2 + ": " + num2 + "d" + dice2 + " hr(" + hit2 + ") dr(" + dam2 + ") min(" + min2 + ") max(" + max2 + ") avg(" + avg2 + ")"; //Calculate the better weapon if (score1 > score2) { var resstring = name1 + " is " + Math.round(100-score2*100/score1) + "% better than " + name2; } else if (score1 < score2) { var resstring = name2 + " is " + Math.round(100-score1*100/score2) + "% better than " + name1; } //Send output either locally or with specified prefix to mud if (sendmud != "") { world.send(sendmud + " " + weap1stat); world.send(sendmud + " " + weap2stat); world.send(sendmud + " " + resstring); } else { world.note(weap1stat); world.note(weap2stat); world.note(resstring); } } /********** ALLTOUPPER Returns string with the first letter in each word uppercase ***********/ function AllToUpper(str) { aString = (str.replace(/^\W+/,'')).replace(/\W+$/,'').split(" "); str = ""; for (i = 0; i < aString.length; i++) { str += aString[i].substr(0,1).toUpperCase() + aString[i].substr(1).toLowerCase() + " "; } return str.substr(0,str.length-1); } // -------------------------------------------- // Subroutine to be called remember which way you walked. // // Call from the alias: keypad-* // Send: %1 // // -------------------------------------------- function OnKeypadDirection (strAliasName, strOutput, wildcardsVB) { wildcards = VBArray(wildcardsVB).toArray(); world.setvariable("direction", wildcards [0]); } world.note ("Scripting enabled - script file processed");