Skip to content
This repository was archived by the owner on Jan 24, 2022. It is now read-only.

Commit 6941fa9

Browse files
committed
Support for Modern Warfare DLC Items, Bump deps
1 parent 0325eb1 commit 6941fa9

File tree

10 files changed

+508
-195
lines changed

10 files changed

+508
-195
lines changed

ModernWarfare/XAssets/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
)
1717
from .charms import Charms
1818
from .consumables import Consumables
19+
from .dlc import DLC
1920
from .emblems import Emblems
2021
from .equipment import Equipment
2122
from .events import PlaylistEvents, SeasonalEvents

ModernWarfare/XAssets/challenges.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,9 @@ def Table(self: Any, challenges: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
224224
"id": entry.get("id"),
225225
"altId": entry.get("ref"),
226226
"name": self.localize.get(entry.get("name")),
227-
"description": self.localize.get(entry.get("desc")).replace(
228-
"&&1", amount
229-
),
227+
"description": None
228+
if (loc := self.localize.get(entry.get("desc"))) is None
229+
else loc.replace("&&1", amount),
230230
"rewards": [
231231
{
232232
"id": entry.get("loot"),

ModernWarfare/XAssets/dlc.py

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
import logging
2+
from typing import Any, Dict, List, TypedDict
3+
4+
from utility import Utility
5+
6+
log: logging.Logger = logging.getLogger(__name__)
7+
8+
9+
class DLCIDs(TypedDict):
10+
"""Structure of loot/dlc_ids.csv"""
11+
12+
id: int
13+
name: str
14+
type: str
15+
CPAmount: int
16+
PS4ID: str
17+
XB1ID: str
18+
battleNetID: int
19+
wegameID: int
20+
title: str
21+
image: str
22+
isCODPoints: int # bool
23+
shouldShowPopup: int # bool
24+
item1: int # itemStart in luashared/csvutils.lua
25+
item2: int
26+
item3: int
27+
item4: int
28+
item5: int
29+
item6: int
30+
item7: int
31+
item8: int
32+
item9: int
33+
item10: int
34+
item11: int
35+
item12: int
36+
item13: int
37+
item14: int
38+
item15: int
39+
item16: int
40+
item17: int
41+
item18: int
42+
item19: int
43+
item20: int # itemEnd in luashared/csvutils.lua
44+
item21: int
45+
item22: int
46+
item23: int
47+
item24: int
48+
item25: int
49+
item26: int
50+
item27: int
51+
item28: int
52+
item29: int
53+
item30: int
54+
item31: int
55+
item32: int
56+
item33: int
57+
item34: int
58+
item35: int
59+
item36: int
60+
item37: int
61+
item38: int
62+
item39: int
63+
item40: int
64+
item41: int
65+
item42: int
66+
item43: int
67+
item44: int
68+
item45: int
69+
item46: int
70+
item47: int
71+
item48: int
72+
item49: int
73+
item50: int
74+
item51: int
75+
item52: int
76+
item53: int
77+
item54: int
78+
item55: int
79+
item56: int
80+
item57: int
81+
item58: int
82+
item59: int
83+
item60: int
84+
item61: int
85+
item62: int
86+
item63: int
87+
item64: int
88+
item65: int
89+
item66: int
90+
item67: int
91+
item68: int
92+
item69: int
93+
item70: int
94+
item71: int
95+
item72: int
96+
item73: int
97+
item74: int
98+
item75: int
99+
item76: int
100+
item77: int
101+
item78: int
102+
item79: int
103+
item80: int
104+
item81: int
105+
item82: int
106+
item83: int
107+
108+
109+
class DLC:
110+
"""DLC XAssets."""
111+
112+
def Compile(self: Any) -> None:
113+
"""Compile the DLC XAssets."""
114+
115+
dlc: List[Dict[str, Any]] = []
116+
117+
dlc = DLC.IDs(self, dlc)
118+
119+
Utility.WriteFile(self, f"{self.eXAssets}/dlc.json", dlc)
120+
121+
log.info(f"Compiled {len(dlc):,} DLC")
122+
123+
def IDs(self: Any, dlc: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
124+
"""Compile the loot/dlc_ids.csv XAsset."""
125+
126+
ids: List[Dict[str, Any]] = Utility.ReadCSV(
127+
self, f"{self.iXAssets}/loot/dlc_ids.csv", DLCIDs
128+
)
129+
130+
if ids is None:
131+
return dlc
132+
133+
for entry in ids:
134+
isCP: bool = bool(entry.get("isCODPoints", 0))
135+
amountCP: int = 0 if (amnt := entry.get("CPAmount")) is None else int(amnt)
136+
137+
dlc.append(
138+
{
139+
"id": entry.get("id"),
140+
"altId": entry.get("name"),
141+
"name": self.localize.get(entry.get("title"))
142+
if isCP is False
143+
else self.localize.get(entry.get("title")).replace(
144+
"&&1", f"{amountCP:,}"
145+
),
146+
"type": self.ModernWarfare.GetLootType(entry.get("id")),
147+
"altType": entry.get("type"),
148+
"image": entry.get("image"),
149+
"storeIds": {
150+
"battlenet": entry.get("battleNetID"),
151+
"playstation": entry.get("PS4ID"),
152+
"xbox": entry.get("XB1ID"),
153+
},
154+
"items": [],
155+
}
156+
)
157+
158+
if dlc[-1]["altType"] == "consumable":
159+
if dlc[-1].get("type") is None:
160+
dlc[-1]["type"] = self.localize.get("LOOT_MP/CONSUMABLE")
161+
162+
if dlc[-1].get("rarity") is None:
163+
dlc[-1]["rarity"] = self.ModernWarfare.GetLootRarity(0)
164+
165+
for i in range(1, 84):
166+
if (item := entry.get(f"item{i}")) is None:
167+
continue
168+
169+
dlc[-1]["items"].append(
170+
{"id": item, "type": self.ModernWarfare.GetLootType(item)}
171+
)
172+
173+
return dlc

ModernWarfare/XAssets/vehicleCamos.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,10 @@ def Table(self: Any, camos: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
102102

103103
camo["name"] = self.localize.get(entry.get("name"))
104104
camo["flavor"] = self.localize.get(entry.get("flavorText"))
105-
camo["unlock"] = self.localize.get(entry.get("unlockText")).replace(
106-
"&&1 ", ""
105+
camo["unlock"] = (
106+
None
107+
if (loc := self.localize.get(entry.get("unlockText"))) is None
108+
else loc.replace("&&1 ", "")
107109
)
108110
camo["attribute"] = self.ModernWarfare.GetAttribute(
109111
entry.get("specialAttribute")

ModernWarfare/database.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ def Compile(self: Any) -> None:
8888
bundles: List[Dict[str, Any]] = Utility.ReadFile(
8989
self, f"{self.eXAssets}/bundles.json"
9090
)
91+
dlc: List[Dict[str, Any]] = Utility.ReadFile(self, f"{self.eXAssets}/dlc.json")
9192

9293
for bundle in bundles:
9394
if bundle.get("id") is None:
@@ -159,6 +160,57 @@ def Compile(self: Any) -> None:
159160
dbBundles.append(bundle)
160161
self.count += 1
161162

163+
for entry in dlc:
164+
if entry.get("altType") != "durable":
165+
continue
166+
167+
if entry.get("id") is None:
168+
continue
169+
elif entry.get("name") is None:
170+
continue
171+
elif (b := entry.get("image")) is None:
172+
continue
173+
174+
self.dbImages.append(b)
175+
176+
if Utility.FileExists(self, f"{self.iImages}/{b}.png") is False:
177+
continue
178+
179+
items: List[int] = []
180+
181+
for item in entry.get("items"):
182+
if item.get("type") == self.localize.get("LOOT_MP/OPERATOR"):
183+
continue
184+
185+
items.append((itemId := item.get("id")))
186+
187+
for bundle in bundles:
188+
if itemId == bundle.get("id"):
189+
items.remove(itemId)
190+
191+
break
192+
193+
entry["items"] = items
194+
195+
entry.pop("altId", None)
196+
entry.pop("altType", None)
197+
entry.pop("storeIds", None)
198+
entry.pop("image", None)
199+
200+
entry["billboard"] = b
201+
entry["price"] = None
202+
203+
if entry.get("type") is None:
204+
entry["type"] = self.localize.get("MENU/BUNDLE_TYPE_VARIETY")
205+
206+
if Utility.AnimateSprite(self, b, [(1920, 580)]) is True:
207+
entry["animated"] = True
208+
209+
entry["slug"] = Utility.Sluggify(self, entry.get("name"))
210+
211+
dbBundles.append(entry)
212+
self.count += 1
213+
162214
Utility.WriteFile(
163215
self,
164216
f"{self.eDatabase}/bundles.json",
@@ -186,6 +238,7 @@ def Compile(self: Any) -> None:
186238
"camos",
187239
"charms",
188240
"consumables",
241+
"dlc",
189242
"emblems",
190243
"executions",
191244
"features",
@@ -220,12 +273,16 @@ def Compile(self: Any) -> None:
220273
elif (i := item.get("image")) is None:
221274
continue
222275

276+
if (file == "dlc") and (item.get("altType") != "consumable"):
277+
continue
278+
223279
self.dbImages.append(i)
224280

225281
if Utility.FileExists(self, f"{self.iImages}/{i}.png") is False:
226282
continue
227283

228284
item.pop("altId", None)
285+
item.pop("altType", None)
229286
item.pop("hidden", None)
230287
item.pop("category", None)
231288
item.pop("operatorAltId", None)
@@ -234,6 +291,8 @@ def Compile(self: Any) -> None:
234291
item.pop("sku", None)
235292
item.pop("rewards", None)
236293
item.pop("challengeId", None)
294+
item.pop("storeIds", None)
295+
item.pop("items", None)
237296

238297
if item.get("description") is None:
239298
item.pop("description", None)

ModernWarfare/modernwarfare.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from .database import Database
77
from .XAssets import (
8+
DLC,
89
Accessories,
910
BattlePasses,
1011
BattlePassItems,
@@ -192,6 +193,7 @@ def Compile(self: Any) -> None:
192193
self, f"{self.iXAssets}/mp/camocategorytable.csv", CamoCategoryTable
193194
)
194195

196+
DLC.Compile(self)
195197
Accessories.Compile(self)
196198
BattlePasses.Compile(self)
197199
BattlePassItems.Compile(self)

ModernWarfare/placeholders.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,9 @@
108108
"lorem ipsum",
109109
"VEH_",
110110
"t9_",
111+
"t9zm_",
111112
"mp_western_",
112-
"s4"
113+
"s4_"
113114
],
114115
"ends": [
115116
"_0",

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Currently not available for public release.
4545
- Camos
4646
- Charms
4747
- Consumables
48+
- DLC
4849
- Emblems
4950
- Equipment
5051
- Executions

0 commit comments

Comments
 (0)