5 #define MAX_SPRFRAMES MAX_MD2SKINS
\r
8 dsprframe_t frames[MAX_SPRFRAMES];
\r
10 byte *byteimage, *lbmpalette;
\r
11 int byteimagewidth, byteimageheight;
\r
13 char spritename[1024];
\r
16 void FinishSprite (void);
\r
17 void Cmd_Spritename (void);
\r
26 void FinishSprite (void)
\r
28 FILE *spriteouthandle;
\r
30 dsprite_t spritetemp;
\r
31 char savename[1024];
\r
33 if (sprite.numframes == 0)
\r
36 if (!strlen(spritename))
\r
37 Error ("Didn't name sprite file");
\r
39 sprintf (savename, "%s%s.sp2", gamedir, spritename);
\r
45 sprintf (name, "%s.sp2", spritename);
\r
47 spritename[0] = 0; // clear for a new sprite
\r
48 sprite.numframes = 0;
\r
53 printf ("saving in %s\n", savename);
\r
54 CreatePath (savename);
\r
55 spriteouthandle = SafeOpenWrite (savename);
\r
59 // write out the sprite header
\r
61 spritetemp.ident = LittleLong (IDSPRITEHEADER);
\r
62 spritetemp.version = LittleLong (SPRITE_VERSION);
\r
63 spritetemp.numframes = LittleLong (sprite.numframes);
\r
65 SafeWrite (spriteouthandle, &spritetemp, 12);
\r
68 // write out the frames
\r
72 for (i=0 ; i<sprite.numframes ; i++)
\r
74 frames[i].width = LittleLong(frames[i].width);
\r
75 frames[i].height = LittleLong(frames[i].height);
\r
76 frames[i].origin_x = LittleLong(frames[i].origin_x);
\r
77 frames[i].origin_y = LittleLong(frames[i].origin_y);
\r
79 SafeWrite (spriteouthandle, frames, sizeof(frames[0])*sprite.numframes);
\r
81 fclose (spriteouthandle);
\r
83 spritename[0] = 0; // clear for a new sprite
\r
84 sprite.numframes = 0;
\r
93 void Cmd_Load (void)
\r
102 name = ExpandPathAndArchive(token);
\r
105 printf ("loading %s\n", name);
\r
106 Load256Image (name, &byteimage, &lbmpalette,
\r
107 &byteimagewidth, &byteimageheight);
\r
108 RemapZero (byteimage, lbmpalette,
\r
109 byteimagewidth, byteimageheight);
\r
118 void Cmd_SpriteFrame (void)
\r
120 int y,xl,yl,xh,yh,w,h;
\r
121 dsprframe_t *pframe;
\r
124 char savename[1024];
\r
135 // origin offset is optional
\r
136 if (TokenAvailable ())
\r
141 oy = atoi (token);
\r
149 if ((xl & 0x07) || (yl & 0x07) || (w & 0x07) || (h & 0x07))
\r
150 Error ("Sprite dimensions not multiples of 8\n");
\r
152 if ((w > 256) || (h > 256))
\r
153 Error ("Sprite has a dimension longer than 256");
\r
158 if (sprite.numframes >= MAX_SPRFRAMES)
\r
159 Error ("Too many frames; increase MAX_SPRFRAMES\n");
\r
161 pframe = &frames[sprite.numframes];
\r
163 pframe->height = h;
\r
164 pframe->origin_x = ox;
\r
165 pframe->origin_y = oy;
\r
166 sprintf (pframe->name, "%s_%i.pcx", spritename, sprite.numframes);
\r
167 sprintf (savename, "%s%s_%i.pcx", gamedir, spritename, sprite.numframes);
\r
168 sprite.numframes++;
\r
172 ReleaseFile (pframe->name);
\r
176 // crop it to the proper size
\r
177 cropped = malloc (w*h);
\r
178 for (y=0 ; y<h ; y++)
\r
180 memcpy (cropped+y*w, byteimage+(y+yl)*byteimagewidth+xl, w);
\r
183 // save off the new image
\r
184 printf ("saving %s\n", savename);
\r
185 CreatePath (savename);
\r
186 WritePCXfile (savename, cropped, w, h, lbmpalette);
\r
198 void Cmd_SpriteName (void)
\r
200 if (sprite.numframes)
\r
204 strcpy (spritename, token);
\r
205 memset (&sprite, 0, sizeof(sprite));
\r
206 memset (&frames, 0, sizeof(frames));
\r