Open Kebap opened 10 months ago
Es häufen sich manche Namen. Vermutlich tritt es immer auf, wenn jemand die "pechschwarze Seeschlange" oder den "gewaltigen Feuerelementar", usw. besiegt? Dann würde das Skript also bei diesen Namen immer "000" zurück liefern - quasi unabhängig vom Namen des Spielers?
Dann würde das Skript also bei diesen Namen immer "000" zurück liefern - quasi unabhängig vom Namen des Spielers?
Sieht ganz so aus:
lua color_text_for_hecho("Mind")
"#ff8480Mind#r"
lua color_text_for_hecho("Geist eines blau schillernden Kolibris")
"#000Geist eines blau schillernden Kolibris#r"
Anschließend verstehen, wieso das Skript bei diesen und ähnlichen Fällen 000 zurück liefert, damit das verhindert werden kann.
So sollte das aussehen:
lua {string_to_color("Mind")}
{ 255, 132, 128 }
lua math.DecToHex(string_to_color("Mind"))
"ff"
Aber hier gibt es ungewöhnlich große (?) Zahlen, die dann nicht nach Hex übersetzt werden können:
lua {string_to_color("Geist eines blau schillernden Kolibris")}
{ -1.8077500742675e+038, -1.8077500742675e+038, -1.8077500742675e+038 }
lua math.DecToHex(-1.8077500742675e+038)
"0"
Man kann in die Funktion einige Debug-Echos einfügen zum tieferen Eintauchen:
function string_to_color(string_input, saturation, lightness)
local hash = 0
local saturation = saturation or 100
local lightness = lightness or 75
for i = 1, #string_input do
hash = string.byte(string_input, i) + ((hash * 32) - hash)
end
local hue = hash % 360
echo(f" hash, hue, saturation, lightness: \n")
echo(f" { hash}, {hue}, {saturation}, {lightness} \n")
local red, green, blue = HSL_to_RGB(hue, saturation, lightness)
return red, green, blue
end
Dann sieht man beim "normalen" Ergebnis folgende Herleitung:
lua math.DecToHex(string_to_color("Mind"))
hash, hue, saturation, lightness:
2398322, 2, nil, nil
"ff"
Hingegen im Fehlerfall wieder außergewöhnliche Zahlen:
lua math.DecToHex(string_to_color("Geist eines blau schillernden Kolibris"))
hash, hue, saturation, lightness:
1.1266476609778e+057, -8.5070591730235e+037, nil, nil
"0"
Hier muss man also noch tiefer eintauchen in die Programmierung, wieso ist "hash" so groß?
Davon abgesehen sollten "saturation" und "lightness" nicht "nil" sein..!
Anscheinend funktioniert das, wenn sie nicht "local" sind..:
function string_to_color(string_input, saturation, lightness)
local hash = 0
saturation = saturation or 100
lightness = lightness or 75
for i = 1, #string_input do
hash = string.byte(string_input, i) + ((hash * 32) - hash)
end
local hue = hash % 360
echo(f" hash, hue, saturation, lightness: \n")
echo(f" { hash}, {hue}, {saturation}, {lightness} \n")
local red, green, blue = HSL_to_RGB(hue, saturation, lightness)
return red, green, blue
end
Ergebnis:
lua math.DecToHex(string_to_color("Geist eines blau schillernden Kolibris"))
hash, hue, saturation, lightness:
1.1266476609778e+057, -8.5070591730235e+037, 100, 75
"0"
OK, aber jetzt hängen die Variablen im globalen Namespace herum, das will ich auch nicht.
Vermutlich hat mich f() mal wieder unerwartet überrascht. Die beiden Werte sind gar nicht nil. Besser wäre z.B. so zu prüfen:
print("hue, saturation, lightness")
print(hue, saturation, lightness)
Sachdienlicher Hinweis von dt192 @ Discord:
Die exponentiell großen Zahlen treten nur in Mudlet auf, das Lua 5.1 benutzt. Wenn man denselben Code in Lua 5.4 online ausführen lässt, erhält man hingegen:
hash, hue, saturation, lightness
5966197003381512632 32 100 75
Welche Zahl erwarte ich denn, wenn ich einen Wert beim String mit Länge 36 für jeden Buchstaben mit 32 malnehme? Python sagt:
>>> 36 ** 32
63340286662973277706162286946811886609896461828096
>>> 32 ** 36
1532495540865888858358347027150309183618739122183602176
126647660977800000000000000000000000000000000000000000000 is the number Lua 5.1 gives 5966197003381512632 is the number Lua 5.4 gives. Quite a big difference
Neuer Lösungsansatz:
Maybe I pull the modulo inside the loop for each char:
for i = 1, #string_input do hash = string.byte(string_input, i) + ((hash * 32) - hash) % 360 end
Then the hash won't become as large so quickly
Erste Tests sind ganz vielversprechend. Das scheint auch #73 zu beheben. Vermutlich auch ein Überlauf als Ursache?
Langfristige Tests sind ebenfalls vielversprechend. Bisher sind keine neuen Fehler mehr aufgetreten.
Bitte für Release vorbereiten!
Der Name "Die unheimliche Haengebruecke" wurde nicht eingefärbt, sondern als "#000Die unheimliche Hängebruecke" ausgegeben
Neue Beispiele: