So for those who don’t know… I’ve been messing around with Touhou Danmakufu, a relatively easy-to-use STG maker program which leans toward making Touhou-style games with C-like programming language.
You can download Touhou Danmakufu here if you want to experiment with the program.
*Note* : Requires Microsoft Applocale or Japanese to be installed on your computer…
Continuing… recently I started to write scripts for Touhou Danmakufu, some of which ended up relatively successful I suppose.
So I was able to create something like this:

Using coding like this:
#TouhouDanmakufu
#Title[Rain Sign "Compelling Hailstorm"]
#Text[Stage 1 - Daiyousei Spellcard 1]
#BackGround[Default]
#BGM[.\bgm\Boss.ogg]
#Player[REIMU, MARISA]
#ScriptVersion[2]script_enemy_main {
let ImgBoss = GetCurrentScriptDirectory~”img\dot__daiyousei.png”;let frame = -120;
@Initialize {
SetInvincibility(150);
SetLife(350);
SetTimer(60);
SetDamageRate(10, 0);
SetScore(3333333.33);
Concentration01(150);SetMovePosition02(GetCenterX, GetClipMinY + 120, 120);
CutIn(YOUMU, “Rain Sign “\”"Compelling Hailstorm”\”, “”, 0, 0, 0, 0);
PlaySE(GetCurrentScriptDirectory~”sfx\Charge.wav”);LoadGraphic(ImgBoss);
SetTexture(ImgBoss);
SetGraphicRect(37, 29, 86, 98);
}@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);if(frame == 65) {
CreateShotA(1, GetX, GetY, 10);
SetShotDataA(1, 0, 5, 0, 5, 0, 5, BLUE03);
SetShotDataA(1, 60, 5, 132, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(2, 0, 0, 30);
SetShotDataA_XY(2, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 1, 2, 0);
}
FireShot(1);CreateShotA(3, GetX, GetY, 10);
SetShotDataA(3, 0, 5, 180, -5, 0, 5, BLUE03);
SetShotDataA(3, 60, 5, 48, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(4, 0, 0, 30);
SetShotDataA_XY(4, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 3, 4, 0);
}
FireShot(3);CreateShotA(5, GetX, GetY, 10);
SetShotDataA(5, 0, 5, 0, 5, 0, 5, BLUE03);
SetShotDataA(5, 60, 5, 132, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(6, 0, 0, 30);
SetShotDataA_XY(6, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 5, 6, 0);
}
FireShot(5);CreateShotA(7, GetX, GetY, 10);
SetShotDataA(7, 0, 5, 180, -5, 0, 5, BLUE03);
SetShotDataA(7, 60, 5, 48, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(8, 0, 0, 30);
SetShotDataA_XY(8, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 7, 8, 0);
}
FireShot(7);CreateShotA(9, GetX, GetY, 10);
SetShotDataA(9, 0, 5, 0, 5, 0, 5, BLUE03);
SetShotDataA(9, 60, 5, 132, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(10, 0, 0, 30);
SetShotDataA_XY(10, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 9, 10, 0);
}
FireShot(9);CreateShotA(11, GetX, GetY, 10);
SetShotDataA(11, 0, 5, 180, -5, 0, 5, BLUE03);
SetShotDataA(11, 60, 5, 48, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(12, 0, 0, 30);
SetShotDataA_XY(12, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 11, 12, 0);
}
FireShot(11);CreateShotA(13, GetX, GetY, 10);
SetShotDataA(13, 0, 5, 0, 5, 0, 5, BLUE03);
SetShotDataA(13, 60, 5, 132, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(14, 0, 0, 30);
SetShotDataA_XY(14, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 13, 14, 0);
}
FireShot(9);CreateShotA(15, GetX, GetY, 10);
SetShotDataA(15, 0, 5, 180, -5, 0, 5, BLUE03);
SetShotDataA(15, 60, 5, 48, 0, 1, 8, BLUE03);
ascent(i in 1..60){
CreateShotA(16, 0, 0, 30);
SetShotDataA_XY(16, 0, rand(-1, 1), rand(-3, -10), 0, 0.1, 0, 3, BLUE23);
AddShot(i*2, 15, 16, 0);
}
FireShot(11);PlaySE(GetCurrentScriptDirectory~”sfx\Shot1.wav”);
frame = 0;
}
frame++;
}@DrawLoop {
DrawText(“Daiyousei”, 40, 35, 12, 255);
DrawGraphic(GetX, GetY);
}@Finalize {
DeleteGraphic(ImgBoss);
if(BeVanished==false){
loop(10){
CreateItem(ITEM_SCORE,GetX+rand(-50,50),GetY+rand(-50,50));
}
}
}
}
You can download the entire script here.
But aside from that script… I learned a few more functions and created this:

