]> gitweb.factorcode.org Git - factor.git/blob - extra/sokoban/layout/layout.factor
7a5517d1e973413bf60793e7db23541eeeff8f8c
[factor.git] / extra / sokoban / layout / layout.factor
1 ! Copyright (C) 2006, 2007, 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel arrays namespaces sequences math math.order
4 math.vectors colors random ;
5 IN: sokoban.layout
6
7 TUPLE: layout states color ;
8
9 C: <layout> layout
10
11 SYMBOL: component
12
13 {
14   [ ! walls on each level
15     {
16       {
17                         { 2 0 } { 3 0 } { 4 0 } { 5 0 } { 6 0 }
18         { 0 1 } { 1 1 } { 2 1 }                         { 6 1 }
19         { 0 2 }                                         { 6 2 }
20         { 0 3 } { 1 3 } { 2 3 }                         { 6 3 }
21         { 0 4 }         { 2 4 } { 3 4 }                 { 6 4 }
22         { 0 5 }         { 2 5 }                         { 6 5 } { 7 5 }
23         { 0 6 }                                                 { 7 6 }
24         { 0 7 }                                                 { 7 7 }
25         { 0 8 } { 1 8 } { 2 8 } { 3 8 } { 4 8 } { 5 8 } { 6 8 } { 7 8 }
26       }
27       { ! new level (access it by rotating the level piece)
28                                         { 4 0 } { 5 0 } { 6 0 } { 7 0 } { 8 0 }
29                                         { 4 1 }                         { 8 1 }
30                                         { 4 2 }                         { 8 2 }
31                         { 2 3 } { 3 3 } { 4 3 }                         { 8 3 } { 9 3 } { 10 3 }
32                         { 2 4 }                                                         { 10 4 }
33         { 0 5 } { 1 5 } { 2 5 }         { 4 5 }         { 6 5 } { 7 5 } { 8 5 }         { 10 5 }                                              { 16 5 } { 17 5 } { 18 5 } { 19 5 } { 20 5 } { 21 5 }
34         { 0 6 }                         { 4 6 }         { 6 6 } { 7 6 } { 8 6 }         { 10 6 } { 11 6 } { 12 6 } { 13 6 } { 14 6 } { 15 6 } { 16 6 }                                     { 21 6 }
35         { 0 7 }                                                                                                                                                                            { 21 7 }
36         { 0 8 } { 1 8 } { 2 8 } { 3 8 } { 4 8 }         { 6 8 } { 7 8 } { 8 8 }         { 10 8 }          { 12 8 } { 13 8 } { 14 8 } { 15 8 } { 16 8 }                                     { 21 8 }
37                                         { 4 9 }                                         { 10 9 } { 11 9 } { 12 9 }                            { 16 9 } { 17 9 } { 18 9 } { 19 9 } { 20 9 } { 21 9 }
38                                         { 4 10 } { 5 10 } { 6 10 } { 7 10 } { 8 10 } { 9 10 } { 10 10 } 
39
40       }
41     } COLOR: gray
42   ]
43   [ ! player position on each level
44     {
45       {
46         { 2 2 }
47       }
48       {
49         { 11 8 }
50       }
51     } COLOR: green
52   ]
53   [
54     {
55       {
56         { 1 2 } { 5 3 } { 1 4 } { 4 5 } { 3 6 } { 6 6 } { 4 7 } 
57       }
58       {
59         { 19 6 } { 20 6 }
60         { 19 7 } { 20 7 }
61         { 19 8 } { 20 8 }
62       }
63     } COLOR: pink
64   ]
65 } [ first2 <layout> ] map component set-global
66
67 SYMBOL: boxes
68 {
69   { ! first box on each level
70     {
71       { ! level 0
72         { 3 2 }
73       }
74
75       { ! level 1
76         { 5 2 }
77       }
78     } COLOR: orange
79   }
80
81   { ! second box on each level
82     {
83       { ! level 0
84         { 4 3 }
85       }
86
87       { ! level 1
88         { 7 3 }
89       }
90     } COLOR: orange
91   }
92
93   { ! third box on each level
94     {
95       { ! level 0
96         { 4 4 }
97       }
98       { ! level 1
99         { 5 4 }
100       }
101     } COLOR: orange
102   }
103
104   { ! fourth box on each level
105     {
106       { ! level 0
107         { 4 6 }
108       }
109       { ! level 1
110         { 8 4 }
111       }
112     } COLOR: orange
113   }
114
115   { ! fifth box on each level
116     {
117       { ! level 0
118         { 3 6 }
119       }
120       { ! level 1
121         { 5 7 }
122       }
123     } COLOR: orange
124   }
125
126   { ! sixth box on each level
127     {
128       { ! level 0
129         { 5 6 }
130       }
131       { ! level 1
132         { 2 7 }
133       }
134     } COLOR: orange
135   }
136
137     { ! seventh box on each level
138     {
139       { ! level 0
140         { 1 6 }
141       }
142     } COLOR: orange
143   }
144
145   ! etc
146 } [ first2 <layout> ] map boxes set-global
147
148
149 SYMBOL: num-boxes
150 {
151   ! number of boxes -1 of each level
152   6
153   5
154 } num-boxes set-global
155
156 : get-board ( -- layout )
157     component get first ;
158
159 : get-player ( -- layout )
160     component get second ;
161
162 : get-box ( n -- layout )
163     boxes get nth ;
164     ! TODO add an n argument and get (n + 1)th
165
166 : get-goal ( -- layout )
167     component get third ;
168
169 : get-num-boxes ( n -- m )
170     ! outputs how many boxes are on each level, allows for different numbers of boxes per level
171     num-boxes get nth ;