2640 lines
174 KiB
Text
2640 lines
174 KiB
Text
|
||
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(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 > -10 && e.rootX < pOwner.internalWidth+10 && 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){
|
||
if(clinchedTick < 0) clinchedTick = bao.tickCount;
|
||
if(p.checkMP(50, false) && !p.inExtasy &&(p.clinchedStrength > 150 || nearEnemiesCount > 2 || (p.HP/p.maxMP < 0.3 && p.MP > 50) || (bao.tickCount - clinchedTick > 120))){
|
||
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "362 クリンチから脱出 stSpecial1");
|
||
setCommand(p, stSpecial1);
|
||
}else{
|
||
pIn.direction = intrandom(1,9);
|
||
}
|
||
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 == "戦闘員" && agr){
|
||
if(Math.abs(p.rootY - e.rootY) < 15){
|
||
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.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;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
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;
|
||
}
|
||
}
|
||
|
||
if(agr && p.checkMP(100, false) && (p.enableMove || p.enableCommand || p.otherState=='enableSpecial5')){
|
||
for(var j=0; j<2 ; j++){
|
||
eTemp.clear();
|
||
var tmpRect = new Rect2(((j==0)?p.rootX-120:p.rootX), p.rootY-40, ((j==0)?p.rootX:p.rootX+120), 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((p.altitude > 0 && eTemp.count > 1) || eTemp.count>5){
|
||
// Exフォースジャベリン
|
||
//tdm(pOwner.tickCount + ":" + ((!p.chara)?"■シフォン ":"□ショコラ ") + "333 EXフォースジャベリン " + ((j==0)?"←":"→") + " 対象数:" + eTemp.count);
|
||
setCommand(p, stSpecial5, j);
|
||
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 && 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 && 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(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.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されてる2 " + 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 && (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;
|
||
}
|
||
|
||
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;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|