Snok's Makro

Aus Arindal Wiki

Wechseln zu: Navigation, Suche

Snok's Makros ist ein Sammlung verschiedener (für Krieger nützlicher) Funktionen, die sich leicht einbinden und in andere Sprachen übersetzen lassen. Man kann sie hier herunterladen

Inhaltsverzeichnis

Grundlagen

Übersicht über die Funktionen

Snok's Makros hat folgende Funktionen:

  • Auswählen verschiedener Waffen und Schilde auf Knopfdruck
  • Komfortables Benutzen einer Fackel (ähnlich Alby's Fackelmakro)
  • Schnelles Entzünden eines Lagerfeuers
  • Einfaches Pflanzen von Kudzus
  • Erstellen von Screenshots
  • Komfortables Nutzen der Bank 1 Meile westlich von Arilon
  • Führungs- und Ruffunktionen auf dem Numblock (z. B. "/yell West <---")
  • Einfaches und schnelles herumkommandieren von Reizende über Numblock
  • Anlegen der Geldbörse
  • Push und Pull für geklickte, ausgewählte oder im Texteingabefeld genannte Spieler
  • Verhindern eines automatischen Logouts wegen Untätigkeit
  • Zeit- und Framemessung
  • Musizieren auf Instrumenten - solo, im Duett oder zu dritt

Einbinden

Zum Einbinden der Makros sind zwei Dinge zwingend notwendig:

1. Die Datei "Snok_main" muss mit include eingebunden werden (zum Beispiel in Default):

include "Snok_main"

2. Es muss die Funktion @login um den Funktionsaufruf "call start_SNOK" ergänzt oder neu erstellt werden.

@login 
{
  call start_SNOK
}

Anpassen

Zum Anpassen kann man verschiedene globale Variablen setzen.

Um sich seine Waffen und Schilde einzustellen, setzt man die globalen Variablen "weapons" und "shields". Man schreibt einfach die Namen (am Besten die Kurznamen) der Waffen und Schilde hintereinader. Hierbei werden immer die erste Waffen und das erste Schild, die zweite Waffe und das zweite Schild, usw. zu einem Paar zusammengefasst. Man kann auch Itemnummern benutzen.

Mit folgendem Code zum Beispiel kann man sich einen Knüppel und ein Holzschild, und einen Dolch (mit der Nummer 1) und ein Holzschild als Waffen/Schild-Paar einstellen:

setglobal weapons "%club %dggr 1"
setglobal shields "%wdsh %wdsh"

Man kann auch 2 Slogans festlegen, die mit den Tasten Numpad-7 und Numpad-9 gerufen (/yell) werden.

setglobal slogan "Hier komm' ich!"
setglobal slogan2 "Jetzt geht's los!"

Um beim Erstellen von Screenshots ein Blitzlicht zu erhalten, muss man die Höhe des Nachtlevels in Prozent (wie bei dem Befehl /pref maxnightpercent) in der Variablen "photoflash" speichern. (Wird die Variable nicht gesetzt, hat man beim Screenshot kein Blitzlich). Folgendes Beispiel setzt das Nachtlevel nach einen Screenshot mit Blitzlich auf 50 Prozent:

setglobal photoflash 50

Zur automatischen Verhinderung von ungewollten automatischen Logoffs wegen Untätigkeit ("Du warst zu lange untätigt. Bitte mache etwas, damit du nicht vom Spiel getrennt wirst."), kann man die Variable "no-logoff" setzen:

setglobal no-logoff 1

Die Sprachanpassung nimmt man mit den Variablen "client_lang" und "lang" vor, wobei als Client-Sprache nur "german" und als Sprache "german" und "english" möglich sind:

setglobal client_lang "german"
setglobal lang "english"

Zu letzt kann man noch einstellen, dass man Meldungen (zum Beispiel, ob der Modus des Numblocks gerade auf das Kommandieren von Reizende umgestellt wurde) und dass man Debug-Informationen erhalten möchte (1 für AN).

setglobal verbose 1
setglobal debug 1

Wird eine Variable nicht gesetzt, wird ein Standard-Wert eingestellt.

Tastenbelegung

F1: Kudzu pflanzen
F2: Lagerfeuer entzünden (mit Hilfe von Zunderbüchse und Holz (siehe Gegenstände))
F3: Fackel anlegen und entzünden / löschen und einpacken
F4: Bankgeschäfte erledigen (negativer Betrag in der Textzeile: Betrag einzahlen; positiver Betrag in der Textzeile: Betrag abheben; ansonsten: Kontostand erfragen)
F5: Primärwaffe und Primärschild anlegen
F6: Nächste Waffen- und Schildkombination als primär einstellen und anlegen.
F7: Geldbörse anlegen
F8: Zeitmessung starten bzw. beenden
Druck: Screenshot in das Verzeichnis \data\Screenshots erstellen
Strg + Druck: dito, aber ohne Blitzlicht
Nummernblock-
1: "?" rufen oder Reizende nach Südwesten schicken
2: "Süden" rufen oder Reizende nach Süden schicken
2 + Strg: "Am Südrand sammeln" rufen oder Reizende nach Süden schicken
3: "!" rufen oder Reizende nach Südosten schicken
4: "Westen" rufen oder Reizende nach Westen schicken
4 + Strg: "Am Westrand sammeln" rufen oder Reizende nach Westen schicken
5: "Hier sammeln" rufen oder Reizende sich selbst heilen lassen
6: "Osten" rufen oder Reizende nach Osten schicken
6 + Strg: "Am Ostrand sammeln" rufen oder Reizende nach Osten schicken
7: Einen Slogan rufen (sollte unbedingt an den Charakter angepasst werden) oder Reizende nach Nordwesten schicken
8: "Norden" rufen oder Reizende nach Norden schicken
8 + Strg: "Am Nordrand sammeln" rufen oder Reizende nach Nordne schicken
9: Einen anderen Slogan rufen (sollte unbedingt an den Charakter angepasst werden) oder Reizende nach Nordosten schicken
0: "Rückzug" rufen oder Reizende sharen
+: "Fallen" rufen oder nach Reizende rufen
,: Umschalten zwischen dem Modus "Reizende kommandieren" und dem normalen Verhalten der Numblock-Tasten
Maus-
rad hoch: /push für den markierten oder im Textfeld genannten Spieler
rad runter: /pull für den markierten oder im Textfeld genannten Spieler
taste rechts /pull auf den geklickten Spieler
taste rechts + Strg /push auf den geklickten Spieler

Textkommandos

"/bard": Bardenlieder spielen. Näheres siehe bard
"/measure:" Zeitmessung durchführen. Näheres siehe tmeasurement
"/configure:" Einstellungen an Snok's Makros während des laufenden Spiels vornehmen (gehen bei Neustart verloren). Nähers siehe configure

Tiefergehendes

Trigger einstellen

Um Trigger anzupassen (das sind Tasten, Mausklicks oder Sätze, die in das Eingabefeld eingegeben wurden), kann man in der Datei Snok_trigger die vorhandenen Trigger anpassen oder neue hinzufügen.

Man kann auch auf Ereignisse reagieren, die im Textfenster des Clients erscheinen. Hierzu kann man in der Funktion "cognition" einen weiteren "else if text >= <Ereignis-Text>"-Zweig gefolgt von einem Funktionsaufruf oder anderen Makro-Kommandos notieren. "<Ereignis-Text>" ist dabei ein Satz oder eine Variable, die einen Satz enthält, der im Textfenster erscheint und auf den reagiert werden soll.

*****************
* Trigger file  *
*****************
*------------------------------------------------------------------------------*
* Put trigger configurations here                                              *
* A complete list of all functions within this macros can be found in          *
*   "Snok_functions"                                                           *
*******************************************************************************/ 

/*************
*Kudzu setzen*
*************/
F1 call kudzu //plant a kudzu seedling (requieres kudzu seedling)

/**********
*Zündfunke*
**********/
F2 call fire //make a campfire (requieres wood and tinder)

/****************
*Fackel benutzen*
****************/
F3 call torch //light or extinguish your torch (requieres torch)

/*************
*Geld bewegen*
*************/
F4 call bank //Deposit or withdraw money or get your bank balance

/*****************
*Schild & Schwert*
*****************/
F5 
{
	call eq_shield //equip your primary shield (as defined in shields)
	call eq_weapon //equip your primary weapon (as defined in weapons)
}

/***************************
*Standardausrüstung ändern *
***************************/
F6
{
	call next_arms //set your next arms (as defined in shields and weapons) as your primary arms
	call eq_shield //equip your primary shield
	call eq_weapon //equip your primary weapon
}

/**********************
*Geldbeutel festhalten*
**********************/
F7 call purse //equip your purse (requieres purse)

/*********************
*Screenshot erstellen*
*********************/
print call screenshot //Take a screenshot (only with the client for Windows)

CONTROL-print //Take a screenshot without photoflash
{
	set photoflash_temp photoflash
	setglobal photoflash -1
	call screenshot
	setglobal photoflash photoflash_temp
}

/********
*Drücken*
********/
wheelup call push //Push selected or in input box named player
control-click2 call push //Push the right-clicked player

/*******
*Ziehen*
*******/
wheeldown call pull //Pull selected or in input box named player
click2
{
	$no_override //Keep the right-click menu enabled
	call pull //Pull the right-clicked player
}

/*************
* Musizieren *
*************/
"/bard" call bard //Play bard music with others

/**************
* Zeitmessung *
**************/
"/measure" call tmeasurement //Measure time from first to second activation
F8 call tmeasurement //Measure time from first to second activation

/****************
* Konfiguration *
****************/
"/configure" call configure //Change global variables while playing

/************************************
* Führungsbefehle für Numpad-Tasten *
************************************/

numpad-1 call southwest //"?"
control-numpad-1 call southwest2

numpad-2 call south //"s"
control-numpad-2 call south2

numpad-3 call southeast //"!"
control-numpad-3 call southeast2

numpad-4 call west //"w"
control-numpad-4 call west2

numpad-5 call center //"Sammeln"
control-numpad-5 call center2

numpad-6 call east //"e"
control-numpad-6 call east2

numpad-7 call northwest //"?"
control-numpad-7 call northwest2

numpad-8 call north //"n"
control-numpad-8 call north2

numpad-9 call northeast //"!"
control-numpad-9 call northeast2

numpad-0 call downstairs //"Rückzug", "/share reizende"
control-numpad-0 call downstairs2

numpad-+ call upstairs //"Fallen!", "/yell Reizende where are you"
control-numpad-+ call upstairs2

numpad-. call command_reizende //Toggle "command Reizende" mode

/********************************************
* Ereignisse im Nachrichtenfenster triggern *
*********************************************
*------------------------------------------------------------------------------*
* This function provides a potentiality to trigger events which are present in *
* the textlog. Simply add an "else if text >= <message>"-construct (where      *
* <message> is a string, substring or variable which marks the event) and add  *
* a function call or macro commands to the following line(s). Be sure this     *
* call or commands are followed by another "else if"-construct or by "end if"  *
*******************************************************************************/
cognition
{
	label loop
	set text @env.textlog
	if text >= lang_logout_warning
		call sleepy
	// else if text >= "<another trigger>"
		//Another Call or macro code
	end if
	pause 1
	goto loop
}

Übersetzungen

Übersetzungen können in der Datei "Snok_language" vorgenommen werden. Hier sind alle von den Funktionen der Makros verwendeten Sätze und Gegenstände abgelegt:

*****************
* Language file *
****************/
/*------------------------------------------------------------------------------
* If you want to translate these macros or want to extend them you should write*
*   all needed items and sentences into this file                              *
*******************************************************************************/

set_lang
{
	if client_lang == "german"
		//WOOD related
		setglobal lang_wood "Stück Holz"
		setglobal lang_fir "Stück Fichtenholz"
		setglobal lang_oak "Stück Eichenholz"
		setglobal lang_tinder "Zunderbüchse"

		//ALCOHOL
		setglobal lang_beer "Bierkrug"
		setglobal lang_mead "Mit Met gefülltes Trinkhorn"
		
		//Instruments
		setglobal lang_bard_dodelmuzak "Test Dodelmuzak"
		setglobal lang_bard_fluote "Test Fluote"
		setglobal lang_bard_gitor "Test Gitor"
		setglobal lang_bard_kassrole "Test Kassrole"
		setglobal lang_bard_konshell "Test Konshell"
		setglobal lang_bard_ocarina "Test Ocarina"
		setglobal lang_bard_orgadrom "Test Orgadrom"
		setglobal lang_bard_tojo "Test Tojo"
		setglobal lang_bard_trifluote "Test Trifluote"
		setglobal lang_bard_tuborn "Test Tuborn"
		setglobal lang_bard_vibra "Test Vibra"
		setglobal lang_bard_violine "Test Violine"
		setglobal lang_bard_xylo "Test Xylo"
		setglobal lang_bard_glyxlyre "Test Glyxlyre"
		setglobal lang_bard_harpete "Test Harperte"
		setglobal lang_bard_playing "zu spielen."

		//Others
		setglobal lang_nothing "Nichts"
		setglobal lang_bank_balance "Kontostand"
		setglobal lang_bank_withdraw "Abheben"
		setglobal lang_bank_deposit "Einzahlen"
		setglobal lang_logout_warning "•••"
		//setglobal lang_logout_warning "Bitte mache etwas, damit du nicht vom Spiel getrennt wirst." //Due to a bug in windows client above message should be used
		setglobal lang_language_delimiter "%l1"
	//else if client_lang == "<other language>"
		//Uncomment above comment, replace <other language> and implement other languages here
	else
		setglobal client_lang "german"
		call set_lang
	end if
	
	if lang == "german"
		//Schwerwiegende Fehler
		setglobal lang_err_time_timestamps "Bitte aktiviere Zeitstempel für volle Funktionalität. Tippe \"/pref timestamps true\" ohne Anführungszeichen ein und drücke Enter"
		
		//Debug
		setglobal lang_debug_done "-- Erledigt!"
		setglobal lang_debug_equiped "angelegt"
		setglobal lang_debug_saved_item "-- Gespeicherter Gegenstand: "
		setglobal lang_debug_screenshot "-- Erstelle Screenshot nach (Arindalverzeichnis)/data/Screenshots/"
		setglobal lang_debug_clicked "-- Geklickt: "
		setglobal lang_debug_selected "-- Selektiert: "
		setglobal lang_debug_unknown "unbekannt"
		
		//"Wortreich"
		setglobal lang_verbose_weapon "* Deine Primärwaffe ist nun: "
		setglobal lang_verbose_shield "* Dein Primärschild ist nun: "
		setglobal lang_verbose_on "AN"
		setglobal lang_verbose_off "AUS"
		setglobal lang_verbose_command_reizende "* Reizende mit Richtungsbefehlen kommandieren: "
		setglobal lang_verbose_language "Sprache: "
		setglobal lang_verbose_client_language "Client-Sprache: "
		setglobal lang_verbose_nightlevel "Dunkelheitswert: "
		setglobal lang_verbose_avoid_logout "Verhindere Auto-Logoff"
		setglobal lang_verbose_song "Lied"
		setglobal lang_verbose_selected "ausgewählt"
		setglobal lang_verbose_primo "Erste Stimme:"
		setglobal lang_verbose_sekundo "Zweite Stimme:"
		setglobal lang_verbose_tertio "Dritte Stimme:"
		setglobal lang_verbose_seconds "Sekunde(n)"
		setglobal lang_verbose_minutes "Minute(n)"
		setglobal lang_verbose_hours "Stunde(n)"
		setglobal lang_verbose_measured "gemessen"
		setglobal lang_verbose_frames "Frames"
		setglobal lang_verbose_per "pro"
		
		//Übriges
		setglobal lang_time_measurement "Zeitmessung"
		setglobal lang_begining "Starte"
		setglobal lang_o_clock "Uhr"
		setglobal lang_rl_time "RL-Zeit"
		setglobal lang_intermediate_result "Zwischenstand"
		setglobal lang_end_result "Endstand"
		
	else if lang == "english"
		//Fatal errors		
		setglobal lang_err_time_timestamps "Please activate timestamps for full functionality. Type in \"/pref timestamps true\" wihtout quotation marks and press enter"
		
		//Debug
		setglobal lang_debug_done "-- Done!"
		setglobal lang_debug_equiped "equipped"
		setglobal lang_debug_saved_item "-- Saved Item: "
		setglobal lang_debug_screenshot "-- Creating screenshot into (arindaldirectory)/data/Screenshots/"
		setglobal lang_debug_clicked "-- Clicked: "
		setglobal lang_debug_selected "-- Selected: "
		setglobal lang_debug_unknown "unknown"
				
		//Verbose
		setglobal lang_verbose_weapon "* Now your primary weapon is: "
		setglobal lang_verbose_shield "* Now your primary shield is: "
		setglobal lang_verbose_on "ON"
		setglobal lang_verbose_off "OFF"
		setglobal lang_verbose_command_reizende "* Command Reizende with diretion commands: "
		setglobal lang_verbose_language "Language: "
		setglobal lang_verbose_client_language "Client language: "
		setglobal lang_verbose_nightlevel "Nightlevel set to "
		setglobal lang_verbose_avoid_logout "Avoiding auto-logoff"
		setglobal lang_verbose_song "Song"
		setglobal lang_verbose_selected "selected"
		setglobal lang_verbose_primo "Primo voice:"
		setglobal lang_verbose_sekundo "Sekundo voice:"
		setglobal lang_verbose_tertio "Tertio voice:"
		setglobal lang_verbose_seconds "second(s)"
		setglobal lang_verbose_minutes "minute(s)"
		setglobal lang_verbose_hours "hour(s)"
		setglobal lang_verbose_measured "measured"
		setglobal lang_verbose_frames "frames"
		setglobal lang_verbose_per "per"
		
		//Others
		setglobal lang_time_measurement "time measurement"
		setglobal lang_begining "Begining"
		setglobal lang_o_clock "o'clock"
		setglobal lang_rl_time "RL time"
		setglobal lang_intermediate_result "intermediate result"
		setglobal lang_end_result "end result"
		
	//else if lang == "<other language>"
		//Uncomment above comment, replace <other language> and implement other languages here
	else
		setglobal lang "english"
		call set_lang
	end if
}

/*****************
* german ID list *
****************************
* Bierkrug: %brmg          *
* Brombeerstrauch: %bram   *
* Fackel: %trch            *
* Dolch: %dggr             * <-- Doesn't work for if-construction due to a bug
* Kurzschwert: %shsw       *
* Gedankenkristall: %mdcy  *
* Geldbörse: %prse         *
* Holzschild: %wdsh        *
* Kudzusetzling: %kdzu     *
* Trainingsdolch: %trdg    *
* Wurzelholzknüppel: %club *
***************************/

Funktionen

Alle Funktionen befinden sich in der Datei "Snok_functions". Ich werde hier nicht den genauen Funktionsmechanismus der Funktionen aufzeigen, sondern aufführen, was sie im Endeffekt machen und den Code angeben.

Alle Funktionen sind so ausgelegt, dass sie möglichst wenig Output im Infofenster erzeugen und überprüfen deshalb immer, ob ein Item bereits angelegt ist, bevor sie es anzulegen versuchen und ähnliches.

kudzu

Kudzu speichert das Item der linken Hand, nimmt einen Kudzusetzling in die Hand, pflanzt ihn ein und nimmt das gespeicherte Item wieder in die Hand.

/****************
* Plant-a-Kudzu *   (Plant a kudzu)
****************/
kudzu
{
	if @my.left_item != "%kdzu" //check if we haven't a kudzu equipped
		setglobal left_temp @my.left_item //remember our current item
		if debug == 1
			message lang_debug_saved_item left_temp
		end if
		"/equip %kdzu" "\r" //equip a kudzu seedling
	end if
	pause 1
	if @my.left_item == "%kdzu" //check if we could equip a kudzu seedling
		"/useitem %kdzu" "\r" //plant a kudzu
	end if
	if @my.left_item != left_temp //check if we should recall an item
		if left_temp != lang_nothing //check if our hand was empty before
			"/equip " left_temp "\r" //recall our item
		end if
	end if
}

fire

Fire nimmt eine Zunderbüchse in die Hand und, wenn dies erfolgreich war, ein beliebiges Stück Holz (außer Eisenholz) in die andere Hand. Anschließend entzündet es das Stück Holz und legt die ursprüngliche Ausrüstung wieder an.

/***********
* Campfire *   (Make a campfire)
***********/
fire
{
	setglobal left_temp @my.left_item //save actual items
	setglobal right_temp @my.right_item //save actual items
	if debug == 1
		message lang_debug_saved_item left_temp
		message lang_debug_saved_item right_temp
	end if
	if @my.right_item != lang_tinder //check if we haven't tinder equipped
		"/equip " lang_tinder "\r" //equip tinder
	end if
	if @my.right_item != lang_tinder //check if tinder is equiped
		goto have_wood //if we have no tinder, we can't make a campfire, so we'll jump near to the end
	end if
	//is any piece of wood already equipped?:
	if @my.left_item == lang_wood 
		set wood 1
		goto have_wood
	else if @my.left_item == lang_fir
		set wood 1
		goto have_wood
	else if @my.left_item == lang_oak
		set wood 1
		goto have_wood
	end if
	//try to equip any piece of wood:
	"/equip " lang_wood "\r"
	if @my.left_item == lang_wood
		set wood 1
		goto have_wood
	end if
	"/equip " lang_fir "\r"
	if @my.left_item == lang_fir
		set wood 1
		goto have_wood
	end if
	"/equip " lang_oak "\r"
	if @my.left_item == lang_oak
		set wood 1
		goto have_wood
	end if
	//now we'll check, if we have wood and tinder equiped
	label have_wood
	if wood == 1 //wood equiped		
		if @my.right_item == lang_tinder //tinder equiped
			"/use" "\r" //make our campfire
		end if
	end if
	//get our saved items back
	if @my.left_item != left_temp
		"/equip " left_temp "\r"
	end if
	if @my.right_item != right_temp
		"/equip " right_temp "\r"
	end if
}

torch

torch legt eine Fackel an und entzündet diese. Brennt die Fackel aus, wird eine neue Fackel angelegt und entzündet. Ist keine Fackel mehr vorhanden oder wird torch erneut ausgelöst, legt es den vorherigen Gegenstand wieder an. Wird ein anderer Gegenstand anstelle der Fackel angelegt, schaltet torch automatisch ab.

/********************
* Enlightenment! ^^ *   (Light or extinguish your torch)
********************/
torch
{
	if torch_on != 1 //Torch not buring
		setglobal torch_left_item @my.left_item //Save our current item
		if debug == 1
			message lang_debug_saved_item torch_left_item
		end if
		if @my.left_item != "%trch" //We have no torch equiped
			"/equip %trch 1" "\r" //Try and equip a torch
			pause 1
		end if
		if @my.left_item == "%trch" //If we have a torch equiped: let's go!
			"/useitem %trch /light" "\r" //Turn the torch on
			setglobal torch_on 1 //Remember, that the torch is on
			
			label torch_check //It's a loop to check, if our torch is burning
			if @my.left_item == "%trch" //If our torch is equiped
				pause 12 //ca. 3 seconds
				if torch_on == 1 //Torch's burning, check again
					goto torch_check
				end if
			else //torch's burned out or is stored
				if @my.left_item == lang_nothing //torch probably burned out
					"/equip %trch" "\r" //Try and equip the next torch
					if @my.left_item == "%trch" //If we have another torch, enlight it
						"/useitem %trch /light" "\r"
						goto torch_check
					else //no other torch
						if torch_left_item != lang_nothing //Equip our saved item
							"/equip " torch_left_item "\r"
						end if
					end if
				else //equipped another item
					setglobal torch_on 0 //Remember: Torch is off
				end if
			end if		
		end if
	else //torch is on
		if @my.left_item == "%trch" //If our torch is still equiped, turn it off
			"/useitem %trch /extinguish" "\r"
			if torch_left_item != "%trch" //Need to unequip the torch
				"/unequip %trch" "\r"
			end if
		end if
		setglobal torch_on 0 //Remember: Torch is off
		if torch_left_item != lang_nothing //Restore our saved item
			if torch_left_item != "%trch"
				"/equip " torch_left_item "\r"
			end if
		end if
	end if
}

eq_weapon & eq_shield

eq_weapon und eq_shield legen jeweils die aktuell als primär festgelegte Waffe bzw. den aktuell als primär festgelegten Schild an. (next_arms legt die Primärausrüstung fest, s. u.)

/********
* Sword *   (Equip your primary weapon)
********/
eq_weapon
{
	if weapon != lang_nothing //We have at least one weapon defined
		if @my.right_item != weapon.word[0] //The weapon isn't already equiped
			"/equip " weapon "\r"
		end if
		if debug == 1
			message "--" weapon " " lang_debug_equiped
		end if
	end if
}
/*************
* Protection *   (Equip your primary shield)
*************/
eq_shield
{
	if shield != lang_nothing //We have at least one shield defined
		if @my.left_item != shield.word[0] //The shield isn't already equiped
			"/equip " shield "\r"
		end if
		if debug == 1
			message "--" shield " " lang_debug_equiped
		end if
	end if
}

next_arms

next_arms wertet die globalen Variablen shields und weapons aus und schreibt das jeweils nächste primäre Waffen-Schild-Paar in die Variablen weapon und shield, die von anderen Funktionen (vor allem eq_weapon und eq_shield, s. o.) benutzt werden können.

/************
* Next arms *   (Set the next armings from weapons and shields variables)
************/
next_arms
{
	setglobal arming_no + 1 //We'll increment the word in our arming list
	label next_arms_start //Here we can jump to without incrementing
	//The following word in our list (could be an item number):
	set arming_no_plus arming_no 
	set arming_no_plus + 1
	//Get our offsets caused by item numbers:
	set arming_no_weapon_offset arming_no 
	set arming_no_weapon_offset + weapon_offset
	set arming_no_shield_offset arming_no
	set arming_no_shield_offset + shield_offset
	//Get the following offsetted word in our list
	set arming_no_weapon_offset_plus arming_no_weapon_offset
	set arming_no_weapon_offset_plus + 1
	set arming_no_shield_offset_plus arming_no_shield_offset
	set arming_no_shield_offset_plus + 1
	//The number of the item, if exists
	set arming_shield_no "none"
	set arming_weapon_no "none"
 	if weapons.num_words <= arming_no_weapon_offset //Our weapon list is at an end: set everything to zero and start again
		if debug == 1
			message "-- No more weapons on weapon list"
		end if
		setglobal arming_no 0
		setglobal weapon_offset 0
		setglobal shield_offset 0
		goto next_arms_start
	else //more items on weapon list
		if weapons.word[arming_no_weapon_offset_plus].num_letters == 1 //We've an item number and should act so:
			set arming_weapon_no weapons.word[arming_no_weapon_offset_plus] //Set our current weapon item number
			setglobal weapon_offset + 1 //Increment the weapon list offset
		end if
	end if
	if shields.num_words <= arming_no_shield_offset //Our shield list is at an end: set everything to zero and start again
		if debug == 1
			message "-- No more shields on shield list"
		end if
		setglobal arming_no 0
		setglobal weapon_offset 0
		setglobal shield_offset 0
		goto next_arms_start
	else //more items on shield list
		if shields.word[arming_no_shield_offset_plus].num_letters == 1 //We've an item number and should act so:
			set arming_shield_no shields.word[arming_no_shield_offset_plus] //Set our current shield item number
			setglobal shield_offset + 1 //Increment the shield list offset
		end if
	end if
	if shields.num_words > 0 //We have at least one shield on our list
		setglobal shield shields.word[arming_no_shield_offset] //set our primary shield
	else //no shield on our list
		setglobal shield lang_nothing
	end if
	if weapons.num_words > 0 //We have at least one weapon on our list
		setglobal weapon weapons.word[arming_no_weapon_offset] //set our primary weapon
	else //no weapon on our list
		setglobal weapon lang_nothing
	end if
	if arming_shield_no != "none" //We've an item number for the current shield
		//Modify the shield with the number
		setglobal shield + " "
		setglobal shield + arming_shield_no
	end if
	if arming_weapon_no != "none" //We've an item number for the current weapon
		//Modify the weapon with the number
		setglobal weapon + " "
		setglobal weapon + arming_weapon_no
	end if
	if verbose == 1
		message lang_verbose_shield shield
		message lang_verbose_weapon weapon
	end if
	if debug == 1
		message "-- Weapon item number: " arming_weapon_no
		message "-- Shield item number: " arming_shield_no
		message "-- Arming No.: " arming_no
		message "-- Offsets: " shield_offset ", " weapon_offset
	end if
}
//Default values which causes next_arms to pick up the first weapon and shield on our lists
setglobal arming_no 255
setglobal weapon_offset 0
setglobal shield_offset 0

purse

Purse legt die Geldbörse an.

/********************
* Where's my money? *   (Equip your purse)
********************/
purse
{
	if @my.right_item != "%prse"
		"/equip %prse" "\r"
	end if
}

bank

Beim Gespräche mit einem Bankangestellten: bei einem positiven Wert im Eingabefeld zahlt bank den Betrag ein, bei einem negativen Wert hebt bank den Betrag ab, in allen anderen Fällen, erfragt bank den Kontostand.

/******************************
* Tell me where the money is! *   (Give a positive amount to deposit money, a negative to withdraw money, anything else to get your bank balance)
******************************/
bank
{
	if @text == ""
		goto bank_balance
	else
		if @text < 0 //Withdraw money
			set amount @text
			set amount * -1
			"/whisper " lang_bank_withdraw " " amount "\r"
		else if @text > 0 //Deposit money
			set amount @text		
			"/whisper " lang_bank_deposit " " amount "\r"
		else //Get your bank balance
			label bank_balance
			"/whisper " lang_bank_balance "\r"
		end if
	end if
}

pull

Mit pull wird ein angeklickter, selektierter oder im Textfeld namentlich genannter Spieler gepullt (Positionswechsel). Wird ein "Klick-Trigger" verwendet, wird immer die geklickte Person gezogen. Wird ein anderer Trigger verwendet, wird erst das Textfeld beachtet, danach die Selektion.

/******************************************
* Let me through. My father is healer. ^^ * (Pull a clicked, selected or in the input box named player)
******************************************/
pull
{
	if @click.name != "@click.name" //Using a click trigger
		if debug == 1
			message lang_debug_clicked @click.name
		end if
		"/pull " @click.name "\r"
	else if @text != "" //There is text in the input box
		//Test if it is a name
		if @text.num_words == 1
			set selected_player @selplayer.name
			set pull_text 1
			"/select " @text "\r"
		end if
		goto pull_selected //The name is now selected or there was no name
	else //The player is selected
		label pull_selected
		if @selplayer.name != ""			
			"/pull " @selplayer.name "\r"
		end if
		//If we have a selection because of a named player, we'll reselect the prior selected player:
		if pull_text == 1 
			if @selplayer.name != selected_player
				"/select " selected_player "\r"
			end if
		end if
	end if
}

push

Mit push wird ein angeklickter, selektierter oder im Textfeld namentlich genannter Spieler gepusht (ein Stückchen schieben). Wird ein "Klick-Trigger" verwendet, wird immer die geklickte Person geschoben. Wird ein anderer Trigger verwendet, wird erst das Textfeld beachtet, danach die Selektion.

/************************
* We'll get home *soon* * (Push a clicked, selected or in the input box named player)
************************/
push
{
	if @click.name != "@click.name" //Using a click trigger
		if debug == 1
			message lang_debug_clicked @click.name
		end if
		"/push " @click.name "\r"
	else if @text != "" //There is text in the input box
		//Test if it is a name
		if @text.num_words == 1
			set selected_player @selplayer.name		
			set push_text 1
			"/select " @text "\r"
		end if
		goto push_selected //The name is now selected or there was no name
	else //The player is selected
		label push_selected
		if @selplayer.name != ""			
			"/push " @selplayer.name "\r"
		end if
		//If we have a selection because of a named player, we'll reselect the prior selected player:
		if push_text == 1
			if @selplayer.name != selected_player				
				"/select " selected_player "\r"
			end if
		end if
	end if
}

screenshot

Screenshot erstellt einen Screenshot in das Verzeichnis (Arindalverzeichnis)\data\Screenshots\ (wenn gewünscht auch mit "Blitzlicht")

/***********************
* Remeber this scenery *   (Take a screenshot [Windows-client only, I guess])
***********************/
screenshot
{
	if debug == 1
		message lang_debug_screenshot
	end if
	if photoflash.word[0] <= 100		
		if photoflash.word[0] >= 0
			if debug == 1
				message "--Setting nightlevel to zero"
			end if
			"/pref maxnightpercent 0" "\r"
		end if
	end if
	"/screenshot" "\r"
	if photoflash.word[0] <= 100		
		if photoflash.word[0] >= 0
			if debug == 1
				message "--Restoring nightlevel to " photoflash.word[0]
			end if
			"/pref maxnightpercent " photoflash "\r"
		end if
	end if
}

sleepy

Bei einem Aufruf von "sleepy" wird eine Aktion ausgeführt (derzeit "/money"), die das automatische Ausloggen wegen Untätigkeit verhindert. "sleepy" wird standardmäßig durch die "Mache etwas, damit du nicht ausgeloggt wirst"-Warnung getriggert, also automatisch ausgeführt.

/******************
* Cogito ergo sum * (No auto-logoff)
******************/
sleepy
{
	if no-logoff == 1
		if verbose == 1
			message "* Snok's Macros: " lang_verbose_avoid_logout
		end if
		"/money" "\r"
	end if
}

tmeasurement

"tmeasurement" startet eine Zeitmessung beim ersten Aufruf und beendet sie beim zweiten Aufruf. Damit erweiterte Funktionen, wie die Berechnung der Framerate, genutzt werden können, müssen "Zeitstempel" im Client aktiviert sein.


Argumente:

  • Befindet sich beim Aufruf das Wort status im Eingabefeld, wird eine laufende Messung nicht beendet, sondern ein Zwischenstand ausgegeben.
/***************
* Guess? What? * (Measuring time in RL and in frames)
***************/
// usage: time [status]
// status - gives an intermediate result
// called without arguments: Start a chronometry / Stop a running chronometry
// called with status: Give an intermediate result without stoping the running chronometry

tmeasurement
{
	set time_index 0
	if time_end == 1
		goto status_or_end
	end if
	if @text >= "status"
		label status_or_end
		if time_end == 1
			message lang_time_measurement " " lang_end_result ":"
		else
			message lang_time_measurement " " lang_intermediate_result ":"
		end if
		pause 1
		if @env.textlog.word[1].letter[0] >= 0
			if time_start != lang_debug_unknown
				set time_end @env.textlog.word[1]
				message time_end lang_o_clock " " lang_rl_time
				set hour_end time_end.letter[time_index]
				set time_index + 1
				if time_end.letter[time_index] != ":"
					set hour_end * 10
					set hour_end + time_end.letter[1]
					set time_index + 1
				end if
				set time_index + 1
				set minute_end time_end.letter[time_index]
				set minute_end * 10
				set time_index + 1
				set minute_end + time_end.letter[time_index]
				set time_index + 2
				set second_end time_end.letter[time_index]
				set second_end * 10
				set time_index + 1
				set second_end + time_end.letter[time_index]
				set time_index + 1
				if time_end.letter[time_index] == p
					if hour_end != 12
						set hour_end + 12
					end if
				end if
				
				set seconds_measured second_end
				set seconds_measured - second_start			
				set minutes_measured minute_end
				set minutes_measured - minute_start			
				set hours_measured hour_end
				set hours_measured - hour_start
				if seconds_measured < 0
					set seconds_measured + 60
					set minutes_measured - 1
				end if
				if minutes_measured < 0
					set minutes_measured + 60
					set hours_measured - 1
				end if
				if hours_measured < 0
					set hours_measured + 24
				end if
				
				set seconds seconds_measured
				set temp minutes_measured
				set temp * 60
				set seconds + temp
				set temp hours_measured
				set temp * 3600
				set seconds + temp
				
				set frames_per_second_int time_count
				set frames_per_second_int / seconds
				set frames_per_second_dot time_count
				set frames_per_second_dot % seconds //Reminder of the devision frames:seconds
				set frames_per_second_dot * 10000 //Precision: 4 digits
				set frames_per_second_dot / seconds //Get digits after dot
				set frames_per_second "* "
				set frames_per_second + frames_per_second_int
				set frames_per_second + ","
				set frames_per_second + frames_per_second_dot
				
				set seconds_per_frame_int seconds
				set seconds_per_frame_int / time_count
				set seconds_per_frame_dot seconds
				set seconds_per_frame_dot % time_count //Reminder of the devision seconds:frames
				set seconds_per_frame_dot * 10000 //Precision: 4 digits
				set seconds_per_frame_dot / time_count //Get digits after dot
				set seconds_per_frame "* "
				set seconds_per_frame + seconds_per_frame_int
				set seconds_per_frame + ","
				set seconds_per_frame + seconds_per_frame_dot
				
				if verbose == 1
					set msg "*"
					set msg + hours_measured
					set msg + " "
					set msg + lang_verbose_hours
					set msg + ", "
					set msg + minutes_measured
					set msg + " "
					set msg + lang_verbose_minutes
					set msg + ", "
					set msg + seconds_measured
					set msg + " "
					set msg + lang_verbose_seconds
					set msg + " "
					set msg + lang_verbose_measured
					message msg
					message "*" time_count " " lang_verbose_frames " " lang_verbose_measured
					message frames_per_second " " lang_verbose_frames " " lang_verbose_per " " lang_verbose_seconds
					message seconds_per_frame " " lang_verbose_seconds " " lang_verbose_per " " lang_verbose_frames
				end if
				
				if debug == 1
					message "-- End hour: " hour_end
					message "-- End minute: " minute_end
					message "-- End second: " second_end
				end if
			else
				goto brev_status
			end if
		else
			label brev_status
			message "*" time_count " " lang_verbose_frames " " lang_verbose_measured
		end if
		
		if time_end == 1
			setglobal time_end 0
			setglobal time_running 0
			goto time_end_label
		end if
	else
		if time_running != 1
			setglobal time_running 1
			setglobal time_count 0
			message lang_begining " " lang_time_measurement
			pause 1
			setglobal time_count + 1
			if @env.textlog.word[1].letter[0] >= 0
				setglobal time_start @env.textlog.word[1]
				message time_start " " lang_o_clock " " lang_rl_time
				setglobal hour_start time_start.letter[time_index]
				set time_index + 1
				if time_start.letter[time_index] != ":"
					setglobal hour_start * 10
					setglobal hour_start + time_start.letter[1]
					set time_index + 1
				end if
				set time_index + 1
				setglobal minute_start time_start.letter[time_index]
				setglobal minute_start * 10
				set time_index + 1
				setglobal minute_start + time_start.letter[time_index]
				set time_index + 2
				setglobal second_start time_start.letter[time_index]
				setglobal second_start * 10
				set time_index + 1
				setglobal second_start + time_start.letter[time_index]
				set time_index + 1
				if time_start.letter[time_index] == p
					if hour_start != 12
						setglobal hour_start + 12
					end if
				end if
			
				if debug == 1
					message "-- Start hour: " hour_start
					message "-- Start minute: " minute_start
					message "-- Start second: " second_start
				end if
			else
				setglobal time_start lang_debug_unknown
				message lang_err_time_timestamps
			end if
				
			label time_control
				pause 1
				setglobal time_count + 1
				if debug == 1
					set mod_count time_count
					set mod_count % 400
					if mod_count == 0
						message "-- " time_count " frames measured since " time_start
					end if
				end if
				if time_running == 1
					goto time_control
				end if
			//end loop
		else
			setglobal time_end 1
			call tmeasurement
			setglobal time_end 0
			setglobal time_running 0
		end if
	end if
	label time_end_label
}
Noten notieren

Noten für die Funktion "bard" werden in der Datei "Snok_bard" notiert. Jedes Lied bekommt eine Zahl zugewiesen (folgend als <Liednummer> bezeichnet). Jede Stimme eines Liedes wird einzeln notiert (wobei primo die erste, sekundo die zweite und tertio die Dritte Stimme ist). Für jedes Lied ist es möglich vier Dinge zu notieren.

  1. Der Titel des Liedes
    • Syntax: setglobal song_name[<Liednummer>] "Name des Liedes"
    • Dient nur der eigenen Information, welches Lied ausgewählt wurde.
  2. Der Trigger, der ausgegeben wird, bevor ein Lied gespielt wird
    • Syntax: setglobal primo_trigger[<Liednummer>] "Aktion oder Text, der als Trigger ausgegeben wird"
    • Syntax: setglobal sekundo_trigger[<Liednummer>] "Aktion oder Text, der als Trigger ausgegeben wird"
    • Syntax: setglobal tertio_trigger[<Liednummer>] "Aktion oder Text, der als Trigger ausgegeben wird"
    • Wird ausgegeben, bevor das Lied gespielt wird. Hierüber erkennt die Funktion "bard" eines anderen Barden, welches Lied und welche Stimme gespielt werden soll.
  3. Das Instrument, mit dem das Lied gespielt wird.
    • Syntax: setglobal primo[<Liednummer>] "<Intrumentenname>"
    • Syntax: setglobal sekundo[<Liednummer>] "<Intrumentenname>"
    • Syntax: setglobal tertio[<Liednummer>] "<Intrumentenname>"
    • Man sollte als <Instrumentenname> eine Sprachvaribale nach dem Muster lang_bard_<Instrumentenname> verwenden.
  4. Die Noten, die für die entsprechende Stimme gespielt werden soll.
    • Syntax: setglobal primo_notes[<Liednummer>] "<Clan Lord Noten>"
    • Syntax: setglobal sekundo_notes[<Liednummer>] "<Clan Lord Noten>"
    • Syntax: setglobal tertio_notes[<Liednummer>] "<Clan Lord Noten>"
    • Wie <Clan Lord Noten> aussehen, findet man im Wiki unter Musizieren


Folgend die Beispiele aus der Datei "Snok_bard", die zeigen, wie man eine kurze Akkordfolge notieren kann:

*******************
* Bard notes file *
*******************
setglobal song_name[1] "Testlied für eine Stimme"
setglobal primo_trigger[1] "/action holt ein Dodelmuzak hervor"
setglobal primo[1] lang_bard_dodelmuzak
setglobal primo_notes[1] "[\g]$=CB[c]$\A=e8"

setglobal song_name[2] "Testlied für zwei Stimmen"
setglobal primo_trigger[2] "/action flötet ein kleines leises Liedchen"
setglobal sekundo_trigger[2] "/narrate Pffff... Pffff... Trööööööt!"
setglobal primo[2] lang_bard_fluote
setglobal sekundo[2] lang_bard_dodelmuzak
setglobal primo_notes[2] "=EDFg8"
setglobal sekundo_notes[2] "[\g]$=CB[c]$\A=e8"

Richtungsfunktionen

Diese Funktionen sind grundsätzlich mit Richtungen assoziiert, auch wenn sie etwas anderes machen. Für die Beschreibung der Funktionen siehe Tastenbelegung, wobei die Funktionen wie folgt zugeordnet sind:

  • south: Numblock-2
  • southwest: Numblock-1
  • west: Numblock-4
  • northwest: Numblock-7
  • north: Numblock-8
  • northeast: Numblock-9
  • east: Numblock-4
  • southeast: Numblock-3
  • center: Numblock-5
  • upstairs: Numblock-+
  • downstairs: Numblock-0
/********************
* The 11 Dimensions *   (What will we do, if we press a "direction key": )
*********************   (south, southwest, west, northwest, north, northeast, east, southeast, center, upstairs, downstairs) */
south
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk s please" "\r"
	else //normal mode
		"/yell /multi South!%l1Süden!%l2Zuid!%l3Sud!" "\r"
	end if	
} 
southwest
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk sw please" "\r"
	else //normal mode
		"/yell ?" "\r"
	end if
}
west
{
	if command_reizende_bool == 1  //"command Reizende" mode
		"reizende walk w please" "\r"
	else //normal mode
		"/yell /multi West! <---%l1Westen! <---%l2West! <---%l3Ouest! <---" "\r"		
	end if
}
northwest
{
	if command_reizende_bool == 1  //"command Reizende" mode
		"reizende walk nw please" "\r"
	else //normal mode
		if slogan != "" //Slogan is set
			"/yell " slogan "\r"
		end if
	end if
}
north
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk n please" "\r"
	else //normal mode
		"/yell /multi North!%l1Norden!%l2Noord!%l3Nord!" "\r"
	end if
}
northeast
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk ne please" "\r"
	else //normal mode
		if slogan2 != "" //Slogan is set
			"/yell " slogan2 "\r"
		end if
	end if
}
east
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk e please" "\r"
	else //normal mode
		"/yell /multi East! --->%l1Osten! --->%l2Oost! --->%l3Est! --->" "\r"
	end if
}
southeast
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk se please" "\r"
	else //normal mode
		"/yell !" "\r"
	end if
}
center 
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende self heal please" "\r"
	else //normal mode
		"/yell /multi Gather here!%l1Hier sammeln!" "\r"
	end if
}
upstairs
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"/yell reizende where are you" "\r"
	else //normal mode
		"/yell /multi Fallen!%l1Gefallene hier!" "\r"
	end if
}
downstairs
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"/share reizende" "\r"
	else //normal mode
		"/yell /multi Retreat!%l1Rückzug!" "\r"
	end if
}
/*****************************
* The 11 Dimensions - part 2 *
*****************************/
south2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk s please" "\r"
	else //normal mode
		"/yell /multi Gather SOUTH border when done!%l1Am SÃœDRAND sammeln, sobald ihr fertig seid!" "\r"
	end if	
}
southwest2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk sw please" "\r"
	else //normal mode
		"/yell ?" "\r"
	end if
}
west2
{
	if command_reizende_bool == 1  //"command Reizende" mode
		"reizende walk w please" "\r"
	else //normal mode
		  "/yell /multi Gather WEST border when done%l1Am WESTRAND sammeln, wenn ihr fertig seid!" "\r"
	end if
}
northwest2
{
	if command_reizende_bool == 1  //"command Reizende" mode
		"reizende walk nw please" "\r"
	else //normal mode
		if slogan != "" //Slogan is set
			"/yell " slogan "\r"
		end if
	end if
}
north2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk n please" "\r"
	else //normal mode
		"/yell /multi Gather NORTH border when done!%l1Am NORDRAND sammeln, wenn ihr fertig seid!" "\r"
	end if
}
northeast2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk ne please" "\r"
	else //normal mode
		if slogan2 != "" //Slogan is set
			"/yell " slogan2 "\r"
		end if
	end if
}
east2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk e please" "\r"
	else //normal mode
		"/yell /multi Gather EAST border when done!%l1Am OSTRAND sammeln, wenn ihr fertig seid!" "\r"
	end if
}
southeast2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende walk se please" "\r"
	else //normal mode
		"/yell !" "\r"
	end if
}
center2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"reizende self heal please" "\r"
	else //normal mode
		"/yell /multi Gather here!%l1Hier sammeln!" "\r"
	end if
}
upstairs2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"/yell reizende where are you" "\r"
	else //normal mode
		"/yell /multi Fallen!%l1Gefallene hier!" "\r"
	end if
}
downstairs2
{
	if command_reizende_bool == 1 //"command Reizende" mode
		"/share reizende" "\r"
	else //normal mode
		"/yell /multi Retreat!%l1Rückzug!" "\r"
	end if
}

