bruh I'm such an idiot

This commit is contained in:
kevinmonitor 2022-08-22 17:14:18 +07:00
parent 5e7516392f
commit 97eb85483c
28 changed files with 975 additions and 293 deletions

View File

@ -2,13 +2,36 @@
Repository for Kevinmonitor and co.'s Touhou Station Jam 3 game. Repository for Kevinmonitor and co.'s Touhou Station Jam 3 game.
How to install & play available attacks: All attacks are now available as of 22/8/2022.
+ Remilia Nonspell 1
+ Remilia Nonspell 2
+ Remilia Nonspell 3
+ Remilia Spell 1 (Remilia Card)
+ Remilia Spell 2 (Patchouli Card)
+ Remilia Spell 3 (Sakuya Card)
"Boss Mode" is also done - players can now play the entire 6-attack boss fight at once.
How to install:
+ Install all files in this repo. + Install all files in this repo.
+ Open either th_dnh_ph3sx.exe or th_dnh_ph3sx_legacy.exe (if you cannot open the latter) + Open either th_dnh_ph3sx.exe or th_dnh_ph3sx_legacy.exe (if you cannot open the latter)
+ Select "Single" in the Menu.
To play attacks individually:
+ Select "Single" in the title screen.
+ Remilia's attacks have all been titled properly. Other scripts in the list are placeholders or engine samples. + Remilia's attacks have all been titled properly. Other scripts in the list are placeholders or engine samples.
+ Select "Chimata" as the player. Other scripts in the list are placeholders or engine samples. + The fourth spell (Meiling) is unfinished and will not be in the jam version. Please ignore it for now.
+ Select "Chimata" as the player.
To play all attacks in a row (boss mode):
+ Select "Plural" in the title screen.
+ Select "Boss Plural" in the drop-down menu.
+ Select "Chimata" as the player.
Currently, Boss Mode can only be played in Normal difficulty.
How to change the difficulty of the attacks: How to change the difficulty of the attacks:
@ -19,10 +42,9 @@ How to change the difficulty of the attacks:
+ Find the "difficultySelect = 0; // debug" line. + Find the "difficultySelect = 0; // debug" line.
+ Change 0 to the difficulty you want to play: + Change 0 to the difficulty you want to play:
0: Normal + 0: Normal
1: Hyper/Hard + 1: Hyper/Hard
2: Unparalleled/Lunatic + 2: Unparalleled/Lunatic
+ (NOTE THAT LUNATIC IS STILL NOT BALANCED OR PROPERLY TESTED, AND WILL NOT BE IN THE INITIAL JAM VERSION.)
NOTE THAT LUNATIC IS STILL NOT BALANCED OR PROPERLY TESTED, AND WILL NOT BE IN THE INITIAL JAM VERSION.
+ Save the file and re-open the attack. + Save the file and re-open the attack.

73
gamedescandmanual.txt Normal file
View File

@ -0,0 +1,73 @@
Game Description (on Game Page):
ENGLISH:
A fan-made side story to the brand new instalment of Touhou Project, “100th Black Market”, starring the heroic Chimata Tenkyuu.
A black market at the Scarlet Devil Mansion has opened up! Play as the market god and face the mischievous vampire using the cards for wicked purposes!
Read the in-game manual for more information!
Credits:
Game Programmer & Designer
Character & Background Artwork
Spritework
Kevin Minh (@kevinminh_alt)
Spritework & Card Artwork
Japanese Translation
Aqwa (@aqwwa58)
Composer (Boss Theme)
Yal (@GameDevYal)
JAPANESE:
[INSERT JP TRANSLATION HERE]
——
Game Manual (preferably in-game, but may probably be transferred into a separate text file if I run out of time)
ENGLISH:
1. Gameplay
This is an exciting shooting game like a Touhou game.
Play as Chimata Tenkyuu and use your clever dodging and shooting to defeat Remilia Scarlets relentless attacks!
(Also, try obtaining a high score!)
2. Controls:
Z (Hold): Shoot/Confirm
X: Use Spell Card (limited use)/Cancel
Esc: Pause Game
Esc+R: Quick Retry
Esc+Q: Quick Exit to Title
See config.exe to rebind keys.
3. Gameplay Guide: Player
This time around, taking inspiration from her own spellcard “Danmaku Asylum”, Chimata has packed a lot (a lot) of knives on her adventure.
Her unfocused shot is a wide spread of knives that covers the entire screen. It deals a lot of damage if you hit an enemy with all the knives!
Her focused shot has knives that are weaker, but they will automatically aim at the enemy.
Her bomb is a simple “Lunar Shield” that clears bullets and deals damage. It follows her while active.
4. Gameplay Guide: Boss
Remilia has three nonspells and three spells this time around.
Her attacks are based on her and others Ability Cards, so shell be using some very familiar patterns.
But that cant stop you, right?
5. Gameplay Tips
+ Bosses drop rainbow point items after every attack if you defeat them without losing a life. If you lose a life, theyll just drop normal blue point items which are worth fewer points. Try your best to survive and score high!
+ Pink petals, which are dropped by the boss, add 0.2x to your score multiplier.
+ The closer you are to the boss, the faster petals will drop. Therefore, playing risky can help you earn more points!
+ Dont forget to use your bombs often! You get three every life.
+ You can set the number of starting lives, player shot opacity, item opacity and background opacity in the Options menu.
JAPANESE:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 896 KiB

