summaryrefslogtreecommitdiff
path: root/TODO.org
blob: 704b21f65a9275c8830947cfcbbabec0ea765c59 (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
* Things To Do

** DONE Game loop
   Provide a game loop structure that responds to input events,
   updates the game state, renders the scene. Use a fixed update
   timestep and cap the maximum FPS.

** DONE Game scenes
   Games can be broken up into many chunks, called scenes. Examples
   would be a main menu, a world map, a battle screen, etc.

   - [X] Create a <scene> type that encapsulates input/render/update
     callbacks
   - [X] Macro for declaratively defining a scene
   - [X] Scene switching

** TODO Input
   Provide hooks to respond to keyboard, mouse, and joystick events.
   Wrap SDL keycode, mouse button, etc. constants in our own
   enumeration.

   - [X] Keyboard
   - [X] Mouse
   - [X] Window (active, resize, quit)
   - [ ] Joystick

** DONE Sprites
   Encapsulates an image and all of its transformations: position,
   rotation, scale, color, etc.

   - [X] Use FreeImage
   - [X] Add support for texture regions
   - [X] Add support for animations
   - [X] Use a sprite batch when drawing if one is currently bound

** TODO Sprite batches
   Efficiently render a large number of sprites. Only change OpenGL
   context when necessary. For example, don't change texture when
   rendering several sprites in a row that use the same one.

   - [X] Add basic batching for non-scaled, non-rotated sprites
   - [X] Add transformation logic for scaling and rotating
   - [X] Add support for colors
   - [ ] Add support for different blending modes

** DONE Tilesets
   Break an image up into many small pieces. Useful for creating maps.

   - [X] Algorithm to split texture into tiles
   - [X] <tileset> type

** DONE Animations
   Create a data type to represent an animated sequence of textures
   and/or texture regions.

** TODO Tile maps
   - [ ] Create a generic tilemap module
   - [ ] Create a loader for Tiled .tmx map files.

** TODO Scene graph
   A tree structure that is traversed when rendering a game scene.
   The graph is composed of groups and nodes. Transformations are
   accumulated as the tree is walked.

** DONE Scripting
   Provide a way for users to easily script 2D games using coroutines
   and a scheduler.

   - [X] Coroutines
   - [X] Agenda

** TODO Vectors and matrices
   Vectors and matrices are needed constantly for games. Provide an
   easy-to-use module that provides procedures for common
   vector/matrix math operations

   - [X] Vectors
   - [ ] Matrices

** DONE Fonts
   - [X] Write wrappers for needed FTGL functions
   - [X] Write font rendering procedures

** TODO Sound
   Provide helpful wrappers around SDL sound procedures?

** TODO A* pathfinding
   A* is a commonly used pathfinding algorithm for games. Pathfinding
   is such a common task that it would be nice to provide users with
   a generic implementation.

** TODO Bounding box collision detection
   Most games need simple bounding box collision detection. Provide an
   efficient implementation that uses quad trees.

   - [X] Rect module
   - [ ] Quadtree module

** TODO Particle systems
   Provide a highly configurible particle simulation system.

** TODO Asset Management
   Provide a generic system for loading assets (images, sounds, fonts,
   etc.) and storing them in a cache. Explore using weak keys so that
   assets are removed from the cache when they are no longer
   referenced.

** TODO Actions
   Provide a library of coroutines that perform commonly used
   time-based actions such as linear interpolation. It would be nice
   to have a way to make these easily composable as well.

   - [X] Make actions composable
   - [X] Linear interpolation (lerp)
   - [ ] Move to/move by

** TODO Keymaps
   Provide an Emacs-like way of defining key combinations so that
   multi-button input is easy for users.

   The more I think about what I want, the more I realize that I am
   describing a system that uses functional reactive programming.

   - [ ] Abstract away input methods

     Controls can be bound to keys, mouse, whatever

   - [ ] Basic sequences

     Press A then B

   - [ ] Simultaneous key presses

     Press A and B at the same time

   - [ ] Composing sequences

     Press A then B + C

   - [ ] Timeouts

     Press A then B then C within 15 frames time

   - [ ] Sequences with actions along the way

     Press A to kick, then forward + B to uppercut, within 30 frames
     time.


** TODO GUI widgets
   Provide a set of common graphical widgets such as buttons, scroll
   bars, and sliders.

** TODO REPL
   Provide a REPL that plays nice with the game loop. Easier said than
   done.

   - [X] Modify Guile's REPL to work with the game loop
     - Short-term solution that *mostly* works
   - [ ] Write a new REPL that runs in the current thread
     - Use coroutines
     - Read user input from a separate thread so as to not block the
       main thread

** TODO 0.1 Release
   An official 0.1 alpha release with basic, minimal functionality
   will provide a good place for people other than me to try out
   guile-2d and perhaps even start to hack on it.

   - [X] Font rendering with FTGL
   - [ ] Resolve issues with FIGL
   - [ ] Texinfo documentation
   - [X] Autotools build files
   - [ ] Fix animation bug