Beispiel #1
0
        protected virtual void CreateMap(DeathmatchMap Map)
        {
            DicTile3D.Clear();

            for (int X = Map.MapSize.X - 1; X >= 0; --X)
            {
                for (int Y = Map.MapSize.Y - 1; Y >= 0; --Y)
                {
                    Map.GetTerrain(X, Y, Map.ActiveLayerIndex).Position.Z = Random.Next(2) * 32;
                    float     Z = Map.GetTerrain(X, Y, Map.ActiveLayerIndex).Position.Z;
                    Vector3[] ArrayVertexPosition = new Vector3[4];
                    ArrayVertexPosition[0] = new Vector3(X * Map.TileSize.X, Z, Y * Map.TileSize.Y);
                    ArrayVertexPosition[1] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y);
                    ArrayVertexPosition[2] = new Vector3(X * Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);
                    ArrayVertexPosition[3] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);

                    Map2D        GroundLayer   = Map.ListLayer[0].OriginalLayerGrid;
                    DrawableTile ActiveTerrain = GroundLayer.GetTile(X, Y);
                    Texture2D    ActiveTileset = Map.ListTileSet[ActiveTerrain.Tileset];
                    if (!DicTile3D.ContainsKey(ActiveTileset))
                    {
                        DicTile3D.Add(ActiveTileset, new List <Tile3D>());
                    }
                    DicTile3D[ActiveTileset].Add(CreateTile3D(Map, ArrayVertexPosition, ActiveTerrain.Origin.X, ActiveTerrain.Origin.Y, X, Y, ActiveTileset.Width, ActiveTileset.Height, Radius));

                    //Create slope right
                    if (X + 1 < Map.MapSize.X)
                    {
                        float ZRight = Map.GetTerrain(X + 1, Y, Map.ActiveLayerIndex).Position.Z;
                        if (Z != ZRight)
                        {
                            Vector3[] ArrayVertexPositionRight = new Vector3[4];
                            ArrayVertexPositionRight[0] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y);
                            ArrayVertexPositionRight[2] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);
                            ArrayVertexPositionRight[1] = new Vector3((X + 1) * Map.TileSize.X, ZRight, Y * Map.TileSize.Y);
                            ArrayVertexPositionRight[3] = new Vector3((X + 1) * Map.TileSize.X, ZRight, Y * Map.TileSize.Y + Map.TileSize.Y);
                            DicTile3D[ActiveTileset].Add(CreateTile3D(Map, ArrayVertexPositionRight, ActiveTerrain.Origin.X, ActiveTerrain.Origin.Y, X, Y, ActiveTileset.Width, ActiveTileset.Height, Radius));
                        }
                    }

                    //Create slope down
                    if (Y + 1 < Map.MapSize.Y)
                    {
                        float ZDown = Map.GetTerrain(X, Y + 1, Map.ActiveLayerIndex).Position.Z;
                        if (Z != ZDown)
                        {
                            Vector3[] ArrayVertexPositionDown = new Vector3[4];
                            ArrayVertexPositionDown[0] = new Vector3(X * Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);
                            ArrayVertexPositionDown[1] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);
                            ArrayVertexPositionDown[2] = new Vector3(X * Map.TileSize.X, ZDown, (Y + 1) * Map.TileSize.Y);
                            ArrayVertexPositionDown[3] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, ZDown, (Y + 1) * Map.TileSize.Y);
                            DicTile3D[ActiveTileset].Add(CreateTile3D(Map, ArrayVertexPositionDown, ActiveTerrain.Origin.X, ActiveTerrain.Origin.Y, X, Y, ActiveTileset.Width, ActiveTileset.Height, Radius));
                        }
                    }
                }
            }
        }
        private void CreateFlatElevation(DeathmatchMap Map, Texture2D TileSet, Tile3D ActiveTile, int X, int Y)
        {
            Vector3 A = ActiveTile.ArrayVertex[0].Position;
            Vector3 B = ActiveTile.ArrayVertex[1].Position;
            Vector3 C = ActiveTile.ArrayVertex[2].Position;
            Vector3 D = ActiveTile.ArrayVertex[3].Position;

            Vector3 Normal = Vector3.Cross(C - B, B - A);

            Normal.Normalize();

            float Z = Map.GetTerrain(X, Y, Map.ActiveLayerIndex).Position.Z;

            for (int V = ActiveTile.ArrayVertex.Length - 1; V >= 0; --V)
            {
                ActiveTile.ArrayVertex[V].Position += Normal * Z;
            }

            //Create slope right
            if (X + 1 < Map.MapSize.X)
            {
                float ZRight = Map.GetTerrain(X + 1, Y, Map.ActiveLayerIndex).Position.Z;

                if (Z != ZRight)
                {
                    Vector3[] ArrayVertexPositionRight = new Vector3[4];
                    ArrayVertexPositionRight[0] = ActiveTile.ArrayVertex[1].Position;
                    ArrayVertexPositionRight[2] = ActiveTile.ArrayVertex[3].Position;
                    ArrayVertexPositionRight[1] = B + Normal * ZRight;
                    ArrayVertexPositionRight[3] = D + Normal * ZRight;

                    Tile3D NewTile = CreateTile(Map, TileSet, ArrayVertexPositionRight, X, Y);
                    CreateCubicTile(Map, TileSet, NewTile);
                }
            }

            //Create slope down
            if (Y + 1 < Map.MapSize.Y)
            {
                float ZDown = Map.GetTerrain(X, Y + 1, Map.ActiveLayerIndex).Position.Z;

                if (Z != ZDown)
                {
                    Vector3[] ArrayVertexPositionDown = new Vector3[4];
                    ArrayVertexPositionDown[0] = ActiveTile.ArrayVertex[2].Position;
                    ArrayVertexPositionDown[1] = ActiveTile.ArrayVertex[3].Position;
                    ArrayVertexPositionDown[2] = C + Normal * ZDown;
                    ArrayVertexPositionDown[3] = D + Normal * ZDown;

                    Tile3D NewTile = CreateTile(Map, TileSet, ArrayVertexPositionDown, X, Y);
                    CreateCubicTile(Map, TileSet, NewTile);
                }
            }
        }
Beispiel #3
0
        public override MovementAlgorithmTile GetTile(float PosX, float PosY, int LayerIndex)
        {
            if (PosX < 0 || PosY < 0 || PosX >= Map.MapSize.X || PosY >= Map.MapSize.Y)
            {
                return(null);
            }

            return(Map.GetTerrain(PosX, PosY, LayerIndex));
        }
Beispiel #4
0
        private static Tile3D CreateCursor(DeathmatchMap Map, float X, float Y, int TextureWidth, int TextureHeight, float Radius)
        {
            float Z = Map.GetTerrain(Math.Max(0, X), Math.Max(0, Y), Map.ActiveLayerIndex).Position.Z;

            Vector3[] ArrayVertexPosition = new Vector3[4];
            ArrayVertexPosition[0] = new Vector3(X * Map.TileSize.X, Z, Y * Map.TileSize.Y);
            ArrayVertexPosition[1] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y);
            ArrayVertexPosition[2] = new Vector3(X * Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);
            ArrayVertexPosition[3] = new Vector3(X * Map.TileSize.X + Map.TileSize.X, Z, Y * Map.TileSize.Y + Map.TileSize.Y);

            return(CreateTile3D(Map, ArrayVertexPosition, 0, 0, X, Y, TextureWidth, TextureHeight, Radius));
        }
