Add Patchouli spell, minor balancing changes to other attacks (Normal/Hard Only)

This commit is contained in:
kevinmonitor 2022-08-21 11:08:54 +07:00
parent d6a4b8bf20
commit 5e7516392f
78 changed files with 541 additions and 2876 deletions

View file

@ -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
View 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);
}

View file

@ -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(){

View file

@ -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;
}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 314 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB