Add existing file

This commit is contained in:
kevinmonitor 2022-08-20 12:42:00 +07:00
parent 9bedcb263d
commit d6a4b8bf20
320 changed files with 20855 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", 80);
LoadEx(LifeSFX, itemlib ~ "bfxr_LifeExtend.wav", 80);
LoadEx(CancelSFX, itemlib ~ "bfxr_GetItemCancel.wav", 20);
LoadEx(RegularItemSFX, itemlib ~ "bfxr_GetItem1.wav", 40);
LoadEx(SpecialItemSFX, itemlib ~ "bfxr_GetItemSpecial.wav", 40);
}
// Functions to load sounds in scripts

View file

@ -0,0 +1,276 @@
// Item script
#include "./Kevin_ItemConst.txt"
#include "./Kevin_ItemLib.txt"
#include "./ItemSoundLib.txt"
//#include "./Kevin_ItemData.txt;
float PIV = 0;
@Initialize{
SetAutoDeleteObject(true);
_ItemSoundTask();
SetDefaultBonusItemEnable(false);
LoadItemData(GetCurrentScriptDirectory ~ "./Kevin_ItemData.txt");
}
@MainLoop{
PIV = GetAreaCommonData("PIV", "currentvalue", 0);
yield;
}
@Event
{
alternative (GetEventType())
case (EV_GET_ITEM){
let obj = GetEventArgument(0);
alternative(obj)
case(POINT_REGULAR) { AddScore(GetAreaCommonData("PIV", "currentvalue", 0)); ObjSound_Play(CancelSFX);}
case(POINT_BHESTIE) { AddScore(2*GetAreaCommonData("PIV", "currentvalue", 0)); ObjSound_Play(SpecialItemSFX);}
case(POINT_RAINBOW) { AddScore(2*GetAreaCommonData("PIV", "currentvalue", 0)); ObjSound_Play(SpecialItemSFX);}
case(POINT_CANCEL) { AddScore(0.05*GetAreaCommonData("PIV", "currentvalue", 0)); ObjSound_Play(CancelSFX);}
case(EXTEND_LIFE) { AddScore(PIV); SetPlayerLife(GetPlayerLife()+1); ObjSound_Play(SpellSFX);}
case(EXTEND_SPELL) { AddScore(PIV); SetPlayerSpell(GetPlayerSpell()+1); ObjSound_Play(SpecialItemSFX);}
case(PIV_100) { SetAreaCommonData("PIV", "currentvalue", GetAreaCommonData("PIV", "currentvalue", 0)+100);} //ObjSound_Play(CancelSFX);}
case(PIV_250) { SetAreaCommonData("PIV", "currentvalue", GetAreaCommonData("PIV", "currentvalue", 0)+250);} //ObjSound_Play(CancelSFX);}
case(PIV_500) { SetAreaCommonData("PIV", "currentvalue", GetAreaCommonData("PIV", "currentvalue", 0)+500);} //ObjSound_Play(CancelSFX);}
}
case (EV_DELETE_SHOT_TO_ITEM){
float[] position = GetEventArgument(1);
CreateCancelItem(position[0], position[1]);
}
case (EV_CANCEL_ITEM) {
let obj = GetEventArgument(0);
let type = GetEventArgument(1);
_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));
}
// 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, int killTimer, int maxTimer, int pointMin, int pointMax){
// If the player kills enemy within maxTimer, the enemy drops the maximum amount of point items
int pointFinal = Interpolate_Smooth(pointMin, pointMax, min(1, maxTimer/killTimer));
//WriteLog(pointFinal);
loop(pointFinal){
CreateScoreItem(POINT_REGULAR, posEnm[0]+rand(-60, 60), posEnm[1]+rand(-60, 60));
}
_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));
}
_ScorePopup(posEnm[0], posEnm[1], "PIV", 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){
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 = 75;
float yDes = 60; // Destination text object moves to, relative to enmY
string font = "Unispace";
float borderSize = 6;
if (type == "POINT"){
int pointText = CreateTextObject(
enmX, enmY, size,
"x" ~ IntToString(itemNum), font,
0x7699FF, 0xFFFFFF,
0x2A00C0, borderSize,
42
);
ObjText_SetHorizontalAlignment(pointText, ALIGNMENT_CENTER);
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{
int pivText = CreateTextObject(
enmX, enmY+offset, size,
"x" ~ IntToString(itemNum), font,
0xFFB4EC, 0xFFFFFF,
0xB200AD, borderSize,
42
);
ObjText_SetHorizontalAlignment(pivText, ALIGNMENT_CENTER);
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);
}
}

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![r]Until the next pride...");
ObjText_SetFontSize(objText, 36);
ObjText_SetFontType(objText, "Connecting Chain Handserif");
//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, 8*STGHEIGHT/9);
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, 65);
ObjText_SetFontType(obj, "Connecting Chain Handserif");
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 = ["End of a Journey"];
int x = prand_int(0, length(textchoices)-1);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 150);
ObjText_SetFontType(objText, "Anke Calligraph");
//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, 100);
let mx = GetScreenWidth/2;
let my = GetScreenHeight/4;
let texts = ["Save A Replay", "Depart From The Market", "Re-enter The Parade"];
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,13 @@
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;

