Game.addToManifest({ face_angry: "sprites/peeps/face_angry.json", body_red: "sprites/peeps/body_red.json", shout: "sounds/shout.mp3" }); /**** FRAMES: 00-05: frown at screen 06-10: anger awayyyyyy! 11-25: SHOUT! // loop back to 10. (>=20, no, not screaming) ****/ function AngryPeep(scene, type){ var self = this; Peep.apply(self, [scene]); self._CLASS_ = "AngryPeep"; // Add the body & face sprites var g = self.graphics; self.bodyMC = self.addMovieClip("body"); self.bodyRedMC = self.addMovieClip("body_red"); self.bodyRedMC.alpha = 0; self.faceMC = self.addMovieClip("face_angry"); self.faceMC.anchor.x = 0.333333333; self.faceMC.gotoAndStop(0); // Set Type: Am I a circle or square? self.type = "???"; self.setType = function(type){ self.type = type; self.bodyMC.gotoAndStop((type=="circle") ? 0 : 1); self.bodyRedMC.gotoAndStop(self.bodyMC.currentFrame); }; self.setType(type); // IS SHOUTING? self.isShouting = false; // Animate on triples var doubles = 0; var MODE = -1; var MODE_STARE = 0; var MODE_BLINK = 1; var MODE_SHOUT = 2; self.gracePeriod = -1; // HACK self.HACK_JUMPSTART = function(){ MODE = MODE_BLINK; }; // WANDERING self.wander = 0; self.changeWander = function(){ self.wander = Math.random()*0.1-0.05; }; self.callbacks.update = function(){ // Animate on doubles! ...or... TRIPLES? doubles = (doubles+1)%3; // Wander around self.direction += self.wander; if(Math.random()<0.05) self.changeWander(); self.stayWithinRect({ l:100, r:860, t:100, b:480 },0.15); // FRAMES: MANUALLY var face = self.faceMC; var frame = face.currentFrame; if(doubles==0){ switch(MODE){ case MODE_STARE: if(frame<5) face.gotoAndStop(frame+1); break; case MODE_BLINK: if(frame<10){ face.gotoAndStop(frame+1); } break; case MODE_SHOUT: if(frame<25){ face.gotoAndStop(frame+1); }else{ face.gotoAndStop(10); MODE = MODE_BLINK; self.isShouting = false; self.startWalking(); } break; } } if(frame>=10){ self.bodyRedMC.alpha = self.bodyRedMC.alpha*0.9 + 1*0.1; } /////////////////////////// /////////////////////////// /////////////////////////// // Less red bod... // self.bodyRedMC.alpha *= 0.985; // Scream at THE OPPOSITE TYPE // Grace period... AND IF SCENE ALLOWS IT. if(self.gracePeriod<=0 && !scene.noYellingYet){ var opposite = (self.type=="circle") ? "square" : "circle"; var closeTo = self.touchingPeeps(90, function(peep){ return(!peep.offended && peep.isWalking && peep.type==opposite); }); if(self.isWalking && closeTo.length>0){ var other = closeTo[0]; // Bounce TOWARDS self.flip = (other.x>self.x) ? 1 : -1; self.bounce = 1.7; self.vel.y = 0; self.vel.x = 3*self.flip; // BE SHOCKED MODE = MODE_SHOUT; self.isWalking = false; self.isShouting = true; // AHHHHH var peeps = scene.world.peeps; var angry = peeps.filter(function(peep){ return(peep._CLASS_=="AngryPeep"); }); var angryNum = angry.length; var volume; if(angryNum<5) volume=1; else if(angryNum<10) volume=0.70; else if(angryNum<15) volume=0.42; else volume=0.27; var shout = Game.sounds.shout; shout.volume(volume); shout.play(); // MAKE BOD REDDER // self.bodyRedMC.alpha = 1; // GRACE... self.gracePeriod = _s(2.5); // If the closeTo is ANOTHER ANGRY ONE. // They get confused! if(other._CLASS_=="NormalPeep"){ if(other.shocked) return; other.vel.x = self.flip*5; other.flip = -1*self.flip; other.beShocked(self); }else{ // nothing...? } } }else{ self.gracePeriod--; } }; // WEIRD WALK self.walkAnim = function(){ // Hop & flip self.hop += self.speed/40; if(self.hop>1) self.hop--; self.flip = (self.vel.x<0) ? -1 : 1; // Hop up & down var t = self.hop*Math.TAU; g.pivot.y = Math.abs(Math.sin(t))*15; g.rotation = 0; // Squash at the bottom of your cycle if(self._lastHop<0.5 && self.hop>=0.5) self.bounce = 1.2; if(self._lastHop>0.9 && self.hop<=0.1) self.bounce = 1.2; }; self.callbacks.startWalking = function(){ self.speed = 1.7; }; self.callbacks.startWalking(); // 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 = (Math.abs(self.x-tv.x)-60)/100; var WAIT = Director.ZOOM_OUT_1_TIME + Director.SEE_VIEWERS_TIME; // 1) Become frowny self.setTimeout(function(){ self.bounce = 1.6; MODE = MODE_STARE; // SQUEAK Game.sounds.squeak.play(); },_s(BEAT*2+OFFSET)); // 2) Blink... self.setTimeout(function(){ self.bounce = 1.3; MODE = MODE_BLINK; },_s(WAIT+OFFSET)); // 3) And go on. self.setTimeout(function(){ // self.bounce = 1.2; self.startWalking(); },_s(WAIT+1+OFFSET)); }; }