1
0
forked from sent/waves
waves/public/assets/g/wbwwb/js/peeps/SnobbyPeep.js
2025-04-09 17:11:14 -05:00

225 lines
6.2 KiB
JavaScript

Game.addToManifest({
face_snobby: "sprites/peeps/face_snobby.json",
face_snobby_hmph: "sprites/peeps/face_snobby_hmph.json",
peep_huh: "sounds/peep_huh.mp3",
peep_hmph: "sounds/peep_hmph.mp3"
});
/****
FRAMES:
00-03: disbelief at screen
04-07: grouch face (07 is resting)
09-14: SMUG
15-20: HMPH. (LOOP HMPH at 16)
22-25: POP.
26-29: Go Away. FLIP, then go to 07.
****/
function SnobbyPeep(scene){
var self = this;
Peep.apply(self, [scene]);
self._CLASS_ = "SnobbyPeep";
// Add the body & face sprites
self.bodyMC = self.addMovieClip("body");
self.bodyMC.gotoAndStop(1);
self.faceMC = self.addMovieClip("face_snobby");
self.faceMC.anchor.y = 1.25;
self.faceMC.gotoAndStop(0);
self.wordMC = self.addMovieClip("face_snobby_hmph");
self.wordMC.anchor.y = 1.25;
self.wordMC.gotoAndStop(0);
// IS SMUG?
self.isSmug = false;
// Animate on triples
var doubles = 0;
var MODE = -1;
var MODE_STARE = 0;
var MODE_BLINK = 1;
var MODE_SMUG = 2;
var MODE_HMPH = 3;
var MODE_POP = 4;
var MODE_AWAY = 5;
self.gracePeriod = -1;
// HACK
self.HACK_JUMPSTART = function(){
MODE = MODE_BLINK;
};
self.callbacks.update = function(){
// Animate on doubles! ...or... TRIPLES?
doubles = (doubles+1)%3;
// stay within game frame
self.stayWithinRect({
l:100, r:860, t:100, b:480
},0.05);
// FRAMES: MANUALLY
var face = self.faceMC;
var frame = face.currentFrame;
self.wordMC.scale.x = self.flip*self.DRAWING_SCALE;
if(doubles==0){
switch(MODE){
case MODE_STARE:
if(frame<3) face.gotoAndStop(frame+1);
break;
case MODE_BLINK:
if(frame<7) face.gotoAndStop(frame+1);
break;
case MODE_SMUG:
if(frame<14) face.gotoAndStop(frame+1);
break;
case MODE_HMPH:
if(frame<20){
frame = frame+1;
face.gotoAndStop(frame);
if(frame>=18){
if(self.wordMC.currentFrame==0){
self.wordMC.gotoAndStop(1);
}else{
var nextFrame = self.wordMC.currentFrame+1;
if(nextFrame>3) nextFrame=1;
self.wordMC.gotoAndStop(nextFrame);
}
}
}
break;
case MODE_POP:
self.wordMC.gotoAndStop(0);
if(frame<25) face.gotoAndStop(frame+1);
break;
case MODE_AWAY:
if(frame<29){
face.gotoAndStop(frame+1);
}else{
// Loop back
face.gotoAndStop(7);
MODE = MODE_BLINK;
self.isSmug = false;
}
break;
}
}
///////////////////////////
///////////////////////////
///////////////////////////
// Shocked by a square!
if(!self.isSmug){
if(self.gracePeriod<=0){
var closeTo = self.touchingPeeps(90, function(peep){
return(!peep.offended && peep.type=="circle");
});
if(closeTo.length>0 && self.isWalking){
// Bounce back
self.flip = (closeTo[0].x>self.x) ? 1 : -1;
self.bounce = 1.5;
// BE SHOCKED
MODE = MODE_SMUG;
self.isWalking = false;
// Sound!
Game.sounds.peep_huh.play();
// They get confused!
closeTo.forEach(function(other){
if(other.offended) return;
other.beOffended(self);
});
// HMPH!
self.setTimeout(function(){
MODE = MODE_HMPH;
self.isSmug = true;
// Sound!
Game.sounds.peep_hmph.play();
// POP!
self.setTimeout(function(){
MODE = MODE_POP;
// Then stop
self.setTimeout(function(){
// Turn around & walk
self.flip *= -1;
self.startWalking();
self.direction = (self.flip>0) ? 0 : Math.PI; // override!
self.direction += Math.random()*0.2-0.1;
// Move away...
MODE = MODE_AWAY;
self.gracePeriod = 60;
},_s(0.8));
},_s(1.4));
},_s(0.9));
}
}else{
self.gracePeriod--;
}
}
};
// AT FIRST...
self.watchTV = function(){
self.clearAnims(); // just in case...
// 0) Stop & look
var tv = scene.tv;
self.stopWalking(true);
self.flip = (tv.x>self.x) ? 1 : -1;
var OFFSET = 0; // (Math.abs(self.x-tv.x)-60)/100;
var WAIT = Director.ZOOM_OUT_1_TIME + Director.SEE_VIEWERS_TIME;
// 1) Become nervous
self.setTimeout(function(){
self.bounce = 1.6;
MODE = MODE_STARE;
// SQUEAK
Game.sounds.squeak.play();
},_s(OFFSET+BEAT*2));
// 2) Blink...
self.setTimeout(function(){
self.bounce = 1.3;
MODE = MODE_BLINK;
},_s(OFFSET+WAIT));
// 3) And go on.
self.setTimeout(function(){
// self.bounce = 1.2;
self.startWalking();
},_s(OFFSET+WAIT+1));
};
}