View file

@ -0,0 +1,16 @@
#UserItemData
item_image = "./../img/yo.png"
ItemData { id=1 rect=(256,256,384,384) } // 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=(384,384,512,512) 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

View file

@ -0,0 +1,146 @@
// Valid types: PIV_100, PIV_250, PIV_500
float universalItemAlpha = GetAreaCommonData("Config", "ItemOpacity", 60);
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;
function CreatePIVItem(itemtype, x, y){
let PIVItem = CreateItemU1(itemtype, x, y, 0);
ObjItem_SetDefaultCollectMovement(PIVItem, false);
async{
wait(20);
ObjMove_SetMaxSpeed(PIVItem, 24);
ObjItem_SetMoveToPlayer(PIVItem, true);
}
//ObjItem_SetAutoCollectEnableFlags(PIVItem, ITEM_AUTOCOLLECT_ALL);
ObjItem_SetIntersectionRadius(PIVItem, 60);
ObjRender_SetScaleXYZ(PIVItem, 0.85, 0.85, 1);
ObjRender_SetAlpha(PIVItem, 255*(universalItemAlpha/100));
async{
while(!Obj_IsDeleted(PIVItem)){
float angz = ObjRender_GetAngleZ(PIVItem);
ObjRender_SetAngleZ(PIVItem, angz+3.5);
yield;
}
}
return PIVItem;
}
// 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);
async{
wait(45);
ObjItem_SetMoveToPlayer(ScoreItem, true);
}
//ObjItem_SetAutoCollectEnableFlags(ScoreItem, ITEM_AUTOCOLLECT_ALL);
ObjItem_SetIntersectionRadius(ScoreItem, 60);
ObjItem_SetRenderScoreEnable(ScoreItem, false);
//ObjRender_SetScaleXYZ(ScoreItem, 0.7, 0.7, 1);
ObjRender_SetAlpha(ScoreItem, 255*(universalItemAlpha/100));
//ObjMove_AddPatternA2(ScoreItem, 60, NO_CHANGE, 90, 0.12, 5.45, 0);
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);
ObjRender_SetScaleXYZ(ExtendItem, 1.5, 1.5, 1);
Obj_SetRenderPriorityI(ExtendItem, 49);
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,298 @@
//一時停止中スクリプト
//#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 = [
"The sun is just a really hot egg tart, if you think about it.",
"Gay people.",
"You know what else is as cool as gay Touhous? It's Kouji Kouda[r]from the hit anime \"Boku no Hero Academia\"- *turns into a Kouda plushie*",
"Thanks for playing this game! I hope you enjoyed my gay Touhou endeavours.",
"You can set the amount of starting lives you have in the configurations menu.[r]If you have trouble with difficult patterns or stage sections, now you can blast right through them!"
];
int x = prand_int(0, length(textchoices)-1);
//y = length(textchoices);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 36);
ObjText_SetFontType(objText, "Connecting Chain Handserif");
//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, 8*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, 65);
ObjText_SetFontType(obj, "Connecting Chain Handserif");
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 = ["Market Moratorium", "Respite from the Parade", "Worthy Rest"];
int x = prand_int(0, length(textchoices)-1);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 150);
ObjText_SetFontType(objText, "Anke Calligraph");
//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, 100);
let mx = GetScreenWidth/2;
let my = GetScreenHeight/4;
let texts = ["Resume The Faceoff", "Accept Your Losses", "Take Another Shot"];
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,421 @@
//リプレイ保存スクリプト
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 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 = 20;
let pageMax = trunc((countMaxItem - 1) / countItemPerPage);
pageMax = max(pageMax, 1);
let lastPageMaxCursorY = trunc(countMaxItem / countItemPerPage);
task TMenuItem(let itemY)
{
let objText = CreateTextObject(90, 45 + 50 * itemY, 35, "");
let objSelect = CreateTextObject(90, 45 + 50 * itemY, 35, "");
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 ~ rtos("000000000000", GetReplayInfo(index, REPLAY_TOTAL_SCORE)) ~ " ";
text = text ~ GetReplayInfo(index, REPLAY_PLAYER_NAME) ~ " ";
text = text ~ GetReplayUserData(index, "Difficulty");
/*SetReplayUserData("Starting Lives", GetCommonData("Starting Lives Selected", 5));
SetReplayUserData("Player Team", GetReplayInfo(index, REPLAY_PLAYER_NAME));
SetReplayUserData("Difficulty", GetCommonData("Difficulty", "Arcade"));*/
}
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(360 + GetStgFrameWidth()/4 + itemX * 42, 400 + itemY * 42, 40, strTextView[itemY][itemX]);
let objSelect = CreateTextObject(360 + 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(360+GetStgFrameWidth()/4, 200, 45, "");
task TNameCursor()
{
let objCursor = CreateTextObject(360+GetStgFrameWidth()/4, 200, 45, "_");
while(menuMode == MENU_NAME_ENTRY)
{
let nameLength = length(userName);
ObjRender_SetX(objCursor, 360+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", "Arcade"));
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,46 @@
// Item script
#include "./Kevin_ItemConst.txt"
#include "./Kevin_ItemLib.txt"
//#include "./Kevin_ItemData.txt"
@Initialize{
SetAutoDeleteObject(true);
SetDefaultBonusItemEnable(true);
LoadItemData(GetCurrentScriptDirectory ~ "./Kevin_ItemData.txt");
}
@MainLoop{
yield;
}
@Event
{
alternative (GetEventType)
case (EV_GET_ITEM){
let obj = GetEventArgument(0);
alternative(obj)
case(POINT_REGULAR){ AddScore(GetAreaCommonData("PIV", "currentvalue", 0));}
case(POINT_BHESTIE){ AddScore(2*GetAreaCommonData("PIV", "currentvalue", 0));}
case(EXTEND_LIFE){ AddScore(50000); SetPlayerLife(GetPlayerLife()+1);}
case(EXTEND_SPELL){ AddScore(50000); SetPlayerSpell(GetPlayerSpell()+1);}
case(PIV_100){ SetAreaCommonData("PIV", "currentvalue", GetAreaCommonData("PIV", "currentvalue", 0)+100);}
case(PIV_250){ SetAreaCommonData("PIV", "currentvalue", GetAreaCommonData("PIV", "currentvalue", 0)+250);}
case(PIV_500){ SetAreaCommonData("PIV", "currentvalue", GetAreaCommonData("PIV", "currentvalue", 0)+500);}
}
case (EV_DELETE_SHOT_TO_ITEM){
}
case (EV_COLLECT_ITEM){
let obj = GetEventArgument(1);
ObjMove_SetAcceleration(obj, 0.85);
ObjMove_SetMaxSpeed(obj, 12);
}
}

View file

@ -0,0 +1,292 @@
//一時停止中スクリプト
#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 clearText = ObjText_Create();
ObjText_SetText(clearText, "Congratulations on clearing the game![r]Until the next convocation...");
ObjText_SetFontSize(clearText, 18.5);
ObjText_SetFontType(clearText, "Connecting Chain Handserif");
ObjText_SetMaxWidth(clearText, STGWIDTH);
ObjText_SetHorizontalAlignment(clearText, ALIGNMENT_CENTER);
ObjText_SetFontBold(clearText, true);
ObjText_SetFontColorTop(clearText, 255, 255, 255);
ObjText_SetFontColorBottom(clearText, 255, 255, 255);
ObjText_SetFontBorderType(clearText, BORDER_FULL);
ObjText_SetFontBorderColor(clearText, 0x7D39D9);
ObjText_SetFontBorderWidth(clearText, 2);
Obj_SetRenderPriorityI(clearText, 10);
ObjRender_SetX(clearText, STGWIDTH-255);
ObjRender_SetY(clearText, STGHEIGHT-75);
// Render semi-transparent primitive background
task TRenderPrim(selection){
// Thank you for the PrimMaker Ferase :omegaflooshed:
ObjRender_SetPosition(selection, renderX+640, renderY+360, 0); // Since the render priority of the r.target is under 20
// Set up vert 0
ObjPrim_SetVertexPosition(selection,0,-640,-360,0);
ObjPrim_SetVertexColor(selection,0,0xA487FF);
ObjPrim_SetVertexUVT(selection, 0, 0, 0);
// Set up vert 1
ObjPrim_SetVertexPosition(selection,1,640,-360,0);
ObjPrim_SetVertexColor(selection,1,0xA487FF);
ObjPrim_SetVertexUVT(selection, 1, 1280, 0);
// Set up vert 2
ObjPrim_SetVertexPosition(selection,2,640,360,0);
ObjPrim_SetVertexColor(selection,2,0xA487FF);
ObjPrim_SetVertexUVT(selection, 2, 1280, 720);
// Set up vert 3
ObjPrim_SetVertexPosition(selection,3,640,360,0);
ObjPrim_SetVertexColor(selection,3,0xF187FF);
ObjPrim_SetVertexUVT(selection, 3, 1280, 720);
// Set up vert 4
ObjPrim_SetVertexPosition(selection,4,-640,360,0);
ObjPrim_SetVertexColor(selection,4,0xF187FF);
ObjPrim_SetVertexUVT(selection, 4, 0, 720);
// Set up vert 5
ObjPrim_SetVertexPosition(selection,5,-640,-360,0);
ObjPrim_SetVertexColor(selection,5,0xF187FF);
ObjPrim_SetVertexUVT(selection, 5, 0, 0);
for(int i = 0; i <= 5; i++){
ObjPrim_SetVertexAlpha(selection, i, 100);
}
}
// Render... the render target???
let objBG = ObjPrim_Create(OBJ_PRIMITIVE_2D);
ObjPrim_SetPrimitiveType(objBG, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(objBG, 6);
let target = "target";
CreateRenderTargetEx(target, 1280, 720);
ObjPrim_SetTexture(objBG, target);
//SetInvalidRenderPriorityA1(20, 80);
RenderToTextureA1(target, 0, 100, true);
//RenderToTextureB1(target, objBG, true);
Obj_SetRenderPriorityI(objBG, 0);
TRenderPrim(objBG);
}
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;//選択位置
task 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, 35);
ObjText_SetFontType(obj, "Exotc350 DmBd BT");
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, 1.75);
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);
loop
{
Obj_SetVisible(objSelect, index == selectIndex);
yield;
}
}
//メニュー配置
let objText = ObjText_Create();
ObjText_SetText(objText, "End of a Duel");
ObjText_SetFontSize(objText, 50);
ObjText_SetFontType(objText, "Exotc350 DmBd BT");
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, STGWIDTH-255);
ObjRender_SetY(objText, 100);
let mx = STGWIDTH-255;
let my = 175;
let texts = ["Record Your Victories", "Leave The Battlefield", "Go For A Rematch"];
var countMenu = length(texts);
ascent(var iText in 0 .. countMenu)
{
TMenuItem(iText, mx, my, texts[iText]);
my += 45;
}
//キー状態がリセットされるまで待機
while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;}
//メニュー選択処理
let frameKeyHold = 0;//キー押しっぱなしフレーム数
loop
{
//決定
if(GetVirtualKeyState(VK_OK) == KEY_PULL)
{
let listResult = [RESULT_SAVE_REPLAY, RESULT_END, RESULT_RETRY];
SetScriptResult(listResult[selectIndex]);
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;
}
yield;
}
}

