示例#1
0
    public void MakeMap(int width, int height, int players, int unitCap)
    {
      UnitCap = unitCap;
      if (Map != null)
      {
        if (NaturePlayer != null)
        {
          NaturePlayer.Dispose();
        }
        Map.Dispose();
        Effects.Clear();
      }
      NaturePlayer = new Player(-1, this, "Nature");

      Map = new MapBoard(this, width, height);
      Map.Initialize();
      Map.Generate(random, players);

      NaturePlayer.Initialize();
    }
示例#2
0
    /// <summary>
    /// Method that deserializes the data from the line starting at given position in given context depending on the MessageType
    /// </summary>
    /// <param id="mt">MessageType defining the extend of deserialization which is to be performed</param>
    /// <param id="line">String array containing the serialized data</param>
    /// <param id="position">Current position in the array</param>
    /// <param id="context">Context of the serialized data, game where this INetworkSerializable object is in</param>
    public void Deserialize(MessageType mt, string[] line, ref int position, WildmenGame context)
    {
      int n;
      switch (mt)
      {
        case MessageType.GameTransfer:
          Map = new MapBoard(context, int.Parse(line[position + 0]), int.Parse(line[position + 1]));
          Map.Initialize();
          Map.Deserialize(mt, line, ref position, context);
          Map.LoadContent();

          int evCount = int.Parse(line[position++]);
          for (int i = 0; i < evCount; i++)
          {
            Effects.Add(GameEffect.Create(line, ref position, context));
          }


          UnitCap = int.Parse(line[position++]);
          n = int.Parse(line[position++]);
          for (int i = 0; i < n; i++)
          {
            var p = new Player(i, context, null);
            Players.Add(p);
            p.Initialize();
          }
          for (int i = 0; i < n; i++)
          {
            Players[i].Deserialize(mt, line, ref position, context);
          }
          NaturePlayer = new Player(-1, context, null);
          NaturePlayer.Initialize();
          NaturePlayer.Deserialize(mt, line, ref position, context);
          List<Player> tempPlayers = new List<Player>(Players);
          tempPlayers.Add(NaturePlayer);
          foreach (var player in tempPlayers)
          {
            foreach (var unit in player.Units)
            {
              unit.ResolveReferences(GetGameObjectById);
            }
            foreach (var bldg in player.Buildings)
            {
              bldg.ResolveReferences(GetGameObjectById);
            }
          }
          NextUID = int.Parse(line[position++]);
          break;
        default:
          throw new Exception("WildmenGame deserialization error");
      }
    }
示例#3
0
    //

    /// <summary>
    /// Determines whether a building can be placed at given position
    /// </summary>
    /// <param name="map">Map, where the building-placement should be checked</param>
    /// <param name="baseTile">Base tile of the building-check</param>
    /// <param name="ignoreBuilding">Should the existing structures be ignored</param>
    /// <returns>Whether a building can be built at given position</returns>
    public static bool CanPlace(MapBoard map, Tile baseTile, bool ignoreBuilding = false)
    {
      int height = baseTile.Elevation;
      foreach (var d in new Direction[] { Direction.Center, Direction.TopLeft, Direction.Top, Direction.TopRight })
      {
        Tile item = map.GetSurroundingTile(baseTile, d);
        if (item == null) return false;
        if (!ignoreBuilding && item.Building != null) return false;
        if (item.Resource != null) return false;
        if (item.Elevation < MapBoard.SEA_LEVEL) return false;
        if (Math.Abs(item.Elevation - height) > 1) return false;
      }
      return true;
    }
示例#4
0
文件: MapUI.cs 项目: arcticnw/Wildmen
    /// <summary>
    /// Background-Updates the MapUI, updating the game
    /// </summary>
    /// <param id="c">Screen cursor</param>
    public void BackgroundUpdate(Cursor c)
    {
      // Reset cursor
      c.UseDefault();
      c.UseText("");

      // If no map is present or map is not valid, flush the information and reload the map from the game
      if (this.map == null || !this.map.Valid)
      {
        FlushMapInfo();
        // If game doesn't have valid map, return
        if (this.game.Map == null || !this.game.Map.Valid)
        {
          return;
        }

        this.map = this.game.Map;
      }

      // Don't update if there is no controlling player (we are viewing server game)
      if (controllingPlayer != null)
      {
        // Update the game
        game.Update();

        // Validate our selection (it might have died, etc)
        ValidateSelection();
      }

      lastMouseVector = UI.Instance.MouseVector;
    }
示例#5
0
文件: MapUI.cs 项目: arcticnw/Wildmen
    // UPDATE

    /// <summary>
    /// Updates the MapUI, handling mouse and keyboard input, cursor, updating the game
    /// </summary>
    /// <param id="c">Screen cursor</param>
    public void Update(Cursor c)
    {
      // If no map is present or map is not valid, flush the information and reload the map from the game
      if (this.map == null || !this.map.Valid)
      {
        FlushMapInfo();
        // If game doesn't have valid map, return
        if (this.game.Map == null || !this.game.Map.Valid)
        {
          return;
        }

        this.map = this.game.Map;
      }

      // If there is no controlling player, the targeting is disabled
      if (controllingPlayer != null)
      {
        UpdateTracking();

        // if autoCursor is enabled, try to guess suitable order
        if (autoCursor)
        {
          SmartCursor();
        }

        // Check the user controls
        cm.Update();
      }

      if (userPanelScrollCooldown > 0) userPanelScrollCooldown--;

      // Don't update mouse when the cursor is above user controls
      if (cm.IsMouseover)
      { }
      // Don't update mouse when the cursor is above menu
      else if ((inGameState == InGameStateEnum.BuildingPlacement || inGameState == InGameStateEnum.Spell) &&
          (UI.Instance.MouseVector.X > UI.Instance.ScreenBounds.X - USER_PANEL_SIZE))
      {
        MenuSelecting();
      }
      else
      {
        // Handle mouse buttons & scroll
        MouseUpdate();
      }
      // Handle keyboard input
      KeyboardUpdate();

      // Don't update if there is no controlling player (we are viewing server game)
      if (controllingPlayer != null)
      {
        // Update the game
        game.Update();

        // Validate our selection (it might have died, etc)
        ValidateSelection();
      }

      // Update mouse-over newText and cursor
      CursorUpdate(c);

      lastMouseVector = UI.Instance.MouseVector;
    }
示例#6
0
文件: MapUI.cs 项目: arcticnw/Wildmen
    // INITIALIZE

    /// <summary>
    /// Constructor for the MapUI class
    /// </summary>
    /// <param id="game">game, the MapUI will overlook</param>
    public MapUI(WildmenGame game)
    {
      this.game = game;
      this.map = this.game.Map;
      this.inGameState = InGameStateEnum.Default;
    }
示例#7
0
文件: MapUI.cs 项目: arcticnw/Wildmen
    // DISPOSING

    /// <summary>
    /// Flushes all the information about the map and resets the MapUI (while keeping the Game and ControllingPlayer)
    /// </summary>
    private void FlushMapInfo()
    {
      inGameState = InGameStateEnum.Default;

      mouseoverTile = null;
      mouseoverGameObject = null;
      map = null;

      mouseoverTileTracking = false;
      gameObjectTracking = true;
      mouseSelecting = false;
    }
示例#8
0
文件: Tile.cs 项目: arcticnw/Wildmen
    /// <summary>
    /// Tile constructor
    /// </summary>
    /// <param id="x">X coordinate of this tile</param>
    /// <param id="y">Y coordinate of this tile</param>
    /// <param id="cpb">Additional tile parameters</param>
    public Tile(int x, int y, ConstructorParamBundle cpb)
    {
      Units = new List<Unit>();

      this.X = x;
      this.Y = y;

      bool oddTile = x % 2 == 1;
      float off = 0f;

      if (oddTile)
      {
        off = 0.5f;
      }

      this.MapPosition = new Vector2((x / 2 + off) * MapBoard.TILE_XSPACING, (y + off) * MapBoard.TILE_YSPACING);

      this.DrawZLevel = this.baseDrawZLevel = cpb.zLevel;
      this.DrawZLevelRange = cpb.zLevelStep;
      this.isBorder = cpb.isBorder;

      this.Elevation = -1;

      this.map = cpb.map;
    }