2023-01-26 11:34:56 +00:00
|
|
|
// Constants
|
|
|
|
|
|
|
|
int difficulty = 0;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
int STAGE_LENGTH = 120;
|
|
|
|
int MIDBOSS_LENGTH = 75;
|
2023-01-26 11:34:56 +00:00
|
|
|
int BOSS_LENGTH = 30;
|
|
|
|
|
|
|
|
int HP_MAX = 4500;
|
|
|
|
int PHASE1_LIMIT = 2250;
|
|
|
|
int PHASE2_LIMIT = 0;
|
|
|
|
int PHASE3_LIMIT = 0;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
int MIDBOSS_HP = 1800;
|
|
|
|
|
2023-01-26 11:34:56 +00:00
|
|
|
// Rank min/max
|
|
|
|
|
|
|
|
local{
|
|
|
|
|
|
|
|
alternative(GetCommonData("Difficulty", "Standard"))
|
|
|
|
|
|
|
|
case("Novice"){difficulty = 0;}
|
|
|
|
case("Standard"){difficulty = 1;}
|
|
|
|
case("Extra"){difficulty = 2;}
|
|
|
|
others{difficulty = 0;}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
float RANK_MIN = [1, 1, 12][difficulty];
|
|
|
|
float RANK_MAX = 12; // Since Novice locks Rank to a lower level, this distinction is necessary
|
|
|
|
float RANK_MAX_TRUE = [6, 12, 12][difficulty]; // Can be changed
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
SetCommonData("MinRank", RANK_MIN);
|
|
|
|
SetCommonData("MaxRank", RANK_MAX_TRUE);
|
|
|
|
|
|
|
|
// Enemy parameters
|
|
|
|
|
|
|
|
int smallEnemyHitbox = 32;
|
|
|
|
int medEnemyHitbox = 64;
|
|
|
|
int largeEnemyHitbox = 100;
|
|
|
|
int spiritHitbox = 48;
|
|
|
|
|
2023-01-31 11:05:02 +00:00
|
|
|
float smallEnemyHP = 40;
|
|
|
|
float mediumEnemyHP = 90;
|
|
|
|
float largeEnemyHP = 150;
|
2023-01-26 11:34:56 +00:00
|
|
|
float largeEnemyAltHP = 150;
|
2023-01-31 11:05:02 +00:00
|
|
|
float popcornHP = 30;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
float smallEnemyScale = 1;
|
|
|
|
float largeEnemyScale = 1;
|
|
|
|
float popcornScale = 1;
|
|
|
|
|
|
|
|
// Enemy rects
|
|
|
|
|
|
|
|
int[] smallfairyRect = [0, 128, 128, 256];
|
|
|
|
int[] spiritRect = [0, 0, 128, 128];
|
|
|
|
int[] mushroomfairyRect = [0, 256, 192, 448];
|
|
|
|
int[] yukionnaRect = [0, 448, 192, 640];
|
|
|
|
int[] bossRect = [192, 448, 384, 704];
|
|
|
|
|
|
|
|
// Universal
|
|
|
|
|
|
|
|
// MOVEMENT SPEED RELATED
|
|
|
|
|
|
|
|
// Very low speed (ground, large enemies)
|
|
|
|
float baseMoveSpeedVL = 5.5;
|
|
|
|
|
|
|
|
// Low speed (ground, large enemies)
|
|
|
|
float baseMoveSpeed1L= 7;
|
|
|
|
|
|
|
|
// Medium speed
|
|
|
|
float baseMoveSpeedM = 8;
|
|
|
|
|
|
|
|
// High speed
|
2023-01-30 14:54:27 +00:00
|
|
|
float baseMoveSpeedH = 9;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
// Very high speed
|
2023-01-30 14:54:27 +00:00
|
|
|
float baseMoveSpeedVH = 10.5;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
float MoveSpeedRankMultiplierVL = 0.01;
|
|
|
|
float MoveSpeedRankMultiplierL = 0.015;
|
|
|
|
float MoveSpeedRankMultiplierH = 0.02;
|
|
|
|
float MoveSpeedRankMultiplierVH = 0.03;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
// ITEM RELATED
|
|
|
|
|
|
|
|
float smallFlyingEnm_itemPointMin = 8;
|
|
|
|
float smallFlyingEnm_itemPointMax = 12;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
float medFlyingEnm_itemPointMin = 14;
|
|
|
|
float medFlyingEnm_itemPointMax = 21;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
float largeFlyingEnm_itemPointMin = 20;
|
|
|
|
float largeFlyingEnm_itemPointMax = 30;
|
|
|
|
|
|
|
|
float verylargeFlyingEnm_itemPointMin = 35;
|
|
|
|
float verylargeFlyingEnm_itemPointMax = 45;
|
|
|
|
|
|
|
|
// 1 ammo item = 2 ammo
|
|
|
|
|
|
|
|
float smallGroundEnm_itemAmmoMin = 2;
|
|
|
|
float smallGroundEnm_itemAmmoMax = 4;
|
|
|
|
|
|
|
|
float medGroundEnm_itemAmmoMin = 4;
|
|
|
|
float medGroundEnm_itemAmmoMax = 6;
|
|
|
|
|
|
|
|
float largeGroundEnm_itemAmmoMin = 12;
|
|
|
|
float largeGroundEnm_itemAmmoMax = 18;
|
|
|
|
|
|
|
|
float verylargeGroundEnm_itemAmmoMin = 40;
|
|
|
|
float verylargeGroundEnm_itemAmmoMax = 60;
|
|
|
|
|
|
|
|
float smallEnm_itemChainMin = 6;
|
|
|
|
float smallEnm_itemChainMax = 12;
|
|
|
|
|
|
|
|
float mediumEnm_itemChainMin = 9;
|
|
|
|
float mediumEnm_itemChainMax = 16;
|
|
|
|
|
|
|
|
float largeEnm_itemChainMin = 12;
|
|
|
|
float largeEnm_itemChainMax = 20;
|
|
|
|
|
|
|
|
float itemMultiplier = 0.03; // For point items only
|
|
|
|
|
|
|
|
// INVINCIBILITY TIME
|
|
|
|
|
|
|
|
// Short, medium, long
|
|
|
|
int[] invinTimeArr = [20, 40, 60];
|
|
|
|
int[] invinTimeDecrease = [1, 2, 3]; // Per rank increase
|
|
|
|
|
|
|
|
// Wave 1
|
|
|
|
|
|
|
|
// Graphic: fairy
|
|
|
|
|
|
|
|
// Uses high speed, fires aimed bullets
|
|
|
|
|
|
|
|
int W1_spawnDelayMin = 4;
|
|
|
|
int W1_spawnDelayMax = 8;
|
|
|
|
|
|
|
|
int W1_fairyNumMin = 5;
|
|
|
|
int W1_fairyNumMax = 8;
|
|
|
|
|
|
|
|
int W1_decelTimeMin = 20;
|
|
|
|
int W1_decelTimeMax = 30;
|
|
|
|
|
|
|
|
int W1_bulletDelayMin = 40;
|
|
|
|
int W1_bulletDelayMax = 50;
|
|
|
|
|
|
|
|
float W1_bulletSpdMin = 9;
|
|
|
|
float W1_bulletSpdMax = 12;
|
|
|
|
|
|
|
|
// Wave 2
|
|
|
|
|
|
|
|
// Graphic: spirit
|
|
|
|
|
|
|
|
// Sin-wave movement, fires aimed small-fire fans
|
|
|
|
|
|
|
|
int W2_fairyNumMin = 3;
|
|
|
|
int W2_fairyNumMax = 5;
|
|
|
|
|
|
|
|
int W2_bulletDelayMin = 65;
|
|
|
|
int W2_bulletDelayMax = 90;
|
|
|
|
|
|
|
|
float W2_bulletSpdMin = 10;
|
|
|
|
float W2_bulletSpdMax = 13;
|
|
|
|
|
|
|
|
float W2_rangeMin = 2;
|
|
|
|
float W2_rangeMax = 3.25;
|
|
|
|
|
|
|
|
int W2_bulletfanNumMin = 3;
|
|
|
|
int W2_bulletfanNumMax = 5;
|
|
|
|
|
|
|
|
int W2_spawnDelayMin = 10;
|
|
|
|
int W2_spawnDelayMax = 15;
|
|
|
|
|
|
|
|
// Wave 3: Mushroom fairy, fires large fireballs
|
|
|
|
|
|
|
|
int W3_spawnDelayMin = 15;
|
|
|
|
int W3_spawnDelayMax = 30;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
int W3_fairyNumMin = 2;
|
|
|
|
int W3_fairyNumMax = 6;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
float W3_rangeMin = 1;
|
|
|
|
float W3_rangeMax = 2.5;
|
|
|
|
|
|
|
|
int W3_bulletfanNumMin = 1;
|
|
|
|
int W3_bulletfanNumMax = 1;
|
|
|
|
|
|
|
|
int W3_bulletDelayMin = 15;
|
|
|
|
int W3_bulletDelayMax = 20;
|
|
|
|
|
|
|
|
float W3_bulletSpdMin = 11;
|
|
|
|
float W3_bulletSpdMax = 13;
|
|
|
|
|
|
|
|
// Wave 4: Mushroom fairy, fires small fireball lines
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
int W4_spawnDelayMin = 15;
|
|
|
|
int W4_spawnDelayMax = 30;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
int W4_fairyNumMin = 2;
|
|
|
|
int W4_fairyNumMax = 5;
|
|
|
|
|
|
|
|
int W4_bulletNumMin = 3;
|
|
|
|
int W4_bulletNumMax = 5;
|
|
|
|
|
|
|
|
int W4_bulletDelayMin = 2;
|
|
|
|
int W4_bulletDelayMax = 4;
|
|
|
|
|
|
|
|
int W4_stopTimeMin = 20;
|
|
|
|
int W4_stopTimeMax = 30;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
float W4_bulletSpdMin = 8;
|
|
|
|
float W4_bulletSpdMax = 10;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
// Wave 5: Clumped small fairy lines come from both sides to attack you.
|
|
|
|
|
2023-01-31 11:05:02 +00:00
|
|
|
int W5_spawnDelayMin = 25;
|
|
|
|
int W5_spawnDelayMax = 45;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
int W5_fairyNumMin = 3;
|
|
|
|
int W5_fairyNumMax = 6;
|
|
|
|
|
|
|
|
// Angles
|
|
|
|
|
2023-01-31 11:05:02 +00:00
|
|
|
int W5_moveTimeMin = 55;
|
|
|
|
int W5_moveTimeMax = 70;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
float W5_bulletSpdMin = 11;
|
|
|
|
float W5_bulletSpdMax = 13;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
// Wave 6: Alt mushroom fairies (2 OR 3) spawns sparse rings (NOT GROUND)
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
int WG1_ringDenseMin = 10;
|
|
|
|
int WG1_ringDenseMax = 14;
|
|
|
|
|
|
|
|
float WG1_bulletSpdMin = 8;
|
2023-01-31 11:05:02 +00:00
|
|
|
float WG1_bulletSpdMax = 10;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
2023-01-31 11:05:02 +00:00
|
|
|
int WG1_bulletDelayMin = 35;
|
|
|
|
int WG1_bulletDelayMax = 50;
|
2023-01-26 11:34:56 +00:00
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
// Wave 7 (S2): Yukionna with spiral (counts as ground)
|
2023-01-26 11:34:56 +00:00
|
|
|
|
|
|
|
int WG2_spiralDenseMin = 6;
|
|
|
|
int WG2_spiralDenseMax = 9;
|
|
|
|
|
|
|
|
int WG2_spiralNumMin = 3;
|
|
|
|
int WG2_spiralNumMax = 5;
|
|
|
|
|
|
|
|
float WG2_spiralSpdMin = 7.5;
|
|
|
|
float WG2_spiralSpdMax = 9.5;
|
|
|
|
|
|
|
|
int WG2_spiralDelayMax = 40;
|
|
|
|
int WG2_spiralDelayMin = 25;
|
|
|
|
|
2023-01-30 14:54:27 +00:00
|
|
|
// Wave 8 (S2): Medium fairies with W3 movements leave large fireball walls. Uses W4 parameters
|
|
|
|
// Wave 9 (S2): Large number of small fairies come in from both sides (with W3 movements) firing aimed bullets.
|
|
|
|
|
|
|
|
int W9_spawnDelayMin = 5;
|
|
|
|
int W9_spawnDelayMax = 10;
|
|
|
|
|
|
|
|
int W9_fairyNumMin = 8;
|
|
|
|
int W9_fairyNumMax = 12;
|
|
|
|
|
|
|
|
int W9_bulletDelayMin = 30;
|
|
|
|
int W9_bulletDelayMax = 50;
|
|
|
|
|
|
|
|
float W9_bulletSpdMin = 7.5;
|
|
|
|
float W9_bulletSpdMax = 9.5;
|
|
|
|
|
|
|
|
// Wave 10 (S2): Clumped medium fairy (3 per line) come in from the right to fire large fireball lines.
|
|
|
|
|
|
|
|
int W10_spawnDelayMin = 35;
|
|
|
|
int W10_spawnDelayMax = 50;
|
|
|
|
|
|
|
|
int W10_fairyNumMin = 2;
|
|
|
|
int W10_fairyNumMax = 4;
|
|
|
|
|
|
|
|
int W10_bulletLineNumMin = 3;
|
|
|
|
int W10_bulletLineNumMax = 5;
|
|
|
|
|
|
|
|
// Angles
|
|
|
|
|
|
|
|
int W10_moveTimeMin = 55;
|
|
|
|
int W10_moveTimeMax = 70;
|
|
|
|
|
|
|
|
float W10_bulletSpdMin = 8;
|
|
|
|
float W10_bulletSpdMax = 9.5;
|
|
|
|
|
2023-01-26 11:34:56 +00:00
|
|
|
/*
|
|
|
|
// Wave Ground 1
|
|
|
|
|
|
|
|
int[] sign1Rect = [1024, 512, 1280, 768];
|
|
|
|
int[] platformRect = [1536, 256, 2304, 768];
|
|
|
|
|
|
|
|
int WG1_invinTimeMin = 15;
|
|
|
|
int WG1_invinTimeMax = 25;
|
|
|
|
|
|
|
|
// Wave Ground 2
|
|
|
|
|
|
|
|
int[] cannonRect = [2048, 768, 2304, 1024];
|
|
|
|
int[] bushRect = [512, 1024, 1280, 1536];
|
|
|
|
|
|
|
|
int WG2_bulletNumMin = 3;
|
|
|
|
int WG2_bulletNumMax = 5;
|
|
|
|
|
|
|
|
float WG2_angRangeMin = 1.4;
|
|
|
|
float WG2_angRangeMax = 2;
|
|
|
|
|
|
|
|
float WG2_bulletSpdMin = 9;
|
|
|
|
float WG2_bulletSpdMax = 11;
|
|
|
|
|
|
|
|
int WG2_bulletDelayMin = 30;
|
|
|
|
int WG2_bulletDelayMax = 40;
|
|
|
|
|
|
|
|
int WG2_invinTimeMin = 45;
|
|
|
|
int WG2_invinTimeMax = 60;
|
|
|
|
|
|
|
|
// Wave Ground 1A
|
|
|
|
|
|
|
|
// Graphic: fairy
|
|
|
|
|
|
|
|
// Uses high speed
|
|
|
|
|
|
|
|
int WG1A_bulletNumMin = 1;
|
|
|
|
int WG1A_bulletNumMax = 3;
|
|
|
|
|
|
|
|
int WG1A_bulletDelayMin = 45;
|
|
|
|
int WG1A_bulletDelayMax = 60;
|
|
|
|
|
|
|
|
float WG1A_bulletSpdMin = 12;
|
|
|
|
float WG1A_bulletSpdMax = 15;
|
|
|
|
|
|
|
|
int[] sign2Rect = [1280, 512, 1536, 768];
|
|
|
|
|
|
|
|
int WG1A_invinTimeMin = 25;
|
|
|
|
int WG1A_invinTimeMax = 40;
|
|
|
|
|
|
|
|
// Wave Ground 3 (Rybb) -> orange line spirals
|
|
|
|
|
|
|
|
int WG3_spiralDenseMin = 5;
|
|
|
|
int WG3_spiralDenseMax = 8;
|
|
|
|
|
|
|
|
int WG3_spiralNumMin = 3;
|
|
|
|
int WG3_spiralNumMax = 6;
|
|
|
|
|
|
|
|
float WG3_spiralSpdMin = 7.5;
|
|
|
|
float WG3_spiralSpdMax = 9.5;
|
|
|
|
|
|
|
|
int WG3_spiralDelayMax = 40;
|
|
|
|
int WG3_spiralDelayMin = 30;
|
|
|
|
|
|
|
|
int[] rybbRect = [1280, 1024, 1792, 1536];
|
|
|
|
|
|
|
|
// Wave Ground 4 (ITS THE FUCKING BUSSY FAIRIES)
|
|
|
|
// Number of fairies affected by RANK and KILL SPEED
|
|
|
|
|
|
|
|
int[] bush2Rect = [512, 1536, 1280, 2048];
|
|
|
|
int[] bush2ARect = [256, 1536, 512, 1792];
|
|
|
|
|
|
|
|
int WG4_enmNumMin = 4;
|
|
|
|
int WG4_enmNumMax = 6;
|
|
|
|
|
|
|
|
int WG4_bulletDelayMin = 45;
|
|
|
|
int WG4_bulletDelayMax = 60;
|
|
|
|
|
|
|
|
float WG4_bulletSpdMin = 11;
|
|
|
|
float WG4_bulletSpdMax = 14;
|
|
|
|
|
|
|
|
int WG4_invinTimeMin = 100;
|
|
|
|
int WG4_invinTimeMax = 120;
|
|
|
|
|
|
|
|
// Wave Ground 5 (Decker) -> Line bullets.
|
|
|
|
|
|
|
|
int WG5_bulletNumMin = 4;
|
|
|
|
int WG5_bulletNumMax = 6;
|
|
|
|
|
|
|
|
int WG5_bulletDelayMin = 12;
|
|
|
|
int WG5_bulletDelayMax = 15;
|
|
|
|
|
|
|
|
float WG5_bulletSpdMin = 7;
|
|
|
|
float WG5_bulletSpdMax = 9;
|
|
|
|
|
|
|
|
int[] deckerRect = [1792, 1024, 1792+512, 1536];
|
|
|
|
|
|
|
|
// Wave Ground 6 -> Your ass is our base
|
|
|
|
*/
|
|
|
|
|
|
|
|
task UpdateDrops(){
|
|
|
|
|
|
|
|
// According to rank
|
|
|
|
|
|
|
|
while(true){
|
|
|
|
|
|
|
|
smallFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(12, 18, rank/RANK_MAX);
|
2023-01-30 14:54:27 +00:00
|
|
|
medFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(21, 28, rank/RANK_MAX);
|
2023-01-26 11:34:56 +00:00
|
|
|
largeFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(30, 40, rank/RANK_MAX);
|
|
|
|
verylargeFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(45, 60, rank/RANK_MAX);
|
|
|
|
|
|
|
|
smallGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(4, 6, rank/RANK_MAX);
|
|
|
|
medGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(6, 8, rank/RANK_MAX);
|
|
|
|
largeGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(18, 25, rank/RANK_MAX);
|
|
|
|
verylargeGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(60, 75, rank/RANK_MAX);
|
|
|
|
|
|
|
|
smallEnm_itemChainMax = FUNC_LERP_LINEAR(12, 16, rank/RANK_MAX);
|
|
|
|
mediumEnm_itemChainMax = FUNC_LERP_LINEAR(16, 20, rank/RANK_MAX);
|
|
|
|
largeEnm_itemChainMax = FUNC_LERP_LINEAR(20, 24, rank/RANK_MAX);
|
|
|
|
|
|
|
|
wait(5);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
Reference:
|
|
|
|
|
|
|
|
task SpawnSpiral(float angStart, int spinDir){
|
|
|
|
|
|
|
|
async{
|
|
|
|
ascent(i in -1..linespiralNum[diff]){
|
|
|
|
|
|
|
|
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){break;}
|
|
|
|
|
|
|
|
int shot = CreateFan(bossObj, 1, KEV_LEAF_ORANGE, linespiralLineCount[diff],
|
|
|
|
angStart+i*spinDir*linespiralAngOffset[diff], 0, linespiralSpd2[diff], linespiralSpd1[diff],
|
|
|
|
0.6,
|
|
|
|
0, 0,
|
|
|
|
PATTERN_FAN, false
|
|
|
|
);
|
|
|
|
int shot2 = CreateFan(bossObj, 1, KEV_LEAF_ORANGE, linespiralLineCount[diff],
|
|
|
|
angStart+(180+angStart)-i*spinDir*linespiralAngOffset[diff], 0, linespiralSpd2[diff], linespiralSpd1[diff], 0.6,
|
|
|
|
0, 0,
|
|
|
|
PATTERN_FAN, false
|
|
|
|
);
|
|
|
|
|
|
|
|
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot); Obj_Delete(shot2);}
|
|
|
|
|
|
|
|
else{Shoot1;}
|
|
|
|
|
|
|
|
wait([4, 4, 3, 3][diff]);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
*/
|