#include "Asset/AnimationStruct.h" namespace AniScriptParser { std::string Get_Ani_Flag(int data) { switch (data) { case 0: return "LOOP"; case 1: return "SHADOW"; case 3: return "COORD"; case 7: return "IMAGE_RATE"; case 8: return "IMAGE_ROTATE"; case 9: return "RGBA"; case 10: return "INTERPOLATION"; case 11: return "GRAPHIC_EFFECT"; case 12: return "DELAY"; case 13: return "DAMAGE_TYPE"; case 14: return "DAMAGE_BOX"; case 15: return "ATTACK_BOX"; case 16: return "PLAY_SOUND"; case 17: return "PRELOAD"; case 18: return "SPECTRUM"; case 23: return "SET_FLAG"; case 24: return "FLIP_TYPE"; case 25: return "LOOP_START"; case 26: return "LOOP_END"; case 27: return "CLIP"; case 28: return "OPERATION"; default: return ""; } } std::string Get_Ani_Effect_Type(int data) { switch (data) { case 0: return "NONE"; case 1: return "DODGE"; case 2: return "LINEARDODGE"; case 3: return "DARK"; case 4: return "XOR"; case 5: return "MONOCHROME"; case 6: return "SPACEDISTORT"; default: return ""; } }; std::string Get_Ani_Flip_Type(int data) { switch (data) { case 1: return "HORIZON"; case 2: return "VERTICAL"; case 3: return "ALL"; default: return ""; } }; std::string Get_Ani_Damage_Type(int data) { switch (data) { case 0: return "NORMAL"; case 1: return "SUPERARMOR"; case 2: return "UNBREAKABLE"; default: return ""; } }; /////////以下是读取逻辑 AniInfo StructAniInfo(Blob blob) { AniInfo Info; int Frame_Max = blob.getUShort(); int Img_Count = blob.getUShort(); // Img的路径读取 存入数组 for (int i = 0; i < Img_Count; i++) { int Buf = blob.getInt(); std::string ImgPath = "sprite/" + blob.getString(Buf); Info.Img_List.push_back(ImgPath); } // Ani头部标签数量 int Ani_H_Item_Count = blob.getUShort(); // 处理标签 for (int i = 0; i < Ani_H_Item_Count; i++) { int Type = blob.getUShort(); switch (Type) { case 0: case 1: { std::string Key = AniScriptParser::Get_Ani_Flag(Type); int Value = blob.getByte(); Info.Flag.emplace(Key, Value); break; } case 3: case 28: { std::string Key = AniScriptParser::Get_Ani_Flag(Type); int Value = blob.getUShort(); Info.Flag.emplace(Key, Value); break; } case 18: { blob.getByte(); blob.getInt(); blob.getInt(); blob.getInt(); blob.get256(); blob.get256(); blob.get256(); blob.get256(); blob.getUShort(); } default: break; } } // 读取每一个Img for (int i = 0; i < Frame_Max; i++) { AniFrame FrameObject; // 碰撞框项目数量 int Ani_Box_Item_Count = blob.getUShort(); for (int j = 0; j < Ani_Box_Item_Count; j++) { int Box_Type = blob.getUShort(); std::vector D_Box_b; for (int k = 0; k < 6; k++) { D_Box_b.push_back(blob.getInt()); } if (Box_Type == 15) FrameObject.AttackBox.push_back(D_Box_b); else FrameObject.DamageBox.push_back(D_Box_b); } // 调用的第几个Img int Index_Buf = blob.getShort(); if (Index_Buf != -1) { FrameObject.Img_Path = Tool_toLowerCase(Info.Img_List[Index_Buf]); FrameObject.Img_Index = blob.getUShort(); } else { FrameObject.Img_Path = ""; FrameObject.Img_Index = 0; } // 坐标 FrameObject.Img_Pos = SDL_Point{blob.getInt(), blob.getInt()}; // Img中的项目数量 int Img_Flag_Count = blob.getUShort(); for (int j = 0; j < Img_Flag_Count; j++) { int Img_Flag_Type = blob.getUShort(); std::string Key; int Value; switch (Img_Flag_Type) { case 0: case 1: case 10: { Key = AniScriptParser::Get_Ani_Flag(Img_Flag_Type); Value = blob.getByte(); FrameObject.Flag.emplace(Key, Value); break; } case 3: { Key = "COORD"; Value = blob.getUShort(); FrameObject.Flag.emplace(Key, Value); break; } case 17: { Key = "PRELOAD"; Value = 1; FrameObject.Flag.emplace(Key, Value); break; } case 7: { Key = "IMAGE_RATE"; SDL_FPoint pos{ blob.getFloat(), blob.getFloat()}; FrameObject.Flag.emplace(Key, pos); break; } case 8: { Key = "IMAGE_ROTATE"; Value = blob.getFloat(); FrameObject.Flag.emplace(Key, Value); break; } case 9: { Key = "RGBA"; std::vector RGBA = { (int)blob.get256(), (int)blob.get256(), (int)blob.get256(), (int)blob.get256()}; FrameObject.Flag.emplace(Key, RGBA); break; } case 11: { int Effect_Type = blob.getUShort(); Key = "GRAPHIC_EFFECT_" + AniScriptParser::Get_Ani_Effect_Type(Effect_Type); std::vector effect; switch (Effect_Type) { case 5: { effect.push_back(blob.get256()); effect.push_back(blob.get256()); effect.push_back(blob.get256()); break; } case 6: { effect.push_back(blob.get256()); effect.push_back(blob.get256()); break; } } FrameObject.Flag.emplace(Key, effect); break; } case 12: { Value = blob.getInt(); FrameObject.Delay = Value; break; } case 13: { Key = "DAMAGE_TYPE"; std::string DTYPE = AniScriptParser::Get_Ani_Damage_Type(blob.getUShort()); FrameObject.Flag.emplace(Key, DTYPE); break; } case 16: { int SoundTempSize = blob.getInt(); Key = "PLAY_SOUND"; std::string sound = blob.getString(SoundTempSize); FrameObject.Flag.emplace(Key, sound); break; } case 23: { Key = "SET_FLAG"; Value = blob.getInt(); FrameObject.Flag.emplace(Key, Value); break; } case 24: { Key = "FLIP_TYPE"; std::string FTYPEValue = AniScriptParser::Get_Ani_Flip_Type(blob.getUShort()); FrameObject.Flag.emplace(Key, FTYPEValue); break; } case 25: { Key = "LOOP_START"; FrameObject.Flag.emplace(Key, 1); break; } case 26: { Key = "LOOP_END"; Value = blob.getInt(); FrameObject.Flag.emplace(Key, Value); break; } case 27: { Key = "CLIP"; std::vector ClipArr{ blob.getShort(), blob.getShort(), blob.getShort(), blob.getShort(), }; FrameObject.Flag.emplace(Key, ClipArr); break; } default: break; } } Info.Frame.push_back(FrameObject); } return Info; } };