Diary

Welcome! :-)

This is both a wiki (a website editable by all) and a blog (an online diary about the stuff Alex Schroeder reads and does). If you’re a friend or relative, you might be interested in reading Life instead of this page. If you’ve come here from an RPG blog, you might want to head over to RPG. There are other similar categories to be found on the SiteMap.

Für Rollenspieler gibt es ebenfalls eine eigene RSP Kategorie.

2017-08-17 Bitlbee, Hangouts, OSX (macOS Sierra)

OK, I use Homebrew and I wanted to get Hangouts to work for Bitlbee.

First, install Pidgin:

brew install pidgin

Build Bitlbee with libpurple support:

./configure --purple=1
make
make install

(I use ./configure --debug=1 --asan=1 --purple=1 because I’m still working on Mastodon support.)

If you run it, you should see a lot more protocols – but still no Hangouts.

Install Mercury and Protocol Buffers implementation in C in order to build the Hangouts Plugin for libpurple. You’ll note that there are also other dependencies but I already had all the other stuff installed. Nothing tricky to figure out for yourself, I hope. If you run into problems, leave a comment and I’ll see whether I can figure it out.

brew install hg
brew install protobuf-c
hg clone https://bitbucket.org/EionRobb/purple-hangouts
cd putple-hangouts
make
make install

When you start Bitlbee, make sure you use -F instead of -D or you’ll get an error as soon as you try to sign into an account using libpurple.

If you restart Bitblee now, the plugins command should list hangouts.

Set it up:

account add hangouts <your email address>
account on

You’ll be contacted by a fake account called purple_request with instructions on how to get the OAuth token. It will link you to a YouTube video but the description of the video are the real instructions.

Answer purple_request with the token and you should be up and running.

Tags:

Comments on 2017-08-17 Bitlbee, Hangouts, OSX (macOS Sierra)

Also on the Bitlbee Wiki.

– Alex 2017-08-17 15:23 UTC

Add Comment

2017-08-16 Memory Issues and C

I run Bitlbee using the address sanitizer – ./configure --debug=1 --asan=1. When losing the connection to the Mastodon server, I get the following error:

==54300==ERROR: AddressSanitizer: heap-use-after-free on address 0x606000046778 at pc 0x00010b688437 bp 0x7fff5460db10 sp 0x7fff5460db08
READ of size 4 at 0x606000046778 thread T0
    #0 0x10b688436 in ssl_disconnect (bitlbee:x86_64+0x100098436)
    #1 0x10b665797 in http_close (bitlbee:x86_64+0x100075797)
    #2 0x10b781e30 in mastodon_http_stream (bitlbee:x86_64+0x100191e30)
    #3 0x10b776856 in mastodon_http_stream_user (bitlbee:x86_64+0x100186856)
    #4 0x10b666984 in http_incoming_data (bitlbee:x86_64+0x100076984)
    #5 0x10b66253d in gaim_io_invoke (bitlbee:x86_64+0x10007253d)
    #6 0x10b9291bc in g_main_context_dispatch (libglib-2.0.0.dylib:x86_64+0x2d1bc)
    #7 0x10b9294bb in g_main_context_iterate (libglib-2.0.0.dylib:x86_64+0x2d4bb)
    #8 0x10b929710 in g_main_loop_run (libglib-2.0.0.dylib:x86_64+0x2d710)
    #9 0x10b66226f in b_main_run (bitlbee:x86_64+0x10007226f)
    #10 0x10b658222 in main unix.c:182
    #11 0x7fffc030d234 in start (libdyld.dylib:x86_64+0x5234)

