Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ temp_files/
*.vcxproj.filters
*.vcxproj.user
*.opensdf
__pycache__
/LLM_Helpers/outputs/
/Logs/
/__pycache__/
/tests/__pycache__/
/Assets/Python/Contrib/Sevopedia/__pycache__/
/leaders_data.py
/Assets/CvGameCoreDLL_d.dll
/CuCuGS/CuCuGS-PoC-main/
/CuCuGS/6ef8c443795c8566442b1b66ebd1703ac7ff4e24...main.patch_no_DLL_rubbish.txt
Binary file modified Assets/CvGameCoreDLL.dll
Binary file not shown.
10 changes: 9 additions & 1 deletion Assets/Python/EntryPoints/CvScreensInterface.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import CvDebugTools
import CvDebugInfoScreen
import GameFontDisplay # advc.gfd
import CustomGameScreen # AdvCiv-SAS - CuCuGS
#import CvDiplomacy

import CvUtil
Expand Down Expand Up @@ -116,6 +117,12 @@ def showCorporationScreen():
def showOptionsScreen():
optionsScreen.interfaceScreen()

# AdvCiv-SAS - CuCuGS - Custom Game Screen
customGameScreen = CustomGameScreen.CustomGameScreen()
def showCustomGameScreen():
customGameScreen.interfaceScreen()
# AdvCiv-SAS - CuCuGS end

#foreignAdvisor = CvForeignAdvisor.CvForeignAdvisor()
foreignAdvisor = CvExoticForeignAdvisor.CvExoticForeignAdvisor()
def showForeignAdvisorScreen(argsList):
Expand Down Expand Up @@ -1185,6 +1192,7 @@ def featAccomplishedOnFocusCallback(argsList):
SPACE_SHIP_SCREEN : spaceShip,
INTRO_MOVIE_SCREEN : introMovie,
OPTIONS_SCREEN : optionsScreen,
CUSTOM_GAME_SCREEN : customGameScreen, # AdvCiv-SAS - CuCuGS
INFO_SCREEN : infoScreen,
REPLAY_SCREEN : replayScreen,
VICTORY_SCREEN : victoryScreen,
Expand All @@ -1198,7 +1206,7 @@ def featAccomplishedOnFocusCallback(argsList):
DEBUG_INFO_SCREEN : debugInfoScreen,
# advc.gfd:
GAMEFONT_DISPLAY_SCREEN : GameFontDisplay.GameFontDisplay(),

# add new screens here
}

Expand Down
1,072 changes: 1,072 additions & 0 deletions Assets/Python/Screens/CustomGameScreen.py

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions Assets/Python/Screens/CvScreenEnums.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
SPACE_SHIP_SCREEN = 28
CORPORATION_SCREEN = 29

CUSTOM_GAME_SCREEN = 33 # AdvCiv-SAS - CuCuGS

GAMEFONT_DISPLAY_SCREEN = 75 # advc.gfd

MAIN_INTERFACE = 99
Expand Down
65 changes: 65 additions & 0 deletions Assets/Python/Screens/GenericDecoratedScreen.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# AdvCiv-SAS - CuCuGS: Stripped-down version of MNAI's InterfaceUtils.py
# lfgr 09/2019: Full-screen Advisors
from CvPythonExtensions import *

import CvUtil


ArtFileMgr = CyArtFileMgr()


class GenericDecoratedScreen( object ) :

EXIT_ID = "Exit"

def getScreen( self ) :
raise NotImplementedError( "Subclasses of GenericAdvisor must implement getScreen()" )

def initDimensions( self ) :
screen = self.getScreen()

if screen.getXResolution() > 1024 :
self.wScreen = max( 1024, screen.getXResolution() )
self.hScreen = max( 720, screen.getYResolution() )
screen.setDimensions( 0, 0, self.wScreen, self.hScreen )

self.xExitButton = self.wScreen - 30
# AdvCiv-SAS - CuCuGS: Was -42. Want it to be closer to the center of the footer.
self.yExitButton = self.hScreen - 37

return self.wScreen, self.hScreen # For convenience

def addBackgroundHeaderFooter( self, szHeaderText ) :
wScreen, hScreen = self.wScreen, self.hScreen
screen = self.getScreen()

self.hHeader = 55
self.hFooter = 55
self.yFooter = hScreen - self.hFooter
self.yMainArea = self.hHeader
self.hMainArea = self.hScreen - self.hHeader - self.hFooter

# Background
screen.addDDSGFC("BackgroundPicture",
ArtFileMgr.getInterfaceArtInfo("SCREEN_BG_OPAQUE").getPath(),
0, 0, wScreen, hScreen, WidgetTypes.WIDGET_GENERAL, -1, -1 )
self.BACKGR = "Background"

