@@ -22,6 +22,9 @@ public void Read(BinaryReader reader) {
2222 case "data" :
2323 ReadChunkData ( reader ) ;
2424 break ;
25+ case "input" :
26+ ReadChunkInput ( reader ) ;
27+ break ;
2528 default :
2629 // Skip any unknown chunks.
2730 reader . BaseStream . Seek ( length , SeekOrigin . Current ) ;
@@ -33,6 +36,8 @@ public void Read(BinaryReader reader) {
3336 public void Write ( BinaryWriter writer ) {
3437 WriteChunkData ( writer ) ;
3538
39+ WriteChunkInput ( writer ) ;
40+
3641 writer . WriteNullTerminatedString ( "\r \n " ) ;
3742 }
3843
@@ -148,5 +153,204 @@ public void WriteChunkData(BinaryWriter writer) {
148153 WriteChunkEnd ( writer , start ) ;
149154 }
150155
156+ public bool HasInput ;
157+
158+ public int MoveX ;
159+ public int MoveY ;
160+
161+ public Vector2 Aim ;
162+ public Vector2 MountainAim ;
163+
164+ public int Buttons ;
165+ public bool ESC {
166+ get {
167+ return ( Buttons & ( int ) ButtonMask . ESC ) == ( int ) ButtonMask . ESC ;
168+ }
169+ set {
170+ Buttons &= ( int ) ~ ButtonMask . ESC ;
171+ if ( value )
172+ Buttons |= ( int ) ButtonMask . ESC ;
173+ }
174+ }
175+ public bool Pause {
176+ get {
177+ return ( Buttons & ( int ) ButtonMask . Pause ) == ( int ) ButtonMask . Pause ;
178+ }
179+ set {
180+ Buttons &= ( int ) ~ ButtonMask . Pause ;
181+ if ( value )
182+ Buttons |= ( int ) ButtonMask . Pause ;
183+ }
184+ }
185+ public bool MenuLeft {
186+ get {
187+ return ( Buttons & ( int ) ButtonMask . MenuLeft ) == ( int ) ButtonMask . MenuLeft ;
188+ }
189+ set {
190+ Buttons &= ( int ) ~ ButtonMask . MenuLeft ;
191+ if ( value )
192+ Buttons |= ( int ) ButtonMask . MenuLeft ;
193+ }
194+ }
195+ public bool MenuRight {
196+ get {
197+ return ( Buttons & ( int ) ButtonMask . MenuRight ) == ( int ) ButtonMask . MenuRight ;
198+ }
199+ set {
200+ Buttons &= ( int ) ~ ButtonMask . MenuRight ;
201+ if ( value )
202+ Buttons |= ( int ) ButtonMask . MenuRight ;
203+ }
204+ }
205+ public bool MenuUp {
206+ get {
207+ return ( Buttons & ( int ) ButtonMask . MenuUp ) == ( int ) ButtonMask . MenuUp ;
208+ }
209+ set {
210+ Buttons &= ( int ) ~ ButtonMask . MenuUp ;
211+ if ( value )
212+ Buttons |= ( int ) ButtonMask . MenuUp ;
213+ }
214+ }
215+ public bool MenuDown {
216+ get {
217+ return ( Buttons & ( int ) ButtonMask . MenuDown ) == ( int ) ButtonMask . MenuDown ;
218+ }
219+ set {
220+ Buttons &= ( int ) ~ ButtonMask . MenuDown ;
221+ if ( value )
222+ Buttons |= ( int ) ButtonMask . MenuDown ;
223+ }
224+ }
225+ public bool MenuConfirm {
226+ get {
227+ return ( Buttons & ( int ) ButtonMask . MenuConfirm ) == ( int ) ButtonMask . MenuConfirm ;
228+ }
229+ set {
230+ Buttons &= ( int ) ~ ButtonMask . MenuConfirm ;
231+ if ( value )
232+ Buttons |= ( int ) ButtonMask . MenuConfirm ;
233+ }
234+ }
235+ public bool MenuCancel {
236+ get {
237+ return ( Buttons & ( int ) ButtonMask . MenuCancel ) == ( int ) ButtonMask . MenuCancel ;
238+ }
239+ set {
240+ Buttons &= ( int ) ~ ButtonMask . MenuCancel ;
241+ if ( value )
242+ Buttons |= ( int ) ButtonMask . MenuCancel ;
243+ }
244+ }
245+ public bool MenuJournal {
246+ get {
247+ return ( Buttons & ( int ) ButtonMask . MenuJournal ) == ( int ) ButtonMask . MenuJournal ;
248+ }
249+ set {
250+ Buttons &= ( int ) ~ ButtonMask . MenuJournal ;
251+ if ( value )
252+ Buttons |= ( int ) ButtonMask . MenuJournal ;
253+ }
254+ }
255+ public bool QuickRestart {
256+ get {
257+ return ( Buttons & ( int ) ButtonMask . QuickRestart ) == ( int ) ButtonMask . QuickRestart ;
258+ }
259+ set {
260+ Buttons &= ( int ) ~ ButtonMask . QuickRestart ;
261+ if ( value )
262+ Buttons |= ( int ) ButtonMask . QuickRestart ;
263+ }
264+ }
265+ public bool Jump {
266+ get {
267+ return ( Buttons & ( int ) ButtonMask . Jump ) == ( int ) ButtonMask . Jump ;
268+ }
269+ set {
270+ Buttons &= ( int ) ~ ButtonMask . Jump ;
271+ if ( value )
272+ Buttons |= ( int ) ButtonMask . Jump ;
273+ }
274+ }
275+ public bool Dash {
276+ get {
277+ return ( Buttons & ( int ) ButtonMask . Dash ) == ( int ) ButtonMask . Dash ;
278+ }
279+ set {
280+ Buttons &= ( int ) ~ ButtonMask . Dash ;
281+ if ( value )
282+ Buttons |= ( int ) ButtonMask . Dash ;
283+ }
284+ }
285+ public bool Grab {
286+ get {
287+ return ( Buttons & ( int ) ButtonMask . Grab ) == ( int ) ButtonMask . Grab ;
288+ }
289+ set {
290+ Buttons &= ( int ) ~ ButtonMask . Grab ;
291+ if ( value )
292+ Buttons |= ( int ) ButtonMask . Grab ;
293+ }
294+ }
295+ public bool Talk {
296+ get {
297+ return ( Buttons & ( int ) ButtonMask . Talk ) == ( int ) ButtonMask . Talk ;
298+ }
299+ set {
300+ Buttons &= ( int ) ~ ButtonMask . Talk ;
301+ if ( value )
302+ Buttons |= ( int ) ButtonMask . Talk ;
303+ }
304+ }
305+
306+ public void ReadChunkInput ( BinaryReader reader ) {
307+ HasInput = true ;
308+
309+ MoveX = reader . ReadInt32 ( ) ;
310+ MoveY = reader . ReadInt32 ( ) ;
311+
312+ Aim = new Vector2 ( reader . ReadSingle ( ) , reader . ReadSingle ( ) ) ;
313+ MountainAim = new Vector2 ( reader . ReadSingle ( ) , reader . ReadSingle ( ) ) ;
314+
315+ Buttons = reader . ReadInt32 ( ) ;
316+ }
317+
318+ public void WriteChunkInput ( BinaryWriter writer ) {
319+ if ( ! HasInput )
320+ return ;
321+ long start = WriteChunkStart ( writer , "input" ) ;
322+
323+ writer . Write ( MoveX ) ;
324+ writer . Write ( MoveY ) ;
325+
326+ writer . Write ( Aim . X ) ;
327+ writer . Write ( Aim . Y ) ;
328+
329+ writer . Write ( MountainAim . X ) ;
330+ writer . Write ( MountainAim . Y ) ;
331+
332+ writer . Write ( Buttons ) ;
333+
334+ WriteChunkEnd ( writer , start ) ;
335+ }
336+
337+ [ Flags ]
338+ public enum ButtonMask : int {
339+ ESC = 1 << 0 ,
340+ Pause = 1 << 1 ,
341+ MenuLeft = 1 << 2 ,
342+ MenuRight = 1 << 3 ,
343+ MenuUp = 1 << 4 ,
344+ MenuDown = 1 << 5 ,
345+ MenuConfirm = 1 << 6 ,
346+ MenuCancel = 1 << 7 ,
347+ MenuJournal = 1 << 8 ,
348+ QuickRestart = 1 << 9 ,
349+ Jump = 1 << 10 ,
350+ Dash = 1 << 11 ,
351+ Grab = 1 << 12 ,
352+ Talk = 1 << 13
353+ }
354+
151355 }
152356}
0 commit comments