After

Width:  |  Height:  |  Size: 936 KiB

View File

@ -622,18 +622,18 @@ task TBossLife
ascent(iDiv in 1 .. length(listLifeDiv)-1) ascent(iDiv in 1 .. length(listLifeDiv)-1)
{ {
let rate = listLifeDiv[iDiv]; let rate = listLifeDiv[iDiv];
let x = (GetStgFrameWidth()) * (1-rate); let x = (GetStgFrameWidth()) * 0.98 * (1-rate);
ObjSpriteList2D_SetDestRect(objDivision, x-3, 65, x+24, 115); ObjSpriteList2D_SetDestRect(objDivision, x-4, 62, x+24, 118);
ObjSpriteList2D_AddVertex(objDivision); ObjSpriteList2D_AddVertex(objDivision);
} }
//Boss star rendering //Boss star rendering
ObjRender_SetScaleXYZ(objStar, 0.5, 0.5, 1); ObjRender_SetScaleXYZ(objStar, 0.6, 0.6, 1);
ObjSpriteList2D_SetSourceRect(objStar, 0, 169, 268, 430); ObjSpriteList2D_SetSourceRect(objStar, 0, 169, 268, 430);
Obj_SetRenderPriority(objStar, 1); Obj_SetRenderPriority(objStar, 1);
ascent(iStep in 0 .. countRemStep) ascent(iStep in 0 .. countRemStep)
{ {
ObjRender_SetPosition(objStar, GetStgFrameWidth()*1.36-iStep*32, 30, 1); ObjRender_SetPosition(objStar, GetStgFrameWidth()*1.6, 35+45*iStep, 1);
ObjSpriteList2D_SetDestCenter(objStar); ObjSpriteList2D_SetDestCenter(objStar);
ObjSpriteList2D_AddVertex(objStar); ObjSpriteList2D_AddVertex(objStar);
} }

View File

@ -0,0 +1,70 @@
#TouhouDanmakufu[Plural]
#ScriptVersion[3]
#Title["Boss Plural"]
#Text["..."]
#System["script/KevinSystem/Kevin_System.txt"]
//#Player["script/KevinPackage/KevinScript_Players/PankevKouda/KevKou_Main.dnh", "script/KevinPackage/KevinScript_Players/MariHousui/MariHousui_Main.dnh"]
let csd = GetCurrentScriptDirectory();
let obj = ObjEnemyBossScene_Create();
#include "script/KevinSystem/Universal_Lib.txt"
#include "script/game/Stage_Background.dnh"
@Event{
}
@Initialize{
if(!IsCommonDataAreaExists("PIV")){
CreateCommonDataArea("PIV");
SetAreaCommonData("PIV", "currentvalue", 10000);
}
else{}
SetAutoDeleteObject(true);
_ScrollBackground();
PluralTask();
}
@MainLoop{
yield;
}
@Finalize
{
}
/* TO DO:
+ Single *syncing* - ensure that the boss stays at the same position
*/
// Task to handle the plural's boss scene
task PluralTask(){
// Registering individual singles
ObjEnemyBossScene_Add(obj, 0, csd ~ "Non1.dnh");
ObjEnemyBossScene_Add(obj, 0, csd ~ "Spell1.dnh");
ObjEnemyBossScene_Add(obj, 0, csd ~ "Non2.dnh");
ObjEnemyBossScene_Add(obj, 0, csd ~ "Spell2.dnh");
ObjEnemyBossScene_Add(obj, 0, csd ~ "Non3.dnh");
ObjEnemyBossScene_Add(obj, 0, csd ~ "Spell3.dnh");
// Loading and registering the boss scene
ObjEnemyBossScene_LoadInThread(obj);
ObjEnemyBossScene_Regist(obj);
while(!Obj_IsDeleted(obj)){
yield;
}
_ExplosionEffect(GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_WIDTH/2), PetalEffect);
SetAutoDeleteObject(true);
wait(120);
CloseScript(GetOwnScriptID());
}

View File

