Snok's Makro
Aus Arindal Wiki
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.
- Der Titel des Liedes
- Syntax: setglobal song_name[<Liednummer>] "Name des Liedes"
- Dient nur der eigenen Information, welches Lied ausgewählt wurde.
- 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.
- 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.
- 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 }