ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/move.C
(Generate patch)

Comparing deliantra/server/server/move.C (file contents):
Revision 1.41 by root, Sun May 9 18:40:02 2010 UTC vs.
Revision 1.50 by root, Sat Nov 17 23:40:04 2018 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 5 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team 6 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen 7 * Copyright (©) 1992 Frank Tore Johansen
7 * 8 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 9 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the 10 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your 11 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version. 12 * option) any later version.
12 * 13 *
13 * This program is distributed in the hope that it will be useful, 14 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details. 17 * GNU General Public License for more details.
17 * 18 *
18 * You should have received a copy of the Affero GNU General Public License 19 * You should have received a copy of the Affero GNU General Public License
19 * and the GNU General Public License along with this program. If not, see 20 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>. 21 * <http://www.gnu.org/licenses/>.
21 * 22 *
22 * The authors can be reached via e-mail to <support@deliantra.net> 23 * The authors can be reached via e-mail to <support@deliantra.net>
23 */ 24 */
24 25
25#include <global.h> 26#include <global.h>
26#ifndef __CEXTRACT__ 27#ifndef __CEXTRACT__
28#endif 29#endif
29 30
30int 31int
31object::move (int dir, object *originator) 32object::move (int dir, object *originator)
32{ 33{
33 sint16 newx = x + freearr_x[dir]; 34 sint16 newx = x + DIRX (dir);
34 sint16 newy = y + freearr_y[dir]; 35 sint16 newy = y + DIRY (dir);
35 36
36 mapxy pos (this); 37 mapxy pos (this);
37 pos.move (dir); 38 pos.move (dir);
38 39
39 /* If the space the object is moving to is out of the map, 40 /* If the space the object is moving to is out of the map,
75 if (INVOKE_MAP (LEAVE, map, ARG_PLAYER (contr))) 76 if (INVOKE_MAP (LEAVE, map, ARG_PLAYER (contr)))
76 return 0; 77 return 0;
77 78
78 remove (); 79 remove ();
79 80
81 pos.m->activate ();
82
80 if (INVOKE_PLAYER (MAP_CHANGE, contr, ARG_MAP (pos.m), ARG_INT (pos.x), ARG_INT (pos.y))) 83 if (INVOKE_PLAYER (MAP_CHANGE, contr, ARG_MAP (pos.m), ARG_INT (pos.x), ARG_INT (pos.y)))
81 return 0; 84 return 0;
82 85
83 if (INVOKE_MAP (ENTER, pos.m, ARG_PLAYER (contr), ARG_INT (pos.x), ARG_INT (pos.y))) 86 if (INVOKE_MAP (ENTER, pos.m, ARG_PLAYER (contr), ARG_INT (pos.x), ARG_INT (pos.y)))
84 return 0; 87 return 0;
104 107
105int 108int
106transfer_ob (object *op, int x, int y, int randomly, object *originator) 109transfer_ob (object *op, int x, int y, int randomly, object *originator)
107{ 110{
108 int i; 111 int i;
109 object *tmp;
110 112
111 if (randomly) 113 if (randomly)
112 i = find_free_spot (op, op->map, x, y, 0, SIZEOFFREE); 114 i = find_free_spot (op, op->map, x, y, 0, SIZEOFFREE);
113 else 115 else
114 i = find_first_free_spot (op, op->map, x, y); 116 i = find_first_free_spot (op, op->map, x, y);
119 op = op->head_ (); 121 op = op->head_ ();
120 op->remove (); 122 op->remove ();
121 123
122 for (object *tmp = op; tmp; tmp = tmp->more) 124 for (object *tmp = op; tmp; tmp = tmp->more)
123 { 125 {
124 tmp->x = x + freearr_x[i] + tmp->arch->x; 126 tmp->x = x + DIRX (i) + tmp->arch->x;
125 tmp->y = y + freearr_y[i] + tmp->arch->y; 127 tmp->y = y + DIRY (i) + tmp->arch->y;
126 } 128 }
127 129
128 op = insert_ob_in_map (op, op->map, originator, 0); 130 op = insert_ob_in_map (op, op->map, originator, 0);
129 131
130 return !op; 132 return !op;
195 { 197 {
196 maptile *m; 198 maptile *m;
197 sint16 sx, sy; 199 sint16 sx, sy;
198 200
199 if (get_map_flags (other_teleporter->map, &m, 201 if (get_map_flags (other_teleporter->map, &m,
200 other_teleporter->x + freearr_x[k], other_teleporter->y + freearr_y[k], &sx, &sy) & P_OUT_OF_MAP) 202 other_teleporter->x + DIRX (k), other_teleporter->y + DIRY (k), &sx, &sy) & P_OUT_OF_MAP)
201 continue; 203 continue;
202 204
203 if (!OB_TYPE_MOVE_BLOCK (user, GET_MAP_MOVE_BLOCK (m, sx, sy))) 205 if (!OB_TYPE_MOVE_BLOCK (user, GET_MAP_MOVE_BLOCK (m, sx, sy)))
204 break; 206 break;
205 } 207 }
214 else 216 else
215 return 0; 217 return 0;
216 } 218 }
217 219
218 return !other_teleporter->map->insert ( 220 return !other_teleporter->map->insert (
219 user, other_teleporter->x + freearr_x[k], other_teleporter->y + freearr_y[k] 221 user, other_teleporter->x + DIRX (k), other_teleporter->y + DIRY (k)
220 ); 222 );
221} 223}
222 224
223/* 225/*
224 * This is a new version of blocked, this one handles objects 226 * This is a new version of blocked, this one handles objects
264 } 266 }
265 return 0; 267 return 0;
266} 268}
267 269
268/* 270/*
269 * this is not perfect yet. 271 * this is not perfect yet.
270 * it does not roll objects behind multipart objects properly. 272 * it does not roll objects behind multipart objects properly.
271 * Support for rolling multipart objects is questionable. 273 * Support for rolling multipart objects is questionable.
272 */ 274 */
273static int 275static int
274roll_ob (object *op, int dir, object *pusher) 276roll_ob (object *op, int dir, object *pusher)
279 MoveType move_block; 281 MoveType move_block;
280 282
281 if (op->head) 283 if (op->head)
282 op = op->head; 284 op = op->head;
283 285
284 x = op->x + freearr_x[dir]; 286 x = op->x + DIRX (dir);
285 y = op->y + freearr_y[dir]; 287 y = op->y + DIRY (dir);
286 288
287 if (!op->flag [FLAG_CAN_ROLL] 289 if (!op->flag [FLAG_CAN_ROLL]
288 || (op->weight && random_roll (0, op->weight / 50000 - 1, pusher, PREFER_LOW) 290 || (op->weight && random_roll (0, op->weight / 50000 - 1, pusher, PREFER_LOW)
289 > pusher->stats.Str)) 291 > pusher->stats.Str))
290 return 0; 292 return 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines