… | |
… | |
52 | |
52 | |
53 | if (wall->flag [FLAG_IS_QUAD] && visible) |
53 | if (wall->flag [FLAG_IS_QUAD] && visible) |
54 | { |
54 | { |
55 | maptile *m = wall->map; |
55 | maptile *m = wall->map; |
56 | |
56 | |
57 | if (m->tile_path [TILE_UP]) |
57 | if (ob->map->tile_path [TILE_UP] && wall->map->tile_path [TILE_UP]) |
|
|
58 | { |
58 | if (maptile *up = m->tile_available (TILE_UP)) |
59 | maptile *wall_up = wall->map->tile_available (TILE_UP); |
|
|
60 | maptile *ob_up = ob ->map->tile_available (TILE_UP); |
|
|
61 | |
|
|
62 | if (wall_up && ob_up) |
59 | { |
63 | { |
60 | if (ob->blocked (up, ob->x, ob->y) || has_floor (up, ob->x, ob->y)) |
64 | if (ob->blocked (ob_up, ob->x, ob->y) || has_floor (ob_up, ob->x, ob->y)) |
61 | ob->failmsg (format ("Ouch, you hit your head while climbing the %s! H<Didn't you see the ceiling?>", query_name (wall))); |
65 | ob->failmsg (format ("Ouch, you hit your head while climbing the %s! H<Didn't you see the ceiling? :)>", query_name (wall))); |
62 | //TODO: reduce health |
66 | //TODO: reduce health |
63 | else if (ob->blocked (up, wall->x, wall->y)) |
67 | else if (ob->blocked (wall_up, wall->x, wall->y)) |
64 | ob->failmsg (format ("You try to climb up, but the %s is too high for you!", query_name (wall))); |
68 | ob->failmsg (format ("You try to climb up, but the %s is too high for you! H<No free space on top of this block.>", query_name (wall))); |
65 | //TODO: reduce health |
69 | //TODO: reduce health |
66 | else |
70 | else |
67 | { |
71 | { |
68 | ob->statusmsg (format ("You successfully climb up the %s.", query_name (wall))); |
72 | ob->statusmsg (format ("You successfully climb up the %s.", query_name (wall))); |
69 | // here we assume that ob is a player... |
73 | // here we assume that ob is a player... |
70 | ob->enter_map (up, wall->x, wall->y); |
74 | ob->enter_map (wall_up, wall->x, wall->y); |
71 | } |
75 | } |
72 | } |
76 | } |
73 | else |
77 | else |
74 | ob->failmsg (format ("You try to climb the %s, but you fall down! H<Try again.>", query_name (wall))); |
78 | ob->failmsg (format ("You try to climb the %s, but you fall down! H<Try again.>", query_name (wall))); |
|
|
79 | } |
75 | else |
80 | else |
76 | ob->failmsg (format ("You fail to climb up the %s! H<You cannot climb up here.>", query_name (wall))); |
81 | ob->failmsg (format ("You fail to climb up the %s! H<You cannot climb up here.>", query_name (wall))); |
77 | |
82 | |
78 | |
83 | |
79 | return; |
84 | return; |
… | |
… | |
90 | } |
95 | } |
91 | } |
96 | } |
92 | |
97 | |
93 | ///////////////////////////////////////////////////////////////////////////// |
98 | ///////////////////////////////////////////////////////////////////////////// |
94 | |
99 | |
|
|
100 | physics_queue::physics_queue () |
|
|
101 | { |
|
|
102 | i = 0; |
|
|
103 | } |
|
|
104 | |
|
|
105 | object * |
|
|
106 | physics_queue::pop () |
|
|
107 | { |
|
|
108 | if (expect_true (i < size ())) |
|
|
109 | return (*this)[i++]; |
|
|
110 | |
|
|
111 | i = 0; |
|
|
112 | clear (); |
|
|
113 | return 0; |
|
|
114 | } |
|
|
115 | |
|
|
116 | inline unsigned int |
|
|
117 | queue_of (tick_t tick) |
|
|
118 | { |
|
|
119 | return tick & (PHYSICS_QUEUES - 1); |
|
|
120 | } |
|
|
121 | |
|
|
122 | void update_physics (maptile *m, int x, int y) |
|
|
123 | { |
|
|
124 | } |
|
|
125 | |
|
|
126 | // handle physics updates |
|
|
127 | void move_physics (object *ob) |
|
|
128 | { |
|
|
129 | } |
|
|
130 | |
|
|
131 | int |
|
|
132 | maptile::run_physics (tick_t tick, int max_objects) |
|
|
133 | { |
|
|
134 | int orig_max_object = max_objects; |
|
|
135 | physics_queue &q = pq [queue_of (server_tick)]; |
|
|
136 | |
|
|
137 | while (object *ob = q.pop ()) |
|
|
138 | { |
|
|
139 | --max_objects; |
|
|
140 | |
|
|
141 | //printf ("handling ob %s\n", ob->debug_desc());//D |
|
|
142 | |
|
|
143 | if (max_objects <= 0) |
|
|
144 | break; |
|
|
145 | } |
|
|
146 | |
|
|
147 | return orig_max_object - max_objects; |
|
|
148 | } |
|
|
149 | |
|
|
150 | void |
|
|
151 | maptile::queue_physics (object *ob) |
|
|
152 | { |
|
|
153 | if (!ob->flag [FLAG_PHYSICS_QUEUE]) |
|
|
154 | pq [queue_of (server_tick)].push_back (ob); |
|
|
155 | } |
|
|
156 | |
95 | // this mapspace has changed - potentialyl activate dormant physics objects |
157 | // this mapspace has changed - potentialyl activate dormant physics objects |
96 | // in the vicinity |
158 | // in the vicinity |
97 | |
159 | void |
98 | void update_physics (maptile *m, int x, int y) |
160 | maptile::queue_physics_at (int x, int y) |
99 | { |
161 | { |
100 | } |
162 | } |
101 | |
163 | |
102 | // handle physics updates |
164 | void |
103 | void move_physics (object *ob) |
165 | maptile::post_load_physics () |
104 | { |
166 | { |
|
|
167 | for (mapspace *ms = spaces + size (); ms-- > spaces; ) |
|
|
168 | for (object *tmp = ms->bot; tmp; tmp = tmp->above) |
|
|
169 | if (tmp->type == PHYSICS) |
|
|
170 | queue_physics (tmp); |
105 | } |
171 | } |
106 | |
172 | |
107 | ///////////////////////////////////////////////////////////////////////////// |
173 | ///////////////////////////////////////////////////////////////////////////// |
108 | |
174 | |
109 | #define FANCY_GRAPHICS 0 |
175 | #define FANCY_GRAPHICS 0 |
… | |
… | |
165 | int h = 1000000; // height form heightmap |
231 | int h = 1000000; // height form heightmap |
166 | |
232 | |
167 | // the continent increases in height from 0 to ~700 levels in the absence of anything else |
233 | // the continent increases in height from 0 to ~700 levels in the absence of anything else |
168 | // thats about one step every 7 maps. |
234 | // thats about one step every 7 maps. |
169 | int base_height = blend (0, 300, xy_gradient, 0.2f, 0.9f); |
235 | int base_height = blend (0, 300, xy_gradient, 0.2f, 0.9f); |
170 | int river_height = base_height * 9 / 10; |
236 | int river_height = base_height; // * 9 / 10; |
171 | |
237 | |
172 | // add this to rivers to "dry them out" |
238 | // add this to rivers to "dry them out" |
173 | float dry_out = max (0.f, lerp (xy_gradient, 0.7f, 1.f, 0.f, 0.3f)); |
239 | float dry_out = max (0.f, lerp (xy_gradient, 0.7f, 1.f, 0.f, 0.3f)); |
174 | |
240 | |
175 | static frac2d river_gen (2); |
241 | static frac2d river_gen (2); |
176 | float river1 = abs (river_gen.fBm (P * 0.001 + perturb * 4)) + dry_out; |
242 | float river1 = abs (river_gen.fBm (P * 0.001 + perturb * 4)) + dry_out; |
177 | float river2 = river_gen.ridgedmultifractal (P * 0.04, 0.8, 10) - y_gradient * 0.2 - 0.16 - dry_out; |
243 | float river2 = river_gen.ridgedmultifractal (P * 0.04, 0.8, 10) - y_gradient * 0.2 - 0.16 - dry_out; |
178 | |
244 | |
179 | float valley = river1 - 0.2f; |
245 | float valley = river1 - 0.2f; |
180 | |
246 | |
181 | static frac2d mountain_gen (8, 2.14, 0.5); |
247 | static frac2d mountain_gen (6, 2.14, 0.5); |
182 | float mountain = mountain_gen.ridgedmultifractal (P * 0.004); |
248 | float mountain = mountain_gen.ridgedmultifractal (P * 0.004); |
183 | |
249 | |
184 | //TODO: mountains should not lower the height, should they? |
250 | //TODO: mountains should not lower the height, should they? |
185 | t = valley < 0 ? T_VALLEY : T_MOUNTAIN; |
251 | t = valley < 0 ? T_VALLEY : T_MOUNTAIN; |
186 | c = blend0 (vec3d (0, 0.8, 0), vec3d (0.8, 0, 0), valley, 0.1f); |
252 | c = blend0 (vec3d (0, 0.8, 0), vec3d (0.8, 0, 0), valley, 0.1f); |
187 | h = blend0 (base_height + continent * 300, base_height + mountain * xy_gradient * 400, valley, 0.1f); |
253 | h = blend0 (base_height + continent * 3, base_height + mountain * xy_gradient * 100, valley, 0.1f); |
188 | |
254 | |
189 | if (river1 < 0.01f) |
255 | if (river1 < 0.01f) |
190 | { |
256 | { |
191 | // main rivers - they cut deeply into the mountains (base_height * 0.9f) |
257 | // main rivers - they cut deeply into the mountains (base_height * 0.9f) |
192 | t = T_RIVER; |
258 | t = T_RIVER; |
193 | c = vec3d (0.2, 0.2, 1); |
259 | c = vec3d (0.2, 0.2, 1); |
194 | h0 = river_height; |
260 | h0 = river_height; |
195 | min_it (h, river_height + lerp<float> (river1, 0.f, 0.01f, -20, -1)); |
261 | min_it (h, river_height + lerp<float> (river1, 0.f, 0.01f, -10, -1)); |
196 | } |
262 | } |
197 | |
263 | |
198 | if (river2 > 0) |
264 | if (river2 > 0) |
199 | { |
265 | { |
200 | t = T_RIVER; |
266 | t = T_RIVER; |
201 | c = vec3d (0.2, 0.2, 1); |
267 | c = vec3d (0.2, 0.2, 1); |
202 | h0 = river_height; |
268 | h0 = river_height; |
203 | min_it (h, river_height + lerp<float> (river1, 0.f, 0.01f, -5, -1)); |
269 | min_it (h, river_height + max (-5, lerp<float> (river2, 0.01f, 0, -4, -1))); |
204 | } |
270 | } |
205 | |
271 | |
206 | if (continent < 0) |
272 | if (continent < 0) |
207 | { |
273 | { |
208 | t = T_OCEAN; |
274 | t = T_OCEAN; |
|
|
275 | h0 = 0; |
209 | min_it (h, min (continent * 200, -1)); |
276 | min_it (h, min (continent * 200, -1)); |
210 | c = vec3d (0, 0, 1); |
277 | c = vec3d (0, 0, 1); |
211 | } |
278 | } |
212 | |
279 | |
213 | // now we have the base height, and base terrain |
280 | // now we have the base height, and base terrain |
… | |
… | |
232 | { |
299 | { |
233 | t = T_ACQUIFER; |
300 | t = T_ACQUIFER; |
234 | c = vec3d (1,1,1); |
301 | c = vec3d (1,1,1); |
235 | } |
302 | } |
236 | } |
303 | } |
|
|
304 | |
|
|
305 | //printf ("+%d+%d %d z %d h %d,%d\n", mx, my, t, z, h,h0);//D |
237 | |
306 | |
238 | // TODO: caves |
307 | // TODO: caves |
239 | // TODO: chees areas |
308 | // TODO: chees areas |
240 | // TODO: minerals |
309 | // TODO: minerals |
241 | // TODO: monsters |
310 | // TODO: monsters |
… | |
… | |
281 | |
350 | |
282 | case T_UNDERGROUND: |
351 | case T_UNDERGROUND: |
283 | // todo, use a fractal |
352 | // todo, use a fractal |
284 | if (z < h - 10) |
353 | if (z < h - 10) |
285 | { |
354 | { |
286 | arch_floor = shstr ("quad_dirt_floor"); |
355 | arch_floor = shstr ("quad_stone_floor"); |
287 | arch_wall = shstr ("quad_dirt_wall"); |
356 | arch_wall = shstr ("quad_stone_wall"); |
288 | } |
357 | } |
289 | else |
358 | else |
290 | { |
359 | { |
291 | arch_floor = shstr ("quad_stone_floor"); |
360 | arch_floor = shstr ("quad_dirt_floor"); |
292 | arch_wall = shstr ("quad_stone_wall"); |
361 | arch_wall = shstr ("quad_dirt_wall"); |
293 | } |
362 | } |
294 | break; |
363 | break; |
295 | |
364 | |
296 | case T_ACQUIFER: |
365 | case T_ACQUIFER: |
297 | arch_wall = shstr ("quad_water_wall"); |
366 | arch_wall = shstr ("quad_water_wall"); |
… | |
… | |
412 | } |
481 | } |
413 | #endif |
482 | #endif |
414 | |
483 | |
415 | exit (0); |
484 | exit (0); |
416 | } |
485 | } |
|
|
486 | |