You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
7.1 KiB

2 years ago
"use strict";
class Game {
constructor() {
this.trees = [];
this.tree = new Tree(null);
this.decorations = [];
this.containers = [];
this.isTreeMode = true;
this.isDecorationMode = false;
this.switchButton = new Button('switch');
this.downloadButton = new Button('download');
this.restoreButton = new Button('restore');
this.background = new Background();
settings.game.trees.forEach((s) => this.trees.push(new Tree(s)));
let red = settings.game.colors.red;
this.decorations = [
Decoration.Create({
type: "ball", radius: 0.45, colors: [red]
}),
Decoration.Create({
type: "star", radius: 0.45, colors: [red, darker(red)]
}),
Decoration.Create({
type: "chain", radius: 0.45, colors: [
settings.game.colors.gold,
settings.game.colors.silver
]
}),
];
$('#gold, #silver').attr('checked', 'checked');
this.trees.forEach((t, i) => {
let c = new Container(i, t);
this.containers.push(c);
t.container = c;
});
this.decorations.forEach((d, i) => {
let c = new Container(i, d);
this.containers.push(c);
d.container = c;
});
this.updateDecorationSettings();
this.updateStarSettings();
}
updateDecorationSettings() {
this.decorations.filter(d => d instanceof Ball || d instanceof Star).forEach(d => {
d.radius = $('#radius').val() / 100 * 0.7;
let colors = [];
colors.push(JSON.parse($('#color').val()));
if (d instanceof Ball) {
d.colors = colors;
d.updateColor();
}
if (d instanceof Star) {
d.innerRadius = $('#inner_radius').val() * d.radius;
colors.push(darker(colors[0]));
d.colors = colors;
d.createTriangles();
}
});
}
updateStarSettings() {
this.decorations.filter(d => d instanceof Star).forEach((s) => {
s.innerRadius = $('#inner_radius').val() * s.radius;
s.raysCount = parseInt($('#rays_count').val());
s.createTriangles();
});
}
updateChainSettings(element) {
let chain = this.decorations.find(d => d instanceof Chain);
let colorName = element.attr('id');
let colorValue = settings.game.colors[colorName];
let cvIndex = chain.colors.findIndex(c => equals(c, colorValue));
if (cvIndex >= 0) {
chain.colors.splice(cvIndex, 1);
}
else {
chain.colors.push(colorValue);
}
if (chain.colors.length == 0) {
chain.colors.push(colorValue);
return false;
}
return true;
}
updateBackgroundSettings() {
this.background.updateSettings();
}
get center() {
return p.createVector(p.width / 2, this.height / 2);
}
get height() {
return p.height - this.containers[0].dim.y;
}
get currentContainers() {
return this.containers.filter(c => {
if (this.isTreeMode)
return c.content instanceof Tree;
if (this.isDecorationMode)
return c.content instanceof Decoration;
});
}
update() {
this.background.update();
this.switchButton.update();
this.downloadButton.update();
this.restoreButton.update();
this.currentContainers.forEach(c => c.update());
this.tree.update();
}
display() {
this.background.display();
this.switchButton.display();
this.downloadButton.display();
this.restoreButton.display();
this.currentContainers.forEach(c => c.display());
this.tree.display();
this.background.display(true);
}
//Always called
mousePressed() {
this.tree.mousePressed();
this.currentContainers.forEach(c => c.mouseIsOver ? c.mousePressed() : null);
this.switchButton.mouseIsOver ? this.switchButton.mousePressed() : null;
this.downloadButton.mouseIsOver ? this.downloadButton.mousePressed() : null;
this.restoreButton.mouseIsOver ? this.restoreButton.mousePressed() : null;
}
//Always called
mouseReleased() {
this.tree.mouseReleased();
}
restoreTrees(rawTrees) {
this.trees.forEach((t, i) => {
t.restoreFrom(rawTrees[i]);
});
}
}
class Button {
constructor(type) {
this.pos = p.createVector();
this.dim = p.createVector();
this.type = type;
}
get mouseIsOver() {
return p.mouseX > this.pos.x && p.mouseX < this.pos.x + this.dim.x &&
p.mouseY > this.pos.y && p.mouseY < this.pos.y + this.dim.y;
}
get center() {
return p5.Vector.add(this.pos, p5.Vector.div(this.dim, 2));
}
display() {
let w = this.dim.x, h = this.dim.y;
let x = this.pos.x + w / 2, y = this.pos.y + h / 2;
p.image(images['box'], x, y, w, h);
if (this.type === 'switch') {
if (game.isTreeMode) {
game.decorations[0].display(this.center, this.dim);
}
if (game.isDecorationMode) {
let tree = game.tree;
if (tree.isPlaceholder)
tree = game.trees[0];
tree.display(this.center, this.dim);
}
}
if (this.type === 'download') {
p.textAlign(p.CENTER, p.CENTER);
p.textSize(25);
p.fill(0);
p.text("Save", this.pos.x, this.pos.y, this.dim.x, this.dim.y);
}
if (this.type === 'restore') {
p.textAlign(p.CENTER, p.CENTER);
p.textSize(20);
p.fill(0);
p.text("Restore", this.pos.x, this.pos.y, this.dim.x, this.dim.y);
}
if (this.mouseIsOver) {
p.fill(0, 50);
p.noStroke();
p.rect(x - w / 2, y - h / 2, w, h);
}
}
update() {
let w, h, x, y;
if (this.type === 'switch') {
w = game.containers[0].dim.x / 2;
h = w;
x = 0;
y = game.containers[0].pos.y - h;
}
if (this.type === 'download') {
w = game.containers[0].dim.x / 2;
h = w;
x = p.width - w;
y = game.containers[0].pos.y - h;
}
if (this.type === 'restore') {
w = game.containers[0].dim.x / 2;
h = w;
x = p.width - 2 * w;
y = game.containers[0].pos.y - h;
}
this.pos.set(x, y);
this.dim.set(w, h);
}
mousePressed() {
if (this.type === 'switch') {
game.isDecorationMode = !game.isDecorationMode;
game.isTreeMode = !game.isTreeMode;
}
if (this.type === 'download') {
downloadTrees();
}
if (this.type === 'restore') {
$('#file_browser')[0].click();
}
}
}
//# sourceMappingURL=game.js.map