/**
* @module Ball
*/
import { START_NO_OF_BALLS, MAP_WIDTH, MAP_HEIGHT, COLORS } from "./consts";
import { getRandomInt, getRandomEl } from "./utils";
import { finishGame, getTd, setFunnyText } from "./ui";
/** Ball is the class for holding ball data and ball logic */
export class Ball {
/// x coordinate
x: number;
/// y coordinate
y: number;
/// color of ball
color: string;
/**
* Basic constructor for ball
* @param x x coord
* @param y y coord
* @param color color
*/
constructor(x: number, y: number, color: string) {
this.x = x;
this.y = y;
this.color = color;
}
/**
* Getter for this ball
* @returns Td of this ball
*/
get td() {
return getTd(this.x, this.y);
}
/**
* Helper
* @param b Another abll to check for equality with this
* @returns True if balls have same coordinates else false
*/
isEqual(b: Ball) {
if (!b) throw Error("b is undeifneds")
if (!this) throw Error("this is undeifneds")
return this.x === b.x && this.y === b.y;
}
/** Makes generating balls more funny */
@funny
/**
* Creates table of new balls
* @param currentBalls Current balls
* @returns New balls
*/
static generateNewBalls(currentBalls: Ball[]): Array {
const out = [];
for (let i = 0; i < START_NO_OF_BALLS; i++) {
let x: number, y: number, color: string;
do {
[x, y, color] = [getRandomInt(0, MAP_HEIGHT), getRandomInt(0, MAP_WIDTH), Nexts.pop()];
if (currentBalls.length + out.length >= MAP_WIDTH * MAP_HEIGHT) {
finishGame(false);
return out;
}
} while (
out.find(b => b.x === x && b.y === y) ||
currentBalls.find(b => b.x === x && b.y === y)
)
out.push(new Ball(x, y, color));
}
// out.push(new Ball(1, 1, COLORS[1]))
return out;
}
}
/**
* Function used only as a decorator, makes `generateNewBalls` more funny
* @param _target - not used
* @param _propertyKey - name of decorated function
* @param descriptor - object with decorated function
*/
function funny(_target: any, _propertyKey: "generateNewBalls", descriptor: PropertyDescriptor) {
const orig = descriptor.value;
descriptor.value = function(currentBalls: Ball[]) {
let bolzNumber = currentBalls.length + START_NO_OF_BALLS;
if (bolzNumber > 81) bolzNumber = 81
const txts = [
"Mmmmmm masz " + bolzNumber + " kuleczek",
bolzNumber + " pysznych kuleczek",
"Masz jakas rozowa kuleczke?",
"Show me your bolz!",
"Deez nuts",
`Vous avez ${bolzNumber} boules`,
"Yummy yummu yummy, must be funny",
"Ou, I thought you died of ligma",
"Kuleczek moc!!",
"Keep it goin' bro",
"You know deez?",
"Luuubie kuleczki ^^",
"BoulzNumber: " + bolzNumber + ". It's under 9000!",
]
setFunnyText(getRandomEl(txts))
return orig(currentBalls);
};
};
/** Class wraper for showing next balls */
export class Nexts {
/** HTMLDivElements that shows next balls */
static els = Array.from(document.querySelectorAll("#next div")) as HTMLDivElement[]
/** Setter to properly set new next balls */
static setEls() {
for (const el of this.els) {
if (el.style.backgroundColor === "") {
el.style.backgroundColor = getRandomEl(COLORS);
}
}
}
/** Function to get first new color and rotate rest of them */
static pop() {
const out = this.els[0].style.backgroundColor;
this.els[0].style.backgroundColor = this.els[1].style.backgroundColor;
this.els[1].style.backgroundColor = this.els[2].style.backgroundColor
this.els[2].style.backgroundColor = getRandomEl(COLORS)
return out;
}
}
|