# Header
screen.addPanel( "TopPanel", u"", u"", True, False, 0, 0, wScreen, self.hHeader,
PanelStyles.PANEL_STYLE_TOPBAR )
screen.setLabel( "TitleHeader", self.BACKGR, u"<font=4>" + szHeaderText + u"</font>",
CvUtil.FONT_CENTER_JUSTIFY, wScreen / 2, 8, 0, FontTypes.TITLE_FONT,
WidgetTypes.WIDGET_GENERAL, -1, -1 )

# Footer
screen.addPanel( "BottomPanel", u"", u"", True, False, 0, self.yFooter,
wScreen, self.hFooter, PanelStyles.PANEL_STYLE_BOTTOMBAR )

def addExitButton( self ) :
screen = self.getScreen()
szExitText = CyTranslator().getText("TXT_KEY_PEDIA_SCREEN_EXIT", ()).upper()
screen.setText( self.EXIT_ID, self.BACKGR, u"<font=4>" + szExitText + "</font>",
CvUtil.FONT_RIGHT_JUSTIFY, self.xExitButton, self.yExitButton, 0,
FontTypes.TITLE_FONT, WidgetTypes.WIDGET_CLOSE_SCREEN, -1, -1 )
screen.setActivation( self.EXIT_ID, ActivationTypes.ACTIVATE_MIMICPARENTFOCUS )
59 changes: 59 additions & 0 deletions Assets/XML/Text/AdvCiv-SAS_CuCuGs.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- custom: TXT KEYS that are used for the CuCuGs implementation in AdvCiv-SAS.
CuCuGs uses @f1rpo's proof of concept implementation here:

- https://forums.civfanatics.com/threads/replacing-the-custom-game-screen-proof-of-concept.670307/?utm_source=chatgpt.com
- https://github.com/f1rpo/CuCuGS-PoC/compare/6ef8c443795c8566442b1b66ebd1703ac7ff4e24...main (with my file not containing all the rubbish DLL diff that clutters the diff)

Then expanded on it to implement an actual Custom Custom game screen, with the heavy help of claude code (VS Code extension) 2025-12-31 thanks a lot.
-->
<Civ4GameText xmlns="http://www.firaxis.com">
<TEXT>
<Tag>TXT_KEY_MAP_WORLD_SIZE</Tag>
<English>World Size:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MAP_CLIMATE</Tag>
<English>Climate:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MAP_SEA_LEVEL</Tag>
<English>Sea Level:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MENU_ERA</Tag>
<English>Era:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MENU_SPEED</Tag>
<English>Speed:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_MAP_SCRIPT</Tag>
<English>Map:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_GAME_DIFFICULTY</Tag>
<English>Difficulty:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_GAME_CIVILIZATION</Tag>
<English>Civilization:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_GAME_LEADER</Tag>
<English>Leader:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_GAME_VICTORIES</Tag>
<English>Victories:</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_CUCUGS_RANDOM_LEADER</Tag>
<English>Random Leader</English>
</TEXT>
<TEXT>
<Tag>TXT_KEY_CUCUGS_RANDOM_TRAIT</Tag>
<English>Random Trait</English>
</TEXT>
</Civ4GameText>
6 changes: 6 additions & 0 deletions Assets/XML/Text/CIV4GameTextInfos_Custom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -229,4 +229,10 @@
<Tag>TXT_KEY_PEDIA_ALL_UNITS</Tag>
<English>No UnitCombat</English>
</TEXT>

<!-- AdvCiv-SAS - CuCuGS - Custom Game Screen text key -->
<TEXT>
<Tag>TXT_KEY_CUCUGS_CLOSE</Tag>
<English>Use Original Screen</English>
</TEXT>
</Civ4GameText>
2 changes: 2 additions & 0 deletions CvGameCoreDLL/CvDLLPython.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ void CyGameTextMgrInterface();
void CyHallOfFameInterface();
void CyGameCoreUtilsPythonInterface();
void CyMessageControlInterface();
void CyInitCoreInterface(); // AdvCiv-SAS - CuCuGS

//
//
Expand All @@ -53,6 +54,7 @@ DllExport void DLLPublishToPython()
CyHallOfFameInterface();
CyGameCoreUtilsPythonInterface();
CyMessageControlInterface();
CyInitCoreInterface(); // AdvCiv-SAS - CuCuGS

//
// large interfaces which can be split across files if need be
Expand Down
26 changes: 26 additions & 0 deletions CvGameCoreDLL/CvDLLWidgetData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "CvBugOptions.h"
#include "WarEvaluator.h" // advc.104l
#include "RiseFall.h" // advc.706
#include "InputSim.h" // AdvCiv-SAS - CuCuGS


