Path: blob/main/src/components/Animatronic.js
270 views
import React, { useState, useEffect } from "react";1import Functions from "./Functions";2import Media from "./Media";3import { connect } from "react-redux";45let FreddyIterator = Functions.Freddy();6let BonnieIterator = Functions.Bonnie();7let ChicaIterator = Functions.Chica();8let FoxyIterator = Functions.Foxy();910FreddyIterator.next();1112let FreddyTime = 10000;13let BonnieTime = 5000;14let ChicaTime = 7300;15let FoxyTime = 13000;1617const ranges = {18Freddy: 1,19Bonnie: 1,20Chica: 2,21Foxy: 1,22}2324let isBlackout = false;25let isGameOver = false;2627function Animatronic({28animatronics,29config,30handleJumpscare,31isThisDoorOpen,32dispatch,33stages34}) {35const { hour, gameOver, blackout } = config;3637useEffect(() => {38ranges["Freddy"] = stages.Freddy;39ranges["Bonnie"] = stages.Bonnie;40ranges["Chica"] = stages.Chica;41ranges["Foxy"] = stages.Foxy;4243if(stages.Bonnie) willMove("Bonnie", BonnieIterator, BonnieTime);44if(stages.Chica) willMove("Chica", ChicaIterator, ChicaTime);45if(stages.Foxy) willMove("Foxy", FoxyIterator, FoxyTime, true);46if(stages.Freddy && stages.Chica && stages.Bonnie)willMove("Freddy", FreddyIterator, FreddyTime, true);4748return () => {49FreddyIterator = Functions.Freddy();50BonnieIterator = Functions.Bonnie();51ChicaIterator = Functions.Chica();52FoxyIterator = Functions.Foxy();5354FreddyIterator.next();5556FreddyTime = 10000;57BonnieTime = 5000;58ChicaTime = 7300;59FoxyTime = 13000;60ranges["Freddy"] = stages.Freddy;61ranges["Bonnie"] = stages.Bonnie;62ranges["Chica"] = stages.Chica;63ranges["Foxy"] = stages.Foxy;6465isBlackout = false;66isGameOver = false;67};68}, []);6970useEffect(() => {71if (hour === 2) {72FreddyTime = 9500;73BonnieTime = 4700;74ChicaTime = 6800;75FoxyTime = 10000;767778ranges["Bonnie"] = ranges["Bonnie"] + 1;79ranges["Chica"] = ranges["Chica"] + 1;80} else if (hour === 4) {81ranges["Bonnie"] = ranges["Bonnie"] + 2;82ranges["Chica"] = ranges["Chica"] + 2;83ranges["Freddy"] = ranges["Freddy"] + 1;84ranges["Foxy"] = ranges["Foxy"] + 1;85} else if (hour === 5) {86ranges["Bonnie"] = ranges["Bonnie"] + 2;87ranges["Chica"] = ranges["Chica"] + 2;88ranges["Freddy"] = ranges["Freddy"] + 2;89ranges["Foxy"] = ranges["Foxy"] + 2;90}91}, [hour]);9293useEffect(() => {94if (gameOver) isGameOver = gameOver;95}, [gameOver]);9697const changeAnimatronic = (func) => {98dispatch({ type: "CHANGE_ANIMATRONICS_MOVING", content: true });99100func();101102setTimeout(() => {103dispatch({104type: "CHANGE_ANIMATRONICS_MOVING",105content: false,106});107}, 1500);108};109110const animatronicFailed = (character) => {111changeAnimatronic(() => {112dispatch({113type: "CHANGE_ANIMATRONIC",114animatronic: character,115animatronicState: {116door: false,117camera:118character === "Freddy"119? "Stage"120: character === "Foxy"121? ""122: "Dinning Area",123jumpscare: false,124},125});126127if (character === "Bonnie") {128BonnieIterator = Functions.Bonnie();129willMove("Bonnie", BonnieIterator, BonnieTime);130} else if (character === "Chica") {131ChicaIterator = Functions.Chica();132willMove("Chica", ChicaIterator, ChicaTime);133} else if (character === "Foxy") {134FoxyIterator = Functions.Foxy();135Media.Sounds.FoxyPunch.play();136willMove("Foxy", FoxyIterator, FoxyTime, true);137} else if (character === "Freddy") {138FreddyIterator = Functions.Freddy();139FreddyIterator.next();140willMove("Freddy", FreddyIterator, FreddyTime, true);141}142});143};144145const freddyLaugh = () => {146if (isBlackout) return;147let FreddyNumber = Math.floor(Math.random() * 2);148if (FreddyNumber == 0) {149Media.Sounds.FreddyLaugh1.play();150} else {151Media.Sounds.FreddyLaugh2.play();152}153};154useEffect(() => {155if (blackout) isBlackout = true;156}, [blackout]);157158function willMove (character, iterator, animaTime) {159const thisInterval = setInterval(() => {160const max = character === "Bonnie" || character === "Chica" ? 22 : 30;161let luckyNumber = Math.floor(Math.random() * max);162163let condition = luckyNumber < ranges[character] && !animatronics[character].door;164165let newPlace;166if (condition) {167changeAnimatronic(() => {168newPlace = iterator.next().value;169170const newState = {171door: newPlace === "Door" || newPlace === "_3",172jumpscare: false,173camera: newPlace,174};175dispatch({176type: "CHANGE_ANIMATRONIC",177animatronic: character,178animatronicState: newState,179});180});181182if (character === "Freddy") freddyLaugh();183}184185if (isBlackout || isGameOver) clearInterval(thisInterval);186187if (newPlace === "Door" || newPlace === "_3") {188if (!isBlackout) checkDoors(character);189clearInterval(thisInterval);190}191}, animaTime);192};193194async function checkDoors(character) {195const door =196character === "Bonnie" || character === "Foxy" ? "leftDoor" : "rightDoor";197198setTimeout(async () => {199const isDoorOpen = await isThisDoorOpen(door);200if (!isDoorOpen) {201setTimeout(async () => {202const isDoorOpen = await isThisDoorOpen(door);203if (!isDoorOpen) {204setTimeout(async () => {205const isDoorOpen = await isThisDoorOpen(door);206if (!isDoorOpen) {207handleJumpscare(character);208} else animatronicFailed(character);209}, 3000);210} else animatronicFailed(character);211}, 5000);212} else animatronicFailed(character);213}, 10000);214}215216return <></>;217}218219const mapStateToProps = (state) => {220return {221leftDoor: state.officeReducer.leftDoor,222rightDoor: state.officeReducer.rightDoor,223animatronics: state.animatronicsReducer,224config: state.configReducer,225};226};227228export default connect(mapStateToProps)(Animatronic);229230231