[PYTHON] Top Civ Score Board

Zebra 9

Emperor
Joined
May 17, 2006
Messages
1,554
Location
Middle of Cyberspace
Top Civ Score Board MOD COMP v0.1

Type: PYTHON MOD COMP
Version: 0.1
Langages Used: Python, XML
By: Zebra 9
Multiplayer Compatible: Shouldn't affect MP games
File DB: Download Here
Description:
Only displays the top five scoring civs on the main interface. Now this would be great for any MOD that allows playing with more then 24 civs because you can limit the number of civs displayed on the score board.:goodjob:

For MODers:
The Number Of Civs That Are Displayed Is Controled By The Global Define MAX_CIV_SCORES, which if set to 0 (or anything less) turns this MOD COMP off.

Thanks to cotdamn for the idea.:goodjob::cool::king:

Installation:
1) Unzip into "My Documents\My Games\Warlords\MODS".
2) Load the game.
3) Click on "Advanced"-->"Load A MOD"-->"Top Scores"-->"OK", the Game will restart.
4) Now you can play as normal

Enjoy! :goodjob:
 

Attachments

  • Civ4ScreenShot0034.JPG
    Civ4ScreenShot0034.JPG
    215 KB · Views: 499
Nice comp Zebra 9, its great that some of the smallest changes can be the most useful.

But I do have one request, could you put notes with the name of the mod or your name around the code you change, its a pain to have to winmerge it with the vanilla file to see what you change.

Other then that, keep up the great pythoning. :)
 
I've done something similar for CCV. You can find it in 2.05e alpha 1 (or higher), release in 12 hours from now. Follow the link in my signature. There are only changes in CvMainInterface.py - search for "# CCV Anzeigenkorrektur der Punkte rechts auf dem Screen fuer viele (bekannte) Civs im Spiel". My version displays 21 civs, for higher resolutions you can use more. It's easy to change, (german) hints are in the file.

€: It's online. Download.

Caution: The link leads to an early alpha. If you like to play CCV check here for bugfixes or new versions!
 
here's an easy fix, pretty sure you can make that "20" just about any number you want, but if it goes higher than 24, you may have graphical oddities.

Yeah I've had problems with that before, so I found a quick fix which makes the scoreboard the "Top 20" instead. See bolded code below.

CvMainInterface.py:
Code:
	# Will update the scores
	def updateScoreStrings( self ):
	
		screen = CyGInterfaceScreen( "MainInterface", CvScreenEnums.MAIN_INTERFACE )

		xResolution = screen.getXResolution()
		yResolution = screen.getYResolution()
		
		screen.hide( "ScoreBackground" )
		
		for i in range( gc.getMAX_PLAYERS() ):
			szName = "ScoreText" + str(i)
			screen.hide( szName )

		iWidth = 0
		iCount = 0
		iBtnHeight = 22
		
		if ((CyInterface().getShowInterface() != InterfaceVisibility.INTERFACE_HIDE_ALL and CyInterface().getShowInterface() != InterfaceVisibility.INTERFACE_MINIMAP_ONLY)):
			if (CyInterface().isScoresVisible() and not CyInterface().isCityScreenUp() and CyEngine().isGlobeviewUp() == false):

[b]##### Make scoreboard TOP 20
				i = 20
#####				i = gc.getMAX_CIV_TEAMS() - 1[/b]
 
Well I did this in the WoC for up to 24

