1 /****************************************************************************
4 Copyright (c) 1997-2001 Jerome Jacovella-St-Louis
7 sequence.c - Sprite Sequence System
8 ****************************************************************************/
13 uint16 frame,wait,walk;
21 SequenceFrame **frames;
24 void SequenceFree(Sequence *sequence)
31 for(c=0; c<sequence->numEvents; c++)
33 if(sequence->frames[c])
34 delete sequence->frames[c];
36 delete sequence->frames;
38 if(sequence->numFrames)
39 delete sequence->numFrames;
44 Sequence * SequenceInit(uint16 numEvents)
46 Sequence * result = null;
47 Sequence * sequence = new0 Sequence[1];
50 sequence->numEvents = numEvents;
51 sequence->numFrames = new0 uint16[numEvents];
52 if(sequence->numFrames)
54 sequence->frames = new0 SequenceFrame *[numEvents];
60 SequenceFree(sequence);
64 bool SequenceLoadTable(Sequence **sequences, int count, const char * fileName)
67 File f = FileOpen(fileName, read);
68 FillBytes(sequences, 0, sizeof(Sequence *) * count);
73 for(c=0; c<count; c++)
78 if(f.Read(&numEvents, sizeof(uint16), 1) && (sequence = SequenceInit(numEvents)) )
81 sequences[c] = sequence;
82 for(e=0; e<numEvents; e++)
84 if(f.Read(&sequence->numFrames[e],sizeof(uint16), 1))
86 if(sequence->numFrames[e])
88 sequence->frames[e] = new0 SequenceFrame[sequence->numFrames[e]];
89 if(sequence->frames[e])
92 for(r=0; r<sequence->numFrames[e]; r++)
94 if(!f.Read(&sequence->frames[e][r].frame,sizeof(uint16), 1) ||
95 !f.Read(&sequence->frames[e][r].wait, sizeof(uint16), 1) ||
96 !f.Read(&sequence->frames[e][r].walk, sizeof(uint16), 1) ||
97 !f.Read(&sequence->frames[e][r].hit, sizeof(uint16), 1))
98 { sequences[c] = null; break; }
101 else { sequences[c] = null; break; }
104 else { sequences[c] = null; break; }
109 SequenceFree(sequence);
116 for(c = 0; c<count; c++)
120 SequenceFree(sequences[c]);
124 Logf("Error reading sequence table file (%s).\n", fileName);
129 Logf("Couldn't open sequence table file (%s).\n", fileName);
133 void SequenceSaveTable(Sequence **sequences, int count, char *fileName)
135 File f = FileOpen(fileName, write);
139 for(c=0; c<count; c++)
142 Sequence * sequence = sequences[c];
143 f.Write(&sequence->numEvents, sizeof(uint16), 1);
145 for(e=0; e<sequence->numEvents; e++)
148 f.Write(&sequence->numFrames[e],sizeof(uint16), 1);
149 for(r = 0; r<sequence->numFrames[e]; r++)
151 f.Write(&sequence->frames[e][r].frame,sizeof(uint16), 1);
152 f.Write(&sequence->frames[e][r].wait, sizeof(uint16), 1);
153 f.Write(&sequence->frames[e][r].walk, sizeof(uint16), 1);
154 f.Write(&sequence->frames[e][r].hit, sizeof(uint16), 1);
162 Sequence *SequenceLoad(char *fileName)
164 Sequence * result = null;
165 File f = FileOpen(fileName, read);
169 uint16 numEvents = 0;
170 if(f.Read(&numEvents, sizeof(uint16), 1) &&
171 (sequence = SequenceInit(numEvents)) )
175 for(e=0; e<sequence->numEvents; e++)
178 if(f.Read(&sequence->numFrames[e],sizeof(uint16), 1))
180 if(sequence->numFrames[e])
182 if((sequence->frames[e] = new0 SequenceFrame[sequence->numFrames[e]]))
184 for(r = 0; r<sequence->numFrames[e]; r++)
186 if(!f.Read(&sequence->frames[e][r].frame,sizeof(uint16), 1) ||
187 !f.Read(&sequence->frames[e][r].wait, sizeof(uint16), 1) ||
188 !f.Read(&sequence->frames[e][r].walk, sizeof(uint16), 1) ||
189 !f.Read(&sequence->frames[e][r].hit, sizeof(uint16), 1) )
190 { result = null; break; }
193 else { result = null; break; }
196 else { result = null; break; }
199 SequenceFree(sequence);
204 Logf("Error loading sequence file (%s).\n", fileName);
207 Logf("Couldn't open sequence file (%s).\n", fileName);
211 void SequenceSave(Sequence *sequence, char *filename)
216 f=FileOpen(filename, write);
218 f.Write(&sequence->numEvents, sizeof(uint16), 1);
219 for(e=0; e<sequence->numEvents; e++)
221 f.Write(&sequence->numFrames[e],sizeof(uint16), 1);
222 for(r=0; r<sequence->numFrames[e]; r++)
224 f.Write(&sequence->frames[e][r].frame,sizeof(uint16), 1);
225 f.Write(&sequence->frames[e][r].wait, sizeof(uint16), 1);
226 f.Write(&sequence->frames[e][r].walk, sizeof(uint16), 1);
227 f.Write(&sequence->frames[e][r].hit, sizeof(uint16), 1);