MorgenGrauen / mg-mudlet

Mudlet-Skripte
2 stars 4 forks source link

Ebenen-Text wird tlw. mit #000 ausgegeben? #74

Open Kebap opened 10 months ago

Kebap commented 10 months ago

Der Name "Die unheimliche Haengebruecke" wurde nicht eingefärbt, sondern als "#000Die unheimliche Hängebruecke" ausgegeben

lua {string_to_color("Die unheimliche Haengebruecke")}
{ -5.1379347333622e+024, -5.1379347333622e+024, -5.1379347333622e+024 }
lua {string_to_color("Die unheimliche Haengebrecke")}
{ 255, 128, 128 }
lua {string_to_color("Die unheimliche Haengebrueecke")}
{ 255, 128, 128 }

Neue Beispiele:

[Tod:Lars] Eine gefaehrliche Strahlung hat gerade Manaa umgebracht.
[Tod:#000Eine gefaehrliche Strahlung] Schon mal ueber entsprechenden Schutz
[Tod:#000Eine gefaehrliche Strahlung] nachgedacht?

image


[Moerder:#000Geist eines riesigen Wasserelementars] Mich magst Du besiegt haben,
[Moerder:#000Geist eines riesigen Wasserelementars] Mundron. Doch mein Meister
[Moerder:#000Geist eines riesigen Wasserelementars] wird Dich vernichten!
[Moerder:#000Geist eines riesigen Wasserelementars] Raecht mich, Kreaturen der
[Moerder:#000Geist eines riesigen Wasserelementars] Nacht. Mundron hat mich
[Moerder:#000Geist eines riesigen Wasserelementars] vernichtet!

[Moerder:#000Geist eines schreienden Hoellendaemons] Gebieter geopfert, Mundron!

[Moerder:#000Geist eines gewaltigen Feuerelementars] Knie nieder, Mundron! Der
[Moerder:#000Geist eines gewaltigen Feuerelementars] Zorn meines Meisters wird
[Moerder:#000Geist eines gewaltigen Feuerelementars] ueber Dich kommen!
[Moerder:#000Geist eines gewaltigen Feuerelementars] Stirb Mundron!
[Moerder:#000Geist eines gewaltigen Feuerelementars] Knie nieder, Ravenlord! Der
[Moerder:#000Geist eines gewaltigen Feuerelementars] Zorn meines Meisters wird
[Moerder:#000Geist eines gewaltigen Feuerelementars] ueber Dich kommen!

[Moerder:#000Geist einer pechschwarzen Seeschlange] Viel Spass noch mit meinen
[Moerder:#000Geist einer pechschwarzen Seeschlange] Freunden, Yorrel.
[Moerder:#000Geist einer pechschwarzen Seeschlange] Viel Spass noch mit meinen
[Moerder:#000Geist einer pechschwarzen Seeschlange] Freunden, Erec.

[Moerder:Geist eines stuermischen Luftelementars] Raecht mich, Kreaturen der
[Moerder:Geist eines stuermischen Luftelementars] Nacht. Lahm hat mich
[Moerder:Geist eines stuermischen Luftelementars] vernichtet!

[Moerder:#000Geist eines riesigen Wasserelementars] Ich diene nur Dir, Meister
[Moerder:#000Geist eines riesigen Wasserelementars] Sit!
[Moerder:#000Geist eines riesigen Wasserelementars] Knie nieder, Lahm! Der Zorn
[Moerder:#000Geist eines riesigen Wasserelementars] meines Meisters wird ueber
[Moerder:#000Geist eines riesigen Wasserelementars] Dich kommen!

[Moerder:#000Geist eines triefenden Schmerzdaemons] Raecht mich, Kreaturen der
[Moerder:#000Geist eines triefenden Schmerzdaemons] Nacht. Ravenlord hat mich
[Moerder:#000Geist eines triefenden Schmerzdaemons] vernichtet!

[Moerder:#000Geist eines schreienden Hoellendaemons] Es gibt noch Dutzende
[Moerder:#000Geist eines schreienden Hoellendaemons] meinesgleichen, Ravenlord!

[Moerder:#000Geist eines blau schillernden Kolibris] Das naechste Mal komme ich
[Moerder:#000Geist eines blau schillernden Kolibris] als Kaempfer wieder, Yorna!
Kebap commented 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?

Kebap commented 9 months ago

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)
Kebap commented 9 months ago

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

Kebap commented 9 months ago

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!