563 lines
16 KiB
Java
563 lines
16 KiB
Java
|
package com.droidquest.avatars;
|
||
|
|
||
|
import com.droidquest.devices.Device;
|
||
|
import com.droidquest.devices.GenericChip;
|
||
|
import com.droidquest.devices.SmallChip;
|
||
|
import com.droidquest.items.Item;
|
||
|
import com.droidquest.items.ToolBox;
|
||
|
|
||
|
import java.awt.*;
|
||
|
import java.awt.event.KeyEvent;
|
||
|
|
||
|
/**
|
||
|
* Parent class to handle common Player functions.
|
||
|
*/
|
||
|
public class Player extends Item implements Avatar {
|
||
|
|
||
|
private int keyRepeatRate = 5;
|
||
|
|
||
|
|
||
|
protected boolean handleSaveSmallChip() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public void handleRemote() {
|
||
|
if (level.remote != null) {
|
||
|
if (level.remote.carriedBy != null) {
|
||
|
level.remote.carriedBy = level.player;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public boolean handleSolderPen() {
|
||
|
if (level.solderingPen == null) {
|
||
|
return false;
|
||
|
}
|
||
|
if (carrying != null) {
|
||
|
if (handleSaveSmallChip()) {
|
||
|
// Actually a save small chip command,
|
||
|
// skip solder pen
|
||
|
return true;
|
||
|
}
|
||
|
Drops();
|
||
|
}
|
||
|
level.solderingPen.x = x;
|
||
|
level.solderingPen.y = y;
|
||
|
level.solderingPen.room = room;
|
||
|
room = null;
|
||
|
if (level.currentViewer == level.player) {
|
||
|
level.currentViewer = level.solderingPen;
|
||
|
}
|
||
|
level.player = level.solderingPen;
|
||
|
|
||
|
handleRemote();
|
||
|
|
||
|
level.roomdisplay.dq.selectSolderpen();
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleRadio() {
|
||
|
if (level.remote == null) {
|
||
|
return false;
|
||
|
}
|
||
|
if (level.remote.carriedBy == null) { // Summon Remote
|
||
|
level.remote.x = 28;
|
||
|
level.remote.y = -20;
|
||
|
level.remote.carriedBy = level.player;
|
||
|
level.remote.room = level.player.room;
|
||
|
level.electricity = true;
|
||
|
|
||
|
level.roomdisplay.dq.setRadioSelected(true);
|
||
|
}
|
||
|
else { // Hide Remote
|
||
|
level.remote.carriedBy = null;
|
||
|
level.remote.room = null;
|
||
|
level.electricity = false;
|
||
|
|
||
|
level.roomdisplay.dq.setRadioSelected(false);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleHelp() {
|
||
|
if (carrying != null) {
|
||
|
if (carrying instanceof GenericChip) {
|
||
|
((GenericChip) carrying).ShowText(true);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
if (level.helpCam == null) {
|
||
|
return false;
|
||
|
}
|
||
|
level.player = level.helpCam;
|
||
|
level.currentViewer = level.helpCam;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleToolbox() {
|
||
|
if (level.toolbox == null) {
|
||
|
if (carrying != null) {
|
||
|
Drops();
|
||
|
}
|
||
|
level.toolbox = new ToolBox(x, y + 8, room);
|
||
|
level.items.addElement(level.toolbox);
|
||
|
((ToolBox) level.toolbox).Toggle();
|
||
|
PicksUp(level.toolbox);
|
||
|
}
|
||
|
if (level.toolbox.room != room) {
|
||
|
// Summon Toolbox
|
||
|
if (carrying != null) {
|
||
|
return false;
|
||
|
}
|
||
|
if (((ToolBox) level.toolbox).open) {
|
||
|
((ToolBox) level.toolbox).Toggle();
|
||
|
}
|
||
|
level.toolbox.room = room;
|
||
|
level.toolbox.x = x + 28;
|
||
|
level.toolbox.y = y + 6;
|
||
|
PicksUp(level.toolbox);
|
||
|
}
|
||
|
else {
|
||
|
((ToolBox) level.toolbox).Toggle();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
public boolean handleLoadSmallChip() {
|
||
|
if (carrying != null) {
|
||
|
if (carrying instanceof SmallChip) {
|
||
|
FileDialog fd = new FileDialog(level.roomdisplay.dq, "Load Chip", FileDialog.LOAD);
|
||
|
fd.setDirectory("chips");
|
||
|
fd.show();
|
||
|
System.out.println("Dialog returned with "
|
||
|
+ fd.getDirectory()
|
||
|
+ fd.getFile());
|
||
|
if (fd.getFile() != null) {
|
||
|
((SmallChip) carrying).Empty();
|
||
|
((SmallChip) carrying).LoadChip(fd.getDirectory() + fd.getFile());
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
protected boolean handleTrain() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void PicksUp(Item item) {
|
||
|
super.PicksUp(item);
|
||
|
if (carrying instanceof SmallChip) {
|
||
|
level.roomdisplay.dq.setLoadChipEnabled(true);
|
||
|
}
|
||
|
else {
|
||
|
level.roomdisplay.dq.setLoadChipEnabled(false);
|
||
|
|
||
|
if (carrying.isDevice()) {
|
||
|
level.roomdisplay.dq.setRotateEnabled(true);
|
||
|
level.roomdisplay.dq.setFlipDeviceEnabled(true);
|
||
|
}
|
||
|
else {
|
||
|
level.roomdisplay.dq.setRotateEnabled(false);
|
||
|
level.roomdisplay.dq.setFlipDeviceEnabled(false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void Drops() {
|
||
|
super.Drops();
|
||
|
level.roomdisplay.dq.setRotateEnabled(false);
|
||
|
level.roomdisplay.dq.setLoadChipEnabled(false);
|
||
|
level.roomdisplay.dq.setFlipDeviceEnabled(false);
|
||
|
}
|
||
|
|
||
|
public boolean handlePickupDrop() {
|
||
|
if (handleTrain()) {
|
||
|
return false;
|
||
|
}
|
||
|
if (carrying != null) {
|
||
|
Drops();
|
||
|
}
|
||
|
else {
|
||
|
Item item = level.FindNearestItem(level.gameCursor);
|
||
|
if (item != null) {
|
||
|
if (item.CanBePickedUp(level.gameCursor)) {
|
||
|
PicksUp(item);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
setOutline(false);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// Default implementation doesn't do anything,
|
||
|
// needed by GameCursor to set outline
|
||
|
protected void setOutline(boolean outline) {
|
||
|
}
|
||
|
|
||
|
public boolean handleRotateDevice(int direction) {
|
||
|
if (carrying != null) {
|
||
|
if (carrying.isDevice()) {
|
||
|
((Device) carrying).rotate(direction);
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleEnterRoom() {
|
||
|
Item item = level.FindNearestItem(this);
|
||
|
if (item != null) {
|
||
|
if (item.InternalRoom != null) {
|
||
|
if (Overlaps(item)) {
|
||
|
if (!item.OverWall()) {
|
||
|
int newX = 280; // 10 * 28
|
||
|
int newY = 176; // 5.5 * 32
|
||
|
x = newX;
|
||
|
y = newY;
|
||
|
SetRoom(item.InternalRoom);
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public boolean handleExitRoom() {
|
||
|
if (room != null && room.portalItem != null) {
|
||
|
Dimension d = room.portalItem.GetXY();
|
||
|
int newX = d.width
|
||
|
+ room.portalItem.getWidth() / 2
|
||
|
- width / 2;
|
||
|
int newY = d.height
|
||
|
+ room.portalItem.getHeight() / 4 * 2
|
||
|
- height / 2;
|
||
|
x = newX;
|
||
|
y = newY;
|
||
|
SetRoom(room.portalItem.room);
|
||
|
level.currentViewer = level.player;
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public boolean handleFlipDevice() {
|
||
|
if (carrying != null) {
|
||
|
if (carrying instanceof Device) {
|
||
|
((Device) carrying).flip();
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
protected boolean handleMemory() {
|
||
|
Runtime runtime = Runtime.getRuntime();
|
||
|
long freemem = runtime.freeMemory();
|
||
|
long totalmem = runtime.totalMemory();
|
||
|
System.out.println("Total Memory = " + totalmem
|
||
|
+ ", (" + totalmem / 1024 + "K), ("
|
||
|
+ totalmem / 1024 / 1024 + "M)");
|
||
|
System.out.println("Free Memory = " + freemem
|
||
|
+ ", (" + freemem / 1024 + "K), ("
|
||
|
+ freemem / 1024 / 1024 + "M)");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
protected boolean isCheatMode() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public boolean handleMoveDown(boolean isShiftDown, boolean isControlDown) {
|
||
|
if (isCheatMode()) {
|
||
|
if (isShiftDown && room != null) {
|
||
|
SetRoom(room.downRoom);
|
||
|
}
|
||
|
}
|
||
|
if (carriedBy == null) {
|
||
|
moveDown(isControlDown);
|
||
|
}
|
||
|
repeating = 0;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleMoveUp(boolean isShiftDown, boolean isControlDown) {
|
||
|
if (isCheatMode()) {
|
||
|
if (isShiftDown && room != null) {
|
||
|
SetRoom(room.upRoom);
|
||
|
}
|
||
|
}
|
||
|
if (carriedBy == null) {
|
||
|
moveUp(isControlDown);
|
||
|
}
|
||
|
repeating = 0;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleMoveLeft(boolean isShiftDown, boolean isControlDown) {
|
||
|
if (isCheatMode()) {
|
||
|
if (isShiftDown && room != null) {
|
||
|
SetRoom(room.leftRoom);
|
||
|
}
|
||
|
}
|
||
|
if (carriedBy == null) {
|
||
|
moveLeft(isControlDown);
|
||
|
}
|
||
|
repeating = 0;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleMoveRight(boolean isShiftDown, boolean isControlDown) {
|
||
|
if (isCheatMode()) {
|
||
|
if (isShiftDown && room != null) {
|
||
|
SetRoom(room.rightRoom);
|
||
|
}
|
||
|
}
|
||
|
if (carriedBy == null) {
|
||
|
moveRight(isControlDown);
|
||
|
}
|
||
|
repeating = 0;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public boolean handleHotCursor() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public boolean handlePaintbrush() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Default assume that we are already a game cursor
|
||
|
public boolean handleGameCursor() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public boolean KeyUp(KeyEvent e) {
|
||
|
if (e.getKeyCode() == KeyEvent.VK_L && handleLoadSmallChip()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_C && handleGameCursor()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_H && handleHotCursor()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_S && handleSolderPen()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_R && handleRadio()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_P && handlePaintbrush()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_T && handleToolbox()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_SLASH && handleHelp()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_RIGHT && handleMoveRight(e.isShiftDown(), e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_LEFT && handleMoveLeft(e.isShiftDown(), e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_UP && handleMoveUp(e.isShiftDown(), e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_DOWN && handleMoveDown(e.isShiftDown(), e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_SPACE && handlePickupDrop()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_CLOSE_BRACKET && handleRotateDevice(1)) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_OPEN_BRACKET && handleRotateDevice(-1)) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_E && handleEnterRoom()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_X && handleExitRoom()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_F && handleFlipDevice()) {
|
||
|
return false;
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_M && handleMemory()) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
protected boolean handleRepeatRight(boolean isControlDown) {
|
||
|
repeating++;
|
||
|
if (repeating > getKeyRepeatRate()) {
|
||
|
if (carriedBy == null) {
|
||
|
moveRight(isControlDown);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
protected boolean handleRepeatLeft(boolean isControlDown) {
|
||
|
repeating++;
|
||
|
if (repeating > getKeyRepeatRate()) {
|
||
|
if (carriedBy == null) {
|
||
|
moveLeft(isControlDown);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
protected boolean handleRepeatUp(boolean isControlDown) {
|
||
|
repeating++;
|
||
|
if (repeating > getKeyRepeatRate()) {
|
||
|
if (carriedBy == null) {
|
||
|
moveUp(isControlDown);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
protected boolean handleRepeatDown(boolean isControlDown) {
|
||
|
repeating++;
|
||
|
if (repeating > getKeyRepeatRate()) {
|
||
|
if (carriedBy == null) {
|
||
|
moveDown(isControlDown);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
|
||
|
}
|
||
|
|
||
|
protected boolean handleRepeatSpace() {
|
||
|
if (level.player == level.gameCursor) {
|
||
|
setOutline(true);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public boolean KeyDown(KeyEvent e) {
|
||
|
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
|
||
|
if (handleRepeatRight(e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
|
||
|
if (handleRepeatLeft(e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_UP) {
|
||
|
if (handleRepeatUp(e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
|
||
|
if (handleRepeatDown(e.isControlDown())) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
|
||
|
if (handleRepeatSpace()) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
public int getKeyRepeatRate() {
|
||
|
return keyRepeatRate;
|
||
|
}
|
||
|
|
||
|
public void setKeyRepeatRate(int keyRepeatRate) {
|
||
|
this.keyRepeatRate = keyRepeatRate;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void moveRight(boolean nudge) {
|
||
|
Item item = level.FindNearestItem(this);
|
||
|
if (item != null) {
|
||
|
if (item.InternalRoom != null) {
|
||
|
if (item.RightEnterOverlap(this)) {
|
||
|
int newX = 0; // 0 * 28
|
||
|
int newY = 176; // 5.5 * 32
|
||
|
x = newX;
|
||
|
y = newY;
|
||
|
SetRoom(item.InternalRoom);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
super.moveRight(nudge);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void moveLeft(boolean nudge) {
|
||
|
Item item = level.FindNearestItem(this);
|
||
|
if (item != null) {
|
||
|
if (item.InternalRoom != null) {
|
||
|
if (item.LeftEnterOverlap(this)) {
|
||
|
int newX = 532; // 19 * 28
|
||
|
int newY = 176; // 5.5 * 32
|
||
|
x = newX;
|
||
|
y = newY;
|
||
|
SetRoom(item.InternalRoom);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
super.moveLeft(nudge);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void moveDown(boolean nudge) {
|
||
|
Item item = level.FindNearestItem(this);
|
||
|
if (item != null) {
|
||
|
if (item.InternalRoom != null) {
|
||
|
if (item.DownEnterOverlap(this)) {
|
||
|
int newX = 280; // 10 * 28
|
||
|
int newY = 0; // 0 * 32
|
||
|
x = newX;
|
||
|
y = newY;
|
||
|
SetRoom(item.InternalRoom);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
super.moveDown(nudge);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void moveUp(boolean nudge) {
|
||
|
Item item = level.FindNearestItem(this);
|
||
|
if (item != null) {
|
||
|
if (item.InternalRoom != null) {
|
||
|
if (item.UpEnterOverlap(this)) {
|
||
|
int newX = 280; // 10 * 28
|
||
|
int newY = 320; // 10 * 32
|
||
|
x = newX;
|
||
|
y = newY;
|
||
|
SetRoom(item.InternalRoom);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
super.moveUp(nudge);
|
||
|
}
|
||
|
|
||
|
}
|