📄 actor.java
字号:
boolean checkSandmanInRange()
{
byte[] pColBox = Player.m_prince.getColBox();
return Player.m_prince.curState != Def.PRINCE_DIE &&
(Player.m_prince.m_posY>>8) + pColBox[3] >= (m_posY>>8) + getColBox()[1] &&
(Player.m_prince.m_posY>>8) + pColBox[1] < (m_posY>>8) + getColBox()[3];
}
boolean checkSandmanGoback()
{
if (m_start1 != 0) // go back to guard
{
if (m_start2 != 0)
{
setAction(Def.SANDMAN_HM_GUARD, 1);
setFlipX(Player.m_prince.m_posX < m_posX);
}
else if (m_start1 != m_posX)
{
if (m_actionIDNow == Def.SANDMAN_HM_WALK)
return false;
setAction(Def.SANDMAN_HM_WALK, 1);
setFlipX(m_start1 < m_posX);
}
else
{
setAction(Def.SANDMAN_HM_WAIT, 1);
setFlipX(Player.m_prince.m_posX < m_posX);
}
return true;
}
return false;
}
void blockPrince()
{
if (Player.m_prince.m_actionIDNow == Def.PRINCE_DIE)
return;
if (Player.m_prince.m_vX == 0 && Player.m_prince.m_actionIDNow != Def.PRINCE_HANG &&
(m_actionIDNow == Def.SANDMAN_HM_WALK || m_actionIDNow == Def.SANDMAN_HM_THRUST || m_actionIDNow == Def.SANDMAN_HM_STRIKE))
{
Player.m_prince.checkActorBox(this);
}
int x;
int oldX = Player.m_prince.m_posX;
if (Math.abs(m_posY - Player.m_prince.m_posY) > ((m_colBoxNow[3] - m_colBoxNow[1]) << 8)) return;
if (m_posX > Player.m_prince.m_posX)
{
x = m_posX + ((m_colBoxNow[0] - Player.m_prince.getColBox()[2]) << 8);
if (Player.m_prince.m_posX > x)
{
if (Player.m_prince.m_actionIDNow == Def.PRINCE_HANG)
{
if (m_flag[0] && Player.m_prince.m_flag[0])
m_posX = Player.m_prince.m_posX + ((Player.m_prince.getColBox()[2] - m_colBoxNow[0]) << 8);
}
else
{
if (Player.m_prince.m_phbLeft >= Def.PHB_BOX)
{
checkActorBox(Player.m_prince);
}
else if (Player.m_prince.m_posX - x > 0x0800)
Player.m_prince.m_posX -= 0x0800 + Player.m_prince.m_vX;
else
Player.m_prince.m_posX = x;
}
}
}
else
{
x = m_posX + ((m_colBoxNow[2] - Player.m_prince.getColBox()[0]) << 8);
if(Player.m_prince.m_posX < x)
{
if (Player.m_prince.m_actionIDNow == Def.PRINCE_HANG)
{
if (!m_flag[0] && !Player.m_prince.m_flag[0])
m_posX = Player.m_prince.m_posX + ((Player.m_prince.getColBox()[0] - m_colBoxNow[2]) << 8);
}
else
{
if (Player.m_prince.m_phbRight >= Def.PHB_BOX)
{
checkActorBox(Player.m_prince);
}
else if (x - Player.m_prince.m_posX > 0x0800)
Player.m_prince.m_posX += 0x0800 - Player.m_prince.m_vX;
else
Player.m_prince.m_posX = x;
}
}
}
//blocked by sandman
if (oldX != Player.m_prince.m_posX)
{
Player.m_prince.blocked = true;
}
}
boolean princeCanUseDagger()
{
if (m_parameters[0] >= 0) // use dagger automatic
{
//GE.m_blockKey = true;
Player.m_prince.noJump = false;
GE.resetKey();
GE.m_input[Def.KEY_ATTACK] = Def.Dn_Instant;
}
if (GE.m_input[Def.KEY_ATTACK] != Def.Dn_Instant)//if (GE.m_input[Def.KEY_ATTACK] < Def.Dn_Instant)
return false;
if (Player.m_prince.m_posY > m_posY + 0x0400 || Player.m_prince.m_posY < m_posY - 0x0400)
return false;
if (Player.m_prince.m_actionIDNow > Def.PRINCE_RUN &&
(Player.m_prince.m_actionIDNow != Def.PRINCE_STRIKE || Player.m_prince.m_frameIDNow != 0))
return false;
int xRange = m_colBoxNow[2] - m_colBoxNow[0];
int xDiff = (m_posX >> 8) + ((m_colBoxNow[2] + m_colBoxNow[0]) >> 1) - (Player.m_prince.m_posX >> 8);
if (Player.m_prince.m_flag[0]) // face left
xDiff = -xDiff;
if (m_parameters[0] < 0 && (xDiff < -xRange/2/*nearest*/ || xDiff > xRange*2/*farthest*/))
return false;
Player.m_prince.setAction(Def.PRINCE_LASTSTRIKE, 1);
Player.m_prince.stopAction(false);
Player.m_prince.m_vX = ((xDiff-xRange) << 8)/3;
if (Player.m_prince.m_flag[0])
Player.m_prince.m_vX = -Player.m_prince.m_vX;
return true;
}
void aiSandman()
{
boolean hurtPrince = Player.m_prince.intersectAttackBox(this);
if (hurtPrince)
Player.m_prince.postMessage(Def.MSG_HURT, this);
switch(m_actionIDNow)
{
case Def.SANDMAN_BM_GUARD:
blockPrince();
stopAction(false);
if (checkSandmanDamage())
break;
if (Math.abs(m_posY - Player.m_prince.m_posY) <= (50<<8))
{
setFlipX(m_posX > Player.m_prince.m_posX);
if (checkSandmanPrinceInVision() && m_relativeMisc != null && !m_relativeMisc.m_flag[3])
{
//if (m_start1 == 0) // no crouch
setAction(Def.SANDMAN_BM_FIRE, 1);
//else // switch guard and crouch
// setAction((Def.SANDMAN_BM_FIRE2+Def.SANDMAN_BM_FIRE) - (m_actionIDNow+1), true);
}
}
break;
case Def.SANDMAN_BM_FIRE:
blockPrince();
if (checkSandmanDamage())
break;
if (m_actionOver)
{
//GE.playSound(Def.SOUND_SHOOTARROW_MID, 1);
m_relativeMisc.m_flag[3] = true;
m_relativeMisc.setFlipX(m_flag[0]); // same as bowman
m_relativeMisc.m_posX = m_posX + m_relativeMisc.m_vX;
m_relativeMisc.m_start1 = m_posX;
m_relativeMisc.m_posY = m_posY + ((getColBox()[1] + 8) << 8);
m_relativeMisc.setAction(Def.SANDMAN_ARROW, 1);
setAction(m_actionIDNow-1, 1);
}
break;
case Def.SANDMAN_ARROW:
if (m_phbLeft >= Def.PHB_SOLID || m_phbRight >= Def.PHB_SOLID || hurtPrince ||
checkArrowSendBack() || ((m_posX - m_start1)>>8) > Def.PF_WIDTH )
setAction(Def.SANDMAN_BROKEN, 1);
break;
case Def.SANDMAN_BROKEN:
if (m_actionOver)
m_flag[3] = false;
break;
// Hammer Man
case Def.SANDMAN_HM_WAIT:
blockPrince();
if (checkSandmanDamage())
break;
if(checkSandmanPrinceInVision())
{
setAction(Def.SANDMAN_HM_GUARD, 1);
}
break;
case Def.SANDMAN_HM_WALK:
blockPrince();
if (checkSandmanDamage())
break;
if (checkSandmanPrinceInVision())
{
if (Math.abs(m_posX - Player.m_prince.m_posX) <= (50<<8))
{
if (Player.m_prince.m_actionIDNow == Def.PRINCE_LASTSTRIKE)
{
setAction(Def.SANDMAN_HM_GUARD, 1); // dead
}
else
{
setFlipX(m_posX > Player.m_prince.m_posX);
setAction(m_counter == 1 ? Def.SANDMAN_HM_THRUST : Def.SANDMAN_HM_STRIKE, 1);
//GE.playSound(Def.SOUND_HAMMERSTRIKE_MID, 1);
}
break;
}
}
else if (checkSandmanGoback())
break;
if (checkGround(m_flag[0]) > 0 ||
m_flag[0] && m_phbLeft >= Def.PHB_SOLID ||
!m_flag[0] && m_phbRight >= Def.PHB_SOLID)
setFlipX(!m_flag[0]);
break;
case Def.SANDMAN_HM_GUARD:
case Def.SANDMAN_HM_THRUST:
case Def.SANDMAN_HM_STRIKE:
blockPrince();
if (checkSandmanDamage())
break;
if (m_actionIDNow == Def.SANDMAN_HM_STRIKE && m_frameIDNow == (m_anim.nFrame[m_actionIDNow] - 1))
{
Player.m_shakeCamera += 2;
}
if(m_actionOver)
{
if (checkSandmanPrinceInVision())
{
if (Math.abs(m_posX - Player.m_prince.m_posX) <= (50<<8) )
{
if (m_start1 != 0) // suporior guard hammerman,
m_counter = 1 - m_counter;
setAction(m_counter == 1 ? Def.SANDMAN_HM_THRUST : Def.SANDMAN_HM_STRIKE, 1);
//GE.playSound(Def.SOUND_HAMMERSTRIKE_MID, 1);
}
else if (m_start1 != 0 && m_start2 != 0)
setAction(Def.SANDMAN_HM_GUARD, 1);
else
setAction(Def.SANDMAN_HM_WALK, 1);
}
else if (!checkSandmanGoback())
setAction(Def.SANDMAN_HM_WALK, 1);
}
break;
case Def.SANDMAN_BM_HURT:
blockPrince();
if(m_actionOver)
{
if (m_flag[0] != (m_posX > Player.m_prince.m_posX))
{
setFlipX(!m_flag[0]);
m_actionOver = false;
}
else
setAction(Def.SANDMAN_BM_FIRE, 1); // strick, fire, fire2
}
break;
case Def.SANDMAN_HM_HURT:
blockPrince();
if(m_actionOver)
{
if (m_flag[0] != (m_posX > Player.m_prince.m_posX))
{
setFlipX(!m_flag[0]);
m_actionOver = false;
}
else
setAction(Def.SANDMAN_HM_STRIKE, 1); // strick, fire, fire2
}
break;
case Def.SANDMAN_BM_LYING:
if (m_actionOver)
{
drawMsg(m_parameters[0]);
if (GE.m_playHint == 0)
m_parameters[0] = -1;
setAction(Def.SANDMAN_BM_LIE, 1); // lie
}
break;
case Def.SANDMAN_HM_LYING:
if (m_actionOver)
{
drawMsg(m_parameters[0]);
if (GE.m_playHint == 0)
m_parameters[0] = -1;
setAction(Def.SANDMAN_HM_LIE, 1); // lie
}
break;
case Def.SANDMAN_BM_LIE:
if (Player.m_prince.m_actionIDNow == Def.PRINCE_LASTSTRIKE2)
{
if (intersectAttackBox(Player.m_prince))
setAction(Def.SANDMAN_BM_DEAD, 1); // dead
}
else if (princeCanUseDagger())
{
//GE.playSound(Def.SOUND_DAGGERHIT_MID, 1);
}
else if (m_start2 == 0 && Player.m_prince.m_actionIDNow != Def.PRINCE_LASTSTRIKE)
{
m_counter--;
if (m_counter <= 0)
{
m_hp = m_maxhp;
setFlipX(m_posX > Player.m_prince.m_posX);
setAction(Def.SANDMAN_BM_HURT, 1); // hurt
blockPrince();
}
}
else
{
setAction(Def.SANDMAN_BM_DEAD, 1); // dead
}
break;
case Def.SANDMAN_HM_LIE:
if (Player.m_prince.m_actionIDNow == Def.PRINCE_LASTSTRIKE2)
{
if (intersectAttackBox(Player.m_prince))
setAction(Def.SANDMAN_HM_DEAD, 1); // dead
}
else if (princeCanUseDagger())
{
//GE.playSound(Def.SOUND_DAGGERHIT_MID, 1);
}
else if (m_start2 == 0 && Player.m_prince.m_actionIDNow != Def.PRINCE_LASTSTRIKE)
{
m_counter--;
if (m_counter <= 0)
{
m_hp = m_maxhp;
setFlipX(m_posX > Player.m_prince.m_posX);
setAction(Def.SANDMAN_HM_HURT, 1); // hurt
blockPrince();
}
}
else
{
setAction(Def.SANDMAN_HM_DEAD, 1); // dead
}
break;
case Def.SANDMAN_BM_DEAD:
case Def.SANDMAN_HM_DEAD:
//if (m_parameters[0] >= 0)
//{
// GE.m_blockKey = true;
//}
if (Player.m_prince.m_actionIDNow != Def.PRINCE_LASTSTRIKE
&& Player.m_prince.m_actionIDNow != Def.PRINCE_LASTSTRIKE2)
{
if (m_start2 == 0)
{
m_counter = RECOVER_TIME;
setAction(m_actionIDNow-1, 1); // lie
}
}
//else if (m_actionOver)
//{
// GE.resetKey();
// Player.m_prince.setAction(Def.PRINCE_NORMAL, 1);
//}
if (m_actionOver)
{
Player.m_prince.setAction(Def.PRINCE_NORMAL, 1);
setAction(Def.SANDMAN_SMOKE, 1);
}
break;
case Def.SANDMAN_SMOKE:
if (m_actionOver)
m_flag[3] = false;
break;
}
if (m_actionIDNow == Def.SANDMAN_HM_HURT && checkGround(!m_flag[0]) > 0)
{
m_vX = 0;
}
}
void aiSaw()
{
if (Player.m_prince.intersectAttackBox(this))
Player.m_prince.postMessage(Def.MSG_HURT, this);
switch(m_actionIDNow)
{
case Def.SAW_MOVELEFT:
if(m_start1 >= m_posX)
setAction(Def.SAW_MOVERIGHT, 1);
break;
case Def.SAW_MOVERIGHT:
if(m_start2 <= m_posX)
setAction(Def.SAW_MOVELEFT, 1);
break;
case Def.SAW_MOVEUP:
if(m_start1 >= m_posY)
setAction(Def.SAW_MOVEDOWN, 1);
break;
case Def.SAW_MOVEDOWN:
if(m_start2 <= m_posY)
setAction(Def.SAW_MOVEUP, 1);
break;
case Def.SAW_CRASH:
if(m_actionOver)
m_flag[3] = false;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -