dotframe 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +57 -0
  4. package/assets/audio/hit.mp3 +0 -0
  5. package/assets/audio/loop.mp3 +0 -0
  6. package/assets/crafter.png +0 -0
  7. package/assets/fonts/archivo-black.json +133 -0
  8. package/assets/fonts/archivo-black.png +0 -0
  9. package/assets/fonts/bangers.json +133 -0
  10. package/assets/fonts/bangers.png +0 -0
  11. package/assets/suzanne.glb +0 -0
  12. package/cli/commands/config.ts +35 -0
  13. package/cli/commands/doctor.ts +71 -0
  14. package/cli/commands/new.ts +73 -0
  15. package/cli/commands/play.ts +244 -0
  16. package/cli/commands/ship.ts +94 -0
  17. package/cli/commands/skills.ts +66 -0
  18. package/cli/commands/snap.ts +88 -0
  19. package/cli/lib.ts +148 -0
  20. package/cli/main.ts +95 -0
  21. package/cli/simkit.ts +152 -0
  22. package/cli/tsconfig.json +8 -0
  23. package/native/df_audio.c +266 -0
  24. package/native/df_native.c +605 -0
  25. package/native/ffi.macos.json +318 -0
  26. package/native/ffi.windows.json +322 -0
  27. package/native/third_party/dr_mp3.h +5430 -0
  28. package/native/third_party/stb_image.h +7988 -0
  29. package/native/third_party/stb_image_write.h +1724 -0
  30. package/native/third_party/stb_truetype.h +5079 -0
  31. package/package.json +47 -0
  32. package/scripts/build-native.sh +33 -0
  33. package/scripts/build-web.sh +10 -0
  34. package/scripts/vendor.sh +36 -0
  35. package/skills/assets/SKILL.md +11 -0
  36. package/skills/core/SKILL.md +51 -0
  37. package/skills/core/references/errors.md +22 -0
  38. package/skills/discord/SKILL.md +12 -0
  39. package/skills/export-web/SKILL.md +20 -0
  40. package/skills/game-design/SKILL.md +27 -0
  41. package/skills/game-design/references/sim-walkthrough.md +32 -0
  42. package/skills/ios/SKILL.md +19 -0
  43. package/skills/macos/SKILL.md +16 -0
  44. package/skills/netplay/SKILL.md +34 -0
  45. package/skills/relay/SKILL.md +18 -0
  46. package/src/audio.ts +19 -0
  47. package/src/draw2d.ts +901 -0
  48. package/src/ecs.ts +30 -0
  49. package/src/gltf.ts +82 -0
  50. package/src/gpu.ts +86 -0
  51. package/src/input.ts +215 -0
  52. package/src/math.ts +113 -0
  53. package/src/native/backend.ts +142 -0
  54. package/src/native/ffi.ts +42 -0
  55. package/src/native/library.ts +65 -0
  56. package/src/native/run.ts +88 -0
  57. package/src/physics.ts +57 -0
  58. package/src/platform.ts +12 -0
  59. package/src/raster2d.ts +348 -0
  60. package/src/render.ts +132 -0
  61. package/src/shapes.ts +37 -0
  62. package/src/sim.ts +56 -0
  63. package/src/storage.ts +6 -0
  64. package/src/web/run.ts +338 -0
  65. package/templates/_base/AGENTS.md +7 -0
  66. package/templates/_base/dotframe.json +15 -0
  67. package/templates/_base/gitignore +5 -0
  68. package/templates/_base/index.html +14 -0
  69. package/templates/_base/main.web.ts +27 -0
  70. package/templates/_base/package.json +12 -0
  71. package/templates/_base/sim.ts +31 -0
  72. package/templates/blank/game.ts +64 -0
  73. package/templates/fighter/game.ts +131 -0
  74. package/templates/platformer/game.ts +120 -0
  75. package/tools/check-audio.ts +57 -0
  76. package/tools/gen-library-glue.ts +83 -0
  77. package/tools/make-sprite.ts +92 -0