command_reizende

command_reizende setzt eine interne Variable, damit die Richtungsfunktionen benutzt werden können, um Reizende zu kommandieren.

/*********************
* Direction switches *   (Toggle spezial direction functionality)
*********************/
command_reizende
{
	if command_reizende_bool != 1  //"command Reizende" mode is off
		setglobal command_reizende_bool 1 //Turn the mode on
		if verbose == 1
			message lang_verbose_command_reizende lang_verbose_on
		end if
	else  //"command Reizende" mode is on
		setglobal command_reizende_bool 0 //Turn the mode off
		if verbose == 1
			message lang_verbose_command_reizende lang_verbose_off
		end if
	end if
}

configure

configure erlaubt es, während das Spiel läuft, einige globale Variablen (siehe Anpassen) aus dem Eingabefeld heraus zu setzen: photoflash, debug, verbose, no-logoff, weapons, shields (wobei bei den letzten beiden Einträge hinzugefügt werden).

/**************************
* Can't restart right NOW * (Set config during the game temporary)
***************************/
//usage: configure debug|verbose|photoflash|weapons|shields|no-logoff [<value>]
//Changes the global setting to <value> or adds <value> to the list

configure
{
	if @text.word[0] == "debug"
		if @text.word[1] == 1
			setglobal debug @text.word[1]
		else
			setglobal debug 0
		end if
	else if @text.word[0] == "verbose"
		if @text.word[1] == 1
			setglobal verbose @text.word[1]
		else
			setglobal verbose 0
		end if
	else if @text.word[0] == "photoflash"
		if @text.word[1] <= 100
			if @text.word[1] >= 0
				setglobal photoflash @text.word[1]
				"/pref maxnightpercent " photoflash "\r"
			else 
				goto no_photoflash
			end if
		else
			label no_photoflash
			setglobal photoflash -1
		end if
	else if @text.word[0] == "weapons"
		if @text.word[1].num_letters >= 5
			setglobal weapons + " "
			setglobal weapons + @text.word[1]
			if @text.word[2].num_letters == 1
				setglobal weapons + " "
				setglobal weapons + @text.word[2]
			end if
		end if
	else if @text.word[0] == "shields"
		if @text.word[1].num_letters >= 5
			setglobal shields + " "
			setglobal shields + @text.word[1]
			if @text.word[2].num_letters == 1
				setglobal shields + " "
				setglobal shields + @text.word[2]
			end if
		end if
	else if @text.word[0] == "no-logoff"
		if @text.word[1] == 1
			setglobal no-logoff @text.word[1]
		else
			setglobal no-logoff 0
		end if
	end if
}

