Difference between revisions of "Testing Notepad"
(→Changing PlanetType of Gas Giants / Asteroids) |
m |
||
Line 1: | Line 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Problematic Test Cases== | ==Problematic Test Cases== |
Revision as of 17:09, 23 May 2005
Contents
- 1 Problematic Test Cases
- 2 Indeterminate Test Cases
- 3 Test Cases with Fixes
- 4 Working Effects and Conditions
Problematic Test Cases
Changing PlanetType of Gas Giants / Asteroids
Replace techs.xml with this:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::Type>OBJ_POP_CENTER</Condition::Type> </scope> <activation><Condition::Self/></activation> <effects> <Effect::SetPlanetType>PT_GAIA</Effect::SetPlanetType> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a new game. Find a gas giant or asteroid belt planet. Research the tech.
On the turn the tech is researched, nothing happens. This is standard for all tech effects, so may not be a bug, but IMO it would be better if techs took effect the turn they were reserached, rather than the turn after.
End the turn. Once.
The effect fires on all planets, turning them into Gaia planets.
The MaxPopulation of planets is not updated this turn. It is still what it was for the previous planet environment. Even if effects take a turn to work, once they do, any consequences to things like MaxPopulation need to happen the same turn as the change that should cause the consequence.
End the turn again.
The MaxPopulation of most planets updates, but the MaxPopulation of planets the used to be Gas Giants or Asteroid Belts does not update. This is probably because the PlanetSize for these planets is still SZ_ASTEROIDS or SZ_GASGIANT.
IMO this should not happen, and it should not have to be checked for with special conditions in an effect. I suggest treating planets of size SZ_ASTEROIDS as the smallest planet size, and SZ_GASGIANT as the largest planet size. Keep the size parameter what it was before though... it might be useful.
This is fixed. MaxPopulation and MaxHealth are now updated at the right time; this was an oversight, since MaxIndustry and MaxFarming already were. Also, the SetType and SetSize Effects were not cognizant of the relationship between PlanetSize and PlanetType (wrt asteroid and gas giant planets), and so were changing one without regard for the other, leaving size and type in an invalid state. Now changes to size will force gas giants and asteroids to become type PT_BARREN, and changes to type will force gas giants to become size SZ_HUGE and asteroids size SZ_TINY. --Zach
Setting MaxPopulation of Gas Giants / Asteriods
Replace techs.xml with this:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::All/> </scope> <activation><Condition::Self/></activation> <effects> <Effect::SetMeter> <meter>METER_POPULATION</meter> <value>Target.MaxPopulation + 1</value> <max>1</max> </Effect::SetMeter> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a new game, and research the tech. Find a gas giant or asteroid belt planet and colonize it (it should have MaxPopulation = 1 due to the effect). The colony starves to death on the next turn, even if you had enough food surplus available to feed it.
This appears to be inevitable, because the helth meter is also 0. In any case, I don't think this is a bug, just a bad Effect. --Zach
Set Current Population Effect Ineffective
Replace techs.xml with the following:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::Type>OBJ_PLANET</Condition::Type> </scope> <activation> <Condition::Self/> </activation> <effects> <Effect::SetMeter> <meter>METER_POPULATION</meter> <value>50</value> <max>0</max> </Effect::SetMeter> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a new game, research the tech, and end turn a few times.
The effect doesn't seem to fire on any planets, whether populated or not.
Move your colonly ship to another system and colonize another planet.
Still nothing happens.
The effect should set the current population of all planets (or preferably just populated planets) to 50.
AddOwner Effect Needs Tweaking...
Swap out your current techs.xml for the following:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::All/> </scope> <activation> <Condition::Self/> </activation> <effects> <Effect::AddOwner>Source.Owner</Effect::AddOwner> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a game, research the tech, end the turn.
A large number of sitrep reports are generated about your population at various planets having starved and that the planet is lost. This includes planets in systems you haven't explored and don't know the name of, which are reported as ERROR in the sitrep. You also gain control over all populated systems and all fleets in the game universe. However the previous owners still retain control as well, as can be seen on the map with multiple coloured system names.
Planets that have no population should not be fired upon by this effect, as they are incapable of being owned by a player without population on them. (If this is impossible, then these planets should get a default low population, though it would be much better to not have the effect fire on them).
Planets should also not have more than one owner ever. In the case when this effect fires on a planet which already has an owner, the previous owner should be removed.
I'm not sure why this effect is "AddOwner" and not "SetOwner"... Presumably it's for the potential future case where there might be something that can be owned by two or more players at a time. For now, and for planets (and ships and fleets), this doesn't make sense.
I'm not completely sure that more than one empire is owning the planets, as I'm just basing it off the multiple colouration of system names and lack of any other planets owned by another race in the system. Since there's no such multicolouring for fleets and ships, I'm not sure if a similar co-owning is occuring for them. If it is, then they should also not be possible to co-own between multiple players.
UI Response...
After doing the above test case, you may notice that the UI response time slows drastically for scrolling the map or moving around the sitrep. I'm not sure if this is a bug or just a major bottleneck. In either case, it needs fixing. This probably occurs in other situations as well, but I haven't noticed it at any other time.
WithinStarlaneJumps between systems
Replace techs.xml with this:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::And> <Condition::Not> <Condition::WithinStarlaneJumps> <jumps>2</jumps> <condition><Condition::Self/></condition> </Condition::WithinStarlaneJumps> </Condition::Not> <Condition::Type>OBJ_SHIP</Condition::Type> </Condition::And> </scope> <activation> <Condition::Self/> </activation> <effects> <Effect::Destroy/> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a game, and move a fleet along a starlane away from your home planet that is longer than 1 turn's travel. End the turn. The fleet will be gone the next turn. (unless you game crashed due to other bugs).
The WithinStarlaneJumps condition is excluding objects that are within the indicated distance, but are not located at systems. In this case, fleets moving between systems, both of which are within the indicated number of jumps, are excluding, and thus re-included by the NOT condition.
Indeterminate Test Cases
Max Meter Value Condition Nonfunctional
Replace techs.xml with the following:
<GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::MeterValue> <meter>METER_RESEARCH</meter> <low>24</low> <high>999</high> <max_meter>1</max_meter> </Condition::MeterValue> </scope> <activation> <Condition::Self/> </activation> <effects> <Effect::Destroy/> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a game. Do either A or B:
A) Set your planet's focus to research/research. Research the tech. End turn a few times. Planet is not destroyed.
B) Research the tech immediately. End turn a few times after getting it. Set focus to research/research. End turn a few times. Planet is not destroyed.
In both cases A and B, open save the game and open up the file in a text editor. Search for the name of your planet. You should find something like the following for that planet (but with a different m_current value):
<m_research> <Meter> <m_current>30</m_current> <m_max>30</m_max> </Meter> </m_research>
This indicates that the planet's max meter value is above 24 and below 999, which is specified in the effect as the minimum in the scope condition, so the planet should have been destroyed by the effect once the tech was researched.
This problem does not seem to occur with current meter values.
Investigation... Fix?
I put logger output into this function:
bool Condition::MeterValue::Match(const UniverseObject* source, const UniverseObject* target) const { Logger().debugStream() << "MeterValue::Match starting"; double low = std::max(Meter::METER_MIN, m_low->Eval(source, target)); double high = std::min(m_high->Eval(source, target), Meter::METER_MAX); if (const Meter* meter = target->GetMeter(m_meter)) { double value = m_max_meter ? meter->Max() : meter->Current(); Logger().debugStream() << "MeterValue::Match; value = " << value; return low <= value && value < high; } return false; }
After using a hack to get server logging to work (it hasn't been for some reason), the effect now seems to fire as expected. Not sure what happened or why it changed... will look into it more later, perhaps...
System Ownership Retained After Planet Deletion
Replace techs.xml with this:
<GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::MeterValue> <meter>METER_RESEARCH</meter> <low>24</low> <high>999</high> <max_meter>0</max_meter> </Condition::MeterValue> </scope> <activation> <Condition::Self/> </activation> <effects> <Effect::Destroy/> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a game, set your planet's focus to research / research. End turn until the meter grows big enough and the planet is deleted by the effect. The system name is still coloured with your empire colour, and presumably you still "own" the system according to the game. If you have no colonized planets in a system, it should revert to unowned, as if your planet had starved and been lost.
Old Fix that needs updating
To fix this, replace UniverseObject* Universe::Remove(int id) with this:
UniverseObject* Universe::Remove(int id) { UniverseObject* retval = 0; iterator it = m_objects.find(id); if (it != m_objects.end()) { retval = it->second; if (Ship* ship = universe_object_cast<Ship*>(retval)) { if (Fleet* fleet = ship->GetFleet()) { fleet->RemoveShip(ship->ID()); if (fleet->NumShips() <= 0) // delete fleet if it is now empty Delete(fleet->ID()); } } if (Planet* planet = universe_object_cast<Planet*>(retval)) { //remove all buildings from planet std::set<int> buildings = planet->Buildings(); for(std::set<int>::iterator bit = buildings.begin(); bit != buildings.end(); ++bit) planet->DeleteBuilding(*bit); // TODO: remove all specials from planet // remove all owners from planet std::set<int> temp_owner(planet->Owners()); for(std::set<int>::const_iterator own_it = temp_owner.begin();own_it != temp_owner.end();++own_it) planet->RemoveOwner(*own_it); } if (Building* building = universe_object_cast<Building*>(retval)) { if (Planet* planet = building->GetPlanet()) planet->RemoveBuilding(building->ID()); } // remove the object from the system. this has to be done after the special case for a planet being // deleted, as Planet::RemoveOwner needs to be able to determine what system the planet was in. if (System* sys = retval->GetSystem()) sys->Remove(id); m_objects.erase(id); } return retval; }
The fix for the deleted ships leaving empty fleets is also included in the above.
See Also / TODO
The above is superceded by changes to how destroy effects are executed where are suggested here. In that code, cases for destroyed planets need to be added, which would function similar to how the changes to Universe::Remove above functioned, but without adding special cases to Remove or Delete (but rather putting them in the effects code...)
Test Cases with Fixes
Primary Focus Condition: Specialized includes Balanced
Replace techs.xml with this:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::FocusType> <primary>1</primary> <FocusType>FOCUS_RESEARCH</FocusType> </Condition::FocusType> </scope> <activation><Condition::Self/></activation> <effects> <Effect::SetPlanetType>PT_GAIA</Effect::SetPlanetType> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a game and set your planet's focus to Primary Balanced (and any Secondary setting). Research the tech.
The effect of the tech fires upon the planet with Primary Balanced focus (including all uninhabited planets). It also fires if the planet's focus is set to Primary Research.
The effect does not fire on Primary Farming or other non-Balanced and non-Research focus. The Secondary Focus setting does not matter.
This effect should fire only on planets with Primary Research focus. That is, the FocusType condition should not include Primary Balanced planets when the condition requesets Primary Research, Primary Farming, Primary Mining, Primary Industry or Primary Trade focus.
As well, the FocusType condition should not include uninhabited planets, regardless of the specified FocusType.
Also note that thet effect description text (appears below tech description on research screen) says the scope include primary balanced or primary research planets. This text should not be shown as is, but should be replaced with an optional effects desription text in the stringtable, perhaps as part of the tech description entry.
Fix
This can be fixed by changing a line in Condition::FocusType::FocusType(const GG::XMLElement& elem) in Condition.cpp.
Change this:
m_foci.push_back(ParseArithmeticExpression< ::FocusType>(it->Text()));
To this:
if (it->Tag() == "FocusType") // only add focus types, not the text of the primary tag m_foci.push_back(ParseArithmeticExpression< ::FocusType>(it->Text()));
Secondary Focus Condition: Functions as Primary
Replace techs.xml with this:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::FocusType> <primary>0</primary> <FocusType>FOCUS_RESEARCH</FocusType> </Condition::FocusType> </scope> <activation><Condition::Self/></activation> <effects> <Effect::SetPlanetType>PT_GAIA</Effect::SetPlanetType> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a game and set your planet's focus to Primary Farming and Secondary Research. Research the tech, and end turn a few times to give the effect a chance to fire. It does not fire. Change the planet focus to Primary Research and Secondary Farming. End the turn. The effect fires, changing the planet's environment to Gaia.
The effect only fires on Primary Research focused worlds. The Secondary focus setting does not matter.
The effect should fire on Secondary Research focused worlds, and the Primary focus setting should not matter. That is, the FocusType condition should include Secondary Research focused planets, and not include other planets whose Secondary focus is not Research, when the specified focus is Secondary Research
Also note that thet effect description text (appears below tech description on research screen) says the scope include primary focus unknown or research. As above, this text should not be shown as is, and should be replaced with something from the stringtable.
Probable Fix
Based on looking at other conditions, the lexical_cast should probably be to bool, not ::FocusType, like this:
m_primary = lexical_cast<bool>(elem.Child("primary").Text());
I haven't tested this, but it seems pretty likely.
Chance Condition
Replace techs.xml with the following:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::Chance> <chance>0.3</chance> </Condition::Chance> </scope> <activation><Condition::Self/></activation> <effects> <Effect::SetPlanetType>PT_GAIA</Effect::SetPlanetType> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Run the game, open up the research screen, and click on the tech. The game crashes.
The problem occurs when the Chance condition is used. That is, this part of the above tech:
<Condition::Chance> <chance>0.3</chance> </Condition::Chance>
The error in the text window is:
1115148965 ERROR : main() caught exception(boost::io::format_error): boost::bad _format_string: format-string is ill-formed
Investigation / Workaround
The problem seems to be with the text in eng_stringtable.txt that is used as the format string for the description for the chance condition. The problematic strings are:
DESC_CHANCE_PERCENTAGE on a %1%% chance DESC_CHANCE_PERCENTAGE_NOT on a (100 - %1%)% chance
The extra %'s for "percent" seem to be messing with boost's parser. Changing the above this fixes the problem, sort of:
DESC_CHANCE_PERCENTAGE on a %1% percent chance DESC_CHANCE_PERCENTAGE_NOT on a (100 - %1%) percent chance
Destroy Effect On Ships Doesn't Remove Now-Empty Fleets
Replace techs.xml with the following:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::Type>OBJ_SHIP</Condition::Type> </scope> <activation><Condition::Self/></activation> <effects> <Effect::Destroy/> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start the game, research the tech, end the turn a few times. Click on your fleet icon at the homeworld, or press the fleets button, F. The game crashes.
Fix
This is dealt with by changing how theh destroy effect works, which is done by code changes suggested here.
Crash: Not WithinStarlaneJumps Destroy
Put this as your techs.xml:
<?xml version="1.0"?> <GG::XMLDoc> <Category>LEARNING_CATEGORY</Category> <Tech> <name>LRN_PHYS_BRAIN</name> <description>LRN_PHYS_BRAIN_DESC</description> <type>TT_THEORY</type> <category>LEARNING_CATEGORY</category> <research_cost>10</research_cost> <research_turns>1</research_turns> <effects> <EffectsGroup> <scope> <Condition::Not> <Condition::WithinStarlaneJumps> <jumps>2</jumps> <condition><Condition::Self/></condition> </Condition::WithinStarlaneJumps> </Condition::Not> </scope> <activation> <Condition::Self/> </activation> <effects> <Effect::Destroy/> </effects> </EffectsGroup> </effects> <prerequisites></prerequisites> <unlocked_items></unlocked_items> </Tech> </GG::XMLDoc>
Start a new game, research the tech, end your turn. The game thinks for a while, then crashes.
Fix
This is fixed by code changes suggested here.
Working Effects and Conditions
The following effects and conditions seem to be working:
- <Condition::And>
- <Condition::StarType>
- STAR_YELLOW
- STAR_ORANGE
- <Condition::Type>
- OBJ_PLANET
- OBJ_SHIP
- <Condition::Self/>
- Home planet of race that knows a tech
- Destroy
- Generally works, but has fundamental problems that intermittantly pop up
- SetPlanetType
- On habitable environments to other habitable environments (Not involving Gas Giant or Asteroids)
- <Effect::SetMeter>
- METER_POPULATION, max value, except for previously uninhabitable planets
- <Condition::WithinDistance>
- <Effect::SetEmpireStockpile>
- ST_MINERAL