shiny-cuty-excel-chiffon/data/PlayerController.tjs
2024-10-22 11:38:49 -05:00

2799 lines
186 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.


class PlayerController
{
var checkMode = false;
var debug = false;
var pOwner;
var player;
var owner;
var pIn;
// もう一人のヒロインキャラ
var oPlayer = void;
// 攻撃が当たるか判定用コンダクタ
var attackConductor;
// 制御用変数
var lastRollingDirection = 0; // 最後にローリングした方向
var lastRollingTick = 0; // 最後にローリングした時間;
var attackCount = 0; // 今現在の攻撃リスト中の何段階目か
var nowAttack = 0; // 攻撃リストから選択された攻撃ID
var lastAttack = 0;
var attackWaitTick = 0; // tickまで次の攻撃に移るのを待つ
var walkCountTick = 0; // tickまで歩く
var lastWalkDirection = 0; // 歩く方向
var commandExecFlag = false;
var nowTryingGetItem = false; // アイテムを取りに行っている
var targetItem = void; // 取りたいアイテム
var existObjDestruct; // 破壊すべきオブジェクトがある
var clinchedTick = -1; // 抱き付かれたときのtick
var enforceControl = false; // コンピュータ操作を強制するか
var nowManualControl = false; // 現在マニュアル動作か
var lastManualControlTick = 0; // 最後にマニュアルで動作した時間
var leaveItMode = false; // 攻撃をしなくなるお任せモード
var leaveItModeEnterTick = -9999; // お任せモードに入った時点のtick
var existAvoid = false; // AvoidPoint近寄るべきでない場所が画面内にあるかどうか
var inAvoidArea; // 近寄るべきでないエリアにいる
var special2Tick = 0;
// var execFlag = true;
var dashFlag = false;
function PlayerController(p){
attackConductor = new AttackAlgorithmConductor(this);
player = owner = p;
pOwner = player.owner; // global baoと同値
pIn = player.input;
}
function finalize(){
invalidate attackConductor;
player = void;
pOwner = void;
}
function prob(c = 1){
if(player.HP < player.maxHP * 0.3) c *= 5;
if(player.HP < player.maxHP * 0.1) c *= 3;
var w = adjAIClevernessMatrix[sf.adjAICleverness];
var t = w * w * c;
var oPlayer = pOwner.getOtherPlayer(player);
if(oPlayer !== void && (oPlayer.state >= stateDamage || tf.inRescueMode || oPlayer.lockedCount > 0)) return true;
var ret = (intrandom(0, 400) <= t);
return ret;
}
function considerAggressiveness(mode = true){
var oPlayer = pOwner.getOtherPlayer(player);
if(player === bao.nowSelectingPlayer) return true;
if(oPlayer === void) return true;
if(existObjDestruct) return true;
if(oPlayer !== void && (oPlayer.state >= stateDamage || oPlayer.lockedCount > 0)) return true;
var eg = player.extasyGauge;
if(eg.enabled){
// 性感ゲージの値が大きいほど積極的な動作をしなくなる
if(intrandom((40 + sf.adjAICleverness * 10), 100) < ((eg.value / eg.maxValue) * 100)) return false;
}
var w = adjAIClevernessMatrix[sf.adjAICleverness];
var mKC = tf.killCount[player.id];
var oKC = tf.killCount[oPlayer.id];
var h = oPlayer.HP / oPlayer.maxHP;
if(f.difficulty ==0 || sf.adjAICleverness >= 4 || h < 0.2) return true;
var k = (h < 0.5)? (0.5 / h) : 1;
// oKC += w * 1.5;
//dm("mKC : " + mKC + " / oKC : " + oKC);
if((oKC + w * 1.2) > mKC) return true;
if((oKC + w * 1.5) > mKC) return (intrandom(0, 5/k) == 0);
if((oKC + w * 1.8) > mKC) return (intrandom(0, 20/k) == 0);
if(mode || pOwner.nowSelectingPlayer === player && sf.adjAIAssist) return prob();
return false;
// return prob();
}
function considerAggressiveness2(c = 1){
var eg = player.extasyGauge;
if(eg.enabled){
// 性感ゲージの値が大きいほど積極的な動作をしなくなる
if(intrandom(50, 100) < ((eg.value / eg.maxValue) * 100)) return false;
}
if(sf.adjAICleverness >= 4) return true;
if(sf.adjAICleverness >= 2) return prob(c);
return false;
}
function enterLeaveItMode()
{
// お任せモード(一定時間攻撃をしなくなる)
leaveItMode = true;
leaveItModeEnterTick = pOwner.tickCount;
}
function decisionAction()
{
var p = player;
var ege = p.extasyGauge.enabled;
var baoIWidth = pOwner.internalWidth;
nowTryingGetItem = false;
if(sf.adjSinglePlayMode && bao.nowSelectingPlayer !== player) return;
if(!pOwner.timer.enabled) return;
// // 2回に1回の処理で良くね? ……何か上手くいかんな
// if(!execFlag && !p.nowClinched){
// if(walkCount > 0){
// pIn.direction = lastWalkDirection;
// }
// execFlag = true;
// return;
// }
// execFlag = false;
if(p.HP == 0) return;
if(p.attackListForPc === void) return;
if(checkMode){
kag.fore.layers[0].type = ltAlpha;
kag.fore.layers[0].visible = true;
kag.fore.layers[0].setSize(pOwner.width, pOwner.height);
kag.fore.layers[1].type = ltAlpha;
kag.fore.layers[1].visible = true;
kag.fore.layers[1].setSize(pOwner.width, pOwner.height);
}
// もう一人のヒロインキャラ取得
oPlayer = pOwner.getOtherPlayer(player);
var nsp = pOwner.nowSelectingPlayer;
var sl = pOwner.stageLayer;
// if(leaveItMode && pOwner.tickCount-leaveItModeEnterTick > 300){
// leaveItMode = false;
// if(oPlayer !== void) oPlayer.defaultFaceNum = 0;
// }
var pRect = new Rect2(p.internalLayerLeft, p.rootY - p.layer.asdHeight + p.footRect.top - 2, p.internalLayerLeft + p.layer.asdWidth, p.rootY - p.layer.asdHeight + p.footRect.bottom + 2);
// これから移動するであろう位置まで当たり判定を考慮
if(p.movingTable.count > 0){
var tRect = new Rect2(pRect);
tRect.addOffset(p.movingTable[0].x*10, p.movingTable[0].y*10);
pRect.addRect(tRect);
}
var enemies = [];
for(var i=0; i<pOwner.enemies.count; i++){
var e = pOwner.enemies[i];
var flag = true;
if(f.stage == 5 && e.kind == "レヴィエラ" && prob()) flag == false;
if(flag && e.rootY > 100 && (e.layer.opacity>30 || p === nsp)) enemies.add(e);
}
// enemies.assign(pOwner.enemies);
if(!p.enableFreeMove) return;
// AvoidPointの画面内の有無
existAvoid = false;
if(sl.avoidPoints.count > 0){
for(var i=0; i<sl.avoidPoints.count; i++){
if(sl.avoidPoints[i].x > 0 && sl.avoidPoints[i].x < baoIWidth){
existAvoid = true;
break;
}
}
// 近くにあるなら離れたところへ移動
var nw = getAvoidWeight(p.rootX, p.rootY);
if(nw > 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "750 inAvoidArea");
inAvoidArea = true;
var minI = 0;
var minW = nw;
var x;
var y;
for(var i=0; i<9; i++){
x = p.rootX + (i % 3) * 50 - 50; if(x < p.movableRect.left) x = p.movableRect.left; if(x > p.movableRect.right) x = p.movableRect.right;
y = p.rootY + (i \ 3) * 50 - 50; if(y < p.movableRect.top) x = p.movableRect.top; if(y > p.movableRect.bottom) x = p.movableRect.bottom;
var w = getAvoidWeight(p.rootX + x, p.rootY + y);
if(w < minW){
minI = i;
minW = w;
}
}
x = p.rootX + (minI % 3) * 50 - 50; if(x < p.movableRect.left) x = p.movableRect.left; if(x > p.movableRect.right) x = p.movableRect.right;
y = p.rootY + (minI \ 3) * 50 - 50; if(y < p.movableRect.top) x = p.movableRect.top; if(y > p.movableRect.bottom) x = p.movableRect.bottom;
setDirection(p, x, y);
}else{
inAvoidArea = false;
}
}else{
inAvoidArea = false;
}
// 爆発物の近くにいる
if(prob(5) && p.nowSpriteId != stDamage2 && p.nowSpriteId != stDown){
var cnt = 0;
var nearObject;
for(var i=0; i<pOwner.objects.count; i++){
var o = pOwner.objects[i];
if(o.type == objExplode ){
var r = new Rect2(o.rootX-60, o.rootY-25, o.rootX+60, o.rootY+25);
if(r.intersects(pRect)){
doRoll();
return;
}
}
if(o.type == objAttack ){
var r = new Rect2(o.rootX-50, o.rootY-15, o.rootX+50, o.rootY+15);
if(r.intersects(pRect) && !o.hitRect.isEmpty()){
nearObject = o;
cnt++;
}
}
}
if(cnt > 2){
if(p.checkMP(50, false)){
if(oPlayer === void || oPlayer.nowSpriteId != stSpecial1){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "700 objExplode or objAttack");
setCommand(p, stSpecial1);
return;
}
}else{
doRoll();
return;
}
}else if(cnt > 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "701 objExplode or objAttack " + nearObject.layer.asd);
if(!existAvoid){
if(nearObject.layer.asd == "knife01"){
if(Math.abs(nearObject.rootY - p.rootY) < 10){
if(Math.abs(nearObject.rootX - p.rootX) < 100){
doRoll();
}else if(Math.abs(nearObject.rootX - p.rootX) < 200){
setCommand(p, stAttack1, !nearObject.inverse);
}
}
}else{
switch(intrandom(1,5)){
case 1:
doAntiAir(p, nearObject, !(nearObject.rootX < p.rootX));
break;
case 2:
setCommand(p, stJumpAttack1, !(nearObject.rootX < p.rootX));
break;
default:
doRoll();
break;
}
}
}else{
doRoll();
}
return;
}
}
var attackedCountMin = 9999;
var attackedCountMax = 0;
var nearEnemiesCount = 0;
var nearestEnemyIndex = 0;
var dMin = 999999999;
var target;
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
// 敵が近くにいるかどうか
if(e.rootX > -70 && e.rootX < pOwner.internalWidth+70 && e.objectClass==clEnemy && e.HP>0 && !(e.nowSpriteId == stDamage2 && e.hitRect.isEmpty())
&& (e.nowSpriteId != stDamage1 || e.nowSpriteId != stClinched || e.nowSpriteId != stClinchedDamage)){
var d = getDistance(p, e);
if(d < 6400) nearEnemiesCount++;
if(d < dMin){
nearestEnemyIndex = i;
dMin = d;
}
}
}
if(prob()){
// 非ダウン性の攻撃を喰らった
if(p.nowSpriteId == stDamage1 && p.checkMP(50, false)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "360 反撃 stSpecial1");
setCommand(p, stSpecial1);
return;
}
// ダウン性の攻撃を喰らった
if(p.nowSpriteId == stDamage2 && p.checkMP(50, false)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "361 リカバリー");
setCommand(p, stRecovery);
return;
}
}
if(prob(20)){
// クリンチされてる
if(p.nowSpriteId == stClinched || p.nowSpriteId == stClinchedStruggle){
if(clinchedTick < 0) clinchedTick = bao.tickCount;
pIn.direction = intrandom(1,9);
if(p.checkMP(50, false) && !p.inExtasy &&(p.clinchedStrength > 150 || nearEnemiesCount > 2 || (p.HP/p.maxMP < 0.3 && p.MP > 50) || (bao.tickCount - clinchedTick > (90 - sf.adjAICleverness * 20)))){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "362 クリンチから脱出 stSpecial1");
setCommand(p, stSpecial1);
}
return;
}else{
clinchedTick = -1;
}
}
if(prob(20)){
if(p.lockedCount > 0){
pIn.direction = intrandom(1,9);
return;
}
}
if(p.nowSpriteId == stExtasy && prob(25)){
pIn.direction = intrandom(1,9);
return;
}
var agr = considerAggressiveness();
// 敵から攻撃を受けそうな場合
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
var dist = getDistance(p, e);
if(e.HP <= 0) continue;
if(leaveItMode && p.enableMove){
if(Math.abs(e.rootY - p.rootY) < 10 && dist < 10000){
doRoll();
return;
}else if(walkCount == 0){
takeDistance(p, e);
return;
}else{
break;
}
}
// 特定の敵キャラに対する行動
if(prob(2)){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "1001 行動検討1-1");
// if(e.kind == "戦闘員" && e.layer.asd == "e010_ride"){
// // バイク戦闘員
// if(p.nowSpriteId == stVerticalJump && attackWait <= 0){
// // 垂直ジャンプ→キック
// pIn.set(keyAttack);
// return;
// }else{
// var tRect = new Rect2(e.rootX, e.rootY - 4 , e.rootX + xDirection(e.inverse) * 500, e.rootY + 4);
// if(tRect.intersects(pRect)){
// if(e.frameCount > 25 && e.frameCount < 30){
// if(dist > (p.chara==chrChiffon)?22500:40000){
// if(nearEnemiesCount<3 && p.nowSpriteId != stSpecial1 && p.enableMove){
// // 垂直ジャンプ
// if(p.nowSpriteId == stStanding || p.nowSpriteId == stWalk || p.nowSpriteId == stDash) p.inverse = (p.rootX < e.rootX);
// pIn.direction = 0;
// setCommand(p, stVerticalJump, !(e.rootX < p.rootX));
// return;
// }else{
// if(p.checkMP(50, false)){
// // 緊急回避技
// setCommand(p, stSpecial1);
// return;
// }
// }
// }
// doRoll();
// return;
// }else if(e.frameCount > 30 && p.checkMP(50, false) && (dist < 10000)){
// if(p.enableMove){
// doRoll();
// }else{
// // 緊急回避技
// setCommand(p, stSpecial1);
// return;
// }
// }
// }
// }
// }
if(e.kind == "エクセルショコラ" && p.altitude == 0 && p.enableMove){
if(dMin > 14400){
setCommand(p, stJumpAttack2, (e.rootX < p.rootX)? false: true);
return;
}else{
if(dMin < 2500 && p.checkMP(50, false)){
setCommand(p, stSpecial1);
return;
}else{
if(Math.abs(e.rootY-p.rootY) < 10){
setCommand(p, stAttack5, (e.rootX < p.rootX)? false: true);
return;
}
}
}
doWalkAboveOrUnder(p, e, 120, 0);
return;
}
if(e.kind == "エクセルシフォン" && p.altitude == 0 && e.state != stateDamage){
// if(dMin < 2500 && p.checkMP(50, false) && !e.hitRect.isEmpty()){
// setCommand(p, stSpecial1);
// return;
// }else{
if(Math.abs(e.rootY-p.rootY) < 10 && (e.nowSpriteId < stDashAttack || e.attackRect.isEmpty())){
setCommand(p, stDashAttack, (e.rootX < p.rootX)? false: true);
return;
}
// }
doWalkAboveOrUnder(p, e, 120, 0);
return;
}
if(f.stage != 5 && e.kind == "レヴィエラ"){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "対レヴィエラ");
if(oPlayer !== void && oPlayer.lockedCount > 0){
switch(p.chara){
case chrChiffon:
setCommand(p, stJumpAttack2, (e.rootX < p.rootX)? false: true);
return;
case chrChocolat:
if((pOwner.tickCount-special2Tick>150) && p.checkMP(150, false)){
setCommand(p, stSpecial2);
special2Tick = pOwner.tickCount;
return;
}
if(dMin < 19600 && Math.abs(e.rootY-p.rootY) < 10){
setCommand(p, stHolding, (e.rootX < p.rootX)? false: true);
return;
}
}
}
if(e.nowSpriteId == stAttack1 && Math.abs(e.rootY-p.rootY) < 25 && (e.inverse && e.rootX < p.rootX || !e.inverse && p.rootX < e.rootX)){
doRoll();
return;
}
}
if(f.stage == 5 && e.kind == "レヴィエラ"){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "対フェイクレヴィエラ");
if(e.state == stateAttack && p.altitude == 0 &&getDistance(p, e) < 14400 && Math.abs(e.rootY-p.rootY) < 20){
doRoll();
return;
}
}
if(e.kind == "ベイゼル"){
if(e.nowSpriteId == stSpecial2){
doRoll();
return;
}
}
if(e.kind == "戦闘員"){
if(Math.abs(p.rootY - e.rootY) < 20){
switch(e.layer.asd){
case "e013_standing":
case "e013_walk":
if(dist < 10000){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "350 対戦闘員 対空技");
doAntiAir(p, e, !(e.rootX < p.rootX));
return;
}
case "e013_attack1":
case "e013_attack2":
if((!e.inverse && p.rootX < e.rootY) || (e.inverse && e.rootX < p.rootX)){
if(nearEnemiesCount>2 && p.checkMP(50, false)){
// 緊急回避技
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "352 対戦闘員 フォースジャベリン");
setCommand(p, stSpecial1);
return;
}
}else{
doRoll();
return;
}
}
}
if(e.nowSpriteId == stAttack4 && e.rootY > 100 && ((e.targetPlayer === p && dist <6400)||(dist < 6400))){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "353 対戦闘員 対空技 nowSpriteId : " + st(p.nowSpriteId));
switch(p.nowSpriteId){
case stClinching:
pIn.direction = (p.inverse)? dLeft : dRight;
pIn.set(keyAttack);
break;
case stBackClinch:
pIn.set(keyAttack);
break;
default:
if(e.altitude > 180){
doAntiAir(p, e, !(e.rootX < p.rootX));
return;
}else{
if(p.enableMove){
doRoll();
return;
}
}
if(p.checkMP(50, false)){
setCommand(p, stSpecial1);
return;
}
doRoll();
return;
}
}
}
if(p.chara == chrChocolat && (p.nowSpriteId==stStanding || p.nowSpriteId==stWalk) && e.enableClinched && e.sprites[stGuard] !== void && e.guardRate > 0 && (e.nowSpriteId == stStanding || e.nowSpriteId == stWalk)){
if(p.checkMP(100, false) && Math.abs(p.rootX - e.rootX) < 140 && Math.abs(p.rootY - e.rootY) < 10 && e.rootX > 0 && e.rootX < baoIWidth){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "350 ダッシュグラップル");
setCommand(p, stHolding, !(e.rootX < p.rootX));
return;
}
}
if(e.kind == "ゴブリン兵" && (Math.abs(p.rootY - e.rootY) < 15) && dist < 6400 && e.nowSpriteId == stSpecial2 && agr){
if(nearEnemiesCount>2 && p.checkMP(50, false)){
// 緊急回避技
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "351 対ゴブリン兵 stEpecial1");
setCommand(p, stSpecial1);
return;
}else{
if(intrandom(0,1)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "351 対ゴブリン兵 対空技");
doAntiAir(p, e, !(e.rootX < p.rootX));
}else{
doRoll();
}
}
}
if(e.kind == "魔影蝶" && e.mode == 0 && Math.abs(p.rootY - e.rootY) < 15 && dist < 640 && p.enableMove && agr){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "352 対魔影蝶");
doAntiAir(p, e, !(e.rootX < p.rootX));
}
if(p.enableMove && prob(0.5) && e.kind == "サイコウィザード" && e.nowSpriteId == stSpecial2 && e.layer.conductor.curLabel=="*wait" && agr){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "353 対サイコウィザード");
switch (p.chara){
case chrChiffon:
setCommand(p, stCommand3, !(e.rootX < p.rootX));
return;
case chrChocolat:
var dx = Math.abs(p.rootX - e.rootX);
if(Math.abs(p.rootY - e.rootY) < 15){
if(dx < 150){
setCommand(p, stHolding, !(e.rootX < p.rootX));
return;
}else if(dx < 180){
setCommand(p, stAttack4, !(e.rootX < p.rootX));
return;
}
}else if((pOwner.tickCount-special2Tick>150) && p.checkMP(150, false) && oPlayer !== void && oPlayer.state != stateAttack){
setCommand(p, stSpecial2);
special2Tick = pOwner.tickCount;
return;
}
}
}
if(e.kind == "ジャイアントスクイッド"){
if(e.nowSpriteId == stSpecial1 && (p.rootY > 190 && p.rootY < 240) && agr){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "302 緊急回避");
doRoll();
return;
}
if(e.tentacles[0].isDead && e.tentacles[1].isDead && (e.HP / e.maxHP) > 0.7 && e.MP < 100 && oPlayer !== void && oPlayer.nowSpriteId != stSpecial2){
switch (p.chara){
case chrChiffon:
if(p.checkMP(100, false)){
setCommand(p, stSpecial2, true);
return;
}
break;
case chrChocolat:
if((pOwner.tickCount-special2Tick>150) && p.checkMP(150, false)){
setCommand(p, stSpecial2, true);
special2Tick = pOwner.tickCount;
return;
}
break;
}
}
}
if(prob(0.5) && e.kind == "ベイゼル" && e.MP < 7 && agr){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "353 対ベイゼル");
switch (p.chara){
case chrChiffon:
if(p.enableMove && p.nowSpriteId != stCommand3){
setCommand(p, stCommand3, !(e.rootX < p.rootX));
return;
}
break;
case chrChocolat:
if(p.nowSpriteId == stClinching || p.nowSpriteId == stBackClinch){
if(p.checkMP(50)){
setCommand(p, stSpecial3);
return;
}else{
pIn.direction = (p.inverse)? dLeft : dRight;
pIn.set(keyAttack);
return;
}
}
var dx = Math.abs(p.rootX - e.rootX);
if(Math.abs(p.rootY - e.rootY) < 15 && p.nowSpriteId != stHolding && p.altitude == 0){
if(dx < 120){
setCommand(p, stHolding, !(e.rootX < p.rootX));
return;
}else if(dx < 180){
setCommand(p, stAttack4, !(e.rootX < p.rootX));
return;
}
}else if((pOwner.tickCount-special2Tick>150) && p.checkMP(150, false) && oPlayer !== void && oPlayer.state != stateAttack){
setCommand(p, stSpecial2);
special2Tick = pOwner.tickCount;
return;
}
}
}
}
if(prob()){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "1002 行動検討1-2");
if(p.enableMove && (e.kind == "男子生徒" || e.kind == "一般人" || e.kind == "オルトロス" || e.kind == "スライム") && e.nowSpriteId == stHolding){
// 男子生徒・一般人
var tRect = new Rect2(e.rootX, e.rootY -10 , e.rootX + xDirection(e.inverse) * 160, e.rootY + 10);
if(tRect.intersects(pRect) && dist < 6400){
if(nearEnemiesCount>3 && p.checkMP(50, false)){
// 緊急回避技
setCommand(p, stSpecial1);
}else{
// 対空技
doAntiAir(p, e, !(e.rootX < p.rootX));
}
return;
}
}
if((e.damageCount >= e.damageCountLimit || e.guardCount >= e.damageCountLimit) && e.nowSpriteId == stGuard && e.nowSpriteId != stDamage2 && e.targetPlayer === p && p.nowSpriteId != stSpecial2 && p.invincibleCount==0){
nowAttack = 0;
if(!p.enableMove && intrandom(0,2)>0 && p.nowSpriteId!=stSpecial1 && p.nowSpriteId!=stLanding && !leaveItMode){
if(p.checkMP(50, false)){
setCommand(p, stSpecial1, !(e.rootX < p.rootX));
return;
}
}
doRoll();
return;
}
}
if(prob()){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "1003 行動検討1-3");
if(e.state == stateAttack || (e.nowSpriteId > stAttack1 && e.nowSpriteId < stJumpAttack3) || (e.nowSpriteId > stSpecial1 && e.nowSpriteId < stCommand6)){
// 敵が攻撃態勢である
for(var j=0; j<60; j++){
var f = j + e.frameCount - e.attackConductor.frameCountOffset;
if(f > e.attackRectBuf.count){
break;
}
if(checkMode){
if(e.attackRectBuf[f] !== void) kag.fore.layers[0].fillRect(e.attackRectBuf[f].left*3, e.attackRectBuf[f].top*3, e.attackRectBuf[f].width*3, e.attackRectBuf[f].height*3, 0x880000ff);
}
if(e.attackRectBuf[f] !== void && e.attackRectBuf[f].intersects(pRect)){
if(j > attackedCountMax) attackedCountMax = j;
if(j < attackedCountMin) attackedCountMin = j;
}
}
}else if(e.HP > 0 && e.attackRectBuf.count == 1){
var tRect = new Rect2(e.attackRectBuf[0]);
tRect.addOffset(e.rootX - e.centerPos, e.rootY);
if(e.movingTable[0] !== void){
var x = e.movingTable[0].x;
var y = e.movingTable[0].y;
if(x < 0) tRect.left += x * 20;
if(x > 0) tRect.right += x * 20;
if(y < 0) tRect.top += y * 10;
if(y > 0) tRect.bottom += y * 10;
}
if(checkMode) kag.fore.layers[0].fillRect(tRect.left*3, tRect.top*3, tRect.width*3, tRect.height*3, 0x880000ff);
if(tRect.intersects(pRect)){
attackedCountMin = 1;
attackedCountMax = 2;
target = e;
}
}
}
}
if(prob()){
for(var i=0; i<pOwner.objects.count; i++){
// 攻撃属性のオブジェクトについて
var o = pOwner.objects[i];
if(o.type != objAttack) continue;
if(o.attackRectBuf.count == 0) o.attackRectBufSet();
if(o.attackRectBuf[0] !== void){
var tRect = new Rect2(o.attackRectBuf[0]);
tRect.left -= 30;
tRect.right += 30;
tRect.top = -30;
tRect.bottom = 30;
tRect.addOffset(o.rootX - o.centerPos, o.rootY);
//tRect.dm();
if(checkMode) kag.fore.layers[0].fillRect(tRect.left*3, tRect.top*3, tRect.width*3, tRect.height*3, 0x880000ff);
if(tRect.intersects(pRect)){
attackedCountMin = -1;
break;
}
}
}
}
if(attackedCountMin < 9999){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "2001 行動検討2");
// 回避行動
if(checkMode) kag.fore.layers[0].fillRect(pRect.left*3, pRect.top*3, pRect.width*3, pRect.height*3, 0x88ff0000);
// 特定の敵キャラに対する行動
if(p.enableMove && target != void && attackedCountMin == 1 && attackedCountMax == 2){
if(target.kind == "魔影蝶" && !target.hitRect.isEmpty() && target.nowSpriteId!=stDamage2 && nearEnemiesCount<3){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "401 魔影蝶への攻撃。※この分岐には来ない気がする");
// 対空技
doAntiAir(p, target);
return;
}
}
// 避け行動を取る
if(!p.hitRect.isEmpty() && p.invincibleCount==0){
if(p.nowSpriteId >= stClinching && p.nowSpriteId <= stClinchAttack3){
// 投げ
pIn.direction = (p.inverse)? dLeft : dRight;
pIn.set(keyAttack);
}else if(dMin < 10000 && p.enableMove && attackedCountMin > 4 && !enemies[nearestEnemyIndex].hitRect.isEmpty()){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "411 ダッシュ攻撃で迎撃");
setCommand(p, stDashAttack, !(enemies[nearestEnemyIndex].rootX < p.rootX));
return;
}else if((p.enableMove || p.enableCommand) && target != void && !target.hitRect.isEmpty() && getDistance(p,target)<((p.chara==chrChiffon)?40000:14400) && Math.abs(p.rootX-target.rootX)<12){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "412 ダッシュ攻撃で迎撃");
setCommand(p, stDashAttack, !(target.rootX < p.rootX));
}else{
if(p.nowSpriteId != stRoll1 && p.nowSpriteId!=stRoll2){
if(target != void && p.checkMP(50, false) && attackedCountMin < 4 && !p.enableMove && p.altitude==0 && intrandom(0,20)<1 && ((p.nowSpriteId >= stAttack1 && p.nowSpriteId <=stDashAttack) || (p.nowSpriteId >= stCommand1 && p.nowSpriteId <= stCommand6))){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "402 緊急回避");
setCommand(p, stSpecial1);
return;
}
if(p.enableMove){
if(attackedCountMin < 5){
// ローリング回避
doRoll();
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "201 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, enemies[nearestEnemyIndex], 0, 40);
}
}
}
}
return;
}
}
var eTemp = [];
var maxHPEnemy = void;
if(prob() && !leaveItMode && !inAvoidArea){
switch (p.chara){
case chrChiffon:
// シフォン超必
if(agr && p.checkMP(80, false) && (p.enableMove || p.enableCommand)){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "3001 行動検討3-1");
for(var j=0; j<2 ; j++){
var tmpRect = new Rect2(((j==0)?-20:p.rootX+20), p.rootY-15, ((j==0)?p.rootX-20:baoIWidth+20), p.rootY+15);
var maxHP = 0;
eTemp.clear();
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > 0 && !e.hitRect.isEmpty() && e.nowSpriteId != stDamage1 && e.nowSpriteId != stDamage2 && e.nowSpriteId != stClinched && tmpRect.includedPos(e.rootX, e.rootY)){
eTemp.add(e);
if(e.HP > maxHP){
maxHP = e.HP;
maxHPEnemy = e;
}
}
}
if(eTemp.count == 0) continue;
var d = getDistance(p,maxHPEnemy);
if(maxHPEnemy.isBoss){
switch (maxHPEnemy.nowSpriteId){
case stDamage1:
case stStandUp:
break;
case stClinching:
case stBackClinch:
case stHAttack:
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "421 ライトニングピアース");
// ライトニングピアース
p.nowSpriteId = stDash;
setCommand(p, stSpecial3, j);
return;
default:
if(!maxHPEnemy.hitRect.isEmpty()) break;
if(oPlayer !== void && oPlayer.HP > 50 && oPlayer.nowSpriteId != stDamage1 && oPlayer.nowSpriteId != stDamage2 && oPlayer.nowSpriteId > stSpecial1) break;
// ライトニングピアース
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "422 ライトニングピアース");
p.nowSpriteId = stDash;
setCommand(p, stSpecial3, j);
return;
}
}
var m = true;
if(maxHPEnemy.maxMP != 0){
m = maxHPEnemy.MP/maxHPEnemy.maxMP;
m = ((m > 0.2 && m < 0.3) || (maxHPEnemy.nowSpriteId == stDamage1) || (maxHPEnemy.nowSpriteId == stDamage2));
}
if(eTemp.count > 5){
// 多数の敵にまとめて攻撃できそうな場合
if(p.checkMP(100, false) && m && ((maxHP > 200 && d<14400 && d>1600 && Math.abs(p.rootY-maxHPEnemy.rootY)<10 && !maxHPEnemy.hitRect.isEmpty()) || (eTemp.count>7 && intrandom(0,1)==0))){
// シフォンインフェルノ
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "423 シフォンインフェルノ");
setCommand(p, stSpecial2, j);
return;
}
// ライトニングピアース
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "424 ライトニングピアース");
p.nowSpriteId = stDash;
setCommand(p, stSpecial3, j);
return;
}else{
if((p.checkMP(100, false) && maxHP > 200 && m && d<14400 && d>1600 && Math.abs(p.rootY-maxHPEnemy.rootY)<8 && (!maxHPEnemy.hitRect.isEmpty() && (maxHPEnemy.nowSpriteId==stDamage1 || maxHPEnemy.nowSpriteId==stDamage2 || maxHPEnemy.nowSpriteId==stDash)))){
// シフォンインフェルノ
setCommand(p, stSpecial2, !(maxHPEnemy.rootX < p.rootX));
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "425 シフォンインフェルノ");
return;
}
}
}
}
if(agr && !existAvoid && sf.adjEnableNewArts && (p.enableMove || p.enableCommand || p.otherState=='enablespecial5') && p.nowSpriteId != stSpecial5 && p.checkMP(20, false)){
// バーティカルスラッシュ
var tmpRect = new Rect2(p.rootX-200, p.rootY-25, p.rootX+200, p.rootY+25);
var ee = void;
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > 0 && e.hitRect.height == 1 && e.targetPlayer === p && tmpRect.includedPos(e.rootX, e.rootY)){
ee = e;
}
}
if(ee !== void && ee.pursueCount < 4 && Math.abs(p.rootX - ee.rootX) > 40){
setCommand(p, stSpecial5, (p.rootX < ee.rootX));
return;
}
}
if(agr && sf.adjEnableNewArts && (p.enableMove || p.enableCommand) && p.checkMP(20, false)){
// ウォールブレイカー
var e = enemies[nearestEnemyIndex];
if(e === void) break;
var tmpRect = new Rect2(p.rootX-100, p.rootY-15, p.rootX+100, p.rootY+15);
if(tmpRect.includedPos(e.rootX, e.rootY) && e.guardRate > 0 && (e.nowSpriteId < stDash || e.nowSpriteId == stGuard)){
setCommand(p, stSpecial4, (p.rootX < e.rootX));
return;
}
}
break;
case chrChocolat:
// ショコラ超必
if(p.nowSpriteId == stSpecial3 && p.checkMP(intrandom(20, 40), false)){
// ショコラコレダー延長
setCommand(p, stSpecial1);
return;
}
if(agr && p.checkMP(150, false) && (p.enableMove || p.enableCommand)){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "3002 行動検討3-2");
var maxHP = 0;
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > maxHP && e.rootX > 50 && e.rootX < baoIWidth-50){
maxHP = e.HP;
maxHPEnemy = e;
}
}
if(maxHPEnemy === void) break;
var tmpRect = new Rect2(maxHPEnemy.rootX-100, maxHPEnemy.rootY-15, maxHPEnemy.rootX+100, maxHPEnemy.rootY+15);
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > 0 && !e.hitRect.isEmpty() && e.nowSpriteId != stDamage1 && e.nowSpriteId != stDamage2 && e.nowSpriteId != stClinched && tmpRect.includedPos(e.rootX, e.rootY)){
eTemp.add(e);
}
}
// HPの高い敵に攻撃
var m = true;
if(maxHPEnemy.maxMP != 0){
m = maxHPEnemy.MP/maxHPEnemy.maxMP;
m = (m > 0.2 && m < 0.3);
}
// フェイクレヴィエラに超必は使わない
if(f.stage==5 && maxHPEnemy.kind=="レヴィエラ") break;
if((pOwner.tickCount-special2Tick>150) && maxHPEnemy.HP > 250 && !maxHPEnemy.hitRect.isEmpty() && Math.abs(maxHPEnemy.lastMovingTable.x) > 5 && m){
switch (maxHPEnemy.nowSpriteId){
case stDamage1:
case stStandUp:
break;
case stClinching:
case stBackClinch:
case stHAttack:
// パニッシュメントハンマー
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "426 パニッシュメントハンマー");
setCommand(p, stSpecial2);
special2Tick = pOwner.tickCount;
return;
default:
if(intrandom(0,10) != 0) break;
if(oPlayer !== void && oPlayer.HP > 50 && oPlayer.nowSpriteId != stDamage1 && oPlayer.nowSpriteId != stDamage2 && oPlayer.nowSpriteId > stSpecial1) break;
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "427 パニッシュメントハンマー");
// パニッシュメントハンマー
setCommand(p, stSpecial2);
special2Tick = pOwner.tickCount;
return;
}
}
if((pOwner.tickCount-special2Tick>150) && eTemp.count > intrandom(0,5) && ((maxHPEnemy.HP > 200 && p.MP > 150) || maxHPEnemy.kind == "エルゴネア") && m && maxHPEnemy.nowSpriteId != stDash && maxHPEnemy.nowSpriteId < stSpecial1
&& (maxHPEnemy.MP == 0 || maxHPEnemy.MP < maxHPEnemy.escapeMP || maxHPEnemy.nowSpriteId == stDamage1 || maxHPEnemy.nowSpriteId == stDamage2)){
// パニッシュメントハンマー
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "428 パニッシュメントハンマー");
setCommand(p, stSpecial2);
special2Tick = pOwner.tickCount;
return;
}
}
var e_cnt = 0;
if(f.stage == 2){
for(var i=0; i<enemies.count; i++){
if(enemies[i].kind != "モブ") e_cnt++;
}
}else{
e_cnt = enemies.count;
}
if(agr && sf.adjEnableNewArts && p.checkMP(50, false) && (p.nowSpriteId == stWalk || p.nowSpriteId == stDash) && (e_cnt > 11 || (e_cnt > 5 && ((nsp !== void && nsp.HP < 80) || p.HP < 80))) && enemies[nearestEnemyIndex].lockedCount <= 5){
if(getDistance(p, enemies[nearestEnemyIndex]) > 10000){
// プラズマバインド
setCommand(p, stSpecial8);
return;
}
}
if(agr && sf.adjEnableNewArts && p.checkMP(25, false) && p.enableAttack){
for(var j=0; j<2 ; j++){
var tmpRect = new Rect2(((j==0)?p.rootX-450:p.rootX), p.rootY-20, ((j==0)?p.rootX:p.rootX+450), p.rootY+20);
var ec = 0;
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > 0 && !e.hitRect.isEmpty() && e.nowSpriteId != stClinched && e.nowSpriteId != stDamage2 && e.rootX > 0 && e.rootX < baoIWidth && tmpRect.includedPos(e.rootX, e.rootY)){
ec++;
}
}
if(((ec > 1 && p.MP > 150) || ec > 3) && getDistance(p, enemies[nearestEnemyIndex]) > 10000){
// ポジトロンキャノン
setCommand(p, stSpecial7, j);
return;
}
}
}
if(agr && !existAvoid && (p.altitude - p.fAltitude > 0) && (p.enableMove || p.enableCommand || p.otherState=='enablespecial5')){
if(sf.adjEnableNewArts && p.nowSpriteId == stRecovery && p.damageFrom !== void && isvalid p.damageFrom && (pOwner.tickCount - p.damage.tick < 30) && (Math.abs(p.rootY - p.damageFrom.rootY) < 20) && (Math.abs(Math.abs(p.rootX - p.damageFrom.rootX) - (p.altitude - p.fAltitude)) < 30)){
// ヘルダイブボマー
setCommand(p, stSpecial6, (p.rootX < p.damageFrom.rootX));
return;
}
var ec0, ec1;
for(var j=0; j<2 ; j++){
eTemp.clear();
var tmpRect = new Rect2(((j==0)?p.rootX-200:p.rootX), p.rootY-40, ((j==0)?p.rootX:p.rootX+200), p.rootY+40);
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > 0 && !e.hitRect.isEmpty() && e.nowSpriteId != stClinched && tmpRect.includedPos(e.rootX, e.rootY)){
eTemp.add(e);
}
}
if(j == 0) { ec0 = eTemp.count;} else { ec1 = eTemp.count;}
}
var d = (ec0 < ec1);
//dm(ec0 + " , " + ec1 + ((d)?" →":" ←"));
if(p.checkMP(50, false) && eTemp.count>5){
// Exフォースジャベリン
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "333 EXフォースジャベリン " + ((j==0)?"←":"→") + " 対象数:" + eTemp.count);
setCommand(p, stSpecial5, d);
return;
}
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "333 ヘルダイブボマー検討 " + " 対象数:" + eTemp.count);
var ee = void;
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
if(e.HP > 0 && e.nowSpriteId == stDamage2 && e.pursueCount < 4 && !e.hitRect.isEmpty() && e.targetPlayer === p){
ee = e;
break;
}
}
if(sf.adjEnableNewArts && attackWait == 0 && p.checkMP(10, false) && (ee !== void || eTemp.count>0)){
if(ee === void) ee = enemies[nearestEnemyIndex];
if(ee === void )break;
//dm("11 " + p.rootX + " / " + ee.rootX + " / " + " / " + ((p.rootX < ee.rootX)?" →":" ←"));
//bao.enemyList();
if(ee.pursueCount < 4 && Math.abs(Math.abs(p.rootX - ee.rootX) - (p.altitude - p.fAltitude)) < 30){
// ヘルダイブボマー
setCommand(p, stSpecial6, (p.rootX < ee.rootX));
return;
}
}
}
if(agr && !existAvoid && sf.adjEnableNewArts && (p.enableMove || p.enableCommand || p.otherState=='enablespecial5') && p.checkMP(10, false)){
var tmpRect = new Rect2(p.rootX-200, p.rootY-25, p.rootX+200, p.rootY+25);
var e = enemies[nearestEnemyIndex];
if(e === void) break;
if(e.HP > 0 && e.hitRect.height == 1 && e.pursueCount < 4 && tmpRect.includedPos(e.rootX, e.rootY)){
if(Math.abs(p.rootX - e.rootX) < 30){
//dm("30 " + p.rootX + " / " + e.rootX + " / " + ((p.inverse)?" →":" ←"));
setCommand(p, stSpecial6);
return;
}else{
//dm("33 " + p.rootX + " / " + e.rootX + " / " + ((p.rootX < e.rootX)?" →":" ←"));
//bao.enemyList();
setCommand(p, stSpecial6, (p.rootX < e.rootX));
return;
}
}
// var ee = void;
// for(var i=0; i<enemies.count; i++){
// var e = enemies[i];
// if(e.HP > 0 && e.hitRect.height == 1 && e.targetPlayer === p && tmpRect.includedPos(e.rootX, e.rootY)){
// ee = e;
// }
// }
//
// if(ee !== void){
////dm("44 " + p.rootX + " / " + ee.rootX + " / " + ((p.rootX < ee.rootX)?" →":" ←"));
////bao.enemyList();
// setCommand(p, stSpecial6, (p.rootX < ee.rootX));
// return;
// }
}
break;
}
}
// クリンチ中
if(p.nowSpriteId >= stClinchAttack1 && p.nowSpriteId <= stClinchAttack3) return;
if(p.nowSpriteId == stClinching || p.nowSpriteId == stBackClinch){
if(p.clinchEnemy === void){
p.loadSprite(stStanding);
return;
}
if(f.stage == 5 && p.clinchEnemy.kind == 'レヴィエラ'){
// 偽レヴィエラの場合突き放すstHoldingとコマンドは同じ
setCommand(p, stHolding);
return;
}
if(p.nowSpriteId == stClinching && p.inverse == p.clinchEnemy.inverse) p.inverse = !p.inverse;
if(p.nowSpriteId == stBackClinch && p.inverse != p.clinchEnemy.inverse) p.inverse = !p.inverse;
if(prob(5) && !leaveItMode && !ege){
if(p.clinchEnemy.HP > 300 && p.checkMP(100, false)){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "4001 行動検討4-1");
switch (p.chara){
case chrChiffon:
if(p.nowSpriteId == stClinching){
// シフォンインフェルノ
setCommand(p, stSpecial2);
return;
}
case chrChocolat:
switch (p.nowSpriteId){
case stClinching:
if(!existAvoid && !p.clinchEnemy.isBoss && (nearEnemiesCount < 3 || intrandom(0,1)==0)){
// 回り込み
pIn.set(keyJump);
return;
}else{
// ショコラコレダー
setCommand(p, stSpecial3);
return;
}
return;
case stBackClinch:
// ブリザーディックダウナー
setCommand(p, stSpecial4);
return;
}
}
}
}
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "4002 行動検討4-2");
if(prob(5) && p.attackIndex < p.clinchAttackList.count-1){
// 通常クリンチ攻撃
pIn.set(keyAttack);
return;
}else{
// 投げる
if(p.rootX < 100){
// 画面左端にいる
if(p.nowSpriteId==stClinching && p.inverse){
// 右を向いてクリンチ中
pIn.set(keyJump);
return;
}
if(p.nowSpriteId==stClinching && !p.inverse){
// 左を向いてクリンチ中
pIn.direction = (p.inverse)? dLeft : dRight;
pIn.set(keyAttack);
return;
}
}
if(p.rootX > baoIWidth-100){
// 画面右端にいる
if(p.nowSpriteId==stClinching && !p.inverse){
// 左を向いてクリンチ中
pIn.set(keyJump);
return;
}
if(p.nowSpriteId==stClinching && p.inverse){
// 右を向いてクリンチ中
pIn.direction = (p.inverse)? dLeft : dRight;
pIn.set(keyAttack);
return;
}
}
if(nearEnemiesCount < 3 && !p.clinchEnemy.isBoss && intrandom(0,1)==0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "stGoAround");
pIn.set(keyJump);
}else{
pIn.direction = (p.inverse)? dLeft : dRight;
pIn.set(keyAttack);
}
}
return;
}
// アイテムがあれば取りに行く
if(p.HP < p.maxHP * 0.5) {
tryGetItem(p, 'item01', 'HP', 1);
if(nowTryingGetItem){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "アイテム取りたい2!!!");
}
};
existObjDestruct = false;
var dMin2 = 999999999;
for(var i=0; i<pOwner.objects.count; i++){
var o = pOwner.objects[i];
// 破壊すべきオブジェクトがあるかどうか
switch(o.type){
case objDestruct:
// 優先破壊対象
if(!o.hitRect.isEmpty()){
existObjDestruct = true;
enemies.add(o);
var d = getDistance(p, o);
if(d < dMin2){
dMin2 = d;
nearestEnemyIndex = enemies.count - 1;
}
}
break;
case objDestructible:
enemies.add(o);
if(enemies.count == 1){
dMin = getDistance(p, o);
nearestEnemyIndex = 0;
}else{
var d = getDistance(p, o);
if(d < dMin){
dMin = d;
nearestEnemyIndex = enemies.count - 1;
}
}
}
}
if(dMin2 < 999999999){
dMin = dMin2;
}
//if(enemies.count>0)dm("nearestEnemy : " + enemies[nearestEnemyIndex].kind + " / " + enemies[nearestEnemyIndex].layer.asd);
// ユーザー操作キャラがもっと右ないし左へ進もうとしている
if(p !== nsp && p.enableMove){
if(((nsp.rootX < sl.scrollLineL && sl.dispLeft > 0 ) || (nsp.rootX > sl.scrollLineR && sl.dispLeft + baoIWidth < sl.scrollLimit)) && (nsp.nowSpriteId == stWalk || nsp.nowSpriteId == stDash)){
//dm("p.input.inputLeft : " + p.input.inputLeft + " / p.input.inputRight ; " + p.input.inputRight + " / nsp.input.inputLeft : " + nsp.input.inputLeft + " / nsp.input.inputRight ; " + nsp.input.inputRight);
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "5001 行動検討5");
if(!ege && p.nowSpriteId != stDash && (nsp.nowSpriteId == stDash || Math.abs(p.rootX-nsp.rootX) > 120) && ((nsp.input.inputLeft && nsp.rootX < p.rootX) || (nsp.input.inputRight && p.rootX < nsp.rootX))){
pIn.command[cmdDash] = true;
dashFlag = true;
}
if(nsp.input.inputLeft){
if(lastWalkDirection == dRight && walkCount > 0){
if(p.nowSpriteId == stDash) p.loadSprite(stWalk);
}else{
lastWalkDirection = pIn.direction = dLeft;
walkCount = intrandom(10,15);
}
}
if(nsp.input.inputRight){
if(lastWalkDirection == dLeft && walkCount > 0){
if(p.nowSpriteId == stDash) p.loadSprite(stWalk);
}else{
lastWalkDirection = pIn.direction = dRight;
walkCount = intrandom(10,15);
}
}
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "901 ユーザー操作キャラに合わせて移動");
return;
}
}
// こちらの攻撃があたるか
var tmpR = new Rect2(p.rootX-200, p.rootY-50, p.rootX+200, p.rootY+50);
if(nowAttack == p.nowSpriteId){
commandExecFlag = true;
}
var oPlayerNowTryingGetItem = false;
if(oPlayer !== void && oPlayer.pc.nowTryingGetItem) oPlayerNowTryingGetItem = true;
if((p.enableAttack || p.enableCommand) && !oPlayerNowTryingGetItem && !nowTryingGetItem && !inAvoidArea){
// 技が出せる状態である
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "6001 行動検討6-1");
// セットした技がまだ反映されてない場合もう一回
if(nowAttack > stExtasy && !commandExecFlag){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ "));
//tdm(pOwner.tickCount + ":" + p.nowSpriteId);
//tdm(pOwner.tickCount + ":" + "430 技を再セット now:" + global.st(p.nowSpriteId) + " → ");
//tdm(pOwner.tickCount + ":" + st(nowAttack));
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "430 技を再セット now:" + global.st(p.nowSpriteId) + " → " + st(nowAttack));
setCommand(p, nowAttack);
commandExecFlag = true;
return;
}
if(attackWait == 0 && enemies[nearestEnemyIndex] !== void){
switch(p.chara){
case chrChiffon:
// シフォンがジャンプしているとき
switch (p.nowSpriteId){
case stVerticalJump:
case stForwardJump:
case stDashJump:
var e = enemies[nearestEnemyIndex];
if(e.kind == "ジャイアントスクイッド" && getDistance(p, e) < 19600 && Math.abs(e.rootY-p.rootY) < 11){
pIn.set(keyAttack);
return;
}else if(dMin < 2500 && Math.abs(e.rootY-p.rootY) < 11){
if(e.sprites[stGuard] !== void){
pIn.direction = dDown;
}
pIn.set(keyAttack);
return;
}else{
var inv = p.inverse;
var flag = false;
for(var i=0; i<enemies.count; i++){
var e = enemies[i];
inv = (e.rootX < p.rootX)? false: true;
// if((e.kind == "オルトロス" || e.kind == "オーガ兵" || e.kind == "ベイゼル" || e.kind == "触手基部" || e.kind == "レヴィエラ" || e.kind == "エクセルショコラ" || e.kind == "エルゴネア") && Math.abs(e.rootX - p.rootX) > 100 && Math.abs(e.rootY - p.rootY) < 60){
if((e.kind == "オルトロス" || e.kind == "オーガ兵" || e.kind == "ベイゼル" || e.kind == "触手基部" || e.kind == "レヴィエラ" || e.kind == "エクセルショコラ" || e.kind == "エルゴネア") && Math.abs(e.rootX - p.rootX) > 40){
flag = true;
break;
}
}
if(flag && !existAvoid){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "431 stCommand3");
setCommand(p, stCommand3, inv);
return;
}else{
if(intrandom(0,3)==1){
setCommand(p, stCommand2, inv);
return;
}else{
setCommand(p, stAttack1);
return;
}
}
}
}
break;
case chrChocolat:
// ショコラがジャンプしているとき
switch (p.nowSpriteId){
case stVerticalJump:
case stForwardJump:
case stDashJump:
var e = enemies[nearestEnemyIndex];
if(e.kind == "ジャイアントスクイッド" && getDistance(p, e) < 19600 && Math.abs(e.rootY-p.rootY) < 11){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "251 ジャンプキック");
pIn.set(keyAttack);
return;
}else if(dMin < 10000 && Math.abs(e.rootY-p.rootY) < 11){
if(e.sprites[stGuard] !== void){
pIn.direction = dDown;
}
}
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "252 ジャンプキック");
pIn.set(keyAttack);
return;
}
}
}
if(p.nowSpriteId == stStanding) nowAttack = 0;
if(attackWait == 0 && (dMin < 12100 || nowAttack >= stAttack1)){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "6002 行動検討6-2");
// 技を選択
for(var j=0; j<enemies.count ;j++){
var e = enemies[j];
var dx = Math.abs(e.rootX-p.rootX);
var dy = Math.abs(e.rootY-p.rootY);
if(e.objectClass == clEnemy){
if(prob()){
if(e.HP <= 0) continue;
if(getDistance(p, e) < 6400){
if((e.nowSpriteId == stStandUp || e.invincibleCount>0) && e.kind != "魔影蝶"){
// 近くに無敵状態の敵がいる
nowAttack = 0;
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "202 " + j + "番目の敵 " + e.kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 80, 40);
// doRoll();
return;
}
if(((e.damageCount > 2 && e.damageCountLimit < 8) || (e.guardCount > e.damageCountLimit)) && e.nowSpriteId == stGuard && nowAttack != stAttack1){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "202 " + j + "番目の敵 " + e.kind + " から強制反撃回避");
// 強制反撃を喰らいそうなら
nowAttack = 0;
doRoll();
return;
}
}
}
if(nsp !== void && nsp.nowSpriteId >= stSpecial1 && e.targetPlayer === nsp && e.nowSpriteId >= stDamage1 && e.nowSpriteId <= stDown) continue;
if(e.nowSpriteId == stDamage2 || (e.nowSpriteId >= stThrown1 && e.nowSpriteId <= stThrown5) || e.nowSpriteId == stStandUp || e.nowSpriteId == stClinched || e.nowSpriteId == stClinchedDamage){
if(((int(e.altitude)-e.fAltitude) == 0 || e.HP == 0)) continue;
// if(e.targetPlayer === nsp) continue;
}
if(e.isBoss && e.HP < e.maxHP * 0.5 && !considerAggressiveness2(0.25)) break;
if(e.kind == "魔影蝶"){
if(e.HP < e.maxHP * 0.3 && nsp !== void && nsp !== p && !sf.adjAIAssist && !prob() && !considerAggressiveness()) continue;
if(e.mode == 1) continue;
}
}
if(p.attackListForPc[nowAttack] === void) nowAttack = 0;
if(nsp !== void && nsp.state < stateDamage){
// バディがダメージをくらっていない
if(leaveItMode) break;
// if(!prob()) break;
}
if(leaveItMode){
// 任せてモードの時
if(sf.adjEnableLeaveItMode2) continue;
if(getDistance(p, e) > 1600) continue;
}
// イきそうな場合は技を出さない
if(ege && ((player.extasyGauge.value / player.extasyGauge.maxValue)>0.8 || p.comboCount>10)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "500 性感ゲージがあるので攻撃をセーブ(ゲージ : " + int((player.extasyGauge.value / player.extasyGauge.maxValue)*100) + " %)");
continue;
}
for(var i=0; i<p.attackListForPc[nowAttack].count; i++){
if(!prob()) continue;
if(!agr) continue;
// 技が敵に当たるかどうか
var at = p.attackListForPc[nowAttack][i];
if(at === void) break;
// AvoidPointがある場合は派手な攻撃をしない
if(existAvoid){
if(p.chara == chrChiffon && at == stAttack5) continue;
if(p.chara == chrChiffon && at > stAttack7) continue;
if(p.chara == chrChocolat && at > stAttack3) continue;
}
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "501 " + e.kind + " へ攻撃が当たるか判定 " + getConstFromSpriteId(at));
if(!tmpR.includedPos(e.rootX, e.rootY)) continue;
switch (p.chara){
case chrChiffon:
switch (at){
case stAttack7:
//dm("1111");
if (intrandom(0,10) != 0 || dx>100 || dy>32) continue;
//dm("2222");
break;
case stCommand3:
if(p.nowSpriteId == stCommand2 && (p.rootX == p.movableRect.left || p.rootX == p.movableRect.right)) continue;
break;
case stSpecial2:
if(e.objectClass == clObject) continue;
var m = true;
if(e.maxMP != 0){
m = e.MP/e.maxMP;
m = (m > 0.2 && m < 0.3);
}
if(e.HP < 200 || !p.checkMP(100, false) || (!m && p.nowSpriteId!=stDamage1 && p.nowSpriteId!=stDamage2)) continue;
if( p.inverse && (e.rootX < p.rootX-20)) continue;
if(!p.inverse && (e.rootX > p.rootX+20)) continue;
break;
case stSpecial3:
if(e.objectClass == clObject) continue;
if(e.HP < 200 || eTemp.count < 6) continue;
if(!p.checkMP(100, false)) continue;
setCommand(p, stSpecial3);
return;
}
break;
case chrChocolat:
switch (at){
case stHolding:
if(e.objectClass == clObject) continue;
if(!e.enableClinched) continue;
break;
case stSpecial5:
if(e.objectClass == clObject) continue;
if (intrandom(0,10) != 0 || e.HP < 120) continue;
break;
}
break;
}
// enableFlip==true のとき、敵の方へ振り向くことができる
var enableFlip;
switch (p.chara){
case chrChiffon:
enableFlip = (nowAttack == 0 || at == stAttack1 || at == stCommand3 || at == stSpecial2 || at == stSpecial3);
break;
case chrChocolat:
enableFlip = (nowAttack == 0 || at == stAttack1 || at == stSpecial5);
break;
}
// 個別の設定
if(e.kind == "ジャイアントスクイッド" && pOwner.enemies[0].HP > 0){
if(e.nowSpriteId == stSpecial1){
doRoll();
}else{
if(getDistance(p, e) < 16900 && Math.abs(e.rootY-p.rootY) < 11 && p.altitude == 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "510 " + e.kind + " にジャンプキック ");
pIn.direction = dRight;
setCommand(p, stJumpAttack2, true);
return;
}
}
}
if(e.kind == "オーガ兵" && pOwner.enemies[0].HP > 0 && nowAttack == 0){
if(getDistance(p, e) > 14400 && Math.abs(e.rootY-p.rootY) < 25 && p.altitude == 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "510 " + e.kind + " にジャンプキック ");
setCommand(p, stJumpAttack2, (e.rootX < p.rootX)? false: true);
return;
}else if(getDistance(p, e) < 1600 && p.checkMP(50, false) && Math.abs(e.rootY-p.rootY) < 10 && p.altitude == 0 && e.altitude == 0){
setCommand(p, stSpecial1);
return;
// }else if(oPlayer === void || (oPlayer.nowSpriteId != stClinched && oPlayer.nowSpriteId != stClinchedStruggle)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "510 " + e.kind + " から距離を取る");
// if(e.rootX < pOwner.internalWidth/2){
// // 相手が左側
// setDirection(p, e.rootX + 150, e.rootY, 36);
// }else{
// setDirection(p, e.rootX - 150, e.rootY, 36);
// }
// return;
}
}
if(e.kind == "エクセルショコラ" && p.enableMove){
if(p.altitude == 0 &&getDistance(p, e) < 22500 && Math.abs(e.rootY-p.rootY) < 10){
setCommand(p, stAttack5, (e.rootX < p.rootX)? false: true);
return;
}
}
if(f.stage == 5 && e.kind == 'レヴィエラ' && prob(10)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "971 " + e.kind + " ローリング");
// フェイクレヴィエラ
if(p.altitude == 0 &&getDistance(p, e) < 14400 && Math.abs(e.rootY-p.rootY) < 20){
doRoll();
return;
}
continue;
}
if(f.stage != 5 && e.kind == 'レヴィエラ'){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "987 " + e.kind + " 攻撃検討");
if(p.altitude == 0 && Math.abs(e.rootY-p.rootY) < 10){
setCommand(p, stAttack5, (e.rootX < p.rootX)? false: true);
return;
}
}
// 技を出すかどうか判定
var a = checkAttackSub(p, at, e, enableFlip);
var b = ((dx < (nowAttack<=stAttack2)?80:180) && (enableFlip || (p.inverse && (p.rootX < e.rootX-30)) || (!p.inverse && (e.rootX < p.rootX-30))) && (dy < 15));
// var r = (intrandom(0, 10) == 0);
//dm("a : " + a + " / b : " + b + " / r : %d / nowAttack : %02X / at : %02X / Math.abs(e.rootX - p.rootX) : %d".sprintf(r,nowAttack,at,(dx)));
// if(a || (b && (nowAttack > 0) && !(e.nowSpriteId==stDamage2 && (e.altitude-e.fAltitude)==0) )){
if(a || (b && (nowAttack > 0))){
if(p.nowSpriteId == stDash) p.nowSpriteId = stStanding;
if(enableFlip) p.inverse = (e.rootX < p.rootX)? false : true;
nowAttack = at;
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "502 " + e.kind + " を攻撃 " + getConstFromSpriteId(nowAttack));
//dm("■" + p.chara + " / 1111 nowAttack : " + nowAttack);
setCommand(p, nowAttack, p.inverse);
return;
}
if(p.attackHitFlag && (nowAttack <= stAttack9 || nowAttack >= stCommand1)){
nowAttack = at;
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "503 " + e.kind + " を攻撃 " + getConstFromSpriteId(nowAttack));
//dm("■" + p.chara + " / 2222 nowAttack : " + nowAttack);
setCommand(p, nowAttack);
return;
}
}
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "580 攻撃を保留");
}
}else{
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "6003 行動検討6-3");
if(p.chara == chrChiffon){
// ダッシュアタック中のY軸微調整(あんま意味無いかも)
if(p.nowSpriteId == stDashAttack || p.nowSpriteId == stDashAttack2){
var e = enemies[nearestEnemyIndex];
if(e !== void && (Math.abs(e.rootX - p.rootX) < 120)){
if(p.rootY > e.rootY){
pIn.direction = dUp;
}else{
pIn.direction = dDown;
}
}
}
}
}
}
if(!p.enableMove) return;
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "6004 行動検討6-4");
if(leaveItMode && sf.adjEnableLeaveItMode2){
// 任せてモードで、抱き付かれ時救助無しの場合
// ここでは何もしない
}else{
if(oPlayer !== void && (oPlayer.nowSpriteId == stClinched || oPlayer.nowSpriteId == stClinchedStruggle)){
var e = oPlayer.clinchedBy;
// 待機指示解除する??
// leaveItMode = false;
// bao.informLayer.resetFace2();
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "559 相方がクリンチされてる!!");
if(Math.abs(p.rootX - oPlayer.rootX) < 100 && p.nowSpriteId == stDash) p.loadSprite(stWalk);
// 相方がクリンチされてたら助ける
if((Math.abs(p.rootY - oPlayer.rootY) < 10) && getDistance(p, oPlayer) < 1600){
setCommand(p, p.attackListForPc[0][0], !(e.rootX < p.rootX));
return;
}else{
if(Math.abs(p.rootX - oPlayer.rootX) > 150) pIn.command[cmdDash] = true;
setDirection(p, oPlayer.rootX, oPlayer.rootY);
return;
}
}
}
// レスキューモードの時
if(oPlayer !== void && oPlayer.HP <= 0 && tf.inRescueMode && dMin > 6400 && (!bao.isExistBoss || p.HP / p.maxHP > 0.2)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "レスキューモード!!");
if(p.nowNearbyOtherPlayer(16)){
//
if(p.nowSpriteId == stDash) p.loadSprite(stStanding);
pIn.history = [];
pIn.set(keyAttack);
return;
}else{
setDirection(p, oPlayer.rootX, oPlayer.rootY);
}
}
// 画面外に出ようとしてるとき
if( ((lastWalkDirection==4||pIn.direction==4) && p.rootX==p.movableRect.left) ||
((lastWalkDirection==6||pIn.direction==6) && p.rootX==p.movableRect.right) ||
((lastWalkDirection==8||pIn.direction==8) && p.rootY==p.movableRect.top) ||
((lastWalkDirection==2||pIn.direction==2) && p.rootY==p.movableRect.bottom)){
walkCount = 10;
pIn.direction = 0;
lastWalkDirection = 0;
}
// 優先対象
switch(f.stage){
case 2:
// ステージ2
// ボスがいれば優先攻撃
if(bao.enemies[0] !== void && bao.enemies[0].kind == "サイコウィザード"){
nearestEnemyIndex = 0;
break;
}
//モブを優先攻撃
var fl = false;
if(p === nsp || oPlayer !== void){
for(var i=0; i<bao.enemies.count; i++){
var e = bao.enemies[i];
if(e.kind == "モブ" && e.HP > 0 && e.rootX < 200){
fl = true;
nearestEnemyIndex = i;
break;
}
}
if(!fl){
for(var i=0; i<bao.enemies.count; i++){
var e = bao.enemies[i];
if(e.kind == "モブ" && e.HP > 0 && e.rootX < baoIWidth){
nearestEnemyIndex = i;
break;
}
}
}
}
break;
case 3:
// ステージ3で魔影蝶への攻撃を優先
for(var i=0; i<bao.enemies.count; i++){
var e = enemies[i];
if(e !== void && e.kind == "魔影蝶" && e.mode==0){
nearestEnemyIndex = i;
break;
}
}
}
// 敵へ近づく
var e = enemies[nearestEnemyIndex];
var eg = player.extasyGauge;
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "7001 行動検討7-1");
var oPlayerStateDamage = true;
if(oPlayer !== void){
if(oPlayer.state == stateDamage) oPlayerStateDamage = true;
}else{
oPlayerStateDamage = false;
}
if(!oPlayerNowTryingGetItem && !nowTryingGetItem && !inAvoidArea){
// if(e !== void && e.objectClass == clEnemy && e.HP > 0 && e.rootY >= sl.topLine && ((!leaveItMode && (!ege || (eg.value / eg.maxValue)<0.8)) || oPlayerStateDamage)){
if(e !== void && e.objectClass == clEnemy && e.HP > 0 && e.rootY >= sl.topLine && (!leaveItMode || oPlayerStateDamage)){
if(walkCount == 0){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "7002 行動検討7-2");
nowAttack = 0;
var moveFlag = true;
if(p !== nsp){
if(oPlayer.pc.considerAggressiveness() && getDistance(oPlayer, e) < dMin && oPlayer.nowSpriteId != stClinched && oPlayer.nowSpriteId != stClinchedStruggle && oPlayer.HP >= oPlayer.maxHP*0.4){
if(!prob()) moveFlag = false;
}
if(oPlayer.HP >= oPlayer.maxHP*0.4 && e.isBoss && e.HP < e.maxHP * 0.7 && !considerAggressiveness2(0.25)) moveFlag = false;
}
if(oPlayerStateDamage) moveFlag = true;
if(e.kind == "魔影蝶") moveFlag = true;
if(!moveFlag || (e.rootX < -50 && sl.scrollLineL < p.movableRect.left)
|| (e.rootX > baoIWidth+50 && ((sl.scrollLineR > p.movableRect.right)|| (sl.dispLeft + baoIWidth == sl.scrollLimit)))
|| !considerAggressiveness()){
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "7003 行動検討7-3");
// 敵が画面内にいない または 一番近い敵に対してもっと近いヒロインがいる またはユーザー操作キャラがあまり敵を倒していない
if(prob() && dMin < 6400 && !ege){
doRoll();
return;
}else{
if(e.isBoss){
if(f.stage == 3){
setDirection(p, 80, e.rootY-40, 15*15);
walkCount = 5;
}else{
takeDistance(p, e);
}
}else{
if(enemies.count > 1){
var neiTmp = nearestEnemyIndex;
var trg = -1;
for(var i=0; i<bao.enemies.count; i++){
if(neiTmp == i) continue;
if(bao.enemies[i].rootX < -50 || bao.enemies[i].rootX > baoIWidth+50) continue;
trg = i;
break;
}
if(trg >= 0){
nearestEnemyIndex = trg;
if(enemies[nearestEnemyIndex] !== void && enemies[nearestEnemyIndex].HP > 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "300 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " の近くへ");
setDirection(p, enemies[nearestEnemyIndex].rootX, enemies[nearestEnemyIndex].rootY);
}
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "301 画面中央よりへ");
if(p.rootX < 120 || p.rootX > baoIWidth-120) setDirection(p, baoIWidth / 2, 220, 14400);
}
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "302 画面中央よりへ");
if(p.rootX < 120 || p.rootX > baoIWidth-120) setDirection(p, baoIWidth / 2, 220, 14400);
}
}
return;
}
}else{
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "7004 行動検討7-4");
if(e.enableClinched || (e.attackList.count==0 && e.comboAttackList.count==0)){
// クリンチ出来る・または攻撃してこない敵
switch(e.nowSpriteId){
case stAttack1:
case stAttack2:
case stDamage2:
case stDamage3:
case stThrown1:
case stThrown2:
case stThrown3:
case stThrown4:
case stThrown5:
case stThrown6:
case stClinched:
case stClinchedDamage:
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "203 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 150, 40);
break;
case stStandUp:
case stSpecial1:
case stSpecial2:
if(dMin < 6400){
doRoll();
return;
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "204 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 100, 40);
}
break;
case stDamage1:
if(nsp !== void && nsp.nowSpriteId >= stSpecial1 && e.targetPlayer === nsp){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "205 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 100, 0);
return;
}
default:
// 近づく
if(dMin < 6400 && attackWait == 0 && (prob() || (oPlayer !== void && oPlayer.nowSpriteId == stClinched) || (e.kind == "魔影蝶" && e.mode == 0))){
for(var i=0; i<p.attackListForPc[0].count; i++){
var a = p.attackListForPc[0][i];
if(checkAttackSub(p, a, e, true)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "220 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " に攻撃 : " + getConstFromSpriteId(a));
setCommand(p, a, !(e.rootX < p.rootX));
return;
}
}
}else{
var tmpR2 = new Rect2(p.rootX-400, p.rootY-17, p.rootX+400, p.rootY+17);
if(e.rootX > 20 && e.rootX < baoIWidth-20 && !ege){
if(getDistance(p, e) > 40000 && tmpR2.includedPos(e.rootX, e.rootY) && !existAvoid){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "000 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " へダッシュで近づく");
// ダッシュで近づく
pIn.command[cmdDash] = true;
dashFlag = true;
pIn.direction = lastWalkDirection = (e.rootX < p.rootX)? dLeft : dRight;
walkCount = 10;
return;
}
}else{
if(p === pOwner.nowSelectingPlayer){
if(e.kind == "魔影蝶" && getDistance(p, e) > 6400 && e.rootX+sl.dispLeft<sl.scrollLimit+50){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "001 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " へ近づく");
pIn.command[cmdDash] = true;
dashFlag = true;
setDirection(p, e.rootX, e.rootY);
}else if(p.movableRect.left<p.rootX && e.rootX>sl.scrollLimitLeft-sl.dispLeft-50){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "001 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " へ近づく2");
setDirection(p, e.rootX, e.rootY);
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "002 画面中央へ");
setDirection(p, baoIWidth / 2, 220, 10000);
}
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "002 バディと適切な位置を取る");
setDirection(p, nsp.rootX, nsp.rootY, 19600);
}
return;
}
}
if(e.kind == "エクセルシフォン"){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "003 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 120, 20);
}else if(e.nowSpriteId == stDamage2 || e.nowSpriteId == stStandUp || e.nowSpriteId == stStandUp2 || (e.nowSpriteId >= stThrown1 && e.nowSpriteId <= stThrown11)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "003 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 50, 40);
return;
}else if(p.movableRect.left<p.rootX && p.rootX<p.movableRect.right){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "003 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " へ近づく");
setDirection(p, e.rootX, e.rootY);
return;
}
}
}else{
//dm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "7005 行動検討7-5");
// クリンチ出来ない敵
switch(e.nowSpriteId){
// case stAttack1:
// case stAttack2:
case stDamage2:
case stDamage3:
case stThrown1:
case stThrown2:
case stStandUp:
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "206 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 200, 40);
break;
case stSpecial1:
case stSpecial2:
if(dMin < 6400){
if(e.kind == "エルゴネア" && e.nowSpriteId == stSpecial2){
doWalkAboveOrUnder(p, e, 100, 40);
}else{
doRoll();
return;
}
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "207 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 100, 40);
}
break;
case stDamage1:
setCommand(p, stDashAttack, !(e.rootX < p.rootX));
return;
default:
if(dMin < 6400 && (prob() || oPlayer === void || (oPlayer !== void && oPlayer.state == stateDamage))){
// 敵と近い場合
var flag = false;
if(!e.hitRect.isEmpty()){
var tRect1 = new Rect2(p.rootX-100, p.rootY-2, p.rootX+100, p.rootY+2);
var tRect2 = new Rect2(e.rootX-e.centerPos+e.hitRect.right, e.rootY-e.depth1, e.rootX-e.centerPos+e.hitRect.left, e.rootY+e.depth2);
flag = tRect1.intersects(tRect2);
}
if(flag && (e.damageCount + e.guardCount) < e.damageCountLimit){
for(var i=0; i<p.attackListForPc[nowAttack].count; i++){
var a = p.attackListForPc[nowAttack][i];
if(checkAttackSub(p, a, e, true)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "014 攻撃" + getConstFromSpriteId(a));
setCommand(p, a, !(e.rootX < p.rootX));
return;
}
}
}else if(e.nowSpriteId >= stPreHAttack1 && e.nowSpriteId <= stJumpAttack3){
// ローリングで退避
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "015 ローリング回避");
nowAttack = 0;
doRoll();
return;
}
if(considerAggressiveness()){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "004");
setDirection(p, e.rootX + ((e.rootX < p.rootX)?100:-100), e.rootY);
walkCount = 2;
}else{
if(Math.abs(p.rootY - e.rootY) < 20){
doRoll();
return;
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "005");
setDirection(p, ((e.rootX < baoIWidth)? baoIWidth*2/3 : baoIWidth/3), ((e.rootY < (e.movableRect.top+e.movableRect.bottom)/2)? p.movableRect.bottom-20: p.movableRect.top+20), 1600);
return;
}
}
}else{
// 適度に距離を取る
switch (intrandom(0,4)){
case 0:
if(e.nowSpriteId >= stSpecial1){
takeDistance(p, e);
}else{
if(e.kind == "ジャイアントスクイッド"){
if(e.tentacles[0].isDead && e.tentacles[1].isDead){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "208 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " に近づく");
doWalkAboveOrUnder(p, e, 50, 0);
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "208 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 200, 0);
}
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "208 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " から距離を取る");
doWalkAboveOrUnder(p, e, 50, 0);
}
}
walkCount = 10;
break;
case 1:
if(p.chara == chrChiffon && (p.altitude-p.fAltitude) == 0){
if(dMin > 40000){
pIn.direction = !(e.rootX < p.rootX)? dLeft : dRight;
}else{
pIn.direction = 0;
}
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "209 " + nearestEnemyIndex + "番目の敵 " + enemies[nearestEnemyIndex].kind + " に攻撃 : stCommand3");
setCommand(p, stCommand3, !(e.rootX < p.rootX));
}
break;
default:
pIn.direction = 0;
walkCount = 10;
}
return;
}
}
}
}
}
}else if(e !== void && e.objectClass == clObject && (e.type == objDestruct || e.type == objDestructible)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + " 050 objDestruct or objDestructible " + e);
// 破壊すべきオブジェクト
if(!e.hitRect.isEmpty()){
var tRect1 = new Rect2(p.rootX-100, p.rootY-12, p.rootX+100, p.rootY+12);
var tRect2 = new Rect2(e.rootX-e.centerPos+e.hitRect.right, e.rootY-8, e.rootX-e.centerPos+e.hitRect.left, e.rootY+8);
//dm("p.rootX : " + p.rootX + " , p.rootY : " + p.rootY + " / e.rootX : " + e.rootX + " , e.rootY : " + e.rootY);
//tRect1.dm();
//tRect2.dm();
if(tRect1.intersects(tRect2)){
//dm("intersect !");
nowAttack = 0;
for(var i=0; i<p.attackListForPc[nowAttack].count; i++){
var a = p.attackListForPc[nowAttack][i];
//dm(st(a));
if(existAvoid){
if(p.chara == chrChiffon && a == stAttack5) continue;
if(p.chara == chrChiffon && a > stAttack7) continue;
if(p.chara == chrChocolat && a > stAttack3) continue;
}
if(checkAttackSub(p, a, e, true)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "006 " + "破壊すべきオブジェクト " + enemies[nearestEnemyIndex].kind + " を攻撃");
setCommand(p, a, !(e.rootX < p.rootX));
return;
}
}
}
//dm("????");
if(e.type == objDestruct){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "006 " + "破壊すべきオブジェクト " + enemies[nearestEnemyIndex].kind + " へ近づく");
setDirection(p, e.rootX + ((e.rootX < p.rootX)?30:-30), e.rootY);
nowAttack = 0;
return;
}
}
}
}
//MP持ちの敵
//反撃してくる敵 → 実装、要確認
//攻撃力のあるオブジェクト → 実装、要確認
//爆発するオブジェクト → 実装、要確認
// アイテムがあれば取りに行く
if(oPlayer === void || oPlayer.enableMove){
// 単独行動、または相方が動けるとき
if(enemies.count>0 && enemies[0].objectClass == clEnemy && enemies[0].isBoss){
if(enemies[0].HP>0){
// ボスとの対戦時
if(p.HP < p.maxHP *0.3) tryGetItem(p, 'item01', 'HP', 1);
if(p.MP < p.maxMP *0.3) tryGetItem(p, 'item02', 'MP', 1);
if(p.HP < p.maxHP *0.6 && (oPlayer===void || p.HP < oPlayer.HP)) tryGetItem(p, 'item01', 'HP', 0);
if(p.MP < p.maxMP *0.6 && (oPlayer===void || p.HP < oPlayer.HP)) tryGetItem(p, 'item02', 'MP', 0);
}else{
// ボス死亡時にボーナス狙い
if(p.HP < p.maxHP ) tryGetItem(p, 'item01', 'HP', 2);
if(p.MP < p.maxMP ) tryGetItem(p, 'item02', 'MP', 2);
}
}else{
// ボス対戦時以外
if(p.HP < p.maxHP *0.5) tryGetItem(p, 'item01', 'HP', 1);
if(p.MP < p.maxMP *0.5) tryGetItem(p, 'item02', 'MP', 1);
if(p.HP < p.maxHP *0.7 && (oPlayer===void || p.HP < oPlayer.HP)) tryGetItem(p, 'item01', 'HP', 0);
if(p.MP < p.maxMP *0.7 && (oPlayer===void || p.HP < oPlayer.HP)) tryGetItem(p, 'item02', 'MP', 0);
if(p.HP < p.maxHP){
for(var i=0; i<pOwner.objects.count; i++){
var o = pOwner.objects[i];
if(o.type == objItem2){
tryGetItem(p, 'item01', 'HP', 1);
}
}
}
if(p.MP < p.maxMP){
for(var i=0; i<pOwner.objects.count; i++){
var o = pOwner.objects[i];
if(o.type == objItem2){
tryGetItem(p, 'item02', 'MP', 1);
}
}
}
}
}
if(nowTryingGetItem){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "アイテム取りたい!!!");
return;
}
if(ege && (eg.value / eg.maxValue)>0.8){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "性感ゲージが高い!!");
// 性感ゲージが高かったらじっとしてる
walkCount = 20;
lastWalkDirection = 0;
pIn.direction = 0;
}else{
// 高さのある障害物がある
if(sl.reverseDirection){
var dx = p.rootX - 25;
if(p.getAltitude(dx, p.rootY) > 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "007 高さのある障害物があるので画面中央よりへ");
if(f.stage == 2){
// 電車内の壁
setDirection(p, baoIWidth - (baoIWidth / 1.5), 220);
return;
}else if(f.stage == 4){
// 壁
setDirection(p, baoIWidth / 2.5, 220);
return;
}
}
}else{
var dx = p.rootX + 25;
if(p.getAltitude(dx, p.rootY) > 0){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "008 高さのある障害物があるので画面中央よりへ");
if(f.stage == 2){
// 電車内の壁
setDirection(p, baoIWidth / 1.5, 220);
return;
}else if(f.stage == 4){
// 壁
setDirection(p, baoIWidth / 2.5, 220);
return;
}else{
setDirection(p, baoIWidth / 2, 220);
return;
}
}
}
}
// 歩きカウンタ
if(walkCount > 0 && !((p.rootX == p.movableRect.left && pIn.direction == 4) || (p.rootX == p.movableRect.right && pIn.direction == 6))){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "歩き中 方向 : " + lastWalkDirection + " / walkCount : " + walkCount);
pIn.direction = lastWalkDirection;
if(dashFlag && !ege){
dashFlag = false;
pIn.command[cmdDash] = true;
}
//dm("!! " + pIn.direction + " / " + walkCount);
return;
// }else{
//// if(!prob(8)){
//// lastWalkDirection = pIn.direction = intrandom(0, 9);
//// walkCount = intrandom(5, 20);
//// }else{
// walkCount = 10;
// pIn.direction = 0;
// lastWalkDirection = 0;
//// }
}
switch(f.stage){
case 2:
// ステージ2用の処理
if(bao.enemies.count == 0){
if(walkCount > 0) return;
if(p.rootY < 215){
setDirection(p, p.rootX, 220);
return;
}else if(p.rootY > 225){
setDirection(p, baoIWidth / 1.5, 220);
return;
}else{
setDirection(p, baoIWidth, 220);
return;
}
}
break;
case 4:
// ステージ4用の処理
if(enemyCount() == 0 && bao.goIndicatorStorage == "" && !oPlayer.pc.nowTryingGetItem){
if(sl.dispLeft + p.rootX > 3750){
walkCount = 10;
pIn.direction = 0;
lastWalkDirection = 0;
return;
}else if(p.rootY < 220){
setDirection(p, p.rootX, 220);
return;
}
}
break;
}
if(enemyCount() == 0 && ((!sl.reverseDirection && sl.scrollLineR < p.movableRect.right) || (sl.reverseDirection && sl.scrollLineL > p.movableRect.left))
&& ((!sl.reverseDirection && sl.dispLeft + baoIWidth < sl.scrollLimit) || (sl.reverseDirection && sl.dispLeft > 0))){
// 敵がいない かつ 右へ進める(左方向進行ステージでは左へ)
if(p === nsp){
if(oPlayer === void){
if(bao.encounterBoss == false){
// 敵がいなければ進む
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "単独進む!");
if(p.nowSpriteId != stDash && !ege){
dashFlag = true;
pIn.command[cmdDash] = true;
}
lastWalkDirection = pIn.direction = (sl.reverseDirection)? dLeft: dRight;
}
}else if(!oPlayer.pc.nowTryingGetItem){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "進む!");
if(p.nowSpriteId != stDash && !ege){
dashFlag = true;
pIn.command[cmdDash] = true;
oPlayer.pc.walkCount = 0;
}
lastWalkDirection = pIn.direction = (sl.reverseDirection)? dLeft: dRight;
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "nowTryingGetItemされてる");
// 相方がアイテムを取りたい様なら合わせる
if(oPlayer.nowSpriteId == stDash && !ege && p.nowSpriteId != stDash){
dashFlag = true;
pIn.command[cmdDash] = true;
}
// if(oPlayer.input.inputLeft) lastWalkDirection = pIn.direction = dLeft;
// if(oPlayer.input.inputRight) lastWalkDirection = pIn.direction = dRight;
setDirection(p, oPlayer.rootX, p.rootY, 14400);
}
return;
}else{
// ユーザー操作キャラに合わせる
// if(Math.abs(nsp.rootX - p.rootX) > 120){
if((p.rootX < nsp.rootX-150 && nsp.lastMovingTable.x > 0) || (nsp.rootX < p.rootX-150 && nsp.lastMovingTable.x < 0)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "009 ここ疑問……lastMovingTableだけじゃなくてinverseも見ないとダメなのでは");
if(p.nowSpriteId != stDash && nsp.nowSpriteId == stDash && !ege){
dashFlag = true;
pIn.command[cmdDash] = true;
}else{
walkCount = intrandom(15,45);
}
if(nsp.input.inputLeft) pIn.direction = dLeft;
if(nsp.input.inputRight) pIn.direction = dRight;
if(lastWalkDirection != pIn.direction && p.nowSpriteId == stDash){
p.loadSprite(stWalk);
lastWalkDirection = pIn.direction;
}
return;
}else{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "010 バディと適切な位置を取る");
if(getDistance(p, nsp) > 19600) setDirection(p, nsp.rootX, nsp.rootY, 19600);
if(getDistance(p, nsp) < 1600) takeDistance2(p, nsp);
return;
}
}
}else{
if(p !== nsp){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "011 バディと適切な位置を取る2");
if(getDistance(p, nsp) > 19600) setDirection(p, nsp.rootX, nsp.rootY, 19600);
if(getDistance(p, nsp) < 1600) takeDistance2(p, nsp);
return;
}
}
if(oPlayer !== void && oPlayer.pc.nowTryingGetItem){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "nowTryingGetItemされてる " + getConstFromSpriteId(oPlayer.nowSpriteId));
if(oPlayer.pc.targetItem !== void && isvalid oPlayer.pc.targetItem && oPlayer.pc.targetItem.rootX > 0 && oPlayer.pc.targetItem.rootX < bao.internalWidth){
if(p.nowSpriteId == stDash) p.loadSprite(stStanding);
setDirection(p, oPlayer.pc.targetItem.rootX, oPlayer.pc.targetItem.rootY, 14400);
return;
}else{
// 相方がアイテムを取りたい様なら合わせる
if(oPlayer.nowSpriteId == stDash && !ege && p.nowSpriteId != stDash){
dashFlag = true;
pIn.command[cmdDash] = true;
}
setDirection(p, oPlayer.rootX, p.rootY, 14400);
return;
}
}
if(enemyCount() > 0 && bao.enemies[0].isBoss && bao.enemies[0].rootX > baoIWidth && (!sl.reverseDirection && sl.dispLeft + baoIWidth + 100 >= sl.scrollLimit)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "左に移動");
lastWalkDirection = pIn.direction = dLeft;
}
if(enemies.count > 0 && (p.rootX <= p.movableRect.left+30 || p.rootX >= p.movableRect.right-30)){
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "中央よりに移動");
setDirection(p, baoIWidth / 2, 220, 14400);
}
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "動作を保留(´・ω・`)");
}
property attackWait{
getter(){
var r = int(attackWaitTick - pOwner.tickCount);
if(r < 0) r = 0;
return r;
}
setter(t){
attackWaitTick = pOwner.tickCount + t;
}
}
property walkCount{
getter(){
var r = int(walkCountTick - pOwner.tickCount);
if(r < 0) r = 0;
return r;
}
setter(t){
walkCountTick = pOwner.tickCount + t;
}
}
function doAntiAir(p, target)
{
// 対空技
// p.inverse = (target.rootX < p.rootX)? false : true;
switch (p.chara){
case chrChiffon:
setCommand(p, stCommand2,!(target.rootX < p.rootX));
break;
case chrChocolat:
setCommand(p, stCommand3,!(target.rootX < p.rootX));
break;
}
}
function checkAttackSub(p, id, target, enableFlip=true)
{
// 攻撃が当たるか判定する
try
{
var inverse = p.inverse;
if(enableFlip){
inverse = (target.rootX < p.rootX)? false : true;
}
attackConductor.owner = p;
var asd = p.sprites[id][0];
// dm("asd : " + asd + " / target : " + target);
attackConductor.loadScenario(asd+".asd");
var aca = attackConductor.attackCheckAlgorithm(target, inverse);
if(aca >= 0 && aca < 12) return true;
}
catch(e)
{
throw new Exception("error this : " + this + " / spriteId : " + id + "\n" + e.message);
}
return false;
}
function doRoll()
{
if(pOwner.tickCount - lastRollingTick > 36) lastRollingDirection = 0;
var p = player;
if(p.rootY == pOwner.stageLayer.topLine){
pIn.direction = dDown;
pIn.command[cmdRoll] = true;
}else if(p.rootY == pOwner.stageLayer.bottomLine){
pIn.direction = dUp;
pIn.command[cmdRoll] = true;
}else{
if(lastRollingDirection == dDown){
pIn.direction = dDown;
pIn.command[cmdRoll] = true;
return;
}else if(lastRollingDirection == dUp){
pIn.direction = dUp;
pIn.command[cmdRoll] = true;
return;
}else{
// ローリング先が安全かどうか
var flagUp = true;
var flagDown = true;
if(!existAvoid){
var pRectUp = new Rect2(p.internalLayerLeft, p.internalLayerTop + p.footRect.top - 10 - 40, p.internalLayerLeft + p.layer.asdWidth, p.internalLayerTop + p.footRect.bottom + 10 - 40);
var pRectDown = new Rect2(p.internalLayerLeft, p.internalLayerTop + p.footRect.top - 10 + 40, p.internalLayerLeft + p.layer.asdWidth, p.internalLayerTop + p.footRect.bottom + 10 + 40);
for(var i=0; i<pOwner.enemies.count; i++){
var e = pOwner.enemies[i];
if(e.attackRectBuf[8] !== void){
if(e.attackRectBuf[8].intersects(pRectUp)) flagUp = false;
if(e.attackRectBuf[8].intersects(pRectDown)) flagDown = false;
}
}
for(var i=0; i<pOwner.objects.count; i++){
var o = pOwner.objects[i];
if(o.type == objAttack && o.attackRectBuf[0] !== void){
if(o.attackRectBuf[0].intersects(pRectUp)) flagUp = false;
if(o.attackRectBuf[0].intersects(pRectDown)) flagDown = false;
}
}
}else{
if(getAvoidWeight(p.rootX, p.rootY - 40) < getAvoidWeight(p.rootX, p.rootY + 40)){
flagUp = true;
flagDown = false;
}else{
flagUp = false;
flagDown = true;
}
}
if(flagUp){
if(flagDown){
// 上下どっちでも良さそう
if(p.rootY < (p.movableRect.top + p.movableRect.bottom) / 2){
pIn.direction = dDown;
pIn.command[cmdRoll] = true;
}else{
pIn.direction = dUp;
pIn.command[cmdRoll] = true;
}
}else{
// 下は危険そうなので上へ
pIn.direction = dUp;
pIn.command[cmdRoll] = true;
}
}else{
if(flagDown){
// 上は危険そうなので下へ
pIn.direction = dDown;
pIn.command[cmdRoll] = true;
}else{
// どっちも危険そうなので賭け
if(p.checkMP(50, false)){
setCommand(p, stSpecial1);
}else{
pIn.direction = (intrandom(0,1)==0)? dUp : dDown;
pIn.command[cmdRoll] = true;
}
}
}
}
}
lastRollingDirection = pIn.direction;
lastRollingTick = pOwner.tickCount;
nowAttack = 0;
}
function setCommand(p, id, inv)
{
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "攻撃 setCommand : " + getConstFromSpriteId(id));
//tdm("nowSprilteId : " + st(p.nowSpriteId));
//tdm("inverse : " + p.inverse + " / inv : " + inv);
if(inv !== void){
p.inverse = inv;
pIn.lastInputLeftRight = (inv)? 1 : -1;
}
lastAttack = nowAttack;
commandExecFlag = false;
nowAttack = id;
Scripts.eval(p.attackListCommand[id], , , player);
//tdm("inverse : " + p.inverse + " / inv : " + inv);
}
function doWalkAboveOrUnder(p, e, dx=0, dy=0)
{
//tdm("doWalkAboveOrUnder " + dx + " , " + dy);
//tdm("p.rootX : " + p.rootX + " , p.rootY : " + p.rootY + " / e.rootX : " + e.rootX + " , e.rootY : " + e.rootY);
// 敵eからちょっと離れたところへ移動
// if(e.nowSpriteId == stStandUp) return;
if(getDistance(p, e) < 1440 && Math.abs(e.rootY - p.rootY) < 18){
doRoll();
return;
}
if(e.rootX < p.rootX - 8){ // ちょっとずらしてみる
// 敵が左側
if(e.rootY < p.rootY){
//tdm("敵の右下へ");
setDirection(p, e.rootX + dx, e.rootY - p.depth1 + 5 + dy, 900);
}else{
//tdm("敵の右上へ");
setDirection(p, e.rootX + dx, e.rootY + p.depth2 - 5 - dy, 900);
}
}else{
// 敵が右側
if(e.rootY < p.rootY){
//tdm("敵の左下へ");
setDirection(p, e.rootX - dx, e.rootY - p.depth1 + 5 + dy, 900);
}else{
//tdm("敵の左上へ");
setDirection(p, e.rootX - dx, e.rootY + p.depth2 - 5 - dy, 900);
}
}
}
function takeDistance(p, e){
// 敵eから適度に距離を取る
var d = getDistance(p, e);
if(d > 6400 && d < 40000){
lastWalkDirection = pIn.direction = dNeutral;
walkCount = 20;
return;
}
if(Math.abs(e.rootY - p.rootY)<25){
//dm("zzz-bbb");
doRoll();
return;
}
//dm(getDistance(p, e));
if(e.rootX < pOwner.internalWidth/2){
// 敵が左側
if(p.rootX < pOwner.internalWidth-200){
// 主人公が画面右端にいない
//dm("11111111111");
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "101");
setDirection(p, e.rootX+120, e.rootY+20, 15*15);
walkCount = 5;
return;
}else{
// 主人公が画面右端にいる
// doWalkAboveOrUnder(p, e, -180, 0);
if(e.rootY < p.rootY){
//dm("222222222222222");
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "102");
setDirection(p, e.rootX+80, e.rootY+40, 15*15);
}else{
//dm("3333333333333");
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "103");
setDirection(p, e.rootX+80, e.rootY-40, 15*15);
}
walkCount = 5;
return;
}
}else if(p.rootX < e.rootX){
// 敵が右側
if(p.rootX > 200){
//dm("444444444444444");
// 主人公が画面左端にいない
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "104");
setDirection(p, e.rootX-120, e.rootY+20, 15*15);
walkCount = 5;
return;
}else{
// 主人公が画面左端にいる
// doWalkAboveOrUnder(p, e, 180, 0);
if(e.rootY < p.rootY){
//dm("5555555555555555");
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "105");
setDirection(p, e.rootX-80, e.rootY+40, 15*15);
}else{
//dm("66666666666666");
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "106");
setDirection(p, e.rootX-80, e.rootY-40, 15*15);
}
walkCount = 5;
return;
}
}
}
function takeDistance2(p, y){
if(y.rootX < pOwner.internalWidth/2){
// 相手が左側
setDirection(p, y.rootX + 80, p.rootY, 100);
}else{
setDirection(p, y.rootX - 80, p.rootY, 100);
}
}
function tdm{
if(debug) global.dm(...);
}
function enemyCount(){
var count = 0;
for(var i=0; i<bao.enemies.count; i++){
if(bao.enemies[i].kind != "魔影蝶" && bao.enemies[i].rootY > bao.stageLayer.topLine){
count++;
}
}
return count;
}
function setDirection(p, x, y, min=16){
// 移動方向のセット (x, y) の座標へ行くデフォルトで誤差4ドットを許容
//tdm("※ setDirection ( " + x + " , " + y + " )");
var d = (p.rootX-x)*(p.rootX-x) + (p.rootY-y)*(p.rootY-y);
if(d < min){
pIn.direction = 0;
walkCount = intrandom(8, 16);
return;
}
var a = 1;
var atan = Math.atan((y - p.rootY) / (x - p.rootX));
var deg = int(atan*180 / Math.PI);
// tdm("p.rootX : " + int(p.rootX) + " / p.rootY : " + int(p.rootY) + " / x : " + x + " / y : " + y + " / lastWalkDirection : " + lastWalkDirection);
if(deg > 60 || deg < -60){
if(y < p.rootY){
// tdm("↑ deg : " + deg);
lastWalkDirection = dUp;
}else{
// tdm("↓ deg : " + deg);
lastWalkDirection = dDown;
}
}else if(deg < 30 && deg > -30){
if(x < p.rootX){
// tdm("← deg : " + deg);
if(lastWalkDirection == dRight){
lastWalkDirection = dNeutral;
a = 5;
}else{
lastWalkDirection = dLeft;
}
}else{
// tdm("→ deg : " + deg);
if(lastWalkDirection == dLeft){
lastWalkDirection = dNeutral;
a = 5;
}else{
lastWalkDirection = dRight;
}
}
}else{
if(y < p.rootY){
if(x < p.rootX){
// tdm("左上 deg : " + deg);
lastWalkDirection = dUpLeft;
}else{
// tdm("右上 deg : " + deg);
lastWalkDirection = dUpRight;
}
}else{
if(x < p.rootX){
// tdm("左下 deg : " + deg);
lastWalkDirection = dDownLeft;
}else{
// tdm("右下 deg : " + deg);
lastWalkDirection = dDownRight;
}
}
}
pIn.direction = lastWalkDirection;
// walkCount = intrandom(8, 16) * a;
walkCount = int(Math.sqrt(d) / p.moveSpeed);
if(walkCount > 15) walkCount = 15;
//dm("walkCount : "+ walkCount);
}
function tryGetItem(p, name, e, priority = 0)
{
// nameで指定したアイテムがあれば取りに行く
// 既にフラグが立っている場合
if(nowTryingGetItem) return;
// 一番近いアイテムを選択
var dMin = 9999999999;
var target = void;
var num = 0;
for(var i=pOwner.objects.count-1; i>=0; i--){
var o = pOwner.objects[i];
if((o.type == objItem || o.type == objItem2) && o.name == name){
num++;
var d = getDistance(p, o);
if(target === void || dMin > d){
dMin = d;
target = o;
}
}
}
if(target === void){
return;
}
if((priority==2 || sf.adjAICleverness==0) && (target.rootX < 0 || target.rootX > pOwner.internalWidth)){
return;
}
if(priority==0 && Math.abs(p.rootX - target.rootX) > 450 && pOwner.enemies.count > 3){
return;
}
if(pOwner.returnState=='clear' && Math.abs(p.rootX - target.rootX) > 400){
return;
}
if((target.rootX < 15 && pOwner.stageLayer.scrollLineL < p.movableRect.left) || (target.rootX+pOwner.stageLayer.dispLeft < pOwner.stageLayer.scrollLimitLeft + 48)
|| (target.rootX > pOwner.internalWidth - 15 && pOwner.stageLayer.scrollLineR > p.movableRect.right) || (target.rootX+pOwner.stageLayer.dispLeft > pOwner.stageLayer.scrollLimit - 48)){
return;
}
var minV = 999999;
var minP = void;
for(var j=0; j<pOwner.players.count; j++){
var pj = pOwner.players[j];
if(pj[e] < minV){
minV = pj[e];
minP = pj;
}
}
if(p === minP || num > 1){
if((p !== pOwner.nowSelectingPlayer && !sf.adjAIAssist) && (target.rootX<0 || target.rootX>pOwner.internalWidth)){
return;
}
if(Math.abs(p.rootX - target.rootX) > 400 && !p.extasyGauge.enabled) pIn.command[cmdDash] = true;
setDirection(p, target.rootX, target.rootY, 4);
nowTryingGetItem = true;
targetItem = target;
}
if(e == 'HP' && p.HP < p.maxHP * 0.2 && minP.HP <= 0){
if(Math.abs(p.rootX - target.rootX) > 400 && !p.extasyGauge.enabled) pIn.command[cmdDash] = true;
setDirection(p, target.rootX, target.rootY, 4);
nowTryingGetItem = true;
targetItem = target;
}
return;
}
function getAvoidWeight(x, y)
{
var sl = pOwner.stageLayer;
var weight = 0;
for(var i=0; i<sl.avoidPoints.count; i++){
var p = sl.avoidPoints[i];
// var w = 50 - Math.sqrt((p.x - x) * (p.x - x) + (p.y - y) * (p.y -y));
var w = 2500 - ((p.x - x) * (p.x - x) + (p.y - y) * (p.y -y));
if(w > 0) weight += w;
}
return weight;
}
}