start_SNOK

start_SNOK setzt die Spracheinstellungen und die erste Primärausrüstung.

/****************
* Macro startup *   (Initialize all variables used in Snok's Macros)
****************/
start_SNOK
{
	if verbose == 1
		message "* ***Snok's Macros " snok_version "***"
		message "* Snok's Macros: Verbose mode: ON"	
		if debug == 1
			message "* Snok's Macros: Debug mode: ON"
		else
			message "* Snok's Macros: Debug mode: OFF"
		end if
		message "* Snok's Macros: Going to set your language"
	end if
	call set_lang //Set the language
	if verbose == 1
		message "* Snok's Macros: " lang_verbose_language lang
		message "* Snok's Macros: " lang_verbose_client_language client_lang
	end if
 	//Configure all the things we need
	//Set the nightlevel
	if photoflash <= 100
		if photoflash >= 0
			"/pref maxnightpercent " photoflash "\r"
			if verbose == 1
				message "* Snok's Macros: " lang_verbose_nightlevel photoflash "%"
			end if
		end if
	end if
	call next_arms //Set our first weapon/shield pair
	call cognition //Start textlog triggering
}

Variablen

Neben den weiter oben unter Grundlagen aufgeführten Variablen gibt es noch folgende intere globalen Variablen:

  • weapon: Die aktuelle Primärwaffe, wie sie von next_arms gesetzt wird
  • shield: Der aktuelle Primärschild, wie er von next_arms gesetzt wird
  • arming_no: Aktuelle Nummer der Primärausrüstung (also, welche Ausrüstung aus weapons und shields ausgewählt ist)
  • weapon_offset: Offset der Wörter in weapons im Verhältnis zu arming_no (verursacht durch Item-Nummern)
  • shield_offset: dito, für Schilde
  • torch_on: Falls die Fackel über torch aktiviert wurde und immer noch brennt ist torch_on = 1, sonst undefiniert. Anmerkung: wird ca. alle 3 Sekunden aktuallisiert.
  • torch_left_item: Das von torch gesicherte Item, bevor die Fackel in die Hand genommen wurde.
  • left_temp: Ein gesichertes Item, das in der linken Hand getragen wurde.
  • right_temp: Ein gesichertes Item, das in der rechten Hand getragen wurde.
  • command_reizende_bool: Falls die Richtungsfunktionen für das Kommandieren von Reizende agieren ist command_reizende_bool = 1, sonst undefiniert.
  • bard_instrument: Das Instrument, welches von "bard" gewählt und genutzt wird.
  • bard_notes: Die Noten, welche von "bard" gewählt und genutzt werden.
  • bard_voice: Die Stimme, welche von "bard" gewählt und genutzt wird.
  • bard_part_no: Die Nummer des Liedes, welche von "bard" gewählt und genutzt wird.
  • num_voices: Anzahl der Stimmen des aktuellen Liedes innerhalb von "bard"
  • snok_version: Die aktuelle Haupt-Version von Snok's Makros

