207 lines
5.7 KiB
Haxe
207 lines
5.7 KiB
Haxe
package entity.enemy.hotel
|
|
{
|
|
import entity.gadget.Dust;
|
|
import entity.player.Player;
|
|
import flash.geom.Point;
|
|
import global.Registry;
|
|
import org.flixel.FlxGroup;
|
|
import org.flixel.FlxSprite;
|
|
class Steam_Pipe extends FlxSprite
|
|
{
|
|
public var xml:XML;
|
|
public var player:Player;
|
|
public var parent:Dynamic;
|
|
private var dame_frame:Int;
|
|
private var added_to_parent:Bool=false;
|
|
|
|
private var eject_pt:Point;
|
|
private var eject_vel:Int=50;
|
|
public var steam_clouds:FlxGroup=new FlxGroup(6);
|
|
public var timers:Array<Dynamic>;
|
|
private var PUSH_VEL:Int=50;
|
|
|
|
|
|
private var active_region:FlxSprite=new FlxSprite();
|
|
private var disabled:Bool=false;
|
|
|
|
|
|
//dame frames - DRUL
|
|
|
|
//[Embed(source="../../../res/sprites/enemies/hotel/steam_pipe.png")] public static var steam_pipe_sprite:Class;
|
|
//[Embed(source="../../../res/sprites/enemies/hotel/steam.png")] public static var steam_sprite:Class;
|
|
|
|
public function new(_xml:XML,_player:Player,_parent:Dynamic)
|
|
{
|
|
xml=_xml;
|
|
player=_player;
|
|
parent=_parent;
|
|
super(parseInt(xml.@x), parseInt(xml.@y));
|
|
|
|
loadGraphic(steam_pipe_sprite, true, false, 16, 16);
|
|
dame_frame=parseInt(xml.@frame);
|
|
|
|
// Set directions and active regions(where you are pushed), and ejection points for the steam clouds
|
|
/* ADD ANIMATIONS FOR STEAM PIPE(if any)*/
|
|
switch(dame_frame){
|
|
case 0:
|
|
eject_pt=new Point(x + 2, y + Registry.HEADER_HEIGHT + 10);
|
|
active_region=new FlxSprite(x + 3, y + 16 + Registry.HEADER_HEIGHT);
|
|
active_region.makeGraphic(10, 16, 0xff123123);
|
|
frame=0;facing=DOWN;
|
|
break;
|
|
case 1:
|
|
eject_pt=new Point(x + 14, y + 5 + Registry.HEADER_HEIGHT);
|
|
active_region=new FlxSprite(x + 16, y + Registry.HEADER_HEIGHT + 3);
|
|
active_region.makeGraphic(16, 10, 0xff123123);
|
|
addAnimation("do_something", [1], 12);
|
|
frame=1;facing=RIGHT;
|
|
break;
|
|
case 2:
|
|
eject_pt=new Point(x + 3, y - 2 + Registry.HEADER_HEIGHT);
|
|
frame=2;facing=UP;
|
|
active_region=new FlxSprite(x + 3, y + Registry.HEADER_HEIGHT - 16);
|
|
active_region.makeGraphic(10, 16, 0xff123123);
|
|
addAnimation("do_something", [2], 12);
|
|
break;
|
|
case 3:
|
|
eject_pt=new Point(x - 6, y + 3 + Registry.HEADER_HEIGHT);
|
|
frame=3;facing=LEFT;
|
|
active_region=new FlxSprite(x - 16, y + Registry.HEADER_HEIGHT + 3);
|
|
active_region.makeGraphic(16, 10, 0xff123123);
|
|
addAnimation("do_something", [3], 12);
|
|
break;
|
|
}
|
|
play("do_something");
|
|
|
|
active_region.visible=false;
|
|
|
|
timers=new Array(steam_clouds.maxSize);
|
|
|
|
|
|
//Randomize the size of the clouds a little
|
|
/* ADD ANIMATIONS FOR STEAM CLOU */
|
|
for(i in 0...steam_clouds.maxSize){
|
|
var steam_cloud:FlxSprite=new FlxSprite();
|
|
steam_cloud.loadGraphic(steam_sprite, true, false, 16, 16);
|
|
steam_cloud.addAnimation("s", [0, 1], 10);
|
|
steam_cloud.play("s");
|
|
//steam_cloud.flicker(-1);
|
|
steam_clouds.add(steam_cloud);
|
|
steam_cloud.x=eject_pt.x;
|
|
steam_cloud.y=eject_pt.y;
|
|
steam_cloud.scale.x=steam_cloud.scale.y=0.8 + 0.2 * Math.random();
|
|
steam_cloud.width=steam_cloud.height=width * steam_cloud.scale.x;
|
|
//steam_cloud.angle=360 * Math.random();
|
|
timers[i]=30 + Std.int(20 * Math.random());//Timeouts for steam clouds to reset
|
|
set_vel(steam_cloud);
|
|
}
|
|
|
|
add_sfx("pew", Registry.sound_data.fireball_group);
|
|
|
|
}
|
|
|
|
override public function update():Void
|
|
{
|
|
if(!added_to_parent){
|
|
added_to_parent=true;
|
|
parent.bg_sprites.add(active_region);
|
|
parent.fg_sprites.add(steam_clouds);
|
|
}
|
|
|
|
// dust on the active region disables the pushing effect
|
|
disabled=false;
|
|
for(var dust:Dust in Registry.subgroup_dust){
|
|
if(dust !=null){
|
|
if(dust.overlaps(active_region)&&(dust.frame !=Dust.EMPTY_FRAME)&&(dust !=player.raft)){
|
|
disabled=true;
|
|
}
|
|
}
|
|
}
|
|
|
|
for(var gas:FlxSprite in Registry.subgroup_gas){
|
|
if(gas !=null){
|
|
for(var steam_cloud:FlxSprite in steam_clouds.members){
|
|
if(steam_cloud !=null){
|
|
if(gas.overlaps(steam_cloud)){
|
|
gas.velocity.x +=0.01 * steam_cloud.velocity.x;
|
|
gas.velocity.y +=0.01 * steam_cloud.velocity.y;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var ctr:Int=0;
|
|
//Change timers for the visual effect of steam spewing forth, or being held by the dust
|
|
for(var steam:FlxSprite in steam_clouds.members){
|
|
timers[ctr]--;
|
|
if(timers[ctr]==0){
|
|
if(!disabled){
|
|
timers[ctr]=30 + Std.int(20 * Math.random());
|
|
} else {
|
|
timers[ctr]=3 + Std.int(2 * Math.random());
|
|
}
|
|
steam.x=eject_pt.x;
|
|
steam.y=eject_pt.y;
|
|
set_vel(steam);
|
|
play_sfx("pew");
|
|
}
|
|
ctr++;
|
|
|
|
if(disabled==false){
|
|
if(steam.overlaps(player)){
|
|
pushplayer();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Push the player if the pipe isn't disabled, and player touches active region
|
|
if(!disabled){
|
|
if(player.overlaps(active_region)){
|
|
pushplayer();
|
|
}
|
|
}
|
|
|
|
super.update();
|
|
}
|
|
|
|
//randomize velocity of clouds within certain ranges
|
|
private function set_vel(steam_cloud:FlxSprite):Void
|
|
{
|
|
switch(facing){
|
|
case DOWN:
|
|
steam_cloud.velocity.y=eject_vel + 20 * Math.random();
|
|
steam_cloud.velocity.x=-30 + 60 * Math.random();
|
|
break;
|
|
case UP:
|
|
steam_cloud.velocity.y=-eject_vel - 20 * Math.random();
|
|
steam_cloud.velocity.x=-30 + 60 * Math.random();
|
|
break;
|
|
case LEFT:
|
|
steam_cloud.velocity.x=-eject_vel - 20 * Math.random();
|
|
steam_cloud.velocity.y=-30 + 60 * Math.random();
|
|
break;
|
|
case RIGHT:
|
|
steam_cloud.velocity.x=eject_vel + 20 * Math.random();
|
|
steam_cloud.velocity.y=-30 + 60 * Math.random();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private function pushplayer():Void
|
|
{
|
|
switch(facing){
|
|
case DOWN:
|
|
player.additional_y_vel=PUSH_VEL;break;
|
|
case UP:
|
|
player.additional_y_vel=-PUSH_VEL;break;
|
|
case LEFT:
|
|
player.additional_x_vel=-PUSH_VEL;break;
|
|
case RIGHT:
|
|
player.additional_x_vel=PUSH_VEL;break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
} |