--- deliantra/server/common/button.C 2007/01/15 21:06:18 1.27 +++ deliantra/server/common/button.C 2007/01/29 15:36:25 1.28 @@ -707,19 +707,24 @@ void do_mood_floor (object *op, object *source) { - object *tmp; - object *tmp2; - if (!source) source = op; - for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp; tmp = tmp->above) + mapspace &ms = op->ms (); + + if (!(ms.flags () & P_IS_ALIVE)) + return; + + object *tmp; + + for (tmp = ms.top; tmp; tmp = tmp->below) if (QUERY_FLAG (tmp, FLAG_MONSTER)) break; /* doesn't effect players, and if there is a player on this space, won't also * be a monster here. */ + //TODO: have players really FLAG_MONSTER? kept it for safety if (!tmp || tmp->type == PLAYER) return; @@ -728,10 +733,11 @@ case 0: /* furious--make all monsters mad */ if (QUERY_FLAG (tmp, FLAG_UNAGGRESSIVE)) CLEAR_FLAG (tmp, FLAG_UNAGGRESSIVE); + if (QUERY_FLAG (tmp, FLAG_FRIENDLY)) { - CLEAR_FLAG (tmp, FLAG_FRIENDLY); remove_friendly_object (tmp); + tmp->attack_movement = 0; /* lots of checks here, but want to make sure we don't * dereference a null value @@ -742,37 +748,44 @@ tmp->owner = 0; } break; + case 1: /* angry -- get neutral monsters mad */ if (QUERY_FLAG (tmp, FLAG_UNAGGRESSIVE) && !QUERY_FLAG (tmp, FLAG_FRIENDLY)) CLEAR_FLAG (tmp, FLAG_UNAGGRESSIVE); break; + case 2: /* calm -- pacify unfriendly monsters */ - if (!QUERY_FLAG (tmp, FLAG_UNAGGRESSIVE)) - SET_FLAG (tmp, FLAG_UNAGGRESSIVE); + SET_FLAG (tmp, FLAG_UNAGGRESSIVE); break; + case 3: /* make all monsters fall asleep */ - if (!QUERY_FLAG (tmp, FLAG_SLEEP)) - SET_FLAG (tmp, FLAG_SLEEP); + SET_FLAG (tmp, FLAG_SLEEP); break; + case 4: /* charm all monsters */ if (op == source) break; /* only if 'connected' */ - for (tmp2 = GET_MAP_OB (source->map, source->x, source->y); /* finding an owner */ - tmp2->type != PLAYER; tmp2 = tmp2->above) - if (tmp2->above == NULL) - break; + if (object *pl = source->ms ().player ()) + { + tmp->set_owner (pl); + SET_FLAG (tmp, FLAG_MONSTER); - if (tmp2->type != PLAYER) - break; + tmp->stats.exp = 0; - tmp->set_owner (tmp2); - SET_FLAG (tmp, FLAG_MONSTER); + add_friendly_object (tmp); + tmp->attack_movement = PETMOVE; + } + break; - tmp->stats.exp = 0; + case 6: + if (!QUERY_FLAG (tmp, FLAG_FRIENDLY)) + break; - add_friendly_object (tmp); - tmp->attack_movement = PETMOVE; + // FALL THROUGH + case 5: + get_archetype ("burnout")->insert_at (tmp, source); + tmp->destroy (); break; default: