static BattleEffectInfo CreateFlyingEffect(IRenderView renderView, uint sourceTile, uint targetTile, CombatGraphicIndex graphicIndex, Character[] battleField, float baseScale = 1.0f) { var info = renderView.GraphicProvider.GetCombatGraphicInfo(graphicIndex); var startPosition = GetProjectileTargetPosition(renderView, sourceTile, battleField); var endPosition = GetProjectileTargetPosition(renderView, targetTile, battleField); var sourceScale = GetScaleFromRow(renderView, sourceTile, battleField); var targetScale = GetScaleFromRow(renderView, targetTile, battleField); int maxY = Global.CombatBackgroundArea.Bottom; if (startPosition.Y > maxY) { startPosition.Y = maxY; } if (endPosition.Y > maxY) { endPosition.Y = maxY; } return(new BattleEffectInfo { StartPosition = startPosition, EndPosition = endPosition, StartScale = sourceScale * baseScale, EndScale = targetScale * baseScale, StartTextureIndex = Graphics.CombatGraphicOffset + (uint)graphicIndex, FrameSize = new Size(info.GraphicInfo.Width, info.GraphicInfo.Height), FrameCount = info.FrameCount, Duration = GetFlyDuration(sourceTile, targetTile), InitialDisplayLayer = (byte)Math.Min(255, (sourceTile / 6) * 60 + 60), // display over the given row EndDisplayLayer = (byte)Math.Min(255, (targetTile / 6) * 60 + 60), // display over the given row MirrorX = battleField[(int)sourceTile] is Monster ? startPosition.X <endPosition.X : startPosition.X> endPosition.X }); }
static BattleEffectInfo CreateSimpleEffect(IRenderView renderView, uint tile, CombatGraphicIndex graphicIndex, Character[] battleField, uint duration, Func <bool, int> yOffsetProvider = null, float scale = 1.0f, bool ground = false) { var info = renderView.GraphicProvider.GetCombatGraphicInfo(graphicIndex); var position = GetCenterPosition(renderView, tile, battleField, yOffsetProvider?.Invoke(battleField[tile] is Monster) ?? 0); scale *= GetScaleFromRow(renderView, tile, battleField); if (ground && battleField[tile] is Monster) { var offsetY = yOffsetProvider?.Invoke(true) ?? 0; var groundPositionY = Layout.GetMonsterCombatGroundPosition(renderView, (int)tile).Y + offsetY; int effectHeight = Util.Round(scale * info.GraphicInfo.Height); position.Y = groundPositionY - effectHeight / 2; } return(new BattleEffectInfo { StartPosition = position, EndPosition = position, StartScale = scale, EndScale = scale, StartTextureIndex = Graphics.CombatGraphicOffset + (uint)graphicIndex, FrameSize = new Size(info.GraphicInfo.Width, info.GraphicInfo.Height), FrameCount = info.FrameCount, Duration = duration, InitialDisplayLayer = (byte)Math.Min(255, (tile / 6) * 60 + 60), // display over the given row EndDisplayLayer = (byte)Math.Min(255, (tile / 6) * 60 + 60), // display over the given row MirrorX = false }); }
static BattleEffectInfo CreateSimpleEffect(IRenderView renderView, uint sourceTile, uint targetTile, CombatGraphicIndex graphicIndex, Character[] battleField, uint duration, float startScale = 1.0f, float scaleChangePerY = 0.0f) { var info = renderView.GraphicProvider.GetCombatGraphicInfo(graphicIndex); var startPosition = GetCenterPosition(renderView, sourceTile, battleField); var endPosition = GetCenterPosition(renderView, targetTile, battleField); float endScale = startScale + (endPosition.Y - startPosition.Y) * scaleChangePerY; return(new BattleEffectInfo { StartPosition = startPosition, EndPosition = endPosition, StartScale = startScale, EndScale = endScale, StartTextureIndex = Graphics.CombatGraphicOffset + (uint)graphicIndex, FrameSize = new Size(info.GraphicInfo.Width, info.GraphicInfo.Height), FrameCount = info.FrameCount, Duration = duration, InitialDisplayLayer = (byte)Math.Min(255, (sourceTile / 6) * 60 + 60), // display over the given row EndDisplayLayer = (byte)Math.Min(255, (sourceTile / 6) * 60 + 60), // display over the given row MirrorX = false }); }