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++; } }
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); }