0x606000046778 is located 24 bytes inside of 56-byte region [0x606000046760,0x606000046798)
freed by thread T0 here:
    #0 0x10bc671c6 in wrap_free (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x531c6)
    #1 0x10b68866d in ssl_disconnect (bitlbee:x86_64+0x10009866d)
    #2 0x10b6665f0 in http_incoming_data (bitlbee:x86_64+0x1000765f0)
    #3 0x10b66253d in gaim_io_invoke (bitlbee:x86_64+0x10007253d)
    #4 0x10b9291bc in g_main_context_dispatch (libglib-2.0.0.dylib:x86_64+0x2d1bc)
    #5 0x10b9294bb in g_main_context_iterate (libglib-2.0.0.dylib:x86_64+0x2d4bb)
    #6 0x10b929710 in g_main_loop_run (libglib-2.0.0.dylib:x86_64+0x2d710)
    #7 0x10b66226f in b_main_run (bitlbee:x86_64+0x10007226f)
    #8 0x10b658222 in main unix.c:182
    #9 0x7fffc030d234 in start (libdyld.dylib:x86_64+0x5234)

previously allocated by thread T0 here:
    #0 0x10bc67560 in wrap_calloc (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x53560)
    #1 0x10b92e28c in g_malloc0 (libglib-2.0.0.dylib:x86_64+0x3228c)
    #2 0x10b687117 in ssl_connect (bitlbee:x86_64+0x100097117)
    #3 0x10b663aef in http_dorequest (bitlbee:x86_64+0x100073aef)
    #4 0x10b7757fd in mastodon_http (bitlbee:x86_64+0x1001857fd)
    #5 0x10b776825 in mastodon_open_stream (bitlbee:x86_64+0x100186825)
    #6 0x10b76ba8f in mastodon_connect (bitlbee:x86_64+0x10017ba8f)
    #7 0x10b771697 in mastodon_login (bitlbee:x86_64+0x100181697)
    #8 0x10b6935aa in account_on (bitlbee:x86_64+0x1000a35aa)
    #9 0x10b642130 in cmd_account root_commands.c:538
    #10 0x10b6404a4 in cmd_identify_finish root_commands.c:211
    #11 0x10b64c2d7 in cmd_identify root_commands.c:194
    #12 0x10b640285 in root_command root_commands.c:68
    #13 0x10b63fe33 in root_command_string root_commands.c:34
    #14 0x10b639451 in root_privmsg irc_user.c:244
    #15 0x10b62286f in control_channel_privmsg irc_channel.c:739
    #16 0x10b628a4e in irc_cmd_privmsg irc_commands.c:485
    #17 0x10b624f5a in irc_exec irc_commands.c:922
    #18 0x10b60aa79 in irc_process irc.c:412
    #19 0x10b5f45a8 in bitlbee_io_current_client_read bitlbee.c:211
    #20 0x10b66253d in gaim_io_invoke (bitlbee:x86_64+0x10007253d)
    #21 0x10b9291bc in g_main_context_dispatch (libglib-2.0.0.dylib:x86_64+0x2d1bc)
    #22 0x10b9294bb in g_main_context_iterate (libglib-2.0.0.dylib:x86_64+0x2d4bb)
    #23 0x10b929710 in g_main_loop_run (libglib-2.0.0.dylib:x86_64+0x2d710)
    #24 0x10b66226f in b_main_run (bitlbee:x86_64+0x10007226f)
    #25 0x10b658222 in main unix.c:182
    #26 0x7fffc030d234 in start (libdyld.dylib:x86_64+0x5234)

What’s going on? In ssl_connect Bitlbee is allocating a connection:

void *ssl_connect(char *host, int port, gboolean verify, ssl_input_function func, gpointer data)
{
        struct scd *conn = g_new0(struct scd, 1);
        ...
}

When http_incoming_data decides it is done, ssl_disconnect is called and the connection is freed:

void ssl_disconnect(void *conn_)
{
        ...
        g_free(conn);
}

When mastodon_http_stream closes down, it calls http_close which calls ssl_disconnect again, which still refers to conn, which is wrong.

OK, but how is http_incoming_data calling both ssl_disconnect and mastodon_http_stream?

static gboolean http_incoming_data(gpointer data, int source, b_input_condition cond)
{
        struct http_request *req = data;
        ...
cleanup:
        /* Avoid g_source_remove warnings */
        req->inpa = 0;

        if (req->ssl) {
                ssl_disconnect(req->ssl);
        } else {
                closesocket(req->fd);
        }

        ...

        if (req->func != NULL) {
                req->func(req);
        }
        http_free(req);
        return FALSE;
}

