📄 human.java
字号:
public int GetPosX()
{
int myPosX = GetCenterLocationX();
myPosX /= 30;
return myPosX;
}
public int GetPosY()
{
int myPosY = (super.curLoc.GetY() + super.curLoc.GetHeight()) - 3;
myPosY /= 30;
return myPosY;
}
public int GetObjectId()
{
int myPosX = GetPosX();
int myPosY = GetPosY();
return Room.GetObjectId(myPosX, myPosY);
}
public boolean IsDoorUnlock(int doorLocX, int doorLocY)
{
int keyId = Map.GetDoorLockId(doorLocX, doorLocY);
if(keyId == -1)
return true;
for(int i = 3; i < itemStock.length; i++)
if(GetItem(i) == keyId)
{
Map.UnlockDoorId(Map.GetMapId(), doorLocX, doorLocY);
String str[] = {
"You unlock the door", "with " + Map.GetItemInfo(keyId)
};
SetMessage(str, 20);
return true;
}
return false;
}
public boolean OpenTheDoor(int newDoorId, int x, int y)
{
if(IsDoorUnlock(x, y))
{
Room.SetObjectId(newDoorId, x, y);
return true;
}
int keyId = Map.GetDoorLockId(x, y);
if(keyId == 20)
{
String newMsg[] = {
"Door is locked. I cannot", "open this door with key."
};
SetMessage(newMsg, 30);
} else
if(keyId != -1)
{
String newMsg[] = {
"Door is locked.", "I need to find " + Map.GetItemInfo(keyId)
};
SetMessage(newMsg, 30);
}
return false;
}
public int MoveToDirection(int dis, boolean changeRoomData)
{
int canMoveDis = 0;
isMoving = true;
switch(super.direction)
{
case 0: // '\0'
canMoveDis = CheckCollision(dis, 0, changeRoomData);
MoveY(-canMoveDis);
legArea.MoveY(-canMoveDis);
return canMoveDis;
case 1: // '\001'
canMoveDis = CheckCollision(dis, 1, changeRoomData);
MoveY(canMoveDis);
legArea.MoveY(canMoveDis);
return canMoveDis;
case 2: // '\002'
canMoveDis = CheckCollision(dis, 2, changeRoomData);
MoveX(-canMoveDis);
legArea.MoveX(-canMoveDis);
return canMoveDis;
case 3: // '\003'
canMoveDis = CheckCollision(dis, 3, changeRoomData);
MoveX(canMoveDis);
legArea.MoveX(canMoveDis);
return canMoveDis;
}
return -1;
}
public int MoveOppositeDirection(int dis, boolean changeRoomData)
{
int canMoveDis = 0;
isMoving = true;
switch(super.direction)
{
case 0: // '\0'
canMoveDis = CheckCollision(dis, 1, changeRoomData);
MoveY(canMoveDis);
legArea.MoveY(canMoveDis);
return canMoveDis;
case 1: // '\001'
canMoveDis = CheckCollision(dis, 0, changeRoomData);
MoveY(-canMoveDis);
legArea.MoveY(-canMoveDis);
return canMoveDis;
case 2: // '\002'
canMoveDis = CheckCollision(dis, 3, changeRoomData);
MoveX(canMoveDis);
legArea.MoveX(canMoveDis);
return canMoveDis;
case 3: // '\003'
canMoveDis = CheckCollision(dis, 2, changeRoomData);
MoveX(-canMoveDis);
legArea.MoveX(-canMoveDis);
return canMoveDis;
}
return -1;
}
public boolean IsObstruction(int toX, int toY)
{
int fromX = GetCenterLocationX();
int dis = fromX - toX;
if(dis < 0)
{
dis = -dis;
int canMoveDis = CheckCollision(dis, 3, false);
if(canMoveDis >= dis)
{
int fromY = GetLegLocationY();
dis = fromY - toY;
if(dis < 0)
{
dis = -dis;
canMoveDis = CheckCollision(dis, 1, false);
return canMoveDis < dis;
} else
{
canMoveDis = CheckCollision(dis, 0, false);
return canMoveDis < dis;
}
}
} else
{
int canMoveDis = CheckCollision(dis, 2, false);
if(canMoveDis >= dis)
{
int fromY = GetLegLocationY();
dis = fromY - toY;
if(dis < 0)
{
dis = -dis;
canMoveDis = CheckCollision(dis, 1, false);
return canMoveDis < dis;
} else
{
canMoveDis = CheckCollision(dis, 0, false);
return canMoveDis < dis;
}
}
}
return true;
}
public int CheckCollision(int moveOffset, int direct, boolean changeRoomData)
{
int widthOffset = super.curLoc.GetWidth() / 2 - 2;
int heightOffset = super.curLoc.GetHeight() - 3;
int curPosX = GetCenterLocationX();
curPosY = super.curLoc.GetY() + heightOffset;
try
{
switch(direct)
{
default:
break;
case 0: // '\0'
{
int minX = curPosX - widthOffset;
int maxX = curPosX + widthOffset;
int leftPosX = minX / 30;
int rightPosX = maxX / 30;
int posY1 = curPosY / 30;
int leftRoomData = Room.GetObjectId(leftPosX, posY1);
int rightRoomData = Room.GetObjectId(rightPosX, posY1);
int objPosY = (posY1 + 1) * 30;
int leftDisY = objPosY - Room.GetObstructionDistance(leftRoomData, direct);
int rightDisY = objPosY - Room.GetObstructionDistance(rightRoomData, direct);
int moveTo = curPosY - moveOffset;
if(moveTo <= rightDisY && curPosY >= rightDisY && rightRoomData != -1)
{
int objPosX = Room.GetObstructionDistance(rightRoomData, 3);
int lWidth = 30 - Room.GetObstructionDistance(rightRoomData, 2);
int rWidth = objPosX;
int width = lWidth - rWidth;
if(width > 0)
{
objPosX += rightPosX * 30;
int leftBound = objPosX;
int rightBound = objPosX + width;
if(minX < rightBound && maxX > leftBound || minX > leftBound && maxX < rightBound || minX < leftBound && maxX > leftBound || minX < rightBound && maxX > rightBound)
return curPosY - rightDisY;
}
}
if(moveTo <= leftDisY && curPosY >= leftDisY && leftPosX != rightPosX && leftRoomData != -1)
{
int objPosX = Room.GetObstructionDistance(leftRoomData, 3);
int lWidth = Room.GetObstructionDistance(leftRoomData, 2);
int rWidth = 30 - objPosX;
int width = rWidth - lWidth;
if(width > 0)
{
objPosX += leftPosX * 30;
int leftBound = objPosX;
int rightBound = objPosX + width;
if(minX < rightBound && maxX > leftBound || minX > leftBound && maxX < rightBound || minX < leftBound && maxX > leftBound || minX < rightBound && maxX > rightBound)
return curPosY - leftDisY;
}
}
int posY2 = moveTo / 30;
if(posY1 != posY2)
while(--posY1 >= posY2)
{
leftRoomData = Room.GetObjectId(leftPosX, posY1);
rightRoomData = Room.GetObjectId(rightPosX, posY1);
leftDisY = (objPosY -= 30) - Room.GetObstructionDistance(leftRoomData, direct);
rightDisY = objPosY - Room.GetObstructionDistance(rightRoomData, direct);
if(changeRoomData && (GetType() == 20 || GetType() == 21) && leftPosX == rightPosX)
{
int rData = Room.GetRoomData(leftPosX, posY1);
if(Room.IsCloseDoorYId(rData))
{
OpenTheDoor(rData + 1, leftPosX, posY1);
} else
{
newItem = Map.GetItemId(leftPosX, posY1);
if(newItem == 17 || newItem == 18)
{
Map.SetItemId(newItem, leftPosX, posY1);
SetAction(10);
String newItemMsg[] = {
Map.GetItemName(newItem), Map.GetItemInfo(newItem)
};
SetMessage(newItemMsg, 30);
if(newItem == 17)
GameManager.ShowEvent(30);
else
if(newItem == 18)
GameManager.ShowEvent(31);
} else
if(newItem != -1)
{
boolean canSaveItem = false;
if(newItem < 3)
{
SetNewWeapon(newItem);
canSaveItem = true;
} else
{
canSaveItem = AddNewItem(newItem);
}
if(!canSaveItem)
Map.SetItemId(newItem, leftPosX, posY1);
SetAction(10);
if(Room.IsCloseTreasureId(rData) && canSaveItem)
Room.SetRoomData(rData + 1, leftPosX, posY1);
String newItemMsg[] = {
Map.GetItemName(newItem), Map.GetItemInfo(newItem)
};
SetMessage(newItemMsg, 30);
if(newItem == 0)
GameManager.ShowEvent(3);
else
if(newItem == 7)
Map.SetEventId(7, 11, 4, 7);
else
if(newItem == 8)
Map.SetEventId(8, 12, 8, 2);
else
if(newItem == 9)
Map.SetEventId(10, 14, 5, 6);
else
if((newItem == 14 || newItem == 16 || newItem == 15) && HasItemId(14) && HasItemId(16) && HasItemId(15))
{
Map.UnlockDoorId(3, 7, 0);
GameManager.ShowEvent(98);
}
} else
if(Room.IsExaminableId(rData))
SetAction(9);
}
}
if(rightRoomData != -1)
{
int objPosX = Room.GetObstructionDistance(rightRoomData, 3);
int lWidth = 30 - Room.GetObstructionDistance(rightRoomData, 2);
int rWidth = objPosX;
int width = lWidth - rWidth;
if(width > 0)
{
objPosX += rightPosX * 30;
int leftBound = objPosX;
int rightBound = objPosX + width;
if(minX < rightBound && maxX > leftBound || minX > leftBound && maxX < rightBound || minX < leftBound && maxX > leftBound || minX < rightBound && maxX > rightBound)
return curPosY < rightDisY || moveTo > rightDisY ? moveOffset : curPosY - rightDisY;
}
}
if(leftPosX != rightPosX && leftRoomData != -1)
{
int objPosX = Room.GetObstructionDistance(leftRoomData, 3);
int lWidth = Room.GetObstructionDistance(leftRoomData, 2);
int rWidth = 30 - objPosX;
int width = rWidth - lWidth;
if(width > 0)
{
objPosX += leftPosX * 30;
int leftBound = objPosX;
int rightBound = objPosX + width;
if(minX < rightBound && maxX > leftBound || minX > leftBound && maxX < rightBound || minX < leftBound && maxX > leftBound || minX < rightBound && maxX > rightBound)
return curPosY < leftDisY || moveTo > leftDisY ? moveOffset : curPosY - leftDisY;
}
}
if(Room.IsCornerWallId(leftRoomData))
return leftDisY < moveTo ? moveOffset : curPosY - leftDisY;
if(Room.IsCornerWallId(rightRoomData))
return rightDisY < moveTo ? moveOffset : curPosY - rightDisY;
}
break;
}
case 1: // '\001'
{
int minX = curPosX - widthOffset;
int maxX = curPosX + widthOffset;
int leftPosX = minX / 30;
int rightPosX = maxX / 30;
int posY1 = curPosY / 30;
int leftRoomData = Room.GetObjectId(leftPosX, posY1);
int rightRoomData = Room.GetObjectId(rightPosX, posY1);
int objPosY = posY1 * 30;
int leftDisY = objPosY + Room.GetObstructionDistance(leftRoomData, direct);
int rightDisY = objPosY + Room.GetObstructionDistance(rightRoomData, direct);
int moveTo = curPosY + moveOffset;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -