This commit is contained in:
Kevinmonitor 2023-01-26 18:34:56 +07:00
commit d3ada59252
391 changed files with 25819 additions and 0 deletions

View file

@ -0,0 +1,415 @@
#include "./Player_Function_Laser.dnh"
// Shot Type
int[] optionArr = [];
float angSpace = 2.5;
float[] angStartArr = [];
// Far left, left, right, far right
float[] angStartUF = [230, 270, 270, 310];
float[] angStartUFAlt = [230, 275, 265, 310];
float[] angStartF = [250, 280, 260, 290];
float offsetX = 125;
float offsetY = 75;
int[] bulletNum = [4, 3, 3, 4];
task _HomeShot(int shot_) {
float duration = 55;
bool homingBool = false;
float basepenetrate = ObjShot_GetPenetration(shot_);
float basedmg = ObjShot_GetDamage(shot_);
//
for (int t = 0i; t < duration && !Obj_IsDeleted(shot_); t++) {
// Checks if enemies are on screen. If enemies are visible, enable homing for the shots.
// _enemyArray is an array containing all enemy IDs, and is constantly updated in @MainLoop.
if (0 < length(_enemyArray)) {
float targetDist = 2000; // Arbitrary number (???)
int targetID = 0;
// Checks distance of every enemy on screen.
for each (int enemy in ref _enemyArray) {
float enemyX = ObjMove_GetX(enemy);
float enemyY = ObjMove_GetY(enemy);
if (0 < enemyX && enemyX < maxX && 0 < enemyY && enemyY < maxY) {
// Returns the hypotenuse of the triangle formed by the x & y distances between the shot and the enemy.
float shotDist = hypot(enemyX - ObjMove_GetX(shot_), enemyY - ObjMove_GetY(shot_));
// Locks the shot onto the enemy.
if (shotDist < targetDist) {
targetDist = shotDist;
targetID = enemy;
homingBool = true;
}
}
}
// Code to handle the actual homing.
if (homingBool) {
for (int f = 0; t < duration && !Obj_IsDeleted(shot_) && !Obj_IsDeleted(targetID) && ObjEnemy_GetInfo(targetID, INFO_LIFE) != 0 && !ObjCol_IsIntersected(shot_); t++) {
ObjShot_SetAutoDelete(shot_, false);
float shotAngle = NormalizeAngle(ObjMove_GetAngle(shot_)); // Angle of the player shot
float targetAngle = NormalizeAngle(atan2(ObjMove_GetY(targetID) - ObjMove_GetY(shot_), ObjMove_GetX(targetID) - ObjMove_GetX(shot_))); // Returns angle from the shot to the enemy.
float angleDistance = AngularDistance(shotAngle, targetAngle); // Angular distance between enemy and player shot
float homeRate = Interpolate_Decelerate(0, 0.8, min(45, f) / 45);
// Homing speed?
ObjMove_SetAngle(shot_, Interpolate_Accelerate(shotAngle, shotAngle + angleDistance, homeRate)); // Interpolate_Necko
f++;
yield;
}
ObjShot_SetAutoDelete(shot_, true);
ObjMove_SetAngularVelocity(shot_, 0);
homingBool = false;
}
}
yield;
}
}
task UpdateAng(){
while(true){
if(GetVirtualKeyState(VK_SLOWMOVE) != KEY_FREE){
angStartArr = angStartF;
angSpace = 9;
}
else{
angStartArr = angStartUF;
angSpace = 18;
}
yield;
}
}
task ShotType(){
}
function CreateOption(distX, distY, startang, wvel, counterspin){
//let shot = CreatePlayerShotA1(playerX+x, playerY-150+y, 0, startang, 0, 99999, KEV_OPTION);
let dummy = CreatePlayerShotA1(playerX, playerY-180, 0, startang, 0, 99999, 0);
bool visible = true;
int shotspeedhome = 0;
float counter = 0;
float scythex = 0;
float scythey = 0;
float offset = 0;
float dummyX = ObjMove_GetX(dummy);
float dummyY = ObjMove_GetY(dummy);
let shot = CreatePlayerShotA1(dummyX, dummyY, 0, startang, 0, 99999, OPTION);
float spaceX = 0, spaceY = 0;
float shotang = startang;
//ObjShot_SetSpinAngularVelocity(shot, wvel);
ObjShot_SetAutoDelete(shot, false);
ObjShot_SetAutoDelete(dummy, false);
_BulletRescalePlayer(shot, 1, true, 1);
ObjRender_SetBlendType(shot, BLEND_ALPHA);
ObjRender_SetAlpha(shot, 255);
float shotX = ObjMove_GetX(shot);
float shotY = ObjMove_GetY(shot);
// Handles the spinning and shooting of the options.
async{
//SetShotAutoDeleteClip(-500, 128, -500, -500);
//int i = 0;
loop{
shotX = ObjMove_GetX(shot);
shotY = ObjMove_GetY(shot);
ObjRender_SetAngleZ(shot, 0);
if(!IsPermitPlayerShot || ripplayer){
//spaceX = clamp(spaceX-2, 0, x);
//Obj_SetVisible(shot, false);
Obj_SetVisible(dummy, false);
visible = false;
shotspeedhome = 0;
}
else{
//spaceX = min(x, spaceX+x/45);
//spaceY = min(y, spaceY+y/45);
Obj_SetVisible(shot, true);
visible = true;
Obj_SetVisible(dummy, true);
if(shotspeedhome % 4 == 0 && GetVirtualKeyState(VK_USER1) == KEY_FREE && GetVirtualKeyState(VK_SHOT) != KEY_FREE){
let bullet = CreatePlayerShotA1(shotX, shotY, 50, 270, shotDamageOption, 1.5, FIRE_OPTION);
//let water2 = CreatePlayerShotA1(shotx+25, shoty, 15, shotang+180, 1.82, 1.25, KEV_OPTIONSHOT);
ObjShot_SetAutoDelete(bullet, false);
_HandleDeletion(bullet);
ObjRender_SetAlpha(bullet, shotAlpha);
_BulletRescalePlayer(bullet, shotScaleOption, true, 1);
//ObjMove_SetAngularVelocity(water, [0, 0.2][typeGun]);
//ObjMove_SetAngularVelocity(water2, [0, 0.2][typeGun]);
Obj_SetRenderPriorityI(bullet, plrender-1);
ObjSound_Play(Base2);
}
shotspeedhome++;
//counter;
}
yield;
}
}
task _HandleDeletion(int target){
while(ObjMove_GetY(target) > -96){
if(Obj_IsDeleted(target)){break;}
yield;
}
Obj_Delete(target);
return;
}
// Having the options move with Kevin if not shooting and/or focused.
async{
float angmove = 0;
loop{
ObjMove_SetPosition(shot, playerX+counterspin*spaceX*cos(shotang), playerY-offset+counterspin*spaceY*sin(shotang));
shotang += 3*counterspin;
ObjMove_SetPosition(dummy, playerX, playerY);
// If under player: render above
if(shotY > playerY){Obj_SetRenderPriorityI(shot, plrender+1);}
else{Obj_SetRenderPriorityI(shot, plrender-1);}
if(GetVirtualKeyState(VK_SLOWMOVE) != KEY_FREE){
spaceX = max(distX*0.6, spaceX-distX*1/15);
spaceY = max(distY*0.6, spaceY-distY*1/15);
}
else{
spaceX = min(distX*1, spaceX+distX*1/15);
spaceY = min(distY*1, spaceY+distY*1/15);
}
yield;
}
}
async{
loop{
if(visible == true){ObjShot_SetIntersectionEnable(shot, true); ObjShot_SetIntersectionEnable(dummy, true); counter += (1/240); counter = min(counter, 1);}
else if (visible != true && GetVirtualKeyState(VK_SLOWMOVE) != KEY_FREE){ObjShot_SetIntersectionEnable(shot, false); ObjShot_SetIntersectionEnable(dummy, false);}
else {ObjShot_SetIntersectionEnable(shot, false); ObjShot_SetIntersectionEnable(dummy, false); counter = 0;}
yield;
}
}
return shot;
}
// CALL THIS TASK FIRST
task InitiateOptions(){
// Far left, left, right, far right
float distX = 175;
float distY = 175;
float[] angArr = [0, 90, 180, 270];
int count = 0;
for each (float entry in ref angArr){
int option = CreateOption(distX, distY, angArr[count], 1, -1);
optionArr = optionArr ~ [option];
count++;
}
SpecialWeapon(objPlayer);
}
task BaseShot(){
int angMultiplier = 0;
// lASER!!!
_RenderLaser(objPlayer, 0, 300, GetStgFrameHeight()*1.5, 64, 0, shotDamageLaser);
}
task SpecialWeapon(int ID){
int angMultiplier = 0;
float angFlux = 10;
float ang1 = 180;
float ang2 = 180;
float[] angFire = [270-20, 270+20];
while(true){
if(GetVirtualKeyState(VK_USER1) != KEY_FREE && GetCommonDataPtr(POINTER_SPECIALAMMO, 100) > 0 && IsPermitPlayerShot && !ripplayer){
SetCommonDataPtr(POINTER_SPECIALCHECK, true);
SetCommonDataPtr(POINTER_CHAINCHECK, true);
// (Approx.) 20 ammo per second
SetCommonDataPtr(POINTER_SPECIALAMMO, max(0, GetCommonDataPtr(POINTER_SPECIALAMMO, 100)-(20/60)));
if(shotspeed % 4 == 0){
float x = ObjMove_GetX(ID);
float y = ObjMove_GetY(ID);
// Minimal rank boost -> +0.5 rank for every 10 seconds of the wpn being used -> 1/20 rank every sec -> 1/300 rank every 4 frames
SetCommonData("Rank", clamp(GetCommonData("Rank", 1) + 1/300, GetCommonData("MinRank", 1), GetCommonData("MaxRank", 12)));
angFire[0] = 270 + angFlux * sin(ang1) + rand(-5, 5);
angFire[1] = 270 + angFlux * sin(ang2) + rand(-5, 5);
// YASS FIRE THOSE BITCH KILLER SLASHES
FireSlash(angFire[0], 50, 35, 45);
FireSlash(angFire[1], 50, 35, 45);
ang1 += 25;
ang2 -= 25;
}
}
else{
SetCommonDataPtr(POINTER_CHAINCHECK, false);
if(GetCommonDataPtr(POINTER_CHAINGAUGE, 0) <= 0){SetCommonDataPtr(POINTER_SPECIALCHECK, false);}
}
yield;
}
}
task FireSlash(
float angle, baseSpd,
int decelTime, lifeTime
){
int slash = CreatePlayerShotA1(playerX, playerY, baseSpd, angle, shotDamageSpecial, 8, FIRE_SPECIAL);
ObjShot_SetPenetrateShotEnable(slash, false);
_BulletRescalePlayer(slash, shotScaleSpecial, true, 1);
Obj_SetRenderPriorityI(slash, plrender-1);
//ObjRender_SetBlendType(slash, BLEND_ADD_ARGB);
ObjSound_Play(Base5);
ObjShot_SetEraseShot(slash, true);
async{
ascent(i in 0..3){
int slashA = CreatePlayerShotA1(playerX, playerY, baseSpd, angle, shotDamageSpecial/5, 32, FIRE_SPECIAL);
_BulletRescalePlayer(slashA, shotScaleSpecial/2, true, 1);
//ObjRender_SetBlendType(slashA, BLEND_ADD_ARGB);
ObjShot_SetPenetrateShotEnable(slashA, false);
Obj_SetRenderPriorityI(slashA, plrender-1);
Fade(slashA);
wait(10);
}
}
task Fade(int ID){
ObjMove_AddPatternA2(ID, 0, baseSpd/2, [rand(180, 230), rand(-50, 30)][rand_int(0, 1)], (-baseSpd/2)/(decelTime), 2, 0);
ascent(i in 0..(decelTime)){
ObjRender_SetAlpha(ID, Interpolate_Accelerate(shotAlpha, 0, i/(decelTime)));
yield;
}
Obj_Delete(ID);
}
async{
ObjMove_SetAcceleration(slash, -baseSpd/decelTime);
ObjMove_SetMaxSpeed(slash, baseSpd/50);
ObjRender_SetAlpha(slash, shotAlpha);
ascent(i in 0..decelTime){
ObjRender_SetScaleXYZ(slash, Interpolate_Accelerate(shotScaleSpecial/1.25, shotScaleSpecial, i/decelTime));
yield;
}
ascent(i in 0..(lifeTime-decelTime)){
ObjRender_SetAlpha(slash, Interpolate_Accelerate(shotAlpha, 0, i/(lifeTime-decelTime)));
yield;
}
Obj_Delete(slash);
}
}
// Bomb
// Holy fuck its literally YoumuA IBP

