UGump komut dosyası oluşturma, özellikle de gump tasarımı, bir komut dosyası yazarı için yapması en zor şeylerden biridir. REMOVE ve NEWITEM gibi hatırlaması kolay komut dosyası komutları yerine, değişkenleri kullandıklarında daha da karmaşık hale gelen şifreli görünümlü harf ve sayı dizeleri elde edersiniz. Zorluk nedeniyle Gump Scripting 101 bölümünü üç bölüme ayırdım. İlk bölüm, bazı komutların kurulumunu ve sözdizimini gösterir. İkinci bölüm geri kalanını gösterir. Üçüncü bölüm, göreceli koordinatlar, döngüler ve dinamik düğmeler kullanarak dinamik diyaloglar oluşturmak için kullanılabilecek bazı daha gelişmiş teknikleri açıklayacaktır.
Bölüm 1
İlk olarak, şimdiye kadar gördüğünüz herhangi bir komut dosyasından farklı olan bir gump komut dosyasının kurulumuna bakmamız gerekiyor. SPHERE'in bir gump komut dosyasını tanımak için kullandığı etiket DIALOG'dur. Bu bölümlerde diyalog ve gump kelimelerini birbirinin yerine kullanacağım. Ne yazık ki, GUMP'ler üç bölümden oluşur: İletişim kutusunun kendisi, iletişim kutusuna giren dizeler ve düğme yanıtları. Bunların hepsi tek bir bölümde olamazdı, bu yüzden SPHERE işleri şu şekilde ayırdı:
[DIALOG d_test_dialog]
... Code for the dialog layout goes here ...
[DIALOG d_test_dialog TEXT]
... The text that will be displayed in the dialog goes here ...
[DIALOG d_test_dialog BUTTON]
... The events that are triggered when buttons are pressed goes here ...Şimdi, iletişim kutuları bir dizi farklı nesne türünden oluşuyor. Metin kutuları, düğmeler, onay kutuları, metin giriş kutuları (değiştirebileceğiniz) ve diğer çeşitli şeyleriniz olabilir. Her biri, işlev çağrısına çok benzeyen bir söz dizimi ile tanımlanır. İletişim kutularıyla kullanabileceğiniz tüm komutların listesi burada. Her birini daha sonra ayrıntılı olarak açıklayacağım.İletişim Kutusu Nesneleri
resizepic <x> <y> <gumpback> <width> <height> // Çok sayfalıysa önce gelebilir, arka plan koyabilirsiniz
dorigin <x> <y> // Dinamik bir başlangıç noktası ayarlar
checkertrans <x> <y> <width> <height> // Trafik katmanı ekleme (yalnızca alıcılar için >= 3)
gumppic <x> <y> <gump> <hue> // DLG'ye gumps ekleyin. (yalnızca alıcılar için renk tonu >= 3,
gumppictiled <x> <y> <width> <height> <gump> // tile a gump
tilepic <x> <y> <item> // put item tiles in the dlg.
tilepichue <x> <y> <item> <hue> // renkli öğe döşemelerini DLG'ye yerleştirin.
text <x> <y> <color> <stringindex> // buraya bir metin ekleyin
dtext <x> <y> <color> <text> // buraya bir metin ekleyin.
croppedtext <x> <y> <width> <height> <color> <stringindex>
dcroppedtext <x> <y> <width> <height> <color> <text>
htmlgump <x> <y> <width> <height> <stringindex> <hasbackgroud> <hasscrollbar> // Bir metni gösteren bir HTML gump ekleyin
dhtmlgump <x> <y> <width> <height> <hasbackgroud> <hasscrollbar> <text> // Bir metni gösteren bir HTML gump ekleyin
xmfhtmlgump <x> <y> <width> <height> <clilocid> <hasbackgroud> <hasscrollbar> // Cliloc metni gösteren bir HTML gump ekleyin
button <x> <y> <Down_gump> <Up_gump> <pressable(1/0)> <pagedest> <id>
buttontileart <x> <y> <up_gump> <down_gump> <pressable> <page> <id> <tileid> <tilehue> <x offset> <y offset> // Tileart ile bir düğme ekleyin.
textentry <x> <y> <width> <height> <color> <id> <startstringindex> // Yükseklik 20 olmalı
dtextentry <x> <y> <width> <height> <color> <startstringindex> <text> // Yükseklik 20 olmalı
textentrylimited <x> <y> <width> <height> <color> <id> <startstringindex> <limit> // Karakter sınırlaması olan metin girişi
dtextentrylimited <x> <y> <width> <height> <color> <id> <limit> <text> // Karakter sınırlaması olan metin girişi
tooltip <clilocid> // Bir Gump nesnesi üzerinde bir araç ipucu açılır (yalnızca alıcılar için >= 4)
radio <x> <y> <gump1> <gump2> <starting_state> <id>
checkbox <x> <y> <gumpcheck> <gumpuncheck> <starting_state> <checkid>
page <page_number> // çok sekmeli iletişim kutuları için.
group // radyo düğmeleri gruplarını gruplamak için kullanılır - Grup 1, Grup 2, vb.
nomove // Gump çevresinde hareket ettirilemez.
noclose // Gump kapatılamaz
nodispose // Gump yok etme
// Evet, bunlar şimdi karmaşık görünüyor ve bir süre daha kolay komut dosyası oluşturmaya devam etmek istiyorsanız, sizi suçlamıyorum. Gördüğünüz gibi, bir web sitesinde olduğu gibi güzel bir form oluşturmak veya hatta web sitesi tipi bir arayüz oluşturmak için gerekli tüm nesnelere sahibiz. Size daha sonraki bir bölümde gizli düğmelerin nasıl yapıldığını ve bunun gibi şeyleri göstereceğim. Göründüğü kadar zor değil.Şimdi tasarımı tartışmak zorundayız. Tüm gumplar şu şekilde başlamalıdır:
[DIALOG d_test_gump]
0,0
page 0
... Some objects here ...
page 1
... More objects here ...0,0, diyaloğun ekranda başlayacağı konumdur. 0,0, bu iletişim kutusunun sol üst köşesi oyun ekranının sol üst köşesinde olacak şekilde görüneceği anlamına gelir. Bir diyaloğun başka bir yerde başlamasını sağlamak mümkündür, ancak diyalog küçük olmadığı sürece gerçekten anlamsızdır.İletişim kutuları sayfalara bölünür ve belirli bir zamanda yalnızca bir sayfa görüntülenebilir. Size daha sonra düğmelerle sayfalar arasında nasıl geçiş yapacağınızı göstereceğim. Ancak, sayfa 0 her zaman diğer sayfaların altında görüntülenir. Sayfalar arasında değiştirmek istemediğiniz bir şeyiniz varsa (arka plan veya gump'ın üstündeki bir başlık gibi), onu 0. sayfaya koyarsınız. Aksi takdirde, başka bir sayfaya gider. Bir iletişim kutusu göründüğünde varsayılan olarak Sayfa 1 görüntülenir.
Şimdi, gump'ımıza bir arka plan ekleyelim. Kalmasını istediğimiz bir şey olduğu için, onu 0. sayfaya koyacağız. InsideUO'nuzu açın ve iyi bir arka plan bulalım. Aradığınız parça sol üst köşedeki parçadır. (Gumps'taki çoğu şey bir nesnenin sol üst köşesiyle ilgilidir.) InsideUO'nun gump listesinde bir numaralı A3C'yi bulun. Kullanacağımız arka plan bu. Aslında bu çok kullanacağınız bir arka plan, çünkü altın kenarlıklı düz siyah. Bu sayıyı onaltılık sayıya çevirirsek, 2620 elde ederiz. Bu sayıyı unutmayın, bu önemlidir.
Arka planlar için kullanılan komut resizepic'tir. Yukarıdaki tabloya bakın ve yeniden boyutlandırma için hangi bilgileri vermemiz gerektiğini göreceksiniz: bir x koordinatı, bir y koordinatı, bir gump kimliği, bir genişlik ve bir yükseklik. Bunların hepsine sahibiz. Koordinatlar için (0,0) koyacağız ve diyelim ki 500 genişlik ve 300 yükseklik yaptık.
İşte yeni senaryo:
[DIALOG d_test_gump]
0,0
page 0
resizepic 0 0 2620 500 300
page 1Bu kadar. Şimdi bunu bir senaryoya koyun ve oyun içinde .dialog d_test_gump yazın. Güzel bir siyah arka planımız olduğunu göreceksiniz. Gumps oluştururken oyun içinde olmak iyidir, çünkü her yeni eklemeden sonra test edebilirsiniz. Bazen koordinatlarınızda 25 kadar az bir farkla uzaktaysanız, işler garip görünebilir. Her şeyi teker teker düzeltmek, tüm gump komut dosyasını yazmaktan çok daha kolaydır, sonra bir yerde batırdığınızı öğrenin.Şimdi, gump'ımıza biraz metin ekleyelim. "Merhaba Dünya" diyeceğiz çünkü programlamada yeni şeyler yapmak için standart bu gibi görünüyor! Metni saklamanın iki yolu vardır: iletişim kutusunun içinde veya METİN bölümünde. Metniniz sık kullanılacaksa, her değiştirmek istediğinizde aynı kelimeyi düzenlemek zorunda kalmamak için onu [DIALOG d_test_gump TEXT] bölümüne koymak daha iyidir. Aksi takdirde, metni doğrudan ana iletişim kutusu bölümüne ekleyebilirsiniz.
İşte her ikisine de bir örnek:
[DIALOG d_test_gump TEXT]
<VAR.BLANKLINE>
Hello WorldHer satırın sıfırdan başlayan bir indeksi vardır. İlk satır için, her zaman hiçbir şey olarak değerlendirilmeyecek bir dize yapmayı severim, çünkü bazen boş metin istersiniz. Nedenini daha sonra göstereceğim. Ayrıca, metninizin ilk satırını 0 yerine 1 olarak düşünmenizi kolaylaştırır. Bizim durumumuzda, Hello World 1 konumunda olduğundan, ona metin kimliği 1 ile atıfta bulunuyoruz. İşte tüm senaryonun şimdi nasıl görüneceği. Açıkçası, grafikteki bu metin nesnesini kullanacağız. (50,50) 'ye koyacağız ve ona 1152 (beyaz olur) rengini vereceğiz. Ayrıca onu 1. sayfaya da koyacağız, çünkü sonsuza kadar orada kalmasını istemiyoruz. Aslında, hazır başlamışken size başka bir şey göstereceğim.Ana gump içindeki metni kullanma:
dtext 50 50 1152 Hello WorldÇok daha basit! Bundan sonra her iki örneği de kullanacağım. İşte tüm senaryomuz şimdi nasıl görünüyor:Metin eklemenin ne kadar kolay olduğunu gördünüz mü? Aynı metin kimliğini kullanarak
[DIALOG d_test_gump]
0,0
page 0
resizepic 0 0 2620 500 300
page 1
dtext 50 50 1152 Hello World
text 50 70 3 1
[DIALOG d_test_gump TEXT]
<LOCAL.BLANKLINE>
Hello World
[DIALOG d_test_gump BUTTON]
// Nothing here yet!metni yeniden de kullanabilirsiniz. Oyun içinde bu iletişim kutusuna bakarsanız, "Merhaba Dünya" nın iki kez yazıldığını göreceksiniz, çünkü Merhaba Dünya ile iki metin nesnemiz var. İkincisi, birincinin 20 piksel altında (ekrandaki noktalar) görüntülenir. Genel bir kural olarak, tüm metnin 20 piksel yüksekliğinde olduğu varsayılmalıdır. (Aslında 16'ya daha yakın, ancak bazı büyük harfler daha fazla yer kaplıyor.)Ayrıca farklı renklerde olduklarını da göreceksiniz. Genel bir kural olarak, diyalog metni için renk kimliği, oyun içi renk kimliği eksi 1'dir. Yani siyah 0, koyu mavi 1 vb. Yeni renkler (hues.mul renklerim gibi) bir iletişim kutusunda beklenen şekilde görüntülenmez, bu nedenle varsayılan renklere bağlı kalın. Ayrıca, bu renkler ONDALIK DEĞERDEDIR, bu nedenle şeyleri tekrar dönüştürmeniz gerekecektir. (Bu arada, 1152 ondalık renk 0480 onaltılıktır ve bu da bir öğedeki buz mavisi renktir.)
Artık metin eklediğimize göre, bir düğmeyle deney yapabiliriz. Açıkçası, gump'ımıza bir düğme eklemek için düğme nesnesini kullanacağız. Bu düğme nesnesi için çok fazla bilgiye ihtiyacımız var, bu yüzden referansınız için tanımı buraya kopyalayacağım. Her parçayı sırayla gözden geçireceğim.
button <x> <y> <gump id (down)> <gump id (up)> <active> <page #> <index>İşte her birinin yaptığı şey:<x> <y></x> Bu, düğme görüntüsünün sol üst köşesinin (gördünüz mü?) konumudur. Diyalog parçalarını birbirinden uzak tutmaya çalışın, çünkü bunlar komut dosyasında yerleştirildikleri sırayla çakışacaktır. Düğmemizi (50, 90), metnin ikinci satırının hemen altına koyacağız.
<gump id> Bir düğmeye bastığınızda, düğmenin "aşağı" konumda olduğunu göstermek için resmi değiştirir. Düğme kimliklerimiz için 9A8 (2472) ve 9A9 (2473) kullanacağız. Bu, nadiren kullanılan kırmızı elmas şeklinde bir düğmedir. Arka planımızla aynı altın kenarlığa sahip, bu yüzden güzel görünecek. Siparişin önce aşağı, sonra yukarı olduğuna dikkat edin. Görüntülerin sırası yukarı (2472), aşağı (2473), bu yüzden komut dosyamızdaki sayıları değiştirmemiz gerekecek.
<active> Bu, düğmenin bir olay (1) döndürüp döndürmeyeceğini veya sayfaları değiştirip değiştirmeyeceğini (0) belirleyen bir anahtardır. Sayfaları daha sonraki bir bölümde tartışana kadar, bu her zaman 1 olacaktır. (Teşekkürler Belgar!)
<page #> Düğmeler sayfaları değiştirmek için kullanılacaksa, görüntülenecek olan sayfa budur. İlkine geri dönmek için diğer sayfaya bir şey koymanız gerektiğini unutmayın. Berbat bir arayüzle kullanıcılarınızı hayal kırıklığına uğratmak istemezsiniz. Düğme sayfaları değiştirmezse 0 koyun.
<index> Bu, birazdan göreceğimiz gibi, olaylara yanıt vermek için kullanılır. Muhtemelen binlerden başlayarak yüksek bir sayı yapın. Bu bizim ilk düğmemiz olduğu için buna düğme 1000 diyeceğiz. Dizin 0 AYRILMIŞ'tır, yani onu sıradan bir düğme için kullanmamalısınız (nedenini daha sonra göreceğiz).
İşte şimdi tüm senaryo:
[DIALOG d_test_gump]
0,0
page 0
resizepic 0 0 2620 500 300
page 1
dtext 50 50 1152 Hello World
text 50 70 3 1
button 50 90 2473 2472 1 0 1000
[DIALOG d_test_gump TEXT]
<LOCAL.BLANKLINE>
Hello World
[DIALOG d_test_gump BUTTON]
ON=1000
SYSMESSAGE You pressed button 1000!Ooh! Yeni bir yapı! İletişim kutumuzun düğme bölümünde gördüğünüz ON = 1000, bir düğmeye basmaya nasıl yanıt verdiğinizi gösterir. Tıpkı bu satırdan sonraki herhangi bir sıradan olay gibi davranır. "1000 ID'li düğmeye basıldığında, bu olayı yürütün" anlamına gelir. Bir ON olayında, SRC, iletişim kutusunu çalıştıran oynatıcıdır ve varsayılan nesne, DIALOG komutunun kullanıldığı şeydir. (Yan notta, ON= yerine ONBUTTON= da kullanabilirsiniz)Böylece, gumps ve diyaloglarla (aynı şey olan) ilgili ilk bölüm sona erer. Bu bilgilerle, metin ve düğme konumlarıyla oynayarak istediğiniz hemen hemen her türlü gump'ı yapabilmeniz gerekir. Olasılıklar neredeyse sonsuzdur ve Bölüm 2'yi okuduktan sonra sonsuz olacaktır. 2. Bölüm'de okuyacağınız bilgileri tüm uzun senaryo kariyerim boyunca sadece iki kez kullandım.
Bölüm 2
Diyalog komut dosyasının ilk bölümünü atlattınız ve eminim ki bazı muhteşem gump'lar tasarlama yolundasınız. OSI bize, komut dosyalarınızda kullanabileceğiniz çok çeşitli gumplar sağladı. Tüm giysi ve kağıt bebek türü öğelerin gump olduğunu ve InsideUO'da (altta) diğerleriyle birlikte listelendiğini görmek sizi şaşırtabilir. Orada deri dominatrix tipi bir üniforma ve bir kırbaç bile var, ancak bu UO'da bir eşya olarak hiç kullanılmamış gibi görünüyor. Çok kötü.
Bildiğiniz gibi, doldurulacak metin kutuları, tıklanacak onay kutuları ve aralarından seçim yapabileceğiniz radyo düğmeleri olmadan hiçbir form tamamlanmış sayılmaz. Bu amaçlar için kullanılacak gump ID sıkıntısı yoktur, ancak çoğu normal bir gump'a gerçekten sığmaz (çünkü başka amaçlar için yapılmıştır). Yapmayı sevdiğim şey, kullandığımızdan farklı bir arka plan kullanmak ve ardından kullandığımız türün BAŞKA bir yeniden boyutlandırma resmini ilkinin üzerine uzatmak. Burada, ne demek istediğimi görmek için mesajlaşma sistemimdeki bu örneğe bakın:
page 0
resizepic 0 0 5100 640 170
resizepic 15 155 5100 175 40
button 100 161 <eval g_btn_gray_apply> <eval g_btn_gray_apply_press> 1 0 901
button 20 161 5200 5201 1 0 900
text 5 10 1152 1
resizepic 5 30 2620 600 35
textentry 15 36 600 20 1152 1 0 // 4 text fields now
resizepic 5 57 2620 600 35
textentry 15 63 600 20 1152 2 0
resizepic 5 84 2620 600 35
textentry 15 90 600 20 1152 3 0
resizepic 5 111 2620 600 35
textentry 15 117 600 20 1152 4 0İsim veya METİN ve DÜĞME bölümleri için endişelenmeyin. Burada oldukça garip bir gump inşa ettiğime dikkat edin. Gördüğünüz gibi, her textentry nesnesi için başka bir resizepic nesnem var. Bunu bir komut dosyasına (uygun başlık etiketleriyle birlikte) koyun ve ne yaptığını görmek için ona bakın.Vurgulanan her parçanın koordinatlarına, genişliklerine ve yüksekliklerine dikkatlice bakın. Bu yöntemi kullanacaksanız, oynatıcı yazmaya başladığında metnin iletişim kutusunun diğer bölümleriyle örtüşmemesi için her birini konumlandırmanız gereken belirli bir yer vardır. Buna ofset denir. Bir nesne (5, 30) konumunda ve diğeri (15, 36) ise, bu (10, 6) 'nın bir uzaklığıdır. (10, 6) uzaklığının, altın kenarlıklı arka plan ile bir textentry nesnesi arasındaki boşluk için iyi çalıştığını keşfettim.
textentry <x> <y> <gump width> <gump height> <color> <index> <text id>Her neyse, her TextEntry alanının Metin Kimliğinin 0 olduğuna dikkat edin. Varsayılan olarak, textentry alanı, ona verdiğiniz metin kimliği ile doldurulacaktır. Oyuncu daha sonra yeni bir şey yazmak için bunu silmek zorunda kalacak ve bu rahatsız edici hale geliyor. İşte bu yüzden <VAR.BLANKLINE> be text id'yi 0 yaptım.</VAR.BLANKLINE> Göründüğünde kutuda hiçbir şey yok, bu da kullanışlı. Görmek? Nedenimde kafiye var, sadece almak için bir süre beklemeniz gerekiyor.Ayrıca, dtext'e benzer şekilde davranan ve TEXT bölümü altında herhangi bir şey gerektirmeyen dtextentry'yi de kullanabilirsiniz. Bir örnek için aşağıya bakın.
Şimdi, gump'ınız geri döndüğünde, bu metin kutularının her birinden çok fazla veri alacaksınız. Her birinin nasıl bir indeksi olduğunu fark ettiniz mi? SPHERE bize, döndürülen tüm metni içeren ARGTXT adında güzel bir değişken dizi (evet, bir GERÇEK dizi) sağladı. Textentry index x'teki metne başvurmak için ARGTXT[x] kullanırsınız. İşte tam bir diyalog örneği (aslında yukarıdakiyle aynı, ancak bazı değişiklikler var).
[DIALOG d_test_textentry]
page 0
resizepic 0 0 5100 640 170
resizepic 15 155 5100 175 40
button 100 161 <eval g_btn_gray_apply> <eval g_btn_gray_apply_press> 1 0 901
button 20 161 5200 5201 1 0 900
text 5 10 1152 1
resizepic 5 30 2620 600 35
textentry 15 36 600 20 1152 1 0 // 4 text fields now
resizepic 5 57 2620 600 35
textentry 15 63 600 20 1152 2 0
resizepic 5 84 2620 600 35
textentry 15 90 600 20 1152 3 0
resizepic 5 111 2620 600 35
dtextentry 15 117 600 20 1152 4 // using dtextentry, you can ommit the text or add some as you wish.
[DIALOG d_test_textentry TEXT]
<VAR.BLANKLINE>
Enter the message you wish to send.
[DIALOG d_test_textentry BUTTON]
ON=901 // The apply button
SRC.SYSMESSAGE You type <ARGTXT[1]> in textentry index 1!
SRC.SYSMESSAGE You type <ARGTXT[2]> in textentry index 2!
SRC.SYSMESSAGE You type <ARGTXT[3]> in textentry index 3!
SRC.SYSMESSAGE You type <ARGTXT[4]> in textentry index 4!
RETURN 0 // Yes, you can have RETURNs in a dialog Bu komut dosyası tam olarak çalışmalıdır. Yazarken bir şey hatırladım, bu yüzden şimdi size anlatacağım. İstemci, SPHERE tarafından gönderilen ve komut dosyanızda, özellikle de [DIALOG TEXT] ölümünde sağladığınız bilgilere bağlıdır. Orada olmayan bir metin kimliğine başvurursanız, client çökecektir. Diyaloglarla bir istemciyi çökertmek oyundaki her şeyden daha kolaydır. Eski sunucumda, sevmediğim bir oyuncu varsa, karakterine bir etkinlik koyardım, böylece ne olursa olsun, her giriş yaptığında istemciyi çökerten bir gump ortaya çıkar. GM'ler bunu düzeltmeye çalışırken çıldırırdı.Örneğim, bir textentry kutusundan veri almanın sözdizimini anlamanıza yardımcı olmalıdır. Artık sadece natürmort diyaloglar yerine formlar oluşturabilirsiniz. Unutmayın, yeniden boyutlandırma arka planına ihtiyacınız yok, çünkü bir metin girişi ne olursa olsun çalışacaktır. Sadece oyuncunun nereye yazacağını bilmesine yardımcı olur.
Bölüm 3
Burada, diyaloglarınızı yazmayı kolaylaştırmak için birkaç ipucu ve püf noktası ekleyeceğim ve bazı yeni özellikleri açıklayacağım.
DOrigin'i kullanma
DOrigin, dialog kutusunun üst kısmında ayarladığınız statik kökeninizi korurken dinamik bir başlangıç noktası ayarlamanıza olanak tanır. dtext gibi diğer öğelerin x,y koordinatlarını ayarlarken, bunları sabit koordinatlar kullanmak yerine dorigin'in uzaklıkları olarak belirtebilirsiniz.
[DIALOG d_test]
50,50 // Bu sizin statik başlangıç noktanızdır
Page 0
resizepic 0 0 9300 150 100
dtext 10 10 1152 This is a test dialog
dorigin 10 10 // bu sizin dinamik başlangıç noktanız
dtext *0 *20 100 Test 1 // Burada bu metni 10x 30y'de görüntülenecek şekilde ayarladım
dtext +50 -0 100 Test 2 // now I offset this text by +50x and keep the same y as the last entry to use *'s. It appears now at 60x 30y*****
dtext *0 *20 100 Test 3 // Burada metni 10x 50y'de görüntülenecek şekilde ayarladım
dtext +50 -0 100 Test 4 // As with Test 2 it is offset by +50x and same y, so in theory it's really at 60x 50y*****
dtext *0 *20 100 Test 5 // Test 3 ile aynı ancak şimdi 10x 70y'de
dtext +50 -0 100 Test 5 // Test 4 ile aynı ancak şimdi 60x 70y'deBunu bu kadar güçlü yapan şey, artık her seferinde x'leri ve y'leri hesaplamak zorunda kalmadan daha fazla satır eklemek için son iki satırı tekrar tekrar kopyalayıp yapıştırabilmemizdir. Bu, özellikle ikiden fazla sütununuz olduğunda kullanışlıdır ve döngüleri kullanırken daha da kullanışlı olacaktır (daha sonra daha fazlası). Artık Test metninin tüm "bloğunu" sola, sağa, yukarı veya aşağı hareket ettirebilirsiniz. Kendiniz deneyin, dorigin'i 50 30 olarak ayarlayın ve tüm metniniz 40 sağa hareket edecektir.Göreli koordinatları belirtmenin üç farklı yolu vardır:
-n : n orijinden çıkarılır, orijin noktası değişmez
+n : orijine n eklenir, orijin noktası değişmez
*n : orijine n eklenir, orijin yeni konuma değiştirilir
Ayrıca farklı göreli ve sabit koordinat türlerini karıştırabilir ve eşleştirebilirsiniz. DOrigin'in 50 50 olarak ayarlandığını varsayarak bazı örnekler aşağıda verilmiştir:

Yukarıdaki diyaloğu ele alalım ve komut dosyasında daha kısa hale getirip getiremeyeceğinizi görelim, ancak aynı zamanda 20 satırlık Test metnine sahip olup olamayacağınızı görelim! Kulağa imkansız mı geliyor? Hiç de değil, Sphere Dialog kutularının içindeki işlevleri kullanabilir, bu nedenle bir komut dosyasında
[DIALOG d_test]
50,50
page 0
resizepic 0 0 9300 150 440
dtext 10 10 1152 This is a test dialog
dorigin 10 10
FOR 20
dtext *0 *20 100 Test <dLOCAL._FOR>
dtext +70 -0 100 Test <dLOCAL._FOR>.1
ENDFORyapabileceğiniz her şeyi bir dialog kutusunda yapabilirsiniz.Şimdi bu FOR döngülerini tüm dialog kutumuzda veya hatta belki birden fazla dialog kutusunda birçok kez kullanmamız gerektiğini hayal edin. Bunu yapmanın daha da kolay bir yolu yok mu? Evet, bir fonksiyon kullanarak var:
Şimdi bunu dialog kutumuza ekliyoruz, ancak bu sefer başka bir dinamik başlangıç noktası oluşturarak sola ikinci bir metin kümesi ekleyeceğiz!
[FUNCTION f_test_text]
FOR 20
dtext *0 *20 100 Test <dLOCAL._FOR>
dtext +70 -0 100 Test <dLOCAL._FOR>.1
ENDFOR[DIALOG d_test]
50,50
page 0
resizepic 0 0 9300 350 460
dtext 10 10 1152 This is a test dialog
dorigin 10 10
dtext *0 *20 100 Left Columns
F_TEST_TEXT
dorigin 100 10
dtext *0 *20 Right Columns
F_TEST_TEXT Dinamik Düğmeler [DIALOG d_test]
50,50
page 0
resizepic 0 0 9300 350 460
dtext 10 10 1152 This is a test dialog
dorigin 10 10
dtext *0 *20 100 Left Columns
F_TEST_TEXT 100
dorigin 200 10
dtext *0 *20 100 Right Columns
F_TEST_TEXT 130
[DIALOG d_test BUTTON]
ON=100 120 // handle button IDs 100 to 120
SRC.SYSMESSAGE You have pressed button <EVAL (<ARGN1> - 100)> from the left column!
DIALOG d_test
ON=130 150 // handle button IDs 130 to 150
SRC.SYSMESSAGE You have pressed button <EVAL (<ARGN1> - 100)> from the right column!
DIALOG d_test
[FUNCTION f_test_text]
FOR 20
button *0 *20 5603 5607 1 0 <EVAL (<LOCAL._FOR> + <ARGN1>)>
dtext +50 -0 100 Test <dLOCAL._FOR>
ENDFOR Gördüğünüz gibi f_test_text fonksiyonuna bir parametre (diğer bir deyişle argüman) ekledim. Bu durumda, bir Test metni sütununun yerini alan düğme için istediğim düğme başlangıç aralığı olacaktır.İletişim kutusunun BUTTON bölümünde düğmeleri yeniden gruplandırdım, 100-120 arasında sol sütunumun 20 düğmesi olacak ve 130-150 arasında 20 sağ sütun düğmem olacak. Bir düğmeye basarken, <ARGN1> düğme numarasıdır, bu nedenle "sanal" düğmenin ne olduğunu bulmak için DÜĞME bölümündeki EVAL'i kullanın (kalan gerçek olan <ARGN1> ).[/x][/dialog]

