--- deliantra/server/common/button.C 2006/12/26 08:54:58 1.20 +++ deliantra/server/common/button.C 2007/01/15 21:06:18 1.27 @@ -1,25 +1,26 @@ /* - CrossFire, A Multiplayer game for X-windows - - Copyright (C) 2002 Mark Wedel & Crossfire Development Team - Copyright (C) 1992 Frank Tore Johansen - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - The authors can be reached via e-mail at -*/ + * CrossFire, A Multiplayer game for X-windows + * + * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team + * Copyright (C) 2002 Mark Wedel & Crossfire Development Team + * Copyright (C) 1992 Frank Tore Johansen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * The authors can be reached via e-mail at + */ #include #include @@ -275,38 +276,9 @@ } } -/* - * Updates every button on the map (by calling update_button() for them). - */ - -void -update_buttons (maptile *m) -{ - objectlink *ol; - oblinkpt *obp; - - for (obp = m->buttons; obp; obp = obp->next) - for (ol = obp->link; ol; ol = ol->next) - { - if (!ol->ob) - { - LOG (llevError, "Internal error in update_button (%s (%dx%d), connected %ld).\n", - ol->ob ? (const char *) ol->ob->name : "null", ol->ob ? ol->ob->x : -1, ol->ob ? ol->ob->y : -1, obp->value); - continue; - } - - if (ol->ob->type == BUTTON || ol->ob->type == PEDESTAL) - { - update_button (ol->ob); - break; - } - } -} - void use_trigger (object *op) { - /* Toggle value */ op->value = !op->value; push_button (op); @@ -316,7 +288,6 @@ * Note: animate_object should be used instead of this, * but it can't handle animations in the 8 directions */ - void animate_turning (object *op) /* only one part objects */ { @@ -799,7 +770,6 @@ SET_FLAG (tmp, FLAG_MONSTER); tmp->stats.exp = 0; - SET_FLAG (tmp, FLAG_FRIENDLY); add_friendly_object (tmp); tmp->attack_movement = PETMOVE; @@ -860,27 +830,40 @@ * away, and then leaves the inventory checker. That would've caused an always-enabled * state in the inventory checker. This won't happen anymore now. * + * Wed Jan 10 11:34:26 CET 2007 elmex: fixed this function, we now check + * whether op is on this mapspace or not, because the value (1|0) depends + * on this information. also make sure to only push_button if op has + * a matching item (because when we do a push_button with value=0 timed gates + * will still open)! (i hope i got the semantics right this time) + * */ void check_inv (object *op, object *trig) { trig->value = 0; // deactivate if none of the following conditions apply - if (object *pl = trig->ms ().player ()) - { - object *match = check_inv_recursive (pl, trig); + object *pl = trig->ms ().player (); + object *match = check_inv_recursive (op, trig); - if (match && trig->last_sp) // match == having - { - if (trig->last_heal) - decrease_ob (match); + // elmex: a note about (pl == op): + // if pl == 0 then the player has left this space + // if pl != 0 then a player is on this mapspace, but then + // we still have to check whether it's the player that triggered + // this inv-checker, because if not, then the op left this inv-checker + // and we have to set the value to 0 - trig->value = 1; - } - else if (!match && !trig->last_sp) // match == not having - trig->value = 1; - } + if (match && trig->last_sp) // match == having + { + if (trig->last_heal) + decrease_ob (match); - push_button (trig); + trig->value = (pl == op ? 1 : 0); // 1 if matching player entered, and 0 if he left + push_button (trig); + } + else if (!match && !trig->last_sp) // match == not having + { + trig->value = (pl == op ? 1 : 0); // 1 if matching player entered, and 0 if he left + push_button (trig); + } }