Spoiler :
PHP:
def updateScoreStrings( self ):
	
		screen = CyGInterfaceScreen( "MainInterface", CvScreenEnums.MAIN_INTERFACE )

		xResolution = screen.getXResolution()
		yResolution = screen.getYResolution()
		
		screen.hide( "ScoreBackground" )
		
		for i in range( gc.getMAX_PLAYERS() ):
			szName = "ScoreText" + str(i)
			screen.hide( szName )

		iWidth = 0
		iCount = 0
		iBtnHeight = 22
		
		if ((CyInterface().getShowInterface() != InterfaceVisibility.INTERFACE_HIDE_ALL and CyInterface().getShowInterface() != InterfaceVisibility.INTERFACE_MINIMAP_ONLY)):
			if (CyInterface().isScoresVisible() and not CyInterface().isCityScreenUp() and CyEngine().isGlobeviewUp() == false):

				# Cap Scoreboard at 24 players			                  4/8/08                     JOHNY SMITH
				if (gc.getMAX_CIV_TEAMS() - 1) > 18:
					i = 23
				else:
					i = gc.getMAX_CIV_TEAMS() - 1
				#END                                                                                            4/8/08                     JOHNY SMITH
				while (i > -1):
					eTeam = gc.getGame().getRankTeam(i)

					if (gc.getTeam(gc.getGame().getActiveTeam()).isHasMet(eTeam) or gc.getTeam(eTeam).isHuman() or gc.getGame().isDebugMode()):
						j = gc.getMAX_CIV_PLAYERS() - 1
						while (j > -1):
							ePlayer = gc.getGame().getRankPlayer(j)

							if (not CyInterface().isScoresMinimized() or gc.getGame().getActivePlayer() == ePlayer):
								if (gc.getPlayer(ePlayer).isAlive() and not gc.getPlayer(ePlayer).isMinorCiv()):

									if (gc.getPlayer(ePlayer).getTeam() == eTeam):
										szBuffer = u"<font=2>"

										if (gc.getGame().isGameMultiPlayer()):
											if (not (gc.getPlayer(ePlayer).isTurnActive())):
												szBuffer = szBuffer + "*"

										if (not CyInterface().isFlashingPlayer(ePlayer) or CyInterface().shouldFlash(ePlayer)):
											if (ePlayer == gc.getGame().getActivePlayer()):
												szTempBuffer = u"%d: [<color=%d,%d,%d,%d>%s</color>]" %(gc.getGame().getPlayerScore(ePlayer), gc.getPlayer(ePlayer).getPlayerTextColorR(), gc.getPlayer(ePlayer).getPlayerTextColorG(), gc.getPlayer(ePlayer).getPlayerTextColorB(), gc.getPlayer(ePlayer).getPlayerTextColorA(), gc.getPlayer(ePlayer).getName())
											else:
												szTempBuffer = u"%d: <color=%d,%d,%d,%d>%s</color>" %(gc.getGame().getPlayerScore(ePlayer), gc.getPlayer(ePlayer).getPlayerTextColorR(), gc.getPlayer(ePlayer).getPlayerTextColorG(), gc.getPlayer(ePlayer).getPlayerTextColorB(), gc.getPlayer(ePlayer).getPlayerTextColorA(), gc.getPlayer(ePlayer).getName())
										else:
											szTempBuffer = u"%d: %s" %(gc.getGame().getPlayerScore(ePlayer), gc.getPlayer(ePlayer).getName())
										szBuffer = szBuffer + szTempBuffer

										if (gc.getTeam(eTeam).isAlive()):
											if ( not (gc.getTeam(gc.getGame().getActiveTeam()).isHasMet(eTeam)) ):
												szBuffer = szBuffer + (" ?")
											if (gc.getTeam(eTeam).isAtWar(gc.getGame().getActiveTeam())):
												szBuffer = szBuffer + "("  + localText.getColorText("TXT_KEY_CONCEPT_WAR", (), gc.getInfoTypeForString("COLOR_RED")).upper() + ")"
											if (gc.getPlayer(ePlayer).canTradeNetworkWith(gc.getGame().getActivePlayer()) and (ePlayer != gc.getGame().getActivePlayer())):
												szTempBuffer = u"%c" %(CyGame().getSymbolID(FontSymbols.TRADE_CHAR))
												szBuffer = szBuffer + szTempBuffer
											if (gc.getTeam(eTeam).isOpenBorders(gc.getGame().getActiveTeam())):
												szTempBuffer = u"%c" %(CyGame().getSymbolID(FontSymbols.OPEN_BORDERS_CHAR))
												szBuffer = szBuffer + szTempBuffer
											if (gc.getTeam(eTeam).isDefensivePact(gc.getGame().getActiveTeam())):
												szTempBuffer = u"%c" %(CyGame().getSymbolID(FontSymbols.DEFENSIVE_PACT_CHAR))
												szBuffer = szBuffer + szTempBuffer
											if (gc.getPlayer(ePlayer).getStateReligion() != -1):
												if (gc.getPlayer(ePlayer).hasHolyCity(gc.getPlayer(ePlayer).getStateReligion())):
													szTempBuffer = u"%c" %(gc.getReligionInfo(gc.getPlayer(ePlayer).getStateReligion()).getHolyCityChar())
													szBuffer = szBuffer + szTempBuffer
												else:
													szTempBuffer = u"%c" %(gc.getReligionInfo(gc.getPlayer(ePlayer).getStateReligion()).getChar())
													szBuffer = szBuffer + szTempBuffer
											if (gc.getTeam(eTeam).getEspionagePointsAgainstTeam(gc.getGame().getActiveTeam()) < gc.getTeam(gc.getGame().getActiveTeam()).getEspionagePointsAgainstTeam(eTeam)):
												szTempBuffer = u"%c" %(gc.getCommerceInfo(CommerceTypes.COMMERCE_ESPIONAGE).getChar())
												szBuffer = szBuffer + szTempBuffer
										
										bEspionageCanSeeResearch = false
										for iMissionLoop in range(gc.getNumEspionageMissionInfos()):
											if (gc.getEspionageMissionInfo(iMissionLoop).isSeeResearch()):
												bEspionageCanSeeResearch = gc.getPlayer(gc.getGame().getActivePlayer()).canDoEspionageMission(iMissionLoop, ePlayer, None, -1)
												break
										
										if (((gc.getPlayer(ePlayer).getTeam() == gc.getGame().getActiveTeam()) and (gc.getTeam(gc.getGame().getActiveTeam()).getNumMembers() > 1)) or (gc.getTeam(gc.getPlayer(ePlayer).getTeam()).isVassal(gc.getGame().getActiveTeam())) or gc.getGame().isDebugMode() or bEspionageCanSeeResearch):
											if (gc.getPlayer(ePlayer).getCurrentResearch() != -1):
												szTempBuffer = u"-%s (%d)" %(gc.getTechInfo(gc.getPlayer(ePlayer).getCurrentResearch()).getDescription(), gc.getPlayer(ePlayer).getResearchTurnsLeft(gc.getPlayer(ePlayer).getCurrentResearch(), True))
												szBuffer = szBuffer + szTempBuffer
										if (CyGame().isNetworkMultiPlayer()):
											szBuffer = szBuffer + CyGameTextMgr().getNetStats(ePlayer)
											
										if (gc.getPlayer(ePlayer).isHuman() and CyInterface().isOOSVisible()):
											szTempBuffer = u" <color=255,0,0>* %s *</color>" %(CyGameTextMgr().getOOSSeeds(ePlayer))
											szBuffer = szBuffer + szTempBuffer
											
										szBuffer = szBuffer + "</font>"

										if ( CyInterface().determineWidth( szBuffer ) > iWidth ):
											iWidth = CyInterface().determineWidth( szBuffer )

										szName = "ScoreText" + str(ePlayer)
										if ( CyInterface().getShowInterface() == InterfaceVisibility.INTERFACE_SHOW or CyInterface().isInAdvancedStart()):
											yCoord = yResolution - 206
										else:
											yCoord = yResolution - 88
										screen.setText( szName, "Background", szBuffer, CvUtil.FONT_RIGHT_JUSTIFY, xResolution - 12, yCoord - (iCount * iBtnHeight), -0.3, FontTypes.SMALL_FONT, WidgetTypes.WIDGET_CONTACT_CIV, ePlayer, -1 )
										screen.show( szName )
										
										CyInterface().checkFlashReset(ePlayer)

										iCount = iCount + 1
							j = j - 1
					i = i - 1

				if ( CyInterface().getShowInterface() == InterfaceVisibility.INTERFACE_SHOW or CyInterface().isInAdvancedStart()):
					yCoord = yResolution - 186
				else:
					yCoord = yResolution - 68
				screen.setPanelSize( "ScoreBackground", xResolution - 21 - iWidth, yCoord - (iBtnHeight * iCount) - 4, iWidth + 12, (iBtnHeight * iCount) + 8 )
				screen.show( "ScoreBackground" )

