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,34 @@
// Sound effects for items go here.
let itemlib = GetModuleDirectory() ~ "./script/KevinSystem/RyannSFX/ItemSFX/";
let SFXVol = GetAreaCommonData("Config", "SEVol", 100) * 0.01;
// Sound objects declarations
let SpellSFX = ObjSound_Create();
let LifeSFX = ObjSound_Create();
let CancelSFX = ObjSound_Create();
let RegularItemSFX = ObjSound_Create();
let SpecialItemSFX = ObjSound_Create();
// Merge function that loads sounds and significantly decreases volume
// so the ears do not die from SFX overload.
function LoadEx(targetobj, targetpath, targetvol){
ObjSound_Load(targetobj, targetpath);
ObjSound_SetVolumeRate(targetobj, targetvol * SFXVol);
ObjSound_SetSoundDivision(targetobj, SOUND_SE);
}
task _ItemSoundTask{
LoadEx(SpellSFX, itemlib ~ "bfxr_SpellExtend.wav", 100);
LoadEx(LifeSFX, itemlib ~ "bfxr_LifeExtend.wav", 100);
LoadEx(CancelSFX, itemlib ~ "bfxr_GetItemCancel.wav", 20);
LoadEx(RegularItemSFX, itemlib ~ "bfxr_GetItem1.wav", 50);
LoadEx(SpecialItemSFX, itemlib ~ "bfxr_GetItemSpecial.wav", 150);
}
// Functions to load sounds in scripts

View file

