private void DrawImage(SpriteBatch Batch, GameImage Image, Rectangle dest, Color clr) { if (Image.Texture == null) { Texture2D Texture = new Texture2D(Device, 32, 32, false, SurfaceFormat.Color); Texture.SetData<Byte>(Image.LoadRGBA()); Image.Texture = Texture; } Batch.Draw(Image.Texture, dest, clr); }
public TibiaGameData(Stream DatFile, Stream SpriteFile) { this.SpriteFile = SpriteFile; SprVersion = ReadU32(SpriteFile); DatVersion = ReadU32(DatFile); //get max id ItemCount = ReadU16(DatFile); CreatureCount = ReadU16(DatFile); EffectCount = ReadU16(DatFile); DistanceCount = ReadU16(DatFile); UInt16 MinClientID = 100; // tibia.dat start with id 100 // We don't load distance/effects, if we would, just add effect_count & distance_count here UInt16 MaxClientID = (UInt16)((int)ItemCount + (int)CreatureCount + (int)EffectCount + (int)DistanceCount); UInt16 ID = MinClientID; // loop through all ItemDatabase until we reach the end of file while(ID <= MaxClientID) { GameSprite sType = new GameSprite(ID); ItemType iType = new ItemType(ID, sType); Sprites[ID] = sType; Items[ID] = iType; // Is it an effect? if (ID >= ItemCount + CreatureCount) sType.AnimationSpeed = 100; if (ID >= ItemCount && ID < ItemCount + CreatureCount) { };// sType.RenderOffset = -16; // read the options until we find a 0xff byte lastopt; byte optbyte = 0xff; do { lastopt = optbyte; optbyte = (byte)DatFile.ReadByte(); { //7.4 switch(optbyte) { case 0x00: //is groundtile iType.IsGround = true; iType.WalkSpeed = ReadU16(DatFile); iType.AlwaysOnTop = 0; break; case 0x01: // all OnTop iType.AlwaysOnTop = 1; break; case 0x02: iType.CanSeeThrough = true; iType.AlwaysOnTop = 2; break; case 0x03: iType.IsContainer = true; break; case 0x04: iType.IsStackable = true; sType.IsStackable = true; break; case 0x05: iType.IsUseableWith = true; break; case 0x06: iType.IsLadder = true; break; case 0x07: iType.IsReadable = true; iType.IsWriteable = true; iType.MaxTextLength = ReadU16(DatFile); break; case 0x08: // writtable objects that can't be edited iType.IsReadable = true; break; case 0x09: //can contain fluids iType.IsFluidContainer = true; sType.IsFluidContainer = true; break; case 0x0A: iType.IsSplash = true; sType.IsSplash = true; break; case 0x0B: iType.IsSolid = true; break; case 0x0C: iType.Immoveable = true; //Log.Fatal("Unknown attribute 0x0C - " + ID, this); break; case 0x0D: // blocks missiles (walls, magic wall etc) iType.BlockProjectiles = true; break; case 0x0E: // blocks monster movement (flowers, parcels etc) iType.BlockPathfinding = true; break; case 0x0F: iType.CanPickup = true; break; case 0x10: iType.LightLevel = ReadU16(DatFile); iType.LightColor = ReadU16(DatFile); break; case 0x11: // can see what is under (ladder holes, stairs holes etc) sType.FloorTransparent = true; break; case 0x12: // ground tiles that don't cause level change iType.DontFallThrough = true; break; case 0x13: // mostly blocking items, but also items that can pile up in level (boxes, chairs etc) iType.HasHeight = true; sType.RenderHeight = ReadU16(DatFile); break; case 0x14: // player color templates sType.RenderOffset = -8; if (ID >=ItemCount) sType.ColorTemplate = true; break; case 0x18: // cropses that don't decay iType.StaticCorpse = true; break; case 0x16: // Blocking items, most ground //Log.Debug("Unknown attribute 0x16 - " + ID, this); ReadU16(DatFile); break; case 0x17: // seems like decorables with 4 states of turning (exception first 4 are unique statues) iType.CanTurn = true; break; case 0x19: // wall items iType.IsWall = true; break; case 0x1A: // House walls, horizontal and corner, maybe CIP uses them only in houses? break; case 0x1B: // walls 2 types of them same material (total 4 pairs) break; case 0x1C: // Creature related, draw health bar with offset perhaps? sType.HealthOffset = 16; break; case 0x1D: // line spot ... iType.IsFloorChanger = true; // Always between 1100 and 1115~ ReadU16(DatFile); //Log.Debug("Unknown attribute 0x1D - " + ID + " - " + ReadU16(file), this); break; case 0xFF: break; default: throw new System.IO.IOException("Malformed metadata file."); } } } while(optbyte != 0xFF); // Size and GameSprite data sType.Width = DatFile.ReadByte(); sType.Height = DatFile.ReadByte(); if((sType.Width > 1) || (sType.Height > 1)){ DatFile.ReadByte(); // Pointless? } sType.BlendFrames = DatFile.ReadByte(); sType.XDiv = DatFile.ReadByte(); sType.YDiv = DatFile.ReadByte(); // 7.6 + // sType.ZDiv = file.ReadByte(); // Is this ever used? Maybe it means something else? sType.AnimationLength = DatFile.ReadByte(); // Read the sprite ids for(int i = 0; i < sType.SpriteCount; ++i) { UInt16 SpriteID = ReadU16(DatFile); GameImage img = GetImage(SpriteID); if(img == null) { img = new GameImage(this, SpriteID); Images[SpriteID] = img; } sType.Images.Add(img); } ++ID; } }
public TibiaGameData(Stream DatFile, Stream SpriteFile) { this.SpriteFile = SpriteFile; SprVersion = ReadU32(SpriteFile); DatVersion = ReadU32(DatFile); //get max id ItemCount = ReadU16(DatFile); CreatureCount = ReadU16(DatFile); EffectCount = ReadU16(DatFile); DistanceCount = ReadU16(DatFile); UInt16 MinClientID = 100; // tibia.dat start with id 100 // We don't load distance/effects, if we would, just add effect_count & distance_count here UInt16 MaxClientID = (UInt16)((int)ItemCount + (int)CreatureCount + (int)EffectCount + (int)DistanceCount); UInt16 ID = MinClientID; // loop through all ItemDatabase until we reach the end of file while (ID <= MaxClientID) { GameSprite sType = new GameSprite(ID); ItemType iType = new ItemType(ID, sType); Sprites[ID] = sType; Items[ID] = iType; // Is it an effect? if (ID >= ItemCount + CreatureCount) { sType.AnimationSpeed = 100; } if (ID >= ItemCount && ID < ItemCount + CreatureCount) { } ; // sType.RenderOffset = -16; // read the options until we find a 0xff byte lastopt; byte optbyte = 0xff; do { lastopt = optbyte; optbyte = (byte)DatFile.ReadByte(); { //7.4 switch (optbyte) { case 0x00: //is groundtile iType.IsGround = true; iType.WalkSpeed = ReadU16(DatFile); iType.AlwaysOnTop = 0; break; case 0x01: // all OnTop iType.AlwaysOnTop = 1; break; case 0x02: iType.CanSeeThrough = true; iType.AlwaysOnTop = 2; break; case 0x03: iType.IsContainer = true; break; case 0x04: iType.IsStackable = true; sType.IsStackable = true; break; case 0x05: iType.IsUseableWith = true; break; case 0x06: iType.IsLadder = true; break; case 0x07: iType.IsReadable = true; iType.IsWriteable = true; iType.MaxTextLength = ReadU16(DatFile); break; case 0x08: // writtable objects that can't be edited iType.IsReadable = true; break; case 0x09: //can contain fluids iType.IsFluidContainer = true; sType.IsFluidContainer = true; break; case 0x0A: iType.IsSplash = true; sType.IsSplash = true; break; case 0x0B: iType.IsSolid = true; break; case 0x0C: iType.Immoveable = true; //Log.Fatal("Unknown attribute 0x0C - " + ID, this); break; case 0x0D: // blocks missiles (walls, magic wall etc) iType.BlockProjectiles = true; break; case 0x0E: // blocks monster movement (flowers, parcels etc) iType.BlockPathfinding = true; break; case 0x0F: iType.CanPickup = true; break; case 0x10: iType.LightLevel = ReadU16(DatFile); iType.LightColor = ReadU16(DatFile); break; case 0x11: // can see what is under (ladder holes, stairs holes etc) sType.FloorTransparent = true; break; case 0x12: // ground tiles that don't cause level change iType.DontFallThrough = true; break; case 0x13: // mostly blocking items, but also items that can pile up in level (boxes, chairs etc) iType.HasHeight = true; sType.RenderHeight = ReadU16(DatFile); break; case 0x14: // player color templates sType.RenderOffset = -8; if (ID >= ItemCount) { sType.ColorTemplate = true; } break; case 0x18: // cropses that don't decay iType.StaticCorpse = true; break; case 0x16: // Blocking items, most ground //Log.Debug("Unknown attribute 0x16 - " + ID, this); ReadU16(DatFile); break; case 0x17: // seems like decorables with 4 states of turning (exception first 4 are unique statues) iType.CanTurn = true; break; case 0x19: // wall items iType.IsWall = true; break; case 0x1A: // House walls, horizontal and corner, maybe CIP uses them only in houses? break; case 0x1B: // walls 2 types of them same material (total 4 pairs) break; case 0x1C: // Creature related, draw health bar with offset perhaps? sType.HealthOffset = 16; break; case 0x1D: // line spot ... iType.IsFloorChanger = true; // Always between 1100 and 1115~ ReadU16(DatFile); //Log.Debug("Unknown attribute 0x1D - " + ID + " - " + ReadU16(file), this); break; case 0xFF: break; default: throw new System.IO.IOException("Malformed metadata file."); } } } while(optbyte != 0xFF); // Size and GameSprite data sType.Width = DatFile.ReadByte(); sType.Height = DatFile.ReadByte(); if ((sType.Width > 1) || (sType.Height > 1)) { DatFile.ReadByte(); // Pointless? } sType.BlendFrames = DatFile.ReadByte(); sType.XDiv = DatFile.ReadByte(); sType.YDiv = DatFile.ReadByte(); // 7.6 + // sType.ZDiv = file.ReadByte(); // Is this ever used? Maybe it means something else? sType.AnimationLength = DatFile.ReadByte(); // Read the sprite ids for (int i = 0; i < sType.SpriteCount; ++i) { UInt16 SpriteID = ReadU16(DatFile); GameImage img = GetImage(SpriteID); if (img == null) { img = new GameImage(this, SpriteID); Images[SpriteID] = img; } sType.Images.Add(img); } ++ID; } }