--- deliantra/server/common/anim.C 2007/06/04 13:03:59 1.26 +++ deliantra/server/common/anim.C 2016/11/16 23:41:59 1.42 @@ -1,25 +1,25 @@ /* - * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. - * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team - * Copyright (©) 2002-2003,2007 Mark Wedel & Crossfire Development Team - * Copyright (©) 1992,2007 Frank Tore Johansen - * - * Crossfire TRT 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 Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * The authors can be reached via e-mail to + * This file is part of Deliantra, the Roguelike Realtime MMORPG. + * + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2002-2003 Mark Wedel & Crossfire Development Team + * Copyright (©) 1992 Frank Tore Johansen + * + * Deliantra is free software: you can redistribute it and/or modify it under + * the terms of the Affero GNU General Public License as published by the + * Free Software Foundation, either version 3 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 Affero GNU General Public License + * and the GNU General Public License along with this program. If not, see + * . + * + * The authors can be reached via e-mail to */ /* This file contains animation related code. */ @@ -27,13 +27,13 @@ #include #include -animhash_t animhash; +static animhash_t animhash; std::vector animations; void animation::resize (int new_size) { - sfree (faces, num_animations); + sfree (faces, num_animations); num_animations = new_size; faces = salloc (num_animations); } @@ -58,6 +58,9 @@ return anim; } +/* Tries to find the animation id that matches name. Returns an integer match + * 0 if no match found (animation 0 is initialised as the 'bug' face + */ animation & animation::find (const char *name) { @@ -69,22 +72,12 @@ } void -init_anim (void) +init_anim () { animation &anim0 = animation::create ("none", 1, 0); anim0.faces [0] = 0; } -/* Tries to find the animation id that matches name. Returns an integer match - * 0 if no match found (animation 0 is initialised as the 'bug' face - */ -//TODO: nuke this function and replace all occurences by animations::find -int -find_animation (const char *name) -{ - return animation::find (name).number; -} - /* * animate_object(object) updates the face-variable of an object. * If the object is the head of a multi-object, all objects are animated. @@ -103,7 +96,7 @@ if (!op->animation_id || !NUM_ANIMATIONS (op)) { LOG (llevError, "Object %s lacks animation.\n", op->debug_desc ()); - CLEAR_FLAG (op, FLAG_ANIMATE); + op->clr_flag (FLAG_ANIMATE); return; } @@ -131,27 +124,15 @@ * is facing. */ - if (NUM_FACINGS (op) == 2) - { - if (dir < 5) - base_state = 0; - else - base_state = NUM_ANIMATIONS (op) / 2; - } - else if (NUM_FACINGS (op) == 4) - { - if (dir == 0) - base_state = 0; - else - base_state = ((dir - 1) / 2) * (NUM_ANIMATIONS (op) / 4); - } - else if (NUM_FACINGS (op) == 8) - { - if (dir == 0) - base_state = 0; - else - base_state = (dir - 1) * (NUM_ANIMATIONS (op) / 8); - } + if (dir > 0) + switch (NUM_FACINGS (op)) + { + case 2: base_state = ((dir - 1) / (8 / 2)) * (NUM_ANIMATIONS (op) / 2); break; + case 4: base_state = ((dir - 1) / (8 / 4)) * (NUM_ANIMATIONS (op) / 4); break; + case 8: base_state = ((dir - 1) / (8 / 8)) * (NUM_ANIMATIONS (op) / 8); break; + } + else + base_state = 0; /* If beyond drawable states, reset */ if (op->state >= max_state) @@ -172,12 +153,12 @@ if (op->face == 0) { op->invisible = 1; - CLEAR_FLAG (op, FLAG_ALIVE); + op->clr_flag (FLAG_ALIVE); } else { op->invisible = 0; - SET_FLAG (op, FLAG_ALIVE); + op->set_flag (FLAG_ALIVE); } }