Add existing file
This commit is contained in:
parent
9bedcb263d
commit
d6a4b8bf20
320 changed files with 20855 additions and 0 deletions
285
script/game/Non1.dnh
Normal file
285
script/game/Non1.dnh
Normal file
|
@ -0,0 +1,285 @@
|
|||
#TouhouDanmakufu[Single]
|
||||
#ScriptVersion[3]
|
||||
#Title["Remilia Nonspell 1"]
|
||||
#Text["yassification"]
|
||||
#System["script/KevinSystem/Kevin_System.txt"]
|
||||
|
||||
int difficultySelect = 0;
|
||||
|
||||
let objScene = GetEnemyBossSceneObjectID();
|
||||
let csd = GetCurrentScriptDirectory();
|
||||
|
||||
let bossObj;
|
||||
|
||||
float bossX = 0;
|
||||
float bossY = 0;
|
||||
float playerY = 0;
|
||||
float playerX = 0;
|
||||
|
||||
let aniframe = 0;
|
||||
let aniframe2 = 0;
|
||||
|
||||
let spellsnd = ObjSound_Create();
|
||||
let bossdiesnd = ObjSound_Create();
|
||||
|
||||
/*Parameters:
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Delay between red bubble firing
|
||||
- Speed of red bubbles
|
||||
|
||||
- Density of each bullet curve
|
||||
- Angle difference between each bullet in curve
|
||||
- Density of blue spiral (how many curves in one spiral)?
|
||||
- Delay of blue firing
|
||||
- Speed of blue spiral*/
|
||||
|
||||
int[] denseBubble = [8, 9, 10];
|
||||
int[] delayBubble = [15, 12, 10];
|
||||
float[] speedBubble = [8, 9, 9];
|
||||
|
||||
int[] denseCurve = [5, 7, 7];
|
||||
float[] offsetCurve = [2, 2.8, 4.2];
|
||||
int[] denseSpiral = [6, 8, 9];
|
||||
int[] delaySpiral = [10, 8, 10];
|
||||
int[] speedSpiral = [6, 8, 8];
|
||||
|
||||
|
||||
// Includes ahoy
|
||||
|
||||
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
|
||||
|
||||
@Initialize {
|
||||
|
||||
//SetIntersectionVisualization(true);
|
||||
|
||||
SetAutoDeleteObject(true);
|
||||
|
||||
_InitDifficulty(difficultySelect);
|
||||
|
||||
//difficultySelect = 2; // debug
|
||||
|
||||
if(!IsCommonDataAreaExists("PIV")){
|
||||
CreateCommonDataArea("PIV");
|
||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
||||
}
|
||||
else{}
|
||||
|
||||
// Create the boss object itself
|
||||
bossObj = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
||||
ObjEnemy_Regist(bossObj);
|
||||
|
||||
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
|
||||
ObjEnemy_SetMaximumDamage(bossObj, 999);
|
||||
|
||||
// PLACEHOLDER!
|
||||
let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
||||
ObjPrim_SetTexture(bossObj, imgExRumia);
|
||||
ObjSprite2D_SetSourceRect(bossObj, 64, 1, 127, 64);
|
||||
ObjSprite2D_SetDestCenter(bossObj);
|
||||
ObjRender_SetScaleXYZ(bossObj, 2, 2, 1);
|
||||
ObjRender_SetColor(bossObj, 0xB93C3C);
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, 550, 1);
|
||||
// PLACEHOLDER!
|
||||
|
||||
/*_SoloCutin(
|
||||
"script/invalid.png",
|
||||
0, 0, 1, 1,
|
||||
bossObj, objScene, "\"Euphoric Blooming of a New Market\"",
|
||||
40, 4, 0x2868B9, 0x1D115D,
|
||||
10, STG_HEIGHT*1/10-30, 41
|
||||
);*/
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
||||
mainTask();
|
||||
_FadeInvincibility(bossObj, 150, 150, 1);
|
||||
endingnew();
|
||||
}
|
||||
|
||||
@Event {
|
||||
|
||||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(3000);
|
||||
}
|
||||
|
||||
case(EV_REQUEST_TIMER) {
|
||||
SetScriptResult(25);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@MainLoop {
|
||||
|
||||
playerY = GetPlayerY();
|
||||
playerX = GetPlayerX();
|
||||
//The player position is ALWAYS UPDATED
|
||||
|
||||
bossX = ObjMove_GetX(bossObj);
|
||||
bossY = ObjMove_GetY(bossObj);
|
||||
|
||||
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100);
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
@Finalize {
|
||||
|
||||
}
|
||||
|
||||
/*Nonspell 1:
|
||||
|
||||
Reference to Remi non 1 from EoSD.
|
||||
Remi fires a light spiral of red bubbles while also firing a spiral of blue bullet curves in reverse.
|
||||
|
||||
Parameters:
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Delay between red bubble firing
|
||||
- Speed of red bubbles
|
||||
|
||||
- Density of each bullet curve
|
||||
- Angle difference between each bullet in curve
|
||||
- Density of blue spiral (how many curves in one spiral)?
|
||||
- Delay of blue firing
|
||||
- Speed of blue spiral
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
MoveToPosition();
|
||||
FireBubble();
|
||||
FireSpiral();
|
||||
|
||||
}
|
||||
|
||||
function <void> MoveToPosition(){
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/6+30, 90, LERP_DECELERATE);
|
||||
wait(90);
|
||||
|
||||
}
|
||||
|
||||
task FireBubble(){
|
||||
|
||||
float ang = GetAngleToPlayer(bossObj);
|
||||
int multiplier = 1;
|
||||
|
||||
if(difficultySelect < 1){
|
||||
while(!ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){
|
||||
|
||||
loop(8){
|
||||
ascent(i in 0..denseBubble[difficultySelect]){
|
||||
int shot = CreateShotA1(bossX, bossY, speedBubble[difficultySelect], ang + 360/(denseBubble[difficultySelect])*i, KEV_BUBBLE_RED, 0);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.65, true, 1);
|
||||
Shoot2;
|
||||
}
|
||||
}
|
||||
|
||||
wait(delayBubble[difficultySelect]);
|
||||
|
||||
ang += (360/(denseBubble[difficultySelect]))/3;
|
||||
}
|
||||
|
||||
ang = GetAngleToPlayer(bossObj);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else{
|
||||
while(!ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){
|
||||
|
||||
loop(8){
|
||||
ascent(i in 0..denseBubble[difficultySelect]){
|
||||
int shot = CreateShotA1(bossX, bossY, speedBubble[difficultySelect], ang + 360/(denseBubble[difficultySelect])*i, KEV_BUBBLE_RED, 0);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.65, true, 1);
|
||||
Shoot2;
|
||||
}
|
||||
}
|
||||
|
||||
wait(delayBubble[difficultySelect]);
|
||||
|
||||
ang += (360/(denseBubble[difficultySelect]))/3*multiplier;
|
||||
}
|
||||
|
||||
ang = GetAngleToPlayer(bossObj);
|
||||
multiplier *= -1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
task FireSpiral(){
|
||||
|
||||
float startAng = 0;
|
||||
float startAngWhole = 0;
|
||||
int multiplier = 1;
|
||||
|
||||
while(!ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){
|
||||
|
||||
startAngWhole = GetAngleToPlayer(bossObj);
|
||||
startAng = startAngWhole;
|
||||
|
||||
loop(5){
|
||||
|
||||
ascent(i in 0..denseCurve[difficultySelect]){
|
||||
|
||||
startAng -= offsetCurve[difficultySelect]*multiplier;
|
||||
|
||||
ascent(j in -1..denseSpiral[difficultySelect]){
|
||||
|
||||
float ang = startAng + (360/denseSpiral[difficultySelect])*j;
|
||||
int bullet = CreateShotA1(bossX, bossY, speedSpiral[difficultySelect], ang, KEV_BALL_AQUA, 5);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(bullet);}
|
||||
else{
|
||||
_Delay(bullet, 5);
|
||||
_BulletRescale(bullet, 0.6, true, 1);
|
||||
Obj_SetRenderPriorityI(bullet, 51);
|
||||
ObjRender_SetBlendType(bullet, BLEND_ALPHA);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Shoot2;
|
||||
wait(2);
|
||||
|
||||
}
|
||||
|
||||
startAng -= (360/(denseSpiral[difficultySelect]))/2;
|
||||
|
||||
wait(delaySpiral[difficultySelect]);
|
||||
if(difficultySelect >= 1){multiplier *= -1;} else {} // Special behaviour for Hyper/Unparalleled
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
task endingnew(){
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){
|
||||
yield;
|
||||
}
|
||||
|
||||
_GoToBrazil(objScene, bossObj, 12, 24);
|
||||
wait(120);
|
||||
ObjSound_SetVolumeRate(fire2, 20);
|
||||
|
||||
CloseScript(GetOwnScriptID);
|
||||
|
||||
}
|
||||
|
||||
|
364
script/game/Non2.dnh
Normal file
364
script/game/Non2.dnh
Normal file
|
@ -0,0 +1,364 @@
|
|||
#TouhouDanmakufu[Single]
|
||||
#ScriptVersion[3]
|
||||
#Title["Remilia Nonspell 2"]
|
||||
#Text["yassification"]
|
||||
#System["script/KevinSystem/Kevin_System.txt"]
|
||||
|
||||
int difficultySelect = 0;
|
||||
|
||||
let objScene = GetEnemyBossSceneObjectID();
|
||||
let csd = GetCurrentScriptDirectory();
|
||||
|
||||
let bossObj;
|
||||
|
||||
float bossX = 0;
|
||||
float bossY = 0;
|
||||
float playerY = 0;
|
||||
float playerX = 0;
|
||||
|
||||
let aniframe = 0;
|
||||
let aniframe2 = 0;
|
||||
|
||||
let spellsnd = ObjSound_Create();
|
||||
let bossdiesnd = ObjSound_Create();
|
||||
|
||||
/*Parameters:
|
||||
|
||||
// Trail Burst
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Angular velocity of bubbles
|
||||
- Speed of bubbles
|
||||
|
||||
- Density of each bullet curve left behind
|
||||
- Delay between each bullet in curve
|
||||
- Delay between each bullet curve
|
||||
- Movement speed of bullet curve
|
||||
|
||||
- Delay between trail and aimed burst
|
||||
*/
|
||||
|
||||
int[] denseTrailSpiral = [7, 8, 10];
|
||||
float[] wvelTrailBubble = [3, 4, 5];
|
||||
float[] spdTrailBubble = [13, 14, 16];
|
||||
|
||||
int[] denseTrailCurve = [1, 1, 1];
|
||||
int[] delayCurveIndividual = [0, 0, 0];
|
||||
int[] delayCurve = [8, 7, 6];
|
||||
float[] speedCurve = [5, 6, 7];
|
||||
|
||||
int[] delayTrailAimed = [110, 100, 90];
|
||||
|
||||
/*
|
||||
// Aimed Burst
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Angular velocity of bubbles
|
||||
- Speed of bubbles
|
||||
|
||||
- Delay between each bullet left behind
|
||||
- Bullet acceleration
|
||||
- Bullet max speed
|
||||
|
||||
// Final Trail Burst
|
||||
|
||||
See trail burst above but x2.
|
||||
- Delay between the two trail burst
|
||||
*/
|
||||
|
||||
int[] denseAimedSpiral = [9, 10, 11];
|
||||
float[] wvelAimedBubble = [1.25, 1.4, 1.75];
|
||||
float[] spdAimedBubble = [12, 14, 16];
|
||||
|
||||
int[] delayAimed = [11, 9, 7];
|
||||
float[] accelAimed = [6/60, 8/50, 10/40];
|
||||
float[] maxspdAimed = [7, 8, 9];
|
||||
|
||||
int[] delayBeforeAim = [40, 30, 20];
|
||||
int[] delayFinalBurst = [45, 35, 30];
|
||||
int[] thresholdStopSpin = [80, 70, 60];
|
||||
|
||||
// Includes ahoy
|
||||
|
||||
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
|
||||
|
||||
@Initialize {
|
||||
|
||||
//SetIntersectionVisualization(true);
|
||||
|
||||
SetAutoDeleteObject(true);
|
||||
|
||||
_InitDifficulty(difficultySelect);
|
||||
|
||||
//difficultySelect = 1; // debug
|
||||
|
||||
SetShotAutoDeleteClip(64, 64, 64, 64);
|
||||
|
||||
if(!IsCommonDataAreaExists("PIV")){
|
||||
CreateCommonDataArea("PIV");
|
||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
||||
}
|
||||
else{}
|
||||
|
||||
// Create the boss object itself
|
||||
bossObj = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
||||
ObjEnemy_Regist(bossObj);
|
||||
|
||||
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
|
||||
ObjEnemy_SetMaximumDamage(bossObj, 999);
|
||||
|
||||
// PLACEHOLDER!
|
||||
let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
||||
ObjPrim_SetTexture(bossObj, imgExRumia);
|
||||
ObjSprite2D_SetSourceRect(bossObj, 64, 1, 127, 64);
|
||||
ObjSprite2D_SetDestCenter(bossObj);
|
||||
ObjRender_SetScaleXYZ(bossObj, 2, 2, 1);
|
||||
ObjRender_SetColor(bossObj, 0xB93C3C);
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, 550, 1);
|
||||
// PLACEHOLDER!
|
||||
|
||||
/*_SoloCutin(
|
||||
"script/invalid.png",
|
||||
0, 0, 1, 1,
|
||||
bossObj, objScene, "\"Euphoric Blooming of a New Market\"",
|
||||
40, 4, 0x2868B9, 0x1D115D,
|
||||
10, STG_HEIGHT*1/10-30, 41
|
||||
);*/
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
||||
mainTask();
|
||||
_FadeInvincibility(bossObj, 150, 150, 1);
|
||||
endingnew();
|
||||
}
|
||||
|
||||
@Event {
|
||||
|
||||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(3000);
|
||||
}
|
||||
|
||||
case(EV_REQUEST_TIMER) {
|
||||
SetScriptResult(25);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@MainLoop {
|
||||
|
||||
playerY = GetPlayerY();
|
||||
playerX = GetPlayerX();
|
||||
//The player position is ALWAYS UPDATED
|
||||
|
||||
bossX = ObjMove_GetX(bossObj);
|
||||
bossY = ObjMove_GetY(bossObj);
|
||||
|
||||
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100);
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
@Finalize {
|
||||
|
||||
}
|
||||
|
||||
/*Nonspell 1:
|
||||
|
||||
Reference to Remi final from EoSD (Red Magic/Scarlet Gensokyo).
|
||||
|
||||
Fires red bubbles that leave behind trails of bullets.
|
||||
See: My BHA5 script’s second nonspell
|
||||
|
||||
Parameters:
|
||||
|
||||
// Trail Burst
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Angular velocity of bubbles
|
||||
- Speed of bubbles
|
||||
|
||||
- Density of each bullet curve left behind
|
||||
- Delay between each bullet in curve
|
||||
- Delay between each bullet curve
|
||||
- Movement speed of bullet curve
|
||||
|
||||
- Delay between trail and aimed burst
|
||||
|
||||
// Aimed Burst
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Angular velocity of bubbles
|
||||
- Speed of bubbles
|
||||
|
||||
- Delay between each bullet left behind
|
||||
- Bullet acceleration
|
||||
- Bullet max speed
|
||||
|
||||
// Final Trail Burst
|
||||
|
||||
See trail burst above but x2.
|
||||
- Delay between the two trail burst
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
FireTrail(rand(1.5*STG_WIDTH/8, 2.5*STG_WIDTH/8));
|
||||
FireAimed(rand(6.5*STG_WIDTH/8, 7.5*STG_WIDTH/8));
|
||||
wait(delayTrailAimed[difficultySelect]/2);
|
||||
FireAimed(rand(1.5*STG_WIDTH/8, 2.5*STG_WIDTH/8));
|
||||
FireTrail(rand(6.5*STG_WIDTH/8, 7.5*STG_WIDTH/8));
|
||||
wait(delayTrailAimed[difficultySelect]*1.25);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function <void> FireTrail(destX){
|
||||
|
||||
//float destX = rand(1.5*STG_WIDTH/8, 2.5*STG_WIDTH/8);
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, destX, STG_HEIGHT/4, 30, LERP_DECELERATE);
|
||||
wait(30);
|
||||
|
||||
float ang = GetAngleToPlayer(bossObj);
|
||||
|
||||
loop(denseTrailSpiral[difficultySelect]){
|
||||
int shot = CreateShotA2(bossX, bossY, spdTrailBubble[difficultySelect], ang, 0, spdTrailBubble[difficultySelect], wvelTrailBubble[difficultySelect], KEV_BUBBLE_RED, 5);
|
||||
|
||||
ObjMove_AddPatternA2(shot, thresholdStopSpin[difficultySelect], NO_CHANGE, NO_CHANGE, NO_CHANGE, NO_CHANGE, wvelTrailBubble[difficultySelect]*0.25);
|
||||
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.85, true, 1);
|
||||
Shoot1;
|
||||
}
|
||||
_ShotTrail(shot, ang);
|
||||
ang += 360/denseTrailSpiral[difficultySelect];
|
||||
}
|
||||
|
||||
wait(delayTrailAimed[difficultySelect]);
|
||||
|
||||
}
|
||||
|
||||
task _ShotTrail(shot, ang){
|
||||
|
||||
wait(10);
|
||||
|
||||
int del = 5;
|
||||
|
||||
async{
|
||||
ObjShot_SetAutoDelete(shot, false);
|
||||
wait(thresholdStopSpin[difficultySelect]+30);
|
||||
ObjShot_SetAutoDelete(shot, true);
|
||||
}
|
||||
|
||||
while(!Obj_IsDeleted(shot) && ObjMove_GetY(shot) <= STG_HEIGHT-30 && ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
Shoot2;
|
||||
loop(denseTrailCurve[difficultySelect]){
|
||||
float x2 = ObjMove_GetX(shot);
|
||||
float y2 = ObjMove_GetY(shot);
|
||||
let bullet = CreateShotA1(x2, y2, 0, ObjMove_GetAngle(shot), KEV_AURABALL_RED, 15);
|
||||
|
||||
if(Obj_IsDeleted(shot)){Obj_Delete(bullet);}
|
||||
|
||||
Obj_SetRenderPriorityI(bullet, Obj_GetRenderPriorityI(shot)+1);
|
||||
ObjMove_AddPatternA2(bullet, 60, NO_CHANGE, NO_CHANGE, -accelAimed[difficultySelect], -speedCurve[difficultySelect], 0);
|
||||
_BulletRescale(bullet, 0.7, true, 1);
|
||||
_Delay(bullet, 15);
|
||||
|
||||
wait(delayCurveIndividual[difficultySelect]);
|
||||
|
||||
}
|
||||
wait(delayCurve[difficultySelect]);
|
||||
del += 5;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function <void> FireAimed(destX){
|
||||
|
||||
//float destX = rand(6.5*STG_WIDTH/8, 7.5*STG_WIDTH/8);
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, destX, STG_HEIGHT/4, 30, LERP_DECELERATE);
|
||||
wait(30);
|
||||
|
||||
float ang = GetAngleToPlayer(bossObj);
|
||||
|
||||
loop(denseAimedSpiral[difficultySelect]){
|
||||
int shot = CreateShotA2(bossX, bossY, spdAimedBubble[difficultySelect], ang, 0, spdAimedBubble[difficultySelect], -1*wvelAimedBubble[difficultySelect], KEV_BUBBLE_LAVENDER, 5);
|
||||
|
||||
ObjMove_AddPatternA2(shot, thresholdStopSpin[difficultySelect], NO_CHANGE, NO_CHANGE, NO_CHANGE, NO_CHANGE, wvelTrailBubble[difficultySelect]*-0.25); // Stop spinning after a while
|
||||
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.85, true, 1);
|
||||
Shoot1;
|
||||
}
|
||||
_ShotAimed(shot, ang);
|
||||
ang += 360/denseAimedSpiral[difficultySelect];
|
||||
}
|
||||
|
||||
wait(delayTrailAimed[difficultySelect]);
|
||||
|
||||
}
|
||||
|
||||
task _ShotAimed(shot, ang){
|
||||
|
||||
wait(10);
|
||||
|
||||
int del = 1;
|
||||
|
||||
async{
|
||||
ObjShot_SetAutoDelete(shot, false);
|
||||
wait(thresholdStopSpin[difficultySelect]+30);
|
||||
ObjShot_SetAutoDelete(shot, true);
|
||||
}
|
||||
|
||||
while(!Obj_IsDeleted(shot) && ObjMove_GetY(shot) <= STG_HEIGHT-30 && ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
Shoot2;
|
||||
|
||||
float x2 = ObjMove_GetX(shot);
|
||||
float y2 = ObjMove_GetY(shot);
|
||||
let bullet = CreateShotA1(x2, y2, 0, ObjMove_GetAngle(shot), KEV_BUTTERFLY_LAVENDER, 15);
|
||||
|
||||
if(Obj_IsDeleted(shot)){Obj_Delete(bullet);}
|
||||
|
||||
Obj_SetRenderPriorityI(bullet, Obj_GetRenderPriorityI(shot)+1);
|
||||
ObjMove_AddPatternA4(bullet, delayBeforeAim[difficultySelect]-del, NO_CHANGE, 0, accelAimed[difficultySelect], maxspdAimed[difficultySelect], 0, NO_CHANGE, GetPlayerObjectID());
|
||||
_BulletRescale(bullet, 0.85, true, 1);
|
||||
_Delay(bullet, 15);
|
||||
|
||||
wait(delayAimed[difficultySelect]);
|
||||
del += 1;
|
||||
}
|
||||
|
||||
ObjMove_AddPatternA2(shot, 80, NO_CHANGE, NO_CHANGE, NO_CHANGE, NO_CHANGE, 0); // Stop spinning after a while
|
||||
|
||||
}
|
||||
|
||||
task endingnew(){
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){
|
||||
yield;
|
||||
}
|
||||
|
||||
_GoToBrazil(objScene, bossObj, 12, 24);
|
||||
wait(120);
|
||||
ObjSound_SetVolumeRate(fire2, 20);
|
||||
|
||||
CloseScript(GetOwnScriptID);
|
||||
|
||||
}
|
||||
|
||||
|
202
script/game/Spell2.dnh
Normal file
202
script/game/Spell2.dnh
Normal file
|
@ -0,0 +1,202 @@
|
|||
#TouhouDanmakufu[Single]
|
||||
#ScriptVersion[3]
|
||||
#Title["Remilia Spell 2 (Patchouli Card)"]
|
||||
#Text["yassification"]
|
||||
#System["script/KevinSystem/Kevin_System.txt"]
|
||||
|
||||
int difficultySelect = 0;
|
||||
|
||||
let objScene = GetEnemyBossSceneObjectID();
|
||||
let csd = GetCurrentScriptDirectory();
|
||||
|
||||
let bossObj;
|
||||
|
||||
float bossX = 0;
|
||||
float bossY = 0;
|
||||
float playerY = 0;
|
||||
float playerX = 0;
|
||||
|
||||
let aniframe = 0;
|
||||
let aniframe2 = 0;
|
||||
|
||||
let spellsnd = ObjSound_Create();
|
||||
let bossdiesnd = ObjSound_Create();
|
||||
|
||||
/*
|
||||
Parameters:
|
||||
|
||||
- Movement speed (in frames)
|
||||
- Ring density
|
||||
- Ring speed
|
||||
|
||||
- Density of one knife line
|
||||
- Speed of knives
|
||||
|
||||
- Number of knife rings
|
||||
- Density of each knife ring
|
||||
- Speed of each knife ring
|
||||
*/
|
||||
|
||||
int[] frameMove = [9*27, 9*25, 9*23]; // Divisible by 9
|
||||
int[] denseRing = [15, 18, 21];
|
||||
int[] speedRing = [4, 5, 6];
|
||||
|
||||
int[] denseKnifeLine = [5, 6, 7];
|
||||
float[] speedKnife = [8, 9, 10];
|
||||
float[] spaceKnifeFan = [5, 7, 9];
|
||||
|
||||
int[] ringcountKnife = [3, 5, 7];
|
||||
int[] ringdenseKnife = [10, 12, 14];
|
||||
float[] ringspeedKnife = [8, 9, 10];
|
||||
|
||||
// Includes ahoy
|
||||
|
||||
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
|
||||
|
||||
@Initialize {
|
||||
|
||||
//SetIntersectionVisualization(true);
|
||||
|
||||
SetAutoDeleteObject(true);
|
||||
|
||||
_InitDifficulty(difficultySelect);
|
||||
|
||||
difficultySelect = 0; // debug
|
||||
|
||||
SetShotAutoDeleteClip(64, 64, 64, 64);
|
||||
|
||||
if(!IsCommonDataAreaExists("PIV")){
|
||||
CreateCommonDataArea("PIV");
|
||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
||||
}
|
||||
else{}
|
||||
|
||||
// Create the boss object itself
|
||||
bossObj = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
||||
ObjEnemy_Regist(bossObj);
|
||||
|
||||
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
|
||||
ObjEnemy_SetMaximumDamage(bossObj, 999);
|
||||
|
||||
// PLACEHOLDER!
|
||||
let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
||||
ObjPrim_SetTexture(bossObj, imgExRumia);
|
||||
ObjSprite2D_SetSourceRect(bossObj, 64, 1, 127, 64);
|
||||
ObjSprite2D_SetDestCenter(bossObj);
|
||||
ObjRender_SetScaleXYZ(bossObj, 2, 2, 1);
|
||||
ObjRender_SetColor(bossObj, 0xB93C3C);
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, 550, 1);
|
||||
// PLACEHOLDER!
|
||||
|
||||
/*_SoloCutin(
|
||||
"script/invalid.png",
|
||||
0, 0, 1, 1,
|
||||
bossObj, objScene, "\"Euphoric Blooming of a New Market\"",
|
||||
40, 4, 0x2868B9, 0x1D115D,
|
||||
10, STG_HEIGHT*1/10-30, 41
|
||||
);*/
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
||||
mainTask();
|
||||
_FadeInvincibility(bossObj, 150, 150, 1);
|
||||
endingnew();
|
||||
}
|
||||
|
||||
@Event {
|
||||
|
||||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(5200);
|
||||
}
|
||||
|
||||
case(EV_REQUEST_TIMER) {
|
||||
SetScriptResult(40);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@MainLoop {
|
||||
|
||||
playerY = GetPlayerY();
|
||||
playerX = GetPlayerX();
|
||||
//The player position is ALWAYS UPDATED
|
||||
|
||||
bossX = ObjMove_GetX(bossObj);
|
||||
bossY = ObjMove_GetY(bossObj);
|
||||
|
||||
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100);
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
@Finalize {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Spell 2 (Patchouli):
|
||||
|
||||
Remilia summons 5 books (5 elements) (see Philosopher's Stone). These books move to the top of the screen and fire downwards lines that restrict horizontal movement.
|
||||
Remilia constantly will charge down at the player's horizontal position, leaving behind red rings. The player must weave through the lines of the books.
|
||||
After 3 charges, the books turn into bats that aim for the player, leaving trails of bullets in their wake. Remilia re-calls 5 books and then the pattern restarts.
|
||||
|
||||
Note: Books = Enemies with no registered intersection
|
||||
|
||||
Parameters:
|
||||
|
||||
- Line density
|
||||
- Line speed
|
||||
- Line delay
|
||||
|
||||
- Ring density
|
||||
- Ring speed
|
||||
- Remilia charge time
|
||||
- Remilia charge delay
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
wait(45);
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Fire: 0, 0, 256, 256
|
||||
Water: 256, 0, 512, 256
|
||||
Wood: 512, 0, 768, 256
|
||||
Metal: 768, 0, 1024, 256
|
||||
Earth: 1024, 0, 1280, 256
|
||||
*/
|
||||
|
||||
task _CreateBook(
|
||||
int[] [rectLeft, rectTop, rectRight, rectBottom],
|
||||
float scale
|
||||
){
|
||||
|
||||
}
|
||||
|
||||
task endingnew(){
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){
|
||||
yield;
|
||||
}
|
||||
|
||||
_GoToBrazil(objScene, bossObj, 12, 24);
|
||||
wait(120);
|
||||
ObjSound_SetVolumeRate(fire2, 20);
|
||||
|
||||
CloseScript(GetOwnScriptID);
|
||||
|
||||
}
|
||||
|
||||
|
371
script/game/Spell3.dnh
Normal file
371
script/game/Spell3.dnh
Normal file
|
@ -0,0 +1,371 @@
|
|||
#TouhouDanmakufu[Single]
|
||||
#ScriptVersion[3]
|
||||
#Title["Remilia Spell 3 (Sakuya Card)"]
|
||||
#Text["yassification"]
|
||||
#System["script/KevinSystem/Kevin_System.txt"]
|
||||
|
||||
int difficultySelect = 0;
|
||||
|
||||
let objScene = GetEnemyBossSceneObjectID();
|
||||
let csd = GetCurrentScriptDirectory();
|
||||
|
||||
let bossObj;
|
||||
|
||||
float bossX = 0;
|
||||
float bossY = 0;
|
||||
float playerY = 0;
|
||||
float playerX = 0;
|
||||
|
||||
let aniframe = 0;
|
||||
let aniframe2 = 0;
|
||||
|
||||
let spellsnd = ObjSound_Create();
|
||||
let bossdiesnd = ObjSound_Create();
|
||||
|
||||
/*
|
||||
Parameters:
|
||||
|
||||
- Movement speed (in frames)
|
||||
- Ring density
|
||||
- Ring speed
|
||||
|
||||
- Density of one knife line
|
||||
- Speed of knives
|
||||
|
||||
- Number of knife rings
|
||||
- Density of each knife ring
|
||||
- Speed of each knife ring
|
||||
*/
|
||||
|
||||
int[] frameMove = [9*27, 9*25, 9*23]; // Divisible by 9
|
||||
int[] denseRing = [15, 18, 21];
|
||||
int[] speedRing = [4, 5, 6];
|
||||
|
||||
int[] denseKnifeLine = [5, 6, 7];
|
||||
float[] speedKnife = [8, 9, 10];
|
||||
float[] spaceKnifeFan = [5, 7, 9];
|
||||
|
||||
int[] ringcountKnife = [3, 5, 7];
|
||||
int[] ringdenseKnife = [10, 12, 14];
|
||||
float[] ringspeedKnife = [8, 9, 10];
|
||||
|
||||
// Includes ahoy
|
||||
|
||||
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
|
||||
|
||||
@Initialize {
|
||||
|
||||
//SetIntersectionVisualization(true);
|
||||
|
||||
SetAutoDeleteObject(true);
|
||||
|
||||
_InitDifficulty(difficultySelect);
|
||||
|
||||
difficultySelect = 0; // debug
|
||||
|
||||
SetShotAutoDeleteClip(64, 64, 64, 64);
|
||||
|
||||
if(!IsCommonDataAreaExists("PIV")){
|
||||
CreateCommonDataArea("PIV");
|
||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
||||
}
|
||||
else{}
|
||||
|
||||
// Create the boss object itself
|
||||
bossObj = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
||||
ObjEnemy_Regist(bossObj);
|
||||
|
||||
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
|
||||
ObjEnemy_SetMaximumDamage(bossObj, 999);
|
||||
|
||||
// PLACEHOLDER!
|
||||
let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
||||
ObjPrim_SetTexture(bossObj, imgExRumia);
|
||||
ObjSprite2D_SetSourceRect(bossObj, 64, 1, 127, 64);
|
||||
ObjSprite2D_SetDestCenter(bossObj);
|
||||
ObjRender_SetScaleXYZ(bossObj, 2, 2, 1);
|
||||
ObjRender_SetColor(bossObj, 0xB93C3C);
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, 550, 1);
|
||||
// PLACEHOLDER!
|
||||
|
||||
/*_SoloCutin(
|
||||
"script/invalid.png",
|
||||
0, 0, 1, 1,
|
||||
bossObj, objScene, "\"Euphoric Blooming of a New Market\"",
|
||||
40, 4, 0x2868B9, 0x1D115D,
|
||||
10, STG_HEIGHT*1/10-30, 41
|
||||
);*/
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
||||
mainTask();
|
||||
_FadeInvincibility(bossObj, 150, 150, 1);
|
||||
endingnew();
|
||||
}
|
||||
|
||||
@Event {
|
||||
|
||||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(5200);
|
||||
}
|
||||
|
||||
case(EV_REQUEST_TIMER) {
|
||||
SetScriptResult(40);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@MainLoop {
|
||||
|
||||
playerY = GetPlayerY();
|
||||
playerX = GetPlayerX();
|
||||
//The player position is ALWAYS UPDATED
|
||||
|
||||
bossX = ObjMove_GetX(bossObj);
|
||||
bossY = ObjMove_GetY(bossObj);
|
||||
|
||||
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100);
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
@Finalize {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Spell 3 (Sakuya):
|
||||
|
||||
Remilia moves to the horizontal middle and starts slowly moving from top to bottom, firing slow red rings. As she moves, she fires bursts of knives to the sides that reflect off the walls towards the player (one burst per 3 rings).
|
||||
When she reaches the bottom, she fires a large burst of knives everywhere, following the same reflecting formula.
|
||||
|
||||
Parameters:
|
||||
|
||||
- Movement speed (in frames)
|
||||
- Ring density
|
||||
- Ring speed
|
||||
|
||||
- Density of one knife line
|
||||
- Speed of knives
|
||||
|
||||
- Number of knife rings
|
||||
- Density of each knife ring
|
||||
- Speed of each knife ring
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
_Warn();
|
||||
wait(45);
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
MoveToBottom();
|
||||
//BurstAttack();
|
||||
//wait(360);
|
||||
wait(frameMove[difficultySelect]*2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
task _Warn(){
|
||||
|
||||
int time = 30;
|
||||
int timeDisappear = 45;
|
||||
|
||||
int pointText = CreateTextObject(
|
||||
STG_WIDTH/2, 5.5*STG_HEIGHT/6, 120,
|
||||
"WATCH OUT!", "Exotc350 DmBd BT",
|
||||
0xFF6868, 0xFFFFFF,
|
||||
0x800E0E, 6,
|
||||
51
|
||||
);
|
||||
ObjText_SetHorizontalAlignment(pointText, ALIGNMENT_CENTER);
|
||||
|
||||
ascent(i in 0..time){
|
||||
ObjRender_SetAlpha(pointText, Interpolate_Decelerate(0, 255, i/time));
|
||||
ObjRender_SetY(pointText, Interpolate_Decelerate(5.2*STG_HEIGHT/6, 5*STG_HEIGHT/6, i/time));
|
||||
yield;
|
||||
}
|
||||
|
||||
wait(30);
|
||||
|
||||
ascent(i in 0..timeDisappear){
|
||||
ObjRender_SetAlpha(pointText, Interpolate_Decelerate(255, 0, i/timeDisappear));
|
||||
yield;
|
||||
}
|
||||
Obj_Delete(pointText);
|
||||
|
||||
}
|
||||
|
||||
function <void> MoveToBottom(){
|
||||
|
||||
float x = GetPlayerX();
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, x, STG_HEIGHT/7, 45, LERP_DECELERATE);
|
||||
wait(60);
|
||||
|
||||
// Anti-cheese
|
||||
|
||||
async{
|
||||
loop(60){
|
||||
int shot = CreateShotA1(bossX, bossY, 15, rand(180, 360), KEV_BUBBLE_RED, 10);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.8, true, 1);
|
||||
Shoot1;
|
||||
}
|
||||
yield;
|
||||
}
|
||||
}
|
||||
|
||||
// Slow movement
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, x, 5.5*STG_HEIGHT/6, frameMove[difficultySelect], LERP_SMOOTHER);
|
||||
|
||||
async{
|
||||
loop(9){
|
||||
|
||||
float ang = GetAngleToPlayer(bossObj);
|
||||
float[] spawn = [bossX+rand(-30, 30), bossY+rand(-30, 30)];
|
||||
|
||||
ascent(i in -1..denseRing[difficultySelect]-1){
|
||||
int shot = CreateShotA2(spawn[0], spawn[1], speedRing[difficultySelect], ang+(360/denseRing[difficultySelect])*i, -speedRing[difficultySelect]/[30, 35, 40][difficultySelect], 0, KEV_AURABALL_RED, 10);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
ObjMove_AddPatternA2(shot, frameMove[difficultySelect]/1.5, NO_CHANGE, NO_CHANGE, speedRing[difficultySelect]/45, speedRing[difficultySelect], 0);
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.6, true, 1);
|
||||
Shoot1;
|
||||
}
|
||||
}
|
||||
|
||||
wait(frameMove[difficultySelect]/9);
|
||||
}
|
||||
|
||||
// If you're at bottom, you die. (Hyper and above)
|
||||
|
||||
if(difficultySelect >= 0){
|
||||
loop(9){
|
||||
|
||||
float ang = GetAngleToPlayer(bossObj);
|
||||
float[] spawn = [bossX+rand(-25, 25), bossY+rand(-25, 25)];
|
||||
|
||||
ascent(i in -1..denseRing[difficultySelect]-1){
|
||||
int shot = CreateShotA2(spawn[0], spawn[1], speedRing[difficultySelect]*2.5, ang+(360/denseRing[difficultySelect])*i, -speedRing[difficultySelect]*2.5/[30, 40, 45][difficultySelect], speedRing[difficultySelect]*[0.3, 0.2, 0.1][difficultySelect], KEV_KNIFE_RED, 10);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
|
||||
else{
|
||||
ObjMove_AddPatternA2(shot, 90, NO_CHANGE, NO_CHANGE, speedRing[difficultySelect]/45, speedRing[difficultySelect]*[1.65, 1.4, 1.25][difficultySelect], 0);
|
||||
_Delay(shot, 10);
|
||||
ObjRender_SetBlendType(shot, BLEND_ADD_ARGB);
|
||||
_BulletRescale(shot, 1.25, true, 1);
|
||||
Shoot1;
|
||||
if(difficultySelect >= 1){_ReflectToPlayer(shot);}
|
||||
}
|
||||
}
|
||||
|
||||
wait(frameMove[difficultySelect]/36);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async{
|
||||
loop(3){
|
||||
|
||||
CreateFan(3, KEV_KNIFE_LAVENDER, denseKnifeLine[difficultySelect],
|
||||
0, spaceKnifeFan[difficultySelect], speedKnife[difficultySelect]/1.3, speedKnife[difficultySelect], 1.25,
|
||||
PATTERN_FAN, true);
|
||||
|
||||
CreateFan(3, KEV_KNIFE_LAVENDER, denseKnifeLine[difficultySelect],
|
||||
180, spaceKnifeFan[difficultySelect], speedKnife[difficultySelect]/1.3, speedKnife[difficultySelect], 1.25,
|
||||
PATTERN_FAN, true);
|
||||
|
||||
wait(frameMove[difficultySelect]/3);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function <int> CreateFan (int way, int graphic, int stack,
|
||||
float ang, float angspace, float spd1, float spd2, float scale,
|
||||
int type, bool reflect){
|
||||
|
||||
int objPattern = ObjPatternShot_Create();
|
||||
|
||||
ObjPatternShot_SetParentObject(objPattern, bossObj);
|
||||
|
||||
if(ObjEnemyBossScene_GetInfo(GetEnemyBossSceneObjectID(), INFO_CURRENT_LIFE) == 0){Obj_Delete(objPattern); return;}
|
||||
|
||||
ObjPatternShot_SetPatternType(objPattern, type); // PATTERN_FAN or PATTERN_FAN_AIMED
|
||||
ObjPatternShot_SetShotType(objPattern, OBJ_SHOT);
|
||||
ObjPatternShot_SetInitialBlendMode(objPattern, BLEND_ALPHA);
|
||||
|
||||
ObjPatternShot_SetShotCount(objPattern, way, stack);
|
||||
ObjPatternShot_SetSpeed(objPattern, spd1, spd2);
|
||||
ObjPatternShot_SetAngle(objPattern, ang, angspace);
|
||||
|
||||
ObjPatternShot_SetBasePointOffset(objPattern, 0, 0);
|
||||
//ObjPatternShot_SetDelay(objPattern, 15);
|
||||
ObjPatternShot_SetGraphic(objPattern, graphic);
|
||||
|
||||
Shoot2;
|
||||
int[] arrayPattern = ObjPatternShot_FireReturn(objPattern);
|
||||
|
||||
for each (int bullet in ref arrayPattern){
|
||||
_BulletRescale(bullet, scale, true, 1);
|
||||
_Delay(bullet, 10);
|
||||
_EnemyShotFade(bullet, 600, true, 2.5); // Placeholder
|
||||
Obj_SetRenderPriorityI(bullet, 51);
|
||||
if (reflect) {_ReflectToPlayer(bullet);}
|
||||
}
|
||||
|
||||
async{
|
||||
wait(600);
|
||||
Obj_Delete(objPattern);
|
||||
return;
|
||||
}
|
||||
|
||||
return objPattern;
|
||||
|
||||
}
|
||||
|
||||
task _ReflectToPlayer(int target){
|
||||
|
||||
ObjShot_SetAutoDelete(target, false);
|
||||
|
||||
while(!Obj_IsDeleted(target)){
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(target); return;}
|
||||
if (ObjMove_GetX(target) <= -15 || ObjMove_GetX(target) >= GetStgFrameWidth()+15){
|
||||
ObjMove_AddPatternA4(target, 0, NO_CHANGE, 0, NO_CHANGE, NO_CHANGE, 0, KEV_KNIFE_GREEN, GetPlayerObjectID());
|
||||
Shoot2;
|
||||
ObjShot_SetAutoDelete(target, true);
|
||||
break;
|
||||
}
|
||||
yield;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
task endingnew(){
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){
|
||||
yield;
|
||||
}
|
||||
|
||||
_GoToBrazil(objScene, bossObj, 12, 24);
|
||||
wait(120);
|
||||
ObjSound_SetVolumeRate(fire2, 20);
|
||||
|
||||
CloseScript(GetOwnScriptID);
|
||||
|
||||
}
|
||||
|
||||
|
218
script/game/Spell4.dnh
Normal file
218
script/game/Spell4.dnh
Normal file
|
@ -0,0 +1,218 @@
|
|||
#TouhouDanmakufu[Single]
|
||||
#ScriptVersion[3]
|
||||
#Title["Remilia Spell 4 (Meiling Card)"]
|
||||
#Text["yassification"]
|
||||
#System["script/KevinSystem/Kevin_System.txt"]
|
||||
|
||||
int difficultySelect = 0;
|
||||
|
||||
let objScene = GetEnemyBossSceneObjectID();
|
||||
let csd = GetCurrentScriptDirectory();
|
||||
|
||||
let bossObj;
|
||||
|
||||
float bossX = 0;
|
||||
float bossY = 0;
|
||||
float playerY = 0;
|
||||
float playerX = 0;
|
||||
|
||||
let aniframe = 0;
|
||||
let aniframe2 = 0;
|
||||
|
||||
let spellsnd = ObjSound_Create();
|
||||
let bossdiesnd = ObjSound_Create();
|
||||
|
||||
/*Parameters:
|
||||
|
||||
// Trail Burst
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Angular velocity of bubbles
|
||||
- Speed of bubbles
|
||||
|
||||
- Density of each bullet curve left behind
|
||||
- Delay between each bullet in curve
|
||||
- Delay between each bullet curve
|
||||
- Movement speed of bullet curve
|
||||
|
||||
- Delay between trail and aimed burst
|
||||
*/
|
||||
|
||||
int[] denseTrailSpiral = [7, 8, 10];
|
||||
float[] wvelTrailBubble = [3, 4, 5];
|
||||
float[] spdTrailBubble = [13, 14, 16];
|
||||
|
||||
int[] denseTrailCurve = [1, 1, 1];
|
||||
int[] delayCurveIndividual = [0, 0, 0];
|
||||
int[] delayCurve = [8, 7, 6];
|
||||
float[] speedCurve = [5, 6, 7];
|
||||
|
||||
int[] delayTrailAimed = [110, 100, 90];
|
||||
|
||||
/*
|
||||
// Aimed Burst
|
||||
|
||||
- Density of red bubble spiral
|
||||
- Angular velocity of bubbles
|
||||
- Speed of bubbles
|
||||
|
||||
- Delay between each bullet left behind
|
||||
- Bullet acceleration
|
||||
- Bullet max speed
|
||||
|
||||
// Final Trail Burst
|
||||
|
||||
See trail burst above but x2.
|
||||
- Delay between the two trail burst
|
||||
*/
|
||||
|
||||
int[] denseAimedSpiral = [9, 10, 11];
|
||||
float[] wvelAimedBubble = [1.25, 1.4, 1.75];
|
||||
float[] spdAimedBubble = [12, 14, 16];
|
||||
|
||||
int[] delayAimed = [11, 9, 7];
|
||||
float[] accelAimed = [6/60, 8/50, 10/40];
|
||||
float[] maxspdAimed = [7, 8, 9];
|
||||
|
||||
int[] delayBeforeAim = [40, 30, 20];
|
||||
int[] delayFinalBurst = [45, 35, 30];
|
||||
int[] thresholdStopSpin = [80, 70, 60];
|
||||
|
||||
// Includes ahoy
|
||||
|
||||
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
|
||||
|
||||
@Initialize {
|
||||
|
||||
//SetIntersectionVisualization(true);
|
||||
|
||||
SetAutoDeleteObject(true);
|
||||
|
||||
_InitDifficulty(difficultySelect);
|
||||
|
||||
//difficultySelect = 1; // debug
|
||||
|
||||
SetShotAutoDeleteClip(64, 64, 64, 64);
|
||||
|
||||
if(!IsCommonDataAreaExists("PIV")){
|
||||
CreateCommonDataArea("PIV");
|
||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
||||
}
|
||||
else{}
|
||||
|
||||
// Create the boss object itself
|
||||
bossObj = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
||||
ObjEnemy_Regist(bossObj);
|
||||
|
||||
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
|
||||
ObjEnemy_SetMaximumDamage(bossObj, 999);
|
||||
|
||||
// PLACEHOLDER!
|
||||
let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
||||
ObjPrim_SetTexture(bossObj, imgExRumia);
|
||||
ObjSprite2D_SetSourceRect(bossObj, 64, 1, 127, 64);
|
||||
ObjSprite2D_SetDestCenter(bossObj);
|
||||
ObjRender_SetScaleXYZ(bossObj, 2, 2, 1);
|
||||
ObjRender_SetColor(bossObj, 0xB93C3C);
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, 550, 1);
|
||||
// PLACEHOLDER!
|
||||
|
||||
/*_SoloCutin(
|
||||
"script/invalid.png",
|
||||
0, 0, 1, 1,
|
||||
bossObj, objScene, "\"Euphoric Blooming of a New Market\"",
|
||||
40, 4, 0x2868B9, 0x1D115D,
|
||||
10, STG_HEIGHT*1/10-30, 41
|
||||
);*/
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
||||
mainTask();
|
||||
_FadeInvincibility(bossObj, 150, 150, 1);
|
||||
endingnew();
|
||||
}
|
||||
|
||||
@Event {
|
||||
|
||||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(3000);
|
||||
}
|
||||
|
||||
case(EV_REQUEST_TIMER) {
|
||||
SetScriptResult(25);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@MainLoop {
|
||||
|
||||
playerY = GetPlayerY();
|
||||
playerX = GetPlayerX();
|
||||
//The player position is ALWAYS UPDATED
|
||||
|
||||
bossX = ObjMove_GetX(bossObj);
|
||||
bossY = ObjMove_GetY(bossObj);
|
||||
|
||||
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100);
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
@Finalize {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Red rain bullets start falling from above in an oscillating/sine wave pattern. Remilia herself fires rainbow bullet bursts that are gravity-manipulated (see Chimata’s first or third spell in my Pride Jam script)
|
||||
|
||||
Parameters:
|
||||
|
||||
// Red Rain
|
||||
|
||||
- Number of rain spawners
|
||||
- Start x
|
||||
- End x
|
||||
- Angle offset value for oscillation
|
||||
- Delay between bullet spawns
|
||||
- Bullet acceleration
|
||||
- Bullet maxspeed
|
||||
|
||||
// Rainbow Burst (see Meiling's Colorful Light Chaos Dance) -> how the hell do I do this?????
|
||||
|
||||
- Spiral density
|
||||
- Number of spiral "arms"
|
||||
- y speed acceleration
|
||||
- max y speed
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
task endingnew(){
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){
|
||||
yield;
|
||||
}
|
||||
|
||||
_GoToBrazil(objScene, bossObj, 12, 24);
|
||||
wait(120);
|
||||
ObjSound_SetVolumeRate(fire2, 20);
|
||||
|
||||
CloseScript(GetOwnScriptID);
|
||||
|
||||
}
|
||||
|
||||
|
BIN
script/game/replay/Non1_replay01.dat
Normal file
BIN
script/game/replay/Non1_replay01.dat
Normal file
Binary file not shown.
BIN
script/game/replay/Non1_replay02.dat
Normal file
BIN
script/game/replay/Non1_replay02.dat
Normal file
Binary file not shown.
BIN
script/game/replay/Non2_replay01.dat
Normal file
BIN
script/game/replay/Non2_replay01.dat
Normal file
Binary file not shown.
BIN
script/game/replay/Non2_replay02.dat
Normal file
BIN
script/game/replay/Non2_replay02.dat
Normal file
Binary file not shown.
BIN
script/game/replay/Spell3_replay01.dat
Normal file
BIN
script/game/replay/Spell3_replay01.dat
Normal file
Binary file not shown.
BIN
script/game/replay/Spell3_replay02.dat
Normal file
BIN
script/game/replay/Spell3_replay02.dat
Normal file
Binary file not shown.
BIN
script/game/resourceLib/Spritesheet_StationJam.png
Normal file
BIN
script/game/resourceLib/Spritesheet_StationJam.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 290 KiB |
Loading…
Add table
Add a link
Reference in a new issue