or since we can swap screens. Did this to show up to 36.

Spoiler :
PHP:
def updateScoreStrings( self ):
	
		screen = CyGInterfaceScreen( "MainInterface", CvScreenEnums.MAIN_INTERFACE )

		xResolution = screen.getXResolution()
		yResolution = screen.getYResolution()
		
		screen.hide( "ScoreBackground" )
		
		for i in range( gc.getMAX_PLAYERS() ):
			szName = "ScoreText" + str(i)
			screen.hide( szName )

		iWidth = 0
		iCount = 0
		# Shrinks the text for 36 players			              4/8/08                     JOHNY SMITH
		iBtnHeight = 16
		#END                                                                                        4/8/08                     JOHNY SMITH
		
		if ((CyInterface().getShowInterface() != InterfaceVisibility.INTERFACE_HIDE_ALL and CyInterface().getShowInterface() != InterfaceVisibility.INTERFACE_MINIMAP_ONLY)):
			if (CyInterface().isScoresVisible() and not CyInterface().isCityScreenUp() and CyEngine().isGlobeviewUp() == false):

				# Cap Scoreboard at 36 players			                  4/8/08                     JOHNY SMITH
				if (gc.getMAX_CIV_TEAMS() - 1) > 18:
					i = 35
				else:
					i = gc.getMAX_CIV_TEAMS() - 1
				#END                                                                                            4/8/08                     JOHNY SMITH
				while (i > -1):
					eTeam = gc.getGame().getRankTeam(i)

					if (gc.getTeam(gc.getGame().getActiveTeam()).isHasMet(eTeam) or gc.getTeam(eTeam).isHuman() or gc.getGame().isDebugMode()):
						j = gc.getMAX_CIV_PLAYERS() - 1
						while (j > -1):
							ePlayer = gc.getGame().getRankPlayer(j)

							if (not CyInterface().isScoresMinimized() or gc.getGame().getActivePlayer() == ePlayer):
								if (gc.getPlayer(ePlayer).isAlive() and not gc.getPlayer(ePlayer).isMinorCiv()):

									if (gc.getPlayer(ePlayer).getTeam() == eTeam):
										szBuffer = u"<font=2>"

										if (gc.getGame().isGameMultiPlayer()):
											if (not (gc.getPlayer(ePlayer).isTurnActive())):
												szBuffer = szBuffer + "*"

										if (not CyInterface().isFlashingPlayer(ePlayer) or CyInterface().shouldFlash(ePlayer)):
											if (ePlayer == gc.getGame().getActivePlayer()):
												szTempBuffer = u"%d: [<color=%d,%d,%d,%d>%s</color>]" %(gc.getGame().getPlayerScore(ePlayer), gc.getPlayer(ePlayer).getPlayerTextColorR(), gc.getPlayer(ePlayer).getPlayerTextColorG(), gc.getPlayer(ePlayer).getPlayerTextColorB(), gc.getPlayer(ePlayer).getPlayerTextColorA(), gc.getPlayer(ePlayer).getName())
											else:
												szTempBuffer = u"%d: <color=%d,%d,%d,%d>%s</color>" %(gc.getGame().getPlayerScore(ePlayer), gc.getPlayer(ePlayer).getPlayerTextColorR(), gc.getPlayer(ePlayer).getPlayerTextColorG(), gc.getPlayer(ePlayer).getPlayerTextColorB(), gc.getPlayer(ePlayer).getPlayerTextColorA(), gc.getPlayer(ePlayer).getName())
										else:
											szTempBuffer = u"%d: %s" %(gc.getGame().getPlayerScore(ePlayer), gc.getPlayer(ePlayer).getName())
										szBuffer = szBuffer + szTempBuffer

										if (gc.getTeam(eTeam).isAlive()):
											if ( not (gc.getTeam(gc.getGame().getActiveTeam()).isHasMet(eTeam)) ):
												szBuffer = szBuffer + (" ?")
											if (gc.getTeam(eTeam).isAtWar(gc.getGame().getActiveTeam())):
												szBuffer = szBuffer + "("  + localText.getColorText("TXT_KEY_CONCEPT_WAR", (), gc.getInfoTypeForString("COLOR_RED")).upper() + ")"
											if (gc.getPlayer(ePlayer).canTradeNetworkWith(gc.getGame().getActivePlayer()) and (ePlayer != gc.getGame().getActivePlayer())):
												szTempBuffer = u"%c" %(CyGame().getSymbolID(FontSymbols.TRADE_CHAR))
												szBuffer = szBuffer + szTempBuffer
											if (gc.getTeam(eTeam).isOpenBorders(gc.getGame().getActiveTeam())):
												szTempBuffer = u"%c" %(CyGame().getSymbolID(FontSymbols.OPEN_BORDERS_CHAR))
												szBuffer = szBuffer + szTempBuffer
											if (gc.getTeam(eTeam).isDefensivePact(gc.getGame().getActiveTeam())):
												szTempBuffer = u"%c" %(CyGame().getSymbolID(FontSymbols.DEFENSIVE_PACT_CHAR))
												szBuffer = szBuffer + szTempBuffer
											if (gc.getPlayer(ePlayer).getStateReligion() != -1):
												if (gc.getPlayer(ePlayer).hasHolyCity(gc.getPlayer(ePlayer).getStateReligion())):
													szTempBuffer = u"%c" %(gc.getReligionInfo(gc.getPlayer(ePlayer).getStateReligion()).getHolyCityChar())
													szBuffer = szBuffer + szTempBuffer
												else:
													szTempBuffer = u"%c" %(gc.getReligionInfo(gc.getPlayer(ePlayer).getStateReligion()).getChar())
													szBuffer = szBuffer + szTempBuffer
											if (gc.getTeam(eTeam).getEspionagePointsAgainstTeam(gc.getGame().getActiveTeam()) < gc.getTeam(gc.getGame().getActiveTeam()).getEspionagePointsAgainstTeam(eTeam)):
												szTempBuffer = u"%c" %(gc.getCommerceInfo(CommerceTypes.COMMERCE_ESPIONAGE).getChar())
												szBuffer = szBuffer + szTempBuffer
										
										bEspionageCanSeeResearch = false
										for iMissionLoop in range(gc.getNumEspionageMissionInfos()):
											if (gc.getEspionageMissionInfo(iMissionLoop).isSeeResearch()):
												bEspionageCanSeeResearch = gc.getPlayer(gc.getGame().getActivePlayer()).canDoEspionageMission(iMissionLoop, ePlayer, None, -1)
												break
										
										if (((gc.getPlayer(ePlayer).getTeam() == gc.getGame().getActiveTeam()) and (gc.getTeam(gc.getGame().getActiveTeam()).getNumMembers() > 1)) or (gc.getTeam(gc.getPlayer(ePlayer).getTeam()).isVassal(gc.getGame().getActiveTeam())) or gc.getGame().isDebugMode() or bEspionageCanSeeResearch):
											if (gc.getPlayer(ePlayer).getCurrentResearch() != -1):
												szTempBuffer = u"-%s (%d)" %(gc.getTechInfo(gc.getPlayer(ePlayer).getCurrentResearch()).getDescription(), gc.getPlayer(ePlayer).getResearchTurnsLeft(gc.getPlayer(ePlayer).getCurrentResearch(), True))
												szBuffer = szBuffer + szTempBuffer
										if (CyGame().isNetworkMultiPlayer()):
											szBuffer = szBuffer + CyGameTextMgr().getNetStats(ePlayer)
											
										if (gc.getPlayer(ePlayer).isHuman() and CyInterface().isOOSVisible()):
											szTempBuffer = u" <color=255,0,0>* %s *</color>" %(CyGameTextMgr().getOOSSeeds(ePlayer))
											szBuffer = szBuffer + szTempBuffer
											
										szBuffer = szBuffer + "</font>"

										if ( CyInterface().determineWidth( szBuffer ) > iWidth ):
											iWidth = CyInterface().determineWidth( szBuffer )

										szName = "ScoreText" + str(ePlayer)
										if ( CyInterface().getShowInterface() == InterfaceVisibility.INTERFACE_SHOW or CyInterface().isInAdvancedStart()):
											yCoord = yResolution - 206
										else:
											yCoord = yResolution - 88
										#Adjust the scoreboard area for 36 players			  4/8/08                     JOHNY SMITH
										screen.setText( szName, "Background", szBuffer, CvUtil.FONT_RIGHT_JUSTIFY, xResolution - 12, yCoord - (iCount * iBtnHeight) + 48, -0.3, FontTypes.SMALL_FONT, WidgetTypes.WIDGET_CONTACT_CIV, ePlayer, -1 )
										#END                                                                                                  4/8/08                     JOHNY SMITH
										screen.show( szName )
										
										CyInterface().checkFlashReset(ePlayer)

										iCount = iCount + 1
							j = j - 1
					i = i - 1

				if ( CyInterface().getShowInterface() == InterfaceVisibility.INTERFACE_SHOW or CyInterface().isInAdvancedStart()):
					yCoord = yResolution - 186
				else:
					yCoord = yResolution - 68
				#Adjust the scoreboard area for 36 players			  4/8/08                     JOHNY SMITH
				screen.setPanelSize( "ScoreBackground", xResolution - 21 - iWidth, yCoord - (iBtnHeight * iCount) + 36, iWidth + 12, (iBtnHeight * iCount) + 8 )
				#END                                                                                                  4/8/08                     JOHNY SMITH
				screen.show( "ScoreBackground" )
