]> gitweb.factorcode.org Git - factor.git/blob - extra/jamshred/player/player.factor
c40729e35b0541512e08c7396d76dcf7c6481dd0
[factor.git] / extra / jamshred / player / player.factor
1 ! Copyright (C) 2007, 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors colors combinators jamshred.log jamshred.oint jamshred.sound jamshred.tunnel kernel locals math math.constants math.order math.ranges math.vectors math.matrices shuffle sequences system ;
4 USE: tools.walker
5 IN: jamshred.player
6
7 TUPLE: player < oint name sounds tunnel nearest-segment last-move speed ;
8
9 ! speeds are in GL units / second
10 : default-speed ( -- speed ) 1.0 ;
11 : max-speed ( -- speed ) 30.0 ;
12
13 : <player> ( name sounds -- player )
14     [ F{ 0 0 5 } F{ 0 0 -1 } F{ 0 1 0 } F{ -1 0 0 } ] 2dip
15     f f f default-speed player boa ;
16
17 : turn-player ( player x-radians y-radians -- )
18     >r over r> left-pivot up-pivot ;
19
20 : roll-player ( player z-radians -- )
21     forward-pivot ;
22
23 : to-tunnel-start ( player -- )
24     [ tunnel>> first dup location>> ]
25     [ tuck (>>location) (>>nearest-segment) ] bi ;
26
27 : play-in-tunnel ( player segments -- )
28     >>tunnel to-tunnel-start ;
29
30 : update-nearest-segment ( player -- )
31     [ tunnel>> ] [ dup nearest-segment>> nearest-segment ]
32     [ (>>nearest-segment) ] tri ;
33
34 : update-time ( player -- seconds-passed )
35     millis swap [ last-move>> - 1000 / ] [ (>>last-move) ] 2bi ;
36
37 : moved ( player -- ) millis swap (>>last-move) ;
38
39 : speed-range ( -- range )
40     max-speed [0,b] ;
41
42 : change-player-speed ( inc player -- )
43     [ + speed-range clamp-to-range ] change-speed drop ;
44
45 : multiply-player-speed ( n player -- )
46     [ * speed-range clamp-to-range ] change-speed drop ; 
47
48 : distance-to-move ( seconds-passed player -- distance )
49     speed>> * ;
50
51 : bounce ( d-left player -- d-left' player )
52     {
53         [ dup nearest-segment>> bounce-off-wall ]
54         [ sounds>> bang ]
55         [ 3/4 swap multiply-player-speed ]
56         [ ]
57     } cleave ;
58
59 :: (distance) ( heading player -- current next location heading )
60     player nearest-segment>>
61     player [ tunnel>> ] [ nearest-segment>> ] bi heading heading-segment
62     player location>> heading ;
63
64 : distance-to-heading-segment ( heading player -- distance )
65     (distance) distance-to-next-segment ;
66
67 : distance-to-heading-segment-area ( heading player -- distance )
68     (distance) distance-to-next-segment-area ;
69
70 : distance-to-collision ( player -- distance )
71     dup nearest-segment>> (distance-to-collision) ;
72
73 : from ( player -- radius distance-from-centre )
74     [ nearest-segment>> dup radius>> swap ] [ location>> ] bi
75     distance-from-centre ;
76
77 : distance-from-wall ( player -- distance ) from - ;
78 : fraction-from-centre ( player -- fraction ) from swap / ;
79 : fraction-from-wall ( player -- fraction )
80     fraction-from-centre 1 swap - ;
81
82 : update-nearest-segment2 ( heading player -- )
83     2dup distance-to-heading-segment-area 0 <= [
84         [ tunnel>> ] [ nearest-segment>> rot heading-segment ]
85         [ (>>nearest-segment) ] tri
86     ] [
87         2drop
88     ] if ;
89
90 :: move-player-on-heading ( d-left player distance heading -- d-left' player )
91     [let* | d-to-move [ d-left distance min ]
92             move-v [ d-to-move heading n*v ] |
93         move-v player location+
94         heading player update-nearest-segment2
95         d-left d-to-move - player ] ;
96
97 : move-toward-wall ( d-left player d-to-wall -- d-left' player )
98     over [ forward>> ] keep distance-to-heading-segment-area min
99     over forward>> move-player-on-heading ;
100
101 : ?move-player-freely ( d-left player -- d-left' player )
102     over 0 > [
103         dup distance-to-collision dup 0.2 > [ ! bug! should be 0, not 0.2
104             move-toward-wall ?move-player-freely
105         ] [ drop ] if
106     ] when ;
107
108 : drag-heading ( player -- heading )
109     [ forward>> ] [ nearest-segment>> forward>> proj ] bi ;
110
111 : drag-player ( d-left player -- d-left' player )
112     dup [ [ drag-heading ] keep distance-to-heading-segment-area ]
113     [ drag-heading move-player-on-heading ] bi ;
114
115 : (move-player) ( d-left player -- d-left' player )
116     ?move-player-freely over 0 > [
117         ! bounce
118         drag-player
119         (move-player)
120     ] when ;
121
122 : move-player ( player -- )
123     [ update-time ] [ distance-to-move ] [ (move-player) 2drop ] tri ;
124
125 : update-player ( player -- )
126     [ move-player ] [ nearest-segment>> white swap (>>color) ] bi ;