@ -0,0 +1,509 @@
// Item script
float widthSTG = GetStgFrameWidth();
float heightSTG = GetStgFrameHeight();
float PIV = 0;
let POINTER_PIV = LoadAreaCommonDataValuePointer("PIV", "currentvalue", 1000);
let POINTER_CHAIN = LoadAreaCommonDataValuePointer("PIV", "ChainAmount", 1);
let POINTER_CHAINGAUGE = LoadAreaCommonDataValuePointer("PIV", "ChainGauge", 0);
let POINTER_SPECIALAMMO = LoadAreaCommonDataValuePointer("PIV", "SpecialAmmo", 100);
let POINTER_SPECIALCHECK = LoadAreaCommonDataValuePointer("PIV", "IsUsingSpecial", false);
let POINTER_CHAINCHECK = LoadAreaCommonDataValuePointer("PIV", "IsChaining", false);
int SPECIAL_BOOST_COUNT = 0;
float rateReduceNormal = 100/120;
float rateReduceCashin = 100/180;
#include "script/KevinSystem/kevin_system/Lib_Const.dnh"
#include "./Kevin_ItemConst.txt"
#include "./Kevin_ItemLib.txt"
#include "./ItemSoundLib.txt"
// Chain system: Crystals fill up your chain amount, up to a max of 64x
// When you use a bomb (IsBomb), items get cancelled into golden point items worth 10000 x Chain Amount (max 640000 per item)
@Initialize{
SetAutoDeleteObject(true);
_ItemSoundTask();
SetDefaultBonusItemEnable(false);
LoadItemData(GetCurrentScriptDirectory ~ "./Kevin_ItemData.txt");
SetAreaCommonData("ScriptID", "ItemID", GetOwnScriptID());
//SetCommonDataPtr("ItemIDPtr", GetOwnScriptID());
}
int objPlayer = GetPlayerObjectID();
float tmpSpd = 0, tmpScl = 0, tmpMtp = 0;
@MainLoop{
PIV = GetCommonDataPtr(POINTER_PIV, 1000);
for each(item in GetItemIdInCircleA1(widthSTG/2, heightSTG/2, heightSTG)){
tmpSpd = ObjMove_GetSpeed(item);
tmpMtp = ObjItem_IsMoveToPlayer(item);
if(tmpSpd >= 0){
if (!tmpMtp && GetPlayerState() != STATE_DOWN){
ObjItem_SetMoveToPlayer(item, true);
}
}
if(tmpMtp) {
ObjMove_SetAngle(item, GetAngleToPlayer(item));
ObjMove_SetAcceleration(item, 1);
ObjMove_SetMaxSpeed(item, 24);
}
}
yield;
}
@Event
{
alternative (GetEventType())
case (EV_GET_ITEM){
let obj = GetEventArgument(0);
alternative(obj)
case(POINT_REGULAR){
AddScore(1000);
ObjSound_Play(CancelSFX);
SetCommonDataPtr(POINTER_SPECIALAMMO, min(100, GetCommonDataPtr(POINTER_SPECIALAMMO, 100)+0.1));
SetCommonDataPtr(POINTER_PIV, GetCommonDataPtr(POINTER_PIV, 1000)+50);
}
case(POINT_BHESTIE) { AddScore(2*GetCommonDataPtr(POINTER_PIV, 10000)); ObjSound_Play(SpecialItemSFX);}
// Rainbow point items give 10000 x Chain Counter
case(POINT_GOLD_SMALL) { AddScore(GetCommonDataPtr(POINTER_CHAIN, 1)*GetCommonDataPtr(POINTER_PIV, 10000)); ObjSound_Play(SpecialItemSFX);}
case(POINT_GOLD_MEDIUM) { AddScore(GetCommonDataPtr(POINTER_CHAIN, 1)*GetCommonDataPtr(POINTER_PIV, 10000)); ObjSound_Play(SpecialItemSFX);}
case(POINT_GOLD_LARGE) {
AddScore(GetCommonDataPtr(POINTER_PIV, 1000));
ObjSound_Play(SpecialItemSFX);
}
case(POINT_CANCEL) { AddScore(0.05*GetCommonDataPtr(POINTER_PIV, 10000)); ObjSound_Play(CancelSFX);}
case(EXTEND_LIFE) { AddScore(GetCommonDataPtr(POINTER_PIV, 10000)); SetPlayerLife(GetPlayerLife()+1); ObjSound_Play(SpellSFX);}
case(EXTEND_SPELL) { AddScore(GetCommonDataPtr(POINTER_PIV, 10000)); SetPlayerSpell(GetPlayerSpell()+1); ObjSound_Play(SpecialItemSFX);}
// CHAIN ITEM
case(PIV_250) {
if (GetCommonDataPtr(POINTER_SPECIALCHECK, false) == true){
if(SPECIAL_BOOST_COUNT <= 90 && GetCommonDataPtr(POINTER_CHAIN, 1) >= 48){
SetCommonDataPtr(POINTER_CHAINGAUGE, min(100, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)+ rateReduceCashin * 5 * (1 - SPECIAL_BOOST_COUNT/90)));
SPECIAL_BOOST_COUNT++;
}
}
else{
if(GetCommonDataPtr(POINTER_CHAIN, 1) <= 1){
SetCommonDataPtr(POINTER_CHAINGAUGE, 100);
}
SetCommonDataPtr(POINTER_CHAIN, min(64, GetCommonDataPtr(POINTER_CHAIN, 1)+0.15));
SetCommonDataPtr(POINTER_CHAINGAUGE, min(100, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)+ rateReduceNormal * 20));
SPECIAL_BOOST_COUNT = 0;
}
}
case(PIV_500) { SetCommonDataPtr(POINTER_PIV, GetCommonDataPtr(POINTER_PIV, 10000)+500);}
case(SPECIAL_AMMO) {
SetCommonDataPtr(POINTER_SPECIALAMMO, min(100, GetCommonDataPtr(POINTER_SPECIALAMMO, 100)+0.2));
}
}
case (EV_DELETE_SHOT_TO_ITEM){
float[] position = GetEventArgument(1);
if(GetCommonDataPtr(POINTER_SPECIALCHECK, true) == true && IsPlayerSpellActive() != true && GetPlayerState() == STATE_NORMAL){
CreateScoreItem(POINT_GOLD_LARGE, position[0], position[1]);
} // Kouryuu special weapon
else{
CreateScoreItem(POINT_REGULAR, position[0], position[1]);
} // Death or bomb
}
case (EV_CANCEL_ITEM) {
let obj = GetEventArgument(0);
let type = GetEventArgument(1);
//ObjItem_SetMoveToPlayer(obj, false);
ObjMove_CancelMovement(obj);
//_CancelHandling(obj, type);
}
case (EV_COLLECT_ITEM){
let obj = GetEventArgument(0);
let type = GetEventArgument(1);
let typeCollect = GetEventArgument(2);
//WriteLog(type);
//_MoveToPlayer(obj, type, typeCollect); // Separate task is used to move the object to the player at customized speeds.
}
// Drops point items depending on how close you were to the enemy when you killed them.
/*
Event arguments:
0: PlayerID
1: EnemyID
2: Minimum number of point items
3: Maximum number of point items
*/
case(EV_DROP_POINT_ENEMY){
_DropPointItem(GetEventArgument(0), GetEventArgument(1), GetEventArgument(2), GetEventArgument(3), GetEventArgument(4));
}
case(EV_DROP_PIV_ENEMY){
//_DropPIVItemEnemy(GetEventArgument(0), GetEventArgument(1), GetEventArgument(2), GetEventArgument(3), GetEventArgument(4));
}
case(EV_DROP_AMMO_ENEMY){
//_DropAmmoItemEnemy(GetEventArgument(0), GetEventArgument(1), GetEventArgument(2), GetEventArgument(3), GetEventArgument(4));
}
// Event arguments: Enemy X, Enemy Y, Item Drop Amount, Item Drop Type
case(EV_SINGLE_ITEM_DROP){
loop(GetEventArgument(2)){
CreateScoreItem(GetEventArgument(3), GetEventArgument(0)+rand(-100, 100), GetEventArgument(1)+rand(-100, 100));
}
}
case(EV_DROP_EXTEND){
CreateExtendItem(EXTEND_LIFE, GetEventArgument(0), GetEventArgument(1));
}
}
task _CancelHandling(int IDItem, int typeItem){
ObjMove_CancelMovement(IDItem);
while(GetPlayerState() != STATE_NORMAL){yield;}
_MoveToPlayer(IDItem, typeItem, 0);
}
// Timer is counted in frames (60 frames = 1 second)
task _DropPointItem(float[] posEnm, float killTimer, float maxTimer, float pointMin, float pointMax){
// If the player kills enemy within maxTimer, the enemy drops the maximum amount of point items
float pointFinal = Interpolate_Smooth(pointMax, pointMin, min(1, killTimer/maxTimer));
WriteLog(killTimer/maxTimer);
if (GetCommonDataPtr(POINTER_CHAINCHECK, false) == true){
loop(pointFinal){
CreateScoreItem(POINT_GOLD_LARGE, posEnm[0]+rand(-60, 60), posEnm[1]+rand(-60, 60));
}
}
else{
loop(pointFinal){
CreateScoreItem(POINT_REGULAR, posEnm[0]+rand(-60, 60), posEnm[1]+rand(-60, 60));
}
}
if(GetAreaCommonData("Config", "EffectCut", 0) >= 1){}
else{_ScorePopup(posEnm[0], posEnm[1], "POINT", pointFinal);}
return;
}
task _DropPIVItemEnemy(int IDPlayer, float[] posEnm, int pointMin, int pointMax, int bestDist){
// If the player is within at MOST "bestDist" from the enemy, the enemy drops the maximum amount of PIV items
float curDist = hypot(posEnm[0]-ObjMove_GetX(IDPlayer), posEnm[1]-ObjMove_GetY(IDPlayer));
int pointFinal = Interpolate_Smooth(pointMin, pointMax, min(1, bestDist/curDist));
//WriteLog(pointFinal);
loop(pointFinal){
CreatePIVItem(PIV_250, posEnm[0]+rand(-60, 60), posEnm[1]+rand(-60, 60));
}
/*
if(GetCommonDataPtr(EFFECTCUT_PTR, 0) >= 1){}
else{_ScorePopup(posEnm[0], posEnm[1], "PIV", pointFinal);}
*/
return;
}
task _DropAmmoItemEnemy(int IDPlayer, float[] posEnm, int pointMin, int pointMax, int bestDist){
// If the player is within at MOST "bestDist" from the enemy, the enemy drops the maximum amount of PIV items
float curDist = hypot(posEnm[0]-ObjMove_GetX(IDPlayer), posEnm[1]-ObjMove_GetY(IDPlayer));
int pointFinal = Interpolate_Smooth(pointMin, pointMax, min(1, bestDist/curDist));
//WriteLog(pointFinal);
loop(pointFinal){
CreateAmmoItem(posEnm[0]+rand(-60, 60), posEnm[1]+rand(-60, 60));
}
if(GetCommonDataPtr(EFFECTCUT_PTR, 0) >= 1){}
else{_ScorePopup(posEnm[0], posEnm[1], "AMMO", pointFinal);}
return;
}
task _MoveToPlayer(obj, type, typeCollect){
ObjItem_SetAutoDelete(obj, true);
ObjMove_SetAcceleration(obj, 1);
//ObjMove_SetMaxSpeed(obj, 2);
// The max speed of movement differs based on item.
alternative(type)
case(POINT_CANCEL) { ObjMove_SetMaxSpeed(obj, 23); }
case(PIV_100) { ObjMove_SetMaxSpeed(obj, 18); }
case(PIV_250) { ObjMove_SetMaxSpeed(obj, 18); }
case(PIV_500) { ObjMove_SetMaxSpeed(obj, 18); }
case(POINT_REGULAR) { ObjMove_SetMaxSpeed(obj, 20); }
case(POINT_RAINBOW) { ObjMove_SetMaxSpeed(obj, 20); }
case(POINT_BHESTIE) { ObjMove_SetMaxSpeed(obj, 20); }
others { ObjMove_SetMaxSpeed(obj, 25); }
while (!Obj_IsDeleted(obj)) {
ObjMove_SetAngle(obj, GetAngleToPlayer(obj));
//WriteLog(ObjMove_GetSpeed(obj));
yield;
}
}
// Text popups. When enemy is defeated, text objects appear showing the number of PIV and point items collected.
function CreateTextObject(
float mx, my, size,
string text, font,
int colorTop, colorBottom,
int borderColor, borderWidth,
int renderPriority
){
let obj = ObjText_Create();
ObjText_SetText(obj, text);
ObjText_SetFontSize(obj, size);
ObjText_SetFontType(obj, font);
ObjText_SetFontColorTop(obj, colorTop);
ObjText_SetFontColorBottom(obj, colorBottom);
ObjText_SetFontBorderType(obj, BORDER_FULL);
ObjText_SetFontBorderColor(obj, borderColor);
ObjText_SetFontBorderWidth(obj, borderWidth);
Obj_SetRenderPriorityI(obj, renderPriority);
ObjRender_SetX(obj, mx);
ObjRender_SetY(obj, my);
return obj;
}
task _ScorePopup(float enmX, float enmY, string type, int itemNum){
if (itemNum <= 0){return;}
float offset = 72; // Vertical space between the 2 scoretexts
float time = 30; // Time that the text objects (appear+)last on screen
float timeDisappear = 15; // Fade time
float size = 40;
float yDes = 60; // Destination text object moves to, relative to enmY
string font = "GravityRegular5";
string font2 = "GravityBold8";
float borderSize = 6;
if (type == "POINT")
{
int pointText = CreateTextObject(
enmX, enmY, size,
IntToString(itemNum * 10000) ~ " x " ~ IntToString(GetCommonDataPtr(POINTER_CHAIN, 1)), font,
0x7699FF, 0xFFFFFF,
0x2A00C0, borderSize,
42
);
ObjText_SetHorizontalAlignment(pointText, ALIGNMENT_CENTER);
if (GetCommonDataPtr(POINTER_CHAINCHECK, false) == true){
ObjText_SetFontBorderColor(pointText, 0xFF9700);
ObjText_SetFontColorTop(pointText, 0xFFD69C);
ObjText_SetFontSize(pointText, 56);
ObjText_SetFontType(pointText, font2);
ObjText_SetText(pointText, IntToString(itemNum * PIV));
}
else{
ObjText_SetFontBorderColor(pointText, 0x2A00C0);
ObjText_SetFontColorTop(pointText, 0x7699FF);
ObjText_SetFontSize(pointText, 40);
ObjText_SetFontType(pointText, font);
ObjText_SetText(pointText, IntToString(itemNum * 1000) ~ "[r][font tc=(255, 223, 143) oz=4 oc=(123, 45, 23) bc=(219, 163, 21) oy=12 sz=25]+" ~ IntToString(itemNum * 50) ~ " VALUE");
}
ascent(i in 0..time){
ObjRender_SetY(pointText, Interpolate_Decelerate(enmY, enmY-yDes, i/time));
yield;
}
ascent(i in 0..timeDisappear){
ObjRender_SetAlpha(pointText, Interpolate_Decelerate(255, 0, i/timeDisappear));
yield;
}
Obj_Delete(pointText);
}
else if (type == "PIV")
{
int pivText = CreateTextObject(
enmX, enmY+offset, size,
"x" ~ IntToString(itemNum), font,
0xFFB4EC, 0xFFFFFF,
0xB200AD, borderSize,
42
);
ObjText_SetHorizontalAlignment(pivText, ALIGNMENT_CENTER);
if (GetCommonDataPtr(POINTER_CHAINCHECK, false) == true){
Obj_SetVisible(pivText, false);
}
else{
Obj_SetVisible(pivText, true);
}
ascent(i in 0..time){
ObjRender_SetY(pivText, Interpolate_Decelerate(enmY+offset, enmY+offset-yDes, i/time));
yield;
}
ascent(i in 0..timeDisappear){
ObjRender_SetAlpha(pivText, Interpolate_Decelerate(255, 0, i/timeDisappear));
yield;
}
Obj_Delete(pivText);
}
else if (type == "AMMO")
{
int pivText = CreateTextObject(
enmX, enmY+offset, size,
"+" ~ rtos("00.00", itemNum*0.2) ~ " [font ox=-24 oy=27 sz=45]AMMO", font,
0xFFB4EC, 0xFFFFFF,
0xF63357, borderSize,
42
);
ObjText_SetHorizontalAlignment(pivText, ALIGNMENT_CENTER);
if (GetCommonDataPtr(POINTER_CHAINCHECK, false) == true){
Obj_SetVisible(pivText, false);
}
else{
Obj_SetVisible(pivText, true);
}
ascent(i in 0..time){
ObjRender_SetY(pivText, Interpolate_Decelerate(enmY+offset, enmY+offset-yDes, i/time));
yield;
}
ascent(i in 0..timeDisappear){
ObjRender_SetAlpha(pivText, Interpolate_Decelerate(255, 0, i/timeDisappear));
yield;
}
Obj_Delete(pivText);
}
else{}
}

