Skip to content

Commit fe7dc68

Browse files
Add custom character icons to modpacks
1 parent 50c01cc commit fe7dc68

File tree

59 files changed

+167
-5
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+167
-5
lines changed

_modpacks/packs/cswt/2.0_SF/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"version":"2.0",
77
"entity":"modpack",
88
"type":"primary",
9-
"last_updated":"2024/11/28",
9+
"last_updated":"2025/08/10",
1010
"resources":"cswt"
1111
}
1212
}

_modpacks/packs/cswt/development/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"version":"1.0",
77
"entity":"modpack",
88
"type":"primary",
9-
"last_updated":"2024/11/28",
9+
"last_updated":"2025/08/10",
1010
"resources":"cswt"
1111
}
1212
}

_modpacks/packs/cswt/stable/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"version":"2.0",
77
"entity":"modpack",
88
"type":"primary",
9-
"last_updated":"2024/11/28",
9+
"last_updated":"2025/08/10",
1010
"resources":"cswt"
1111
}
1212
}

_modpacks/resources/cswt/cstp.py

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import tempfile
44
import sys
55

6+
from pathlib import Path
7+
68
UI_MSGS_ALL = {
79
4292: "New Boards: Brand-new boards created by members of the Custom Street community.",
810
4293: "Recently-Updated Boards: Boards that have been around a while, but recently received an update that needs testing.",
@@ -85,10 +87,12 @@
8587
}
8688
}
8789

90+
8891
def replUiMessages(msgDict, toReplaceWith):
8992
for k,v in toReplaceWith.items():
9093
msgDict[k] = v
9194

95+
9296
def replTitleImages(locale, arcDir, modpackDir):
9397
gameSeqTitleAll = os.path.join(modpackDir, 'cstp/game_sequence_title_ALL.arc')
9498
for dirEntry in os.scandir(gameSeqTitleAll):
@@ -102,13 +106,34 @@ def replTitleImages(locale, arcDir, modpackDir):
102106
#print(tplPath, file=sys.stderr)
103107
pycsmm.convertPngToTpl(dirEntry.path, tplPath)
104108

109+
110+
def replCharacterIcons(arcDir, modpackDir):
111+
#arcFileDir = arcDir.split("/", 4)[-1]
112+
arcFileDir = Path(*Path(arcDir).parts[Path(arcDir).parts.index('game'):])
113+
arcFileDirStr = str(arcFileDir)
114+
115+
charaDirAll = os.path.join(modpackDir, arcFileDirStr)
116+
117+
for dirEntry in os.scandir(charaDirAll):
118+
tplPath = os.path.join(arcDir, 'arc/timg', os.path.splitext(dirEntry.name)[0] + '.tpl')
119+
#print(tplPath, file=sys.stderr)
120+
pycsmm.convertPngToTpl(dirEntry.path, tplPath, "CMPR")
121+
122+
123+
def replCharacterDartIcons(locale, brresDir, modpackDir):
124+
gameCharacterIconDarts = os.path.join(modpackDir, 'game/mg_darts.brres')
125+
for dirEntry in os.scandir(gameCharacterIconDarts):
126+
texPath = os.path.join(brresDir, 'Textures(NW4R)', os.path.splitext(dirEntry.name)[0])
127+
pycsmm.convertPngToTex(dirEntry.path, texPath)
128+
105129
MODID = __name__
106130

107131
class Mod(pycsmm.CSMMMod, pycsmm.GeneralInterface, pycsmm.ArcFileInterface, pycsmm.UiMessageInterface):
108132
def __init__(self):
109133
pycsmm.CSMMMod.__init__(self)
110134
pycsmm.GeneralInterface.__init__(self)
111135
pycsmm.ArcFileInterface.__init__(self)
136+
pycsmm.BrresFileInterface.__init__(self)
112137
pycsmm.UiMessageInterface.__init__(self)
113138
def modId(self):
114139
return MODID
@@ -194,11 +219,13 @@ def saveFiles(self, root, gameInstance, modList):
194219
mainDol.seek(mapper.boomToFileAddress(0x801e9a18))
195220
mainDol.write(b'\x40\x82\x00\x10')
196221

222+
197223
def saveUiMessages(self):
198224
return {f'files/localize/ui_message.{k}.csv':
199225
(lambda root, gameInstance, modList, msgDict, toReplaceWith=v: replUiMessages(msgDict, UI_MSGS_ALL | toReplaceWith))
200226
for k,v in UI_MSGS.items()}
201227

228+
202229
def modifyArcFile(self):
203230
localeToTitleArcFile = {
204231
'ja': 'files/game/game_sequence_title.arc',
@@ -209,10 +236,65 @@ def modifyArcFile(self):
209236
'it': 'files/game/langIT/game_sequence_title_IT.arc',
210237
'uk': 'files/game/langUK/game_sequence_title_UK.arc',
211238
}
212-
return {
239+
title_files = {
213240
arcFile:
214241
lambda root, gameInstance, modList, arcDir, locale=locale, modpackDir=self.modpackDir(): replTitleImages(locale, arcDir, modpackDir)
215242
for locale, arcFile in localeToTitleArcFile.items()
216243
}
217244

245+
characterArcFiles = [
246+
'files/game/ui_game_f_aln.arc',
247+
'files/game/ui_game_f_bnk.arc',
248+
'files/game/ui_game_f_cpa.arc',
249+
'files/game/ui_game_f_cpj.arc',
250+
'files/game/ui_game_f_ctr.arc',
251+
'files/game/ui_game_f_ddk.arc',
252+
'files/game/ui_game_f_dkk.arc',
253+
'files/game/ui_game_f_dzy.arc',
254+
'files/game/ui_game_f_hsn.arc',
255+
'files/game/ui_game_f_kkr.arc',
256+
'files/game/ui_game_f_knp.arc',
257+
'files/game/ui_game_f_krf.arc',
258+
'files/game/ui_game_f_lig.arc',
259+
'files/game/ui_game_f_mmj.arc',
260+
'files/game/ui_game_f_mro.arc',
261+
'files/game/ui_game_f_pch.arc',
262+
'files/game/ui_game_f_pdn.arc',
263+
'files/game/ui_game_f_red.arc',
264+
'files/game/ui_game_f_ruo.arc',
265+
'files/game/ui_game_f_slm.arc',
266+
'files/game/ui_game_f_snd.arc',
267+
'files/game/ui_game_f_wlg.arc',
268+
'files/game/ui_game_f_wro.arc',
269+
'files/game/ui_game_f_ygs.arc',
270+
'files/game/ui_game_f_yss.arc',
271+
'files/game/ui_game_f_zsc.arc',
272+
]
273+
character_files = {
274+
arcFile:
275+
lambda root, gameInstance, modList, arcDir, locale="", modpackDir=self.modpackDir(): replCharacterIcons(arcDir, modpackDir)
276+
for arcFile in characterArcFiles
277+
}
278+
279+
all_files = {**title_files, **character_files}
280+
281+
return all_files
282+
283+
284+
def modifyBrresFile(self):
285+
localeToTitleBrresFile = {
286+
'ja': 'files/game/mg_darts.brres',
287+
'en': 'files/game/langEN/mg_darts_EN.brres',
288+
'de': 'files/game/langDE/mg_darts_DE.brres',
289+
'su': 'files/game/langES/mg_darts_ES.brres',
290+
'fr': 'files/game/langFR/mg_darts_FR.brres',
291+
'it': 'files/game/langIT/mg_darts_IT.brres',
292+
'uk': 'files/game/langUK/mg_darts_UK.brres',
293+
}
294+
return {
295+
brresFile:
296+
lambda root, gameInstance, modList, brresDir, locale=locale, modpackDir=self.modpackDir(): replCharacterDartIcons(locale, brresDir, modpackDir)
297+
for locale, brresFile in localeToTitleBrresFile.items()
298+
}
299+
218300
mod = Mod()

_modpacks/resources/cswt/cswt.py

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import tempfile
44
import sys
55

6+
from pathlib import Path
7+
68
UI_MSGS_ALL = {
79
4292: "Unused. Do not click. We're hoping to get rid of this menu option soon!",
810
4293: "Custom Boards: Boards which were created by the Custom Street Modding Community",
@@ -87,10 +89,12 @@
8789
}
8890
}
8991

92+
9093
def replUiMessages(msgDict, toReplaceWith):
9194
for k,v in toReplaceWith.items():
9295
msgDict[k] = v
9396

97+
9498
def replTitleImages(locale, arcDir, modpackDir):
9599
gameSeqTitleAll = os.path.join(modpackDir, 'cswt/game_sequence_title_ALL.arc')
96100
for dirEntry in os.scandir(gameSeqTitleAll):
@@ -104,13 +108,34 @@ def replTitleImages(locale, arcDir, modpackDir):
104108
#print(tplPath, file=sys.stderr)
105109
pycsmm.convertPngToTpl(dirEntry.path, tplPath)
106110