@@ -0,0 +1,318 @@
1
+ {
2
+ "ffi_format": 7,
3
+ "functions": [
4
+ {
5
+ "name": "dfOpen",
6
+ "symbol": "df_open",
7
+ "params": [
8
+ "i32",
9
+ "i32",
10
+ "string"
11
+ ],
12
+ "returns": "i32"
13
+ },
14
+ {
15
+ "name": "dfWidth",
16
+ "symbol": "df_width",
17
+ "params": [],
18
+ "returns": "i32"
19
+ },
20
+ {
21
+ "name": "dfHeight",
22
+ "symbol": "df_height",
23
+ "params": [],
24
+ "returns": "i32"
25
+ },
26
+ {
27
+ "name": "dfKeyDown",
28
+ "symbol": "df_key_down",
29
+ "params": [
30
+ "i32"
31
+ ],
32
+ "returns": "bool"
33
+ },
34
+ {
35
+ "name": "dfGamepadAxis",
36
+ "symbol": "df_gamepad_axis",
37
+ "params": [
38
+ "i32",
39
+ "i32"
40
+ ],
41
+ "returns": "f64"
42
+ },
43
+ {
44
+ "name": "dfGamepadButton",
45
+ "symbol": "df_gamepad_button",
46
+ "params": [
47
+ "i32",
48
+ "i32"
49
+ ],
50
+ "returns": "bool"
51
+ },
52
+ {
53
+ "name": "dfMouse",
54
+ "symbol": "df_mouse",
55
+ "params": [
56
+ "i32"
57
+ ],
58
+ "returns": "f64"
59
+ },
60
+ {
61
+ "name": "dfPrefPath",
62
+ "symbol": "df_pref_path",
63
+ "params": [
64
+ "string",
65
+ "string",
66
+ "mutable-bytes"
67
+ ],
68
+ "returns": "i32"
69
+ },
70
+ {
71
+ "name": "dfBuffer",
72
+ "symbol": "df_buffer",
73
+ "params": [
74
+ "u32",
75
+ "bytes"
76
+ ],
77
+ "returns": "i32"
78
+ },
79
+ {
80
+ "name": "dfBufferWrite",
81
+ "symbol": "df_buffer_write",
82
+ "params": [
83
+ "i32",
84
+ "bytes"
85
+ ],
86
+ "returns": "void"
87
+ },
88
+ {
89
+ "name": "dfBufferDestroy",
90
+ "symbol": "df_buffer_destroy",
91
+ "params": [
92
+ "i32"
93
+ ],
94
+ "returns": "void"
95
+ },
96
+ {
97
+ "name": "dfPipeline",
98
+ "symbol": "df_pipeline",
99
+ "params": [
100
+ "string",
101
+ "u32",
102
+ "bytes",
103
+ "u32"
104
+ ],
105
+ "returns": "i32"
106
+ },
107
+ {
108
+ "name": "dfBind",
109
+ "symbol": "df_bind",
110
+ "params": [
111
+ "i32",
112
+ "i32",
113
+ "i32"
114
+ ],
115
+ "returns": "i32"
116
+ },
117
+ {
118
+ "name": "dfTexture",
119
+ "symbol": "df_texture",
120
+ "params": [
121
+ "i32",
122
+ "i32",
123
+ "bytes",
124
+ "bool"
125
+ ],
126
+ "returns": "i32"
127
+ },
128
+ {
129
+ "name": "dfImage",
130
+ "symbol": "df_image",
131
+ "params": [
132
+ "bytes",
133
+ "bool"
134
+ ],
135
+ "returns": "i32"
136
+ },
137
+ {
138
+ "name": "dfTextureSize",
139
+ "symbol": "df_texture_size",
140
+ "params": [
141
+ "i32",
142
+ "i32"
143
+ ],
144
+ "returns": "i32"
145
+ },
146
+ {
147
+ "name": "dfPoll",
148
+ "symbol": "df_poll",
149
+ "params": [],
150
+ "returns": "bool"
151
+ },
152
+ {
153
+ "name": "dfTouchCount",
154
+ "symbol": "df_touch_count",
155
+ "params": [],
156
+ "returns": "i32"
157
+ },
158
+ {
159
+ "name": "dfTouch",
160
+ "symbol": "df_touch",
161
+ "params": [
162
+ "i32",
163
+ "i32"
164
+ ],
165
+ "returns": "f64"
166
+ },
167
+ {
168
+ "name": "dfBegin",
169
+ "symbol": "df_begin",
170
+ "params": [
171
+ "f64",
172
+ "f64",
173
+ "f64",
174
+ "bool"
175
+ ],
176
+ "returns": "i32"
177
+ },
178
+ {
179
+ "name": "dfDraw",
180
+ "symbol": "df_draw",
181
+ "params": [
182
+ "i32",
183
+ "i32",
184
+ "i32",
185
+ "i32",
186
+ "u32",
187
+ "u32"
188
+ ],
189
+ "returns": "void"
190
+ },
191
+ {
192
+ "name": "dfEnd",
193
+ "symbol": "df_end",
194
+ "params": [],
195
+ "returns": "void"
196
+ },
197
+ {
198
+ "name": "dfClose",
199
+ "symbol": "df_close",
200
+ "params": [],
201
+ "returns": "void"
202
+ },
203
+ {
204
+ "name": "dfAudioOpen",
205
+ "symbol": "df_audio_open",
206
+ "params": [],
207
+ "returns": "i32"
208
+ },
209
+ {
210
+ "name": "dfSound",
211
+ "symbol": "df_sound",
212
+ "params": [
213
+ "bytes"
214
+ ],
215
+ "returns": "i32"
216
+ },
217
+ {
218
+ "name": "dfPlay",
219
+ "symbol": "df_play",
220
+ "params": [
221
+ "i32",
222
+ "f64",
223
+ "f64"
224
+ ],
225
+ "returns": "void"
226
+ },
227
+ {
228
+ "name": "dfTone",
229
+ "symbol": "df_tone",
230
+ "params": [
231
+ "f64",
232
+ "f64",
233
+ "f64"
234
+ ],
235
+ "returns": "void"
236
+ },
237
+ {
238
+ "name": "dfTrack",
239
+ "symbol": "df_track",
240
+ "params": [
241
+ "bytes"
242
+ ],
243
+ "returns": "i32"
244
+ },
245
+ {
246
+ "name": "dfMusicPlay",
247
+ "symbol": "df_music_play",
248
+ "params": [
249
+ "i32",
250
+ "bool",
251
+ "f64"
252
+ ],
253
+ "returns": "i32"
254
+ },
255
+ {
256
+ "name": "dfMusicStop",
257
+ "symbol": "df_music_stop",
258
+ "params": [],
259
+ "returns": "void"
260
+ },
261
+ {
262
+ "name": "dfMusicPause",
263
+ "symbol": "df_music_pause",
264
+ "params": [
265
+ "bool"
266
+ ],
267
+ "returns": "void"
268
+ },
269
+ {
270
+ "name": "dfMusicVolume",
271
+ "symbol": "df_music_volume",
272
+ "params": [
273
+ "f64"
274
+ ],
275
+ "returns": "void"
276
+ },
277
+ {
278
+ "name": "dfMasterVolume",
279
+ "symbol": "df_master_volume",
280
+ "params": [
281
+ "f64"
282
+ ],
283
+ "returns": "void"
284
+ },
285
+ {
286
+ "name": "dfAudioActive",
287
+ "symbol": "df_audio_active",
288
+ "params": [],
289
+ "returns": "i32"
290
+ }
291
+ ],
292
+ "libraries": [
293
+ "../build/macos/libdf_native.a",
294
+ "../vendor/build/sdl-macos/libSDL3.a",
295
+ "../vendor/wgpu/macos/lib/libwgpu_native.a"
296
+ ],
297
+ "system_libraries": [
298
+ "c++",
299
+ "iconv"
300
+ ],
301
+ "frameworks": [
302
+ "Metal",
303
+ "QuartzCore",
304
+ "Cocoa",
305
+ "IOKit",
306
+ "CoreVideo",
307
+ "CoreAudio",
308
+ "AudioToolbox",
309
+ "CoreHaptics",
310
+ "GameController",
311
+ "ForceFeedback",
312
+ "Carbon",
313
+ "UniformTypeIdentifiers",
314
+ "AVFoundation",
315
+ "CoreMedia",
316
+ "Foundation"
317
+ ]
318
+ }
@@ -0,0 +1,322 @@
1
+ {
2
+ "ffi_format": 7,
3
+ "functions": [
4
+ {
5
+ "name": "dfOpen",
6
+ "symbol": "df_open",
7
+ "params": [
8
+ "i32",
9
+ "i32",
10
+ "string"
11
+ ],
12
+ "returns": "i32"
13
+ },
14
+ {
15
+ "name": "dfWidth",
16
+ "symbol": "df_width",
17
+ "params": [],
18
+ "returns": "i32"
19
+ },
20
+ {
21
+ "name": "dfHeight",
22
+ "symbol": "df_height",
23
+ "params": [],
24
+ "returns": "i32"
25
+ },
26
+ {
27
+ "name": "dfKeyDown",
28
+ "symbol": "df_key_down",
29
+ "params": [
30
+ "i32"
31
+ ],
32
+ "returns": "bool"
33
+ },
34
+ {
35
+ "name": "dfGamepadAxis",
36
+ "symbol": "df_gamepad_axis",
37
+ "params": [
38
+ "i32",
39
+ "i32"
40
+ ],
41
+ "returns": "f64"
42
+ },
43
+ {
44
+ "name": "dfGamepadButton",
45
+ "symbol": "df_gamepad_button",
46
+ "params": [
47
+ "i32",
48
+ "i32"
49
+ ],
50
+ "returns": "bool"
51
+ },
52
+ {
53
+ "name": "dfMouse",
54
+ "symbol": "df_mouse",
55
+ "params": [
56
+ "i32"
57
+ ],
58
+ "returns": "f64"
59
+ },
60
+ {
61
+ "name": "dfPrefPath",
62
+ "symbol": "df_pref_path",
63
+ "params": [
64
+ "string",
65
+ "string",
66
+ "mutable-bytes"
67
+ ],
68
+ "returns": "i32"
69
+ },
70
+ {
71
+ "name": "dfBuffer",
72
+ "symbol": "df_buffer",
73
+ "params": [
74
+ "u32",
75
+ "bytes"
76
+ ],
77
+ "returns": "i32"
78
+ },
79
+ {
80
+ "name": "dfBufferWrite",
81
+ "symbol": "df_buffer_write",
82
+ "params": [
83
+ "i32",
84
+ "bytes"
85
+ ],
86
+ "returns": "void"
87
+ },
88
+ {
89
+ "name": "dfBufferDestroy",
90
+ "symbol": "df_buffer_destroy",
91
+ "params": [
92
+ "i32"
93
+ ],
94
+ "returns": "void"
95
+ },
96
+ {
97
+ "name": "dfPipeline",
98
+ "symbol": "df_pipeline",
99
+ "params": [
100
+ "string",
101
+ "u32",
102
+ "bytes",
103
+ "u32"
104
+ ],
105
+ "returns": "i32"
106
+ },
107
+ {
108
+ "name": "dfBind",
109
+ "symbol": "df_bind",
110
+ "params": [
111
+ "i32",
112
+ "i32",
113
+ "i32"
114
+ ],
115
+ "returns": "i32"
116
+ },
117
+ {
118
+ "name": "dfTexture",
119
+ "symbol": "df_texture",
120
+ "params": [
121
+ "i32",
122
+ "i32",
123
+ "bytes",
124
+ "bool"
125
+ ],
126
+ "returns": "i32"
127
+ },
128
+ {
129
+ "name": "dfImage",
130
+ "symbol": "df_image",
131
+ "params": [
132
+ "bytes",
133
+ "bool"
134
+ ],
135
+ "returns": "i32"
136
+ },
137
+ {
138
+ "name": "dfTextureSize",
139
+ "symbol": "df_texture_size",
140
+ "params": [
141
+ "i32",
142
+ "i32"
143
+ ],
144
+ "returns": "i32"
145
+ },
146
+ {
147
+ "name": "dfPoll",
148
+ "symbol": "df_poll",
149
+ "params": [],
150
+ "returns": "bool"
151
+ },
152
+ {
153
+ "name": "dfTouchCount",
154
+ "symbol": "df_touch_count",
155
+ "params": [],
156
+ "returns": "i32"
157
+ },
158
+ {
159
+ "name": "dfTouch",
160
+ "symbol": "df_touch",
161
+ "params": [
162
+ "i32",
163
+ "i32"
164
+ ],
165
+ "returns": "f64"
166
+ },
167
+ {
168
+ "name": "dfBegin",
169
+ "symbol": "df_begin",
170
+ "params": [
171
+ "f64",
172
+ "f64",
173
+ "f64",
174
+ "bool"
175
+ ],
176
+ "returns": "i32"
177
+ },
178
+ {
179
+ "name": "dfDraw",
180
+ "symbol": "df_draw",
181
+ "params": [
182
+ "i32",
183
+ "i32",
184
+ "i32",
185
+ "i32",
186
+ "u32",
187
+ "u32"
188
+ ],
189
+ "returns": "void"
190
+ },
191
+ {
192
+ "name": "dfEnd",
193
+ "symbol": "df_end",
194
+ "params": [],
195
+ "returns": "void"
196
+ },
197
+ {
198
+ "name": "dfClose",
199
+ "symbol": "df_close",
200
+ "params": [],
201
+ "returns": "void"
202
+ },
203
+ {
204
+ "name": "dfAudioOpen",
205
+ "symbol": "df_audio_open",
206
+ "params": [],
207
+ "returns": "i32"
208
+ },
209
+ {
210
+ "name": "dfSound",
211
+ "symbol": "df_sound",
212
+ "params": [
213
+ "bytes"
214
+ ],
215
+ "returns": "i32"
216
+ },
217
+ {
218
+ "name": "dfPlay",
219
+ "symbol": "df_play",
220
+ "params": [
221
+ "i32",
222
+ "f64",
223
+ "f64"
224
+ ],
225
+ "returns": "void"
226
+ },
227
+ {
228
+ "name": "dfTone",
229
+ "symbol": "df_tone",
230
+ "params": [
231
+ "f64",
232
+ "f64",
233
+ "f64"
234
+ ],
235
+ "returns": "void"
236
+ },
237
+ {
238
+ "name": "dfTrack",
239
+ "symbol": "df_track",
240
+ "params": [
241
+ "bytes"
242
+ ],
243
+ "returns": "i32"
244
+ },
245
+ {
246
+ "name": "dfMusicPlay",
247
+ "symbol": "df_music_play",
248
+ "params": [
249
+ "i32",
250
+ "bool",
251
+ "f64"
252
+ ],
253
+ "returns": "i32"
254
+ },
255
+ {
256
+ "name": "dfMusicStop",
257
+ "symbol": "df_music_stop",
258
+ "params": [],
259
+ "returns": "void"
260
+ },
261
+ {
262
+ "name": "dfMusicPause",
263
+ "symbol": "df_music_pause",
264
+ "params": [
265
+ "bool"
266
+ ],
267
+ "returns": "void"
268
+ },
269
+ {
270
+ "name": "dfMusicVolume",
271
+ "symbol": "df_music_volume",
272
+ "params": [
273
+ "f64"
274
+ ],
275
+ "returns": "void"
276
+ },
277
+ {
278
+ "name": "dfMasterVolume",
279
+ "symbol": "df_master_volume",
280
+ "params": [
281
+ "f64"
282
+ ],
283
+ "returns": "void"
284
+ },
285
+ {
286
+ "name": "dfAudioActive",
287
+ "symbol": "df_audio_active",
288
+ "params": [],
289
+ "returns": "i32"
290
+ }
291
+ ],
292
+ "libraries": [
293
+ "../build/windows/libdf_native.a",
294
+ "../vendor/build/sdl-windows/libSDL3.a",
295
+ "../vendor/wgpu/windows/lib/libwgpu_native.a"
296
+ ],
297
+ "system_libraries": [
298
+ "kernel32",
299
+ "user32",
300
+ "gdi32",
301
+ "winmm",
302
+ "imm32",
303
+ "ole32",
304
+ "oleaut32",
305
+ "version",
306
+ "uuid",
307
+ "advapi32",
308
+ "setupapi",
309
+ "shell32",
310
+ "dinput8",
311
+ "ws2_32",
312
+ "userenv",
313
+ "bcrypt",
314
+ "ntdll",
315
+ "opengl32",
316
+ "d3d12",
317
+ "dxgi",
318
+ "d3dcompiler_47",
319
+ "propsys",
320
+ "unwind"
321
+ ]
322
+ }