OMORI_Android/www.eng/js/plugins/YIN - Minigame - PetRocks.js
2024-01-15 18:44:53 +03:00

663 lines
21 KiB
JavaScript

// ----------------------------------------------------------------------------
// OMORI Minigame - Pet Rocks
//-----------------------------------------------------------------------------
// Rock Template
//-----------------------------------------------------------------------------
function Rock() {
this.initialize.apply(this, arguments);
}
Rock.prototype = Object.create(Sprite_Base.prototype);
Rock.prototype.construstor = Rock;
Rock.prototype.initialize = function(name) {
Sprite_Base.prototype.initialize.call(this);
// Defaults
this.name = "ROCK-" + name;
this.bitmap = ImageManager.loadPicture("ROCK-" + name);
this.hp = 6;
this.frequency = [33, 33, 33];
this.options = ["rock", "paper", "scissors"];
this.setSprite(false);
this.setupRock(name);
}
Rock.prototype.setupRock = function(name) {
switch (name) {
case "Jash":
this.hp = 3;
this.frequency = [0, 0, 0];
break;
case "TomatoGirl":
this.hp = 3;
this.frequency = [60, 40, 0];
break;
case "RoseLad":
this.hp = 3;
this.frequency = [0, 60, 40];
break;
case "TheMuncherKing":
this.hp = 3;
this.frequency = [40, 0, 60];
break;
case "PapaChip":
this.hp = 3;
this.frequency = [50, 25, 25];
break;
case "Bunny":
this.hp = 3;
this.frequency = [25, 50, 25];
break;
case "SaucyK":
this.hp = 6;
this.frequency = [0, 0, 100];
break;
case "Pluto":
this.hp = 6;
this.frequency = [100, 0, 0];
break;
case "LilG":
this.hp = 4;
this.frequency = [33, 33, 33];
break;
case "P'terry":
this.hp = 5;
this.frequency = [25, 25, 50];
break;
case "CoolSNake":
this.hp = 5;
this.frequency = [25, 50, 25];
break;
case "Ocotaco":
this.hp = 5;
this.frequency = [50, 25, 25];
break;
case "OneWingAsh":
this.hp = 9;
this.frequency = [33, 33, 33];
break;
}
}
Rock.prototype.setSprite = function(attacking) {
var pw = 128;
var ph = 128;
if (attacking) {
var sx = 1 * pw;
var sy = 0;
this.setFrame(sx, sy, pw, ph);
} else {
var sx = 0 * pw;
var sy = 0;
this.setFrame(sx, sy, pw, ph);
}
}
Rock.prototype.flash = function() {
this.flashing = 40;
}
Rock.prototype.update = function() {
if(this.flashing > 0) {
this.flashing --;
if (this.flashing % 5 === 0) this.visible = this.visible ? false : true;
if (this.flashing <= 0) this.visible = true;
}
}
function Rock_Result() {
this.initialize.apply(this, arguments);
}
Rock_Result.prototype = Object.create(Sprite_Base.prototype);
Rock_Result.prototype.construstor = Rock_Result;
Rock_Result.prototype.initialize = function (x, y) {
Sprite_Base.prototype.initialize.call(this);
this.visible = false;
this.bitmap = ImageManager.loadPicture('ROCK-Animation');
this.x = x; this.y = y;
}
Rock_Result.prototype.setSprite = function (result, id) {
var pw = 64;
var ph = 64;
if (result) {
var sx = id * pw;
if (result === "defend") var sy = 0;
if (result === "hit") var sy = 1 * ph;
if (result === "draw") var sy = 2 * ph;
this.setFrame(sx, sy, pw, ph);
this.visible = true;
}
}
//=============================================================================
// Gameplay
//=============================================================================
function Scene_PetRocks() {
this.initialize.apply(this, arguments);
}
Scene_PetRocks.prototype = Object.create(Scene_Base.prototype);
Scene_PetRocks.prototype.constructor = Scene_MenuBase;
Scene_PetRocks.prototype.initialize = function () {
Scene_Base.prototype.initialize.call(this);
this.startFadeIn(this.fadeSpeed(), false);
ImageManager.loadAtlas("MN_PetRocks");
ImageManager.loadPicture("Sequence/ROCK-Intro_01");
ImageManager.loadPicture("Sequence/ROCK-Intro_02");
ImageManager.loadPicture("Sequence/ROCK-Intro_03");
ImageManager.loadPicture("Sequence/ROCK-Intro_04");
ImageManager.loadPicture("Sequence/ROCK-Intro_05");
ImageManager.loadPicture("Sequence/ROCK-Intro_06");
ImageManager.loadPicture("Sequence/ROCK-Intro_07");
this._titleShowing = true;
this._gameEndTimer = 0;
this._onStart = false;
}
Scene_PetRocks.prototype.create = function() {
Scene_Base.prototype.create.call(this);
this.mainImage = new Sprite();
this.mainImage.bitmap = ImageManager.loadPicture('ROCK-Background');
this.addChild(this.mainImage);
this.startGame();
}
Scene_PetRocks.prototype.startGame = function(){
var bgm = {
name: "minigame_jash_title",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playBgm(bgm);
this._player = new Rock("Jash");
this.addChild(this._player);
this._player.x = 160;
this._player.y = 176;
this._player.currentCombo = 1;
this._opponent = new Rock($gameVariables.value(824));
this.addChild(this._opponent);
this._opponent.x = 640 - 160 - 128;
this._opponent.y = 176;
this._opponent.currentCombo = 1;
this._options = new Window_PetRockOptions();
this._options.setHandler('rock', this.onChoice.bind(this, "rock"));
this._options.setHandler('paper', this.onChoice.bind(this, "paper"));
this._options.setHandler('scissors', this.onChoice.bind(this, "scissors"));
this.addChild(this._options);
this._playerHearts = [];
for (var i = 0; i < this._player.hp; i++) {
var sprite = new Sprite();
sprite.bitmap = ImageManager.loadPicture('ROCK-Heart');
sprite.id = i;
sprite.x = 174 + (i % 3 * 32);
sprite.y = 106;
this._playerHearts.push(sprite);
this.addChild(sprite);
}
this._playerHearts.reverse();
this._opponentHearts = [];
for (var i = 0; i < this._opponent.hp; i++) {
var sprite = new Sprite();
sprite.bitmap = ImageManager.loadPicture('ROCK-Heart');
sprite.x = 382 + (i % 3 * 32);
sprite.id = i;
if (i > 5) {
sprite.y = 106 + 28 + 28;
} else if (i > 2) {
sprite.y = 106 + 28;
} else {
sprite.y = 106;
}
this._opponentHearts.push(sprite);
this.addChild(sprite);
}
this._opponentHearts.reverse();
this._comboCounter = new Sprite();
this._comboCounter.bitmap = ImageManager.loadPicture("ROCK-ComboCounter");
this._comboCounter.x = 320 - 37;
this._comboCounter.y = 92;
this.addChild(this._comboCounter);
this._comboNumber = new Sprite();
this._comboNumber.bitmap = ImageManager.loadPicture("ROCK-Combo1");
this._comboNumber.x = 320;
this._comboNumber.y = 114;
this.addChild(this._comboNumber);
}
Scene_PetRocks.prototype.onChoice = function(choice) {
if (!this._onStart) return;
SoundManager.playOk();
this._options.deactivate();
this._optionPressed = 20;
this._options.redrawCurrentItem();
this._playerChoice = choice;
this._opponentChoice = this.getOpponentChoice(this._opponent);
this._playerIcon = new Sprite();
this._playerIcon.bitmap = ImageManager.loadPicture("ROCK-OptionsSheet");
this._playerIcon.x = 320 - 41;
this._playerIcon.y = 240 - 48;
this._opponentIcon = new Sprite();
this._opponentIcon.bitmap = ImageManager.loadPicture("ROCK-OptionsSheet");
this._opponentIcon.x = 320 + 41;
this._opponentIcon.y = 240;
this._opponentIcon.scaleX = -1;
this._sfxDelay = 240;
}
Scene_PetRocks.prototype.displayDecision = function() {
// Check Who Won + Display Result
if (this._playerChoice === "rock") {
var sx = 2 * 82;
if (this._opponentChoice === "rock") {
// TIE
this._rockResult = ["draw", "draw"];
var ox = 2 * 82;
} else if (this._opponentChoice === "paper") {
// LOSE
this._rockResult = ["hit", "defend"];
var ox = 1 * 82;
} else {
// WIN
this._rockResult = ["defend", "hit"];
var ox = 0 * 82;
}
}
if (this._playerChoice === "paper") {
var sx = 1 * 82;
if (this._opponentChoice === "paper") {
// TIE
this._rockResult = ["draw", "draw"];
var ox = 1 * 82;
} else if (this._opponentChoice === "scissors") {
// LOSE
this._rockResult = ["hit", "defend"];
var ox = 0 * 82;
} else {
// WIN
this._rockResult = ["defend", "hit"];
var ox = 2 * 82;
}
}
if (this._playerChoice === "scissors") {
var sx = 0 * 82;
if (this._opponentChoice === "scissors") {
// TIE
this._rockResult = ["draw", "draw"];
var ox = 0 * 82;
} else if (this._opponentChoice === "rock") {
// LOSE
this._rockResult = ["hit", "defend"];
var ox = 2 * 82;
} else {
// WIN
this._rockResult = ["defend", "hit"];
var ox = 1 * 82;
}
}
this._playerIcon.setFrame(sx, 0, 82, 44);
this.addChild(this._playerIcon);
this._opponentIcon.setFrame(ox, 0, 82, 44);
this.addChild(this._opponentIcon);
this._playerIcon.visible = true;
this._opponentIcon.visible = true;
this._resultsShowing = 75;
}
Scene_PetRocks.prototype.displayResults = function() {
if (this._rockResult[0] === "hit") {
var se = {
name: "mini_coj_hurt",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
this._opponent.setSprite(true);
} else if (this._rockResult[0] === "defend") {
var se = {
name: "mini_coj_hit",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
this._player.setSprite(true);
} else {
var se = {
name: "mini_coj_draw",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
}
// Display Graphical Animations
this._displayingAnimations = true;
this._timer = 15;
var x = 160 + 32;
var y = 174 + 32;
this._resultAnimation = new Rock_Result(x, y);
this.addChild(this._resultAnimation);
var x = 640 - 160 - 128 + 32;
var y = 174 + 32;
this._resultAnimationOpp = new Rock_Result(x, y);
this.addChild(this._resultAnimationOpp);
}
Scene_PetRocks.prototype.getOpponentChoice = function(opponent) {
var randomNum = Math.floor(Math.random() * 100);
var weightAddition = 0;
for (var i = 0; i < opponent.frequency.length; i++) {
weightAddition += opponent.frequency[i];
if (randomNum < weightAddition){
this._opponentChoice = opponent.options[i];
return opponent.options[i];
}
}
}
Scene_PetRocks.prototype.update = function() {
Scene_Base.prototype.update.call(this);
// Are you ready to clash animation
if (this._titleShowing) {
if (!this._titleSprite) {
this._titleSprite = new Sprite();
this._titleSprite.bitmap = ImageManager.loadPicture("Sequence/ROCK-Intro_01");
this.addChild(this._titleSprite);
this._titleAnimationTimer = 300;
this._titleSpriteID = 1;
this._options.deactivate();
}
if (this._titleSprite) {
if (this._titleAnimationTimer % (this._titleSpriteID >= 6 ? 10 : 40) === 0) {
this._titleSpriteID += 1;
if(this._titleSpriteID > 7) {
this._titleSpriteID = 6;
}
this._titleSprite.bitmap = ImageManager.loadPicture("Sequence/ROCK-Intro_" + (this._titleSpriteID > 9 ? this._titleSpriteID : "0" + this._titleSpriteID));
}
this._titleAnimationTimer--;
if (this._titleAnimationTimer <= 0) {
this._titleShowing = false;
this.removeChild(this._titleSprite);
this._options.activate();
var townsPeople = ["ROCK-TomatoGirl", "ROCK-RoseLad", "ROCK-TheMuncherKing", "ROCK-PapaChip", "ROCK-Bunny", "ROCK-SaucyK", "ROCK-Pluto"];
var elite = ["ROCK-LilG", "ROCK-P'terry", "ROCK-CoolSNake", "ROCK-Ocotaco"];
var champ = ["ROCK-OneWingAsh"];
if (townsPeople.contains(this._opponent.name)) var name = "minigame_jash1";
else if (elite.contains(this._opponent.name)) var name = "minigame_jash2";
else if (champ.contains(this._opponent.name)) var name = "minigame_jash3"
var bgm = {
name: name,
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playBgm(bgm);
this._onStart = true;
}
}
return;
}
if (this._sfxDelay > 0) {
this._sfxDelay--;
if (this._sfxDelay === 180) {
var se = {
name: "mini_coj_windup",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
}
if (this._sfxDelay === 120) {
var se = {
name: "mini_coj_windup",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
}
if (this._sfxDelay === 60) {
var se = {
name: "mini_coj_windup",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
}
if (this._sfxDelay <= 0) {
this.displayDecision();
}
}
if (this._resultsShowing > 0) {
this._resultsShowing --;
if (this._resultsShowing <= 0) {
this.displayResults();
}
}
if (this._optionPressed > 0) {
this._optionPressed--;
if (this._optionPressed <= 0) {
this._options.redrawCurrentItem();
}
}
// Show result animation of the clash
if (this._displayingAnimations || this._timer > 0) {
this._timer--;
if (this._timer > 10 && this._timer < 15) {
if (this._rockResult[0] ==="hit") this._player.flash();
else if (this._rockResult[0] === "defend") this._opponent.flash();
this._resultAnimation.setSprite(this._rockResult[0], 0);
this._resultAnimationOpp.setSprite(this._rockResult[1], 0);
}
if (this._timer > 5 && this._timer < 10) {
this._resultAnimation.setSprite(this._rockResult[0], 1);
this._resultAnimationOpp.setSprite(this._rockResult[1], 1);
}
if (this._timer < 5) {
this._resultAnimation.setSprite(this._rockResult[0], 2);
this._resultAnimationOpp.setSprite(this._rockResult[1], 2);
}
if (this._timer <= 0) {
if (this._rockResult[0] === "draw") { // TIE
this._opponent.currentCombo = 1;
this._player.currentCombo = 1;
}
if (this._rockResult[0] === "defend") { // WIN
var damage = 1 * this._player.currentCombo;
this.removeHearts("opponent", damage);
this._opponent.hp -= damage;
this._opponent.currentCombo = 1;
this._player.currentCombo += 1;
if (this._player.currentCombo > 3) this._player.currentCombo = 3;
}
if (this._rockResult[0] === "hit") { // LOSE
var damage = 1 * this._opponent.currentCombo;
this.removeHearts("player", damage);
this._player.hp -= damage;
this._player.currentCombo = 1;
this._opponent.currentCombo += 1;
if (this._opponent.currentCombo > 3) this._opponent.currentCombo = 3;
}
this._displayingAnimations = false;
this.removeChild(this._resultAnimation);
this.removeChild(this._resultAnimationOpp);
this._player.setSprite(false);
this._opponent.setSprite(false);
this.removeChild(this._playerIcon);
this.removeChild(this._opponentIcon);
// Start Next Turn
this._nextTurnDelay = 80;
this.checkWinConditions();
}
}
if (this._nextTurnDelay > 0) {
this._nextTurnDelay--;
if (this._nextTurnDelay <= 0) {
if (this._gameEndTimer <= 0) {
this._options.activate();
this._comboNumber.bitmap = ImageManager.loadPicture("ROCK-Combo" + (this._player.currentCombo > 0 ? this._player.currentCombo : 1));
}
}
}
// Game over
if (this._gameEndTimer > 0) {
this._gameEndTimer--;
if (this._gameEndTimer === 120) {
if ($gameVariables.value(825) === "opponent") {
var se = {
name: "mini_coj_lose",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
} else {
var se = {
name: "mini_coj_win",
volume: 100,
pitch: 100,
pan: 0
};
AudioManager.playSe(se);
}
}
if (this._gameEndTimer <= 0) {
for (var i = 0 ;i < this.children.length; i++) {
this.children[i].parent.removeChild(this.children[i]);
}
this.children = [];
this.popScene();
AudioManager.stopBgm();
}
return;
}
}
Scene_PetRocks.prototype.removeHearts = function(rock, damage) {
if (rock === "player") {
rock = this._player;
var hearts = this._playerHearts;
} else {
rock = this._opponent;
var hearts = this._opponentHearts;
}
for (var i = 0; i < damage; i++) {
if (hearts[i].alpha < 1) break;
hearts[i].alpha -= 0.4;
}
for (var i = 0; i < damage; i++) {
hearts.push(hearts.shift());
}
}
Scene_PetRocks.prototype.checkWinConditions = function() {
if (this._player.hp <= 0) {
// Game Over
this._player.alpha = 0.3;
$gameVariables.setValue(825, "opponent");
this._gameEndTimer = 180;
this._options.deactivate();
} else if (this._opponent.hp <= 0) {
// You Win, But still game over
// Put result in a variable for outside usage
this._opponent.alpha = 0.3;
$gameVariables.setValue(825, "player");
this._gameEndTimer = 180;
this._options.deactivate();
}
}
//=============================================================================
// R P S
//=============================================================================
function Window_PetRockOptions() {
this.initialize.apply(this, arguments);
}
Window_PetRockOptions.prototype = Object.create(Window_HorzCommand.prototype);
Window_PetRockOptions.prototype.constructor = Window_PetRockOptions;
Window_PetRockOptions.prototype.initialize = function () {
Window_HorzCommand.prototype.initialize.call(this, 160, 375);
this.opacity = 0;
};
Window_PetRockOptions.prototype.makeCommandList = function() {
this.addCommand("Rock", 'rock', true);
this.addCommand("Paper", 'paper', true);
this.addCommand("Scissors", 'scissors', true);
}
Window_PetRockOptions.prototype.windowWidth = function() {
return 330;
}
Window_PetRockOptions.prototype.windowHeight = function() {
return 100;
}
Window_PetRockOptions.prototype.maxCols = function () {
return 3;
};
Window_PetRockOptions.prototype.drawItem = function(index) {
var rect = this.itemRectForText(index);
this.contents.clearRect(rect.x, rect.y, rect.width + 12, rect.height + 12);
if (SceneManager._scene._optionPressed && this.currentSymbol() === this.commandSymbol(index)) {
var addon = "Pressed";
} else if (this.currentSymbol() === this.commandSymbol(index)) {
var addon = "Selected";
} else addon = "";
var bitmap = ImageManager.loadPicture('ROCK-Button' + addon);
this.contents.blt(bitmap, 0, 0, bitmap.width, bitmap.height, rect.x, rect.y);
}
Window_PetRockOptions.prototype.select = function(index) {
this._index = index;
this._stayCount = 0;
this.ensureCursorVisible();
this.updateCursor();
this.callUpdateHelp();
this.refresh();
}
Window_PetRockOptions.prototype._updateCursor = function () {
this._windowCursorSprite.visible = false;
};