tatan/ 0000755 0000000 0000000 00000000000 10740420533 010661 5 ustar root root tatan/lib/ 0000755 0000000 0000000 00000000000 10740420533 011427 5 ustar root root tatan/music/ 0000755 0000000 0000000 00000000000 10740420533 012001 5 ustar root root tatan/se/ 0000755 0000000 0000000 00000000000 10740420533 011270 5 ustar root root tatan/build.xml 0000644 0000000 0000000 00000004575 10666360230 012521 0 ustar root root
tatan/src/ 0000755 0000000 0000000 00000000000 10543241444 011453 5 ustar root root tatan/src/br/ 0000755 0000000 0000000 00000000000 10740420533 012053 5 ustar root root tatan/src/br/cursor.d 0000644 0000000 0000000 00000005037 10565576122 013555 0 ustar root root module br.cursor;
private import opengl;
private import util.parts;
private import util.particle;
private import util.mouse;
private import br.shapeImpl;
private import br.screen;
private import br.mainloop;
private import br.gamemanager;
public class Cursor:Parts{
Mouse mouse;
float ddeg;
public this(Mouse mouse){
this.mouse = mouse;
MouseState ms = mouse.getState();
this.pos = new Vector3(ms.x-Screen.SCREEN_WIDTH/2,-(ms.y-Screen.SCREEN_HEIGHT/2),-800.0f);
rpos = cast(Vector3)pos.clone();
shape = new SH_Star(1);
size = 0.0f;
drawing = POLYGON | WIRE;
R = 0.3;G =0.8;B = 0.6;alpha = 1.0;
walpha = 0.0;
ddeg = 0.0f;
cursorManager.add(this);
Parts p = new CursorAppend();cursorManager.add(p);
addChild(p, "app1", 40 ,ENGAGED);
p = new CursorAppend();cursorManager.add(p);
addChild(p, "app2", 40 ,ENGAGED ,matRotateZ(120));
p = new CursorAppend();cursorManager.add(p);
addChild(p, "app3", 40 ,ENGAGED,matRotateZ(-120));
}
public void move(){
MouseState ms = mouse.getState();
super.move();
pos = new Vector3(ms.x-Screen.SCREEN_WIDTH/2,-(ms.y-Screen.SCREEN_HEIGHT/2),-800.0f);
if(pos.x > screen.GAME_RIGHT)pos.x = screen.GAME_RIGHT;
if(pos.x < screen.GAME_LEFT)pos.x = screen.GAME_LEFT;
if(pos.y < screen.GAME_DOWN)pos.y = screen.GAME_DOWN;
if(pos.y > screen.GAME_UP)pos.y = screen.GAME_UP;
float d = (rpos - ship.rpos).size();
if(d < 200)ddeg = 30.0f;
else if(d < 350)ddeg = 30.0f * (350.0f-d) / 150.0f;
else ddeg = 0.0f;
this.dist = 40.0f * (cos(cast(double)((30.0f-ddeg) / 30.0f)*PI/2.0f) * 0.4f + 0.6f);
this.R = 0.3f + (sin(cast(double)((30.0f-ddeg) / 30.0f)*PI/2.0f) * 0.5f);
this.G = 0.3f + (cos(cast(double)((30.0f-ddeg) / 30.0f)*PI/2.0f) * 0.5f);
this.B = 0.3f + (cos(cast(double)((30.0f-ddeg) / 30.0f)*PI/2.0f) * 0.3f);
linkZ += 2.0f;
}
public override void reportCollision(int kind ,Parts p){
// destroy();
}
}
public class CursorAppend:Parts{
private:
float fixDist;
public this(){
drawing = POLYGON | WIRE;
size = 20;//20;
shape = new SH_Regular(3);
size = 20.0f;
poseZ = 180.0;
R = 0.3;G =0.8;B = 0.6;alpha = 1.0;
wR = 0.0;wG =0.0;wB = 0.0;walpha = 1.0;
}
public void move(){
super.move();
if(cnt == 1)fixDist = dist;
// dist = fixDist * (sin(cast(double)(cnt % 120)*PI/60.0f) * 0.2f + 0.8f);
if(parent !is null){
this.dist = parent.dist;
this.R =parent.R;this.G=parent.G;this.B=parent.B;
}
}
} tatan/src/br/star.d 0000644 0000000 0000000 00000003743 10612760374 013210 0 ustar root root module br.star;
private import util.parts;
private import util.particle;
private import br.shapeImpl;
private import br.screen;
private import br.mainloop;
private import br.gamemanager;
private import br.particleImpl;
private import br.sound;
public class Star:Parts{
public:
Vector3 vel;
int hp;
public this(Vector3 pos ,Vector3 vel){
// collisionManager.add(this ,collisionManager.kind.SHIP ,2);
// collisionManager.add(this ,collisionManager.kind.SHOT ,2);
collisionManager.add(this ,collisionManager.kind.STAR ,2);
this.pos = cast(Vector3)pos.clone();
rpos = cast(Vector3)pos.clone();
this.vel = cast(Vector3)vel.clone();
shape = StarShape.getShape();
size = 30.0f;
drawing = POLYGON | WIRE;
collisionRange = 40;
R = 1.0;G =1.0;B = 0.5;alpha = 1.0;
wR = 0.5;wG = 0.5;wB = 0.1;walpha = 1.0;
// poseZ = atan2(vel.y,vel.x)*180.0/PI;
starManager.add(this);
hp = 3;
}
public void move(){
super.move();
if((rpos.y+size < screen.GAME_DOWN || screen.GAME_UP < rpos.y-size ||
screen.GAME_RIGHT < rpos.x-size || rpos.x+size < screen.GAME_LEFT ||
screen.GAME_NEAR < rpos.z - size || rpos.z + size < screen.GAME_FAR
)){
// ship.starnum = 0;
// rankdown();
vanish();
}
}
public override void reportCollision(int kind ,Parts p){
Sound_PlaySe(se_kind.STAR);
destroy();
}
public void destroy(){
super.destroy();
makeParticleByShape(shape,4, size*0.7f ,WIRE |POLYGON ,ship.rpos ,new Vector3() ,R ,G ,B ,wR,wG,wB,alpha);
}
}
public class Star1:Star{
public this(Vector3 pos ,Vector3 vel){
super(pos ,vel);
}
public void move(){
super.move();
pos += mulsp(vel);
poseZ += mulsp(3f);
}
}
public class Star2:Star{
public this(Vector3 pos ,Vector3 vel){
super(pos ,vel);
}
public void move(){
super.move();
Vector3 t = ship.rpos -rpos;
float r = t.size();
pos += mulsp(t/(r*r) * 3200.0f);
poseZ += mulsp(3f);
}
} tatan/src/br/append.d 0000644 0000000 0000000 00000006103 10575564152 013503 0 ustar root root module br.append;
private import opengl;
private import util.key;
private import util.shape;
private import br.mainloop;
private import util.vector;
private import util.matrix;
private import std.math;
private import br.ship;
private import br.enemy;
private import br.gamemanager;
private import util.particle;
private import util.parts;
private import util.log;
private import br.particleImpl;
public class Append:Parts{
private:
int vanishCount;
bool parentExist;
public this(Shape shape ,double size ,double R = 1.0,double G = 1.0 ,double B = 1.0,double alpha = 1.0 ,Matrix poseBase = new Matrix()){
this.shape = cast(Shape)shape.clone();
drawing = WIRE;
this.size = size;
setPoseBase(poseBase);
// appendManager.add(this);
this.R = R;
this.G = G;
this.B = B;
this.alpha = alpha;
parentExist = true;
}
public void setCollision(double collisionSize){
collisionManager.add(this, collisionManager.kind.SHIP ,2);
// collisionManager.add(this, collisionManager.kind.SWORD ,2);
this.collisionRange = collisionSize;
drawing = POLYGON | WIRE;
}
public void move(){
super.move();
if(parentExist & (parent is null || parent.exists == false)){
parentExist = false;
vanishCount = 5;
}
if(parentExist == false){
vanishCount --;
if(vanishCount < 0)destroy();
}
}
public void destroy(){
super.destroy();
makeParticle(shape, size ,WIRE ,rpos ,new Vector3() ,rpose ,R ,G ,B ,wR,wG,wB,alpha);
}
}
/+
public class BaseOfWing:Parts{
private{
static float[][] a =
[
[-0.2 ,0 ,0.2 ],
[-0.2 ,0 ,0.2 ]
];
static float[][] b =
[
[0 ,0.5 ,0 ],
[0 ,1.0 ,0 ]
];
}
public this(){
shape = BaseOfWing1.getShape();//new SH_Pole(a,b,4);
drawing = WIRE;
size = 30;
}
}
public class Wing:Parts{
private{
static float[][] a =
[
[-1.0 ,-0.5 ,1.0 ],
];
static float[][] b =
[
[0 ,0.5 ,0 ]
];
}
public this(){
/*
Shape shape1 = new SH_Pole(a,b,4);
Shape shape2 = cast(SH_Pole)shape1.clone();
shape1.translate(new Vector3(0.1 ,0 ,0));
shape2.translate(new Vector3(-0.1 ,0 ,0));
shape = shape1 + shape2;
*/
shape = Wing1.getShape();//new SH_Pole(a,b,4);
//shape.translate(new Vector3(1.0 ,0 ,0));
drawing = WIRE;
size = 20;
}
}
public class Tail:Parts{
private{
static float[][] a =
[
[-1.0 ,-0.5 ,1.0 ],
];
static float[][] b =
[
[0 ,0.5 ,0 ]
];
}
public this(){
shape = Tail1.getShape();//new SH_Pole(a,b,4);
drawing = WIRE;
size = 20;
}
}
public class Head:Parts{
private{
static float[] a =
[-1.0 ,-0.5 ,1.0 ,-0.5 ]
;
static float[] b =
[0 ,0.5 ,0 ,-0.5 ]
;
static float[] z =
[-0.5 ,0 ,0.5];
static float[] scale =
[0.3 ,1.0 ,0.3];
}
public this(){
shape = Head1.getShape();//new SH_Pot(a,b,z,scale);
drawing = WIRE;
size = 30;
}
}
+/ tatan/src/br/gamemanager.d 0000644 0000000 0000000 00000031011 10653206722 014465 0 ustar root root module br.gamemanager;
private import hell2;
private import opengl;
private import SDL;
private import SDL_mixer;
private import std.string;
private import std.math;
private import util.key;
private import util.mouse;
private import util.vector;
private import util.matrix;
private import util.rand;
private import util.collision;
private import util.animation;
private import util.parts;
private import util.particle;
private import util.timer;
private import util.log;
private import util.record;
private import util.ascii;
private import br.shapeImpl;
private import br.particleImpl;
private import br.ship;
private import br.mainloop;
private import br.screen;
private import br.sound;
private import br.frame;
private import br.stage;
private import br.enemy;
private import br.star;
private import br.bullet;
private import br.wall;
private import br.pattern;
private import br.cursor;
private import br.background;
private import br.shot;
public Ship ship;
public Rand rand;
public Screen screen;
public Frame frame;
public Stage stage;
public Cursor cursor;
public BackGround bg;
//public Blast blast;
public PartsManager shipManager;
public PartsManager shotManager;
public PartsManager enemyManager;
public PartsManager starManager;
public PartsManager bulletManager;
public PartsManager wallManager;
public PartsManager patternManager;
public PartsManager cursorManager;
public PartsManager laserManager;
ParticleImplManager particleManager;
public CollisionManager collisionManager;
//public PartsManager appendManager;
private const int MAXSHIP = 10;
private const int DEFAULTSTAGE = 1;
private GameManager gameManager;
private GameState inGameState;
private GameState inTitleState;
private int stageNum;
private int totalTime;
private int lapTime;
private int restShip;
private int _rank;
private double _gameSpeed;
private int _rankpar;
private int _stagenum;
public bool pressingA;
private int[] RANK =
[0 ,2 ,4 ,6 ,8];
public class GameManager{
public:
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 0;
/*
static int g_videoFlags = SDL_SWSURFACE|SDL_OPENGL;
// const SDL_VideoInfo* info = NULL;
SDL_Surface *gScreenSurface;
*/
//int screen_width;
//int screen_height;
//int screen_bpp;
static int count;
private:
GameState state;
GameState nextState;
//Parts[10] append;
Key key;
Mouse mouse;
public this(Key key ,Mouse mouse){
this.key = key;
this.mouse = mouse;
gameManager = this;
}
public void start(){
rand = new Rand();
screen = new Screen();
shipManager = new PartsManager(10);
shotManager = new PartsManager(128);
enemyManager = new PartsManager(128);
starManager = new PartsManager(128);
bulletManager = new PartsManager(512);
wallManager = new PartsManager(128);
patternManager = new PartsManager(512);
cursorManager = new PartsManager(8);
laserManager = new PartsManager(8);
// particleManager = new PartsManager(1024);
particleManager = new ParticleImplManager(2048);
// animationManager = new AnimationManager(64);
collisionManager = new CollisionManager(1024);
collisionManager.clear();
Hell_loadTexture("back", "image/back.bmp");
Hell_loadFont();
Sound_init();
inGameState = new InGameState();
inTitleState = new InTitleState();
reset();
pressingA = true;
state = inTitleState;
state.start();
nextState = null;
/*
if (Mix_PlayMusic(music, -1) != 0) {
throw new Error("Couldn't play music");
}
*/
}
public void move(){
int button = key.getButtonState();
if(button & key.Button.ENTER)reset();
state.move();
if(nextState !is null){
state = nextState;
state.start();
nextState = null;
}
count ++;
}
public void returnPushed(){
setNextState("game");
}
public void setNextState(char[] name){
switch(name){
case "game":nextState = inGameState;break;
case "title":nextState = inTitleState;break;
default:break;
}
}
public void draw(){
// glClear(GL_DEPTH_BUFFER_BIT);
state.draw();
}
public void reset(){
clear();
stagenum = 1;
ship = new Ship(key, mouse, 0 ,0);//screen.width / 2,screen.height / 2);
frame = new Frame();
setStage(stagenum);
cursor = new Cursor(mouse);
count = 0;
totalTime = 0;
lapTime = 0;
// rank = 0;
rankpar = 0;
}
public void setStage(int s){
switch(s){
case 1:stage = new Stage1();break;
case 2:stage = new Stage2();break;
case 3:stage = new Stage3();break;
case 4:stage = new Ending();break;
default:break;
}
bg = stage.bg;
}
public void clear(){
cursorManager.clear();
shipManager.clear();
shotManager.clear();
enemyManager.clear();
starManager.clear();
bulletManager.clear();
wallManager.clear();
patternManager.clear();
laserManager.clear();
particleManager.clear();
collisionManager.clear();
}
public void close(){
clear();
Sound_free();
Mix_CloseAudio();
Hell_disposeTexture();
}
}
public abstract class GameState{
protected:
// bool _end;
public void start();
public void move();
public void draw();
// public bool end();
public char[] name();
}
public class InGameState:GameState{
private:
int count;
int endCount;
bool endFlag;
const char[] _name = "gameState";
public this(){
}
public void start(){
count = 0;
endCount = -1;
endFlag =false;
stage.start();
// timer = 0;
// _end = false;
}
public void move(){
if(!endFlag){
if(stage.complete){
stagenum = stagenum + 1;
gameManager.setStage(stagenum);
stage.start();
enemyManager.allParentsDestroy();
bulletManager.allParentsDestroy();
laserManager.allParentsDestroy();
if(stagenum > 4){
endCount = 480;
endFlag = true;
}
}
if(ship.shield < 0){
endCount = 90;
endFlag = true;
}
}else{
if(endCount <= 0){
gameManager.reset();
gameManager.setNextState("title");
}
endCount --;
}
changeRank();
cursorManager.move();
if(ship.shield>=0){
collisionManager.collisionDetect();
shipManager.move();
shotManager.move();
}
enemyManager.move();
starManager.move();
bulletManager.move();
laserManager.move();
wallManager.move();
patternManager.move();
particleManager.run();
bg.run();
// ship.move();
stage.run();
if(rankCount >= 0)rankCount --;
count ++;
lapTime ++;
totalTime ++;
}
public void draw(){
screen.setModelView();
screen.clear();
glLoadIdentity();
// glPushMatrix();
// screen.setProjection();
//setProjection();
// drawBackColor(83.0 ,177.0f ,205.0f);
frame.draw();
bg.draw();
patternManager.draw();
if(ship.shield>=0)shotManager.draw();
laserManager.draw();
particleManager.draw();
glClear(GL_DEPTH_BUFFER_BIT);
if(ship.shield>=0)shipManager.draw();
starManager.draw();
enemyManager.draw();
wallManager.draw();
glClear(GL_DEPTH_BUFFER_BIT);
bulletManager.draw();
// glPopMatrix();
// glPushMatrix();
glClear(GL_DEPTH_BUFFER_BIT);
cursorManager.draw();
glClear(GL_DEPTH_BUFFER_BIT);
if(rankCount >= 0){
if(rankpar >= 50){
asciiR = 1.0;asciiG = 0.8;asciiB = 0.6;
drawString("top speed" ,- mulsp(rankCount) * 570.0 /120.0 + 200 ,0,1.5);
asciiR = 1;asciiG = 1;asciiB = 1;
}else drawString("speed up" ,- mulsp(rankCount) * 550.0 /120.0 + 200 ,0,1.5);
}
if(stagenum > 4 && endCount < 360){
drawString("thank you" ,-115 ,0,1.0);
if(endCount < 300){
if(rankpar >= 50){
drawString("you are crazy" ,-90 ,-80,0.5);
}
}
}
screen.setScoreView();
drawValue(rank ,2 ,20 ,200 ,1.0f);
// drawValue(rankpar ,3 ,20 ,-20 ,1.0f);
// drawValue(ship.starnum ,4 ,20 ,220 ,1.0f);
drawValue(cast(int)fmax(0.0, ship.shield) ,1 ,30 ,-160 ,1.5f);
drawTimer(count ,10 ,-220 ,0.6);
// glPopMatrix();
// ship.draw();
}
private void drawBackColor(float R,float G ,float B){
}
/*
public bool end(){
return _end;
}
*/
public char[] name(){
return _name;
}
}
public class InTitleState:GameState{
private:
int count;
SDL_Surface *back;
const char[] _name = "titleState";
public this(){
}
public void start(){
count = 0;
back = SDL_LoadBMP( "image/back.bmp" );
Sound_FadeOutMusic(1000);
// timer = 0;
// _end = false;
}
public void move(){
/*
if(stage.complete){
stagenum = stagenum + 1;
gameManager.setStage(stagenum);
}
*/
// changeRank();
// collisionManager.collisionDetect();
/*
int button = gameManager.key.getButtonState();
if(button & Key.Button.A){
gameManager.reset();
gameManager.setNextState("game");
}
*/
cursorManager.move();
shipManager.move();
shotManager.move();
enemyManager.move();
starManager.move();
bulletManager.move();
wallManager.move();
// patternManager.move();
particleManager.run();
bg.run();
// ship.move();
// stage.run();
count ++;
// lapTime ++;
// totalTime ++;
}
public void draw(){
SDL_BlitSurface(back , cast(SDL_Rect*)null ,screen.gScreenSurface ,cast(SDL_Rect*)null);
screen.clear();
screen.setProjection();
glLoadIdentity();
Hell_drawTextureEx("back",0,0);
screen.setModelView();
glClear(GL_DEPTH_BUFFER_BIT);
// glPushMatrix();
// screen.setProjection();
//setProjection();
// drawBackColor(83.0 ,177.0f ,205.0f);
// frame.draw();
// bg.draw();
// patternManager.draw();
shotManager.draw();
particleManager.draw();
glClear(GL_DEPTH_BUFFER_BIT);
shipManager.draw();
starManager.draw();
enemyManager.draw();
bulletManager.draw();
wallManager.draw();
// glPopMatrix();
// glPushMatrix();
glClear(GL_DEPTH_BUFFER_BIT);
cursorManager.draw();
/*
screen.setScoreView();
drawValue(rank ,2 ,20 ,120 ,1.0f);
drawValue(rankpar ,3 ,20 ,-20 ,1.0f);
drawValue(ship.starnum ,4 ,20 ,220 ,1.0f);
drawTimer(count ,10 ,-220 ,0.6);
*/
// glPopMatrix();
// ship.draw();
}
private void drawBackColor(float R,float G ,float B){
}
/*
public bool end(){
return _end;
}
*/
public char[] name(){
return _name;
}
}
public int rank(){
return _rank;
}
private void rank(int r){
if(r<0)_rank = 0;
else if(r>=50)_rank = 50;//RANK.length)_rank = RANK.length-1;
else _rank = r;
gameSpeed = r;
}
public double gameSpeed(){
return _gameSpeed;
}
public void gameSpeed(int rank){
// if(rank <= 0) _gameSpeed = 0.8;
if(rank < 10)_gameSpeed = 0.9;
else if(rank < 20)_gameSpeed = 1.0;
else if(rank < 30)_gameSpeed = 1.1;
else if(rank < 40)_gameSpeed = 1.2;
else if(rank < 50)_gameSpeed = 1.3;
else _gameSpeed = 1.5;
// if(rank == 50)_gameSpeed = 2.0f;
// else _gameSpeed = 0.8 + cast(float)rank * 0.02f;
// _gameSpeed = 1.0f;
// Shot.POWER = 1.0f + fmax(_gameSpeed-1.0f ,0.0f) * 0.5f;
// _gameSpeed = 1.0f;
/*
switch(rank){
case 0:_gameSpeed = 0.8;break;
case 1:_gameSpeed = 1.0;break;
case 2:_gameSpeed = 1.2;break;
case 3:_gameSpeed = 1.5;break;
case 4:_gameSpeed = 2.0;break;
default:break;
}
*/
}
public double mulsp(double val){
return val * gameSpeed;
}
public Vector3 mulsp(Vector3 v){
return v * gameSpeed;
}
public double divsp(double val){
return val / gameSpeed;
}
public int divsp(int val){
return cast(int)(cast(double)val / gameSpeed);
}
private int rankCount = -1;
private void changeRank(){
int n = rankpar;
rank = 50;//RANK.length - 1;
for(int i=0;i<=50;i++){
if(n < i ){
rank = i-1;
break;
}
}
}
public void rankpar(int n){
_rankpar = n;
if(_rankpar < 0)_rankpar = 0;
changeRank();
if(rankpar >= 1 && rankpar % 10 == 0){
Sound_PlaySe(se_kind.SPEEDUP);
rankCount = 120;
}
}
public int rankpar(){
return _rankpar;
}
public void rankdown(){
if(rank>0){
rankpar = 1*(rank-3);//RANK[rank-1];
changeRank();
}else rankpar = 0;
}
public void stagenum(int s){
//if(1<=s&&s<=3)
_stagenum=s;
}
public int stagenum(){
return _stagenum;
} tatan/src/br/bullet.d 0000644 0000000 0000000 00000014603 10652670636 013530 0 ustar root root module br.bullet;
private import util.parts;
private import util.particle;
private import util.collision;
private import br.shapeImpl;
private import br.screen;
private import br.mainloop;
private import br.gamemanager;
public class Bullet:Parts{
public:
Vector3 vel;
// int hp;
public this(Vector3 pos){
collisionManager.add(this ,collisionManager.kind.SHIP ,2);
collisionManager.add(this ,collisionManager.kind.WALL ,2);
// collisionManager.add(this ,collisionManager.kind.SHOT ,2);
this.pos = cast(Vector3)pos.clone();
rpos = cast(Vector3)pos.clone();
drawing = POLYGON | WIRE;
R = 1.0;G =116.0f/255.0f;B = 122.0f/255.0f;alpha = 1.0;
wR = 0.0;wG =0.0f;wB = 0.0f;walpha = 1.0;
bulletManager.add(this);
// hp = 3;
}
public void move(){
super.move();
if((rpos.y+size < screen.GAME_DOWN || screen.GAME_UP < rpos.y-size ||
screen.GAME_RIGHT < rpos.x-size || rpos.x+size < screen.GAME_LEFT ||
screen.GAME_NEAR < rpos.z - size || rpos.z + size < screen.GAME_FAR
)){
vanish();
}
// poseY += 1f;
}
public override void reportCollision(int kind ,Parts p){
switch(kind){
case CollisionManager.kind.SHIP:
case CollisionManager.kind.WALL:
destroy();
break;
default:break;
}
}
public void destroy(){
super.destroy();
// makeParticle(shape, size ,WIRE ,rpos ,new Vector3() ,rpose ,R ,G ,B ,alpha);
}
}
public class BulletAppend:Bullet{
public this(float size = 20.0f,Shape shape = null ,Vector3 pos = new Vector3(0,0,0)){
super(pos);
if(shape !is null)this.shape = cast(Shape)shape.clone();
else this.shape = BulletShape.getShape();
this.size = size;
collisionRange = size/2.0f;
poseZ = 180;
}
public void move(){
super.move();
poseX += mulsp(2f);
if(parent is null)destroy();
}
}
public class Bullet1:Bullet{
public:
Vector3 vel;
public this(Vector3 pos ,Vector3 vel){
super(pos);
this.vel = cast(Vector3)vel.clone();
shape = BulletShape.getShape();
size = 20.0f;
collisionRange = 10.0f;
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
public void move(){
super.move();
pos += mulsp(vel);
// vel *= 1.02f;
poseX += mulsp(2f);
}
}
public class AccBullet:Bullet{
public:
Vector3 vel;
Vector3 acc;
float min;
public this(Vector3 pos ,Vector3 vel ,Vector3 acc ,float min = 0.0f){
super(pos);
this.vel = cast(Vector3)vel.clone();
this.acc = cast(Vector3)acc.clone();
this.min = min;
shape = BulletShape.getShape();
size = 20.0f;
collisionRange = 10.0f;
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
public void move(){
super.move();
pos += mulsp(vel);
vel += mulsp(acc);
if(vel.size < min){
vel = vec3Normalize(vel) * min;
}
poseX += mulsp(2f);
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
}
public class ReflectBullet:Bullet{
public:
Vector3 vel;
int re;
public this(Vector3 pos ,Vector3 vel){
super(pos);
this.vel = cast(Vector3)vel.clone();
shape = BulletShape.getShape();
size = 20.0f;
collisionRange = 10.0f;
poseZ = 180;
re = 0;
}
public void move(){
super.move();
if(parent is null){
pos += mulsp(vel);
// vel *= 1.02f;
poseZ = atan2(vel.y,vel.x)*180.0/PI;
re = cast(int)fmax(0,re-1);
}
poseX += mulsp(2f);
}
public override void reportCollision(int kind ,Parts p){
if(parent is null){
switch(kind){
case CollisionManager.kind.SHIP:
destroy();
case CollisionManager.kind.WALL:
if(re <= 0){
if(vel.x<0)pos = new Vector3(p.pos.x+(p.collisionRange+collisionRange) ,pos.y ,pos.z);
else pos = new Vector3(p.pos.x-(p.collisionRange+collisionRange) ,pos.y ,pos.z);
vel = new Vector3(-vel.x ,vel.y ,vel.z);
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
re ++;
break;
default:break;
}
}
}
}
public class BlastBullet:Bullet{
public:
Vector3 vel;
bool hit;
bool right;
public this(Vector3 pos ,Vector3 vel){
super(pos);
this.vel = cast(Vector3)vel.clone();
shape = Octahedron.getShape();
size = 20.0f;
collisionRange = 10.0f;
poseZ = 180;
hit = false;
right = false;
}
public void move(){
super.move();
if(parent is null){
pos += mulsp(vel);
if(hit){
if(cnt % divsp(5) == 0){
if(right){
Vector3 vel = new Vector3(-6.0f ,0.0f ,0.0f);
new AccBullet(rpos ,vel ,vel/-30.0f);
new AccBullet(rpos-new Vector3(40.0f,0.0f,0.0f) ,vel ,vel/-30.0f);
// new AccBullet(rpos-new Vector3(40.0f,0.0f,0.0f) ,vel ,vel/-30.0f);
}else{
Vector3 vel = new Vector3(6.0f ,0.0f ,0.0f);
new AccBullet(rpos ,vel ,vel/-30.0f);
new AccBullet(rpos+new Vector3(40.0f,0.0f,0.0f) ,vel ,vel/-30.0f);
// new AccBullet(rpos+new Vector3(40.0f,0.0f,0.0f) ,vel ,vel/-30.0f);
}
}
}
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
poseX += 2f;
}
public override void reportCollision(int kind ,Parts p){
if(parent is null){
switch(kind){
case CollisionManager.kind.SHIP:
destroy();
case CollisionManager.kind.WALL:
if(!hit){
if(vel.x<0){
pos = new Vector3(p.pos.x+(p.collisionRange+collisionRange) ,pos.y ,pos.z);
right = false;
}else{
pos = new Vector3(p.pos.x-(p.collisionRange+collisionRange) ,pos.y ,pos.z);
right = true;
}
vel = new Vector3(0.0f ,-vel.size ,0.0f);
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
hit = true;
break;
default:break;
}
}
}
}
public class LockBullet:Bullet{
public:
Vector3 vel;
Vector3 target;
float speed;
public this(Vector3 pos ,Vector3 vel ,Vector3 target ,float speed = 1.0f){
super(pos);
this.vel = cast(Vector3)vel.clone();
this.target = cast(Vector3)target.clone();
// this.min = min;
this.speed = speed;
shape = BulletShape.getShape();
size = 20.0f;
collisionRange = 10.0f;
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
public void move(){
super.move();
pos += mulsp(vel);
if(rpos.y>ship.rpos.y-20.0){
Vector3 aim = target - rpos;
double r = aim.size;
if(r>0.0){
vel += vec3Normalize(aim)/(r*r) * mulsp(16000.0f)*speed;
}
if(r < mulsp(100.0))pos += vec3Normalize(target - rpos)*mulsp(5.0f)*speed;
}
poseX += mulsp(2f);
poseZ = atan2(vel.y,vel.x)*180.0/PI;
}
} tatan/src/br/mainloop.d 0000644 0000000 0000000 00000007221 10651220732 014040 0 ustar root root module br.mainloop;
private import opengl;
private import SDL;
private import br.ship;
private import util.key;
private import util.mouse;
private import std.string;
private import br.screen;
private import br.gamemanager;
private import util.parts;
private import std.math;
private import util.vector;
private import util.matrix;
private import util.log;
public class Mainloop{
static int count;
private:
Parts ship;
//Parts[10] append;
public:
const int INTERVAL = 16;
const int MAX_SKIP_FRAME = 5;
GameManager gm;
bool accframe;
Key key;
Mouse mouse;
bool active;
uint interval;
uint maxSkipFrame;
public this(Key key ,Mouse mouse){
this.key = key;
this.mouse = mouse;
}
public void loop(){
gm = new GameManager(key ,mouse);
// prefManager = new PrefManager;
// prefManager.load();
long prvTickCount = 0;
long nowTick;
int frame;
//partsManager = new PartsManager(128);
gm.start();
active = true;
accframe = false;
interval = INTERVAL;
maxSkipFrame = MAX_SKIP_FRAME;
SDL_Event event;
SDLKey *sdlkey;
GLubyte mask[128];
Uint32 prevTime;
//count = 0;
bool done = false;
//for(int iCount = 0 ; iCount < 128 ; iCount++) mask[iCount] = 0xF0;
while(!done){
//prevTime = SDL_GetTicks();
//SDL_UpdateRect(gScreenSurface,0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
while(SDL_PollEvent(&event)){
//event.type = SDL_USEREVENT;
key.handleEvent(&event);
switch(event.type){
case SDL_QUIT:
done = true;
break;
case SDL_ACTIVEEVENT:
switch(event.active.state){
case SDL_APPACTIVE:
if(event.active.gain){
//active = true;
}else active = false;
break;
case SDL_APPINPUTFOCUS:
if(event.active.gain){
//active = true;
}else active = false;
break;
case SDL_APPMOUSEFOCUS:
if(event.active.gain)active = true;
else active = false;
break;
default:break;
}
break;
//case SDL_APPINPUTFOCUS:
case SDL_MOUSEBUTTONDOWN:
active = true;
break;
case SDL_KEYDOWN:
sdlkey=&(event.key.keysym.sym);
if(*sdlkey==SDLK_ESCAPE){
done = true;
}else if(*sdlkey==SDLK_F9)screen.toggleFullScreen();
// else if(*sdlkey==SDLK_F12)screen.saveBMP("screenshot.bmp");
else if(*sdlkey==SDLK_F5)SDL_WM_IconifyWindow();
else if(*sdlkey==SDLK_RETURN){
gm.returnPushed();
}
break;
/*case SDL_VIDEORESIZE:
{
SDL_ResizeEvent re = event.resize;
screen_width = re.w;
screen_height = re.h;
}
*/
default:break;
}
}
nowTick = SDL_GetTicks();
frame = cast(int) (nowTick-prvTickCount) / interval;
// Log_write(d);
if(frame <= 0){
frame = 1;
SDL_Delay(cast(uint)(prvTickCount+interval-nowTick));
if (accframe) {
prvTickCount = SDL_GetTicks();
} else {
prvTickCount += interval;
}
}else if (frame > maxSkipFrame) {
frame = maxSkipFrame;
prvTickCount = nowTick;
} else {
prvTickCount += frame * interval;
}
if(active){
for (int i = 0; i < frame; i++) {
gm.move();
}
}
//active code
//glLoadIdentity();
// screen.clear();
//partsManager.move();
//partsManager.draw();
gm.draw();
screen.flip();
}
// prefManager.save();
gm.close();
SDL_Quit();
}
}
tatan/src/br/screen.d 0000644 0000000 0000000 00000012672 10652710174 013514 0 ustar root root module br.screen;
private import opengl;
private import openglu;
private import SDL;
private import hell2;
private import std.string;
private import std.c.stdlib;
private import br.mainloop;
public class Screen{
public:
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 0;
const int GAME_LEFT = -200;
const int GAME_RIGHT = 200;
const int GAME_UP = 240;
const int GAME_DOWN = -240;
const int GAME_NEAR = -2;
const int GAME_FAR = -1600;
const GLfloat ambientCol[] = [1, 1, 1, 0.5];
const GLfloat lightPos1[] = [ 0 , 0 , 100 , 0.0 ];
const GLfloat lightCol1[] = [ 1 , 1 , 1 , 1 ];
const GLfloat lightPos2[] = [ 0 , 0 , 100 , 1.0 ];
const GLfloat lightCol2[] = [ 0 , 0 , 1 , 1 ];
static int g_videoFlags = SDL_SWSURFACE|SDL_OPENGL;
SDL_Surface *gScreenSurface;
int width;
int height;
int bpp;
public this(){
// setenv("SDL_VIDEODRIVER","directx" ,1);
// setenv("SDL_AUDIODRIVER","directx" ,1);
if(SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 ) {
throw new Exception(
"Unable to init SDL video: " ~ std.string.toString(SDL_GetError()));
}
//info = SDL_GetVideoInfo( );
width = SCREEN_WIDTH;
height = SCREEN_HEIGHT;
bpp = SCREEN_BPP;
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
// SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
gScreenSurface = SDL_SetVideoMode(
width,
height,
bpp,
g_videoFlags
);
SDL_WM_SetCaption("tatan", null);
SDL_ShowCursor(SDL_DISABLE);
// SDL_WM_GrabInput(SDL_GRAB_ON);
//glFrustum(0 ,width ,height ,0 ,1 ,400);
//(width - height) / 2 ,0 ,height ,height);
glLightfv(GL_LIGHT1 , GL_POSITION , cast(float*)lightPos1);
glLightfv(GL_LIGHT1 , GL_DIFFUSE , cast(float*)lightCol1);
glLightfv(GL_LIGHT2 , GL_POSITION , cast(float*)lightPos2);
glLightfv(GL_LIGHT2 , GL_DIFFUSE , cast(float*)lightCol2);
glLightfv(GL_LIGHT0 ,GL_AMBIENT ,cast(float*)ambientCol);
glEnable(GL_LIGHTING);
// glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
// glEnable(GL_LIGHT2);
glClearColor(0 ,0 ,0,1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
// glEnable(GL_BLEND);
// glEnable(GL_LINE_SMOOTH);
// glEnable(GL_POLYGON_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glFrustum(0 , 4 , 2 , 0 , 2 , 10);
// glClearColor(0.1 ,0.08 ,0 ,1.0);
}
public void setProjection(){
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glFrustum(GAME_LEFT / 400.0f , GAME_RIGHT / 400.0f , GAME_DOWN / 400.0f , GAME_UP / 400.0f , 2 , 1600);
// glOrtho(GAME_LEFT, GAME_RIGHT, GAME_DOWN, GAME_UP, 2, 1600);
glViewport(width/2 + GAME_LEFT ,height/2 + GAME_DOWN ,GAME_RIGHT -GAME_LEFT ,height/2 + GAME_UP);
}
public void setModelView(){
glViewport(width/2 + GAME_LEFT ,height/2 + GAME_DOWN ,GAME_RIGHT -GAME_LEFT ,height/2 + GAME_UP);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(GAME_LEFT / 400.0f , GAME_RIGHT / 400.0f , GAME_DOWN / 400.0f , GAME_UP / 400.0f , 2 , 1600);
// glOrtho(GAME_LEFT, GAME_RIGHT, GAME_DOWN, GAME_UP, 2, 1600);
glMatrixMode(GL_MODELVIEW);
// glEnable(GL_DEPTH_TEST);
}
/*
public void setModelView(){
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glOrtho(GAME_LEFT, GAME_RIGHT, GAME_DOWN, GAME_UP, 2, 1600);
glViewport(width/2 + GAME_LEFT ,height/2 + GAME_DOWN ,GAME_RIGHT -GAME_LEFT ,height/2 + GAME_UP);
glEnable(GL_DEPTH_TEST);
}
*/
public void setScoreView(){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width-GAME_RIGHT, GAME_DOWN, GAME_UP, 2, 1600);
glViewport(width/2 + GAME_RIGHT ,height/2 + GAME_DOWN ,width-GAME_RIGHT ,height/2 + GAME_UP);
glEnable(GL_DEPTH_TEST);
}
public void setClearColor(double R ,double G,double B,double alpha){
glClearColor(R ,G ,B ,alpha);
}
public void clear() {
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
}
public void flip() {
//handleError();
SDL_GL_SwapBuffers();
}
public void handleError() {
GLenum error = glGetError();
if (error == GL_NO_ERROR)
return;
closeSDL();
throw new Exception("OpenGL error(" ~ std.string.toString(error) ~ ")");
}
public void closeSDL() {
close();
SDL_ShowCursor(SDL_ENABLE);
}
public void close() {
}
public void toggleFullScreen()
{
if(g_videoFlags && SDL_FULLSCREEN) SDL_ShowCursor(SDL_DISABLE);
else SDL_ShowCursor(SDL_ENABLE);
g_videoFlags ^= SDL_FULLSCREEN;
gScreenSurface = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, g_videoFlags);
SDL_WM_SetCaption("tatan", null);
SDL_ShowCursor(SDL_DISABLE);
glLightfv(GL_LIGHT1 , GL_POSITION , cast(float*)lightPos1);
glLightfv(GL_LIGHT1 , GL_DIFFUSE , cast(float*)lightCol1);
glLightfv(GL_LIGHT2 , GL_POSITION , cast(float*)lightPos2);
glLightfv(GL_LIGHT2 , GL_DIFFUSE , cast(float*)lightCol2);
glLightfv(GL_LIGHT0 ,GL_AMBIENT ,cast(float*)ambientCol);
glEnable(GL_LIGHTING);
// glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
// glEnable(GL_LIGHT2);
glClearColor(0 ,0 ,0,1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
// glEnable(GL_BLEND);
// glEnable(GL_LINE_SMOOTH);
// glEnable(GL_POLYGON_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Hell_loadTexture("back", "image/back.bmp");
Hell_loadFont();
}
public void saveBMP(char[] name){
SDL_SaveBMP(gScreenSurface, "screenshot.bmp");
}
} tatan/src/br/boss.d 0000644 0000000 0000000 00000104427 10653204204 013174 0 ustar root root module br.boss;
private import util.parts;
private import util.particle;
private import util.collision;
private import util.animationImpl;
private import br.shapeImpl;
private import br.screen;
private import br.mainloop;
private import br.gamemanager;
private import br.bullet;
private import br.enemy;
private import br.wall;
private import br.sound;
private import br.ship;
private import br.particleImpl;
public class Boss:Enemy{
char[] state;
int sCnt;
public this(int hp,Vector3 pos){
super(hp ,pos);
border = false;
changeState("start");
}
public void changeState(char[] state){
this.state = state.dup;
sCnt = 0;
}
public void move(){
super.move();
sCnt ++;
}
public void destroyImpl(){
// super.destroy();
makeParticle(shape, size ,WIRE | POLYGON ,rpos ,new Vector3() ,rpose ,R ,G ,B ,R/2.0,G/2.0,B/2.0,alpha ,5.0f);
makeParticle(shape, size ,WIRE | POLYGON ,rpos ,new Vector3() ,rpose ,R ,G ,B ,R/2.0,G/2.0,B/2.0,alpha ,10.0f);
makeParticle(shape, size ,WIRE | POLYGON ,rpos ,new Vector3() ,rpose ,R ,G ,B ,R/2.0,G/2.0,B/2.0,alpha ,20.0f);
}
}
public class Boss2:Boss{
private:
bool reload;
int num;
public this(Vector3 pos ,Vector3 vel){
super(700 ,new Vector3(pos.x ,pos.y ,-1200));
shape = OctaShape.getShape(1.6f ,1.6f);
size = 30.0f;
collisionRange = size / 2.0f;
R = 1.0f;G = 0.6f;B = 0.8f;alpha = 1.0f;
poseZ = 90;
Parts p1 ,p2,p3;
p3 = new RootAppend(Octahedron.getShape(),0 , -1,0.7f,0.8f,1.0f ,alpha);
addChild(p3, "r1", 40 ,ENGAGED);
p1 = new RootAppend(Octahedron.getShape(),20 , -1,0.7f,0.8f,1.0f ,alpha);
p3.addChild(p1, "ra1", 0 ,ENGAGED);
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f ,alpha);
p1.addChild(p2, "fa1", 40 ,ENGAGED ,matRotateZ(0));
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f ,alpha);
p1.addChild(p2, "fb1", 40 ,ENGAGED ,matRotateZ(0));
p3 = new RootAppend(Octahedron.getShape(),0 , -1,0.7f,0.8f,1.0f ,alpha);
addChild(p3, "r2", 40 ,ENGAGED);
p1 = new RootAppend(Octahedron.getShape(),20 , -1,0.7f,0.8f,1.0f ,alpha);
p3.addChild(p1, "ra2", 0 ,ENGAGED);
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f ,alpha);
p1.addChild(p2, "fa2", 40 ,ENGAGED ,matRotateZ(0));
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f,alpha);
p1.addChild(p2, "fb2", 40 ,ENGAGED ,matRotateY(0));
p3 = new RootAppend(Octahedron.getShape(),0 , -1,0.7f,0.8f,1.0f ,alpha);
addChild(p3, "r3", 40 ,ENGAGED);
p1 = new RootAppend(Octahedron.getShape(),20 , -1,0.7f,0.8f,1.0f ,alpha);
p3.addChild(p1, "ra3", 0 ,ENGAGED);
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f ,alpha);
p1.addChild(p2, "fa3", 40 ,ENGAGED ,matRotateZ(0));
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f,alpha);
p1.addChild(p2, "fb3", 40 ,ENGAGED ,matRotateZ(0));
p3 = new RootAppend(Octahedron.getShape(),0 , -1,0.7f,0.8f,1.0f ,alpha);
addChild(p3, "r4", 40 ,ENGAGED);
p1 = new RootAppend(Octahedron.getShape(),20 , -1,0.7f,0.8f,1.0f ,alpha);
p3.addChild(p1, "ra4", 0 ,ENGAGED);
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f ,alpha);
p1.addChild(p2, "fa4", 40 ,ENGAGED ,matRotateZ(0));
p2 = new EnemyAppend(OctaShape.getShape(1.0f ,6.0f),15 , -1,0.8f,0.9f,1.0f ,alpha);
p1.addChild(p2, "fb4", 40 ,ENGAGED ,matRotateZ(0));
childHash["r1"].linkY =0;
childHash["r2"].linkY = 90;
childHash["r3"].linkY = 180;
childHash["r4"].linkY = -90.0;
childHash["fa1"].linkZ =childHash["fa2"].linkZ = childHash["fa3"].linkZ = childHash["fa4"].linkZ = 90.0;
childHash["fb1"].linkZ =childHash["fb2"].linkZ = childHash["fb3"].linkZ = childHash["fb4"].linkZ = -60.0;
addAnimation(new Rotate(360 ,LINKY ,mulsp(1) ,0.0 ,-1) ,"roll");
// hp = 1000;
reload = false;
num = 0;
}
public void move(){
super.move();
switch(state){
case "start":
if(rpos.y < 160.0f)pos.y += mulsp(8.0f);
else pos.y = 160.0f;
double rad = cast(double)sCnt / divsp(60.0) * PI;
pos.x = sin(rad)*200.0f;
pos.z = -1000 - cos(rad)*200.0f;
if(sCnt == divsp(60))changeState("a");
break;
case "a":
if(sCnt == 1){
childHash["r1"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["r2"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["r3"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["r4"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["ra1"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra2"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra3"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra4"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["fa1"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fa2"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fa3"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fa4"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fb1"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
childHash["fb2"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
childHash["fb3"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
childHash["fb4"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
}
if(sCnt == divsp(31))changeState("a1");
break;
case "a1":
// pos.x = sin(cast(double)(sCnt%300)/150.0*PI)*120.0f;
if(sCnt % 120 == 0){
// double rad = (-90.0 + (25.0 + rand.nextFloat(25.0))*(1.0f-cast(float)((cnt/90)%2)*2.0f))*PI/180.0f;
attack("r");
// p = new ReflectBullet(rpos+v*5.0f ,v);
// p = new ReflectBullet(rpos+v*10.0f ,v);
// p1.addChild(p2, "2", 40 ,FOLLOW);
}
if(sCnt % divsp(30) == 0){
attack("a");
}
if(sCnt % divsp(30) == divsp(15)){
attack("b");
}
if(sCnt == divsp(450)){
changeState("b");
/*
int next = rand.nextInt(3);
switch(next){
case 0:
changeState("b");
break;
case 1:
changeState("c");
break;
case 2:
changeState("f");
break;
default:
changeState("b");
break;
}
*/
}
break;
case "b":
if(sCnt == 1){
childHash["r1"].addAnimation(new MoveDist(30 ,50),"pose");
childHash["r2"].addAnimation(new MoveDist(30 ,50),"pose");
childHash["r3"].addAnimation(new MoveDist(30 ,50),"pose");
childHash["r4"].addAnimation(new MoveDist(30 ,50),"pose");
childHash["ra1"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra2"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra3"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra4"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["fa1"].addAnimation(new Move(30 ,LINK ,0,0,110),"pose");
childHash["fa2"].addAnimation(new Move(30 ,LINK ,0,0,110),"pose");
childHash["fa3"].addAnimation(new Move(30 ,LINK ,0,0,110),"pose");
childHash["fa4"].addAnimation(new Move(30 ,LINK ,0,0,110),"pose");
childHash["fb1"].addAnimation(new Move(30 ,LINK ,0,0,-110),"pose");
childHash["fb2"].addAnimation(new Move(30 ,LINK ,0,0,-110),"pose");
childHash["fb3"].addAnimation(new Move(30 ,LINK ,0,0,-110),"pose");
childHash["fb4"].addAnimation(new Move(30 ,LINK ,0,0,-110),"pose");
}
if(sCnt >= divsp(61))pos.x = sin(cast(double)(sCnt%divsp(240))/divsp(120.0)*PI-PI/2.0)*120.0f;
if((sCnt+divsp(61)) % divsp(240) == 0)attack("c");
else if((sCnt+divsp(61)) % divsp(240) == divsp(120))attack("d");
if(sCnt >= divsp(60) && sCnt%divsp(15) == 0){
attack("e");
}
if(sCnt == divsp(540)){
changeState("b1");
}
break;
case "b1":
if(rpos.x < -1.5f)pos.x += mulsp(1.5f);
else if(rpos.x > 1.5f)pos.x -= mulsp(1.5f);
else{
pos.x = 0.0f;
if(sCnt == divsp(90)){
int next = rand.nextInt(2);
switch(next){
case 0:
changeState("c");
break;
case 1:
changeState("f");
break;
default:
changeState("c");
break;
}
}
}
break;
case "c":
if(sCnt == 1){
childHash["r1"].addAnimation(new MoveDist(30 ,120),"pose");
childHash["r2"].addAnimation(new MoveDist(30 ,120),"pose");
childHash["r3"].addAnimation(new MoveDist(30 ,120),"pose");
childHash["r4"].addAnimation(new MoveDist(30 ,120),"pose");
childHash["ra1"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra2"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra3"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["ra4"].addAnimation(new Move(30 ,LINK ,0,0,0.0),"pose1");
childHash["fa1"].addAnimation(new Move(30 ,LINK ,0,0,150),"pose");
childHash["fa2"].addAnimation(new Move(30 ,LINK ,0,0,150),"pose");
childHash["fa3"].addAnimation(new Move(30 ,LINK ,0,0,150),"pose");
childHash["fa4"].addAnimation(new Move(30 ,LINK ,0,0,150),"pose");
childHash["fb1"].addAnimation(new Move(30 ,LINK ,0,0,-150),"pose");
childHash["fb2"].addAnimation(new Move(30 ,LINK ,0,0,-150),"pose");
childHash["fb3"].addAnimation(new Move(30 ,LINK ,0,0,-150),"pose");
childHash["fb4"].addAnimation(new Move(30 ,LINK ,0,0,-150),"pose");
}
if(sCnt == divsp(31)){
addAnimation(new Rotate(360 ,LINKY ,1.6 ,0.0 ,-1) ,"roll");
changeState("e");
}
break;
case "e":
int rel=0;
if(fabs(childHash["ra1"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra1"]).attack("laser");
}
rel ++;
}
if(fabs(childHash["ra2"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra2"]).attack("laser");
}
rel ++;
}
if(fabs(childHash["ra3"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra3"]).attack("laser");
}
rel ++;
}
if(fabs(childHash["ra4"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra4"]).attack("laser");
}
rel ++;
}
if(sCnt == divsp(360)){
/*
childHash["ra1"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose1");
childHash["ra2"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose1");
childHash["ra3"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose1");
childHash["ra4"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose1");
// linkY = deglimit(linkY);
addAnimation(new RotateTo(30 ,LINKY ,0.0 ) ,"roll");
*/
changeState("b");
/*
int next = rand.nextInt(2);
switch(next){
case 0:
changeState("b");
break;
case 1:
changeState("f");
break;
default:
changeState("b");
break;
}
*/
}
if(rel == 0)reload = false;
else reload = true;
break;
case "f":
if(sCnt == 1){
childHash["r1"].addAnimation(new MoveDist(60 ,120),"pose");
childHash["r2"].addAnimation(new MoveDist(60 ,120),"pose");
childHash["r3"].addAnimation(new MoveDist(60 ,120),"pose");
childHash["r4"].addAnimation(new MoveDist(60 ,120),"pose");
childHash["fa1"].addAnimation(new Move(60 ,LINK ,0,0,150),"pose");
childHash["fa2"].addAnimation(new Move(60 ,LINK ,0,0,150),"pose");
childHash["fa3"].addAnimation(new Move(60 ,LINK ,0,0,150),"pose");
childHash["fa4"].addAnimation(new Move(60 ,LINK ,0,0,150),"pose");
childHash["fb1"].addAnimation(new Move(60 ,LINK ,0,0,-150),"pose");
childHash["fb2"].addAnimation(new Move(60 ,LINK ,0,0,-150),"pose");
childHash["fb3"].addAnimation(new Move(60 ,LINK ,0,0,-150),"pose");
childHash["fb4"].addAnimation(new Move(60 ,LINK ,0,0,-150),"pose");
childHash["ra1"].addAnimation(new Move(60 ,LINK ,0,0,rand.nextFloat(50)+40.0),"pose1");
childHash["ra2"].addAnimation(new Move(60 ,LINK ,0,0,rand.nextFloat(50)+40.0),"pose1");
childHash["ra3"].addAnimation(new Move(60 ,LINK ,0,0,rand.nextFloat(50)+40.0),"pose1");
childHash["ra4"].addAnimation(new Move(60 ,LINK ,0,0,rand.nextFloat(50)+40.0),"pose1");
// linkY = deglimit(linkY);
// addAnimation(new RotateTo(60 ,LINKY ,0.0 ) ,"roll");
deleteAnimation("roll");
}
if(sCnt == divsp(60)){
addAnimation(new Rotate(360 ,LINKY ,1 ,0.0 ,-1) ,"roll");
changeState("g");
}
break;
case "g":
int rel=0;
if(fabs(childHash["ra1"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra1"]).attack("balkan");
}
rel ++;
}
if(fabs(childHash["ra2"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra2"]).attack("rock");
}
rel ++;
}
if(fabs(childHash["ra3"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra3"]).attack("elaser");
}
rel ++;
}
if(fabs(childHash["ra4"].rpos.z+800) < mulsp(4.0f)){
if(!reload){
(cast(Enemy)childHash["ra4"]).attack("balkan");
}
rel ++;
}
if(rel == 0)reload = false;
else reload = true;
if(sCnt == divsp(360)){
num ++;
if(1 <= num){
num = 0;
changeState("h");
}else changeState("f");
}
break;
case "h":
if(sCnt == divsp(60))changeState("b");
/*
int next = rand.nextInt(2);
switch(next){
case 0:
changeState("b");
break;
case 1:
changeState("c");
break;
default:
changeState("b");
break;
}
*/
break;
/*
case "end":
if(sCnt == 30){
childHash["r1"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["r2"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["r3"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["r4"].addAnimation(new MoveDist(30 ,40),"pose");
childHash["fa1"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fa2"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fa3"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fa4"].addAnimation(new Move(30 ,LINK ,0,0,90),"pose");
childHash["fb1"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
childHash["fb2"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
childHash["fb3"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
childHash["fb4"].addAnimation(new Move(30 ,LINK ,0,0,-60),"pose");
changeState("end2");
}
break;
case "end2":
if(sCnt == 30)changeState("a");
break;
*/
default:break;
}
if(cnt > 60 && cnt % divsp(10) == 0){
makeWall("1" ,new Vector3(-180.0f,screen.GAME_UP,-800.0f) ,new Vector3(0,-4,0));
makeWall("1" ,new Vector3(180.0f,screen.GAME_UP,-800.0f) ,new Vector3(0,-4,0));
}
poseX ++;
}
public void attack(char[] type){
switch(type){
case "a":
float dx = rand.nextFloat(1.0f);
new Enemy1(rpos ,vec3Normalize(ship.rpos - rpos)*3.0f+new Vector3(dx,0.0f,0.0f));
new Enemy1(rpos ,vec3Normalize(ship.rpos - rpos)*3.0f+new Vector3(-dx,0.0f,0.0f));
break;
case "b":
float dx = rand.nextFloat(1.0f);
new Enemy1(rpos ,vec3Normalize(ship.rpos - rpos)*3.0f+new Vector3(dx,0.0f,0.0f));
break;
case "c":
new BlastBullet(rpos ,new Vector3(5.0f ,0.0f ,0.0f));
break;
case "d":
new BlastBullet(rpos ,new Vector3(-5.0f ,0.0f ,0.0f));
break;
case "e":
new Missile(rpos ,new Vector3() ,new Vector3(0.0f,-0.1f,0.0f));
break;
case "r":
double rad = -PI/2.0 + (20.0 + rand.nextFloat(40.0))*(1.0f-cast(float)((sCnt/120)%2)*2.0f)*PI/180.0;
Vector3 vel = new Vector3(cos(rad),sin(rad),0.0f)*6.0f;
// float x = 0.0f + (2.0f + rand.nextFloat(4.0f))*(1.0f-cast(float)((sCnt/120)%2)*2.0f);
// Vector3 v = new Vector3(x ,-4.0f ,0.0f);//new Vector3(cos(rad)*6.0f ,-4.0f ,0.0f);//sin(rad)*6.0f,0.0f);;
Parts p = new ReflectBullet(rpos ,vel);
Parts p1 = new BulletAppend();
// Parts p2 = new BulletAppend();
p.addChild(p1, "1", 40 ,FOLLOW);
break;
default:break;
}
}
public void destroy(){
super.destroy();
// Sound_PlaySe(se_kind.BOMB);
}
}
public class Boss1:Boss{
bool right;
public this(Vector3 pos ,Vector3 vel){
super(400 ,pos);
shape = new SH_Sphere(6);
size = 40.0f;
collisionRange = 45.0f;
setBossColor();
Parts p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10;
p1 = new EnemyAppend(new SH_Sphere(6 ,1.0f),20 , -1,R ,G ,B ,alpha);
addChild(p1, "larm1", 60 ,ENGAGED);
p2 = new EnemyAppend(new SH_Sphere(4 ,2.5f),20 , -1,R ,G ,B ,alpha);
p1.addChild(p2, "larm2", 70 ,ENGAGED);
p3 = new EnemyAppend(new SH_Sphere(6 ,1.0f),20 , -1,R ,G ,B ,alpha);
p2.addChild(p3, "larm3", 70 ,ENGAGED);
p4 = new EnemyAppend(new SH_Sphere(4 ,2.5f),20 , -1,R ,G ,B ,alpha);
p3.addChild(p4, "larm4", 70 ,ENGAGED);
p5 = new EnemyAppend(new SH_Sphere(4 ,3.0f),20 , -1,R ,G ,B ,alpha);
p4.addChild(p5, "larm5", 70 ,ENGAGED ,new Matrix() ,matRotateZ(90));
p6 = new Hammer(new SH_Sphere(6 ,1.5f),40 , -1,R ,G ,B ,alpha);
p5.addChild(p6, "lham", 80 ,ENGAGED ,matRotateZ(-90) ,matRotateZ(90));
p1 = new EnemyAppend(new SH_Sphere(6 ,1.0f),20 , -1,R ,G ,B ,alpha);
addChild(p1, "rarm1", 70 ,ENGAGED ,matRotateZ(180)*matRotateX(180));
p2 = new EnemyAppend(new SH_Sphere(4 ,2.5f),20 , -1,R ,G ,B ,alpha);
p1.addChild(p2, "rarm2", 70 ,ENGAGED);
p3 = new EnemyAppend(new SH_Sphere(6 ,1.0f),20 , -1,R ,G ,B ,alpha);
p2.addChild(p3, "rarm3", 70 ,ENGAGED);
p4 = new EnemyAppend(new SH_Sphere(4 ,2.5f),20 , -1,R ,G ,B ,alpha);
p3.addChild(p4, "rarm4", 70 ,ENGAGED);
p5 = new EnemyAppend(new SH_Sphere(6 ,1.0f),20 , -1,R ,G ,B ,alpha);
p4.addChild(p5, "rarm5", 70 ,ENGAGED);
p6 = new Finger(new SH_Sphere(6 ,2.0f),7 , -1,R ,G ,B ,alpha);
p5.addChild(p6, "rfin1", 40 ,ENGAGED ,matRotateZ(50));
p7 = new Finger(new SH_Sphere(6 ,2.0f),7 , -1,R ,G ,B ,alpha);
p5.addChild(p7, "rfin2", 40 ,ENGAGED ,matRotateZ(25));
p8 = new Finger(new SH_Sphere(6 ,2.0f),7 , -1,R ,G ,B ,alpha);
p5.addChild(p8, "rfin3", 40 ,ENGAGED ,matRotateZ(0));
p9 = new Finger(new SH_Sphere(6 ,2.0f),7 , -1,R ,G ,B ,alpha);
p5.addChild(p9, "rfin4", 40 ,ENGAGED ,matRotateZ(-25));
p10 = new Finger(new SH_Sphere(6 ,2.0f),7 , -1,R ,G ,B ,alpha);
p5.addChild(p10, "rfin5", 40 ,ENGAGED ,matRotateZ(-50));
linkZ = 180.0f;
childHash["larm2"].linkZ = -60.0f;
childHash["larm4"].linkZ = -110.0f;
addAnimation(new Move(30 ,LINK | POSE ,0.0f ,0.0f ,360.0f ,0.0f ,0.0f ,360.0f) ,"bam");
childHash["larm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm5"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,50.0f) ,"bam");
/*
childHash["rarm2"].linkZ = -30.0f;
childHash["rarm4"].linkZ = -90.0f;
childHash["larm4"].linkX = 90.0f;
childHash["larm2"].linkZ = -60.0f;
childHash["larm4"].linkZ = 140.0f;
*/
/*
childHash["rarm2"].addAnimation(new Move(60 ,LINK ,0.0f ,0.0f ,-30.0f) ,"pose");
childHash["rarm4"].addAnimation(new Move(60 ,LINK ,0.0f ,0.0f ,-90.0f) ,"pose");
childHash["larm2"].addAnimation(new Move(60 ,LINK ,0.0f ,0.0f ,-60.0f) ,"pose");
childHash["larm4"].addAnimation(new Move(60 ,LINK ,90.0f ,0.0f ,140.0f) ,"pose");
*/
// childHash["larm4"].addAnimation(new Swing(60 ,LINKY ,15.0 ,0.0 ,-30 ,-1) ,"swing");
// hp = 1000;
right = true;
}
public void move(){
super.move();
switch(state){
case "start":
if(180.0f < rpos.y)pos.y -= mulsp(4.0f);
if(sCnt == divsp(30)){
childHash["larm5"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-30.0f) ,"bam");
childHash["larm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,110.0f) ,"bam");
childHash["rarm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-20.0f) ,"pose");
childHash["rarm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-100.0f) ,"pose");
}
if(sCnt == divsp(60)){
childHash["rarm2"].addAnimation(new Swing(120 ,LINKZ ,0.5 ,0.0 ,0 ,-1) ,"swing");
childHash["rarm4"].addAnimation(new Swing(120 ,LINKZ ,0.5 ,0.0 ,0 ,-1) ,"swing");
changeState("a");
}
break;
case "a":
if(cnt % divsp(30) == 0){
(cast(Enemy)childHash["rfin1"]).attack("a");
(cast(Enemy)childHash["rfin2"]).attack("a");
(cast(Enemy)childHash["rfin3"]).attack("a");
(cast(Enemy)childHash["rfin4"]).attack("a");
(cast(Enemy)childHash["rfin5"]).attack("a");
}
if(sCnt == divsp(200)){
childHash["rarm2"].addAnimation(new Move(120 ,LINK ,0.0f ,0.0f ,10.0f) ,"pose");
childHash["rarm4"].addAnimation(new Move(120 ,LINK ,0.0f ,0.0f ,-120.0f) ,"pose");
changeState("b");
}
break;
case "b":
if(cnt % divsp(30) == 0){
(cast(Enemy)childHash["rfin1"]).attack("a");
(cast(Enemy)childHash["rfin2"]).attack("a");
(cast(Enemy)childHash["rfin3"]).attack("a");
(cast(Enemy)childHash["rfin4"]).attack("a");
(cast(Enemy)childHash["rfin5"]).attack("a");
}
if(cnt % divsp(110) == 0){
(cast(Enemy)childHash["rfin3"]).attack("b");
}
if(sCnt == divsp(180)){
childHash["larm2"].addAnimation(new Move(60 ,LINK ,0.0f ,0.0f ,30.0f) ,"pose");
childHash["larm4"].addAnimation(new Move(60 ,LINK ,90.0f ,0.0f ,70.0f) ,"pose");
}
if(sCnt == divsp(240)){
childHash["larm1"].addAnimation(new Move(30 ,LINK ,180.0f ,0.0f ,0.0f) ,"bam");
childHash["larm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,70.0f) ,"bam");
childHash["larm4"].addAnimation(new Move(30 ,LINK ,90.0f ,0.0f ,20.0f) ,"bam");
childHash["larm5"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,50.0f) ,"bam");
changeState("c");
}
break;
case "c":
if(150.0f < rpos.y)pos.y -= mulsp(2.0f);
if(sCnt == divsp(30)){
childHash["larm1"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm5"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-30.0f) ,"bam");
childHash["larm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,110.0f) ,"bam");
childHash["rarm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-20.0f) ,"pose");
childHash["rarm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-100.0f) ,"pose");
}
if(sCnt == divsp(60)){
addAnimation(new Move(30 ,LINK | POSE ,0.0f ,180.0f ,360.0f ,0.0f ,180.0f ,360.0f) ,"pose");
right = false;
changeState("e");
}
break;
case "e":
if(sCnt == divsp(35))changeState("g");
break;
case "g":
if(cnt % divsp(30) == 0){
(cast(Enemy)childHash["rfin1"]).attack("a");
(cast(Enemy)childHash["rfin2"]).attack("a");
(cast(Enemy)childHash["rfin3"]).attack("a");
(cast(Enemy)childHash["rfin4"]).attack("a");
(cast(Enemy)childHash["rfin5"]).attack("a");
}
if(cnt % divsp(110) == 0){
// (cast(Enemy)childHash["rfin3"]).attack("b");
}
if(sCnt == divsp(200)){
childHash["rarm2"].addAnimation(new Move(120 ,LINK ,0.0f ,0.0f ,10.0f) ,"pose");
childHash["rarm4"].addAnimation(new Move(120 ,LINK ,0.0f ,0.0f ,-120.0f) ,"pose");
changeState("h");
}
break;
case "h":
if(cnt % divsp(30) == 0){
(cast(Enemy)childHash["rfin1"]).attack("a");
(cast(Enemy)childHash["rfin2"]).attack("a");
(cast(Enemy)childHash["rfin3"]).attack("a");
(cast(Enemy)childHash["rfin4"]).attack("a");
(cast(Enemy)childHash["rfin5"]).attack("a");
}
if(cnt % divsp(110) == 0){
(cast(Enemy)childHash["rfin3"]).attack("b");
}
if(sCnt == divsp(180)){
childHash["larm2"].addAnimation(new Move(60 ,LINK ,0.0f ,0.0f ,30.0f) ,"pose");
childHash["larm4"].addAnimation(new Move(60 ,LINK ,90.0f ,0.0f ,70.0f) ,"pose");
}
if(sCnt == divsp(240)){
childHash["larm1"].addAnimation(new Move(30 ,LINK ,-180.0f ,0.0f ,0.0f) ,"bam");
childHash["larm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,70.0f) ,"bam");
childHash["larm4"].addAnimation(new Move(30 ,LINK ,90.0f ,0.0f ,20.0f) ,"bam");
childHash["larm5"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,50.0f) ,"bam");
changeState("i");
}
break;
case "i":
if(150.0f < rpos.y)pos.y -= mulsp(2.0f);
if(sCnt == divsp(30)){
childHash["larm1"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm5"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,0.0f) ,"bam");
childHash["larm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-30.0f) ,"bam");
childHash["larm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,110.0f) ,"bam");
childHash["rarm2"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-20.0f) ,"pose");
childHash["rarm4"].addAnimation(new Move(30 ,LINK ,0.0f ,0.0f ,-100.0f) ,"pose");
}
if(sCnt == divsp(60)){
addAnimation(new Move(30 ,LINK | POSE ,0.0f ,0.0f ,360.0f ,0.0f ,0.0f ,360.0f) ,"pose");
right = true;
changeState("j");
}
break;
case "j":
if(sCnt == divsp(35))changeState("a");
break;
default:break;
}
// poseZ += 1;
// childHash["larm4"].linkY -= 1.0f;
}
public void destroy(){
super.destroy();
// Sound_PlaySe(se_kind.BOMB);
}
}
public Shape BOSS3SHAPE;
public class Boss3:Boss{
private:
double buldeg;
int reload;
int reloadB;
bool right;
int num;
int numB;
public this(Vector3 pos ,Vector3 vel){
super(1000 ,new Vector3(pos.x ,pos.y ,-800));
if(BOSS3SHAPE is null){
BOSS3SHAPE = new SH_Sphere(16);
}
shape = cast(Shape)BOSS3SHAPE.clone();
size = 0.1f;
collisionRange = size;
R = 0.05f;G = 0.05f;B = 0.05f;alpha = 1.0f;
poseZ = 90;
drawing = POLYGON;
buldeg =0;
right = false;
reload = 0;
reloadB = 0;
num = 0;
numB = 0;
// addAnimation(new Pulse(120 ,1.0f ,-1) ,"mag");
/*
Parts p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10;
p1 = new EnemyAppend(BOSS3SHAPE,100 , -1,R ,G ,B ,alpha);
addChild(p1, "larm1", 80 ,ENGAGED);
p2 = new EnemyAppend(BOSS3SHAPE,80 , -1,R ,G ,B ,alpha);
p1.addChild(p2, "larm2", 60 ,ENGAGED);
p3 = new EnemyAppend(BOSS3SHAPE,60 , -1,R ,G ,B ,alpha);
p2.addChild(p3, "larm3", 40 ,ENGAGED);
*/
}
public void move(){
super.move();
collisionRange = size;
switch(state){
case "start":
if(sCnt == divsp(60)){
addAnimation(new Magnification(500 ,100.0f) ,"mag");
changeState("startA");
}
reloadB = 0;
reload = 0;
numB = 0;
break;
case "startA":
if(reload <= 0){
// double deg = cast(double)((cnt/divsp(20))%divsp(90))*mulsp(2.0f);// *22.5;
float hp = fmax(3 ,fmin(10.0f ,sCnt / divsp(50)))+rand.nextFloat(fmax(0.0f,fmin(7 ,10.0f - sCnt / divsp(50.0))));
double rad;
double speed = fmin(3.0f ,fmax(1.0f,1.0f+sCnt *mulsp(0.005)));
Vector3 vel;
for(double d = 0.0;d<360.0;d+=45.0){
rad = (d+buldeg)*PI/180.0;
vel = new Vector3(cos(rad),sin(rad),0.0f)*speed;
new Mylmidon1(rpos -vel,vel ,hp);
}
reload = divsp(cast(int)fmax(20.0f ,40.0f - cast(float)sCnt*0.04f));
buldeg = deglimit(buldeg+fmax(22.5 ,fmin(95.0f ,sCnt / divsp(5.0f))));
}
if(reloadB <= 0){
double rad;
double speed = fmin(3.0f ,fmax(2.0f,1.5f+sCnt *mulsp(0.01)));
Vector3 vel;
for(double d = cast(real)(numB%2)*45.0+45.0;d<360.0+cast(real)(numB%2)*45.0 + 45.0;d+=90.0){
for(double dd = d;dd divsp(60)){
num++;
reload = cast(int)divsp(fmax(25.0f ,120.0f - cast(float)sCnt / 900.0f * 95.0f)*1.5f);
Parts p,p1,p2,p3,p4;
Vector3 t;
if(right){
t = new Vector3(Ship.RIGHTX,Ship.POSY,-800);
}else{
t = new Vector3(Ship.LEFTX,Ship.POSY,-800);
}
right ^= true;
for(double rad = -PI;rad