task TConfigScene{ // Credit: Kobito let bEndTitleScene = false; // BGM, SE, Life, BG, Skip, PlayerShot, Item let settingDefault = [100, 100, 3, 100, 60, 60, 100, 0]; let setting = [0, 0, 0, 0, 0, 0, 0, 0]; let settingMax = [100, 100, 999, 100, 100, 100, 100, 3]; let holdInterval = [2, 2, 1, 2, 2, 2, 2, 30]; setting[0] = GetAreaCommonData("Config", "BGMVol", 100); setting[1] = GetAreaCommonData("Config", "SEVol", 100); setting[2] = GetAreaCommonData("Config", "StartingLife", 3); setting[3] = GetAreaCommonData("Config", "BGOpacity", 255); setting[4] = GetAreaCommonData("Config", "PlayerShotOpacity", 60); setting[5] = GetAreaCommonData("Config", "ItemOpacity", 60); setting[6] = GetAreaCommonData("Config", "ExplosionOpacity", 100); setting[7] = GetAreaCommonData("Config", "EffectCut", 0); let selectIndex = 0; var optionNum = 8; var countMenu = 9; let texts = [0, 0, 0, 0, 0, 0, 0, 0, 0]; let objWarning = CreateTextObject( GetScreenWidth()/2, 9*GetScreenHeight()/12, [32, 40][lang], ["High scores are only saved with 3 starting lives or fewer.[r]Press X/Cancel to save settings and return to the menu.", "ライフカウンター<=3たらだけハイスコアは記録します。[r]X/CANCEL:コンフィグをセーブとメニューに帰る"][lang], "コーポレート・ロゴ(ラウンド) ver2 Bold", 0xFFFFFF, 0xFFFFFF, 0xFF6D64, 35/10, 2 ); ObjText_SetHorizontalAlignment(objWarning, ALIGNMENT_CENTER); function TMenuItem( let index, float mx, my, size, string text ) { let objText = CreateTextObject( mx, my, size, text, "コーポレート・ロゴ(ラウンド) ver2 Bold", 0xFFFFFF, 0xFFFFFF, 0x000000, size/10, 2 ); //ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER); async{ while(!bEndTitleScene) { if(index == selectIndex){ObjRender_SetColor(objText, 255, 255, 255);} else{ObjRender_SetColor(objText, 100, 100, 100);} yield; } Obj_Delete(objText); } return objText; } float mx = GetScreenWidth()/2-GetScreenWidth()/3; float my = 1.5*GetScreenHeight()/12; ascent(i in 0..countMenu){texts[i] = TMenuItem(i, mx, my+i*GetScreenHeight()/15, 35, "");} ObjText_SetText(texts[optionNum], ["Reset to Default", "DEFAULT"][lang]); function ChangeSetting(a, b){ setting[a] += b; if(setting[a] < 0){setting[a] = settingMax[a];} else if(setting[a] > settingMax[a]){setting[a] = 0;} } let configText = [ ["BGM Volume: ", "SFX Volume:", "Starting Lives:", "Background Opacity:", "Player Shot Opacity:", "Item Opacity: ", "Explosion Opacity", "Effect Cut Level: "], ["BGM Vol: ", "SFX Vol: ", "ライフカウンター: ", "背景の透明:", "プレイヤーショットの透明: ", "アイテムの透明:", "Explosion Opacity", "エフェクトカット:"] ]; function UpdateTexts{ ObjText_SetText(texts[0], configText[lang][0]~" " ~ IntToString(setting[0])); ObjText_SetText(texts[1], configText[lang][1]~" " ~ IntToString(setting[1])); ObjText_SetText(texts[2], configText[lang][2]~" " ~ IntToString(setting[2])); ObjText_SetText(texts[3], configText[lang][3]~" " ~ IntToString(setting[3]) ~ "%"); alternative(setting[4]) case(0){ObjText_SetText(texts[4], configText[lang][4]~" " ~ IntToString(setting[4]) ~ [" (Why???)", " (なんで???)"][lang]);} case(60){ObjText_SetText(texts[4],configText[lang][4]~" " ~ IntToString(setting[4]) ~ [" (Recommended)", " (推薦)"][lang]);} case(100){ObjText_SetText(texts[4],configText[lang][4]~" " ~ IntToString(setting[4]) ~ [" (Eye-Blinding)", " (逆上)"][lang]);} others{ObjText_SetText(texts[4], configText[lang][4]~" " ~ IntToString(setting[4]));} alternative(setting[5]) case(0){ObjText_SetText(texts[5], configText[lang][5]~" " ~ IntToString(setting[5]) ~ [" (Why???)", " (なんで???)"][lang]);} case(60){ObjText_SetText(texts[5], configText[lang][5]~" " ~ IntToString(setting[5]) ~ [" (Recommended)", " (推薦)"][lang]);} case(100){ObjText_SetText(texts[5], configText[lang][5]~" " ~ IntToString(setting[5]) ~ [" (Eye-Blinding)", " (逆上)"][lang]);} others{ObjText_SetText(texts[5], configText[lang][5]~" " ~ IntToString(setting[5]));} ObjText_SetText(texts[6], configText[lang][6]~" " ~ IntToString(setting[6])); alternative(setting[7]) case(0){ObjText_SetText(texts[7], configText[lang][7]~ " " ~ IntToString(setting[7]) ~ [" (Full Effects)", " (全部エフェクト)"][lang]);} case(1){ObjText_SetText(texts[7], configText[lang][7]~ " " ~ IntToString(setting[7]) ~ [" (No Item Popups)", " (アイテムポップアップじゃない)"][lang]);} case(2){ObjText_SetText(texts[7], configText[lang][7]~ " " ~ IntToString(setting[7]) ~ [" (No Explosion Effects)", " (爆発エフェクトじゃない)"][lang]);} case(3){ObjText_SetText(texts[7], configText[lang][7]~ " " ~ IntToString(setting[7]) ~ [" (No Effects)", " (エフェクトじゃない)"][lang]);} others{ObjText_SetText(texts[7], configText[lang][7]~ " " ~ IntToString(setting[7]));} } UpdateTexts(); while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;} let frameKeyHold = 0; let frameKeyHoldSide = 0; loop{ UpdateTexts(); if(GetVirtualKeyState(VK_CANCEL) == KEY_PUSH){ TTitleScene(); break; } // Select option to configure 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;} if(GetVirtualKeyState(VK_RIGHT) == KEY_HOLD || GetVirtualKeyState(VK_LEFT) == KEY_HOLD){frameKeyHoldSide++;} else{frameKeyHoldSide = 0;} if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || GetVirtualKeyState(VK_RIGHT) == KEY_HOLD){ if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH || (frameKeyHoldSide >= 30 && frameKeyHoldSide % holdInterval[selectIndex] == 0)){ if (selectIndex > optionNum){} else{ChangeSetting(selectIndex, 1);} } } else if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || GetVirtualKeyState(VK_LEFT) == KEY_HOLD){ if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH || (frameKeyHoldSide >= 30 && frameKeyHoldSide % holdInterval[selectIndex] == 0)){ if (selectIndex > optionNum){} else{ChangeSetting(selectIndex, -1);} } } if(selectIndex == optionNum && GetVirtualKeyState(VK_OK) == KEY_PUSH){ ascent(i in 0..optionNum-1){ setting[i] = settingDefault[i]; selectIndex = 0; } } SetAreaCommonData("Config", "BGMVol", setting[0]); SetAreaCommonData("Config", "SEVol", setting[1]); SetAreaCommonData("Config", "StartingLife", setting[2]); SetAreaCommonData("Config", "BGOpacity", setting[3]); SetAreaCommonData("Config", "PlayerShotOpacity", setting[4]); SetAreaCommonData("Config", "ItemOpacity", setting[5]); SetAreaCommonData("Config", "ExplosionOpacity", setting[6]); SetAreaCommonData("Config", "EffectCut", setting[7]); ObjSound_SetVolumeRate(objTitleBGM, 75*GetAreaCommonData("Config", "BGMVol", 100)*0.01); ObjText_SetText(texts[optionNum], ["Reset to Default", "DEFAULT"][lang]); ObjText_SetText(objWarning, ["High scores are only saved with 3 starting lives or fewer.[r]Press X/Cancel to save settings and return to the menu.", "ライフカウンター<=3たらだけハイスコアは記録します。[r]X/CANCEL:コンフィグをセーブとメニューに帰る"][lang]); //SetSoundDivisionVolumeRate(SOUND_BGM, GetAreaCommonData("Config", "BGMVol", 100)*0.01); //SetSoundDivisionVolumeRate(SOUND_SE, GetAreaCommonData("Config", "SEVol", 100)*0.01); yield; } SaveCommonDataAreaA2("Config", "script/Jam10/config.dat"); bEndTitleScene = true; Obj_Delete(objWarning); } task TDifficultySelect(){ //メニュー配置 let mx = GetScreenWidth()/2; let my = 1*GetScreenHeight()/5; bool bEndTitleScene = false; int text = CreateTextObject( mx, my*4, 36, "", "Unispace", 0xFFFFFF, 0xFFFFFF, 0x000000, 4, 4 ); ObjText_SetHorizontalAlignment(text, ALIGNMENT_CENTER); ObjText_SetAutoTransCenter(text, true); let textArray = [ "A beginner-friendly difficulty.[r]Enemy patterns are reigned in for a more lighthearted experience.[r][font size=30 tc=(255, 132, 141)]EXTENDS AT: 250m, 500m, 1b, 1.8b", "The usual, hectic experience.[r]The game tailors its difficulty to your skill level fully.[r][font size=30 tc=(255, 132, 141)]EXTENDS AT: 400m, 800m, 1.5b, 2.5b", "The ultimate difficulty.[r]Rank is locked to its highest - there's no holding back![r][font size=30 tc=(255, 132, 141)]EXTENDS AT: EVERY 1BIL" ]; int img_NV = _Create2DImage(dirLib ~ "Difficulty_Novice.png" , [0, 0, 1200, 1080]); int img_ST = _Create2DImage(dirLib ~ "Difficulty_Standard.png" , [0, 0, 1200, 1080]); int img_EX = _Create2DImage(dirLib ~ "Difficulty_Extra.png" , [0, 0, 1200, 1080]); int[] imgArr = [img_NV, img_ST, img_EX]; ascent(i in 0..3){ ObjSprite2D_SetDestCenter(imgArr[i]); ObjRender_SetScaleXYZ(imgArr[i], 0.75); ObjRender_SetAlpha(imgArr[i], 180); Obj_SetRenderPriorityI(imgArr[i], 3); ObjRender_SetPosition(imgArr[i], (1.5 + 2 * i) * GetScreenWidth()/7, GetScreenHeight()/2-64, 1); Obj_SetValue(imgArr[i], 'V', i); } //Obj_SetVisible(imgArcade, false); //Obj_SetVisible(imgGentle, false); let INDEX_NOVICE = 0; let INDEX_STANDARD = 1; let INDEX_EXTRA = 2; let selectIndex = 0;//選択位置 int countMenu = 3; //キー状態がリセットされるまで待機 while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;} //メニュー選択処理 let frameKeyHold = 0;//キー押しっぱなしフレーム数 loop { // Visibility for each (int img in ref imgArr){ if (Obj_GetValue(img, "V") == selectIndex) { ObjRender_SetAlpha(img, 255); } else { ObjRender_SetAlpha(img, 120); } } ObjText_SetText(text, textArray[selectIndex]); if(GetVirtualKeyState(VK_CANCEL) == KEY_PUSH){ TTitleScene(); break; } else if(GetVirtualKeyState(VK_OK) == KEY_PUSH) { if(selectIndex == INDEX_NOVICE) { SetCommonData("Difficulty", "Novice"); TPlayer(); } else if(selectIndex == INDEX_STANDARD) { SetCommonData("Difficulty", "Standard"); TPlayer(); } else if(selectIndex == INDEX_EXTRA) { SetCommonData("Difficulty", "Extra"); TPlayer(); } break; } //カーソル移動 if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH) { selectIndex--; } else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH) { selectIndex++; } else if(GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { frameKeyHold++; if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0))) { selectIndex--; } } else if(GetVirtualKeyState(VK_RIGHT) == 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; } bEndTitleScene = true; Obj_Delete(imgArr[0]); Obj_Delete(imgArr[1]); Obj_Delete(imgArr[2]); Obj_Delete(text); } task TPlayer(){ bool bEndTitleScene = false; let INDEX_LAVENDER= 0; let INDEX_KOURYUU = 1; let DATA_ARR = [["Lavender", GetCommonData("Difficulty", "Standard")], ["Kouryuu", GetCommonData("Difficulty", "Standard")]]; let selectIndex = 0;//選択位置 //メニュー配置 let mx = GetScreenWidth()/2; let my = 4*GetScreenHeight()/5; int text = CreateTextObject( mx, my, 36, "", "Unispace", 0xFFFFFF, 0xFFFFFF, 0x000000, 2, 8 ); int nameText = CreateTextObject( mx, my-72, 48, "", "Unispace", 0xFFFFFF, 0xFFFFFF, 0x000000, 4, 8 ); ObjText_SetHorizontalAlignment(text, ALIGNMENT_CENTER); ObjText_SetAutoTransCenter(text, true); ObjText_SetHorizontalAlignment(nameText, ALIGNMENT_CENTER); ObjText_SetAutoTransCenter(nameText, true); let textArray = [ "A talented potion-making witch with a wide-reaching shottype.[r]Her wide range and ammo-efficient special weapon allow for a balanced playstyle.", "A half-dragon blacksmith with a highly precise forwards shottype.[r]His special weapon is ammo-consuming but erases bullets,[r]making it ideal for defensive purposes." ]; int img_LM = _Create2DImage(dirLib ~ "Character_Lavender.png" , [0, 0, 960, 1080]); int img_KE = _Create2DImage(dirLib ~ "Character_Kouryuu.png" , [0, 0, 960, 1080]); int[] imgArr = [img_LM, img_KE]; ascent(i in 0..2){ ObjSprite2D_SetDestCenter(imgArr[i]); ObjRender_SetScaleXYZ(imgArr[i], 1); ObjRender_SetAlpha(imgArr[i], 180); Obj_SetRenderPriorityI(imgArr[i], 3); Obj_SetValue(imgArr[i], 'V', i); } ObjRender_SetPosition(imgArr[0], 1 * GetScreenWidth()/3 - 96, GetScreenHeight()/2, 1); ObjRender_SetPosition(imgArr[1], 2 * GetScreenWidth()/3 + 96, GetScreenHeight()/2, 1); var countMenu = 2; //キー状態がリセットされるまで待機 while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;} //メニュー選択処理 let frameKeyHold = 0;//キー押しっぱなしフレーム数 loop { ObjText_SetText(nameText, "HIGH SCORE: [font bc=(255,178,36)]" ~ DigitToCommaArray(GetAreaCommonData("Data_" ~ DATA_ARR[selectIndex][0], "HighScore_" ~ DATA_ARR[selectIndex][1], 0)) ); if(GetVirtualKeyState(VK_CANCEL) == KEY_PUSH){ TTitleScene(); break; } else if(GetVirtualKeyState(VK_OK) == KEY_PUSH) { if(selectIndex == INDEX_LAVENDER) { pathPlayer = PlayerArray[0]; TStageScene("", pathPlayer, GetAreaCommonData("Config", "StartingLife", 3), GetAreaCommonData("Config", "DialogueSkip", 0), false); } else if(selectIndex == INDEX_KOURYUU) { pathPlayer = PlayerArray[1]; TStageScene("", pathPlayer, GetAreaCommonData("Config", "StartingLife", 3), GetAreaCommonData("Config", "DialogueSkip", 0), false); } break; } if(selectIndex == INDEX_LAVENDER) { ObjText_SetText(text, textArray[0]); ObjRender_SetAlpha(img_LM, 255); ObjRender_SetAlpha(img_KE, 160); } else if(selectIndex == INDEX_KOURYUU) { ObjText_SetText(text, textArray[1]); ObjRender_SetAlpha(img_KE, 255); ObjRender_SetAlpha(img_LM, 160); } //カーソル移動 if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH) { selectIndex--; } else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH) { selectIndex++; } else if(GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { frameKeyHold++; if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0))) { selectIndex--; } } else if(GetVirtualKeyState(VK_RIGHT) == 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; } Obj_Delete(img_LM); Obj_Delete(img_KE); Obj_Delete(text); Obj_Delete(nameText); bEndTitleScene = true; } task TManualScene(){ //メニュー配置 let mx = GetScreenWidth()/2; let my = 1*GetScreenHeight()/5; bool bEndTitleScene = false; int img_1 = _Create2DImage(dirLib ~ "NarumiSTG_Manual.png", [0, 0, 1280, 720]); ascent(i in 0..1){ ObjSprite2D_SetDestCenter(img_1); ObjRender_SetScaleXYZ(img_1, 1); ObjRender_SetAlpha(img_1, 255); Obj_SetRenderPriorityI(img_1, 3); ObjRender_SetPosition(img_1, 1280/2, 720/2, 1); Obj_SetValue(img_1, 'V', i); } //Obj_SetVisible(imgArcade, false); //Obj_SetVisible(imgGentle, false); let INDEX_1 = 0; let selectIndex = 0;//選択位置 int countMenu = 1; //キー状態がリセットされるまで待機 while(GetVirtualKeyState(VK_OK) != KEY_FREE){yield;} //メニュー選択処理 let frameKeyHold = 0;//キー押しっぱなしフレーム数 loop { // Visibility if(GetVirtualKeyState(VK_CANCEL) == KEY_PUSH){ TTitleScene(); break; } //カーソル移動 if(GetVirtualKeyState(VK_LEFT) == KEY_PUSH) { selectIndex--; } else if(GetVirtualKeyState(VK_RIGHT) == KEY_PUSH) { selectIndex++; } else if(GetVirtualKeyState(VK_LEFT) == KEY_HOLD) { frameKeyHold++; if(frameKeyHold == 30 || (frameKeyHold > 30 && (frameKeyHold % 10 == 0))) { selectIndex--; } } else if(GetVirtualKeyState(VK_RIGHT) == 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; } bEndTitleScene = true; Obj_Delete(img_1); }