OK, so here’s the problem. The SSL disconnect already happened but req->ssl was not set to NULL so there is no way for http_close to do the right thing.

static void mastodon_http_stream(struct http_request *req, gboolean from_hashtag)
{
        struct im_connection *ic = req->data;
        struct mastodon_data *md = ic->proto_data;
        ...

        if (!g_slist_find(mastodon_connections, ic)) {
                return;
        }

        if ((req->flags & HTTPC_EOF) || !req->reply_body) {
                md->streams = g_slist_remove (md->streams, req);
                imcb_error(ic, "Stream closed (%s)", req->status_string);
                imc_logout(ic, TRUE);
                http_close(req);
                return;
        }

        ...
}

Sadly, this is not all. When I remove the call to http_close in mastodon_http_stream, I have the problem that mastodon_parse_response calls imc_logout which frees the omnipresent ic variable, the struct im_connection. I have the problem that it calls mastodon_logout which goes through md->streams and closes those requests, which are already closed. It’s a mess and I don’t see a unifying theme, it’s unclear to me how logout ought to work in this asynchronous environment.

What seems clear to me now is that a logout function should not free data structures that are needed by all the ongoing requests. As these responses return, the data structures must still be there. Something like this:

  1. the logout must mark the connection as dead
  2. every response must free the http request and the associated ssl connection if it detects a dead connection
  3. it must then remove the request from a list of open requests and free its resources
  4. it must then attempt to free the connection, and this may only succeed when all the requests have returned

But actually, what happens is this:

  1. user quits
  2. irc_freebee_freeimc_logoutmastodon_logoutimc_free – and at this point ic is free and cannot be referred to, so anything like the following is doomed:
static void mastodon_http_callback(struct http_request *req)
{
        struct mastodon_command *mc = req->data;
        struct im_connection *ic = mc->ic;
        if (!g_slist_find(mastodon_connections, ic)) {
                return;
        }
        ...
}

I think? Or I’m confused? Perhaps this is OK if ic is pointing to an address which is no longer in the list of mastodon_connections and I should be safe as long as req has not been freed?

Tags:

Add Comment

2017-08-16 Donations

Collecting donations for 2017. I’ll start with the regular stuff: And I regularly donate about $10/month to the EFF, $120/year to the FSF, and €120/year to the FSFE.

Today I was listening to another near 6h episode of Dan Carlin’s Hardcore History and liked it very much: $10.

Tags:

Add Comment

2017-08-12 Zak on Games

Zak wrote a blog post StoryGame Design is (Often) The Opposite of OSR Design where he goes into the differences of the Old School Renaissance and Narrative Design. I’m not sure how easy it is to read if you don’t like the Old School Renaissance, but since I like many different games, I don’t mind. And within this outer framing device, I find the post has an excellent set of refutations for various comments about the games I like that I’ve seen – or opinions I’ve had myself, often describing two different approaches to the various statements he picked.

I need to remember this!

The post is long. The points are good. You can come back later and read more. Just scroll until you see a point that speaks to you and read what Zak has to say, think where you stand on the subject, do you agree, disagree, why? I like this process.

”The game’s about what the rules are about—the more rules a given subject takes up, the more the game is going to be about that, the less space a subject takes up in the rules, the less it’ll be about that”

”Games Teach Appropriate Normative Behavior So Their Content Should Be Considered To Have Great Moral Meaning”

”If you want personality, emotions, romance, you need rules for that”

”Violating genre expectations is bad”

”I Want To Play The Game, Not The GM!”

”The Game Should Teach You The Best Ways To Play Them”

”It’s Escapism! Make Players Feel Powerful And Competent”

”Failing Forward is Always Good And There Are More Interesting Consequences Than Death”

”The Rules Should Help You Get Story Moments”

”Focused Games Are Good Games”

”Rules That Detail Random Aspects Of The World Are About ’Simulationism’—They’re For People Whose Goal is To Immerse Themselves In The World”

”Unattached Murderhobo Players Are Bad”

”Hodge Podge Systems Are Bad, Everything Should Work On The Same Mechanic”

Tags:

Add Comment

2017-08-11 XML and the Command Line

