mirror of
https://github.com/simon987/Much-Assembly-Required-Frontend.git
synced 2025-04-10 14:26:44 +00:00
347 lines
13 KiB
TypeScript
347 lines
13 KiB
TypeScript
class MarGame {
|
||
|
||
isoGroup: Phaser.Group;
|
||
textGroup: Phaser.Group;
|
||
hudGroup: Phaser.Group;
|
||
game: Phaser.Game;
|
||
|
||
cursorPos: Phaser.Plugin.Isometric.Point3 = new Phaser.Plugin.Isometric.Point3();
|
||
|
||
bootState;
|
||
client: GameClient;
|
||
|
||
debugMessages: DebugMessage[] = [];
|
||
|
||
world: World;
|
||
|
||
animationFrames: any = {};
|
||
|
||
tileIndicator: TileIndicator;
|
||
|
||
constructor() {
|
||
|
||
let self = this;
|
||
this.game = new Phaser.Game(RENDERER_WIDTH, RENDERER_HEIGHT, Phaser.AUTO, 'game', null, true, false);
|
||
|
||
this.bootState = {
|
||
preload: function () {
|
||
if (DEBUG) {
|
||
console.log("[MAR] Loading sprites.png as JSONHash");
|
||
}
|
||
this.game.load.atlasJSONHash("sheet", "./mar/sprites.png", "./mar/sprites.json").onLoadComplete.add(function () {
|
||
self.game.time.advancedTiming = true;
|
||
|
||
//Add and enable the isometric plug-in.
|
||
if (DEBUG) {
|
||
console.log("[MAR] Enabling isometric plugin");
|
||
}
|
||
self.game.plugins.add(new Phaser.Plugin.Isometric(self.game));
|
||
|
||
//This is used to set a game canvas-based offset for the 0, 0, 0 isometric coordinate - by default
|
||
//this point would be at screen coordinates 0, 0 (top left) which is usually undesirable.
|
||
self.game.iso.anchor.setTo(0.5, 0);
|
||
//Bounds will be overwritten to fit world when changing world
|
||
self.game.world.setBounds(0, 0, 2200, 1100);
|
||
|
||
//Make camera more or less centered (tested on 1080 screen)
|
||
self.game.camera.x = 280;
|
||
self.game.camera.y = 90;
|
||
|
||
self.game.scale.scaleMode = Phaser.ScaleManager.RESIZE;
|
||
self.game.scale.pageAlignHorizontally = true;
|
||
self.game.scale.pageAlignVertically = true;
|
||
|
||
self.game.stage.disableVisibilityChange = true;
|
||
|
||
self.client = new GameClient();
|
||
|
||
//Grab focus when clicked (For chrome, Opera)
|
||
self.game.input.onDown.add(function () {
|
||
document.getElementById("game").focus();
|
||
|
||
if (DEBUG) {
|
||
console.log("Grabbed focus of #game");
|
||
}
|
||
});
|
||
|
||
self.isoGroup = mar.game.add.group();
|
||
self.textGroup = mar.game.add.group();
|
||
self.hudGroup = mar.game.add.group();
|
||
self.hudGroup.fixedToCamera = true;
|
||
});
|
||
},
|
||
|
||
create: function () {
|
||
|
||
if (DEBUG) {
|
||
console.log("[MAR] create");
|
||
}
|
||
|
||
self.initialiseAnimations();
|
||
self.initialiseStaticHud();
|
||
|
||
},
|
||
|
||
update: function () {
|
||
|
||
self.game.scale.refresh();
|
||
|
||
//Update the cursor position.
|
||
self.game.iso.unproject(self.game.input.activePointer.position, self.cursorPos);
|
||
|
||
//Loop through all tiles and test to see if the 3D position from above intersects with the automatically generated IsoSprite tile bounds.
|
||
self.isoGroup.forEach(function (tile: Tile) {
|
||
|
||
if (tile instanceof Tile) {
|
||
let inBounds = tile.isoBounds.containsXY(self.cursorPos.x, self.cursorPos.y);
|
||
//If it does, do a little animation and tint change.
|
||
if (!tile.selected && inBounds) {
|
||
tile.selected = true;
|
||
|
||
tile.onHover();
|
||
|
||
//Dispatch tile over for objects
|
||
self.isoGroup.forEach(function (obj: GameObject) {
|
||
if (obj instanceof GameObject && obj.onTileHover != undefined && obj.isAt(tile.tileX, tile.tileY)) {
|
||
obj.onTileHover();
|
||
}
|
||
}, 1);
|
||
}
|
||
//If not, revert back to how it was.
|
||
else if (tile.selected && !inBounds) {
|
||
tile.selected = false;
|
||
tile.onExit();
|
||
|
||
//Dispatch tile exit objects
|
||
self.isoGroup.forEach(function (obj: GameObject) {
|
||
if (obj.onTileExit != undefined && obj.isAt(tile.tileX, tile.tileY)) {
|
||
obj.onTileExit();
|
||
}
|
||
}, 0);
|
||
}
|
||
}
|
||
|
||
}, 0);
|
||
|
||
//Enable dragging the camera
|
||
if (this.game.input.activePointer.isDown) {
|
||
if (this.game.origDragPoint) {
|
||
// move the camera by the amount the mouse has moved since last update
|
||
this.game.camera.x += this.game.origDragPoint.x - this.game.input.activePointer.position.x;
|
||
this.game.camera.y += this.game.origDragPoint.y - this.game.input.activePointer.position.y;
|
||
}
|
||
// set new drag origin to current position
|
||
this.game.origDragPoint = this.game.input.activePointer.position.clone();
|
||
|
||
} else {
|
||
this.game.origDragPoint = null;
|
||
}
|
||
|
||
self.game.iso.topologicalSort(self.isoGroup);
|
||
},
|
||
render: function () {
|
||
|
||
for (let i = 0; i < self.debugMessages.length; i++) {
|
||
self.game.debug.text(self.debugMessages[i].getMessage(), self.debugMessages[i].x,
|
||
self.debugMessages[i].y)
|
||
}
|
||
|
||
}
|
||
};
|
||
|
||
this.game.state.add('Boot', this.bootState);
|
||
this.game.state.start('Boot');
|
||
}
|
||
|
||
public addDebugMessage(debugMsg: DebugMessage) {
|
||
this.debugMessages.push(debugMsg)
|
||
}
|
||
|
||
private initialiseAnimations() {
|
||
//Walk =-------------------------------------------------------
|
||
//East
|
||
this.animationFrames.walk_e_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.walk_e_start.push("cubot/walk_e/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.walk_e = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.walk_e.push("cubot/walk_e/" + ("0000" + i).slice(-4));
|
||
}
|
||
|
||
this.animationFrames.harvester_walk_e_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.harvester_walk_e_start.push("harvester/walk_e/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.harvester_walk_e = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.harvester_walk_e.push("harvester/walk_e/" + ("0000" + i).slice(-4));
|
||
}
|
||
//North
|
||
this.animationFrames.walk_n_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.walk_n_start.push("cubot/walk_n/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.walk_n = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.walk_n.push("cubot/walk_n/" + ("0000" + i).slice(-4));
|
||
}
|
||
|
||
this.animationFrames.harvester_walk_n_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.harvester_walk_n_start.push("harvester/walk_n/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.harvester_walk_n = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.harvester_walk_n.push("harvester/walk_n/" + ("0000" + i).slice(-4));
|
||
}
|
||
//South
|
||
this.animationFrames.walk_s_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.walk_s_start.push("cubot/walk_s/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.walk_s = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.walk_s.push("cubot/walk_s/" + ("0000" + i).slice(-4));
|
||
}
|
||
|
||
this.animationFrames.harvester_walk_s_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.harvester_walk_s_start.push("harvester/walk_s/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.harvester_walk_s = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.harvester_walk_s.push("harvester/walk_s/" + ("0000" + i).slice(-4));
|
||
}
|
||
//West
|
||
this.animationFrames.walk_w_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.walk_w_start.push("cubot/walk_w/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.walk_w = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.walk_w.push("cubot/walk_w/" + ("0000" + i).slice(-4));
|
||
}
|
||
|
||
this.animationFrames.harvester_walk_w_start = [];
|
||
for (let i = 0; i < 10; i++) {
|
||
this.animationFrames.harvester_walk_w_start.push("harvester/walk_w/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.harvester_walk_w = [];
|
||
for (let i = 10; i < 30; i++) {
|
||
this.animationFrames.harvester_walk_w.push("harvester/walk_w/" + ("0000" + i).slice(-4));
|
||
}
|
||
|
||
//Dig =-------------------------------------------------------
|
||
this.animationFrames.dig_e = [];
|
||
for (let i = 1; i <= 41; i++) {
|
||
this.animationFrames.dig_e.push("cubot/dig_e/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.dig_n = [];
|
||
for (let i = 1; i <= 41; i++) {
|
||
this.animationFrames.dig_n.push("cubot/dig_n/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.dig_s = [];
|
||
for (let i = 1; i <= 41; i++) {
|
||
this.animationFrames.dig_s.push("cubot/dig_s/" + ("0000" + i).slice(-4));
|
||
}
|
||
this.animationFrames.dig_w = [];
|
||
for (let i = 1; i <= 41; i++) {
|
||
this.animationFrames.dig_w.push("cubot/dig_w/" + ("0000" + i).slice(-4));
|
||
}
|
||
|
||
//Biomass =-------------------------------------------------------
|
||
this.animationFrames.biomassIdle = [];
|
||
for (let i = 1; i < 60; i++) {
|
||
this.animationFrames.biomassIdle.push("objects/biomass/idle/" + ("0000" + i).slice(-4));
|
||
}
|
||
//Vault screen
|
||
this.animationFrames.vaultDoorScreen = [];
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/2");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/3");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/4");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/5");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/6");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
this.animationFrames.vaultDoorScreen.push("objects/VaultDoorScreen/1");
|
||
|
||
|
||
}
|
||
|
||
private initialiseStaticHud() {
|
||
|
||
//todo fix the compass sprite so the Y axis is facing the other way
|
||
//this.game.add.sprite(0, this.game.camera.height - 150, "sheet", "ui/compass", this.hudGroup);
|
||
|
||
this.addDebugMessage(new WorldIndicator(10, 20));
|
||
|
||
this.tileIndicator = new TileIndicator(10, 40);
|
||
this.addDebugMessage(this.tileIndicator);
|
||
}
|
||
|
||
}
|
||
|
||
abstract class DebugMessage {
|
||
|
||
public x: number;
|
||
public y: number;
|
||
|
||
|
||
constructor(x: number, y: number) {
|
||
this.x = x;
|
||
this.y = y;
|
||
}
|
||
|
||
abstract getMessage(): string;
|
||
}
|
||
|
||
/**
|
||
* Indicates hovered tile
|
||
*/
|
||
class TileIndicator extends DebugMessage {
|
||
|
||
public tileType: string;
|
||
public tileX: number;
|
||
public tileY: number;
|
||
|
||
getMessage(): string {
|
||
|
||
if (this.tileType != undefined) {
|
||
|
||
return this.tileX + ", " + this.tileY + " : " + this.tileType;
|
||
|
||
} else {
|
||
return "";
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Indicates current World
|
||
*/
|
||
class WorldIndicator extends DebugMessage {
|
||
|
||
getMessage(): string {
|
||
|
||
if (mar.world != undefined) {
|
||
|
||
return "World: " + mar.client.dimension + "(" + Number(mar.client.worldX).toString(16).toUpperCase() + ", " +
|
||
Number(mar.client.worldY).toString(16).toUpperCase() + ")";
|
||
|
||
} else {
|
||
return "Loading..."
|
||
}
|
||
|
||
}
|
||
} |