Difference between revisions of "User:Una"

From Wiki
Jump to: navigation, search
(Gosub)
Line 1: Line 1:
== Suomenkielinen EasyUO scriptaus opas ==
+
= Building up and finishing script. Basic and advanced tehcniques =
  
=== Una, oppaan kirjoittaja ===
+
== First words ==
  
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.
+
=== Purpose/Idea ===
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 ===
+
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.
  
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ä.
+
=== About author: Una ===
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.
+
  
 +
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.
  
=== Oppaan tarkoitus ===
+
=== Target audience ===
  
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.
+
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 ==
  
=== Peli välineet ===
+
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
Tarvitset:
+
* Use mining tool and target ground
* Tietokoneen ( Ylläri )
+
* Check weight and if too heavy recall/unload
* Uusimman version EasyUO 1.5 betasta. ( HUOM: Ehdottomasti 1.5, koska jotkut komennot joita esitän, ei toimi vanhassa )
+
Now, you know where to start scripting. This is the heart of this script. We can now move it to next level. Pseudo- code.
* Aivot
+
 
+
'''HUOM:'''
+
* Oletan oppaan aikana, että sinulla on Ultima online 2D clientti päällä ja olet kirjautuneena sisään aivan normaalisti.
+
 
+
== Osa 1. Muuttujat ==
+
 
+
 
+
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ä.
+
 
+
=== Globaalit muuttujat % ( Global variables ) ===
+
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.
+
 
+
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
 
+
set %7EIole
+
 
</pre>
 
</pre>
 
Käyttö on helppoa, kuten seuraavassa esimerkissä näkyy.
 
 
<pre>
 
set %Muuttuja 10
 
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.
 
[[set]] komento kertoo EasyUO:lle, että nytten toimitaan muuttujien kanssa ja muutetaan niiden arvoja.
 
[[msg]] komento mahdollistaa puhumisen hahmollasi UO:ssa.
 
[[halt]] Lopettaa scriptan pyörimisen.
 
 
'''Tehtävä:'''
 
* 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
 
</pre>
 
 
Aja tuo pätkä EUO:lla.
 
Sitten kokeile tätä.
 
 
<pre>
 
msg *UnaTesti $
 
halt
 
</pre>
 
 
Mitä tapahtui? Aivan oikein, se muistaa nyt, mitä pistits inne talteen. Eli toisin sanoen, se tallensi sen kovalevylle talteen.
 
 
=== Systeemi muuttujat # ( System variables ) ===
 
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.
 
 
Katsotaas vähän listaa:
 
 
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>
 
 
=== 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>
 
set %PaikkaX #CharPosX + 1
 
set %PaikkaY #CharPosY + 1
 
 
move %PaikkaX %PaikkaY 0 5s
 
halt
 
</pre>
 
 
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.
 
Sen jälkeen käytämme komentoa [[move]] ja annamme sille koordinaatit ja muut tiedot ja sitten se yrittää päästä siihen annettuun pisteeseen.
 
 
[[move]] komento tarvitsee tietoa pikkaisen, kuten esimerkissä näkyy.
 
 
move {X} {Y} [toleranssi] [yritysaika]
 
 
* {X} = X piste johon yritetään liikkua
 
* {Y} = Y piste johon yritetään liikkua
 