In a recent thread on Mastodon I mentioned some command line tools for working with HTML. Basically: convert it to XML and use the XML command line tools xmllint and xmlstarlet (see XMLStarlet, the xmllint man page and the libxml page).

In order to download from the web we will use curl (see the curl homepage) and in order to display HTML we use w3m with the -T text/html option (see the w3m homepage).

The first thing to know is that xmllint can parse HTML using the --html option and evaluate XPath using the --xpath option.

curl --silent https://alexschroeder.ch/ | xmllint --html --xpath '//h1/text()' -

The result is “Moved Permanently” (because you’re being redirected to the wiki).

If you want to explore stuff interactively, xmllint comes with a built in shell that treats the DOM as a directory tree!

curl --silent https://alexschroeder.ch/wiki > a.html
xmllint --html --shell a.html

You can now use commands such as these:

cd html/body/div/h1
cat a/text()
grep Diary
du /html/body/div[1]

It’s amazing!

If you want to edit HTML you need a different tool, though. This fetches a page, converts to XML, deletes the H1, converts back to HTML, and displays it:

curl --silent https://alexschroeder.ch/ \
| xmllint --html --dropdtd - \
| xmlstarlet ed --delete //h1 \
| xmllint --htmlout - \
| w3m -T text/html

We need to drop the DTD or xmlstarlet will complain.

Tags:

Add Comment

2017-08-10 Rcirc Menu

I use Emacs as a glorified IRC client but with Bitlbee, the number of IRC channels I’m in has exploded. So many Discord channels. And some Mastodon channels. And my Twitter accounts. It’s crazy. The Emacs modeline is no longer enough to display IRC activity. I wrote a little Rcirc Menu mode to handle it for me.

This has also revived my interest in submitting packages to ELPA. I still have write access. In order to test the waters, I submitted Rcirc Menu and Rcirc Color to emacs-devel. We’ll see how it goes!

Tags:

Comments on 2017-08-10 Rcirc Menu

Both are now available from ELPA.

– Alex 2017-08-16 07:26 UTC

Add Comment

2017-07-25 Bitlbee, Mastodon, and C

These days, I’ve been struggling to get back into C.

Wow, C! I had forgotten about the edit, compile, debug cycle. Also, no hot code replacement in running processes. And no printing of interesting structures. It all comes back to me now.

Current status: I have a bitlbee fork that will log me into my Mastodon account using OAuth2 and display my home timeline. Nothing else works but this looks like magic because it’s written in C.

It’s also supposed to add all the people you’re following by that doesn’t seem to work: I’m using GET /api/v1/accounts/:id/followers and since_id seems to have no effect, getting accounts with id lower than what I specified, so now it’s looping forever since we never seem to get to the end of the list. Sad.

I don’t know why I’m spending my summer break on writing C to write a gateway between Mastodon and Bitlbee in order to get an Internet Relay Chat gateway from Emacs to Mastodon. This is crazy!

Tags:

Comments on 2017-07-25 Bitlbee, Mastodon, and C

Fixed that issue with following accounts. I think I’m getting the hang of it!

The streaming API also works. I get new statuses (”updates”) but no notification (mentions, favorites, boosts). I think it should be easy to add, though.

I have a TODO list, now.

– Alex Schroeder 2017-07-26 13:42 UTC


Notifications implemented. Some refactoring and trimming. Now looking at details like HTML text conversion problems. And soon: posting! Hashtag tracking! It’s going to be great!

– Alex 2017-07-27 21:21 UTC


Fixed the disappearing paragraph breaks problem.

Expect no updates for the next few days.

– Alex 2017-07-28 08:58 UTC


I don’t know why I’m spending my summer break on writing C to write a gateway between Mastodon and Bitlbee in order to get an Internet Relay Chat gateway from Emacs to Mastodon. This is crazy!

If it’s any help, this is something I’d absolutely love. Being able to use Mastodon from Bitlbee is something I’ve been interested in for a while.

If I can help at all, please let me know! I’m a coder myself but haven’t any experience with the Bitlbee codebase.

(First-time commenter here! I don’t believe we know each other.)

