View Full Version : Umm... Another quick Python question
RogerBacon Jan 01, 2006, 05:35 PM What is the best way to find out which uints are in a city? Currently I plan to use onCityDoTurn. Here is the rest of the logic:
unitList = iPlayer.getUnitList()
for c in range(len(unitList)):
[tab]unit = unitList[c]
[tab]#todo: get city's plot x,y and compare it to each unit's x,y
If this is a good way to do it then I only need help with the syntax for the last line. If I'm totally off track then any suggestions on a better way would be appreciated.
Roger Bacon
Kael Jan 01, 2006, 05:47 PM Your better off getting the plot the city is on and then doing a plot.getUnits() to loop through the units. Check out: http://civilization4.net/files/modding/PythonAPI/index2.html for all the available functions.
I'm assuming you want to know all the units in a speciifc city. If you want to know all the units that are in any city your way seems as good as any other (though I don't know if that syntax is correct or not).
RogerBacon Jan 01, 2006, 06:47 PM Yes, I want to find all of the units in a city. Actually, I want to do that for each city on the map, one by one.
I found this function:
CyPlot getCityIndexPlot(INT iIndex)
for CyCity objects. I assume that will give me the Plot and then I can get the x and y from that plot and compare it to the x and y from each unit. However, I don't know what I need to pass as iIndex.
[Roger Bacon
[Edit]
OK, I have this:
unitList = iPlayer.getUnitList()
for c in range(len(unitList)):
[tab]unit = unitList[c]
[tab]thePlot = pCity.getCityIndexPlot(this)
[tab]#get city's plot x,y and compare it to each unit's x,y
[tab]if ((thePlot.getX() == unit.getX()) and ((thePlot.getY() == unit.getY())):
but I get this error
File "Shogun", line 42
if ((thePlot.getX() == unit.getX()) and ((thePlot.getY() == unit.getY())):
^
SyntaxError: invalid syntax
Any idea why? .getY is a member of CyPlot so I don't see the problem.
Ramalhão Jan 01, 2006, 07:20 PM Yes, I want to find all of the units in a city. Actually, I want to do that for each city on the map, one by one.
Hmm... Are you trying to do a new screen like Civ3 military advisor, listing all units in each city? It's a good idea. If it isn't your idea, then someone can take this idea and try to mod it :goodjob:.
RogerBacon Jan 01, 2006, 07:40 PM OK, it looks like
CyPlot getCityIndexPlot(INT iIndex)
was changed in the last patch to:
getCityIndexPlot(class CyCity {lvalue}, int)
I still have no idea what to put in for class CyCity {lvalue}, int. :(
I didn't see any getUnits() for CyPlot so I will just cycle through all of the units for now. I'll optimize it later if it runs slow.
code so far:
unitList = iPlayer.getUnitList()
for c in range(len(unitList)):
[tab]unit = unitList[c]
[tab]thePlot = pCity.getCityIndexPlot()
[tab]if (thePlot.isCity()):
[tab][tab]#get city's plot x,y and compare it to each unit's x,y
[tab][tab]if ((thePlot.getX() == unit.getX()) and (thePlot.getY() == unit.getY())):
Ramalhão: no, I'm not making a new screen. Nice idea though.
Roger Bacon
Bhruic Jan 01, 2006, 07:41 PM for iPlayer in range(gc.getMAX_PLAYERS()):
pPlayer = gc.getPlayer(iPlayer)
if (pPlayer.isAlive()):
for iCity in range(pPlayer.getNumCities()):
pCity = pPlayer.getCity(iCity)
for iUnit in range(pCity.plot().getNumUnits):
pUnit = pCity.plot().getUnit(iUnit)
# do whatever else you need to do
Should work.
Bh
Kael Jan 01, 2006, 08:21 PM for iPlayer in range(gc.getMAX_PLAYERS()):
pPlayer = gc.getPlayer(iPlayer)
if (pPlayer.isAlive()):
for iCity in range(pPlayer.getNumCities()):
pCity = pPlayer.getCity(iCity)
for iUnit in range(pCity.plot().getNumUnits):
pUnit = pCity.plot().getUnit(iUnit)
# do whatever else you need to do
Should work.
Bh
Darn you Bhruic, this is so much cleaner than the code I was using! :)
RogerBacon Jan 01, 2006, 09:12 PM for iPlayer in range(gc.getMAX_PLAYERS()):
pPlayer = gc.getPlayer(iPlayer)
if (pPlayer.isAlive()):
for iCity in range(pPlayer.getNumCities()):
pCity = pPlayer.getCity(iCity)
for iUnit in range(pCity.plot().getNumUnits):
pUnit = pCity.plot().getUnit(iUnit)
# do whatever else you need to do
Should work.
Bh
It sure did. Thanks a lot!
Roger Bacon
RogerBacon Jan 01, 2006, 11:02 PM And now you can see the fruits of my labors (and your help) at: http://forums.civfanatics.com/showthread.php?p=3521886#post3521886
Again, thanks for helping me get out in a few hours what could have taken days on my own.
Roger Bacon.
|
|