View file

@ -0,0 +1,232 @@
// Particle list for laser effect
int LaserEffect = ObjParticleList_Create(OBJ_PARTICLE_LIST_2D);
int[] rect = [704, 192, 768, 256];
ObjPrim_SetTexture(LaserEffect, "script/player/Kouryuu/playerlib/PlSheet_Kouryuu.png");
Obj_SetRenderPriorityI(LaserEffect, 41);
ObjPrim_SetPrimitiveType(LaserEffect, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(LaserEffect, 4);
ObjRender_SetBlendType(LaserEffect, BLEND_ADD_ARGB);
// Left-top, right-top, left-bottom, right-bottom
ObjPrim_SetVertexUVT(LaserEffect, 0, rect[0], rect[1]);
ObjPrim_SetVertexUVT(LaserEffect, 1, rect[2], rect[1]);
ObjPrim_SetVertexUVT(LaserEffect, 2, rect[0], rect[3]);
ObjPrim_SetVertexUVT(LaserEffect, 3, rect[2], rect[3]);
// Vertex positions are offset with deltas so that the sprite is centered
float dU = (rect[2] - rect[0])/2;
float dV = (rect[3] - rect[1])/2;
ObjPrim_SetVertexPosition(LaserEffect, 0, -dU, -dV, 1);
ObjPrim_SetVertexPosition(LaserEffect, 1, dU, -dV, 1);
ObjPrim_SetVertexPosition(LaserEffect, 2, -dU, dV, 1);
ObjPrim_SetVertexPosition(LaserEffect, 3, dU, dV, 1);
ObjPrim_SetVertexIndex(LaserEffect, [0, 1, 2, 1, 2, 3]);
task _CreateLaserParticle(float x, float y, float spdX, float spdY, float baseAng){
int effectLength = 45;
let x_speed = spdX;
let y_speed = spdY;
let z_add = rand(-5, 5);
ascent(i in 0..effectLength){
_PetalMovement(Interpolate_Decelerate(1, 0.5, i/effectLength), Interpolate_Decelerate(255, 0, i/effectLength));
yield;
}
task _PetalMovement(scale, alpha){
ObjParticleList_SetScale(LaserEffect, scale);
ObjParticleList_SetAngleZ(LaserEffect, baseAng);
ObjParticleList_SetPosition(LaserEffect, x, y, 1);
ObjParticleList_SetAlpha(LaserEffect, alpha);
//Submits the current data to an instance, cleared every frame.
ObjParticleList_AddInstance(LaserEffect);
x += x_speed;
y += y_speed;
baseAng += z_add;
yield;
}
}
//
task _LaserSpriteRender(
img, int target, float targetAng,
int rectLeft, int rectTop, int rectRight, int rectBottom,
float scaleX, float scaleY, int renderPriority, float alpha,
float scaleSpeed
){
int[] EnemyList = [];
let lasersprite = ObjPrim_Create(OBJ_SPRITE_2D);
float scaleXBoost = 0;
float scaleXBoostMax = 0.05;
float ang = 180;
ObjPrim_SetTexture(lasersprite, img);
ObjSprite2D_SetSourceRect(lasersprite, rectLeft, rectTop, rectRight, rectBottom);
ObjRender_SetScaleXYZ(lasersprite, 0, scaleY, 1);
ObjSprite2D_SetDestRect(lasersprite, -(rectRight-rectLeft)/2, 0, (rectRight-rectLeft)/2, rectTop-rectBottom);
Obj_SetRenderPriorityI(lasersprite, renderPriority);
ObjRender_SetAlpha(lasersprite, 0);
ObjRender_SetBlendType(lasersprite, BLEND_ADD_ARGB);
async{
loop{
if(GetVirtualKeyState(VK_SHOT) != KEY_FREE && !ripplayer && IsPermitPlayerShot){
// Assumes the intersecting color is right next to the right of the original color
if (length(EnemyList) > 0) {ObjSprite2D_SetSourceRect(lasersprite, rectRight, rectTop, rectRight+(rectRight-rectLeft), rectBottom);}
else{ObjSprite2D_SetSourceRect(lasersprite, rectLeft, rectTop, rectRight, rectBottom);}
float targetx = ObjRender_GetX(target);
float targety = ObjRender_GetY(target);
ObjRender_SetScaleX(lasersprite, min(scaleX+scaleXBoost, ObjRender_GetScaleX(lasersprite) + scaleSpeed));
scaleXBoost = scaleXBoostMax * sin(ang);
ObjRender_SetAlpha(lasersprite, min(alpha, ObjRender_GetAlpha(lasersprite)+alpha/5));
ObjRender_SetAngleZ(lasersprite, targetAng);
ObjRender_SetPosition(lasersprite, targetx, targety, 1);
ang += 25;
yield;
}
else{
ObjRender_SetScaleX(lasersprite, max(0, ObjRender_GetScaleX(lasersprite) - scaleSpeed));
ObjRender_SetAlpha(lasersprite, max(0, ObjRender_GetAlpha(lasersprite)-alpha/5));
yield;
}
yield;
}
}
}
function _RenderLaser(target, float ang, float maxintersectX, float maxLength, float width, float speedLength, float dmg){ /* */
int[] EnemyList = [];
float angRender = asin(maxintersectX/absolute(maxLength));
//int laser = CreatePlayerShotA1(ObjRender_GetX(target), ObjRender_GetY(target), 0, ang, dmg, 9999999, 0);
int laser = CreateStraightLaserA1(ObjRender_GetX(target), ObjRender_GetY(target), ang-90, maxLength, width, 99999999, 0, 1);
ObjLaser_SetInvalidLength(laser, 0, 0);
ObjShot_SetDamage(laser, dmg);
ObjShot_SetAutoDelete(laser, false);
Obj_SetRenderPriorityI(laser, plrender-1);
_Follow(laser, target);
_LaserSpriteRender(
plimg, laser, ang,
256, 192, 384, 384,
1, 20, plrender-1, shotAlpha,
0.1
);
// This also affects damage of the laser, not just effects
LaserHitEffect(EnemyList, laser, dmg);
// When shot key is being held, create a line intersection that stretches across the laser.
/*
Calculations:
startx: x of target
starty: y of target
endx: x of laser
endy: maxLength
width = width of laser
*/
async{
loop{
if(GetVirtualKeyState(VK_SHOT) != KEY_FREE && !ripplayer && IsPermitPlayerShot){
if(shotspeed % 5 == 0){
ObjSound_Play(Base2);
}
ObjShot_SetIntersectionEnable(laser, true);
//ObjShot_SetIntersectionLine(laser, ObjRender_GetX(target), ObjRender_GetY(target), ObjRender_GetX(target)+maxintersectX, -maxLength, width);
//WriteLog(ObjMove_GetX(laserfwd));
yield;
}
else{
ObjShot_SetIntersectionEnable(laser, false);
ObjShot_SetPenetration(laser, 99999999);
yield;
}
}
}
// After shot key is released, let the laser leave and then delete it.
return laser;
}
task LaserHitEffect(int[] EnemyList, int target, float basedmg){
async{
loop{
EnemyList = ObjCol_GetListOfIntersectedEnemyID(target);
yield;
}
}
// Particle effects
async{
loop{
ascent(i in -1..length(EnemyList)-1){
_CreateLaserParticle(ObjMove_GetX(EnemyList[i])+prand(-30, 30), ObjMove_GetY(EnemyList[i])+prand(-30, 30), [prand(-8, -5), prand(-4, 4), prand(5, 8)][prand_int(0, 2)], [prand(-8, -6), prand(6, 8)][prand_int(0, 1)], rand(0, 360));
}
//Resort;
//WriteLog(EnemyList);
wait(rand_int(6, 9));
}
}
// Damage effects
}
task _Follow(follower, followed){
while(!Obj_IsDeleted(follower)){
float x = ObjRender_GetX(followed);
float y = ObjRender_GetY(followed);
ObjMove_SetPosition(follower, x, y);
yield;
}
}

View file

@ -0,0 +1,374 @@
#TouhouDanmakufu[Player]
#ScriptVersion[3]
#ID["PL2_KOURYUU"]
#Title["Kouryuu Eikankaku"]
#Text["Player 2"]
//#Image["./mariremi_lib/mariremi_illust.png"]
#ReplayName["Kouryuu"]
#include "script/KevinSystem/kevin_system/Lib_Const.dnh"
#include "script/KevinSystem/Kevin_PlayerLib.txt"
#include "script/KevinSystem/PlayerSoundLib.dnh"
#include "./Player_Function.dnh"
#include "./Player_ShotConst.dnh"
#include "script/KevinSystem/kevin_system/Kevin_ItemConst.txt"
#include "script/KevinSystem/kevin_system/Kevin_ItemLib.txt"
let csd = GetCurrentScriptDirectory();
// Global Variables
float maxX = GetStgFrameWidth();
float maxY = GetStgFrameHeight();
// Images & Sound
let teamimg = csd ~ "./playerlib/Player_Sheet.png";
LoadTextureEx(teamimg, true, true);
//ObjRender_SetTextureFilterMip(teamimg, FILTER_LINEAR);
let plimg = csd ~ "./playerlib/PlSheet_Kouryuu.png";
LoadTextureEx(plimg, true, true);
ObjRender_SetTextureFilter(plimg, FILTER_NONE, FILTER_NONE, FILTER_NONE);
let sndpath = csd ~ "./sound";
int[] _enemyArray = [];
int[] _existArray = [];
int[] _shotArray = [];
bool isChain = false;
bool isUseSpecialWpn = false;
float curChain = 0;
// Other stuff
float playerX = 0;
float playerY = 0;
let objPlayer = GetPlayerObjectID();
int plrender = 42;
bool ripplayer = false;
float shotspeed = 0;
float bombrand = 0;
int grazecounter = 0; // For basic graze = PIV mechanic
int shotAlpha = (GetAreaCommonData("Config", "PlayerShotOpacity", 60)*0.01)*255;
float shotDamageOption = 4.8;
float shotScaleOption = 1;
float shotDamageLaser = 2;
float shotScaleLaser = 1;
float shotDamageSpecial = 4.5;
float shotScaleSpecial = 2;
float[] PlayerSpd = [15, 7.5];
// Custom events for scoring mechanic
const EV_PIV_100 = EV_USER + 100i; // Normal enemies and nons
const EV_PIV_250 = EV_USER + 101i; // Spells
const EV_PIV_500 = EV_USER + 102i; // Last Spells
const EV_PIV_2000 = EV_USER + 103i; // What.
@Initialize{
if(!IsCommonDataAreaExists("PIV")){
CreateCommonDataArea("PIV");
SetAreaCommonData("PIV", "currentvalue", 10000);
SetAreaCommonData("PIV", "ChainAmount", 1);
}
else{}
SetPlayerStateEndEnable(true);
// Stuff
Parameter();
RenderPlayer();
UpdateAng();
BaseShot();
InitiateOptions();
Obj_SetRenderPriorityI(objPlayer, 43);
plrender = Obj_GetRenderPriorityI(objPlayer);
_SoundTask();
//SetIntersectionVisualization(true); // Debug
_Mechanic(ripplayer, _enemyArray, _existArray, GetStgFrameWidth(), GetStgFrameHeight(), objPlayer, GetEnemyBossSceneObjectID(), 1, 2, 80);
_ShowChain();
_HandleChainGauge();
_HitboxRender(ripplayer, objPlayer, plimg, teamimg, 768, 192, 832, 256, 1536, 896, 2048, 1408, 0.5, 0.65);
SetShotAutoDeleteClip(256, 256, 256, 256);
_Countdown();
// Shot data loading
LoadPlayerShotData(csd ~ "./Player_ShotData.dnh");
}
@MainLoop{
_enemyArray = GetIntersectionRegistedEnemyID;
shotspeed += 1; // Managing the shot rate
//_shotArray = GetAllShotID(TARGET_PLAYER);
//UniversalAlphaHandle(_shotArray);
plrender = Obj_GetRenderPriorityI(objPlayer);
playerX = ObjMove_GetX(objPlayer);
playerY = ObjMove_GetY(objPlayer);
yield;
}
@Event{
alternative(GetEventType)
// Delete effect
case(EV_DELETE_SHOT_PLAYER){
if(GetCommonDataPtr(EFFECTCUT_PTR, 0) >= 3){}
else{
let graphic = GetEventArgument(2);
float[] position = GetEventArgument(1);
let obj = CreatePlayerShotA1(position[0], position[1], 0, ObjMove_GetAngle(GetEventArgument(0)), 0, 99999, graphic);
ObjShot_SetIntersectionEnable(obj, false); _DeleteEffect(obj, graphic == FIRE_SPECIAL ? 2 : 1);
}
//if(graphic == ELECTRIC_FIRE_ALT) {_DeleteEffectAlt(obj);}
//else{_DeleteEffect(obj);}
}
// PIV-item spawning events
case(EV_PIV_100){
let arg = GetEventArgument(0);
CreatePIVItem(PIV_100, arg[0], arg[1]);
}
case(EV_PIV_250){
let arg = GetEventArgument(0);
CreatePIVItem(PIV_250, arg[0], arg[1]);
}
case(EV_PIV_500){
let arg = GetEventArgument(0);
CreatePIVItem(PIV_500, arg[0], arg[1]);
}
// Basic functionality events
case(EV_REQUEST_SPELL){
let bomb = GetPlayerSpell();
if (bomb >= 1){
SetScriptResult(true);
SetPlayerSpell(bomb - 1);
_Bomb();
SetCommonData("Rank", clamp(max(1, GetCommonData("Rank", 1)-0.25), GetCommonData("MinRank", 1), GetCommonData("MaxRank", 12)));
_SigilCall(false, teamimg, 768+256, 512, 768+512, 768, objPlayer, GetPlayerInvincibilityFrame());
}
else {
SetScriptResult(false);
}
}
case(EV_HIT){
ObjSound_Play(PlayerHit);
_DeathbombWarning(plimg, [832, 0, 1088, 256], 20, 3);
}
case(EV_CHAIN_MAX){
if(!isChain){
ObjSound_Play(Shine);
isChain = true;
curChain = GetCommonDataPtr(POINTER_CHAIN, 1);
}
else{}
}
case(EV_CHAIN_RELEASE){
}
case(EV_CHAIN_END){
SetAreaCommonData("PIV", "ChainAmount", 1);
isChain = false;
// Increase rank depending on curChain (>= 32), then reset curChain. MAX CHAIN increases rank by 0.4.
if(curChain >= 32){
SetCommonData("Rank", clamp(GetCommonData("Rank", 1) + Interpolate_Linear(0.25, 0.5, curChain/64), GetCommonData("MinRank", 1), GetCommonData("MaxRank", 12)));
}
curChain = 1;
}
case(EV_PLAYER_SHOOTDOWN){
ObjSound_Play(PlayerDie2);
SetPlayerSpell(GetPlayerSpell()+2);
ripplayer = true;
DeleteShotAll(TYPE_SHOT, TYPE_ITEM);
SetCommonData("Rank", clamp(GetCommonData("Rank", 1) * 0.75, GetCommonData("MinRank", 1), GetCommonData("MaxRank", 12)));
_SigilCall(true, teamimg, 768, 512, 768+256, 768, objPlayer, 60);
}
case(EV_PLAYER_REBIRTH){
ripplayer = false;
SetPlayerInvincibilityFrame(180);
//_Countdown();
_SigilCall(false, teamimg, 768+256, 512, 768+512, 768, objPlayer, 150);
}
case(EV_GRAZE){
}
}
@Finalize{
}
// Basic player parameters
task Parameter(){
// im trying to not be collected by the player but their item scope is dummy thicc and im alerted by its cheek
SetPlayerItemScope(360);
SetPlayerLife(9); // Debug
SetPlayerSpell(2);
SetPlayerSpeed(PlayerSpd[0], PlayerSpd[1]); // (original: 5.25/2.0)
SetPlayerRebirthFrame(20);
SetPlayerDownStateFrame(60);
SetPlayerAutoItemCollectLine(GetStgFrameHeight/3);
SetPlayerRebirthLossFrame(0);
ObjPlayer_AddIntersectionCircleA1(objPlayer, 0, 0, 0, 40);
}
// Player render
task RenderPlayer(){
// Why is this movement code so cursed jesus fucking christ
float scale = 1; // Scalies
int frame = 0;
ObjPrim_SetTexture(objPlayer, plimg);
ObjSprite2D_SetSourceRect(objPlayer, 0, 0, 128, 192);
ObjSprite2D_SetDestCenter(objPlayer);
Obj_SetRenderPriorityI(objPlayer, plrender);
//ObjRender_SetTextureFilterMin(objPlayer, FILTER_ANISOTROPIC);
ObjRender_SetScaleXYZ(objPlayer, scale, scale, 1);
// Lower "speed" parameter = FASTER SPEED
// FOR WHEN ONLY IDLE SPRITES ARE DONE
loop{
frame++;
_RenderPlayerMovement(objPlayer, frame, 0, 0, 128, 192, scale, 3, 6);
if (frame >= (3*6-1)){frame = 0;}
yield;
}
}
// Handling of bomb
task _Bomb(){
// 180 frames
// Preparation
SetForbidPlayerShot(true);
SetForbidPlayerSpell(true);
SetPlayerInvincibilityFrame(180);
// Spell object
let manageObj = GetSpellManageObject(); // SPELL BEGINS
ObjSpell_Regist(manageObj);
// Fully refills chain gauge for 120 frames
// Activates chain but not FUN MODE
async{
loop(90){
SetCommonDataPtr(POINTER_CHAINCHECK, true);
SetCommonDataPtr(POINTER_CHAINGAUGE, 100);
yield;
}
}
task CreateFireRing(x, y){
float startAng = rand(0, 360);
ascent(i in 0..8){
int slash = CreatePlayerShotA1(x, y, 35, startAng + i * 360/8, shotDamageSpecial/4, 64, FIRE_SPECIAL);
ObjShot_SetPenetrateShotEnable(slash, false);
ObjRender_SetColorHSV(slash, 180, 255, 255);
_BulletRescalePlayer(slash, shotScaleSpecial/1.75, true, 1);
ObjShot_SetSpellFactor(slash, true);
ObjShot_SetEraseShot(slash, true);
Obj_SetRenderPriorityI(slash, plrender-1);
//ObjRender_SetBlendType(slash, BLEND_ADD_ARGB);
Fade(slash);
}
ObjSound_Play(Explosion2);
}
task Fade(int ID){
ObjRender_SetAlpha(ID, 255);
ObjMove_AddPatternA2(ID, 0, 36, NO_CHANGE, -36/15, 2, 0);
wait(15);
ascent(i in 0..15){
ObjRender_SetAlpha(ID, Interpolate_Accelerate(255, 0, i/15));
yield;
}
Obj_Delete(ID);
}
float bombX = playerX;
ascent(i in 0..18){
CreateFireRing(rand(bombX - 96, bombX + 96), Interpolate_Linear(STG_HEIGHT+128, -128, i/18));
wait(4);
}
SetPlayerSpeed(PlayerSpd[0], PlayerSpd[1]);
SetForbidPlayerShot(false);
Obj_Delete(manageObj); // !!! IMPORTANT !!!
wait(60);
SetForbidPlayerSpell(false);
}

View file

@ -0,0 +1,12 @@
let current = GetCurrentScriptDirectory();
let path = current ~ "Player_ShotData.dnh";
LoadPlayerShotData(path);
// -----
const OPTION = 1;
const FIRE_OPTION = 2;
const FIRE_BASE = 3;
const FIRE_BASE_B = 4;
const FIRE_SPECIAL = 5;

View file

@ -0,0 +1,60 @@
shot_image = "./playerlib/PlSheet_Kouryuu.png"
ShotData{
id = 0 // Dummy
rect = (0,0,0,0)
render = ALPHA
alpha = 0
collision = 32
}
// Option
ShotData{
id = 1
rect = (0, 192, 128, 384)
render = ALPHA
alpha = 255
fixed_angle = true
collision = 0 // Hitbox of arrows is not centered on the sprite
}
// Fire
ShotData{
id = 2
rect = (128, 192, 256, 384)
render = ALPHA
alpha = 255
collision = 64 // Hitbox of arrows is not centered on the sprite
}
// Laser
ShotData{
id = 3
rect = (256, 192, 384, 384)
render = ALPHA
alpha = 255
collision = 64 // Hitbox of arrows is not centered on the sprite
}
// Laser 2
ShotData{
id = 4
rect = (384, 192, 512, 384)
render = ALPHA
alpha = 255
collision = 64 // Hitbox of arrows is not centered on the sprite
}
// Slash
ShotData{
id = 5
rect = (512, 192, 640, 384)
render = ALPHA
alpha = 255
collision = 64 // Hitbox of arrows is not centered on the sprite
}

View file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1 @@
2,0.57,,0.3442,,0.2691,0.3,0.2179,,0.3445,,,,,,,,,,,0.2992,,0.5139,,,1,,,,,,,masterVolume

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.