– Sophira 2017-07-29 10:33 UTC


Welcome! I guess the first thing to do is to build and run it. See whether the code we have actually works. If you already use Bitlbee, then I suggest you keep your existing Bitlbee as-is and run the new Bitlbee on a different port. My IRC client then connects to both.

Next is setup: I wrote Howto Mastodon on the Bitlbee wiki. Sadly the Bitlbee help files are still missing. I’m interested to see how far other people get.

If it works, you should have basic read-only access.

Then you can start creating issues on GitHub, or write help files, or look at the C code. :)

– Alex 2017-07-31 05:38 UTC


Now that I’m writing C code I should change the tagline in our company’s intranet from “Code Monkey” to “Programmer-at-Arms”. Or is that “Programmer-Archaeologist”.

(cf. A Deepness in the Sky)

– Alex 2017-08-04 06:01 UTC


Hah, pretty much done! All the commands implemented. Todo:

  • subscribing to hashtags
  • clean up of Twitter code
  • better in-app documentation
  • merge request
  • - Alex 2017-08-05 16:24 UTC

I think it’s done! I’m running it now. Every now and then I implement new commands, like context for a status or timeline for a nick, but that’s basically it.

The version I compiled I configured with ./configure --debug=1 --asan=1 and I already found two memory issues which I fixed.

And thus, with everything done, I guess I’m open to the creation of issues. I only take Mastodon issues, of course.

Now that I know how the Twitter code works, I might also take Twitter issues, but that’s now my main focus.

– Alex 2017-08-09 09:54 UTC


As my master branch is under review by the Bitlbee folks, and I still find things to do, I started working on a new branch, features/kensanata/mastodon-extra-features. Just in case you want to join me living on the bleeding edge.

– Alex 2017-08-10 13:22 UTC


When compiling using Emacs, use _SRCDIR_=~/src/bitlbee/ make -k. The _SRCDIR_ environment variable is only set if you run ./configure in a different directory, which you wouldn’t usually do. If it is set, however, the compiler will output fully qualified filenames, which Compile Mode then knows.

– Alex 2017-08-11 16:51 UTC


I feel like a real hacker because I implemented undo and redo for posts. Now to extend it to favourites, follows, mutes.

– Alex 2017-08-11 21:43 UTC

Add Comment

2017-07-19 Helden

In einem Kommentar auf Google+ hatte ich geschrieben, dass ich mich fast nie in Diskussionen in der deutschsprachigen Rollenspielergruppe melde, weil ich im englischen Raum leichter zu angenehmen und informativen Diskussionen komme. Woran das liegt, weiss ich nicht; ich habe Muttersprache Deutsch.

Vielleicht liegt es sogar nur daran, dass ich auf Englisch mehr Auswahl habe und mir meine Zirkel so zusammenstellen konnte, dass ich auf mehreren Ebenen einen Rapport habe: Diskussionsstil, Spielvorlieben, Regelwerke und Setting. Oder vielleicht liegt es auch daran, dass die Leute weniger über ihren Tisch reden als über die Produkte. Die Produkte, die anstehen, gekauft wurden, vorbestellt wurden, anderswo rezensiert wurden, die Qualität der Rezension des Produktes, die Community zum Produkt, die Proberunde zum Produkt. In so einem Umfeld tue ich mich schwer darin, mit Begeisterung einen Betrag zum Spielleitern selber zu schreiben. Wenn ich meinen Blog so anschaue, sieht es so aus, wie wenn mein letzter signifikanter G+ Kommentar vom Mai 17 stammt. Oder liegt es daran, dass hier mit einer Begeisterung diskutiert wird, die ich nicht Teile? Ich kann mich erinnern, dass ich mich früher immer ein wenig wie in einem Philosophie Studium gefühlt habe, weil ständig an den Definitionen der Begriffe gefeilt wurde. Die Unsorgfalt anderswo, die Bereitschaft, viele Standpunkte nebeneinander stehen zu lassen, die vermisse ich. Irgendwie mag ich sogar das Format einer Frage wie “Discussion of the Day: Blah or Blargh? Why?” – das findet man hier auch nicht.

