Пример #1
0
        public void RedrawOreAndGems()
        {
            var tileCollection = _theater.GetTileCollection();
            var checkFunc      = new Func <OverlayObject, bool>(delegate(OverlayObject ovl) {
                return(SpecialOverlays.GetOverlayTibType(ovl, Engine) != OverlayTibType.NotSpecial);
            });

            // first redraw all required tiles (zigzag method)
            for (int y = 0; y < FullSize.Height; y++)
            {
                for (int x = FullSize.Width * 2 - 2; x >= 0; x -= 2)
                {
                    if (_tiles[x, y].AllObjects.OfType <OverlayObject>().Any(checkFunc))
                    {
                        _theater.Draw(_tiles.GetTile(x, y), _drawingSurface);
                    }
                }
                for (int x = FullSize.Width * 2 - 3; x >= 0; x -= 2)
                {
                    if (_tiles[x, y].AllObjects.OfType <OverlayObject>().Any(checkFunc))
                    {
                        _theater.Draw(_tiles.GetTile(x, y), _drawingSurface);
                    }
                }
            }
            for (int y = 0; y < FullSize.Height; y++)
            {
                for (int x = FullSize.Width * 2 - 2; x >= 0; x -= 2)
                {
                    if (_tiles[x, y].AllObjects.OfType <OverlayObject>().Any(checkFunc))
                    {
                        List <GameObject> objs = GetObjectsAt(x, y);
                        foreach (GameObject o in objs)
                        {
                            _theater.Draw(o, _drawingSurface);
                        }
                    }
                }
                for (int x = FullSize.Width * 2 - 3; x >= 0; x -= 2)
                {
                    if (_tiles[x, y].AllObjects.OfType <OverlayObject>().Any(checkFunc))
                    {
                        List <GameObject> objs = GetObjectsAt(x, y);
                        foreach (GameObject o in objs)
                        {
                            _theater.Draw(o, _drawingSurface);
                        }
                    }
                }
            }
        }
Пример #2
0
        public void MarkOreAndGems()
        {
            Logger.Info("Marking ore and gems");
            var markerPalettes = new Dictionary <OverlayTibType, Palette>();

            // init sensible defaults
            if (Engine >= EngineType.RedAlert2)
            {
                markerPalettes[OverlayTibType.Ore]  = Palette.MakePalette(Color.Yellow);
                markerPalettes[OverlayTibType.Gems] = Palette.MakePalette(Color.Purple);
            }

            // read [Tiberiums] for names or different tiberiums, and the [Color] entry (for TS)
            // for their corresponding "remapped" color. In RA2 this isn't actually used,
            // but made available for the renderer's preview functionality through a key "MapRendererColor"
            var tiberiums = _rules.GetOrCreateSection("Tiberiums").OrderedEntries.Select(kvp => kvp.Value).ToList();
            var remaps    = tiberiums.Select(tib => _rules.GetOrCreateSection(tib)
                                             .ReadString(Engine >= EngineType.RedAlert2 ? "MapRendererColor" : "Color")).ToList();

            // override defaults if specified in rules
            for (int i = 0; i < tiberiums.Count; i++)
            {
                OverlayTibType type       = (OverlayTibType)Enum.Parse(typeof(OverlayTibType), tiberiums[i]);
                string         namedColor = remaps[i];
                if (_namedColors.ContainsKey(namedColor))
                {
                    markerPalettes[type] = Palette.MakePalette(_namedColors[namedColor]);
                }
            }

            // apply the 'marking' by replacing the tile containing ore by a partly
            // transparent version of its original, merged with a palette of solely
            // the color of the tiberium kind stored on it
            foreach (var o in _overlayObjects)
            {
                if (o == null)
                {
                    continue;
                }
                var ovlType = SpecialOverlays.GetOverlayTibType(o, Engine);
                if (!markerPalettes.ContainsKey(ovlType))
                {
                    continue;
                }

                double opacityBase = ovlType == OverlayTibType.Ore && Engine == EngineType.RedAlert2 ? 0.3 : 0.15;
                double opacity     = Math.Max(0, 12 - o.OverlayValue) / 11.0 * 0.5 + opacityBase;
                o.Tile.Palette = Palette.Merge(o.Tile.Palette, markerPalettes[ovlType], opacity);
                o.Palette      = Palette.Merge(o.Palette, markerPalettes[ovlType], opacity);
            }
        }
Пример #3
0
        private void ApplyRemappables()
        {
            int before = _palettesToBeRecalculated.Count;

            foreach (OwnableObject obj in _structureObjects.Cast <OwnableObject>().Union(_unitObjects).Union(_aircraftObjects).Union(_infantryObjects))
            {
                var g = obj as GameObject;
                if (g != null & g.Drawable != null && g.Drawable.IsRemapable)
                {
                    if (g.Palette.IsShared)                     // don't wanna touch somebody elses palette..
                    {
                        g.Palette = g.Palette.Clone();
                    }
                    var color = _countryColors.ContainsKey(obj.Owner) ? _countryColors[obj.Owner] : _countryColors.First().Value;
                    g.Palette.Remap(color);
                    _palettesToBeRecalculated.Add(g.Palette);
                }
            }

            // TS needs tiberium remapped
            if (Engine <= EngineType.Firestorm)
            {
                var tiberiums = _rules.GetSection("Tiberiums").OrderedEntries.Select(tib => tib.Value.ToString());
                var remaps    = tiberiums.Select(tib => _rules.GetOrCreateSection(tib).ReadString("Color"));
                var tibRemaps = tiberiums.Zip(remaps, (k, v) => new { k, v }).ToDictionary(x => x.k, x => x.v);

                foreach (var ovl in _overlayObjects)
                {
                    if (ovl == null)
                    {
                        continue;
                    }
                    var tibType = SpecialOverlays.GetOverlayTibType(ovl, Engine);
                    if (tibType != OverlayTibType.NotSpecial)
                    {
                        ovl.Palette = ovl.Palette.Clone();
                        string tibName = SpecialOverlays.GetTibName(ovl, Engine);
                        if (tibRemaps.ContainsKey(tibName) && _namedColors.ContainsKey(tibRemaps[tibName]))
                        {
                            ovl.Palette.Remap(_namedColors[tibRemaps[tibName]]);
                        }
                        _palettesToBeRecalculated.Add(ovl.Palette);
                    }
                }
            }
            Logger.Debug("Determined palettes to be recalculated due to remappables ({0})",
                         _palettesToBeRecalculated.Count - before);
        }
Пример #4
0
        private void LoadOverlayDrawable(Drawable drawable)
        {
            int            objIdx  = _drawables.Count - 1;
            var            ovl     = new OverlayObject((byte)objIdx, 0);
            var            tibType = SpecialOverlays.GetOverlayTibType(ovl, Engine);
            DrawProperties props   = drawable.Props;

            if (Engine >= EngineType.RedAlert2)
            {
                if (tibType != OverlayTibType.NotSpecial)
                {
                    props.FrameDecider = FrameDeciders.OverlayValueFrameDecider;
                    props.PaletteType  = PaletteType.Overlay;
                    props.LightingType = LightingType.None;
                }
                else if (SpecialOverlays.IsHighBridge(ovl))
                {
                    props.OffsetHack       = OffsetHacks.RA2BridgeOffsets;
                    props.ShadowOffsetHack = OffsetHacks.RA2BridgeShadowOffsets;
                    drawable.TileElevation = 4;                     // for lighting
                    drawable.Foundation    = new Size(3, 1);        // ensures they're drawn later --> fixes overlap
                }
            }
            else if (Engine <= EngineType.Firestorm)
            {
                if (tibType != OverlayTibType.NotSpecial)
                {
                    props.FrameDecider   = FrameDeciders.OverlayValueFrameDecider;
                    props.PaletteType    = PaletteType.Unit;
                    props.LightingType   = LightingType.None;
                    drawable.IsRemapable = true;
                }
                else if (SpecialOverlays.IsHighBridge(ovl) || SpecialOverlays.IsTSHighRailsBridge(ovl))
                {
                    props.OffsetHack       = OffsetHacks.TSBridgeOffsets;
                    props.ShadowOffsetHack = OffsetHacks.TSBridgeShadowOffsets;
                    drawable.TileElevation = 4;                     // for lighting
                    //drawable.Foundation = new Size(3, 1); // ensures they're drawn later --> fixes overlap
                }
            }
        }