1 ! Copyright (C) 2006, 2007, 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors timers arrays calendar destructors kernel make math math.rectangles
4 math.parser namespaces sequences system sokoban.game sokoban.layout sokoban.gl sokoban.sound ui.gadgets
5 ui.gadgets.labels ui.gadgets.worlds ui.gadgets.status-bar ui.gestures
9 TUPLE: sokoban-gadget < gadget { sokoban sokoban } { timer } { window-dims array initial: { 700 800 } } ;
11 : <sokoban-gadget> ( sokoban -- gadget )
12 create-engine >>engine
13 sokoban-gadget new swap >>sokoban ;
15 :: get-dim ( sokoban level -- level w h )
16 ! Look for maximum height and width of wall layout to determine size of board
17 level component get first states>> nth :> new_board
19 new_board [ first ] map supremum 1 +
20 new_board [ second ] map supremum 1 + ;
22 : new-sokoban ( gadget -- gadget )
23 ! Restarts sokoban without changing levels
24 dup sokoban>> engine>> swap
25 [ dup level>> get-dim <sokoban> ] change-sokoban
26 swap over sokoban>> swap >>engine >>sokoban ;
28 :: window-size ( sokoban -- window-size )
29 sokoban level>> :> level
30 sokoban level get-dim :> ( lev w h )
36 : update-sokoban ( gadget -- gadget )
37 ! Changes to the next level of sokoban
38 dup sokoban>> engine>> swap
39 [ dup level>> 1 + get-dim <sokoban> ] change-sokoban
40 dup sokoban>> window-size >>window-dims
41 swap over sokoban>> swap >>engine >>sokoban ;
43 M: sokoban-gadget pref-dim* ( gadget -- dim )
44 sokoban>> window-size ;
45 ! drop { 700 800 } ; ! needs to be changed as well
47 : update-status ( gadget -- )
49 [ "Level: " % level>> # ]
50 [ paused?>> [ " (Paused)" % ] when ] bi
51 ] "" make swap show-status ;
53 M: sokoban-gadget draw-gadget* ( gadget -- )
55 [ dim>> first2 ] [ sokoban>> ] bi draw-sokoban
56 ] keep update-status ;
58 : unless-paused ( sokoban quot -- )
59 over sokoban>> paused?>> [
66 { T{ button-down f f 1 } [ request-focus ] }
67 { T{ key-down f f "UP" } [ [ sokoban>> move-up ] unless-paused ] }
68 { T{ key-down f f "LEFT" } [ [ sokoban>> move-left ] unless-paused ] }
69 { T{ key-down f f "RIGHT" } [ [ sokoban>> move-right ] unless-paused ] }
70 { T{ key-down f f "DOWN" } [ [ sokoban>> move-down ] unless-paused ] }
71 { T{ key-down f f "p" } [ sokoban>> toggle-pause ] }
72 { T{ key-down f f "n" } [ new-sokoban drop ] }
76 dup sokoban>> update-level? [
84 M: sokoban-gadget graft* ( gadget -- )
85 [ [ tick ] curry 100 milliseconds every ] keep timer<< ;
87 M: sokoban-gadget ungraft* ( gadget -- )
88 dup sokoban>> engine>> dispose
89 [ stop-timer f ] change-timer drop ;
91 : sokoban-window ( -- )
93 <default-sokoban> <sokoban-gadget>
94 "sokoban" open-status-window