コード例 #1
0
        protected virtual void OnPixelCoordinatesChanged(CoordinatesEventArgs e)
        {
            EventHandler <CoordinatesEventArgs> handler = PixelCoordinatesChanged;

            if (handler != null)
            {
                handler(this, e);
            }
        }
コード例 #2
0
        private void NewChar_PixelDown(object sender, CoordinatesEventArgs e)
        {
            if (currentChartTool != CharTool.None)
            {
                var newPoint = GetCoordinates(Array.IndexOf(chars, (CharEditor)sender));
                newPoint.X = newPoint.X + e.Coordinates.X;
                newPoint.Y = newPoint.Y + e.Coordinates.Y;

                if (currentPoint == null)
                {
                    currentPoint = newPoint;
                    set          = e.Set;
                }
                else if (set != e.Set)
                {
                    currentPoint = null;
                }
                else
                {
                    List <Point> points = new List <Point>();
                    if (currentChartTool == CharTool.Line || currentChartTool == CharTool.Multiline)
                    {
                        points = ComputeLine(currentPoint.Value.X, currentPoint.Value.Y, newPoint.X, newPoint.Y);
                    }
                    else if (currentChartTool == CharTool.Circle)
                    {
                        points = ComputeCircle(currentPoint.Value.X, currentPoint.Value.Y, newPoint.X, newPoint.Y);
                    }

                    if (currentChartTool == CharTool.Circle)
                    {
                        int idx  = GetIndexPixel(currentPoint.Value.X, currentPoint.Value.Y);
                        var edit = chars[idx];
                        edit.ClearPixel(currentPoint.Value.X % 8, currentPoint.Value.Y % 8);
                        idx  = GetIndexPixel(newPoint.X, newPoint.Y);
                        edit = chars[idx];
                        edit.ClearPixel(newPoint.X % 8, newPoint.Y % 8);
                    }

                    foreach (var point in points)
                    {
                        if (point.X >= CharWidth * 8 || point.Y >= CharHeight * 8 || point.X < 0 || point.Y < 0)
                        {
                            continue;
                        }

                        int idx = GetIndexPixel(point.X, point.Y);

                        var edit = chars[idx];
                        if (set)
                        {
                            edit.SetPixel(point.X % 8, point.Y % 8);
                        }
                        else
                        {
                            edit.ClearPixel(point.X % 8, point.Y % 8);
                        }
                    }

                    if (currentChartTool == CharTool.Line || currentChartTool == CharTool.Circle)
                    {
                        currentPoint = null;
                    }
                    else
                    {
                        currentPoint = newPoint;
                    }
                }
            }
        }
コード例 #3
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void OpenDoor(object sender, CoordinatesEventArgs eventArgs)
        {
            Contract.Requires(CurrentState == State.WaitForPerformAction);
            Contract.Requires(Player.Instance.HeroParty.Heroes[eventArgs.SenderId].MovementLeft >= 2);
            Contract.Ensures(CurrentState == State.WaitForPerformAction);

            Hero hero = Player.Instance.HeroParty.Heroes[eventArgs.SenderId];

            FullModel.Board.OpenDoor(new Point(eventArgs.X, eventArgs.Y));
            hero.RemoveMovement(2);

            stateMachine.PlaceStates(State.OpenDoor);
            stateMachine.ChangeToNextState();
            ActionDone();
        }
コード例 #4
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void AttackSquare(object sender, CoordinatesEventArgs eventArgs)
        {
            Contract.Requires(eventArgs.SenderId == gameState.CurrentPlayer);
            Contract.Requires(CurrentState == State.WaitForPerformAction);
            Contract.Ensures(CurrentState == State.WaitForRollDice);

            Figure attacker;
            if (IsAHeroTurn())
            {
                attacker = Player.Instance.HeroParty.Heroes[gameState.CurrentPlayer];
            }
            else
            {
                attacker = currentMonster;
            }

            gameState.CurrentAttack = attacker.GetAttack(new Point(eventArgs.X, eventArgs.Y));

            attacker.RemoveAttack();

            stateMachine.PlaceStates(State.Attack, State.WaitForRollDice, State.WaitForDiceChoice, State.InflictWounds, State.WaitForPerformAction);
            stateMachine.ChangeToNextState();
            stateMachine.ChangeToNextState();
        }
コード例 #5
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void MoveTo(object sender, CoordinatesEventArgs eventArgs)
        {
            Contract.Requires(CurrentState == State.WaitForPerformAction);
            Contract.Requires(IsAHeroTurn() ? Player.Instance.HeroParty.Heroes[eventArgs.SenderId].MovementLeft >= 1 :
                              currentMonster.MovementLeft >= 1);
            Contract.Ensures(CurrentState == State.WaitForPerformAction);

            Figure figure;
            if (Player.Instance.HeroParty.Heroes.ContainsKey(eventArgs.SenderId))
            {
                figure = Player.Instance.HeroParty.Heroes[eventArgs.SenderId];
            }
            else
            {
                figure = currentMonster;
            }

            FullModel.Board.MoveFigure(figure, new Point(eventArgs.X, eventArgs.Y));
            figure.RemoveMovement(1);

            // The current monster should be marked both for overlord and player.
            MarkMonsters();

            stateMachine.PlaceStates(State.MoveAdjecent);
            stateMachine.ChangeToNextState();
            ActionDone();
        }