View file

@ -0,0 +1,115 @@
//let imgEffect = dirCurrent ~ "./img/Kevin_Effect.png";
int PetalEffect = ObjParticleList_Create(OBJ_PARTICLE_LIST_2D);
task InitEffect(){
_EffectListPreRender(PetalEffect, imgEffect, [0, 0, 256, 256]);
}
let imgEffect = dirCurrent ~ "./img/Kevin_Effect.png";
// Enemy deletion/explosion effects.
// This particle list is used for all instances of the effect.
task _EffectListPreRender(
int targetList,
texture, int[] rect
){
ObjPrim_SetTexture(targetList, texture);
Obj_SetRenderPriorityI(targetList, 39);
ObjPrim_SetPrimitiveType(targetList, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(targetList, 4);
ObjRender_SetBlendType(targetList, BLEND_ALPHA);
// Left-top, right-top, left-bottom, right-bottom
ObjPrim_SetVertexUVT(targetList, 0, rect[0], rect[1]);
ObjPrim_SetVertexUVT(targetList, 1, rect[2], rect[1]);
ObjPrim_SetVertexUVT(targetList, 2, rect[0], rect[3]);
ObjPrim_SetVertexUVT(targetList, 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(targetList, 0, -dU, -dV, 1);
ObjPrim_SetVertexPosition(targetList, 1, dU, -dV, 1);
ObjPrim_SetVertexPosition(targetList, 2, -dU, dV, 1);
ObjPrim_SetVertexPosition(targetList, 3, dU, dV, 1);
ObjPrim_SetVertexIndex(targetList, [0, 1, 2, 1, 2, 3]);
}
// Enemy go Boom
/*
5 flower petals appear from the enemy and spin outwards.
Their angle constantly changes and their alpha lowers over time.
*/
task _ExplosionEffect(float enmX, float enmY, int targetList){
int i = 0;
int effectLength = 45;
int effectNum = 5;
int dir = 1;
Obj_SetRenderPriorityI(targetList, 40);
//TExplosionA(enmX, enmY, 255/effectLength, 9/effectLength);
/*ascent(i in 0..effectNum){
_CreatePetal(prand(5, 10)*dir, prand(5, 10)*dir, prand(0, 360));
dir *= -1;
//_CreatePetal(prand(50, 80), prand(-80, -50), prand(0, 360));
}*/
_CreatePetal(prand(8, 11), prand(-8, -11), prand(0, 360));
_CreatePetal(prand(-11, -8), prand(-2, 2), prand(0, 360));
_CreatePetal(prand(8, 8), prand(-2, 2), prand(0, 360));
_CreatePetal(prand(-11, -8), prand(8, 11), prand(0, 360));
_CreatePetal(prand(8, 11), prand(8, 11), prand(0, 360));
ObjSound_Play(sfxBoom);
// Create a petal with:
// x offset every frame, y offset every frame
task _CreatePetal(float spdX, float spdY, float baseAng){
float x = enmX, y = enmY;
let x_speed = spdX;
let y_speed = spdY;
let z_add = prand(-5, 5);
ascent(i in 0..effectLength){
_PetalMovement(Interpolate_Decelerate(1.5, 0.5, i/effectLength), Interpolate_Decelerate(255, 0, i/effectLength));
yield;
}
task _PetalMovement(scale, alpha){
ObjParticleList_SetScale(targetList, scale);
ObjParticleList_SetAngleZ(targetList, baseAng);
ObjParticleList_SetPosition(targetList, x, y, 1);
ObjParticleList_SetAlpha(targetList, alpha);
//Submits the current data to an instance, cleared every frame.
ObjParticleList_AddInstance(targetList);
x += x_speed;
y += y_speed;
baseAng += z_add;
yield;
}
}
}

View file

@ -0,0 +1,263 @@
//一時停止中スクリプト
#include "script/KevinSystem/GeneralSoundLib.txt"
int STGWIDTH = GetStgFrameWidth();
int STGHEIGHT = GetStgFrameHeight();
@Initialize
{
_SoundTask();
ExtendSFX;
SetAutoDeleteObject(true);
TBackgroundNew(0, 0);
TMenu();
}
@MainLoop
{
yield;
}
@Finalize
{
}
task TBackgroundNew(renderX, renderY){
let objText = ObjText_Create();
ObjText_SetText(objText, ["Thank you for playing!", "このゲームを遊ぶをありがとうございました!"][GetCommonData("Language", 0)]);
ObjText_SetFontSize(objText, [38, 45][GetCommonData("Language", 0)]);
ObjText_SetFontType(objText, "コーポレート・ロゴ(ラウンド) ver2 Bold");
//ObjText_SetMaxWidth(objText, GetScreenWidth/2);
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
ObjText_SetFontBold(objText, true);
ObjText_SetFontColorTop(objText, 255, 255, 255);
ObjText_SetFontColorBottom(objText, 255, 255, 255);
ObjText_SetFontBorderType(objText, BORDER_FULL);
ObjText_SetFontBorderColor(objText, 0x7D39D9);
ObjText_SetFontBorderWidth(objText, 2);
Obj_SetRenderPriorityI(objText, 10);
ObjRender_SetX(objText, GetScreenWidth/2);
ObjRender_SetY(objText, 7.5*STGHEIGHT/8);
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
Obj_SetRenderPriorityI(obj, 1);
let currentFrameTexture = GetTransitionRenderTargetName();
ObjPrim_SetTexture(obj, currentFrameTexture);
ObjSprite2D_SetSourceRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
ObjSprite2D_SetDestRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
ObjRender_SetColor(obj, 0x593DA3);
}
task TBackground
{
task TVertex(var index, var left, var top, var right, var bottom)
{
ObjPrim_SetVertexPosition(obj, index + 0, left, top, 0);
ObjPrim_SetVertexPosition(obj, index + 1, left, bottom, 0);
ObjPrim_SetVertexPosition(obj, index + 2, right, top, 0);
ObjPrim_SetVertexPosition(obj, index + 3, right, top, 0);
ObjPrim_SetVertexPosition(obj, index + 4, left, bottom, 0);
ObjPrim_SetVertexPosition(obj, index + 5, right, bottom, 0);
ObjPrim_SetVertexUVT(obj, index + 0, left, top);
ObjPrim_SetVertexUVT(obj, index + 1, left, bottom);
ObjPrim_SetVertexUVT(obj, index + 2, right, top);
ObjPrim_SetVertexUVT(obj, index + 3, right, top);
ObjPrim_SetVertexUVT(obj, index + 4, left, bottom);
ObjPrim_SetVertexUVT(obj, index + 5, right, bottom);
//STGシーン内のみアニメーション
if(left >= 341 && right <= 937 && top >= 45 && bottom <= 677)
{
let alpha = 255;
while(alpha >= 128)
{
ObjPrim_SetVertexAlpha(obj, index + 0, alpha);
ObjPrim_SetVertexAlpha(obj, index + 1, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 2, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 3, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 4, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 5, alpha);
alpha -= 255 / frame;
yield;
}
}
}
//分割設定
let frame = 30;
let countH = 20; //分割数
let countV = 30;
let width = 1280 / countH;
let height = 720 / countV;
let target = GetTransitionRenderTargetName();
let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D); //2D頂点ブジェクト生成
ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(obj, countH * countV * 6);
Obj_SetRenderPriorityI(obj, 0); //描画優先度を設定
ObjPrim_SetTexture(obj, target); //テクスチャを設定
ascent(ix in 0.. countH)
{
ascent(iy in 0.. countV)
{
let index = (ix + iy * countH) * 6;
let left = ix * width;
let right = left + width;
let top = iy * height;
let bottom = top + height;
TVertex(index, left, top, right, bottom);
}
}
}
task TMenu
{
let selectIndex = 0;//選択位置
function TMenuItem(let index, let mx, let my, let text)
{
function CreateTextObject(let mx, let my, let text)
{
let obj = ObjText_Create();
ObjText_SetText(obj, text);
ObjText_SetFontSize(obj, 50);
ObjText_SetFontType(obj, "GravityRegular5");
ObjText_SetFontBold(obj, true);
ObjText_SetHorizontalAlignment(obj, ALIGNMENT_CENTER);
//ObjText_SetMaxWidth(obj, STGWIDTH);
ObjText_SetFontColorTop(obj, 155, 45, 175);
ObjText_SetFontColorBottom(obj, 200, 80, 255);
ObjText_SetFontBorderType(obj, BORDER_FULL);
ObjText_SetFontBorderColor(obj, 255, 255, 255);
ObjText_SetFontBorderWidth(obj, 3.5);
Obj_SetRenderPriorityI(obj, 10);
ObjRender_SetX(obj, mx);
ObjRender_SetY(obj, my);
return obj;
}
let objText = CreateTextObject(mx, my, text);
let objSelect = CreateTextObject(mx, my, text);
ObjRender_SetBlendType(objSelect, BLEND_ADD_RGB);
async{
loop
{
Obj_SetVisible(objSelect, index == selectIndex);
yield;
}
}
return objText;
}
//メニュー配置
let textchoices = ["THE END(?)"];
int x = prand_int(0, length(textchoices)-1);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 72);
ObjText_SetFontType(objText, "GravityBold8");
//ObjText_SetMaxWidth(objText, STGWIDTH);
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
ObjText_SetFontBold(objText, true);
ObjText_SetFontColorTop(objText, 75, 255, 255);
ObjText_SetFontColorBottom(objText, 180, 255, 255);
ObjText_SetFontBorderType(objText, BORDER_FULL);
ObjText_SetFontBorderColor(objText,0, 0, 0);
ObjText_SetFontBorderWidth(objText, 3);
Obj_SetRenderPriorityI(objText, 10);
ObjRender_SetX(objText, GetScreenWidth/2);
ObjRender_SetY(objText, 75);
let mx = GetScreenWidth/2;
let my = GetScreenHeight/4;
let texts = ["SAVE REPLAY", "TITLE", "RESTART"];
var countMenu = length(texts);
ascent(var iText in 0 .. countMenu)
{
int text = TMenuItem(iText, mx, my, texts[iText]);
my += 75;
}
//キー状態がリセットされるまで待機
while(GetVirtualKeyState(VK_PAUSE) != KEY_FREE){yield;}
//メニュー選択処理
let frameKeyHold = 0;//キー押しっぱなしフレーム数
//PauseGameSFX;
function CheckShotRelease {
return (GetVirtualKeyState(VK_OK) == KEY_HOLD);
}
int countA = 0;
loop
{
//決定
if(CheckShotRelease){yield; continue;}
if(GetVirtualKeyState(VK_OK) == KEY_PUSH)
{
let listResult = [RESULT_SAVE_REPLAY, RESULT_END, RESULT_RETRY];
SetScriptResult(listResult[selectIndex]);
CloseScript(GetOwnScriptID());
return;
}
//カーソル移動
if(GetVirtualKeyState(VK_UP) == KEY_PUSH)
{
selectIndex--;
}
else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH)
{
selectIndex++;
}
else if(GetVirtualKeyState(VK_UP) == KEY_HOLD)
{
frameKeyHold++;
if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0)))
{
selectIndex--;
}
}
else if(GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
{
frameKeyHold++;
if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0)))
{
selectIndex++;
}
}
else
{
frameKeyHold = 0;
}
if(selectIndex < 0)
{
selectIndex = countMenu - 1;
}
else
{
selectIndex %= countMenu;
}
yield;
}
}