bard

Mit "bard" können Lieder mit Instrumenten im Spiel abgespielt werden. Es ist möglich alleine oder mit bis zu zwei anderen Barden zusammen zu spielen. Um ein Lied spielen zu können muss man natürlich das nötige Instrument in seinem Inventar haben. Die nötigen Noten und Instrumente sind in der Datei "Snok_bard" notiert.


Syntax:

  • Die erste Zahl im Textfeld ist die Liednummer, die gespielt werden soll.
  • Die zweite Zahl im Textfeld ist die Stimme, die gespielt werden soll. (optional)
  • Befindet sich das Wort start im Textfeld, wird das Lied gestartet. (Es müssen zuvor alle Barden, die mitspielen wollen, die Liednummer und die Stimme ausgewählt haben)
  • Mittels stop wird ein laufendes Lied abgebrochen.
  • Wird zum Funktionsaufruf nichts weiter angegeben, startet bzw. stoppt ein Durchlauf, bei dem auf andere Barden gewartet wird.


Hier ein paar Beispiele:

  • Beispiel 1 (für ein Lied mit zwei Stimmen):
    • Barde 1 wählt mittels "/bard 2 1" aus, dass er das zweite Lied und davon die erste Stimme spielen will.
    • Barde 2 wählt mittels "/bard 2 2 start" aus, dass er das zweite Lied und davon die zweite Stimme spielen will. Gleichzeitig startet er das Lied und beide Barden spielen zusammen.
  • Beispiel 2 (für ein Lied mit einer Stimme):
    • Der Barde wählt mittels "/bard 1 1" aus, dass er das erste Lied und davon die erste Stimme spielen will.
    • Sobald er sein Publikum um sich gescharrt hat, startet er mittels "/bard start" das Lied.
  • Beispiel 3 (für ein Lied mit zwei Stimmen):
    • Barde 1 will die erste Stimme spielen des zweiten Lieds spielen. Er wählt mittels "/bard 2 1" aus, diese Stimme zu spielen.
    • Barde 2 weiß noch nicht, welche Stimme er übernehmen will. Er wählt daher mittels "/bard 2" nur aus, dass er das zweite Lied spielen möchte.
    • Barde 1 startet das Lied mittels "/bard start" und beide Barden spielen zusammen.
