ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/anim.C
(Generate patch)

Comparing deliantra/server/common/anim.C (file contents):
Revision 1.7 by root, Sun Sep 10 16:00:23 2006 UTC vs.
Revision 1.15 by pippijn, Sat Jan 6 14:42:28 2007 UTC

1
2/*
3 * static char *rcsid_anim_c =
4 * "$Id: anim.C,v 1.7 2006/09/10 16:00:23 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
10 Copyright (C) 2002-2003 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002-2003 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
12 7
13 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
22 17
23 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 23*/
29 24
30/* This file contains animation related code. */ 25/* This file contains animation related code. */
31 26
32#include <global.h> 27#include <global.h>
33#include <stdio.h> 28#include <stdio.h>
34
35std::vector < Animations > animations;
36 29
37void 30void
38free_all_anim (void) 31free_all_anim (void)
39{ 32{
40 for (int i = 0; i <= num_animations; i++) 33 for (int i = 0; i <= num_animations; i++)
68 /* set the name so we don't try to dereferance null. 61 /* set the name so we don't try to dereferance null.
69 * Put # at start so it will be first in alphabetical 62 * Put # at start so it will be first in alphabetical
70 * order. 63 * order.
71 */ 64 */
72 { 65 {
73 Animations 66 Animations anim0;
74 anim0;
75 67
76 anim0.name = "###none"; 68 anim0.name = "###none";
77 anim0.num_animations = 1; 69 anim0.num_animations = 1;
78 anim0.faces = (Fontindex *) malloc (sizeof (Fontindex)); 70 anim0.faces = (uint16 *)malloc (sizeof (uint16));
79 anim0.faces[0] = 0; 71 anim0.faces[0] = 0;
80 anim0.facings = 0; 72 anim0.facings = 0;
81 73
82 animations.push_back (anim0); 74 animations.push_back (anim0);
83 } 75 }
84 76
85 sprintf (buf, "%s/animations", settings.datadir); 77 sprintf (buf, "%s/animations", settings.datadir);
86 LOG (llevDebug, "Reading animations from %s...", buf); 78 LOG (llevDebug, "Reading animations from %s...\n", buf);
87 if ((fp = fopen (buf, "r")) == NULL) 79 if ((fp = fopen (buf, "r")) == NULL)
88 { 80 {
89 LOG (llevError, "Cannot open animations file %s: %s\n", buf, strerror (errno)); 81 LOG (llevError, "Cannot open animations file %s: %s\n", buf, strerror (errno));
90 exit (-1); 82 exit (-1);
91 } 83 }
102 LOG (llevError, "Didn't get a mina before %s\n", buf); 94 LOG (llevError, "Didn't get a mina before %s\n", buf);
103 num_frames = 0; 95 num_frames = 0;
104 } 96 }
105 num_animations++; 97 num_animations++;
106 98
107 Animations 99 Animations anim;
108 anim;
109 100
110 anim.name = buf + 5; 101 anim.name = buf + 5;
111 anim.num = num_animations; /* for bsearch */ 102 anim.num = num_animations; /* for bsearch */
112 anim.facings = 1; 103 anim.facings = 1;
113 animations.push_back (anim); 104 animations.push_back (anim);
114 } 105 }
115 else if (!strncmp (buf, "mina", 4)) 106 else if (!strncmp (buf, "mina", 4))
116 { 107 {
117 animations[num_animations].faces = (Fontindex *) malloc (sizeof (Fontindex) * num_frames); 108 animations[num_animations].faces = (uint16 *) malloc (sizeof (uint16) * num_frames);
118 for (i = 0; i < num_frames; i++) 109 for (i = 0; i < num_frames; i++)
119 animations[num_animations].faces[i] = faces[i]; 110 animations[num_animations].faces[i] = faces[i];
120 animations[num_animations].num_animations = num_frames; 111 animations[num_animations].num_animations = num_frames;
121 if (num_frames % animations[num_animations].facings) 112 if (num_frames % animations[num_animations].facings)
122 { 113 {
149{ 140{
150 return strcmp (a->name, b->name); 141 return strcmp (a->name, b->name);
151} 142}
152 143
153/* Tries to find the animation id that matches name. Returns an integer match 144/* Tries to find the animation id that matches name. Returns an integer match
154 * 0 if no match found (animation 0 is initialized as the 'bug' face 145 * 0 if no match found (animation 0 is initialised as the 'bug' face
155 */ 146 */
156int 147int
157find_animation (const char *name) 148find_animation (const char *name)
158{ 149{
159 Animations 150 Animations
183 */ 174 */
184 175
185void 176void
186animate_object (object *op, int dir) 177animate_object (object *op, int dir)
187{ 178{
188 int
189 max_state; /* Max animation state object should be drawn in */ 179 int max_state; /* Max animation state object should be drawn in */
190 int
191 base_state; /* starting index # to draw from */ 180 int base_state; /* starting index # to draw from */
192 181
193 if (!op->animation_id || !NUM_ANIMATIONS (op)) 182 if (!op->animation_id || !NUM_ANIMATIONS (op))
194 { 183 {
195 LOG (llevError, "Object lacks animation.\n"); 184 LOG (llevError, "Object %s lacks animation.\n", op->debug_desc ());
196 dump_object (op);
197 return; 185 return;
198 } 186 }
187
199 if (op->head) 188 if (op->head)
200 { 189 {
201 dir = op->head->direction; 190 dir = op->head->direction;
202 191
203 if (NUM_ANIMATIONS (op) == NUM_ANIMATIONS (op->head)) 192 if (NUM_ANIMATIONS (op) == NUM_ANIMATIONS (op->head))
204 op->state = op->head->state; 193 op->state = op->head->state;
205 else 194 else
206 ++op->state; 195 ++op->state;
207 } 196 }
208 else 197 else
209 {
210 ++op->state; /* increase draw state */ 198 ++op->state; /* increase draw state */
211 }
212 199
213 /* If object is turning, then max animation state is half through the 200 /* If object is turning, then max animation state is half through the
214 * animations. Otherwise, we can use all the animations. 201 * animations. Otherwise, we can use all the animations.
215 */ 202 */
216 max_state = NUM_ANIMATIONS (op) / NUM_FACINGS (op); 203 max_state = NUM_ANIMATIONS (op) / NUM_FACINGS (op);
219 * of the animations were left facing, the second half right facing. 206 * of the animations were left facing, the second half right facing.
220 * Note in old the is_turning, it was set so that the animation for a monster 207 * Note in old the is_turning, it was set so that the animation for a monster
221 * was always towards the enemy - now it is whatever direction the monster 208 * was always towards the enemy - now it is whatever direction the monster
222 * is facing. 209 * is facing.
223 */ 210 */
211
224 if (NUM_FACINGS (op) == 2) 212 if (NUM_FACINGS (op) == 2)
225 { 213 {
226 if (dir < 5) 214 if (dir < 5)
227 base_state = 0; 215 base_state = 0;
228 else 216 else

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines