Todo List

Class Micropolis
Modify Micropolis::roadPercent, Micropolis::policePercent, and Micropolis::firePercent to hold real percentage from 0 to 100 instead of a floating point fraction

Class Micropolis
Micropolis::crimeMaxX and Micropolis::crimeMaxY seem unused.

Member Micropolis::cityMonth
Remove, can be computed from Micropolis::cityTime.

Member Micropolis::cityYear
Remove, can be computed from Micropolis::cityTime.

Member Micropolis::taxFlag
Apparently taxFlag is never set to true in MicropolisEngine or the TCL code.

Member Micropolis::taxFlag
Don should check old Mac code to see if it's ever set.

Member Micropolis::taxFlag
Variable is always 0. Decide whether to keep it, and if yes, create means to modify its value

Member Micropolis::testForConductive (const Position &pos, Direction2 testDir)
Re-use something like Micropolis::getFromMap(), and fold this function into its caller.

Member Micropolis::historyInitialized
Nobody uses this variable. Can it be removed?

Member Micropolis::graph10Max
Write-only variable. Can it be removed?

Member Micropolis::graph120Max
Write-only variable. Can it be removed?

Member Micropolis::simPaused
Variable has reversed logic, maybe use sim_running instead?

Member Micropolis::tilesAnimated
Not currently used, should hook it up.

Member Micropolis::doAnimation
Currently always true. Should connect it to a frontend option.

Member Micropolis::doMessages
Not currently used, should hook it up.

Member Micropolis::doNotices
Not currently used, should hook it up.

Member Micropolis::cityName
Write-only variable, should it be removed?

Member Micropolis::heatFlow
Always -7, should this variable be moved or removed?

Member Micropolis::heatWrap
Always 3, should this variable be moved or removed?

Member Micropolis::newMap
Write-only variable, can be removed?

Member Micropolis::newMapFlags [MAP_TYPE_COUNT]
Write-only variable, can be removed?

Member Micropolis::donDither
Variable is always 0. Can we delete the variable?

Member Micropolis::donDither
Introduce constants for the bits and/or a bool array.

Member Micropolis::blinkFlag
Variable is not used, can we remove it?

Member Micropolis::doBudgetNow (bool fromMenu)
Simplify this code. Instead of this nested mess, make a sequence of assigning funds to road, fire, and police.

Member Micropolis::doBudgetNow (bool fromMenu)
Why are we not subtracting from yumDuckets what we spend, like the code below is doing?

Member Micropolis::updateBudget ()
The scripting language should pull these raw values out and format them, instead of the simulator core formatting them and pushing them out.

Member Micropolis::makeMeltdown ()
Randomize which nuke plant melts down.

Member Micropolis::makeFlood ()
Use Direction and some form of XYPosition class here

Member Micropolis::doDisasters ()
Decide what to do with the 'nothing happens' disaster (since the chance that a disaster happens is expressed in the DisChance table).

Member Micropolis::doFlood (const Position &pos)
Use some form of rotating around a position.

Member Micropolis::cityEvaluation ()
: These strings should not be hard coded into the core simulator. The scripting language should look them up in translation files.

Member Micropolis::cityEvaluation ()
Handle lack of voting explicitly

Member Micropolis::getAssessedValue ()
Make function return the value, or change the name of the function.

Member Micropolis::getCityClass (Quad cityPop)
Put people counts into a table.

Member Micropolis::getScore (const short problemTable[PROBNUM])
Should this expression depend on CVP_NUMPROBLEMS?

Member Micropolis::saveFile (const char *filename)
Report error saving file.

Member Micropolis::loadCity (const char *filename)
In what state is the game left when loading fails?

Member Micropolis::loadCity (const char *filename)
String normalization code is duplicated in Micropolis::saveCityAs(). Extract to a sub-function.

Member Micropolis::saveCity ()
This is a no-op if the Micropolis::cityFileName is empty. In that case, we should probably warn the user about the failure.

Member Micropolis::saveCityAs (const char *filename)
String normalization code is duplicated in Micropolis::loadCity(). Extract to a sub-function.

Member Micropolis::drawMonth (short *hist, unsigned char *s, float scale)
Figure out why we copy data.

Member Micropolis::changeCensus ()
Rename function.

Member Micropolis::resetMapState ()
What should be done with this empty function?

Member Micropolis::resetEditorState ()
What should be done with this empty function?

Member Micropolis::getMicropolisVersion ()
Use this function or eliminate it.

Member Micropolis::simUpdate ()
What is the purpose of this function? (also in relation with Micropolis::simTick()).

Member Micropolis::simTick ()
What is the purpose of this function? (also in relation with Micropolis::simUpdate()).

Member Micropolis::simHeat ()
Why is Micropolis::cellSrc not allocated together with all the other variables?

Member Micropolis::simHeat ()
What is the purpose of this function?

Member Micropolis::simHeat ()
KILL the define.

Member Micropolis::checkGrowth ()
This code is very closely related to Micropolis::doPopNum(). Maybe merge both in some way? (This function gets called much more often however then doPopNum(). Also, at the first call, the difference between thisCityPop and cityPop is huge.)

Member Micropolis::doAutoGoto (short x, short y, char *msg)
msg parameter is not used!

Member Micropolis::doWinGame ()
This may not be called. Call it when appropriate.

Member Micropolis::simRandom ()
Use Wolfram's fast cellular automata pseudo random number generator.

Member Micropolis::getResource (const char *name, Quad id)
What is the point of a Quad id when we cast it to an int ?

Member Micropolis::getIndString (char *str, int id, short num)
Why do we copy the text? Can we not return its address instead?

Member Micropolis::fireAnalysis ()
Comment seems wrong; what's a firerate map?

Member Micropolis::populationDensityScan ()
The tempMap1 has MAP_BLOCKSIZE > 1, so we may be able to optimize the first x, y loop.

Member Micropolis::doSimInit ()
Create constants for initSimLoad.

Member Micropolis::decRateOfGrowthMap ()
Limiting rate should not be done here, but when we add a new value to it.

Member Micropolis::simLoadInit ()
What purpose does this serve? Weird...

Member Micropolis::setValves ()
Break the tax table out into configurable parameters.

Member Micropolis::setValves ()
Make configurable parameters.

Member Micropolis::setValves ()
Break the interesting values out into public member variables so the user interface can display them.

Member Micropolis::take10Census ()
Rename to takeMonthlyCensus (or takeMonthlySnaphshot?).

Member Micropolis::take10Census ()
A lot of this max stuff is also done in graph.cpp

Member Micropolis::collectTax ()
Break out so the user interface can configure this.

Member Micropolis::collectTax ()
Apparently taxFlag is never set to true in MicropolisEngine or the TCL code, so this always runs.

Member Micropolis::collectTax ()
Check old Mac code to see if it's ever set, and why.

Member Micropolis::collectTax ()
Do something with z? Check old Mac code to see if it's used.

Member Micropolis::doBridge (const Position &pos, MapTile tile)
What does this function return?

Member Micropolis::doBridge (const Position &pos, MapTile tile)
Discover the structure of all the magic constants.

Member Micropolis::doFire (const Position &pos)
Needs a notion of iterative neighbour tiles computing.

Member Micropolis::doFire (const Position &pos)
Use a getFromMap()-like function here.

Member Micropolis::doFire (const Position &pos)
Extract constants of fire station effectiveness from here.

Member Micropolis::drawStadium (const Position &center, MapTile z)
Merge with zonePlop()-like function.

Member Micropolis::initSprite (SimSprite *sprite, int x, int y)
Make derived classes for each type.

Member Micropolis::initSprite (SimSprite *sprite, int x, int y)
Move code to (derived) SimSprite methods.

Member Micropolis::destroySprite (SimSprite *sprite)
Break the connection between any views that are following this sprite.

Member Micropolis::turnTo (int p, int d)
Remove local magic constants and document the code.

Member Micropolis::tryOther (int Tpoo, int Told, int Tnew)
Figure out what this function is doing.

Member Micropolis::tryOther (int Tpoo, int Told, int Tnew)
Remove local magic constants and document the code.

Member Micropolis::getDir (int orgX, int orgY, int desX, int desY)
Remove local magic constants and document the code.

Member Micropolis::moveObjects ()
It uses SimSprite::name[0] == '' as condition which seems stupid.

Member Micropolis::moveObjects ()
Micropolis::destroySprite modifies the Micropolis::spriteList while we loop over it.

Member Micropolis::doTrainSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::doCopterSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::doAirplaneSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::doAirplaneSprite (SimSprite *sprite)
absDist gets updated by Micropolis::getDir(), which is not always called before reading it (or worse, we just turned towards the old destination).

Member Micropolis::doShipSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::doMonsterSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::doTornadoSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::doBusSprite (SimSprite *sprite)
Remove local magic constants and document the code.

Member Micropolis::explodeSprite (SimSprite *sprite)
Add a 'bus crashed' message to MessageNumber.

Member Micropolis::makeMonster ()
Make monster over land, because it disappears if it's made over water. Better yet make monster not disappear for a while after it's created, over land or water. Should never disappear prematurely.