111+
112+
def replCharacterIcons(arcDir, modpackDir):
113+
#arcFileDir = arcDir.split("/", 4)[-1]
114+
arcFileDir = Path(*Path(arcDir).parts[Path(arcDir).parts.index('game'):])
115+
arcFileDirStr = str(arcFileDir)
116+
117+
charaDirAll = os.path.join(modpackDir, arcFileDirStr)
118+
119+
for dirEntry in os.scandir(charaDirAll):
120+
tplPath = os.path.join(arcDir, 'arc/timg', os.path.splitext(dirEntry.name)[0] + '.tpl')
121+
#print(tplPath, file=sys.stderr)
122+
pycsmm.convertPngToTpl(dirEntry.path, tplPath, "CMPR")
123+
124+
125+
def replCharacterDartIcons(locale, brresDir, modpackDir):
126+
gameCharacterIconDarts = os.path.join(modpackDir, 'game/mg_darts.brres')
127+
for dirEntry in os.scandir(gameCharacterIconDarts):
128+
texPath = os.path.join(brresDir, 'Textures(NW4R)', os.path.splitext(dirEntry.name)[0])
129+
pycsmm.convertPngToTex(dirEntry.path, texPath)
130+
107131
MODID = __name__
108132

109133
class Mod(pycsmm.CSMMMod, pycsmm.GeneralInterface, pycsmm.ArcFileInterface, pycsmm.UiMessageInterface):
110134
def __init__(self):
111135
pycsmm.CSMMMod.__init__(self)
112136
pycsmm.GeneralInterface.__init__(self)
113137
pycsmm.ArcFileInterface.__init__(self)
138+
pycsmm.BrresFileInterface.__init__(self)
114139
pycsmm.UiMessageInterface.__init__(self)
115140
def modId(self):
116141
return MODID
@@ -211,10 +236,65 @@ def modifyArcFile(self):
211236
'it': 'files/game/langIT/game_sequence_title_IT.arc',
212237
'uk': 'files/game/langUK/game_sequence_title_UK.arc',
213238
}
214-
return {
239+
title_files = {
215240
arcFile:
216241
lambda root, gameInstance, modList, arcDir, locale=locale, modpackDir=self.modpackDir(): replTitleImages(locale, arcDir, modpackDir)
217242
for locale, arcFile in localeToTitleArcFile.items()
218243
}
219244

245+
characterArcFiles = [
246+
'files/game/ui_game_f_aln.arc',
247+
'files/game/ui_game_f_bnk.arc',
248+
'files/game/ui_game_f_cpa.arc',
249+
'files/game/ui_game_f_cpj.arc',
250+
'files/game/ui_game_f_ctr.arc',
251+
'files/game/ui_game_f_ddk.arc',
252+
'files/game/ui_game_f_dkk.arc',
253+
'files/game/ui_game_f_dzy.arc',
254+
'files/game/ui_game_f_hsn.arc',
255+
'files/game/ui_game_f_kkr.arc',
256+
'files/game/ui_game_f_knp.arc',
257+
'files/game/ui_game_f_krf.arc',
258+
'files/game/ui_game_f_lig.arc',
259+
'files/game/ui_game_f_mmj.arc',
260+
'files/game/ui_game_f_mro.arc',
261+
'files/game/ui_game_f_pch.arc',
262+
'files/game/ui_game_f_pdn.arc',
263+
'files/game/ui_game_f_red.arc',
264+
'files/game/ui_game_f_ruo.arc',
265+
'files/game/ui_game_f_slm.arc',
266+
'files/game/ui_game_f_snd.arc',
267+
'files/game/ui_game_f_wlg.arc',
268+
'files/game/ui_game_f_wro.arc',
269+
'files/game/ui_game_f_ygs.arc',
270+
'files/game/ui_game_f_yss.arc',
271+
'files/game/ui_game_f_zsc.arc',
272+
]
273+
character_files = {
274+
arcFile:
275+
lambda root, gameInstance, modList, arcDir, locale="", modpackDir=self.modpackDir(): replCharacterIcons(arcDir, modpackDir)
276+
for arcFile in characterArcFiles
277+
}
278+
279+
all_files = {**title_files, **character_files}
280+
281+
return all_files
282+
283+
284+
def modifyBrresFile(self):
285+
localeToTitleBrresFile = {
286+
'ja': 'files/game/mg_darts.brres',
287+
'en': 'files/game/langEN/mg_darts_EN.brres',
288+
'de': 'files/game/langDE/mg_darts_DE.brres',
289+
'su': 'files/game/langES/mg_darts_ES.brres',
290+
'fr': 'files/game/langFR/mg_darts_FR.brres',
291+
'it': 'files/game/langIT/mg_darts_IT.brres',
292+
'uk': 'files/game/langUK/mg_darts_UK.brres',
293+
}
294+
return {
295+
brresFile:
296+
lambda root, gameInstance, modList, brresDir, locale=locale, modpackDir=self.modpackDir(): replCharacterDartIcons(locale, brresDir, modpackDir)
297+
for locale, brresFile in localeToTitleBrresFile.items()
298+
}
299+
220300
mod = Mod()
19.9 KB
18.3 KB
14.5 KB

0 commit comments

Comments
 (0)