--- German version. English: Software [1] ---
Zum Ein Würfel System haben wir mehrere Python Programme entworfen.
Live verfolgen lässt sich die Entwicklung in einigen Mercurial Repositories auf BitBucket [11].
Ein paar Zusatzinfos und Code-Statistiken gibt es auf ohloh.org [12], von wo auch die folgenden Mini-Statistiken stammen:
Ich habe die letzten Tage endlich das EWS-Modul neugeschrieben - v.a. mein Teil am Code war doch sehr chaotisch. Es ist jetzt deutlich schlanker und einfacher zu lesen. Um zu testen, ob es bereits jetzt genügt, um ein Rollenspiel zu implementieren, habe ich einen kleinen grafischen Schlachtfeldgenerator geschrieben - naja, zumindest pseudographisch, aber schaut selbst :)
Wenn ihr es genauer sehen wollt, inklusive Einheitenzähler (die beiden Zahlen in der Mitte unten) und den durchschnittlichen Erfahrungspunkten (in Strichen pro Einheit), schaut euch doch den kleinen Screencast [13] dazu an (Direktdownload, webm). Darin sieht man knapp 2400 Kämpfer sich gegenseitig beharken und bekommt sogar einen Endkampf der Schlacht geboten, bei dem drei heldenhafte Blaue eine weit größere Streitmacht der Roten in die Knie zwingen und am Ende durch das Opfer des einen schwergerüsteten den Sieg davontragen :)
Es gibt im Skript 3 Arten von Kämpfern: Schwertmeister mit hohen Fertigkeiten (S), Gerüstete (A) und schwer bewaffnete (K). Jedesmal, wenn sie ihren Gegner treffen, gewinnen sie Erfahrung hinzu und werden automatisch gesteigert - inklusive automatischer Spezialisierung.
Das Skript verwendet dafür das Fokusmodul Kampf inklusive Überzahlregel (3 Punkte Bonus pro Freund um den Gegner, 3 Punkte Malus pro zusätzlichem Gegner um dich herum), und wie ihr seht, funktioniert es auch für größere Schlachten ganz gut :)
Es ist auf bitbucket.org/ArneBab/d6 [14] unter der GPL verfügbar.
Um es zu verwenden, müsst ihr es nur installieren, dann könnt ihr 1w6-Charaktere in Python-code nutzen:
easy_install d6
python3
from d6.char import Char, _examplechar, _exampleprofile
char = Char()
help(char)
Charaktere werden mit einer source-string und einem profile-string erzeugt. Source sind die Startwerte des Chars. Profile gibt Zusatzwerte für spätere automatische Steigerungen. Profile ist damit effektiv das Steigerungsprofil des Chars. Die Zahlen im Profile geben das Gewicht für die Steigerung an.
d6.charbase._examplechar
:
desc:
name: Tsiku
quote: Me eat you hat.
short: Strange traveller.
description: A strange traveller with hazel-colored eyes
and fur.
extras: {}
stats:
attributes:
creative: [3, 0] # the first value is always the cost
stubborn: [3, 0] # cost, mod
skills:
surprise: [3, "", creative] # cost, base, atts
startle: [3, surprise, creative]
special: {}
battle:
wound threshold: stubborn
d6.charbase._exampleprofile
:
attributes:
witty: 3
pure: 1
skills:
hide: 1
special:
rich: 1
PS: @Achim: Ich hoffe es gefällt dir!
Anhang | Größe |
---|---|
asciibattle-screenshot.png [15] | 14.1 KB |
asciibattle-screenshot1.png [16] | 13.32 KB |
asciibattle-screenshot3.png [17] | 6.22 KB |
asciibattle-screenshot4.png [18] | 2.7 KB |
asciibattle-screenshot5.png [19] | 5.1 KB |
Ich habe ein kleines Nahkampfprogramm entwickelt, das die Regeln des EWS umsetzt und damit zwei Blobs gegeneinander kämpfen lässt.
Es ist aktuell in Version 0.5 und ermöglicht den Kampf zwischen zwei Blobs.
Die Grafik ist bisher noch sehr vorläufig, aber die Kampflogik funktioniert bereits.
Blob Battle 0.5.0 kann direkt hier heruntergeladen werden:
- blob_battle-0.5.0.tar.gz [20] (~ 1.6MiB)
Der Spieler wählt für seinen Blob, wo er angreifen oder verteifdigen will. Der Gegner trifft seine Entscheidung automatisch.
Die Wahl der Position geht sowohl über die Pfeiltasten, als auch über das Zahlenfeld.
Angreifer und Verteidiger wechseln jede Runde.
Je nachdem, wie gut der gerade verteidigende Char die Angriffsposition seines Gegners vorhergesehen hat, erhält er Boni oder Mali (+-6 od. 0).
Dazu gibt es noch das Zufallselement des +-W6, und eine Schwierigkeit von eines Position zur nächsten zu wechseln (+- 1 od. 0).
Um das Programm zu nutzen, benötigst du Python [21] (>=2.5).
Wenn du Python installiert hast, entpacke einfach das Archiv und starte die Datei blob_battle.py mit Python.
Auf GNU/Linux geht das über
$ python blob_battle.py
Viel Spaß beim testen :)
Aktuell kann es nur getestet werden, aber unter der Oberfläche tut es bereits einiges mehr :)
Anhang | Größe |
---|---|
blob_battle-0.5.0.tar.gz [20] | 1.5 MB |
blob_battle_screenshot-2008-03-14-1_klein.png [22] | 65.75 KB |
blob_battle_screenshot-2008-03-14-2_klein.png [23] | 69.41 KB |
blob_battle_screenshot-2008-03-14-3_klein.png [24] | 67.49 KB |
Ein kleines Geschenk, das ich meiner Frau zum (bzw. am) Valentinstag 2008 geschrieben habe.
In seiner Gänze kann es allerdings in diesem Screenshot nicht genossen werden. Um das ganze animiert zu haben, musst du schon das Programm runterladen :) (es braucht nur Python [21] (>=2.5) ).
-> Blob Valentine 0.3 herunterladen [25]
Anhang | Größe |
---|---|
blob_valentine_screenshot-2008-02-15.png [26] | 209.4 KB |
blob_valentine-0.3.tar.gz [25] | 255 KB |
Mit
git clone https://github.com/SaschaMester/W-rfel
kann man sich noch eine kleine eigene Implementierung eines Würfels herunterladen.
Der Würfel ist als Modul gestaltet ( muss also in eigenen Python-Programmen mit from wuerfel import * importiert werden ), eine kleine Beispielimplementierung und eine Dokumentation liegen bei.
Nur mal als ne kleine Idee - meine Idee von gestern war zwar noch größer, aber ich werde an dem Würfelbeispiel auch noch weiter basteln. ;)
Google SoC 2008
Google Summer of Code™ Organization Application
Please note that you will be considered the administrator/main contact for this organization.
Also note that all fields are required unless otherwise indicated.
You have 5 Organization Application(s) left.
About Your Organization ^ back to top
1. What is your Organization's Name?
1d6 roleplaying
2. What is your Organization's Homepage?
http://1w6.org [27]
3. Describe your organization.
We are a community of roleplayers who are designing a flexible and balanced role-playing-system which is the only free rpg under copyleft licenses.
In development since 2003, it features a slim base system (ruleset) which was built to be built upon, and since the beginning of 2007 we use this base system to create free roleplaying utilities.
We work in python, because it is flexible, cross platform available and a joy to use, and we create the system under free licenses, because we believe that roleplaying not only makes the world more fun, but also makes it a better place, and the system people use creates the physics of their world, while they are playing, and these physics should be as free as the software they use.
4. Why is your organization applying to participate in GSoC 2008? What do you hope to gain by participating?
We hope to find more members for our programming team, who want to use the created groundwork and the balanced ruleset in creative and fun ways.
Also we hope to find people who help to use the already developed tools to create a general game-engine using Python and pyglet which facilitates game development by offering the 1d6 ruleset as base for game designers.
5. Did your organization participate in previous GSoC years? If so, please summarize your involvement and the successes and failures of your student projects. (optional)
no
6. If your organization has not previously participated in GSoC, have you applied in the past? If so, for what year(s)? (optional)
no
7. What license does your project use?
GPLv2 or later, GPLv3 or later and the GFDL as well as a weakened version of the GFDL to allow the game system to be used like a LGPL library in roleplaying worlds.
8. URL for your ideas page
http://1w6.org/deutsch/anhang/google-summer-code/ideas-2008 [28]
9. What is the main development mailing list for your organization?
We work directly on the website (drupal).
10. Where is the main IRC channel for your organization?
We work directly on the website (drupal).
11. Does your organization have an application template you would like to see students use? If so, please provide it now. (optional)
Yes: http://1w6.org/deutsch/anhang/google-summer-code/ideas-2008/appliance-te... [29]
12. Who will be your backup organization administrator? Please enter their Google Account address. We will email them to confirm, your organization will not become active until they respond. (optional)
About Your Mentors
1. What criteria did you use to select these individuals as mentors? Please be as specific as possible.
We chose among longstanding members who internalized the vision of the project and who know their way around the code.
2. Who will your mentors be? Please enter their Google Account address separated by commas. If your organization is accepted we will email each mentor to invite them to take part. (optional)
Achim?
About The Program
1. What is your plan for dealing with disappearing students?
We will make sure, that even an unfinished contribution will help the project by working with a clear roadmap with major milestones.
If a student disappears, we can not reach him/her, but we can take steps to minimize the chance that the student disappears in the first place.
For this, the student must report to the community on a weekly base, so he/she directly experiences the feedback.
Also the student must write well commented code, so even unfinished code can be completed by other members. Automatic testing will be done using the tools from Ohloh, backed by manual overview by the existing members of our project.
2. What is your plan for dealing with disappearing mentors?
We have backup mentors, and the mentors know, that their reputation is at stake.
Mentors must regularly report to the community, too, so that their work can be carried on easily.
3. What steps will you take to encourage students to interact with your project's community before, during and after the program?
As for reducing the chance for disappearance, we want them to report to the community on a weekly basis, so they directly experience the feedback and fun free software development brings with it.
4. What will you do to ensure that your accepted students stick with the project after GSoC concludes?
We will include them as full members in our planning, so that they can take an active role in the future of our project, so that they can feel a sense of ownership about the parts they contribute themselves.
Ideas for Google SoC projects:
What is your name?
Your full name
What do you want to do?
Please give short summary of your proposal.
Why is this proposal important to you?
What is your personal reason for wanting to do this project?
How does your proposal help roleplaying games in general and roleplaying games in python in particular?
What will our world gain when you act on your proposal?
Why are you exactly the right person to realize it?
Please give reasons and (where possible) credentials.
How do you intend to work in detail?
Here should be a more detailed description, what you want to accomplish, and how you want to accomplish it.
Please provide a roadmap.
It should consist of three major milestones (one for each month) and 9 minor milestones (three for each month), along with deliverables for each milestone.
Below follows additional information about you.
Where are you from?
Country, region and city.
How can we reach you?
email, IM, ...
Which languages do you speak?
And how well do you speak them?
Please remember, that your appliance has a limit of 7500 characters.
Passend zu Samhain und Halloween gibt es heute
1w6-Hexbattle mit Zombies!
Wenn ihr Hexbattle selbst testen wollt, werdet ihr unter bitbucket.org/ArneBab/hexbattle [31] fündig. Gestartet wird es mit
./hexbattle.py
Ich kann allerdings nicht garantieren, dass es bei euch läuft… (es ist bisher nur bei mir getestet)
Die praktische Verteilung von Hexbattle habe ich noch nicht geregelt. Vermutlich werde ich pyinstaller [32] verwenden, da muss ich mich aber noch besser einlesen…
Hexbattle hat sich über viele Umwege aus dem Schlachtfeldsimulator [2] entwickelt, den Achim Zien alias PiHalbe [33] Mitte 2007 mit mir zusammen angefangen hat.
Als Grundlage nutzt es das etwas veraltete rpg_1d6 Modul, für das es inzwischen eigentlich die neuere Alternative d6 [14] gibt - mit dem Asciibattle [5] als Testimplementierung. d6 braucht allerdings Python 3 und dafür ist die verwendete Grafikbibliothek Pyglet [34] noch nicht ausreichend getestet (v.a. nicht von mir ☺).
Wie es mit Hexbattle weitergeht weiß ich noch nicht. Vor 2 Wochen wurde es spielbar (mit Anfang, Ziel und Ende — ja, es gibt mehr als ein Ende, aber um die anderen zu sehen, müsst ihr es wohl spielen ☺).
Vor allem aber hatte ich Spaß daran, an ihm zu basteln und 1w6 auch auf dem Rechner endlich spielbar zu machen (und nicht mehr nur die verschiedenen Prototypen zu haben), und ich dachte, es könnte euch gerade heute gefallen ☺.
1w6 bietet durch die Überzahlregel einiges an Möglichkeiten für Taktiken kleiner Gruppen. Im Video wird nur sichtbar, was passiert, wenn ein Charakter eingekreist wird (die aufleuchtenden Kreise zeigen alle Gegner an, die dem getroffenen Charakter schadeten - entweder direkt oder durch Mali gegenüber seinem Gegner wegen Überzahl).
Zusätzlich haben natürlich Waffen und Rüstung nochmal eigene Auswirkungen, die hier aber noch nicht gezeigt werden: Die Unterschiede liegen hier nur in dem Fertigkeitswert: Bäume 15, Goblins 9, Ratten 6.
Das Video ist einfach mit recordmydesktop aufgenommen und ungeschnitten - die lange Musik am Ende und die falsche Länge der Fortschrittleiste des Videos ist einem Bug geschuldet, der den Bildteil schneller abspielt als den Ton. Das war mir dann aber nicht so wichtig, schließlich ist an dem Punkt der relevante Teil schon vorbei ☺ - ich hoffe, ihr könnt das genauso ignorieren wie ich ☺
Ich hoffe ihr hattet Spaß beim Zuschauen und Lesen.
Ich wünsche euch ein schönes Samhain und/oder Halloween!
Anhang | Größe |
---|---|
hexbattle-2013-10-30-1a507e4-poster.png [35] | 1.43 MB |
Ich habe ein kleines Skript [36] geschrieben, das die Chancen im Kampf prüft und damit das Balancing von Waffen und Rüstungen erleichtert.
Die PyQt4-Version sieht so aus:
Die Quellen der PyQt4-Version gibt es unter https://hg.sr.ht/~arnebab/ews/browse/Skripte/1w6-balance/1w6-balance.py?rev=tip [37].
GNU/Linux Nutzer können sich die Quellen dort direkt runterladen, PyQt4 installeiren (deine interne Paketverwaltung hat es) und die GUI dann mit
./1w6-balance.py
Das Befehlszeilen-Skript findest du im Repository des EWS: battle_probability_tree.py [36]
Es baut dafür einen vollständigen Wahrscheinlichkeitsbaum auf, in dem es die Chancen für die verschiedenen Ausgänge von Nahkämpfen vollständig durchrechnet.
Die Zielsetzung ist es, Aussagen wie "ein legendärer Schwertkämpfer besiegt eine Stadtwache fast immer" überprüfen zu können und auch Zahlenwerte dafür zu haben, um auf stabiler Grundlage arbeiten zu können, wenn wir an Welten oder Ausrüstung basteln.
In der Ausgabe wird für jede Runde die Wahrscheinlichkeit von Sieg (Win) oder Niederlage (Lose) des Ersten über den Zweiten geprüft und außerdem die Wahrscheinlichkeit, dass der Kampf noch nicht beendet ist (Draw).
Sieg oder Niederlage heißt in der vereinfachten Version schlicht: Die Fertigkeit des Verlierers ist unter 3 gesunken oder er hat 5 Wunden oder eine kritische Wunde bekommen. Der Kampf endet also, sobald ein Fortsetzen für den Verlierer nicht mehr sinnvoll wäre.
Die Ausgabe des Befehlszeilen-Skriptes ohne irgendwelche Parameter sieht wie folgt aus:
$ python battle_probability_tree.py
Test battle length
Average char (12) vs. average char (12)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.0500257201646 Lose: 0.0500257201646 Draw: 0.899948559671
Probs after 2 turns: Win: 0.0825998323426 Lose: 0.0825998323426 Draw: 0.834800335315
Probs after 3 turns: Win: 0.13314465264 Lose: 0.13314465264 Draw: 0.73371069472
Probs after 4 turns: Win: 0.228099438234 Lose: 0.228099438234 Draw: 0.543801123531
Probs after 5 turns: Win: 0.319366335834 Lose: 0.319366335834 Draw: 0.361267328333
Probs after 6 turns: Win: 0.387555447652 Lose: 0.387555447652 Draw: 0.224889104696
Very good char (15) vs. average char (12)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.10853909465 Lose: 0.0216049382716 Draw: 0.869855967078
Probs after 2 turns: Win: 0.236525491541 Lose: 0.0262768394681 Draw: 0.737197668991
Probs after 3 turns: Win: 0.394982229404 Lose: 0.0330739949555 Draw: 0.571943775641
Probs after 4 turns: Win: 0.583043117362 Lose: 0.0436719898117 Draw: 0.373284892826
Probs after 5 turns: Win: 0.705475323711 Lose: 0.0629808921072 Draw: 0.231543784181
Probs after 6 turns: Win: 0.774199931003 Lose: 0.084538802759 Draw: 0.141261266238
Exceptional char (18) vs. average char (12)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.248671124829 Lose: 0.00835905349794 Draw: 0.742969821674
Probs after 2 turns: Win: 0.489134421201 Lose: 0.00835905349794 Draw: 0.502506525301
Probs after 3 turns: Win: 0.694089138364 Lose: 0.00880498875934 Draw: 0.297105872877
Probs after 4 turns: Win: 0.852631396031 Lose: 0.00953491750495 Draw: 0.137833686464
Probs after 5 turns: Win: 0.922635958899 Lose: 0.0106816159868 Draw: 0.0666824251146
Probs after 6 turns: Win: 0.951628366665 Lose: 0.0127371423598 Draw: 0.0356344909755
Legend (24, weapon 24, armor 10) vs. Space Marine (15, weapon 36, armor 36, wound threshold 5)
Probs after 0 turns: Win: 0 Lose: 0 Draw: 1
Probs after 1 turns: Win: 0.00437242798354 Lose: 0.0545267489712 Draw: 0.941100823045
Probs after 2 turns: Win: 0.00437242798354 Lose: 0.0777749199817 Draw: 0.917852652035
Probs after 3 turns: Win: 0.00437242798354 Lose: 0.0984399608799 Draw: 0.897187611137
Probs after 4 turns: Win: 0.00517618312757 Lose: 0.116808886123 Draw: 0.87801493075
Probs after 5 turns: Win: 0.010894090607 Lose: 0.133136819672 Draw: 0.855969089721
Probs after 6 turns: Win: 0.0240620171956 Lose: 0.147650538382 Draw: 0.828287444422
Probs after 6 turns:
Very good char (15) vs. average char (12) without critical hits
Win: 0.791038330532 Lose: 0.0631941594366 Draw: 0.145767510032
Very good char (15) vs. average char (12)
Win: 0.774199931003 Lose: 0.084538802759 Draw: 0.141261266238
Exceptional char (18) vs. average char (12)
Win: 0.951628366665 Lose: 0.0127371423598 Draw: 0.0356344909755
Very good char (15) vs. average char in strong armor (12, armor 10)
Win: 0.113604807296 Lose: 0.134066609421 Draw: 0.752328583283
Very good char (15) vs. average char with powerful weapon (12, weapon 14)
Win: 0.548245836441 Lose: 0.448216768079 Draw: 0.00353739548028
Very good char (15) vs. sturdy char (12, wound threshold 10)
Win: 0.127951789127 Lose: 0.129439196773 Draw: 0.7426090141
Exceptional char (18) vs. average char with powerful weapon (12, weapon 14) and strong armor (armor 10)
Win: 0.355243806909 Lose: 0.40117721942 Draw: 0.243578973671
Alternativ zu dieser Standardausgabe kannst du mit dem Skript auch direkt Charaktere gegeneinander antreten lassen und so verschiedene Fertigkeitswerte, Waffen und Rüstungen vergleichen.
Das Ergebnis war erstmal: Die Beschreibungen der Fertigkeitswerte passen. "Sehr gut vs. durchschnitt" hat nach 6 Runden eine 77% Chance den Kampf für sich entschieden zu haben (und kritische Treffer erhöhen die Chancen des Schwächeren). Bei "überragend vs. durchschnitt" sind das schon 95%.
Die zweite für mich interessante Frage daran war: "Wann gleichen sich die Werte aus?", also wann stehen die Chancen 50/50.
Damit können wir z.B. herausfinden, wie viel eine Rüstung bringt, und damit können wir die Kosten für Rüstungen und Waffen prüfen, indem wir uns an den Kosten für die Fertigkeitswerte orientieren, mit denen ein Char gleichstark wird (Chance 50/50).
Das Ergebnis davon war, dass seit Version 2.4.0 des 1w6-Systems Waffen und Rüstungen ein Dreieck je 9 Punkte Schaden+Schutz kosten statt ein Dreieck je 18 Punkte und damit die Chancen von sehr starken Waffen oder Rüstungen im Vergleich zu kämpfern, die die gleichen Punkte in ihre Fertigkeit gesteckt haben, wieder ausgeglichen sind.
Die Verwendung sagt dir das Skript über
./battle_probability_tree.py --help
Die erwähnten charfiles sehen so aus: Sskreszta charfile [38]
Viel Spaß beim Testen!
Anhang | Größe |
---|---|
v0.1-main-window.png [39] | 106.19 KB |
Dieses Modul existiert noch nicht ... dafür entsteht ein Programm, das die in Entwicklung befindlichen Regeln umsetzt.
(Blog-Beitrage und weitere Texte zu dem Programm [40], allgemeine Infos unten)
Schlachtfeld ist ein kleines Werkzeug zum abhandeln von Kämpfen.
Die Ausgabe sieht bisher wie folgt aus:
Folgende Eigenschaften hat das Skript:
Eine Überzahl sollte sich damit schnell bemerkbar machen, sich aber ab einer gewissen Größe verlaufen (Wie bekämpft man mit 1.000 Mann eine Truppe von 10 Leuten??)
''Hier entwickeln wir ein paar Programmier-Richtlinien für das Schlachtfeld. @Achim: Wenn du einige stabile Richtlinien einfügen willst, tu es einfach. '' - [[Benutzer:ArneBab|Arne]] 19:50, 2. Jul 2007 (CEST)
Alle Dateien sollten in utf-8 kodiert sein.
Sie müssen auf der ersten oder zweiten Zeile einen Eintrag enthalten, der die Kodierung anzeigt.
Beispiel:
# encoding: utf-8
Sie sollten auf der ersten Zeile den Aufruf für die Bash enthalten:
#!/bin/env python
Alle Strings sollten als Unicode kodiert sein.
Noch suchen wir nach einer passenden Lokalisierungslösung. In Gentoo-GNU/Linux fehlt (noch) pygettext.py
Jegliche Pläne und Ideen sollten in den Docstrings in den Unterpunkten Pläne und Ideen festgehalten werden.
So haben wir einen zentralen Ort, wo Programmierideen gespeichert und verwaltet werden können.
-----
Anhang | Größe |
---|---|
schlachtfeld-0.2_pre1.tar.gz [43] | 470.45 KB |
Hier ist eine Beispielausgabe des Schlachtfeldprogramms.
Sie wurde mit Version v0.2.4 erstellt und zeigt einen Kampf zwischen Menschen und Goblins, die Menschen mit einer Heldin auf ihrer Seite (Sskreszta).
Die Schlacht enthält bereits Charakterentwicklung jedes einzelnen Kämpfers, Moral und Desertierung, automatische Bildung von Schlachtreihen, rudimentäre Heilung sowie vollständige Kampfabwicklung.
['schlachtfeld.py'] === === Vor der Schlacht === === Armeen: - Menschen Armee Typus: 'Armee' Status: None Aktiv: 11 Inaktiv: 0 Tot, geflohen: 0, 0 - Goblin Armee Typus: 'Armee' Status: None Aktiv: 15 Inaktiv: 0 Tot, geflohen: 0, 0 Helden und Anführer: - Name: Sskreszta TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 16, Striche: 12 Aktuelle Moral: [12, 0, 0, 0, 0] Art: Held Sprache: Batallion: Menschen Armee 1 zufällig gewählter Kämpfer aus jeder Gruppe: Name: Prepe Junince TP: 36 Wunden: [0, 0] Aktiv: True Angriff: 9, Striche: 3 Aktuelle Moral: [10, 0, 0, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Name: Floont Browhice TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 9, Striche: 2 Aktuelle Moral: [9, 0, 0, 0, 0] Art: Soldat Sprache: Englisch Batallion: Goblin Armee === === Nächste Runde === === Armeen: - Menschen Armee Typus: 'Armee' Status: None Aktiv: 11 Inaktiv: 0 Tot, geflohen: 0, 0 - Goblin Armee Typus: 'Armee' Status: None Aktiv: 15 Inaktiv: 0 Tot, geflohen: 10, 0 Helden und Anführer: - Name: Sskreszta TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 16, Striche: 12 Aktuelle Moral: [12, 0, 1, 0, 0] Art: Held Sprache: Batallion: Menschen Armee Unsere gewählten Kämpfer: Name: Prepe Junince TP: 32 Wunden: [1, 0] Aktiv: True Angriff: 12, Striche: 3 Aktuelle Moral: [10, 0, 0, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Name: Floont Browhice TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 9, Striche: 2 Aktuelle Moral: [9, 0, 0, 0, 0] Art: Soldat Sprache: Englisch Batallion: Goblin Armee === === Nächste Runde === === Armeen: - Menschen Armee Typus: 'Armee' Status: None Aktiv: 11 Inaktiv: 0 Tot, geflohen: 2, 0 - Goblin Armee Typus: 'Armee' Status: None Aktiv: 4 Inaktiv: 0 Tot, geflohen: 12, 0 Helden und Anführer: - Name: Sskreszta TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 16, Striche: 12 Aktuelle Moral: [12, 0, 1, 0, 0] Art: Held Sprache: Batallion: Menschen Armee Unsere gewählten Kämpfer: Name: Prepe Junince TP: 32 Wunden: [1, 0] Aktiv: True Angriff: 12, Striche: 3 Aktuelle Moral: [10, 0, 0, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Name: Floont Browhice TP: 20 Wunden: [1, 0] Aktiv: True Angriff: 12, Striche: 2 Aktuelle Moral: [9, 0, 0, 0, 0] Art: Soldat Sprache: Englisch Batallion: Goblin Armee === === Nächste Runde === === Armeen: - Menschen Armee Typus: 'Armee' Status: None Aktiv: 9 Inaktiv: 0 Tot, geflohen: 3, 0 - Goblin Armee Typus: 'Armee' Status: None Aktiv: 2 Inaktiv: 0 Tot, geflohen: 13, 0 Helden und Anführer: - Name: Sskreszta TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 16, Striche: 12 Aktuelle Moral: [12, 0, 1, 0, 0] Art: Held Sprache: Batallion: Menschen Armee Unsere gewählten Kämpfer: Name: Prepe Junince TP: 32 Wunden: [1, 0] Aktiv: True Angriff: 12, Striche: 3 Aktuelle Moral: [10, 0, 0, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Name: Floont Browhice TP: 8 Wunden: [4, 0] Aktiv: True Angriff: 12, Striche: 3.046140130797915 Aktuelle Moral: [9, 0, -2, 0, 0] Art: Soldat Sprache: Englisch Batallion: Goblin Armee === === Nächste Runde === === Armeen: - Menschen Armee Typus: 'Armee' Status: None Aktiv: 8 Inaktiv: 0 Tot, geflohen: 3, 0 - Goblin Armee Typus: 'Armee' Status: None Aktiv: 1 Inaktiv: 0 Tot, geflohen: 13, 1 Helden und Anführer: - Name: Sskreszta TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 16, Striche: 12 Aktuelle Moral: [12, 0, 1, 0, 0] Art: Held Sprache: Batallion: Menschen Armee Unsere gewählten Kämpfer: Name: Prepe Junince TP: 32 Wunden: [1, 0] Aktiv: True Angriff: 12, Striche: 3 Aktuelle Moral: [10, 0, 0, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Name: Floont Browhice TP: 8 Wunden: [4, 0] Aktiv: True Angriff: 12, Striche: 4.0764342924692158 Aktuelle Moral: [9, 0, -1, 0, 0] Art: Soldat Sprache: Englisch Desertiert === === Nach der Schlacht === === Armeen: Menschen Armee Typus: 'Armee' Status: None Aktiv: 8 Inaktiv: 0 Tot, geflohen: 3, 0 Goblin Armee Typus: 'Armee' Status: None Aktiv: 0 Inaktiv: 0 Tot, geflohen: 13, 1 Helden und Anführer: - Name: Sskreszta TP: 24 Wunden: [0, 0] Aktiv: True Angriff: 16, Striche: 12 Aktuelle Moral: [12, 0, 1, 0, 0] Art: Held Sprache: Batallion: Menschen Armee Unsere gewählten Kämpfer: Name: Prepe Junince TP: 32 Wunden: [1, 0] Aktiv: True Angriff: 12, Striche: 3 Aktuelle Moral: [10, 0, 0, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Name: Floont Browhice TP: 8 Wunden: [4, 0] Aktiv: True Angriff: 12, Striche: 4.0764342924692158 Aktuelle Moral: [9, 0, -1, 0, 0] Art: Soldat Sprache: Englisch Desertiert ... done! Die drei stärksten Soldaten (ohne Helden und Anführer): Name: Floont Browhice TP: 8 Wunden: [4, 0] Aktiv: True Angriff: 12, Striche: 4.0764342924692158 Aktuelle Moral: [9, 0, -1, 0, 0] Art: Soldat Sprache: Englisch Desertiert Name: Betres Suprottle TP: 4 Wunden: [5, 0] Aktiv: False Angriff: 12, Striche: 3.046140130797915 Aktuelle Moral: [12, 0, -4, 0, 0] Art: Soldat Sprache: Englisch Batallion: Goblin Armee Name: Degustaro Pomercion TP: -48 Wunden: [21, 0] Aktiv: False Angriff: 12, Striche: 3.5698370971171514 Aktuelle Moral: [10, 0, -20, 0, 0] Art: Soldat Sprache: Esperanto Batallion: Menschen Armee Der Schwächste Soldat: Name: Stiones Everalling TP: -48 Wunden: [18, 0] Aktiv: False Angriff: 9, Striche: 2 Aktuelle Moral: [10, 0, -18, 0, 0] Art: Soldat Sprache: Englisch Batallion: Goblin Armee
Diese Geschichte habe ich für eine Vorlesung in der Uni geschrieben. Sie zeigt einen Teil unserer Programmierarbeit, und wo dabei ein Muster (Pattern) [53] sichtbar wurde, das Zeit gespart hätte.
- Arne [7]
Ich habe das Yagni-Prinzip im Oktober 2007 kennengelernt, oder besser: Ich habe gemerkt, warum wir uns daran halten sollten.
Einen Monat zuvor hatten wir begonnen, unser Schlachtfeld-Programm zu überarbeiten. Es sollte komplexere Schlachten ermöglichen, nicht nur zwei Armeen, von denen Kämpfer aufeinander treffen, sondern beliebig viele einzelne Gruppen, die Schlachtreihen bildern, zu beliebig vielen Armeen gehören und Anführer und Armeen haben, die die Moral heben und Strategien ausarbeiten.
Ein wichtiger Aspekt daran waren Kampfstile der einzelnen Kämpfer.
Wir arbeiteten zwei Stunden daran, die Kampfstile zu prüfen, zu debuggen und zu entscheiden, was wir brauchen, um alle denkbaren Stile zu unterstützen, und wir haben einen halben Morgen daran verloren.
Am Ende traten wir einen Schritt zurück, warfen einen Blick auf den Code und merkten, dass das völlig unerheblich war.
Der Kampfstil-Code war in zwei Klassen gekapselt, und schon eine sehr einfache Version konnte die für's Erste notwendigen Stile unterstützen, und sie würde viele der Probleme von komplexeren Varianten vermeiden (z.B. "Wenn einer flieht und der Andere bis zum Tod kämpft, also stirbt, wenn er verliert, was pasiert, wenn der Fliehende gewinnt?" Antwort: "Wir lassen die Komplexität weg. Wenn einer es schafft zu fliehen wird ein Todesstil einfach weniger tödlich, und es gibt zur Zeit keine Notwendigkeit, das zu verallgemeinern.").
Wir rissen die Hälfte des überkomplexen Codes raus und implementierten, was wir aktuell brauchen, und jetzt läuft der Teil des Codes wie er soll.
Wir haben mehrere weitere Stunden aktuell unnötige Arbeit an Verallgemeinerung gespart. Sollten wir allgemeine Stile brauche, können wir sie immernoch hinzufügen, aber dann in ein voll funktionierendes und bereits nützliches Programm.
Unsere Motivation ist gestiegen, das Programm läuft, und gestern habe ich die Versionsverwaltung für Quelldateien deutlich verbessert, aber das ist eine Geschichte für einen anderen Tag.
Das TextRPG Modul bietet eine Skriptumgebung für textbasierte Computerrollenspiele und interaktive Geschichten.
Es wurde so entworfen, dass die als Code geschriebenen Geschichten ähnlich aussehen wie Drehbücher oder Theaterskripte.
Im deutschen Python Forum habe ich dazu ein schnelles Beispielskript [56] geschrieben, das zeigt wie eine schon recht komplexe Geschichte umgesetzt wird. Ein Beispiel für nichtlineare Geschichten [57] gibt es im Quellcode.
Dazu gibt es ein interaktives Tutorial (als TextRPG Skript geschrieben), das beim Download mitgeliefert wird (tutorial_de.py). Einfaches (doppelt) anklicken sollte es starten (zumindest auf GNU/LInux und MacOSX - wenn es nicht klappt, schreib mir bitte [58]!).
Zur Umsetzung von Geschichten bietet das TextRPG Modul dabei einige einfache Funktionen:
story()
gibt den Text aus, der ihr übergeben wird.
answer = ask()
Stellt die Frage in den Klammern und weist answer den Textwert der Antwort des Nutzers zu.
save(chars=[])
Speichert eine Liste von Charakteren. Beim nächsten laden der Charaktere werden sie die neuen Werte haben.
give_exp(char, amount=0)
Einem Char Erfahrungspunkte geben, die automatisch verteilt werden. Das Ergebnis wird als Textdialog angezeigt.
get_experience(chars=[], amount=0)
Einer Gruppe von Charakteren die gleiche Erfahrung geben. Das Ergebnis wird als gemeinsamer Textdialog angezeigt.
exit()
die Geschichte beenden (eine Standard-Python Funktion).
Zusätzlich definiert es die Klasse Char() über die Charaktere erzeugt werden können, die wiederum einige Praktische Möglichkeiten liefern.
Einige der Hauptmöglichkeiten sind:
char = Char(source="tag:1w6.org,2008:Name")
einen Charakter erzeugen. "source" ist im tag-Format: "tag:" + (url oder email-adresse) + "," + Jahr (yyyy) + ":" + Name des Chars).
char.say()
den Charakter sprechen lassen (wie story(), nur mit Charakternamen vor der Ausgabe und dem Vorteil, dass bei einer Umsetzung in eine GUI Umgebung genutzt werden kann, dass der Char spricht).
char.ask()
den Charakter fragen lassen (wie ask(), s.o.).
char.check_skill(skill_name, MW=9, related_skills=[name, name, ...], related_attributes=[name, name, ...], mods=[])
prüft, ob der Char eine bestimmte Fertigkeitsprobe schafft. Wundmali u.ä. sind direkt drin. Mods ist eine Liste von Zahlen: pos. und neg. Modifikatoren auf die Probe.
char.compete_skill(other, skill_name, self_mods=[], other_mods=[])
Lässt den Char in der gewählten Fertigkeit (skill) gegen den anderen Char antreten. Wundmali u.ä. sind direkt drin.
char.battle(other)
startet einen Interaktiven Kampf gegen einen anderen Charakter.
char.fight_one_roll_battle(other)
startet einen kurzen nicht-interaktiven Kampf mit dem Ein Wurf System. Einer der Charaktere ist danach kampfunfähig.
char.active
enthält die Information, ob der char aktiv ist (also fähig zu handeln).
char.alive
enthält die Information, ob der char lebt.
char.die()
tötet den char.
Weiterhin können jegliche anderen Python Befehle und Module genutzt werden, da die Skriptdateien einfache Python Dateien sind.
Zusätzlich zu seiner einfachen Syntax ist es so entworfen, dass eine Umsetzung eines eigentlich für eine Textausgabe geschriebenen Skriptes in eine GUI-Umgebung extrem einfach sein sollte (nur eine Zeile zu ändern). Was gehen sollte, sobald es ein Backend für eine GUI-Umgebung gibt.
Viel Spaß beim Skripten! - Drak [7]
Mit dem graphischen Terminal AKFAvatar [59] können RPGs mit der TextRPG [8]-Syntax sehr einfach in grafische RPGs umgewandelt werden, in denen Interaktionen automatisch über das 1w6-System [60] abgehandelt werden können.
Andreas K. Förster hat dafür die Flexibilität des TextRPG genutzt, um AKFAvatar zusätzliche Steuerbefehle zu geben, mit denen er Bilder anzeigt, Dialoge anpasst und Audio ausgibt.
Vielleicht erkennst du ja aus welchem freien Spiel die Charaktere stammen (Auflösung unten :) ).
Der Code für die Geschichte steht in der entsprechenden Codedatei [61] und ist auch ohne Programmierkenntnisse gut lesbar (die Funktion avatarsay kontrolliert Grafik und Sound).
Wenn ihr es selbst ausprobieren wollt (unter GNU/Linux), müsst ihr euch bisher noch erst AKFAvatar [59] installieren und dann das TextRPG Repository [62] klonen. Im TextRPG repository ist es dann einfach
avatarsay ./simple_story.py
(d.h. simple_story.py mit avatarsay öffnen. Wenn ihr simple_story.py mit einem anderen Terminal startet, seht ihr die gleiche Geschichte, allerdings ohne Grafik und Sound - unter Windows funktioniert AKFAvatar übrigens auch, allerdings kann es nicht als vollwertiges virtuelles Terminal genutzt werden. Wenn ihr es nutzen wollt, holt euch ein GNU/Linux - zur Not auf einem USB-Stick oder als virtuelle Maschine. Auf seiner Seite hat AKF auch Infos zur Nutzung von avatarsay [63] - Ich bin kein Experte in AKFAvatar, daher kann es sein, dass irgendwas hier nicht ganz korrekt ist. In dem Fall schreib bitte einen Kommentar. - Drak [7] )
Als Regelwerk im Hintergrund läuft übrigens das EWS (v2.2). Charaktere können so auch gesteigert werden, jegliche Proben ablegen und in einem einfachen Textformat gespeichert werden.
Noch ist avatarsay allerdings nicht komplett eingebunden. Ich will die grafische Ausgabe langfristig vollständig integrieren, so dass automatisch Bilder gezeigt werden, wenn die Charaktere Bilder definiert haben und ein TextRPG Skript mit avatarsay gestartet wird (ein Schritt in Richtung vom Nutzer auswählbarer GUI-Umgebungen :) ).
Wenn dich die Syntax für TextRPGs interessiert, schau dir die Grundlagen doch einfach auf der TextRPG Seite [8] an. Ein noch einfacheres Beispiel ist die ministory [64].
Auflösung: Die Grafiken stammen aus Battle for Wesnoth [65], einem freien Strategiespiel, grafisch im Stil von Shining Force® (von Sega) und anderen klassichen 2D Spielen, vom Spielgefühl her allerdings stärker auf Taktik und größere Geschichten, dafür weniger auf einzelne Charakterentwicklung ausgerichtet. Es hat eine aktive Gemeinde von Autoren, die immer neue Kampagnen schreiben, und alle Spielmaterialien sind unter der GPL freigegeben.
Anhang | Größe |
---|---|
avatarsay-screenshot1.png [66] | 35.04 KB |
avatarsay-screenshot2.png [67] | 54.1 KB |
avatarsay-screenshot3.png [68] | 3.19 KB |
avatarsay-screenshot4.png [69] | 9.4 KB |
avatarsay-screenshot5.png [70] | 13.04 KB |
Leider bin ich zur Zeit rein Rechnertechnisch etwas verhindert, ein neuer ist aber im Anmarsch. Da ich auf meiner alten Mühle keine große Lust habe, noch alles besonders einzurichten um mit dem Bugfixing bei schlachtfeld.py weiter zu machen. Bis zum Wochenende sollte der Rechner da sein und im Verlauf der nächsten Woche sollte ich wieder ins bugfixing einsteigen können, um danach auch noch ein paar neue Ideen zu verbauen und die Schnittstelle zwischen schlachtfeld.py und Charakter.py auszubauen, damit Charaktere aus der Datenbank geholt und durch die Datenbank exportiert werden können.
Wenn es sich anbietet, dann können wir auch mal Ideen zu einer Solo-Abenteuer-Engine angehen als Plattform, um EWS(?) Abenteuer auf dem Rechner zu spielen und zu schreiben. Dabei bin ich mir aber noch nicht 100% sicher, ob sich das EWS optimal zur Umsetzung als Solo-Engine eignet. Also, überzeugt mich!
Links:
[1] http://1w6.rakjar.de/forum/english/general/2014-09-22-software-710
[2] http://1w6.rakjar.de/schlachtfeld
[3] http://1w6.rakjar.de/deutsch/anhang/programme/hexbattle-mit-zombies
[4] http://1w6.rakjar.de/deutsch/anhang/programme/ascii-battle-1w6-modul-fuer-python3-d6#nutzen
[5] http://1w6.rakjar.de/deutsch/anhang/programme/ascii-battle-1w6-modul-fuer-python3-d6
[6] http://1w6.rakjar.de/deutsch/anhang/programme/blob-valentine
[7] http://1w6.rakjar.de/uzanto/drak
[8] http://1w6.rakjar.de/deutsch/anhang/programme/textrpg
[9] http://1w6.rakjar.de/deutsch/anhang/programme/kampfchancen-baum-skript
[10] http://1w6.rakjar.de/deutsch/anhang/programme/blob_battle
[11] http://bitbucket.org/ArneBab/
[12] http://www.ohloh.net/projects/7065?p=1d6+roleplaying
[13] http://1w6.rakjar.de/releases/asciibattle-0.2.webm
[14] http://bitbucket.org/ArneBab/d6
[15] http://1w6.rakjar.de/files/asciibattle-screenshot.png
[16] http://1w6.rakjar.de/files/asciibattle-screenshot1.png
[17] http://1w6.rakjar.de/files/asciibattle-screenshot3.png
[18] http://1w6.rakjar.de/files/asciibattle-screenshot4.png
[19] http://1w6.rakjar.de/files/asciibattle-screenshot5.png
[20] http://1w6.rakjar.de/files/blob_battle-0.5.0.tar.gz
[21] http://python.org/download
[22] http://1w6.rakjar.de/files/blob_battle_screenshot-2008-03-14-1_klein.png
[23] http://1w6.rakjar.de/files/blob_battle_screenshot-2008-03-14-2_klein.png
[24] http://1w6.rakjar.de/files/blob_battle_screenshot-2008-03-14-3_klein.png
[25] http://1w6.rakjar.de/files/blob_valentine-0.3.tar.gz
[26] http://1w6.rakjar.de/files/blob_valentine_screenshot-2008-02-15.png
[27] http://1w6.org
[28] http://1w6.org/deutsch/anhang/google-summer-code/ideas-2008
[29] http://1w6.org/deutsch/anhang/google-summer-code/ideas-2008/appliance-template
[30] http://1w6.rakjar.de/files/hexbattle-play-2013-10-30.webm
[31] http://bitbucket.org/ArneBab/hexbattle
[32] http://www.pyinstaller.org/
[33] http://1w6.rakjar.de/uzanto/pihalbe
[34] http://pyglet.org
[35] http://1w6.rakjar.de/files/hexbattle-2013-10-30-1a507e4-poster.png
[36] https://hg.sr.ht/~arnebab/ews/browse/Skripte/1w6-balance/battle_probability_tree.py?rev=tip
[37] https://hg.sr.ht/~arnebab/ews/browse/Skripte/1w6-balance/1w6-balance.py?rev=tip
[38] http://hg.sr.ht/~arnebab/ews/browse/sonstiges/Skripte/battle_probs/chars/sskreszta.txt
[39] http://1w6.rakjar.de/files/v0.1-main-window.png
[40] http://1w6.rakjar.de/stichwort/schlachtfeld
[41] http://1w6.rakjar.de/deutsch/module/npc-k-mpfe-und-schlachten-nkus/schlachtfeld-beispielausgabe
[42] http://ygingras.net/yould
[43] http://1w6.rakjar.de/files/schlachtfeld-0.2_pre1.tar.gz
[44] http://1w6.rakjar.de/http
[45] https://rpg-tools-1d6.svn.sourceforge.net/svnroot/rpg-1d6
[46] http://cia.vc/stats/project/rpg-1d6
[47] http://www.ohloh.net/projects/7065
[48] http://sourceforge.net/tracker/?group_id=199744&atid=970729
[49] http://dateien.1w6.org/schlachtfeld/epydoc/html
[50] http://rpg-1d6.sourceforge.net/hg/1d6/
[51] http://www.selenic.com/mercurial/wiki/index.cgi/MercurialOnSourceforge
[52] http://sf.net/projects/rpg-1d6
[53] http://de.wikipedia.org/wiki/Entwurfsmuster
[54] http://pypi.python.org/pypi/TextRPG/
[55] http://1w6.org/textrpg-api-docs/
[56] http://www.python-forum.de/viewtopic.php?p=104477
[57] http://bitbucket.org/ArneBab/textrpg/src/tip/branching_story.py
[58] http://1w6.rakjar.de/contact
[59] http://akfavatar.nongnu.org/
[60] http://1w6.rakjar.de/deutsch/regeln
[61] http://bitbucket.org/ArneBab/textrpg/src/tip/simple_story.py
[62] http://bitbucket.org/ArneBab/textrpg/
[63] http://akfavatar.nongnu.org/manual/de/Anweisungen-f_00c3_00bcr-avatarsay.html
[64] http://bitbucket.org/ArneBab/textrpg/src/tip/ministory.py
[65] http://wesnoth.org
[66] http://1w6.rakjar.de/files/avatarsay-screenshot1.png
[67] http://1w6.rakjar.de/files/avatarsay-screenshot2.png
[68] http://1w6.rakjar.de/files/avatarsay-screenshot3.png
[69] http://1w6.rakjar.de/files/avatarsay-screenshot4.png
[70] http://1w6.rakjar.de/files/avatarsay-screenshot5.png