1 | /********************************************************************** <BR>
|
---|
2 | This file is part of Crack dot Com's free source code release of
|
---|
3 | Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
|
---|
4 | information about compiling & licensing issues visit this URL</a>
|
---|
5 | <PRE> If that doesn't help, contact Jonathan Clark at
|
---|
6 | golgotha_source@usa.net (Subject should have "GOLG" in it)
|
---|
7 | ***********************************************************************/
|
---|
8 |
|
---|
9 | #include "solvemap_breadth.hh"
|
---|
10 | #include "path_api.hh"
|
---|
11 | #include "memory/malloc.hh"
|
---|
12 | #include "error/error.hh"
|
---|
13 |
|
---|
14 | void g1_breadth_first_map_solver_class::set_block_map(g1_block_map_class *_block)
|
---|
15 | //{{{
|
---|
16 | {
|
---|
17 | block = _block;
|
---|
18 | if (!solve_map || block->width()!=wx || block->height()!=wy)
|
---|
19 | {
|
---|
20 | if (solve_map)
|
---|
21 | i4_free(solve_map);
|
---|
22 | wx = block->width();
|
---|
23 | wy = block->height();
|
---|
24 | solve_map = (w8*)i4_malloc(wx*wy,"solve_map");
|
---|
25 | }
|
---|
26 | }
|
---|
27 | //}}}
|
---|
28 |
|
---|
29 | g1_breadth_first_map_solver_class::~g1_breadth_first_map_solver_class()
|
---|
30 | //{{{
|
---|
31 | {
|
---|
32 | if (solve_map)
|
---|
33 | i4_free(solve_map);
|
---|
34 | }
|
---|
35 | //}}}
|
---|
36 |
|
---|
37 | i4_bool g1_breadth_first_map_solver_class::add_cell(w32 x,w32 y,w8 d, w32 length)
|
---|
38 | //{{{
|
---|
39 | {
|
---|
40 | if (d>0 &&
|
---|
41 | (x<0 || x>=wx || y<0 || y>=wy || is_visited(x,y) || block->is_blocked(x,y,d)))
|
---|
42 | return i4_F;
|
---|
43 |
|
---|
44 | set_solve_dir(x,y,d);
|
---|
45 | visit(x,y);
|
---|
46 |
|
---|
47 | cnx[head] = x;
|
---|
48 | cny[head] = y;
|
---|
49 | cnl[head] = length;
|
---|
50 | if (++head>=queue_length) head=0;
|
---|
51 |
|
---|
52 | if (head==tail)
|
---|
53 | i4_warning("queue overrun.");
|
---|
54 |
|
---|
55 | return i4_T;
|
---|
56 | }
|
---|
57 | //}}}
|
---|
58 |
|
---|
59 | i4_bool g1_breadth_first_map_solver_class::get_next_cell(w32 &x,w32 &y, w32 &length)
|
---|
60 | //{{{
|
---|
61 | {
|
---|
62 | if (tail==head)
|
---|
63 | return i4_F;
|
---|
64 |
|
---|
65 | x = cnx[tail];
|
---|
66 | y = cny[tail];
|
---|
67 | length = cnl[tail];
|
---|
68 | if (++tail>=queue_length) tail=0;
|
---|
69 |
|
---|
70 | return i4_T;
|
---|
71 | }
|
---|
72 | //}}}
|
---|
73 |
|
---|
74 | i4_bool g1_breadth_first_map_solver_class::path_solve(w32 startx, w32 starty,
|
---|
75 | w32 destx, w32 desty,
|
---|
76 | w8 sizex, w8 sizey, w8 grade,
|
---|
77 | i4_float *point, w16 &points)
|
---|
78 | //{{{
|
---|
79 | {
|
---|
80 | w32 x,y,l;
|
---|
81 |
|
---|
82 | clear_queue();
|
---|
83 | clear_solve();
|
---|
84 |
|
---|
85 | add_cell(startx,
|
---|
86 | starty,
|
---|
87 | 0,0);
|
---|
88 |
|
---|
89 | int found=0;
|
---|
90 |
|
---|
91 | while (get_next_cell(x,y,l) && (x!=destx || y!=desty))
|
---|
92 | {
|
---|
93 | add_cell(x,y-1,G1_NORTH,l+1);
|
---|
94 | add_cell(x,y+1,G1_SOUTH,l+1);
|
---|
95 | add_cell(x+1,y,G1_WEST,l+1);
|
---|
96 | add_cell(x-1,y,G1_EAST,l+1);
|
---|
97 | }
|
---|
98 |
|
---|
99 | x = destx;
|
---|
100 | y = desty;
|
---|
101 |
|
---|
102 | w32 last_dir=0;
|
---|
103 | points = 0;
|
---|
104 | if (solve_dir(x,y)==0)
|
---|
105 | return i4_F;
|
---|
106 | while (x!=startx || y!=starty)
|
---|
107 | {
|
---|
108 | ok(x,y);
|
---|
109 | if (solve_dir(x,y)!=last_dir)
|
---|
110 | {
|
---|
111 | last_dir = solve_dir(x,y);
|
---|
112 | point[points*2]= i4_float(x)+0.5;
|
---|
113 | point[points*2+1]= i4_float(y)+0.5;
|
---|
114 | points++;
|
---|
115 | }
|
---|
116 | switch (solve_dir(x,y))
|
---|
117 | {
|
---|
118 | case G1_NORTH: y++; break;
|
---|
119 | case G1_SOUTH: y--; break;
|
---|
120 | case G1_WEST: x--; break;
|
---|
121 | case G1_EAST: x++; break;
|
---|
122 | default:
|
---|
123 | I4_ASSERT(0,"busted path solving!\n");
|
---|
124 | break;
|
---|
125 | }
|
---|
126 | }
|
---|
127 | ok(x,y);
|
---|
128 | point[points*2]= i4_float(x)+0.5;
|
---|
129 | point[points*2+1]=i4_float(y)+0.5;
|
---|
130 | points++;
|
---|
131 |
|
---|
132 | return i4_T;
|
---|
133 | }
|
---|
134 | //}}}
|
---|
135 |
|
---|
136 | //{{{ Emacs Locals
|
---|
137 | // Local Variables:
|
---|
138 | // folded-file: t
|
---|
139 | // End:
|
---|
140 | //}}}
|
---|