|
From: <bur...@us...> - 2012-01-14 13:49:02
|
Revision: 9558
http://freecol.svn.sourceforge.net/freecol/?rev=9558&view=rev
Author: burschik
Date: 2012-01-14 13:48:55 +0000 (Sat, 14 Jan 2012)
Log Message:
-----------
Fix bug #3424496: REF Dragoons.
Modified Paths:
--------------
freecol/trunk/data/rules/classic/specification.xml
freecol/trunk/src/net/sf/freecol/common/model/SimpleCombatModel.java
freecol/trunk/src/net/sf/freecol/common/model/Unit.java
freecol/trunk/test/src/net/sf/freecol/common/model/CombatTest.java
freecol/trunk/test/src/net/sf/freecol/server/control/InGameControllerTest.java
Modified: freecol/trunk/data/rules/classic/specification.xml
===================================================================
--- freecol/trunk/data/rules/classic/specification.xml 2012-01-14 09:18:03 UTC (rev 9557)
+++ freecol/trunk/data/rules/classic/specification.xml 2012-01-14 13:48:55 UTC (rev 9558)
@@ -851,7 +851,8 @@
</unit-type>
<unit-type id="model.unit.colonialRegular" extends="colonist"
skillTaught="model.unit.veteranSoldier" skill="3">
- <downgrade unit="model.unit.freeColonist" capture="100" clearSkill="100"/>
+ <downgrade unit="model.unit.veteranSoldier" demotion="100" capture="100" clearSkill="100"/>
+ <ability id="model.ability.demoteOnAllEquipLost" value="true"/>
<ability id="model.ability.canBeEquipped" value="true"/>
<ability id="model.ability.expertSoldier" value="true"/>
<modifier id="model.modifier.offence" type="additive" value="3"/>
@@ -859,9 +860,8 @@
<required-ability id="model.ability.independenceDeclared"/>
</unit-type>
<unit-type id="model.unit.kingsRegular" extends="colonist" skill="4">
- <downgrade unit="model.unit.freeColonist" capture="100" clearSkill="100"/>
<ability id="model.ability.refUnit" value="true"/>
- <ability id="model.ability.disposeOnCombatLoss" value="true"/>
+ <ability id="model.ability.disposeOnAllEquipLost" value="true"/>
<ability id="model.ability.expertSoldier" value="true"/>
<modifier id="model.modifier.offence" type="additive" value="4"/>
<modifier id="model.modifier.defence" type="additive" value="4"/>
Modified: freecol/trunk/src/net/sf/freecol/common/model/SimpleCombatModel.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/SimpleCombatModel.java 2012-01-14 09:18:03 UTC (rev 9557)
+++ freecol/trunk/src/net/sf/freecol/common/model/SimpleCombatModel.java 2012-01-14 13:48:55 UTC (rev 9558)
@@ -634,6 +634,9 @@
: (winner.canCaptureEquipment(equip, loser) != null)
? CombatResult.CAPTURE_EQUIP
: CombatResult.LOSE_EQUIP);
+ if (loser.losingEquipmentDemotesUnit(equip)) {
+ crs.add(CombatResult.DEMOTE_UNIT);
+ }
// Consume autoequipment.
} else if (settlement instanceof Colony && autoEquip != null) {
Modified: freecol/trunk/src/net/sf/freecol/common/model/Unit.java
===================================================================
--- freecol/trunk/src/net/sf/freecol/common/model/Unit.java 2012-01-14 09:18:03 UTC (rev 9557)
+++ freecol/trunk/src/net/sf/freecol/common/model/Unit.java 2012-01-14 13:48:55 UTC (rev 9558)
@@ -3224,6 +3224,22 @@
}
/**
+ * Does losing a piece of equipment mean the demotion of this unit?
+ *
+ * @param lose The <code>EquipmentType</code> to lose.
+ * @return True if the unit is to be demoted.
+ */
+ public boolean losingEquipmentDemotesUnit(EquipmentType lose) {
+ if (hasAbility("model.ability.demoteOnAllEquipLost")) {
+ for (EquipmentType equip : getEquipment().keySet()) {
+ if (equip != lose) return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Gets the probability that an attack by this unit will provoke a
* native to convert.
*
Modified: freecol/trunk/test/src/net/sf/freecol/common/model/CombatTest.java
===================================================================
--- freecol/trunk/test/src/net/sf/freecol/common/model/CombatTest.java 2012-01-14 09:18:03 UTC (rev 9557)
+++ freecol/trunk/test/src/net/sf/freecol/common/model/CombatTest.java 2012-01-14 13:48:55 UTC (rev 9558)
@@ -20,9 +20,16 @@
package net.sf.freecol.common.model;
import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
import java.util.Set;
+import net.sf.freecol.common.model.CombatModel.CombatResult;
import net.sf.freecol.common.model.Unit.MoveType;
+import net.sf.freecol.server.ServerTestHelper;
+import net.sf.freecol.server.control.ChangeSet;
+import net.sf.freecol.server.control.InGameController;
+import net.sf.freecol.server.model.ServerPlayer;
import net.sf.freecol.server.model.ServerUnit;
import net.sf.freecol.util.test.FreeColTestCase;
@@ -57,8 +64,6 @@
= spec().getUnitType("model.unit.freeColonist");
private static final UnitType veteranType
= spec().getUnitType("model.unit.veteranSoldier");
- private static final UnitType colonialType
- = spec().getUnitType("model.unit.colonialRegular");
private static final UnitType artilleryType
= spec().getUnitType("model.unit.artillery");
private static final UnitType damagedArtilleryType
@@ -455,5 +460,82 @@
}
+ public void testRegulars() {
+ Random random = new Random(1);
+ // these are the first ten values the RNG will produce
+ float[] values = new float[] {
+ 0.7308782f,
+ 0.100473166f,
+ 0.4100808f,
+ 0.40743977f,
+ 0.2077148f,
+ 0.036235332f,
+ 0.332717f,
+ 0.6588672f,
+ 0.96775585f,
+ 0.7107396f
+ };
+ Map map = getTestMap(plains, true);
+ Game game = ServerTestHelper.startServerGame(map);
+ InGameController igc = ServerTestHelper.getInGameController();
+
+ ServerPlayer french = (ServerPlayer) game.getPlayer("model.nation.french");
+ french.getFeatureContainer().addAbility(new Ability("model.ability.independenceDeclared"));
+ ServerPlayer refPlayer = igc.createREFPlayer(french);
+
+ SimpleCombatModel combatModel = new SimpleCombatModel();
+
+ Tile tile1 = map.getTile(5, 8);
+ Tile tile2 = map.getTile(4, 8);
+
+ Unit colonial = new ServerUnit(game, tile1, french, colonialRegularType, muskets, horses);
+ Unit regular = new ServerUnit(game, tile1, french, kingsRegularType, muskets, horses);
+
+ // (regular + muskets + horses) * attack bonus
+ float offence = (4 + 2 + 1) * 1.5f;
+ assertEquals(offence, combatModel.getOffencePower(regular, colonial));
+ // colonial + muskets + horses + defence bonus
+ float defence = 3 + 1 + 1 + 1;
+ assertEquals(defence, combatModel.getDefencePower(regular, colonial));
+
+ List<CombatResult> result = combatModel.generateAttackResult(random, regular, colonial);
+ assertEquals(CombatResult.LOSE, result.get(0));
+ assertEquals(CombatResult.LOSE_EQUIP, result.get(1));
+
+ refPlayer.csCombat(regular, colonial, result, random, new ChangeSet());
+
+ // (regular + muskets) * attack bonus
+ offence = (4 + 2) * 1.5f;
+ assertEquals(offence, combatModel.getOffencePower(regular, colonial));
+
+ // slaughter King's Regular
+ result = combatModel.generateAttackResult(random, colonial, regular);
+ assertEquals(CombatResult.WIN, result.get(0));
+ assertEquals("King's Regular should be slaughtered upon losing all equipment.",
+ CombatResult.SLAUGHTER_UNIT, result.get(1));
+
+ regular = new ServerUnit(game, tile1, french, kingsRegularType, muskets, horses);
+
+ result = combatModel.generateAttackResult(random, regular, colonial);
+ assertEquals(CombatResult.WIN, result.get(0));
+ assertEquals(CombatResult.LOSE_EQUIP, result.get(1));
+ refPlayer.csCombat(regular, colonial, result, random, new ChangeSet());
+
+ result = combatModel.generateAttackResult(random, regular, colonial);
+ assertEquals(CombatResult.WIN, result.get(0));
+ assertEquals(CombatResult.LOSE_EQUIP, result.get(1));
+ assertEquals(CombatResult.DEMOTE_UNIT, result.get(2));
+ refPlayer.csCombat(regular, colonial, result, random, new ChangeSet());
+ assertFalse(colonial.isArmed());
+ assertEquals(veteranType, colonial.getType());
+
+ result = combatModel.generateAttackResult(random, regular, colonial);
+ assertEquals(CombatResult.WIN, result.get(0));
+ assertEquals(CombatResult.CAPTURE_UNIT, result.get(1));
+ refPlayer.csCombat(regular, colonial, result, random, new ChangeSet());
+
+ }
+
+
}
Modified: freecol/trunk/test/src/net/sf/freecol/server/control/InGameControllerTest.java
===================================================================
--- freecol/trunk/test/src/net/sf/freecol/server/control/InGameControllerTest.java 2012-01-14 09:18:03 UTC (rev 9557)
+++ freecol/trunk/test/src/net/sf/freecol/server/control/InGameControllerTest.java 2012-01-14 13:48:55 UTC (rev 9558)
@@ -51,6 +51,7 @@
import net.sf.freecol.common.model.Tile;
import net.sf.freecol.common.model.TileImprovementType;
import net.sf.freecol.common.model.TileType;
+import net.sf.freecol.common.model.TypeCountMap;
import net.sf.freecol.common.model.Unit;
import net.sf.freecol.common.model.UnitType;
import net.sf.freecol.common.model.UnitTypeChange;
@@ -423,11 +424,11 @@
colony.addBuilding(school);
Unit teacher = new ServerUnit(game, school, colony.getOwner(),
hardyPioneerType);
- assertTrue("Unit should be a hardy pioneer",
- teacher.getType() == hardyPioneerType);
+ assertEquals("Unit should be a hardy pioneer",
+ hardyPioneerType, teacher.getType());
igc.clearSpeciality((ServerPlayer) dutch, teacher);
- assertTrue("Teacher specialty cannot be cleared",
- teacher.getType() == hardyPioneerType);
+ assertEquals("Teacher specialty cannot be cleared",
+ hardyPioneerType, teacher.getType());
}
public void testAtackedNavalUnitIsDamaged() {
@@ -526,19 +527,42 @@
Unit.MoveType.MOVE_NO_ATTACK_CIVILIAN,
colonial.getMoveType(tile2));
+ // Colonial regulars should never be unarmed
+ TypeCountMap<EquipmentType> equipment = new TypeCountMap<EquipmentType>();
+ equipment.incrementCount(muskets, 1);
+ colonial.setEquipment(equipment);
+
+ // Veteran attacks and demotes the Colonial Regular
+ crs = fakeAttackResult(CombatResult.WIN, soldier, colonial);
+ assertEquals("Soldier v Colonial failed",
+ 3, crs.size());
+ assertEquals("Soldier v Colonial failed",
+ CombatResult.WIN, crs.get(0));
+ assertEquals("Soldier v Colonial failed",
+ CombatResult.LOSE_EQUIP, crs.get(1));
+ assertEquals("Soldier v Colonial failed",
+ CombatResult.DEMOTE_UNIT, crs.get(2));
+ igc.combat((ServerPlayer) french, soldier, colonial, crs);
+
+ assertEquals("Colonial Regular is demoted",
+ veteranType, colonial.getType());
+
// Veteran attacks and captures the Colonial Regular
crs = fakeAttackResult(CombatResult.WIN, soldier, colonial);
- assertTrue("Soldier v Colonial failed", crs.size() == 2
- && crs.get(0) == CombatResult.WIN
- && crs.get(1) == CombatResult.CAPTURE_UNIT);
+ assertEquals("Soldier v Colonial failed",
+ 2, crs.size());
+ assertEquals("Soldier v Colonial failed",
+ CombatResult.WIN, crs.get(0));
+ assertEquals("Soldier v Colonial failed",
+ CombatResult.CAPTURE_UNIT, crs.get(1));
igc.combat((ServerPlayer) french, soldier, colonial, crs);
+ assertEquals("Colonial Regular is demoted",
+ colonistType, colonial.getType());
assertEquals("Colonial Regular should be captured",
french, colonial.getOwner());
assertEquals("Colonial Regular is moved to the Veterans tile",
tile2, colonial.getTile());
- assertEquals("Colonial Regular is demoted",
- colonistType, colonial.getType());
}
public void testAttackColonyWithVeteran() {
@@ -659,7 +683,7 @@
assertEquals("Colony should be owned by the attacker",
attacker.getOwner(), colony.getOwner());
assertEquals("Colony colonist should be demoted",
- colonist.getType(), colonistType);
+ colonist.getType(), veteranType);
}
public void testAttackColonyWithBrave() {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|