コード例 #6
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void WasKilled(object sender, CoordinatesEventArgs eventArgs)
        {
            Contract.Requires(CurrentState == State.InflictWounds);
            Contract.Requires(FullModel.Board[eventArgs.X, eventArgs.Y].Figure != null);
            Contract.Ensures(CurrentState == Contract.OldValue(CurrentState) || CurrentState == State.EndGameHeroParty || CurrentState == State.EndGameOverlord);

            Figure figure = FullModel.Board[eventArgs.X, eventArgs.Y].Figure;

            FullModel.Board.RemoveFigure(new Point(eventArgs.X, eventArgs.Y));

            if (figure is Hero)
            {
                var hero = (Hero)figure;
                hero.Initialize();
                hero.Coins = (int)Math.Floor((double)hero.Coins / 2 / 25) * 25; // Floor to nearest % 25;
                Player.Instance.HeroParty.RemoveConquestTokens(hero.Cost);
                if (Player.Instance.HeroParty.IsConquestPoolEmpty)
                {
                    GameWon(false);
                    return;
                }
            }
            else
            {
                gameState.LegendaryMonsters.Remove((Monster)figure);
                if (gameState.LegendaryMonsters.Count == 0)
                {
                    GameWon(true);
                    return;
                }
            }

            if (HasTurn())
            {
                DamageDone(new Point(eventArgs.X, eventArgs.Y));
            }
        }
コード例 #7
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void StartMonsterTurn(object sender, CoordinatesEventArgs eventArgs)
        {
            Contract.Requires(CurrentState == State.WaitForOverlordChooseAction);
            Contract.Ensures(CurrentState == State.WaitForPerformAction);

            // Record monsterId
            currentMonster = (Monster)FullModel.Board[eventArgs.X, eventArgs.Y].Figure;

            stateMachine.PlaceStates(State.MonsterTurn);
            stateMachine.ChangeToNextState();
            MonsterTurnInitiation();
        }
