1 | /* |
1 | /* |
2 | * static char *rcsid_swamp_c = |
2 | * This file is part of Deliantra, the Roguelike Realtime MMORPG. |
3 | * "$Id: swamp.C,v 1.1 2006/08/13 17:16:05 elmex Exp $"; |
3 | * |
|
|
4 | * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
|
|
5 | * Copyright (©) 2005,2007 Mark Wedel & Crossfire Development Team |
|
|
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
|
|
7 | * |
|
|
8 | * 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 | * Free Software Foundation, either version 3 of the License, or (at your |
|
|
11 | * option) any later version. |
|
|
12 | * |
|
|
13 | * This program is distributed in the hope that it will be useful, |
|
|
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
16 | * GNU General Public License for more details. |
|
|
17 | * |
|
|
18 | * 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 | * <http://www.gnu.org/licenses/>. |
|
|
21 | * |
|
|
22 | * The authors can be reached via e-mail to <support@deliantra.net> |
4 | */ |
23 | */ |
5 | |
|
|
6 | /* |
|
|
7 | CrossFire, A Multiplayer game for X-windows |
|
|
8 | |
|
|
9 | Copyright (C) 2005 Mark Wedel & Crossfire Development Team |
|
|
10 | Copyright (C) 1992 Frank Tore Johansen |
|
|
11 | |
|
|
12 | This program is free software; you can redistribute it and/or modify |
|
|
13 | it under the terms of the GNU General Public License as published by |
|
|
14 | the Free Software Foundation; either version 2 of the License, or |
|
|
15 | (at your option) any later version. |
|
|
16 | |
|
|
17 | This program is distributed in the hope that it will be useful, |
|
|
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
20 | GNU General Public License for more details. |
|
|
21 | |
|
|
22 | You should have received a copy of the GNU General Public License |
|
|
23 | along with this program; if not, write to the Free Software |
|
|
24 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
|
25 | |
|
|
26 | The authors can be reached via e-mail at crossfire-devel@real-time.com |
|
|
27 | */ |
|
|
28 | |
24 | |
29 | #include <global.h> |
25 | #include <global.h> |
30 | #ifndef __CEXTRACT__ |
26 | #ifndef __CEXTRACT__ |
31 | #include <sproto.h> |
27 | # include <sproto.h> |
32 | #endif |
28 | #endif |
33 | |
29 | |
34 | /* Note this code is very specialized for swamps, in terms of the messages |
30 | /* Note this code is very specialized for swamps, in terms of the messages |
35 | * as well as handling of move types. |
31 | * as well as handling of move types. |
36 | */ |
32 | */ |
37 | |
33 | |
|
|
34 | void |
38 | void walk_on_deep_swamp (object *op, object *victim) |
35 | walk_on_deep_swamp (object *op, object *victim) |
39 | { |
36 | { |
40 | if (victim->type == PLAYER && victim->stats.hp >= 0 && !(victim->move_type & MOVE_FLYING)) { |
37 | if (victim->type == PLAYER && victim->stats.hp >= 0 && !(victim->move_type & MOVE_FLYING)) |
|
|
38 | { |
41 | new_draw_info_format(NDI_UNIQUE, 0, victim, "You are down to your knees in the %s.", op->name); |
39 | new_draw_info_format (NDI_UNIQUE, 0, victim, "You are down to your knees in the %s.", &op->name); |
42 | op->stats.food = 1; |
40 | op->stats.food = 1; |
43 | victim->speed_left -= op->move_slow_penalty; |
41 | victim->speed_left -= op->move_slow_penalty; |
44 | } |
42 | } |
45 | } |
43 | } |
46 | |
44 | |
|
|
45 | void |
47 | void move_deep_swamp (object *op) |
46 | move_deep_swamp (object *op) |
48 | { |
47 | { |
49 | object *above = op->above; |
48 | object *above = op->above; |
50 | object *nabove; |
49 | object *nabove; |
51 | |
50 | |
52 | while(above) { |
51 | while (above) |
|
|
52 | { |
53 | nabove = above->above; |
53 | nabove = above->above; |
54 | if (above->type == PLAYER && !(above->move_type & MOVE_FLYING) && above->stats.hp >= 0 && !QUERY_FLAG(above,FLAG_WIZ)) { |
54 | if (above->type == PLAYER && !(above->move_type & MOVE_FLYING) && above->stats.hp >= 0 && !QUERY_FLAG (above, FLAG_WIZ)) |
|
|
55 | { |
55 | if (op->stats.food < 1) { |
56 | if (op->stats.food < 1) |
|
|
57 | { |
56 | LOG (llevDebug, "move_deep_swamp(): player is here, but state is " |
58 | LOG (llevDebug, "move_deep_swamp(): player is here, but state is " "%d\n", op->stats.food); |
57 | "%d\n", op->stats.food); |
59 | op->stats.food = 1; |
58 | op->stats.food = 1; |
60 | } |
59 | } |
|
|
60 | |
61 | |
61 | switch(op->stats.food) { |
62 | switch (op->stats.food) |
62 | case 1: |
63 | { |
63 | if (rndm(0, 2) == 0) { |
64 | case 1: |
64 | new_draw_info_format(NDI_UNIQUE, 0,above, |
65 | if (rndm (0, 2) == 0) |
65 | "You are down to your waist in the wet %s.", op->name); |
66 | { |
66 | op->stats.food = 2; |
67 | new_draw_info_format (NDI_UNIQUE, 0, above, "You are down to your waist in the wet %s.", &op->name); |
|
|
68 | op->stats.food = 2; |
67 | above->speed_left -= op->move_slow_penalty; |
69 | above->speed_left -= op->move_slow_penalty; |
68 | } |
70 | } |
69 | break; |
71 | break; |
70 | |
72 | |
71 | case 2: |
73 | case 2: |
72 | if (rndm(0, 2) == 0) { |
74 | if (rndm (0, 2) == 0) |
73 | new_draw_info_format(NDI_UNIQUE | NDI_RED, 0,above, |
75 | { |
74 | "You are down to your NECK in the dangerous %s.", op->name); |
76 | new_draw_info_format (NDI_UNIQUE | NDI_RED, 0, above, "You are down to your NECK in the dangerous %s.", &op->name); |
75 | op->stats.food = 3; |
77 | op->stats.food = 3; |
76 | sprintf(above->contr->killer,"drowning in a %s", op->name); |
78 | above->contr->killer = op; |
77 | above->stats.hp--; |
79 | above->stats.hp--; |
78 | above->speed_left -= op->move_slow_penalty; |
80 | above->speed_left -= op->move_slow_penalty; |
79 | } |
81 | } |
80 | break; |
82 | break; |
81 | |
83 | |
82 | case 3: |
84 | case 3: |
83 | if (rndm(0, 4) == 0) { |
85 | if (rndm (0, 4) == 0) |
|
|
86 | { |
84 | object *woodsman = find_obj_by_type_subtype(above, SKILL, SK_WOODSMAN); |
87 | object *woodsman = find_obj_by_type_subtype (above, SKILL, SK_WOODSMAN); |
85 | |
88 | |
86 | /* player is ready to drown - only woodsman skill can save him */ |
89 | /* player is ready to drown - only woodsman skill can save him */ |
87 | if (!woodsman) { |
90 | if (!woodsman) |
88 | op->stats.food = 0; |
91 | { |
89 | new_draw_info_format(NDI_UNIQUE | NDI_ALL, 1, NULL, |
92 | op->stats.food = 0; |
90 | "%s disappeared into a %s.",above->name, op->name); |
93 | new_draw_info_format (NDI_UNIQUE | NDI_ALL, 1, NULL, "%s disappeared into a %s.", &above->name, &op->name); |
91 | sprintf(above->contr->killer,"drowning in a %s", op->name); |
94 | above->contr->killer = op; |
92 | |
95 | |
93 | above->stats.hp = -1; |
96 | above->stats.hp = -1; |
94 | kill_player(above); /* player dies in the swamp */ |
97 | kill_player (above); /* player dies in the swamp */ |
95 | } |
98 | } |
96 | else { |
99 | else |
97 | op->stats.food = 2; |
100 | { |
|
|
101 | op->stats.food = 2; |
98 | new_draw_info_format(NDI_UNIQUE, 0,above, |
102 | new_draw_info_format (NDI_UNIQUE, 0, above, |
99 | "You almost drowned in the %s! You survived due to your woodsman skill.", op->name); |
103 | "You almost drowned in the %s! You survived due to your woodsman skill.", &op->name); |
100 | } |
104 | } |
101 | } |
105 | } |
102 | break; |
106 | break; |
103 | } |
107 | } |
|
|
108 | } |
104 | } else if (!QUERY_FLAG(above, FLAG_ALIVE) && !(above->move_type & MOVE_FLYING) && |
109 | else if (!QUERY_FLAG (above, FLAG_ALIVE) && !(above->move_type & MOVE_FLYING) && |
105 | !(QUERY_FLAG(above,FLAG_IS_FLOOR)) && !(QUERY_FLAG(above,FLAG_OVERLAY_FLOOR)) && |
110 | !(QUERY_FLAG (above, FLAG_IS_FLOOR)) && !(QUERY_FLAG (above, FLAG_OVERLAY_FLOOR)) && !(QUERY_FLAG (above, FLAG_NO_PICK))) |
106 | !(QUERY_FLAG(above, FLAG_NO_PICK))) { |
111 | { |
107 | if (rndm(0, 2) == 0) decrease_ob(above); |
112 | if (rndm (0, 2) == 0) |
108 | } |
113 | above->decrease (); |
|
|
114 | } |
|
|
115 | |
109 | above = nabove; |
116 | above = nabove; |
110 | } |
117 | } |
111 | } |
118 | } |