/*******************
* Music is the key * (Playing bard songs)
*******************/
//usage: bard [<song_no> [<voice_no>]] [start|stop]
//<song_no> - Song number (refere to file "Snok_bard")
//<voice_no> - Voice you like to play (1: primo, 2: sekundo, 3: tertio)
//start|stop - Start or stop playing
//Called without start: Waiting for other bards to start
//Called with start: Trigger other bards and then play if all voices can be played
//Called with only a song number: Waiting for other bards to start and playing the voice which no other bard plays
//Called without arguments: Starts a "waiting for others" cycle (at least a song number must have been set before) / Stops a running "waiting for others" cycle

bard
{
//TODO: long songs (gt 511 chars)
//TODO: trigger multilingual
//TODO: force a different instrument
//TODO: force to play only with an given bard
//TODO: start the right song without knowing the song no.
//TODO: read notes from pergaments
	// ### Parsing arguments
	if @text.word[0] >= 0 // A positive number as argument: song no.
		setglobal bard_instrument "" //Instrument to play
		setglobal bard_notes "" //Notes to play
		
		setglobal bard_part_no @text.word[0]
		//How much voices has this song?:
		setglobal num_voices 0
		if primo_trigger[bard_part_no].num_words > 0
			setglobal num_voices + 1
		end if
		if sekundo_trigger[bard_part_no].num_words > 0
			setglobal num_voices + 1
		end if
		if tertio_trigger[bard_part_no].num_words > 0
			setglobal num_voices +1
		end if
		
		if debug == 1
			message "-- Song number: " bard_part_no
			message "-- Num voices: " num_voices
		end if
		
		if @text.word[1] > 0 //Second argument a positive number: voice no.
			if @text.word[1] < 4
				setglobal bard_voice @text.word[1]
			else
				setglobal bard_voice 0
			end if
		else
			setglobal bard_voice 0
		end if
		
		if debug == 1
			message "-- Selected voice: " bard_voice
		end if
		
		if bard_voice == 1
			setglobal bard_instrument primo[bard_part_no] //Instrument evaluieren
			setglobal bard_notes primo_notes[bard_part_no]
		else if bard_voice == 2
			setglobal bard_instrument sekundo[bard_part_no] //Instrument evaluieren
			setglobal bard_notes sekundo_notes[bard_part_no]		
		else if bard_voice == 3
			setglobal bard_instrument tertio[bard_part_no] //Instrument evaluieren
			setglobal bard_notes tertio_notes[bard_part_no]
		end if
		
		if debug == 1
			message "-- Selected instrument: " bard_instrument
			message "-- Selected notes: " bard_notes
		end if
		
		if @text >= "start"
			goto start_playing
		end if
		
		// ### Start the bard-action loop
		if bard_on != 1
			goto bard_start
		end if
		goto bard_end
		
	// ### Initiate playing
	else if @text >= "start"
		label start_playing
		
		if debug == 1
			message "-- Initiating play"
		end if
		
		if bard_instrument.num_words > 0
			if @my.selected_item != bard_instrument
				"/selectitem " bard_instrument "\r"
			end if
		end if
		if @my.selected_item == bard_instrument
			if bard_voice == 1 //Want to play primo voice
				if primo_trigger[bard_part_no].num_words > 0
					setglobal bard_initiate 1
					primo_trigger[bard_part_no] "\r" //Propagate the trigger
				end if
			else if bard_voice == 2 //Want to play sekundo voice
				if sekundo_trigger[bard_part_no].num_words > 0
					setglobal bard_initiate 1
					sekundo_trigger[bard_part_no] "\r" //Propagate the trigger
				end if
			else if bard_voice == 3 //Want to play tertio voice
				if tertio_trigger[bard_part_no].num_words > 0
					setglobal bard_initiate 1
					tertio_trigger[bard_part_no] "\r" //Propagate the trigger					
				end if
			end if
		end if
		
		if bard_on != 1 //start the bard action loop
			goto bard_start
		end if
		goto bard_end
	//Stop playing
	else if @text >= "stop"
	
		if debug == 1
			message "-- Stoping play"
		end if
		
		setglobal bard_on 0 //Deactivate bard action loop
		if @my.right_item == bard_instrument
			"/use /stop" "\r"
		end if
		goto bard_end
	end if
	
	// ### Deactivate the bard-action loop:
	if bard_on == 1
		if debug == 1
			message "-- Deactivating the bard action loop"
		end if
		setglobal bard_on 0
	
	// ### Start the bard action loop (listing for other bards to play with or play solo and quit)
	else
		label bard_start
		if debug == 1
			message "-- Initiating bard action loop"
		end if
		setglobal bard_on 1 //Action loop is running
		set primo_name "" //Name of the bard who plays primo voice
		set sekundo_name "" //Name of the bard who plays sekundo voice
		set tertio_name "" //Name of the bard who plays tertio voice
		set primo_set "" //Trigger for primo voice
		set sekundo_set "" //Trigger for sekundo voice
		set tertio_set "" //Trigger for tertio voice
		set num_raised 0 //Number of bards who raised for playing
		set choose_voice 0 //Number which indicates if and what voice to choose
		set args "" //Arguments for "/use"
		
		//Setting the triggers to listen at
		set primo_trigger primo_trigger[bard_part_no]
		set sekundo_trigger sekundo_trigger[bard_part_no]
		set tertio_trigger tertio_trigger[bard_part_no]
		
		// ### Cutting away the command concatenated with the triggers
		if primo_trigger.num_words > 0 //If there is a primo trigger
			label primo_check_again //To check against another command
			if primo_trigger.word[0].letter[0] == "/" //Check against command with slash
				set temp ""
				set i 0
				goto primo_remove_command
			else if primo_trigger.word[0].letter[0] == "\\" //Check against command with backslash
				set temp ""
				set i 0
				label primo_remove_command //Remove the command (it's a loop)
					set i + 1
					if primo_trigger.word[i].num_letters != 0 //If there are more words in the trigger
						if i != 1 //Insert a space before every word except the first one
							set temp + " "
						end if
						set temp + primo_trigger.word[i] //Concatenate the trigger without command
					end if
					if i < primo_trigger.num_words //If there are more words in the original trigger
						goto primo_remove_command //Go to head of remove loop
					end if
				set primo_trigger temp
				goto primo_check_again //Check against another command
			end if
		end if
		
		if sekundo_trigger.num_words > 0
			label sekundo_check_again
			if sekundo_trigger.word[0].letter[0] == "/"
				set temp ""
				set i 0
				goto sekundo_remove_command
			else if sekundo_trigger.word[0].letter[0] == "\\"
				set temp ""
				set i 0
				label sekundo_remove_command
					set i + 1
					if sekundo_trigger.word[i].num_letters != 0
						if i != 1
							set temp + " "
						end if
						set temp + sekundo_trigger.word[i]
					end if
					if i < sekundo_trigger.num_words
						goto sekundo_remove_command
					end if
				set sekundo_trigger temp
				goto sekundo_check_again
			end if
		end if
		
		if tertio_trigger.num_words > 0
			label tertio_check_again
			if tertio_trigger.word[0].letter[0] == "/"
				set temp ""
				set i 0
				goto tertio_remove_command
			else if tertio_trigger.word[0].letter[0] == "\\"
				set temp ""
				set i 0
				label tertio_remove_command
					set i + 1
					if tertio_trigger.word[i].num_letters != 0
						if i != 1
							set temp + " "
						end if
						set temp + tertio_trigger.word[i]
					end if
					if i < tertio_trigger.num_words
						goto tertio_remove_command
					end if
				set tertio_trigger temp
				goto tertio_check_again
			end if
		end if
		
		//Message the song's name:
		if verbose == 1
			message "*" lang_verbose_song "\"" song_name[bard_part_no] "\"" lang_verbose_selected
		end if
		
		label bard_loop //The bard action loop
		if debug == 1
			setglobal cnt + 1
			if cnt >= 30 //120 //Every ca. 30 sec.
				message "-- Bard action loop's running"
				message "-- Song: " song_name[bard_part_no] "(No. " bard_part_no ")"
				message "-- Voices: " num_raised "/" num_voices
				message "-- Selected instrument: " bard_instrument
				message "-- Selected notes: " bard_notes
				setglobal cnt 0
			end if
		end if
			
		if bard_on == 1
			set textlog @env.textlog
			set doernamepos 0 //Offset for timestamps inactive
			if textlog.letter[0] >= 0 //Timestamps active
				set doernamepos 2 //Offset for timestamps active
			end if
			setglobal doername textlog.word[doernamepos] //Doer should be first word
			if doername.letter[0] == "(" //Doer's name could be in parantheses. If so, remove them:
				set i 0
				set doername_temp ""
				label loop_parenth_1 //Remove parentheses loop (letter by letter)
				set i + 1
					if doername.num_letters > i
						if doername.letter[i] != ")"
							set doername_temp + doername.letter[i]
							goto loop_parenth_1
						end if
					end if
				setglobal doername doername_temp
			end if
			
			// ### Check for triggers
			if textlog < primo_trigger
				if primo_trigger.num_words > 0				
					set primo_set doername
				end if
			else if textlog < sekundo_trigger
				if sekundo_trigger.num_words > 0
					set sekundo_set doername
				end if
			else if textlog < tertio_trigger
				if tertio_trigger.num_words > 0				
					set tertio_set doername
				end if
			end if
			
			// ### Count the raises and prepare the arguments for "/use"
			
			if primo_set != ""
				if primo_name.num_letters == 0 // &&
				if sekundo_name != primo_set // &&
				if tertio_name != primo_set
					set num_raised + 1
					if primo_set != @my.name
						set args + "/with "
						set args + primo_set
						set args + " "
					end if
					if debug == 1
						message "-- Arguments for /use: " args
					end if
					set primo_name primo_set
					if verbose == 1
						message "*" lang_verbose_primo primo_name
					end if
					if bard_initiate != 1
						set choose_voice + 1
					end if
				end if // &&
				end if // &&
				end if
				set primo_set ""
			end if
			if sekundo_set != ""
				if sekundo_name.num_letters == 0 // &&
				if tertio_name != sekundo_set // &&
				if primo_name != sekundo_set
					set num_raised + 1
					if sekundo_set != @my.name
						set args + "/with "
						set args + sekundo_set
						set args + " "
					end if
					if debug == 1
						message "-- Arguments for /use: " args
					end if
					set sekundo_name sekundo_set
					if verbose == 1
						message "*" lang_verbose_sekundo sekundo_name
					end if
					if bard_initiate != 1
						set choose_voice + 2
					end if
				end if // &&
				end if // &&
				end if
				set sekundo_set ""
			end if
			if tertio_set != ""
				if tertio_name.num_letters == 0 // &&
				if primo_name != tertio_set // &&
				if sekundo_name != tertio_set
					set num_raised + 1
					if tertio_set != @my.name
						set args + "/with "
						set args + tertio_set
						set args + " "
					end if
					if debug == 1
						message "-- Arguments for /use: " args
					end if
					set tertio_name tertio_set
					if verbose == 1
						message "*" lang_verbose_tertio tertio_name
					end if
					if bard_initiate != 1
						set choose_voice + 4
					end if
				end if // &&
				end if // &&
				end if
				set tertio_set ""
			end if
			
			//### If no instrument chosen, choose one
			if choose_voice > 0
				if bard_initiate != 1 //Bard script not initiated yet?					
					if primo[bard_part_no].num_letters > 0
					else
						if choose_voice != 1
						if choose_voice != 3
						if choose_voice != 5
						if choose_voice != 7
							set choose_voice + 1
						end if
						end if
						end if
						end if
					end if					
					if sekundo[bard_part_no].num_letters > 0
					else
						if choose_voice != 2
						if choose_voice != 3
						if choose_voice != 6
						if choose_voice != 7
							set choose_voice + 2
						end if
						end if
						end if
						end if
					end if
					if tertio[bard_part_no].num_letters > 0
					else
						if choose_voice != 4
						if choose_voice != 5
						if choose_voice != 6
						if choose_voice != 7
							set choose_voice + 4
						end if
						end if
						end if
						end if
					end if
					
					if debug == 1
						message "-- Don't choose voice(s) (1=primo, 2=sekundo, 3=primo+sekundo, 4=tertio, 5=primo+tertio, 6=sekundo+tertio 7=all): " choose_voice
					end if
					
					if choose_voice == 1
						random
							setglobal bard_instrument sekundo[bard_part_no] //Instrument evaluieren
							setglobal bard_notes sekundo_notes[bard_part_no]
						or
							setglobal bard_instrument tertio[bard_part_no] //Instrument evaluieren
							setglobal bard_notes tertio_notes[bard_part_no]
						end random
					else if choose_voice == 2
						random
							setglobal bard_instrument primo[bard_part_no] //Instrument evaluieren
							setglobal bard_notes primo_notes[bard_part_no]
						or
							setglobal bard_instrument tertio[bard_part_no] //Instrument evaluieren
							setglobal bard_notes tertio_notes[bard_part_no]
						end random
					else if choose_voice == 3
						setglobal bard_instrument tertio[bard_part_no] //Instrument evaluieren
						setglobal bard_notes tertio_notes[bard_part_no]
					else if choose_voice == 4
						random
							setglobal bard_instrument primo[bard_part_no] //Instrument evaluieren
							setglobal bard_notes primo_notes[bard_part_no]
						or
							setglobal bard_instrument sekundo[bard_part_no] //Instrument evaluieren
							setglobal bard_notes sekundo_notes[bard_part_no]
						end random
					else if choose_voice == 5
						setglobal bard_instrument sekundo[bard_part_no] //Instrument evaluieren
						setglobal bard_notes sekundo_notes[bard_part_no]
					else if choose_voice == 6
						setglobal bard_instrument primo[bard_part_no] //Instrument evaluieren
						setglobal bard_notes primo_notes[bard_part_no]
					end if
						
					setglobal bard_initiate 1
					if bard_instrument.num_words > 0
						"/selectitem " bard_instrument "\r"
					else
						bard_initiate 0
						choose_voice 0
					end if
				end if
				
				if @my.selected_item == primo[bard_part_no]
					if primo_trigger[bard_part_no].num_words > 0
						primo_trigger[bard_part_no] "\r" //Propagate the trigger
						set choose_voice 0
					end if
				else if @my.selected_item == sekundo[bard_part_no]
					if sekundo_trigger[bard_part_no].num_words > 0
						sekundo_trigger[bard_part_no] "\r" //Propagate the trigger
						set choose_voice 0
					end if
				else if @my.selected_item == tertio[bard_part_no]
					if tertio_trigger[bard_part_no].num_words > 0
						tertio_trigger[bard_part_no] "\r" //Propagate the trigger
						set choose_voice 0
					end if
				end if
			end if
			
			if num_raised >= num_voices
				message bard_instrument
				if bard_instrument.num_words > 0
					"/selectitem " bard_instrument "\r"
					if @my.selected_item == bard_instrument
						if @my.right_item != bard_instrument
							"/equip " bard_instrument "\r"
						end if
					end if
					if @my.right_item == bard_instrument //The right instrument equiped
						if debug == 1
							message "-- /use " args " " bard_notes
						end if
						"/use " args " " bard_notes "\r" //Finally: Play the song
						setglobal bard_on 0
					end if
				end if
			end if
			
			pause 1
			goto bard_loop
		end if
	end if
	label bard_end
}
Persönliche Werkzeuge