Selamlar,
Turnuva sistemi geliştirmek isteyipte mantığını geliştiremeyen veya esin kaynağı arayan arkadaşlar için ufak bir prototip hazırladım. Hem uzun zamandır da kod yazmıyordum, bakalım ne durumdayım onu da tekrardan test etmek istedim.
Kodu şu anki hali ile kullanmamanızı öneririm. Basit, örnek bir kodlama yaptığım için çok fazla sorunla karşılaşabilirsiniz. Ayrıca belirtmem gerekir ki kodları önceden test etmeniz de yararınıza olacaktır. Zirâ kodlar tamamen UO ve sphere emülatörü olmayan bir ortamda geliştirildi.
Kodları kullanabilmeniz için biraz bilginiz olması gerekmektedir. Hiç bilmeyen birisinin şu anki halde alıp düzenlemesi pek mümkün değildir. Kullanacaklar, kullanılan yöntem ve komutlar konusunda temel bir araştırma yapıp o şekilde düzenlemelidir.
Umarım birilerine faydam dokunur.
[comment tournament]
hazırlayan: Slothere
tarih: 31 Mayıs 2011
version: 56b+
# [!] List komutundan ötürü güncel sürüm gerekir.
-------------------------------------------------
[plevel 4]
turnuvaDuzenle
[function turnuvaDuzenle]
if (<var0.tournamentStone>)
sysmessage Su anda zaten bir turnuva duzenleniyor.
else
serv.b Turnuva duzenlenmektedir. Katilimlar icin ".katil" komutunu kullanabilirsiniz.
serv.b Katilimlar 5 dk sonra sonra erecektir.
serv.newitem i_grave_stone
new.p 1,1
new.attr attr_move_never|attr_decay|attr_invis
new.name tournament stone
var0.tournamentStone = <new>
new.type = t_stone_tournament
new.timer = 300
new.more1 = 1
List.tournamentPlayers.Clear
List.tournamentWinners.Clear
endif
[plevel 1]
katil
[function katil]
if !(<var0.tournamentStone>)
sysmessage Su anda turnuva duzenlenmiyor.
elseif (<List.tournamentPlayers.FindElem <uid>>)
sysmessage Su an zaten turnuvaya katilmis vaziyettesin.
elseif (<uid.<var0.tournamentStone>.more1> > 1)
sysmessage Turnuva basladigi icin katilamazsiniz.
else
List.tournamentPlayers.Add = <uid>
sysmessage Turnuvaya katildiniz. Oyundan ayrilirsaniz otomatik diskalifiye olursunuz.
events +e_tournament_viewer
go xxxx,yyyy,z // buraya bekleyen oyuncuların gidecegi koordinat girilmeli.
tag0.lastPosition = <p>
serv.b <name> turnuvaya katildi.
serv.b Toplam katilimci sayisi: <List.tournamentPlayers.Count>
serv.b Katilimlarin sona ermesine <eval(<uid.<var0.tournamentStone>.timer>/60)>dk kaldi.
endif
[events e_tournament_viewer]
on=@attack
return 1
on=@hittry
return 1
on=@gethit
return 1
on=@hunger
return 1
on=@skillstart
return 1
on=@spellcast
if !((<argn>==4) || (<argn>==6) || (<argn>==7) || (<argn>==9) || (<argn>==11) || (<argn>==15) || (<argn>==16) || (<argn>==17) || (<argn>==29) || (<argn>==36))
return 1
endif
on=@click
message [Turnuvada]
on=@logout
local.index = <List.tournamentPlayers.FindElem <uid>>
List.tournamentPlayers.<dlocal.index>.Remove
serv.b <name> oyundan ayrildigi icin turnuvadan diskalifiye oldu.
go <tag0.lastPosition>
tag0.lastPosition
[typedef t_stone_tournament]
on=@timer
if (<dmore1> == 1)
serv.b Katilimlar sona erdi. Turnuva basliyor...
more1 = 2
timer = 5
return 1
endif
if ((<List.tournamentPlayers.Count> % 2) > 0)
local.lastIndex = <eval(<List.tournamentPlayers.count>-1)>
ref13 = <List.tournamentPlayers.<dlocal.lastIndex>>
ref13.sysmessage Turnuvadaki katilimci fazlaligindan oturu otomatik olarak yarismadan cikartildiniz.
ref13.go <ref12.tag0.lastPosition>
ref13.tag0.lastPosition
ref13.events -e_tournament_viewer
List.tournamentPlayers.<dlocal.lastIndex>.Remove
endif
if (<List.tournamentPlayers.Count> >= 2)
local.totalCount = <eval(<List.tournamentPlayers.Count>)>
while (<dlocal.totalCount> > 0)
local.totalCount = <eval(<local.totalCount>-1)>
local.rand = <r<dlocal.totalCount>>
local.t1 = <List.tournamentPlayers.<dlocal.totalCount>>
local.t2 = <List.tournamentPlayers.<dlocal.rand>>
List.tournamentPlayers.<dlocal.totalCount> = <local.t2>
List.tournamentPlayers.<dlocal.rand> = <local.t1>
endwhile
ref10 = <List.tournamentPlayers.0>
ref11 = <List.tournamentPlayers.1>
List.tournamentPlayers.0.Remove
List.tournamentPlayers.1.Remove
serv.b [Turnuva] <ref10.name> vs <ref11.name>
ref10.go xxxx,yyyy,z // düellodaki ilk oyuncunun gönderileceği koordinat girilmeli.
ref11.go xxxx,yyyy,z // düellodaki ikinci oyuncunun gönderileceği koordiant girilmeli.
ref10.events -e_tournament_viewer
ref11.events -e_tournament_viewer
ref10.events +e_tournament_duel
ref11.events +e_tournament_duel
ref10.tag0.opponent = <ref11>
ref11.tag0.opponent = <ref10>
timer = 300
return 1
else
if (<List.tournamentWinners.Count> < 2)
ref12 = <List.tournamentWinners.0>
ref12.tag0.opponent
ref12.go <ref12.tag0.lastPosition>
ref12.tag0.lastPosition
ref12.events -e_tournament_viewer
ref12.gold += 100000
ref12.update
List.tournamentWinners.Clear
List.tournamentPlayers.Clear
serv.b Turnuvayi <ref12.name> kazandi.
var0.tournamentStone
remove
else
List.tournamentPlayers.Clear
while !(<isempty <List.tournamentWinners.<dlocal._while>>>)
List.tournamentPlayers.Add = <List.tournamentWinners.<dlocal._while>>
List.tournamentWinners.<dlocal._while>.Remove
endwhile
List.tournamentWinners.Clear
serv.b Turnuvada mevcut tur tamamlandi, diger tura geciliyor.
timer = 3
endif
endif
return 1
[events e_tournament_duel]
on=@hunger
return 1
on=@callguards
return 1
on=@famechange
return 1
on=@karmachange
return 1
on=@spellcast
if (<argn>==24) || (<argn>==33) || (<argn>==40) || (<argn>==44) || (<argn>==45) || (<argn>==50) || (<argn>==58) || (<argn>==60) || (<argn>==61) || (<argn>==62) || (<argn>==63) || (<argn>==64)
return 1
endif
on=@death
ref20 = <tag0.opponent>
tag0.opponent
List.tournamentWinners.Add = <ref20>
ref20.events -e_tournament_duel
events -e_tournament_duel
ref20.go xxxx,yyyy,z // buraya bekleyen oyuncuların gidecegi koordinat girilmeli.
ref20.events +e_tournament_viewer
go <tag0.lastPosition>
tag0.lastPosition
serv.b <name> vs <ref20.name> | Kazanan: <ref20.name>
ref21 = <var0.tournamentStone>
ref21.timer = 3
on=@logout
ref20 = <tag0.opponent>
tag0.opponent
List.tournamentWinners.Add = <ref20>
ref20.events -e_tournament_duel
events -e_tournament_duel
ref20.go xxxx,yyyy,z // buraya bekleyen oyuncuların gidecegi koordinat girilmeli.
ref20.events +e_tournament_viewer
go <tag0.lastPosition>
tag0.lastPosition
serv.b <name> oyundan ayrildigi icin hukmen maglup oldu. Kazanan <ref20.name>
ref21 = <var0.tournamentStone>
ref21.timer = 3
[eof]
Ayrıca bu kodda kullanmak amacıyla
Fisher-Yates karıştırma algoritması olarakta bilinen yöntemi kullanarak oluşturduğum liste karıştırma kodlarını fonksiyon halinde veriyorum. Listelerinizi bu komut aracılığı ile rastgele karıştırıp sıralayabilirsiniz.
Kullanım şekli ".listShuffle <listeadı>"
[function ListShuffle]
local.totalCount = <eval(<List.<args>.Count>)>
while (<dlocal.totalCount> > 0)
local.total = <eval(<local.totalCount> - 1)>
local.rand = <r<dlocal.totalCount>>
local.t1 = <List.<args>.<dlocal.totalCount>>
local.t2 = <List.<args>.<dlocal.rand>>
List.<args>.<dlocal.totalCount> = <local.t2>
List.<args>.<dlocal.rand> = <local.t1>
endwhile