Tja, und dann dachte ich mir: Be the change you want to see. Also probiere ich die Diskussionen zu lancieren, die mich selber interessieren. Das war dann halt das gleiche Thema wie auf Englisch gerade eben: Ist es möglich, im Rollenspiel wirkliche Helden zu spielen? Damit meine ich, Charaktere, die große Risiken eingegangen sind, oder sich sogar selbst geopfert haben?

Selber habe ich den Eindruck, dass das nicht geht und im Rollenspiel durch dessen Eigenheiten inhärent andere Geschichten erzählt werden als in Videospielen oder Kinofilmen.

Insbesondere habe ich Mühe, mir Regeln vorzustellen, welche dies irgendwie belohnen, denn was Heldenpunkte und dergleichen oft belohnen sind gut erzählte Actionsequenzen und dergleichen mehr, aber als Spieler fühle ich mich nie so, wie wenn ich grosse Risiken eingegangen wäre und meine “Heldentaten” wirken entsprechend hohl und falsch.

Es gibt eben keine kommensurable Belohnungen für ein Opfer, denn sonst wäre es ja für den Spieler kein Opfer und wird eben zur sinnentleerten Geste.

Das Ausgeben von Heldenpunkten hat für mich halt nicht funktioniert: wenn ich mir Neuwürfe und nachträgliche Boni mit “kaufen” kann, dann besteht ja ein viel kleineres Risiko. Das funktioniert im Film, aber nicht am Tisch – zumindest nicht für mich.

Ich weiss auch nicht, warum ich das Risiko so wichtig finde, um der Sache Bedeutung zu geben. Wenn es um nichts geht, dann ist es irgendwie nichts.

Wer die Prinzessin rettet, weil er das gefahrlos kann, ist natürlich super, aber so einer kriegt keine Medaille, so wie ich auch keine Medaille kriege, wenn ich die Schnecken von Weg nehme. Erst wenn ich aufs Gleis runterspringe und den Typen rette, trotz der Gefahr für Leib und Leben, wird es zur Medaillenwürdigen Heldentat. In dem Sinne ist also Superman für mich genau kein Superheld, da nie wirklich in Gefahr.

Im englischen Thread auf G+ gab es einen Kommentar mit Link zum Carnegie Hero Trust Fund und dessen Definition: «Gemäß den Statuten der Stiftung ist es nicht die Lebensrettung als solche, die ausgezeichnet wird, sondern nur die Handlung “mit ausgesprochen heldenmütigem Charakter”. Der/die Retter/in hat sich dabei selbst oder seine/ihre Gesundheit ernsthaft einer Gefahr ausgesetzt, um das Leben eines Menschen zu retten. Rettungen, die keinen besonderen Mut erfordern und die jedermann als nächste und selbstverständliche Pflicht gegenüber dem Mitmenschen obliegt, werden von der Stiftung nicht ausgezeichnet.»

Ernsthafte Gefahr. Besonderen Mut. Das finde ich immer noch sehr überzeugend.

Und was ist mit den anderen Vorstellungen von Heldentum? Den Helden, deren Vorfahren Götter waren, die zu etwas besonderem bestimmt sind? Meiner Meinung nach gehört das Heldentum in der klassischen Form zum Medium Theater und lässt sich nicht einfach auf neue Medien übertragen. Das wird schon für Buch und Film schwer – zumindest fällt mir gerade kein Beispiel ein, wenn überhaupt, dann sind diese Elemente kleine Nebenschauplätze und wirken auf mich oft deplatziert. Für Rollenspiel scheinen mir die klassischen Tragödien keine gute Inspirationsquelle zu sein.

Was ist mit den Rittern, die den Drachen töten können, weil sie so super sind und es deswegen tun, im Gegensatz zu all den armen Bauern mit ihren Mistgabeln, die nicht eingreifen konnten? Wenn die Ritter keine Helden sind, weil sie ein geringes Risiko tragen, dann wird es hart, denn die Bauern müssen ja fantastische Glückspilze sein, wenn sie den Drachen besiegen wollen. Und das sehe ich auch so: So etwas funktioniert eben nicht im Rollenspiel sondern nur im Kino oder im Buch, wo Survivorship Bias dafür sorgt, dass die Geschichte dem Glückspilz folgt – so dass wir im Spiel also entweder den Bauern mit Heldenpunkten unter die Arme greifen müssen (was in meinen Augen die Sache aushöhlt) oder es werden viele Charaktere sterben müssen, oder wir sehen ein, dass die meisten Rollenspielkampagnen mit Helden nichts gemein haben.