@ -72,26 +72,7 @@ int[] speedSpiral = [6, 8, 8];
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2)); ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
ObjEnemy_SetMaximumDamage(bossObj, 999); ObjEnemy_SetMaximumDamage(bossObj, 999);
// PLACEHOLDER! _RenderBoss(bossObj);
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(); mainTask();
_FadeInvincibility(bossObj, 150, 150, 1); _FadeInvincibility(bossObj, 150, 150, 1);
@ -121,7 +102,7 @@ int[] speedSpiral = [6, 8, 8];
bossX = ObjMove_GetX(bossObj); bossX = ObjMove_GetX(bossObj);
bossY = ObjMove_GetY(bossObj); bossY = ObjMove_GetY(bossObj);
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100); ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 180);
yield; yield;

View File

@ -24,59 +24,29 @@ let bossdiesnd = ObjSound_Create();
/*Parameters: /*Parameters:
// Trail Burst + Laser ring density
+ Laser spin speed
- Density of red bubble spiral + Spiral density
- Angular velocity of bubbles + Spiral speed
- Speed of bubbles + Spiral angle offset
+ Spiral delay
- 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]; int[] denseLaser = [7, 8, 9];
float[] wvelTrailBubble = [2.5, 3.5, 4.5]; float[] speedspinLaser = [0.35, 0.35, 0.35];
float[] spdTrailBubble = [13, 14, 16]; int[] timeLaser = [60, 70, 80];
int[] timeDelayLaser = [45, 40, 30];
int[] denseTrailCurve = [1, 1, 1]; int[] denseSpiral = [5, 6, 7];
int[] delayCurveIndividual = [0, 0, 0]; float[] angleoffsetSpiral = [1.618*8, 1.618*7, 1.618*6];
int[] delayCurve = [8, 7, 6]; float[] speedSpiral = [8.5, 9.5, 10.5];
float[] speedCurve = [5, 6, 7]; int[] delaySpiral = [5, 5, 4];
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.15, 1.35, 1.7];
float[] spdAimedBubble = [12, 14, 16];
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];
int[] thresholdStopSpin = [80, 70, 60];
// Includes ahoy // Includes ahoy
@ -90,7 +60,7 @@ int[] thresholdStopSpin = [80, 70, 60];
_InitDifficulty(difficultySelect); _InitDifficulty(difficultySelect);
difficultySelect = 1; // debug //difficultySelect = 0; // debug
SetShotAutoDeleteClip(64, 64, 64, 64); SetShotAutoDeleteClip(64, 64, 64, 64);
@ -107,26 +77,7 @@ int[] thresholdStopSpin = [80, 70, 60];
ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2)); ObjMove_SetPosition(bossObj, GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_HEIGHT/2));
ObjEnemy_SetMaximumDamage(bossObj, 999); ObjEnemy_SetMaximumDamage(bossObj, 999);
// PLACEHOLDER! _RenderBoss(bossObj);
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(); mainTask();
_FadeInvincibility(bossObj, 150, 150, 1); _FadeInvincibility(bossObj, 150, 150, 1);
@ -156,7 +107,7 @@ int[] thresholdStopSpin = [80, 70, 60];
bossX = ObjMove_GetX(bossObj); bossX = ObjMove_GetX(bossObj);
bossY = ObjMove_GetY(bossObj); bossY = ObjMove_GetY(bossObj);
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100); ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 180);
yield; yield;
@ -166,196 +117,131 @@ int[] thresholdStopSpin = [80, 70, 60];
} }
/*Nonspell 1: /*Nonspell 2 (Patchouli):
Reference to Remi final from EoSD (Red Magic/Scarlet Gensokyo). Non-directional Laser with Bubble Spiral
Fires red bubbles that leave behind trails of bullets.
See: My BHA5 scripts second nonspell
Parameters: Parameters:
// Trail Burst + Laser ring density
+ Laser spin speed
- Density of red bubble spiral + Spiral density
- Angular velocity of bubbles + Spiral speed
- Speed of bubbles + Spiral angle offset
- 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 { task mainTask {
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/6+30, 45, LERP_DECELERATE);
wait(60);
int multiplier = 1;
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){ while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
FireTrail(rand(1.5*STG_WIDTH/8, 2.5*STG_WIDTH/8)); ascent(i in 0..denseLaser[difficultySelect]){
FireAimed(rand(6.5*STG_WIDTH/8, 7.5*STG_WIDTH/8)); SpawnNDLaser(i, multiplier);
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);
} }
} wait(timeDelayLaser[difficultySelect]);
function <void> FireTrail(destX){ float ang = 0;
//float destX = rand(1.5*STG_WIDTH/8, 2.5*STG_WIDTH/8); loop(90/delaySpiral[difficultySelect]){
float ang2 = ang;
ObjMove_SetDestAtFrame(bossObj, destX, STG_HEIGHT/4, 30, LERP_DECELERATE); loop(denseSpiral[difficultySelect]){
wait(30);
float ang = GetAngleToPlayer(bossObj); int shot = CreateShotA1(bossX, bossY, speedSpiral[difficultySelect], ang2, KEV_BUBBLE_RED, 10);
loop(denseTrailSpiral[difficultySelect]){ if (multiplier == -1) {ObjShot_SetGraphic(shot, KEV_BUBBLE_AQUA);}
int shot = CreateShotA2(bossX, bossY, spdTrailBubble[difficultySelect], ang, 0, spdTrailBubble[difficultySelect], wvelTrailBubble[difficultySelect], KEV_BUBBLE_RED, 5); else{}
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
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{ else{
_Delay(shot, 10); _Delay(shot, 10);
_BulletRescale(shot, 0.85, true, 1); _BulletRescale(shot, 0.65, true, 1);
Shoot1; Shoot1;
} }
_ShotTrail(shot, ang);
ang += 360/denseTrailSpiral[difficultySelect];
}
wait(delayTrailAimed[difficultySelect]); ang2 += 360/denseSpiral[difficultySelect];
} }
task _ShotTrail(shot, ang){ ang += angleoffsetSpiral[difficultySelect]*-multiplier;
wait(delaySpiral[difficultySelect]);
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){ multiplier *= -1;
Shoot2; yield;
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); task SpawnNDLaser(int ID, int multiplier){
ObjMove_SetDestAtFrame(bossObj, destX, STG_HEIGHT/4, 30, LERP_DECELERATE); float objcount = 0;
wait(30);
float ang = GetAngleToPlayer(bossObj); int obj = CreateStraightLaserA1(bossX + -45*cos(ID*360/denseLaser[difficultySelect]), bossY + -45*sin(ID*360/denseLaser[difficultySelect]), ID * 360/denseLaser[difficultySelect], STG_HEIGHT*1.5, 100, timeLaser[difficultySelect], KEV_AMULET_RED, timeDelayLaser[difficultySelect]);
loop(denseAimedSpiral[difficultySelect]){ if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(obj);}
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 int shot = CreateShotA1(bossX + 120*cos(ID*360/denseLaser[difficultySelect]), bossY + 120*sin(ID*360/denseLaser[difficultySelect]), 0, ID * 360/denseLaser[difficultySelect], KEV_AURABALL_RED, 10);
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);} if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(shot);}
else{ else{
_Delay(shot, 10); _Delay(shot, 10);
_BulletRescale(shot, 0.85, true, 1); _BulletRescale(shot, 2, true, 1);
Shoot1; Shoot1;
} }
_ShotAimed(shot, ang);
ang += 360/denseAimedSpiral[difficultySelect]; if(multiplier == -1){
ObjShot_SetGraphic(obj, KEV_AMULET_AQUA);
ObjShot_SetGraphic(shot, KEV_AURABALL_AQUA);
} }
wait(delayTrailAimed[difficultySelect]); ObjShot_SetAutoDelete(obj, false);
ObjShot_SetAutoDelete(shot, false);
} ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);
ObjRender_SetBlendType(shot, BLEND_ADD_ARGB);
task _ShotAimed(shot, ang){ ObjLaser_SetInvalidLength(obj, 0.25, 0.25);
ObjStLaser_SetSource(obj, true);
wait(10); ObjStLaser_SetEnd(obj, true);
ObjStLaser_SetEndGraphic(obj, ObjShot_GetImageID(obj)-33);
int del = 1;
async{ async{
ObjShot_SetAutoDelete(shot, false); wait(timeDelayLaser[difficultySelect]);
wait(thresholdStopSpin[difficultySelect]+30); Shoot2;
ObjShot_SetAutoDelete(shot, true);
} }
while(!Obj_IsDeleted(shot) && ObjMove_GetY(shot) <= STG_HEIGHT-30 && ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){ while(!Obj_IsDeleted(obj)){
ObjMove_SetPosition(obj, bossX + -45*cos(ID*360/denseLaser[difficultySelect] + objcount), bossY + -45 * sin(ID*360/denseLaser[difficultySelect] + objcount));
Shoot2; ObjMove_SetPosition(shot, bossX + 120*cos(ID*360/denseLaser[difficultySelect] + objcount), bossY + 120*sin(ID*360/denseLaser[difficultySelect] + objcount));
ObjStLaser_SetAngle(obj, ID*360/denseLaser[difficultySelect] + objcount);
float x2 = ObjMove_GetX(shot); objcount += speedspinLaser[difficultySelect]*multiplier;
float y2 = ObjMove_GetY(shot);
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);
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; yield;
} }
}
_BulletRescale(bullet, 1.25, true, 1); ObjShot_FadeDelete(shot);
_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 SpawnNDLaser(ID, multiplier){
let objcount = 0;
let obj = CreateStraightLaserA1(ObjMove_GetX(bossObj) + 60*cos(ID*360/denseLaser[difficultySelect]), ObjMove_GetY(bossObj) + 60*sin(ID*360/denseLaser[difficultySelect]), ID * 360/denseLaser[difficultySelect], 512, 24, 300, KEV_AMULET_RED, 60);
while(!Obj_IsDeleted(obj)){
ObjMove_SetPosition(obj, ObjMove_GetX(bossObj) + 60*cos(ID*360/denseLaser[difficultySelect] + objcount), ObjMove_GetY(bossObj) + 60*sin(ID*360/denseLaser[difficultySelect] + objcount));
ObjStLaser_SetAngle(obj, ID*360/denseLaser[difficultySelect] + objcount);
//objcount += 1 * multiplier;
objcount += 0.5;
yield;
}
}*/
task endingnew(){ task endingnew(){
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){ while(ObjEnemy_GetInfo(bossObj, INFO_LIFE)>0){

354
script/game/Non3.dnh Normal file
View File

@ -0,0 +1,354 @@
#TouhouDanmakufu[Single]
#ScriptVersion[3]
#Title["Remilia Nonspell 3"]
#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 = [2.5, 3.5, 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.15, 1.35, 1.7];
float[] spdAimedBubble = [12, 14, 16];
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];
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);
_RenderBoss(bossObj);
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), 180);
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 scripts 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.6, 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_KNIFE_LAVENDER, 15);
if(Obj_IsDeleted(shot)){Obj_Delete(bullet);}
Obj_SetRenderPriorityI(bullet, Obj_GetRenderPriorityI(shot)+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]);
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);
}

