Şuana kadarki en güçlü SPHERE komut dosyası oluşturma aracıdır.
Kullanabileceğiniz çok sayıda sabit nesne işlevine sahipsiniz. Ancak bazı sınırlamalar var gibi görünüyor.
Örneğin çok kötü yazılmış bir senaryonun aşağıdaki örneğine bir göz atalım:
ON=@DClick
SERV.NEWITEM=ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 017a6
NEW.MOVE -1 -1
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 017a3
NEW.MOVE -1 0
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 017a8
NEW.MOVE -1 1
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 0179f
NEW.MOVE 0 -1
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 0179b
NEW.MOVE 0 0
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 017a1
NEW.MOVE 0 1
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 017a5
NEW.MOVE 1 -1
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.LINK = <SRC.UID>
NEW.MORE = 0179d
NEW.MOVE 1 0
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.MORE = 017a7
NEW.LINK = <SRC.UID>
NEW.MOVE 1 1
RETURN 1Bu senaryo hakkında bir şey fark ettiniz mi? Aynı birkaç satırı defalarca tekrarlıyor olmasına ne dersiniz?Bu sorunu çözmek için bir şey yapabileceğimizi düşünüyor musunuz? Ben de öyle düşündüm. Bir kod kümesini bir kez yazmanın bir yoluna ihtiyacımız var.
Örneğin:
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <SRC.TARG.P>
NEW.MORE = 017a7
NEW.LINK = <SRC.UID>
NEW.MOVE 1 1Ve bu kodu tekrar tekrar "çağırmanın" bir yolunu bulun. İşte o işlem [FUNCTION]'dır.[FUNCTION create_sparkle]
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <TARG.P>
NEW.MORE = 017a7
NEW.LINK = <UID>
NEW.MOVE 1 1
RETURNVe bir senaryoda şöyle gidebiliriz:ON=@DClick
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
SRC.CREATE_SPARKLE
RETURN 1FOR döngülerini nasıl kullanacağınızı öğrendikten sonra, bu kodları şu şekilde daha da azaltabilirsiniz:ON=@DClick
FOR 8
SRC.CREATE_SPARKLE
ENDFOR
RETURN 1Bu, önceki sürümden biraz daha güzel görünmüyor mu? Yaklaşık 40 satırı 3'e indirmeyi başardık. Ama bir sorun fark ettiniz mi? Kodumuz sabittir. Bu öğeler oluşturulacak ve her seferinde 1 kare aşağı ve bir kare sağa taşınacaktır. Fonksiyonumuza bazı parametreler belirtmenin bir yoluna ihtiyacımız var.Ve böylece ARG komutlarına sahibiz. Bir function'a verebileceğimiz üç tür argüman vardır:
Sayısal, dize veya nesne. İhtiyacınız olan her şeyi elde etmek için her zaman dize argümanlarını kullanmanızı ve EVAL kullanmanızı öneririm. Bu bağımsız değişkenlerle hangi değişkenler ilişkilendirilmiştir?
Sırasıyla ARGN, ARGS ve ARGO. "Sayı" için N, "dize" için S ve "nesne" için O.
Bu yeni bilgiyi kullanarak fonksiyonumuzu ve olayımızı yeniden yazalım:
[FUNCTION create_sparkle]
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <TARG.P>
NEW.MORE = 017a7
NEW.LINK = <UID>
NEW.MOVE <ARGS>
[SOME ITEMDEF GOES HERE]
ON=@DClick
SRC.CREATE_SPARKLE -1 -1
SRC.CREATE_SPARKLE -1 0
SRC.CREATE_SPARKLE -1 1
SRC.CREATE_SPARKLE 0 -1
SRC.CREATE_SPARKLE 0 1
SRC.CREATE_SPARKLE 1 -1
SRC.CREATE_SPARKLE 1 0
SRC.CREATE_SPARKLE 1 1
RETURN 1Yeni create_sparkle komutumuzla fonksiyonu her çağırdığımızda, komutu takip eden değerleri ona "geçiririz". SPHERE, bizden herhangi bir yardım almadan bu değerleri otomatik olarak ARGS'a koyar.Birçok yeni komut dosyası yazarının anlamadığı function'larla ilgili başka bir sorun daha vardır ve bu varsayılan nesne kavramıdır. Normal bir komut dosyasında, varsayılan nesne, komut dosyasının yürütüldüğü nesnedir.
Bir @DClick komut dosyasında, çift tıklanan öğedir. Bir @Equip komut dosyasında, donatılan öğedir. Ancak bir fonksiyonda bulunan nesneler nelerdir? Her şey onu nasıl adlandırdığınıza bağlı.
Bir işlevdeki varsayılan nesne, işlevi çağıran nesnedir. Yukarıdaki örneğimizde, SRC işlevi çağırdı, böylece SRC varsayılan nesne haline gelir. İşlevin içindeki satırlardan SRC'den herhangi bir şekilde bahsetmeyi kaldırdığımı fark edeceksiniz. Bunun yerine şunu rahatlıkla söyleyebilirdik:
CREATE_SPARKLE
Daha sonra, varsayılan nesne öğe olurdu ve SRC hala SRC olurdu. Ama en azından benim görüşüme göre, başka türlü görmek çok daha kolay. Bu şekilde sizin de kafanız karışmaz. SRC'yi dahil etmek zorunda kaldıysanız ve yanlışlıkla işlevinizi aşağıdaki gibi bir şeyle çağırdıysanız:
SRC.ACT.CREATE_SPARKLE // Bu durumda gerçekten olası bir olay değil, ancak diğer durumlarda öyle.
O zaman artık bir SRC'niz olmaz ve muhtemelen işlev çağrısını kontrol etmeyi düşünmeyeceğiniz için, izlenmesi biraz zor olan birçok korkutucu hata alırsınız. İşlevler, onları batırdığınızda olduğu gibi yeterince korkutucu hatalar üretir.
Scriptimle ilgili başka bir sorun daha var. Yeni oluşturulan öğelerin her birine aynı MORE değerini atıyor ve orijinal uzun script dosyasından da görebileceğiniz gibi, yapmasını istediğim şey bu değildi. Her öğenin, komut dosyasının başka bir yerinde kullanılan belirli bir MORE değerine sahip olmasını istedim.
Peki ne yapacağız? Pekala, bir dizi çözüm var, ancak en bariz olanı, önceki bölümde tartıştığımız VAR özelliğini kullanmak olacaktır.
Tamamlanmış komut dosyasına bir göz atalım:
[FUNCTION create_sparkle]
SERV.NEWITEM = ispell_7_water_sparkle
NEW.P = <TARG.P>
NEW.MORE = <EVAL <VAR.MORE_VALUE>>
NEW.LINK = <UID>
NEW.MOVE <ARGS>
[SOME ITEMDEF GOES HERE]
ON=@DClick
VAR.MORE_VALUE = 017a6
SRC.CREATE_SPARKLE -1 -1
VAR.MORE_VALUE = 017a3
SRC.CREATE_SPARKLE -1 0
VAR.MORE_VALUE = 017a8
SRC.CREATE_SPARKLE -1 1
VAR.MORE_VALUE = 0179f
SRC.CREATE_SPARKLE 0 -1
VAR.MORE_VALUE = 017a1
SRC.CREATE_SPARKLE 0 1
VAR.MORE_VALUE = 017a5
SRC.CREATE_SPARKLE 1 -1
VAR.MORE_VALUE = 0179d
SRC.CREATE_SPARKLE 1 0
VAR.MORE_VALUE = 017a7
SRC.CREATE_SPARKLE 1 1
VAR.MORE_VALUE =
RETURN 1VAR değişkenleri, bildiğimiz gibi VAR'ın değeri taşınır. 40 satırlık bir script dosyasını 20 satırlık bir script dosyasına indirgemeyi ve orijinal işlevselliği korumayı başardık. Ve bu sadece bir işlevi 8 kez çağırmak içindir. Bir işlevi ne kadar çok kullanırsanız, daha sonra o kadar fazla alan kazandırır.[/function]