Using coding like this:
script_enemy_main {
let ImgBoss = GetCurrentScriptDirectory~”img\boss_suika.png”;let frame = -120;
let i = 0;
let se = 0;
let a = GetAngleToPlayer;
let e1 = 0;@Initialize {
SetInvincibility(150);
SetLife(500);
SetTimer(60);
SetDamageRate(15, 1);
SetScore(3333333.33);
Concentration01(150);
Expert;SetMovePosition02(GetCenterX, GetClipMinY + 120, 120);
CutIn(YOUMU, “Pyromatics “\”"Oni Firebomb Bombardment”\”, GetCurrentScriptDirectory~”img\Suika2.png”, 1, 25, 191, 320);
PlaySE(GetCurrentScriptDirectory~”sfx\Charge.wav”);
Expert;LoadGraphic(ImgBoss);
SetTexture(ImgBoss);
SetGraphicRect(43, 36, 86, 96);
}@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);if(frame == 1){
a = rand(GetAngleToPlayer -5, GetAngleToPlayer+5);
e1 = rand(10, 20);CreateShotA(1, GetX, GetY, 0);
SetShotDataA(1, 0, 200, a, 0, 0.5, 3, RED01);
SetShotKillTime(1, e1);
CreateShotA(2, 0, 0, 0);
SetShotDataA(2, 0, 2, a, 0, 0, 3, RED03);
AddShot(e1-1, 1, 2, 0);
ascent(i in 1..15){
CreateShotA(19, 0, 0, 0);
SetShotDataA_XY(19, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 19, 0);
}
CreateShotA(3, 0, 0, 0);
SetShotDataA(3, 0, 2, a -45, 0, 0, 3, RED03);
AddShot(e1-1, 1, 3, 0);
ascent(i in 1..15){
CreateShotA(20, 0, 0, 0);
SetShotDataA_XY(20, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 20, 0);
}
CreateShotA(4, 0, 0, 0);
SetShotDataA(4, 0, 2, a -90, 0, 0, 3, RED03);
AddShot(e1-1, 1, 4, 0);
ascent(i in 1..15){
CreateShotA(21, 0, 0, 0);
SetShotDataA_XY(21, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 21, 0);
}
CreateShotA(5, 0, 0, 0);
SetShotDataA(5, 0, 2, a -135, 0, 0, 3, RED03);
AddShot(e1-1, 1, 5, 0);
ascent(i in 1..15){
CreateShotA(22, 0, 0, 0);
SetShotDataA_XY(22, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 22, 0);
}
CreateShotA(6, 0, 0, 0);
SetShotDataA(6, 0, 2, a +45, 0, 0, 3, RED03);
AddShot(e1-1, 1, 6, 0);
ascent(i in 1..15){
CreateShotA(23, 0, 0, 0);
SetShotDataA_XY(23, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 23, 0);
}
CreateShotA(7, 0, 0, 0);
SetShotDataA(7, 0, 2, a +90, 0, 0, 3, RED03);
AddShot(e1-1, 1, 7, 0);
ascent(i in 1..15){
CreateShotA(24, 0, 0, 0);
SetShotDataA_XY(24, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 24, 0);
}
CreateShotA(8, 0, 0, 0);
SetShotDataA(8, 0, 2, a +135, 0, 0, 3, RED03);
AddShot(e1-1, 1, 8, 0);
ascent(i in 1..15){
CreateShotA(25, 0, 0, 0);
SetShotDataA_XY(25, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 25, 0);
}
CreateShotA(9, 0, 0, 0);
SetShotDataA(9, 0, 2, a +180, 0, 0, 3, RED03);
AddShot(e1-1, 1, 9, 0);
ascent(i in 1..15){
CreateShotA(26, 0, 0, 0);
SetShotDataA_XY(26, 0, rand(-2, 2), rand(-2, 2), 0, 0, 0, 3, RED05);
AddShot(e1-1, 1, 26, 0);
}
FireShot(1);SetMovePositionRandom01(75, 30, 4, 50, 100, 400, 175);
PlaySE(GetCurrentScriptDirectory~”sfx\eco02_b.wav”);
}
if(frame >= 10+e1){
se = 1;
frame = 0;
}if(se == 1){
PlaySE(GetCurrentScriptDirectory~”sfx\gun10.wav”);
se = 0;
}
frame++;
}@DrawLoop {
DrawText(“Suika Ibuki”, 40, 35, 12, 255);
DrawGraphic(GetX, GetY);
}@Finalize {
DeleteGraphic(ImgBoss);
if(BeVanished==false){
loop(10){
CreateItem(ITEM_SCORE,GetX+rand(-50,50),GetY+rand(-50,50));
}
}
}
}
}
You can download the entire set of scripts here.
And then finally with some more research and tinkering, I attempted to make a stage. As of now it’s still incomplete however, you can download what I have by clicking here.
Most likely I will not finish that stage since I feel it’s not exactly what I imagined as a stage. So I probably will scrap that and move onto another. I had an idea of a bullet maze similar to the ones in Gundemonium and Gundeadligne but it’s only an idea.
So I shall return to writing scripts and see what I can come up with next time. Hope me best of luck! :D
Later…



December 28, 2007 at 10:33 am |
Man, that’s cool lookin’. I guess I should start on that music, huh?
=)