Skip to content

Commit 4a6ffc0

Browse files
committed
Add ProxyType: for DropTables
1 parent 511ea8c commit 4a6ffc0

File tree

5 files changed

+446
-4
lines changed

5 files changed

+446
-4
lines changed

public/game_files/horn_material.json

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
{
2+
"Dm_Enemy_Bokoblin_Boss_Senior": "Item_Enemy_133",
3+
"Dm_Enemy_Bokoblin_Junior": "Item_Enemy_77",
4+
"Dm_Enemy_Bokoblin_Middle": "Item_Enemy_78",
5+
"Dm_Enemy_Bokoblin_Senior": "Item_Enemy_79",
6+
"Dm_Enemy_Zombie_Junior_Defense": "Item_Enemy_77",
7+
"Enemy_Bokoblin_Armor_Dark": "Item_Enemy_80",
8+
"Enemy_Bokoblin_Armor_Junior": "Item_Enemy_77",
9+
"Enemy_Bokoblin_Armor_Middle": "Item_Enemy_78",
10+
"Enemy_Bokoblin_Armor_Senior": "Item_Enemy_79",
11+
"Enemy_Bokoblin_Bone_Junior": "Item_Enemy_77",
12+
"Enemy_Bokoblin_Bone_Junior_AllDay": "Item_Enemy_77",
13+
"Enemy_Bokoblin_Bone_Junior_AllDay_AlwaysRespawn": "Item_Enemy_77",
14+
"Enemy_Bokoblin_Bone_Junior_Head": "Item_Enemy_77",
15+
"Enemy_Bokoblin_Bone_Junior_Head_AllDay": "Item_Enemy_77",
16+
"Enemy_Bokoblin_Boss_Dark": "Item_Enemy_134",
17+
"Enemy_Bokoblin_Boss_Junior": "Item_Enemy_64",
18+
"Enemy_Bokoblin_Boss_Middle": "Item_Enemy_132",
19+
"Enemy_Bokoblin_Boss_Senior": "Item_Enemy_133",
20+
"Enemy_Bokoblin_Boss_Senior_NoOrder": "Item_Enemy_133",
21+
"Enemy_Bokoblin_Dark": "Item_Enemy_80",
22+
"Enemy_Bokoblin_Guard_Junior": "Item_Enemy_77",
23+
"Enemy_Bokoblin_Guard_Junior_Ambush": "Item_Enemy_77",
24+
"Enemy_Bokoblin_Guard_Junior_Cliff": "Item_Enemy_77",
25+
"Enemy_Bokoblin_Guard_Junior_Golem_Fort": "Item_Enemy_77",
26+
"Enemy_Bokoblin_Guard_Junior_TreeHouseTop": "Item_Enemy_77",
27+
"Enemy_Bokoblin_Guard_Middle": "Item_Enemy_78",
28+
"Enemy_Bokoblin_Guard_Middle_Ambush": "Item_Enemy_78",
29+
"Enemy_Bokoblin_Guard_Middle_Cliff": "Item_Enemy_78",
30+
"Enemy_Bokoblin_Guard_Middle_TreeHouseTop": "Item_Enemy_78",
31+
"Enemy_Bokoblin_Junior": "Item_Enemy_77",
32+
"Enemy_Bokoblin_Middle": "Item_Enemy_78",
33+
"Enemy_Bokoblin_NoSleep_Junior": "Item_Enemy_77",
34+
"Enemy_Bokoblin_Senior": "Item_Enemy_79",
35+
"Enemy_Bokoblin_Sniper_Junior": "Item_Enemy_77",
36+
"Enemy_CDungeon_Practice": "NoHorn",
37+
"Enemy_Chuchu_Electric_Junior": "Item_Enemy_77",
38+
"Enemy_Chuchu_Electric_Middle": "Item_Enemy_77",
39+
"Enemy_Chuchu_Electric_Middle_Army": "Item_Enemy_77",
40+
"Enemy_Chuchu_Electric_Senior": "Item_Enemy_77",
41+
"Enemy_Chuchu_Fire_Junior": "Item_Enemy_77",
42+
"Enemy_Chuchu_Fire_Middle": "Item_Enemy_77",
43+
"Enemy_Chuchu_Fire_Middle_Army": "Item_Enemy_77",
44+
"Enemy_Chuchu_Fire_Senior": "Item_Enemy_77",
45+
"Enemy_Chuchu_Ice_Junior": "Item_Enemy_77",
46+
"Enemy_Chuchu_Ice_Middle": "Item_Enemy_77",
47+
"Enemy_Chuchu_Ice_Middle_Army": "Item_Enemy_77",
48+
"Enemy_Chuchu_Ice_Senior": "Item_Enemy_77",
49+
"Enemy_Chuchu_Junior": "Item_Enemy_77",
50+
"Enemy_Chuchu_Middle": "Item_Enemy_77",
51+
"Enemy_Chuchu_Senior": "Item_Enemy_77",
52+
"Enemy_Drake": "Item_Enemy_77",
53+
"Enemy_Drake_Electric": "Item_Enemy_77",
54+
"Enemy_Drake_Fire": "Item_Enemy_77",
55+
"Enemy_Drake_Ice": "Item_Enemy_77",
56+
"Enemy_Drake_Mix": "Item_Enemy_77",
57+
"Enemy_Ganondorf": "Item_Enemy_77",
58+
"Enemy_Ganondorf_Miasma": "Item_Enemy_77",
59+
"Enemy_Giant_Bone": "Item_Enemy_142",
60+
"Enemy_Giant_Bone_AllDay": "Item_Enemy_142",
61+
"Enemy_Giant_Bone_Eye": "Item_Enemy_77",
62+
"Enemy_Giant_Bone_Eye_AllDay": "Item_Enemy_77",
63+
"Enemy_Giant_Junior": "Item_Enemy_142",
64+
"Enemy_Giant_Junior_KeyCrystal": "Item_Enemy_142",
65+
"Enemy_Giant_Middle": "Item_Enemy_143",
66+
"Enemy_Giant_Senior": "Item_Enemy_144",
67+
"Enemy_Golem_Fire": "Item_Enemy_77",
68+
"Enemy_Golem_Fire_KeyCrystal": "Item_Enemy_77",
69+
"Enemy_Golem_Fort_A": "Item_Enemy_77",
70+
"Enemy_Golem_Fort_A_Wander": "Item_Enemy_77",
71+
"Enemy_Golem_Ice": "Item_Enemy_77",
72+
"Enemy_Golem_Ice_KeyCrystal": "Item_Enemy_77",
73+
"Enemy_Golem_Junior": "Item_Enemy_77",
74+
"Enemy_Golem_Junior_KeyCrystal": "Item_Enemy_77",
75+
"Enemy_Golem_Little": "Item_Enemy_77",
76+
"Enemy_Golem_Little_Fire": "Item_Enemy_77",
77+
"Enemy_Golem_Little_Ice": "Item_Enemy_77",
78+
"Enemy_Golem_Middle": "Item_Enemy_77",
79+
"Enemy_Golem_Senior": "Item_Enemy_77",
80+
"Enemy_Horablin_Dark": "Item_Enemy_103",
81+
"Enemy_Horablin_Guard_Junior": "Item_Enemy_100",
82+
"Enemy_Horablin_Guard_Middle": "Item_Enemy_101",
83+
"Enemy_Horablin_Junior": "Item_Enemy_100",
84+
"Enemy_Horablin_Middle": "Item_Enemy_101",
85+
"Enemy_Horablin_Senior": "Item_Enemy_102",
86+
"Enemy_LikeLike_Crack": "Item_Enemy_77",
87+
"Enemy_LikeLike_Crack_RagdollShort": "Item_Enemy_77",
88+
"Enemy_LikeLike_Electric": "Item_Enemy_77",
89+
"Enemy_LikeLike_Electric_RagdollShort": "Item_Enemy_77",
90+
"Enemy_LikeLike_Fire": "Item_Enemy_77",
91+
"Enemy_LikeLike_Fire_RagdollShort": "Item_Enemy_77",
92+
"Enemy_LikeLike_Ice": "Item_Enemy_77",
93+
"Enemy_LikeLike_Ice_RagdollShort": "Item_Enemy_77",
94+
"Enemy_LikeLike_Plane": "Item_Enemy_77",
95+
"Enemy_LikeLike_Plane_RagdollShort": "Item_Enemy_77",
96+
"Enemy_LikeLike_Tar": "Item_Enemy_77",
97+
"Enemy_Lizalfos_Bone_Junior": "Item_Enemy_106",
98+
"Enemy_Lizalfos_Bone_Junior_Head": "Item_Enemy_106",
99+
"Enemy_Lizalfos_Dark": "Item_Enemy_109",
100+
"Enemy_Lizalfos_Electric": "Item_Enemy_60",
101+
"Enemy_Lizalfos_Fire": "Item_Enemy_58",
102+
"Enemy_Lizalfos_Fire_GerudoCanyon": "Item_Enemy_58",
103+
"Enemy_Lizalfos_Fire_GerudoCanyon_PopUp": "Item_Enemy_58",
104+
"Enemy_Lizalfos_Guard_Junior": "Item_Enemy_106",
105+
"Enemy_Lizalfos_Guard_Junior_LongVisibility": "Item_Enemy_106",
106+
"Enemy_Lizalfos_Guard_Middle": "Item_Enemy_107",
107+
"Enemy_Lizalfos_Guard_Middle_LongVisibility": "Item_Enemy_107",
108+
"Enemy_Lizalfos_Ice": "Item_Enemy_59",
109+
"Enemy_Lizalfos_Ice_GerudoCanyon": "Item_Enemy_59",
110+
"Enemy_Lizalfos_Ice_GerudoCanyon_Popup": "Item_Enemy_59",
111+
"Enemy_Lizalfos_Junior": "Item_Enemy_106",
112+
"Enemy_Lizalfos_Middle": "Item_Enemy_107",
113+
"Enemy_Lizalfos_Senior": "Item_Enemy_108",
114+
"Enemy_Lynel_Boss": "Item_Enemy_148",
115+
"Enemy_Lynel_Boss_Dark": "Item_Enemy_151",
116+
"Enemy_Lynel_Boss_Middle": "Item_Enemy_149",
117+
"Enemy_Lynel_Boss_Senior": "Item_Enemy_150",
118+
"Enemy_Lynel_Dark": "Item_Enemy_151",
119+
"Enemy_Lynel_Junior": "Item_Enemy_148",
120+
"Enemy_Lynel_Middle": "Item_Enemy_149",
121+
"Enemy_Lynel_Senior": "Item_Enemy_150",
122+
"Enemy_MiddleBoss_Goron": "Item_Enemy_77",
123+
"Enemy_Mogurudo_Baby_Junior": "Item_Enemy_77",
124+
"Enemy_Mogurudo_Junior": "Item_Enemy_186",
125+
"Enemy_Mogurudo_Middle": "Item_Enemy_187",
126+
"Enemy_Mogurudo_Senior": "Item_Enemy_188",
127+
"Enemy_Moriblin_Bone_Junior": "Item_Enemy_89",
128+
"Enemy_Moriblin_Bone_Junior_AllDay": "Item_Enemy_89",
129+
"Enemy_Moriblin_Bone_Junior_AllDay_AlwaysRespawn": "Item_Enemy_89",
130+
"Enemy_Moriblin_Bone_Junior_Head": "Item_Enemy_89",
131+
"Enemy_Moriblin_Bone_Junior_Head_AllDay": "Item_Enemy_89",
132+
"Enemy_Moriblin_Dark": "Item_Enemy_92",
133+
"Enemy_Moriblin_Junior": "Item_Enemy_89",
134+
"Enemy_Moriblin_Junior_LongSight": "Item_Enemy_89",
135+
"Enemy_Moriblin_Junior_Lookout_Cliff": "Item_Enemy_89",
136+
"Enemy_Moriblin_Middle": "Item_Enemy_90",
137+
"Enemy_Moriblin_Senior": "Item_Enemy_91",
138+
"Enemy_Octarock": "Item_Enemy_77",
139+
"Enemy_Octarock_Desert": "Item_Enemy_77",
140+
"Enemy_Octarock_Forest": "Item_Enemy_77",
141+
"Enemy_Octarock_Snow": "Item_Enemy_77",
142+
"Enemy_PhantomGanon": "Item_Enemy_77",
143+
"Enemy_Sandworm": "Item_Enemy_77",
144+
"Enemy_Treant_Bee": "Item_Enemy_77",
145+
"Enemy_Treant_Broadleaf": "Item_Enemy_77",
146+
"Enemy_Treant_D": "Item_Enemy_77",
147+
"Enemy_Treant_E": "Item_Enemy_77",
148+
"Enemy_Zombie_Boss_Junior": "Item_Enemy_77",
149+
"Enemy_Zombie_Boss_Junior_Defense": "Item_Enemy_77",
150+
"Enemy_Zombie_Boss_Junior_ForDungeonBossGerudoBattle": "Item_Enemy_77",
151+
"Enemy_Zombie_Junior": "Item_Enemy_77",
152+
"Enemy_Zombie_Junior_Defense": "Item_Enemy_77",
153+
"Enemy_Zombie_Junior_ForDungeonBossGerudoBattle": "Item_Enemy_77",
154+
"Enemy_Zonau_Golem_Dark": "Item_Enemy_193",
155+
"Enemy_Zonau_Golem_Junior": "Item_Enemy_67",
156+
"Enemy_Zonau_Golem_Junior_ForFirstSmallDungeon": "Item_Enemy_67",
157+
"Enemy_Zonau_Golem_Middle": "Item_Enemy_191",
158+
"Enemy_Zonau_Golem_Senior": "Item_Enemy_192",
159+
"Enemy_Zonau_Robot_Dark": "Item_Enemy_169",
160+
"Enemy_Zonau_Robot_Junior": "Item_Enemy_166",
161+
"Enemy_Zonau_Robot_Junior_Beginning": "Item_Enemy_166",
162+
"Enemy_Zonau_Robot_Junior_Lookout": "Item_Enemy_166",
163+
"Enemy_Zonau_Robot_Junior_Lookout_Mile": "Item_Enemy_166",
164+
"Enemy_Zonau_Robot_Middle": "Item_Enemy_167",
165+
"Enemy_Zonau_Robot_Middle_Lookout": "Item_Enemy_167",
166+
"Enemy_Zonau_Robot_Senior": "Item_Enemy_168",
167+
"Ganondorf_Miasma_Parturition": "Item_Enemy_77",
168+
"MiasmaSwarm": "Item_Enemy_77",
169+
"MiasmaSwarm_DekuTree": "Item_Enemy_77",
170+
"MiasmaSwarm_LastDungeon": "Item_Enemy_77",
171+
"MiasmaTentacle": "Item_Enemy_77"
172+
}

