1 ! Copyright (C) 2007, 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alarms arrays calendar jamshred.game jamshred.gl
4 jamshred.player jamshred.log kernel math math.constants namespaces
5 sequences threads ui ui.backend ui.gadgets ui.gadgets.worlds
6 ui.gestures ui.render math.vectors math.geometry.rect ;
9 TUPLE: jamshred-gadget jamshred last-hand-loc alarm ;
11 : <jamshred-gadget> ( jamshred -- gadget )
12 jamshred-gadget construct-gadget swap >>jamshred ;
14 : default-width ( -- x ) 800 ;
15 : default-height ( -- y ) 600 ;
17 M: jamshred-gadget pref-dim*
18 drop default-width default-height 2array ;
20 M: jamshred-gadget draw-gadget* ( gadget -- )
21 [ jamshred>> ] [ rect-dim first2 draw-jamshred ] bi ;
23 : jamshred-loop ( gadget -- )
24 dup jamshred>> quit>> [
27 [ jamshred>> jamshred-update ]
29 [ yield jamshred-loop ] tri
32 : fullscreen ( gadget -- )
33 find-world t swap set-fullscreen* ;
35 : no-fullscreen ( gadget -- )
36 find-world f swap set-fullscreen* ;
38 : toggle-fullscreen ( world -- )
39 [ fullscreen? not ] keep set-fullscreen* ;
41 M: jamshred-gadget graft* ( gadget -- )
42 [ jamshred-loop ] in-thread drop ;
44 M: jamshred-gadget ungraft* ( gadget -- )
45 jamshred>> t swap (>>quit) ;
47 : jamshred-restart ( jamshred-gadget -- )
48 <jamshred> >>jamshred drop ;
50 : pix>radians ( n m -- theta )
51 / pi 4 * * ; ! 2 / / pi 2 * * ;
53 : x>radians ( x gadget -- theta )
54 #! translate motion of x pixels to an angle
55 rect-dim first pix>radians neg ;
57 : y>radians ( y gadget -- theta )
58 #! translate motion of y pixels to an angle
59 rect-dim second pix>radians ;
61 : (handle-mouse-motion) ( jamshred-gadget mouse-motion -- )
63 [ first swap x>radians ] 2keep second swap y>radians
66 : handle-mouse-motion ( jamshred-gadget -- )
68 over last-hand-loc>> [
69 v- (handle-mouse-motion)
71 ] 2keep >>last-hand-loc drop ;
73 : handle-mouse-scroll ( jamshred-gadget -- )
74 jamshred>> scroll-direction get
75 [ first mouse-scroll-x ]
76 [ second mouse-scroll-y ] 2bi ;
79 [ no-fullscreen ] [ close-window ] bi ;
82 { T{ key-down f f "r" } [ jamshred-restart ] }
83 { T{ key-down f f " " } [ jamshred>> toggle-running ] }
84 { T{ key-down f f "f" } [ find-world toggle-fullscreen ] }
85 { T{ key-down f f "UP" } [ jamshred>> jamshred-player 1 swap change-player-speed ] }
86 { T{ key-down f f "DOWN" } [ jamshred>> jamshred-player -1 swap change-player-speed ] }
87 { T{ key-down f f "LEFT" } [ jamshred>> 1 jamshred-roll ] }
88 { T{ key-down f f "RIGHT" } [ jamshred>> -1 jamshred-roll ] }
89 { T{ key-down f f "q" } [ quit ] }
90 { T{ motion } [ handle-mouse-motion ] }
91 { T{ mouse-scroll } [ handle-mouse-scroll ] }
94 : jamshred-window ( -- jamshred )
95 [ <jamshred> dup <jamshred-gadget> "Jamshred" open-window ] with-ui ;