daily pastebin goal
66%
SHARE
TWEET

cm3d2.yasdplus.plugin

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