The extra number comes from counting yourself I thought. And this helps if someone is using a dll with less civs.

I don't know if anyone has found a better way or not. I would like a scroll bar, or something dynamic.
 
a scroll bar would be ideal, but yea, python isn't my thing, but I can cut and paste other peoples stuff together and make it work. ;)

if anyone would make a scroll bar for the scoreboard, I'd be very grateful. I'm in need of that for a renaissance europe scenario I'm building, with 35 civs (only 30 are playable).

Shiggs
 
You can stop working on this. It's done. :D Release with the first version of CCV for BTS 3.17. If there is not too much trouble with new versions and bugfixes I think it will be available for you all in two or three weeks. But if you want you can have a look at the first screens! Here.
 
Never added a scroll bar to anything, I'll see what I can do.

I don't remember ever accually adding a scrollbar to anything in Civ4. Panel widgets have an argument that tells if it is scrollable or not.
Code:
VOID addPanel(STRING szName, STRING title, STRING helpText, BOOL bVerticalLayout, [B]BOOL bScrollable[/B], INT iX, INT iY, INT iWidth, INT iHeight, PanelStyle eStyle)

There is also this method.
Code:
VOID addScrollPanel(STRING szName, STRING title, INT iX, INT iY, INT iWidth, INT iHeight, PanelStyle eStyle)
 
I don't remember ever accually adding a scrollbar to anything in Civ4. Panel widgets have an argument that tells if it is scrollable or not.
Code:
VOID addPanel(STRING szName, STRING title, STRING helpText, BOOL bVerticalLayout, [B]BOOL bScrollable[/B], INT iX, INT iY, INT iWidth, INT iHeight, PanelStyle eStyle)

There is also this method.
Code:
VOID addScrollPanel(STRING szName, STRING title, INT iX, INT iY, INT iWidth, INT iHeight, PanelStyle eStyle)

I'm sorry but nothing of the stuff you posted was needed to do it. ;)
 
I'm sorry but nothing of the stuff you posted was needed to do it. ;)

Well then I'm interested to see how you do it.

After taking a glance at the CvMainInterface.py file, the line that creates the ScoreBackground panel.
Code:
		screen.addPanel( "ScoreBackground", u"", u"", True, [B]False[/B], 0, 0, 0, 0, PanelStyles.PANEL_STYLE_HUD_HELP )
You should be able to change the fifth argument, the one I put in bold, from False to True and that should make the panel vertically scrollable.

If you did it some other way the by all means share the knowledge. :)
 
Top Bottom