00001 #ifndef FACTION_H_FILE
00002 #define FACTION_H_FILE
00003
00004 #include <iostream>
00005 #include <strstream>
00006 #include <vector>
00007
00008 #include "FBase.h"
00009
00010 class FlashActionRecord
00011 {
00012 public:
00013 FlashActionRecord() : m_size(0) {}
00014 ~FlashActionRecord() { }
00015
00016 virtual void Write(std::ostream &out) { WriteHeader(out,m_size); out.write(unknowndata,m_size); }
00017
00018 virtual void Read(std::istream &in) { ReadHeader(in); if(m_size != 0) { unknowndata = (char *)malloc(m_size+1); gcstrings.push_back(unknowndata); in.read(unknowndata,m_size); } }
00019 protected:
00020 void WriteHeader(std::ostream &out, UWORD size=0);
00021 void ReadHeader(std::istream &in) { m_code = in.get(); if(m_code < 0x80) return; READ_UWORD(m_size); }
00022
00023 char *unknowndata;
00024 gc_vector<char*> gcstrings;
00025
00026 UWORD m_code;
00027 UWORD m_size;
00028 };
00029
00030
00031
00032
00033 #define DECLARE_SIMPLE_ACTION_CLASS(ActionName, ActionID) \
00034 class ActionName : public FlashActionRecord \
00035 { \
00036 public: \
00037 ActionName() { m_code=ActionID; } \
00038 ~ActionName() {} \
00039 virtual void Write(std::ostream &out) { WriteHeader(out); } \
00040 private: \
00041 };
00042
00043 #define DECLARE_SIMPLE_ACTION_CLASS2(ActionName, ActionID, pName) \
00044 class ActionName : public FlashActionRecord \
00045 { \
00046 public: \
00047 ActionName(SWORD pName) : data(pName) { m_code=ActionID; } \
00048 ~ActionName() {} \
00049 virtual void Write(std::ostream &out) { WriteHeader(out,2); \
00050 WRITE_SWORD(data); } \
00051 SWORD Get##pName() { return data; } \
00052 virtual void Read(std::istream &in) { ReadHeader(in); READ_SWORD(data); } \
00053 private: \
00054 ActionName() {} \
00055 friend class FlashActionVectorImporter; \
00056 SWORD data; \
00057 };
00058
00059
00060 #define DECLARE_SIMPLE_ACTION_CLASS3(ActionName, ActionID, pName) \
00061 class ActionName : public FlashActionRecord \
00062 { \
00063 public: \
00064 ActionName(char *pName) : data(pName), remove(false) { m_code=ActionID; } \
00065 ~ActionName() { if(remove) free(data); } \
00066 virtual void Write(std::ostream &out) { WriteHeader(out,strlen(data)+1); \
00067 out << data; out.put((char)0); } \
00068 const char *Get##pName() { return data; } \
00069 virtual void Read(std::istream &in) { ReadHeader(in); remove = true; std::vector<char> str; unsigned int i; while((i = in.get()) != 0) { str.push_back((char)i); } data = (char*)malloc(str.size()+1); i=0; for(;i < str.size(); i++) { data[i]=str[i]; } data[i]=0; } \
00070 private: \
00071 ActionName() : remove(false) {} \
00072 bool remove; \
00073 friend class FlashActionVectorImporter; \
00074 char *data; \
00075 };
00076
00077 #define DECLARE_SIMPLE_ACTION_CLASS4(ActionName, ActionID, pName) \
00078 class ActionName : public FlashActionRecord \
00079 { \
00080 public: \
00081 ActionName(char pName) : data(pName) { m_code=ActionID; } \
00082 ~ActionName() {} \
00083 virtual void Write(std::ostream &out) { WriteHeader(out,1); \
00084 out.put(data); } \
00085 char Get##pName() { return data; } \
00086 virtual void Read(std::istream &in) { ReadHeader(in); data=in.get(); } \
00087 private: \
00088 ActionName() {} \
00089 friend class FlashActionVectorImporter; \
00090 char data; \
00091 };
00092
00093
00094 DECLARE_SIMPLE_ACTION_CLASS(FlashActionNextFrame,0x04);
00095 DECLARE_SIMPLE_ACTION_CLASS(FlashActionPreviousFrame,0x05);
00096 DECLARE_SIMPLE_ACTION_CLASS(FlashActionPlay,0x06);
00097 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStop,0x07);
00098 DECLARE_SIMPLE_ACTION_CLASS(FlashActionToggleQuality,0x08);
00099 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStopSounds,0x09);
00100 DECLARE_SIMPLE_ACTION_CLASS2(FlashActionGotoFrame,0x81,frame);
00101 DECLARE_SIMPLE_ACTION_CLASS3(FlashActionSetTarget,0x8B,target);
00102 DECLARE_SIMPLE_ACTION_CLASS3(FlashActionGotoLabel,0x8C,label);
00103
00104
00105 class FlashActionGetURL : public FlashActionRecord
00106 {
00107 public:
00108 FlashActionGetURL(char *url, char *target) : data1(url), data2(target) { m_code=0x83; }
00109 ~FlashActionGetURL()
00110 {
00111 }
00112
00113
00114 virtual void Write(std::ostream &out) { WriteHeader(out,strlen(data1)+strlen(data2)+2);
00115 out << data1; out.put((char)0);
00116 out << data2; out.put((char)0);}
00117
00118 const char *GetURL(void) { return data1; }
00119 const char *GetTarget(void) { return data2; }
00120
00121 virtual void Read(std::istream &in)
00122 {
00123 ReadHeader(in);
00124 std::vector<char> str;
00125 unsigned int i;
00126 while((i = in.get()) != 0)
00127 {
00128 str.push_back((char)i);
00129 }
00130 data1 = (char*)malloc(str.size()+1);
00131 i=0;
00132 for(;i < str.size(); i++)
00133 {
00134 data1[i]=str[i];
00135 }
00136 data1[i]=0;
00137
00138 std::vector<char> str2;
00139 unsigned int i2;
00140 while((i2 = in.get()) != 0)
00141 {
00142 str2.push_back((char)i2);
00143 }
00144 data2 = (char*)malloc(str2.size()+1);
00145 i2=0;
00146 for(;i2 < str2.size(); i2++)
00147 {
00148 data2[i2]=str2[i2];
00149 }
00150 data2[i2]=0;
00151 gcstrings.push_back(data1);
00152 gcstrings.push_back(data2);
00153 }
00154 private:
00155 gc_vector<char *> gcstrings;
00156 FlashActionGetURL() {}
00157 friend class FlashActionVectorImporter;
00158 char *data1;
00159 char *data2;
00160 };
00161
00162 class FlashActionWaitForFrame : public FlashActionRecord
00163 {
00164 FlashActionWaitForFrame(SWORD frame, char skipcount) : data1(frame), data2(skipcount) { m_code=0x8A; }
00165 ~FlashActionWaitForFrame() {}
00166 virtual void Write(std::ostream &out) { WriteHeader(out,3);
00167 WRITE_SWORD(data1);
00168 out.put((char)data2);}
00169 virtual void Read(std::istream &in) { ReadHeader(in); READ_SWORD(data1); data2 = in.get(); }
00170 SWORD GetFrame(void) { return data1; }
00171 char GetSkipCount(void) { return data2; }
00172 private:
00173 FlashActionWaitForFrame() {}
00174 friend class FlashActionVectorImporter;
00175
00176 SWORD data1;
00177 char data2;
00178 };
00179
00180
00181 DECLARE_SIMPLE_ACTION_CLASS(FlashActionAdd,0x0A);
00182 DECLARE_SIMPLE_ACTION_CLASS(FlashActionSubtract,0x0B);
00183 DECLARE_SIMPLE_ACTION_CLASS(FlashActionMultiply,0x0C);
00184 DECLARE_SIMPLE_ACTION_CLASS(FlashActionDivide,0x0D);
00185 DECLARE_SIMPLE_ACTION_CLASS(FlashActionEquals,0x0E);
00186 DECLARE_SIMPLE_ACTION_CLASS(FlashActionLess,0x0F);
00187 DECLARE_SIMPLE_ACTION_CLASS(FlashActionAnd,0x10);
00188 DECLARE_SIMPLE_ACTION_CLASS(FlashActionOr,0x11);
00189 DECLARE_SIMPLE_ACTION_CLASS(FlashActionNot,0x12);
00190 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStringEquals,0x13);
00191 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStringLength,0x14);
00192 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStringExtract,0x15);
00193 DECLARE_SIMPLE_ACTION_CLASS(FlashActionPop,0x17);
00194 DECLARE_SIMPLE_ACTION_CLASS(FlashActionToInteger,0x18);
00195 DECLARE_SIMPLE_ACTION_CLASS(FlashActionGetVariable,0x1C);
00196 DECLARE_SIMPLE_ACTION_CLASS(FlashActionSetVariable,0x1D);
00197 DECLARE_SIMPLE_ACTION_CLASS(FlashActionSetTarget2,0x20);
00198 DECLARE_SIMPLE_ACTION_CLASS(FlashActionGetProperty,0x22);
00199 DECLARE_SIMPLE_ACTION_CLASS(FlashActionSetProperty,0x23);
00200 DECLARE_SIMPLE_ACTION_CLASS(FlashActionCloneSprite,0x24);
00201 DECLARE_SIMPLE_ACTION_CLASS(FlashActionRemoveSprite,0x25);
00202 DECLARE_SIMPLE_ACTION_CLASS(FlashActionTrace,0x26);
00203 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStartDrag,0x27);
00204 DECLARE_SIMPLE_ACTION_CLASS(FlashActionEndDrag,0x28);
00205 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStringAdd,0x21);
00206 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStringLess,0x29);
00207 DECLARE_SIMPLE_ACTION_CLASS(FlashActionRandomNumber,0x30);
00208 DECLARE_SIMPLE_ACTION_CLASS(FlashActionMBStringLength,0x31);
00209 DECLARE_SIMPLE_ACTION_CLASS(FlashActionCharToAscii,0x32);
00210 DECLARE_SIMPLE_ACTION_CLASS(FlashActionAsciiToChar,0x33);
00211 DECLARE_SIMPLE_ACTION_CLASS(FlashActionGetTime,0x34);
00212 DECLARE_SIMPLE_ACTION_CLASS(FlashActionMBCharToAscii,0x36);
00213 DECLARE_SIMPLE_ACTION_CLASS(FlashActionMBStringExtract,0x35);
00214 DECLARE_SIMPLE_ACTION_CLASS(FlashActionMBAsciToChar,0x37);
00215 DECLARE_SIMPLE_ACTION_CLASS4(FlashActionWaitForFrame2,0x8D, skipcount);
00216 DECLARE_SIMPLE_ACTION_CLASS2(FlashActionJump,0x99,offset);
00217 DECLARE_SIMPLE_ACTION_CLASS4(FlashActionGetURL2,0x9A,method);
00218 DECLARE_SIMPLE_ACTION_CLASS2(FlashActionIf,0x9D,offset);
00219 DECLARE_SIMPLE_ACTION_CLASS(FlashActionCall,0x9E);
00220 DECLARE_SIMPLE_ACTION_CLASS4(FlashActionGotoFrame2,0x9F,play);
00221
00222
00223 class FlashActionPush : public FlashActionRecord
00224 {
00225 public:
00226 FlashActionPush(char _type, char *_data, UWORD _len) : type(_type), data(_data), len(_len) { m_code = 0x96;}
00227 ~FlashActionPush() { }
00228
00229 virtual void Write(std::ostream &out);
00230 virtual void Read(std::istream &in);
00231
00232 char GetType() { return type; }
00233 virtual UWORD GetDataSize() { return len; }
00234 virtual const char *GetData() { return data; }
00235 protected:
00236 FlashActionPush() {};
00237 private:
00238 friend class FlashActionVectorImporter;
00239 gc_vector<char*> gcstrings;
00240 char type;
00241 char *data;
00242 UWORD len;
00243 };
00244
00245
00246
00247 DECLARE_SIMPLE_ACTION_CLASS(FlashActionDelete,0x3a);
00248 DECLARE_SIMPLE_ACTION_CLASS(FlashActionDelete2,0x3b);
00249 DECLARE_SIMPLE_ACTION_CLASS(FlashActionDefineLocal,0x3c);
00250 DECLARE_SIMPLE_ACTION_CLASS(FlashActionCallFunction,0x3d);
00251 DECLARE_SIMPLE_ACTION_CLASS(FlashActionReturn,0x3e);
00252 DECLARE_SIMPLE_ACTION_CLASS(FlashActionModulo,0x3f);
00253 DECLARE_SIMPLE_ACTION_CLASS(FlashActionNewObject,0x40);
00254 DECLARE_SIMPLE_ACTION_CLASS(FlashActionDefineLocal2,0x41);
00255 DECLARE_SIMPLE_ACTION_CLASS(FlashActionInitArray,0x42);
00256 DECLARE_SIMPLE_ACTION_CLASS(FlashActionInitObject,0x42);
00257 DECLARE_SIMPLE_ACTION_CLASS(FlashActionTypeOf,0x44);
00258 DECLARE_SIMPLE_ACTION_CLASS(FlashActionTargetPath,0x45);
00259 DECLARE_SIMPLE_ACTION_CLASS(FlashActionEnumerate,0x46);
00260 DECLARE_SIMPLE_ACTION_CLASS(FlashActionAdd2,0x47);
00261 DECLARE_SIMPLE_ACTION_CLASS(FlashActionLess2,0x48);
00262 DECLARE_SIMPLE_ACTION_CLASS(FlashActionEquals2,0x49);
00263 DECLARE_SIMPLE_ACTION_CLASS(FlashActionToNumber,0x4a);
00264 DECLARE_SIMPLE_ACTION_CLASS(FlashActionToString,0x4b);
00265 DECLARE_SIMPLE_ACTION_CLASS(FlashActionPushDuplicate,0x4c);
00266 DECLARE_SIMPLE_ACTION_CLASS(FlashActionStackSwap,0x4d);
00267 DECLARE_SIMPLE_ACTION_CLASS(FlashActionGetMember,0x4e);
00268 DECLARE_SIMPLE_ACTION_CLASS(FlashActionSetMember,0x4f);
00269 DECLARE_SIMPLE_ACTION_CLASS(FlashActionIncrement,0x50);
00270 DECLARE_SIMPLE_ACTION_CLASS(FlashActionDecrement,0x51);
00271 DECLARE_SIMPLE_ACTION_CLASS(FlashActionCallMethod,0x52);
00272 DECLARE_SIMPLE_ACTION_CLASS(FlashActionNewMethod,0x53);
00273 DECLARE_SIMPLE_ACTION_CLASS(FlashActionBitAnd,0x60);
00274 DECLARE_SIMPLE_ACTION_CLASS(FlashActionBitOr,0x61);
00275 DECLARE_SIMPLE_ACTION_CLASS(FlashActionBitXor,0x62);
00276 DECLARE_SIMPLE_ACTION_CLASS(FlashActionBitLShift,0x63);
00277 DECLARE_SIMPLE_ACTION_CLASS(FlashActionBitRShift,0x64);
00278 DECLARE_SIMPLE_ACTION_CLASS(FlashActionBitURShift,0x65);
00279 DECLARE_SIMPLE_ACTION_CLASS4(FlashActionStoreRegister,0x87,registernumber);
00280
00281
00282
00283 class FlashActionDefineFunction : public FlashActionRecord
00284 {
00285 public:
00286 FlashActionDefineFunction(char *function ...);
00287
00288 ~FlashActionDefineFunction();
00289
00290 virtual void Write(std::ostream &out);
00291 virtual void Read(std::istream &in);
00292
00293 void AddAction(FlashActionRecord *r);
00294 private:
00295 FlashActionDefineFunction() {}
00296
00297 friend class FlashActionVectorImporter;
00298 char *m_functionName;
00299 UWORD m_numParams;
00300 std::vector<char *> m_paramNames;
00301 std::vector<FlashActionRecord *> m_actions;
00302 gc_vector<char *> m_gcstrings;
00303 gc_vector<FlashActionRecord *> records_delete;
00304 };
00305
00306 class FlashActionWith : public FlashActionRecord
00307 {
00308 public:
00309 FlashActionWith() {}
00310 ~FlashActionWith() { }
00311
00312 virtual void Write(std::ostream &out);
00313 virtual void Read(std::istream &in);
00314
00315 void AddAction(FlashActionRecord *r);
00316 private:
00317 std::vector<FlashActionRecord *> m_actions;
00318 gc_vector<FlashActionRecord *> records_delete;
00319 };
00320
00321 class FlashActionConstantPool : public FlashActionRecord
00322 {
00323 public:
00324 FlashActionConstantPool(char *c ...);
00325 ~FlashActionConstantPool() {}
00326
00327 virtual void Write(std::ostream &out);
00328 virtual void Read(std::istream &in);
00329
00330 private:
00331 FlashActionConstantPool() {}
00332 friend class FlashActionVectorImporter;
00333 int m_length;
00334 std::vector<char *>m_strings;
00335 gc_vector<char *>m_gcstrings;
00336 };
00337
00338
00339 class FlashTagDoAction : public FlashSpriteEnabled
00340 {
00341 DEFINE_RW_INTERFACE
00342 public:
00343 FlashTagDoAction() {}
00344 ~FlashTagDoAction();
00345
00346 UWORD GetNumActions() { return records.size(); }
00347 FlashActionRecord *GetAction(UWORD pos) { return records[pos]; }
00348
00349 void AddAction(FlashActionRecord *r);
00350
00351 friend std::ostream &operator<< (std::ostream &out, FlashTagDoAction &data);
00352 friend std::istream &operator>> (std::istream &in, FlashTagDoAction &data);
00353
00354 private:
00355 std::vector<FlashActionRecord *> records;
00356 gc_vector<FlashActionRecord *> records_delete;
00357 };
00358
00359 class FlashActionVectorImporter
00360 {
00361 public:
00362 FlashActionVectorImporter() {}
00363 ~FlashActionVectorImporter() {}
00364
00365 void Import(std::istream &in, std::vector<FlashActionRecord *> &v, gc_vector<FlashActionRecord*> &d);
00366 void Import(std::istream &in, std::vector<FlashActionRecord *> &v, gc_vector<FlashActionRecord*> &d, UDWORD num_actions);
00367 private:
00368 };
00369 #endif // FACTION_H_FILE
00370