From 720cdee1de42c6ca201473ba0340a6ad2b2931df Mon Sep 17 00:00:00 2001 From: lifegpc Date: Thu, 9 Apr 2026 11:22:38 +0800 Subject: [PATCH] Add DameganeCrypt (untested) --- msg_tool_xp3data/crypt.json | 4 ++++ src/scripts/kirikiri/archive/xp3/crypt/mod.rs | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/msg_tool_xp3data/crypt.json b/msg_tool_xp3data/crypt.json index 8392ec4..182e974 100644 --- a/msg_tool_xp3data/crypt.json +++ b/msg_tool_xp3data/crypt.json @@ -301,6 +301,10 @@ "$type": "HashCrypt", "Title": "カスタム隷奴 4/4+/V" }, + "Damegane": { + "$type": "DameganeCrypt", + "Title": "だめがね" + }, "Daraku Koujo": { "$type": "FlyingShineCrypt", "Title": "堕落皇女~魔術師の罠に嵌った聖女~" diff --git a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs index ae60b2b..741250a 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs @@ -161,6 +161,7 @@ enum CryptType { SeitenCrypt, OkibaCrypt, DieselmineCrypt, + DameganeCrypt, } #[derive(Clone, Debug, Deserialize)] @@ -249,6 +250,7 @@ impl Schema { CryptType::SeitenCrypt => Box::new(SeitenCrypt::new(self.base.clone())), CryptType::OkibaCrypt => Box::new(OkibaCrypt::new(self.base.clone())), CryptType::DieselmineCrypt => Box::new(DieselmineCrypt::new(self.base.clone())), + CryptType::DameganeCrypt => Box::new(DameganeCrypt::new(self.base.clone())), }) } } @@ -836,6 +838,25 @@ impl Read for DieselmineCryptReader { } } +seek_crypt_filehash_key_u8_impl!(DameganeCrypt, DameganeCryptReader); + +impl Read for DameganeCryptReader { + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + let readed = self.inner.read(buf)?; + for (i, t) in (&mut buf[..readed]).iter_mut().enumerate() { + let offset = self.seg_start + self.pos + i as u64; + let key = if offset & 1 != 0 { + self.key + } else { + offset as u8 + }; + *t ^= key; + } + self.pos += readed as u64; + Ok(readed) + } +} + #[test] fn test_deserialize_crypt() { for (key, schema) in CRYPT_SCHEMA.iter() {