src/components/AppMapDetailsObj.ts

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ export default class AppMapDetailsObj extends AppMapDetailsBase<MapMarkerObj | M
7979

8080
private dropTables: { [key: string]: any } = {};
8181
private shopData: { [key: string]: any } = {};
82+
private areaData: { [key: string]: any } = {};
83+
private hornMaterial: { [key: string]: string } = {};
84+
private dropTableChest: { [key: string]: any } = {};
8285

8386
private areaMarkers: L.Path[] = [];
8487
private staticData = staticData;
@@ -109,6 +112,9 @@ export default class AppMapDetailsObj extends AppMapDetailsBase<MapMarkerObj | M
109112
this.railsWithMarkers = [];
110113
this.selectedRailIdx = -1;
111114
this.shopData = {};
115+
this.areaData = {};
116+
this.hornMaterial = {};
117+
this.dropTableChest = {};
112118
if (this.minObj.objid) {
113119
this.obj = (await MapMgr.getInstance().getObjByObjId(this.minObj.objid))!;
114120
} else {
@@ -126,7 +132,30 @@ export default class AppMapDetailsObj extends AppMapDetailsBase<MapMarkerObj | M
126132
const dropTableName = this.getDropTableName();
127133
if (dropTableName) {
128134
this.dropTables = await MapMgr.getInstance().getObjDropTables(this.getRankedUpActorNameForObj(this.minObj), dropTableName);
135+
if (this.minObj.name.startsWith("Enemy_LikeLike_")) {
136+
// Enemy_LikeLike_ are the only actors with ProxyType: TBox
137+
// Get the DropActorDropTable from the DropTableElement where
138+
// ProxyType is TBox and ProxySetting is on
139+
const table_name = this.dropTables.items
140+
.filter((elements: any) =>
141+
elements.DropTableElement.some((el: any) => el.IsProxySetting && el.ProxyType == 'TBox')
142+
)
143+
.map((elements: any) => elements.DropActorDropTable).pop()
144+
if (table_name)
145+
this.dropTableChest = await MapMgr.getInstance().getObjDropTables("TBox_Field_Enemy", table_name)
146+
}
147+
if (this.minObj.name.startsWith("Enemy_Sandworm")) {
148+
// Fake a ProxyType: TBox to get the contents of the Molduga Chest
149+
this.dropTableChest = await MapMgr.getInstance().getObjDropTables("TBox_Field_Iron_Sandworm", "Sandworm")
150+
let el = this.dropTables.items.find((el: any) => el.DropActorDropTable == "Sandworm")
151+
if (el) {
152+
el.DropTableElement[0].IsProxySetting = true
153+
el.DropTableElement[0].ProxyType = "TBox"
154+
}
155+
}
129156
}
157+
this.areaData = await this.getAreaData();
158+
this.hornMaterial = await MsgMgr.getInstance().getHornMaterialData();
130159

131160
this.aiGroups = await MapMgr.getInstance().getObjAiGroups(this.obj.map_type, this.obj.map_name, this.obj.hash_id);
132161

@@ -488,6 +517,123 @@ export default class AppMapDetailsObj extends AppMapDetailsBase<MapMarkerObj | M
488517
return `Items: ${num}`;
489518
}
490519

