I play a lot of Tabletop Roleplaying Games in my spare time.

In doing that, I have come up with some common questions one needs to ask (and, more importantly, answer!) when creating a character- if only so that, when something happens while playing, the character can react as they would.

I’d made myself (and whoever wants a copy) a Document to fill out about each new character, but that was large and clunky, requiring a word processor and a steady hand (to prevent erasing the fields’ text as You were editing Your responses). I looked into PDFs, but they are slow, big, and most importantly creating them is not well supported on GNU/Linux, which is my Operating System of choice.

I also use GNU/Emacs exclusively as my text editor. And it was there that I found my most recent solution: forms-mode.

With a little bit of ELISP code, I was able to draft up a system which stores all of the information in plaintext, and lets me use my favorite editor to maintain them. It prints easily, provided You keep the text hard-wrapped below 80 columns, and takes up WELL less than 1 MB of space on my HDD- which cannot be said for a single character detail sheet of the Document variety.

Below is the code, if You’d like to see it to come up with Your own. I also have it available to download, if You want to run the same one I use. I prototype all major characters using it, though I do update it from time to time to reflect the info I currently use.

Until next time!

character_details.form
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
;; character-details.form - Flesh Out Characters, v1.0 -*- forms -*-
;; This provides a form for the Character Detail Sheet, v1.0
;; Set the name of the data file.
(setq forms-file "characters.dat")
;; Use forms-enumerate to set field names and number thereof.
(setq forms-number-of-fields
(forms-enumerate
'(char-name
char-alias
char-race
char-sex
char-age
char-height
char-weight
char-body
char-hair
char-eyes
char-skin
char-notable
char-costume
char-region
char-town
char-father
char-mother
char-sibling
char-relatives
char-childhood
char-crimes
char-means
char-means-explain
char-ends
char-ends-explain
char-worship
char-worship-explain
char-marry
char-myers-briggs
char-myers-briggs-ie
char-myers-briggs-sn
char-myers-briggs-ft
char-myers-briggs-jp
char-myers-briggs-dom
char-myers-briggs-aux
char-myers-briggs-ter
char-myers-briggs-inf
char-ipip-neo-ext-gen
char-ipip-neo-ext-fri
char-ipip-neo-ext-gre
char-ipip-neo-ext-ass
char-ipip-neo-ext-act
char-ipip-neo-ext-exc
char-ipip-neo-ext-che
char-ipip-neo-agr-gen
char-ipip-neo-agr-tru
char-ipip-neo-agr-mor
char-ipip-neo-agr-alt
char-ipip-neo-agr-coo
char-ipip-neo-agr-mod
char-ipip-neo-agr-sym
char-ipip-neo-con-gen
char-ipip-neo-con-eff
char-ipip-neo-con-ord
char-ipip-neo-con-dut
char-ipip-neo-con-ach
char-ipip-neo-con-dis
char-ipip-neo-con-cau
char-ipip-neo-neu-gen
char-ipip-neo-neu-anx
char-ipip-neo-neu-ang
char-ipip-neo-neu-dep
char-ipip-neo-neu-con
char-ipip-neo-neu-imm
char-ipip-neo-neu-vul
char-ipip-neo-opn-gen
char-ipip-neo-opn-ima
char-ipip-neo-opn-art
char-ipip-neo-opn-emo
char-ipip-neo-opn-adv
char-ipip-neo-opn-int
char-ipip-neo-opn-lib
char-sex-pref
char-strangers
char-role
char-prejudices
char-convo
char-fave-food
char-hate-food
char-fave-drink
char-hate-drink
char-fave-color
char-hate-color
char-fave-music
char-hate-music
char-fave-symbol
char-hate-symbol
char-fave-time
char-hate-time
char-non-adv
char-self-desc
char-group-like
char-group-left
char-strengths
char-know-best
char-one-question
char-bad-time
char-one-thing
)))
;; The following functions are used by this form for layout purposes.
;;
(defun arch-tocol (target &optional fill)
"Produces a string to skip to column TARGET.
Prepends newline if needed.
The optional FILL should be a character, used to fill to the column."
(if (null fill)
(setq fill ? ))
(if (< target (current-column))
(concat "\n" (make-string target fill))
(make-string (- target (current-column)) fill)))
;;
(defun arch-rj (target field &optional fill)
"Produces a string to skip to column TARGET\
minus the width of field FIELD.
Prepends newline if needed.
The optional FILL should be a character,
used to fill to the column."
(arch-tocol (- target (length (nth field forms-fields))) fill))
;; Record filters.
;;
(defun new-record-filter (the-record)
"Form a new record with some defaults."
(aset the-record char-name (user-full-name))
(aset the-record char-age (current-time-string))
the-record) ; return it
(setq forms-new-record-filter 'new-record-filter)
;; The format list.
(setq forms-format-list
(list
"====== Character Detail Sheet ======\n\n"
char-name
" - " char-alias
"\n\n"
'(arch-tocol 70 ?-)
"\n== Personal Effects ==\n\n"
"Race: " char-race
" Sex: " char-sex
" Age: " char-age
"\n\n"
;'(arch-tocol 40)
"Height: " char-height
" Weight: " char-weight
"\n\nBody Type: " char-body
"\n\n"
;'(arch-rj 73 10)
"Hair: " char-hair
"\n\nEyes: " char-eyes
"\n\nSkin: " char-skin
"\n"
"\n\nNotable Physical Characteristics:\n"
char-notable
"\n\nDefault Costume:\n"
char-costume
"\n\n"
'(arch-tocol 70 ?-)
"\n== Social History ==\n\n"
"Home Region: " char-region
" Home Town: " char-town
"\n\n"
"Childhood Events:\n"
char-childhood
"\n\nConvicted of the Following Crimes:\n"
char-crimes
"\n\n-- Family Ties --\n"
"Father:\n"
char-father
"\n\nMother:\n"
char-mother
"\n\nSibling:\n"
char-sibling
"\n\nOther Relatives:\n"
char-relatives
"\n\n"
'(arch-tocol 70 ?-)
"\n== Philosopical and Religious Leanings ==\n\n"
"Alignment(means): " char-means
"\nInterpretation:\n"
char-means-explain
"\n\nAlignment(ends): " char-ends
"\nInterpretation:\n"
char-ends-explain
"\n\n"
"Worships: " char-worship
"\nWhy?\n"
char-worship-explain
"\n\n"
'(arch-tocol 70 ?-)
"\n== Interpersonal Relationships ==\n\n"
"-- Myers-Briggs: --\n\n"
"Short: " char-myers-briggs
"\nDevotions: "
"\n Introversion/Extraversion: " char-myers-briggs-ie
"\n Sensing/iNtuition: " char-myers-briggs-sn
"\n Feeling/Thinking: " char-myers-briggs-ft
"\n Judging/Perceiving: " char-myers-briggs-jp
"\nFunctions: "
"\n Dominant: " char-myers-briggs-dom
"\n Auxillary: " char-myers-briggs-aux
"\n Tertiary: " char-myers-briggs-ter
"\n Inferior: " char-myers-briggs-inf
"\n"
"\n-- IPIP-NEO-PI: --\n\n"
"Extraversion: " char-ipip-neo-ext-gen
"%\n Friendliness: " char-ipip-neo-ext-fri
"%\n Gregariousness: " char-ipip-neo-ext-gre
"%\n Assertiveness: " char-ipip-neo-ext-ass
"%\n Activity Level: " char-ipip-neo-ext-act
"%\n Excitement-Seeking: " char-ipip-neo-ext-exc
"%\n Cheerfulness: " char-ipip-neo-ext-che
"%\nAgreeableness: " char-ipip-neo-agr-gen
"%\n Trust: " char-ipip-neo-agr-tru
"%\n Morality: " char-ipip-neo-agr-mor
"%\n Altruism: " char-ipip-neo-agr-alt
"%\n Cooperation: " char-ipip-neo-agr-coo
"%\n Modesty: " char-ipip-neo-agr-mod
"%\n Sympathy: " char-ipip-neo-agr-sym
"%\nConscientiousness: " char-ipip-neo-con-gen
"%\n Self-Efficacy: " char-ipip-neo-con-eff
"%\n Orderliness: " char-ipip-neo-con-ord
"%\n Dutifulness: " char-ipip-neo-con-dut
"%\n Achievement-Striving: " char-ipip-neo-con-ach
"%\n Self-Discipline: " char-ipip-neo-con-dis
"%\n Cautiousness: " char-ipip-neo-con-cau
"%\nNeuroticism: " char-ipip-neo-neu-gen
"%\n Anxiety: " char-ipip-neo-neu-anx
"%\n Anger: " char-ipip-neo-neu-ang
"%\n Depression: " char-ipip-neo-neu-dep
"%\n Self-Consciousness: " char-ipip-neo-neu-con
"%\n Immoderation: " char-ipip-neo-neu-imm
"%\n Vulnerability: " char-ipip-neo-neu-vul
"%\nOpenness to Experience: " char-ipip-neo-opn-gen
"%\n Imagination: " char-ipip-neo-opn-ima
"%\n Artistic Interests: " char-ipip-neo-opn-art
"%\n Emotionality: " char-ipip-neo-opn-emo
"%\n Adventurousness: " char-ipip-neo-opn-adv
"%\n Intellect: " char-ipip-neo-opn-int
"%\n Liberalism: " char-ipip-neo-opn-lib
"%\n\n-- Dealings with Others --"
"\n\nMarital Status:\n"
char-marry
"\n\nSexual Orientation:\n"
char-sex-pref
"\n\nConsideration of Strangers:\n"
char-strangers
"\n\nRole (in a group):\n"
char-role
"\n\nPrejudices:\n"
char-prejudices
"\n\nConversation Style\n"
char-convo
"\n\n"
'(arch-tocol 70 ?-)
"\n== Petty Preferences ==\n\n"
"Favorite Food: " char-fave-food
" Hated Food: " char-hate-food
"\n\nFavorite Drink: " char-fave-drink
" Hated Drink: " char-hate-drink
"\n\nFavorite Color: " char-fave-color
" Hated Color: " char-hate-color
"\n\nFavorite Music: " char-fave-music
" Hated Music: " char-hate-music
"\n\nFavorite Symbol: " char-fave-symbol
" Hated Symbol: " char-hate-symbol
"\n\nFavorite Time of Day: " char-fave-time
" Hated Time of Day: " char-hate-time
"\n\n"
'(arch-tocol 70 ?-)
"\n== Interview Questionaire ==\n\n"
"When You are not adventuring, what are You doing?\n"
char-non-adv
"\n\nTell me about Yourself.\n"
char-self-desc
"\n\nWhat do You look for in a group?\n"
char-group-like
"\n\nWhy did You leave Your last group?\n"
char-group-left
"\n\nWhat are Your stengths?\n"
char-strengths
"\n\nWhat do You know best?\n"
char-know-best
"\n\nWhat is one thing You always ask people?\n"
char-one-question
"\n\nTell me about a time when things went poorly.\n"
char-bad-time
"\n\nFinally, do You have anything You want people to know?\n"
char-one-thing
"\n\n"
'(arch-tocol 70 ?-)
))

Comments