Member Micropolis::tickCount ()
Figure out what a 'tick' is.

Member Micropolis::initGame ()
we seem to have several of these functions.

Member Micropolis::getPowerGrid (int x, int y)
Use world coordinates instead (use powerGridMap.worldGet() instead).

Member Micropolis::setPowerGrid (int x, int y, int power)
Use world coordinates instead (use powerGridMap.worldSet() instead).

Member Micropolis::getPopulationDensity (int x, int y)
Use world coordinates instead (use populationDensityMap.worldGet() instead).

Member Micropolis::setPopulationDensity (int x, int y, int density)
Use world coordinates instead (use populationDensityMap.worldSet() instead).

Member Micropolis::getRateOfGrowth (int x, int y)
Use world coordinates instead (use rateOfGrowthMap.worldGet() instead).

Member Micropolis::setRateOfGrowth (int x, int y, int rate)
Use world coordinates instead (use rateOfGrowthMap.worldSet() instead).

Member Micropolis::getTrafficDensity (int x, int y)
Use world coordinates instead (use trafficDensityMap.worldGet() instead).

Member Micropolis::setTrafficDensity (int x, int y, int density)
Use world coordinates instead (use trafficDensityMap.worldSet() instead).

Member Micropolis::getPollutionDensity (int x, int y)
Use world coordinates instead (use pollutionDensityMap.worldGet() instead).

Member Micropolis::setPollutionDensity (int x, int y, int density)
Use world coordinates instead (use pollutionDensityMap.worldSet() instead).

Member Micropolis::getCrimeRate (int x, int y)
Use world coordinates instead (use crimeRateMap.worldGet() instead).

Member Micropolis::setCrimeRate (int x, int y, int rate)
Use world coordinates instead (use crimeRateMap.worldSet() instead).

Member Micropolis::getLandValue (int x, int y)
Use world coordinates instead (use landValueMap.worldGet() instead).

Member Micropolis::setLandValue (int x, int y, int value)
Use world coordinates instead (use landValueMap.worldSet() instead).

Member Micropolis::getFireCoverage (int x, int y)
Use world coordinates instead (use fireStationEffectMap.worldGet() instead).

Member Micropolis::setFireCoverage (int x, int y, int coverage)
Use world coordinates instead (use fireStationEffectMap.worldSet() instead).

Member Micropolis::getPoliceCoverage (int x, int y)
Use world coordinates instead (use policeStationEffectMap.worldGet() instead).

Member Micropolis::setPoliceCoverage (int x, int y, int coverage)
Use world coordinates instead (use policeStationEffectMap.worldSet() instead).

Member Micropolis::toolDown (EditingTool tool, short tileX, short tileY)
: Multi player: This sound should only be heard by the user who called this function.

Member Micropolis::bulldozerTool (short x, short y, ToolEffects *effects)
Code is too complex/long.

Member Micropolis::roadTool (short x, short y, ToolEffects *effects)
Merge roadTool, railroadTool, wireTool, and parkTool functions.

Member Micropolis::networkTool (short x, short y, ToolEffects *effects)
Is this ever used?

Member Micropolis::landTool (short x, short y, ToolEffects *effects)
: Is this good? It is not auto-bulldoze!!

Member Micropolis::landTool (short x, short y, ToolEffects *effects)
: Handle result value (probably)

Member Micropolis::forestTool (short x, short y, ToolEffects *effects)
bulldozer should be free in terrain mode or from a free tool.

Member Micropolis::putDownPark (short mapH, short mapV, ToolEffects *effects)
Add auto-bulldoze? (seems to be missing).

Member Micropolis::putDownNetwork (short mapH, short mapV, ToolEffects *effects)
Auto-bulldoze costs should be pulled from a table/constant.

Member Micropolis::putDownLand (short mapH, short mapV, ToolEffects *effects)
Auto-bulldoze deducts always 1.

Member Micropolis::putDownLand (short mapH, short mapV, ToolEffects *effects)
Auto-bulldoze costs should be pulled from a table/constant.

Member Micropolis::putDownForest (short mapH, short mapV, ToolEffects *effects)
Auto-bulldoze deducts always 1.

Member Micropolis::putBuilding (int leftX, int topY, int sizeX, int sizeY, MapTile baseTile, bool aniFlag, ToolEffects *effects)
We should ask the buildings themselves how they should be drawn.

Member Micropolis::buildBuilding (int mapH, int mapV, const BuildingProperties *bprops, ToolEffects *effects)
Give putBuilding a BuildingProperties pointer instead.

