Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wellsousaaa
GitHub Repository: wellsousaaa/Five-Nights-at-Freddys-Web
Path: blob/main/src/components/Animatronic.js
270 views
1
import React, { useState, useEffect } from "react";
2
import Functions from "./Functions";
3
import Media from "./Media";
4
import { connect } from "react-redux";
5
6
let FreddyIterator = Functions.Freddy();
7
let BonnieIterator = Functions.Bonnie();
8
let ChicaIterator = Functions.Chica();
9
let FoxyIterator = Functions.Foxy();
10
11
FreddyIterator.next();
12
13
let FreddyTime = 10000;
14
let BonnieTime = 5000;
15
let ChicaTime = 7300;
16
let FoxyTime = 13000;
17
18
const ranges = {
19
Freddy: 1,
20
Bonnie: 1,
21
Chica: 2,
22
Foxy: 1,
23
}
24
25
let isBlackout = false;
26
let isGameOver = false;
27
28
function Animatronic({
29
animatronics,
30
config,
31
handleJumpscare,
32
isThisDoorOpen,
33
dispatch,
34
stages
35
}) {
36
const { hour, gameOver, blackout } = config;
37
38
useEffect(() => {
39
ranges["Freddy"] = stages.Freddy;
40
ranges["Bonnie"] = stages.Bonnie;
41
ranges["Chica"] = stages.Chica;
42
ranges["Foxy"] = stages.Foxy;
43
44
if(stages.Bonnie) willMove("Bonnie", BonnieIterator, BonnieTime);
45
if(stages.Chica) willMove("Chica", ChicaIterator, ChicaTime);
46
if(stages.Foxy) willMove("Foxy", FoxyIterator, FoxyTime, true);
47
if(stages.Freddy && stages.Chica && stages.Bonnie)willMove("Freddy", FreddyIterator, FreddyTime, true);
48
49
return () => {
50
FreddyIterator = Functions.Freddy();
51
BonnieIterator = Functions.Bonnie();
52
ChicaIterator = Functions.Chica();
53
FoxyIterator = Functions.Foxy();
54
55
FreddyIterator.next();
56
57
FreddyTime = 10000;
58
BonnieTime = 5000;
59
ChicaTime = 7300;
60
FoxyTime = 13000;
61
ranges["Freddy"] = stages.Freddy;
62
ranges["Bonnie"] = stages.Bonnie;
63
ranges["Chica"] = stages.Chica;
64
ranges["Foxy"] = stages.Foxy;
65
66
isBlackout = false;
67
isGameOver = false;
68
};
69
}, []);
70
71
useEffect(() => {
72
if (hour === 2) {
73
FreddyTime = 9500;
74
BonnieTime = 4700;
75
ChicaTime = 6800;
76
FoxyTime = 10000;
77
78
79
ranges["Bonnie"] = ranges["Bonnie"] + 1;
80
ranges["Chica"] = ranges["Chica"] + 1;
81
} else if (hour === 4) {
82
ranges["Bonnie"] = ranges["Bonnie"] + 2;
83
ranges["Chica"] = ranges["Chica"] + 2;
84
ranges["Freddy"] = ranges["Freddy"] + 1;
85
ranges["Foxy"] = ranges["Foxy"] + 1;
86
} else if (hour === 5) {
87
ranges["Bonnie"] = ranges["Bonnie"] + 2;
88
ranges["Chica"] = ranges["Chica"] + 2;
89
ranges["Freddy"] = ranges["Freddy"] + 2;
90
ranges["Foxy"] = ranges["Foxy"] + 2;
91
}
92
}, [hour]);
93
94
useEffect(() => {
95
if (gameOver) isGameOver = gameOver;
96
}, [gameOver]);
97
98
const changeAnimatronic = (func) => {
99
dispatch({ type: "CHANGE_ANIMATRONICS_MOVING", content: true });
100
101
func();
102
103
setTimeout(() => {
104
dispatch({
105
type: "CHANGE_ANIMATRONICS_MOVING",
106
content: false,
107
});
108
}, 1500);
109
};
110
111
const animatronicFailed = (character) => {
112
changeAnimatronic(() => {
113
dispatch({
114
type: "CHANGE_ANIMATRONIC",
115
animatronic: character,
116
animatronicState: {
117
door: false,
118
camera:
119
character === "Freddy"
120
? "Stage"
121
: character === "Foxy"
122
? ""
123
: "Dinning Area",
124
jumpscare: false,
125
},
126
});
127
128
if (character === "Bonnie") {
129
BonnieIterator = Functions.Bonnie();
130
willMove("Bonnie", BonnieIterator, BonnieTime);
131
} else if (character === "Chica") {
132
ChicaIterator = Functions.Chica();
133
willMove("Chica", ChicaIterator, ChicaTime);
134
} else if (character === "Foxy") {
135
FoxyIterator = Functions.Foxy();
136
Media.Sounds.FoxyPunch.play();
137
willMove("Foxy", FoxyIterator, FoxyTime, true);
138
} else if (character === "Freddy") {
139
FreddyIterator = Functions.Freddy();
140
FreddyIterator.next();
141
willMove("Freddy", FreddyIterator, FreddyTime, true);
142
}
143
});
144
};
145
146
const freddyLaugh = () => {
147
if (isBlackout) return;
148
let FreddyNumber = Math.floor(Math.random() * 2);
149
if (FreddyNumber == 0) {
150
Media.Sounds.FreddyLaugh1.play();
151
} else {
152
Media.Sounds.FreddyLaugh2.play();
153
}
154
};
155
useEffect(() => {
156
if (blackout) isBlackout = true;
157
}, [blackout]);
158
159
function willMove (character, iterator, animaTime) {
160
const thisInterval = setInterval(() => {
161
const max = character === "Bonnie" || character === "Chica" ? 22 : 30;
162
let luckyNumber = Math.floor(Math.random() * max);
163
164
let condition = luckyNumber < ranges[character] && !animatronics[character].door;
165
166
let newPlace;
167
if (condition) {
168
changeAnimatronic(() => {
169
newPlace = iterator.next().value;
170
171
const newState = {
172
door: newPlace === "Door" || newPlace === "_3",
173
jumpscare: false,
174
camera: newPlace,
175
};
176
dispatch({
177
type: "CHANGE_ANIMATRONIC",
178
animatronic: character,
179
animatronicState: newState,
180
});
181
});
182
183
if (character === "Freddy") freddyLaugh();
184
}
185
186
if (isBlackout || isGameOver) clearInterval(thisInterval);
187
188
if (newPlace === "Door" || newPlace === "_3") {
189
if (!isBlackout) checkDoors(character);
190
clearInterval(thisInterval);
191
}
192
}, animaTime);
193
};
194
195
async function checkDoors(character) {
196
const door =
197
character === "Bonnie" || character === "Foxy" ? "leftDoor" : "rightDoor";
198
199
setTimeout(async () => {
200
const isDoorOpen = await isThisDoorOpen(door);
201
if (!isDoorOpen) {
202
setTimeout(async () => {
203
const isDoorOpen = await isThisDoorOpen(door);
204
if (!isDoorOpen) {
205
setTimeout(async () => {
206
const isDoorOpen = await isThisDoorOpen(door);
207
if (!isDoorOpen) {
208
handleJumpscare(character);
209
} else animatronicFailed(character);
210
}, 3000);
211
} else animatronicFailed(character);
212
}, 5000);
213
} else animatronicFailed(character);
214
}, 10000);
215
}
216
217
return <></>;
218
}
219
220
const mapStateToProps = (state) => {
221
return {
222
leftDoor: state.officeReducer.leftDoor,
223
rightDoor: state.officeReducer.rightDoor,
224
animatronics: state.animatronicsReducer,
225
config: state.configReducer,
226
};
227
};
228
229
export default connect(mapStateToProps)(Animatronic);
230
231