View file

@ -0,0 +1,18 @@
const POINT_REGULAR = 1;
const POINT_RAINBOW = 2;
const POINT_BHESTIE = 3;
const POINT_CANCEL = 4;
const EXTEND_LIFE = 5;
const EXTEND_SPELL = 6;
const PIV_100 = 7;
const PIV_250 = 8;
const PIV_500 = 9;
const FRAGMENT_SPELL = 10;
const POINT_GOLD_SMALL = 11;
const POINT_GOLD_MEDIUM = 12;
const POINT_GOLD_LARGE = 13;
const SPECIAL_AMMO = 14;

View file

@ -0,0 +1,28 @@
#UserItemData
item_image = "./../img/yo.png"
ItemData { id=1 rect=(576, 256, 608, 288) } // Regular Point Item (PIV)
ItemData { id=2 rect=(384,128,512,256) } // Homosexual Point Item (PIV * 2)
ItemData { id=3 rect=(256,128,384,256) } // Bhestie Point Item (PIV * 2, 25% chance of drop)
ItemData { id=4 rect=(512,0,640,128) } // Cancel Item (PIV * O.2), erase bullets via bombs
ItemData { id=5 rect=(0,256,128,384) } // 1-up Item
ItemData { id=6 rect=(128,256,256,384) } // Spell Item
ItemData { id=7 rect=(256,384,384,512) fixed_angle = false angular_velocity = 3} // Green PIV Item (+100)
ItemData { id=8 rect=(512, 256, 576, 320) fixed_angle = false angular_velocity = 3} // Pink PIV Item (+250)
ItemData { id=9 rect=(384,256,512,384) fixed_angle = false angular_velocity = 3} // Gold PIV Item (+500)
ItemData { id=10 rect=(128,384,256,512) } // Spell Piece
// New point items
ItemData { id=11 rect=(608, 256, 640, 288) }
ItemData { id=12 rect=(640, 256, 704, 320) }
ItemData { id=13 rect=(576, 320, 640, 384) } // Large gold item (NARUMI_STG)
// Special ammo item
ItemData { id=14 rect=(576, 288, 608, 320) }