View File

@ -36,13 +36,14 @@ Parameters:
*/ */
int denseSpiral = [12, 15, 18]; int[] denseSpiral = [6, 7, 8];
int angleoffsetSpiral = [3, 4, 6]; float[] angleoffsetSpiral = [1.618*7, 1.618*6, 1.618*5];
float[] speedSpiral = [8, 9.25, 11];
int[] denseRing = [10, 12, 14]; int[] denseRing = [10, 12, 14];
float[] maxspeedRing = [8, 9, 11]; float[] maxspeedRing = [7.5, 8.5, 10];
int[] deceltimeRing = [20, 30, 40]; int[] deceltimeRing = [20, 25, 32];
int[] acceltimeRing = [60, 45, 35]; int[] acceltimeRing = [60, 50, 40];
// Remilia takes 36 frames. Preferably, pick a number 36 can divide with. // Remilia takes 36 frames. Preferably, pick a number 36 can divide with.
@ -50,11 +51,10 @@ int[] delayRing = [9, 6, 5];
// How much time Remilia takes to charge her attack and you get to GTFO. // How much time Remilia takes to charge her attack and you get to GTFO.
int[] waittimeRemi = [75, 60, 50]; int[] waittimeRemi = [80, 70, 60];
string tex = "script/game/resourceLib/Spritesheet_StationJam.png"; string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
//LoadTextureEx(tex, true, false);
//LoadTextureEx(tex, true, true);
// Includes ahoy // Includes ahoy
@ -65,10 +65,11 @@ string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
//SetIntersectionVisualization(true); //SetIntersectionVisualization(true);
SetAutoDeleteObject(true); SetAutoDeleteObject(true);
LoadTextureEx(tex, true, false);
_InitDifficulty(difficultySelect); _InitDifficulty(difficultySelect);
difficultySelect = 0; // debug //difficultySelect = 2; // debug
SetShotAutoDeleteClip(64, 64, 64, 64); SetShotAutoDeleteClip(64, 64, 64, 64);
@ -118,7 +119,7 @@ string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
bossX = ObjMove_GetX(bossObj); bossX = ObjMove_GetX(bossObj);
bossY = ObjMove_GetY(bossObj); bossY = ObjMove_GetY(bossObj);
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100); ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 180);
yield; yield;
@ -152,28 +153,175 @@ Parameters:
task mainTask { task mainTask {
int multiplier = 1;
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/2
, 45, LERP_DECELERATE);
wait(45);
_UseCard();
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){
loop(3){
_VampireChase();
}
FitfulNightmare(multiplier);
wait(90);
multiplier *= -1;
}
}
function <void> _UseCard(){
// Remi spell
int cardImg = _Create2DImage(tex, [0, 256, 256, 512]);
ObjRender_SetPosition(cardImg, bossX, bossY, 0);
ascent(i in 0..30){
ObjRender_SetY(cardImg, Interpolate_Decelerate(bossY, bossY - 256, i/30));
ObjRender_SetAlpha(cardImg, Interpolate_Decelerate(0, 255, i/30));
yield;
}
wait(30);
ascent(i in 0..15){
ObjRender_SetAlpha(cardImg, Interpolate_Decelerate(255, 0, i/15));
yield;
}
Obj_Delete(cardImg);
} }
function <void> _VampireChase(){ function <void> _VampireChase(){
ObjMove_SetDestAtFrame(bossObj, playerX, playerY, 36, LERP_DECELERATE); float chaseX = playerX;
float chaseY = playerY;
ChargeSFX;
ObjMove_SetDestAtFrame(bossObj, Interpolate_Decelerate(bossX, chaseX, -0.08), Interpolate_Decelerate(bossY, chaseY, -0.08), 30, LERP_DECELERATE);
wait(25);
ObjMove_SetDestAtFrame(bossObj, Interpolate_Decelerate(bossX, chaseX, 1), Interpolate_Decelerate(bossY, chaseY, 1), 36, LERP_DECELERATE);
float ang = GetAngleToPlayer(bossObj);
loop(36/delayRing){ loop(36/delayRing){
ascent(i in 0..denseRing[difficultySelect]){ 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); int shot = CreateShotA2(bossX, bossY, maxspeedRing[difficultySelect], ang + 360/denseRing[difficultySelect] * i, -maxspeedRing[difficultySelect]/deceltimeRing[difficultySelect], 0, 0, KEV_AURABALL_RED, 10);
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);} if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
else{ else{
_Delay(shot, 10); _Delay(shot, 10);
ObjMove_AddPatternA2(shot, 30, NO_CHANGE, NO_CHANGE, maxspeedRing[difficultySelect]/acceltimeRing[difficultySelect], maxspeedRing[difficultySelect], 0); ObjMove_AddPatternA2(shot, 30, NO_CHANGE, NO_CHANGE, maxspeedRing[difficultySelect]/acceltimeRing[difficultySelect], maxspeedRing[difficultySelect], 0);
_BulletRescale(shot, 0.65, true, 1); _BulletRescale(shot, 0.6, true, 1);
//Shoot1; Shoot2;
} }
} }
ang += 18;
wait(delayRing); wait(delayRing);
} }
//wait(36);
// BOOM
_FireExplosion(bossObj);
wait(waittimeRemi[difficultySelect]);
}
function <void> FitfulNightmare(int spin){
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/3, 60, LERP_DECELERATE);
ChargeSFX;
wait(75);
float ang = 0;
loop(40){
float ang2 = ang;
loop(denseSpiral[difficultySelect]){
int shot = CreateShotA1(bossX, bossY, speedSpiral[difficultySelect], ang2, KEV_KNIFE_RED, 10);
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot);}
else{
_Delay(shot, 10);
_BulletRescale(shot, 1.25, true, 1);
Shoot1;
}
ang2 += 360/denseSpiral[difficultySelect]*spin;
}
ang += angleoffsetSpiral[difficultySelect];
wait(3);
}
}
task _FireExplosion(int target){
int objPattern = ObjPatternShot_Create();
ObjPatternShot_SetParentObject(objPattern, target);
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) == 0){Obj_Delete(objPattern); return;}
ObjPatternShot_SetPatternType(objPattern, PATTERN_SCATTER_ANGLE);
ObjPatternShot_SetShotType(objPattern, OBJ_SHOT);
ObjPatternShot_SetInitialBlendMode(objPattern, BLEND_ADD_ARGB);
ObjPatternShot_SetShotCount(objPattern, 24, 6);
ObjPatternShot_SetSpeed(objPattern, 18, 2);
ObjPatternShot_SetAngle(objPattern, 360, 360);
ObjPatternShot_SetDelay(objPattern, 5);
ObjPatternShot_SetGraphic(objPattern, KEV_LEAF_RED);
Shoot2;
int[] arrayPattern = ObjPatternShot_FireReturn(objPattern);
int i = 0;
for each (int bullet in ref arrayPattern){
_BulletRescale(bullet, 1.2, true, 1);
_Delay(bullet, 15);
Obj_SetRenderPriorityI(bullet, 50);
_DeletionHandling(bullet, waittimeRemi[difficultySelect]+i);
//ObjMove_SetAcceleration(bullet, -0.25);
//ObjMove_SetMaxSpeed(bullet, 5);
}
}
task _DeletionHandling(int target, int frameDel){
float spd = ObjMove_GetSpeed(target);
ObjMove_SetAcceleration(target, -spd/[30, 34, 38][difficultySelect]);
ObjMove_SetMaxSpeed(target, 0.2);
wait(frameDel);
ObjShot_FadeDelete(target);
} }
task endingnew(){ task endingnew(){

View File

@ -62,8 +62,6 @@ bool bookShooting = false; // it's a secret tool that will help us later
string tex = "script/game/resourceLib/Spritesheet_StationJam.png"; string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
//LoadTextureEx(tex, true, true);
// Includes ahoy // Includes ahoy
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care: #include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
@ -73,10 +71,11 @@ string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
//SetIntersectionVisualization(true); //SetIntersectionVisualization(true);
SetAutoDeleteObject(true); SetAutoDeleteObject(true);
LoadTextureEx(tex, true, false);
_InitDifficulty(difficultySelect); _InitDifficulty(difficultySelect);
difficultySelect = 0; // debug //difficultySelect = 0; // debug
SetShotAutoDeleteClip(64, 64, 64, 64); SetShotAutoDeleteClip(64, 64, 64, 64);
@ -136,7 +135,7 @@ string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
bossX = ObjMove_GetX(bossObj); bossX = ObjMove_GetX(bossObj);
bossY = ObjMove_GetY(bossObj); bossY = ObjMove_GetY(bossObj);
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100); ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 180);
yield; yield;
@ -174,8 +173,11 @@ Parameters:
task mainTask { task mainTask {
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/2
, 45, LERP_DECELERATE);
wait(45); wait(45);
_UseCard();
// Create 5 books // Create 5 books
CreateBook([0, 0, 256, 256], STG_WIDTH*1/6, 0.65, KEV_LEAF_RED); CreateBook([0, 0, 256, 256], STG_WIDTH*1/6, 0.65, KEV_LEAF_RED);
@ -228,6 +230,31 @@ task mainTask {
} }
function <void> _UseCard(){
// Remi spell
int cardImg = _Create2DImage(tex, [256, 256, 512, 512]);
ObjRender_SetPosition(cardImg, bossX, bossY, 0);
ascent(i in 0..30){
ObjRender_SetY(cardImg, Interpolate_Decelerate(bossY, bossY - 256, i/30));
ObjRender_SetAlpha(cardImg, Interpolate_Decelerate(0, 255, i/30));
yield;
}
wait(30);
ascent(i in 0..15){
ObjRender_SetAlpha(cardImg, Interpolate_Decelerate(255, 0, i/15));
yield;
}
Obj_Delete(cardImg);
}
/* /*
Fire: 0, 0, 256, 256 Fire: 0, 0, 256, 256
Water: 256, 0, 512, 256 Water: 256, 0, 512, 256
@ -288,7 +315,7 @@ function <void> ChargeAttack(float x, int colorselect){
else{ else{
_Delay(shot, 10); _Delay(shot, 10);
ObjMove_AddPatternA2(shot, 30, NO_CHANGE, NO_CHANGE, maxspeedRing[difficultySelect]/acceltimeRing[difficultySelect], maxspeedRing[difficultySelect], 0); ObjMove_AddPatternA2(shot, 30, NO_CHANGE, NO_CHANGE, maxspeedRing[difficultySelect]/acceltimeRing[difficultySelect], maxspeedRing[difficultySelect], 0);
_BulletRescale(shot, 0.65, true, 1); _BulletRescale(shot, 0.6, true, 1);
//Shoot1; //Shoot1;
} }
} }

View File

@ -50,6 +50,8 @@ int[] ringdenseKnife = [10, 12, 14];
float[] ringspeedKnife = [8, 9, 10]; float[] ringspeedKnife = [8, 9, 10];
// Includes ahoy // Includes ahoy
string tex = "script/game/resourceLib/Spritesheet_StationJam.png";
//LoadTextureEx(tex, true, false);
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care: #include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
@ -58,10 +60,11 @@ float[] ringspeedKnife = [8, 9, 10];
//SetIntersectionVisualization(true); //SetIntersectionVisualization(true);
SetAutoDeleteObject(true); SetAutoDeleteObject(true);
LoadTextureEx(tex, true, false);
_InitDifficulty(difficultySelect); _InitDifficulty(difficultySelect);
difficultySelect = 0; // debug //difficultySelect = 0; // debug
SetShotAutoDeleteClip(64, 64, 64, 64); SetShotAutoDeleteClip(64, 64, 64, 64);
@ -111,7 +114,7 @@ float[] ringspeedKnife = [8, 9, 10];
bossX = ObjMove_GetX(bossObj); bossX = ObjMove_GetX(bossObj);
bossY = ObjMove_GetY(bossObj); bossY = ObjMove_GetY(bossObj);
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100); ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 180);
yield; yield;
@ -145,6 +148,12 @@ Parameters:
task mainTask { task mainTask {
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, STG_HEIGHT/2
, 45, LERP_DECELERATE);
wait(45);
_UseCard();
_Warn(); _Warn();
wait(45); wait(45);
@ -153,11 +162,36 @@ task mainTask {
MoveToBottom(); MoveToBottom();
//BurstAttack(); //BurstAttack();
//wait(360); //wait(360);
wait(frameMove[difficultySelect]*2); wait(frameMove[difficultySelect]*1.75);
} }
} }
function <void> _UseCard(){
// Remi spell
int cardImg = _Create2DImage(tex, [512, 256, 768, 512]);
ObjRender_SetPosition(cardImg, bossX, bossY, 0);
ascent(i in 0..30){
ObjRender_SetY(cardImg, Interpolate_Decelerate(bossY, bossY - 256, i/30));
ObjRender_SetAlpha(cardImg, Interpolate_Decelerate(0, 255, i/30));
yield;
}
wait(30);
ascent(i in 0..15){
ObjRender_SetAlpha(cardImg, Interpolate_Decelerate(255, 0, i/15));
yield;
}
Obj_Delete(cardImg);
}
task _Warn(){ task _Warn(){
int time = 30; int time = 30;

View File

@ -156,7 +156,7 @@ int[] thresholdStopSpin = [80, 70, 60];
bossX = ObjMove_GetX(bossObj); bossX = ObjMove_GetX(bossObj);
bossY = ObjMove_GetY(bossObj); bossY = ObjMove_GetY(bossObj);
ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 100); ObjEnemy_SetIntersectionCircleToShot(bossObj, ObjMove_GetX(bossObj), ObjMove_GetY(bossObj), 180);
yield; yield;

View File

@ -0,0 +1,87 @@
let bossBG = "script/game/resourceLib/BGFight.png";
let sound = ObjSound_Create();
let alphaMax = 255*((GetAreaCommonData("Config", "BGOpacity", 100))/100);
let blipVol = GetAreaCommonData("Config", "SEVol", 100) * 0.01;
ObjSound_Load(sound, "script/game/resourceLib/dialogueblip.wav");
ObjSound_SetVolumeRate(sound, 100 * blipVol);
ObjSound_SetSoundDivision(sound, SOUND_SE);
//LoadSound("script/game/StageLib/dialogueblip.wav");
LoadTextureEx(bossBG, true, true);
function <void> _ScrollBackground(){
int BossImg = _Create2DImage(bossBG, [0, 0, 910, 1200]);
ObjRender_SetPosition(BossImg, STG_WIDTH/2, STG_HEIGHT/2-150, 0);
Obj_SetRenderPriorityI(BossImg, 24);
ascent(i in 0..30){
ObjRender_SetAlpha(BossImg, Interpolate_Decelerate(0, alphaMax, i/30));
yield;
}
Dialogue();
//ObjRender_SetAlpha(BossImg, 255*((GetAreaCommonData("Config", "BGOpacity", 100))/100));
}
function <void> Dialogue(){
int objText = CreateTextObject(
STG_WIDTH/2, 2*STG_HEIGHT/5+125, 45,
" ", "Origami Mommy",
0x9F9FFF, 0xDCD6FF,
0x000000, 3,
71
);
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
TTextScroll(objText, "AN AWESOME VAMPIRE/IS CONFLICT WITH US//KEEP YOUR SEXINESS");
Obj_Delete(objText);
}
// by Mugenri!
function <void> TTextScroll(int obj_, string text_) { //Makes text fill gradually in text boxes
bool dialogEnd = false;
bool sentenceEnd = false;
string[] tempStrings = SplitString(text_, "/"); //use / for newlines instead of [r]
string tempString = "";
char lastChar;
int waitTime;
async{
while(!dialogEnd){
if(sentenceEnd){wait(4); continue;}
else{ObjSound_Play(sound); wait(4);}
}
}
if (GetVirtualKeyState(VK_OK) == KEY_PUSH) { //Prevents skipping the yield
SetVirtualKeyState(VK_OK, KEY_FREE);
}
ascent (i in 0..length(tempStrings)) { //list of substrings
ascent (j in 0..length(tempStrings[i])) { //for each character in a substring
tempString ~= [tempStrings[i][j]];
lastChar = tempString[-1];
ObjText_SetText(obj_, tempString);
if([tempStrings[i][j]] == "." ||
[tempStrings[i][j]] == "," ||
[tempStrings[i][j]] == "!" ) {sentenceEnd = true; wait(10);}
else {wait(2); sentenceEnd = false;}
}
tempString ~= ['[','r',']']; //append a newline after each substring
}
dialogEnd = true;
wait(90);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.