コード例 #8
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void SquareMarked(object sender, CoordinatesEventArgs eventArgs)
        {
            if (!HasTurn() && CurrentState != State.WaitForChooseSquare)
            {
                return;
            }

            switch (CurrentState)
            {
                case State.WaitForChooseSquare:
                    if (playersRemainingTurn.Contains(Player.Instance.Id))
                    {
                        eventManager.QueueEvent(EventType.RequestPlacement, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                    }

                    break;
                case State.WaitForPerformAction:
                    Figure figure;
                    if (Player.Instance.IsOverlord)
                    {
                        figure = currentMonster;
                    }
                    else
                    {
                        figure = Player.Instance.Hero;
                    }

                    Point standingPoint = FullModel.Board.FiguresOnBoard[figure];

                    if (FullModel.Board.IsSquareWithinBoard(new Point(eventArgs.X, eventArgs.Y)) && FullModel.Board.Distance(standingPoint, new Point(eventArgs.X, eventArgs.Y)) == 1)
                    {
                        // Move to adjecent
                        // If a an entire figure can move to the square
                        if (FullModel.Board.CanFigureMoveToPoint(figure, new Point(eventArgs.X, eventArgs.Y)) && figure.MovementLeft >= 1)
                        {
                            eventManager.QueueEvent(EventType.MoveTo, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                        }

                        // Open door
                        else if (figure is Hero && FullModel.Board.CanOpenDoor(new Point(eventArgs.X, eventArgs.Y)) &&
                            FullModel.Board.CanOpenDoor(standingPoint) && figure.MovementLeft >= 2)
                        {
                            eventManager.QueueEvent(EventType.OpenDoor, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                        }
                    }
                    else if (FullModel.Board.Distance(standingPoint, new Point(eventArgs.X, eventArgs.Y)) == 0 && figure is Hero && FullModel.Board[eventArgs.X, eventArgs.Y].Marker != null)
                    {
                        Marker marker = FullModel.Board[eventArgs.X, eventArgs.Y].Marker;

                        if (figure.MovementLeft >= marker.MovementPoints)
                        {
                            if (marker is PotionMarker)
                            {
                                if (!Player.Instance.Hero.Inventory.CanEquipPotion) return;
                            }

                            eventManager.QueueEvent(EventType.PickupMarker, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                        }
                    }

                    if (figure.AttacksLeft > 0 && FullModel.Board.IsSquareWithinBoard(new Point(eventArgs.X, eventArgs.Y)) &&
                        FullModel.Board.Distance(standingPoint, new Point(eventArgs.X, eventArgs.Y)) >= 1 &&
                        (FullModel.Board[eventArgs.X, eventArgs.Y] != null &&
                        (FullModel.Board[eventArgs.X, eventArgs.Y].Figure != null &&
                        FullModel.Board.IsThereLineOfSight(figure, FullModel.Board[eventArgs.X, eventArgs.Y].Figure, false))))
                    {
                        // A figure is trying to attack another figure.
                        if (Player.Instance.HeroParty.Heroes.ContainsKey(eventArgs.SenderId))
                        {
                            // A player is attacking
                            Hero hero = Player.Instance.HeroParty.Heroes[eventArgs.SenderId];
                            Figure target = FullModel.Board[eventArgs.X, eventArgs.Y].Figure;

                            if (target is Hero)
                            {
                                return; // Do not allow attack if target is hero.
                            }

                            if (hero.Inventory.Weapon == null)
                            {
                                return; // Do not allow attack if hero does not have weapon
                            }

                            if (hero.AttackType == EAttackType.MELEE)
                            {
                                // If the player has a melee weapon, he should be adjacent to the figure he is attacking.
                                if (FullModel.Board.Distance(FullModel.Board.FiguresOnBoard[hero], new Point(eventArgs.X, eventArgs.Y)) == 1)
                                {
                                    // Hero is adjacent to target figure, carry on with attack.
                                    eventManager.QueueEvent(EventType.AttackSquare, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                                }
                            }
                            else if (hero.AttackType == EAttackType.MAGIC || hero.AttackType == EAttackType.RANGED)
                            {
                                // If attack type is magic or ranged, always allow attack.
                                eventManager.QueueEvent(EventType.AttackSquare, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                            }
                        }
                        else
                        {
                            if (FullModel.Board[eventArgs.X, eventArgs.Y].Figure is Monster)
                            {
                                return; // A monster is trying to attack another monster. No go!
                            }

                            if (figure.AttackType == EAttackType.MELEE)
                            {
                                // If the monster has a melee weapon, he should be adjacent to the gero he is attacking.
                                if (FullModel.Board.Distance(FullModel.Board.FiguresOnBoard[figure], new Point(eventArgs.X, eventArgs.Y)) == 1)
                                {
                                    // Monster is adjacent to target figure, carry on with attack.
                                    eventManager.QueueEvent(EventType.AttackSquare, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                                }
                            }
                            else if (figure.AttackType == EAttackType.MAGIC || figure.AttackType == EAttackType.RANGED)
                            {
                                // If attack type is magic or ranged, always allow attack.
                                eventManager.QueueEvent(EventType.AttackSquare, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                            }
                        }
                    }

                    break;
                case State.WaitForOverlordChooseAction:

                    if (FullModel.Board.IsSquareWithinBoard(eventArgs.X, eventArgs.Y))
                    {
                        Square s = FullModel.Board[eventArgs.X, eventArgs.Y];

                        // If a square with a monster is pressed in an overlord turn and we are the overlord, a monster turn should begin.
                        if (Player.Instance.IsOverlord && s.Figure != null && s.Figure is Monster && FullModel.Board.SquareVisibleByPlayers(eventArgs.X, eventArgs.Y) && monstersRemaining.Contains(s.Figure))
                        {
                            eventManager.QueueEvent(EventType.StartMonsterTurn, new CoordinatesEventArgs(eventArgs.X, eventArgs.Y));
                        }
                    }

                    break;
            }
        }
コード例 #9
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
        private void RequestPlacement(object sender, CoordinatesEventArgs eventArgs)
        {
            Contract.Requires(CurrentState == State.WaitForChooseSquare);
            Contract.Ensures(CurrentState == State.WaitForChooseSquare);

            if (Player.Instance.IsServer && FullModel.Board.IsValidStartSquare(new Point(eventArgs.X, eventArgs.Y)))
            {
                eventManager.QueueEvent(EventType.PlaceHero, new PlaceHeroEventArgs(eventArgs.SenderId, eventArgs.X, eventArgs.Y));
            }
        }
コード例 #10
0
ファイル: StateManager.cs プロジェクト: nezbo/Descent
 private void PickupMarker(object sender, CoordinatesEventArgs eventArgs)
 {
     Contract.Requires(CurrentState == State.WaitForPerformAction);
     Contract.Ensures(CurrentState == State.WaitForPerformAction);
     FullModel.Board[eventArgs.X, eventArgs.Y].Marker.PickUp(Player.Instance.HeroParty.Heroes[eventArgs.SenderId]);
     if (!(FullModel.Board[eventArgs.X, eventArgs.Y].Marker is GlyphMarker))
     {
         FullModel.Board[eventArgs.X, eventArgs.Y].Marker = null;
     }
 }