View file

@ -0,0 +1,7 @@
const POINT_REGULAR = 1;
const POINT_BHESTIE = 2;
const EXTEND_LIFE = 3;
const EXTEND_SPELL = 4;
const PIV_100 = 5;
const PIV_250 = 6;
const PIV_500 = 7;

View file

@ -0,0 +1,11 @@
#UserItemData
item_image = "./../img/yo.png"
ItemData { id=1 rect=(256,256,384,384) } // Regular Point Item (PIV)
ItemData { id=2 rect=(384,128,512,256) } // Bhestie Point Item (PIV * 2)
ItemData { id=3 rect=(0,256,128,384) } // 1-up Item
ItemData { id=4 rect=(128,256,256,384) } // Spell Item
ItemData { id=5 rect=(256,384,384,512) fixed_angle = false angular_velocity = 3} // Green PIV Item (+100)
ItemData { id=6 rect=(384,384,512,512) fixed_angle = false angular_velocity = 3} // Pink PIV Item (+250)
ItemData { id=7 rect=(384,256,512,384) fixed_angle = false angular_velocity = 3} // Gold PIV Item (+500)

View file

@ -0,0 +1,92 @@
// Valid types: PIV_100, PIV_250, PIV_500
function CreatePIVItem(itemtype, x, y){
let PIVItem = CreateItemU2(itemtype, x, y, x-10, y-10, 100);
ObjItem_SetMoveToPlayer(PIVItem, true);
ObjItem_SetAutoDelete(PIVItem, false);
ObjItem_SetAutoCollectEnableFlags(PIVItem, ITEM_AUTOCOLLECT_ALL);
ObjItem_SetRenderScoreEnable(PIVItem, false);
ObjItem_SetIntersectionRadius(PIVItem, 60);
ObjRender_SetScaleXYZ(PIVItem, 0.3, 0.3, 1);
ObjRender_SetAlpha(PIVItem, 125);
async{
while(!Obj_IsDeleted(PIVItem)){
float angz = ObjRender_GetAngleZ(PIVItem);
ObjRender_SetAngleZ(PIVItem, angz+5);
yield;
}
}
return PIVItem;
}
// Valid types: POINT_REGULAR, POINT_BHESTIE
function CreateScoreItem(itemtype, x, y){
let ScoreItem = CreateItemU2(itemtype, x, y, x-30, y-30, 0);
ObjItem_SetAutoCollectEnableFlags(ScoreItem, ITEM_AUTOCOLLECT_ALL);
ObjItem_SetAutoDelete(ScoreItem, false);
ObjItem_SetIntersectionRadius(ScoreItem, 60);
ObjItem_SetRenderScoreEnable(ScoreItem, false);
ObjRender_SetScaleXYZ(ScoreItem, 0.4, 0.4, 1);
ObjRender_SetAlpha(ScoreItem, 200);
ObjMove_AddPatternA2(ScoreItem, 60, NO_CHANGE, 90, 0.12, 5.45, 0);
return ScoreItem;
}
// Valid types: EXTEND_LIFE, EXTEND_SPELL
function CreateExtendItem(itemtype, x, y){
let ExtendItem = CreateItemU2(itemtype, x, y, x-15, y-15, 0);
ObjItem_SetMoveToPlayer(ExtendItem, true);
ObjItem_SetAutoCollectEnableFlags(ExtendItem, ITEM_AUTOCOLLECT_ALL);
ObjRender_SetScaleXYZ(ExtendItem, 0.5, 0.5, 1);
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,335 @@
//一時停止中スクリプト
//#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 = [
"Even though her parents gave her an entire crash course[r]on how royals enjoy tea, Erika is more a coffee fan.",
"Pankevin is terrified of heights, but loves rollercoasters & thrill rides.[r]He only rides the ones with shoulder harnesses to feel safer,[r]and always goes with Kouda.",
"Rachel has been exterminated at least twice by Housui[r]for constantly nagging her to let Rachel experiment.",
"There are a total of 18 fun facts on this pause menu,[r]including this one. How many have you found?",
"The creator of this game is incredibly self-indulgent.[r]You probably figured out this one, though...",
"Connecting Chain Handserif is the creator's favorite font.[r]As a Brazilian once said, \"this bitch is[r]hyperfixated on that font\".",
"Pankevin is acquainted with a duck who casts ice magic in the[r]Outside World. His name is Caleb.",
"Marisa and Housui often duel in the Forest of Magic.[r]Their antics have incited Alice's wrath so much that[r]she just doesn't care anymore.",
"Whenever Tenshi and Shion organize banquets at the Hakurei Shrine,[r]Erika is the self-appointed taste tester of the food.[r]It's gone from \"unbearable\" to \"passable\" according to her.",
"Kouda always has a pair of fluffy cat-ear headphones on hand wherever[r]he goes, so he can plop them on when he's overwhelmed by loud sounds.[r]Pankevin keeps the headphones for Kouda in his huge quiver[r]when they're traveling together.",
"Tenshi and Erika were planning to bring Shion along for[r]their adventures, but the latter was exhausted after[r]the oil overflow incident and stayed out.[r](If Shion came along, they would be too powerful...)",
"Housui's favorite food are amarylis flowers.[r]...That's what she says, but it's probably just mochi.",
"Inside Pankevin's huge quiver, there are many refillable water containers,[r]a portable sketchbook & watercolor set, some snacks, and a pair of[r]fluffy cat-ear headphones for Kouda.",
"Pankevin = Panda + Kevin, not Pansexual x Kevin. Pankevin is bi.",
"Thank you for playing this game! It means a lot to me :D",
"Erika Rankyuu debuted in the creator's first game, Enigma of the Storm. [r]It was made for a bullet hell game contest in a Discord server.",
"Housui Henkawa debuted in Unstable and Unimaginable Power, [r]a Touhou fangame. It's very well-crafted and polished, so go ahead[r]and play it! Housui's the Extra boss, by the way.",
"Housui is not bald.",
];
int x = prand_int(0, length(textchoices)-1);
//y = length(textchoices);
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 18.5);
ObjText_SetFontType(objText, "Connecting Chain Handserif");
ObjText_SetMaxWidth(objText, STGWIDTH);
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, STGWIDTH-255);
ObjRender_SetY(objText, STGHEIGHT-75);
}
// renderX and renderY will be TOP-LEFT COORDS
task TBackgroundNew(renderX, renderY){
// Render semi-transparent primitive background
task TRenderPrim(selection){
// Thank you for the PrimMaker Ferase :omegaflooshed:
ObjRender_SetPosition(selection, renderX+640, renderY+360, 0); // Since the render priority of the r.target is under 20
// Set up vert 0
ObjPrim_SetVertexPosition(selection,0,-640,-360,0);
ObjPrim_SetVertexColor(selection,0,0xA487FF);
ObjPrim_SetVertexUVT(selection, 0, 0, 0);
// Set up vert 1
ObjPrim_SetVertexPosition(selection,1,640,-360,0);
ObjPrim_SetVertexColor(selection,1,0xA487FF);
ObjPrim_SetVertexUVT(selection, 1, 1280, 0);
// Set up vert 2
ObjPrim_SetVertexPosition(selection,2,640,360,0);
ObjPrim_SetVertexColor(selection,2,0xA487FF);
ObjPrim_SetVertexUVT(selection, 2, 1280, 720);
// Set up vert 3
ObjPrim_SetVertexPosition(selection,3,640,360,0);
ObjPrim_SetVertexColor(selection,3,0xF187FF);
ObjPrim_SetVertexUVT(selection, 3, 1280, 720);
// Set up vert 4
ObjPrim_SetVertexPosition(selection,4,-640,360,0);
ObjPrim_SetVertexColor(selection,4,0xF187FF);
ObjPrim_SetVertexUVT(selection, 4, 0, 720);
// Set up vert 5
ObjPrim_SetVertexPosition(selection,5,-640,-360,0);
ObjPrim_SetVertexColor(selection,5,0xF187FF);
ObjPrim_SetVertexUVT(selection, 5, 0, 0);
for(int i = 0; i <= 5; i++){
ObjPrim_SetVertexAlpha(selection, i, 100);
}
}
// Render... the render target???
let objBG = ObjPrim_Create(OBJ_PRIMITIVE_2D);
ObjPrim_SetPrimitiveType(objBG, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(objBG, 6);
let target = "target";
CreateRenderTargetEx(target, 1280, 720);
ObjPrim_SetTexture(objBG, target);
//SetInvalidRenderPriorityA1(20, 80);
RenderToTextureA1(target, 0, 100, true);
//RenderToTextureB1(target, objBG, true);
Obj_SetRenderPriorityI(objBG, 0);
TRenderPrim(objBG);
}
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;//選択位置
task 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, 35);
ObjText_SetFontType(obj, "Exotc350 DmBd BT");
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, 1.75);
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);
loop
{
Obj_SetVisible(objSelect, index == selectIndex);
yield;
}
}
//メニュー配置
int x = prand_int(0, 6);
let textchoices = ["A Brief Respite", "Yassification Paused", "Tea Time", "Heroic Moratorium", "World Comes to A Halt","A Moment to Breathe", "Players are Resting Warmly"];
let objText = ObjText_Create();
ObjText_SetText(objText, textchoices[x]);
ObjText_SetFontSize(objText, 50);
ObjText_SetFontType(objText, "Exotc350 DmBd BT");
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, STGWIDTH-255);
ObjRender_SetY(objText, 100);
let mx = STGWIDTH-255;
let my = 175;
let texts = ["Resume The Faceoff", "Accept Your Losses", "Take Another Shot"];
var countMenu = length(texts);
ascent(var iText in 0 .. countMenu)
{
TMenuItem(iText, mx, my, texts[iText]);
my += 45;
}
//キー状態がリセットされるまで待機
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;
}
yield;
}
}