CvDLLWidgetData* CvDLLWidgetData::m_pInst = NULL;
Expand Down Expand Up @@ -786,6 +787,10 @@ void CvDLLWidgetData::parseHelp(CvWStringBuffer &szBuffer,
parseGoldenAgeAnarchyHelp((PlayerTypes)widgetDataStruct.m_iData1,
widgetDataStruct.m_iData2, true, szBuffer);
break;
// <AdvCiv-SAS - CuCuGS>
case WIDGET_HELP_GAME_SPEED:
GAMETEXT.setGameSpeedHelp(szBuffer, (GameSpeedTypes)widgetDataStruct.m_iData1, widgetDataStruct.m_iData2 == 1);
break; // </AdvCiv-SAS - CuCuGS>
}
if (getActivePlayer() == NO_PLAYER)
return;
Expand Down Expand Up @@ -1098,6 +1103,27 @@ bool CvDLLWidgetData::executeAction(CvWidgetDataStruct &widgetDataExternal)
(iData1 == 1 ? CONTROL_CYCLEWORKER : CONTROL_CYCLEUNIT_ALT));
break;
} // </advc.154>
// <AdvCiv-SAS - CuCuGS>
case WIDGET_CLOSE_SCREEN:
// Check for ID of CustomGameScreen.py
if (widgetDataStruct.m_iData1 == 33)
{
switch(widgetDataStruct.m_iData2)
{
case 0: input_sim::keyPressed(VK_RETURN); break;
case 1:
{
std::vector<byte> aucKeySeq;
aucKeySeq.push_back(VK_TAB);
aucKeySeq.push_back(VK_RETURN);
input_sim::keySequence(aucKeySeq);
break;
}
case 2: input_sim::mouseClicked(); break;
}
}
break;
// </AdvCiv-SAS - CuCuGS>
}

return bHandled;
Expand Down
1 change: 1 addition & 0 deletions CvGameCoreDLL/CvEnums.h
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,7 @@ ENUM_START(Widget, WIDGET)
WIDGET_CYCLE_UNIT, // advc.154
WIDGET_EXAMINE_CITY, // advc.186b (for BULL - Zoom City Details)
WIDGET_HELP_NO_FEAR_FOR_SAFETY, // advc.500c
WIDGET_HELP_GAME_SPEED, // AdvCiv-SAS - CuCuGS
ENUM_END(Widget, WIDGET)

ENUM_START(ButtonPopup, BUTTONPOPUP)
Expand Down
23 changes: 23 additions & 0 deletions CvGameCoreDLL/CvGameTextMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22310,3 +22310,26 @@ void CvGameTextMgr::setCorporationLink(CvWString& szBuffer, CorporationTypes eCo
szBuffer.append(CvWString::format(L"<link=%s>%s</link>",
szCorpType.c_str(), GC.getInfo(eCorp).getDescription()));
}

// AdvCiv-SAS - CuCuGS:
void CvGameTextMgr::setGameSpeedHelp(CvWStringBuffer &szBuffer, GameSpeedTypes eGameSpeed, bool bReverse)
{
if (eGameSpeed != NO_GAMESPEED)
{ // (unused so far)
szBuffer.append(GC.getInfo(eGameSpeed).getHelp());
return;
}
bool bFirst = true;
for (int i = bReverse ? GC.getNumGameSpeedInfos() - 1 : 0;
bReverse ? (i >= 0) : (i < GC.getNumGameSpeedInfos()); bReverse ? (i--) : (i++))
{
CvGameSpeedInfo const& kGameSpeed = GC.getInfo((GameSpeedTypes)i);
CvWString szTempBuffer;
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),
kGameSpeed.getDescription());
szTempBuffer.append(L" - ");
szTempBuffer.append(kGameSpeed.getHelp());
setListHelp(szBuffer, L"", szTempBuffer, NEWLINE, bFirst);
bFirst = false;
}
}
3 changes: 3 additions & 0 deletions CvGameCoreDLL/CvGameTextMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@ class CvGameTextMgr
// advc.059:
void setHealthHappyBuildActionHelp(CvWStringBuffer& szBuffer, CvPlot const& kPlot, BuildTypes eBuild) const;

// AdvCiv-SAS - CuCuGS:
void setGameSpeedHelp(CvWStringBuffer &szBuffer, GameSpeedTypes eGameSpeed = NO_GAMESPEED, bool bReverse = false);

void buildObsoleteString(CvWStringBuffer& szBuffer, int iItem, bool bList = false, bool bPlayerContext = false);
void buildObsoleteBonusString(CvWStringBuffer& szBuffer, int iItem, bool bList = false, bool bPlayerContext = false);
void buildObsoleteSpecialString(CvWStringBuffer& szBuffer, int iItem, bool bList = false, bool bPlayerContext = false);
Expand Down
Loading