Difference between revisions of "User:Una"

From Wiki
Jump to: navigation, search
(#True and #False)
 
(19 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Suomenkielinen EasyUO scriptaus opas ==
 
  
=== Una, oppaan kirjoittaja ===
 
  
Moro, olen käyttänyt EasyUO:ta reilut 3 vuotta ja suurimman osan siitä myöskin scriptannut. Mitään ihmeellistä en ole saanut sinänsä aikaan, monet tietävät minut "Piece of Cake Sparring" scriptan ansiosta. Sekään kerro mitään minun tän hetkisistä taidoistani, koska se on vanha kuin taivas. Ymmärrän kuitenkin koodia kuin tavallista tekstiä ja osaan tehdä yhden jos toisenkin asian EUO:lla.
 
Päätin kirjoittaa tällaisen oppaan, jotta suomea puhuvilla immeisillä ( joilla on englannin taidoissa pieniä aukkoja ) olisi mahdollisuus oppia tämä "jalo" taito.
 
  
=== EasyUO lyhyesti ===
 
  
Mietit varmasti, että mitä kaikkea tällä voikaan tehdä. EUO EI kykene mihinkään mitä et normaalisti pystyisi tekemään. Eli unohda haaveet speedhackista ja toisen laukun sisällön tarkastelusta. On joitakin hienoja asioita missä EUO pystyy "huijaamaan". Esimerkiksi voit "scannata" toisen pelaajan varusteet ja laskea resisti ja muut herkut yhteen vaikka hänellä olisi kaapu peittämässä niitä. Pysty tehdä asioita nopeammin kuin voisit kuvitellakkaan tekeväsi käsin ja jos osaat hommasi, voit tehdä MITÄ tahansa, mitä olet tehnyt pelissä tähän mennessä.
 
On olemassa scriptoja, jotka taistelevat yksinään gauntletissa ja raudankaivajia, jotka käyttävät kymmeniä runebookkeja avuksi taisetelevat vihollisia vastaan ja vievät pankkiin kaikki valmiiksi sulatetut harkot. Mahdollisuudet on rajattomat, juuri tämä sai minut innostumaan EUO:sta.
 
  
 +
= Building up and finishing script. Basic and advanced tehcniques =
  
=== Oppaan tarkoitus ===
+
== First words ==
  
Käsittelemme nyt ainakin aluksi perusasioita, puhumista, liikkumista, tavaroiden käyttämistä ja muita perushommia. Koitan käyttää mahdollisimman paljon selkeitä esimerkkejä ja ehkäpä keksin joitain harjoituksiakin, mistäs sen tietää vielä tässä vaiheessa.
+
=== Purpose/Idea ===
  
 +
Im writing this becouse so many beginner and even some Advanced scripters, build hard to edit and nonreadable code. Im trying to show some basic and advanced ideas about good code and teach you to script better scripts.
  
=== Peli välineet ===
+
=== About author: Una ===
  
Tarvitset:
+
I have scripted more or less about 3 years now. I know couple of things from scripting and coding and i love to code ( and script ). Im not Pro and i dont claim to be one, but i think i can teach lots to beginners and even to people who have been in "business" for sometime already.
* Tietokoneen ( Ylläri )
+
* Uusimman version EasyUO 1.5 betasta. ( HUOM: Ehdottomasti 1.5, koska jotkut komennot joita esitän, ei toimi vanhassa )
+
* Aivot
+
  
'''HUOM:'''
+
=== Target audience ===
* Oletan oppaan aikana, että sinulla on Ultima online 2D clientti päällä ja olet kirjautuneena sisään aivan normaalisti.
+
  
== Osa 1. Muuttujat ==
+
In order to be able to read and fully understand this document, you are required to understand the very basics of EUO scripting language. If you are advanced writer and have already puplished some scripts, i think i can still give you something. Hope you like to read and find this "tutorial" usefull. Remember, what i show here, is only my way to do things but i have founded these to be good in my 3 year career with EUO.
  
 +
== Starting to write a script ==
  
Jokainen ohjelmointi kieli tarvitsee jotain, mihin tallettaa asioita joita ohjelma sitten voi myöhemmin käsitellä. Niitä kutsutaan muuttujiksi. On tärkeää että ymmärrät eron erilaisten muuttujien välillä.
+
Break your script to blocks ( in your head or paper ). Say you are building mining script, then it should look like this.
 
+
* Check tools from backpack
=== Globaalit muuttujat % ( Global variables ) ===
+
* Use mining tool and target ground
Tämä on yleisin muuttuja tyyppi, jota tulet käyttämään scriptoissasi. Näiden avulla voi tallentaa kaikenmaailman asioita, niin numeroita kuin sanoja ja jopa lauseita.
+
* Check weight and if too heavy recall/unload
 
+
Now, you know where to start scripting. This is the heart of this script. We can now move it to next level. Pseudo- code.
Muuttujan nimeä ei voi käyttää ihan mitä tahansa.
+
 
+
 
<pre>
 
<pre>
set %Kunnollinen
+
Mainloop:
set %Sa_moin
+
  gosub CheckForTools
set %_Ja_Taas
+
  gosub Dig
set %jne5
+
  gosub CheckWeight
 +
goto Mainloop
 +
</pre>
 +
This is the mainloop. Every script should have something like this, that gets looped over and over again, until script execution is halted. Next thing would be building those actual subs.
  
 +
=== Gosub: How to take everything out from these ===
  
set %7EIole
+
* If something can be thought as separate part of script, make it to Sub
</pre>
+
* Always create subs so, that they dont use global variables, but use Gosub parameters
 +
* Use return parameter
  
Käyttö on helppoa, kuten seuraavassa esimerkissä näkyy.
+
Return, Use this command always to get out of sub. DONT goto, no matter what. Its bad coding and leads to problems.
 +
''' Did you know: '''
 +
* Return command can return info?
  
 
<pre>
 
<pre>
set %Muuttuja 10
+
gosub Test
set %Toinen 5
+
msg Muuttuja: %Muuttuja Toinen: %Toinen $
+
halt
+
</pre>
+
  
Tämä oli yksinkertainen esimerkki. Hajoitetaan se nytten osiin ja tarkastellaan näitä komentoja vähän.
+
sub Test
[[set]] komento kertoo EasyUO:lle, että nytten toimitaan muuttujien kanssa ja muutetaan niiden arvoja.
+
return This_is_test
[[msg]] komento mahdollistaa puhumisen hahmollasi UO:ssa.
+
[[halt]] Lopettaa scriptan pyörimisen.
+
  
'''Tehtävä:'''
+
display ok #result
* Kokeile mitä tapahtuu jos poistat [[halt]] komennon.
+
* Koita muuttaa muuttujien sisältöä ja nimiä
+
 
+
%Muuttuja ja %Toinen ovat kuten ehkä arvasit, muuttujia. Huomaa " % " merkki ennen nimeä. Se tarkoittaa että muuttuja on globaali, eli "näkyy" jokapuolella scriptaa. Voit siis kutsua ja muokata globaalia muuttujaa missä tahansa osassa scriptaa. Mutta VAIN siinä kyseisessä scriptassa, missä olet muuttujan luonut. Eli vieressä pyörivä scripta ei tiedä siitä muuttujasta mitään. Kun scripta lopetetaan nämä muuttuja lopettavat olemassa olon. Tämä kannattaa muistaa.
+
 
+
=== Pysyvät muuttujat * ( Persistent variables ) ===
+
Näiden muuttujien erikoisuus on pysyvyys ja näkyvyys. KAIKKI Scriptat pystyvät näkemään nämä muuttujat ja nämä EIVÄT katoa kun sammutat tietokoneen. EasyUO tallentaa ne tietokoneen registeriin. Tämä on mainio keino tallentaa scriptan tiedot, jotta niitä ei tarvitse kysyä ensikerralla.
+
 
+
<pre>
+
set *UnaTesti Toimii
+
 
halt
 
halt
 
</pre>
 
</pre>
  
Aja tuo pätkä EUO:lla.
+
Display now should read "This_is_test" . Great isnt it?
Sitten kokeile tätä.
+
  
 +
==== Gosub parameters ====
 +
I show now, HOW to use these and WHY.
 
<pre>
 
<pre>
msg *UnaTesti $
+
gosub TestSub first second third
halt
+
gosub TestSub This Is Great
 +
sub TestSub
 +
  Display ok %1 %2 %3
 +
return
 
</pre>
 
</pre>
 +
Feel free to test that. Did you notice, how those variables are set? %1 is the first variable passed to sub and %2 is second , %3 is third and so on. Always build sub so, that you think its idiot, so that you need to give everything to it, before it can do something. Never assume that it knows it already.
 +
Heres two examples, Bad one and good one.
  
Mitä tapahtui? Aivan oikein, se muistaa nyt, mitä pistits inne talteen. Eli toisin sanoen, se tallensi sen kovalevylle talteen.
+
"Bad way" (pseudo code)
 +
<pre>
 +
set %BackpackID ABCDEF
 +
set %IDofSomething GHIJKL
 +
gosub TestSub
  
=== Systeemi muuttujat # ( System variables ) ===
+
sub TestSub
Avaa EUO ja katso oikeaan reunaan. Siellä pitäisi näkyä kaikenlaisia ihmeellisiä muuttujia. Monen nimestä ja sisällöstä voi päätellä mitä ne pitävät sisällään. Nämä systeemi muuttujat siis ovat sellaisia joita Ultima antaa meille.
+
  Open %BackPack
 
+
  Find %IDofSomething
Katsotaas vähän listaa:
+
return
 
+
Character info
+
* [[Var charPosX|#CharposX]] (luku)
+
* [[Var charPosY|#CharposY]] (luku)
+
 
+
Kuten arvata saattaa, niin nämä kertovat hahmon sijainnin maailmankartalla. (x,y) (0,0) on kartan vasen alakulma.
+
* [[Var charGhost|#CharGhost]]
+
Kertoo onko hahmo haamu vai ei.
+
 
+
Statusbar
+
* [[Var charName|#CharName]] Sisältää hahmon nimen
+
* [[Var hits|#Hits]] Kertoo tämän hetkisen Energian määrän
+
 
+
Jne jne.. Katsele vähän listaa jotta ymmärrät vähän, mitä kaikkea UO meille tarjoaa.
+
 
+
Jos haluaisit vaikka saada nykyiset energia talteen, muuttujaan siis, niin se käy näin.
+
<pre>
+
set %Energiat #Hits
+
msg HP: %Energiat TAI: #Hits Mana: #Mana $
+
 
</pre>
 
</pre>
 
+
Why is this bad? Becouse it needs those variables to be set in somewhere. Its hard to debug.
=== Nimiavaruus muuttujat( Namespace variables ) ===
+
Tästä aiheesta voisi kirjoittaa oman oppaan ja ne ovat vain tasokkaille koodareille. Eli ei mitään mitä alussa pitäisi tietää. Jos kuitenkin kiinnostaa, niin voit katsoa lisää aiheesta täällä ( englanniksi ) [[NameSpace_local|NameSpace]] .
+
 
+
 
+
== Osa 2. Perusteet ==
+
 
+
Koitetanpas saada aikaiseksi jotain "siistiä".
+
 
+
=== Liikkuminen ===
+
Liikkuminen on erittäin helppoa ja monesti erittäin tarpeellista, joten tarkastellaampa vähän miten se tapahtuu.
+
 
+
 
<pre>
 
<pre>
set %PaikkaX #CharPosX + 1
+
set %BackpackID ABCDEF
set %PaikkaY #CharPosY + 1
+
set %IDofSomething GHIJKL
 +
gosub TestSub
  
move %PaikkaX %PaikkaY 0 5s
+
sub TestSub %BackpackID %IDofSomething
halt
+
  Open %1
 +
  Find %2
 +
return
 
</pre>
 
</pre>
 +
This is much easyer to debug, becouse you know exactly what variables it gets in and what it does.
 +
Even better sub would be with comments. Like this.
 +
<pre>
 +
set %BackpackID ABCDEF
 +
set %IDofSomething GHIJKL
 +
gosub TestSub
  
Ajappa tuo ohlema EUO:ssa ja katso mitä se tekee. Sen ainakin pitäisi kävellä johonkin suuntaan askeleen verran.
+
;=================
Koodia tarkastelemalla, helposti ymmärtää mitä siinä tapahtuu. Aluksi luodaan kaksi muuttujaa ja sijoitetaan niihin tiedot ukon sijainnista JA lisätään siihen 1.
+
; name: TestSub
Sen jälkeen käytämme komentoa [[move]] ja annamme sille koordinaatit ja muut tiedot ja sitten se yrittää päästä siihen annettuun pisteeseen.
+
; Author: Una
[[move]] komento tarvitsee tietoa pikkaisen, kuten esimerkissä näkyy.
+
; Purpose: To open backpack and findstuff
move {X} {Y} [toleranssi] [yritysaika]
+
; %1 = Backpack ID
 
+
; %2 = What to look for
{X} = X piste johon yritetään liikkua
+
sub TestSub %BackpackID %IDofSomething
{Y} = Y piste johon yritetään liikkua
+
  Open %1
[Toleranssi] = 0 tarkoittaa, että yritetään TÄSMÄLLEEN siihen pisteeseen, mikä annettiin. Joten 5 tarkoittaa että riittää kunhan ollaan 5 askeleen päässä pisteestä.
+
  Find %2
[yritysaika] = Kuinka kauan yritetään päästä kyseiseen pisteeseen
+
return
 
+
'''Tehtävä:'''
+
* Katso Ukon sijainti EUO:n systeemi muuttujista, kävele kauemmaksi ja koita päästä scriptan avulla takaisin.
+
 
+
 
+
=== Tavaroiden käyttäminen ===
+
Tämä on jo vähän monimutkaisempi prosessi, MUTTA ei silti mikään vaikea. Jotta ymmärtäisimme paremmin EUO ja UO:n tapaa käsitellä tavaroita, täytyy meidän tutustua ID ( tunnisteeseen ) ja TYPE ( Tyyppiin )juttuihin.
+
 
+
==== ID ====
+
ID koostuu 4 - 7 ( kenties :) ) kokoisesta kirjain sarjasta. Esim CJFHUYG , UGJSHSY , YTHI , HDKDIUG jne.
+
ID On kuin Sosiaaliturvatunnus, sormenjälki tai DNA. JOKAISELLA TAVARALLA ON ERI ID. Pidä se mielessä.
+
 
+
Siis:
+
 
+
'''JOKAISELLA TAVARALLA ON OMA ID'''
+
* Ei ole kahta tavaraa samalla serverillä joilla olisi sama id.
+
* ID:n avulla voimme siis tunnistaa UO:n asiat ja esineet toisistaan, myös ulkonäöltään samanlaiset.
+
 
+
==== TYPE ====
+
Tyyppi koostuu 2-3 kokoisesta kirjain sarjasta. Esim KUF, WZF , SZF..
+
Tyyppi on sama kaikilla saman tyyppisillä tavaroilla.
+
Esim. Bloodmossin Tyyppi on JUF. Se on AINA sama sille, ei koskaan muutu ( Ellei OSI tee jotain aivan älytöntä ).
+
Tyyppi on kuin Maan nimi, rotu tai vaikka Auto. Kun puhutaan autosta, tiedät mikä se on, Mutta et tiedä mitään mun autosta. Tyyppi on vain yleinen nimitys samanlaisille tavaroille. ID on jokaiselle tavaralle erikseen.
+
 
+
'''TYYPPI Lyhyesti'''
+
* Tyyppi on sama kaikille samannäköisille tavaroille
+
 
+
=== Finditem ( tavaroiden etsiminen ) ===
+
 
+
[[finditem|Finditem]] komento on erittäin hieno ja mahtava ominaisuus EUO:ssa. Sen avulla voimme etsiä tavaroita, jotka on ladattu UO:n clientin muistiin. Tässä pitää ymmärtää, että EUO "näkee" vain 18 askelta joka suuntaan ukosta. Ei yhtään enempää vaikka tekisit mitä. Jos näkee enemmän, niin sitten on jotain ihmeellistä sattunut.
+
 
+
Tarvitset tätä hommaa varten runebookin tai jonkun muun kirjan. Tai oikeastaan mikä tahansa käytettävä tavara käy. Käytettävällä tarkoitan tavaroita joita pitää tupla klikata jotta jotain tapahtuu. Sen tavaran pitää olla laukussasi.
+
 
+
==== TYYPIN Etsiminen ====
+
 
+
TYPE:n löytäminen on helppoa. Helpoin tapa on liikuttaa jotain esinettä ( tietenkin sitä, minkä Typeä selvitellään ) ja katsomalla sitten systeemi muuttujista ( EUO:n Oikeasta laidasta ) [[Var lLiftedType|#lLiftedType]] :n arvo.
+
Ei ollut vaikeaa, kokeileppas liikutella muita tavaroita ja katso kuinka se muuttuu.
+
 
+
==== Finditem Itse ====
+
 
+
Noniin, ota talteen haluamasi tavaran TYPE. Kuvitellaan että se on KUF
+
<pre>
+
finditem KUF C_ , #BackPackID
+
set #lobjectID #findid
+
event macro 17
+
halt
+
 
</pre>
 
</pre>
  
Huh, nyt parahti jännäkakka housuu. Tuli aika söhellys siitä vai?
+
If you create subs with this way, you can easily reuse them. Do it once with time and you dont have to create it ever again. For example, almost every script needs code that opens some bag. Maybe its your backpack, reagent bag or loot bag. Why would you create 100+ lines of code for different bags in different scripts, when you could build just one nice looking sub.
Katsotaanpas mitä siinä oikein värkkäillään.
+
 
+
[[finditem]] KUF C_ , #BackPackID
+
KUF = Blackpearlin tyyppi, eli sitä etsitään nyt.
+
C_ = Container = Laatikosta etsitään. Voisi olla myös G_ eli ground, jolloin etsitään maasta.
+
, = string operator. Yhdistää kaksi sanaa toisiinsa. Tästä kohta lisää vähän.
+
#BackpackID = Sisältää reppusi ID:n. Yhdessä C_ kanssa, tarkoittaa että etsitään nimen omaan TÄSTÄ laukusta.
+
 
+
Noniin. Jos sinulla on laukun ID, voisit tehdä haun myös näin ... C_IDIDID ,mutta koska meillä on ID muuttujassa, emme voi vain kirjoittaa sitä yhteen näin, C_#backpackID. Siksi käytämmä siinä välissä " , " merkkiä. Joten kun EUO ohittaa tuon rivin, se lukee sen ( kuvitellaan että #backpackID:n sisältä on abcdef ) C_ABCDEF. Ymmärsitkö? Ei sillä niin ole vielä väliäkään.
+
 
+
Voit myös etsiä useampaa tavaraa yhtäaikaa näin, KUF_ZLF_ABC_EDF_JNE.
+
 
+
Aina kun [[finditem]] komentoa käytetään, se päivittää kaikki systeemi muuttujat "find item" otsikon alta.
+
 
+
Nämä siis:
+
 
<pre>
 
<pre>
#FINDID      ; Löydetyn tavaran ID
+
;==================
#FINDTYPE    ; Löydetyn tavaran TYPE
+
; name: OpenBag
#FINDX      ; Tavaran X piste
+
; Author: Una
#FINDY      ; Tavaran Y piste
+
; Purpose: Opens any bag
#FINDZ      ; Tavaran Z piste
+
; %1 = ID of bag
#FINDDIST    ; Etäisyys ( askelta )
+
sub OpenBag
#FINDKIND   ; -1 Ei löytynyt mitään tavaraa, 0 tavara on laatikossa , 1 tavara on maassa
+
   if %0 = 0
#FINDSTACK  ; Kuinka monta niitä on samassa nipussa
+
    return #false
#FINDBAGID   ; Laukun ID mistä se tavara löytyi
+
  set #LobjectId %1   ; Sets the first give parameter to #lobjectID
#FINDREP    ; Tavaran maine, ihmiset vain, 1 (Blue),2 Friend (Green), 3 Grey (Grey - Animal), 4 Criminal (Grey),
+
  event macro 17 0    ; Use last object ( ie. Opens bag that id was give )
5 Enemy (Orange), 6 Murderer (Red), 7 Invulnerable (Yellow)
+
return #true
#FINDCOL    ; Tavaran väri (hue)  
+
#FINDINDEX  ; Kertoo mitä tavara "tasoa" katsotaan
+
#FINDCNT    ; Kertoo kuinka monta "tasoa" löytyi.
+
 
</pre>
 
</pre>
  
[[findCnt|#FindCnt]] kertoo kuinka monta tavaraa löytyi. Nyt pitää huomioida, että se laskee kaikki esiintymät tavarasta erillisenä tavarana. Eli, jos inulla on kolme nippua Bloodmossia repussa ja yrität etsiä sitä, niin se löytää 3 ( #findcnt = 3 ).  
+
See, this is very simple sub, that does not have anykind of error detection ( it does not check, if the bag really opened ) but you can easily use it in any other script you have and even share it with others. Remember to comment subs, so you remember what is it for.
  
Tämä on monimutkaista, mutta ei haittaa vaikka et heti käsitäkään kaikkea. Kyllä se siitä sitten kun harjoittelee.
+
==== Return from gosub ====
  
Jos löydät vaikka 5 tavaraa, ihmettelet, että "miten hemmetissä mä saan noiden muiden tavaroiden ID ja sijainnin selville?". Ratkaisu on helppo, #findindex. Kun etsiskelet tavaroita, huomaat että #findindex on aina 1. Koita etsiä jotain tavaraa, mitä tiedät että sinulla on enemmän kuin yksi.
+
Return command is very important. If you dont use it, it can cause wierd problems with your script. Always return from sub, dont goto.
 +
As i already mentioned previously, you can get parameters out from sub with return command. I told you to always give parameters to sub, never set variables in subs, becouse that makes it harder to use in other scripts, unless its namespaced or there is really something that needs to be set.
  
 
<pre>
 
<pre>
finditem KUF C_
+
gosub FindId ABC #backpackID
msg #findID tavara 1 $
+
if #result = #false
set #findindex 2
+
  display ok Did not find item
msg #findid tavara 2 $
+
else
 +
  display ok #result
 
halt
 
halt
 +
;=================
 +
; name: FindId
 +
; Author: una
 +
; Purpose: Find id of given type from given bag
 +
; %1 = Type of item
 +
; %2 = Bagid
 +
sub FindId
 +
  Open %2
 +
  FindItem %1
 +
    IF NOT found
 +
      return #false
 +
return #findid
 
</pre>
 
</pre>
 +
This simple Pseudo script will look for items and if does not find it returns and set #result to #false. If it finds item, it will set #result Id of item. You can return info this way from sub and act on dependin results.
  
Huomasitko? ID muuttui keskenkaiken, miten se on mahdollista? #findindex. Sitä voi kuvitella jonkin sortin tasona. Ekalla tasolla on ensiksi löytyneen tiedot ( kaikki mitä listasin hetki sitten ), toisella tasolla on samat tiedot toisesta tavarasta, kätevää? Kyllä!.
+
=== #True and #False ===
 
+
=== Tavaran Käyttö ===
+
 
+
Sitten suoritetaan paluu aiheeseen :)
+
<pre>
+
finditem KUF C_ , #BackPackID
+
set #lobjectID #findid
+
event macro 17
+
halt
+
</pre>
+
 
+
Meillä oli tällainen esimerkki tuossa aikaisemmin. Finditem on nyt jotenkin hallussa ( älä jännitä, ei haitta vaikka et vielä ymmärtäisi, kuhan tiedät vain mitä sillä tehdään jotenkin ).
+
 
+
Löysimme siis KUF:in ja sen ID on tallennettu tietenkin #findid muuttujaan. #LobjectID, pitää sisällään tiedot tavarasta, jota on viimeksi käytetty. ( Tiedät varmasti UO macron "use last object" , tämä pitää sen objectin tiedot sisällään ).
+
Tuossa noin asetamme ( set ) viimeksikäytetyn tavaran id:ksi (#lobjectID) juuri llöytämämme ID:n (#findid).
+
 
+
set #lObjectID #findid
+
 
+
Sitten tulee "event macro 17". Event macrot, on ultiman valmiita macro toimintoja. Niitä mitä voit siis laittaa pikanappeihin ihan normaalistikin. Klikkaa --> [[Event Macro]] <-- nähdäksesi listan kaikista event macroista. SUOSITTELEN että katselet hetken sitä listaa. Ymmärrät sen avulla kuinka helppo joitakin asioita on tehdä EUO:lla.
+
 
+
Event macro 17 on " USE LAST OBJECT ". Eli kun käytät tätä macroa, niin se tarkistaa #LobjectID :n ja käyttää sitä tavaraa, minkä ID siellä on. Tämähän on näppärä ( sano mummo kun oven näki ) komento. Koska voimme muuttaa #lobjectID:n sisältöä, voimme käyttää mitä tahansa tavaraa pelissä, kunhan tiedämme sen ID:n. Ja sitä varten meillä on [[findItem]].
+
  
'''TEHTÄVIÄ'''
+
Learn to use these. If you have variables, that state ON/OFF type of things, then you can use #true and #false.
* Etsiskele tavaroita "finditem" komennolla ja sano ne ääneen käyttämällä "msg" komentoa.
+
I wrote separated quide for these and you can find it [[QG_True_False|here]]
* Tarkastele [[Event Macro]] listaa ja avaa kokeile avata taikakirja tai statusbar tai paperdoll niiden avulla.
+
* Etsi jotain käytettävää tavaraa laukusta ja koita käyttää sitä. Esim. Runebook, lapio, tikari.
+

Latest revision as of 01:42, 4 December 2006



Building up and finishing script. Basic and advanced tehcniques

First words

Purpose/Idea

Im writing this becouse so many beginner and even some Advanced scripters, build hard to edit and nonreadable code. Im trying to show some basic and advanced ideas about good code and teach you to script better scripts.

About author: Una

I have scripted more or less about 3 years now. I know couple of things from scripting and coding and i love to code ( and script ). Im not Pro and i dont claim to be one, but i think i can teach lots to beginners and even to people who have been in "business" for sometime already.

Target audience

In order to be able to read and fully understand this document, you are required to understand the very basics of EUO scripting language. If you are advanced writer and have already puplished some scripts, i think i can still give you something. Hope you like to read and find this "tutorial" usefull. Remember, what i show here, is only my way to do things but i have founded these to be good in my 3 year career with EUO.

Starting to write a script

Break your script to blocks ( in your head or paper ). Say you are building mining script, then it should look like this.

  • Check tools from backpack
  • Use mining tool and target ground
  • Check weight and if too heavy recall/unload

Now, you know where to start scripting. This is the heart of this script. We can now move it to next level. Pseudo- code.

Mainloop:
  gosub CheckForTools
  gosub Dig
  gosub CheckWeight
goto Mainloop

This is the mainloop. Every script should have something like this, that gets looped over and over again, until script execution is halted. Next thing would be building those actual subs.

Gosub: How to take everything out from these

  • If something can be thought as separate part of script, make it to Sub
  • Always create subs so, that they dont use global variables, but use Gosub parameters
  • Use return parameter

Return, Use this command always to get out of sub. DONT goto, no matter what. Its bad coding and leads to problems. Did you know:

  • Return command can return info?
gosub Test

sub Test
return This_is_test

display ok #result
halt

Display now should read "This_is_test" . Great isnt it?

Gosub parameters

I show now, HOW to use these and WHY.

gosub TestSub first second third
gosub TestSub This Is Great
sub TestSub
   Display ok %1 %2 %3
return

Feel free to test that. Did you notice, how those variables are set? %1 is the first variable passed to sub and %2 is second , %3 is third and so on. Always build sub so, that you think its idiot, so that you need to give everything to it, before it can do something. Never assume that it knows it already. Heres two examples, Bad one and good one.

"Bad way" (pseudo code)

set %BackpackID ABCDEF
set %IDofSomething GHIJKL
gosub TestSub

sub TestSub
   Open %BackPack
   Find %IDofSomething
return

Why is this bad? Becouse it needs those variables to be set in somewhere. Its hard to debug.

set %BackpackID ABCDEF
set %IDofSomething GHIJKL
gosub TestSub

sub TestSub %BackpackID %IDofSomething
   Open %1
   Find %2
return

This is much easyer to debug, becouse you know exactly what variables it gets in and what it does. Even better sub would be with comments. Like this.

set %BackpackID ABCDEF
set %IDofSomething GHIJKL
gosub TestSub

;=================
; name: TestSub
; Author: Una
; Purpose: To open backpack and findstuff
; %1 = Backpack ID
; %2 = What to look for
sub TestSub %BackpackID %IDofSomething
   Open %1
   Find %2
return

If you create subs with this way, you can easily reuse them. Do it once with time and you dont have to create it ever again. For example, almost every script needs code that opens some bag. Maybe its your backpack, reagent bag or loot bag. Why would you create 100+ lines of code for different bags in different scripts, when you could build just one nice looking sub.

;==================
; name: OpenBag
; Author: Una
; Purpose: Opens any bag 
; %1 = ID of bag
sub OpenBag
   if %0 = 0
     return #false
   set #LobjectId %1   ; Sets the first give parameter to #lobjectID
   event macro 17 0    ; Use last object ( ie. Opens bag that id was give )
return #true

See, this is very simple sub, that does not have anykind of error detection ( it does not check, if the bag really opened ) but you can easily use it in any other script you have and even share it with others. Remember to comment subs, so you remember what is it for.

Return from gosub

Return command is very important. If you dont use it, it can cause wierd problems with your script. Always return from sub, dont goto. As i already mentioned previously, you can get parameters out from sub with return command. I told you to always give parameters to sub, never set variables in subs, becouse that makes it harder to use in other scripts, unless its namespaced or there is really something that needs to be set.

gosub FindId ABC #backpackID
if #result = #false
  display ok Did not find item
else
  display ok #result
halt
;=================
; name: FindId
; Author: una
; Purpose: Find id of given type from given bag
; %1 = Type of item
; %2 = Bagid
sub FindId
   Open %2
   FindItem %1
     IF NOT found
       return #false
return #findid

This simple Pseudo script will look for items and if does not find it returns and set #result to #false. If it finds item, it will set #result Id of item. You can return info this way from sub and act on dependin results.

#True and #False

Learn to use these. If you have variables, that state ON/OFF type of things, then you can use #true and #false. I wrote separated quide for these and you can find it here