View file

@ -0,0 +1,453 @@
//リプレイ保存スクリプト
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 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_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, 1.75);
Obj_SetRenderPriorityI(obj, 10);
ObjRender_SetX(obj, mx);
ObjRender_SetY(obj, my);
return obj;
}
// renderX and renderY will be TOP-LEFT COORDS
task TBackgroundNew(renderX, renderY){
// Render semi-transparent primitive background
task TRenderPrim(selection){
// Thank you for the PrimMaker Ferase :omegaflooshed:
ObjRender_SetPosition(selection, renderX+640, renderY+360, 0); // Since the render priority of the r.target is under 20
// Set up vert 0
ObjPrim_SetVertexPosition(selection,0,-640,-360,0);
ObjPrim_SetVertexColor(selection,0,0xA487FF);
ObjPrim_SetVertexUVT(selection, 0, 0, 0);
// Set up vert 1
ObjPrim_SetVertexPosition(selection,1,640,-360,0);
ObjPrim_SetVertexColor(selection,1,0xA487FF);
ObjPrim_SetVertexUVT(selection, 1, 1280, 0);
// Set up vert 2
ObjPrim_SetVertexPosition(selection,2,640,360,0);
ObjPrim_SetVertexColor(selection,2,0xA487FF);
ObjPrim_SetVertexUVT(selection, 2, 1280, 720);
// Set up vert 3
ObjPrim_SetVertexPosition(selection,3,640,360,0);
ObjPrim_SetVertexColor(selection,3,0xF187FF);
ObjPrim_SetVertexUVT(selection, 3, 1280, 720);
// Set up vert 4
ObjPrim_SetVertexPosition(selection,4,-640,360,0);
ObjPrim_SetVertexColor(selection,4,0xF187FF);
ObjPrim_SetVertexUVT(selection, 4, 0, 720);
// Set up vert 5
ObjPrim_SetVertexPosition(selection,5,-640,-360,0);
ObjPrim_SetVertexColor(selection,5,0xF187FF);
ObjPrim_SetVertexUVT(selection, 5, 0, 0);
for(int i = 0; i <= 5; i++){
ObjPrim_SetVertexAlpha(selection, i, 100);
}
}
// Render... the render target???
let objBG = ObjPrim_Create(OBJ_PRIMITIVE_2D);
ObjPrim_SetPrimitiveType(objBG, PRIMITIVE_TRIANGLELIST);
ObjPrim_SetVertexCount(objBG, 6);
let target = "target";
CreateRenderTargetEx(target, STGWIDTH, STGHEIGHT);
ObjPrim_SetTexture(objBG, target);
//SetInvalidRenderPriorityA1(20, 80);
RenderToTextureA1(target, 0, 100, true);
//RenderToTextureB1(target, objBG, true);
Obj_SetRenderPriorityI(objBG, 0);
TRenderPrim(objBG);
}
task TBackground
{
let target = GetTransitionRenderTargetName();
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
ObjPrim_SetTexture(obj, target);
Obj_SetRenderPriority(obj, 0.1);
ObjSprite2D_SetSourceRect(obj, 0, 0, 640, 480);
ObjSprite2D_SetDestCenter(obj);
ObjRender_SetPosition(obj, 320, 240, 0);
ObjRender_SetAlpha(obj, 64);
}
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(341, 90 + 30 * itemY, 25, "");
let objSelect = CreateTextObject(341, 90 + 30 * itemY, 25, "");
ObjRender_SetBlendType(objSelect, BLEND_ADD_RGB);
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 ~ rtos("000000000000", GetReplayInfo(index, REPLAY_TOTAL_SCORE)) ~ " ";
}
else
{
text = text ~ "No Data";
}
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_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(341 + GetStgFrameWidth()/5.4 + itemX * 24, 255 + itemY * 24, 22, strTextView[itemY][itemX]);
let objSelect = CreateTextObject(341 + GetStgFrameWidth()/5.4 + itemX * 24, 255 + itemY * 24, 22, 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(341+GetStgFrameWidth()/4, 125, 28, "");
task TNameCursor()
{
let objCursor = CreateTextObject(341+GetStgFrameWidth()/4, 125, 28, "_");
while(menuMode == MENU_NAME_ENTRY)
{
let nameLength = length(userName);
ObjRender_SetX(objCursor, 341+GetStgFrameWidth()/4 + nameLength * 17);
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 = "No Name";
}
else
{
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;
}
}