diff --git a/sdvx@asphyxia/index.ts b/sdvx@asphyxia/index.ts index 05bbb1b..8773bcd 100644 --- a/sdvx@asphyxia/index.ts +++ b/sdvx@asphyxia/index.ts @@ -18,7 +18,8 @@ import { saveValgene, } from './handlers/profiles'; import { - copyResourcesFromGame + copyResourcesFromGame, + preGeneRoll } from './utils' import { ARENA @@ -45,6 +46,7 @@ export function register() { R.Config('use_asphyxia_gameover',{ type: 'boolean', default: true, name:'Use Asphyxia Gameover', desc:'Enable the Asphyxia gameover message after ending the game.'}) R.WebUIEvent('copyResourcesFromGame', copyResourcesFromGame); + R.WebUIEvent('preGeneRoll', preGeneRoll); R.WebUIEvent('updateProfile', updateProfile); R.WebUIEvent('updateMix', updateMix); R.WebUIEvent('importMix', importMix); diff --git a/sdvx@asphyxia/utils.ts b/sdvx@asphyxia/utils.ts index eccce69..0ce891c 100644 --- a/sdvx@asphyxia/utils.ts +++ b/sdvx@asphyxia/utils.ts @@ -1,4 +1,5 @@ import {Counter} from './models/counter'; +import {PREGENE} from './data/exg'; export function IDToCode(id: number) { const padded = _.padStart(id.toString(), 8); @@ -329,3 +330,61 @@ export const copyResourcesFromGame = async (data: {}) => { errors: runErrors })) } + +export const preGeneRoll = async (data: { + set: number, + refid: string, + items: [] +}) => { + // prem_items_crew: DB.Find(refid, {collection:"item",type:11}) + // prem_items_stamp: DB.Find(refid, { collection:"item",type:17 }) + // prem_items_subbg: DB.Find(refid, { collection:"item",type:18 }) + // prem_items_bgm: DB.Find(refid, { collection:"item",type:19 }) + // prem_items_nemsys: DB.Find(refid, { collection:"item",type:20 }) + + let itemId = { + 'crew': 11, + 'stamp': 17, + 'subbg': 18, + 'bgm': 19, + 'nemsys': 20 + } + let preGeneSet = PREGENE.find(itemSet => itemSet.id === data.set) + let finishedRolling = false + if(preGeneSet != undefined) { + while(!finishedRolling) { + let rollWhat = 0 + let probability = Math.random(); + console.log("Rolling Premium Generator") + for(const probIndex in preGeneSet.probability) { + if(probability <= preGeneSet.probability[probIndex]) { + rollWhat = parseInt(probIndex); + break; + } + if(parseInt(probIndex) === preGeneSet.probability.length - 1) rollWhat = parseInt(probIndex); + } + + let unobtainedItems = preGeneSet.items[Object.keys(preGeneSet.items)[rollWhat]].map((x) => x) + data.items.forEach(item => { + if(item['type'] == itemId[Object.keys(preGeneSet.items)[rollWhat]] && preGeneSet.items[Object.keys(preGeneSet.items)[rollWhat]].includes(item['id'])) { + unobtainedItems.splice(unobtainedItems.indexOf(item['id']), 1) + } + }) + if(unobtainedItems.length > 0) { + let randomItemIndex = Math.floor(Math.random() * unobtainedItems.length); + console.log("Rolled item id: " + unobtainedItems[randomItemIndex] + " | item type: " + itemId[Object.keys(preGeneSet.items)[rollWhat]]) + DB.Insert(data.refid, { + "collection": "item", + "type": itemId[Object.keys(preGeneSet.items)[rollWhat]], + "id": unobtainedItems[randomItemIndex], + "param": 1 + }) + let finalItemType = (Object.keys(preGeneSet.items)[rollWhat] === 'subbg') ? 'bg' : Object.keys(preGeneSet.items)[rollWhat] + await IO.WriteFile('webui/asset/logs/preGeneRollResult.json', JSON.stringify({'id': unobtainedItems[randomItemIndex], 'type': finalItemType})) + finishedRolling = true + } else { + console.log("No more " + Object.keys(preGeneSet.items)[rollWhat] + " items to get, will re-roll.") + } + } + } else console.log('pregeneset none') +} \ No newline at end of file diff --git a/sdvx@asphyxia/webui/asset/js/generator.js b/sdvx@asphyxia/webui/asset/js/generator.js new file mode 100644 index 0000000..f7997da --- /dev/null +++ b/sdvx@asphyxia/webui/asset/js/generator.js @@ -0,0 +1,158 @@ +function countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) { + let obtained = 0, total = 0; + if('crew' in geneItems.items) { + obtained += items_crew.filter(crew => geneItems.items.crew.includes(crew['id'])).length + total += geneItems.items['crew'].length + } + if('stamp' in geneItems.items) { + obtained += items_stamp.filter(stamp => geneItems.items.stamp.includes(stamp['id'])).length + total += geneItems.items['stamp'].length + } + if('subbg' in geneItems.items) { + obtained += items_subbg.filter(subbg => geneItems.items.subbg.includes(subbg['id'])).length + total += geneItems.items['subbg'].length + } + if('bgm' in geneItems.items) { + obtained += items_bgm.filter(bgm => geneItems.items.bgm.includes(bgm['id'])).length + total += geneItems.items['bgm'].length + } + if('nemsys' in geneItems.items) { + obtained += items_nemsys.filter(nemsys => geneItems.items.nemsys.includes(nemsys['id'])).length + total += geneItems.items['nemsys'].length + } + + return [obtained, total] +} + +function loadImages(itemList, itemType, userItems) { + itemList.forEach(item => { + let itemBrightness = userItems.find(userItem => userItem.id == item) != undefined ? 1 : 0.25 + let imageUrl = 'static/asset/valgene_item/item_' + itemType + '_' + item + '.png' + $.get(imageUrl, function(data, textStatus) { + if (textStatus == "success") { + $('.' + itemType + '-items').append('') + } + }) + }) +} + +async function getGeneratorEditionItems(gene_edition, itemSet) { + let valGeneData = await $.getJSON( "static/asset/json/valgene_data.json", function(data) { + return data + }) + if(gene_edition === 'valkyrie') { + return valGeneData.valgene.find(valgene => valgene.id === itemSet) + } else { + return valGeneData.pregene.find(pregene => pregene.id === itemSet) + } +} + +async function loadItems(itemSet, gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) { + let geneItems = await getGeneratorEditionItems(gene_edition, itemSet) + let itemCounts = countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) + if(itemCounts[0] >= itemCounts[1]) $('#pregene-roll').attr('disabled', 'disabled') + + $('.count').text('Unlocked items: ' + itemCounts[0] + "/" + itemCounts[1]) + + if('crew' in geneItems.items) { + $('.item_banners').append('

Nemsys Crew

') + $('.item_banners').append('

') + loadImages(geneItems.items['crew'], 'crew', items_crew) + } + + if('stamp' in geneItems.items) { + $('.item_banners').append('

Appeal Stamp

') + $('.item_banners').append('

') + loadImages(geneItems.items['stamp'], 'stamp', items_stamp) + } + + if('subbg' in geneItems.items) { + $('.item_banners').append('

Submonitor BG

') + $('.item_banners').append('

') + loadImages(geneItems.items['subbg'], 'bg', items_subbg) + } + + if('bgm' in geneItems.items) { + $('.item_banners').append('

BGM

') + $('.item_banners').append('

') + loadImages(geneItems.items['bgm'], 'bgm', items_bgm) + } + + if('nemsys' in geneItems.items) { + $('.item_banners').append('

Nemsys

') + $('.item_banners').append('

') + loadImages(geneItems.items['nemsys'], 'nemsys', items_nemsys) + } +} + +async function loadValgeneData(gene_edition) { + let valGeneData = await $.getJSON( "static/asset/json/valgene_data.json", function(data) { + return data + }) + if(gene_edition === 'valkyrie') { + for(const valGeneDataIndex in valGeneData.valgene) { + $('#set_select').append('') + } + } else { + for(const pregeneDataIndex in valGeneData.pregene) { + $('#set_select').append('') + } + } + +} + +$(document).ready(function() { + if(document.getElementById("data-pass-unlock-all").innerText === 'true') { + $('.card-content').text("The \"Unlock All Valkyrie and Premium Items\" option is enabled. You wouldn't need this.") + $('#pregene-roll').attr('disabled') + return 0; + } + + + $('.input').hide() + $('.button').addClass('is-link') + let refid = document.getElementsByName("refid")[0].value + let items_crew = JSON.parse(document.getElementById("data-pass-crew").innerText); + let items_stamp = JSON.parse(document.getElementById("data-pass-stamp").innerText); + let items_subbg = JSON.parse(document.getElementById("data-pass-subbg").innerText); + let items_bgm = JSON.parse(document.getElementById("data-pass-bgm").innerText); + let items_nemsys = JSON.parse(document.getElementById("data-pass-nemsys").innerText); + let gene_edition = document.getElementById("generator-edition").innerText; + loadValgeneData(gene_edition) + loadItems(1, gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) + + $('#set_select').change(function() { + $('.count').text('') + $('.item_banners').empty() + loadItems(parseInt($('#set_select').val()), gene_edition, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys) + }) + + $('#roll-result').on('click', function(){location.reload()}) + + $('#pregene-roll').on('click', async function() { + $('#pregene-roll').attr('disabled', 'disabled') + if(gene_edition === 'premium' && window.location.search.match(/(premium)/g) != undefined) { + let geneItems = await getGeneratorEditionItems(gene_edition, parseInt($('#set_select').val())) + console.log(geneItems) + if(countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)[0] >= countGeneItems(geneItems, items_crew, items_stamp, items_subbg, items_bgm, items_nemsys)[1]) { + alert("All items have been unlocked already.") + } else { + emit('preGeneRoll', { + set: parseInt(document.getElementById('set_select').value), + refid: refid, + items: items_crew.concat(items_stamp, items_subbg, items_bgm, items_nemsys) + }).then( + function() { + $.getJSON("static/asset/logs/preGeneRollResult.json", function(data) { + $('.modal-card-head').append('') + $('.modal-card-body').append('') + $('.modal-card-foot').append('') + $('.modal').addClass('is-active') + }) + }) + } + } else { + alert("Not premium generator: a precaution") + } + }) +}) \ No newline at end of file diff --git a/sdvx@asphyxia/webui/asset/json/valgene_data.json b/sdvx@asphyxia/webui/asset/json/valgene_data.json new file mode 100644 index 0000000..d973a26 --- /dev/null +++ b/sdvx@asphyxia/webui/asset/json/valgene_data.json @@ -0,0 +1,113 @@ +{ + "pregene": [ + { + "id": 1, + "name": "Premium Generator 1 (Aqua Set)", + "items": { + "crew": [131], + "stamp": [69, 70, 71, 72, 73, 74, 75, 76, 77, 78], + "subbg": [166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185] + } + } + ], + "valgene":[ + { + "id": 1, + "name": "Valkyrie Generator Vol. 1", + "items":{ + "crew": [117], + "stamp": [1, 2, 3, 4, 5], + "subbg": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + "bgm": [1, 2, 3, 4, 5, 6, 7, 8], + "nemsys": [1, 2, 3, 4] + } + }, + { + "id": 2, + "name": "Valkyrie Generator Vol. 2", + "items":{ + "crew": [119], + "stamp": [6, 7, 8, 9, 10], + "subbg": [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], + "bgm": [9, 10, 11, 12, 13, 14], + "nemsys": [5, 6, 7] + } + }, + { + "id": 3, + "name": "Valkyrie Generator Vol. 3", + "items":{ + "crew": [120], + "stamp": [11, 12, 13, 14, 15, 16], + "subbg": [34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], + "bgm": [15, 16, 17], + "nemsys": [12, 13, 14] + } + }, + { + "id": 4, + "name": "Valkyrie Generator Vol. 4", + "items":{ + "crew": [121], + "stamp": [17, 18, 19, 20, 21], + "subbg": [57, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79], + "bgm": [18, 19, 20, 21], + "nemsys": [15, 16, 17] + } + }, + { + "id": 5, + "name": "Valkyrie Generator Vol. 5", + "items":{ + "crew": [124], + "stamp": [22, 23, 24, 25, 26, 27], + "subbg": [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102], + "bgm": [22, 23, 24, 25], + "nemsys": [18, 19, 20] + } + }, + { + "id": 6, + "name": "Valkyrie Generator Vol. 6", + "items":{ + "crew": [129], + "stamp": [28, 29, 30, 31, 32], + "subbg": [103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127], + "bgm": [26, 27, 28, 29], + "nemsys": [21, 22, 23, 24, 25] + } + }, + { + "id": 7, + "name": "Valkyrie Generator Vol. 7", + "items":{ + "stamp": [33, 34, 35, 36, 37], + "subbg": [129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151], + "bgm": [30, 31, 32, 33, 34, 35, 36, 37], + "nemsys": [26, 27, 28, 29, 30] + } + }, + { + "id": 8, + "name": "Valkyrie Generator Vol. 8", + "items":{ + "crew": [130], + "stamp": [38, 39, 40, 41, 42], + "subbg": [152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165], + "bgm": [38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68], + "nemsys": [31] + } + }, + { + "id": 9, + "name": "Valkyrie Generator Vol. 9", + "items":{ + "crew": [133], + "stamp": [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109], + "subbg": [186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199], + "bgm": [43, 44, 45, 46, 47], + "nemsys": [32] + } + } + ] +} \ No newline at end of file diff --git a/sdvx@asphyxia/webui/profile_premium generator.pug b/sdvx@asphyxia/webui/profile_premium generator.pug new file mode 100644 index 0000000..a58d406 --- /dev/null +++ b/sdvx@asphyxia/webui/profile_premium generator.pug @@ -0,0 +1,53 @@ +//DATA// + prem_items_crew: DB.Find(refid, {collection:"item",type:11}) + + prem_items_stamp: DB.Find(refid, { collection:"item",type:17 }) + + prem_items_subbg: DB.Find(refid, { collection:"item",type:18 }) + + prem_items_bgm: DB.Find(refid, { collection:"item",type:19 }) + + prem_items_nemsys: DB.Find(refid, { collection:"item",type:20 }) + + unlock_all: U.GetConfig('unlock_all_valk_items') + +- + //const padded = _.padStart(profile.id.toString(), 8); + //const sdvxid = `${padded.slice(0, 4)}-${padded.slice(4)}`; + +link(rel="stylesheet" href="static/asset/css/datatables.css") +div + div.modal(id="roll-result") + div(class="modal-background jb-modal-close") + div(class="modal-card") + header(class="modal-card-head") + section(class="modal-card-body" style="text-align: center;") + footer(class="modal-card-foot") + .card + .card-header + p.card-header-title + span.icon + i.mdi.mdi-star + | Premium Generator + .card-content + .field + .control + .select + select(name="set_select" id="set_select") + // option(value="1") Premium Generator 1 (Aqua Set) + div(style="padding: 15px; text-align: center;") + div(style="padding: 5px") + h3.count() + input.input(type="text" name="refid", value=refid readonly) + button.button(id="pregene-roll" style="font-size: 20px") Roll + br() + div.item_banners() + +div(hidden id='data-pass-crew') !{JSON.stringify(prem_items_crew)} +div(hidden id='data-pass-stamp') !{JSON.stringify(prem_items_stamp)} +div(hidden id='data-pass-subbg') !{JSON.stringify(prem_items_subbg)} +div(hidden id='data-pass-bgm') !{JSON.stringify(prem_items_bgm)} +div(hidden id='data-pass-nemsys') !{JSON.stringify(prem_items_nemsys)} +div(hidden id='data-pass-unlock-all') !{unlock_all} +div(hidden id='generator-edition') premium +script(src="static/asset/js/generator.js") \ No newline at end of file diff --git a/sdvx@asphyxia/webui/profile_valkyrie generator.pug b/sdvx@asphyxia/webui/profile_valkyrie generator.pug new file mode 100644 index 0000000..69fdcee --- /dev/null +++ b/sdvx@asphyxia/webui/profile_valkyrie generator.pug @@ -0,0 +1,45 @@ +//DATA// + prem_items_crew: DB.Find(refid, {collection:"item",type:11}) + + prem_items_stamp: DB.Find(refid, { collection:"item",type:17 }) + + prem_items_subbg: DB.Find(refid, { collection:"item",type:18 }) + + prem_items_bgm: DB.Find(refid, { collection:"item",type:19 }) + + prem_items_nemsys: DB.Find(refid, { collection:"item",type:20 }) + + unlock_all: U.GetConfig('unlock_all_valk_items') + +- + //const padded = _.padStart(profile.id.toString(), 8); + //const sdvxid = `${padded.slice(0, 4)}-${padded.slice(4)}`; + +link(rel="stylesheet" href="static/asset/css/datatables.css") +div + .card + .card-header + p.card-header-title + span.icon + i.mdi.mdi-star + | Valkyrie Generator + .card-content + .field + .control + .select + select(name="set_select" id="set_select") + div(style="padding: 15px; text-align: center;") + div(style="padding: 5px") + h3.count() + input.input(type="text" name="refid", value=refid readonly) + br() + div.item_banners() + +div(hidden id='data-pass-crew') !{JSON.stringify(prem_items_crew)} +div(hidden id='data-pass-stamp') !{JSON.stringify(prem_items_stamp)} +div(hidden id='data-pass-subbg') !{JSON.stringify(prem_items_subbg)} +div(hidden id='data-pass-bgm') !{JSON.stringify(prem_items_bgm)} +div(hidden id='data-pass-nemsys') !{JSON.stringify(prem_items_nemsys)} +div(hidden id='data-pass-unlock-all') !{unlock_all} +div(hidden id='generator-edition') valkyrie +script(src="static/asset/js/generator.js") \ No newline at end of file