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 (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
4 | * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
5 | * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team |
5 | * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
6 | * Copyright (©) 1992,2007 Frank Tore Johansen |
7 | * |
7 | * |
8 | * Deliantra is free software: you can redistribute it and/or modify it under |
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 |
9 | * the terms of the Affero GNU General Public License as published by the |
… | |
… | |
84 | break; |
84 | break; |
85 | |
85 | |
86 | case SIGN: |
86 | case SIGN: |
87 | if (!tmp->stats.food || tmp->last_eat < tmp->stats.food) |
87 | if (!tmp->stats.food || tmp->last_eat < tmp->stats.food) |
88 | { |
88 | { |
89 | tmp->play_sound (tmp->sound ? tmp->sound : sound_find ("trigger_sign")); |
89 | tmp->play_sound (tmp->sound ? tmp->sound : sound_find ("msg_voice")); |
|
|
90 | |
|
|
91 | if (originator && originator->contr) |
|
|
92 | originator->contr->infobox (MSG_CHANNEL ("examine"), format ("T<%s>\n\n%s", &tmp->name, &tmp->msg)); |
|
|
93 | |
90 | new_info_map (NDI_UNIQUE | NDI_NAVY, tmp->map, tmp->msg); |
94 | new_info_map_except (NDI_UNIQUE | NDI_NAVY, tmp->map, originator, tmp->msg); |
|
|
95 | |
91 | if (tmp->stats.food) |
96 | if (tmp->stats.food) |
92 | tmp->last_eat++; |
97 | tmp->last_eat++; |
93 | } |
98 | } |
94 | break; |
99 | break; |
95 | |
100 | |
… | |
… | |
271 | } |
276 | } |
272 | } |
277 | } |
273 | |
278 | |
274 | any_down = any_down || tmp->value; |
279 | any_down = any_down || tmp->value; |
275 | } |
280 | } |
|
|
281 | else if (tmp->type == T_MATCH) |
|
|
282 | { |
|
|
283 | tmp->value = 0; |
|
|
284 | |
|
|
285 | for (object *ab = tmp->above; ab; ab = ab->above) |
|
|
286 | { |
|
|
287 | object *head = ab->head_ (); |
|
|
288 | |
|
|
289 | /* Same note regarding move_type for buttons above apply here. */ |
|
|
290 | if (((ab->move_type & tmp->move_on) || ab->move_type == 0)) |
|
|
291 | if (match (tmp->slaying, head, tmp, originator)) |
|
|
292 | { |
|
|
293 | tmp->value = 1; |
|
|
294 | break; |
|
|
295 | } |
|
|
296 | } |
|
|
297 | |
|
|
298 | any_down = any_down || tmp->value; |
|
|
299 | } |
276 | } |
300 | } |
277 | |
301 | |
278 | if (any_down) /* If any other buttons were down, force this to remain down */ |
302 | if (any_down) /* If any other buttons were down, force this to remain down */ |
279 | op->value = 1; |
303 | op->value = 1; |
280 | |
304 | |
… | |
… | |
400 | new_info_map (NDI_BLACK, altar->map, altar->msg); |
424 | new_info_map (NDI_BLACK, altar->map, altar->msg); |
401 | |
425 | |
402 | return 1; |
426 | return 1; |
403 | } |
427 | } |
404 | |
428 | |
405 | void |
429 | static void |
406 | trigger_move (object *op, int state, object *originator) /* 1 down and 0 up */ |
430 | trigger_move (object *op, int state, object *originator) /* 1 down and 0 up */ |
407 | { |
431 | { |
408 | op->stats.wc = state; |
432 | op->stats.wc = state; |
409 | |
433 | |
410 | if (state) |
434 | if (state) |
… | |
… | |
436 | int |
460 | int |
437 | check_trigger (object *op, object *cause, object *originator) |
461 | check_trigger (object *op, object *cause, object *originator) |
438 | { |
462 | { |
439 | object *tmp; |
463 | object *tmp; |
440 | int push = 0, tot = 0; |
464 | int push = 0, tot = 0; |
441 | int in_movement = op->stats.wc || op->speed; |
465 | int in_movement = op->stats.wc || op->has_active_speed (); |
442 | |
466 | |
443 | switch (op->type) |
467 | switch (op->type) |
444 | { |
468 | { |
445 | case TRIGGER_BUTTON: |
469 | case TRIGGER_BUTTON: |
446 | if (op->weight > 0) |
470 | if (op->weight > 0) |