Naja, das war halt so der Ausgangspunkt meiner Überlegungen: Ist ein Opfer ein Opfer, wenn es nichts gekostet hat? Ist man ein Held, wenn man sein Leben nicht riskiert hat? Ist es überhaupt möglich, ein Spiel zu designen, wo ein Spieler dies vermehrt tun wollte?

Jetzt kann man natürlich einwenden, man verstehe unter Heldentum etwas anderes, das Hadern und Streiten mit dem Schicksal, oder die Protagonistenrolle, welche einem die Vorsehung zugestanden hat, und das finde ich auch eine interessante Diskussion: Was wünschen sich Spieler den so am Tisch? Und gerade im deutschsprachigen Raum, wo man mit Das Schwarze Auge und der Bezeichnung “Held” ans Rollenspiel herangeführt wurde, ist das ja besonders spannend. Aber was mich persönlich angeht, interessiert mich das andere Thema mehr. Und da entstehen natürlich auch spannende Situation am Tisch: ein Spieler findet meinen Spielstil nicht cool und will mehr risikoarmes Heldentum und ich sage dann, dass sei ja ein Widerspruch in sich. Und dann sind wir auch in genau dieser Diskussion, ohne dass es eine klare Antwort gäbe, höchstens klare Vorlieben.

Tags:

Add Comment

2017-07-18 Items for Sale

Once again, my players went to the adventurer’s shop, wanting to buy stuff for their expedition into the sewers. This is a game of gold spent = xp gained, so that might explain some of their willingness to part with their cash.

  • 50gp for the dwarven miner’s helmet which is the equivalent of a helmet (10gp) with an integrated lantern (25gp) and a pint of flaming oil (2gp); I sold two of these
  • 5gp per flask of greek fire which reignites even when extinguished by water and thus the equivalent of flaming oil (2gp); they each bought 10 flasks
  • 10gp for a wooden portable apothecary box to store all those flasks in; each came with a large bronze plaque saying “FLAME PIG”
  • 10gp for a pump and nozzle contraption to help pump oil at burning targets; when asked I made sure to explain that there was absolutely no difference to throwing individual flasks, you still needed a roll to hit but you didn’t need to search your backpack for the flask itself; I sold two of these
  • 100gp for a small eternal light in a locket made by the local headmaster of the wizard guild by casting continual light; sold it
  • 400gp for the helmet of an elf lord, with two gaps for the horns that are sure to grow at higher level; not sold

Tags:

Add Comment

2017-07-18 Building a Dungeon

A player of a wizard told me his wizard was going to build a secret dungeon under his tower back in town. I suggested rolling 2d6 + Int bonus for planning on the following table:

2d6+IntResult
2miserable planning, breaking through the ceiling of the sewers, 1 in 6 chance of discovery by unsavory characters every week, for four weeks (patching it up is hard)
3-5bad hiring decisions or insufficient bribes, rumors start spreading about a digging operation in your street, 1 in 6 chance of discovery by unsavory characters, just once
6-8cramped digging conditions, paying bribes, hiring cutthroats, but it works as planned
9-11good planning, smooth sailing
12lucky break, ancient plans you managed to procure from dwarven miners deciphered and access to one of the old dwarven vaults secured and integrated into the construction; add three secret doors and three traps for free

He got “good planning, smooth sailing” I didn’t have to create a rooster of unsavory characters.

Tags:

Add Comment

More...

Comments


Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. See Info for text formatting rules. You can edit this page if you need to fix typos. You can subscribe to updates by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.

Referrers: HERR ZINNLINGS ARBEITSZIMMER Gothridge Manor The City of Iron Dreams of Mythic Fantasy ... in der Mitte der ZauberFerne