1210 lines
39 KiB
JavaScript
1210 lines
39 KiB
JavaScript
//-----------------------------------------------------------------------------
|
|
// OMORI Minigame - Space invaders
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// * Object (Player/Enemy)
|
|
//-----------------------------------------------------------------------------
|
|
function SpaceInvaderObject() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
SpaceInvaderObject.prototype = Object.create(Sprite_Base.prototype);
|
|
SpaceInvaderObject.prototype.constructor = SpaceInvaderObject;
|
|
|
|
SpaceInvaderObject.prototype.initialize = function (type, x, y, index) {
|
|
Sprite_Base.prototype.initialize.call(this);
|
|
this.type = type;
|
|
this.dead = false;
|
|
this.movingDown = false;
|
|
this.hasPowerUp = false;
|
|
if (this.type === 'player') {
|
|
this.setupPlayer();
|
|
} else if (this.type === 'powerUp') {
|
|
this.setupPowerUp();
|
|
} else {
|
|
this.setupEnemy(type, x, y, index);
|
|
}
|
|
}
|
|
|
|
SpaceInvaderObject.prototype.setupPlayer = function() {
|
|
this.type = 'player';
|
|
this.index = 0;
|
|
this.currentHP = 3;
|
|
this.speed = 3;
|
|
this.shootDelay = 0;
|
|
this.shootSpeed = 20;
|
|
this.bulletSpeed = 6;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Ship');
|
|
this.x = 176;
|
|
this.y = (Graphics.boxHeight - this.bitmap.height) / 2 + 78;
|
|
this.hasPowerUp = false;
|
|
}
|
|
|
|
SpaceInvaderObject.prototype.setupPowerUp = function () {
|
|
this.type = 'powerUp';
|
|
this.index = 0;
|
|
this.currentHP = 1;
|
|
this.speed = Math.random() * (2 - 0.4) + 0.4;;
|
|
this.shootDelay = 0;
|
|
this.shootSpeed = 20;
|
|
this.bulletSpeed = 0;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-PowerUp');
|
|
this.x = 480;
|
|
this.y = 140 + 80;
|
|
this.hasPowerUp = false;
|
|
}
|
|
|
|
SpaceInvaderObject.prototype.setupEnemy = function(type, x, y, index) {
|
|
this.index = index;
|
|
this.x = x;
|
|
this.y = y;
|
|
this.movementTiming = 0;
|
|
this.bulletSpeed = 1;
|
|
this.shootDelay = 0;
|
|
this.shootSpeed = 35;
|
|
|
|
if (this.type === "Lv1") {
|
|
this.hp = 1;
|
|
this.currentHP = this.hp;
|
|
this.speed = 60;
|
|
this.points = 5;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 1;
|
|
this.shootSpeed = 60;
|
|
}
|
|
if (this.type === "Lv2") {
|
|
this.hp = 1;
|
|
this.currentHP = this.hp;
|
|
this.speed = 50;
|
|
this.points = 20;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 2;
|
|
this.shootSpeed = 45;
|
|
}
|
|
if (this.type === "Lv3") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 30;
|
|
this.points = 50;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 3;
|
|
this.shootSpeed = 30;
|
|
}
|
|
if (this.type === "Lv4") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 40;
|
|
this.points = 75;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 2;
|
|
this.shootSpeed = 45;
|
|
}
|
|
if (this.type === "Lv5") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 25;
|
|
this.points = 100;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 3;
|
|
this.shootSpeed = 35;
|
|
}
|
|
if (this.type === "Lv6") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 15;
|
|
this.points = 125;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 4;
|
|
this.shootSpeed = 20;
|
|
}
|
|
if (this.type === "Lv7") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 50;
|
|
this.points = 125;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 4;
|
|
this.shootSpeed = 50;
|
|
}
|
|
if (this.type === "Lv8") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 40;
|
|
this.points = 150;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 3;
|
|
this.shootSpeed = 20;
|
|
}
|
|
if (this.type === "Lv9") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 20;
|
|
this.points = 175;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 3;
|
|
this.shootSpeed = 20;
|
|
}
|
|
if (this.type === "Lv10") {
|
|
this.hp = 2;
|
|
this.currentHP = this.hp;
|
|
this.speed = 10;
|
|
this.points = 250;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 3;
|
|
this.shootSpeed = 20;
|
|
}
|
|
if (this.type === "Special") {
|
|
this.hp = 1;
|
|
this.currentHP = this.hp;
|
|
this.speed = 10;
|
|
this.points = 500;
|
|
this.bitmap = ImageManager.loadPicture('INVADER-Enemy');
|
|
this.bulletSpeed = 5;
|
|
this.shootSpeed = 20;
|
|
}
|
|
}
|
|
|
|
SpaceInvaderObject.prototype.update = function () {
|
|
if (SceneManager._scene._gamePaused) return;
|
|
// Object Movement
|
|
if (this.type === 'player') { // Player Movement
|
|
if (Input.isPressed('up') && !Input.isPressed('down')) {
|
|
this.y -= this.speed;
|
|
if (this.y < 140) this.y = 140;
|
|
} else if (Input.isPressed('down') && !Input.isPressed('up')) {
|
|
this.y += this.speed;
|
|
if (this.y > 340) this.y = 340;
|
|
}
|
|
if (this.hasPowerUp) {
|
|
this.powerUpTimer--;
|
|
if (this.powerUpTimer <= 0) {
|
|
this.hasPowerUp = false;
|
|
}
|
|
}
|
|
} else if (this.type === 'powerUp') {
|
|
this.x -= this.speed;
|
|
} else { // Enemy Movement
|
|
if (this.movementTiming <= 0) {
|
|
this.movementTiming = this.speed;
|
|
if (this.moveLeft) {
|
|
this.x -= 24;
|
|
this.moveLeft = false;
|
|
} else {
|
|
if (this.movingDown) this.y += 12;
|
|
else this.y -= 12;
|
|
}
|
|
}
|
|
this.movementTiming--;
|
|
}
|
|
}
|
|
|
|
SpaceInvaderObject.prototype.shoot = function (angle) {
|
|
var direction = this.type === 'player' ? 1 : -1;
|
|
var offset = this.type === 'player' ? 18 : 20;
|
|
var shot = new SpaceInvaderShot(this.x + (12 * direction), this.y + offset, this.bulletSpeed, direction, angle);
|
|
SceneManager._scene.addChild(shot);
|
|
return shot;
|
|
}
|
|
|
|
SpaceInvaderObject.prototype.flicker = function() {
|
|
this._flicker = 40;
|
|
if (this._flicker > 0) {
|
|
if (this._flicker === 45 || this._flicker === 40 || this._flicker === 35 || this._flicker === 30 || this._flicker === 25) {
|
|
this.visible = this.visible ? false : true;
|
|
}
|
|
this._flicker--;
|
|
if (this._flicker <= 0) {
|
|
this.visible = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// * Other Objects
|
|
//-----------------------------------------------------------------------------
|
|
function SpaceInvaderBarricade(x, y) {
|
|
this.initialize(x, y);
|
|
}
|
|
|
|
SpaceInvaderBarricade.prototype = Object.create(Sprite_Base.prototype);
|
|
SpaceInvaderBarricade.prototype.constructor = SpaceInvaderBarricade;
|
|
|
|
SpaceInvaderBarricade.prototype.initialize = function (x, y) {
|
|
Sprite_Base.prototype.initialize.call(this);
|
|
this.x = x;
|
|
this.y = y;
|
|
|
|
this.bitmap = new Bitmap(32, 64);
|
|
this.bitmap.fillRect(0, 0, 32, 64, '#5000bb'); // = ImageManager.loadPicture('INVADER-Barricade');
|
|
}
|
|
|
|
SpaceInvaderBarricade.prototype.takeDamage = function (x, y) {
|
|
var x = Math.floor(x/2) * 2;
|
|
var y = Math.floor(y/2) * 2;
|
|
|
|
var shapes = [0, 1, 2, 3, 4];
|
|
var curElement = shapes.length;
|
|
var temp;
|
|
var randomizedLoc;
|
|
|
|
while (0 !== curElement) {
|
|
randomizedLoc = Math.floor(Math.random() * curElement);
|
|
curElement -= 1;
|
|
temp = shapes[curElement];
|
|
shapes[curElement] = shapes[randomizedLoc];
|
|
shapes[randomizedLoc] = temp;
|
|
}
|
|
switch (shapes[0]) {
|
|
case 0:
|
|
this.bitmap.clearRect(x - 2, y - 2, 4, 4);
|
|
this.bitmap.clearRect(x + 2, y - 4, 2, 4);
|
|
this.bitmap.clearRect(x + 4, y, 2, 2);
|
|
this.bitmap.clearRect(x + 2, y + 2, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y + 2, 2, 2);
|
|
this.bitmap.clearRect(x - 6, y, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y - 4, 2, 2);
|
|
this.bitmap.clearRect(x - 2, y - 6, 2, 2);
|
|
break;
|
|
case 1:
|
|
this.bitmap.clearRect(x - 3, y - 2, 4, 4);
|
|
this.bitmap.clearRect(x + 2, y - 4, 2, 4);
|
|
this.bitmap.clearRect(x + 4, y, 2, 2);
|
|
this.bitmap.clearRect(x + 1, y + 2, 4, 5);
|
|
this.bitmap.clearRect(x - 4, y + 2, 2, 2);
|
|
this.bitmap.clearRect(x - 6, y, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y - 4, 2, 2);
|
|
this.bitmap.clearRect(x - 2, y - 6, 3, 3);
|
|
break;
|
|
case 2:
|
|
this.bitmap.clearRect(x - 4, y - 3, 2, 2);
|
|
this.bitmap.clearRect(x + 2, y - 4, 1, 1);
|
|
this.bitmap.clearRect(x + 4, y, 2, 2);
|
|
this.bitmap.clearRect(x + 2, y + 2, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y + 2, 4, 4);
|
|
this.bitmap.clearRect(x - 6, y, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y - 4, 2, 2);
|
|
this.bitmap.clearRect(x - 2, y - 6, 2, 2);
|
|
break;
|
|
case 3:
|
|
this.bitmap.clearRect(x - 2, y, 5, 5);
|
|
this.bitmap.clearRect(x + 2, y - 2, 2, 2);
|
|
this.bitmap.clearRect(x + 4, y, 2, 2);
|
|
this.bitmap.clearRect(x + 2, y + 2, 2, 2);
|
|
this.bitmap.clearRect(x - 3, y + 3, 2, 2);
|
|
this.bitmap.clearRect(x - 5, y + 5, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y - 4, 3, 3);
|
|
this.bitmap.clearRect(x - 2, y - 6, 1, 1);
|
|
break;
|
|
case 4:
|
|
this.bitmap.clearRect(x - 2, y - 2, 2, 2);
|
|
this.bitmap.clearRect(x + 2, y - 4, 3, 2);
|
|
this.bitmap.clearRect(x + 4, y, 4, 6);
|
|
this.bitmap.clearRect(x + 2, y + 2, 1, 1);
|
|
this.bitmap.clearRect(x - 4, y + 2, 2, 2);
|
|
this.bitmap.clearRect(x - 6, y, 2, 2);
|
|
this.bitmap.clearRect(x - 4, y - 4, 2, 2);
|
|
this.bitmap.clearRect(x - 2, y - 6, 2, 2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
SpaceInvaderBarricade.prototype.checkIfDamaged = function(x, y) {
|
|
x = x - this.x;
|
|
y = y - this.y;
|
|
|
|
var solid = this.bitmap._context.getImageData(x, y, 1, 1);
|
|
if (solid.data[3] !== 0) {
|
|
this.takeDamage(x, y);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// * Ammo Objects
|
|
//-----------------------------------------------------------------------------
|
|
function SpaceInvaderShot(x, y, speed, direction, angle) {
|
|
this.initialize(x, y, speed, direction, angle);
|
|
}
|
|
|
|
SpaceInvaderShot.prototype = Object.create(Sprite_Base.prototype);
|
|
SpaceInvaderShot.prototype.constructor = SpaceInvaderShot;
|
|
|
|
SpaceInvaderShot.prototype.initialize = function (x, y, speed, direction, angle) {
|
|
Sprite_Base.prototype.initialize.call(this);
|
|
|
|
this.x = x;
|
|
this.y = y;
|
|
this.angle = angle;
|
|
this.speed = speed;
|
|
this.direction = direction;
|
|
|
|
if (this.direction === 1) {
|
|
this.bitmap = new Bitmap(7, 2);
|
|
this.bitmap.fillRect(0, 0, 7, 2, '#ffffff'); // ImageManager.loadPicture('INVADER-PSHOT');
|
|
} else {
|
|
this.bitmap = new Bitmap(7, 2);
|
|
this.bitmap.fillRect(0, 0, 7, 2, '#dc3aff'); // this.bitmap = ImageManager.loadPicture('INVADER-ESHOT');
|
|
}
|
|
}
|
|
|
|
SpaceInvaderShot.prototype.update = function() {
|
|
Sprite_Base.prototype.update.call(this);
|
|
if (SceneManager._scene._gamePaused) return;
|
|
this.x += this.direction * this.speed;
|
|
|
|
if (this.angle) {
|
|
this.y += this.angle * (this.speed / 2);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// * Game
|
|
//=============================================================================
|
|
function Scene_SpaceInvader() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
Scene_SpaceInvader.prototype = Object.create(Scene_Base.prototype);
|
|
Scene_SpaceInvader.prototype.constructor = Scene_MenuBase;
|
|
|
|
Scene_SpaceInvader.prototype.initialize = function() {
|
|
Scene_Base.prototype.initialize.call(this);
|
|
this._mapMusic = AudioManager.saveBgm();
|
|
ImageManager.loadAtlas("MN_Invader");
|
|
this._exitFade = 0;
|
|
|
|
this._titleShowing = true;
|
|
this._gamePaused = true;
|
|
|
|
this._lives = 3;
|
|
this._enemies = [];
|
|
this._barricades = [];
|
|
this._power = null;
|
|
this.movingDown = false;
|
|
this._bullets = [];
|
|
this._score = 0;
|
|
this._level = 1;
|
|
|
|
// Game Started
|
|
this._gameInProgress = false;
|
|
this._resultsOpen = false;
|
|
this._startingGame = false;
|
|
|
|
var bgm = {
|
|
name: "minigame_space",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playBgm(bgm);
|
|
|
|
this.powerSpawnDelay = 0;
|
|
this.powerSpawnSpeed = 20;
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.create = function () {
|
|
Scene_Base.prototype.create.call(this);
|
|
this.createBackground();
|
|
this.startFadeIn(60, false);
|
|
this._UIWindow = new Window_SpaceInvaderUI();
|
|
this.addChild(this._UIWindow);
|
|
this._UIWindow.visible = false;
|
|
|
|
this._player = new SpaceInvaderObject('player');
|
|
this.addChild(this._player);
|
|
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.createBackground = function () {
|
|
this.mainImage = new Sprite();
|
|
this.mainImage.bitmap = ImageManager.loadPicture("INVADER-Background");
|
|
this.mainImage.x = 160;
|
|
this.mainImage.y = 96;
|
|
this.addChild(this.mainImage);
|
|
|
|
this.parallaxStars = new TilingSprite();
|
|
this.parallaxStars.bitmap = ImageManager.loadPicture("INVADER-Parallax");
|
|
this.parallaxStars.move(160, 96, 320, 288);
|
|
this.addChild(this.parallaxStars);
|
|
};
|
|
|
|
Scene_SpaceInvader.prototype.startGame = function() {
|
|
this._titleShowing = false;
|
|
this._getIntoPosition = false;
|
|
this._logo = null;
|
|
this.removeChild(this._boundary);
|
|
this._boundary = null;
|
|
this._startingGame = false;
|
|
this._gamePaused = false;
|
|
this._gameInProgress = true;
|
|
this._UIWindow.visible = true;
|
|
|
|
this.setupEnemies(1);
|
|
this.setupBarricades(3);
|
|
this.updateUI();
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.setupBarricades = function(amount) {
|
|
for (var i = 0; i < amount; i++) {
|
|
var yPos = 148;
|
|
if (amount == 2) yPos += 42;
|
|
if (amount == 1) yPos += 78;
|
|
var newBarricade = new SpaceInvaderBarricade(176 + 48, yPos + (i * 78));
|
|
this.addChild(newBarricade);
|
|
this._barricades.push(newBarricade);
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.clearEnemies = function() {
|
|
if (this._enemies.length > 0) {
|
|
for (var i = 0; i < this._enemies.length; i++) {
|
|
this.removeChild(this._enemies[i]);
|
|
}
|
|
this._enemies = [];
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.setupEnemies = function(level) {
|
|
// Clear enemies from previous round
|
|
this.clearEnemies();
|
|
this.removeResultImg();
|
|
|
|
if (level <= 3) { // Levels 1, 2, and 3
|
|
var maxEnemies = 10;
|
|
var startPositionX = 320;
|
|
var startPositionY = 240;
|
|
var horzSpacing = 32;
|
|
var vertSpacing = 40;
|
|
|
|
for (var i = 0; i < maxEnemies; i++) {
|
|
var newEnemy = new SpaceInvaderObject('Lv' + level, startPositionX + (i % 5 * horzSpacing), startPositionY + (i % 2 * vertSpacing), i);
|
|
this.addChild(newEnemy);
|
|
this._enemies.push(newEnemy);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (level > 3 && level <= 6) { // Levels 4, 5, and 6
|
|
var maxEnemies = 15;
|
|
var startPositionX = 320;
|
|
var startPositionY = 240;
|
|
var horzSpacing = 32;
|
|
var vertSpacing = 40;
|
|
|
|
for (var i = 0; i < maxEnemies; i++) {
|
|
var newEnemy = new SpaceInvaderObject('Lv' + level, startPositionX + (i % 5 * horzSpacing), startPositionY + (i % 3 * vertSpacing), i);
|
|
this.addChild(newEnemy);
|
|
this._enemies.push(newEnemy);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (level > 6) { // Levels 7, 8, 9, and 10
|
|
var maxEnemies = 20;
|
|
var startPositionX = 320;
|
|
var startPositionY = 160;
|
|
var horzSpacing = 32;
|
|
var vertSpacing = 40;
|
|
|
|
for (var i = 0; i < maxEnemies; i++) {
|
|
var newEnemy = new SpaceInvaderObject('Lv' + level, startPositionX + (i % 5 * horzSpacing), startPositionY + (i % 4 * vertSpacing), i);
|
|
this.addChild(newEnemy);
|
|
this._enemies.push(newEnemy);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.updateUI = function() {
|
|
this._UIWindow._lives = this._lives;
|
|
this._UIWindow._score = this._score;
|
|
this._UIWindow.refresh();
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.updateTitle = function() {
|
|
if (this._exitFade > 0) {
|
|
this._exitFade--;
|
|
if (this._logo) this._logo.opacity -= 12;
|
|
if (this.mainImage) this.mainImage.opacity -= 12;
|
|
if (this._pressKey) this._pressKey.opacity -= 12;
|
|
if (this._UIWindow) this._UIWindow.opacity -= 12;
|
|
if (this._player) this._player.opacity -= 12;
|
|
if (this._parallaxStars) this._parallaxStars.opacity -= 12;
|
|
|
|
if (this._exitFade <= 0) {
|
|
this.removeChild(this._logo);
|
|
this.removeChild(this._player);
|
|
this.removeChild(this._UIWindow);
|
|
this.removeChild(this.mainImage);
|
|
this.removeChild(this.parallaxStars);
|
|
this.removeChild(this._pressKey);
|
|
|
|
this.popScene();
|
|
$gameSystem.replayBgm();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (this._titleShowing) {
|
|
if (Input.isTriggered('cancel')) {
|
|
this.startFadeOut(30);
|
|
$gameParty._gold += 1;
|
|
this._exitFade = 30;
|
|
}
|
|
if (!this._logo) {
|
|
this._player.visible = true;
|
|
this._player.y = (Graphics.boxHeight - this._player.bitmap.height) / 2 + 78;
|
|
|
|
this._logo = new Sprite();
|
|
this._logo.bitmap = ImageManager.loadPicture("INVADER-Title");
|
|
this._logo.x = 160 + 12;
|
|
this._logo.y = 96 + 64;
|
|
this.addChild(this._logo);
|
|
|
|
this._pressKey = new Sprite();
|
|
this._pressKey.bitmap = ImageManager.loadPicture("INVADER-Prompt");
|
|
this._pressKey.x = 160 + 12;
|
|
this._pressKey.y = 96 + 64;
|
|
this.addChild(this._pressKey);
|
|
}
|
|
if (Input.isTriggered('ok')) {
|
|
if (this._flicker || this._getIntoPosition) return;
|
|
this._flicker = 40;
|
|
var se = {
|
|
name: "mini_csb_start",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
}
|
|
if (this._flicker > 0) {
|
|
if (this._flicker === 45 || this._flicker === 40 || this._flicker === 35 || this._flicker === 30 || this._flicker === 25) {
|
|
this._pressKey.visible = this._pressKey.visible ? false : true;
|
|
}
|
|
this._flicker--;
|
|
if (this._flicker <= 0) {
|
|
this.removeChild(this._pressKey);
|
|
|
|
this._getIntoPosition = true;
|
|
this.removeChild(this._logo);
|
|
|
|
}
|
|
}
|
|
if (this._getIntoPosition) {
|
|
this._pressKey = new Sprite();
|
|
this._pressKey.bitmap = ImageManager.loadPicture("INVADER-Boundary");
|
|
this.addChild(this._pressKey);
|
|
|
|
this._player.x += 4;
|
|
if (this._player.x > (this._UIWindow.width + this._UIWindow.x)) {
|
|
this._player.x = this._UIWindow.x - this._player.width;
|
|
// this._player.y = (Graphics.boxHeight - this._player.bitmap.height) / 2;
|
|
this._startingGame = true;
|
|
}
|
|
if (this._player.x >= 176 && this._startingGame) this.startGame();
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.updatePlayerShoot = function() {
|
|
if (Input.isPressed('ok') && this._player.shootDelay <= 0) {
|
|
if (this._player.hasPowerUp) {
|
|
this._bullets.push(this._player.shoot(-1));
|
|
this._bullets.push(this._player.shoot());
|
|
this._bullets.push(this._player.shoot(1));
|
|
} else {
|
|
this._bullets.push(this._player.shoot());
|
|
}
|
|
this._player.shootDelay = this._player.shootSpeed;
|
|
var se = {
|
|
name: "mini_csb_laser",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
} else if (Input.isTriggered('ok')) {
|
|
if (this._player.hasPowerUp) {
|
|
this._bullets.push(this._player.shoot(-1));
|
|
this._bullets.push(this._player.shoot());
|
|
this._bullets.push(this._player.shoot(1));
|
|
} else {
|
|
this._bullets.push(this._player.shoot());
|
|
}
|
|
this._player.shootDelay = this._player.shootSpeed;
|
|
var se = {
|
|
name: "mini_csb_laser",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
}
|
|
// When button is held, add delay to shooting so it does not come out like a laser
|
|
if (this._player.shootDelay > 0) {
|
|
this._player.shootDelay--;
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.givePowerUp = function() {
|
|
this._player.hasPowerUp = true;
|
|
this._player.powerUpTimer = 300; // 5 seconds
|
|
|
|
var se = {
|
|
name: "mini_csb_start",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.updatePowerUpMovement = function() {
|
|
if (!this._power) {
|
|
var rando = Math.floor(Math.random() * Math.floor(1000));
|
|
if (rando > 996 && !this._player.hasPowerUp && this.powerSpawnDelay <= 0) {
|
|
this._power = new SpaceInvaderObject('powerUp');
|
|
this._power.y = Math.floor(Math.random() * (340 - 140 + 1)) + 140;
|
|
this.addChild(this._power);
|
|
this.powerSpawnDelay = this.powerSpawnSpeed;
|
|
}
|
|
} else {
|
|
if (this._power.x < this._UIWindow.x || this._power.x > (this._UIWindow.width + this._UIWindow.x) || this._power.y < this._UIWindow.y || this._power.y > (this._UIWindow.height + this._UIWindow.y)) {
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
return;
|
|
}
|
|
// Collision with player
|
|
var p = this._player;
|
|
|
|
if ((this._power.x > p.x && this._power.x < (p.x + p.width) && this._power.y > p.y && this._power.y < (p.y + p.height)) ||
|
|
(p.x > this._power.x && p.x < (this._power.x + this._power.width) && p.y > this._power.y && p.y < (this._power.y + this._power.width))) {
|
|
this.givePowerUp();
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
this.updateUI();
|
|
return;
|
|
}
|
|
if (!this._player.hasPowerUp) {
|
|
if (this.powerSpawnDelay > 0) {
|
|
this.powerSpawnDelay--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.updateEnemyMovement = function() {
|
|
for (var i = 0; i < this._enemies.length; i++) {
|
|
if(!this._enemies[i]) {continue;}
|
|
if (this._enemies[i].dead) continue;
|
|
if (this._enemies[i].y <= 140 && !this.movingDown) {
|
|
for (var j = 0; j < this._enemies.length; j++) {
|
|
this._enemies[j].movingDown = true;
|
|
this._enemies[j].moveLeft = true;
|
|
}
|
|
this.movingDown = true;
|
|
} else if (this._enemies[i].y >= 340 && this.movingDown) {
|
|
for (var j = 0; j < this._enemies.length; j++) {
|
|
this._enemies[j].movingDown = false;
|
|
this._enemies[j].moveLeft = true;
|
|
}
|
|
this.movingDown = false;
|
|
}
|
|
if(!this._player) {continue;}
|
|
if(!!this._player.dead) {break;}
|
|
if (this._enemies[i].x < this._player.x) { // Beyond the player's boundary
|
|
this.playerDie();
|
|
this.updateUI();
|
|
}
|
|
|
|
var p = this._player;
|
|
if(!!this._player.dead) {break;}
|
|
if (this._enemies[i].x > p.x && this._enemies[i].x < p.x + p.width && this._enemies[i].y > p.y && this._enemies[i].y < p.y + p.height) {
|
|
this.playerDie();
|
|
this.updateUI();
|
|
}
|
|
}
|
|
|
|
//=========================================================================
|
|
// Randomized enemy shooting
|
|
//=========================================================================
|
|
for (var i = 0; i < this._enemies.length; i++) {
|
|
if (this._enemies[i].dead) continue;
|
|
var rando = Math.floor(Math.random() * Math.floor(1000));
|
|
if (rando > 996 && this._enemies[i].shootDelay <= 0) {
|
|
this._bullets.push(this._enemies[i].shoot());
|
|
this._enemies[i].shootDelay = this._enemies[i].shootSpeed;
|
|
}
|
|
if (this._enemies[i].shootDelay > 0) {
|
|
this._enemies[i].shootDelay--;
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.playerDie = function(bullet) {
|
|
var se = {
|
|
name: "mini_csb_death",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
|
|
var color = [255, 255, 255, 255];
|
|
$gameScreen.startFlash(color, 60);
|
|
// Remove all bullets
|
|
for (var i = 0; i < this._bullets.length; i++) {
|
|
this.removeChild(this._bullets[i]);
|
|
}
|
|
this._bullets = [];
|
|
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
|
|
// Make player invisible
|
|
this._player.visible = false;
|
|
this._player.dead = true;
|
|
this._player.hasPowerUp = false;
|
|
// Pause all action
|
|
this._gamePaused = true;
|
|
|
|
// Remove life and respawn
|
|
this._lives--;
|
|
if (this._lives > 0) {
|
|
this._gamePaused = true;
|
|
this._resultsOpen = true;
|
|
this._resultTimer = 60;
|
|
this._resultImg = new Sprite();
|
|
this._resultImg.bitmap = ImageManager.loadPicture("INVADER-Dead");
|
|
this._resultImg.x = 160 + 12;
|
|
this._resultImg.y = 96 + 64;
|
|
this.addChild(this._resultImg);
|
|
} else {
|
|
AudioManager.stopBgm();
|
|
this.clearEnemies();
|
|
for (var i = 0; i < this._barricades.length; i++) {
|
|
this.removeChild(this._barricades[i]);
|
|
}
|
|
// Remove all bullets
|
|
for (var i = 0; i < this._bullets.length; i++) {
|
|
this.removeChild(this._bullets[i]);
|
|
}
|
|
this._bullets = [];
|
|
this._barricades = [];
|
|
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
this._gameOver = true;
|
|
this._gamePaused = true;
|
|
this._resultsOpen = true;
|
|
this._resultTimer = 60;
|
|
this._resultImg = new Sprite();
|
|
this._resultImg.bitmap = ImageManager.loadPicture("INVADER-GameOver");
|
|
this._resultImg.x = 160 + 12;
|
|
this._resultImg.y = 96 + 64;
|
|
this.addChild(this._resultImg);
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.updateAllBullets = function() {
|
|
for (var i = 0; i < this._bullets.length; i++) {
|
|
this._bullets[i].update();
|
|
// If bullet goes off screen
|
|
if (this._bullets[i].x < this._UIWindow.x || this._bullets[i].x > (this._UIWindow.width + this._UIWindow.x) || this._bullets[i].y < this._UIWindow.y || this._bullets[i].y > (this._UIWindow.height + this._UIWindow.y) ) {
|
|
this.removeChild(this._bullets[i]);
|
|
this._bullets.splice(i, 1);
|
|
}
|
|
// Collision
|
|
var collideObject = this.checkCollide(this._bullets[i]);
|
|
if (collideObject != null) {
|
|
if (collideObject.type) {
|
|
if (collideObject.type === 'player') { // The player got hit!
|
|
this.playerDie();
|
|
this.removeChild(this._bullets[i]);
|
|
this._bullets.splice(i, 1);
|
|
i--;
|
|
this.updateUI();
|
|
} else { // An enemy got hit!
|
|
var se = {
|
|
name: "mini_csb_enemy_ship_dead",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
|
|
// Do damage
|
|
// collideObject.currentHP--;
|
|
// collideObject.flicker();
|
|
// if (collideObject.currentHP < 1) {
|
|
// this._score += collideObject.points;
|
|
|
|
// collideObject.dead = true;
|
|
// collideObject.visible = false;
|
|
// }
|
|
|
|
this._score += collideObject.points;
|
|
|
|
collideObject.dead = true;
|
|
collideObject.visible = false;
|
|
|
|
this.removeChild(this._bullets[i]);
|
|
this._bullets.splice(i, 1);
|
|
i--;
|
|
this.updateUI();
|
|
}
|
|
} else {
|
|
if (collideObject.checkIfDamaged(this._bullets[i].x, this._bullets[i].y)) {
|
|
this.removeChild(this._bullets[i]);
|
|
this._bullets.splice(i, 1);
|
|
i--;
|
|
}
|
|
}
|
|
if (!this._resultImg && !this._resultsOpen) this.checkStageComplete();
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.update = function() {
|
|
Scene_Base.prototype.update.call(this);
|
|
this.parallaxStars.origin.x += 0;
|
|
this.parallaxStars.origin.y += 1;
|
|
if (this._exitFade > 0) {
|
|
this._exitFade--;
|
|
if (this._logo) this._logo.opacity -= 12;
|
|
if (this.mainImage) this.mainImage.opacity -= 12;
|
|
if (this._pressKey) this._pressKey.opacity -= 12;
|
|
if (this._UIWindow) this._UIWindow.opacity -= 12;
|
|
if (this._player) this._player.opacity -= 12;
|
|
if (this._parallaxStars) this._parallaxStars.opacity -= 12;
|
|
|
|
if (this._exitFade <= 0) {
|
|
this.removeChild(this._logo);
|
|
this.removeChild(this._player);
|
|
this.removeChild(this._UIWindow);
|
|
this.removeChild(this.mainImage);
|
|
this.removeChild(this.parallaxStars);
|
|
this.removeChild(this._pressKey);
|
|
|
|
this.popScene();
|
|
$gameSystem.replayBgm();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (this._resultTimer > 0) {
|
|
this._resultTimer--;
|
|
return;
|
|
}
|
|
this.updateTitle();
|
|
//=========================================================================
|
|
// Win/Lose/Die
|
|
//=========================================================================
|
|
if (this._resultsOpen) {
|
|
if (Input.isTriggered('ok')) {
|
|
if (this._gameOver) {
|
|
this.startFadeOut(12);
|
|
this.goToTitle();
|
|
} else if (this._gameComplete) {
|
|
this.startFadeOut(12);
|
|
this.goToTitle();
|
|
this._gameComplete = false;
|
|
} else if (this._nextStage) {
|
|
this.removeResultImg();
|
|
this.goToNextStage();
|
|
} else if (this._player.dead) {
|
|
this.respawnPlayer();
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (this._gamePaused) return;
|
|
//=========================================================================
|
|
// Player shoot on input
|
|
//=========================================================================
|
|
this.updatePlayerShoot();
|
|
|
|
//=========================================================================
|
|
// Enemy Movement
|
|
//=========================================================================
|
|
this.updateEnemyMovement();
|
|
|
|
//=========================================================================
|
|
// Power Up Movement
|
|
//=========================================================================
|
|
this.updatePowerUpMovement();
|
|
|
|
//=========================================================================
|
|
// Update all bullets
|
|
//=========================================================================
|
|
this.updateAllBullets();
|
|
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.removeResultImg = function() {
|
|
if (this._resultImg) {
|
|
this._resultsOpen = false;
|
|
this._resultImg.visible = false;
|
|
this.removeChild(this._resultImg);
|
|
this._resultImg = null;
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.checkCollide = function (bullet) {
|
|
if (!bullet) return;
|
|
for (var i = 0; i < this._barricades.length; i++) {
|
|
var block = this._barricades[i];
|
|
if (bullet.x > block.x && bullet.x < block.x + block.width && bullet.y > block.y && bullet.y < block.y + block.height) {
|
|
return block;
|
|
}
|
|
|
|
}
|
|
if (bullet.direction === -1) {
|
|
var p = this._player;
|
|
if (bullet.x > p.x && bullet.x < p.x + p.width && bullet.y > p.y && bullet.y < p.y + p.height) {
|
|
return p;
|
|
}
|
|
} else {
|
|
for (var i = 0; i < this._enemies.length; i++) {
|
|
if (this._enemies[i] === null || this._enemies[i].dead) continue;
|
|
e = this._enemies[i];
|
|
if (bullet.x > e.x && bullet.x < e.x + e.width && bullet.y > e.y && bullet.y < e.y + e.height) {
|
|
return e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.checkStageComplete = function () {
|
|
for (var i = 0; i < this._enemies.length; i++) {
|
|
if (this._enemies[i].dead) {
|
|
var allDead = true; continue;
|
|
} else { var allDead = false; break; }
|
|
}
|
|
if (allDead) {
|
|
var se = {
|
|
name: "mini_csb_crisis_averted",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playSe(se);
|
|
|
|
this._gamePaused = true;
|
|
this._resultsOpen = true;
|
|
this._resultTimer = 60;
|
|
this._resultImg = new Sprite();
|
|
this._resultImg.bitmap = ImageManager.loadPicture("INVADER-Complete");
|
|
this._resultImg.x = 160 + 12;
|
|
this._resultImg.y = 96 + 64;
|
|
this.addChild(this._resultImg);
|
|
this._nextStage = true;
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.goToTitle = function() {
|
|
this.clearEnemies();
|
|
// Remove all barricades
|
|
for (var i = 0; i < this._barricades.length; i++) {
|
|
this.removeChild(this._barricades[i]);
|
|
}
|
|
// Remove all bullets
|
|
for (var i = 0; i < this._bullets.length; i++) {
|
|
this.removeChild(this._bullets[i]);
|
|
}
|
|
this._bullets = [];
|
|
this._barricades = [];
|
|
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
|
|
this._gameInProgress = false;
|
|
this._gamePaused = true;
|
|
$gameVariables.setValue(641, this._score);
|
|
this._score = 0;
|
|
this._lives = 3;
|
|
this._level = 1;
|
|
this._UIWindow.visible = false;
|
|
this.removeResultImg();
|
|
this._gameOver = false;
|
|
this.movingDown = false;
|
|
|
|
this.startFadeOut(30);
|
|
this._exitFade = 30;
|
|
|
|
return;
|
|
|
|
this._titleShowing = true;
|
|
|
|
var bgm = {
|
|
name: "SPACE ADVENTURES - REALISTIC SPACE SIMULATION",
|
|
volume: 100,
|
|
pitch: 100,
|
|
pan: 0
|
|
};
|
|
AudioManager.playBgm(bgm);
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.goToNextStage = function () {
|
|
this.clearEnemies();
|
|
// Remove all bullets
|
|
for (var i = 0; i < this._bullets.length; i++) {
|
|
this.removeChild(this._bullets[i]);
|
|
}
|
|
this._bullets = [];
|
|
// Remove all barricades
|
|
for (var i = 0; i < this._barricades.length; i++) {
|
|
this.removeChild(this._barricades[i]);
|
|
}
|
|
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
this._barricades = [];
|
|
this._nextStage = false;
|
|
this._gameInProgress = true;
|
|
this._gamePaused = false;
|
|
this.removeResultImg();
|
|
this._level += 1;
|
|
this.movingDown = false;
|
|
if (this._level > 10) {
|
|
this._gamePaused = true;
|
|
this._resultsOpen = true;
|
|
this._resultTimer = 60;
|
|
this._resultImg = new Sprite();
|
|
this._resultImg.bitmap = ImageManager.loadPicture("INVADER-YouWin");
|
|
this._resultImg.x = 160 + 12;
|
|
this._resultImg.y = 96 + 64;
|
|
this.addChild(this._resultImg);
|
|
this._gameComplete = true;
|
|
} else {
|
|
this.setupEnemies(this._level);
|
|
if (this._level <= 3) {
|
|
this.setupBarricades(3);
|
|
} else if (this._level > 3 && this._level <= 7) {
|
|
this.setupBarricades(2);
|
|
} else {
|
|
this.setupBarricades(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.goToStage = function(stageID) {
|
|
this.clearEnemies();
|
|
// Remove all bullets
|
|
for (var i = 0; i < this._bullets.length; i++) {
|
|
this.removeChild(this._bullets[i]);
|
|
}
|
|
this._bullets = [];
|
|
// Remove all barricades
|
|
for (var i = 0; i < this._barricades.length; i++) {
|
|
this.removeChild(this._barricades[i]);
|
|
}
|
|
|
|
this.removeChild(this._power);
|
|
this._power = null;
|
|
this._barricades = [];
|
|
this._nextStage = false;
|
|
this._gameInProgress = true;
|
|
this._gamePaused = false;
|
|
this.removeResultImg();
|
|
this._level = stageID;
|
|
this.movingDown = false;
|
|
if (this._level > 10) {
|
|
this._gamePaused = true;
|
|
this._resultsOpen = true;
|
|
this._resultTimer = 60;
|
|
this._resultImg = new Sprite();
|
|
this._resultImg.bitmap = ImageManager.loadPicture("INVADER-YouWin");
|
|
this._resultImg.x = 160 + 12;
|
|
this._resultImg.y = 96 + 64;
|
|
this.addChild(this._resultImg);
|
|
this._gameComplete = true;
|
|
} else {
|
|
this.setupEnemies(this._level);
|
|
if (this._level <= 3) {
|
|
this.setupBarricades(3);
|
|
} else if (this._level > 3 && this._level <= 7) {
|
|
this.setupBarricades(2);
|
|
} else {
|
|
this.setupBarricades(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
Scene_SpaceInvader.prototype.respawnPlayer = function () {
|
|
this._gameInProgress = true;
|
|
this._gamePaused = false;
|
|
this.removeResultImg();
|
|
this._gameOver = false;
|
|
this._player.y = (Graphics.boxHeight - this._player.bitmap.height) / 2;
|
|
this._player.visible = true;
|
|
this._player.dead = false;
|
|
|
|
this.movingDown = false;
|
|
this.clearEnemies();
|
|
this.setupEnemies(this._level);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
function Window_SpaceInvaderUI() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
Window_SpaceInvaderUI.prototype = Object.create(Window_Base.prototype);
|
|
Window_SpaceInvaderUI.prototype.constructor = Window_SpaceInvaderUI;
|
|
|
|
Window_SpaceInvaderUI.prototype.initialize = function (text) {
|
|
var x = (Graphics.boxWidth - this.windowWidth()) / 2;
|
|
var y = (Graphics.boxHeight - this.windowHeight()) / 2;
|
|
Window_Base.prototype.initialize.call(this, x, y, this.windowWidth(), this.windowHeight());
|
|
this.opacity = 0;
|
|
this._score = 0;
|
|
this._lives = 2;
|
|
this.refresh();
|
|
};
|
|
|
|
Window_SpaceInvaderUI.prototype.windowWidth = function() {
|
|
return 320;
|
|
}
|
|
|
|
Window_SpaceInvaderUI.prototype.windowHeight = function () {
|
|
return 288;
|
|
}
|
|
|
|
Window_SpaceInvaderUI.prototype.standardPadding = function () {
|
|
return 0;
|
|
}
|
|
|
|
Window_SpaceInvaderUI.prototype.refresh = function() {
|
|
this.contents.clear();
|
|
|
|
var bitmap = ImageManager.loadPicture('INVADER-Text');
|
|
this.contents.blt(bitmap, 0, 0, bitmap.width, bitmap.height, 12, 12);
|
|
|
|
var line = ImageManager.loadPicture('INVADER-UI-Line');
|
|
this.contents.blt(line, 0, 0, line.width, line.height, 6, 32);
|
|
|
|
for (var i = 0; i < this._lives - 1; i++) {
|
|
var lives = ImageManager.loadPicture('INVADER-Ship');
|
|
this.contents.blt(lives, 0, 0, lives.width, lives.height, (this.windowWidth() - 70) + (i * 32), 6);
|
|
}
|
|
|
|
var score = this._score.toString();
|
|
for (var i = 0; i < score.length; i++) {
|
|
this.getNumber(parseInt(score[i]), 70 + (i * 12), 12);
|
|
}
|
|
}
|
|
|
|
Window_SpaceInvaderUI.prototype.getNumber = function (index, x, y) {
|
|
var bitmap = ImageManager.loadPicture('INVADER-UI-Numbers');
|
|
var pw = bitmap.width / 10;
|
|
var ph = bitmap.height;
|
|
var n = index;
|
|
var sx = n % 10 * pw;
|
|
var sy = (Math.floor(n / 10)) * ph;
|
|
this.contents.blt(bitmap, sx, sy, pw, ph, x, y);
|
|
}
|