520+
async getAreaData() {
521+
// @ts-ignore
522+
const fieldarea = this.obj.fieldarea
523+
if (!fieldarea)
524+
return {}
525+
let name = undefined
526+
let num = undefined
527+
for (const key of ["Surface", "Sky", "Cave", "Depths"]) {
528+
if (fieldarea.startsWith(key)) {
529+
num = parseInt(fieldarea.replace(key, ""))
530+
name = key
531+
break
532+
}
533+
}
534+
if (!name || num === undefined) {
535+
return "Proxy Lookup Failed"
536+
}
537+
if (name == "Surface")
538+
name = "Ground"
539+
if (name == "Depths")
540+
name = "MinusField"
541+
542+
const area_data = await MsgMgr.getInstance().getAreaData(name, num);
543+
return area_data
544+
}
545+
546+
getDropTableProxyLength(item: any): number {
547+
// Only need to know if the values is 0, 1, or something larger
548+
if (!Object.keys(this.areaData).length)
549+
return 0
550+
if (item.ProxyType == "WeaponDefault") {
551+
return 1
552+
}
553+
if (item.ProxyType == "LocalSeaFood") {
554+
return 2;
555+
}
556+
if (item.ProxyType == "ZonauBlockMaster") {
557+
return 2;
558+
}
559+
if (item.ProxyType == "EcoSystemRain") {
560+
return 2;
561+
}
562+
if (item.ProxyType == "HornMaterial") {
563+
return 1
564+
}
565+
if (item.ProxyType == "TBox") {
566+
return 2;
567+
}
568+
569+
return 0
570+
}
571+
572+
getDropTableProxyName(item: any) {
573+
if (item.ProxyType == "WeaponDefault") {
574+
return "Weapon"
575+
}
576+
if (item.ProxyType == "LocalSeaFood") {
577+
return "Local Seafood"
578+
}
579+
if (item.ProxyType == "ZonauBlockMaster") {
580+
return "Zonai Capsules"
581+
}
582+
if (item.ProxyType == "EcoSystemRain") {
583+
return "Special Rain Items"
584+
}
585+
if (item.ProxyType == "HornMaterial") {
586+
return "Horn"
587+
}
588+
if (item.ProxyType == "TBox") {
589+
return "Treasure Chest"
590+
}
591+
return ""
592+
}
593+
594+
getDropTableProxy(item: any) {
595+
if (!Object.keys(this.areaData).length)
596+
return ""
597+
if (item.ProxyType == "WeaponDefault" && this.areaData.Weapon) {
598+
let WeaponOrder = ["SmallSword", "LargeSword", "Spear", "Bow"] // Bow never appears
599+
let index = WeaponOrder.indexOf(item.WeaponType)
600+
return this.getName(this.areaData.Weapon[index].name)
601+
}
602+
if (item.ProxyType == "LocalSeaFood" && this.areaData.Seafood && this.areaData.Seafood != "") {
603+
return this.areaData.Seafood.map((fish: any) => {
604+
return { num: fish.num, name: this.getName(fish.name) }
605+
})
606+
}
607+
if (item.ProxyType == "ZonauBlockMaster" && this.areaData.SpObjCapsuleBlockMaster) {
608+
let len = this.areaData.SpObjCapsuleBlockMaster.length
609+
let num = 100.0 / len;
610+
return this.areaData.SpObjCapsuleBlockMaster.map((fish: any) => {
611+
return { num, name: this.getName(fish.name) }
612+
})
613+
}
614+
if (item.ProxyType == "EcoSystemRain" && this.areaData.RainBonusMaterial) {
615+
return this.areaData.RainBonusMaterial.map((wet: any) => {
616+
return { num: wet.num, name: this.getName(wet.name) }
617+
})
618+
}
619+
if (item.ProxyType == "HornMaterial" && this.minObj) {
620+
return this.getName(this.hornMaterial[this.minObj.name] || "Unknown Horn Material")
621+
}
622+
if (item.ProxyType == "TBox" && this.dropTableChest) {
623+
return this.dropTableChest.items[0].DropTableElement.map((v: any) => {
624+
let name = this.getDropItemName(v)
625+
return { num: v.DropProbability, name }
626+
})
627+
}
628+
return "Unknown Proxy Type"
629+
}
630+
631+
getDropItemName(item: any) {
632+
if (item.isProxySetting)
633+
return this.getDropTableProxy(item)
634+
return this.getName(item.DropActorName.split("/").pop().split(".")[0])
635+
}
636+
491637
findItemByHash(group: any[], links: any[], name: string): any {
492638
let hashes = links.map(link => link.DestUnitHashId);
493639
let out = group.find(g => g.data.UnitConfigName == name && hashes.includes(g.hash_id));

src/components/AppMapDetailsObj.vue

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,27 @@
7979
<table>
8080
<tr v-for="(item, kitem) in [...group.DropTableElement].sort((a,b) => b.DropProbability - a.DropProbability)" :key="kitem" class="droptable_item">
8181
<td class="drop-probability">{{item.DropProbability}}%</td>
82-
<td>
83-
<span v-if="item.IsProxySetting">{{item.ProxyType}} - {{item.WeaponType}}</span>
84-
<span v-else>{{getName(item.DropActorName.split("/").pop().split(".")[0])}}</span>
85-
</td>
82+
<template v-if="item.IsProxySetting">
83+
<td v-if="getDropTableProxyLength(item) == 1">
84+
<span>{{getDropTableProxy(item)}}</span>
85+
</td>
86+
<td v-else-if="getDropTableProxyLength(item) == 0">
87+
</td>
88+
<td v-else>
89+
<div>{{getDropTableProxyName(item)}}</div>
90+
<table>
91+
<tr v-for="(pitem, ipitem) in getDropTableProxy(item)" :key="ipitem">
92+
<td class="drop-probability-sub">{{pitem.num}}%</td>
93+
<td><span>{{pitem.name}}</span></td>
94+
</tr>
95+
</table>
96+
</td>
97+
</template>
98+
<template v-else>
99+
<td>
100+
<span>{{getDropItemName(item)}}</span>
101+
</td>
102+
</template>
86103
</tr>
87104
</table>
88105
</div>
@@ -202,5 +219,12 @@
202219
text-align: right;
203220
margin-right: 1em;
204221
}
222+
223+
.drop-probability-sub {
224+
display: inline-block;
225+
width: 2.5em;
226+
text-align: right;
227+
margin-right: 1em;
228+
}
205229
</style>
206230
<script src="./AppMapDetailsObj.ts"></script>

0 commit comments

Comments
 (0)