forked from sent/waves
244 lines
6.6 KiB
JavaScript
244 lines
6.6 KiB
JavaScript
Game.addToManifest({
|
|
|
|
face_murder: "sprites/peeps/face_murder.json",
|
|
|
|
weapon_gun: "sprites/peeps/weapon_gun.json",
|
|
weapon_axe: "sprites/peeps/weapon_axe.json",
|
|
weapon_bat: "sprites/peeps/weapon_bat.json",
|
|
weapon_shotgun: "sprites/peeps/weapon_shotgun.json",
|
|
|
|
gunshot: "sounds/gunshot.mp3",
|
|
shotgun: "sounds/shotgun.mp3",
|
|
impact: "sounds/impact.mp3"
|
|
|
|
});
|
|
|
|
/****
|
|
|
|
FACE FRAMES:
|
|
00-04: crazy at screen (loop)
|
|
05-13: blink, and crazy forever (loop: 09-13)
|
|
|
|
WEAPON FRAMES:
|
|
00-05: pull out (04 is rest)
|
|
06: BAM
|
|
07-15: return to rest (04 is rest)
|
|
|
|
****/
|
|
|
|
function MurderPeep(scene){
|
|
|
|
var self = this;
|
|
Peep.apply(self, [scene]);
|
|
self._CLASS_ = "MurderPeep";
|
|
|
|
// Add the body & face sprites
|
|
self.type = "???";
|
|
self.bodyMC = self.addMovieClip("body");
|
|
self.faceMC = self.addMovieClip("face_murder");
|
|
self.weaponType = null;
|
|
self.weaponMC = null;
|
|
|
|
// Init with what kinda weapon?
|
|
self.init = function(shapeType, weaponType){
|
|
|
|
// Type
|
|
self.type = shapeType;
|
|
self.bodyMC.gotoAndStop((shapeType=="circle") ? 0 : 1);
|
|
|
|
// Weapon
|
|
self.weaponType = weaponType;
|
|
self.weaponMC = self.addMovieClip("weapon_"+weaponType);
|
|
self.weaponMC.gotoAndStop(0);
|
|
|
|
// Transform
|
|
self.x = scene.tv.x;
|
|
self.y = scene.tv.y+Math.random(); // tiny offset to avoid glitchy depth-sort
|
|
if(shapeType=="circle"){
|
|
self.x -= 60;
|
|
self.flip = 1;
|
|
self.gracePeriod = 30;
|
|
}else{
|
|
self.x += 60;
|
|
self.flip = -1;
|
|
self.gracePeriod = 50;
|
|
}
|
|
|
|
// Let's Watch TV!
|
|
self.watchTV();
|
|
|
|
};
|
|
|
|
// Animate on doubles
|
|
var MODE = 0;
|
|
var MODE_STARE = 0;
|
|
var MODE_CRAZY = 1;
|
|
var MODE_KILL = 2;
|
|
|
|
// Animate!
|
|
var doubles = 0;
|
|
self.gracePeriod = -1;
|
|
self.standingTime = -1;
|
|
self.callbacks.update = function(){
|
|
|
|
// Animate on doubles! ...or... TRIPLES?
|
|
doubles = (doubles+1)%4;
|
|
|
|
// stay within game frame
|
|
self.stayWithinRect({
|
|
l:100, r:860, t:100, b:480
|
|
},0.15);
|
|
|
|
// FRAMES: MANUALLY
|
|
if(doubles==0){
|
|
|
|
var frame;
|
|
|
|
// Face
|
|
var face = self.faceMC;
|
|
frame = face.currentFrame;
|
|
switch(MODE){
|
|
case MODE_STARE:
|
|
if(frame<4) face.gotoAndStop(frame+1);
|
|
else face.gotoAndStop(0);
|
|
break;
|
|
case MODE_CRAZY:
|
|
if(frame<13) face.gotoAndStop(frame+1);
|
|
else face.gotoAndStop(9);
|
|
break;
|
|
}
|
|
|
|
// Weapon
|
|
var weapon = self.weaponMC;
|
|
frame = weapon.currentFrame;
|
|
if(MODE==MODE_CRAZY || MODE==MODE_KILL){
|
|
if(frame<5){
|
|
weapon.gotoAndStop(frame+1);
|
|
}
|
|
if(frame>=6){
|
|
if(frame<15){
|
|
weapon.gotoAndStop(frame+1);
|
|
}else{
|
|
if(self.standingTime<=0){
|
|
self.startWalking();
|
|
weapon.gotoAndStop(5);
|
|
}else{
|
|
self.standingTime--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
///////////////////////////
|
|
///////////////////////////
|
|
///////////////////////////
|
|
|
|
// KILL THE OTHER KIND
|
|
if(self.gracePeriod<=0){
|
|
if(!self.isShocked){
|
|
var otherType = (self.type=="circle") ? "square" : "circle";
|
|
var closeTo = self.touchingPeeps(120, function(peep){
|
|
return(peep._CLASS_=="PanicPeep" && peep.type==otherType);
|
|
});
|
|
if(closeTo.length>0 && self.isWalking){
|
|
|
|
// FACE 'EM
|
|
self.flip = (closeTo[0].x>self.x) ? 1 : -1;
|
|
|
|
// USE WEAPON
|
|
MODE = MODE_KILL;
|
|
self.weaponMC.gotoAndStop(6);
|
|
self.gracePeriod = _s(BEAT*2);
|
|
self.bounce = 1.6;
|
|
self.standingTime = 5; // hack
|
|
self.stopWalking();
|
|
|
|
// What sound?
|
|
var sound = null;
|
|
var volume = 0.2;
|
|
switch(self.weaponType){
|
|
case "gun":
|
|
sound = Game.sounds.gunshot;
|
|
break;
|
|
case "axe": case "bat":
|
|
sound = Game.sounds.impact;
|
|
break;
|
|
case "shotgun":
|
|
sound = Game.sounds.shotgun;
|
|
break;
|
|
}
|
|
sound.volume(volume);
|
|
sound.play();
|
|
|
|
// TODO: Actually hurt 'em
|
|
closeTo[0].getKilledBy(self);
|
|
|
|
}
|
|
}
|
|
}else if(self.isWalking){
|
|
self.gracePeriod--;
|
|
}
|
|
|
|
};
|
|
|
|
// Speed...
|
|
self.callbacks.startWalking = function(){
|
|
self.speed = 3;
|
|
};
|
|
|
|
// SAME WALK ANIM, EXCEPT: RANDOM ROTATION
|
|
self.walkAnim = function(){
|
|
var g = self.graphics;
|
|
|
|
// Hop & Flip
|
|
self.hop += self.speed/40;
|
|
if(self.hop>1) self.hop--;
|
|
self.flip = (self.vel.x<0) ? -1 : 1;
|
|
|
|
// Sway back & forth
|
|
var t = self.hop*Math.PI*2;
|
|
g.pivot.y = Math.abs(Math.sin(t))*15;
|
|
g.rotation = (Math.random()*2-1)*0.05;
|
|
|
|
};
|
|
|
|
// SAME STAND ANIM, EXCEPT: RANDOM ROTATION
|
|
self.standAnim = function(){
|
|
var g = self.graphics;
|
|
g.rotation = (Math.random()*2-1)*0.05;
|
|
g.pivot.y = 0;
|
|
};
|
|
|
|
// 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_CRAZY;
|
|
},_s(OFFSET+BEAT*2));
|
|
|
|
// 3) And go on.
|
|
self.setTimeout(function(){
|
|
self.startWalking();
|
|
if(self.type=="circle"){
|
|
self.direction = Math.PI + (Math.random()*2-1);
|
|
}else{
|
|
self.direction = (Math.random()*2-1);
|
|
}
|
|
},_s(OFFSET+WAIT+1));
|
|
|
|
};
|
|
|
|
} |