/* ---------------------------------------------------------------------------* * 2022/1/07 kido0617 * 制限:このプラグインの使用は許諾された個人・サークルに限ります。 * http://kido0617.github.io/ *--------------------------------------------------------------------------- */ // eslint-disable-next-line spaced-comment /*: * @plugindesc 立ち絵表示管理プラグイン拡張 * @target MZ * @author kido * @help * * */ (() => { window.getCharacterPictureFileName = (actor, param) => { let actorId = actor._actorId; let str = 'Actor'; //ファイル名。以下で連結していく str += ('0' + actorId).slice(-2); // ゼロ埋め str += '_Pose'; let poseNo = $gameVariables.value(1005) //ここでポーズ番号を取得する if (actorId == 1) { if (poseNo == 0) { poseNo = 5 } } else { poseNo = 1 } str += ('0' + poseNo).slice(-2); if (actorId != 1) return str; //エニシア以外はポーズで終わり? str += '_' + param.Type + '_'; // Body とか Socksとか let fileNo = getFileNo(actor, param); if (fileNo === null) return null; //装備していないときとかそのパーツを描画する必要がないとき str += fileNo; return str; }; //ここでファイル番号を取る処理をする。パーツごとにいろいろ違うはず function getFileNo(actor, param) { let fileNo = 1; let actorId = actor._actorId let equips = actor.equips(); let poseNo = $gameVariables.value(1005) var stateIdMin = 191 var stateIdMax = 220 var zurashi = 222 //ここで回想用にequipsを改変 var forceCloth = null var Stripflag1 = null var Stripflag2 = null if ($gameSwitches.value(2006)) {//回想 forceCloth = $gameVariables.value(775) } if (poseNo == 10) {//踊り子衣装 var dancerCloth = $gameVariables.value(550) Stripflag1 = $gameActors.actor(1).isStateAffected(176) ? true : false Stripflag2 = $gameActors.actor(1).isStateAffected(177) ? true : false forceCloth = "dancer" if (dancerCloth == 1) forceCloth = "sisterBunny" if (dancerCloth == 2) forceCloth = "sister" } if (forceCloth) { var forceBody = null; var forceHead = null; var forceLeg = null if (forceCloth == "sister") { forceBody = Stripflag1 && Stripflag2 ? 294 : 5;//踊り子 forceLeg = 22; if (equips[2] && equips[2].id == 27) forceHead = 27; } if (forceCloth == "bath") { forceBody = 7 } if (forceCloth == "eroSister") { forceBody = 6; forceLeg = 22 } if (forceCloth == "swim") { forceBody = 10; forceLeg = 22 } if (forceCloth == "whiteSwim") { forceBody = 16 } if (forceCloth == "naked") { forceLeg = 22 } if (forceCloth == "sisterBunny") { forceBody = Stripflag1 && Stripflag2 ? 295 : 11;//踊り子 forceHead = 28; forceLeg = 24 } if (forceCloth == "prostisute") { forceBody = 13; forceLeg = 24 } if (forceCloth == "maid") { forceBody = 12; forceLeg = 22 } if (forceCloth == "dancer") { forceBody = 15; forceHead = 34; if (Stripflag1 && !Stripflag2) forceBody = 291 if (!Stripflag1 && Stripflag2) forceBody = 292 if (Stripflag1 && Stripflag2) forceBody = 293 } if (forceCloth == "bondage") { forceBody = 18; } equips[1] = forceBody ? $dataArmors[forceBody] : null equips[2] = forceHead ? $dataArmors[forceHead] : null equips[3] = forceLeg ? $dataArmors[forceLeg] : null } if (param.Type == 'Body') { fileNo = equips[3] ? equips[3].meta.leg : '1' if (poseNo == 10 && dancerCloth == 0) fileNo = 3 } else if (param.Type == 'Standback') { return null;//なし } else if (param.Type == 'BodyLower') {//下半身分離型 if (poseNo != 4 && poseNo != 3) return null; //ポーズ4以外 fileNo = equips[3] ? equips[3].meta.leg : '1'//食い込み判定タグ } else if (param.Type == 'Arm') { //現状1のみ if (poseNo == 10) return null; if (poseNo == 3) return null; if (poseNo == 2) { var ArmNo = 1 for (let i = 196; i <= 201; i++) { if ($gameActors.actor(actorId).isStateAffected(i)) { ArmNo = Number($dataStates[i].meta.ArmPosi); break; } } fileNo = ArmNo //console.log(fileNo) } } else if (param.Type == 'Socks') { if (poseNo == 10) return null; if (!equips[3]) return null; //脚パーツを装備していない if (equips[3] && equips[3].meta["invisible"]) return null; //脚パーツを装備していない if (equips[1] && equips[1].meta.SolidLeg && poseNo == 4) {//ポーズ番号は一旦4のみ。全対応させる fileNo = equips[1].meta.SolidLeg//脚パーツ固定タグ } else { fileNo = equips[3].meta.StandNo; //メモ欄にファイル番号を入れている前提 } } else if (param.Type == 'Cloth') { if (poseNo == 5 && $gameActors.actor(actorId).isStateAffected(98)) { fileNo = 15//妊娠 return ('000' + fileNo).slice(-4); } if (!equips[1] || !equips[1].meta.StandNo) return null; //衣装パーツを装備していない fileNo = equips[1].meta.StandNo //メモ欄にファイル番号を入れている前提 } else if (param.Type == 'ClothArm') { if (poseNo == 10) return null; if (!equips[1]) return null; //衣装パーツを装備していない if (equips[1].meta.Arm == '0') return null; //衣装パーツを装備しているが袖なし if (poseNo == 4) { fileNo = Number(equips[1].meta.Arm); //メモ欄にファイル番号を入れている前提 } else if (poseNo == 2) { fileNo = Number(equips[1].meta.Arm); //メモ欄にファイル番号を入れている前提 var baseArmNo = 0; //var i = 198 //if($gameActors.actor(actorId).isStateAffected(i))//おなぬの場合 for (let i = 196; i <= 201; i++) { if ($gameActors.actor(actorId).isStateAffected(i)) { //101~150が表情ステート baseArmNo = Number($dataStates[i].meta.BaseArmNum); break; } } fileNo += baseArmNo } else {//適合ポーズ以外 return null; } } else if (param.Type == 'Under0') {//下着。いずれ別でフラグを用意 if (poseNo == 10) return null;//踊り子専用立ち絵 if (poseNo == 3 && equips[1] && equips[1].meta.pose3Under || poseNo == 4 && equips[1] && equips[1].meta.pose3Under) {//ポーズ3か4 fileNo = !$gameSwitches.value(zurashi) ? equips[1].meta.pose3Under : equips[1].meta.pose3Under2 } else if (equips[1] && equips[1].meta.Under == '1') {//アンダーフラグが1の場合、普通の下着 fileNo = 1 } else if (!equips[1]) {//全裸の場合。とりあえず現状は下着強制装備 return null } else { return null//0の場合下着なし } } else if (param.Type == 'Cloth_n_Back') { if (!equips[2]) return null; //頭パーツを装備していない if (poseNo == 4 || poseNo == 3) return null; //ポーズ4|3の場合一旦なし 空の画像でも用意したほうがいいかも if (equips[2].meta.HeadType == 'Hat') { fileNo = equips[2].meta.StandNo } else { return null; } } else if (param.Type == 'Backhair') {//うしろ髪。頭用装備のメモ欄から判定 fileNo = equips[2] ? equips[2].meta.Backhair : '1'; //メモ欄にファイル番号を入れている前提 } else if (param.Type == 'Fronthair') {//前髪。基本固定だが、ポーズによってはベールなどを装備した時用のものが必要 fileNo = equips[2] ? equips[2].meta.Fronthair : '1'; //メモ欄にファイル番号を入れている前提 } else if (param.Type == 'Headacc') {//頭装備(ヴェールなど) if (equips[2] && equips[2].meta.HeadType == 'Hat') { fileNo = equips[2] ? equips[2].meta.StandNo : '1';//なにもない場合アホ毛 } } else if (param.Type == 'Headacc2') {//頭装備(ヘアピンやリボンなど前髪の干渉のないもの) if (!equips[2]) return null;//特定ポーズか頭パーツを装備していない if (equips[2] && equips[2].meta.HeadType == 'Acc') { fileNo = equips[2].meta.StandNo } else { return null } } else if (param.Type == 'Headacc3') {//頭装備(衣装に付属するもの if (poseNo == 3) return null;//特定ポーズで表示なし if (equips[1] && equips[1].meta.FaceOpt) { fileNo = equips[1].meta.FaceOpt } else { return null } } else if (param.Type == 'earrings') {//頭装備(衣装に付属するもの if (poseNo == 4 || poseNo == 3 || poseNo == 10) return null;//特定ポーズで表示なし if ($gameActors.actor(1).hasArmor($dataArmors[196])) { fileNo = 1 } else { return null } } else if (param.Type == 'Headacc4') {//モモコ 5のみ if (poseNo != 5) return null;//特定ポーズで表示なし// || $gameParty.hasItem($dataItems[810])シナリオではとりあえずいい if ($gameActors.actor(1).hasArmor($dataArmors[37])) { fileNo = 1 } else if ($gameActors.actor(1).hasArmor($dataArmors[38])) { fileNo = 2 } else { return null } } else if (param.Type == 'Face') {//表情。ステートで判定。サブキャラの場合は処理を変えるかも if (poseNo == 3) return null;//バックなので //表情はステートIDが大きい方を優先する //ステートは優先度順に並んでいる。優先度が同じ場合ステートIDの小さい順になるので配列の末尾から表情のステートを探す //各種条件 if (poseNo == 5) { var semen = $gameVariables.value(181) + $gameVariables.value(182) + $gameVariables.value(183) + $gameVariables.value(184) if ($gameMap && $dataMap.meta["defaultFace"]) fileNo = Number($dataMap.meta.defaultFace)//マップごとのデフォルト表情 if ($gameParty.inBattle()) fileNo = 7;//戦闘中 if ($gameActors.actor(actorId).isStateAffected(16) || $gameActors.actor(actorId).isStateAffected(4)) fileNo = 4;//毒 if (semen >= 1) fileNo = 31;//精液 if ($gameActors.actor(actorId).isStateAffected(9)) fileNo = 38;//魅了 if ($gameActors.actor(actorId).isStateAffected(57)) fileNo = 35;//発情中 if ($gameActors.actor(actorId).isStateAffected(10)) fileNo = 12;//睡眠 } //表情ステート let states = actor.states(); for (let i = states.length - 1; i >= 0; i--) { if (states[i].id >= 101 && states[i].id <= 150) { //101~150が表情ステート fileNo = states[i].id - 100; break; } } //------------------------------------------- //立ち絵エロなど } else if (param.Type == 'SemenBody') {//精液 if (poseNo == 10) return null; if ($gameVariables.value(181) < 1) { return null } else { if ($gameVariables.value(181) >= 3) { $gameVariables._data[181] = 3 } fileNo = $gameVariables.value(181) } //いったんオフ } else if (param.Type == 'SemenVagina') {//精液 if (poseNo == 10) return null; if ($gameVariables.value(182) < 1) { return null } else { if ($gameVariables.value(182) >= 1) { $gameVariables._data[182] = 1 } fileNo = $gameVariables.value(182) } } else if (param.Type == 'SemenAnus') {//精液 if (poseNo == 10) return null; if ($gameVariables.value(183) < 1) { return null } else { if ($gameVariables.value(183) >= 1) { $gameVariables._data[183] = 1 } fileNo = $gameVariables.value(183) } } else if (param.Type == 'SemenFace') {//精液 if (poseNo == 10) return null; if ($gameVariables.value(184) < 1) { return null } else { if ($gameVariables.value(184) >= 1) { $gameVariables._data[184] = 1 } fileNo = $gameVariables.value(184) } } else if (param.Type == 'SemenMouth') {//精液 if (poseNo == 10) return null; //いったんオフ return null if ($gameVariables.value(185) < 1 || poseNo == 5) { return null } } else if (param.Type == 'Breath') {//吐息 スイッチorステートで制御したい if ($gameActors.actor(actorId).isStateAffected(57) || $gameActors.actor(actorId).isStateAffected(186)) {//発情中 fileNo = 1; } else { return null } } else if (param.Type == 'Mark') {//契約紋 進行で服の上に発光を重ねるのも面白いかも if (poseNo == 10 || poseNo == 3) return null; //いったんオフ var mark = $gameVariables.value(187)//契約紋の数 if (!mark) return null fileNo = 1; } else if (param.Type == 'Front') {//前側。 if (poseNo == 10) return null; let states = actor.states(); let flag = 0//ステート存在フラグ for (let i = states.length - 1; i >= 0; i--) { if (states[i].id >= stateIdMin && states[i].id <= stateIdMax) { //191~200が竿ステート if (poseNo == Number($dataStates[states[i].id].meta.Pose)) {//メタに設定されたPoseと現在のPoseが一致 if ($dataStates[states[i].id].meta.FrontNo) {//FrontNoが存在する時 fileNo = $dataStates[states[i].id].meta.FrontNo flag = 1 } else { return null } } else { return null } break; } } if (flag == 0) { return null } } else if (param.Type == 'Behind') { if (poseNo == 10) return null; let states = actor.states(); let flag = 0//ステート存在フラグ for (let i = states.length - 1; i >= 0; i--) { if (states[i].id >= stateIdMin && states[i].id <= stateIdMax) { //191~200が竿ステート if (poseNo == Number($dataStates[states[i].id].meta.Pose)) {//メタに設定されたPoseと現在のPoseが一致 if ($dataStates[states[i].id].meta.BehindNo) {//BehindNoが存在する時 fileNo = $dataStates[states[i].id].meta.BehindNo flag = 1 } else { return null } } else { return null } break; } } if (flag == 0) { return null } } else if (param.Type == 'Mid') { if (poseNo == 10) return null; let states = actor.states(); let flag = 0//ステート存在フラグ for (let i = states.length - 1; i >= 0; i--) { if (states[i].id >= stateIdMin && states[i].id <= stateIdMax) { //191~200が竿ステート if (poseNo == Number($dataStates[states[i].id].meta.Pose)) {//メタに設定されたPoseと現在のPoseが一致 if ($dataStates[states[i].id].meta.MidNo) {//BehindNoが存在する時 fileNo = $dataStates[states[i].id].meta.MidNo flag = 1 //console.log("mid通過") } else { return null } } else { return null } break; } } if (flag == 0) { return null } } //------------------------------------------- return ('000' + fileNo).slice(-4); } //ポーズによってレイヤー順を変えたい Sprite_StandPicture.prototype.updateLayers = function () { if (this._pictures._actor._actorId == 1) { //エニシアのときだけ let poseNo = $gameVariables.value(1005); //デフォルトのレイヤーの並び定義 let layers = ['Standback', 'Cloth_n_Back', 'Backhair', 'Body', 'earrings', 'Mark', 'Arm', 'Under0', 'Socks', 'SemenAnus', 'SemenVagina', 'Cloth', 'Fronthair', 'Face', 'Headacc2', 'Headacc', 'SemenBody', 'SemenFace', 'Breath']; if (poseNo == 2) { //レイヤー順を替えたい場合、自由に並び替える layers = ['Standback', 'Cloth_n_Back', 'Backhair', 'Body', 'earrings', 'Mark', 'Under0', 'Socks', 'SemenAnus', 'SemenVagina', 'Cloth', 'Fronthair', 'Face', 'Headacc2', 'Headacc', 'Arm', 'ClothArm', 'SemenBody', 'SemenFace', 'Breath', 'Front']; } if (poseNo == 3) { //レイヤー順を替えたい場合、自由に並び替える layers = ['Standback', 'Behind', 'Breath', 'Fronthair', 'Body', 'Cloth', 'Backhair', 'Headacc2', 'Headacc', 'SemenFace', 'Arm', 'Mid', 'BodyLower', 'Under0', 'SemenAnus', 'SemenVagina', 'Socks', 'SemenBody', 'Front']; } if (poseNo == 4) { //レイヤー順を替えたい場合、自由に並び替える layers = ['Standback', 'Behind', 'Cloth_n_Back', 'Backhair', 'Body', 'Mark', 'Cloth', 'Fronthair', 'Face', 'Headacc2', 'Headacc', 'SemenBody', 'SemenFace', 'Arm', 'ClothArm', 'BodyLower', 'Under0', 'SemenAnus', 'SemenVagina', 'Socks', 'Breath', 'Front']; } for (let i = 0; i < layers.length; i++) { for (let j = 0; j < this.children.length; j++) { if (this.children[j]._picture.Type == layers[i]) { this.setChildIndex(this.children[j], i); break; } } } } return this._base; }; //ポーズによって座標を変えたい StandPictureParam.prototype.getBasePoint = function () { if (this._actor._actorId == 1) { //エニシアのときだけ let poseNo = $gameVariables.value(1005); SH_getAnimePoint() if (poseNo == 2) return { X: 900, Y: 50 }; if (poseNo == 3 && $gameSwitches.value(230)) return { X: 800, Y: -20 }; if (poseNo == 3) return { X: 300, Y: -20 }; if (poseNo == 4) return { X: 600, Y: 50 }; } return this._base; }; })(); function SH_getAnimePoint() {//ポーズごとのアニメーションの座標 let poseNo = $gameVariables.value(1005); var x = 650; var y = 450 if (poseNo == 2) { x = 1050 }; if (poseNo == 3) { x = 650 }; if (poseNo == 4) { x = 900 }; $gameVariables._data[16] = x $gameVariables._data[17] = y } function SH_changePoseEro(id) { let actor = $gameActors.actor(1) let states = actor.states(); var stateIdMin = 191 var stateIdMax = 220 if (id && id >= 1) { $gameActors.actor(actor._actorId).addState(id)//idが1以上の場合そのステートに変更 } for (let i = states.length - 1; i >= 0; i--) { if (states[i].id >= stateIdMin && states[i].id <= stateIdMax) { //191~200が竿ステート //console.log(id,states[i].id) if (states[i].id != id || !id) $gameActors.actor(actor._actorId).removeState(states[i].id) } } }