mirror of
https://github.com/simon987/Much-Assembly-Required-Frontend.git
synced 2025-12-15 23:59:04 +00:00
Major refactor of the console screen, game code rewritten in Typescript, users can now change their passwords
This commit is contained in:
325
mar/MarGame.ts
Normal file
325
mar/MarGame.ts
Normal file
@@ -0,0 +1,325 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
private initialiseStaticHud() {
|
||||
|
||||
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: (" + Number(mar.client.worldX).toString(16).toUpperCase() + ", " +
|
||||
Number(mar.client.worldY).toString(16).toUpperCase() + ")";
|
||||
|
||||
} else {
|
||||
return "Loading..."
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user