Esempio n. 1
0
        public virtual void addSoldier(Soldier soldier)
        {
            _addedSoldier = true;
            switch(soldier.getType())
            {
                case Soldier.TYPE_PIKE:
                    addSoldierToRow(soldier, _pikeRows);
                    break;
                case Soldier.TYPE_SWINGER:
                    addSoldierToRow(soldier, _supportRows);
                    break;
                case Soldier.TYPE_SHOT:
                    addSoldierToRow(soldier, _shotRows);
                    break;
                case Soldier.TYPE_CAVALRY:
                    addSoldierToRow(soldier, _cavRows);
                    break;
                case Soldier.TYPE_SUPPORT:
                    addSoldierToRow(soldier, _supportRows);
                    break;
                case Soldier.TYPE_MELEE:
                    addSoldierToRow(soldier, _meleeRows);
                    break;
                default:
                    addSoldierToRow(soldier, _supportRows);
                    break;
            }

            soldier.setSide(_side);
            if (_screen.getPlayerFormation() == this)
                soldier.inPlayerFormation = true;
            soldier.initCharge = false;
            soldier.setSpeed(0.15f);

            // determine speed
            avgSpeed = 0;

            foreach (Soldier s in _soldiers)
            {
                avgSpeed += s.getSpeed();
            }
            avgSpeed /= (float)_soldiers.Count;
            _speed = avgSpeed - 0.04f;            
            //_speed = avgSpeed - (0.002f * (float)_soldiers.Count);            
            soldier.myFormation = this;

            if (soldier.getType() == Soldier.TYPE_PIKE)
            {
                reiteratePikeCommand((Pikeman)soldier);
                numberOfPikes++;
            }
            else if (soldier is Dopple && _state == STATE_PIKE)
            {
                ((Dopple)soldier).charge();
            }
            else if (soldier.getType() == Soldier.TYPE_SHOT)
            {
                numberOfShots++;
            }
        }
Esempio n. 2
0
        private void addSoldierToRow(Soldier soldier, ArrayList rows)
        {
            int addLeader = soldier.getType() == Soldier.TYPE_SWINGER ? 2 : 0;
            int rowsOfType = (getTotalSoldiers(soldier.getType()) + addLeader) / _width;
            Soldier prevSoldier;
            ArrayList row;
            float lastRowStartHeight = 0f;

            if (soldier is Pikeman && _state == STATE_PIKE)
            {
                if (rows.Count < 2)
                    ((Pikeman)soldier).attackLow();
                else
                    ((Pikeman)soldier).attackHigh();
            }

            if (rows.Count < rowsOfType + 1)
            {
                rows.Add(new ArrayList(_width));
                ((ArrayList)rows[rows.Count - 1]).Add(soldier);
                row = (ArrayList)rows[rows.Count - 1];

                if (rowsOfType > 0)
                {
                    prevSoldier = ((Soldier)((ArrayList)rows[rows.Count - 2])[0]);
                    soldier._destination = new Vector2(prevSoldier._destination.X - (_side * Soldier.WIDTH), prevSoldier._destination.Y);
                }
                else
                    soldier._destination = new Vector2(_position.X - (_side * Soldier.WIDTH), _position.Y);
            }
            else
            {
                if (soldier.getType() == Soldier.TYPE_SWINGER && rows.Count < 2 && ((ArrayList)rows[0]).Count % 2 == 0)
                {
                    row = (ArrayList)rows[0];
                    row.Insert(0, soldier);
                }
                else
                {
                    row = findSmallestRow(rows);
                    row.Add(soldier);
                    prevSoldier = ((Soldier)row[row.Count - 2]);
                }
            }

            //see if rows should be evened out a little
            if (rows.Count > 1 && row.Count < _width / 2)
            {
                ArrayList prevRow = ((ArrayList)rows[rows.Count - 2]);
                Soldier oldSoldier = (Soldier)prevRow[prevRow.Count -1];
                row.Add(oldSoldier);
                prevSoldier = ((Soldier)((ArrayList)rows[rows.Count - 1])[0]);
                oldSoldier._destination = new Vector2(prevSoldier._destination.X, prevSoldier._destination.Y);
                prevRow.RemoveAt(prevRow.Count - 1);
                lastRowStartHeight = (float)_width / 2f - (float)(prevRow.Count) / 2f;

                for (int i = 0; i < prevRow.Count; i++)
                {
                    ((Soldier)prevRow[i])._destination.Y = _position.Y + Soldier.HEIGHT * ((float)i + lastRowStartHeight);
                }
            }
            
            lastRowStartHeight = (float)_width / 2f - (float)(row.Count) / 2f;

            for (int i = 0; i < row.Count; i++)
            {
                ((Soldier)row[i])._destination.Y = _position.Y + Soldier.HEIGHT * ((float)i + lastRowStartHeight);
            }

            _soldiers.Add(soldier);
        }