Add Patchouli spell, minor balancing changes to other attacks (Normal/Hard Only)
This commit is contained in:
parent
d6a4b8bf20
commit
5e7516392f
78 changed files with 541 additions and 2876 deletions
|
@ -39,7 +39,7 @@ let bossdiesnd = ObjSound_Create();
|
|||
*/
|
||||
|
||||
int[] denseTrailSpiral = [7, 8, 10];
|
||||
float[] wvelTrailBubble = [3, 4, 5];
|
||||
float[] wvelTrailBubble = [2.5, 3.5, 4.5];
|
||||
float[] spdTrailBubble = [13, 14, 16];
|
||||
|
||||
int[] denseTrailCurve = [1, 1, 1];
|
||||
|
@ -67,12 +67,12 @@ See trail burst above but x2.
|
|||
*/
|
||||
|
||||
int[] denseAimedSpiral = [9, 10, 11];
|
||||
float[] wvelAimedBubble = [1.25, 1.4, 1.75];
|
||||
float[] wvelAimedBubble = [1.15, 1.35, 1.7];
|
||||
float[] spdAimedBubble = [12, 14, 16];
|
||||
|
||||
int[] delayAimed = [11, 9, 7];
|
||||
float[] accelAimed = [6/60, 8/50, 10/40];
|
||||
float[] maxspdAimed = [7, 8, 9];
|
||||
int[] delayAimed = [12, 10, 8];
|
||||
float[] accelAimed = [8/60, 9/50, 10/40];
|
||||
float[] maxspdAimed = [8, 9, 10];
|
||||
|
||||
int[] delayBeforeAim = [40, 30, 20];
|
||||
int[] delayFinalBurst = [45, 35, 30];
|
||||
|
@ -90,7 +90,7 @@ int[] thresholdStopSpin = [80, 70, 60];
|
|||
|
||||
_InitDifficulty(difficultySelect);
|
||||
|
||||
//difficultySelect = 1; // debug
|
||||
difficultySelect = 1; // debug
|
||||
|
||||
SetShotAutoDeleteClip(64, 64, 64, 64);
|
||||
|
||||
|
@ -330,13 +330,22 @@ task _ShotAimed(shot, ang){
|
|||
|
||||
float x2 = ObjMove_GetX(shot);
|
||||
float y2 = ObjMove_GetY(shot);
|
||||
let bullet = CreateShotA1(x2, y2, 0, ObjMove_GetAngle(shot), KEV_BUTTERFLY_LAVENDER, 15);
|
||||
let bullet = CreateShotA1(x2, y2, 0, ObjMove_GetAngle(shot), KEV_KNIFE_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);
|
||||
Pattern(bullet, del);
|
||||
|
||||
task Pattern(bullet, del){
|
||||
float ang = ObjMove_GetAngle(bullet);
|
||||
ascent(i in 0..10){
|
||||
ObjMove_AddPatternA2(bullet, delayBeforeAim[difficultySelect]-del+i, NO_CHANGE, Interpolate_Decelerate(ang, GetAngleToPlayer(bullet), i/10), accelAimed[difficultySelect], maxspdAimed[difficultySelect], 0);
|
||||
yield;
|
||||
}
|
||||
}
|
||||
|
||||
_BulletRescale(bullet, 1.25, true, 1);
|
||||
_Delay(bullet, 15);
|
||||
|
||||
wait(delayAimed[difficultySelect]);
|
||||
|
|
193
script/game/Spell1.dnh
Normal file
193
script/game/Spell1.dnh
Normal file
|
@ -0,0 +1,193 @@
|
|||
#TouhouDanmakufu[Single]
|
||||
#ScriptVersion[3]
|
||||
#Title["Remilia Spell 1 (Remilia 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:
|
||||
|
||||
- Remilia wait time
|
||||
- Spiral density
|
||||
- Spiral angle offset per frame
|
||||
|
||||
- Ring density
|
||||
- Ring (max) speed
|
||||
- Delays between rings
|
||||
|
||||
*/
|
||||
|
||||
int denseSpiral = [12, 15, 18];
|
||||
int angleoffsetSpiral = [3, 4, 6];
|
||||
|
||||
int[] denseRing = [10, 12, 14];
|
||||
float[] maxspeedRing = [8, 9, 11];
|
||||
int[] deceltimeRing = [20, 30, 40];
|
||||
int[] acceltimeRing = [60, 45, 35];
|
||||
|
||||
// Remilia takes 36 frames. Preferably, pick a number 36 can divide with.
|
||||
|
||||
int[] delayRing = [9, 6, 5];
|
||||
|
||||
// How much time Remilia takes to charge her attack and you get to GTFO.
|
||||
|
||||
int[] waittimeRemi = [75, 60, 50];
|
||||
|
||||
string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
|
||||
|
||||
//LoadTextureEx(tex, true, true);
|
||||
|
||||
// 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);
|
||||
|
||||
_RenderBoss(bossObj);
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
||||
mainTask();
|
||||
_FadeInvincibility(bossObj, 150, 150, 1);
|
||||
endingnew();
|
||||
}
|
||||
|
||||
@Event {
|
||||
|
||||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(4000);
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Remi Spell 1
|
||||
|
||||
Remi moves to your current position (takes 36 frames), fires a dense star of stars (lol) that fades away quickly, and waits a set number of frames before repeating. After 3 waves of this, she moves to the middle and shoots a thick spiral of fireballs that requires you to spin around the screen for a bit.
|
||||
She also leaves behind trails of rings with every dash.
|
||||
|
||||
Remilia takes 36 frames to move to you each time. -> delay between rings: 9, 6, 5
|
||||
|
||||
Parameters:
|
||||
|
||||
- Remilia wait time
|
||||
- Spiral density
|
||||
- Spiral speed
|
||||
- Spiral angle offset per frame
|
||||
|
||||
- Ring density
|
||||
- Ring speed
|
||||
- Delays between rings
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
}
|
||||
|
||||
function <void> _VampireChase(){
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, playerX, playerY, 36, LERP_DECELERATE);
|
||||
|
||||
loop(36/delayRing){
|
||||
|
||||
ascent(i in 0..denseRing[difficultySelect]){
|
||||
int shot = CreateShotA2(bossX, bossY, maxspeedRing[difficultySelect], ang + 360/denseRing[difficultySelect] * i, -maxspeedRing[difficultySelect]/deceltimeRing[difficultySelect], 0, 0, color, 10);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
ObjMove_AddPatternA2(shot, 30, NO_CHANGE, NO_CHANGE, maxspeedRing[difficultySelect]/acceltimeRing[difficultySelect], maxspeedRing[difficultySelect], 0);
|
||||
_BulletRescale(shot, 0.65, true, 1);
|
||||
//Shoot1;
|
||||
}
|
||||
}
|
||||
wait(delayRing);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
task endingnew(){
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){
|
||||
yield;
|
||||
}
|
||||
|
||||
_GoToBrazil(objScene, bossObj, 12, 24);
|
||||
wait(120);
|
||||
ObjSound_SetVolumeRate(fire2, 20);
|
||||
|
||||
CloseScript(GetOwnScriptID);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -23,31 +23,46 @@ let spellsnd = ObjSound_Create();
|
|||
let bossdiesnd = ObjSound_Create();
|
||||
|
||||
/*
|
||||
|
||||
Parameters:
|
||||
|
||||
- Movement speed (in frames)
|
||||
- Line density
|
||||
- Line speed
|
||||
- Line delay
|
||||
|
||||
- Ring density
|
||||
- Ring speed
|
||||
- Ring max speed
|
||||
- Delays between rings
|
||||
- Remilia charge time
|
||||
|
||||
- Density of one knife line
|
||||
- Speed of knives
|
||||
- Aim speed
|
||||
|
||||
- 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[] denseLine = [3, 4, 5];
|
||||
int[] speedLine = [8.5, 10, 12];
|
||||
float[] delayLine = [23, 20, 18];
|
||||
|
||||
int[] denseKnifeLine = [5, 6, 7];
|
||||
float[] speedKnife = [8, 9, 10];
|
||||
float[] spaceKnifeFan = [5, 7, 9];
|
||||
int[] denseRing = [10, 12, 14];
|
||||
float[] maxspeedRing = [8, 9, 11];
|
||||
int[] deceltimeRing = [20, 30, 40];
|
||||
int[] acceltimeRing = [60, 45, 35];
|
||||
|
||||
int[] ringcountKnife = [3, 5, 7];
|
||||
int[] ringdenseKnife = [10, 12, 14];
|
||||
float[] ringspeedKnife = [8, 9, 10];
|
||||
// Remilia takes 36 frames to charge down the screen. Preferably, pick a number 36 can divide with.
|
||||
|
||||
int[] ringDelay = [12, 9, 6];
|
||||
|
||||
// How much time Remilia takes to charge her attack and you get to GTFO.
|
||||
|
||||
int[] chargetimeRemi = [75, 60, 50];
|
||||
float[] maxspeedBookAim = [10, 12, 15];
|
||||
|
||||
int[] bookArray = []; // it's a secret tool that will help us later
|
||||
bool bookShooting = false; // it's a secret tool that will help us later
|
||||
|
||||
string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
|
||||
|
||||
//LoadTextureEx(tex, true, true);
|
||||
|
||||
// Includes ahoy
|
||||
|
||||
|
@ -78,23 +93,7 @@ float[] ringspeedKnife = [8, 9, 10];
|
|||
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
|
||||
);*/
|
||||
_RenderBoss(bossObj);
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
@ -109,13 +108,23 @@ float[] ringspeedKnife = [8, 9, 10];
|
|||
alternative(GetEventType())
|
||||
|
||||
case(EV_REQUEST_LIFE) {
|
||||
SetScriptResult(5200);
|
||||
SetScriptResult(2500);
|
||||
}
|
||||
|
||||
case(EV_REQUEST_TIMER) {
|
||||
SetScriptResult(40);
|
||||
}
|
||||
|
||||
// Start firing from books
|
||||
case(EV_USER+999){
|
||||
bookShooting = true;
|
||||
}
|
||||
|
||||
// Stop firing from books
|
||||
case(EV_USER+1000){
|
||||
bookShooting = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@MainLoop {
|
||||
|
@ -155,18 +164,67 @@ Parameters:
|
|||
|
||||
- Ring density
|
||||
- Ring speed
|
||||
- Delays between rings
|
||||
- Remilia charge time
|
||||
- Remilia charge delay
|
||||
|
||||
- Aim speed
|
||||
|
||||
*/
|
||||
|
||||
task mainTask {
|
||||
|
||||
wait(45);
|
||||
|
||||
// Create 5 books
|
||||
|
||||
CreateBook([0, 0, 256, 256], STG_WIDTH*1/6, 0.65, KEV_LEAF_RED);
|
||||
CreateBook([256, 0, 512, 256], STG_WIDTH*2/6, 0.65, KEV_LEAF_AQUA);
|
||||
CreateBook([512, 0, 768, 256], STG_WIDTH*3/6, 0.65, KEV_LEAF_ORANGE);
|
||||
CreateBook([768, 0, 1024, 256], STG_WIDTH*4/6, 0.65, KEV_LEAF_WHITE);
|
||||
CreateBook([1024, 0, 1280, 256], STG_WIDTH*5/6, 0.65, KEV_LEAF_GREEN);
|
||||
|
||||
bookShooting = true;
|
||||
|
||||
// It takes 60 seconds for the books to start firing..
|
||||
|
||||
wait(60+delayLine[difficultySelect]*3);
|
||||
|
||||
// Repeat 3 times: Choose an area based on the player's position, charge down there while firing fireballs + rings, then return to same position.
|
||||
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
|
||||
if(playerX <= STG_WIDTH/6 && playerY >= 0){
|
||||
ChargeAttack(0.5*STG_WIDTH/6, 0);
|
||||
}
|
||||
|
||||
else if(playerX <= 2*STG_WIDTH/6 && playerY >= STG_WIDTH/6){
|
||||
ChargeAttack(1.5*STG_WIDTH/6, 1);
|
||||
}
|
||||
|
||||
else if(playerX <= 3*STG_WIDTH/6 && playerY >= 2*STG_WIDTH/6){
|
||||
ChargeAttack(2.5*STG_WIDTH/6, 2);
|
||||
}
|
||||
|
||||
else if(playerX <= 4*STG_WIDTH/6 && playerY >= 3*STG_WIDTH/6){
|
||||
ChargeAttack(3.5*STG_WIDTH/6, 3);
|
||||
}
|
||||
|
||||
else if(playerX <= 5*STG_WIDTH/6 && playerY >= 4*STG_WIDTH/6){
|
||||
ChargeAttack(4.5*STG_WIDTH/6, 4);
|
||||
}
|
||||
|
||||
else{
|
||||
ChargeAttack(5.5*STG_WIDTH/6, 5);
|
||||
}
|
||||
|
||||
yield;
|
||||
|
||||
}
|
||||
|
||||
// Aim books at the player.
|
||||
|
||||
// Remove books from bookArray and then restart pattern.
|
||||
|
||||
}
|
||||
|
||||
|
@ -178,11 +236,193 @@ Metal: 768, 0, 1024, 256
|
|||
Earth: 1024, 0, 1280, 256
|
||||
*/
|
||||
|
||||
task _CreateBook(
|
||||
int[] [rectLeft, rectTop, rectRight, rectBottom],
|
||||
float scale
|
||||
){
|
||||
function <void> ChargeAttack(float x, int colorselect){
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, x, STG_HEIGHT/7, 30, LERP_DECELERATE);
|
||||
wait(30);
|
||||
|
||||
_CreateCustomTelegraphLine(
|
||||
x, 0,
|
||||
90, 90,
|
||||
3333, 3333,
|
||||
0, STG_WIDTH/6,
|
||||
0xDC7171, 220,
|
||||
15, chargetimeRemi[difficultySelect], 15
|
||||
);
|
||||
|
||||
wait(chargetimeRemi[difficultySelect]-30);
|
||||
|
||||
// MOVEEEEE BITCH
|
||||
|
||||
ObjMove_SetDestAtFrame(bossObj, x, STG_HEIGHT/9, 30, LERP_DECELERATE);
|
||||
wait(25);
|
||||
|
||||
//ObjEnemy_SetDamageRate(bossObj, 0, 0);
|
||||
ObjMove_SetDestAtFrame(bossObj, x, STG_HEIGHT*1.2, 36, LERP_DECELERATE);
|
||||
|
||||
float ang = GetAngleToPlayer(bossObj);
|
||||
|
||||
async{
|
||||
loop(36){
|
||||
loop(2){
|
||||
int shot = CreateShotA1(bossX+rand(-STG_HEIGHT/12, STG_HEIGHT/12), bossY, 18, rand(269, 271), KEV_FIRE_RED, 5);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 5);
|
||||
_BulletRescale(shot, 0.85, true, 1);
|
||||
Shoot2;
|
||||
}
|
||||
}
|
||||
wait(1);
|
||||
}
|
||||
ObjEnemy_SetDamageRate(bossObj, 0, 0);
|
||||
}
|
||||
|
||||
int color = [KEV_AURABALL_RED, KEV_AURABALL_AQUA, KEV_AURABALL_ORANGE, KEV_AURABALL_WHITE, KEV_AURABALL_GREEN, KEV_AURABALL_PINK][colorselect];
|
||||
|
||||
loop(36/ringDelay){
|
||||
|
||||
ascent(i in 0..denseRing[difficultySelect]){
|
||||
int shot = CreateShotA2(bossX, bossY, maxspeedRing[difficultySelect], ang + 360/denseRing[difficultySelect] * i, -maxspeedRing[difficultySelect]/deceltimeRing[difficultySelect], 0, 0, color, 10);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
ObjMove_AddPatternA2(shot, 30, NO_CHANGE, NO_CHANGE, maxspeedRing[difficultySelect]/acceltimeRing[difficultySelect], maxspeedRing[difficultySelect], 0);
|
||||
_BulletRescale(shot, 0.65, true, 1);
|
||||
//Shoot1;
|
||||
}
|
||||
}
|
||||
wait(ringDelay);
|
||||
|
||||
}
|
||||
|
||||
wait(45);
|
||||
|
||||
ObjMove_SetPosition(bossObj, STG_WIDTH/2, -256);
|
||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/2, 30, LERP_DECELERATE);
|
||||
|
||||
wait(15);
|
||||
ObjEnemy_SetDamageRate(bossObj, 100, 100);
|
||||
|
||||
wait(75);
|
||||
|
||||
}
|
||||
|
||||
task CreateBook(
|
||||
int[] rect,
|
||||
int destX,
|
||||
float scaleEnm, int graphicBullet
|
||||
){
|
||||
|
||||
int book = _CreateEnemy(
|
||||
false,
|
||||
bossX, bossY, destX, STG_HEIGHT/7.5, 60,
|
||||
scaleEnm, scaleEnm,
|
||||
99999, -1, -1,
|
||||
tex,
|
||||
rect[0], rect[1], rect[2], rect[3]
|
||||
);
|
||||
|
||||
Obj_SetRenderPriorityI(book, 39);
|
||||
|
||||
ObjEnemy_SetEnableIntersectionPositionFetching(book, false); // so the lock-on shot doesn't home onto the books
|
||||
bookArray ~= [book];
|
||||
|
||||
// Fire task
|
||||
async{
|
||||
|
||||
wait(60);
|
||||
|
||||
while(!Obj_IsDeleted(book) && bookShooting){
|
||||
|
||||
loop(denseLine[difficultySelect]){
|
||||
int shot = CreateShotA1(ObjMove_GetX(book), ObjMove_GetY(book), speedLine[difficultySelect], 90, graphicBullet, 15);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 10);
|
||||
_BulletRescale(shot, 0.85, true, 1);
|
||||
Shoot1;
|
||||
}
|
||||
wait([3, 4, 4][difficultySelect]);
|
||||
}
|
||||
|
||||
wait(delayLine[difficultySelect]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
async{
|
||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
|
||||
yield;
|
||||
}
|
||||
Obj_Delete(book);
|
||||
|
||||
}
|
||||
|
||||
async{
|
||||
|
||||
wait(60);
|
||||
|
||||
while(bookShooting){
|
||||
|
||||
ascent(i in 0..24){
|
||||
int shot = CreateShotA1(ObjMove_GetX(book), ObjMove_GetY(book), 12, Interpolate_Smoother(190, 350, i/24), graphicBullet+44, 15);
|
||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
|
||||
else{
|
||||
_Delay(shot, 0);
|
||||
_BulletRescale(shot, 0.5, true, 1);
|
||||
}
|
||||
}
|
||||
|
||||
wait(delayLine[difficultySelect]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function <int> CreateFan (int parent, int way, int graphic, int stack,
|
||||
float ang, float angspace, float spd1, float spd2, float scale,
|
||||
int type){
|
||||
|
||||
int objPattern = ObjPatternShot_Create();
|
||||
|
||||
ObjPatternShot_SetParentObject(objPattern, parent);
|
||||
|
||||
if(ObjEnemyBossScene_GetInfo(GetEnemyBossSceneObjectID(), INFO_CURRENT_LIFE) == 0){Obj_Delete(objPattern); return;}
|
||||
|
||||
ObjPatternShot_SetPatternType(objPattern, PATTERN_LINE); // 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 endingnew(){
|
||||
|
|
|
@ -38,12 +38,12 @@ Parameters:
|
|||
*/
|
||||
|
||||
int[] frameMove = [9*27, 9*25, 9*23]; // Divisible by 9
|
||||
int[] denseRing = [15, 18, 21];
|
||||
int[] denseRing = [14, 16, 20];
|
||||
int[] speedRing = [4, 5, 6];
|
||||
|
||||
int[] denseKnifeLine = [5, 6, 7];
|
||||
float[] speedKnife = [8, 9, 10];
|
||||
float[] spaceKnifeFan = [5, 7, 9];
|
||||
int[] denseKnifeLine = [4, 5, 6];
|
||||
float[] speedKnife = [8, 10, 12];
|
||||
float[] spaceKnifeFan = [4, 6, 8];
|
||||
|
||||
int[] ringcountKnife = [3, 5, 7];
|
||||
int[] ringdenseKnife = [10, 12, 14];
|
||||
|
@ -78,23 +78,7 @@ float[] ringspeedKnife = [8, 9, 10];
|
|||
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
|
||||
);*/
|
||||
_RenderBoss(bossObj);
|
||||
|
||||
//WriteLog(spellPIV);
|
||||
WriteLog(ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE));
|
||||
|
@ -253,20 +237,20 @@ function <void> MoveToBottom(){
|
|||
// If you're at bottom, you die. (Hyper and above)
|
||||
|
||||
if(difficultySelect >= 0){
|
||||
loop(9){
|
||||
loop([6, 7, 9][difficultySelect]){
|
||||
|
||||
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);
|
||||
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_LAVENDER, 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);
|
||||
//ObjRender_SetBlendType(shot, BLEND_ADD_ARGB);
|
||||
_BulletRescale(shot, 1.25, true, 1);
|
||||
Shoot1;
|
||||
Shoot2;
|
||||
if(difficultySelect >= 1){_ReflectToPlayer(shot);}
|
||||
}
|
||||
}
|
||||
|
@ -281,11 +265,11 @@ function <void> MoveToBottom(){
|
|||
loop(3){
|
||||
|
||||
CreateFan(3, KEV_KNIFE_LAVENDER, denseKnifeLine[difficultySelect],
|
||||
0, spaceKnifeFan[difficultySelect], speedKnife[difficultySelect]/1.3, speedKnife[difficultySelect], 1.25,
|
||||
0, spaceKnifeFan[difficultySelect], speedKnife[difficultySelect]/1.18, 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,
|
||||
180, spaceKnifeFan[difficultySelect], speedKnife[difficultySelect]/1.18, speedKnife[difficultySelect], 1.25,
|
||||
PATTERN_FAN, true);
|
||||
|
||||
wait(frameMove[difficultySelect]/3);
|
||||
|
@ -345,7 +329,7 @@ task _ReflectToPlayer(int 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;
|
||||
Shoot1;
|
||||
ObjShot_SetAutoDelete(target, true);
|
||||
break;
|
||||
}
|
||||
|
|
BIN
script/game/replay/Spell2_replay01.dat
Normal file
BIN
script/game/replay/Spell2_replay01.dat
Normal file
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 290 KiB After Width: | Height: | Size: 314 KiB |
BIN
script/game/resourceLib/remiboss.png
Normal file
BIN
script/game/resourceLib/remiboss.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
Loading…
Add table
Add a link
Reference in a new issue