From 0a9e0ff0a7655a1aae2820d2ca0b16cdbf74d446 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Mon, 4 May 2026 10:15:42 +0800 Subject: [PATCH] Add HachukanoCrypt (untested) --- msg_tool_xp3data/crypt.json | 5 +++ .../archive/xp3/crypt/chain_reaction.rs | 36 +++++++++++++++++++ src/scripts/kirikiri/archive/xp3/crypt/mod.rs | 4 +++ 3 files changed, 45 insertions(+) diff --git a/msg_tool_xp3data/crypt.json b/msg_tool_xp3data/crypt.json index 663219d..1da9b3d 100644 --- a/msg_tool_xp3data/crypt.json +++ b/msg_tool_xp3data/crypt.json @@ -624,6 +624,11 @@ "ControlBlockName": "grisaia_vol5.bin", "Title": "グリザイア ファントムトリガー Vol. 5 | 灰色幻影扳机第5卷 | 灰色:幻影扳机 Vol. 5" }, + "Hachukano": { + "$type": "HachukanoCrypt", + "StartupTjsNotEncrypted": true, + "Title": "はちゅかの" + }, "Hahadori ~Ochiteiku Haha no Eizou Kiroku~": { "$type": "HashCrypt", "Title": "母撮 ~堕ちていく母の映像記録~" diff --git a/src/scripts/kirikiri/archive/xp3/crypt/chain_reaction.rs b/src/scripts/kirikiri/archive/xp3/crypt/chain_reaction.rs index 9aec3ce..73e687d 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt/chain_reaction.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt/chain_reaction.rs @@ -217,6 +217,10 @@ impl ChainReactionCrypt { inner: Box::new(ChainReactionCryptBase::new("plugin/list.bin".into())), } } + + fn new_inner(base: BaseSchema, inner: Box) -> Self { + Self { base, inner } + } } impl AsRef for ChainReactionCrypt { @@ -279,3 +283,35 @@ impl Read for ChainReactionCryptReader { Ok(readed) } } + +#[derive(Debug)] +pub struct HachukanoCrypt { + base: ChainReactionCryptBase, +} + +impl HachukanoCrypt { + pub fn new(base: BaseSchema) -> ChainReactionCrypt { + ChainReactionCrypt::new_inner( + base, + Box::new(Self { + base: ChainReactionCryptBase::new("plugins/list.txt".into()), + }), + ) + } +} + +impl IChainReactionCrypt for HachukanoCrypt { + fn get_encryption_limit(&self, entry: &Xp3Entry) -> u32 { + let limit = self.base.get_encryption_limit(entry); + match limit { + 0 => 0, + 1 => 0x100, + 2 => 0x200, + 3 => entry.original_size as u32, + _ => limit, + } + } + fn init(&self, archive: &mut Xp3Archive) -> Result<()> { + self.base.init(archive) + } +} diff --git a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs index 4e5dfe6..1ebd8d7 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs @@ -267,6 +267,7 @@ enum CryptType { layer_name_suffix: String, }, ChainReactionCrypt, + HachukanoCrypt, } #[derive(Clone, Debug, Deserialize)] @@ -432,6 +433,9 @@ impl Schema { CryptType::ChainReactionCrypt => { Box::new(chain_reaction::ChainReactionCrypt::new(self.base.clone())) } + CryptType::HachukanoCrypt => { + Box::new(chain_reaction::HachukanoCrypt::new(self.base.clone())) + } }) } }