View file

@ -0,0 +1,173 @@
// Valid types: PIV_100, PIV_250, PIV_500
float universalItemAlpha = GetAreaCommonData("Config", "ItemOpacity", 60);
function CreatePIVItem(itemtype, x, y){
let PIVItem = CreateItemU1(itemtype, x, y, 0);
ObjItem_SetDefaultCollectMovement(PIVItem, false);
ObjItem_SetAutoDelete(PIVItem, false);
ObjMove_SetAngle(PIVItem, 90);
ObjMove_SetSpeed(PIVItem, -10);
ObjMove_SetAcceleration(PIVItem, 1);
ObjMove_SetMaxSpeed(PIVItem, 0);
ObjItem_SetIntersectionRadius(PIVItem, 60);
ObjRender_SetScaleXYZ(PIVItem, 2);
ObjRender_SetAlpha(PIVItem, 255*(universalItemAlpha/100));
return PIVItem;
}
function CreateAmmoItem(x, y){
let Item = CreateItemU1(SPECIAL_AMMO, x, y, 0);
ObjItem_SetDefaultCollectMovement(Item, false);
ObjItem_SetAutoDelete(Item, false);
ObjMove_SetAngle(Item, 90);
ObjMove_SetSpeed(Item, -10);
ObjMove_SetAcceleration(Item, 1);
ObjMove_SetMaxSpeed(Item, 0);
ObjItem_SetIntersectionRadius(Item, 60);
ObjRender_SetScaleXYZ(Item, 3);
ObjRender_SetAlpha(Item, 255*(universalItemAlpha/100));
return Item;
}
// Valid types: POINT_REGULAR, POINT_BHESTIE, POINT_RAINBOW
function CreateScoreItem(itemtype, x, y){
let ScoreItem = CreateItemU1(itemtype, x + rand(-60, 60), y + rand(-60, 60), 0);
ObjItem_SetDefaultCollectMovement(ScoreItem, false);
ObjItem_SetAutoDelete(ScoreItem, false);
ObjItem_SetAutoCollectEnableFlags(ScoreItem, ITEM_AUTOCOLLECT_ALL);
ObjMove_SetAngle(ScoreItem, 90);
ObjMove_SetSpeed(ScoreItem, -20);
ObjMove_SetAcceleration(ScoreItem, 1);
ObjMove_SetMaxSpeed(ScoreItem, 6);
ObjItem_SetIntersectionRadius(ScoreItem, 64);
ObjItem_SetRenderScoreEnable(ScoreItem, false);
ObjRender_SetAlpha(ScoreItem, 255*(universalItemAlpha/100));
ObjRender_SetScaleXYZ(ScoreItem, 3);
/*
if(itemtype == POINT_RAINBOW){
if(LoadAreaCommonDataValuePointer("PIV", "ChainGauge", 0) <= 32){
ObjSprite2D_SetSourceRect(ScoreItem, 608, 256, 640, 288);
}
else if(LoadAreaCommonDataValuePointer("PIV", "ChainGauge", 0) > 32 && LoadAreaCommonDataValuePointer("PIV", "ChainGauge", 0) < 64){
ObjSprite2D_SetSourceRect(ScoreItem, 640, 256, 704, 320);
}
else{
ObjSprite2D_SetSourceRect(ScoreItem, 704, 256, 768, 320);
}
}
*/
return ScoreItem;
}
function CreateCancelItem(x, y){
let CancelItem = CreateItemU1(POINT_CANCEL, x, y, 0);
ObjItem_SetDefaultCollectMovement(CancelItem, false);
/*async{
wait(45);
ObjItem_SetMoveToPlayer(CancelItem, true);
ObjMove_SetMaxSpeed(CancelItem, 24);
}*/
ObjItem_SetAutoCollectEnableFlags(CancelItem, ITEM_AUTOCOLLECT_ALL);
ObjItem_SetRenderScoreEnable(CancelItem, false);
ObjItem_SetIntersectionRadius(CancelItem, 60);
ObjRender_SetScaleXYZ(CancelItem, 0.6, 0.6, 1);
ObjRender_SetAlpha(CancelItem, 255*(universalItemAlpha/100));
async{
while(!Obj_IsDeleted(CancelItem)){
float angz = ObjRender_GetAngleZ(CancelItem);
ObjRender_SetAngleZ(CancelItem, angz+2);
yield;
}
}
return CancelItem;
}
// Valid types: EXTEND_LIFE, EXTEND_SPELL
function CreateExtendItem(itemtype, x, y){
let ExtendItem = CreateItemU2(itemtype, x, y, x, y-125, 0);
ObjItem_SetDefaultCollectMovement(ExtendItem, false);
//ObjItem_SetMoveToPlayer(ExtendItem, true);
ObjItem_SetAutoCollectEnableFlags(ExtendItem, ITEM_AUTOCOLLECT_ALL);
ObjMove_SetAngle(ExtendItem, 90);
ObjMove_SetSpeed(ExtendItem, -20);
ObjMove_SetAcceleration(ExtendItem, 1);
ObjMove_SetMaxSpeed(ExtendItem, 0);
ObjRender_SetScaleXYZ(ExtendItem, 1.5, 1.5, 1);
Obj_SetRenderPriorityI(ExtendItem, 49);
ObjItem_SetAutoDelete(ExtendItem, false);
/*async{
wait(30);
ObjItem_SetMoveToPlayer(ExtendItem, true);
//ObjMove_SetMaxSpeed(CancelItem, 24);
}*/
return ExtendItem;
}
// Summoning the actual items
function NonspellItemDrop(scene, x, y){
if(ObjEnemyBossScene_GetInfo(scene, INFO_PLAYER_SHOOTDOWN_COUNT) == 0){
loop(14){
CreateScoreItem(POINT_REGULAR, x+rand(-75, 75), y+rand(-45, 45));
}
}
else{
loop(8){
CreateScoreItem(POINT_REGULAR, x+rand(-75, 75), y+rand(-45, 45));
}
}
}
function SpellItemDrop(scene, x, y){
if(ObjEnemyBossScene_GetInfo(scene, INFO_PLAYER_SHOOTDOWN_COUNT) == 0 && ObjEnemyBossScene_GetInfo(scene, INFO_PLAYER_SPELL_COUNT) == 0){
loop(20){
CreateScoreItem(POINT_BHESTIE, x+rand(-75, 75), y+rand(-45, 45));
}
loop(10){
CreateScoreItem(POINT_REGULAR, x+rand(-75, 75), y+rand(-45, 45));
}
}
else if(ObjEnemyBossScene_GetInfo(scene, INFO_PLAYER_SHOOTDOWN_COUNT) == 0 && ObjEnemyBossScene_GetInfo(scene, INFO_PLAYER_SPELL_COUNT) >> 0){
loop(12){
CreateScoreItem(POINT_REGULAR, x+rand(-75, 75), y+rand(-45, 45));
}
}
else{}
}

View file

@ -0,0 +1,307 @@
//一時停止中スクリプト
//#include "./../../script/soundtask.txt"
#include "script/KevinSystem/GeneralSoundLib.txt"
int STGWIDTH = GetStgFrameWidth();
int STGHEIGHT = GetStgFrameHeight();
@Initialize
{
_SoundTask();
PauseGameSFX;
SetAutoDeleteObject(true);
//TBackground();
TBackgroundNew(0, 0);
TMenu();
TFunFact();
//_SoundTask;
}
@MainLoop
{
yield;
}
@Finalize
{
}
task TFunFact(){
//int y = 0;
let textchoices = [
["There's no Marisa.[r]She's busy exploding somewhere else.",
"Touhou.",
"Narumi actually doesn't know how to ski.",
"Thanks for playing this game!",
"You can set the amount of starting lives you have in the configurations menu."],
["太陽は実際に暑いエッグタルト、ね?",
"東方.",
"このゲームの開発元の一番好きなキャラクターは『僕のヒーローアカデミア』の『口田甲司』ですよ![r]口田くんはすごいとかわいいね...",
"このゲームを遊ぶをありがとうございました!",
"あなたは『OPTIONS』のメニューにはライフカウンターを変化することができます。"],
];
int x = prand_int(0, length(textchoices[GetCommonData("Language", 0)])-1);
//y = length(textchoices);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[GetCommonData("Language", 0)][x]);
ObjText_SetFontSize(objText, [30, 32][GetCommonData("Language", 0)]);
ObjText_SetFontType(objText, "コーポレート・ロゴ(ラウンド) ver2 Bold");
//ObjText_SetMaxWidth(objText, GetScreenWidth/2);
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
ObjText_SetFontBold(objText, true);
ObjText_SetFontColorTop(objText, 255, 255, 255);
ObjText_SetFontColorBottom(objText, 255, 255, 255);
ObjText_SetFontBorderType(objText, BORDER_FULL);
ObjText_SetFontBorderColor(objText, 0x7D39D9);
ObjText_SetFontBorderWidth(objText, 2);
Obj_SetRenderPriorityI(objText, 10);
ObjRender_SetX(objText, GetScreenWidth/2);
ObjRender_SetY(objText, 7.5*STGHEIGHT/9);
}
// renderX and renderY will be TOP-LEFT COORDS
task TBackgroundNew(float renderX, renderY){
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
Obj_SetRenderPriorityI(obj, 1);
let currentFrameTexture = GetTransitionRenderTargetName();
ObjPrim_SetTexture(obj, currentFrameTexture);
ObjSprite2D_SetSourceRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
ObjSprite2D_SetDestRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
ObjRender_SetColor(obj, 0x593DA3);
}
task TBackground
{
task TVertex(var index, var left, var top, var right, var bottom)
{
ObjPrim_SetVertexPosition(obj, index + 0, left, top, 0);
ObjPrim_SetVertexPosition(obj, index + 1, left, bottom, 0);
ObjPrim_SetVertexPosition(obj, index + 2, right, top, 0);
ObjPrim_SetVertexPosition(obj, index + 3, right, top, 0);
ObjPrim_SetVertexPosition(obj, index + 4, left, bottom, 0);
ObjPrim_SetVertexPosition(obj, index + 5, right, bottom, 0);
ObjPrim_SetVertexUVT(obj, index + 0, left, top);
ObjPrim_SetVertexUVT(obj, index + 1, left, bottom);
ObjPrim_SetVertexUVT(obj, index + 2, right, top);
ObjPrim_SetVertexUVT(obj, index + 3, right, top);
ObjPrim_SetVertexUVT(obj, index + 4, left, bottom);
ObjPrim_SetVertexUVT(obj, index + 5, right, bottom);
//STGシーン内のみアニメーション
if(left >= 341 && right <= 937 && top >= 45 && bottom <= 677)
{
let alpha = 255;
while(alpha >= 128)
{
ObjPrim_SetVertexAlpha(obj, index + 0, alpha);
ObjPrim_SetVertexAlpha(obj, index + 1, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 2, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 3, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 4, alpha/2);
ObjPrim_SetVertexAlpha(obj, index + 5, alpha);
alpha -= 255 / frame;
yield;
}
}
}
//分割設定
let frame = 30;
let countH = 20; //分割数
let countV = 30;
let width = 1280 / countH;
let height = 720 / countV;
let target = GetTransitionRenderTargetName();
let obj = ObjPrim_Create(OBJ_PRIMITIVE_2D); //2D頂点ブジェクト生成
ObjPrim_SetPrimitiveType(obj, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(obj, countH * countV * 6);
Obj_SetRenderPriorityI(obj, 0); //描画優先度を設定
ObjPrim_SetTexture(obj, target); //テクスチャを設定
ascent(ix in 0.. countH)
{
ascent(iy in 0.. countV)
{
let index = (ix + iy * countH) * 6;
let left = ix * width;
let right = left + width;
let top = iy * height;
let bottom = top + height;
TVertex(index, left, top, right, bottom);
}
}
}
task TMenu
{
let selectIndex = 0;//選択位置
function TMenuItem(let index, let mx, let my, let text)
{
function CreateTextObject(let mx, let my, let text)
{
let obj = ObjText_Create();
ObjText_SetText(obj, text);
ObjText_SetFontSize(obj, 50);
ObjText_SetFontType(obj, "GravityRegular5");
ObjText_SetFontBold(obj, true);
ObjText_SetHorizontalAlignment(obj, ALIGNMENT_CENTER);
//ObjText_SetMaxWidth(obj, STGWIDTH);
ObjText_SetFontColorTop(obj, 155, 45, 175);
ObjText_SetFontColorBottom(obj, 200, 80, 255);
ObjText_SetFontBorderType(obj, BORDER_FULL);
ObjText_SetFontBorderColor(obj, 255, 255, 255);
ObjText_SetFontBorderWidth(obj, 3.5);
Obj_SetRenderPriorityI(obj, 10);
ObjRender_SetX(obj, mx);
ObjRender_SetY(obj, my);
return obj;
}
let objText = CreateTextObject(mx, my, text);
let objSelect = CreateTextObject(mx, my, text);
ObjRender_SetBlendType(objSelect, BLEND_ADD_RGB);
async{
loop
{
Obj_SetVisible(objSelect, index == selectIndex);
yield;
}
}
return objText;
}
//メニュー配置
let textchoices = ["Game Paused", "Too Much Snow."];
int x = prand_int(0, length(textchoices)-1);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 72);
ObjText_SetFontType(objText, "GravityBold8");
//ObjText_SetMaxWidth(objText, STGWIDTH);
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
ObjText_SetFontBold(objText, true);
ObjText_SetFontColorTop(objText, 75, 255, 255);
ObjText_SetFontColorBottom(objText, 180, 255, 255);
ObjText_SetFontBorderType(objText, BORDER_FULL);
ObjText_SetFontBorderColor(objText,0, 0, 0);
ObjText_SetFontBorderWidth(objText, 3);
Obj_SetRenderPriorityI(objText, 10);
ObjRender_SetX(objText, GetScreenWidth/2);
ObjRender_SetY(objText, 75);
let mx = GetScreenWidth/2;
let my = GetScreenHeight/3;
let texts = ["RESUME", "TITLE", "RESTART"];
var countMenu = length(texts);
ascent(var iText in 0 .. countMenu)
{
int text = TMenuItem(iText, mx, my, texts[iText]);
my += 75;
}
//キー状態がリセットされるまで待機
while(GetVirtualKeyState(VK_PAUSE) != KEY_FREE){yield;}
//メニュー選択処理
let frameKeyHold = 0;//キー押しっぱなしフレーム数
//PauseGameSFX;
loop
{
//決定
if(GetVirtualKeyState(VK_OK) == KEY_PULL)
{
let listResult = [RESULT_CANCEL, RESULT_END, RESULT_RETRY];
SetScriptResult(listResult[selectIndex]);
CloseScript(GetOwnScriptID());
return;
}
//キャンセル
if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL || GetVirtualKeyState(VK_PAUSE) == KEY_PULL)
{
SetScriptResult(RESULT_CANCEL);
CloseScript(GetOwnScriptID());
return;
}
//カーソル移動
if(GetVirtualKeyState(VK_UP) == KEY_PUSH)
{
SelectOptionSFX;
selectIndex--;
}
else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH)
{
SelectOptionSFX;
selectIndex++;
}
else if(GetVirtualKeyState(VK_UP) == KEY_HOLD)
{
frameKeyHold++;
if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0)))
{
SelectOptionSFX;
selectIndex--;
}
}
else if(GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
{
frameKeyHold++;
if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0)))
{
SelectOptionSFX;
selectIndex++;
}
}
else
{
frameKeyHold = 0;
}
if(selectIndex < 0)
{
selectIndex = countMenu - 1;
}
else
{
selectIndex %= countMenu;
}
if(GetKeyState(KEY_R) == KEY_PUSH){
SetScriptResult(RESULT_RETRY);
CloseScript(GetOwnScriptID());
return;
}
if(GetKeyState(KEY_Q) == KEY_PUSH){
SetScriptResult(RESULT_END);
CloseScript(GetOwnScriptID());
return;
}
yield;
}
}

