Exemplo n.º 1
0
        public void Seed(Actor self)
        {
            var cell = Util.RandomWalk(self.Location, self.World.SharedRandom)
                       .Take(info.MaxRange)
                       .SkipWhile(p => resourceLayer.GetResource(p).Type == info.ResourceType && !resourceLayer.CanAddResource(info.ResourceType, p))
                       .Cast <CPos?>().FirstOrDefault();

            if (cell != null && resourceLayer.CanAddResource(info.ResourceType, cell.Value))
            {
                resourceLayer.AddResource(info.ResourceType, cell.Value);
            }
        }
Exemplo n.º 2
0
        public void Flood(Actor self)
        {
            var waveFront = Util.ExpandFootprint(cells, true)
                            .Take(info.MaxRange)
                            .SkipWhile(p => !self.World.Map.Contains(p) ||
                                       (resourceLayer.GetResource(p).Type == info.ResourceType))
                            .ToArray();

            foreach (var cell in waveFront)
            {
                if (resourceLayer.CanAddResource(info.ResourceType, cell))
                {
                    cells.Add(cell);
                    resourceLayer.AddResource(info.ResourceType, cell, 1);
                }
            }
        }
Exemplo n.º 3
0
        public bool HandleMouseInput(MouseInput mi)
        {
            // Exclusively uses left and right mouse buttons, but nothing else
            if (mi.Button != MouseButton.Left && mi.Button != MouseButton.Right)
            {
                return(false);
            }

            if (mi.Button == MouseButton.Right)
            {
                if (mi.Event == MouseInputEvent.Up)
                {
                    editorWidget.ClearBrush();
                    return(true);
                }

                return(false);
            }

            if (editorCursor.CurrentToken != cursorToken)
            {
                return(false);
            }

            var cell = worldRenderer.Viewport.ViewToWorld(mi.Location);

            if (mi.Button == MouseButton.Left && mi.Event != MouseInputEvent.Up && resourceLayer.CanAddResource(ResourceType, cell))
            {
                action.Add(new CellResource(cell, resourceLayer.GetResource(cell), ResourceType));
                resourceAdded = true;
            }
            else if (resourceAdded && mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Up)
            {
                editorActionManager.Add(action);
                action        = new AddResourcesEditorAction(world.Map, ResourceType, resourceLayer);
                resourceAdded = false;
            }

            return(true);
        }
Exemplo n.º 4
0
        void SeedResources(Actor self)
        {
            var pieces = self.World.SharedRandom.Next(info.Pieces[0], info.Pieces[1]) * ticks / growTicks;

            if (pieces < info.Pieces[0])
            {
                pieces = info.Pieces[0];
            }

            var cells = self.World.Map.FindTilesInAnnulus(self.Location, 1, info.Range);

            for (var i = 0; i < pieces; i++)
            {
                var cell = cells
                           .SkipWhile(p => resourceLayer.GetResource(p).Type == info.ResourceType && !resourceLayer.CanAddResource(info.ResourceType, p))
                           .Cast <CPos?>()
                           .RandomOrDefault(self.World.SharedRandom);

                if (cell == null)
                {
                    cell = cells.Random(self.World.SharedRandom);
                }

                var args = new ProjectileArgs
                {
                    Weapon = self.World.Map.Rules.Weapons[info.Weapon.ToLowerInvariant()],
                    Facing = WAngle.Zero,
                    CurrentMuzzleFacing = () => WAngle.Zero,

                    DamageModifiers = self.TraitsImplementing <IFirepowerModifier>()
                                      .Select(a => a.GetFirepowerModifier()).ToArray(),

                    InaccuracyModifiers = self.TraitsImplementing <IInaccuracyModifier>()
                                          .Select(a => a.GetInaccuracyModifier()).ToArray(),

                    RangeModifiers = self.TraitsImplementing <IRangeModifier>()
                                     .Select(a => a.GetRangeModifier()).ToArray(),

                    Source        = self.CenterPosition,
                    CurrentSource = () => self.CenterPosition,
                    SourceActor   = self,
                    PassiveTarget = self.World.Map.CenterOfCell(cell.Value)
                };

                self.World.AddFrameEndTask(_ =>
                {
                    if (args.Weapon.Projectile != null)
                    {
                        var projectile = args.Weapon.Projectile.Create(args);
                        if (projectile != null)
                        {
                            self.World.Add(projectile);
                        }

                        if (args.Weapon.Report != null && args.Weapon.Report.Any())
                        {
                            Game.Sound.Play(SoundType.World, args.Weapon.Report, self.World, self.CenterPosition);
                        }
                    }
                });
            }
        }