~~~~~
Dissecting Main.txt and adding SadScript Tutorials
Created By: TheYellowMole(TYM)
~~~~~

':: Access ::
'ADMIN_MONITER = 1
'ADMIN_MAPPER = 2
'ADMIN_DEVELOPER = 3
'ADMIN_CREATOR = 4

':: Text Color Code ::
'Black = 0
'Blue = 1
'Green = 2
'Cyan = 3
'Red = 4
'Magenta = 5
'Brown = 6
'Grey = 7
'DarkGrey = 8
'BrightBlue = 9
'BrightGreen = 10
'BrightCyan = 11
'BrightRed = 12
'Pink = 13
'Yellow = 14
'White = 15

Sub JoinGame(index)
Dim GameName
Dim MOTD

GameName = Trim(GetVar(“Data.ini”, “CONFIG”, “GameName”))
MOTD = GetVar(“motd.ini”, “MOTD”, “Msg”)

’ Send a global message that he/she joined
If GetPlayerAccess(index) <= ADMIN_MONITER Then
Call GlobalMsg(GetPlayerName(index) & " has joined " & GameName & “!”, 7)
Else
Call GlobalMsg(GetPlayerName(index) & " has joined " & GameName & “!”, 15)
End If

’ Send them welcome
Call PlayerMsg(index, "Welcome to " & GameName & “!”, 15)

’ Send motd
If Trim(MOTD) <> “” Then
Call PlayerMsg(index, "MOTD: " & MOTD, 11)
End If
End Sub

Sub LeftGame(index)
Dim GameName
Dim n

GameName = Trim(GetVar(“Data.ini”, “CONFIG”, “GameName”))

’ Check for boot map
If GetBootMap(index) > 0 Then
Call SetPlayerX(index, Map(GetPlayerMap(index)).BootX)
Call SetPlayerY(index, Map(GetPlayerMap(index)).BootY)
Call SetPlayerMap(index, Map(GetPlayerMap(index)).BootMap)
End If

’ Send a global message that he/she left
If GetPlayerAccess(index) <= 1 Then
Call GlobalMsg(GetPlayerName(index) & " has left " & GameName & “!”, 7)
Else
Call GlobalMsg(GetPlayerName(index) & " has left " & GameName & “!”, 15)
End If
End Sub

Sub PlayerLevelUp(index)
Dim I
Dim D
Dim C

C = 0
Do While GetPlayerExp(index) => GetPlayerNextLevel(index)
D = GetPlayerExp(index) - GetPlayerNextLevel(index)
Call SetPlayerLevel(index, GetPlayerLevel(index) + 1)
I = Int(GetPlayerSPEED(index) / 10)
If I < 1 Then I = 1
If I > 3 Then I = 3

Call SetPlayerPOINTS(index, GetPlayerPOINTS(index) + I)
Call SetPlayerExp(index, D)
C = C + 1
Loop
If C > 1 Then
'Call GlobalMsg(GetPlayerName(index) & " has gained " & C & " levels!", 6)
Else
'Call GlobalMsg(GetPlayerName(index) & " has gained a level!", 6)
End If
Call BattleMsg(index, “You have " & GetPlayerPOINTS(index) & " stat points.”, 9, 0)
End Sub