View file

@ -0,0 +1,437 @@
//リプレイ保存スクリプト
int STGWIDTH = GetStgFrameWidth();
int STGHEIGHT = GetStgFrameHeight();
@Initialize
{
SetAutoDeleteObject(true);
LoadReplayList();
TBackgroundNew(0, 0);
TReplayIndexSelection();
}
@MainLoop
{
yield;
}
@Finalize
{
}
let MENU_INDEX_SELECTION = 1;
let MENU_NAME_ENTRY = 2;
let menuMode = MENU_INDEX_SELECTION;
function DigitToCommaArray(num){ //Natashinitai
let srcStr = IntToString(num);
let res = [];
let nChar = 0;
for(let i = length(srcStr) - 1; i >= 0; i--){
res = [srcStr[i]] ~ res;
nChar++;
if(nChar % 3 == 0 && i > 0) res = "," ~ res;
}
return res;
}
function CreateTextObject(let mx, let my, float size, let text)
{
let obj = ObjText_Create();
ObjText_SetText(obj, text);
ObjText_SetFontSize(obj, size);
ObjText_SetFontType(obj, "Unispace");
ObjText_SetFontBold(obj, true);
ObjText_SetHorizontalAlignment(obj, ALIGNMENT_LEFT);
//ObjText_SetMaxWidth(obj, STGWIDTH);
ObjText_SetFontColorTop(obj, 155, 45, 175);
ObjText_SetFontColorBottom(obj, 200, 80, 255);
ObjText_SetFontBorderType(obj, BORDER_FULL);
ObjText_SetFontBorderColor(obj, 255, 255, 255);
ObjText_SetFontBorderWidth(obj, 3);
Obj_SetRenderPriorityI(obj, 10);
ObjRender_SetX(obj, mx);
ObjRender_SetY(obj, my);
return obj;
}
// renderX and renderY will be TOP-LEFT COORDS
task TBackgroundNew(float renderX, renderY){
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
Obj_SetRenderPriorityI(obj, 1);
let currentFrameTexture = GetTransitionRenderTargetName();
ObjPrim_SetTexture(obj, currentFrameTexture);
ObjSprite2D_SetSourceRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
ObjSprite2D_SetDestRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
ObjRender_SetColor(obj, 0x593DA3);
}
task TReplayIndexSelection()
{
let cursorY = 0;
let page = 0;
let countMaxItem = REPLAY_INDEX_DIGIT_MAX - REPLAY_INDEX_DIGIT_MIN + 1;
let countItemPerPage = 10;
let pageMax = trunc((countMaxItem - 1) / countItemPerPage);
pageMax = max(pageMax, 1);
let lastPageMaxCursorY = trunc(countMaxItem / countItemPerPage);
task TMenuItem(let itemY)
{
let objText = CreateTextObject(90, 45 + 35 * itemY, 28, "");
let objSelect = CreateTextObject(90, 45 + 35 * itemY, 28, "");
ObjRender_SetAlpha(objText, 125);
ObjRender_SetAlpha(objSelect, 80);
ObjRender_SetBlendType(objSelect, BLEND_ADD_ARGB);
let oldPage = -1;
while(menuMode == MENU_INDEX_SELECTION)
{
if(page != oldPage)
{
let index = page * countItemPerPage + itemY + 1;
let text = rtos("00", index) ~ " ";
if(IsValidReplayIndex(index))
{
text = text ~ vtos("-8s", GetReplayInfo(index, REPLAY_USER_NAME)) ~ " ";
text = text ~ GetReplayInfo(index, REPLAY_DATE_TIME) ~ " ";
text = text ~ DigitToCommaArray(trunc(GetReplayInfo(index, REPLAY_TOTAL_SCORE)/10)*10) ~ " ";
text = text ~ GetReplayInfo(index, REPLAY_PLAYER_NAME) ~ " ";
text = text ~ GetReplayUserData(index, "Difficulty");
/*
SetReplayUserData("Starting Lives", GetCommonData("Starting Lives Selected", 5));
SetReplayUserData("Player", GetReplayInfo(index, REPLAY_PLAYER_NAME));
SetReplayUserData("Difficulty", GetCommonData("Difficulty", "Hard"));
*/
}
else
{
text = text ~ "Entry Blank";
}
ObjText_SetText(objText, text);
ObjText_SetText(objSelect, text);
oldPage = page;
}
if(page == pageMax && itemY >= lastPageMaxCursorY)
{
Obj_SetVisible(objText, false);
Obj_SetVisible(objSelect, false);
}
else
{
Obj_SetVisible(objText, true);
Obj_SetVisible(objSelect, itemY == cursorY);
}
yield;
}
Obj_Delete(objText);
Obj_Delete(objSelect);
}
ascent(let iItem in 0 .. countItemPerPage)
{
TMenuItem(iItem);
}
//キー状態がリセットされるまで待機
while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;}
//キー処理
let frameKeyHold = 0;//キー押しっぱなしフレーム数
while(menuMode == MENU_INDEX_SELECTION)
{
//決定
if(GetVirtualKeyState(VK_OK) == KEY_PULL)
{
menuMode = MENU_NAME_ENTRY;
let index = page * countItemPerPage + cursorY + 1;
TNameEntry(index);
break;
}
if(GetVirtualKeyState(VK_CANCEL) == KEY_PUSH){
SetScriptResult(RESULT_END);
CloseScript(GetOwnScriptID());
}
//カーソル移動
if(GetVirtualKeyState(VK_UP) == KEY_PUSH || GetVirtualKeyState(VK_UP) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_UP) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
cursorY--;
}
}
else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH || GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
cursorY++;
}
}
else if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
page--;
}
}
else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
page++;
}
}
else
{
frameKeyHold = 0;
}
if(page < 0)
{
page = pageMax;
}
else if(page > pageMax)
{
page = 0;
}
if(page != pageMax)
{
if(cursorY < 0)
{
cursorY = countItemPerPage - 1;
}
else if(cursorY >= countItemPerPage)
{
cursorY = 0;
}
}
else
{
if(cursorY < 0)
{
cursorY = lastPageMaxCursorY - 1;
}
else if(cursorY >= lastPageMaxCursorY)
{
cursorY = 0;
}
}
yield;
}
}
task TNameEntry(let replayIndex)
{
let strTextIn =
[
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"],
["Q","R","S","T","U","V","W","X","Y","Z",".",",",":",";","_","@"],
["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p"],
["q","r","s","t","u","v","w","x","y","z","+","-","/","*","=","%"],
["0","1","2","3","4","5","6","7","8","9","0","!","?","'","\"","$"],
["(",")","{","}","[","]","<",">","&","#","|","~","^"," "," ","終"]
];
let strTextView =
[
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P"],
["Q","R","S","T","U","V","W","X","Y","Z",".",",",":",";","_","@"],
["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p"],
["q","r","s","t","u","v","w","x","y","z","+","-","/","*","=","%"],
["0","1","2","3","4","5","6","7","8","9","0","!","?","'","\"","$"],
["(",")","{","}","&osb;","&csb;","<",">","&","#","|","~","^"," "," ","»"]
];
let cursorX = 0;
let cursorY = 0;
let maxCursorX = length(strTextIn[0]);
let maxCursorY = length(strTextIn);
task TMenuItem(let itemX, let itemY)
{
let objText = CreateTextObject(GetStgFrameWidth()/4 + itemX * 42, 400 + itemY * 42, 40, strTextView[itemY][itemX]);
let objSelect = CreateTextObject(GetStgFrameWidth()/4+ itemX * 42, 400 + itemY * 42, 40, strTextView[itemY][itemX]);
ObjRender_SetBlendType(objSelect, BLEND_ADD_ARGB);
while(menuMode == MENU_NAME_ENTRY)
{
Obj_SetVisible(objSelect, itemX == cursorX && itemY == cursorY);
yield;
}
Obj_Delete(objText);
Obj_Delete(objSelect);
}
ascent(let iY in 0..maxCursorY)
{
ascent(let iX in 0 .. maxCursorX)
{
TMenuItem(iX, iY);
}
}
//キー状態がリセットされるまで待機
while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;}
//入力済み文字
let userName = "";
let objName = CreateTextObject(GetStgFrameWidth()/4, 200, 45, "");
task TNameCursor()
{
let objCursor = CreateTextObject(GetStgFrameWidth()/4, 200, 45, "_");
while(menuMode == MENU_NAME_ENTRY)
{
let nameLength = length(userName);
ObjRender_SetX(objCursor, GetStgFrameWidth()/4 + nameLength * 30);
Obj_SetVisible(objCursor, nameLength < 8);
yield;
}
Obj_Delete(objCursor);
}
TNameCursor;
//キー処理
let frameKeyHold = 0;//キー押しっぱなしフレーム数
while(menuMode == MENU_NAME_ENTRY)
{
if(GetVirtualKeyState(VK_OK) == KEY_PULL)
{
//決定
let nameLength = length(userName);
if(cursorX == maxCursorX-1 && cursorY == maxCursorY-1)
{
//終了キー
if(nameLength == 0)
{
userName = "Gay";
}
else
{
SetReplayUserData("Starting Lives", GetCommonData("Starting Lives Selected", 5));
SetReplayUserData("Player Team", GetCommonData("Player Team", "ByakMiko"));
SetReplayUserData("Difficulty", GetCommonData("Difficulty", "Standard"));
SetReplayUserData("Dialogue Skip", GetCommonData("Dialogue Skip Mode", 0));
SaveReplay(replayIndex, userName);
SetScriptResult(RESULT_END);
CloseScript(GetOwnScriptID());
return;
}
}
else if(nameLength < 8)
{
userName = userName ~ strTextIn[cursorY][cursorX];
}
}
if(GetVirtualKeyState(VK_CANCEL) == KEY_PULL)
{
//キャンセル
let nameLength = length(userName);
if(nameLength > 0)
{
userName = userName[0..nameLength-1];
}
else{menuMode = MENU_INDEX_SELECTION; TReplayIndexSelection(); break;}
}
ObjText_SetText(objName, userName);
//カーソル移動
if(GetVirtualKeyState(VK_UP) == KEY_PUSH || GetVirtualKeyState(VK_UP) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_UP) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
cursorY--;
}
}
else if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH || GetVirtualKeyState(VK_DOWN) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_DOWN) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
cursorY++;
}
}
else if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
cursorX--;
}
}
else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD)
{
frameKeyHold++;
if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH ||
frameKeyHold == 20 ||
(frameKeyHold > 20 && (frameKeyHold % 10 == 0)))
{
cursorX++;
}
}
else
{
frameKeyHold = 0;
}
if(cursorX < 0)
{
cursorX = maxCursorX-1;
}
else if(cursorX >= maxCursorX)
{
cursorX = 0;
}
if(cursorY < 0)
{
cursorY = maxCursorY-1;
}
else if(cursorY >= maxCursorY)
{
cursorY = 0;
}
yield;
}
}