* [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ä.
 
[yritysaika] = Kuinka kauan yritetään päästä kyseiseen pisteeseen
 
 
[[Event PathFind]] on myös hyvä ja helppo tapa päästä haluttuun paikkaa.
 
 
event PathFind {X} {Y} [Z]
 
 
Aika helppo käyttöinen vai mitä? X, Y ja Z piste, ei muuta.
 
 
'''Tehtävä:'''
 
* Katso Ukon sijainti EUO:n systeemi muuttujista, kävele kauemmaksi ja koita päästä scriptan avulla takaisin.
 
* Kokeile [[Move]] :n ja [[Event PathFind]] :in eroja.
 
 
=== ID ja TYPE ===
 
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>
 
 
Huh, nyt parahti jännäkakka housuu. Tuli aika söhellys siitä vai?
 
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>
 
#FINDID      ; Löydetyn tavaran ID
 
#FINDTYPE    ; Löydetyn tavaran TYPE
 
#FINDX      ; Tavaran X piste
 
#FINDY      ; Tavaran Y piste
 
#FINDZ      ; Tavaran Z piste
 
#FINDDIST    ; Etäisyys ( askelta )
 
#FINDKIND    ; -1 Ei löytynyt mitään tavaraa, 0 tavara on laatikossa , 1 tavara on maassa
 
#FINDSTACK  ; Kuinka monta niitä on samassa nipussa
 
#FINDBAGID  ; Laukun ID mistä se tavara löytyi
 
#FINDREP    ; Tavaran maine, ihmiset vain, 1 (Blue),2 Friend (Green), 3 Grey (Grey - Animal), 4 Criminal (Grey),
 
5 Enemy (Orange), 6 Murderer (Red), 7 Invulnerable (Yellow)
 
#FINDCOL    ; Tavaran väri (hue)
 
#FINDINDEX  ; Kertoo mitä tavara "tasoa" katsotaan
 
#FINDCNT    ; Kertoo kuinka monta "tasoa" löytyi.
 
</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 ).
 
 
Tämä on monimutkaista, mutta ei haittaa vaikka et heti käsitäkään kaikkea. Kyllä se siitä sitten kun harjoittelee.
 
 
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.
 
 
<pre>
 
finditem KUF C_
 
msg #findID tavara 1 $
 
set #findindex 2
 
msg #findid tavara 2 $
 
halt
 
</pre>
 
 
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ä!.
 
 
=== 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Ä'''
 
* Etsiskele tavaroita "finditem" komennolla ja sano ne ääneen käyttämällä "msg" komentoa.
 
* 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.
 
 
 
=== Tähtääminen ===
 
 
Tähtääminen on mukava toteuttaa EUO:lla. Se on niin nopea, tarkka ja armoton. Tiedät varmasti miltä tuntuu klikkailla kalliota, kun mineet tai miltä tuntuu klikata ohi vihollisesta, ehkä jopa väärään kohteeseen. EUO hoitaa nämä puolestasi, jos vain osaat pyytää.
 
 
Jos muistat vielä ( ainakin pitäisi muistaa ) muuttujan #LobjectID. Se pitää hallussaan viimeksi käytetyn tavaran ID:tä.
 
Samoin toimii myös #LtargedID , #LtargedX , #LtargetY jne. Jo nimistä voi päätellä aikasta paljon.
 
 
Koitamme nyt tähdätä toiseen pelaajaan, monsteriin tai johonkin vastaavaan liikkuvaan kohteeseen. Meidän tulee huomioida, että koska kohde on liikkuva, ei oikeastaan voida käyttää X ja Y pistettä. Koska sehän liikkuu kokoajan. Joten käytetään #LtargetID muuttujaa. Tämä on hyvä myöskin tavaroihin tähdätessä. X ja Y tulevat käyttöön kun minetään tai hakataan puuta tai jotain vastaavaa.
 
 
<pre>
 
event macro 15 3 ; Heal taika
 
target          ; odottaa targettia
 
set #LtargetID #CharID ; Asettaa oman hahmosi ID:n #LtargetID muuttujaan.
 
set #LtargetKind 1 ; Koska tähtäämme objectiin ( ihmiseen )
 
event macro 22  ; Last target macro. Eli tähtää edelliseen kohteeseen
 
halt
 
</pre>
 
 
Eli tällä pienellä koodilla, käytämmä taikaa, odotamme tähtäintä ja tähtäämme itseemme sen.
 
Ei ole vaikeaa eihän? Tuskin tätä tarvitsee hirveästi tarkastella, pitäisi olla aikasta selvä homma.
 
 
 
=== Mining ===
 
 
Tämä on yksi suosituommista aiheista ensimmäiseksi scriptaksi. Joten käsitellään sitä hiukkaisen.
 
Tässä aiomme käyttää #LtargetX ja Y komentoa hyväksi. Ja tutustumme hiukan "looppeihin" eli silmukoihin. Normaalisti kun käsket EUO :n pälle, se juoksee ylhäältä alas ja kun se on lopussa, se hyppää takaisin ylös.
 
 
Sinun pitäisi jo osata katsoa jonkin tavaran Tyyppi
 
 
<pre>
 
silmukka:
 
                      ; Tämä on ns "label". Huomaa " : ". Gotolla voit hypätä tähän
 
set %Lapio WWF_qpf_twf          ; Tässä on lapion eri tyypit, Voit lisätä perään pickaxrn typet jos osaat. Pitäis ainakin.
 
finditem %Lapio C_ , #backpackID ; Etsitään lapioita repusta
 
if #findcnt = 0                ; löydettiinkö lapio? Jos tämä on suurempi kuin 0 , niin silloint löytyi. ( HUOMAA IF )
 
{
 
  display ok Ei ole lapioita $  ; display komento.. testaa niin selviää,
 
  halt
 
}
 
set #LobjectID #Findid   
 
set #LtargetX #CharPosX
 
set #LtargetY #CharPosY
 
event macro 17
 
target
 
event macro 22
 
wait 3s       
 
                  ; odottaa 3 sekuntia
 
goto silmukka                    ; etsii silmukka: nimisen paikan ja jatkaa siitä.
 
</pre>
 
 
Siinähän oli kunnon pläjäys uusia komentoja.
 
[[display]] = Hyvä erilaisten kyselyiden tekoa varten ja tiedon näyttämistä varten.
 
[[wait]] = Odottaa tietyn ajan verran. wait 20 = wait 1s, 40 = 2s.
 
 
 
=== IF ( Ehtolauseke ) ===
 
[[If]]
 
Ehtolauseet. Voit tehdä tämän avulla monenlaisia asioita. Esim, jos haluat tehdä jotain, kun vaikka #hits on liian pieni.
 
 
<pre>
 
if #hits < 40
 
gosub HealME
 
if #mana < 20
 
gosub meditate
 
</pre>
 
 
Eli jos #Hits tippuu alle 40 niin [[gosub]] HealMe. Yksinkertaista. Voit käyttää vertailussa mitä tahansa muuttujaa.
 
<pre>
 
if {ehto} {vertailu} {kohde}
 
</pre>
 
 
Jos if lauseen jälkeen on vain yksi rivi, niin ei tarvita hakasia {}.
 
 
<pre>
 
if {ehto} {vertailu} {kohde}
 
    Jos näin on, niin tee tämä
 
</pre>
 
 
 
Mutta jos tulee useampi rivi, niin joudut käyttämään niitä.
 
 
<pre>
 
if {ehto} {vertailu} {kohde}
 
{
 
  eka
 
  toka
 
  kolmas
 
  ...
 
}
 
</pre>
 
 
Hankalaa? Enpä usko.
 
 
<pre>
 
set %testi 1
 
set %testi2 2
 
 
if %testi > %testi2
 
display ok %testi on suurempi kuin %testi2
 
else
 
display ok %testi2 on suurempi kuin %testi
 
halt
 
</pre>
 
 
=== Gosub ===
 
 
Gosub on hieno keksintö. Jos jotain täytyy tehdä useaan otteeseen, esim lyödä hakulla maahan, tai parantaa itseäsi tai jotain muuta vastaavaa, niin se kannattaa tehdä tämän avulla.
 
 
<pre>
 
loop:
 
 
OnHotkey 1
 
  gosub HealMe
 
 
goto loop
 
 
 
 
sub HealMe
 
{
 
 
event macro 15 3
 
target
 
event macro 23
 
 
return
 
}
 
</pre>
 
 
Tarkastellaanpa hieman tuota koodia. [[onHotKey]] komento, suorittaa jonkun koodipätkän KUN kyseessä olevaa nappia painetaan. Eli tässä tapauksessa " 1 ". Kun painat ykköstä niin se suorittaa komennon "Gosub HealMe". EUO etsii kohdan, joka on nimetty "sub HealMe" ja jatkaa koodia siitä, tekee asiat siellä ja kun se löytää komennon [[return]], niin se palaa takaisin kohtaan, jossa [[gosub]] käsky oli ja jatkaa siitä normaalisti eteenpäin. Näin siis saat koodista selkeämpää ja helmpommin muokattavan.
 
 
[[gosub]] komento ottaa vastaan myös parametrejä. Eli toisin sanoen, voi antaa tietoja subille.
 
 
<pre>
 
gosub Test Eka Toka Kolmas
 
halt
 
 
sub Test
 
{
 
msg Parametri 1: %1 Parametri 2: %2 Parametri 3: %3 $
 
return
 
}
 
</pre>
 
 
Nyt mietit, että miksi antaisit jotain tietoja, näkeehän se ne muutenkin. Seuraava esimerkki valoittaa tätä puolta hiukan.
 
 
<pre>
 
gosub YhteenLasku 5 3
 
msg %Tulos $
 
halt
 
 
 
 
;=================
 
; Laskee yhteen kaksi parametriä
 
; %Tulos muuttuja sisältää tuloksen
 
sub YhteenLasku
 
{
 
set %Tulos %1 + %2
 
 
return
 
}
 
</pre>
 
 
 
Sitten vielä yksi esimerkki gosubista. Tämä on tärkeää oppia, tulet käyttämään tätä paljon. Return komentoa voi käyttää hyväkseen muutamalla tavalla. Paras subi, olisi sellainen, joka on täysin irrallinen scriptasta. Eli sitä voi käyttää samanlaisena missä tahansa scriptassa. Kun tarkastellaan edellistä esimerkkiä, niin se vaatii edelleen %Tulos muuttujan tarkastelua. Tässä vähän esimerkkiä return komennosta.
 
 
<pre>
 
gosub YhteenLasku 5 5
 
msg #result $
 
halt
 
 
sub YhteenLasku
 
{
 
 
return %1 + %2
 
}
 
</pre>
 
 
Huomaatko? Ei edes tarvittu muuttujaa. #result tallentaa tiedot edellisestä #return komennosta. Voit käyttää returnia jotta scriptasi tietää mitä subissa on tapahtunut.
 
 
<pre>
 
gosub OstaKalaPihvi
 
if #result = Kalat_Ostettu
 
  msg Hyvä homma, kalat on kassissa $
 
else
 
  msg EI ollut rahaa pihveihin $
 
 
halt
 
 
sub OstaKalaPihvi
 
{
 
if #gold < 100
 
    return Liian_vähän_rahaa
 
 
OstaKalaakoodiTähän
 
 
return Kalat_Ostettu
 
}
 
</pre>
 
 
Huomaatkos? Return komento on todella monipuolinen ja kannattaa hyödyntää sitä. Siisti tapa käyttää returnia on #true ja #false. #True = TOSI ja #False = EPÄTOSI.
 
 
<pre>
 
gosub Subi una
 
if #result
 
  msg SE OLI OIKEIN $
 
if ! #result
 
  msg Väääärin $
 
 
halt
 
 
 
Subi
 
{
 
if %1 = una
 
  return #true  ; Vaikka salasanan tarkistus. Jos oikein, niin palauta #true
 
 
return #false  ; Jos IF lause ei täsmää, niin silloin passu oli väärä, joten palautetaan #false
 
}
 
</pre>
 
 
Tossa tuli taas pari uutta asiaa. Uusi vertailu operaattori. " ! " . Voidaan käyttää #true ja #false :n sisältäviin muuttujiin.
 
<pre>
 
if ! %Muuttuja
 
; Jos muuttuja on #false
 
if %Muuttuja
 
; Jos muuttuja on #true
 
</pre>
 
 
Todella kätevä. Jos jollain muuttujalla on vain kaksi olomuotoa. Eli päällä tai poissa, niin käytä falsetrue arvoja.
 
 
Taidan edetä aikasta nopeasti, mutta toivottavasti pysytte perässä. Jos kysymys on viisas niin voitte vaikka heittää privamessagee mulle. Saatan jopa vastata :)
 

Revision as of 08:47, 3 April 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