Modul:Turnier: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(SyncBot) |
K (Schützte „Modul:Turnier“: SyncBot ([Bearbeiten=Nur Administratoren erlauben] (unbeschränkt))) |
(kein Unterschied)
| |
Aktuelle Version vom 2. Juli 2024, 05:32 Uhr
Dokumentation unter Modul:Turnierritter/Doku.
require("Modul:Hilfsfunktionen")
local p = {}
--Erzeuge ein Array mit Pseudozufallszahlen basierend auf dem Seed
function random(seed,count)
local mod=1048573
local multiplier=380985
local inc=0
local result={}
result[0]=seed+1
for i=1,count,1 do
result[i]=(result[i-1]*multiplier+inc)%mod;
end
return result
end
--Erzeuge einen Integer-Hash aus einem String
function hash(str)
local a=1
local b=0
for i=1,#str do
a=(a+mw.ustring.byte(str,i,i))%65521
b=(a+b)%65521
end
return b*65536+a
end
--Hole alle Wappen und Bilf für Tjoster
function holeTjosterDaten(artikel)
local tjosterDaten=mw.smw.ask("[["..artikel.."]]"
.."|?=#"
.."|?Bild ist#"
.."|?Wappen ist#"
.."|searchlabel="
.."|limit=1"
)
if tjosterDaten==nil or #tjosterDaten<1 then
return {{[1]=artikel,['Bild ist']='Datei:Bild blanko.svg',['Wappen ist']='Datei:Wappen blanko.svg'}}
end
return tjosterDaten
end
--Erzeuge Tjoster-Objekt mit Metadaten und 200 vorgewürfelten Zufallszahlen
function erzeugeTjoster(baseseed,artikel,klasse)
local daten=holeTjosterDaten(artikel)
local tjoster={}
tjoster['artikel']=artikel
local base=string.match(artikel,":(.*)")
if base==nil then
base=artikel
end
tjoster['name']=string.match(base,"(.*)%svon")
if tjoster['name']==nil then
tjoster['name']=string.match(base,"(.*)%svom")
end
if tjoster['name']==nil then
tjoster['name']=base
end
tjoster['wappen']=daten[1]['Wappen ist']
tjoster['bild']=daten[1]['Bild ist']
tjoster['klasse']=math.min(math.max(1,klasse),4)
tjoster['sterne']=""
if klasse==2 then tjoster['sterne']="✦" end
if klasse==3 then tjoster['sterne']="★" end
if klasse==4 then tjoster['sterne']="✶" end
-- for i=1,klasse-1,1 do
-- tjoster['sterne']=tjoster['sterne']..'★'
-- end
tjoster['zaehler']=1
tjoster['wuerfe']=random(hash(baseseed..artikel),200)
return tjoster
end
--Hole die nächste vorgewürfelte Zufallszahl und rechne sie in W20 um
function holeNaechstenWurf(tjoster)
if(tjoster['zaehler']>#tjoster['wuerfe']) then
tjoster['zaehler']=1
end
local result=tjoster['wuerfe'][tjoster['zaehler']]%20+1
tjoster['zaehler']=tjoster['zaehler']+1
return result
end
--Würfle Klasse+1 mal den W20 und gib den höchsten Wert sowie eine Textliste aller Werte zurück
function holeNaechstesErgebnis(tjoster)
local result=0
local log=''
local anzahl=tjoster['klasse']+1
for i=1,anzahl,1 do
local wurf=holeNaechstenWurf(tjoster)
log=log..wurf..","
if wurf>result then
result=wurf
end
end
return {['wert']=result,['log']=log:sub(1, -2)}
end
--Anzeige Tjoster
function zeigeTjoster(tjoster)
return '<div style="width:100%;height:2.5em;overflow:hidden;word-wrap:no-wrap;">[['..tjoster['wappen']..'|30x30px|link=]] [['..tjoster['bild']..'|30x30px|link=]] [[Hauptdarsteller ist::'..tjoster['artikel']..'|'..tjoster['name']..']] '..tjoster['sterne']..'</div>'
end
--Lasse zwei Tjoster so lange gegeneinander antreten, bis einer die angegebene Anzahl Siege errungen hat
--Gib den Sieger und Wikisource für die Anzeige zurück
function paarung(tjoster1,tjoster2,lanzen)
local siege1=0
local siege2=0
local log='<div style="width:65%;display:inline-block;">'..zeigeTjoster(tjoster1)..zeigeTjoster(tjoster2).."</div>"
..'<div style="width:35%;display:inline-block;">'
while (siege1<lanzen) and (siege2<lanzen) do
local wurf1=holeNaechstesErgebnis(tjoster1)
local wurf2=holeNaechstesErgebnis(tjoster2)
if wurf1['wert']>wurf2['wert'] then
log=log..'[['..tjoster1['wappen']..'|20x20px|link=|'..wurf1['log'].."/"..wurf2['log']..']] '
siege1=siege1+1
end
if wurf2['wert']>wurf1['wert'] then
log=log..'[['..tjoster2['wappen']..'|20x20px|link=|'..wurf1['log'].."/"..wurf2['log']..']] '
siege2=siege2+1
end
if wurf2==wurf1 then
log=log..'[[Datei:Wappen blanko.svg|20x20px|link=|'..wurf1.."/"..wurf2..']] '
end
end
log=log..'</div>'
local sieger=nil
if siege1==lanzen then
sieger=tjoster1
end
if siege2==lanzen then
sieger=tjoster2
end
return {['sieger']=sieger,['log']=log}
end
--Aufruf
--1: Anzahl Tjoster, die 2^n entsprechen muss
--2/4/6/... Artikel der Tjoster
--3/5/7/... Klasse der Tjoster (1 bis 4)
function p.turnier(frame)
--lies Parameter ein und erzeuge Tjoster
local baseseed=mw.title.getCurrentTitle().text
local anzahl=tonumber(robusttrim(frame.args[1]))
local tjoster={}
for i=1,anzahl,1 do
local artikel=robusttrim(frame.args[i*2])
local klasse=tonumber(robusttrim(frame.args[i*2+1]))
tjoster[i]=erzeugeTjoster(baseseed,artikel,klasse)
end
--mische die Tjoster pseudozufällig
local order={}
local i=1
for k, v in spairs(tjoster,function(tjoster,a,b)
return tjoster[a]['artikel']<tjoster[b]['artikel']
end) do
order[i]=k
i=i+1
end
local shuffle=random(hash(baseseed),100)
for i=1,anzahl,1 do
local i1=1+shuffle[i*2-1]%anzahl
local i2=1+shuffle[i*2]%anzahl
local buf=order[i1]
order[i1]=order[i2]
order[i2]=buf
end
local tj={}
for i=1,anzahl,1 do
tj[i]=tjoster[order[i]]
end
--berechne iterativ die Paarungen
spalten=1+math.log(anzahl)/math.log(2)
local s='<div style="display:flex;flex-direction:row;width:100%;height:'..(anzahl*3)..'em;">'
local paare=anzahl/2
local farbe='hell'
while paare>=1 do
local colspan=anzahl/(paare*2)
s=s..'<div style="width:'..(100/spalten)..'%;height:100%;">'
for i=1,paare,1 do
s=s..'<div class="'..farbe..'" style="display:flex;align-items:center;justify-content:center;width:100%;height:'..(100/paare)..'%;text-align:left;">'
local ergebnis=paarung(tj[i*2-1],tj[i*2],3)
s=s..ergebnis['log']
tj[i]=ergebnis['sieger']
s=s..'</div>'
if farbe=='hell' then farbe='dunkel' else farbe='hell' end
end
paare=paare/2
s=s..'</div>'
end
--Zeige den Sieger an
s=s..'<div style="width:'..(100/spalten)..'%;height:100%;">'
s=s..'<div class="'..farbe..'" style="display:flex;align-items:center;justify-content:center;width:100%;height:100%;text-align:left;">'
s=s..'<div style="width:100%;display:inline-block;">'..zeigeTjoster(tj[1])..'</div>'
s=s..'</div>'
s=s..'</div>'
s=s..'</div>'
return s
end
return p