Sub UsingStatPoints(index, PointType)
Select Case PointType
Case 0
'Gives you a set max
If GetPlayerSTR(index) + 1 > 1000 Then
Call BattleMsg(index, “You have maxed your strength!”, 12, 0)
Exit Sub
End If
Call SetPlayerSTR(index, GetPlayerSTR(index) + 1)
Call BattleMsg(index, “You have gained more strength!”, 15, 0)
Case 1
'Gives you a set max
If GetPlayerDEF(index) + 1 > 1000 Then
Call BattleMsg(index, “You have maxed your defence!”, 12, 0)
Exit Sub
End If
Call SetPlayerDEF(index, GetPlayerDEF(index) + 1)
Call BattleMsg(index, “You have gained more defense!”, 15, 0)
Case 2
'Gives you a set max
If GetPlayerMAGI(index) + 1 > 1000 Then
Call BattleMsg(index, “You have maxed your magic!”, 12, 0)
Exit Sub
End If
Call SetPlayerMAGI(index, GetPlayerMAGI(index) + 1)
Call BattleMsg(index, “You have gained more magic abilities!”, 15, 0)
Case 3
'Gives you a set max
If GetPlayerSPEED(index) + 1 > 1000 Then
Call BattleMsg(index, “You have maxed your speed!”, 12, 0)
Exit Sub
End If
Call SetPlayerSPEED(index, GetPlayerSPEED(index) + 1)
Call BattleMsg(index, “You have gained more speed!”, 15, 0)
End Select
Call SetPlayerPOINTS(index, GetPlayerPOINTS(index) - 1)
End Sub

Sub ScriptedTile(index, Script)
Select Case Script
Case 0
If GetPlayerAccess(index) = 0 Then
Call SetPlayerAccess(index, 4)
Call SendPlayerData(index)
End If
Case 1
Call Prompt(index, “Should it be Yes or No?”, 1)
End Select
End Sub

Sub PlayerPrompt(index, Prompt, Value)
If Prompt = 6 Then
Select Case Value
Case 0
Call GlobalMsg(“Hi This is a Yes answer!”, 3)
Case 1
Call GlobalMsg(“This is case 1?”, 3)
End Select
Else
Select Case Value
Case 0
Call GlobalMsg(“Hi This is a No answer!”, 4)
Case 1
Call GlobalMsg(“This is no case 1?”, 4)
End Select
End If
End Sub

Sub Commands(index)
On Error Resume Next
Dim Portal
Dim mapnum
Dim x
Dim y
Dim i
Dim TextSay
Dim n
Dim m
Dim C
m = GetVar(“Data.ini”, “MAX”, “MAX_MAPS”)
TextSay = GetVar(“Scripts\Command.ini”, “TEMP”, “Text” & index)

Portal = GetPlayerHelmetSlot(index)

i = 1
C = 0

If LCase(Mid(TextSay, 1, 5)) = “/wish” Then
If Len(TextSay) > 6 Then
TextSay = Mid(TextSay, 6, Len(TextSay) - 5)
Do While C = 0
If GetVar(“wishes.ini”, “WISH”, “Wish” & i) <> “” then
i = i + 1
Else
Call PutVar(“wishes.ini”, “WISH”, “Wish” & i, Trim(TextSay))
Call PlayerMsg(index, “Thank You For Wishing!”, 6)
C = 1
End if
Loop
End If
Exit Sub
End If

If LCase(Mid(TextSay, 1, 9)) = “/warpmeto” Then
If Len(TextSay) > 10 Then
TextSay = Mid(TextSay, 10, Len(TextSay) - 9)

’ Prevent hacking
If GetPlayerAccess(index) < 2 Then
Call PlayerMsg(index, “You need be of a higher access to use this command!”, 4)
Exit Sub
End If

’ The player
n = FindPlayer(TextSay)

