From 2f28a4a867e01d9950307d46086d818a36ceea5e Mon Sep 17 00:00:00 2001 From: aqiu384 Date: Thu, 18 Jan 2024 01:34:30 -0800 Subject: [PATCH] smtsj init --- src/smt4/data/demon-ids.tsv | 6 +- src/smtsj/data/demon-ids.tsv | 511 ++++++++++++++++++++++++++ src/smtsj/data/demon-resists-01.bin | Bin 0 -> 62400 bytes src/smtsj/data/demon-resists-02.bin | Bin 0 -> 81600 bytes src/smtsj/data/demon-sources.bin | Bin 0 -> 7200 bytes src/smtsj/data/demon-stats-skills.bin | Bin 0 -> 24000 bytes src/smtsj/data/skill-ids.tsv | 419 +++++++++++++++++++++ src/smtsj/demon-resists-02.py | 96 +++++ src/smtsj/demon-sources.py | 42 +++ src/smtsj/demon-stats-skills.py | 46 +++ src/smtsj/shared.py | 21 ++ 11 files changed, 1138 insertions(+), 3 deletions(-) create mode 100644 src/smtsj/data/demon-ids.tsv create mode 100644 src/smtsj/data/demon-resists-01.bin create mode 100644 src/smtsj/data/demon-resists-02.bin create mode 100644 src/smtsj/data/demon-sources.bin create mode 100644 src/smtsj/data/demon-stats-skills.bin create mode 100644 src/smtsj/data/skill-ids.tsv create mode 100755 src/smtsj/demon-resists-02.py create mode 100755 src/smtsj/demon-sources.py create mode 100755 src/smtsj/demon-stats-skills.py create mode 100644 src/smtsj/shared.py diff --git a/src/smt4/data/demon-ids.tsv b/src/smt4/data/demon-ids.tsv index 7b8d247..b9393c7 100644 --- a/src/smt4/data/demon-ids.tsv +++ b/src/smt4/data/demon-ids.tsv @@ -720,7 +720,7 @@ Grudge Horde 0 ??? 0 ??? 0 ??? 0 -b"Babylon's Might" 0 +Babylon's Might 0 Pirate Horde 0 Insane Horde 0 Killer Horde 0 @@ -788,7 +788,7 @@ Tokisada 0 Gryphon 0 Seth 0 Hungry Man 0 -b"Dagda's Cauldron" 0 +Dagda's Cauldron 0 ??? 0 ??? 0 ??? 0 @@ -1197,4 +1197,4 @@ Mushussu 0 Enku 0 Valkyrie 0 Tlaltecuhtli 0 -Kin-Ki 0 \ No newline at end of file +Kin-Ki 0 diff --git a/src/smtsj/data/demon-ids.tsv b/src/smtsj/data/demon-ids.tsv new file mode 100644 index 0000000..712a68a --- /dev/null +++ b/src/smtsj/data/demon-ids.tsv @@ -0,0 +1,511 @@ +Seraph 1 +Metatron 1 +Sraosha 1 +Azrael 1 +Israfel 1 +Victor 1 +Aniel 1 +Kazfiel 1 +Amaterasu 1 +Laksmi 1 +Norn 1 +Tlazolteotl 1 +Pallas Athena 1 +Scathach 1 +Parvati 1 +Fortuna 1 +Hathor 1 +Ishtar 1 +DEMON_019 0 +Garuda 1 +Yatagarasu 1 +Feng Huang 1 +Thunderbird 1 +Phoenix 1 +Suparna 1 +Hamsa 1 +Armaiti 1 +Sandalphon 1 +Yggdrasil 1 +Haoma 1 +Kukunochi 1 +Mayahuel 1 +Daphne 1 +DEMON_034 0 +DEMON_035 0 +Cherub 1 +Throne 1 +Dominion 1 +Virtue 1 +Power 1 +Principality 1 +Archangel 1 +Angel 1 +DEMON_044 0 +DEMON_045 0 +Da Peng 1 +Rukh 1 +Tangata Manu 1 +Caladrius 1 +Gu Huo Niao 1 +Harpy 1 +Toufei 1 +DEMON_053 0 +DEMON_054 0 +Ganesha 1 +Xiuhtecuhtli 1 +Valkyrie 1 +Shiwanna 1 +Dis 1 +Karasu Tengu 1 +Vodyanik 1 +Koppa Tengu 1 +DEMON_063 0 +Kikuri-Hime 1 +Peri 1 +Sarasvati 1 +Senri 1 +Ame no Uzume 1 +Apsaras 1 +Mada 1 +Demiurge 1 +Seth 1 +Samael 1 +Pales 1 +Taotie 1 +Pachacamac 1 +Mishaguji 1 +Baphomet 1 +Alciel 1 +DEMON_080 0 +Hresvelgr 1 +Huoniao 1 +Anzu 1 +Gurr 1 +Zhen 1 +Camazotz 1 +Moh Shuvuu 1 +Itsumade 1 +Onmoraki 1 +DEMON_090 0 +DEMON_091 0 +Erlkonig 1 +Alraune 1 +Zaccoum 1 +Skogsra 1 +Mandrake 1 +Shan Xiao 1 +DEMON_098 0 +DEMON_099 0 +Vishnu 1 +Hachiman 1 +Odin 1 +Omoteotl 1 +Prometheus 1 +Inti 1 +Thoth 1 +DEMON_107 0 +DEMON_108 0 +Barong 1 +Anubis 1 +Chimera 1 +Kaiming Shou 1 +Makami 1 +Kamapua'a 1 +Shiisaa 1 +DEMON_116 0 +DEMON_117 0 +Sphinx 1 +Sleipnir 1 +Baihu 1 +Airavata 1 +Qing Niuguai 1 +Pabilsag 1 +Apis 1 +Heqet 1 +DEMON_126 0 +Nadja 1 +Heimdall 1 +Hanuman 1 +Cu Chulainn 1 +Kurama Tengu 1 +Tlaloc 1 +Frost Ace 1 +Tam Lin 1 +Kresnik 1 +Demonee-ho 1 +Titania 1 +Oberon 1 +Vivian 1 +Spriggan 1 +Silky 1 +Pyro Jack 1 +High Pixie 1 +Jack Frost 1 +Goblin 1 +Pixie 1 +Lorelei 1 +DEMON_148 0 +Cerberus 1 +Ammut 1 +Gryphon 1 +Orthrus 1 +Hsing-Hsing 1 +Nekomata 1 +Inugami 1 +Katakirauwa 1 +Kaso 1 +Master Therion 1 +Tsuchigumo 1 +Gogmagog 1 +Tlaltecuhtli 1 +Titan 1 +Kwancha 1 +Sudama 1 +Dwarf 1 +Hua Po 1 +Knocker 1 +DEMON_168 0 +Vritra 1 +Ananta 1 +Orochi 1 +Gui Xian 1 +Yurlungur 1 +Vouivre 1 +Nozuchi 1 +Naga 1 +DEMON_177 0 +Ixtab 1 +Mot 1 +Nergal 1 +Guedhe 1 +Persephone 1 +Hel 1 +Thanatos 1 +DEMON_185 0 +Fenrir 1 +Cabracan 1 +Catoblepas 1 +Manticore 1 +Pellaidh 1 +Nue 1 +Raiju 1 +Jueyuan 1 +DEMON_194 0 +DEMON_195 0 +Hecatoncheir 1 +Girimehkala 1 +Grendel 1 +Black Frost 1 +Rakshasa 1 +Wendigo 1 +Ippon-Datara 1 +Gremlin 1 +DEMON_204 0 +DEMON_205 0 +Arachne 1 +Mothman 1 +Myrmecolion 1 +Okiku-Mushi 1 +Ubu 1 +DEMON_211 0 +DEMON_212 0 +Shiva 1 +Susano-O 1 +Kartikeya 1 +Wu Kong 1 +Tonatiuh 1 +Ares 1 +Zaou-Gongen 1 +DEMON_220 0 +Xi Wangmu 1 +Skadi 1 +Black Maria 1 +Diana 1 +Hariti 1 +Sedna 1 +Dzelarhons 1 +Pele 1 +Isis 1 +Cybele 1 +Huang Long 1 +Quetzalcoatl 1 +Zhu Yin 1 +Long 1 +Gucumatz 1 +Patrimpas 1 +Makara 1 +DEMON_238 0 +DEMON_239 0 +Thor 1 +Bishamonten 1 +Jikokuten 1 +Koumokuten 1 +Zouchouten 1 +Takeminakata 1 +DEMON_246 0 +DEMON_247 0 +Gemori 1 +Decarabia 1 +Ose 1 +Dantalian 1 +Orias 1 +Halphas 1 +Bifrons 1 +Melchom 1 +Nebiros 1 +DEMON_257 0 +Ongyo-Ki 1 +Berserker 1 +Fuu-Ki 1 +Sui-Ki 1 +Kin-Ki 1 +Momunofu 1 +Yamawaro 1 +Azumi 1 +Oni 1 +DEMON_267 0 +DEMON_268 0 +Rangda 1 +Dakini 1 +Atropos 1 +Lachesis 1 +Clotho 1 +Yuki Jyorou 1 +Leanan Sidhe 1 +Acheri 1 +Volvo 1 +Kali 1 +Lilith 1 +Wild Hunt 1 +Succubus 1 +Kaiwan 1 +Incubus 1 +Fomorian 1 +Lilim 1 +Sandman 1 +Hypnos 1 +DEMON_288 0 +Mara 1 +Surt 1 +Tzitzimitl 1 +Abaddon 1 +King Frost 1 +Loki 1 +Balor 1 +Beelzebub 1 +Vasuki 1 +Fafnir 1 +Nidhoggr 1 +Mushussu 1 +Kingu 1 +Basilisk 1 +Bai Suzhen 1 +Zhu Tun She 1 +Lucifuge 1 +Belial 1 +Legion 1 +Pisaca 1 +Macabre 1 +Inferno 1 +Dybbuk 1 +Poltergeist 1 +DEMON_313 0 +Mad Gasser 1 +Doppelganger 1 +Slime 1 +Night Stalker 1 +Jack the Ripper 1 +Vetala 1 +Kudlak 1 +Strigoii 1 +Ghoul 1 +Churel 1 +Mou-Ryo 1 +Preta 1 +Bagaboo 1 +Bogaboo 1 +Saki Mitama 1 +Kusi Mitama 1 +Nigi Mitama 1 +Ara Mitama 1 +Bugaboo 1 +Demonica-L 1 +Salamander 1 +Undine 1 +Sylph 1 +Gnome 1 +Flaemis 1 +Aquans 1 +Aeros 1 +Erthys 1 +Demonica-N 1 +Demonica-C 1 +Mother Harlot 1 +Trumpeter 1 +Pale Rider 1 +Black Rider 1 +Red Rider 1 +White Rider 1 +Alice 1 +Matador 1 +David 1 +DEMON_353 0 +DEMON_354 0 +Kangiten 1 +Kama 1 +Kinmamon 1 +Futotama 1 +Kanbari 1 +DEMON_360 0 +DEMON_361 0 +Hare of Inaba 1 +Kuda 1 +Chupacabra 1 +Mamedanuki 1 +DEMON_366 0 +DEMON_367 0 +Masakado 1 +Tezcatlipoca 1 +Attis 1 +Aramisaki 1 +Dionysus 1 +Ogun 1 +Anat 1 +Alilat 1 +DEMON_376 0 +DEMON_377 0 +DEMON_378 0 +DEMON_379 0 +DEMON_380 0 +DEMON_381 0 +DEMON_382 0 +DEMON_383 0 +DEMON_384 0 +DEMON_385 0 +DEMON_386 0 +DEMON_387 0 +Morax 1 +Mithras 1 +Horkos 1 +Asura 1 +Ouroboros 1 +Moloch 1 +Mitra 1 +Orcus 1 +Asherah 1 +Tiamat 1 +Maya 1 +Mastema 1 +DEMON_400 0 +DEMON_401 0 +DEMON_402 0 +DEMON_403 0 +DEMON_404 0 +DEMON_405 0 +DEMON_406 0 +DEMON_407 0 +DEMON_408 0 +DEMON_409 0 +DEMON_410 0 +DEMON_411 0 +Meta Gore 2 +DEMON_413 0 +Judge Zelenin 2 +Pillar Zelenin 2 +Awake Jiminez 2 +Mother Mem Aleph 2 +Gore 2 +Jiminez 2 +Soil Jiminez 2 +Empty Mem Aleph 2 +DEMON_422 0 +DEMON_423 0 +DEMON_424 0 +DEMON_425 0 +DEMON_426 0 +DEMON_427 0 +DEMON_428 0 +DEMON_429 0 +DEMON_430 0 +DEMON_431 0 +DEMON_432 0 +DEMON_433 0 +DEMON_434 0 +DEMON_435 0 +DEMON_436 0 +DEMON_437 0 +DEMON_438 0 +DEMON_439 0 +DEMON_440 0 +Norris 2 +DEMON_442 0 +DEMON_443 0 +DEMON_444 0 +Demonica Jiminez 2 +DEMON_446 0 +Formless Weak Fire 2 +Formless Weak Ice 2 +Formless Weak Elec 2 +Formless Weak Wind 2 +DEMON_451 0 +DEMON_452 0 +DEMON_453 0 +DEMON_454 0 +DEMON_455 0 +Strange Demon 2 +Soldier 2 +Sergeant 2 +Jack 2 +DEMON_460 0 +Ryan 2 +DEMON_462 0 +DEMON_463 0 +DEMON_464 0 +McClane 2 +DEMON_466 0 +DEMON_467 0 +DEMON_468 0 +DEMON_469 0 +DEMON_470 0 +DEMON_471 0 +DEMON_472 0 +DEMON_473 0 +DEMON_474 0 +DEMON_475 0 +DEMON_476 0 +DEMON_477 0 +DEMON_478 0 +DEMON_479 0 +DEMON_480 0 +DEMON_481 0 +DEMON_482 0 +DEMON_483 0 +DEMON_484 0 +DEMON_485 0 +DEMON_486 0 +DEMON_487 0 +DEMON_488 0 +DEMON_489 0 +DEMON_490 0 +DEMON_491 0 +DEMON_492 0 +DEMON_493 0 +DEMON_494 0 +DEMON_495 0 +DEMON_496 0 +DEMON_497 0 +DEMON_498 0 +Anahita 1 +Forneus 1 +Zeus 1 +Maria 1 +Amon 1 +Shaytan 1 +Demeter 1 +DEMON_506 0 +DEMON_507 0 +DEMON_508 0 +DEMON_509 0 +DEMON_510 0 +DEMON_511 0 diff --git a/src/smtsj/data/demon-resists-01.bin b/src/smtsj/data/demon-resists-01.bin new file mode 100644 index 0000000000000000000000000000000000000000..c850e23bceb656e4fc3990410babed766e1f94c1 GIT binary patch literal 62400 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 NRT< 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 literal 0 HcmV?d00001 diff --git a/src/smtsj/data/demon-resists-02.bin b/src/smtsj/data/demon-resists-02.bin new file mode 100644 index 0000000000000000000000000000000000000000..44e9b9cc85bbe566b029068352f1f74075f0140b GIT binary patch literal 81600 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 G5B&d?w5JkL7wtn2RX?(V+( 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 kKtIR+lGS?^{O&(8?>}Pv3ibb*#hiSj`S;M1& literal 0 HcmV?d00001 diff --git a/src/smtsj/data/skill-ids.tsv b/src/smtsj/data/skill-ids.tsv new file mode 100644 index 0000000..f534614 --- /dev/null +++ b/src/smtsj/data/skill-ids.tsv @@ -0,0 +1,419 @@ +Agi +Agilao +Agidyne +Maragi +Maragion +Maragidyne +Fire Breath +Trisagion +Ragnarok +Bufu +Bufula +Bufudyne +Mabufu +Mabufula +Mabufudyne +Ice Breath +Glacial Blast +Cold World +Zio +Zionga +Ziodyne +Mazio +Mazionga +Maziodyne +Shock +Thunder Reign +Charming Bolt +Garu +Garula +Garudyne +Magaru +Magarula +Magarudyne +Wind Breath +Killing Wind +Floral Gust +Megido +Megidola +Megidolaon +Big Bang +Antichthon +Babylon Goblet +Holy Wrath +Judgement +Sea of Chaos +Kamikaze +Last Resort +Life Drain +Mana Drain +Energy Drain +Horn of Fate +Eternal Rest +Mudo +Mudoon +Mamudo +Mamudoon +Die For Me! +Hama +Hamaon +Mahama +Mahamaon +Judgement Light +Dormina +Lullaby +Poisma +Toxic Cloud +Shibaboo +Binding Cry +Marin Karin +Frolic +Stone Curse +Stone Breath +Bobasma +Staredown +Makajama +Tricky Dance +SKILL_077 +SKILL_078 +SKILL_079 +SKILL_080 +SKILL_081 +Hostile Terror +SKILL_083 +SKILL_084 +SKILL_085 +SKILL_086 +SKILL_087 +Evil Vortex +SKILL_089 +SKILL_090 +SKILL_091 +SKILL_092 +Illusory Ritual +SKILL_094 +SKILL_095 +SKILL_096 +SKILL_097 +SKILL_098 +Mel Faize +Hellish Spurt +Dia +Diarama +Diarahan +Media +Mediarama +Mediarahan +Salvation +Patra +Me Patra +Posumudi +Paraladi +Charmdi +Petradi +Mutudi +Strandi +Bomdi +Amrita +Recarm +Samarecarm +Recarmdra +Tarukaja +Sukukaja +Rakukaja +Luster Candy +Dekaja +Tarunda +Sukunda +Rakunda +Debilitate +Dekunda +Silent Prayer +Alluring Squall +War Cry +Fog Breath +Acid Breath +Taunt +Tables Turned +Offered Soul +Tetrakarn +Makarakarn +Tetraja +Charge +Concentrate +Blood Ritual +Lost Word +Sabbatma +Invitation +Death Bite +Keraunos +Adamant Sickle +Lunge +Explosive Fist +Mortal Jihad +Rampage +Megaton Press +Madness Crush +Crescent Slice +True Lobotomy +Berserker God +Heat Wave +Deathbound +Hades Blast +Feral Claw +Mega Claw +Nihil Claw +Giant Slice +Axel Claw +Madness Nails +Fang Breaker +Dream Fist +Tyranny +SKILL_172 +Ambush +Getsu-ei +Zan-Ei +Blight +Occult Flash +Stun Claw +Poison Claw +Needle Rush +Hell Thrust +Grand Tack +Riot Gun +Needle Assault +Arrow Rain +Heaven's Bow +Dream Needle +Toxic Sting +Peter Piper +Charm Strike +Shooting Spree +Fleeting Rain +Megido Flame +Luster Soul +SKILL_195 +SKILL_196 +SKILL_197 +SKILL_198 +SKILL_199 +SKILL_200 +SKILL_201 +SKILL_202 +SKILL_203 +SKILL_204 +SKILL_205 +SKILL_206 +SKILL_207 +SKILL_208 +SKILL_209 +SKILL_210 +SKILL_211 +SKILL_212 +SKILL_213 +SKILL_214 +SKILL_215 +SKILL_216 +SKILL_217 +SKILL_218 +SKILL_219 +SKILL_220 +SKILL_221 +SKILL_222 +SKILL_223 +SKILL_224 +SKILL_225 +SKILL_226 +SKILL_227 +Snipe +SKILL_229 +SKILL_230 +Airshot +SKILL_232 +SKILL_233 +SKILL_234 +SKILL_235 +SKILL_236 +SKILL_237 +SKILL_238 +SKILL_239 +Headshot +Legshot +Cripple +Armshot +SKILL_244 +SKILL_245 +SKILL_246 +SKILL_247 +SKILL_248 +Black Flame +Gehenna +SKILL_251 +SKILL_252 +SKILL_253 +SKILL_254 +SKILL_255 +SKILL_256 +SKILL_257 +SKILL_258 +SKILL_259 +SKILL_260 +SKILL_261 +SKILL_262 +SKILL_263 +SKILL_264 +SKILL_265 +SKILL_266 +SKILL_267 +SKILL_268 +SKILL_269 +SKILL_270 +SKILL_271 +SKILL_272 +SKILL_273 +SKILL_274 +SKILL_275 +SKILL_276 +SKILL_277 +SKILL_278 +SKILL_279 +SKILL_280 +SKILL_281 +SKILL_282 +SKILL_283 +SKILL_284 +SKILL_285 +SKILL_286 +SKILL_287 +SKILL_288 +SKILL_289 +SKILL_290 +SKILL_291 +SKILL_292 +SKILL_293 +SKILL_294 +SKILL_295 +SKILL_296 +SKILL_297 +SKILL_298 +SKILL_299 +SKILL_300 +SKILL_301 +SKILL_302 +SKILL_303 +SKILL_304 +SKILL_305 +SKILL_306 +SKILL_307 +SKILL_308 +SKILL_309 +SKILL_310 +SKILL_311 +SKILL_312 +SKILL_313 +SKILL_314 +SKILL_315 +SKILL_316 +SKILL_317 +SKILL_318 +SKILL_319 +SKILL_320 +SKILL_321 +SKILL_322 +SKILL_323 +SKILL_324 +SKILL_325 +SKILL_326 +Horned Frenzy +Waking Dream +Air Dive +Taking a Bite +Asura +Wild Lightning +Mother Earth +Sunset Melody +SKILL_335 +SKILL_336 +SKILL_337 +SKILL_338 +SKILL_339 +Iron Judgement +Desperate Hit +Breath +SKILL_343 +SKILL_344 +SKILL_345 +SKILL_346 +SKILL_347 +SKILL_348 +Untainted Wind +Lethe's Whisper +Resist Phys +Void Phys +Repel Phys +Drain Phys +Resist Gun +Void Gun +Repel Gun +Drain Gun +Resist Fire +Void Fire +Repel Fire +Drain Fire +Resist Ice +Void Ice +Repel Ice +Drain Ice +Resist Elec +Void Elec +Repel Elec +Drain Elec +Resist Wind +Void Wind +Repel Wind +Drain Wind +Resist Curse +Void Curse +Resist Expel +Void Expel +Void Mind +Void Nerve +Fire Boost +Fire Amp +Ice Boost +Ice Amp +Elec Boost +Elec Amp +Wind Boost +Wind Amp +Endure +Enduring Soul +Counter +Retaliate +Life Aid +Mana Aid +Victory Cry +Spring of Life +Chakra Walk +Watchful +Vigilant +Sleepwalker +Laplace Curse +Preparedness +Gun Amp +SKILL_404 +SKILL_405 +SKILL_406 +SKILL_407 +SKILL_408 +Phys Boost +Phys Amp +Gun Boost +Recovery Boost +Recovery Amp +Life Bonus +Life Gain +Life Surge +Mana Bonus +Mana Gain +Mana Surge diff --git a/src/smtsj/demon-resists-02.py b/src/smtsj/demon-resists-02.py new file mode 100755 index 0000000..76044d3 --- /dev/null +++ b/src/smtsj/demon-resists-02.py @@ -0,0 +1,96 @@ +#!/usr/bin/python3 +import struct +import json +from shared import printif_notequal, save_ordered_demons + +LINE_LEN = 0x88 # 0x68 +START_OFFSET = 0x00 + 0*LINE_LEN +END_OFFSET = 0*LINE_LEN +OLD_RESISTS = ['phy', 'gun', 'fir', 'ice', 'ele', 'for', 'lig', 'dar'] +OLD_AILMENTS = ['Poison', 'Paralyze', 'Stone', 'Strain', 'Sleep', 'Charm', 'Mute', 'Fear', 'Bomb', 'Rage'] + +RESIST_LVLS = { + 0: '-', + 1: 'n', + 2: 'w', + 3: 'r', + 4: 'd', + 5: 's' +} + +RESIST_MODS = { + 'X': 300, + 'W': 200, + 'w': 125, + '5': 50, + '-': 100, + 's': 50, + 'n': 100, + 'N': 0, + 'r': 100, + 'd': 100, + 'D': 200 +} + +AILMENTS = [ + 'Sleep', + 'Poison', + 'Paralyze', + 'Charm', + 'Mute', + 'Stone', + 'Fear', + 'Strain', + 'Bomb', + 'Rage' +] + +AILMENT_ORDER = [AILMENTS.index(x) for x in OLD_AILMENTS] + +with open('data/demon-data.json') as jsonfile: + OLD_DEMONS = json.load(jsonfile) +with open('data/redux-demon-data.json') as jsonfile: + OLD_DEMONS.update(json.load(jsonfile)) +with open('data/demon-resists-02.bin', 'rb') as binfile: + NEW_DEMONS = binfile.read() +with open('data/demon-ids.tsv') as tsvfile: + DEMON_IDS = ['BLANK\t0'] + [x.strip() for x in tsvfile] + +for d_id, line_start in enumerate(range(START_OFFSET, LINE_LEN * len(DEMON_IDS), LINE_LEN)): + line = NEW_DEMONS[line_start:line_start + LINE_LEN] + dname, in_comp = DEMON_IDS[d_id].split('\t') + + if int(in_comp) != 1: + continue + + demon = OLD_DEMONS[dname] + + full_resists = struct.unpack('<8H', line[0x00:0x10]) + full_ailments = struct.unpack('<11H', line[0x10:0x26]) + + resists = ''.join(RESIST_LVLS[x >> 10] for x in full_resists) + ailments = ''.join(RESIST_LVLS[full_ailments[x] >> 10] for x in AILMENT_ORDER) + res_mods = [x & 0x3FF for x in full_resists] + ail_mods = [full_ailments[x] & 0x3FF for x in AILMENT_ORDER] + + old_resists = demon['resists'] + old_ailments = demon.get('ailments', '-'*len(OLD_AILMENTS)) + old_res_mods = demon.get('resmods', [0]*len(OLD_RESISTS)).copy() + old_ail_mods = demon.get('ailmods', [0]*len(OLD_AILMENTS)).copy() + + for i, res_mod in enumerate(old_res_mods): + if res_mod == 0: + old_res_mods[i] = RESIST_MODS[old_resists[i]] + for i, ail_mod in enumerate(old_ail_mods): + if ail_mod == 0: + old_ail_mods[i] = RESIST_MODS[old_ailments[i]] + + old_resists = old_resists.lower().replace('x', 'w').replace('5', '-') + old_ailments = old_ailments.lower().replace('x', 'w').replace('5', '-') + + printif_notequal(dname, 'resists', old_resists, resists) + printif_notequal(dname, 'ailments', old_ailments, ailments) + printif_notequal(dname, 'res_mods', old_res_mods, res_mods) + printif_notequal(dname, 'ail_mods', old_ail_mods, ail_mods) + +save_ordered_demons(OLD_DEMONS, 'demon-data.json') diff --git a/src/smtsj/demon-sources.py b/src/smtsj/demon-sources.py new file mode 100755 index 0000000..aaa9242 --- /dev/null +++ b/src/smtsj/demon-sources.py @@ -0,0 +1,42 @@ +#!/usr/bin/python3 +import struct +import json +from shared import save_ordered_demons + +LINE_LEN = 0x0C +START_OFFSET = 0x00 + 0*LINE_LEN +END_OFFSET = 0*LINE_LEN + +with open('data/demon-data.json') as jsonfile: + OLD_DEMONS = json.load(jsonfile) +with open('data/redux-demon-data.json') as jsonfile: + OLD_DEMONS.update(json.load(jsonfile)) +with open('data/demon-sources.bin', 'rb') as binfile: + NEW_DEMONS = binfile.read() +with open('data/demon-ids.tsv') as tsvfile: + DEMON_IDS = ['BLANK\t0'] + [x.strip() for x in tsvfile] +with open('data/skill-ids.tsv') as tsvfile: + SKILL_IDS = ['BLANK'] + [x.strip() for x in tsvfile] + +for d_id, line_start in enumerate(range(START_OFFSET, LINE_LEN * len(DEMON_IDS), LINE_LEN)): + line = NEW_DEMONS[line_start:line_start + LINE_LEN] + dname, in_comp = DEMON_IDS[d_id].split('\t') + + if int(in_comp) != 1: + continue + + demon = OLD_DEMONS[dname] + s_id = struct.unpack('<1H', line[0x00:0x02])[0] + source = struct.unpack('<3H', line[0x02:0x08]) + + + skills = demon['source'] + + for i, s_id in enumerate(source): + sname = SKILL_IDS[s_id] + if s_id == 0: + continue + if skills[i] != sname: + print(dname, sname, 0, skills) + +save_ordered_demons(OLD_DEMONS, 'demon-data.json') diff --git a/src/smtsj/demon-stats-skills.py b/src/smtsj/demon-stats-skills.py new file mode 100755 index 0000000..c034e76 --- /dev/null +++ b/src/smtsj/demon-stats-skills.py @@ -0,0 +1,46 @@ +#!/usr/bin/python3 +import struct +import json +from shared import printif_notequal, save_ordered_demons + +LINE_LEN = 0x28 +START_OFFSET = 0x00 + 0*LINE_LEN +END_OFFSET = 0*LINE_LEN + +with open('data/demon-data.json') as jsonfile: + OLD_DEMONS = json.load(jsonfile) +with open('data/redux-demon-data.json') as jsonfile: + OLD_DEMONS.update(json.load(jsonfile)) +with open('data/demon-stats-skills.bin', 'rb') as binfile: + NEW_DEMONS = binfile.read() +with open('data/demon-ids.tsv') as tsvfile: + DEMON_IDS = ['BLANK\t0'] + [x.strip() for x in tsvfile] +with open('data/skill-ids.tsv') as tsvfile: + SKILL_IDS = ['BLANK'] + [x.strip() for x in tsvfile] + +for d_id, line_start in enumerate(range(START_OFFSET, LINE_LEN * len(DEMON_IDS), LINE_LEN)): + line = NEW_DEMONS[line_start:line_start + LINE_LEN] + dname, in_comp = DEMON_IDS[d_id].split('\t') + + if int(in_comp) != 1: + continue + + demon = OLD_DEMONS[dname] + + dlvl = struct.unpack('<1B', line[0x00:0x01])[0] + stats = struct.unpack('<5B', line[0x01:0x06]) + innate = struct.unpack('<3H', line[0x10:0x16]) + + printif_notequal(dname, 'lvl', demon['lvl'], dlvl) + printif_notequal(dname, 'stats', demon['stats'][2:], list(stats)) + + skills = demon['skills'] + + for i, s_id in enumerate(innate): + sname = SKILL_IDS[s_id] + if s_id == 0: + continue + if skills[i] != sname: + print(dname, sname, 0, skills) + +save_ordered_demons(OLD_DEMONS, 'demon-data.json') diff --git a/src/smtsj/shared.py b/src/smtsj/shared.py new file mode 100644 index 0000000..899b03b --- /dev/null +++ b/src/smtsj/shared.py @@ -0,0 +1,21 @@ +import json + +def printif_notequal(dname, field, lhs, rhs): + if str(lhs) != str(rhs): + print(dname, field, lhs, rhs) + +def save_ordered_demons(demons, fname): + for entry in demons.values(): + for stat_set in ['resmods', 'ailmods', 'stats']: + if stat_set in entry: + entry[stat_set] = '[' + ', '.join(str(x) for x in entry[stat_set]) + ']' + for stat_set in ['skills', 'source']: + if stat_set in entry: + entry[stat_set] = '[|' + '|, |'.join(x for x in entry[stat_set]) + '|]' + + jstring = json.dumps(demons, indent=2, sort_keys=True) + jstring = jstring.replace('||', '\n').replace('|', '"') + jstring = jstring.replace('"[', '[').replace(']"', ']').replace('"{', '{').replace('}"', '}') + + with open(fname, 'w+') as jsonfile: + jsonfile.write(jstring) \ No newline at end of file