… | |
… | |
51 | int |
51 | int |
52 | num_frames = 0, faces[MAX_ANIMATIONS], i; |
52 | num_frames = 0, faces[MAX_ANIMATIONS], i; |
53 | |
53 | |
54 | if (anim_init) |
54 | if (anim_init) |
55 | return; |
55 | return; |
|
|
56 | |
56 | num_animations = 0; |
57 | num_animations = 0; |
57 | /* Make a default. New animations start at one, so if something |
58 | /* Make a default. New animations start at one, so if something |
58 | * thinks it is animated but hasn't set the animation_id properly, |
59 | * thinks it is animated but hasn't set the animation_id properly, |
59 | * it will have a default value that should be pretty obvious. |
60 | * it will have a default value that should be pretty obvious. |
60 | */ |
61 | */ |
61 | /* set the name so we don't try to dereferance null. |
62 | /* set the name so we don't try to dereferance null. |
62 | * Put # at start so it will be first in alphabetical |
63 | * Put # at start so it will be first in alphabetical |
63 | * order. |
64 | * order. |
64 | */ |
65 | */ |
65 | { |
66 | { |
66 | Animations anim0; |
67 | animation anim0; |
67 | |
68 | |
68 | anim0.name = "###none"; |
69 | anim0.name = "###none"; |
69 | anim0.num_animations = 1; |
70 | anim0.num_animations = 1; |
70 | anim0.faces = (uint16 *)malloc (sizeof (uint16)); |
71 | anim0.faces = (uint16 *)malloc (sizeof (uint16)); |
71 | anim0.faces[0] = 0; |
72 | anim0.faces[0] = 0; |
… | |
… | |
74 | animations.push_back (anim0); |
75 | animations.push_back (anim0); |
75 | } |
76 | } |
76 | |
77 | |
77 | sprintf (buf, "%s/animations", settings.datadir); |
78 | sprintf (buf, "%s/animations", settings.datadir); |
78 | LOG (llevDebug, "Reading animations from %s...\n", buf); |
79 | LOG (llevDebug, "Reading animations from %s...\n", buf); |
|
|
80 | |
79 | if ((fp = fopen (buf, "r")) == NULL) |
81 | if ((fp = fopen (buf, "r")) == NULL) |
80 | { |
82 | { |
81 | LOG (llevError, "Cannot open animations file %s: %s\n", buf, strerror (errno)); |
83 | LOG (llevError, "Cannot open animations file %s: %s\n", buf, strerror (errno)); |
82 | exit (-1); |
84 | exit (-1); |
83 | } |
85 | } |
|
|
86 | |
84 | while (fgets (buf, MAX_BUF - 1, fp) != NULL) |
87 | while (fgets (buf, MAX_BUF - 1, fp) != NULL) |
85 | { |
88 | { |
86 | if (*buf == '#') |
89 | if (*buf == '#') |
87 | continue; |
90 | continue; |
|
|
91 | |
88 | /* Kill the newline */ |
92 | /* Kill the newline */ |
89 | buf[strlen (buf) - 1] = '\0'; |
93 | buf[strlen (buf) - 1] = '\0'; |
90 | if (!strncmp (buf, "anim ", 5)) |
94 | if (!strncmp (buf, "anim ", 5)) |
91 | { |
95 | { |
92 | if (num_frames) |
96 | if (num_frames) |
93 | { |
97 | { |
94 | LOG (llevError, "Didn't get a mina before %s\n", buf); |
98 | LOG (llevError, "Didn't get a mina before %s\n", buf); |
95 | num_frames = 0; |
99 | num_frames = 0; |
96 | } |
100 | } |
|
|
101 | |
97 | num_animations++; |
102 | num_animations++; |
98 | |
103 | |
99 | Animations anim; |
104 | animation anim; |
100 | |
105 | |
101 | anim.name = buf + 5; |
106 | anim.name = buf + 5; |
102 | anim.num = num_animations; /* for bsearch */ |
107 | anim.num = num_animations; /* for bsearch */ |
103 | anim.facings = 1; |
108 | anim.facings = 1; |
104 | animations.push_back (anim); |
109 | animations.push_back (anim); |
105 | } |
110 | } |
106 | else if (!strncmp (buf, "mina", 4)) |
111 | else if (!strncmp (buf, "mina", 4)) |
107 | { |
112 | { |
108 | animations[num_animations].faces = (uint16 *) malloc (sizeof (uint16) * num_frames); |
113 | animations[num_animations].faces = (uint16 *) malloc (sizeof (uint16) * num_frames); |
|
|
114 | |
109 | for (i = 0; i < num_frames; i++) |
115 | for (i = 0; i < num_frames; i++) |
110 | animations[num_animations].faces[i] = faces[i]; |
116 | animations[num_animations].faces[i] = faces[i]; |
|
|
117 | |
111 | animations[num_animations].num_animations = num_frames; |
118 | animations[num_animations].num_animations = num_frames; |
112 | if (num_frames % animations[num_animations].facings) |
119 | if (num_frames % animations[num_animations].facings) |
113 | { |
120 | { |
114 | LOG (llevDebug, "Animation %s frame numbers (%d) is not a multiple of facings (%d)\n", |
121 | LOG (llevDebug, "Animation %s frame numbers (%d) is not a multiple of facings (%d)\n", |
115 | &animations[num_animations].name, num_frames, animations[num_animations].facings); |
122 | &animations[num_animations].name, num_frames, animations[num_animations].facings); |
… | |
… | |
129 | { |
136 | { |
130 | if (!(faces[num_frames++] = FindFace (buf, 0))) |
137 | if (!(faces[num_frames++] = FindFace (buf, 0))) |
131 | LOG (llevDebug, "Could not find face %s for animation %s\n", buf, &animations[num_animations].name); |
138 | LOG (llevDebug, "Could not find face %s for animation %s\n", buf, &animations[num_animations].name); |
132 | } |
139 | } |
133 | } |
140 | } |
|
|
141 | |
134 | fclose (fp); |
142 | fclose (fp); |
135 | LOG (llevDebug, "done. got (%d)\n", num_animations); |
143 | LOG (llevDebug, "done. got (%d)\n", num_animations); |
136 | } |
144 | } |
137 | |
145 | |
138 | static int |
146 | static int |
139 | anim_compare (const Animations * a, const Animations * b) |
147 | anim_compare (const animation *a, const animation *b) |
140 | { |
148 | { |
141 | return strcmp (a->name, b->name); |
149 | return std::strcmp (a->name, b->name); |
142 | } |
150 | } |
143 | |
151 | |
144 | /* Tries to find the animation id that matches name. Returns an integer match |
152 | /* Tries to find the animation id that matches name. Returns an integer match |
145 | * 0 if no match found (animation 0 is initialised as the 'bug' face |
153 | * 0 if no match found (animation 0 is initialised as the 'bug' face |
146 | */ |
154 | */ |
147 | int |
155 | int |
148 | find_animation (const char *name) |
156 | find_animation (const char *name) |
149 | { |
157 | { |
150 | Animations search, *match; |
158 | animation search, *match; |
151 | |
159 | |
152 | search.name = name; |
160 | search.name = name; |
153 | |
161 | |
154 | match = (Animations *) bsearch (&search, &animations[0], (num_animations + 1), |
162 | match = (animation *) bsearch (&search, &animations[0], (num_animations + 1), |
155 | sizeof (Animations), (int (*)(const void *, const void *)) anim_compare); |
163 | sizeof (animation), (int (*)(const void *, const void *)) anim_compare); |
156 | |
164 | |
157 | |
165 | |
158 | if (match) |
166 | if (match) |
159 | return match->num; |
167 | return match->num; |
160 | |
168 | |
… | |
… | |
200 | /* If object is turning, then max animation state is half through the |
208 | /* If object is turning, then max animation state is half through the |
201 | * animations. Otherwise, we can use all the animations. |
209 | * animations. Otherwise, we can use all the animations. |
202 | */ |
210 | */ |
203 | max_state = NUM_ANIMATIONS (op) / NUM_FACINGS (op); |
211 | max_state = NUM_ANIMATIONS (op) / NUM_FACINGS (op); |
204 | base_state = 0; |
212 | base_state = 0; |
205 | /* at least in the older aniamtions that used is_turning, the first half |
213 | /* at least in the older animations that used is_turning, the first half |
206 | * of the animations were left facing, the second half right facing. |
214 | * of the animations were left facing, the second half right facing. |
207 | * Note in old the is_turning, it was set so that the animation for a monster |
215 | * Note in old the is_turning, it was set so that the animation for a monster |
208 | * was always towards the enemy - now it is whatever direction the monster |
216 | * was always towards the enemy - now it is whatever direction the monster |
209 | * is facing. |
217 | * is facing. |
210 | */ |
218 | */ |
… | |
… | |
237 | |
245 | |
238 | SET_ANIMATION (op, op->state + base_state); |
246 | SET_ANIMATION (op, op->state + base_state); |
239 | |
247 | |
240 | if (op->face == blank_face) |
248 | if (op->face == blank_face) |
241 | op->invisible = 1; |
249 | op->invisible = 1; |
242 | |
|
|
243 | /* This block covers monsters (eg, pixies) which are supposed to |
250 | /* This block covers monsters (eg, pixies) which are supposed to |
244 | * cycle from visible to invisible and back to being visible. |
251 | * cycle from visible to invisible and back to being visible. |
245 | * as such, disable it for players, as then players would become |
252 | * as such, disable it for players, as then players would become |
246 | * visible. |
253 | * visible. |
247 | */ |
254 | */ |
248 | else if (op->type != PLAYER && QUERY_FLAG ((&op->arch->clone), FLAG_ALIVE)) |
255 | else if (op->type != PLAYER && op->arch->clone.flag [FLAG_ALIVE]) |
249 | { |
256 | { |
250 | if (op->face->number == 0) |
257 | if (op->face->number == 0) |
251 | { |
258 | { |
252 | op->invisible = 1; |
259 | op->invisible = 1; |
253 | CLEAR_FLAG (op, FLAG_ALIVE); |
260 | CLEAR_FLAG (op, FLAG_ALIVE); |