"code review": die wirren Verhaltensmuster der Wiggles
Verfasst: Sa 27. Mär 2021, 18:19
Hallo zusammen,
ich habe plötzlich Lust bekommen, dieses uralte Spiel wieder zu spielen und habe die CD von damals wiedergefunden - dass das Spiel erst kürzlich auf GOG und Steam erschienen ist, ist dabei komplett Zufall. Aber so gibt es vielleicht mehr Leute, die es jetzt auch spielen, deshalb wollte ich etwas teilen, was ich herausgefunden habe.
Ich habe am Anfang der Kristallwelt wieder einmal das Problem, dass meine Wiggles stets schlecht gelaunt sind. Dabei stehen sie mit größter Vorliebe vor den Freizeitzentren (Bowlingbahn, Theater, ...) herum und reden darüber, dass man ja keine Freizeitaktivitäten gäbe.
Ist das Remake von der Spielmechanik irgendwie anders als das Original, oder ist nur die Kompatibilität mit Win7+ verbessert worden?
Zumindest die alte Version wird zu einem großen Teil von Tcl-Scripten gesteuert. Ich habe jetzt etliche Zeit damit verbracht, den Code zu verstehen und zu debuggen (-> "printf-debugging"). Dabei ist mir ganz besonders negativ die Routine aufgefallen, die berechnet, welche Freizeitaktivität (Bar, Theater, Fitness, Bowling, Disco) der Wiggle als nächstes machen will:
(Wie ihr vielleicht schon wisst, hat jeder Wiggle zwei "Lieblingsattraktionen", die davon abhängen, welcher Stat (Nahrung, Holz, Stein, ...) der höchste ist.) Der Wiggle bevorzugt nun stets die Attraktion, für die sich der Partner bereits entschieden hat. Wenn es keinen Partner gibt oder der gerade keine Attraktion besucht, dann bevorzugt er/sie die Attraktionen, die gerade eben nicht zu den Lieblingsattraktionen gehören. Darüber hinaus bevorzugt er/sie Attraktionen, die weiter entfernt sind (solange sie nicht komplett außer Reichweite sind). Ich habe den Eindruck, dass der Entwickler hier das Vorzeichen verdreht hat oder beim "lsort" ein "-desc" vergessen hat. Darüber gibt es noch ein Stück Code, der danach aussieht, als ob auch die zuletzt besuchten Attraktionen mit in die Entscheidung einfließen sollen. Dieser Code ist aber nicht wirksam, weil er die falsche Variable verwendet ('sparetime_recent_places' statt 'sparetime_recent_fun'), die immer leer ist.
Für interessierte: Das ist die proc 'sparetime_place_find' in Data\Scripts\classes\zwerg\z_spare_fun.tcl. Dort wird zu jedem 'place' eine 'pathcost' und 'da' ermittelt, daraus dann der Score 'jm' (niedriger ist besser).
Etwas seltsam finde ich auch, dass die Bewertung, wie der Wiggle mit der Vielfalt des Freizeitangebotes zufrieden ist, komplett unabhängig davon ist, nach welchen Kriterien er sein Besuchsverhalten steuert.
Die Vielfalt bewertet er dann als optimal, wenn er jede der fünf (oben bereits genannten) Attraktionen in seinem Leben exakt ein mal besucht hat. Wenn er dann im Anschluss eine Attraktion ein zweites Mal besucht, verschlechtert sich seine Bewertung. Wenn die Attraktion, die er ein zweites Mal besucht, eine seiner beiden Lieblingsattraktionen ist, ist der Abzug sogar größer.
Ich habe vor, das für mich mal zu verändern. Außerdem wollte ich mir als nächstes angucken, wie die Wiggles während der Arbeitszeit sich für die nächste Aktion entscheiden. Das scheint aber nicht in den Scripten sondern im kompilierten Code zu sein. Ich werde dann mal ausprobieren, ob man den Code "stilllegen" kann und dann in Tcl eine "bessere" Variante implementieren kann.
ich habe plötzlich Lust bekommen, dieses uralte Spiel wieder zu spielen und habe die CD von damals wiedergefunden - dass das Spiel erst kürzlich auf GOG und Steam erschienen ist, ist dabei komplett Zufall. Aber so gibt es vielleicht mehr Leute, die es jetzt auch spielen, deshalb wollte ich etwas teilen, was ich herausgefunden habe.
Ich habe am Anfang der Kristallwelt wieder einmal das Problem, dass meine Wiggles stets schlecht gelaunt sind. Dabei stehen sie mit größter Vorliebe vor den Freizeitzentren (Bowlingbahn, Theater, ...) herum und reden darüber, dass man ja keine Freizeitaktivitäten gäbe.
Ist das Remake von der Spielmechanik irgendwie anders als das Original, oder ist nur die Kompatibilität mit Win7+ verbessert worden?
Zumindest die alte Version wird zu einem großen Teil von Tcl-Scripten gesteuert. Ich habe jetzt etliche Zeit damit verbracht, den Code zu verstehen und zu debuggen (-> "printf-debugging"). Dabei ist mir ganz besonders negativ die Routine aufgefallen, die berechnet, welche Freizeitaktivität (Bar, Theater, Fitness, Bowling, Disco) der Wiggle als nächstes machen will:
(Wie ihr vielleicht schon wisst, hat jeder Wiggle zwei "Lieblingsattraktionen", die davon abhängen, welcher Stat (Nahrung, Holz, Stein, ...) der höchste ist.) Der Wiggle bevorzugt nun stets die Attraktion, für die sich der Partner bereits entschieden hat. Wenn es keinen Partner gibt oder der gerade keine Attraktion besucht, dann bevorzugt er/sie die Attraktionen, die gerade eben nicht zu den Lieblingsattraktionen gehören. Darüber hinaus bevorzugt er/sie Attraktionen, die weiter entfernt sind (solange sie nicht komplett außer Reichweite sind). Ich habe den Eindruck, dass der Entwickler hier das Vorzeichen verdreht hat oder beim "lsort" ein "-desc" vergessen hat. Darüber gibt es noch ein Stück Code, der danach aussieht, als ob auch die zuletzt besuchten Attraktionen mit in die Entscheidung einfließen sollen. Dieser Code ist aber nicht wirksam, weil er die falsche Variable verwendet ('sparetime_recent_places' statt 'sparetime_recent_fun'), die immer leer ist.
Für interessierte: Das ist die proc 'sparetime_place_find' in Data\Scripts\classes\zwerg\z_spare_fun.tcl. Dort wird zu jedem 'place' eine 'pathcost' und 'da' ermittelt, daraus dann der Score 'jm' (niedriger ist besser).
Etwas seltsam finde ich auch, dass die Bewertung, wie der Wiggle mit der Vielfalt des Freizeitangebotes zufrieden ist, komplett unabhängig davon ist, nach welchen Kriterien er sein Besuchsverhalten steuert.
Die Vielfalt bewertet er dann als optimal, wenn er jede der fünf (oben bereits genannten) Attraktionen in seinem Leben exakt ein mal besucht hat. Wenn er dann im Anschluss eine Attraktion ein zweites Mal besucht, verschlechtert sich seine Bewertung. Wenn die Attraktion, die er ein zweites Mal besucht, eine seiner beiden Lieblingsattraktionen ist, ist der Abzug sogar größer.
Ich habe vor, das für mich mal zu verändern. Außerdem wollte ich mir als nächstes angucken, wie die Wiggles während der Arbeitszeit sich für die nächste Aktion entscheiden. Das scheint aber nicht in den Scripten sondern im kompilierten Code zu sein. Ich werde dann mal ausprobieren, ob man den Code "stilllegen" kann und dann in Tcl eine "bessere" Variante implementieren kann.