View file

@ -0,0 +1,80 @@
//Custom events
const EV_START_MUSIC = EV_USER + 411i;
const EV_BOSS_MUSIC = EV_USER + 412i;
const EV_DROP_POINT_ENEMY = EV_USER + 200i;
const EV_DROP_PIV_ENEMY = EV_USER + 201i;
const EV_SINGLE_ITEM_DROP = EV_USER + 202i;
const EV_DROP_EXTEND = EV_USER + 203i;
const EV_DROP_AMMO_ENEMY = EV_USER + 204i;
const EV_EXPLODE = EV_USER + 300i;
// Chain events
const EV_CHAIN_MAX = EV_USER + 301i; // Play sound effect when chain is max
const EV_CHAIN_RELEASE = EV_USER + 302i; // Make enemies drop golden point items when chain is cashed in
const EV_CHAIN_END = EV_USER + 303i; // End/reset chain when gauge goes to 0
const CHAIN_MAX = 64;
// Card shop events
const EV_SHOP_CALL = EV_USER + 400i; // Call shop (in stage)
const EV_SHOP_OPEN = EV_USER + 401i; // Request to open shop (in player script) when CALL is notified
const EV_SHOP_GAIN = EV_USER + 402i; // Shop is opened in package. Afterwards, add ability via notifying this event (in player script)
// Convenience constants
const STG_WIDTH = GetStgFrameWidth();
const STG_HEIGHT = GetStgFrameHeight();
// Card names
const CARD_NAMES =
[
// Shop 1
"Hitchcock Birds",
"Turtle Cannon",
"Phoenix Feather",
"Devil's Crown",
// Shop 2
"Irresistible Demand",
"Danmaku Catcher",
"Mango Jam",
"Cucumber Jam",
// Shop 3
"K*taka Fried Chicken",
"Magic Absorber",
"Warrior's Breastplate",
"20/20 Goggles",
// Shop 4
"Fossil Spear",
"Oni's Cursed Gourd",
"Bee-Powered Laser",
"Radiant Warrior",
// Final Shop
"Blacksmith's Offer",
"Potionmaker's Mist",
"Marketeer's Rainbow"
];
// Misc
const EFFECTCUT_PTR = LoadAreaCommonDataValuePointer("Config", "EffectCut", 0);
const ITEMID_PTR = LoadAreaCommonDataValuePointer("ScriptID", "ItemID", 0);
const SYSTEMID_PTR = LoadAreaCommonDataValuePointer("ScriptID", "SystemID", 0);
const FLYINGENM_PTR = LoadCommonDataValuePointer("Flying Defeated", 0);
const GROUNDENM_PTR = LoadCommonDataValuePointer("Ground Defeated", 0);