-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathscripting.h
More file actions
249 lines (212 loc) · 13.9 KB
/
scripting.h
File metadata and controls
249 lines (212 loc) · 13.9 KB
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
#define DELAY_FIRST_BUBBLE 25
#define DELAY_INFO_MESSAGE 50*4
// Command opcodes
#define COMMAND_END 0
#define COMMAND_RECTANGLE 1
#define COMMAND_FILL_RECTANGLE 2
#define COMMAND_TEXT 3
#define COMMAND_WHITE_BUBBLE 4
#define COMMAND_BLACK_BUBBLE 5
#define COMMAND_WAIT 6
#define COMMAND_BITMAP 7
#define COMMAND_FADE_BUFFER 8
#define COMMAND_JUMP 9 // Really, that's a GOTO :p
#define COMMAND_JUMP_IF_TRUE 10
#define COMMAND_JUMP_IF_FALSE 11
#define COMMAND_INFO_MESSAGE 12
#define COMMAND_DISPLAY_IMAGE 13
#define COMMAND_DISPLAY_IMAGE_ONLY 14
#define COMMAND_END_AND_REFRESH 15
#define COMMAND_ERROR_MESSAGE 16
#define COMMAND_SET_ITEM_LOCATION 17
#define COMMAND_SET_ITEM_FLAGS 18
#define COMMAND_UNSET_ITEM_FLAGS 19
#define COMMAND_SET_ITEM_DESCRIPTION 20
#define COMMAND_SET_LOCATION_DIRECTION 21
#define COMMAND_UNLOCK_ACHIEVEMENT 22
#define COMMAND_INCREASE_SCORE 23
#define COMMAND_GAME_OVER 24
#define COMMAND_CLEAR_FULL_TEXT_AREA 25
#define COMMAND_SET_SCENE_IMAGE 26
#define COMMAND_DISPLAY_IMAGE_NOBLIT 27
#define COMMAND_CLEAR_TEXT_AREA 28
#define COMMAND_GOSUB 29
#define COMMAND_RETURN 30
#define COMMAND_DO_ONCE 31
#define COMMAND_SET_CUT_SCENE 32
#define COMMAND_PLAY_SOUND 33
#define COMMAND_WAIT_RANDOM 34
#define COMMAND_START_CLOCK 35
#define COMMAND_STOP_CLOCK 36
#define COMMAND_END_AND_PARTIAL_REFRESH 37
#define COMMAND_LOAD_MUSIC 38
#define COMMAND_STOP_MUSIC 39
#define COMMAND_WAIT_KEYPRESS 40
#define COMMAND_QUICK_MESSAGE 41
#define COMMAND_SET_SKIP_POINT 42
#define COMMAND_SET_PLAYER_LOCATION 43
#define COMMAND_SET_CURRENT_ITEM 44
#define COMMAND_CALL_NATIVE 45
#define COMMAND_COMBINE_ITEMS 46
#define _COMMAND_COUNT 47
// Operator opcodes
#define OPERATOR_CHECK_ITEM_LOCATION 0
#define OPERATOR_CHECK_ITEM_FLAG 1
#define OPERATOR_CHECK_PLAYER_LOCATION 2
#define OPERATOR_CHECK_ITEM_CONTAINER 3
#define OPERATOR_CHECK_ADDRESS_VALUE 4
#define CHECK_ITEM_LOCATION(item,location) OPERATOR_CHECK_ITEM_LOCATION,item,location
#define CHECK_ITEM_FLAG(item,flag) OPERATOR_CHECK_ITEM_FLAG,item,flag
#define CHECK_ITEM_CONTAINER(item,container) OPERATOR_CHECK_ITEM_CONTAINER,item,container
#define CHECK_PLAYER_LOCATION(location) OPERATOR_CHECK_PLAYER_LOCATION,location
#define CHECK_ADDRESS_VALUE(address,value) OPERATOR_CHECK_ADDRESS_VALUE,<address,>address,value
// Flow control
#define END .byt COMMAND_END
#define END_AND_REFRESH .byt COMMAND_END_AND_REFRESH
#define END_AND_PARTIAL_REFRESH .byt COMMAND_END_AND_PARTIAL_REFRESH
#define WAIT(duration) .byt COMMAND_WAIT,duration
#define WAIT_RANDOM(base_duration,rand_mask) .byt COMMAND_WAIT_RANDOM,base_duration,rand_mask
#define JUMP(label) .byt COMMAND_JUMP,<label,>label
#define DO_ONCE(label) .byt COMMAND_DO_ONCE,1,<label,>label
#define JUMP_IF_TRUE(label,expression) .byt COMMAND_JUMP_IF_TRUE,<label,>label,expression
#define JUMP_IF_FALSE(label,expression) .byt COMMAND_JUMP_IF_FALSE,<label,>label,expression
#define GOSUB(label) .byt COMMAND_GOSUB,<label,>label
#define RETURN .byt COMMAND_RETURN
#define CALL_NATIVE(address) .byt COMMAND_CALL_NATIVE,<address,>address
#define SET_CUT_SCENE(flag) .byt COMMAND_SET_CUT_SCENE,flag
#define SET_SKIP_POINT(label) .byt COMMAND_SET_SKIP_POINT,<label,>label
#ifdef ASSEMBLER
#define IF_TRUE(expression,label) .byt COMMAND_JUMP_IF_FALSE,<label,>label,expression
#define IF_FALSE(expression,label) .byt COMMAND_JUMP_IF_TRUE,<label,>label,expression
#define ELSE(else,endif) else = *+3: .byt COMMAND_JUMP,<endif,>endif
#define ENDIF(endif) endif
#define ENDDO(enddo) enddo
#endif
// Text
#define INFO_MESSAGE(message) .byt COMMAND_INFO_MESSAGE,message,0
#define QUICK_MESSAGE(message) .byt COMMAND_QUICK_MESSAGE,message,0
#define ERROR_MESSAGE(message) .byt COMMAND_ERROR_MESSAGE,message,0
#define MAX_BUBBLE 4 // Should find a way to assert that at compile time
#define WHITE_BUBBLE(bubble_count) .byt COMMAND_WHITE_BUBBLE,bubble_count
#define BLACK_BUBBLE(bubble_count) .byt COMMAND_BLACK_BUBBLE,bubble_count
#define _BUBBLE_LINE(x,y,yoffset,text) .byt x,y,yoffset,text,0
#define CLEAR_TEXT_AREA(paper_color) .byt COMMAND_CLEAR_TEXT_AREA,16+(paper_color&7)
#define CLEAR_FULL_TEXT_AREA(paper_color) .byt COMMAND_CLEAR_FULL_TEXT_AREA,16+(paper_color&7)
// Meta game
#define UNLOCK_ACHIEVEMENT(achievement) .byt COMMAND_UNLOCK_ACHIEVEMENT,achievement
#define DECREASE_SCORE(points) .byt COMMAND_INCREASE_SCORE,<(65536-points),>(65536-points)
#define INCREASE_SCORE(points) .byt COMMAND_INCREASE_SCORE,<points,>points
#define GAME_OVER(condition) .byt COMMAND_GAME_OVER,condition
#define START_CLOCK .byt COMMAND_START_CLOCK
#define STOP_CLOCK .byt COMMAND_STOP_CLOCK
#define WAIT_KEYPRESS .byt COMMAND_WAIT_KEYPRESS
// Items
#define SET_CURRENT_ITEM(item) .byt COMMAND_SET_CURRENT_ITEM,item
#define SET_ITEM_LOCATION(item,location) .byt COMMAND_SET_ITEM_LOCATION,item,location
#define SET_ITEM_FLAGS(item,flags) .byt COMMAND_SET_ITEM_FLAGS,item,flags
#define UNSET_ITEM_FLAGS(item,flags) .byt COMMAND_UNSET_ITEM_FLAGS,item,255^flags
#define SET_ITEM_DESCRIPTION(item,description) .byt COMMAND_SET_ITEM_DESCRIPTION,item,description,0
#define COMBINE_ITEMS_2(result,item1,item2) .byt COMMAND_COMBINE_ITEMS,item1,item2,255,result
#define COMBINE_ITEMS_3(result,item1,item2,item3) .byt COMMAND_COMBINE_ITEMS,item1,item2,item3,result
// Locations
#define SET_LOCATION_DIRECTION(location,direction,value) .byt COMMAND_SET_LOCATION_DIRECTION,location,direction,value
#define SET_PLAYER_LOCATION(location) .byt COMMAND_SET_PLAYER_LOCATION,location
#define SET_SCENE_IMAGE(imageId) .byt COMMAND_SET_SCENE_IMAGE,imageId
// Graphics
#define BLOCK_SIZE(w,h) w,h
#define DRAW_BITMAP(imageId,size,stride,src,dst) .byt COMMAND_BITMAP,imageId,size,stride,<src,>src,<dst,>dst
#define DISPLAY_IMAGE(imagedId) .byt COMMAND_DISPLAY_IMAGE,imagedId
#define DISPLAY_IMAGE_NOBLIT(imagedId) .byt COMMAND_DISPLAY_IMAGE_NOBLIT,imagedId
#define DISPLAY_IMAGE_ONLY(imagedId) .byt COMMAND_DISPLAY_IMAGE_ONLY,imagedId
#define FADE_BUFFER .byt COMMAND_FADE_BUFFER
#define BLIT_BLOCK(imageId,w,h) .byt COMMAND_BITMAP,imageId,w,h,40
#define BLIT_BLOCK_STRIDE(imageId,w,h,stride) .byt COMMAND_BITMAP,imageId,w,h,stride
#define _BUFFER(x,y) .byt <_ImageBuffer+x+(40*y),>_ImageBuffer+x+(40*y)
#define _IMAGE(x,y) .byt <_SecondImageBuffer+x+(40*y),>_SecondImageBuffer+x+(40*y)
#define _IMAGE_STRIDE(x,y,stride) .byt <_SecondImageBuffer+x+(stride*y),>_SecondImageBuffer+x+(stride*y)
#define _SCREEN(x,y) .byt <$a000+x+(40*y),>$a000+x+(40*y)
// Sound
#ifdef ENABLE_SOUND_EFFECTS
#define PLAY_SOUND(sound) .byt COMMAND_PLAY_SOUND,<sound,>sound
#else
#define PLAY_SOUND(sound)
#endif
#ifdef ENABLE_MUSIC
#define LOAD_MUSIC(musicId) .byt COMMAND_LOAD_MUSIC,musicId
#define STOP_MUSIC() .byt COMMAND_STOP_MUSIC
#else
#define LOAD_MUSIC(musicId)
#define STOP_MUSIC()
#endif
// Audio commands
#define SOUND_NOT_PLAYING 255
#define SOUND_FLAG_END 128 // Can be added to a register value to mark the command as finished
#define SOUND_FLAG_END_FRAME 64 // Can be added to a register value to mark the command as the last one for that frame
#define SOUND_COMMAND_END 0 // End of the sound - DO NOT USE DIRECTLY, USE THE FLAG "SOUND_FLAG_END" on the command opcode instead
#define SOUND_COMMAND_END_FRAME 1 // End of command list for this frame
#define SOUND_COMMAND_SET_BANK 2 // Change a complete set of sounds: <14 values copied to registers 0 to 13>
#define SOUND_COMMAND_SET_VALUE 3 // Set a register value: <register index> <value to set>
#define SOUND_COMMAND_ADD_VALUE 4 // Add to a register: <register index> <value to add>
#define SOUND_COMMAND_REPEAT 5 // Defines the start of a block that will repeat "n" times: <repeat count>
#define SOUND_COMMAND_ENDREPEAT 6 // Defines the end of a repeating block
#define SOUND_COMMAND_SET_VALUE2 7 // Set a 16 bit register value: <register index> <value to set>
#define SOUND_COMMAND_WAIT 8 // Wait a number of frames
#define SOUND_WAIT(delay) .byt SOUND_COMMAND_WAIT,delay
#define SOUND_REPEAT(count) .byt SOUND_COMMAND_REPEAT,count
#define SOUND_ENDREPEAT() .byt SOUND_COMMAND_ENDREPEAT
#define SOUND_ADD_VALUE(register,value) .byt SOUND_COMMAND_ADD_VALUE,register,value
#define SOUND_SET_VALUE(register,value) .byt SOUND_COMMAND_SET_VALUE,register,value
#define SOUND_SET_VALUE2(register,value) .byt SOUND_COMMAND_SET_VALUE2,register,<value,>value
#define SOUND_SET_NOISE(freq) .byt SOUND_COMMAND_SET_VALUE,REG_NOISE_FREQ,freq
#define SOUND_SET_TONE_A(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_A_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE,REG_A_VOLUME,volume
#define SOUND_SET_TONE_B(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_B_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE,REG_B_VOLUME,volume
#define SOUND_SET_TONE_C(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_C_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE,REG_C_VOLUME,volume
#define SOUND_SET_VALUE_END(register,value) .byt SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END,register,value
#define SOUND_SET_VALUE2_END(register,value) .byt SOUND_COMMAND_SET_VALUE2|SOUND_FLAG_END,register,<value,>value
#define SOUND_SET_NOISE_END(freq) .byt SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END,REG_NOISE_FREQ,freq
#define SOUND_SET_TONE_A_END(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_A_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END,REG_A_VOLUME,volume
#define SOUND_SET_TONE_B_END(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_B_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END,REG_B_VOLUME,volume
#define SOUND_SET_TONE_C_END(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_C_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END,REG_C_VOLUME,volume
#define SOUND_ADD_VALUE_ENDFRAME(register,value) .byt SOUND_COMMAND_ADD_VALUE|SOUND_FLAG_END_FRAME,register,value
#define SOUND_SET_VALUE_ENDFRAME(register,value) .byt SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END_FRAME,register,value
#define SOUND_SET_VALUE2_ENDFRAME(register,value) .byt SOUND_COMMAND_SET_VALUE2|SOUND_FLAG_END_FRAME,register,<value,>value
#define SOUND_SET_NOISE_ENDFRAME(freq) .byt SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END_FRAME,REG_NOISE_FREQ,freq
#define SOUND_SET_TONE_A_ENDFRAME(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_A_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END_FRAME,REG_A_VOLUME,volume
#define SOUND_SET_TONE_B_ENDFRAME(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_B_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END_FRAME,REG_B_VOLUME,volume
#define SOUND_SET_TONE_C_ENDFRAME(freq,volume) .byt SOUND_COMMAND_SET_VALUE2,REG_C_FREQ,<freq,>freq,SOUND_COMMAND_SET_VALUE|SOUND_FLAG_END_FRAME,REG_C_VOLUME,volume
#define REG_A_FREQ 0 ; Chanel A Frequency
#define REG_A_FREQ_LOW 0 ; Chanel A Frequency (lower 8 bits)
#define REG_A_FREQ_HI 1 ; Chanel A Frequency (higher 4 bits)
#define REG_B_FREQ 2 ; Chanel B Frequency
#define REG_B_FREQ_LOW 2 ; Chanel B Frequency (lower 8 bits)
#define REG_B_FREQ_HI 3 ; Chanel B Frequency (higher 4 bits)
#define REG_C_FREQ 4 ; Chanel C Frequency
#define REG_C_FREQ_LOW 4 ; Chanel C Frequency (lower 8 bits)
#define REG_C_FREQ_HI 5 ; Chanel C Frequency (higher 4 bits)
#define REG_NOISE_FREQ 6 ; Chanel sound generator (0-31)
#define REG_MIXER 7 ; Mixer/Selector -> Everything is disabled by default
#define REG_A_VOLUME 8 ; Volume A
#define REG_B_VOLUME 9 ; Volume B
#define REG_C_VOLUME 10 ; Volume C
#define REG_ENV 11 ; Wave period
#define REG_ENV_LOW 11 ; Wave period
#define REG_ENV_HI 12 ; Wave period
#define REG_ENV_SHAPE 13 ; Wave form
// Text commands
#define TEXT_END 255
#define TEXT_CRLF 254
// End command
#define FLAG_END_STREAM 1
#define FLAG_WAIT 2
#define FLAG_REFRESH_SCENE 4
#define FLAG_PARTIAL_REFRESH 8
// Value mapping
#define VALUE_MAPPING(value,address) .byt value,<address,>address
#define VALUE_MAPPING2(value1,value2,address) .byt value1,value2,<address,>address
#define COMBINE_MAPPING(value1,value2,address) .byt (value1<value2)*value1+(value2<value1)*value2,(value1<value2)*value2+(value2<value1)*value1,<address,>address // Auto-sorted; _DispatchStream2 sorts params to match
#define WORD_MAPPING(value,address,flag) .byt value,flag,<address,>address
// This mapping list of flags should probably be redone, but good enough for now
// Basically, should separate concepts: Is it CODE or STREAM, and does it require an item(s) lookup in a table
#define FLAG_MAPPING_DEFAULT 0 // Just a simple C or assembler function to call
#define FLAG_MAPPING_STREAM 4 // 0 = Function pointer, 1 = Stream pointer
#define FLAG_MAPPING_STREAM_CALLBACK 8 // No item at all, just a stream callback