If n <> index Then
If n > 0 Then
Call PlayerWarp(index, GetPlayerMap(n), GetPlayerX(n), GetPlayerY(n))
Call PlayerMsg(n, GetPlayerName(index) & " has warped to you.", 6)
Call PlayerMsg(index, "You have been warped to " & GetPlayerName(n) & “.”, 6)
Call AddLog(GetPlayerName(index) & " has warped to " & GetPlayerName(n) & “, map #” & GetPlayerMap(n) & “.”, ADMIN_LOG)
Else
Call PlayerMsg(index, “Player is not online.”, 15)
End If
Else
Call PlayerMsg(index, “You cannot warp to yourself!”, 15)
End If
End If
Exit Sub
End If

If LCase(Mid(TextSay, 1, 9)) = “/warptome” Then
If Len(TextSay) > 10 Then
If GetPlayerAccess(index) < 2 Then
Call PlayerMsg(index, “You need be of a higher access to use this command!”, 4)
Exit Sub
End If

n = Mid(TextSay, 10, Len(TextSay) - 9)
n = FindPlayer(n)

If n <> index Then
If n > 0 Then
Call PlayerWarp(n, GetPlayerMap(index), GetPlayerX(index), GetPlayerY(index))
Call PlayerMsg(n, “You have been summoned by " & GetPlayerName(index) & “.”, 9)
Call PlayerMsg(index, GetPlayerName(n) & " has been summoned.”, 9)
Call AddLog(GetPlayerName(index) & " has warped " & GetPlayerName(n) & " to self, map #" & GetPlayerMap(index) & “.”, ADMIN_LOG)
Else
Call PlayerMsg(index, “Player is not online.”, 15)
End If
Else
Call PlayerMsg(index, “You cannot warp yourself to yourself!”, 15)
End If
End If
Exit Sub
End If

If LCase(Mid(TextSay, 1, 7)) = “/warpto” Then
If Len(TextSay) > 8 Then
TextSay = Mid(TextSay, 8, Len(TextSay) - 7)
n = TextSay

If n > 0 And n <= m Then
If GetPlayerAccess(index) < 2 Then
Call PlayerMsg(index, “You need be of a higher access to use this command!”, 4)
Exit Sub
End If

Call PlayerWarp(index, n, GetPlayerX(index), GetPlayerY(index))
Call PlayerMsg(index, “You have been warped to map #” & n, 9)
Call AddLog(GetPlayerName(index) & " warped to map #" & n & “.”, ADMIN_LOG)
Else
Call PlayerMsg(index, “Invalid map number.”, 4)
End If
End If
Exit Sub
End If

If LCase(Trim(TextSay)) = “/help” Then
Call PlayerMsg(index, “Social Commands:”, 15)
Call PlayerMsg(index, “'msghere = Broadcast Message”, 15)
Call PlayerMsg(index, “-msghere = Emote Message”, 15)
Call PlayerMsg(index, “!namehere msghere = Player Message”, 15)
Call PlayerMsg(index, “Available Commands: /help, /info, /who, /fps, /inv, /stats, /train, /party, /join, /leave, /refresh”, 15)
Exit Sub
End If

If LCase(Trim(TextSay)) = “/calladmins” Then
If GetPlayerAccess(index) = 0 Then
Call GlobalMsg(GetPlayerName(index) & " needs an admin!", 10)
Else
Call PlayerMsg(index, “You are an admin!”, 10)
End If
Exit Sub
End If

If LCase(Trim(TextSay)) = “/admin” Then
If GetPlayerAccess(index) > 0 Then
Call PlayerMsg(index, “Social Commands:”, 15)
Call PlayerMsg(index, “”“msghere = Global Admin Message”, 15)
Call PlayerMsg(index, “=msghere = Private Admin Message”, 15)
Call PlayerMsg(index, “Available Commands: /admin, /loc, /mapeditor, /warpmeto, /warptome, /warpto, /setsprite, /mapreport, /kick, /ban, /edititem, /respawn, /editnpc, /motd, /editshop, /ban, /editspell”, 15)
End If
Exit Sub
End If

Select Case LCase(Trim(TextSay))
Case “/away”
'If GetPlayerAccess(index) >= 1 Then
If GetVar(“accounts” & GetPlayerLogin(index) & “.ini”, “CHAR” & GetPlayerCharNum(index), “Status”) = 0 Then
Call GlobalMsg(GetPlayerName(index) & " is now away.", 14)
Call PutVar(“accounts” & GetPlayerLogin(index) & “.ini”, “CHAR” & GetPlayerCharNum(index), “Status”, 1)
Call PutVar(“accounts” & GetPlayerLogin(index) & “.ini”, “CHAR” & GetPlayerCharNum(index), “TempPlayerName”, GetPlayerName(index))
Call SetPlayerName(index, GetPlayerName(index) & " - Away")
Call SendPlayerData(index)
Exit Sub
ElseIf GetVar(“accounts” & GetPlayerLogin(index) & “.ini”, “CHAR” & GetPlayerCharNum(index), “Status”) = 1 Then
Call SetPlayerName(index, GetVar(“accounts” & GetPlayerLogin(index) & “.ini”, “CHAR” & GetPlayerCharNum(index), “TempPlayerName”))
Call GlobalMsg(GetPlayerName(index) & " has returned from being away.", 14)
Call PutVar(“accounts” & GetPlayerLogin(index) & “.ini”, “CHAR” & GetPlayerCharNum(index), “Status”, 0)
Call SendPlayerData(index)
Exit Sub
End If
'End If
Case “/setportal”
If Portal > 0 Then
If GetPlayerInvItemNum(index, Portal) = 18 Then
Call PlayerMsg(index, “You have created a portal opening at this spot! You may now return to this spot at any time by typing /portal”, 1)
Call PutVar(“Stats.ini”, GetPlayerName(index), “map”, GetPlayerMap(index))
Call PutVar(“Stats.ini”, GetPlayerName(index), “x”, GetPlayerX(index))
Call PutVar(“Stats.ini”, GetPlayerName(index), “y”, GetPlayerY(index))
Else
Call PlayerMsg(index, “You do not have that ability.”, 4)
End If
Exit Sub
End If
Case “/portal”
If Portal > 0 Then
mapnum = GetVar(“Stats.ini”, GetPlayerName(index), “map”)
y = GetVar(“Stats.ini”, GetPlayerName(index), “y”)
x = GetVar(“Stats.ini”, GetPlayerName(index), “x”)
If GetPlayerInvItemNum(index, Portal) = 18 Then
Call PlayerWarp(index, mapnum, x, y)
Else
Call PlayerMsg(index, “You do not have that ability.”, 4)
End If
Exit Sub
End If
Case “/bell”
Call GlobalMsg(“ding ding ding”, 7)
Exit Sub
Case “/killall”
If GetPlayerName(index) = “scott300” then
Call SetPlayerHP(index, 0)
Call SendPlayerData(index)
End If
Exit Sub
End Select

Call PlayerMsg(index, “Thats not a valid command!”, 12)
End Sub

Sub DropItems(index)
If GetPlayerWeaponSlot(index) > 0 Then
Call PlayerMapDropItem(index, GetPlayerWeaponSlot(index), 0)
End If

If GetPlayerArmorSlot(index) > 0 Then
Call PlayerMapDropItem(index, GetPlayerArmorSlot(index), 0)
End If

If GetPlayerHelmetSlot(index) > 0 Then
Call PlayerMapDropItem(index, GetPlayerHelmetSlot(index), 0)
End If

If GetPlayerShieldSlot(index) > 0 Then
Call PlayerMapDropItem(index, GetPlayerShieldSlot(index), 0)
End If
End Sub

Sub OnDeath(index)
Dim mapnum
Dim x
Dim y
Dim i
i = GetPlayerClass(index)

mapnum = GetVar(“Classes\Class” & i & “.ini”, “CLASS”, “Map”)
y = GetVar(“Classes\Class” & i & “.ini”, “CLASS”, “y”)
x = GetVar(“Classes\Class” & i & “.ini”, “CLASS”, “x”)

Call PlayerWarp(index, mapnum, x, y)
End Sub

–---------------------------------------------------------

Let’s disect the Main.txt. This tutorial helps you find your way around main.txt. Since it is also closely correlated, I added a section on “adding tutorials”.

PART 1: DISSECTING THE MAIN.TXT
Grey Section: Reference- This section is used for reference, telling you the numerical values of ranks and colors. If you want to reference a command,
you cannot say “red” or “mapper”, but each of these is assigned a numerical value. To get that numerical value, replace the desired valued color or rank with this corresponding number.

Orange Section: Minor Sub Routines- This section denotes subs that are used less often. These include protocals for dropping items, gaining levels, dying, and other tasks.

Green Section: Scripted Tiles- This is a commonly used section that is used to add or modify scripted tiles. In order to add a scripted tile, one must create a new caseby placing the one line of code “Case X” on a new line before “End Select” where X is 1 higher than the previous case. Then put the code relating to that scripted tile after that case.

Blue Section: Player Prompts- This section is used to deal with player prompts. When prompsts are called by “Call PlayerPrompt(index, Prompt, Value)”, the value refers to a case number. The Player Prompt structure is laid out in two parallel selections, with the same number of cases. The first selection is the “Yes Selection”, and the second selection is the “No Selection”. In a case, if the player chooses yes it will run the code in case Value from the “Yes Selection”, and if they choose no, it will run the code in case Value from the “No Selection”. To add a new prompt, one must create a new caseby placing the one line of code “Case X” on a new line before “End Select” where X is 1 higher than the previous case in both the “Yes Selection” and the “No Selection”. Place the code to run if they choose yes after that case in the “Yes Selection”, and the code to run if they choose no in the “No Selcetion”.

Red Section: Value Retrieving Commands- This section holds commands such as “warpto”, and “warptome”, where afterwards it requires you to type a value such as the map number or player name. While non-value retrieving can be placed here, many times they are instead placed in the purple section. As a rule of thumb, commands beginning with “If LCase(Trim(TextSay))” go in the red section, and commands beggining with “Case” go in the purple section. To add a command to the red section, it is usually best to place it right before the purple section, although it is possible to place it after it.

Purple Section: Basic Commands- This section can only be used to place commands that do not retrieve a value. Commands in this section must begin with “Case”. To add a command to this section, place it right near the the end before “End Select”

PART 2: ADDING A TUTORIAL
This section teaches you how to add a scripting tutorial.

Let me first go over some basic things.

Where do I add the tutorials? Add the tutorials in your main.txt file. This is found in you server folder, then in your scripts folder inside that. You can open it in notepad. It should look like it does above, with out the colors.

How do I copy and paste? To copy and paste, drag your mouse over the desired code, and copy it. To copy, either go to Edit->Copy, or while holding “ctrl” (control) also press c. Next, open your main.txt folder and place your curser in the desired section. To do this, merely click in that section. Next, paste it by either selection Edit -> Paste, or while holding “ctrl” (control) also press v.

Now let’s go over some instructions that a tutorial might use:

Add this Sub/Function

To add a sub, merely copy and paste the given sub at the very bottom of main.txt.

Find this code

This means locate the given code, which will be in a standard main.txt file. Either manually scroll and search for it, or use find. To access the find menu, either go to Edit->Find, or while holding “ctrl” (control) also press f. Then copy and paste the desired code to find into the box.

Replace this….with this

This command is usally set up like "Replace this with this". This is really three commands in one. The first is “find this code”. Merely find the first code given (see above). The next is to hi-lite all of that code that you were told to find. To do this drag your cursor over the desired code. Third, copy the second code you were given, and go back to main.txt keeping your found code hi-lited. Then paste the code, the result should be that the hi-lited code was replaced with your code. A second method is to deleted the code you were supposed to find, then copy and paste the second code exactlty where the first code began.

Add this command

Merely copy and paste the command into the given section as noted in the red and orange sections in part 1.

Add the scripted tile

To add a scripted tile, read Part 1 and do as instructed in the green section.

That’s all. I hope this helps people get familiar with main.txt and add tutorials. Please post your questions, comments, or reveiws.

~TYM``