aboutsummaryrefslogtreecommitdiff
path: root/reqs.toml
blob: 9ad0a865108882eb52443f4296e4ef4454a99242 (plain)
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
# This is a TOML file containing all project requirements. The reqs2tex script
# can be used to generate the files necessary to compile requirements.tex and
# cross-reference the requirements from other documents.

# This is the requirement cross-reference ID. Requirements can be
# (cross-)referenced from LaTeX by prefixing this ID with `req:` (i.e. this
# requirement is referenced as \cref{req:audio}).
[audio]
# Requirement type ('system' | 'user')
type = 'user'
# MoSCoW priority ('must' | 'should' | 'could' | 'will not')
priority = 'must'
# Requirement body. Supports LaTeX formatting. (tip: use single quotes so
# backslash doesn't act as an escape character)
description = '''
The engine allows the game programmer to easily start, pause and stop
background music, while simultaniously playing sound effects.
'''
# Definition of done. If 'done' is a string, it is treated as LaTeX code, if it
# is a list of strings, each item is treated as the ID of another requirement,
# and the references are checked before LaTeX runs.
done = [
	'audio:async-api',
	'audio:handle',
	'audio:stream-mix',
	'audio:volume',
]
#done = 'When I feel like it'
# Requirements that are no longer applicable should set `deleted` to `true`.
# This will make sure the requirements are numbered consistently across
# different document revisions.
#deleted = true

[audio:async-api]
type = 'system'
priority = 'must'
description = '''
The public audio \gls{api} supports starting audio samples asynchronously
(i.e.~fire and forget).
'''

[audio:handle]
type = 'system'
priority = 'must'
description = '''
The public audio \gls{api} allows the game programmer to control (i.e.~play,
pause, resume and stop) audio samples after they are created/initialized.
'''

[audio:stream-mix]
type = 'system'
priority = 'must'
description = '''
The audio system supports playing multiple audio streams simultaniously.
'''

[audio:volume]
type = 'system'
priority = 'must'
description = '''
The public audio \gls{api} allows the game programmer to control the volume of
audio samples.
'''

# TODO: audio encoding support?

[lib:license]
type = 'system'
priority = 'must'
description = '''
External libraries must have a license that is MIT-compatible, or one that
allows linking against MIT code.
'''

[lib:platform]
type = 'system'
priority = 'must'
description = '''
External libraries must have cross-platform support for at least Linux and
Windows.
'''

# TODO: library popularity as quality factor?
# TODO: library documentation as quality factor?
# TODO: modularity over less libraries? (i.e. why don't we just SDL2 everything?)

[script:interface]
type = 'system'
priority = 'must'
description = '''
There is a base \codeinline{Script} class that has empty default
implementations for functions that may be implemented by the game programmer.
'''

[script:user-class]
type = 'system'
priority = 'must'
description = '''
The game programmer implements scripts by creating classes derived from the
\codeinline{Script} class.
'''

[script:direct-instance]
type = 'system'
priority = 'must'
description = '''
Unless explicitly changed by the game programmer, derived script classes cannot
be instantiated directly, and must be instantiated by the component manager.
'''

[script:direct-run]
type = 'system'
priority = 'must'
description = '''
Unless explicitly changed by the game programmer, methods on instances of
\codeinline{Script} (and derivative) classes cannot be called directly, and
must be called by the script system.
'''

[savemgr]
type = 'user'
priority = 'must'
description = '''
The engine provides an \gls{api} for saving various kinds of game data
(e.g.~progress, levels, statistics, unlocked items, achievements).
'''

[savemgr:journalling]
type = 'system'
priority = 'should'
description = '''
The save manager uses a journal to store data, such that partial saves do not
cause data loss.
'''

[savemgr:types-custom]
type = 'system'
priority = 'will not'
description = '''
The save manager can be extended to store and retrieve game programmer-defined
types and data structures.
'''

[savemgr:types-scalar]
type = 'system'
priority = 'must'
description = '''
The save manager is able to store and retrieve scalar types.
'''

[savemgr:types-string]
type = 'system'
priority = 'must'
description = '''
The save manager is able to store and retrieve strings.
'''

[savemgr:multi-file]
type = 'system'
priority = 'will not'
description = '''
The save manager can load multiple different save files.
'''

[savemgr:file-manage]
type = 'system'
priority = 'must'
description = '''
The save manager manages opening/closing the underlying file, and flushing
in-memory data to the file.
'''
done = '''
The game programmer is able to use the save manager without explicit
(de)initialization.
'''

[savemgr:var-key]
type = 'system'
priority = 'must'
description = '''
The save manager provides access to variables uniquely identified by a key
string.
'''