Member Micropolis::buildBuilding (int mapH, int mapV, const BuildingProperties *bprops, ToolEffects *effects)
Move cost into building properties?

Member Micropolis::findPerimeterRoad (Position *pos)
We could randomize the search.

Member Micropolis::findPerimeterTelecom (const Position &pos)
Decide whether we want telecomm code.

Member Micropolis::updateUserInterface ()
Keeping track of pending updates should be moved to the interface (the simulator generates events, the interface forwards them to the GUI when possible/allowed.

Member Micropolis::updateUserInterface ()
Send all pending update messages to the user interface.

Member Micropolis::setSmoke (const Position &pos, bool zonePower)
Why div 8? Industry is 9 tiles long!!

Member Micropolis::setSmoke (const Position &pos, bool zonePower)
Why do we assign the same map position twice?

Member Micropolis::setSmoke (const Position &pos, bool zonePower)
Add SMOKEBASE into aniTabA and aniTabB tables?

Member Micropolis::setSmoke (const Position &pos, bool zonePower)
Why do we assign the same map position twice?

Member Micropolis::buildHouse (const Position &pos, int value)
Have some form of looking around the center tile (like getFromMap())

Member Micropolis::buildHouse (const Position &pos, int value)
Move the code below to a better place. If we just updated hscore above, we could

Member Micropolis::buildHouse (const Position &pos, int value)
Is HOUSE the proper constant here?

Member Micropolis::doCommercial (const Position &pos, bool zonePower)
Make zonePwrFlg a boolean.

Member Micropolis::doIndustrial (const Position &pos, bool zonePower)
Make zonePwrFlg a boolean.

Class SimSprite
SimSprite::name is never set to anything else than "", and only used to detect a non-removed non-active sprite (in a non-robust way).

Class ToolEffects
Extend the class for storing messages and sounds.

Member ruleTables
generalized parameterized heat diffusion

Member ruleTables
bit mask of neighbors to add (9 bits)

Member ruleTables
shift count (power of two division)

Member ruleTables
frob offset (overall heat gain)

Member ruleTables
pass in different masks and shifts to implement symetric 8 and 4

Member ruleTables
neighbor heats, as well as vertical, horizontal, diagonal, and asymetric heat flow fields

Member ruleTables
logical operations

Member ruleTables
add pixels

Member ruleTables
map pixels

Member animatedTiles
Generate the table below from the animation sequences file doc/AnimationSequences.txt and the doc/genAnimationTable.py program

Member IS_INTEL
Determine byte order a better way.

Member CityVotingProblems
Eliminate PROBNUM

Member MapTileBits
ALLBITS should end with MASK.

Member MapTileBits
Decide what to do with ANIMBIT (since sim-backend may not be the optimal place to do animation).

Member MapTileBits
How many of these bits can be derived from the displayed tile?

Member MapTileCharacters
Add TILE_ prefix

Member MapTileCharacters
Make LOW/BASE and LAST/HIGH consistent everywhere?

Member MapTileCharacters
Figure out what sprite groups really exist (maybe we can learn more by examining the actual sprites, and/or by using hexadecimal or bite-wise notation?)

Member MapTileCharacters
Add comments for each sprite (0--1023)

Member ToolResult
Make the rest of the code use this instead of magic numbers.

Member BITS_PER_TILE
Only used in python/micropolisdrawingarea.py

Member BYTES_PER_TILE
Only used in python/micropolisdrawingarea.py

Member HISTORY_COUNT
It is not really a count of histories, rename to something else?

Member WORLD_W_2
Make a Map class that keeps its 2x2 square storage details internally, so the code doesn't need to bother with it.

Member WORLD_W_4
Make a Map class that keeps its 4x4 square storage details internally, so the code doesn't need to bother with it.

Member WORLD_W_8
Make a Map class that keeps its 8x8 square storage details internally, so the code doesn't need to bother with it.

Member not_reached
Generalize error handling/exiting of the simulator.

Member Direction2
Eliminate Direction.

Member Direction2
After eliminating Direction, rename this enum to Direction.

Member CENSUS_FREQUENCY_10
Rename to CENSUS_MONTHLY_FREQUENCY or so?

Member CENSUS_FREQUENCY_120
Rename to CENSUS_YEARLY_FREQUENCY or so?

Member gToolSize
This information is duplicated in the BuildingProperties at least.

Member checkBigZone
Make this table driven.

Member Pycairo_CAPI
Make an interface class, and move the global below to a derived class

Generated on Wed Feb 2 09:19:22 2011 for Micropolis by  doxygen 1.5.6