SHARE
TWEET

CM3D2.YASDPlus.Plugin

a guest Feb 10th, 2017 10,462 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * CM3D2.YASD.Plugin (Yet Another Soft Demosaic Plugin)+CBL Patch
  3.  *
  4.  * 改造者注:元の作者さんが長らくメンテされてないようなので、自力でChu-B Lip対応と新ダンス・撮影モード
  5.  * 等への対応を行いました。しばりすのGameDataにテクスチャを置けばテクスチャ変更機能は要らなくなった
  6.  * 思われるので外しました。
  7.  * Chu-B Lip のシーン番号は通常版とは異なります。どうやら飛んでいる番号はレベルとしては存在するものの
  8.  * 未使用のようです。
  9.  *
  10.  * 2.0.0.6 シーン番号を整理 テクスチャ変更機能を削除してスリム化 ディルドーの藻消しに対応
  11.  * 2.0.0.5b ダンス対応版:2017/01/16 時点での未対応のダンスへ対応。01/28 act3、通常版のみ対応
  12.  * 2.0.0.5 凡ミス。おもちゃ系藻がChu-B Lip版で外れていなかったバグを修正
  13.  * 2.0.0.4 Ver.1.30用VRパッチからUnityバージョンがv5.3.4p4 になったため非推奨となった処理を置き換え
  14.  * 2.0.0.3 複数メイド撮影プラグインの昼/夜メニューからの起動に対応
  15.  * 2.0.0.2 ダンス5のシーン番号を追加 誤記の修正
  16.  * 2.0.0.1 ダンス3、4、デスクトップカスタム、回想、メイドバトル、撮影モードのシーン番号を追加 Chu-B Lip対応を追加
  17.  *
  18.  *
  19.  *
  20.  *
  21.  * モザイクのON/OFFを切り替えたりボディのテクスチャを変更できるUnityInjectorのプラグインです。
  22.  *
  23.  * モザイクはF4でメイド|メイドとおもちゃ|全部|消さないを切り替えます。
  24.  * iniファイルを書き換えるとキーや切り替えの有効無効、モザイクを消す対象を変更できます。
  25.  * 切り替えを無効にしてもiniで指定されたモザイクは消えます。
  26.  * 切り替え機能がいらなければOFFにすると無駄な処理が減る分ちょっとだけ軽くなるかも。
  27.  *
  28.  * テクスチャ変更はメイドのボディ限定でTranslation Loaderと同じような処理をします。
  29.  * Translation Loaderと違いReiPatcherでパッチを当てる必要がないのが強みです。
  30.  * メイドのボディ以外のテクスチャも変更したい場合は素直にTranslation Loaderを使ってください。
  31.  * プラグインを導入して一度ゲームを起動するとUnityInjector\Configに
  32.  * YASD.iniファイルとYASDフォルダが作成されるのでYASDフォルダの中にテクスチャファイルを
  33.  * コピーしてください。
  34.  * テクスチャはpng形式のみに対応しています。
  35.  * メイドが表示されているときにF3を押すとメイドに反映されます。
  36.  * F3を押さずに自動で変更することもできますがデフォルトで無効になっています。
  37.  * 自動で変更する場合はiniファイルの[ChangeTexture]セクションの[AutoChange]を
  38.  * Trueに書き換えてください。
  39.  *
  40.  * 自動変更モードの仕様
  41.  * テクスチャはゲーム起動時にリストが作成されてその中の物のみが反映されます。
  42.  * テクスチャ変更時に何らかの理由で読み込みに失敗したファイルはリストから消去されます。
  43.  * また、一度変更したテクスチャはファイルを入れ替えても即時反映されません。
  44.  * ゲーム内のエディットで肌を変更後元の肌戻すと最新のファイルを読み込みます。
  45.  * また、自動変更中にF3を押すとリストを更新し最新のファイルを強制的に適用します。
  46.  * 要はゲーム中にテクスチャを入れ替えたらF3を押してください。
  47.  *
  48.  *
  49.  * yasd.iniの内容
  50.  * [DeMosaic]セクション
  51.  * ChangeMode={True, False}
  52.  *      キーボードでの切り替えの有効無効を設定します。
  53.  *      True=有効 False=無効
  54.  *
  55.  * Target={None, Maid, MaidAndItem, All}
  56.  *     モザイクを消す対象を指定。
  57.  *     キーボード切り替えが有効な場合は押す度に切り替わります。
  58.  *     無効の場合はiniで指定した値で固定されます。
  59.  *          None=消さない
  60.  *          Maid=女性のみ
  61.  *          MaidAndItem=女性とおもちゃ
  62.  *          All=全て(女性、おもちゃ、男性)
  63.  *
  64.  * HotKey
  65.  *      モザイクモード切替キーの設定。デフォルトはF4。
  66.  *      指定するコードは下記URL参照。
  67.  *      http://docs.unity3d.com/jp/current/ScriptReference/KeyCode.html
  68.  *
  69.  *
  70.  * [ChangeTexture]セクション
  71.  * AutoChange={True, False}
  72.  *      テクスチャ自動変更機能の有効無効を設定します。
  73.  *      True=有効 False=無効
  74.  *
  75.  * HotKey
  76.  *      テクスチャリスト再読み込みキーの設定。デフォルトはF3
  77.  *      自動更新が無効の場合はテクスチャリスト読み込みとテクスチャの変更を行います。
  78.  *      指定するコードはDeMosaicセクションのURL参照。
  79.  *
  80.  *
  81.  * コンパイル時の参照設定
  82.  * /r:UnityEngine.dll /r:UnityInjector.dll /r:Assembly-CSharp.dll /r:Assembly-CSharp-firstpass.dll /r:ExINI.dll
  83.  *
  84. */
  85.  
  86. using ExIni;
  87. using System;
  88. using System.Collections;
  89. using System.Collections.Generic;
  90. using System.Diagnostics;
  91. using System.IO;
  92. using System.Linq;
  93. using System.Text.RegularExpressions;
  94. using UnityEngine;
  95. using UnityInjector;
  96. using UnityInjector.Attributes;
  97. using System.Reflection;
  98.  
  99. namespace CM3D2.YetAnotherSoftDemosaic.Plugin
  100. {
  101.     static internal class LINQExt {
  102.         public static void ForEach<T>(this IEnumerable<T> self , Action<T> act) {
  103.             foreach(var cur in self) act(cur);
  104.         }
  105.     }
  106.  
  107.     public static class UnityExtensionsBridge {
  108.         static UnityExtensionsBridge() {
  109.             klass = Type.GetType("UnityInjector.Extensions,UnityInjector");
  110.         }
  111.         static Type klass = null;
  112.  
  113.         public static string UserDataPath {
  114.             get {
  115.                 return (string)klass.GetMethod("get_UserDataPath").Invoke(null,null);
  116.             }
  117.         }
  118.     }
  119.  
  120.     [PluginFilter("CM3D2x64"),
  121.     PluginFilter("CM3D2x86"),
  122.     PluginFilter("CM3D2VRx64"),
  123.     PluginFilter("CM3D2OHx64"),
  124.     PluginFilter("CM3D2OHx86"),
  125.     PluginFilter("CM3D2OHVRx64"),
  126.     PluginName("Yet Another Soft DeMosaic+CBL Patch"),
  127.     PluginVersion("2.0.0.6")]
  128.     public class YASD : PluginBase
  129.     {
  130.         private Coroutine deMosaicCoroutine;
  131.         private bool runningCoroutine = false;
  132.  
  133.         private bool allowChangeMosaic = true;
  134.         private KeyCode deMosaicHotKey = KeyCode.F4;
  135.  
  136.         private bool isChubLip = false;
  137.  
  138.         //1fで1秒
  139.         private const float WAIT_SECOND_DEMOSAIC = 0.5f;
  140.  
  141.         /// <summary>
  142.         /// CM3D2のシーンリスト
  143.         /// </summary>
  144.         private enum Scene
  145.         {
  146.             /// <summary>メイド選択(夜伽、品評会の前など)</summary>
  147.             SceneCharacterSelect = 1,
  148.  
  149.             /// <summary>品評会</summary>
  150.             SceneCompetitiveShow = 2,
  151.  
  152.             /// <summary>昼夜メニュー、仕事結果</summary>
  153.             SceneDaily = 3,
  154.  
  155.             /// <summary>ダンス1</summary>
  156.             SceneDance_DDFL = 4,
  157.  
  158.             /// <summary>メイドエディット</summary>
  159.             SceneEdit = 5,
  160.  
  161.             /// <summary>メーカーロゴ</summary>
  162.             SceneLogo = 6,
  163.  
  164.             /// <summary>メイド管理</summary>
  165.             SceneMaidManagement = 7,
  166.  
  167.             /// <summary>ショップ</summary>
  168.             SceneShop = 8,
  169.  
  170.             /// <summary>タイトル画面</summary>
  171.             SceneTitle = 9,
  172.  
  173.             /// <summary>トロフィー閲覧</summary>
  174.             SceneTrophy = 10,
  175.  
  176.             /// <summary>???</summary>
  177.             SceneTryInfo = 11,
  178.  
  179.             /// <summary>主人公エディット</summary>
  180.             SceneUserEdit = 12,
  181.  
  182.             /// <summary>起動時警告画面</summary>
  183.             SceneWarning = 13,
  184.  
  185.             /// <summary>夜伽</summary>
  186.             SceneYotogi = 14,
  187.  
  188.             /// <summary>ADVパート(kgスクリプト処理)</summary>
  189.             SceneADV = 15,
  190.  
  191.             /// <summary>日付画面</summary>
  192.             SceneStartDaily = 16,
  193.  
  194.             /// <summary>タイトルに戻る</summary>
  195.             SceneToTitle = 17,
  196.  
  197.             /// <summary>MVP</summary>
  198.             SceneSingleEffect = 18,
  199.  
  200.             /// <summary>スタッフロール</summary>
  201.             SceneStaffRoll = 19,
  202.  
  203.             /// <summary>ダンス2</summary>
  204.             SceneDance_ETYL = 20,
  205.  
  206.             /// <summary>ダンス選択</summary>
  207.             SceneDance_Selector = 21,
  208.  
  209.             /// <summary>ダンス_3</summary>
  210.             SceneDance_SL = 22,
  211.  
  212.             /// <summary>デスクトップカスタム</summary>
  213.             SceneEditDesk = 23,
  214.  
  215.             /// <summary>回想</summary>
  216.             SceneRecollection = 24,
  217.  
  218.             /// <summary>メイドバトル</summary>
  219.             SceneMaidBattle = 25,
  220.  
  221.             /// <summary>ダンス_4</summary>
  222.             SceneDance_SMT = 26,
  223.  
  224.             /// <summary>撮影モード</summary>
  225.             ScenePoser = 27,
  226.  
  227.             /// <summary>ダンス5</summary>
  228.             SceneDance_RTY_Release = 28,
  229.  
  230.             /// <summary>エンパイアリーグ</summary>
  231.             SceneEmpireLeague = 29,
  232.  
  233.             /// <summary>ダンス6</summary>
  234.             SceneDance_HHS_Release = 30,
  235.  
  236.             /// <summary>ダンス7</summary>
  237.             SceneDance_HHSx4_Release = 31,
  238.  
  239.             /// <summary>ダンス8</summary>
  240.             SceneDance_KNT_Release = 32,
  241.  
  242.             /// <summary>ダンス9</summary>
  243.             SceneDance_SSE_Release = 34,
  244.            
  245.             /// <summary>ダンス10</summary>
  246.             SceneDance_SSEx3_Release = 35
  247.         }
  248.  
  249.         /// <summary>
  250.         /// CM3D2CBLのシーンリスト
  251.         /// </summary>
  252.         private enum SceneCBL
  253.         {
  254.             /// <summary>CBL:メイド選択(未使用?)</summary>
  255.             SceneCharacterSelect = 1,
  256.  
  257.             /// <summary>CBL:メニュー画面</summary>
  258.             SceneMainMenuWithChubLip = 2,
  259.  
  260.             /// <summary>CBL:ダンス1</summary>
  261.             SceneDance_DDFL_Release = 3,
  262.  
  263.             /// <summary>CBL:メイドエディット</summary>
  264.             SceneEdit = 4,
  265.  
  266.             /// <summary>CBL:メーカーロゴ(未使用?)</summary>
  267.             SceneLogo = 5,
  268.  
  269.             /// <summary>CBL:タイトル画面</summary>
  270.             SceneTitle = 6,
  271.  
  272.             /// <summary>CBL:???(未使用?)</summary>
  273.             SceneTryInfo = 7,
  274.  
  275.             /// <summary>CBL:主人公エディット</summary>
  276.             SceneUserEdit = 8,
  277.  
  278.             /// <summary>CBL:起動時警告画面</summary>
  279.             SceneWarning = 9,
  280.  
  281.             /// <summary>CBL:夜伽</summary>
  282.             SceneYotogiWithChubLip = 10,
  283.  
  284.             /// <summary>CBL:ADVパート(kgスクリプト処理)</summary>
  285.             SceneADV = 11,
  286.  
  287.             /// <summary>CBL:日付画面</summary>
  288.             SceneStartDaily = 12,
  289.  
  290.             /// <summary>CBL:タイトルに戻る</summary>
  291.             SceneToTitle = 13,
  292.  
  293.             /// <summary>CBL:MVP?(未使用?)</summary>
  294.             SceneSingleEffect = 14,
  295.  
  296.             /// <summary>CBL:スタッフロール?(未使用?)</summary>
  297.             SceneStaffRoll = 15,
  298.  
  299.             /// <summary>CBL:ダンス2</summary>
  300.             SceneDance_ETYL_Release = 16,
  301.  
  302.             /// <summary>CBL:ダンス選択</summary>
  303.             SceneDanceSelect = 17,
  304.  
  305.            /// <summary>CBL:ダンス3</summary>
  306.             SceneDance_SCL_Release = 18,
  307.  
  308.             /// <summary>CBL:デスクトップカスタム</summary>
  309.             SceneDeskCustomize = 19,
  310.  
  311.             /// <summary>CBL:ダンス4</summary>
  312.             SceneDance_SMT_Release = 20,
  313.  
  314.             /// <summary>CBL:撮影モード</summary>
  315.             ScenePhotoMode = 21,
  316.  
  317.             /// <summary>CBL:ダンス5</summary>
  318.             SceneDance_RTY_Release = 22,
  319.  
  320.             /// <summary>CBL:ダンス6</summary>
  321.             SceneDance_HHS_Release = 23,
  322.  
  323.             /// <summary>CBL:ダンス7</summary>
  324.             SceneDance_HHSx4_Release = 24,
  325.  
  326.             /// <summary>CBL:ダンス8</summary>
  327.             SceneDance_KNT_Release = 25,
  328.  
  329.             /// <summary>CBL:ダンス9</summary>
  330.             SceneDance_SSE_Release = 26,
  331.  
  332.             /// <summary>CBL:ダンス10</summary>
  333.             SceneDance_SSEx3_Release = 27
  334.         }
  335.  
  336.         /// <summary>
  337.         /// 3Dキャラが描画されるレベル
  338.         /// </summary>
  339.         private enum EnableLevel
  340.         {
  341.             /// <summary>品評会</summary>
  342.             SceneCompetitiveShow = 2,
  343.  
  344.             /// <summary>ダンス1</summary>
  345.             SceneDance_DDFL = 4,
  346.  
  347.             /// <summary>メイドエディット</summary>
  348.             SceneEdit = 5,
  349.  
  350.             /// <summary>ショップ</summary>
  351.             SceneShop = 8,
  352.  
  353.             /// <summary>夜伽</summary>
  354.             SceneYotogi = 14,
  355.  
  356.             /// <summary>ADVパート(kgスクリプト処理)</summary>
  357.             SceneADV = 15,
  358.  
  359.             /// <summary>MVP</summary>
  360.             SceneSingleEffect = 18,
  361.  
  362.             /// <summary>ダンス2</summary>
  363.             SceneDance_ETYL = 20,
  364.  
  365.             /// <summary>ダンス_3</summary>
  366.             SceneDance_SL = 22,
  367.  
  368.             /// <summary>回想</summary>
  369.             SceneRecollection = 24,
  370.  
  371.             /// <summary>メイドバトル</summary>
  372.             SceneMaidBattle = 25,
  373.  
  374.             /// <summary>ダンス_4</summary>
  375.             SceneDance_SMT = 26,
  376.  
  377.             /// <summary>撮影モード</summary>
  378.             ScenePoser = 27,
  379.  
  380.             /// <summary>ダンス5</summary>
  381.             SceneDance_RTY_Release = 28,
  382.  
  383.             /// <summary>エンパイアリーグ</summary>
  384.             SceneEmpireLeague = 29,
  385.  
  386.             /// <summary>ダンス6</summary>
  387.             SceneDance_HHS_Release = 30,
  388.  
  389.             /// <summary>ダンス7</summary>
  390.             SceneDance_HHSx4_Release = 31,
  391.  
  392.             /// <summary>ダンス8</summary>
  393.             SceneDance_KNT_Release = 32,
  394.  
  395.             /// <summary>ダンス9</summary>
  396.             SceneDance_SSE_Release = 34,
  397.            
  398.             /// <summary>ダンス10</summary>
  399.             SceneDance_SSEx3_Release = 35
  400.         }
  401.  
  402.         /// <summary>
  403.         /// 3Dキャラが描画されるレベル Chu-B Lip
  404.         /// </summary>
  405.         private enum EnableLevelCBL
  406.         {
  407.             /// <summary>CBL:メニュー画面</summary>
  408.             SceneMainMenuWithChubLip = 2,
  409.  
  410.             /// <summary>CBL:ダンス1</summary>
  411.             SceneDance_DDFL_Release = 3,
  412.  
  413.             /// <summary>CBL:メイドエディット</summary>
  414.             SceneEdit = 4,
  415.  
  416.             /// <summary>CBL:主人公エディット</summary>
  417.             SceneUserEdit = 8,
  418.  
  419.             /// <summary>CBL:夜伽/チュートリアル感度調整モード</summary>
  420.             SceneYotogiWithChubLip = 10,
  421.  
  422.             /// <summary>CBL:ADVパート(kgスクリプト処理)</summary>
  423.             SceneADV = 11,
  424.  
  425.             /// <summary>CBL:ダンス2</summary>
  426.             SceneDance_ETYL_Release = 16,
  427.  
  428.            /// <summary>CBL:ダンス3</summary>
  429.             SceneDance_SCL_Release = 18,
  430.  
  431.             /// <summary>CBL:ダンス4</summary>
  432.             SceneDance_SMT_Release = 20,
  433.  
  434.             /// <summary>CBL:撮影モード</summary>
  435.             ScenePhotoMode = 21,
  436.  
  437.             /// <summary>CBL:ダンス5</summary>
  438.             SceneDance_RTY_Release = 22,
  439.  
  440.             /// <summary>CBL:ダンス6</summary>
  441.             SceneDance_HHS_Release = 23,
  442.  
  443.             /// <summary>CBL:ダンス7</summary>
  444.             SceneDance_HHSx4_Release = 24,
  445.  
  446.             /// <summary>CBL:ダンス8</summary>
  447.             SceneDance_KNT_Release = 25,
  448.  
  449.             /// <summary>CBL:ダンス9</summary>
  450.             SceneDance_SSE_Release = 26,
  451.  
  452.             /// <summary>CBL:ダンス10</summary>
  453.             SceneDance_SSEx3_Release = 27
  454.         }
  455.  
  456.         /// <summary>
  457.         /// 男キャラやおもちゃが出現するレベル
  458.         /// </summary>
  459.         private enum ShowMenOrToysLevel
  460.         {
  461.             /// <summary>夜伽</summary>
  462.             SceneYotogi = 14,
  463.  
  464.             /// <summary>ADVパート(kgスクリプト処理)</summary>
  465.             SceneADV = 15,
  466.  
  467.             /// <summary>撮影モード</summary>
  468.             ScenePoser = 27
  469.         }
  470.  
  471.         /// <summary>
  472.         /// 男キャラやおもちゃが出現するレベル Chu-B Lip
  473.         /// </summary>
  474.         private enum ShowMenOrToysLevelCBL
  475.         {
  476.             /// <summary>CBL:夜伽/チュートリアル感度調整モード</summary>
  477.             SceneYotogiWithChubLip = 10,
  478.  
  479.             /// <summary>CBL:ADVパート(kgスクリプト処理)</summary>
  480.             SceneADV = 11,
  481.  
  482.             /// <summary>CBL:撮影モード</summary>
  483.             ScenePhotoMode = 21
  484.         }
  485.  
  486.         /// <summary>
  487.         /// メイドが出現するがキャラ変更や着替えを行わないレベル
  488.         /// </summary>
  489.         private enum NotChangeMaidsLevel
  490.         {
  491.             /// <summary>品評会</summary>
  492.             SceneCompetitiveShow = 2,
  493.  
  494.             /// <summary>ダンス1</summary>
  495.             SceneDance_DDFL = 4,
  496.  
  497.             /// <summary>MVP</summary>
  498.             SceneSingleEffect = 18,
  499.  
  500.             /// <summary>ダンス2</summary>
  501.             SceneDance_ETYL = 20,
  502.  
  503.             /// <summary>ダンス3</summary>
  504.             SceneDance_SL = 22,
  505.  
  506.             /// <summary>ダンス4</summary>
  507.             SceneDance_SMT = 26,
  508.  
  509.             /// <summary>ダンス5</summary>
  510.             SceneDance_RTY_Release = 28,
  511.  
  512.             /// <summary>エンパイアリーグ</summary>
  513.             SceneEmpireLeague = 29,
  514.  
  515.             /// <summary>ダンス6</summary>
  516.             SceneDance_HHS_Release = 30,
  517.  
  518.             /// <summary>ダンス7</summary>
  519.             SceneDance_HHSx4_Release = 31,
  520.  
  521.             /// <summary>ダンス8</summary>
  522.             SceneDance_KNT_Release = 32,
  523.  
  524.             /// <summary>ダンス9</summary>
  525.             SceneDance_SSE_Release = 34,
  526.            
  527.             /// <summary>ダンス10</summary>
  528.             SceneDance_SSEx3_Release = 35
  529.         }
  530.  
  531.         /// <summary>
  532.         /// メイドが出現するがキャラ変更や着替えを行わないレベル Chu-B Lip
  533.         /// </summary>
  534.         private enum NotChangeMaidsLevelCBL
  535.         {
  536.             /// <summary>CBL:ダンス1</summary>
  537.             SceneDance_DDFL_Release = 3,
  538.  
  539.             /// <summary>CBL:ダンス2</summary>
  540.             SceneDance_ETYL_Release = 16,
  541.  
  542.             /// <summary>CBL:ダンス3</summary>
  543.             SceneDance_SCL_Release = 18,
  544.  
  545.             /// <summary>CBL:ダンス4</summary>
  546.             SceneDance_SMT_Release = 20,
  547.  
  548.             /// <summary>CBL:ダンス5</summary>
  549.             SceneDance_RTY_Release = 22,
  550.  
  551.             /// <summary>CBL:ダンス6</summary>
  552.             SceneDance_HHS_Release = 23,
  553.  
  554.             /// <summary>CBL:ダンス7</summary>
  555.             SceneDance_HHSx4_Release = 24,
  556.  
  557.             /// <summary>CBL:ダンス8</summary>
  558.             SceneDance_KNT_Release = 25,
  559.  
  560.             /// <summary>CBL:ダンス9</summary>
  561.             SceneDance_SSE_Release = 26,
  562.  
  563.             /// <summary>CBL:ダンス10</summary>
  564.             SceneDance_SSEx3_Release = 27
  565.         }
  566.  
  567.         private DeMosaic deMosaic = new DeMosaic();
  568.  
  569.         private void LoadConfig()
  570.         {
  571.             IniKey changeMosaic = Preferences["DeMosaic"]["ChangeMode"];
  572.             IniKey target = Preferences["DeMosaic"]["Target"];
  573.             IniKey changeMosaicKey = Preferences["DeMosaic"]["HotKey"];
  574.  
  575.             string dataPath = Application.dataPath;
  576.             isChubLip = dataPath.Contains("CM3D2OH");
  577.  
  578.             if (changeMosaic == null || string.IsNullOrEmpty(changeMosaic.Value))
  579.             {
  580.                 changeMosaic.Value = allowChangeMosaic.ToString();
  581.                 SaveConfig();
  582.             }
  583.             else
  584.             {
  585.                 if (!bool.TryParse(changeMosaic.Value, out allowChangeMosaic))
  586.                 {
  587.                     changeMosaic.Value = allowChangeMosaic.ToString();
  588.                     SaveConfig();
  589.                 }
  590.             }
  591.  
  592.             if (target == null || string.IsNullOrEmpty(target.Value))
  593.             {
  594.                 target.Value = deMosaic.Target.ToString();
  595.                 SaveConfig();
  596.             }
  597.             else
  598.             {
  599.                 if (Enum.IsDefined(typeof(DeMosaic.Switch), target.Value))
  600.                 {
  601.                     deMosaic.Target = (DeMosaic.Switch)Enum.Parse(typeof(DeMosaic.Switch), target.Value, true);
  602.                 }
  603.                 else
  604.                 {
  605.                     target.Value = deMosaic.Target.ToString();
  606.                     SaveConfig();
  607.                 }
  608.             }
  609.  
  610.             if (changeMosaicKey == null || string.IsNullOrEmpty(changeMosaicKey.Value))
  611.             {
  612.                 changeMosaicKey.Value = deMosaicHotKey.ToString();
  613.                 SaveConfig();
  614.             }
  615.             else
  616.             {
  617.                 if (Enum.IsDefined(typeof(KeyCode), changeMosaicKey.Value))
  618.                 {
  619.                     deMosaicHotKey = (KeyCode)Enum.Parse(typeof(KeyCode), changeMosaicKey.Value, true);
  620.                 }
  621.                 else
  622.                 {
  623.                     changeMosaicKey.Value = deMosaicHotKey.ToString();
  624.                     SaveConfig();
  625.                 }
  626.             }
  627.         }
  628.  
  629.         private void Awake()
  630.         {
  631.             GameObject.DontDestroyOnLoad(this);
  632.             System.Diagnostics.Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
  633.  
  634.             LoadConfig();
  635.  
  636.             StartCoroutine(GetKeyInput());
  637.         }
  638.  
  639.         private void OnLevelWasLoaded(int level)
  640.         {
  641.             if (runningCoroutine)
  642.             {
  643.                 System.Diagnostics.Debug.WriteLine("Demosaic Coroutine stop.");
  644.                 StopCoroutine(deMosaicCoroutine);
  645.                 runningCoroutine = false;
  646.             }
  647.            
  648.             if ((isChubLip && Enum.IsDefined(typeof(EnableLevelCBL), level)) || (!isChubLip && Enum.IsDefined(typeof(EnableLevel), level)))
  649.             {
  650.                 System.Diagnostics.Debug.WriteLine("Demosaic Coroutine start.");
  651.                 deMosaicCoroutine = StartCoroutine(DeMosaicCoroutine(level));
  652.                 runningCoroutine = true;
  653.             }
  654.         }
  655.  
  656.         private IEnumerator GetKeyInput()
  657.         {
  658.             while (true)
  659.             {
  660.                 if (Input.GetKeyDown(deMosaicHotKey) && allowChangeMosaic)
  661.                 {
  662.                     deMosaic.Target++;
  663.                     Console.WriteLine("YADSM Target:{0}", deMosaic.Target.ToString());
  664.                 }
  665.                 yield return null;
  666.             }
  667.         }
  668.  
  669.         private IEnumerator DeMosaicCoroutine(int level)
  670.         {
  671.             while (true)
  672.             {
  673.                 bool result = deMosaic.DeMosaicMaids();
  674.  
  675.                 if (result && !allowChangeMosaic && Enum.IsDefined(typeof(NotChangeMaidsLevel), level))
  676.                 {
  677.                     System.Diagnostics.Debug.WriteLine("DeMosaic Coroutine Break.");
  678.                     runningCoroutine = false;
  679.                     yield break;
  680.                 }
  681.                 yield return null;
  682.  
  683.                 if ((isChubLip && Enum.IsDefined(typeof(ShowMenOrToysLevelCBL), level)) || (!isChubLip && Enum.IsDefined(typeof(ShowMenOrToysLevel), level)))
  684.                 {
  685.                     deMosaic.DeMosaicToys();
  686.                     yield return null;
  687.  
  688.                     deMosaic.DeMosaicMen();
  689.                 }
  690.                 //System.Diagnostics.Debug.WriteLine("DeMosaic Coroutine Continue.");
  691.                 yield return new WaitForSeconds(WAIT_SECOND_DEMOSAIC);
  692.             }
  693.         }
  694.  
  695.         public void OnApplicationQuit()
  696.         {
  697.             Preferences["DeMosaic"]["Target"].Value = deMosaic.Target.ToString();
  698.             SaveConfig();
  699.         }
  700.     }
  701.  
  702.     public class DeMosaic
  703.     {
  704.         public enum Switch
  705.         {
  706.             None,
  707.             Maid,
  708.             MaidAndItem,
  709.             All,
  710.             Max
  711.         }
  712.  
  713.         private Switch _target = Switch.All;
  714.  
  715.         public Switch Target
  716.         {
  717.             get { return _target; }
  718.             set { _target = value == Switch.Max ? Switch.None : value; }
  719.         }
  720.  
  721.         private Shader shaderTransparent;
  722.         private Shader shaderMosaic;
  723.  
  724.         private bool isChubLip = false;
  725.  
  726.         public DeMosaic() {
  727.             shaderTransparent = Shader.Find("CM3D2/Toony_Lighted_Trans");
  728.             shaderMosaic = Shader.Find("CM3D2/Mosaic");
  729.         }
  730.  
  731.         private string getHiraerchy(Transform t)
  732.         {
  733.             string hiraerchy = "/" + t.name;
  734.             while (t.parent)
  735.             {
  736.                 t = t.parent;
  737.                 hiraerchy = "/" + t.name + hiraerchy;
  738.             }
  739.  
  740.             return hiraerchy;
  741.         }
  742.  
  743.         private Renderer[] GetMosaicRenderer(string type)
  744.         {
  745.             GameObject alloffset = GameObject.Find("__GameMain__/Character/Active/AllOffset");
  746.             if (!alloffset)
  747.             {
  748.                 return null;
  749.             }
  750.             Renderer[] mosaic = alloffset.GetComponentsInChildren<Renderer>(true)
  751.                 .Where(_ => _.materials.Any(m => m.name.Contains("moza")))
  752.                 .ToArray();
  753.  
  754.             string s;
  755.  
  756.             if (type.Equals("toy"))
  757.             {
  758.                 return mosaic
  759.                     .Where(_ => _.materials.Any(m => m.name != "moza"))
  760.                     .ToArray();
  761.             }
  762.             else if (type.Equals("man"))
  763.             {
  764.                 s = "Man[";
  765.             }
  766.             else if (type.Equals("maid"))
  767.             {
  768.                 s = "Maid[";
  769.             }
  770.             else
  771.             {
  772.                 Console.WriteLine("YASD.GetMosaicRenderer: Argument error.");
  773.                 return null;
  774.             }
  775.  
  776.             return mosaic
  777.                 .Where(_ => _.name.Equals("moza"))
  778.                 .Where(_ => getHiraerchy(_.transform).Contains(s))
  779.                 .ToArray();
  780.         }
  781.  
  782.         private Renderer[] GetMaidsMosaicRenderer()
  783.         {
  784.             return GetMosaicRenderer("maid");
  785.         }
  786.  
  787.         private Renderer[] GetMenMosaicRenderer()
  788.         {
  789.             return GetMosaicRenderer("man");
  790.         }
  791.  
  792.         private Renderer[] GetToysMosaicRenderer()
  793.         {
  794.             return GetMosaicRenderer("toy");
  795.         }
  796.  
  797.         public bool DeMosaicMaids()
  798.         {
  799.             bool result = false;
  800.             Renderer[] maidsMosaicList = GetMaidsMosaicRenderer();
  801.  
  802.             if (maidsMosaicList != null)
  803.             {
  804.                 result = HumanMosaicSwitcher(maidsMosaicList, (Target == DeMosaic.Switch.None));
  805.             }
  806.             return result;
  807.         }
  808.  
  809.         public void DeMosaicMen()
  810.         {
  811.             Renderer[] menMosaicList = GetMenMosaicRenderer();
  812.  
  813.             if (menMosaicList != null)
  814.             {
  815.                 HumanMosaicSwitcher(menMosaicList, (Target != DeMosaic.Switch.All));
  816.             }
  817.         }
  818.  
  819.         private bool HumanMosaicSwitcher(Renderer[] mosaic, bool enableMosaic)
  820.         {
  821.             bool result = false;
  822.             if (mosaic == null)
  823.             {
  824.                 return result;
  825.             }
  826.             mosaic.Where(_ => _.enabled == !enableMosaic).ForEach(_ =>
  827.             {
  828.                 _.enabled = enableMosaic;
  829.                 System.Diagnostics.Debug.WriteLine(string.Format("{0}'s Mosaic Enable:{1}", _.name, enableMosaic));
  830.                 result = true;
  831.             });
  832.  
  833.             return result;
  834.         }
  835.  
  836.         public void DeMosaicToys()
  837.         {
  838.             Renderer[] rs = GetToysMosaicRenderer();
  839.             if (rs != null)
  840.             {
  841.                 foreach (Renderer r in rs)
  842.                 {
  843.                     ToyMaterialChanger(r);
  844.                 }
  845.             }
  846.  
  847.             //GameObject boxdildo = UTY.GetChildObject(GameMain.Instance.BgMgr.current_bg_object, "ディルド&台", true);
  848.             //if (boxdildo == null)
  849.             //    return;
  850.             try
  851.             {
  852.                 Renderer[] mosaic = GameMain.Instance.BgMgr.current_bg_object.GetComponentsInChildren<Renderer>(true)
  853.                    .Where(_ => _.materials.Any(m => m.name.Contains("moza")))
  854.                    .ToArray();
  855.            
  856.             if (mosaic != null)
  857.             {
  858.                 foreach (Renderer r in mosaic)
  859.                 {
  860.                     ToyMaterialChanger(r);
  861.                 }
  862.             }
  863.             }
  864.             catch { /*LogError(ex);*/ }
  865.         }
  866.  
  867.         private void ToyMaterialChanger(Renderer mosaic)
  868.         {
  869.             if (mosaic.materials.Length == 1)
  870.             {
  871.                 return;
  872.             }
  873.             bool mosaicDisable = Target >= DeMosaic.Switch.MaidAndItem;
  874.             mosaic.materials
  875.                 .Where(_ => mosaicDisable ? _.shader.Equals(shaderMosaic) : _.shader.Equals(shaderTransparent))
  876.                 .ForEach(_ =>
  877.                 {
  878.                     _.shader = mosaicDisable ? shaderTransparent : shaderMosaic;
  879.                     _.color += mosaicDisable ? new Color(0f, 0f, 0f, -1f) : new Color(0f, 0f, 0f, 1f);
  880.                 });
  881.         }
  882.     }
  883. }
RAW Paste Data
Pastebin PRO Summer Special!
Get 40% OFF on Pastebin PRO accounts!
Top