/// <summary> /// Gets item a random frame id if item is a multiframe item /// Registers an animation runnter for the item, if it is animated /// </summary> /// <param name="variantBase">The base item of the specific item</param> /// <param name="tileX">X Position of the item</param> /// <param name="tileY">Y Position of the item</param> /// <param name="unitySprite">Sprite which is animated or multiframed</param> /// <returns>Current frame id to be used by the sprite</returns> private int SetupMultiFrameItem(VariantObjectBase variantBase, int tileX, int tileY, SpriteRenderer unitySprite) { if (!variantBase.IsAnimated) { return(variantBase.GetFrameId(MapVariance.GetItemFrameVariance(tileX, tileY, variantBase.FrameCount))); } if (!animationRunners.TryGetValue(variantBase, out var animationRunner)) { animationRunner = new AnimationRunner(variantBase, variantBase.InitialId); animationRunners.Add(variantBase, animationRunner); } animationRunner.RegisterAnimatedSprite(unitySprite); return(variantBase.InitialId); }
public AnimationRunner(VariantObjectBase animationBase, int animationId) { registeredSprites = new List <SpriteRenderer>(); currentId = animationId; animationInfo = animationBase; }
/// <summary> /// Extracts item game data from the item server data file and transforms them into map objects. /// Saves the mapobjects together with their corresponding server id as a file. /// </summary> /// <param name="itemNameToLocalIds">Dictionary matching item names to local object ids</param> /// <param name="localIdToCorrectionOffsets">Dictionary containing local offsets for local object ids</param> public void CreateItemBaseFile(Dictionary <string, int> itemNameToLocalIds, Dictionary <int, int[]> localIdToCorrectionOffsets) { var tableFile = Resources.Load <TextAsset>(Constants.Update.ItemTablePath); if (tableFile == null) { throw new FileNotFoundException($"Failed opening intern tile table at {Constants.Update.ItemTablePath}!"); } Dictionary <int, MapObjectBase> serverIdToItemBase = new Dictionary <int, MapObjectBase>(); using (var lineReader = new StringReader(tableFile.text)) { string line; while ((line = lineReader.ReadLine()) != null) { if (line.Equals("")) { break; } if (line.StartsWith("#") || line.StartsWith("/")) { continue; } string[] rowValues = line.Split(new char[] { ',' }, StringSplitOptions.None); int serverId = int.Parse(rowValues[Constants.Update.ItemIdColumn]); string itemName = FormatName(rowValues[Constants.Update.ItemNameColumn]); int itemMode = int.Parse(rowValues[Constants.Update.ItemModeColumn]); int itemFrameCount = int.Parse(rowValues[Constants.Update.ItemFrameCountColumn]); float baseOffsetX = int.Parse(rowValues[Constants.Update.ItemOffsetXColumn]); float baseOffsetY = int.Parse(rowValues[Constants.Update.ItemOffsetYColumn]); float scaleVariance = int.Parse(rowValues[Constants.Update.ItemScalingColumn]) / 100f; int emittedLight = int.Parse(rowValues[Constants.Update.ItemLightEmitColumn]); float colorModRed = int.Parse(rowValues[Constants.Update.ItemColorModRedColumn]) / 255f; float colorModGreen = int.Parse(rowValues[Constants.Update.ItemColorModGreenColumn]) / 255f; float colorModBlue = int.Parse(rowValues[Constants.Update.ItemColorModBlueColumn]) / 255f; float colorModAlpha = int.Parse(rowValues[Constants.Update.ItemColorModAlphaColumn]) / 255f; float height = int.Parse(rowValues[Constants.Update.ItemSurfaceLevelColumn]) / (float)Constants.Tile.SizeX; int[] localIds = LocalIdsFromName(itemName, itemNameToLocalIds); MapObjectBase mapObject; if (itemMode == (int)Constants.ItemMode.Simple) { mapObject = new SimpleObjectBase( localIds[0], CorrectBaseOffset(baseOffsetX, baseOffsetY, localIdToCorrectionOffsets, localIds[0]), colorModRed, colorModGreen, colorModBlue, colorModAlpha, scaleVariance, emittedLight, height); } else { float[] offsetX = new float[itemFrameCount]; float[] offsetY = new float[itemFrameCount]; for (int i = 0; i < itemFrameCount; i++) { var itemVarianceName = itemName + "-" + i; var correctedOffsets = CorrectBaseOffset(baseOffsetX, baseOffsetY, localIdToCorrectionOffsets, localIds[0]); offsetX[i] = correctedOffsets[0]; offsetY[i] = correctedOffsets[1]; } float animationSpeed = int.Parse(rowValues[Constants.Update.ItemAnimationSpeedColumn]) / 100f; mapObject = new VariantObjectBase( localIds, offsetX, offsetY, animationSpeed, colorModRed, colorModGreen, colorModBlue, colorModAlpha, scaleVariance, emittedLight, height); } if (serverIdToItemBase.ContainsKey(serverId)) { Debug.Log("Tried to save a single item serverId twice in the mapping file!"); continue; } serverIdToItemBase.Add(serverId, mapObject); } } BinaryFormatter binaryFormatter = new BinaryFormatter(); FileInfo fileInfo = new FileInfo(String.Concat(Game.FileSystem.UserDirectory, Constants.Update.ItemBaseFileName)); using (var file = fileInfo.Create()) { binaryFormatter.Serialize(file, serverIdToItemBase); file.Flush(); } }