Beispiel #5
0
        public void ComputeAttackTargets()
        {
            ListAllAttackTerrain.Clear();
            ListRefusedAttackTerrain.Clear();
            ListUsableAttackTerrain.Clear();

            MovementAlgorithmTile ActiveTerrain = Map.GetTerrain(ActiveSquad.Position.X, ActiveSquad.Position.Y, (int)ActiveSquad.Position.Z);

            ListAllAttackTerrain.Add(Map.GetTerrain(ActiveSquad.Position.X, ActiveSquad.Position.Y, (int)ActiveSquad.Position.Z));
            ActiveTerrain.LayerIndex = (int)ActiveTerrain.Position.Z;

            //Start Right, go downward
            Vector2 TestedFinalPos = new Vector2(Map.MapSize.X, ActiveSquad.Position.Y);

            do
            {
                for (int L = 0; L < Map.LayerManager.ListLayer.Count; ++L)
                {
                    ProcessLine(ActiveTerrain, TestedFinalPos, L);
                }
            }while (++TestedFinalPos.Y < Map.MapSize.Y);

            //Start bottom right, go bottom left
            do
            {
                for (int L = 0; L < Map.LayerManager.ListLayer.Count; ++L)
                {
                    ProcessLine(ActiveTerrain, TestedFinalPos, L);
                }
            }while (--TestedFinalPos.X >= 0);

            //Start bottom left, go upper left
            do
            {
                for (int L = 0; L < Map.LayerManager.ListLayer.Count; ++L)
                {
                    ProcessLine(ActiveTerrain, TestedFinalPos, L);
                }
            }while (--TestedFinalPos.Y >= 0);

            //Start upper left, go upper right
            do
            {
                for (int L = 0; L < Map.LayerManager.ListLayer.Count; ++L)
                {
                    ProcessLine(ActiveTerrain, TestedFinalPos, L);
                }
            }while (++TestedFinalPos.X < Map.MapSize.X);

            //Start upper right, go back to start
            do
            {
                for (int L = 0; L < Map.LayerManager.ListLayer.Count; ++L)
                {
                    ProcessLine(ActiveTerrain, TestedFinalPos, L);
                }
            }while (++TestedFinalPos.Y < ActiveSquad.Position.Y);

            //Aim for the ceiling
            for (int X = 0; X < Map.MapSize.X; ++X)
            {
                for (int Y = 0; Y < Map.MapSize.Y; ++Y)
                {
                    ProcessLine(ActiveTerrain, new Vector2(X, Y), Map.LayerManager.ListLayer.Count - 1);
                }
            }
        }
 public Terrain GetTerrain(int X, int Y, int LayerIndex)
 {
     return(ActiveMap.GetTerrain(X, Y, LayerIndex));
 }
        public override void Update(GameTime gameTime)
        {
            #region Toggle Spirit

            //Add or remove the EN needed to the pilot.
            if (InputHelper.InputCommand1Pressed())
            {
                if (ActiveSpirit == null || !ActiveSpirit.IsUnlocked)
                {
                    return;
                }

                if (ActiveSpirit.CanActivate)
                {
                    if (PilotSpiritActivation[ActiveUnitIndex][PilotIndex].Contains(ActiveSpirit))//Deactivate Skill
                    {
                        ListSelectedSpirit.Remove(ActiveSpirit);
                        PilotSpiritActivation[ActiveUnitIndex][PilotIndex].Remove(ActiveSpirit);

                        Map.sndSelection.Play();
                    }
                    else if (GetPilotRemainingSP() - ActiveSpirit.SPCost >= 0)//Activate Skill
                    {
                        if (ListSelectedSpirit.Count == 0 || (!ActiveSpirit.Target.MustBeUsedAlone && !ListSelectedSpirit.Last().Target.MustBeUsedAlone))
                        {
                            ListSelectedSpirit.Add(ActiveSpirit);
                            PilotSpiritActivation[ActiveUnitIndex][PilotIndex].Add(ActiveSpirit);

                            Map.sndSelection.Play();
                        }
                    }
                    else
                    {
                        Map.sndDeny.Play();
                    }
                }
                else
                {
                    Map.sndDeny.Play();
                }
            }

            #endregion

            else if (InputHelper.InputConfirmPressed())
            {
                if (ActiveSpirit == null || !ActiveSpirit.IsUnlocked)
                {
                    return;
                }

                if (ListSelectedSpirit.Count == 0)
                {
                    if (ActiveSpirit.CanActivate && GetPilotRemainingSP() - ActiveSpirit.SPCost >= 0)
                    {
                        ListSelectedSpirit.Add(ActiveSpirit);
                        PilotSpiritActivation[ActiveUnitIndex][PilotIndex].Add(ActiveSpirit);
                    }
                    else
                    {
                        return;
                    }
                }

                if (ListSelectedSpirit[0].Range > 0)
                {
                    List <Vector3> ListMVChoice = Map.ComputeRange(ActiveSquad.Position, 0, ListSelectedSpirit[0].Range);
                    List <MovementAlgorithmTile> ListTerrainChoice = new List <MovementAlgorithmTile>();
                    foreach (Vector3 ActiveTerrain in ListMVChoice)
                    {
                        ListTerrainChoice.Add(Map.GetTerrain(ActiveTerrain.X, ActiveTerrain.Y, (int)ActiveTerrain.Z));
                    }
                    Map.LayerManager.AddDrawablePoints(ListTerrainChoice, Color.FromNonPremultiplied(0, 128, 0, 190));
                }

                for (int U = 0; U < ActiveSquad.UnitsAliveInSquad; U++)
                {
                    for (int C = 0; C < ActiveSquad[U].ArrayCharacterActive.Length; C++)
                    {
                        for (int S = 0; S < PilotSpiritActivation[U][C].Count; ++S)
                        {
                            Map.GlobalDeathmatchContext.SetContext(ActiveSquad, ActiveSquad[U], ActiveSquad[U].ArrayCharacterActive[C], null, null, null, Map.ActiveParser);

                            ManualSkill SpiritToActivate = PilotSpiritActivation[U][C][S];

                            //Consume SP and activate skills.
                            SpiritToActivate.ActiveSkillFromMenu(ActiveSquad[U].ArrayCharacterActive[C], ActiveSquad);
                            //Update skills activation to disable those who can't be used anymore.
                            SpiritToActivate.UpdateSkillActivation();

                            ListSelectedSpirit.Remove(SpiritToActivate);
                            PilotSpiritActivation[U][C].Remove(SpiritToActivate);
                        }
                    }
                }

                for (int P = 0; P < Map.ListPlayer.Count; ++P)
                {
                    for (int S = 0; S < Map.ListPlayer[P].ListSquad.Count; ++S)
                    {
                        for (int U = 0; U < Map.ListPlayer[P].ListSquad[S].UnitsAliveInSquad; ++U)
                        {
                            Map.ActivateAutomaticSkills(Map.ListPlayer[P].ListSquad[S], Map.ListPlayer[P].ListSquad[S][U], string.Empty, Map.ListPlayer[P].ListSquad[S], Map.ListPlayer[P].ListSquad[S][U]);
                        }
                    }
                }

                Map.GlobalDeathmatchContext.SetContext(null, null, null, null, null, null, Map.ActiveParser);

                Map.sndConfirm.Play();
            }
            else if (InputHelper.InputCancelPressed())
            {
                Map.CursorPosition        = ActiveSquad.Position;
                Map.CursorPositionVisible = Map.CursorPosition;

                Map.sndCancel.Play();

                RemoveScreen(this);
            }

            #region Move the Spirit Menu cursor

            else if (InputHelper.InputUpPressed())
            {//Move Spirit cursor down.
                if (CursorIndex - 1 >= 0)
                {
                    CursorIndex--;

                    Map.sndSelection.Play();
                }
                //End of Spirit list, move to last pilot.
                else if (PilotIndex - 1 >= 0)
                {
                    PilotIndex--;
                    CursorIndex = ActiveSquad[ActiveUnitIndex].ArrayCharacterActive[PilotIndex].ArrayPilotSpirit.Length - 1;
                    Map.sndSelection.Play();
                }
            }
            else if (InputHelper.InputDownPressed())
            {//Move Spirit cursor up.
                if (CursorIndex + 1 < ActiveSquad[ActiveUnitIndex].ArrayCharacterActive[PilotIndex].ArrayPilotSpirit.Length)
                {
                    CursorIndex++;

                    Map.sndSelection.Play();
                }
                //End of Spirit list, move to next pilot.
                else if (PilotIndex + 1 < ActiveSquad[ActiveUnitIndex].ArrayCharacterActive.Length)
                {
                    PilotIndex++;
                    CursorIndex = 0;
                    Map.sndSelection.Play();
                }
            }
            else if (InputHelper.InputRightPressed())
            {
                if (ActiveUnitIndex < ActiveSquad.UnitsAliveInSquad - 1)
                {
                    ActiveUnitIndex++;
                    PilotIndex  = 0;
                    CursorIndex = 0;
                }
            }
            else if (InputHelper.InputLeftPressed())
            {
                if (ActiveUnitIndex > 0)
                {
                    ActiveUnitIndex--;
                    PilotIndex  = 0;
                    CursorIndex = 0;
                }
            }

            #endregion
        }