From 676ec11c7cc0c503f0260f69b07136ad28c2aa65 Mon Sep 17 00:00:00 2001
From: vvo <>
Date: Sun, 23 Oct 2022 19:13:01 +0800
Subject: [PATCH] premium generator roll feature + added valkyrie generator
page
---
sdvx@asphyxia/index.ts | 4 +-
sdvx@asphyxia/utils.ts | 59 +++++++
sdvx@asphyxia/webui/asset/js/generator.js | 158 ++++++++++++++++++
.../webui/asset/json/valgene_data.json | 113 +++++++++++++
.../webui/profile_premium generator.pug | 53 ++++++
.../webui/profile_valkyrie generator.pug | 45 +++++
6 files changed, 431 insertions(+), 1 deletion(-)
create mode 100644 sdvx@asphyxia/webui/asset/js/generator.js
create mode 100644 sdvx@asphyxia/webui/asset/json/valgene_data.json
create mode 100644 sdvx@asphyxia/webui/profile_premium generator.pug
create mode 100644 sdvx@asphyxia/webui/profile_valkyrie generator.pug
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('
Rolled item!
') + $('.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