https://howtobeahero.de/api.php?action=feedcontributions&user=TheGamer93&feedformat=atomHow to be a Hero - Benutzerbeiträge [de]2024-03-29T08:52:10ZBenutzerbeiträgeMediaWiki 1.37.2https://howtobeahero.de/index.php?title=Benutzer:Ta%E2%80%98Lah&diff=34646Benutzer:Ta‘Lah2022-12-12T20:49:06Z<p>TheGamer93: TheGamer93 verschob die Seite Benutzer:Ta‘Lah nach Benutzer:Ta'Lah: Seite während der Benutzerkontoumbenennung von „Ta‘Lah“ in „Ta'Lah“ automatisch verschoben</p>
<hr />
<div>#WEITERLEITUNG [[Benutzer:Ta'Lah]]</div>TheGamer93https://howtobeahero.de/index.php?title=Benutzerin:Ta%27Lah&diff=34645Benutzerin:Ta'Lah2022-12-12T20:49:06Z<p>TheGamer93: TheGamer93 verschob die Seite Benutzer:Ta‘Lah nach Benutzer:Ta'Lah: Seite während der Benutzerkontoumbenennung von „Ta‘Lah“ in „Ta'Lah“ automatisch verschoben</p>
<hr />
<div>[[Datei:Test.png|mini|rechts|eintestslimevonfiru|Ich bleib hier nicht, Firu wollte nur basteln! BOING!| verweis=https://howtobeahero.de/index.php?title=Benutzer:Firu]]<br />
<br />
=== Wer ist das denn? ===<br />
<br />
Ich bin Ta'Lah (she/her) und war früher Mal ein Firu-Slime<br />
<br />
<br />
Redakteurin und Regeltüftlerin im '''How to be a Hero''' - Team.<br />
<br />
Ich bin schon seit einigen Jahren Spielleiterin und leite 'nen ''Haufen Zeuch''!<br />
<br />
Ich zeichne und pinsel immer mal wieder vor mich her und freu mich, wenn es halbwegs <br />
<br />
meinen Ansprüchen entspricht<br />
<br />
Du brauchst was von mir? Ich geb mein Bestes! Meld dich einfach auf [https://discord.gg/3CQgP8f Discord!]<br />
<br />
Ich bin noch der Neue und hoffe ich kann helfen<br />
<br />
{{{!}} class="wikitable"<br />
! colspan="2" {{!}} Schnellübersicht<br />
{{!}}- <br />
{{!}} Nickname<br />
{{!}} Ta'Lah<br />
{{!}}- <br />
{{!}} Echter Name<br />
{{!}} Sasha Lüth<br />
{{!}}- <br />
{{!}} Position<br />
{{!}} Redakteurin, Spielleiterin, Regelwuslerin<br />
{{!}}- <br />
{{!}} Was ich schon gemacht habe<br />
{{!}} Spielleiterin, Spielerin, Regeltüftlerin<br />
{{!}}- <br />
{{!}} [https://howtobeahero.de/index.php?title=Discord Discord]<br />
{{!}} Ta'Lah#6174<br />
{{!}}- <br />
{{!}} Twitter<br />
{{!}} [https://twitter.com/FiruSurvives @FiruSurvives]<br />
{{!}}- <br />
{{!}} Twitch<br />
{{!}} [https://www.twitch.tv/DasFiru DasFiru]<br />
{{!}}}<br />
<br />
===Das kann ich===<br />
<br />
{{char|nolimit=no<br />
|HPflegen>80<br />
|HKritzeln>40<br />
|WRegelwerke>60<br />
|WUnnötiges Wissen>60<br />
|WPsychologie>40<br />
|SLeiten>80<br />
|SZuhören>40}}<br />
<br />
===Was hat der schon gemacht?===<br />
Abenteuer, die ich für andere Systeme für meine Runden geschrieben habe und die ich gern für How to be a Hero umschreiben würde:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Abenteuer || Bisher getestet mit ||Kategorie / Setting<br />
|-<br />
| <center>Der vermisste Hammer</center> || <center>DnD5e (eigene Welt)</center>|| </center>High Fantasy/ Ermittlung</center><br />
|-<br />
| <center>Durch den Njolwald </center>|| <center>DnD5e (eigene Welt)</center>|| <center>High Fantasy/ Reisen</center><br />
|-<br />
| <center>Das Gewand</center> || <center>Call of Cthulhu 7th Edition</center> || <center>Horror / Nordseeabenteuer</center><br />
|-<br />
|}<br />
===In diesen Settings war ich bereits unterwegs:===<br />
<br />
{{cur|High Fantasy}}{{br}}<br />
{{cur|Low Fantasy}}{{br}}<br />
{{cur|Cyberpunk}}{{br}}<br />
{{cur|Sci-Fi}}{{br}}</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34587MediaWiki:Sidebar2022-11-25T23:16:50Z<p>TheGamer93: </p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** https://rollenspiel.social/@howtobeahero | Mastodon<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34586MediaWiki:Sidebar2022-11-25T23:16:43Z<p>TheGamer93: </p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** https://rollenspiel.social/@howtobeahero | Mastodon | rel=me<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=Hauptseite&diff=34585Hauptseite2022-11-25T23:16:03Z<p>TheGamer93: </p>
<hr />
<div><translate><br />
<!--T:1--><br />
<!-- HAUPTSEITE --><br />
<div id="hauptseite"><br />
<br />
<center>'''Willkommen beim How to be a Hero-Regelwerk!'''</center><br />
<div class="heroimage">[[Datei:how_to_mainpage_2.png|link=]]</div><br><br />
<!-- KASTEN WILKOMMEN --><br />
<div id="hauptseite-willkommen" class="hauptseite-oben"><br />
== ANKÜNDIGUNG == <!--T:2--><br />
<div class="inhalt" align="left"><br />
<div class="center_box"><br />
<center><big><big>'''Aktuelle Infos gibt es in unserem [https://steadyhq.com/de/htbah/about Newsletter]. Außerdem kannst du uns dort perfekt unterstützen!'''</big></big></center><br />
[[Datei:Steady_newsletter_howky_2450x490.png|1500px|verweis=https://steadyhq.com/de/htbah/about|Hier kommst du zum Newsletter!]]<br />
<br><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Mitwirken == <!--T:3--><br />
<div class="inhalt" align="left"><br />
Du möchtest als Autor aktiv an der Weiterentwicklung des Regelwerks arbeiten? Dann leg los und schreib deinen ersten Artikel. Anschließend werden diese durch unsere '''Redakteure''' gesichtet und entsprechend als "bestätigte Version" markiert. Du möchtest dich mit anderen Autoren aus der Community und unseren Redakteuren vernetzen? Besuch doch einfach unseren '''<big>[[Discord | Discord-Server]]</big>'''!<br />
<br />
<!--T:4--><br />
Wenn du ein Abenteuer hier einfügen möchtest, dann solltest du dich an [https://howtobeahero.de/index.php?title=Abenteuerstruktur diese Struktur] halten.<br />
<br />
<!--T:5--><br />
Du kannst auch für Verbesserungen an <br />
<br />
<!--T:6--><br />
regelwerk(ät)howtobeahero(punkt)de (für Fragen und Anregungen rund um Regelwerk und Module)<br />
<br />
<!--T:7--><br />
oder an<br />
<br />
<!--T:8--><br />
redaktion(ät)howtobeahero(punkt)de (für Verbesserungen, Abenteuer und Settings) schreiben.<br />
<br />
<!--T:9--><br />
'''<big>Wir antworten dir immer! Bitte beachte deinen Spam-Ordner!</big>'''<br />
<br />
<!--T:10--><br />
WICHTIG!! Leider bekommen wir immer wieder Mails, die nicht richtig verschickt wurden. Diese können wir leider nicht bearbeiten, weil dort kein Inhalt mitgeschickt wird. Wenn du keine Antwort von uns bekommst, schreibe uns einfach auf Twitter an!<br />
<br />
<!--T:11--><br />
Oder lieber auf Social Media? Twitter es raus an [https://twitter.com/HtbaH_Official HtbaH_Official] oder schreib uns via [https://rollenspiel.social/@howtobeahero Mastodon] !<br />
</div><br />
</div><br />
<br />
<!--T:12--><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Neuerungen == <!--T:13--><br />
<div class="inhalt" align="left"><br />
Was gibt es eigentlich so Neues? <br />
<br />
<!--T:14--><br />
* '''[https://howtobeahero.de/CampHero19 #CampHero19] ging leider schneller vorbei als alle es wollten.. [https://howtobeahero.de/CampHero19 Hier] lest ihr, wie wir es erlebt haben.'''<br />
* '''Das Abenteuer [[Luna]] ist online! Viel Spaß beim Spielen! :)'''<br />
* Unser PDF-Generator ist endlich online und wartet darauf, von euch benutzt zu werden! [[PDF_generieren | Hier]] gibt es eine Anleitung dazu. :)<br />
* Unser offizieller Charakterbogen steht zum Download bereit. [[Charakterbogen| Hier]] findest du ihn.<br />
* Eine komplett neue Fassung des Regelwerks mit tollen Illustrationen dazu.''' Du findest sie [https://howtobeahero.de/index.php?title=Kategorie:Regelwerk hier].<br />
* Die ersten [https://howtobeahero.de/index.php?title=Kategorie:%22Wilde%22_Abenteuer unbestätigten User-Abenteuer] und [https://howtobeahero.de/index.php?title=Kategorie:Bestätigte_Abenteuer bestätigten User-Abenteuer], die du bereits spielen kannst, sind verfügbar.<br />
<br />
<!--T:15--><br />
</div><br />
</div><br />
<br />
<!--T:16--><br />
<!-- KASTEN Kontakt--><br />
<div id="hauptseite-kontakt " class="hauptseite-links"><br />
<br />
== Kontakt == <!--T:17--><br />
<div class="inhalt" align="left"><br />
Du möchtest uns dabei helfen, das Regelwerk zu ergänzen oder an Grafiken, Illustrationen und Technik mitwirken? Du willst in unser HTBAH Team? Dann schreib uns eine Mail (redaktion(ät)howtobeahero(punkt)de, und wir melden uns bei dir!<br />
</div><br />
</div><br />
<br />
<!--T:18--><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Wie funktioniert das hier? == <!--T:19--><br />
<div class="inhalt" align="left"><br />
Es wird unterschieden in ''Kategorien'' und einzelne ''Seiten''. Jeder registrierte Benutzer hat die Möglichkeit, jede einzelne Seite als PDF auszugeben. Wer ein komplettes Buch möchte, schaut sich die Kategorien an. Wir werden für jede Erweiterung und für jedes Abenteuer eine Kategorie anlegen. So könnt ihr euch alles auch gebündelt herunterladen.<br />
</div><br />
</div><br />
<br />
<!--T:20--><br />
<!-- KASTEN FEHLER--><br />
<div id="hauptseite-fehler" class="hauptseite-links"><br />
<br />
== Ich habe einen Fehler gefunden! == <!--T:21--><br />
<div class="inhalt" align="left"><br />
Das kann immer mal wieder passieren, du darfst uns gerne darauf aufmerksam machen. Dieses Projekt befindet sich noch in einer Beta-Phase und wird kontinuierlich weiterentwickelt. Erwartet also kein fertiges Produkt. Das Grund-Regelwerk steht zum Download bereit, und die weiteren Schritte gehen wir gemeinsam! So wissen wir zum Beispiel, dass die PDF-Ausgabe noch nicht schick aussieht und etwas durcheinander ist. Daran arbeiten wir gerade! Feedback und Kritik nehmen wir gerne unter redaktion(ät)howtobeahero(punkt)de an.<br />
</div><br />
</div><br />
</translate><br />
__NOTOC__</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34584MediaWiki:Sidebar2022-11-25T22:57:14Z<p>TheGamer93: </p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** https://rollenspiel.social/@howtobeahero | Mastodon<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34583MediaWiki:Sidebar2022-11-25T22:57:07Z<p>TheGamer93: </p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** https://rollenspiel.social/@howtobeahero | Mastodon((me))<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=Hauptseite&diff=34582Hauptseite2022-11-25T22:56:53Z<p>TheGamer93: </p>
<hr />
<div><translate><br />
<!--T:1--><br />
<!-- HAUPTSEITE --><br />
<div id="hauptseite"><br />
<br />
<center>'''Willkommen beim How to be a Hero-Regelwerk!'''</center><br />
<div class="heroimage">[[Datei:how_to_mainpage_2.png|link=]]</div><br><br />
<!-- KASTEN WILKOMMEN --><br />
<div id="hauptseite-willkommen" class="hauptseite-oben"><br />
== ANKÜNDIGUNG == <!--T:2--><br />
<div class="inhalt" align="left"><br />
<div class="center_box"><br />
<center><big><big>'''Aktuelle Infos gibt es in unserem [https://steadyhq.com/de/htbah/about Newsletter]. Außerdem kannst du uns dort perfekt unterstützen!'''</big></big></center><br />
[[Datei:Steady_newsletter_howky_2450x490.png|1500px|verweis=https://steadyhq.com/de/htbah/about|Hier kommst du zum Newsletter!]]<br />
<br><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Mitwirken == <!--T:3--><br />
<div class="inhalt" align="left"><br />
Du möchtest als Autor aktiv an der Weiterentwicklung des Regelwerks arbeiten? Dann leg los und schreib deinen ersten Artikel. Anschließend werden diese durch unsere '''Redakteure''' gesichtet und entsprechend als "bestätigte Version" markiert. Du möchtest dich mit anderen Autoren aus der Community und unseren Redakteuren vernetzen? Besuch doch einfach unseren '''<big>[[Discord | Discord-Server]]</big>'''!<br />
<br />
<!--T:4--><br />
Wenn du ein Abenteuer hier einfügen möchtest, dann solltest du dich an [https://howtobeahero.de/index.php?title=Abenteuerstruktur diese Struktur] halten.<br />
<br />
<!--T:5--><br />
Du kannst auch für Verbesserungen an <br />
<br />
<!--T:6--><br />
regelwerk(ät)howtobeahero(punkt)de (für Fragen und Anregungen rund um Regelwerk und Module)<br />
<br />
<!--T:7--><br />
oder an<br />
<br />
<!--T:8--><br />
redaktion(ät)howtobeahero(punkt)de (für Verbesserungen, Abenteuer und Settings) schreiben.<br />
<br />
<!--T:9--><br />
'''<big>Wir antworten dir immer! Bitte beachte deinen Spam-Ordner!</big>'''<br />
<br />
<!--T:10--><br />
WICHTIG!! Leider bekommen wir immer wieder Mails, die nicht richtig verschickt wurden. Diese können wir leider nicht bearbeiten, weil dort kein Inhalt mitgeschickt wird. Wenn du keine Antwort von uns bekommst, schreibe uns einfach auf Twitter an!<br />
<br />
<!--T:11--><br />
Oder lieber auf Social Media? Twitter es raus an [https://twitter.com/HtbaH_Official HtbaH_Official] oder schreib uns via [https://rollenspiel.social/@howtobeahero Mastodon((me))] !<br />
</div><br />
</div><br />
<br />
<!--T:12--><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Neuerungen == <!--T:13--><br />
<div class="inhalt" align="left"><br />
Was gibt es eigentlich so Neues? <br />
<br />
<!--T:14--><br />
* '''[https://howtobeahero.de/CampHero19 #CampHero19] ging leider schneller vorbei als alle es wollten.. [https://howtobeahero.de/CampHero19 Hier] lest ihr, wie wir es erlebt haben.'''<br />
* '''Das Abenteuer [[Luna]] ist online! Viel Spaß beim Spielen! :)'''<br />
* Unser PDF-Generator ist endlich online und wartet darauf, von euch benutzt zu werden! [[PDF_generieren | Hier]] gibt es eine Anleitung dazu. :)<br />
* Unser offizieller Charakterbogen steht zum Download bereit. [[Charakterbogen| Hier]] findest du ihn.<br />
* Eine komplett neue Fassung des Regelwerks mit tollen Illustrationen dazu.''' Du findest sie [https://howtobeahero.de/index.php?title=Kategorie:Regelwerk hier].<br />
* Die ersten [https://howtobeahero.de/index.php?title=Kategorie:%22Wilde%22_Abenteuer unbestätigten User-Abenteuer] und [https://howtobeahero.de/index.php?title=Kategorie:Bestätigte_Abenteuer bestätigten User-Abenteuer], die du bereits spielen kannst, sind verfügbar.<br />
<br />
<!--T:15--><br />
</div><br />
</div><br />
<br />
<!--T:16--><br />
<!-- KASTEN Kontakt--><br />
<div id="hauptseite-kontakt " class="hauptseite-links"><br />
<br />
== Kontakt == <!--T:17--><br />
<div class="inhalt" align="left"><br />
Du möchtest uns dabei helfen, das Regelwerk zu ergänzen oder an Grafiken, Illustrationen und Technik mitwirken? Du willst in unser HTBAH Team? Dann schreib uns eine Mail (redaktion(ät)howtobeahero(punkt)de, und wir melden uns bei dir!<br />
</div><br />
</div><br />
<br />
<!--T:18--><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Wie funktioniert das hier? == <!--T:19--><br />
<div class="inhalt" align="left"><br />
Es wird unterschieden in ''Kategorien'' und einzelne ''Seiten''. Jeder registrierte Benutzer hat die Möglichkeit, jede einzelne Seite als PDF auszugeben. Wer ein komplettes Buch möchte, schaut sich die Kategorien an. Wir werden für jede Erweiterung und für jedes Abenteuer eine Kategorie anlegen. So könnt ihr euch alles auch gebündelt herunterladen.<br />
</div><br />
</div><br />
<br />
<!--T:20--><br />
<!-- KASTEN FEHLER--><br />
<div id="hauptseite-fehler" class="hauptseite-links"><br />
<br />
== Ich habe einen Fehler gefunden! == <!--T:21--><br />
<div class="inhalt" align="left"><br />
Das kann immer mal wieder passieren, du darfst uns gerne darauf aufmerksam machen. Dieses Projekt befindet sich noch in einer Beta-Phase und wird kontinuierlich weiterentwickelt. Erwartet also kein fertiges Produkt. Das Grund-Regelwerk steht zum Download bereit, und die weiteren Schritte gehen wir gemeinsam! So wissen wir zum Beispiel, dass die PDF-Ausgabe noch nicht schick aussieht und etwas durcheinander ist. Daran arbeiten wir gerade! Feedback und Kritik nehmen wir gerne unter redaktion(ät)howtobeahero(punkt)de an.<br />
</div><br />
</div><br />
</translate><br />
__NOTOC__</div>TheGamer93https://howtobeahero.de/index.php?title=Hauptseite&diff=34581Hauptseite2022-11-25T22:51:44Z<p>TheGamer93: Mastodon verlinkt mit me-tag</p>
<hr />
<div><translate><br />
<!--T:1--><br />
<!-- HAUPTSEITE --><br />
<div id="hauptseite"><br />
<br />
<center>'''Willkommen beim How to be a Hero-Regelwerk!'''</center><br />
<div class="heroimage">[[Datei:how_to_mainpage_2.png|link=]]</div><br><br />
<!-- KASTEN WILKOMMEN --><br />
<div id="hauptseite-willkommen" class="hauptseite-oben"><br />
== ANKÜNDIGUNG == <!--T:2--><br />
<div class="inhalt" align="left"><br />
<div class="center_box"><br />
<center><big><big>'''Aktuelle Infos gibt es in unserem [https://steadyhq.com/de/htbah/about Newsletter]. Außerdem kannst du uns dort perfekt unterstützen!'''</big></big></center><br />
[[Datei:Steady_newsletter_howky_2450x490.png|1500px|verweis=https://steadyhq.com/de/htbah/about|Hier kommst du zum Newsletter!]]<br />
<br><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Mitwirken == <!--T:3--><br />
<div class="inhalt" align="left"><br />
Du möchtest als Autor aktiv an der Weiterentwicklung des Regelwerks arbeiten? Dann leg los und schreib deinen ersten Artikel. Anschließend werden diese durch unsere '''Redakteure''' gesichtet und entsprechend als "bestätigte Version" markiert. Du möchtest dich mit anderen Autoren aus der Community und unseren Redakteuren vernetzen? Besuch doch einfach unseren '''<big>[[Discord | Discord-Server]]</big>'''!<br />
<br />
<!--T:4--><br />
Wenn du ein Abenteuer hier einfügen möchtest, dann solltest du dich an [https://howtobeahero.de/index.php?title=Abenteuerstruktur diese Struktur] halten.<br />
<br />
<!--T:5--><br />
Du kannst auch für Verbesserungen an <br />
<br />
<!--T:6--><br />
regelwerk(ät)howtobeahero(punkt)de (für Fragen und Anregungen rund um Regelwerk und Module)<br />
<br />
<!--T:7--><br />
oder an<br />
<br />
<!--T:8--><br />
redaktion(ät)howtobeahero(punkt)de (für Verbesserungen, Abenteuer und Settings) schreiben.<br />
<br />
<!--T:9--><br />
'''<big>Wir antworten dir immer! Bitte beachte deinen Spam-Ordner!</big>'''<br />
<br />
<!--T:10--><br />
WICHTIG!! Leider bekommen wir immer wieder Mails, die nicht richtig verschickt wurden. Diese können wir leider nicht bearbeiten, weil dort kein Inhalt mitgeschickt wird. Wenn du keine Antwort von uns bekommst, schreibe uns einfach auf Twitter an!<br />
<br />
<!--T:11--><br />
Oder lieber auf Social Media? Twitter es raus an [https://twitter.com/HtbaH_Official HtbaH_Official] oder schreib uns via <a rel="me" href="https://rollenspiel.social/@howtobeahero">Mastodon</a>!<br />
</div><br />
</div><br />
<br />
<!--T:12--><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Neuerungen == <!--T:13--><br />
<div class="inhalt" align="left"><br />
Was gibt es eigentlich so Neues? <br />
<br />
<!--T:14--><br />
* '''[https://howtobeahero.de/CampHero19 #CampHero19] ging leider schneller vorbei als alle es wollten.. [https://howtobeahero.de/CampHero19 Hier] lest ihr, wie wir es erlebt haben.'''<br />
* '''Das Abenteuer [[Luna]] ist online! Viel Spaß beim Spielen! :)'''<br />
* Unser PDF-Generator ist endlich online und wartet darauf, von euch benutzt zu werden! [[PDF_generieren | Hier]] gibt es eine Anleitung dazu. :)<br />
* Unser offizieller Charakterbogen steht zum Download bereit. [[Charakterbogen| Hier]] findest du ihn.<br />
* Eine komplett neue Fassung des Regelwerks mit tollen Illustrationen dazu.''' Du findest sie [https://howtobeahero.de/index.php?title=Kategorie:Regelwerk hier].<br />
* Die ersten [https://howtobeahero.de/index.php?title=Kategorie:%22Wilde%22_Abenteuer unbestätigten User-Abenteuer] und [https://howtobeahero.de/index.php?title=Kategorie:Bestätigte_Abenteuer bestätigten User-Abenteuer], die du bereits spielen kannst, sind verfügbar.<br />
<br />
<!--T:15--><br />
</div><br />
</div><br />
<br />
<!--T:16--><br />
<!-- KASTEN Kontakt--><br />
<div id="hauptseite-kontakt " class="hauptseite-links"><br />
<br />
== Kontakt == <!--T:17--><br />
<div class="inhalt" align="left"><br />
Du möchtest uns dabei helfen, das Regelwerk zu ergänzen oder an Grafiken, Illustrationen und Technik mitwirken? Du willst in unser HTBAH Team? Dann schreib uns eine Mail (redaktion(ät)howtobeahero(punkt)de, und wir melden uns bei dir!<br />
</div><br />
</div><br />
<br />
<!--T:18--><br />
<!-- KASTEN FUNKTION --><br />
<div id="hauptseite-funktion" class="hauptseite-links"><br />
<br />
== Wie funktioniert das hier? == <!--T:19--><br />
<div class="inhalt" align="left"><br />
Es wird unterschieden in ''Kategorien'' und einzelne ''Seiten''. Jeder registrierte Benutzer hat die Möglichkeit, jede einzelne Seite als PDF auszugeben. Wer ein komplettes Buch möchte, schaut sich die Kategorien an. Wir werden für jede Erweiterung und für jedes Abenteuer eine Kategorie anlegen. So könnt ihr euch alles auch gebündelt herunterladen.<br />
</div><br />
</div><br />
<br />
<!--T:20--><br />
<!-- KASTEN FEHLER--><br />
<div id="hauptseite-fehler" class="hauptseite-links"><br />
<br />
== Ich habe einen Fehler gefunden! == <!--T:21--><br />
<div class="inhalt" align="left"><br />
Das kann immer mal wieder passieren, du darfst uns gerne darauf aufmerksam machen. Dieses Projekt befindet sich noch in einer Beta-Phase und wird kontinuierlich weiterentwickelt. Erwartet also kein fertiges Produkt. Das Grund-Regelwerk steht zum Download bereit, und die weiteren Schritte gehen wir gemeinsam! So wissen wir zum Beispiel, dass die PDF-Ausgabe noch nicht schick aussieht und etwas durcheinander ist. Daran arbeiten wir gerade! Feedback und Kritik nehmen wir gerne unter redaktion(ät)howtobeahero(punkt)de an.<br />
</div><br />
</div><br />
</translate><br />
__NOTOC__</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34580MediaWiki:Sidebar2022-11-25T22:50:07Z<p>TheGamer93: Änderung 34579 von TheGamer93 (Diskussion) rückgängig gemacht.</p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** https://rollenspiel.social/@howtobeahero | Mastodon<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34579MediaWiki:Sidebar2022-11-25T22:49:48Z<p>TheGamer93: </p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** <a rel="me" href="https://rollenspiel.social/@howtobeahero">Mastodon</a><br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Sidebar&diff=34578MediaWiki:Sidebar2022-11-25T22:49:04Z<p>TheGamer93: Mastodon hinzugefügt</p>
<hr />
<div>* ticker<br />
* navigation<br />
** {{#ifeq: {{int:edit}} | Edit | Hauptseite/en{{!}}Main page | Hauptseite{{!}}Hauptseite}}<br />
** {{#ifeq: {{int:edit}} | Edit | Discord/en{{!}}Discord | Discord{{!}}Discord}}<br />
** https://twitter.com/HtbaH_Official | Twitter<br />
** https://rollenspiel.social/@howtobeahero | Mastodon<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Regelwerk/en{{!}}Rulebook | :Kategorie:Regelwerk{{!}}Regelwerk}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Module/en{{!}}Modules | :Kategorie:Module{{!}}Module }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Abenteuer/en{{!}}Adventures | :Kategorie:Abenteuer{{!}}Abenteuer}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Settings/en{{!}}Settings/Universes | :Kategorie:Settings{{!}}Settings/Universen }}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Tipps_und_Tricks/en{{!}}Tips & Tricks | :Kategorie:Tipps_und_Tricks{{!}}Tipps & Tricks}}<br />
** {{#ifeq: {{int:edit}} | Edit | :Kategorie:Wiki_Tipps/en{{!}}Wiki Tips | :Kategorie:Wiki_Tipps{{!}}Wiki Tipps }}<br />
** {{#ifeq: {{int:edit}} | Edit | Charakterbogen/en{{!}}Charactersheet | Charakterbogen{{!}}Charakterbogen}}<br />
** {{#ifeq: {{int:edit}} | Edit | Impressum/en{{!}}Legal Notice | Impressum{{!}}Impressum }}<br />
** recentchanges-url|recentchanges<br />
** randompage-url|randompage<br />
** helppage|help<br />
* SEARCH<br />
* TOOLBOX<br />
* LANGUAGES</div>TheGamer93https://howtobeahero.de/index.php?title=Benutzer:Firu&diff=33819Benutzer:Firu2022-08-08T06:35:30Z<p>TheGamer93: TheGamer93 verschob die Seite Benutzer:Firu nach Benutzer:Ta‘Lah: Seite während der Benutzerkontoumbenennung von „Firu“ in „Ta‘Lah“ automatisch verschoben</p>
<hr />
<div>#WEITERLEITUNG [[Benutzer:Ta‘Lah]]</div>TheGamer93https://howtobeahero.de/index.php?title=Benutzerin:Ta%27Lah&diff=33818Benutzerin:Ta'Lah2022-08-08T06:35:30Z<p>TheGamer93: TheGamer93 verschob die Seite Benutzer:Firu nach Benutzer:Ta‘Lah: Seite während der Benutzerkontoumbenennung von „Firu“ in „Ta‘Lah“ automatisch verschoben</p>
<hr />
<div>[[Datei:Test.png|mini|rechts|eintestslimevonfiru|Ich bleib hier nicht, Firu wollte nur basteln! BOING!| verweis=https://howtobeahero.de/index.php?title=Benutzer:Firu]]<br />
<br />
=== Wer ist das denn? ===<br />
<br />
Ich bin Ta'Lah (she/her) und war früher Mal ein Firu-Slime<br />
<br />
<br />
Redakteurin und Regeltüftlerin im '''How to be a Hero''' - Team.<br />
<br />
Ich bin schon seit einigen Jahren Spielleiterin und leite 'nen ''Haufen Zeuch''!<br />
<br />
Ich zeichne und pinsel immer mal wieder vor mich her und freu mich, wenn es halbwegs <br />
<br />
meinen Ansprüchen entspricht<br />
<br />
Du brauchst was von mir? Ich geb mein Bestes! Meld dich einfach auf [https://discord.gg/3CQgP8f Discord!]<br />
<br />
Ich bin noch der Neue und hoffe ich kann helfen<br />
<br />
{{{!}} class="wikitable"<br />
! colspan="2" {{!}} Schnellübersicht<br />
{{!}}- <br />
{{!}} Nickname<br />
{{!}} Ta'Lah<br />
{{!}}- <br />
{{!}} Echter Name<br />
{{!}} Sasha Lüth<br />
{{!}}- <br />
{{!}} Position<br />
{{!}} Redakteurin, Spielleiterin, Regelwuslerin<br />
{{!}}- <br />
{{!}} Was ich schon gemacht habe<br />
{{!}} Spielleiterin, Spielerin, Regeltüftlerin<br />
{{!}}- <br />
{{!}} [https://howtobeahero.de/index.php?title=Discord Discord]<br />
{{!}} Ta'Lah#6174<br />
{{!}}- <br />
{{!}} Twitter<br />
{{!}} [https://twitter.com/FiruSurvives @FiruSurvives]<br />
{{!}}- <br />
{{!}} Twitch<br />
{{!}} [https://www.twitch.tv/DasFiru DasFiru]<br />
{{!}}}<br />
<br />
===Das kann ich===<br />
<br />
{{char|nolimit=no<br />
|HPflegen>80<br />
|HKritzeln>40<br />
|WRegelwerke>60<br />
|WUnnötiges Wissen>60<br />
|WPsychologie>40<br />
|SLeiten>80<br />
|SZuhören>40}}<br />
<br />
===Was hat der schon gemacht?===<br />
Abenteuer, die ich für andere Systeme für meine Runden geschrieben habe und die ich gern für How to be a Hero umschreiben würde:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Abenteuer || Bisher getestet mit ||Kategorie / Setting<br />
|-<br />
| <center>Der vermisste Hammer</center> || <center>DnD5e (eigene Welt)</center>|| </center>High Fantasy/ Ermittlung</center><br />
|-<br />
| <center>Durch den Njolwald </center>|| <center>DnD5e (eigene Welt)</center>|| <center>High Fantasy/ Reisen</center><br />
|-<br />
| <center>Das Gewand</center> || <center>Call of Cthulhu 7th Edition</center> || <center>Horror / Nordseeabenteuer</center><br />
|-<br />
|}<br />
===In diesen Settings war ich bereits unterwegs:===<br />
<br />
{{cur|High Fantasy}}{{br}}<br />
{{cur|Low Fantasy}}{{br}}<br />
{{cur|Cyberpunk}}{{br}}<br />
{{cur|Sci-Fi}}{{br}}</div>TheGamer93https://howtobeahero.de/index.php?title=Datei:Steinr%C3%A4tsel_fertig.jpg&diff=33782Datei:Steinrätsel fertig.jpg2022-08-06T08:19:37Z<p>TheGamer93: TheGamer93 lud eine neue Version von Datei:Steinrätsel fertig.jpg hoch</p>
<hr />
<div>Steinrätsel für Nibelungenabenteuer. Foto: Mariana Friedrich</div>TheGamer93https://howtobeahero.de/index.php?title=Datei:Steinr%C3%A4tsel_fertig.jpg&diff=33781Datei:Steinrätsel fertig.jpg2022-08-06T08:18:39Z<p>TheGamer93: TheGamer93 lud eine neue Version von Datei:Steinrätsel fertig.jpg hoch</p>
<hr />
<div>Steinrätsel für Nibelungenabenteuer. Foto: Mariana Friedrich</div>TheGamer93https://howtobeahero.de/index.php?title=Datei:Steinr%C3%A4tsel_fertig.jpg&diff=33780Datei:Steinrätsel fertig.jpg2022-08-06T08:17:34Z<p>TheGamer93: TheGamer93 lud eine neue Version von Datei:Steinrätsel fertig.jpg hoch</p>
<hr />
<div>Steinrätsel für Nibelungenabenteuer. Foto: Mariana Friedrich</div>TheGamer93https://howtobeahero.de/index.php?title=Datei:Steinr%C3%A4tsel_fertig.jpg&diff=33779Datei:Steinrätsel fertig.jpg2022-08-06T08:16:32Z<p>TheGamer93: TheGamer93 lud eine neue Version von Datei:Steinrätsel fertig.jpg hoch</p>
<hr />
<div>Steinrätsel für Nibelungenabenteuer. Foto: Mariana Friedrich</div>TheGamer93https://howtobeahero.de/index.php?title=Schwarzw%C3%A4lderTote&diff=32738SchwarzwälderTote2022-05-09T20:21:01Z<p>TheGamer93: </p>
<hr />
<div>'''Wo spielt das Abenteuer?:''' In einem Hotel im Schwarzwald, dem Mountain View<br />
<br />
'''Wann spielt das Abenteuer?:''' Heutige Zeit<br />
<br />
'''Nach welchen Regeln spielt das Abenteuer?:''' How to be a Hero Grundregeln, grundsätzlich erweiterbar<br />
<br />
'''Für wie viele Leute ist es gemacht?:''' 3 bis 5 Spieler, ausgelegt und ideal ist das Abenteuer aber für 4 Spielende<br />
<br />
'''Schwierigkeit für den Spielleiter:''' einfach (war mein erstes P&P als Meister)<br />
<br />
'''Schwierigkeit für die Spieler:''' Für Anfänger: Mittel bis Schwer - Für Fortgeschrittene: Leicht bis Mittel<br />
<br />
'''Spieldauer:''' 4 - 6 Stunden<br />
<br />
== Klappentext ==<br />
Das Mountain View ist ein richtiges Luxus-Hotel und enthält die grösste Suite in Deutschland. Hier gehen die Schönen und vor allem die Reichen ein und aus. Speziell am Mountain View ist, dass es auf einem Felsplaton liegt und nur via Helikopter erreichbar ist. Es gibt weder Strassen noch Fusswege zum Hotel. Hier treffen unsere 4 Helden und Heldinnen zufällig zusammen. Sie werden Teil einer spektakulären Geiselnahme und müssen trotz ihrer Unterschiedlichkeit zusammenarbeiten um zu überleben. Während ihrem Abenteuer stellen sie aber nach und nach fest dass die Geiselnehmer nicht die einzigen Menschen im Hotel sind mit unlauteren Absichten...<br />
<br />
{{Disclaimer}}<hr><br />
<br />
== Hinweise für den Spielleiter ==<br />
Das Abenteuer spielt in der jetzigen Zeit im Schwarzwald in unserer Welt.<br />
Es gibt vor allem am Anfang einige Ereignisse welche die Spielenden nicht verhindern können. Danach sind sie aber völlig frei, wie sie das Abenteuer meistern möchten. Wie in der echten Welt finden die Ereignisse statt unabhängig aber nicht unbeeinflussbar von den Spielenden. Also wenn in Raum X um 21:00 jemand erschossen wird geschieht das. Wenn die Spielenden vorher im Raum sind, entdecken sie nichts. Wenn sie während dem Ereignis im Raum sind, können sie es ggf. verhindern oder verändern. Wenn sie den Raum erst danach entdecken finden sie ggf. eine Leiche. <br />
<br />
Die Spielenden können das Abenteuer auch überleben bzw. beenden ohne je mit der Hintergrund-Story in Kontakt gekommen zu sein.<br />
<br />
Ich habe als Ersteller des Abenteuers ebenfalls Personenbeschreibungen für die Spielenden erstellt. Es sind 4 Charaktere die zufällig im Hotel zu Gast sind und sich nicht kennen. Besonders Anfänger*innen sind froh um die Anhaltspunkte. Bei der Durchführung haben sich die Spielenden auch ihrer Rolle entsprechend verkleidet. Das ist natürlich optional und am besten gibst du als Spielleiter*in vor ob ihr das als Gruppe machen wollt oder nicht. <br />
<br />
Natürlich können die Spielenden auch eigene Charaktere erstellen, falls sie nicht vorgeschriebene Charaktere spielen wollen. In dem Fall muss sich der Spielleiter jedoch überlegen, wie er die Funktion der Rolle Anna Rast ersetzt, da diese als Einzige Rolle eine Verbindung zur Hintergrund-Geschichte hat. Natürlich kann aber auch eine andere Rolle die Schwester/Bruder/anderer Verwandter von Sam darstellen und von ihm kontaktiert worden sein (Siehe Grundlegende Hintergrund Geschichte und Personenbeschreibung von Anna Rast)<br />
<br />
Alle einzelnen Dokumente (Personenbeschreibung; Hintergrund-Geschichte; Charakterbögen der NPC; Zeitleiste; Zeitungsartikel etc. findet man auch als PDFs, wo es übersichtlicher ist als die Darstellung in diesem Wiki).<br />
<br />
== Personenbeschreibungen der Spielenden (falls sie keine selber erstellte Charaktere spielen wollen) ==<br />
=== Leonhard Henckel von und zu Dommersmark (32) ===<br />
Du bist Sohn einer sehr vermögenden deutschen Adelsfamilie. Deine Familie gehört zu den reichsten 100 der Welt. Allein auf deinen Konten liegen mehrere Milliarden. Du wurdest von deinen Eltern verwöhnt und hast noch nie im Leben gearbeitet. Jedoch hast du eine sehr gute Schule besucht und hast ein riesiges Allgemeinwissen. Deine Familie lebt nach dem Motto «Wissen ist Macht» und das Einzige was deine Eltern je von dir verlangt haben ist, dass du dich stets weiterbildest. Du kannst daher mindestens eine Fremdsprache sehr gut.<br />
Du behandelst alle Menschen arrogant von oben herab und variierst dabei nur ob du Beleidigungen offen aussprichst oder in deiner gehobenen Sprache versteckst. Du stehst gerne im Mittelpunkt. Wenn du den Raum betrittst soll das ruhig jeder Anwesende merken. Du sprichst in der Regel gehoben, die Zunge des Pöbels ist dir fremd. Zur Zunge des Pöbels gehören auch Dialekte wie Bayerisch, Schweizerdeutsch oder Österreichisch. Du sprichst und verstehst ausschliesslich Hochdeutsch. Du bist der festen Überzeugung aufgrund deines Reichtums besser und wichtiger zu sein als alle anderen Menschen. Die einzigen Menschen, denen du auf Augenhöhe begegnest, sind jene, die dir glaubhaft dein Eindruck vermitteln können, sie haben mindestens genauso viel Geld wie du.<br />
Du stehst auf Frauen, strebst aber keine Beziehung an. Im Gegenteil. Du bezeichnest Frauen oft als ein Hobby oder netten Zeitvertreib und behandelst sie auch so. Du lässt dich auf Frauen ein, die sich von deinem Auftreten beeindrucken lassen, lässt sie aber ausnahmslos alle nach einer Nacht links liegen. Die Namen der weiblichen Körper mit denen du dich vergnügst, merkst du dir nicht. Denn du sammelst nur nützliches Wissen.<br />
Aufgrund deiner vielen Tagesfreizeit machst du dir einen Spass daraus andere Menschen zu belehren und/oder für dich arbeiten zu lassen. Du kannst überzeugend sein und bist geübt im Manipulieren und Belügen von Menschen. Da dir oft langweilig ist, hast du nichts gegen etwas Nervenkitzel einzuwenden und suchst das Abenteuer.<br />
<br />
Werte 1 Fremdsprache (Min 50); Manipulieren (Min 70); Lügen (Min 40) Wissen: Min. 3 Themengebiete Min 40<br />
<br />
Inventar: Unmengen an Bargeld in verschiedenen Währungen. Mindestens 3 Kreditkarten; Neues Smartphone Beziehung zu den anderen Personen Du kennst keine der anderen Personen.<br />
<br />
Kleidung: Du kleidest dich ausschliesslich elegant und vornehm. Der Massgeschneiderter Anzug ist deine Alltagskleidung. Sogar deine Unterwäsche und dein Schlafanzug sind massgeschneidert.<br />
<br />
Ziele<br />
- Überlebe<br />
- Optionale Ziele<br />
o Amüsiere dich auf Kosten anderer<br />
o Finde Frauen mit denen du Sex haben kannst<br />
o Such den Nervenkitzel<br />
<br />
=== Leonie Weber (25) ===<br />
Du bist sehr attraktiv. Beruflich hast du lange im Detailhandel gearbeitet und in einer Papeterie Regale aufgefüllt und Kunden beraten. Doch dies gehört der Vergangenheit an. Du wurdest von mehreren Männern, mit denen du eine Beziehung hattest, tief verletzt und sinnst darum auf Rache. Die gestaltest du so dass du (vor allem reiche und arrogante) Männer verführst und dich als leicht zu haben ausgibst. Ausnahmslos alle diese Begegnungen laufen so ab, dass du die Männer verführst, ans Bett fesselst und ihnen den Inhalt ihres Portemonnaies stiehlst. Bei besonderer Unsympathie gibst noch einen Tritt in die Weichteile und dann bist du verschwunden. Natürlich nennst du nie deinen richtigen Namen beim Kennenlernen, damit keiner dieser Männer dich je wiederfindet. Von deiner Masche kannst du mittlerweile sehr gut leben.<br />
Du stammst aus einer ärmeren Familie, kannst dir mittlerweile aber auch einen etwas gehobeneren Lebensstil leisten. Du begegnest allen Männern eher misstrauisch und etwas arrogant. Erst wenn sich zeigt, dass die Männer weder Frauen benachteiligen noch in Frauen reine Sex-Objekte sehen, lässt du dich dazu herab, ihnen respektvoll zu begegnen. Frauen gegenüber bist du offen und liebevoll. Du gibst z.B. weiblichen Kellnerinnen immer doppelt so viel Trinkgeld wie männlichen Kellnern. Du kümmerst dich auch um Frauen, wenn diese Hilfe brauchen und bist Mitglied in 3 verschiedenen feministischen Vereinigungen.<br />
<br />
Wenn du einen Raum betritts schauen viele Männer dir nach. Das ist dir bewusst und du weisst die Aufmerksamkeit für dich zu nutzen. Du kannst sehr gut flirten und Leute, besonders Männer, beeinflussen. Sei es, um dir beim Umzug zu helfen oder den Drink an der Bar gratis zu bekommen. Du wickelst fast alle um den kleinen Finger. Du hast ein normales Allgemeinwissen.<br />
<br />
Werte: Beeinflussen Min 70; Flirten Min 30; Täuschen Min 70; Wissen über Papier; Stifte & Papeterie-Artikel. Min 40 Kicken Min 30<br />
<br />
Inventar: Etwas Bargeld; Handschellen, 4 Halstücher (welche du i.d.R. als Fesselwerkzeug benutzt), 1 Beauty Case; Auto-Schlüssel, Smartphone <br />
<br />
Kleidung: Du kleidest dich ausschliesslich elegant. Du trägst stets ein elegantes Kleid und High Heels. Bei Kälte ergänzt du dies mit Strumpfhosen und einem vornehmen Mantel.<br />
<br />
Ziele<br />
- Überlebe<br />
- Optionale Ziele<br />
o Finde Männer die auf deine Masche hereinfallen und stiehl ihnen Geld <br />
o Hilf anderen Frauen, wenn diese Hilfe brauchen.<br />
<br />
=== Ralph Jost (42) ===<br />
Du bist dick. Und zwar richtig dick. Als du dich vor gut 10 Jahren das letzte mal gewogen hast, kamen gut 140kg auf die Waage. Du bist leider mit 175cm auch nicht der grösste. Dein unattraktives Äusseres beschäftigt dich sehr, aber dass zeigst du niemals, im Gegenteil, du lächelst Sprüche und Beleidigungen einfach weg.<br />
Du trägst eine ziemlich nerdige Brille und bist auch ein ziemlicher Nerd. Du arbeitest als Filmkritiker und kennst unglaublich viele Filme. Auch kennst dich aus in fiktiven Welten wie Star Wars, Herr der Ringe, Harry Potter, Game of Thrones etc. etc. Du kannst ziemlich gut im richtigen Moment Filmzitate platzieren, da dir zu jeder Situation im Leben ein passendes Filmzitat einfällt. Du hast auch sonst ein grosses Allgemeinwissen.<br />
<br />
Filme sind deine Welt und in der Film-Community bist du aufgrund deines Wissens und deines Berufes sehr angesehen. Daher fühlst du dich am wohlsten, wenn du über Filme sprechen kannst und sie sind dein Small Talk Thema Nr. 1.<br />
Du stehst auf Frauen und suchst ihre Nähe, gibt’s dich stets als nett und hilfsbereit aus. Du hattest zwar schon 1-2 Beziehungen, doch leider wirst du oft gefriendzoned. Trotzdem oder auch gerade deshalb fehlt dir das Selbstbewusstsein, um Gegenüber Frauen stark und selbstbewusst aufzutreten, sondern gibst wie du bist: kumpelhaft.<br />
<br />
Du hast ein grosses Herz, bist grosszügig, bescheiden und hilfsbereit. Du wirkst grundsätzlich vertrauenswürdig und überhaupt nicht bedrohlich auf andere. Du bist ein ruhiger Mensch und suchst stets den Frieden, trittst daher auch oft als Schlichter aus. Du bietest in Konflikten den Menschen Kompromisse an oder gibst lieber mal nach. Hauptsache du bist mit möglichst jedem Menschen im Reinen. Du begegnest grundsätzlich jedem Menschen offen und respektvoll, aber wenn dich jemand beleidigt, ziehst du dich von dieser Person zurück. In ganz seltenen Fällen setzt du dich auch zur Wehr.<br />
<br />
Werte: Wissen über Filme Min 80; Wissen fiktive Welten Min 50; Sportliche Aktivitäten Max 10. Small Talk Min 50; Schlichten Min 50<br />
<br />
Inventar: Etwas Bargeld; Ein Laptop mit DVD Laufwerk; Mindestens 5 Filme; Auto-Schlüssel, Ein Flachmann gefüllt mit Single Malt Scotch Whiskey (man gönnt sich ja sonst nichts); Smartphone<br />
<br />
Kleidung: Du kleidest dich ausschliesslich bequem. Du trägst ein weites T-Shirt und Schlabberhosen sowie Turnschuhe. Du achtest dich nicht sehr auf dein Äusseres, hast daher schon ausgewaschene Klamotten und eine eher verstrubbelte Frisur.<br />
<br />
Ziele<br />
- Überlebe<br />
- Hilf anderen Menschen, wenn diese Hilfe brauchen<br />
- Optionale Ziele<br />
o Sei mit allen Menschen in einer friedlichen, bereinigten Beziehung<br />
<br />
=== Anna Rast (18) ===<br />
Du bist eine junge Frau aus einem kleinen Dorf mit grossen Träumen. Du bist sportlich, auch attraktiv, aber zurückhaltend und schüchtern. Du stehst nicht gerne im Mittelpunkt und gehst Menschenmassen eher aus dem Weg. Du schätzt eher intimere Gespräche. Du bist offen, um mit Menschen in Kontakt zu treten. Dir ist Gerechtigkeit wichtig. Du bist bescheiden und hilfsbereit.<br />
Du stammst aus einer mittelständischen Familie und hast gerade das Gymnasium abgeschlossen. Deine grösste Leidenschaft und zugleich dein grösstes Hobby sind Pferde. Du hast ein grosses Wissen über Pferde und das Reiten und reitest zudem wirklich sehr gut. Auch sonst magst du Tiere sehr gerne. Deine Eltern haben entschieden dass du als Mädchen dich musst verteidigen können. Daher besuchst du seit 5 Jahren das Krav Maga und bist darin relativ gut (blauer Gurt)<br />
<br />
Du bist aus diesem Grund Vegetarierin. Du magst Menschen, die wie du bescheiden sind. Du bist zwar nicht aggressiv aber wenn dir jemand frech kommst, gibst du durchaus gerne mal zurück. Du hasst es, bemuttert zu werden und willst der Welt zeigen, dass du das Leben bereits jetzt alleine meistern kannst. Du teilst die Menschen relativ schnell ein in sympathisch und unsympathisch und sobald dir jemand unsympathisch ist, gehst du diesem Menschen konsequent aus dem Weg, scheust aber meistens die Konfrontation. Ausser es nervt dich zu sehr, dann gibst du schon mal zurück. Du neigst dazu bei Themen, welche dir wichtig sind impulsiv und emotional zu reagieren.<br />
Aufgrund deiner aber grundsätzlichen höflichen und zurückhaltenden Art wirkst du auf andere Menschen sehr glaubwürdig.<br />
<br />
Werte: Glaubwürdigkeit Min 50; Reiten Min 60; Wissen über Pferde & Tiere allgemein Min 40 Krav Maga Min 50; Wissen 1 Schwerpunkt Min 40;<br />
<br />
Inventar: Etwas Bargeld;; 1 Beauty Case; Notizen von dir bezüglich dem Gespräch mit Sam, Taschenlampe, Smartphone Beziehung zu den anderen Personen<br />
<br />
Kleidung: Du trägst sportliche Alltagskleidung kombiniert mit flachen Stiefeln.<br />
<br />
Ziele<br />
- Finde Sam<br />
- Überlebe<br />
- Optionale Ziele<br />
o Hilf anderen Menschen, wenn diese Hilfe brauchen.<br />
<br />
==== Notiz aus deinem Gespräch mit Sam ====<br />
Du erhältst um 12:00 einen Anruf von deine Bruder Sam. Er teilt dir mit dass er seit einiger Zeit eine Freundin hat, Natalie. Sein Chef, Friedhelm Weiss, der Onkel von Natalie versucht aber ständig die Beziehung zu sabotieren und erzählt Natalie negative Sachen über Sam die nicht wahr sind. Um sich zu rächen sucht Sam seit Wochen etwas womit er Friedhelm erpressen kann. Heute wird er ihn konfrontieren. Er hat aber Angst. Du bist seine Rückversicherung. Sollte er sich nicht bis 16:00 wieder bei dir melden, musst du ihn unbedingt suchen kommen.&nbsp;<br><br>Um 16:00 und auch später meldete sich Sam nicht. Du bist hier, um ihn zu suchen. Du hast keine Zimmer-Reservierung und willst die Nacht nicht hier verbringen.<br />
<br />
== Grundlegende (Hintergrund-) Storyline ==<br />
=== Vor der Ankunft der Spielenden ===<br />
Sam (22) arbeitet als Koch im Mountain View im Schwarzwald. Das Mountain View ist ein spezielles Luxus-Hotel, welches nur per Helikopter erreicht werden kann, da es auf einem Berg ist, umringt von undurchdringlichen, steilen Klippen.<br />
Sam freundet sich mit dem Zimmermädchen Natalie (19) an. Sie müssen jedoch ihre Liebe geheim halten. Denn Natalies Onkel Friedhelm Weiss ist der Direktor des Hauses. Er sieht in Natalie die Möglichkeit durch eine Heirat Mitglied einer sehr reichen Familie zu werden. Sie wohnt im Hotel und er sorgt für sie, denn ihre Eltern leben im Norden Deutschlands. Natürlich sagt er ihr dies nicht direkt, sondern bürdet Natalie viel Arbeit auf und versucht diskret, aber bestimmt, ihre Beziehungen zu sabotieren. Dabei lügt er sie auch schon mal was die Unzulänglichkeiten möglicher Liebhaber angeht.<br />
<br />
Er bemerkt, dass sie sich für Sam interessiert und macht ihn bei ihr schlecht. Er erzählt ihr Sam sei unreif und werde sie links liegen lassen, er sei noch nie treu gewesen etc. Sam hört eines Tages ein Telefon ab zwischen Friedhelm Weiss und Natalie ab. Er beschliesst jedoch, Friedhelm erst zu konfrontieren, wenn er diesen mit etwas Erpressen kann. Sam wollte schon immer Journalist werden und angetrieben durch seine Wut, stellt er Recherchen an über Friedhelm. Er findet heraus, dass dessen Frau vor 15 Jahren unter merkwürdigen Umständen starb. Sie soll Selbstmord begangen haben und sich beim Mountain View von der Klippe gestürzt haben. Ihre Leiche wurde nie gefunden.<br />
<br />
Sam versucht nun an Tag X um 14:00 im Büro des Direktors Beweise gegen ihn zu finden. Dabei wird er von Friedhelm allerdings erwischt. Dieser lässt den Hauswart Ralf, einen grossen und kräftigen Typ, der ihm stets ergeben ist, Sam verprügeln und in seine Werkstatt einsperren. Sam kann auf dem Weg dahin aber einen Zettel mit den Worten «Brauche Hilfe, bin in Werkstatt, Sam» fallen lassen. Tatsächlich findet Nicole, eine Kollegin von Natalie den Zettel und gibt ihn ihr. Natalie will Sam befreie und geht um 16:00 in die Werkstatt. Dort wartet allerdings Friedhelm auf sie und versucht ihr zu sagen, dass er Sam festhalte bis die Polizei komme und dass Sam ihn bestehlen wollte.<br />
Natalie glaubt Friedhelm nicht und attackiert Friedhelm und wirft ihm vor, damals seine Frau umgebracht zu haben. Sie führt aus, dass ihre Eltern diesen Verdacht auch schon hatten, es sich aber nie erhärten liess. Friedhelm verpasst ihr mehrere Ohrfeigen und Ralf fesselt sie mit Handschellen und Seilen. Er bringt sie um 17:00 in einem Abfallwagen nach draussen und sperrt sie in den Vorratsraum. Er bindet sie mit den Händen auf dem Rücken und gefesselten Beinen an ein Regal. Verbindet ihr Mund mit mehr Panzertape als nötig und schlägt sie dann mit einem Schlag brutal ko. <br />
<br />
=== Wichtige Informationen während dem Spiel ===<br />
<br />
Natalie hat schweren Schaden erlitten. Sie blutet daher aus der Nase. Sie trägt noch ihre Uniform. Sie wird um 21:00 frühstens wach und braucht ärztliche Hilfe um reden zu können. Sonst kann sie nicht wirklich klare Sätze von sich geben.<br />
<br />
Der Vorratsraum ist mit einem Vorhängeschloss gesichert, den Schlüsselt trägt Ralf bei sich. Friedhelm ist nicht klar, dass Natalie ohnmächtig ist und sterben wird.<br />
Sam ist in der Werkstatt und kann befreit werden. Er ist mit Handschellen gefesselt. Ralf trägt 2 verschiedene Schlüssel bei sich, den für Vorratsraum und den für die Handschellen von Sam. Der Schlüssel für die Handschellen von Natalie hat er ihr in den Mund gestopft, bevor er dieses zugetappt hat. Ralf war mal Security Arbeiter, hat daher die Handschellen und hat Erfahrungen in Kampfkünsten. Er ist ein starker Gegner im Nahkampf, aber nicht der Hellste. Er kann überlistet werden, wenn er glaubt, dass Friedhelm etwas befohlen hat.<br />
<br />
Friedhelm hat seine Frau damals mit Gift umgebracht und sie dann die Klippen hinabgestossen, weil sie ihn mit einem Gast betrogen hat. Er wird dieses Geheimnis aber nur verraten. wenn er wirklich glaubt sonst zu sterben. Der Gast war Martin Liefers, ein reicher Industrieller, Zimmer 301, der noch immer ab und zu im Hotel zu Gast ist. Er ist zwar sehr reich, aber nicht so reich wie Leonhard.<br />
Martin erzählt die Begebenheit, allerdings nur in einem intimen Gespräch an einem ruhigen Ort. Er übergibt dann der Person eine Haarlocke die er noch von Carol, Friedhelms Frau, hat.<br />
<br />
Friedhelm überlegt sich wie er Sam und Natalie loswerden kann. Bei Sam ist es einfach, er kann die Polizei anrufen und ihn verhaften lassen, denn sei Büro hat eine Überwachungskamera (Bildschirm ist auch im Büro, Passwort ist Carole) und Sams reinschleichen ist auf Video festgehalten. Natalie ist schwieriger, weil sie eigentlich nichts getan hat, aber er durch seine impulsives zurückschlagen sich verdächtig gemacht hat. Er beschliesst um 23:00 zu ihr hinzugehen, sie zu vergiften (Gift ist in seinem Safe, Kombination ist Carols Todesdatum 15.05.2007) und anschliessend ihre Leiche ebenfalls die Klippen runterzustürzen, was er um 23:30 auch tut, sofern Natalie noch da ist, vergiftet ist und er nicht abgelenkt ist. Er schleicht sich dafür aus dem Fenster, benutzt seinen Master Key für den Vorratsraum und vergifte Natalie.<br />
<br />
Nicole, das andere Zimmermädchen, dass nun als Bardame arbeitet, erzählt vom Zettel wenn sie gefragt wird oder das Gefühl hat, jemand kann ihr wirklich helfen. Sie ist sich unsicher wie ernst sie das Ganze nehmen soll. Es beunruhigt sie nur wie lange sie Natalie schon nicht mehr sah. Sie hat als Bardame den Abfallcontainer gesehen, der von Ralf um 17:00 aus dem Hintereingang gebracht wurde, dies aber nicht als auffällig taxiert.<br />
<br />
Der Concierce Piere ist ein Franzose und stets überfreundlich und überbemüht. Er wird wenig gemocht aber sehr geschätzt. Er kann einem mit seiner übereifrigen Art durchaus mal auf die Nerven gehen. Auch er hat von der Rezeption aus Ralf mit dem Abfallwagen gesehen, doch auch ihm ist das nicht auffällig erschienen.<br />
<br />
Friedhelm hat in der Küche verlauten lassen, dass Sam heute frei macht. Dadurch haben Cornelia (42) eine dicke Köchin und Fred (29, guter Kollege von Sam) sehr viel Stress. Das Essen kommt verspätet. Kellnerinnen sind Jessica (22), die allerdings erst mit dem 18:45 Heli gekommen ist und Maria (27), welche am Nachmittag in einem leeren Zimmer ein Schläfchen hielt. Da dies verboten ist, tut sie geheimnisvoll was sie heute gemacht hat und weicht allen Fragen dazu aus.<br />
<br />
Alle Spielenden nehmen den 18:45 Heli ausser Leonhard, der um 18:30 mit einem Privat-Flug extra für ihn zum Hotel gelangt.<br />
Leonhard hat die 401, die grösste Suite in Süddeutschland, Leonie die 402 und Ralph Jost erhält die 403. weil die normalen Zimmer überbucht sind.<br />
<br />
Um 20:00 kommen 3 schwarze Kampfhubschrauber beim Hotel an mit insgesamt 18 Mann, alle schwarz gekleidet und mit russischem Akzent. Sie wollen Geiseln nehmen und Geld erpressen. Alle Gäste und das Personal, welche sich im EG befinden zu dieser Zeit, werden umgehend in die Toiletten gesperrt. Allen werden die Handys abgenommen. Die Handys werden alle zerstört. Alle werden gefilzt. 4 Mann mit AK 47 bewachsen sie. Die anderen 14 gehen durch die Zimmer, nehmen allen Gästen das Handy ab. (Ab 19:30 kein Handynetz mehr vorhanden, Telefon & Internet auch gekappt) und die Schlüssel und sperren sie in ihre Zimmer ein.<br />
<br />
Die Suiten-Bewohner werden so oder so ins Zimmer 401 geführt und als spezielle Geiseln verwendet. Friedhelm verbarrikadiert sich in seinem Büro. Er ist ein früherer Offizier und er hat eine Pistole mit 45 Schuss. Die Geiselnehmer gehen nicht in den Keller. Dort halt sich Ralf versteckt. Sonst kein Personal mehr, denn die Wäscherei machte um 17:00 Feierabend.<br />
<br />
Postierung: Anführer und 3 Mann in 401 + 3 Geiseln. 4 Mann bei den Toiletten. 2 Mann pro Stockwerk (=8); 2 Mann vor dem Büro des Direktors. Ausser dem Anführer versteht keiner Deutsch, manche polnisch, manche russisch. Geben auf Deutsch wortkarge Befehle.<br />
Anführung ist Dimitri Jatov (47), ein Russe. Er ist Gangster und Ex Armee-Soldat und eine kleine Armee von Ex-Soldaten aufgebaut, um mit einem oder zwei Coups den Lebensabend finanziert zu haben. Er geniesst die Macht, geniesst die Vorzüge der Suite. Die 3 Geiseln werden nicht gefesselt. Er erkennt Leonhard als sehr reichen Mann und will ihn separat auch noch erpressen. Dimitri hat ein Satelliten-Telefon und ruft den Ministerpräsidenten von Baden-Würtemberg an. Er fordert 1 Million pro Geiseln (und von Leonhard noch 3 Milliarden für die 3 Geiseln).<br />
Dimitri kann von Leonie beeinflusst werden. Allerdings nicht genug um sie frei zu lassen.<br />
<br />
Die Gästin Rebecca James, Zimmer 207, ist eine CIA Agentin, die hier Urlaub machte (offiziell, inoffiziell beschattet sie tatsächlich Leonhard, da die CIA sich fragt, ob er in kriminelle Machenschaften verwickelt ist. Sie wird in ihrem Zimmer eingesperrt, befreit sich aber um 20:45 daraus. Sie hat ein Sniper-Gewehr mit Betäubungsmunition sowie eine Schallgedämpfte Pistole. Sie schaltet die beiden Männer auf Stock 2 aus hört den Funk ab (Sie kann russisch) und macht sich auf in Zimmer 401 die Geiseln zu befreien. Sie kommt um 21:00 dort an. Sie wirf eine Blendgranate in den Raum und betäubt die 3 Bewacher. Dimitri verfehlt sie aber. Dimitri ist im Whirpool zu dem Zeitpunkt. Rebecca scheucht die 3 Geiseln aus dem Zimmer und auf das Dach um dort einen Plan auszuhecken. Dimitri kann keine Verbindung mehr mit der Aussenwelt aufnehmen, da das Satelliten-Telefon bei Rebeccas Aktion zu Bruch ging.<br />
<br />
Dimitri sammelt seine Männer neu und postiert sie ab 21:15 wie folgt:<br />
2 Männer pro Stock, 4 Männer im EG, 2 Männer bei den Hubschrauber, 3 Betäubt in 401, Betäubung wirkt ca. 2h Stunden. Dimitri im EG. Rebeccas Ziel ist, mit einem Helikopter zu fliehen und Hilfe zu holen. Sie hat neben den Waffen auch eine Taschenlampe dabei und trägt Kampfmontur (Kampfstiefel, Tarnhose, blaues Top, schwarzes Cap). Sie mag Leonhard nicht, behandelt ihn aber höflich.<br />
Sie wird um 22:30 einen Versuch wagen durchs Hotel zu kommen. Ohne Hilfe schaltet sie in Sock 4 beide Wachmänner aus, nimmt den Aufzug und wird im EG an der Tür erschossen. Mit Hilfe wird es ausgespielt. Sie kann sehr gut schiessen, ist im Nahkampf aber nur so naja. Sie hat keine Blendgranate mehr nach dem sie die Suiten-Geiseln befreit hat.<br />
<br />
Um 03:00 stürmt die Polizei das Hotel, Männer Seilen sich aufs Dach ab. Die Helikopter werden nach und nach zur Explosion gebracht. Sie befreien alle Geiseln und töten alle Geiselnehmer. Sie entdecken auch Natalie, falls diese im Vorratsraum tot sein sollte. Einige Polizisten sterben dabei. Die Geschichte um Friedhelm Weiss und Natalie wird durch die Polizei nicht ermittelt und aufgedeckt.<br />
<br />
=== Anna`s Geschichte ===<br />
Anna erhält umm 12:00 einen Anruf von deine Bruder Sam. Er teilt ihr mit, dass er seit längerem versucht, seinem Chef Friedhelm Weiss etwas Illegales nachzuweisen, um ihn zu erpressen, weil er sich gegenüber seiner Freundin, die Nichte von Friedhelm, Natalie ständig negativ über Sam auslässt. Sam erzählt Anna, was er bis dahin von der Geschichte mit Friedhelms Frau macht. Er sagt, dass er um 16:00 wieder anruft. Tut er dies nicht, soll Anna unbedingt zum Mountain View kommen und nach dem Rechten sehen. Anna hat das Gefühl, ihr Bruder übertreibt etwas, macht sich aber dennoch auf den Weg mit dem 18:45 Heli und kommt beim Hotel an. Sie hat keine Zimmer Reservierung und will die Nacht eigentlich nicht da verbringen.<br />
Da die Geiselnehmer sie nicht zuordnen können kommt sie mit den anderen Suiten-Besitzer (die anderen 3 Spielenden) in Raum 401. Ausser sie befindet sich bei der Geiselnahme schon in einem Zimmer, dann wird sie in dieses gesperrt und erst später (aber noch vor Rebeccas auftauchen im Zimmer 401) ins Zimmer 401 geführt.<br><br />
=== Weitere Figuren (für mehr Infos siehe Charakterbögen) ===<br />
Weitere Figuren: Gäste in der Toilette sind Wanda Jade, eine Ärztin. Sie kann Verwundete versorgen und Lebenspunkte zurückgeben. Weitere Gäste sind Petr Sykora, ein tschechischer Geschäftsmann, sehr ängstlich, Walter Teberon, ein grossmäuliger Texaner und seine Frau Jessica Teberon eine hübsche aber recht dumme junge Frau. Dann Waldemar Löffel und Dorothee Neumaier, die eine heimliche Affäre hier im Mountain View ausleben wollten. Er Bauer, sie Professorin an der Universität für Chemie. Grosses chemisches Wissen. Tom Rudolf schliesslich ein neureicher, verwöhnter 16-Jähriger Teenie, dessen Eltern heute eine 2 tägige Wanderung angetreten sind. Und Antoinette DuBois, eine Französis, 52, die leider kaum Deutsch versteht. Sie ist Bäckerin von Beruf und hat den Aufenthalt in einem Gewinnspiel gewonnen.<br />
Gäste im Zimmer sind Henry Dufour, 82, ein alter Franzose, Zimmer 308, Pascal & Viola Stenzel die als Reiseblogger arbeiten mit den Kindern Samira (8) und Joshua (5) in 205. Ruben Vektor (72), Zimmer 211, der stets im Anzug rumläuft und wenig spricht. Er ist Schweizer, Verwaltungsrat der SBB, Bähnler und ist heimlich homosexuell. Er trifft sich gerne mit Rainer Meiner (32), Zimmer 102, der als Call-Boy für homosexuelle ältere Herren arbeitet. Brunhilde & Hildegard von Wasserschneidt-Lohnsteiner, 2 adelige Schwestern, nicht sehr reich, aber dafür sehr arrogant, Zimmer 312. Sie interessieren sich für Klatch & Tratsch und geben den Spielenden den Hinweis dass Martin Liefers mit der Frau von Friedhelm Weiss wohl intim war.<br />
<br />
Für weitere Informationen zu den NPCs liess dir Bitte die Charakterbögen durch.<br />
<br />
[[Datei:Charakterbogen NPCs Hauptpersonen.pdf{{!}}mini]]<br />
<br />
[[Datei:Charakterbogen NPCs Zimmerpersonen.pdf{{!}}mini]]<br />
<br />
[[Datei:Charakterbogen NPCs Geiseln.pdf{{!}}mini]]<br />
<br />
Zeitungsartikel der sowohl von Martin Liefers erhalten werden kann als auch im Safe von Friedhelm Weiss gefunden werden kann.<br />
<br />
[[Datei:Zeitungsartikel.pdf{{!}}mini]]<br />
<br />
== Ablauf ==<br />
Anhand der Zeitleiste mit allen Ereignissen als Übersicht für den Spielleiter bzw. die Spielleiterin<br />
<br />
=== Vorgeschichte ===<br />
<br />
14:00 Konfrontation Sam & Friedhelm mit Prügel für Sam. Sam ab 14:30 in Werkstatt. Keine Zeugen. Zettel von Sam (Brauche Hilfe, bin in Werkstatt, Sam) zu Nicole.<br />
<br />
16:00 Natalie konfrontiert ihren Onkel im Büro. Sie macht im Vorwürfe wegen Sam. Friedhelm gibt zu dass er Sam verprügeln liess und sagt er hätte die Polizei gerufen. Natalie konfrontiert Friedhelm damit, dass er Carole umgebracht hätte und sie wisse das. Daraufhin verprügelt Friedhelm sie, fesselt und knebelt sie und lässt sie von Ralf in den Vorratsraum bringen. Er erzählt Ralf Natalie wäre auf ihn losgegangen und er würde sie auch verhaften lassen. Zeugen des Abfall-Wagens: Piere, Nicole, Cornelia, Fred <br />
<br />
17:00 Natalie wird im Abfallwagen versteckt von Ralf durch die Küche in den Vorratsraum gebracht. <br />
<br />
=== Intro ===<br />
18:30 Ankunft Leonard Henckel v. & z. Dommersmark in eigenem Helikopter<br />
18:45 Ankunft der anderen Spielenden<br />
<br />
Für die Stockwerke in denen sich die Spielenden befinden, erhalten sie die jeweilige Karte zur besseren Orientierung.<br />
<br />
=== Die Geiselnahme ===<br />
19:30 Ankunft Geiselnehmer. Die Spielenden werden alle in die Suite 401 geführt. Dimitri erkennt Leonhard und will von ihm 4 Millionen in Bar. Leonhard soll das organisieren (Leonhard kann das tun mit einem Telefon von Dimitri, da er genug Geld und Leute hat, will es aber nicht). Dimitris Ziel ist es mit Leonhard und anderen Geiseln zu einem Übergabe-Ort zu fliegen wo er das Geld erhält. Allerdings will er natürlich bei der Gelegenheit auch noch die anderen Reichen Geiseln ausnehmen<br />
<br />
Ab 20:15 haben die Geiselnehmer im Herrenzimmer im EG ein Gerät aufgebaut, welches verhindert dass man mit einem Smartphone, PC oder Tablet Empfang hat. Sowohl Internet wie auch Telefon-Funk funktionieren nicht mehr. <br />
<br />
Bis 20:15 alle Geiseln in Toiletten, Zimmern oder Suiten. Folgende Aufteilung der Geiselnehmer 4x EG; pro Stock 2, 2 Hubschrauber, 3 Suite 401 + Dimitri 401<br />
<br />
20:30 Dimitri macht es sich im Whirlpool bequem. Dimitri ist der einzige der Geiselnehmer der gebrochen Deutsch spricht. Die Spielenden können mit ihm interagieren, dass sie freigelassen werden (z.B. via Betören; Manipulieren) ist jedoch hier nicht möglich<br />
<br />
=== Erste Befreiung ===<br />
20:45 Rebecca James verlässt ihr Zimmer (207), betäubt 2 Wachen auf Stock 2 und 2 Wachen auf Stock 4. Kommt um ca. 20:50 in Zimmer 401. Blendgranate. Ca. 10 Sekunden Zeit um mit ihr zu flüchten aufs Dach. Dies sollten alle Spielenden tun, ist aber nicht zwingend. Kampf mit den 3 Wachen in 401 wird ausgespielt (gewürfelt), falls die Spielenden nicht innerhalb 10 Sekunden mit Rebecca fliehen. Rebecca hat in Pistole nur Betäubungsmunition und nur im Sniper-Gewehr richtige Munition. Allerdings dort nur 5 Schüsse. <br />
<br />
In der Regel sind dann alle Spielenden auf dem Dach mit Rebecca. Ab hier sind die Spielenden sehr frei, wie sie vorgehen wollen. Rebeccas Ziel ist es, möglichst alle Geiseln zu befreien. Rebecca James möchte möglichst nicht offen kämpfen, da die Geiselnehmer in der Überzahl sind. Sie ist bereit dass die Gruppe Risiken eingeht, will jedoch ein unnötiges Blutvergiessen verhindern. Gegen Leonhard hat sie eine spürbare Abneigung.<br />
<br />
Die Spielenden können klettern, sich abseilen (wenn jemand Seil im Inventar hat) schleichen oder kämpfen um vom Dach runterzukommen. Werden sie erneut gefangen genommen z.B. bei einem Kampf, verlieren sie ihr Inventar und kommen erneut ins Zimmer 401. Rebecca kann in diesem Fall fliehen, einen Helikopter stehlen und verspricht Hilfe zu organisieren. Ggf. kann der Spielleiter auch Rebecca mit 1-2 Geiseln aus den Zimmer die Spielenden nochmals befreien falls es diesen nicht gelingt selber zu entkommen<br />
<br />
Falls die Spielenden sich abseilen und selber einen Helikopter stehlen wollen verhindert Rebecca dies und fliegt nur alleine los. Sie hat nämlich Angst bei der Kommunikation mit der Polizei enttarnt zu werden, da sie eine heimliche CIA Agentin ist.<br />
<br />
=== Böses Erwachen ===<br />
21:00 Natalie erwacht schwer geschwächt aus der Ohnmacht. <br />
<br />
21:15 Dimitri stellt seine Männer neu auf: 11-14: 4x EG, 2 Hubschrauber, 2 Eingang zum Dach (Stock 4), 2 weitere Stock 4, Rest patrouilliert auf den Stöcken 1-3 in unregelmässigen Abständen hin und her. <br />
<br />
22:30 Friedhelm Weiss verlässt mit dem Gift aus seinem Safe sein Büro. Er schleicht sich in den Vorratsraum, und vergiftet dort die gefesselte Natalie falls diese noch da ist und kein Spielender da ist. Falls sich ein Spielender im Raum befindet, versucht Friedhelm sich herauszureden und auf gut Freund zu machen, hat sicherheitshalber aber seine Pistole dabei. <br />
<br />
23:15 Friedhelm schmeisst Natalie über die Klippen (falls er nicht abgelenkt ist logischerweise und sie noch im Vorratsraum). Sie kann allerdings noch mit den Hubschrauber (mit Suchscheinwerfer und bei gezielter Suche, nicht Random beim Drüberfliegen, gefunden werden, weil der Wurf von Friedhelm nicht gut gelingt.<br />
<br />
Falls Rebecca von der Gruppe auf dem Dach (oder sonst wo) zurückgelassen wurde und noch nicht mit einem Helikopter geflüchtet ist:<br />
23:30 Rebecca James schaltet die beiden Wachen der Helikopter mit dem Scharfschützen-Gewehr aus. Sie unternimmt eine Versuch durchs Hotel zu kommen. Denn sie weiss, in gut 30 Minuten wachen die ersten Betäubten wieder auf. Sie schaltet die 4. Im 3 Stock aus, wird da aber schon ins Bein geschossen. Nimmt den Lift ins EG und wird von den dortigen 4 Wachen erschossen. Mit Hilfe wird es natürlich ausgespielt. <br />
<br />
00:00 Die 4-7 Anfangs betäubten Wachen sind alle wieder einsatzfähig. Die Wachen werden übrigens in Zimmer 401 verwahrt bis sie wieder aufwachen.<br />
<br />
=== Showdown ===<br />
01:00 Polizeihubschrauber erscheinen am Himmel, blieben aber relativ weit oben. Es gibt die erste Lautsprecherdurchsage, dass die Polizei nun das Haus umstellt hat. Die Hubschrauber (mindestens 5) kreisen um das Hotel. Sie werden wohl auch einen Abflug der gelandeten Hubschrauber nicht zulassen (ausser es sind Geiseln an Bord).<br />
<br />
01:00 Dimitri wählt Random 5 Geiseln aus und bereitet den Rückzug vom Hotel vor. Ihm ist bewusst dass die Polizei nicht landen kann. Mit den 2 Getöteten hat er allerdings die beiden anderen Piloten verloren. Daher kann er nur noch 1 Hubschrauber benutzen. Er lässt 5 Geiseln in Hubschrauber 1 und 2 Wachen. <br />
<br />
01:00 Natalie stirbt wenn sie keine Hilfe erhalten hat am Gift.<br />
<br />
01:15 Dimitri erklärt 4 seiner Soldaten bei Hubschrauber 3 wie sie einen Hubschrauber steuern. Er muss nun in kurzer Zeit Piloten finden. <br />
<br />
01:30 Warnungen der Polizei die Geiselnehmer müssen sich ergeben, andernfalls wird die Polizei das Hotel stürmen.<br />
<br />
02:30 der Hubschrauber mit 4 Soldaten und 5 Geiseln verlässt das Hotel. Er wird von den Polizeihubschraubern verfolgt aber nicht angegriffen.<br />
<br />
03:00 Die Polizei stürmt mit einem riesigen Aufgebot das Hotel. Gleichzeitig seilen sich Spezialeinheiten aufs Dach ab, ein Polizeihelikopter landet und das Hotel wird gestürmt. Es kommt zum Kampf. Dimitri kann mit Hubschrauber 1 mit 5 Geiseln und 2 Soldaten fliehen. <br />
<br />
Damit endet das Abenteuer. Sam wird im Werkraum befreit, Ralph verhaftet, Friedhelm hat Selbstmord begangen und die Spielenden kehren in ihr normales Leben zurück.<br />
<br />
== Karten ==<br />
=== Karten für die Spielenden ===<br />
<br />
[[Datei:Karte für Spielende.pdf{{!}}mini]]<br />
<br />
=== Karten für den Spielleiter/die Spielleiterin ===<br />
<br />
[[Datei:Karte für Spielleiter.pdf{{!}}mini]]<br />
<br />
== Über den Autor & Motivation für die Geschichte ==<br />
<br />
Mein Name ist Adrian, ich bin 1993 geboren und wohne in der Schweiz. Durch Moriton Manor und dann auch die anderen Pen & Paper von den Rocketbeans & Hauke kam ich zu Pen & Paper. Weil ich selber mal eines machen wollte habe ich, ohne Erfahrung als Spielender, ein Pen & Paper geschrieben und dann gleich mit 2 verschiedenen Gruppen durchgeführt. Dieses hier ist es nun also, mein erstes eigenes Pen & Paper. <br />
<br />
Mein Ansatz war ähnlich wie bei Moriton Manor & Dysnomia, dass es eine abgeschlossene "Welt" gibt in der Dinge passieren und die Spielenden können sich relativ "frei" darin bewegen und frei entscheiden zu welchem Zeitpunkt sie was machen. Allerdings werden sie besonders am Anfang durch die Ereignisse der Geiselnahme und Befreiung etwas schlauchartig geführt. Dies geschieht bewusst, damit die Gruppe eine Motivation bekommt und auch als Team zusammenfindet dass nun durch die Umstände ein Team ist. <br />
<br />
Die Durchführung hat den Spielenden und mir sehr viel Spass gemacht. Als Spielleiter habe ich, logischerweise, oft auch improvisiert was NPCs und Ereignisse angeht. Der hier vorliegende Ablauf dient als Sicherheit, muss aber logischerweise dynamisch umgesetzt werde.<br />
<br />
Ich freue mich sehr falls jemand dieses Abenteuer nachspielen möchte und würde mich freuen über Nachfragen oder Feedback zu diesem Pen&Paper.<br />
<br />
[[Kategorie:"Wilde" Abenteuer]]</div>TheGamer93https://howtobeahero.de/index.php?title=Schwarzw%C3%A4lderTote&diff=32737SchwarzwälderTote2022-05-09T20:20:17Z<p>TheGamer93: zu Wilde Abenteuer hinzugefügt</p>
<hr />
<div>'''Wo spielt das Abenteuer?:''' In einem Hotel im Schwarzwald, dem Mountain View<br />
<br />
'''Wann spielt das Abenteuer?:''' Heutige Zeit<br />
<br />
'''Nach welchen Regeln spielt das Abenteuer?:''' How to be a Hero Grundregeln, grundsätzlich erweiterbar<br />
<br />
'''Für wie viele Leute ist es gemacht?:''' 3 bis 5 Spieler, ausgelegt und ideal ist das Abenteuer aber für 4 Spielende<br />
<br />
'''Schwierigkeit für den Spielleiter:''' einfach (war mein erstes P&P als Meister)<br />
<br />
'''Schwierigkeit für die Spieler:''' Für Anfägner: Mittel bis Schwer - Für Fortgeschrittene: Leicht bis Mittel<br />
<br />
'''Spieldauer:''' 4 - 6 Stunden<br />
<br />
== Klappentext ==<br />
Das Mountain View ist ein richtiges Luxus-Hotel und enthält die grösste Suite in Deutschland. Hier gehen die Schönen und vor allem die Reichen ein und aus. Speziell am Mountain View ist, dass es auf einem Felsplaton liegt und nur via Helikopter erreichbar ist. Es gibt weder Strassen noch Fusswege zum Hotel. Hier treffen unsere 4 Helden und Heldinnen zufällig zusammen. Sie werden Teil einer spektakulären Geiselnahme und müssen trotz ihrer Unterschiedlichkeit zusammenarbeiten um zu überleben. Während ihrem Abenteuer stellen sie aber nach und nach fest dass die Geiselnehmer nicht die einzigen Menschen im Hotel sind mit unlauteren Absichten...<br />
<br />
{{Disclaimer}}<br />
<br />
== Hinweise für den Spielleiter ==<br />
Das Abenteuer spielt in der jetzigen Zeit im Schwarzwald in unserer Welt.<br />
Es gibt vor allem am Anfang einige Ereignisse welche die Spielenden nicht verhindern können. Danach sind sie aber völlig frei, wie sie das Abenteuer meistern möchten. Wie in der echten Welt finden die Ereignisse statt unabhängig aber nicht unbeeinflussbar von den Spielenden. Also wenn in Raum X um 21:00 jemand erschossen wird geschieht das. Wenn die Spielenden vorher im Raum sind, entdecken sie nichts. Wenn sie während dem Ereignis im Raum sind, können sie es ggf. verhindern oder verändern. Wenn sie den Raum erst danach entdecken finden sie ggf. eine Leiche. <br />
<br />
Die Spielenden können das Abenteuer auch überleben bzw. beenden ohne je mit der Hintergrund-Story in Kontakt gekommen zu sein.<br />
<br />
Ich habe als Ersteller des Abenteuers ebenfalls Personenbeschreibungen für die Spielenden erstellt. Es sind 4 Charaktere die zufällig im Hotel zu Gast sind und sich nicht kennen. Besonders Anfänger*innen sind froh um die Anhaltspunkte. Bei der Durchführung haben sich die Spielenden auch ihrer Rolle entsprechend verkleidet. Das ist natürlich optional und am besten gibst du als Spielleiter*in vor ob ihr das als Gruppe machen wollt oder nicht. <br />
<br />
Natürlich können die Spielenden auch eigene Charaktere erstellen, falls sie nicht vorgeschriebene Charaktere spielen wollen. In dem Fall muss sich der Spielleiter jedoch überlegen, wie er die Funktion der Rolle Anna Rast ersetzt, da diese als Einzige Rolle eine Verbindung zur Hintergrund-Geschichte hat. Natürlich kann aber auch eine andere Rolle die Schwester/Bruder/anderer Verwandter von Sam darstellen und von ihm kontaktiert worden sein (Siehe Grundlegende Hintergrund Geschichte und Personenbeschreibung von Anna Rast)<br />
<br />
Alle einzelnen Dokumente (Personenbeschreibung; Hintergrund-Geschichte; Charakterbögen der NPC; Zeitleiste; Zeitungsartikel etc. findet man auch als PDFs, wo es übersichtlicher ist als die Darstellung in diesem Wiki).<br />
<br />
== Personenbeschreibungen der Spielenden (falls sie keine selber erstellte Charaktere spielen wollen) ==<br />
=== Leonhard Henckel von und zu Dommersmark (32) ===<br />
Du bist Sohn einer sehr vermögenden deutschen Adelsfamilie. Deine Familie gehört zu den reichsten 100 der Welt. Allein auf deinen Konten liegen mehrere Milliarden. Du wurdest von deinen Eltern verwöhnt und hast noch nie im Leben gearbeitet. Jedoch hast du eine sehr gute Schule besucht und hast ein riesiges Allgemeinwissen. Deine Familie lebt nach dem Motto «Wissen ist Macht» und das Einzige was deine Eltern je von dir verlangt haben ist, dass du dich stets weiterbildest. Du kannst daher mindestens eine Fremdsprache sehr gut.<br />
Du behandelst alle Menschen arrogant von oben herab und variierst dabei nur ob du Beleidigungen offen aussprichst oder in deiner gehobenen Sprache versteckst. Du stehst gerne im Mittelpunkt. Wenn du den Raum betrittst soll das ruhig jeder Anwesende merken. Du sprichst in der Regel gehoben, die Zunge des Pöbels ist dir fremd. Zur Zunge des Pöbels gehören auch Dialekte wie Bayerisch, Schweizerdeutsch oder Österreichisch. Du sprichst und verstehst ausschliesslich Hochdeutsch. Du bist der festen Überzeugung aufgrund deines Reichtums besser und wichtiger zu sein als alle anderen Menschen. Die einzigen Menschen, denen du auf Augenhöhe begegnest, sind jene, die dir glaubhaft dein Eindruck vermitteln können, sie haben mindestens genauso viel Geld wie du.<br />
Du stehst auf Frauen, strebst aber keine Beziehung an. Im Gegenteil. Du bezeichnest Frauen oft als ein Hobby oder netten Zeitvertreib und behandelst sie auch so. Du lässt dich auf Frauen ein, die sich von deinem Auftreten beeindrucken lassen, lässt sie aber ausnahmslos alle nach einer Nacht links liegen. Die Namen der weiblichen Körper mit denen du dich vergnügst, merkst du dir nicht. Denn du sammelst nur nützliches Wissen.<br />
Aufgrund deiner vielen Tagesfreizeit machst du dir einen Spass daraus andere Menschen zu belehren und/oder für dich arbeiten zu lassen. Du kannst überzeugend sein und bist geübt im Manipulieren und Belügen von Menschen. Da dir oft langweilig ist, hast du nichts gegen etwas Nervenkitzel einzuwenden und suchst das Abenteuer.<br />
<br />
Werte 1 Fremdsprache (Min 50); Manipulieren (Min 70); Lügen (Min 40) Wissen: Min. 3 Themengebiete Min 40<br />
<br />
Inventar: Unmengen an Bargeld in verschiedenen Währungen. Mindestens 3 Kreditkarten; Neues Smartphone Beziehung zu den anderen Personen Du kennst keine der anderen Personen.<br />
<br />
Kleidung: Du kleidest dich ausschliesslich elegant und vornehm. Der Massgeschneiderter Anzug ist deine Alltagskleidung. Sogar deine Unterwäsche und dein Schlafanzug sind massgeschneidert.<br />
<br />
Ziele<br />
- Überlebe<br />
- Optionale Ziele<br />
o Amüsiere dich auf Kosten anderer<br />
o Finde Frauen mit denen du Sex haben kannst<br />
o Such den Nervenkitzel<br />
<br />
=== Leonie Weber (25) ===<br />
Du bist sehr attraktiv. Beruflich hast du lange im Detailhandel gearbeitet und in einer Papeterie Regale aufgefüllt und Kunden beraten. Doch dies gehört der Vergangenheit an. Du wurdest von mehreren Männern, mit denen du eine Beziehung hattest, tief verletzt und sinnst darum auf Rache. Die gestaltest du so dass du (vor allem reiche und arrogante) Männer verführst und dich als leicht zu haben ausgibst. Ausnahmslos alle diese Begegnungen laufen so ab, dass du die Männer verführst, ans Bett fesselst und ihnen den Inhalt ihres Portemonnaies stiehlst. Bei besonderer Unsympathie gibst noch einen Tritt in die Weichteile und dann bist du verschwunden. Natürlich nennst du nie deinen richtigen Namen beim Kennenlernen, damit keiner dieser Männer dich je wiederfindet. Von deiner Masche kannst du mittlerweile sehr gut leben.<br />
Du stammst aus einer ärmeren Familie, kannst dir mittlerweile aber auch einen etwas gehobeneren Lebensstil leisten. Du begegnest allen Männern eher misstrauisch und etwas arrogant. Erst wenn sich zeigt, dass die Männer weder Frauen benachteiligen noch in Frauen reine Sex-Objekte sehen, lässt du dich dazu herab, ihnen respektvoll zu begegnen. Frauen gegenüber bist du offen und liebevoll. Du gibst z.B. weiblichen Kellnerinnen immer doppelt so viel Trinkgeld wie männlichen Kellnern. Du kümmerst dich auch um Frauen, wenn diese Hilfe brauchen und bist Mitglied in 3 verschiedenen feministischen Vereinigungen.<br />
<br />
Wenn du einen Raum betritts schauen viele Männer dir nach. Das ist dir bewusst und du weisst die Aufmerksamkeit für dich zu nutzen. Du kannst sehr gut flirten und Leute, besonders Männer, beeinflussen. Sei es, um dir beim Umzug zu helfen oder den Drink an der Bar gratis zu bekommen. Du wickelst fast alle um den kleinen Finger. Du hast ein normales Allgemeinwissen.<br />
<br />
Werte: Beeinflussen Min 70; Flirten Min 30; Täuschen Min 70; Wissen über Papier; Stifte & Papeterie-Artikel. Min 40 Kicken Min 30<br />
<br />
Inventar: Etwas Bargeld; Handschellen, 4 Halstücher (welche du i.d.R. als Fesselwerkzeug benutzt), 1 Beauty Case; Auto-Schlüssel, Smartphone <br />
<br />
Kleidung: Du kleidest dich ausschliesslich elegant. Du trägst stets ein elegantes Kleid und High Heels. Bei Kälte ergänzt du dies mit Strumpfhosen und einem vornehmen Mantel.<br />
<br />
Ziele<br />
- Überlebe<br />
- Optionale Ziele<br />
o Finde Männer die auf deine Masche hereinfallen und stiehl ihnen Geld <br />
o Hilf anderen Frauen, wenn diese Hilfe brauchen.<br />
<br />
=== Ralph Jost (42) ===<br />
Du bist dick. Und zwar richtig dick. Als du dich vor gut 10 Jahren das letzte mal gewogen hast, kamen gut 140kg auf die Waage. Du bist leider mit 175cm auch nicht der grösste. Dein unattraktives Äusseres beschäftigt dich sehr, aber dass zeigst du niemals, im Gegenteil, du lächelst Sprüche und Beleidigungen einfach weg.<br />
Du trägst eine ziemlich nerdige Brille und bist auch ein ziemlicher Nerd. Du arbeitest als Filmkritiker und kennst unglaublich viele Filme. Auch kennst dich aus in fiktiven Welten wie Star Wars, Herr der Ringe, Harry Potter, Game of Thrones etc. etc. Du kannst ziemlich gut im richtigen Moment Filmzitate platzieren, da dir zu jeder Situation im Leben ein passendes Filmzitat einfällt. Du hast auch sonst ein grosses Allgemeinwissen.<br />
<br />
Filme sind deine Welt und in der Film-Community bist du aufgrund deines Wissens und deines Berufes sehr angesehen. Daher fühlst du dich am wohlsten, wenn du über Filme sprechen kannst und sie sind dein Small Talk Thema Nr. 1.<br />
Du stehst auf Frauen und suchst ihre Nähe, gibt’s dich stets als nett und hilfsbereit aus. Du hattest zwar schon 1-2 Beziehungen, doch leider wirst du oft gefriendzoned. Trotzdem oder auch gerade deshalb fehlt dir das Selbstbewusstsein, um Gegenüber Frauen stark und selbstbewusst aufzutreten, sondern gibst wie du bist: kumpelhaft.<br />
<br />
Du hast ein grosses Herz, bist grosszügig, bescheiden und hilfsbereit. Du wirkst grundsätzlich vertrauenswürdig und überhaupt nicht bedrohlich auf andere. Du bist ein ruhiger Mensch und suchst stets den Frieden, trittst daher auch oft als Schlichter aus. Du bietest in Konflikten den Menschen Kompromisse an oder gibst lieber mal nach. Hauptsache du bist mit möglichst jedem Menschen im Reinen. Du begegnest grundsätzlich jedem Menschen offen und respektvoll, aber wenn dich jemand beleidigt, ziehst du dich von dieser Person zurück. In ganz seltenen Fällen setzt du dich auch zur Wehr.<br />
<br />
Werte: Wissen über Filme Min 80; Wissen fiktive Welten Min 50; Sportliche Aktivitäten Max 10. Small Talk Min 50; Schlichten Min 50<br />
<br />
Inventar: Etwas Bargeld; Ein Laptop mit DVD Laufwerk; Mindestens 5 Filme; Auto-Schlüssel, Ein Flachmann gefüllt mit Single Malt Scotch Whiskey (man gönnt sich ja sonst nichts); Smartphone<br />
<br />
Kleidung: Du kleidest dich ausschliesslich bequem. Du trägst ein weites T-Shirt und Schlabberhosen sowie Turnschuhe. Du achtest dich nicht sehr auf dein Äusseres, hast daher schon ausgewaschene Klamotten und eine eher verstrubbelte Frisur.<br />
<br />
Ziele<br />
- Überlebe<br />
- Hilf anderen Menschen, wenn diese Hilfe brauchen<br />
- Optionale Ziele<br />
o Sei mit allen Menschen in einer friedlichen, bereinigten Beziehung<br />
<br />
=== Anna Rast (18) ===<br />
Du bist eine junge Frau aus einem kleinen Dorf mit grossen Träumen. Du bist sportlich, auch attraktiv, aber zurückhaltend und schüchtern. Du stehst nicht gerne im Mittelpunkt und gehst Menschenmassen eher aus dem Weg. Du schätzt eher intimere Gespräche. Du bist offen, um mit Menschen in Kontakt zu treten. Dir ist Gerechtigkeit wichtig. Du bist bescheiden und hilfsbereit.<br />
Du stammst aus einer mittelständischen Familie und hast gerade das Gymnasium abgeschlossen. Deine grösste Leidenschaft und zugleich dein grösstes Hobby sind Pferde. Du hast ein grosses Wissen über Pferde und das Reiten und reitest zudem wirklich sehr gut. Auch sonst magst du Tiere sehr gerne. Deine Eltern haben entschieden dass du als Mädchen dich musst verteidigen können. Daher besuchst du seit 5 Jahren das Krav Maga und bist darin relativ gut (blauer Gurt)<br />
<br />
Du bist aus diesem Grund Vegetarierin. Du magst Menschen, die wie du bescheiden sind. Du bist zwar nicht aggressiv aber wenn dir jemand frech kommst, gibst du durchaus gerne mal zurück. Du hasst es, bemuttert zu werden und willst der Welt zeigen, dass du das Leben bereits jetzt alleine meistern kannst. Du teilst die Menschen relativ schnell ein in sympathisch und unsympathisch und sobald dir jemand unsympathisch ist, gehst du diesem Menschen konsequent aus dem Weg, scheust aber meistens die Konfrontation. Ausser es nervt dich zu sehr, dann gibst du schon mal zurück. Du neigst dazu bei Themen, welche dir wichtig sind impulsiv und emotional zu reagieren.<br />
Aufgrund deiner aber grundsätzlichen höflichen und zurückhaltenden Art wirkst du auf andere Menschen sehr glaubwürdig.<br />
<br />
Werte: Glaubwürdigkeit Min 50; Reiten Min 60; Wissen über Pferde & Tiere allgemein Min 40 Krav Maga Min 50; Wissen 1 Schwerpunkt Min 40;<br />
<br />
Inventar: Etwas Bargeld;; 1 Beauty Case; Notizen von dir bezüglich dem Gespräch mit Sam, Taschenlampe, Smartphone Beziehung zu den anderen Personen<br />
<br />
Kleidung: Du trägst sportliche Alltagskleidung kombiniert mit flachen Stiefeln.<br />
<br />
Ziele<br />
- Finde Sam<br />
- Überlebe<br />
- Optionale Ziele<br />
o Hilf anderen Menschen, wenn diese Hilfe brauchen.<br />
<br />
==== Notiz aus deinem Gespräch mit Sam ====<br />
Du erhältst um 12:00 einen Anruf von deine Bruder Sam. Er teilt dir mit dass er seit einiger Zeit eine Freundin hat, Natalie. Sein Chef, Friedhelm Weiss, der Onkel von Natalie versucht aber ständig die Beziehung zu sabotieren und erzählt Natalie negative Sachen über Sam die nicht wahr sind. Um sich zu rächen sucht Sam seit Wochen etwas womit er Friedhelm erpressen kann. Heute wird er ihn konfrontieren. Er hat aber Angst. Du bist seine Rückversicherung. Sollte er sich nicht bis 16:00 wieder bei dir melden, musst du ihn unbedingt suchen kommen.&nbsp;<br><br>Um 16:00 und auch später meldete sich Sam nicht. Du bist hier, um ihn zu suchen. Du hast keine Zimmer-Reservierung und willst die Nacht nicht hier verbringen.<br />
<br />
== Grundlegende (Hintergrund-) Storyline == <br />
=== Vor der Ankunft der Spielenden ===<br />
Sam (22) arbeitet als Koch im Mountain View im Schwarzwald. Das Mountain View ist ein spezielles Luxus-Hotel, welches nur per Helikopter erreicht werden kann, da es auf einem Berg ist, umringt von undurchdringlichen, steilen Klippen.<br />
Sam freundet sich mit dem Zimmermädchen Natalie (19) an. Sie müssen jedoch ihre Liebe geheim halten. Denn Natalies Onkel Friedhelm Weiss ist der Direktor des Hauses. Er sieht in Natalie die Möglichkeit durch eine Heirat Mitglied einer sehr reichen Familie zu werden. Sie wohnt im Hotel und er sorgt für sie, denn ihre Eltern leben im Norden Deutschlands. Natürlich sagt er ihr dies nicht direkt, sondern bürdet Natalie viel Arbeit auf und versucht diskret, aber bestimmt, ihre Beziehungen zu sabotieren. Dabei lügt er sie auch schon mal was die Unzulänglichkeiten möglicher Liebhaber angeht.<br />
<br />
Er bemerkt, dass sie sich für Sam interessiert und macht ihn bei ihr schlecht. Er erzählt ihr Sam sei unreif und werde sie links liegen lassen, er sei noch nie treu gewesen etc. Sam hört eines Tages ein Telefon ab zwischen Friedhelm Weiss und Natalie ab. Er beschliesst jedoch, Friedhelm erst zu konfrontieren, wenn er diesen mit etwas Erpressen kann. Sam wollte schon immer Journalist werden und angetrieben durch seine Wut, stellt er Recherchen an über Friedhelm. Er findet heraus, dass dessen Frau vor 15 Jahren unter merkwürdigen Umständen starb. Sie soll Selbstmord begangen haben und sich beim Mountain View von der Klippe gestürzt haben. Ihre Leiche wurde nie gefunden.<br />
<br />
Sam versucht nun an Tag X um 14:00 im Büro des Direktors Beweise gegen ihn zu finden. Dabei wird er von Friedhelm allerdings erwischt. Dieser lässt den Hauswart Ralf, einen grossen und kräftigen Typ, der ihm stets ergeben ist, Sam verprügeln und in seine Werkstatt einsperren. Sam kann auf dem Weg dahin aber einen Zettel mit den Worten «Brauche Hilfe, bin in Werkstatt, Sam» fallen lassen. Tatsächlich findet Nicole, eine Kollegin von Natalie den Zettel und gibt ihn ihr. Natalie will Sam befreie und geht um 16:00 in die Werkstatt. Dort wartet allerdings Friedhelm auf sie und versucht ihr zu sagen, dass er Sam festhalte bis die Polizei komme und dass Sam ihn bestehlen wollte.<br />
Natalie glaubt Friedhelm nicht und attackiert Friedhelm und wirft ihm vor, damals seine Frau umgebracht zu haben. Sie führt aus, dass ihre Eltern diesen Verdacht auch schon hatten, es sich aber nie erhärten liess. Friedhelm verpasst ihr mehrere Ohrfeigen und Ralf fesselt sie mit Handschellen und Seilen. Er bringt sie um 17:00 in einem Abfallwagen nach draussen und sperrt sie in den Vorratsraum. Er bindet sie mit den Händen auf dem Rücken und gefesselten Beinen an ein Regal. Verbindet ihr Mund mit mehr Panzertape als nötig und schlägt sie dann mit einem Schlag brutal ko. <br />
<br />
=== Wichtige Informationen während dem Spiel ===<br />
<br />
Natalie hat schweren Schaden erlitten. Sie blutet daher aus der Nase. Sie trägt noch ihre Uniform. Sie wird um 21:00 frühstens wach und braucht ärztliche Hilfe um reden zu können. Sonst kann sie nicht wirklich klare Sätze von sich geben.<br />
<br />
Der Vorratsraum ist mit einem Vorhängeschloss gesichert, den Schlüsselt trägt Ralf bei sich. Friedhelm ist nicht klar, dass Natalie ohnmächtig ist und sterben wird.<br />
Sam ist in der Werkstatt und kann befreit werden. Er ist mit Handschellen gefesselt. Ralf trägt 2 verschiedene Schlüssel bei sich, den für Vorratsraum und den für die Handschellen von Sam. Der Schlüssel für die Handschellen von Natalie hat er ihr in den Mund gestopft, bevor er dieses zugetappt hat. Ralf war mal Security Arbeiter, hat daher die Handschellen und hat Erfahrungen in Kampfkünsten. Er ist ein starker Gegner im Nahkampf, aber nicht der Hellste. Er kann überlistet werden, wenn er glaubt, dass Friedhelm etwas befohlen hat.<br />
<br />
Friedhelm hat seine Frau damals mit Gift umgebracht und sie dann die Klippen hinabgestossen, weil sie ihn mit einem Gast betrogen hat. Er wird dieses Geheimnis aber nur verraten. wenn er wirklich glaubt sonst zu sterben. Der Gast war Martin Liefers, ein reicher Industrieller, Zimmer 301, der noch immer ab und zu im Hotel zu Gast ist. Er ist zwar sehr reich, aber nicht so reich wie Leonhard.<br />
Martin erzählt die Begebenheit, allerdings nur in einem intimen Gespräch an einem ruhigen Ort. Er übergibt dann der Person eine Haarlocke die er noch von Carol, Friedhelms Frau, hat.<br />
<br />
Friedhelm überlegt sich wie er Sam und Natalie loswerden kann. Bei Sam ist es einfach, er kann die Polizei anrufen und ihn verhaften lassen, denn sei Büro hat eine Überwachungskamera (Bildschirm ist auch im Büro, Passwort ist Carole) und Sams reinschleichen ist auf Video festgehalten. Natalie ist schwieriger, weil sie eigentlich nichts getan hat, aber er durch seine impulsives zurückschlagen sich verdächtig gemacht hat. Er beschliesst um 23:00 zu ihr hinzugehen, sie zu vergiften (Gift ist in seinem Safe, Kombination ist Carols Todesdatum 15.05.2007) und anschliessend ihre Leiche ebenfalls die Klippen runterzustürzen, was er um 23:30 auch tut, sofern Natalie noch da ist, vergiftet ist und er nicht abgelenkt ist. Er schleicht sich dafür aus dem Fenster, benutzt seinen Master Key für den Vorratsraum und vergifte Natalie.<br />
<br />
Nicole, das andere Zimmermädchen, dass nun als Bardame arbeitet, erzählt vom Zettel wenn sie gefragt wird oder das Gefühl hat, jemand kann ihr wirklich helfen. Sie ist sich unsicher wie ernst sie das Ganze nehmen soll. Es beunruhigt sie nur wie lange sie Natalie schon nicht mehr sah. Sie hat als Bardame den Abfallcontainer gesehen, der von Ralf um 17:00 aus dem Hintereingang gebracht wurde, dies aber nicht als auffällig taxiert.<br />
<br />
Der Concierce Piere ist ein Franzose und stets überfreundlich und überbemüht. Er wird wenig gemocht aber sehr geschätzt. Er kann einem mit seiner übereifrigen Art durchaus mal auf die Nerven gehen. Auch er hat von der Rezeption aus Ralf mit dem Abfallwagen gesehen, doch auch ihm ist das nicht auffällig erschienen.<br />
<br />
Friedhelm hat in der Küche verlauten lassen, dass Sam heute frei macht. Dadurch haben Cornelia (42) eine dicke Köchin und Fred (29, guter Kollege von Sam) sehr viel Stress. Das Essen kommt verspätet. Kellnerinnen sind Jessica (22), die allerdings erst mit dem 18:45 Heli gekommen ist und Maria (27), welche am Nachmittag in einem leeren Zimmer ein Schläfchen hielt. Da dies verboten ist, tut sie geheimnisvoll was sie heute gemacht hat und weicht allen Fragen dazu aus.<br />
<br />
Alle Spielenden nehmen den 18:45 Heli ausser Leonhard, der um 18:30 mit einem Privat-Flug extra für ihn zum Hotel gelangt.<br />
Leonhard hat die 401, die grösste Suite in Süddeutschland, Leonie die 402 und Ralph Jost erhält die 403. weil die normalen Zimmer überbucht sind.<br />
<br />
Um 20:00 kommen 3 schwarze Kampfhubschrauber beim Hotel an mit insgesamt 18 Mann, alle schwarz gekleidet und mit russischem Akzent. Sie wollen Geiseln nehmen und Geld erpressen. Alle Gäste und das Personal, welche sich im EG befinden zu dieser Zeit, werden umgehend in die Toiletten gesperrt. Allen werden die Handys abgenommen. Die Handys werden alle zerstört. Alle werden gefilzt. 4 Mann mit AK 47 bewachsen sie. Die anderen 14 gehen durch die Zimmer, nehmen allen Gästen das Handy ab. (Ab 19:30 kein Handynetz mehr vorhanden, Telefon & Internet auch gekappt) und die Schlüssel und sperren sie in ihre Zimmer ein.<br />
<br />
Die Suiten-Bewohner werden so oder so ins Zimmer 401 geführt und als spezielle Geiseln verwendet. Friedhelm verbarrikadiert sich in seinem Büro. Er ist ein früherer Offizier und er hat eine Pistole mit 45 Schuss. Die Geiselnehmer gehen nicht in den Keller. Dort halt sich Ralf versteckt. Sonst kein Personal mehr, denn die Wäscherei machte um 17:00 Feierabend.<br />
<br />
Postierung: Anführer und 3 Mann in 401 + 3 Geiseln. 4 Mann bei den Toiletten. 2 Mann pro Stockwerk (=8); 2 Mann vor dem Büro des Direktors. Ausser dem Anführer versteht keiner Deutsch, manche polnisch, manche russisch. Geben auf Deutsch wortkarge Befehle.<br />
Anführung ist Dimitri Jatov (47), ein Russe. Er ist Gangster und Ex Armee-Soldat und eine kleine Armee von Ex-Soldaten aufgebaut, um mit einem oder zwei Coups den Lebensabend finanziert zu haben. Er geniesst die Macht, geniesst die Vorzüge der Suite. Die 3 Geiseln werden nicht gefesselt. Er erkennt Leonhard als sehr reichen Mann und will ihn separat auch noch erpressen. Dimitri hat ein Satelliten-Telefon und ruft den Ministerpräsidenten von Baden-Würtemberg an. Er fordert 1 Million pro Geiseln (und von Leonhard noch 3 Milliarden für die 3 Geiseln).<br />
Dimitri kann von Leonie beeinflusst werden. Allerdings nicht genug um sie frei zu lassen.<br />
<br />
Die Gästin Rebecca James, Zimmer 207, ist eine CIA Agentin, die hier Urlaub machte (offiziell, inoffiziell beschattet sie tatsächlich Leonhard, da die CIA sich fragt, ob er in kriminelle Machenschaften verwickelt ist. Sie wird in ihrem Zimmer eingesperrt, befreit sich aber um 20:45 daraus. Sie hat ein Sniper-Gewehr mit Betäubungsmunition sowie eine Schallgedämpfte Pistole. Sie schaltet die beiden Männer auf Stock 2 aus hört den Funk ab (Sie kann russisch) und macht sich auf in Zimmer 401 die Geiseln zu befreien. Sie kommt um 21:00 dort an. Sie wirf eine Blendgranate in den Raum und betäubt die 3 Bewacher. Dimitri verfehlt sie aber. Dimitri ist im Whirpool zu dem Zeitpunkt. Rebecca scheucht die 3 Geiseln aus dem Zimmer und auf das Dach um dort einen Plan auszuhecken. Dimitri kann keine Verbindung mehr mit der Aussenwelt aufnehmen, da das Satelliten-Telefon bei Rebeccas Aktion zu Bruch ging.<br />
<br />
Dimitri sammelt seine Männer neu und postiert sie ab 21:15 wie folgt:<br />
2 Männer pro Stock, 4 Männer im EG, 2 Männer bei den Hubschrauber, 3 Betäubt in 401, Betäubung wirkt ca. 2h Stunden. Dimitri im EG. Rebeccas Ziel ist, mit einem Helikopter zu fliehen und Hilfe zu holen. Sie hat neben den Waffen auch eine Taschenlampe dabei und trägt Kampfmontur (Kampfstiefel, Tarnhose, blaues Top, schwarzes Cap). Sie mag Leonhard nicht, behandelt ihn aber höflich.<br />
Sie wird um 22:30 einen Versuch wagen durchs Hotel zu kommen. Ohne Hilfe schaltet sie in Sock 4 beide Wachmänner aus, nimmt den Aufzug und wird im EG an der Tür erschossen. Mit Hilfe wird es ausgespielt. Sie kann sehr gut schiessen, ist im Nahkampf aber nur so naja. Sie hat keine Blendgranate mehr nach dem sie die Suiten-Geiseln befreit hat.<br />
<br />
Um 03:00 stürmt die Polizei das Hotel, Männer Seilen sich aufs Dach ab. Die Helikopter werden nach und nach zur Explosion gebracht. Sie befreien alle Geiseln und töten alle Geiselnehmer. Sie entdecken auch Natalie, falls diese im Vorratsraum tot sein sollte. Einige Polizisten sterben dabei. Die Geschichte um Friedhelm Weiss und Natalie wird durch die Polizei nicht ermittelt und aufgedeckt.<br />
<br />
=== Anna`s Geschichte ===<br />
Anna erhält umm 12:00 einen Anruf von deine Bruder Sam. Er teilt ihr mit, dass er seit längerem versucht, seinem Chef Friedhelm Weiss etwas Illegales nachzuweisen, um ihn zu erpressen, weil er sich gegenüber seiner Freundin, die Nichte von Friedhelm, Natalie ständig negativ über Sam auslässt. Sam erzählt Anna, was er bis dahin von der Geschichte mit Friedhelms Frau macht. Er sagt, dass er um 16:00 wieder anruft. Tut er dies nicht, soll Anna unbedingt zum Mountain View kommen und nach dem Rechten sehen. Anna hat das Gefühl, ihr Bruder übertreibt etwas, macht sich aber dennoch auf den Weg mit dem 18:45 Heli und kommt beim Hotel an. Sie hat keine Zimmer Reservierung und will die Nacht eigentlich nicht da verbringen.<br />
Da die Geiselnehmer sie nicht zuordnen können kommt sie mit den anderen Suiten-Besitzer (die anderen 3 Spielenden) in Raum 401. Ausser sie befindet sich bei der Geiselnahme schon in einem Zimmer, dann wird sie in dieses gesperrt und erst später (aber noch vor Rebeccas auftauchen im Zimmer 401) ins Zimmer 401 geführt.<br><br />
<br />
=== Weitere Figuren (für mehr Infos siehe Charakterbögen)===<br />
Weitere Figuren: Gäste in der Toilette sind Wanda Jade, eine Ärztin. Sie kann Verwundete versorgen und Lebenspunkte zurückgeben. Weitere Gäste sind Petr Sykora, ein tschechischer Geschäftsmann, sehr ängstlich, Walter Teberon, ein grossmäuliger Texaner und seine Frau Jessica Teberon eine hübsche aber recht dumme junge Frau. Dann Waldemar Löffel und Dorothee Neumaier, die eine heimliche Affäre hier im Mountain View ausleben wollten. Er Bauer, sie Professorin an der Universität für Chemie. Grosses chemisches Wissen. Tom Rudolf schliesslich ein neureicher, verwöhnter 16-Jähriger Teenie, dessen Eltern heute eine 2 tägige Wanderung angetreten sind. Und Antoinette DuBois, eine Französis, 52, die leider kaum Deutsch versteht. Sie ist Bäckerin von Beruf und hat den Aufenthalt in einem Gewinnspiel gewonnen.<br />
Gäste im Zimmer sind Henry Dufour, 82, ein alter Franzose, Zimmer 308, Pascal & Viola Stenzel die als Reiseblogger arbeiten mit den Kindern Samira (8) und Joshua (5) in 205. Ruben Vektor (72), Zimmer 211, der stets im Anzug rumläuft und wenig spricht. Er ist Schweizer, Verwaltungsrat der SBB, Bähnler und ist heimlich homosexuell. Er trifft sich gerne mit Rainer Meiner (32), Zimmer 102, der als Call-Boy für homosexuelle ältere Herren arbeitet. Brunhilde & Hildegard von Wasserschneidt-Lohnsteiner, 2 adelige Schwestern, nicht sehr reich, aber dafür sehr arrogant, Zimmer 312. Sie interessieren sich für Klatch & Tratsch und geben den Spielenden den Hinweis dass Martin Liefers mit der Frau von Friedhelm Weiss wohl intim war.<br />
<br />
Für weitere Informationen zu den NPCs liess dir Bitte die Charakterbögen durch.<br />
<br />
[[Datei:Charakterbogen NPCs Hauptpersonen.pdf|mini]]<br />
<br />
[[Datei:Charakterbogen NPCs Zimmerpersonen.pdf|mini]]<br />
<br />
[[Datei:Charakterbogen NPCs Geiseln.pdf|mini]]<br />
<br />
Zeitungsartikel der sowohl von Martin Liefers erhalten werden kann als auch im Safe von Friedhelm Weiss gefunden werden kann.<br />
<br />
[[Datei:Zeitungsartikel.pdf|mini]]<br />
<br />
== Ablauf ==<br />
Anhand der Zeitleiste mit allen Ereignissen als Übersicht für den Spielleiter bzw. die Spielleiterin<br />
<br />
=== Vorgeschichte ===<br />
<br />
14:00 Konfrontation Sam & Friedhelm mit Prügel für Sam. Sam ab 14:30 in Werkstatt. Keine Zeugen. Zettel von Sam (Brauche Hilfe, bin in Werkstatt, Sam) zu Nicole.<br />
<br />
16:00 Natalie konfrontiert ihren Onkel im Büro. Sie macht im Vorwürfe wegen Sam. Friedhelm gibt zu dass er Sam verprügeln liess und sagt er hätte die Polizei gerufen. Natalie konfrontiert Friedhelm damit, dass er Carole umgebracht hätte und sie wisse das. Daraufhin verprügelt Friedhelm sie, fesselt und knebelt sie und lässt sie von Ralf in den Vorratsraum bringen. Er erzählt Ralf Natalie wäre auf ihn losgegangen und er würde sie auch verhaften lassen. Zeugen des Abfall-Wagens: Piere, Nicole, Cornelia, Fred <br />
<br />
17:00 Natalie wird im Abfallwagen versteckt von Ralf durch die Küche in den Vorratsraum gebracht. <br />
<br />
=== Intro ===<br />
18:30 Ankunft Leonard Henckel v. & z. Dommersmark in eigenem Helikopter<br />
18:45 Ankunft der anderen Spielenden<br />
<br />
Für die Stockwerke in denen sich die Spielenden befinden, erhalten sie die jeweilige Karte zur besseren Orientierung.<br />
<br />
=== Die Geiselnahme ===<br />
19:30 Ankunft Geiselnehmer. Die Spielenden werden alle in die Suite 401 geführt. Dimitri erkennt Leonhard und will von ihm 4 Millionen in Bar. Leonhard soll das organisieren (Leonhard kann das tun mit einem Telefon von Dimitri, da er genug Geld und Leute hat, will es aber nicht). Dimitris Ziel ist es mit Leonhard und anderen Geiseln zu einem Übergabe-Ort zu fliegen wo er das Geld erhält. Allerdings will er natürlich bei der Gelegenheit auch noch die anderen Reichen Geiseln ausnehmen<br />
<br />
Ab 20:15 haben die Geiselnehmer im Herrenzimmer im EG ein Gerät aufgebaut, welches verhindert dass man mit einem Smartphone, PC oder Tablet Empfang hat. Sowohl Internet wie auch Telefon-Funk funktionieren nicht mehr. <br />
<br />
Bis 20:15 alle Geiseln in Toiletten, Zimmern oder Suiten. Folgende Aufteilung der Geiselnehmer 4x EG; pro Stock 2, 2 Hubschrauber, 3 Suite 401 + Dimitri 401<br />
<br />
20:30 Dimitri macht es sich im Whirlpool bequem. Dimitri ist der einzige der Geiselnehmer der gebrochen Deutsch spricht. Die Spielenden können mit ihm interagieren, dass sie freigelassen werden (z.B. via Betören; Manipulieren) ist jedoch hier nicht möglich<br />
<br />
=== Erste Befreiung ===<br />
20:45 Rebecca James verlässt ihr Zimmer (207), betäubt 2 Wachen auf Stock 2 und 2 Wachen auf Stock 4. Kommt um ca. 20:50 in Zimmer 401. Blendgranate. Ca. 10 Sekunden Zeit um mit ihr zu flüchten aufs Dach. Dies sollten alle Spielenden tun, ist aber nicht zwingend. Kampf mit den 3 Wachen in 401 wird ausgespielt (gewürfelt), falls die Spielenden nicht innerhalb 10 Sekunden mit Rebecca fliehen. Rebecca hat in Pistole nur Betäubungsmunition und nur im Sniper-Gewehr richtige Munition. Allerdings dort nur 5 Schüsse. <br />
<br />
In der Regel sind dann alle Spielenden auf dem Dach mit Rebecca. Ab hier sind die Spielenden sehr frei, wie sie vorgehen wollen. Rebeccas Ziel ist es, möglichst alle Geiseln zu befreien. Rebecca James möchte möglichst nicht offen kämpfen, da die Geiselnehmer in der Überzahl sind. Sie ist bereit dass die Gruppe Risiken eingeht, will jedoch ein unnötiges Blutvergiessen verhindern. Gegen Leonhard hat sie eine spürbare Abneigung.<br />
<br />
Die Spielenden können klettern, sich abseilen (wenn jemand Seil im Inventar hat) schleichen oder kämpfen um vom Dach runterzukommen. Werden sie erneut gefangen genommen z.B. bei einem Kampf, verlieren sie ihr Inventar und kommen erneut ins Zimmer 401. Rebecca kann in diesem Fall fliehen, einen Helikopter stehlen und verspricht Hilfe zu organisieren. Ggf. kann der Spielleiter auch Rebecca mit 1-2 Geiseln aus den Zimmer die Spielenden nochmals befreien falls es diesen nicht gelingt selber zu entkommen<br />
<br />
Falls die Spielenden sich abseilen und selber einen Helikopter stehlen wollen verhindert Rebecca dies und fliegt nur alleine los. Sie hat nämlich Angst bei der Kommunikation mit der Polizei enttarnt zu werden, da sie eine heimliche CIA Agentin ist.<br />
<br />
=== Böses Erwachen === <br />
21:00 Natalie erwacht schwer geschwächt aus der Ohnmacht. <br />
<br />
21:15 Dimitri stellt seine Männer neu auf: 11-14: 4x EG, 2 Hubschrauber, 2 Eingang zum Dach (Stock 4), 2 weitere Stock 4, Rest patrouilliert auf den Stöcken 1-3 in unregelmässigen Abständen hin und her. <br />
<br />
22:30 Friedhelm Weiss verlässt mit dem Gift aus seinem Safe sein Büro. Er schleicht sich in den Vorratsraum, und vergiftet dort die gefesselte Natalie falls diese noch da ist und kein Spielender da ist. Falls sich ein Spielender im Raum befindet, versucht Friedhelm sich herauszureden und auf gut Freund zu machen, hat sicherheitshalber aber seine Pistole dabei. <br />
<br />
23:15 Friedhelm schmeisst Natalie über die Klippen (falls er nicht abgelenkt ist logischerweise und sie noch im Vorratsraum). Sie kann allerdings noch mit den Hubschrauber (mit Suchscheinwerfer und bei gezielter Suche, nicht Random beim Drüberfliegen, gefunden werden, weil der Wurf von Friedhelm nicht gut gelingt.<br />
<br />
Falls Rebecca von der Gruppe auf dem Dach (oder sonst wo) zurückgelassen wurde und noch nicht mit einem Helikopter geflüchtet ist:<br />
23:30 Rebecca James schaltet die beiden Wachen der Helikopter mit dem Scharfschützen-Gewehr aus. Sie unternimmt eine Versuch durchs Hotel zu kommen. Denn sie weiss, in gut 30 Minuten wachen die ersten Betäubten wieder auf. Sie schaltet die 4. Im 3 Stock aus, wird da aber schon ins Bein geschossen. Nimmt den Lift ins EG und wird von den dortigen 4 Wachen erschossen. Mit Hilfe wird es natürlich ausgespielt. <br />
<br />
00:00 Die 4-7 Anfangs betäubten Wachen sind alle wieder einsatzfähig. Die Wachen werden übrigens in Zimmer 401 verwahrt bis sie wieder aufwachen.<br />
<br />
=== Showdown === <br />
01:00 Polizeihubschrauber erscheinen am Himmel, blieben aber relativ weit oben. Es gibt die erste Lautsprecherdurchsage, dass die Polizei nun das Haus umstellt hat. Die Hubschrauber (mindestens 5) kreisen um das Hotel. Sie werden wohl auch einen Abflug der gelandeten Hubschrauber nicht zulassen (ausser es sind Geiseln an Bord).<br />
<br />
01:00 Dimitri wählt Random 5 Geiseln aus und bereitet den Rückzug vom Hotel vor. Ihm ist bewusst dass die Polizei nicht landen kann. Mit den 2 Getöteten hat er allerdings die beiden anderen Piloten verloren. Daher kann er nur noch 1 Hubschrauber benutzen. Er lässt 5 Geiseln in Hubschrauber 1 und 2 Wachen. <br />
<br />
01:00 Natalie stirbt wenn sie keine Hilfe erhalten hat am Gift.<br />
<br />
01:15 Dimitri erklärt 4 seiner Soldaten bei Hubschrauber 3 wie sie einen Hubschrauber steuern. Er muss nun in kurzer Zeit Piloten finden. <br />
<br />
01:30 Warnungen der Polizei die Geiselnehmer müssen sich ergeben, andernfalls wird die Polizei das Hotel stürmen.<br />
<br />
02:30 der Hubschrauber mit 4 Soldaten und 5 Geiseln verlässt das Hotel. Er wird von den Polizeihubschraubern verfolgt aber nicht angegriffen.<br />
<br />
03:00 Die Polizei stürmt mit einem riesigen Aufgebot das Hotel. Gleichzeitig seilen sich Spezialeinheiten aufs Dach ab, ein Polizeihelikopter landet und das Hotel wird gestürmt. Es kommt zum Kampf. Dimitri kann mit Hubschrauber 1 mit 5 Geiseln und 2 Soldaten fliehen. <br />
<br />
Damit endet das Abenteuer. Sam wird im Werkraum befreit, Ralph verhaftet, Friedhelm hat Selbstmord begangen und die Spielenden kehren in ihr normales Leben zurück.<br />
<br />
== Karten ==<br />
=== Karten für die Spielenden ===<br />
<br />
[[Datei:Karte für Spielende.pdf|mini]]<br />
<br />
=== Karten für den Spielleiter/die Spielleiterin ===<br />
<br />
[[Datei:Karte für Spielleiter.pdf|mini]]<br />
<br />
== Über den Autor & Motivation für die Geschichte ==<br />
<br />
Mein Name ist Adrian, ich bin 1993 geboren und wohne in der Schweiz. Durch Moriton Manor und dann auch die anderen Pen & Paper von den Rocketbeans & Hauke kam ich zu Pen & Paper. Weil ich selber mal eines machen wollte habe ich, ohne Erfahrung als Spielender, ein Pen & Paper geschrieben und dann gleich mit 2 verschiedenen Gruppen durchgeführt. Dieses hier ist es nun also, mein erstes eigenes Pen & Paper. <br />
<br />
Mein Ansatz war ähnlich wie bei Moriton Manor & Dysnomia, dass es eine abgeschlossene "Welt" gibt in der Dinge passieren und die Spielenden können sich relativ "frei" darin bewegen und frei entscheiden zu welchem Zeitpunkt sie was machen. Allerdings werden sie besonders am Anfang durch die Ereignisse der Geiselnahme und Befreiung etwas schlauchartig geführt. Dies geschieht bewusst, damit die Gruppe eine Motivation bekommt und auch als Team zusammenfindet dass nun durch die Umstände ein Team ist. <br />
<br />
Die Durchführung hat den Spielenden und mir sehr viel Spass gemacht. Als Spielleiter habe ich, logischerweise, oft auch improvisiert was NPCs und Ereignisse angeht. Der hier vorliegende Ablauf dient als Sicherheit, muss aber logischerweise dynamisch umgesetzt werde.<br />
<br />
Ich freue mich sehr falls jemand dieses Abenteuer nachspielen möchte und würde mich freuen über Nachfragen oder Feedback zu diesem Pen&Paper.<br />
<br />
[[Kategorie:"Wilde" Abenteuer]]</div>TheGamer93https://howtobeahero.de/index.php?title=Kategorie_Diskussion:Abenteuer&diff=32098Kategorie Diskussion:Abenteuer2022-04-13T19:05:33Z<p>TheGamer93: Änderung 32097 von TheGamer93 (Diskussion) rückgängig gemacht.</p>
<hr />
<div><br />
Hier findest du alle Abenteuer sortiert in<br />
<br />
{|class="wikitable"<br />
|-<br />
|[https://howtobeahero.de/index.php?title=Kategorie:%22Wilde%22_Abenteuer Wilde Abenteuer]<br />
|Abenteuer die jeder erstellen kann<br />
|-<br />
|[https://howtobeahero.de/index.php?title=Kategorie:Best%C3%A4tigte_Abenteuer Bestätigte Abenteuer]<br />
|Abenteuer die von der Redaktion als spielbar markiert wurden<br />
|-<br />
|[https://howtobeahero.de/index.php?title=Kategorie:Offizielle_Abenteuer Offiziellen Abenteuern] <br />
|Abenteuer die im HtbaH-Stream oder bei Rocket Beans gespielt wurden<br />
|-}<br />
<br />
<br />
Wenn du ein eigenes Abenteuer schreiben möchtest kannst du in [[Die_wichtigsten_Artikel_um_ein_Abenteuer_zu_schreiben|diesem Artikel]] die wichtigsten Hilfestellungen finden.</div>TheGamer93https://howtobeahero.de/index.php?title=Kategorie_Diskussion:Abenteuer&diff=32097Kategorie Diskussion:Abenteuer2022-04-13T19:04:52Z<p>TheGamer93: Neuer Abschnitt /* Test */</p>
<hr />
<div><br />
Hier findest du alle Abenteuer sortiert in<br />
<br />
{|class="wikitable"<br />
|-<br />
|[https://howtobeahero.de/index.php?title=Kategorie:%22Wilde%22_Abenteuer Wilde Abenteuer]<br />
|Abenteuer die jeder erstellen kann<br />
|-<br />
|[https://howtobeahero.de/index.php?title=Kategorie:Best%C3%A4tigte_Abenteuer Bestätigte Abenteuer]<br />
|Abenteuer die von der Redaktion als spielbar markiert wurden<br />
|-<br />
|[https://howtobeahero.de/index.php?title=Kategorie:Offizielle_Abenteuer Offiziellen Abenteuern] <br />
|Abenteuer die im HtbaH-Stream oder bei Rocket Beans gespielt wurden<br />
|-}<br />
<br />
<br />
Wenn du ein eigenes Abenteuer schreiben möchtest kannst du in [[Die_wichtigsten_Artikel_um_ein_Abenteuer_zu_schreiben|diesem Artikel]] die wichtigsten Hilfestellungen finden.<br />
<br />
== Test ==<br />
<br />
Test</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:Tmpl&diff=32090Modul:Tmpl2022-04-13T18:55:48Z<p>TheGamer93: 1 Version importiert: Test</p>
<hr />
<div>-- This is a helper module for Template:tmpl<br />
local this = {}<br />
<br />
function this.renderTmpl(frame)<br />
local args = frame.args<br />
local pargs = (frame:getParent() or {}).args<br />
local result = pargs[0] or ''<br />
for k, v in pairs(pargs) do<br />
local n = tonumber(k) or -1<br />
if (n >= 1 and n <= 9) then<br />
result = mw.ustring.gsub( result, '$' .. n, mw.text.trim(v) )<br />
end<br />
end<br />
return result<br />
end<br />
<br />
return this</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:TNTFallback&diff=32088Modul:TNTFallback2022-04-13T18:55:48Z<p>TheGamer93: 2 Versionen importiert: Test</p>
<hr />
<div>--------------------------------------------------------------------------------<br />
-- This module implements a wrapper for [[Module:TNT]] that allows returning<br />
-- a fallback message; used by {{Documentation}}.<br />
--<br />
-- @module TNTFallback<br />
-- @alias p<br />
-- @author [[User:ExE Boss]]<br />
-- @require [[Module:No globals]]<br />
-- @require [[Module:TNT]]<br />
--------------------------------------------------------------------------------<br />
<br />
require("Module:No globals");<br />
local TNT = require("Module:TNT");<br />
<br />
local p = {};<br />
<br />
--------------------------------------------------------------------------------<br />
-- Based on [[Module:TNT]]'s `msg` function,<br />
-- but takes an optional `fallback` parameter.<br />
--------------------------------------------------------------------------------<br />
function p.msg(frame)<br />
local dataset, key;<br />
local params = { n = 0 };<br />
local lang = nil;<br />
local fallback = nil;<br />
<br />
for k, v in pairs(frame.args) do<br />
if (k == 1) then<br />
dataset = v;<br />
elseif (k == 2) then<br />
key = v;<br />
elseif (type(k) == "number" and k > 2) then<br />
local i = k - 2;<br />
params[i] = v;<br />
params.n = math.max(params.n, i);<br />
elseif ((k == "lang") and (v ~= "_")) then<br />
lang = v;<br />
elseif ((k == "fallback") and (v ~= "")) then<br />
fallback = v;<br />
end<br />
end<br />
<br />
local result;<br />
if (lang) then<br />
result = TNT.formatInLanguage(lang, dataset, key, unpack(params, 1, params.n));<br />
else<br />
result = TNT.format(dataset, key, unpack(params, 1, params.n));<br />
end<br />
<br />
if (fallback and (<br />
-- not translated<br />
(result and result == TNT.formatInLanguage("en", dataset, key, unpack(params, 1, params.n)))<br />
-- no message<br />
or (not result)<br />
)) then<br />
if (not lang) then<br />
if (frame:callParserFunction("int:lang") ~= "en") then<br />
return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();<br />
end<br />
elseif (lang ~= "en") then<br />
return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();<br />
end<br />
end<br />
<br />
return result;<br />
end<br />
<br />
return p;</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:TNT&diff=32085Modul:TNT2022-04-13T18:55:48Z<p>TheGamer93: 12 Versionen importiert: Test</p>
<hr />
<div>--<br />
-- INTRO: (!!! DO NOT RENAME THIS PAGE !!!)<br />
-- This module allows any template or module to be copy/pasted between<br />
-- wikis without any translation changes. All translation text is stored<br />
-- in the global Data:*.tab pages on Commons, and used everywhere.<br />
--<br />
-- SEE: https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules<br />
--<br />
-- ATTENTION:<br />
-- Please do NOT rename this module - it has to be identical on all wikis.<br />
-- This code is maintained at https://www.mediawiki.org/wiki/Module:TNT<br />
-- Please do not modify it anywhere else, as it may get copied and override your changes.<br />
-- Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT<br />
--<br />
-- DESCRIPTION:<br />
-- The "msg" function uses a Commons dataset to translate a message<br />
-- with a given key (e.g. source-table), plus optional arguments<br />
-- to the wiki markup in the current content language.<br />
-- Use lang=xx to set language. Example:<br />
--<br />
-- {{#invoke:TNT | msg<br />
-- | I18n/Template:Graphs.tab <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab --><br />
-- | source-table <!-- uses a translation message with id = "source-table" --><br />
-- | param1 }} <!-- optional parameter --><br />
--<br />
--<br />
-- The "doc" function will generate the <templatedata> parameter documentation for templates.<br />
-- This way all template parameters can be stored and localized in a single Commons dataset.<br />
-- NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.<br />
--<br />
-- {{#invoke:TNT | doc | Graph:Lines }}<br />
-- uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab<br />
-- if the current page is Template:Graph:Lines/doc<br />
--<br />
<br />
local p = {}<br />
local i18nDataset = 'I18n/Module:TNT.tab'<br />
<br />
-- Forward declaration of the local functions<br />
local sanitizeDataset, loadData, link, formatMessage<br />
<br />
function p.msg(frame)<br />
local dataset, id<br />
local params = {}<br />
local lang = nil<br />
for k, v in pairs(frame.args) do<br />
if k == 1 then<br />
dataset = mw.text.trim(v)<br />
elseif k == 2 then<br />
id = mw.text.trim(v)<br />
elseif type(k) == 'number' then<br />
table.insert(params, mw.text.trim(v))<br />
elseif k == 'lang' and v ~= '_' then<br />
lang = mw.text.trim(v)<br />
end<br />
end<br />
return formatMessage(dataset, id, params, lang)<br />
end<br />
<br />
-- Identical to p.msg() above, but used from other lua modules<br />
-- Parameters: name of dataset, message key, optional arguments<br />
-- Example with 2 params: format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')<br />
function p.format(dataset, key, ...)<br />
local checkType = require('libraryUtil').checkType<br />
checkType('format', 1, dataset, 'string')<br />
checkType('format', 2, key, 'string')<br />
return formatMessage(dataset, key, {...})<br />
end<br />
<br />
<br />
-- Identical to p.msg() above, but used from other lua modules with the language param<br />
-- Parameters: language code, name of dataset, message key, optional arguments<br />
-- Example with 2 params: formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')<br />
function p.formatInLanguage(lang, dataset, key, ...)<br />
local checkType = require('libraryUtil').checkType<br />
checkType('formatInLanguage', 1, lang, 'string')<br />
checkType('formatInLanguage', 2, dataset, 'string')<br />
checkType('formatInLanguage', 3, key, 'string')<br />
return formatMessage(dataset, key, {...}, lang)<br />
end<br />
<br />
-- Obsolete function that adds a 'c:' prefix to the first param.<br />
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'<br />
function p.link(frame)<br />
return link(frame.args[1])<br />
end<br />
<br />
function p.doc(frame)<br />
local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])<br />
return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..<br />
formatMessage(i18nDataset, 'edit_doc', {link(dataset)})<br />
end<br />
<br />
function p.getTemplateData(dataset)<br />
-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages<br />
local data = loadData(dataset)<br />
local names = {}<br />
for _, field in pairs(data.schema.fields) do<br />
table.insert(names, field.name)<br />
end<br />
<br />
local params = {}<br />
local paramOrder = {}<br />
for _, row in pairs(data.data) do<br />
local newVal = {}<br />
local name = nil<br />
for pos, val in pairs(row) do<br />
local columnName = names[pos]<br />
if columnName == 'name' then<br />
name = val<br />
else<br />
newVal[columnName] = val<br />
end<br />
end<br />
if name then<br />
params[name] = newVal<br />
table.insert(paramOrder, name)<br />
end<br />
end<br />
<br />
-- Work around json encoding treating {"1":{...}} as an [{...}]<br />
params['zzz123']=''<br />
<br />
local json = mw.text.jsonEncode({<br />
params=params,<br />
paramOrder=paramOrder,<br />
description=data.description<br />
})<br />
<br />
json = string.gsub(json,'"zzz123":"",?', "")<br />
<br />
return json<br />
end<br />
<br />
-- Local functions<br />
<br />
sanitizeDataset = function(dataset)<br />
if not dataset then<br />
return nil<br />
end<br />
dataset = mw.text.trim(dataset)<br />
if dataset == '' then<br />
return nil<br />
elseif string.sub(dataset,-4) ~= '.tab' then<br />
return dataset .. '.tab'<br />
else<br />
return dataset<br />
end<br />
end<br />
<br />
loadData = function(dataset, lang)<br />
dataset = sanitizeDataset(dataset)<br />
if not dataset then<br />
error(formatMessage(i18nDataset, 'error_no_dataset', {}))<br />
end<br />
<br />
-- Give helpful error to thirdparties who try and copy this module.<br />
if not mw.ext or not mw.ext.data or not mw.ext.data.get then<br />
error('Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:' .. dataset)<br />
end<br />
<br />
local data = mw.ext.data.get(dataset, lang)<br />
<br />
if data == false then<br />
if dataset == i18nDataset then<br />
-- Prevent cyclical calls<br />
error('Missing Commons dataset ' .. i18nDataset)<br />
else<br />
error(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))<br />
end<br />
end<br />
return data<br />
end<br />
<br />
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix<br />
link = function(dataset)<br />
return 'c:Data:' .. mw.text.trim(dataset or '')<br />
end<br />
<br />
formatMessage = function(dataset, key, params, lang)<br />
for _, row in pairs(loadData(dataset, lang).data) do<br />
local id, msg = unpack(row)<br />
if id == key then<br />
local result = mw.message.newRawMessage(msg, unpack(params or {}))<br />
return result:plain()<br />
end<br />
end<br />
if dataset == i18nDataset then<br />
-- Prevent cyclical calls<br />
error('Invalid message key "' .. key .. '"')<br />
else<br />
error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))<br />
end<br />
end<br />
<br />
return p</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:No_globals&diff=32072Modul:No globals2022-04-13T18:55:48Z<p>TheGamer93: 12 Versionen importiert: Test</p>
<hr />
<div>local mt = getmetatable(_G) or {}<br />
function mt.__index (t, k)<br />
if k ~= 'arg' then<br />
error('Tried to read nil global ' .. tostring(k), 2)<br />
end<br />
return nil<br />
end<br />
function mt.__newindex(t, k, v)<br />
if k ~= 'arg' then<br />
error('Tried to write global ' .. tostring(k), 2)<br />
end<br />
rawset(t, k, v)<br />
end<br />
setmetatable(_G, mt)</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:Caller_title&diff=32059Modul:Caller title2022-04-13T18:55:48Z<p>TheGamer93: 2 Versionen importiert: Test</p>
<hr />
<div>local p = {}<br />
<br />
function p.title(frame)<br />
return frame:getParent():getTitle()<br />
end<br />
<br />
function p.lang(frame)<br />
local base = frame.args.base<br />
local title = p.title(frame)<br />
if base ~= title then<br />
local parts = mw.text.split(p.title(frame), '/', true)<br />
return parts[#parts]<br />
else<br />
-- we’re on the base page of the translation (directly, it’s not translated from somewhere),<br />
-- so we have no subpage language code, but we use PAGELANGUAGE<br />
return frame:preprocess('{{PAGELANGUAGE}}')<br />
end<br />
end<br />
<br />
return p</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:Autotranslate&diff=32056Modul:Autotranslate2022-04-13T18:55:48Z<p>TheGamer93: 4 Versionen importiert: Test</p>
<hr />
<div> --[[<br />
__ __ _ _ _ _ _ _ _ <br />
| \/ | ___ __| |_ _| | ___ _ / \ _ _| |_ ___ | |_ _ __ __ _ _ __ ___| | __ _| |_ ___ <br />
| |\/| |/ _ \ / _` | | | | |/ _ (_) / _ \| | | | __/ _ \| __| '__/ _` | '_ \/ __| |/ _` | __/ _ \<br />
| | | | (_) | (_| | |_| | | __/_ / ___ \ |_| | || (_) | |_| | | (_| | | | \__ \ | (_| | || __/<br />
|_| |_|\___/ \__,_|\__,_|_|\___(_)_/ \_\__,_|\__\___/ \__|_| \__,_|_| |_|___/_|\__,_|\__\___|<br />
<br />
Authors and maintainers:<br />
* User:Zolo - original version<br />
* User:Jarekt <br />
]]<br />
<br />
-- local function to help normalize input arguments<br />
local function normalize_input_args(input_args, output_args)<br />
for name, value in pairs( input_args ) do <br />
if value ~= '' then -- nuke empty strings<br />
if type(name)=='string' then name=string.lower(name) end -- convert to lower case<br />
output_args[name] = value<br />
end<br />
end<br />
return output_args<br />
end<br />
<br />
-- initialize object to be returned<br />
local p = {}<br />
<br />
--[[<br />
autotranslate<br />
<br />
This function is the core part of the Autotranslate template. <br />
<br />
Usage from a template:<br />
{{#invoke:autotranslate|autotranslate|base=|lang= }}<br />
<br />
Parameters:<br />
frame.args.base - base page name<br />
frame.args.lang - desired language (often user's native language)<br />
<br />
Error Handling:<br />
<br />
]]<br />
function p.autotranslate(frame) <br />
<br />
-- switch to lowercase parameters to make them case independent<br />
local args = {}<br />
args = normalize_input_args(frame:getParent().args, args)<br />
args = normalize_input_args(frame.args, args)<br />
<br />
-- get language fallback list<br />
if not args.lang or not mw.language.isSupportedLanguage(args.lang) then<br />
args.lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language <br />
end<br />
local langList = mw.language.getFallbacksFor(args.lang)<br />
table.insert(langList,1,args.lang)<br />
<br />
-- find base page<br />
local base = args.base<br />
args.base = nil<br />
assert(base and #base>0, 'Base page not provided for autotranslate' )<br />
if not mw.ustring.find(base,':') then -- if base page does not indicate namespace<br />
base = 'Template:' .. base -- than assume it is a template <br />
end<br />
<br />
-- find base template language subpage<br />
local page = args.default -- default page if provided or nil otherwise<br />
for _, language in ipairs(langList) do<br />
if mw.title.new(base .. '/' .. language).exists then<br />
page = base .. '/' .. language -- returns only the page<br />
break<br />
end<br />
end<br />
assert(page, string.format('No fallback page found for autotranslate (base=[[%s]], lang=%s)', base, args.lang))<br />
<br />
-- Transclude {{page |....}} with template arguments the same as the ones passed to {{autotranslate}} template.<br />
return frame:expandTemplate{ title = page, args = args}<br />
end<br />
<br />
return p</div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Translated_tag/i18n/en&diff=32051Vorlage:Translated tag/i18n/en2022-04-13T18:55:48Z<p>TheGamer93: 4 Versionen importiert: Test</p>
<hr />
<div><languages/><br />
<onlyinclude><div class="translatedTag" style="text-align:center; font-weight:bold;" lang="{{BCP47|{{#invoke:Caller title|lang|base=Template:Translated tag/i18n}}}}" dir="{{dir|{{#invoke:Caller title|lang|base=Template:Translated tag/i18n}}}}"><br />
''NOTE:'' Please do ''not'' use this template directly! This is just for translation. {{#ifeq:{{NAMESPACE}}|{{ns:10}}<!-- leave this part out on non-template pages because it won't make sense --><br />
|Use <bdi>{{tl|{{{template|{{BASEPAGENAME}}}}}}}</bdi> instead.<br />
}}</div></onlyinclude><br />
{{translated tag|documentation}}</div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Translated_tag&diff=32046Vorlage:Translated tag2022-04-13T18:55:47Z<p>TheGamer93: 143 Versionen importiert: Test</p>
<hr />
<div>{{#ifeq:{{NAMESPACE}}|{{ns:4}}||<!-- ignore commons namespace for demonstration pages --><br />
{{#switch:{{FULLPAGENAME}} <br />
|{{{ns|{{{ns1|{{ns:10}}}}}}}}:{{ucfirst:{{{page|{{{page1}}}}}}}}{{{sub|/{{SUBPAGENAME}}}}}<br />
|{{{ns2|{{ns:10}}}}}:{{ucfirst:{{{page2}}}}}{{{sub|/{{SUBPAGENAME}}}}}<br />
|{{{ns3|{{ns:10}}}}}:{{ucfirst:{{{page3}}}}}{{{sub|/{{SUBPAGENAME}}}}}<br />
|{{{ns4|{{ns:10}}}}}:{{ucfirst:{{{page4}}}}}{{{sub|/{{SUBPAGENAME}}}}} = <!-- for any exceptions --><br />
|#default =<br />
{{#switch:localisation|{{{1}}}|{{{2}}}=<!-- it may be used directly so the message doesn't apply -->|#default =<br />
{{autotranslate<br />
|base=Template:Translated tag/i18n<br />
|lang={{{lang|}}}<br />
|template={{{template|{{#ifexist:{{BASEPAGENAME}}|{{BASEPAGENAME}}|{{#titleparts:{{PAGENAME}}|1}}}}}}}<br />
}}<br />
}}<!--<br />
auto-categorizer<br />
-->{{#ifeq:{{FULLPAGENAME}}|{{ns:10}}:{{BASEPAGENAME}}/{{SUBPAGENAME}}<br />
| {{DEFAULTSORT:{{PAGENAME}}}}<!--<br />
-->{{{localcat|[[Category:{{#ifexist:Template:Translated tag/local category-{{SUBPAGENAME}}<br />
| {{translated tag/local category-{{SUBPAGENAME}}|{{{1}}}}}<br />
| Commons templates-{{SUBPAGENAME}} }}]]}}}<!--<br />
-->[[Category:Translated {{#switch:{{lc:{{{1}}}}}<br />
| cleanup = media cleanup templates<br />
| license = license tags<br />
| marker = marker templates<br />
| problem = problem tags<br />
| restriction = restriction tags<br />
| header = header templates<br />
| infobox = infobox templates<br />
| navigational = navigational templates<br />
| protection = protection templates<br />
| source = source templates<br />
| documentation = documentation templates<br />
| user = user templates<br />
| localisation = templates for localisation<br />
| templates needing categories<br />
}}]]<br />
| {{#ifeq:{{NAMESPACE}}|{{ns:6}}|[[Category:Images using translated tags]]}}<!-- check for misuse --><br />
}}<!--<br />
end auto-categorizer<br />
-->}}<br />
}}<noinclude>{{documentation}}</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Transclude&diff=31902Vorlage:Transclude2022-04-13T18:55:39Z<p>TheGamer93: 2 Versionen importiert: Test</p>
<hr />
<div>{{#switch: {{NAMESPACE: {{{1}}} }}<br />
|#default = {{FULLPAGENAME: {{{1}}} }} <!-- eg "User:Foo" --><br />
|{{ns:0}} = <br />
{{#ifeq: {{NAMESPACE: {{{1}}} }} | {{NAMESPACE: Template{{{1}}} }}<br />
| Template:{{{1}}} <!-- no leading colon, eg "Foo" --><br />
| {{PAGENAME: {{{1}}} }} <!-- leading colon, eg ":Foo", so we want the article --><br />
}}<br />
}}<noinclude><br />
{{documentation}}<br />
</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Tmpl&diff=31899Vorlage:Tmpl2022-04-13T18:55:39Z<p>TheGamer93: 1 Version importiert: Test</p>
<hr />
<div><onlyinclude><includeonly>{{#invoke:Tmpl|renderTmpl}}</includeonly></onlyinclude><br />
{{Documentation}}</div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Tl&diff=31897Vorlage:Tl2022-04-13T18:55:39Z<p>TheGamer93: 97 Versionen importiert: Test</p>
<hr />
<div><noinclude>{{protected template}}<br />
</noinclude>{{T/main|{{{1|}}}<br />
|{{{2|}}}<br />
|{{{3|{{{lang|}}}}}}<br />
|{{{4|}}}<br />
|{{{5|}}}<br />
|incl={{{incl|{{{i|3}}}}}}<br />
|code={{{code|}}}<br />
|link={{{link|}}}<br />
|case={{{case|}}}<br />
|i18n={{{i18n|}}}<br />
|parm={{{parm|}}}<br />
|full={{{full|}}}<br />
|style={{{style|}}}<br />
}}<noinclude><br />
{{documentation|Template:T/doc}}<br />
</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:T/main&diff=31799Vorlage:T/main2022-04-13T18:55:38Z<p>TheGamer93: 16 Versionen importiert: Test</p>
<hr />
<div>{{#ifeq:{{lc:{{{code}}}}}|tt|<code>}}<!-- code start<br />
-->{{#switch:{{#switch:{{{link}}}|no|n|-=1|0}}{{#switch:+|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}=1|0}}{{#switch:-|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}=1|0}}<!--<br />
-->|000|010|011|100=|{{#switch:{{{case}}}|i|n={{i18n/namespace|t|link={{{case}}}o|lang={{{i18n|}}}}}|l=template|Template}}:}}<!--<br />
<br />
-->{{#switch:{{{link}}}|no|n={{#switch:{{{incl|{{{i|}}}}}}|3=<span style="font-family:monospace;{{{style|}}}">}}<!-- link=no<br />
-->{{#switch:{{{incl|{{{i|}}}}}}|0|1|2|3|4|5|6=&#123;&#123;}}<!-- <br />
-->{{#switch:{{{2|}}}|+|-|={{#switch:{{{1|}}}|+|-|={{PAGENAME}}|{{PAGENAME:{{{1}}}}}}}|{{{2}}}}}<!-- when "link=no": just display<br />
-->{{#if:{{{parm|}}}|&#124;{{{parm}}}}}<!-- optional parm display <br />
-->{{#switch:{{{incl|{{{i|}}}}}}|0|1|2|3|4|5|6=&#125;&#125;}}<!-- <br />
-->{{#switch:{{{incl|{{{i|}}}}}}|3=</span>}}<!--<br />
<br />
-->|{{#switch:+|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}=|{{#switch:{{{incl|{{{i|}}}}}}|0|4=&#123;&#123;|1|5=&#123;}}}}<!-- when +: not outside<br />
-->[[:{{#switch:{{{3|}}}|+|-|=|{{trim|{{{3}}}}}&#58;}}<!-- language code (ISO 639-1) (and/or sisterproject prefix)<br />
-->Template:{{#switch:{{{1|}}}|+|-|={{PAGENAME}}|{{PAGENAME:{{{1}}}}}}}|<!-- =link= <br />
<br />
-->{{#switch:+|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}={{#switch:{{{case}}}|i|n={{i18n/namespace|t|link=no|lang={{{i18n|}}}}}|l=template|Template}}:}}<!--<br />
-->{{#switch:{{{incl|{{{i|}}}}}}|3=<span style="font-family:monospace,monospace;{{{style|}}}">}}<!-- <br />
-->{{#switch:{{{incl|{{{i|}}}}}}|2|3|6=&#123;&#123;|1|5=&#123;}}<!--<br />
-->{{#switch:+|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}={{#switch:{{{incl|{{{i|}}}}}}|0|4=&#123;&#123;|1|5=&#123;}}}}<!-- inside<br />
-->{{#if:{{{code|}}}|<code>}}{{#switch:{{{incl|{{{i|}}}}}}|4|5|6|9=<tt>}}<!-- code/typewrite start<br />
-->{{#switch:{{{2|}}}|+|-|={{#switch:{{{1|}}}|+|-|={{PAGENAME}}|{{PAGENAME:{{{1}}}}}}}|{{{2}}}}}<!-- display name <br />
-->{{#if:{{{parm|}}}|{{#switch:&#124;|{{padleft:|1|{{{parm}}}}}|{{padleft:|6|{{{parm}}}}}=|&#124;}}{{{parm}}}}}<!-- opt. parm<br />
-->{{#switch:{{{incl|{{{i|}}}}}}|4|5|6|9=</tt>}}{{#if:{{{code|}}}|</code>}}<!-- typewrite/code end<br />
-->{{#switch:{{{incl|{{{i|}}}}}}|2|3|6=&#125;&#125;|1|5=&#125;}}<!--<br />
-->{{#switch:{{{incl|{{{i|}}}}}}|3=</span>}}<!--<br />
-->{{#switch:+|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}={{#switch:{{{incl|{{{i|}}}}}}|0|4=&#125;&#125;|1|5=&#125;}}}}<!-- inside<br />
-->]]{{#switch:+|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}=|{{#switch:{{{incl|{{{i|}}}}}}|0|4=&#125;&#125;|1|5=&#125;}}}}}}<!-- not outside<br />
-->{{#ifeq:{{lc:{{{code}}}}}|tt|</code>}}<!-- code end<br />
-->{{#if:{{{full|{{#ifeq:{{{5}}}|full|1}}}}}|<span class="plainlinks"><!--<br />
-->&#160;<tt>(</tt><small>[{{fullurl:Template:{{{1|{{PAGENAME}}}}}}} {{int:view}}]<!--<br />
-->&#160;&#8226;&#160;[{{fullurl:Template:{{{1|{{PAGENAME}}}}}|action=edit}} {{int:edit}}]<!--<br />
-->&#160;&#8226;&#160;[[:Template talk:{{{1|{{PAGENAME}}}}}|{{int:talk}}]]<!--<br />
-->&#160;&#8226;&#160;[{{fullurl:Special:Whatlinkshere/Template:{{{1|{{PAGENAME}}}}}|limit=500}} Links]<!-- {{int:links}} needs fix<br />
-->&#160;&#8226;&#160;[{{fullurl:Template:{{{1|{{PAGENAME}}}}}|action=history}} History]</small><tt>)</tt><!-- <br />
--></span>}}<!--<br />
--><noinclude><br />
{{documentation|Template:T/doc}}<br />
</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Documentation/styles.css&diff=31782Vorlage:Documentation/styles.css2022-04-13T18:55:38Z<p>TheGamer93: 3 Versionen importiert: Test</p>
<hr />
<div>.template-documentation {<br />
margin-top: 1em;<br />
clear: both;<br />
border: 2px dotted #666;<br />
padding: 0.6em;<br />
background-color: #ecfcf4;<br />
}<br />
.template-documentation:after {<br />
content: "";<br />
display: block;<br />
clear: both;<br />
}<br />
.template-documentation-heading {<br />
padding-bottom: 3px;<br />
border-bottom: 1px solid #a2a9b1;<br />
margin-bottom: 1ex;<br />
}<br />
.template-documentation-title {<br />
font-size: 150%;<br />
}<br />
.template-documentation-transcludedfrom {<br />
font-size: smaller;<br />
font-style: italic;<br />
}</div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Documentation/layout&diff=31778Vorlage:Documentation/layout2022-04-13T18:55:38Z<p>TheGamer93: 69 Versionen importiert: Test</p>
<hr />
<div><div id="template-documentation" class="template-documentation"><templatestyles src="Template:Documentation/styles.css" /><!--<br />
-->{{#if: {{PROTECTIONLEVEL:edit}} | {{Protected}} }}<!--<br />
-->{{#ifeq: {{{heading|}}} | false |<br />
| <div class="template-documentation-heading mw-content-{{dir|{{{lang|}}}}}" lang="{{{lang|}}}" dir="{{dir|{{{lang|}}}}}"><!--<br />
--><span class="template-documentation-title">{{#if: {{{heading|}}}<br />
| {{{heading|}}}<br />
| [[File:Test Template Info-Icon.svg|50px|link=|alt=]] {{#switch:{{NAMESPACENUMBER}}<br />
| 6 = {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|file-namespace-heading|fallback={{{documentation|}}}}}<br />
| 10 = {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|template-namespace-heading|fallback={{{documentation|}}}}}<br />
| 828 = {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|module-namespace-heading|fallback={{{documentation|}}}}}<br />
| #default = {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|other-namespaces-heading|fallback={{{documentation|}}}}}<br />
}}<br />
}}</span><span class="mw-editsection-like plainlinks" id="doc_editlinks"><!--<br />
-->&#91;&nbsp;{{#if:{{{content|}}}||{{#ifexist:{{transclude|{{{1|{{DocPageName}}}}}}}|<!--<br />
-->[{{fullurl:{{transclude|{{{1|{{DocPageName}}}}}}}}} {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|view-link-display|fallback={{{view|}}}}}]&nbsp;'''·''' <!--<br />
-->[{{fullurl:{{transclude|{{{1|{{DocPageName}}}}}}}|action=edit}} {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|edit-link-display|fallback={{{edit|}}}}}]&nbsp;'''·''' <!--<br />
-->[{{fullurl:{{transclude|{{{1|{{DocPageName}}}}}}}|action=history}} {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|history-link-display|fallback={{{history|}}}}}]&nbsp;'''·''' <!--<br />
--><nowiki/>|<!--<br />
-->[{{fullurl:{{transclude|{{{1|{{DocPageName}}}}}}}|action=edit&preload=Template:Documentation/preload}} {{#invoke:TNT|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|create-link-display}}]&nbsp;'''·''' <!--<br />
--><nowiki/>}}}}<!--<br />
-->[{{fullurl:{{FULLPAGENAME}}|action=purge}} {{#invoke:TNTFallback|msg|lang={{{lang|{{int:lang}}}}}|I18n/Documentation.tab|purge-link-display|fallback={{{purge|}}}}}]<!--<br />
-->&nbsp;&#93;</span></div><br />
}}<br />
{{#if: {{{content|}}}<br />
| <!-- do not show notice when /doc is not transcluded--><br />
<div class="template-documentation-content" lang="" dir="auto"><br />
{{{content|}}}<br />
</div><br />
| <div class="template-documentation-transcludedfrom mw-content-{{dir|{{{lang|}}}}}" lang="{{{lang|}}}" dir="{{dir|{{{lang|}}}}}">{{tmpl<!--<br />
-->|0={{{text|(text: $1) &mdash; {{error|parameter text is not translated in [[Template:Documentation]]}}}}}<!--<br />
-->|1=[[{{transclude|{{{1|{{DocPageName}}}}}}}]]<!--<br />
-->}}</div><br />
<div class="template-documentation-content" lang="" dir="auto"><br />
{{ {{{1|{{DocPageName}}}}} }}<br />
</div><br />
}}<br />
</div><noinclude><br />
{{#ifeq: {{SUBPAGENAME}} | sandbox | [[Category:Sandbox templates]] }}<br />
[[Category:Layout templates]]<br />
</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Dir&diff=31708Vorlage:Dir2022-04-13T18:55:38Z<p>TheGamer93: 16 Versionen importiert: Test</p>
<hr />
<div>{{#switch:{{{1}}}|aeb|aeb-arab|ar|arc|arq|ary|arz|azb|bcc|bgn|bqi|ckb|dv|fa|fa-af|glk|ha-arab|he|khw|kk-arab|kk-cn|ks|ks-arab|ku-arab|lki|lrc|luz|ms-arab|mzn|nqo|ota|pnb|prd|ps|sd|sdh|skr|skr-arab|ug|ug-arab|ur|uz-arab|ydd|yi={{{2|rtl}}}|{{{3|ltr}}}}}<noinclude><br />
<br />
{{Documentation}}<br />
<br />
</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:BCP47&diff=31691Vorlage:BCP472022-04-13T18:55:38Z<p>TheGamer93: 10 Versionen importiert: Test</p>
<hr />
<div>{{#switch:{{lc:{{{1|}}}}}<br />
<!-- pseudo codes --><br />
||root|default|i-default=<!-- empty language tag means unknown per the HTML spec --><!-- or ={{int:lang}}? (the best user default), or =en? (the default "ContentLanguage" for unlocalized data on Meta) --><br />
<br />
<!-- current BCP47 violations by Wikimedia sites, which can be fixed using standard tags when they exist --><br />
|als=gsw<br />
|bat-smg=sgs<br />
|de-formal=de<!-- could be "de-x-formal", but actually a subset within standard "de" for HTML/XML --><br />
|eml=egl<!-- retired code, the de facto eml.wikipedia uses Emilian, not Romagnol --><br />
|fiu-vro=vro<br />
|mo=ro-cyrl<!-- retired, best fit on Wikimedia sites, but no longer working in interwikis (Wikipedia project deleted) --><br />
|nl-informal=nl<!-- could be "nl-x-informal", but actually a subset within standard "nl" for HTML/XML --><br />
|nrm=nrf<!-- Wikimedia sites uses "nrm" to mean Norman, but standard "nrm" is an unrelated language. The "nrf" code is now standardized for Norman (previously used a private-use extension of French "fr-x-nrm") --><br />
|roa-rup=rup<br />
|simple=en<!-- could be "en-simple" but actually a subset within standard "en" for HTML --><br />
|sr-ec=sr-cyrl<br />
|sr-el=sr-latn<br />
|zh-classical=lzh<br />
<br />
<!-- other current BCP47 violations by Wikimedia sites, fixed using private-use extensions (if they are needed, labels are limited to 8 letters/digits) --><br />
|cbk-zam=cbk-x-zam<br />
|map-bms=jv-x-bms<br />
|roa-tara=it-x-tara<br />
|tokipona|tp=x-tokipona<br />
<br />
<!-- conforming BCP47 "private-use" extensions used by Wikimedia, which are no longer needed, and improved using now standard codes --><br />
|be-x-old=be-tarask<br />
<br />
<!-- conforming but ambiguous BCP47 codes used by Wikimedia in a more restrictive way, with more precision --><br />
|arc=syc<!-- The de-facto arc.wikipedia.org, as per their community request, is in actual using Syriac which is coded as syc --><br />
|no=nb<!-- "no" means Bokmål on Wikimedia sites, "nb" is not used --><br />
|bh=bho<!-- "bh"="bih" is a language family, interpreted in Wikimedia as the single language "bho", even if its interwiki code remains bh) --><br />
|tgl=tl-tglg<!-- "tgl" on Wikimedia is the historic variant of the Tagalog macrolanguage ("tl" or "tgl", "tl" recommended for BCP47), written in the Baybayin script ("tglg") --><br />
<br />
<!-- conforming BCP47 "inherited" tags, strongly discouraged and replaced by their recommended tags (complete list that should not be augmented now) --><br />
|art-lojban=jbo<!-- still used in some old Wikimedia templates --><br />
|en-gb-oed=en-gb<!-- no preferred replacement, could be "en-gb-x-oed" but actually a subset within standard "en-gb" --><br />
|i-ami=ami<br />
|i-bnn=bnn<br />
|i-hak=hak<br />
|i-klingon=tlh<br />
|i-lux=lb<br />
|i-navajo=nv<br />
|i-pwn=pwn<br />
|i-tao=tao<br />
|i-tay=tay<br />
|i-tsu=tstu<br />
|no-bok=nb<!-- still used in some old Wikimedia templates --><br />
|no-nyn=nn<!-- still used in some old Wikimedia templates --><br />
|sgn-be-fr=sfb<br />
|sgn-be-nl=vgt<br />
|sgn-ch-de=sgg<br />
|zh-guoyu=cmn<!-- this could be an alias of "zh" on Wikimedia sites, which do not use "cmn" but assume "zh" is Mandarin --><br />
|zh-hakka=hak<br />
|zh-min=zh-tw<!-- no preferred replacement, could be "zh-x-min", but actually a subset within standard "zh-tw"; not necessarily "nan" --><br />
|zh-min-nan=nan<!-- used in some old Wikimedia templates and in interwikis --><br />
|zh-xiang=hsn<br />
<br />
<!-- conforming BCP47 "redundant" tags, discouraged and replaced by their recommended tags (complete list that should not be augmented now) --><br />
|sgn-br=bzs<br />
|sgn-co=csn<br />
|sgn-de=gsg<br />
|sgn-dk=dsl<br />
|sgn-es=ssp<br />
|sgn-fr=fsl<!-- still used in some old Wikimedia templates --><br />
|sgn-gb=bfi<br />
|sgn-gr=gss<br />
|sgn-ie=isg<br />
|sgn-it=ise<br />
|sgn-jp=jsl<br />
|sgn-mx=mfs<br />
|sgn-ni=ncs<br />
|sgn-nl=dse<br />
|sgn-no=nsl<br />
|sgn-pt=psr<br />
|sgn-se=swl<br />
|sgn-us=ase<!-- still used in some old Wikimedia templates --><br />
|sgn-za=sfs<br />
|zh-cmn=cmn<!-- still used in some old Wikimedia templates, this could be an alias of "zh" on Wikimedia sites, which do not use "cmn" but assume "zh" is Mandarin --><br />
|zh-cmn-Hans=cmn-hans<!-- still used in some old Wikimedia templates, this could be an alias of "zh-hans" on Wikimedia sites, which do not use "cmn" but assume "zh" is Mandarin --><br />
|zh-cmn-Hant=cmn-hant<!-- still used in some old Wikimedia templates, this could be an alias of "zh-hant" on Wikimedia sites, which do not use "cmn" but assume "zh" is Mandarin --><br />
|zh-gan=gan<!-- still used in some old Wikimedia templates --><br />
|zh-wuu=wuu<!-- still used in some old Wikimedia templates --><br />
|zh-yue=yue<!-- still used in some old Wikimedia templates and in interwikis --><br />
<br />
<!-- other "inherited" tags of the standard, strongly discouraged as they are deleted, but with no defined replacement there are left unaffected (complete list that should not be augmented now)--><br />
|cel-gaulish=xtg<!--ambiguous, most often "xtg" for Transalpine Gaulish in today's France, may also be "xcg" for Cisalpine Gaulish in today's Northern Italy--><br />
|i-enochian=x-enochian?<br />
|i-mingo=x-mingo?<br />
<br />
<!-- other standard "redundant" tags, which were unnecessarily registered (they validate with standard subtags) and that are left unaffected (complete list that should not be augmented now)<br />
|az-arab<br />
|az-cyrl<br />
|az-latn<br />
|be-latn<br />
|bs-cyrl<br />
|bs-latn<br />
|de-1901<br />
|de-1996<br />
|de-at-1901<br />
|de-at-1996<br />
|de-ch-1901<br />
|de-ch-1996<br />
|de-de-1901<br />
|de-de-1996<br />
|en-boont<br />
|en-scouse<br />
|iu-cans<br />
|iu-latn<br />
|mn-cyrl<br />
|mn-mong<br />
|sl-nedis<br />
|sl-rozaj<br />
|sr-cyrl<br />
|sr-latn<br />
|tg-arab<br />
|tg-cyrl<br />
|uz-cyrl<br />
|uz-latn<br />
|yi-latn<br />
|zh-hans<br />
|zh-hans-cn<br />
|zh-hans-hk<br />
|zh-hans-mo<br />
|zh-hans-sg<br />
|zh-hans-tw<br />
|zh-hant<br />
|zh-hant-cn<br />
|zh-hant-hk<br />
|zh-hant-mo<br />
|zh-hant-sg<br />
|zh-hant-tw<br />
--- standard special codes<br />
|mul<br />
|und<br />
--- all other unaffected tags:<br />
Minimal check of validity (valid BCP47 codes are necessarily stable over URLENCODE and #titleparts).<br />
The check ensures that the code contains only ASCII letters, digits or hyphens, and starts by a letter.<br />
This check is necessary to avoid a severe bug in MediaWiki, with some values of parameter 1, notably with<br />
urlencoded characters (including quotes, braces, ampersands...), slashes, or any HTML or wiki formatting<br />
(see also [[Template:CURRENTCONTENTLANGUAGE]]). If successful, force result to lowercase; otherwise<br />
return an empty language tag.<br />
--><br />
|#default =<br />
{{#ifeq: {{#titleparts:{{{1|}}}|1}} | {{#titleparts:{{{1|}}}||-1}}<br />
| {{#ifeq: {{lc:{{#titleparts:{{{1|}}}|1}}}} | {{ucfirst:{{lc:{{#titleparts:{{{1|}}}|1}}}}}}<br />
|<br />
| {{#ifeq: {{{1|}}} | {{urlencode:{{{1|}}}}}<br />
| {{lc:{{{1|}}}}}<br />
}}<br />
}}<br />
}}<br />
}}<noinclude>{{Documentation}}</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Autotranslate&diff=31680Vorlage:Autotranslate2022-04-13T18:55:38Z<p>TheGamer93: 32 Versionen importiert: Test</p>
<hr />
<div><includeonly>{{#invoke:Autotranslate|autotranslate}}<!-- <br />
-->{{#ifeq: {{FULLPAGENAME}} |Template:{{{base|}}} |[[Category:Autotranslated templates|{{PAGENAME}}]]}}</includeonly><noinclude><br />
<br />
{{Documentation}}<br />
<br />
</noinclude></div>TheGamer93https://howtobeahero.de/index.php?title=Vorlage:Documentation/i18n&diff=31647Vorlage:Documentation/i18n2022-04-13T18:55:38Z<p>TheGamer93: 6 Versionen importiert: Test</p>
<hr />
<div><languages/><br />
<onlyinclude>{{Documentation/layout<br />
| lang = {{{lang|{{#invoke:Caller title|lang|base=Template:Documentation/i18n}}}}}<br />
<!-- {{Documentation}} parameters: --><br />
|1={{{1|}}}<br />
|heading={{{heading|{{{2|}}}}}}<br />
|content={{{content|}}}<br />
<!-- $1 is automatically replaced by [[Template:Documentation/layout]] using {{tmpl}} --><br />
| text = <translate><!--T:1--> This documentation is [[w:Wikipedia:Transclusion|transcluded]] from $1.</translate><br />
<!-- DEPRECATED - New translations for these messages go in [[Data:I18n/Documentation.tab]]: --><br />
|edit=<translate><!--T:2--> edit</translate><br />
|history=<translate><!--T:3--> history</translate><br />
|view=<translate><!--T:4--> view</translate><br />
|documentation=<translate><!--T:5--> Documentation</translate><br />
}}</onlyinclude><br />
{{translated tag|documentation}}</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Lang&diff=31638MediaWiki:Lang2022-04-13T18:54:35Z<p>TheGamer93: </p>
<hr />
<div>de</div>TheGamer93https://howtobeahero.de/index.php?title=MediaWiki:Lang&diff=31637MediaWiki:Lang2022-04-13T18:53:50Z<p>TheGamer93: 3 Versionen importiert: Test</p>
<hr />
<div>en</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:Transclude&diff=31631Modul:Transclude2022-04-13T18:50:23Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>-- <nowiki><br />
--------------------------------------------------------------------------------<br />
-- Module that allows transcluding a template with all parent arguments.<br />
-- Useful in `/i18n` template subpages that delegate to a `/layout` subpage.<br />
--<br />
-- @module transclude<br />
-- @author [[User:ExE Boss]]<br />
-- @require [[Module:No globals]]<br />
--------------------------------------------------------------------------------<br />
<br />
require('Module:No globals')<br />
local checkType = require('libraryUtil').checkType;<br />
<br />
local p = {}<br />
local INVALID_TITLES = {<br />
["."] = true,<br />
[".."] = true,<br />
};<br />
<br />
local function _ne(value)<br />
return value and value ~= ''<br />
end<br />
<br />
--------------------------------------------------------------------------------<br />
-- Helper function that merges argument tables.<br />
--<br />
-- @function mergeArgs<br />
-- @param {table} inArgs<br />
-- @param {table} outArgs<br />
--------------------------------------------------------------------------------<br />
local function mergeArgs(inArgs, outArgs, opts)<br />
checkType("mergeArgs", 1, inArgs, "table");<br />
checkType("mergeArgs", 2, outArgs, "table");<br />
checkType("mergeArgs", 3, opts, "table", true);<br />
opts = opts or {}<br />
<br />
local ignoredParams = opts.ignoredParams;<br />
local ignoredPrefix = opts.ignoredPrefix;<br />
<br />
for name, value in pairs(inArgs) do<br />
if (type(name) == "string") then<br />
if not (<br />
(ignoredParams and ignoredParams[name] == true)<br />
or (ignoredPrefix and<br />
ignoredPrefix == name:sub(1, ignoredPrefix:len()))<br />
) then<br />
outArgs[name] = value;<br />
end<br />
else<br />
outArgs[name] = value;<br />
end<br />
end<br />
<br />
return outArgs;<br />
end<br />
<br />
-- Exported for testing:<br />
p['#mergeArgs'] = mergeArgs;<br />
<br />
local mt = {};<br />
<br />
function mt.__index(_, name)<br />
if (<br />
type(name) ~= "string"<br />
or INVALID_TITLES[name]<br />
or mw.ustring.find(name, "#", nil, true)<br />
) then<br />
return nil;<br />
end<br />
<br />
local title = mw.title.new(name, "Template")<br />
if (not title) then<br />
return nil;<br />
end<br />
<br />
return function (frame)<br />
checkType('transclude["' .. name .. '"]', 1, frame, "table");<br />
local parentFrame = frame:getParent();<br />
<br />
local ignoredParams, ignoredPrefix;<br />
if _ne(frame.args["#ignoredParams"]) then<br />
ignoredParams = {};<br />
for m in mw.text.gsplit(frame.args["#ignoredParams"], '|', true) do<br />
ignoredParams[mw.text.trim(m)] = true;<br />
end<br />
end<br />
<br />
if _ne(frame.args['#ignoredPrefix']) then<br />
ignoredPrefix = frame.args['#ignoredPrefix'];<br />
end<br />
<br />
local args = {};<br />
if (parentFrame) then<br />
mergeArgs(parentFrame.args, args, {<br />
ignoredParams = ignoredParams,<br />
ignoredPrefix = ignoredPrefix,<br />
});<br />
end<br />
mergeArgs(frame.args, args, {<br />
ignoredPrefix = "#",<br />
});<br />
<br />
if (not title.exists) then<br />
return "[[:" .. title.fullText .. "]]";<br />
end<br />
<br />
return frame:expandTemplate{<br />
title = title,<br />
args = args,<br />
};<br />
end<br />
end<br />
<br />
return setmetatable(p, mt);</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:Tmpl&diff=31629Modul:Tmpl2022-04-13T18:50:23Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>-- This is a helper module for Template:tmpl<br />
local this = {}<br />
<br />
function this.renderTmpl(frame)<br />
local args = frame.args<br />
local pargs = (frame:getParent() or {}).args<br />
local result = pargs[0] or ''<br />
for k, v in pairs(pargs) do<br />
local n = tonumber(k) or -1<br />
if (n >= 1 and n <= 9) then<br />
result = mw.ustring.gsub( result, '$' .. n, mw.text.trim(v) )<br />
end<br />
end<br />
return result<br />
end<br />
<br />
return this</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:TemplateBox&diff=31627Modul:TemplateBox2022-04-13T18:50:23Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>require('Module:No globals')<br />
<br />
--[[<br />
@exports<br />
usagesample( frame )<br />
argcount( frame )<br />
args2table( args, onGetKey, forCustom )<br />
paramtable( frame )<br />
description( frame )<br />
templatedata( frame )<br />
]]<br />
<br />
local p = {}<br />
<br />
-- Helper function, not exposed<br />
local function tobool(st)<br />
if type( st ) == 'string' then<br />
return st == 'true'<br />
else<br />
return not not st<br />
end<br />
end<br />
<br />
<br />
-- Required to determine in which languages the interface texts without langcode are<br />
local contentLangcode = mw.language.getContentLanguage():getCode()<br />
-- Forward declaration<br />
local msg, langIsInit, userLang<br />
local messagePrefix = "templatedata-doc-"<br />
local i18n = {}<br />
i18n['params'] = "Template parameters"<br />
i18n['param-name'] = "Parameter"<br />
i18n['param-desc'] = "Description"<br />
i18n['param-type'] = "Type"<br />
i18n['param-default'] = "Default"<br />
i18n['param-status'] = "Status"<br />
i18n['param-status-optional'] = "optional"<br />
i18n['param-status-required'] = "required"<br />
i18n['param-status-suggested'] = "suggested"<br />
i18n['param-status-deprecated'] = "deprecated"<br />
i18n['param-default-empty'] = "empty"<br />
<br />
local function initLangModule(frame)<br />
if langIsInit then<br />
return<br />
end<br />
<br />
userLang = frame:preprocess( '{{int:lang}}' )<br />
<br />
--! From [[:de:Modul:Expr]]; by [[:de:User:PerfektesChaos]]; <br />
--! Derivative work: Rillke<br />
msg = function( key )<br />
-- Retrieve localized message string in content language<br />
-- Precondition:<br />
-- key -- string; message ID<br />
-- Postcondition:<br />
-- Return some message string<br />
-- Uses:<br />
-- > messagePrefix<br />
-- > i18n<br />
-- > userLang<br />
-- mw.message.new()<br />
local m = mw.message.new( messagePrefix .. key )<br />
local r = false<br />
if m:isBlank() then<br />
r = i18n[ key ]<br />
else<br />
m:inLanguage( userLang )<br />
r = m:plain()<br />
end<br />
if not r then<br />
r = '((('.. key .. ')))'<br />
end<br />
return r<br />
end -- msg()<br />
<br />
langIsInit = true<br />
end<br />
<br />
-- A "hash" / table of everything TemplateData takes<br />
-- to ease maintenance.<br />
<br />
-- The type is automatically determined if t is omitted.<br />
-- If the type does not match or can't be converted, an error will be thrown!<br />
-- Available types (LUA-Types with exceptions): <br />
-- InterfaceText, boolean, number, selection, table, string<br />
-- selection*: - requires a selection-string of pipe-separated possibilities to be supplied<br />
-- InterfaceText*: A free-form string (no wikitext) in the content-language of the wiki, or, <br />
-- an object containing those strings keyed by language code.<br />
local paraminfoTemplate = {<br />
description = {<br />
default = '',<br />
t = 'InterfaceText',<br />
alias = 'desc'<br />
},<br />
format = {<br />
default = 'inline',<br />
t = 'selection',<br />
selection = 'inline|block',<br />
alias = 'print',<br />
extract = function(pargs, number, paramVal)<br />
local m = { multi = 'block', one = 'inline', infobox = 'block' }<br />
return m[paramVal] or 'inline'<br />
end<br />
}<br />
}<br />
local paraminfoTLParams = {<br />
label = {<br />
default = '',<br />
t = 'InterfaceText'<br />
},<br />
required = {<br />
default = false,<br />
extract = function(pargs, number, paramVal)<br />
local req = (pargs[number .. 'stat'] == 'required')<br />
return tobool( paramVal or req )<br />
end<br />
},<br />
suggested = {<br />
default = false,<br />
extract = function(pargs, number, paramVal)<br />
local sugg = (pargs[number .. 'stat'] == 'suggested')<br />
return tobool( paramVal or sugg )<br />
end<br />
},<br />
description = {<br />
default = '',<br />
t = 'InterfaceText',<br />
alias = 'd'<br />
},<br />
deprecated = {<br />
default = false,<br />
extract = function(pargs, number, paramVal)<br />
local depr = (pargs[number .. 'stat'] == 'deprecated')<br />
return tobool( paramVal or depr )<br />
end<br />
},<br />
aliases = {<br />
default = '',<br />
t = 'table',<br />
extract = function(pargs, number, paramVal)<br />
local key = number .. 'aliases'<br />
local tdkey = key .. '-td'<br />
local aliases = pargs[tdkey] or pargs[key]<br />
if aliases and mw.text.trim( aliases ) ~= '' then<br />
local cleaned = {}<br />
for m in mw.text.gsplit( aliases, '/', true ) do<br />
cleaned[#cleaned+1] = mw.text.trim(m)<br />
end<br />
return cleaned<br />
else<br />
return nil<br />
end<br />
end<br />
},<br />
default = {<br />
default = '',<br />
t = 'string',<br />
alias = 'def'<br />
},<br />
type = {<br />
default = 'unknown',<br />
t = 'selection',<br />
selection = 'unknown|number|string|string/wiki-user-name|string/wiki-page-name|string/line|line|wiki-page-name|wiki-file-name|wiki-user-name|wiki-template-name|content|unbalanced-wikitext|date|url|boolean'<br />
},<br />
inherits = {<br />
default = nil,<br />
t = 'string'<br />
},<br />
autovalue = {<br />
default = '',<br />
t = 'string',<br />
alias = 'av',<br />
},<br />
suggestedvalues = {<br />
default = '',<br />
t = 'table',<br />
alias = 'sv',<br />
extract = function(pargs, number, paramVal)<br />
if paramVal == nil then<br />
return nil<br />
end<br />
local cleaned = {}<br />
for m in mw.text.gsplit( paramVal, '/', true ) do<br />
cleaned[#cleaned+1] = mw.text.trim(m)<br />
end<br />
return cleaned<br />
end,<br />
},<br />
-- sets will be treated differently because we can only have a plain structure in wikitext<br />
}<br />
local tableLayout = {<br />
{<br />
col = 'param-name',<br />
width = '15%',<br />
extract = function(item, renderCell, monolingual)<br />
local alias, param = '', item.key<br />
local aliasTT = '<span style="font-family: monospace; color:#777; border:1px solid #6A6A6A">'<br />
<br />
param = '<code>' .. param .. '</code>'<br />
if item.aliases then<br />
alias = aliasTT .. table.concat(item.aliases, '</span><br />' .. aliasTT) .. '</span>'<br />
param = table.concat({param, '<br /><div>', alias, '</div>'})<br />
end<br />
renderCell(param)<br />
end<br />
}, {<br />
col = 'param-desc',<br />
cols = 2,<br />
width = '65%',<br />
extract = function(item, renderCell, monolingual)<br />
local label = item.label or ''<br />
label = monolingual(label)<br />
local labelLen = #label<br />
local colspan = 2 - labelLen<br />
<br />
if labelLen > 0 then<br />
renderCell(label)<br />
end<br />
<br />
renderCell(monolingual(item.description), colspan)<br />
end<br />
}, {<br />
col = 'param-default',<br />
width = '10%',<br />
extract = function(item, renderCell, monolingual)<br />
local def = monolingual(item.default) or ''<br />
if #def == 0 then<br />
def = '<span class="mw-templatedata-doc-muted" style="color:#777; font-variant:small-caps">' .. msg('param-default-empty') .. '</span>'<br />
end<br />
renderCell(def)<br />
end<br />
}, {<br />
col = 'param-status',<br />
width = '10%',<br />
extract = function(item, renderCell, monolingual)<br />
local stat = msg('param-status-optional')<br />
if item.required then<br />
stat = '<b>' .. msg('param-status-required') .. '</b>'<br />
elseif item.deprecated then<br />
stat = msg('param-status-deprecated')<br />
elseif item.suggested then<br />
stat = msg('param-status-suggested')<br />
end<br />
renderCell(stat)<br />
end<br />
}<br />
}<br />
<br />
-- Initialize param info<br />
-- Avoids having to add redundant information to the preceding tables<br />
local function init( which )<br />
local setDefault = function(v)<br />
if v.t == nil and v.default ~= nil then<br />
v.t = type( v.default )<br />
end<br />
if v.selection then<br />
local selection = mw.text.split(v.selection, '|', true)<br />
v.selection = {}<br />
for _, sel in ipairs(selection) do<br />
v.selection[sel] = true<br />
end<br />
end<br />
end<br />
for a, v in pairs( which ) do<br />
setDefault(v)<br />
end<br />
end<br />
local function initParamTables()<br />
init( paraminfoTemplate )<br />
init( paraminfoTLParams )<br />
end<br />
<br />
------------------------------------------------------<br />
-------------------- USAGE PART ----------------------<br />
------------------------------------------------------<br />
function p.argcount( frame )<br />
local pargs = ( frame:getParent() or {} ).args or {}<br />
local ac = 0<br />
for i, arg in pairs( pargs ) do<br />
if ('number' == type(i)) then<br />
ac = ac + 1<br />
end<br />
end<br />
return ac<br />
end<br />
<br />
function p.usagesample( frame )<br />
local pargs = ( frame:getParent() or {} ).args or {}<br />
local multiline = (pargs.lines == 'multi' or pargs.print == 'multi' or pargs.print == 'infobox')<br />
local align = pargs.print == 'infobox'<br />
if not pargs.lines and not pargs.print and pargs.type == 'infobox' then<br />
multiline = true<br />
align = true<br />
end<br />
local sepStart = ' |'<br />
local sepEnd = multiline and '\n' or ''<br />
local sep = sepEnd<br />
local subst = #(pargs.mustbesubst or '') > 0 and 'subst:' or ''<br />
local beforeEqual = multiline and ' ' or ''<br />
local equal = beforeEqual .. '= '<br />
local templateTitle = pargs.name or ''<br />
local args, argName, result = {}<br />
local maxArgLen, eachArg = 0<br />
sep = sep .. sepStart<br />
<br />
local sparseIpairs = require('Module:TableTools').sparseIpairs<br />
local comapareLegacyVal = function(val)<br />
return val == 'optional-' or val == 'deprecated'<br />
end<br />
local shouldShow = function(i)<br />
if comapareLegacyVal(pargs[i .. 'stat']) or<br />
comapareLegacyVal(pargs[i .. 'stat-td']) or<br />
pargs[i .. 'deprecated'] == true then <br />
return false<br />
end<br />
return true<br />
end<br />
<br />
eachArg = function(cb)<br />
for i, arg in sparseIpairs( pargs ) do<br />
if ('number' == type(i)) then<br />
argName = mw.text.trim( arg or '' )<br />
if #argName == 0 then<br />
argName = tostring(i)<br />
end<br />
<br />
if shouldShow(i) then<br />
cb(argName)<br />
end<br />
end<br />
end<br />
end<br />
<br />
if align then<br />
eachArg(function( arg )<br />
local argL = #arg<br />
maxArgLen = argL > maxArgLen and argL or maxArgLen<br />
end)<br />
end<br />
<br />
eachArg(function( arg )<br />
local space = ''<br />
if align then<br />
space = ('&nbsp;'):rep(maxArgLen - #arg)<br />
end<br />
table.insert( args, argName .. space .. equal )<br />
end)<br />
<br />
if #args == 0 then<br />
sep = ''<br />
sepEnd = ''<br />
sepStart = ''<br />
end<br />
if #templateTitle == 0 then<br />
templateTitle = mw.title.getCurrentTitle().text<br />
end<br />
result = table.concat( args, sep )<br />
result = table.concat({ mw.text.nowiki('{{'), subst, templateTitle, sep, result, sepEnd, '}}' })<br />
if multiline then<br />
-- Preserve whitespace in front of new lines<br />
result = frame:callParserFunction{ name = '#tag', args = { 'poem', result } }<br />
end<br />
return result<br />
end<br />
<br />
------------------------------------------------------<br />
------------------- GENERAL PART ---------------------<br />
------------------------------------------------------<br />
function p.args2table(args, onGetKey, consumer)<br />
initParamTables()<br />
<br />
local sets, asParamArray, laxtype, processParams, processDesc, unstrip<br />
if 'paramtable' == consumer then<br />
asParamArray = true<br />
processParams = true<br />
laxtype = true<br />
elseif 'templatedata' == consumer then<br />
sets = true<br />
processParams = true<br />
processDesc = true<br />
unstrip = true<br />
elseif 'description' == consumer then<br />
processDesc = true<br />
laxtype = true<br />
end<br />
-- All kind of strange stuff with the arguments is done, so play safe and make a copy<br />
local pargs = mw.clone( args )<br />
-- Array-like table containing all parameter-numbers that were passed<br />
local templateArgs = {}<br />
-- Arguments that are localized (i.e. the user passed 1desc-en=English description of parameter one)<br />
local i18nTemplateArgs = {}<br />
-- Ensure that tables end up as array/object (esp. when they are empty)<br />
local tdata = {description="", params={}, sets={}}<br />
local isObject = { __tostring = function() return "JSON object" end } isObject.__index = isObject<br />
local isArray = { __tostring = function() return "JSON array" end } isArray.__index = isArray<br />
setmetatable(tdata.params, isObject)<br />
setmetatable(tdata.sets, isArray)<br />
onGetKey = onGetKey or function( prefix, alias, param )<br />
local key, key2, tdkey, tdkey2<br />
key = prefix .. (alias or param)<br />
key2 = prefix .. param<br />
tdkey = key .. '-td'<br />
tdkey2 = key2 .. '-td'<br />
return tdkey, tdkey2, key, key2<br />
end<br />
<br />
local extractData = function( pi, number )<br />
local prefix = number or ''<br />
local ppv, paramVal<br />
local key1, key2, key3, key4<br />
local paramKey, paramTable, processKey<br />
if number then<br />
paramKey = mw.text.trim( pargs[number] )<br />
if '' == paramKey then<br />
paramKey = tostring( number )<br />
end<br />
<br />
paramTable = {}<br />
if asParamArray then<br />
paramTable.key = paramKey<br />
table.insert(tdata.params, paramTable)<br />
else<br />
tdata.params[paramKey] = paramTable<br />
end<br />
end<br />
for p, info in pairs( pi ) do<br />
key1, key2, key3, key4 = onGetKey(prefix, info.alias, p)<br />
paramVal = nil<br />
<br />
processKey = function(key)<br />
if paramVal ~= nil then return end<br />
local plain, multilingual = pargs[key], i18nTemplateArgs[key]<br />
paramVal = multilingual or plain<br />
end<br />
processKey( key1 )<br />
processKey( key2 )<br />
processKey( key3 )<br />
processKey( key4 )<br />
<br />
-- Ensure presence of entry in content language<br />
ppv = pargs[key1] or pargs[key2] or pargs[key3] or pargs[key4] or info.default<br />
if 'table' == type( paramVal ) then<br />
if (nil == paramVal[contentLangcode]) then<br />
paramVal[contentLangcode] = ppv<br />
end<br />
else<br />
paramVal = ppv<br />
end<br />
<br />
if 'function' == type( info.extract ) then<br />
if 'string' == type( paramVal ) then<br />
paramVal = mw.text.trim( paramVal )<br />
if '' == paramVal then<br />
paramVal = nil<br />
end<br />
end<br />
paramVal = info.extract( pargs, number, paramVal )<br />
end<br />
<br />
local insertValue = function()<br />
if number then<br />
paramTable[p] = paramVal<br />
else<br />
tdata[p] = paramVal<br />
end<br />
end<br />
<br />
if info.selection then<br />
if info.selection[paramVal] then<br />
insertValue()<br />
end<br />
elseif 'InterfaceText' == info.t then<br />
if ({ table=1, string=1 })[type( paramVal )] then<br />
insertValue()<br />
end<br />
else<br />
local paramType = type( paramVal )<br />
if 'string' == info.t and 'string' == paramType then<br />
paramVal = mw.text.trim( paramVal )<br />
if '' ~= paramVal then<br />
insertValue()<br />
end<br />
elseif 'boolean' == info.t then<br />
paramVal = tobool(paramVal)<br />
insertValue()<br />
elseif 'number' == info.t then<br />
paramVal = tonumber(paramVal)<br />
insertValue()<br />
elseif paramType == info.t then<br />
insertValue()<br />
elseif paramType == 'nil' then<br />
-- Do nothing<br />
elseif not laxtype and 'string' == info.t and 'table' == paramType then<br />
-- Convert multilingual object into content language string<br />
paramVal = paramVal[contentLangcode]<br />
insertValue()<br />
else<br />
if laxtype then<br />
insertValue()<br />
else<br />
error( p .. ': Is of type ' .. paramType .. ' but should be of type ' .. (info.t or 'unknown'), 1 )<br />
end<br />
end<br />
end<br />
end<br />
-- Now, treat sets<br />
if sets then<br />
key1 = prefix .. 'set-td'<br />
key2 = prefix .. 'set'<br />
paramVal = pargs[key1] or pargs[key2]<br />
if paramVal then<br />
local found = false<br />
for i, s in ipairs( tdata.sets ) do<br />
if s.label == paramVal then<br />
table.insert( s.params, p )<br />
found = true<br />
end<br />
end<br />
if not found then<br />
table.insert( tdata.sets, {<br />
label = paramVal, <br />
params = { p }<br />
} )<br />
end<br />
end<br />
end<br />
end<br />
<br />
-- First, analyse the structure of the provided arguments<br />
for a, v in pairs( pargs ) do<br />
if unstrip then<br />
v = mw.text.unstrip( v )<br />
pargs[a] = v<br />
end<br />
if type( a ) == 'number' then<br />
table.insert( templateArgs, a )<br />
else<br />
local argSplit = mw.text.split( a, '-', true )<br />
local argUnitl = {}<br />
local argAfter = {}<br />
local isTDArg = false<br />
local containsTD = a:find( '-td', 1, true )<br />
for i, part in ipairs( argSplit ) do<br />
if isTDArg or (containsTD == nil and i > 1) then<br />
-- This is likely a language version<br />
table.insert( argAfter, part )<br />
else<br />
table.insert( argUnitl, part )<br />
end<br />
if part == 'td' then<br />
isTDArg = true<br />
end<br />
end<br />
if #argAfter > 0 then<br />
argUnitl = table.concat( argUnitl, '-' )<br />
argAfter = table.concat( argAfter, '-' )<br />
i18nTemplateArgs[argUnitl] = i18nTemplateArgs[argUnitl] or {}<br />
i18nTemplateArgs[argUnitl][argAfter] = v<br />
end<br />
end<br />
end<br />
-- Then, start building the actual template<br />
if processDesc then<br />
extractData( paraminfoTemplate )<br />
end<br />
if processParams then<br />
-- Ensure that `templateArgs` contains indicies in ascending order<br />
table.sort( templateArgs )<br />
for i, number in pairs( templateArgs ) do<br />
extractData( paraminfoTLParams, number )<br />
end<br />
end<br />
return tdata, #templateArgs<br />
end<br />
<br />
<br />
<br />
------------------------------------------------------<br />
------------ CUSTOM PARAMETER TABLE PART -------------<br />
------------------------------------------------------<br />
<br />
-- A custom key-pref-function<br />
local customOnGetKey = function( prefix, alias, param )<br />
local key, key2, tdkey, tdkey2<br />
key = prefix .. (alias or param)<br />
key2 = prefix .. param<br />
tdkey = key .. '-td'<br />
tdkey2 = key2 .. '-td'<br />
return key2, key, tdkey2, tdkey<br />
end<br />
local toUserLanguage = function(input)<br />
if type(input) == 'table' then<br />
input = require( 'Module:LangSwitch' )._langSwitch( input, userLang ) or ''<br />
end<br />
return input<br />
end<br />
<br />
function p.description(frame)<br />
local pargs = ( frame:getParent() or {} ).args or {}<br />
<br />
-- Initialize the language-related stuff<br />
initLangModule(frame)<br />
<br />
local tdata, paramLen<br />
tdata, paramLen = p.args2table(pargs, customOnGetKey, 'description')<br />
return toUserLanguage(tdata.description)<br />
end<br />
<br />
<br />
function p.paramtable(frame)<br />
local pargs = ( frame:getParent() or {} ).args or {}<br />
local tdata, paramLen<br />
<br />
if 'only' == pargs.useTemplateData then<br />
return 'param table - output suppressed'<br />
end<br />
<br />
-- Initialize the language-related stuff<br />
initLangModule(frame)<br />
<br />
tdata, paramLen = p.args2table(pargs, customOnGetKey, 'paramtable')<br />
<br />
<br />
if 0 == paramLen then<br />
return ''<br />
end<br />
<br />
local row, rows = '', {}<br />
local renderCell = function(wikitext, colspan)<br />
local colspan, oTd = colspan or 1, '<td>'<br />
if colspan > 1 then<br />
oTd = '<td colspan="' .. colspan .. '">'<br />
end<br />
row = table.concat({ row, oTd, wikitext, '</td>' })<br />
end<br />
<br />
-- Create the header<br />
for i, field in ipairs( tableLayout ) do<br />
local style = ' style="width:' .. field.width .. '"'<br />
local colspan = ''<br />
if field.cols then<br />
colspan = ' colspan="' .. field.cols .. '"'<br />
end<br />
local th = '<th' .. style .. colspan .. '>'<br />
<br />
row = row .. th .. msg(field.col) .. '</th>'<br />
end<br />
table.insert(rows, row)<br />
<br />
-- Now transform the Lua-table into an HTML-table<br />
for i, item in ipairs( tdata.params ) do<br />
row = ''<br />
for i2, field in ipairs( tableLayout ) do<br />
field.extract(item, renderCell, toUserLanguage)<br />
end<br />
table.insert(rows, row)<br />
end<br />
return '<table class="wikitable templatebox-table"><tr>' .. table.concat(rows, '</tr><tr>') .. '</tr></table>'<br />
end<br />
<br />
<br />
------------------------------------------------------<br />
----------------- TEMPLATEDATA PART ------------------<br />
------------------------------------------------------<br />
<br />
-- A real parser/transformer would look differently but it would likely be much more complex<br />
-- The TemplateData-portion for [[Template:TemplateBox]]<br />
function p.templatedata(frame)<br />
local tdata<br />
local args = frame.args or {}<br />
local formatting = args.formatting<br />
local pargs = ( frame:getParent() or {} ).args or {}<br />
local useTemplateData = pargs.useTemplateData<br />
<br />
if (formatting == 'pretty' and useTemplateData ~= 'export') or<br />
(not useTemplateData) or<br />
(useTemplateData == 'export' and formatting ~= 'pretty') then<br />
local warning = "Warning: Module:TemplateBox - templatedata invoked but not requested by user (setting useTemplateData=1)."<br />
mw.log(warning)<br />
tdata = '{"description":"' .. warning .. '","params":{},"sets":[]}'<br />
return tdata<br />
end<br />
<br />
-- Load the JSON-Module which will convert LUA tables into valid JSON<br />
local JSON = require('Module:JSON')<br />
JSON.strictTypes = true<br />
-- Obtain the object containing info<br />
tdata = p.args2table(pargs, nil, 'templatedata')<br />
-- And finally return the result<br />
if formatting == 'pretty' then<br />
return JSON:encode_pretty(tdata)<br />
else<br />
return JSON:encode(tdata)<br />
end<br />
end<br />
<br />
return p</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:TableTools&diff=31625Modul:TableTools2022-04-13T18:50:23Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>--[[<br />
------------------------------------------------------------------------------------<br />
-- TableTools --<br />
-- --<br />
-- This module includes a number of functions for dealing with Lua tables. --<br />
-- It is a meta-module, meant to be called from other Lua modules, and should --<br />
-- not be called directly from #invoke. --<br />
------------------------------------------------------------------------------------<br />
--]]<br />
<br />
local libraryUtil = require('libraryUtil')<br />
<br />
local p = {}<br />
<br />
-- Define often-used variables and functions.<br />
local floor = math.floor<br />
local infinity = math.huge<br />
local checkType = libraryUtil.checkType<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- isPositiveInteger<br />
--<br />
-- This function returns true if the given value is a positive integer, and false<br />
-- if not. Although it doesn't operate on tables, it is included here as it is<br />
-- useful for determining whether a given table key is in the array part or the<br />
-- hash part of a table.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.isPositiveInteger(v)<br />
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then<br />
return true<br />
else<br />
return false<br />
end<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- isNan<br />
--<br />
-- This function returns true if the given number is a NaN value, and false<br />
-- if not. Although it doesn't operate on tables, it is included here as it is<br />
-- useful for determining whether a value can be a valid table key. Lua will<br />
-- generate an error if a NaN is used as a table key.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.isNan(v)<br />
if type(v) == 'number' and tostring(v) == '-nan' then<br />
return true<br />
else<br />
return false<br />
end<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- shallowClone<br />
--<br />
-- This returns a clone of a table. The value returned is a new table, but all<br />
-- subtables and functions are shared. Metamethods are respected, but the returned<br />
-- table will have no metatable of its own.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.shallowClone(t)<br />
local ret = {}<br />
for k, v in pairs(t) do<br />
ret[k] = v<br />
end<br />
return ret<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- removeDuplicates<br />
--<br />
-- This removes duplicate values from an array. Non-positive-integer keys are<br />
-- ignored. The earliest value is kept, and all subsequent duplicate values are<br />
-- removed, but otherwise the array order is unchanged.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.removeDuplicates(t)<br />
checkType('removeDuplicates', 1, t, 'table')<br />
local isNan = p.isNan<br />
local ret, exists = {}, {}<br />
for i, v in ipairs(t) do<br />
if isNan(v) then<br />
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.<br />
ret[#ret + 1] = v<br />
else<br />
if not exists[v] then<br />
ret[#ret + 1] = v<br />
exists[v] = true<br />
end<br />
end <br />
end<br />
return ret<br />
end <br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- numKeys<br />
--<br />
-- This takes a table and returns an array containing the numbers of any numerical<br />
-- keys that have non-nil values, sorted in numerical order.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.numKeys(t)<br />
checkType('numKeys', 1, t, 'table')<br />
local isPositiveInteger = p.isPositiveInteger<br />
local nums = {}<br />
for k, v in pairs(t) do<br />
if isPositiveInteger(k) then<br />
nums[#nums + 1] = k<br />
end<br />
end<br />
table.sort(nums)<br />
return nums<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- affixNums<br />
--<br />
-- This takes a table and returns an array containing the numbers of keys with the<br />
-- specified prefix and suffix. For example, for the table<br />
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will<br />
-- return {1, 3, 6}.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.affixNums(t, prefix, suffix)<br />
checkType('affixNums', 1, t, 'table')<br />
checkType('affixNums', 2, prefix, 'string', true)<br />
checkType('affixNums', 3, suffix, 'string', true)<br />
<br />
local function cleanPattern(s)<br />
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.<br />
s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')<br />
return s<br />
end<br />
<br />
prefix = prefix or ''<br />
suffix = suffix or ''<br />
prefix = cleanPattern(prefix)<br />
suffix = cleanPattern(suffix)<br />
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'<br />
<br />
local nums = {}<br />
for k, v in pairs(t) do<br />
if type(k) == 'string' then <br />
local num = mw.ustring.match(k, pattern)<br />
if num then<br />
nums[#nums + 1] = tonumber(num)<br />
end<br />
end<br />
end<br />
table.sort(nums)<br />
return nums<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- numData<br />
--<br />
-- Given a table with keys like ("foo1", "bar1", "foo2", "baz2"), returns a table<br />
-- of subtables in the format <br />
-- { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }<br />
-- Keys that don't end with an integer are stored in a subtable named "other".<br />
-- The compress option compresses the table so that it can be iterated over with<br />
-- ipairs.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.numData(t, compress)<br />
checkType('numData', 1, t, 'table')<br />
checkType('numData', 2, compress, 'boolean', true)<br />
local ret = {}<br />
for k, v in pairs(t) do<br />
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')<br />
if num then<br />
num = tonumber(num)<br />
local subtable = ret[num] or {}<br />
if prefix == '' then<br />
-- Positional parameters match the blank string; put them at the start of the subtable instead.<br />
prefix = 1<br />
end<br />
subtable[prefix] = v<br />
ret[num] = subtable<br />
else<br />
local subtable = ret.other or {}<br />
subtable[k] = v<br />
ret.other = subtable<br />
end<br />
end<br />
if compress then<br />
local other = ret.other<br />
ret = p.compressSparseArray(ret)<br />
ret.other = other<br />
end<br />
return ret<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- compressSparseArray<br />
--<br />
-- This takes an array with one or more nil values, and removes the nil values<br />
-- while preserving the order, so that the array can be safely traversed with<br />
-- ipairs.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.compressSparseArray(t)<br />
checkType('compressSparseArray', 1, t, 'table')<br />
local ret = {}<br />
local nums = p.numKeys(t)<br />
for _, num in ipairs(nums) do<br />
ret[#ret + 1] = t[num]<br />
end<br />
return ret<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- sparseIpairs<br />
--<br />
-- This is an iterator for sparse arrays. It can be used like ipairs, but can<br />
-- handle nil values.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.sparseIpairs(t)<br />
checkType('sparseIpairs', 1, t, 'table')<br />
local nums = p.numKeys(t)<br />
local i = 0<br />
local lim = #nums<br />
return function ()<br />
i = i + 1<br />
if i <= lim then<br />
local key = nums[i]<br />
return key, t[key]<br />
else<br />
return nil, nil<br />
end<br />
end<br />
end<br />
<br />
--[[<br />
------------------------------------------------------------------------------------<br />
-- size<br />
--<br />
-- This returns the size of a key/value pair table. It will also work on arrays,<br />
-- but for arrays it is more efficient to use the # operator.<br />
------------------------------------------------------------------------------------<br />
--]]<br />
function p.size(t)<br />
checkType('size', 1, t, 'table')<br />
local i = 0<br />
for k in pairs(t) do<br />
i = i + 1<br />
end<br />
return i<br />
end<br />
<br />
return p</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:TNTFallback&diff=31623Modul:TNTFallback2022-04-13T18:50:22Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>--------------------------------------------------------------------------------<br />
-- This module implements a wrapper for [[Module:TNT]] that allows returning<br />
-- a fallback message; used by {{Documentation}}.<br />
--<br />
-- @module TNTFallback<br />
-- @alias p<br />
-- @author [[User:ExE Boss]]<br />
-- @require [[Module:No globals]]<br />
-- @require [[Module:TNT]]<br />
--------------------------------------------------------------------------------<br />
<br />
require("Module:No globals");<br />
local TNT = require("Module:TNT");<br />
<br />
local p = {};<br />
<br />
--------------------------------------------------------------------------------<br />
-- Based on [[Module:TNT]]'s `msg` function,<br />
-- but takes an optional `fallback` parameter.<br />
--------------------------------------------------------------------------------<br />
function p.msg(frame)<br />
local dataset, key;<br />
local params = { n = 0 };<br />
local lang = nil;<br />
local fallback = nil;<br />
<br />
for k, v in pairs(frame.args) do<br />
if (k == 1) then<br />
dataset = v;<br />
elseif (k == 2) then<br />
key = v;<br />
elseif (type(k) == "number" and k > 2) then<br />
local i = k - 2;<br />
params[i] = v;<br />
params.n = math.max(params.n, i);<br />
elseif ((k == "lang") and (v ~= "_")) then<br />
lang = v;<br />
elseif ((k == "fallback") and (v ~= "")) then<br />
fallback = v;<br />
end<br />
end<br />
<br />
local result;<br />
if (lang) then<br />
result = TNT.formatInLanguage(lang, dataset, key, unpack(params, 1, params.n));<br />
else<br />
result = TNT.format(dataset, key, unpack(params, 1, params.n));<br />
end<br />
<br />
if (fallback and (<br />
-- not translated<br />
(result and result == TNT.formatInLanguage("en", dataset, key, unpack(params, 1, params.n)))<br />
-- no message<br />
or (not result)<br />
)) then<br />
if (not lang) then<br />
if (frame:callParserFunction("int:lang") ~= "en") then<br />
return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();<br />
end<br />
elseif (lang ~= "en") then<br />
return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();<br />
end<br />
end<br />
<br />
return result;<br />
end<br />
<br />
return p;</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:TNT&diff=31621Modul:TNT2022-04-13T18:50:22Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>--<br />
-- INTRO: (!!! DO NOT RENAME THIS PAGE !!!)<br />
-- This module allows any template or module to be copy/pasted between<br />
-- wikis without any translation changes. All translation text is stored<br />
-- in the global Data:*.tab pages on Commons, and used everywhere.<br />
--<br />
-- SEE: https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules<br />
--<br />
-- ATTENTION:<br />
-- Please do NOT rename this module - it has to be identical on all wikis.<br />
-- This code is maintained at https://www.mediawiki.org/wiki/Module:TNT<br />
-- Please do not modify it anywhere else, as it may get copied and override your changes.<br />
-- Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT<br />
--<br />
-- DESCRIPTION:<br />
-- The "msg" function uses a Commons dataset to translate a message<br />
-- with a given key (e.g. source-table), plus optional arguments<br />
-- to the wiki markup in the current content language.<br />
-- Use lang=xx to set language. Example:<br />
--<br />
-- {{#invoke:TNT | msg<br />
-- | I18n/Template:Graphs.tab <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab --><br />
-- | source-table <!-- uses a translation message with id = "source-table" --><br />
-- | param1 }} <!-- optional parameter --><br />
--<br />
--<br />
-- The "doc" function will generate the <templatedata> parameter documentation for templates.<br />
-- This way all template parameters can be stored and localized in a single Commons dataset.<br />
-- NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.<br />
--<br />
-- {{#invoke:TNT | doc | Graph:Lines }}<br />
-- uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab<br />
-- if the current page is Template:Graph:Lines/doc<br />
--<br />
<br />
local p = {}<br />
local i18nDataset = 'I18n/Module:TNT.tab'<br />
<br />
-- Forward declaration of the local functions<br />
local sanitizeDataset, loadData, link, formatMessage<br />
<br />
function p.msg(frame)<br />
local dataset, id<br />
local params = {}<br />
local lang = nil<br />
for k, v in pairs(frame.args) do<br />
if k == 1 then<br />
dataset = mw.text.trim(v)<br />
elseif k == 2 then<br />
id = mw.text.trim(v)<br />
elseif type(k) == 'number' then<br />
table.insert(params, mw.text.trim(v))<br />
elseif k == 'lang' and v ~= '_' then<br />
lang = mw.text.trim(v)<br />
end<br />
end<br />
return formatMessage(dataset, id, params, lang)<br />
end<br />
<br />
-- Identical to p.msg() above, but used from other lua modules<br />
-- Parameters: name of dataset, message key, optional arguments<br />
-- Example with 2 params: format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')<br />
function p.format(dataset, key, ...)<br />
local checkType = require('libraryUtil').checkType<br />
checkType('format', 1, dataset, 'string')<br />
checkType('format', 2, key, 'string')<br />
return formatMessage(dataset, key, {...})<br />
end<br />
<br />
<br />
-- Identical to p.msg() above, but used from other lua modules with the language param<br />
-- Parameters: language code, name of dataset, message key, optional arguments<br />
-- Example with 2 params: formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')<br />
function p.formatInLanguage(lang, dataset, key, ...)<br />
local checkType = require('libraryUtil').checkType<br />
checkType('formatInLanguage', 1, lang, 'string')<br />
checkType('formatInLanguage', 2, dataset, 'string')<br />
checkType('formatInLanguage', 3, key, 'string')<br />
return formatMessage(dataset, key, {...}, lang)<br />
end<br />
<br />
-- Obsolete function that adds a 'c:' prefix to the first param.<br />
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'<br />
function p.link(frame)<br />
return link(frame.args[1])<br />
end<br />
<br />
function p.doc(frame)<br />
local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])<br />
return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..<br />
formatMessage(i18nDataset, 'edit_doc', {link(dataset)})<br />
end<br />
<br />
function p.getTemplateData(dataset)<br />
-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages<br />
local data = loadData(dataset)<br />
local names = {}<br />
for _, field in pairs(data.schema.fields) do<br />
table.insert(names, field.name)<br />
end<br />
<br />
local params = {}<br />
local paramOrder = {}<br />
for _, row in pairs(data.data) do<br />
local newVal = {}<br />
local name = nil<br />
for pos, val in pairs(row) do<br />
local columnName = names[pos]<br />
if columnName == 'name' then<br />
name = val<br />
else<br />
newVal[columnName] = val<br />
end<br />
end<br />
if name then<br />
params[name] = newVal<br />
table.insert(paramOrder, name)<br />
end<br />
end<br />
<br />
-- Work around json encoding treating {"1":{...}} as an [{...}]<br />
params['zzz123']=''<br />
<br />
local json = mw.text.jsonEncode({<br />
params=params,<br />
paramOrder=paramOrder,<br />
description=data.description<br />
})<br />
<br />
json = string.gsub(json,'"zzz123":"",?', "")<br />
<br />
return json<br />
end<br />
<br />
-- Local functions<br />
<br />
sanitizeDataset = function(dataset)<br />
if not dataset then<br />
return nil<br />
end<br />
dataset = mw.text.trim(dataset)<br />
if dataset == '' then<br />
return nil<br />
elseif string.sub(dataset,-4) ~= '.tab' then<br />
return dataset .. '.tab'<br />
else<br />
return dataset<br />
end<br />
end<br />
<br />
loadData = function(dataset, lang)<br />
dataset = sanitizeDataset(dataset)<br />
if not dataset then<br />
error(formatMessage(i18nDataset, 'error_no_dataset', {}))<br />
end<br />
<br />
-- Give helpful error to thirdparties who try and copy this module.<br />
if not mw.ext or not mw.ext.data or not mw.ext.data.get then<br />
error('Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:' .. dataset)<br />
end<br />
<br />
local data = mw.ext.data.get(dataset, lang)<br />
<br />
if data == false then<br />
if dataset == i18nDataset then<br />
-- Prevent cyclical calls<br />
error('Missing Commons dataset ' .. i18nDataset)<br />
else<br />
error(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))<br />
end<br />
end<br />
return data<br />
end<br />
<br />
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix<br />
link = function(dataset)<br />
return 'c:Data:' .. mw.text.trim(dataset or '')<br />
end<br />
<br />
formatMessage = function(dataset, key, params, lang)<br />
for _, row in pairs(loadData(dataset, lang).data) do<br />
local id, msg = unpack(row)<br />
if id == key then<br />
local result = mw.message.newRawMessage(msg, unpack(params or {}))<br />
return result:plain()<br />
end<br />
end<br />
if dataset == i18nDataset then<br />
-- Prevent cyclical calls<br />
error('Invalid message key "' .. key .. '"')<br />
else<br />
error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))<br />
end<br />
end<br />
<br />
return p</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:No_globals&diff=31619Modul:No globals2022-04-13T18:50:22Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>local mt = getmetatable(_G) or {}<br />
function mt.__index (t, k)<br />
if k ~= 'arg' then<br />
error('Tried to read nil global ' .. tostring(k), 2)<br />
end<br />
return nil<br />
end<br />
function mt.__newindex(t, k, v)<br />
if k ~= 'arg' then<br />
error('Tried to write global ' .. tostring(k), 2)<br />
end<br />
rawset(t, k, v)<br />
end<br />
setmetatable(_G, mt)</div>TheGamer93https://howtobeahero.de/index.php?title=Modul:Languages&diff=31617Modul:Languages2022-04-13T18:50:22Z<p>TheGamer93: 1 Version importiert: Button-Test</p>
<hr />
<div>--[=[<br />
Not globally exposed. Internal function only.<br />
<br />
language_subpages( frame, transform, options )<br />
Parameters<br />
frame: The frame that was passed to the method invoked. The first argument or the page argument will be respected.<br />
transform: A transform function. Example: function( basepagename, subpagename, code, langname ) end<br />
options: An object with options. Example: { abort= { on=function() end, time=0.8 } }<br />
Following options are available:<br />
abort: Aborts iterating over the subpages if one of the conditions is met. If the process is aborted, nil is returned!<br />
on: Function to be called if an abort-condition was met.<br />
cycles: The maximum number of subpages to run over.<br />
time: Maximum time to spend running over the subpages.<br />
<br />
]=]<br />
function language_subpages( frame, transform, options )<br />
local args, pargs, options = frame.args, ( frame:getParent() or {} ).args or {}, options or {};<br />
local title = args.page or args[1] or pargs.page or pargs[1] or "";<br />
local abort = options.abort or {};<br />
local at, clock = type( abort.on ), os.clock();<br />
local ac = function()<br />
if at == 'function' or ( at == 'table' and getmetatable(abort.on).__call ) then<br />
abort.on();<br />
end<br />
end<br />
local tt = type( transform );<br />
local page = require( 'Module:Page' );<br />
<br />
title = page.clean(title);<br />
<br />
if tt == 'function' or ( tt == 'table' and getmetatable(transform).__call ) then<br />
local fetch, pages, langcode, langname = mw.language.fetchLanguageName, {};<br />
--[==[<br />
<br />
/ \<br />
/ | \<br />
/ · \<br />
¯¯¯¯¯¯¯<br />
Page.subpages() no longer works because it attempted to parse the HTML content generated by<br />
calling the parser function "Special:Prefixindex:" which is no longer expanded in Lua but<br />
converted to a "stripped tag" (containing a unique identifier surrounded by ASCII DEL characters)<br />
representing the tag name and its parameters.<br />
The actual expansion of stripped tags can no longer be performed in Lua.<br />
Now unstripping these tags just kills ALL these tags (except "wiki" tags) instead of performing<br />
their expansion by running the extension code. Only MediaWiki can unstrip these tags in texts after<br />
they have been returned by Lua.<br />
For this reason, page.subpages() is now completely empty (Module:Page no longer works).<br />
This cannot be bypassed, except by using a Scribunto extension library if lifting the limits set by mw.unstrip.<br />
Note that "Special:Prefixindex:" is also costly, even if it just requires a single database query to<br />
get all subpages, instead of one costly #ifexist or one costly mw.title() property reading per<br />
tested subpage to know if it exists.<br />
For now there's still no reliable way to get a list of subpages, or performing queries similar to<br />
the [[Special:Prefixindex]] page or list members of a category like when viewing a category page.<br />
Ideally, there should exist a method for such queries on Title objects returned by the mw.title library;<br />
but for now there's none.<br />
In Lua now, the only expansion possible with an immediate effect is the expansion of standard templates,<br />
all special tags or special pages, or parser function extensions do not work (Only the #expr parser<br />
function is supported by using an external Scribunto library).<br />
--]==]<br />
for pg in page.subpages( title, { ignoreNS=true } ) do<br />
if abort.cycles then<br />
abort.cycles = abort.cycles - 1<br />
if 0 == abort.cycles then return ac() end<br />
end<br />
if abort.time then<br />
if (os.clock() - clock) > abort.time then return ac() end<br />
end<br />
if mw.ustring.len( pg ) <= 12 then<br />
langcode = string.lower( pg );<br />
langname = fetch( langcode );<br />
if langname ~= '' then<br />
table.insert( pages, transform( title, pg, langcode, langname ) );<br />
end<br />
end<br />
end<br />
return pages;<br />
end<br />
return {};<br />
end<br />
<br />
function cloneArgs(frame)<br />
local args, pargs = {}, {}<br />
for k,v in pairs( frame.args ) do args[k] = v end<br />
if frame:getParent() then<br />
for k,v in pairs( frame:getParent().args ) do pargs[k] = v end<br />
end<br />
return args, pargs<br />
end<br />
<br />
<br />
<br />
local p = {};<br />
<br />
--[=[<br />
Usage:<br />
{{#invoke:languages|internal|Template:Adjective}}<br />
]=]<br />
function p.internal(frame)<br />
return table.concat(<br />
language_subpages( frame,<br />
function( title, page, code, name )<br />
return mw.ustring.format(<br />
'<bdi class="language lang-%s" lang="%s">[[%s/%s|%s]]</bdi>',<br />
code, code,<br />
title, page,<br />
name<br />
);<br />
end<br />
),<br />
'&nbsp;<b>·</b>&#32;'<br />
);<br />
end<br />
<br />
--[=[<br />
Usage:<br />
{{#invoke:languages|external|Template:Adjective}}<br />
]=]<br />
function p.external(frame)<br />
return table.concat(<br />
language_subpages( frame,<br />
function( title, page, code, name )<br />
return mw.ustring.format(<br />
'<bdi class="language lang-%s" lang="%s">[%s/%s %s]</bdi>',<br />
code, code,<br />
tostring( mw.uri.fullUrl( title ) ), page:gsub( ' ', '_' ),<br />
name<br />
);<br />
end<br />
),<br />
'&nbsp;<b>·</b>&#32;'<br />
);<br />
end<br />
<br />
--[=[<br />
forEachLanguage<br />
<br />
This function iterates over all language codes known to MediaWiki based on a maintained list<br />
replacing patterns in a pattern-string for each language<br />
<br />
Usage<br />
{{#invoke:Languages|forEachLanguage<br />
|pattern=patternstring<br />
|before=string to insert before iteration<br />
|after=string added after iteration<br />
|sep=separator string between iterations<br />
|inLang=langcode used for $lnTrP and $lnTrUC1<br />
}}<br />
<br />
Parameters<br />
pattern: A pattern string which is processed for each language and which is concatenated at the end and returned as one string<br />
before: A string that is inserted before the concatenated result<br />
after: A string that is inserted after the concatenated result<br />
sep: A string that is inserted between each line created from the pattern while iterating (like ProcessedPattern_sep_ProcessedPattern_sep_ProcessedPattern)<br />
inLang: Langcode to use for $lnTrP and $lnTrUC1<br />
preprocess: if set to a non-empty value, the output will be preprocessed before being returned.<br />
<br />
Warning<br />
The output is still not prepreprocessed by default: so parser functions and magic keywords generated by the pattern are still not executed and replaced,<br />
and template transclusions are still not expanded (see examples in other functions in this module).<br />
When using this function directly from a MediaWiki page or template, this means it is only possible to use patterns generating basic MediaWiki formatting<br />
or HTML tags. It you want the output to be preprocessed (in the given frame), set the preprocess parameter to a non-empty string.<br />
<br />
Patterns<br />
$lc - language code such as en or de<br />
$lnP - language name in own language (autonym)<br />
$lnUC1 - language name in own language (autonym), first letter upper case<br />
$lnTrP - language name translated to the language requested by language code passed to inLang<br />
$lnTrUC1 - language name translated to the language requested by language code passed to inLang, first letter upper case<br />
<br />
Example<br />
{{#invoke:Languages|forEachLanguage|pattern=<span lang="$lc" xml:lang="$lc" class="language lang-$lc">[[Page/$lc|$lnP]]</span>}}<br />
]=]<br />
<br />
-- =p.forEachLanguage({ args= { pattern = "$lc - $lnTrP\n", inLang = "en" } })<br />
function p.forEachLanguage(frame)<br />
local l = require("Module:Languages/List")<br />
<br />
local ret = {}<br />
local lang = mw.language<br />
local line<br />
local pattern = frame.args.pattern or frame.args[1] or ""<br />
local prefix = frame.args.before or frame.args[2] or ""<br />
local postfix = frame.args.after or frame.args[3] or ""<br />
local sep = frame.args.sep or frame.args.separator or frame.args[4] or ""<br />
local inLang = frame.args.inLang or frame.args[5] or nil<br />
local preprocess = frame.args.preprocess or frame.args[6] or ""<br />
<br />
local langNameUCFirstReq = not not pattern:find( "$lnUC1", 1, true )<br />
local langNameReq = not not pattern:find( "$lnP", 1, true ) or langNameUCFirstReq<br />
local langNameTranslatedUCFirstReq = not not pattern:find( "$lnTrUC1", 1, true )<br />
local langNameTranslatedReq = not not pattern:find( "$lnTrP", 1, true ) or langNameTranslatedUCFirstReq<br />
local contentLangInstance = mw.language.getContentLanguage()<br />
local inLangLangInstance<br />
local l = mw.language.fetchLanguageNames() -- autonyms<br />
local lTr<br />
local lcIdList = require('Module:Languages/List').getSortedList( l )<br />
<br />
if langNameTranslatedReq then<br />
inLangLangInstance = --[==[<br />
mw.getLanguage( inLang ) -- Quota hit in :ucfirst() if using too many langInstances<br />
--]==] contentLangInstance<br />
lTr = mw.language.fetchLanguageNames( inLang ) -- translated names<br />
end<br />
<br />
for _, lcId in pairs( lcIdList ) do<br />
local subst = lcId:gsub('%%', '%%%%')<br />
line = pattern:gsub( "%$lc", subst )<br />
local langName, langInstance<br />
-- autonym (name of lcId in locale lcId)<br />
if langNameReq then<br />
langName = l[lcId]<br />
subst = langName:gsub('%%', '%%%%')<br />
line = line:gsub( "%$lnP", subst )<br />
end<br />
if langNameUCFirstReq then<br />
langInstance = --[==[<br />
mw.getLanguage( lcId ) -- Quota hit in :ucfirst() if using too many langInstances<br />
--]==] contentLangInstance<br />
langName = langInstance:ucfirst( langName )<br />
subst = langName:gsub('%%', '%%%%')<br />
line = line:gsub( "%$lnUC1", subst )<br />
end<br />
<br />
-- translated name (name of lcId in locale inLang)<br />
if langNameTranslatedReq then<br />
langName = lTr[lcId]<br />
subst = langName:gsub('%%', '%%%%')<br />
line = line:gsub( "%$lnTrP", subst )<br />
end<br />
if langNameTranslatedUCFirstReq then<br />
langName = inLangLangInstance:ucfirst( langName )<br />
subst = langName:gsub('%%', '%%%%')<br />
line = line:gsub( "%$lnTrUC1", subst )<br />
end<br />
<br />
table.insert(ret, line)<br />
end<br />
ret = prefix .. table.concat( ret, sep ) .. postfix<br />
if preprocess ~= '' then<br />
ret = frame:preprocess(ret)<br />
end<br />
return ret<br />
end<br />
<br />
--[=[<br />
Provide logic for [[Template:Lle]] (Language Links external, to be substituted, language names written exactly as #language would provide them)<br />
Warning: may expands too many costly #ifexist without limitation (if not substituted into a separate "/lang" template)<br />
]=]<br />
function p.lle(frame)<br />
return frame:preprocess(<br />
p.forEachLanguage({<br />
args = {<br />
pattern = '{{subst:#ifexist:{{{1}}}/$lc|[{{subst:fullurl:{{{1}}}/$lc}} <bdi class="language lang-$lc" lang="$lc">$lnP</bdi>]&nbsp;<b>∙</b>&#32;<!--\n-->}}'<br />
}<br />
})<br />
)<br />
end<br />
<br />
--[=[<br />
Provide logic for [[Template:Ll]] (Language Links internal, to be substituted, language names written exactly as #language would provide them)<br />
Warning: may expands too many costly #ifexist without limitation (if not substituted into a separate "/lang" template)<br />
]=]<br />
function p.ll(frame)<br />
return frame:preprocess(<br />
p.forEachLanguage({<br />
args = {<br />
pattern = '{{subst:#ifexist:{{{1}}}/$lc|[[{{{1}}}/$lc|<bdi class="language lang-$lc" lang="$lc">$lnP</bdi>]]&nbsp;<b>∙</b>&#32;<!--\n-->}}'<br />
}<br />
})<br />
)<br />
end<br />
<br />
<br />
--------------------------------------------------------<br />
--- Different approaches for [[Template:Lang links]] ---<br />
--------------------------------------------------------<br />
<br />
--[=[<br />
Provide logic for [[Template:Lang links]]<br />
Using a cute Hybrid-Method:<br />
First check the subpages which is quite fast; if there are too many fall back to checking for each language page individually<br />
]=]<br />
<br />
-- =p.langLinksNonExpensive({ args= { page='Commons:Picture of the Year/2010' }, getParent=function() end })<br />
-- =p.langLinksNonExpensive({ args= { page='Main Page' }, getParent=function() end })<br />
-- =p.langLinksNonExpensive({ args= { page='Template:No_source_since' }, getParent=function() end })<br />
-- =p.langLinksNonExpensive({ args= { page='MediaWiki:Gadget-HotCat' }, getParent=function() end })<br />
function p.langLinksNonExpensive(frame)<br />
local args, pargs = frame.args, ( frame:getParent() or {} ).args or {};<br />
local title = args.page or args[1] or pargs.page or pargs[1] or "";<br />
local contentLangInstance = mw.language.getContentLanguage();<br />
local pages2<br />
if frame.preprocess == nil then<br />
frame = mw.getCurrentFrame()<br />
end<br />
--[==[<br />
local options = {<br />
abort = {<br />
time = 3.5,<br />
on = function()<br />
pages2 = p.forEachLanguage({<br />
args = {<br />
pattern = '{{#ifexist:' .. title .. '/$lc|[[' .. title .. '/$lc|<bdi lang="$lc">$lnP</bdi>]]&nbsp;<b>∙</b>&#32;}}'<br />
}<br />
})<br />
end<br />
}<br />
}<br />
local pages = language_subpages( frame,<br />
function( title, page, code, langname )<br />
return mw.ustring.format(<br />
'[[%s/%s|<bdi lang="%s">%s</bdi>]]</span>&nbsp;<b>∙</b>&#32;',<br />
title, page, code, langname<br />
)<br />
end, options );<br />
return pages2 and frame:preprocess(pages2) or table.concat(pages, '');<br />
--]==]<br />
return frame:preprocess(<br />
p.forEachLanguage( {<br />
args = {<br />
pattern = '{{#ifexist:' .. title .. '/$lc|[[' .. title .. '/$lc|<bdi lang="$lc">$lnP</bdi>]]&nbsp;<b>∙</b>&#32;}}'<br />
}<br />
})<br />
)<br />
end<br />
<br />
---------------------------------------------------------<br />
----------------- [[Template:Autolang]] -----------------<br />
---------------------------------------------------------<br />
--[[<br />
Works like {{autotranslate}} just allowing an unlimited number of arguments, even named arguments.<br />
It's doing Magic! No arguments should be passed to {{#invoke:}}<br />
]]<br />
<br />
function p.autolang(frame)<br />
local args, pargs = cloneArgs( frame )<br />
if nil == args.useargs then<br />
if not args.base then args = pargs end<br />
elseif 'both' == args.useargs then<br />
for k,v in pairs(args) do pargs[k] = v end<br />
args = pargs<br />
elseif 'parent' == args.useargs then<br />
args = pargs<br />
if pargs.base and not args.base then<br />
args.base = pargs.base<br />
end<br />
end<br />
local base = args.base<br />
local userlang = frame:preprocess( '{{Int:Lang}}' )<br />
local tl, tlns = 'Template:', 10<br />
local tlb, fallback1, currenttemplate<br />
local fallback, contentlang = mw.text.split( userlang, '-', true )[1], mw.language.getContentLanguage():getCode()<br />
<br />
local createReturn = function(title)<br />
local ret<br />
local tlargs = {}<br />
-- When LUA is invoked, templates are already expanded. This must be respected.<br />
return frame:expandTemplate{ title = title, args = args }<br />
end<br />
<br />
if not base then<br />
return ("'autolang' in [[Module:Languages]] was called but the 'base' parameter could not be found." ..<br />
"The base parameter specifies the template that's subpages will be sought for a suitable translation.")<br />
end<br />
tlb = tl .. base .. '/'<br />
<br />
currenttemplate = tlb .. userlang<br />
local ok, exists = pcall( function()<br />
return mw.title.new( currenttemplate, tlns ).exists<br />
end )<br />
if ok and exists then<br />
return createReturn(currenttemplate)<br />
end<br />
<br />
fallback1 = frame:preprocess( '{{Fallback|1=' .. base .. '|2=' .. userlang .. '}}' )<br />
if fallback1 ~= contentlang then<br />
return createReturn(tlb .. fallback1)<br />
end<br />
<br />
currenttemplate = tlb .. fallback<br />
local ok, exists = pcall( function()<br />
return mw.title.new( currenttemplate, tlns ).exists<br />
end )<br />
if ok and exists then<br />
return createReturn(currenttemplate)<br />
end<br />
<br />
currenttemplate = tlb .. contentlang<br />
local ok, exists = pcall( function()<br />
return mw.title.new( currenttemplate, tlns ).exists<br />
end )<br />
if ok and exists then<br />
return createReturn(currenttemplate)<br />
end<br />
return createReturn(tl .. base)<br />
end<br />
<br />
--[=[<br />
Usage:<br />
{{#invoke:languages|isKnownLanguageTag|gsw}} -> 1<br />
{{#invoke:languages|isKnownLanguageTag|doesNotExist}} -><br />
]=]<br />
function p.isKnownLanguageTag(frame)<br />
return mw.language.isKnownLanguageTag( frame.args[1] or frame.args.tag or frame.args.code or '' ) and '1' or ''<br />
end<br />
<br />
function p.file_languages(frame)<br />
local M_link = require( 'Module:Link' )<br />
local contentLangInstance = mw.language.getContentLanguage()<br />
local pattern = frame.args.pattern or '%s (%s)'<br />
local original = frame.args.original or mw.title.getCurrentTitle().text<br />
local ext_start, _ = string.find( original, '\.%w+$' )<br />
local file_ext = string.sub( original, ext_start )<br />
original = string.sub( original, 0, ext_start - 1 )<br />
return frame:preprocess(<br />
'<gallery>\n' ..<br />
(table.concat(<br />
M_link.forEachLink(<br />
p.forEachLanguage({<br />
args = { pattern = '[[$lc]]' }<br />
}),<br />
function( linkInfo )<br />
local filename = mw.ustring.format( pattern, original, linkInfo.text ) .. file_ext<br />
local ok, exists = pcall( function()<br />
return mw.title.new( filename, 6 ).exists<br />
end )<br />
if ok and exists then<br />
return mw.ustring.format( '%s|%s',<br />
filename,<br />
mw.language.fetchLanguageName( linkInfo.text )<br />
)<br />
else<br />
return nil<br />
end<br />
end<br />
), '\n'<br />
)) ..<br />
'\n</gallery>'<br />
)<br />
end<br />
<br />
function p.runTests()<br />
return p.langLinksNonExpensive({<br />
args = {<br />
page = 'Module:Languages/testcases/test'<br />
},<br />
getParent = function() end<br />
}) ==<br />
'[[Module:Languages/testcases/test/de|<bdi lang="de">Deutsch</bdi>]]&nbsp;<b>∙</b>&#32;' ..<br />
'[[Module:Languages/testcases/test/en|<bdi lang="en">English</bdi>]]&nbsp;<b>∙</b>&#32;'<br />
end<br />
<br />
return p;</div>TheGamer93