/** * Prepare for a new turn. */ void BattleUnit::prepareNewTurn() { // recover TUs int TURecovery = _unit->getTimeUnits(); // Each fatal wound to the left or right leg reduces the soldier's TUs by 10%. TURecovery -= (TURecovery * (_fatalWounds[BODYPART_LEFTLEG]+_fatalWounds[BODYPART_RIGHTLEG] * 10))/100; setTimeUnits(TURecovery); // recover energy if (!isOut()) { int ENRecovery = _unit->getTimeUnits() / 3; // Each fatal wound to the body reduces the soldier's energy recovery by 10%. ENRecovery -= (_energy * (_fatalWounds[BODYPART_TORSO] * 10))/100; _energy += ENRecovery; if (_energy > _unit->getStamina()) _energy = _unit->getStamina(); } // suffer from fatal wounds _health -= getFatalWounds(); // suffer from fire if (_fire > 0) { _health -= RNG::generate(5, 10); _fire--; } if (_health < 0) _health = 0; // recover stun 1pt/turn if (_stunlevel > 0) stun(-1); if (!isOut()) { int chance = 100 - (2 * getMorale()); if (RNG::generate(1,100) <= chance) { int type = RNG::generate(0,100); _status = (type<=33?STATUS_BERSERK:STATUS_PANICKING); // 33% chance of berserk, panic can mean freeze or flee, but that is determined later } else { // succesfully avoided panic // increase bravery experience counter if (chance > 1) _expBravery++; } } _dontReselect = false; }
/* in L1 and L2 there were built in values for key units * such as 'volume', 'length', 'area', 'substance' and 'time' * In L3 these have been removed - thus if a model uses one of these * it needs a unitDefinition to define it */ void Model::addDefinitionsForDefaultUnits() { /* create a list of unit values */ IdList unitsUsed; unsigned int n; bool implicitVolume = false; bool implicitArea = false; bool implicitLength = false; bool implicitSubstance = false; for (n = 0; n < getNumCompartments(); n++) { if (getCompartment(n)->isSetUnits()) { unitsUsed.append(getCompartment(n)->getUnits()); } else { if (getCompartment(n)->getSpatialDimensions() == 3) { implicitVolume = true; getCompartment(n)->setUnits("volume"); } else if (getCompartment(n)->getSpatialDimensions() == 2) { implicitArea = true; getCompartment(n)->setUnits("area"); } else if (getCompartment(n)->getSpatialDimensions() == 1) { implicitLength = true; getCompartment(n)->setUnits("length"); } } } for (n = 0; n < getNumSpecies(); n++) { if (getSpecies(n)->isSetSubstanceUnits()) { unitsUsed.append(getSpecies(n)->getSubstanceUnits()); } else { implicitSubstance = true; getSpecies(n)->setSubstanceUnits("substance"); } if (getSpecies(n)->isSetSpatialSizeUnits()) unitsUsed.append(getSpecies(n)->getSpatialSizeUnits()); } for (n = 0; n < getNumParameters(); n++) { if (getParameter(n)->isSetUnits()) unitsUsed.append(getParameter(n)->getUnits()); } if (getUnitDefinition("volume") == NULL) { if (unitsUsed.contains("volume") || implicitVolume) { UnitDefinition * ud = createUnitDefinition(); ud->setId("volume"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("litre")); u->setScale(0); u->setExponent(1.0); u->setMultiplier(1.0); setVolumeUnits("volume"); } else { setVolumeUnits("litre"); } } else { setVolumeUnits("volume"); } if (getUnitDefinition("substance") == NULL) { if (unitsUsed.contains("substance") || implicitSubstance) { UnitDefinition * ud = createUnitDefinition(); ud->setId("substance"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("mole")); u->setScale(0); u->setExponent(1.0); u->setMultiplier(1.0); setSubstanceUnits("substance"); setExtentUnits("substance"); } else { setSubstanceUnits("mole"); setExtentUnits("mole"); } } else { setSubstanceUnits("substance"); setExtentUnits("substance"); } if (getUnitDefinition("area") == NULL) { UnitDefinition * ud = createUnitDefinition(); ud->setId("area"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("metre")); u->setScale(0); u->setExponent(2.0); u->setMultiplier(1.0); setAreaUnits("area"); } else { setAreaUnits("area"); } if (getUnitDefinition("length") == NULL) { if (unitsUsed.contains("length") || implicitLength) { UnitDefinition * ud = createUnitDefinition(); ud->setId("length"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("metre")); u->setScale(0); u->setExponent(1.0); u->setMultiplier(1.0); setLengthUnits("length"); } else { setLengthUnits("metre"); } } else { setLengthUnits("length"); } if (getUnitDefinition("time") == NULL) { setTimeUnits("second"); } else { setTimeUnits("time"); } }