231205
This commit is contained in:
+23
-36
@@ -1,8 +1,8 @@
|
||||
# SOUND VOLTEX
|
||||
|
||||
**Plugin Version:** fork-6.0.2.5
|
||||
**Plugin Version:** fork-6.0.2.6
|
||||
|
||||
**Supported game versions:** EXCEED GEAR (2023110700)
|
||||
**Supported game versions:** EXCEED GEAR (2023120500)
|
||||
|
||||
**Unsupported game versions:** Every other game, as they're untested.
|
||||
|
||||
@@ -16,6 +16,25 @@
|
||||
|
||||
Changelog
|
||||
===========
|
||||
## fork-6.0.2.6
|
||||
|
||||
### New:
|
||||
|
||||
1. Main:
|
||||
- 2023120500 support.
|
||||
- Enabled HEXA DIVER 10.
|
||||
- Enabled HEXA REVOLUTION features.
|
||||
- Added SKILL ANALYZER 8 courses.
|
||||
2. WebUI:
|
||||
- Added "Startup Flags" page - for toggling a few select game flags/events on the fly without restarting core, such as USE_CUDA_VIDEO_PRESENTER, etc.
|
||||
- Updated game achievements list.
|
||||
|
||||
### Todo:
|
||||
|
||||
1. Figure out how to use image (png) files to appear in information/news popup.
|
||||
2. More work on online matchmaking (globalMatch.) I can't seem to make clients establish a connection.
|
||||
|
||||
|
||||
## fork-6.0.2.5
|
||||
|
||||
### New:
|
||||
@@ -23,6 +42,7 @@ Changelog
|
||||
1. Main:
|
||||
- Added the new Kinoshita songs to LICENSED_SONGS list.
|
||||
|
||||
|
||||
## fork-6.0.2.4
|
||||
|
||||
### New:
|
||||
@@ -46,39 +66,6 @@ Changelog
|
||||
- Updated bgm_convert.bat
|
||||
|
||||
### Fixes:
|
||||
|
||||
1. WebUI
|
||||
- Fixed Japan-exclusive warning not displaying for some Premium Generator sets.
|
||||
|
||||
### Todo:
|
||||
1. Figure out how to use image (png) files to appear in information/news popup.
|
||||
2. More work on online matchmaking (globalMatch.) I can't seem to make clients establish a connection.
|
||||
|
||||
|
||||
## fork-6.0.2.3
|
||||
|
||||
### New:
|
||||
|
||||
1. Main:
|
||||
- Added ~~ARENA~~ MEGAMIX BATTLE ranked match season & ARENA STATION set 11.
|
||||
- Added PREMIUM GENERATOR Fubuki set.
|
||||
- Updated licensed songs list (Fubuki songs)
|
||||
2. WebUI
|
||||
- Updated ARENA Season statistics display in detail page. Displays rank, rank point meter, megamix rate (for ranked megamix,) ultimate rate (for ultimate players,) and arena power.
|
||||
- Added achievements list page (work in progress)
|
||||
- Added ability to set how many Valkyrie Generator tickets you have. These tickets are used to purchase valkyrie generator items.
|
||||
- Added ability to change Skill Titles. Players can only switch to titles they own.
|
||||
- (Update webui resources) Added code to extract wma audio from .s3p files. Largely based on [mon's s3p_extract](https://github.com/mon/s3p_extract) code.
|
||||
3. Others:
|
||||
- DEMOLOOP_INFORMATION implementation (attract mode announcements images)
|
||||
- Updated bgm\_convert batch script to remove the need for s3p\_extract.
|
||||
|
||||
### Fixes:
|
||||
|
||||
1. Game
|
||||
- Fixed gibberish on Asphyxia card entry information data.
|
||||
2. WebUI
|
||||
- Fixed details page error for players with no skill course data.
|
||||
- Fixed sorting of Valgene/Pregene item images.
|
||||
3. Misc:
|
||||
- Updated BPL Triple Tribe event category from 'gift' to 'event_online.'
|
||||
- Added missing matchmaker model file.
|
||||
|
||||
+328
-22
@@ -1,4 +1,9 @@
|
||||
export const EVENT6 = [
|
||||
// 'APPEAL_CARD_GEN_PRICE\t100',
|
||||
// 'APPEAL_CARD_GEN_NEW_PRICE\t200',
|
||||
// 'APPEAL_CARD_UNLOCK\t0,20170914,0,20171014,0,20171116,0,20180201,0,20180607,0,20181206,0,20200326,0,20200611,4,10140732,6,10150431',
|
||||
// 'EVENTDATE_GOTT',
|
||||
// 'EVENTDATE_ONIGO',
|
||||
'DEMOGAME_PLAY',
|
||||
'MATCHING_MODE',
|
||||
'MATCHING_MODE_FREE_IP',
|
||||
@@ -12,36 +17,29 @@ export const EVENT6 = [
|
||||
'TENKAICHI_MODE',
|
||||
'QC_MODE',
|
||||
'KAC_MODE',
|
||||
// 'APPEAL_CARD_GEN_PRICE\t100',
|
||||
// 'APPEAL_CARD_GEN_NEW_PRICE\t200',
|
||||
// 'APPEAL_CARD_UNLOCK\t0,20170914,0,20171014,0,20171116,0,20180201,0,20180607,0,20181206,0,20200326,0,20200611,4,10140732,6,10150431',
|
||||
'DISABLE_MONITOR_ID_CHECK',
|
||||
'FAVORITE_APPEALCARD_MAX\t200',
|
||||
'FAVORITE_MUSIC_MAX\t200',
|
||||
//'EVENTDATE_APRILFOOL',
|
||||
//'KONAMI_50TH_LOGO',
|
||||
'OMEGA_ARS_ENABLE',
|
||||
'DISABLE_MONITOR_ID_CHECK',
|
||||
'SKILL_ANALYZER_ABLE',
|
||||
'BLASTER_ABLE',
|
||||
'STANDARD_UNLOCK_ENABLE',
|
||||
'PLAYERJUDGEADJ_ENABLE',
|
||||
'MIXID_INPUT_ENABLE',
|
||||
'EVENTDATE_ONIGO',
|
||||
'EVENTDATE_GOTT',
|
||||
'DISP_PASELI_BANNER',
|
||||
'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143',
|
||||
'OMEGA_ENABLE\t1,2,3,4,5,6,7,8,9',
|
||||
'OMEGA_ARS_ENABLE',
|
||||
'HEXA_ENABLE\t1,2,3,4,5,6,7,8,9,10',
|
||||
'HEXA_OVERDRIVE_ENABLE\t8',
|
||||
'SKILL_ANALYZER_ABLE',
|
||||
'BLASTER_ABLE',
|
||||
'PREMIUM_TIME_ENABLE',
|
||||
'MEGAMIX_ENABLE',
|
||||
'ARENA_ENABLE',
|
||||
'SINGLE_BATTLE_ENABLE',
|
||||
'GENERATOR_ABLE',
|
||||
'CREW_SELECT_ABLE',
|
||||
'PREMIUM_TIME_ENABLE',
|
||||
'OMEGA_ENABLE\t1,2,3,4,5,6,7,8,9',
|
||||
'HEXA_ENABLE\t1,2,3,4,5,6,7,8,9',
|
||||
'MEGAMIX_ENABLE',
|
||||
'VALGENE_ENABLE',
|
||||
'ARENA_ENABLE',
|
||||
'DISP_PASELI_BANNER',
|
||||
'S_PUC_EFFECT_ENABLE',
|
||||
'PLAYER_RADAR_ENABLE',
|
||||
'SINGLE_BATTLE_ENABLE',
|
||||
'DEMOLOOP_INFORMATION\tdemo_info/230710_bpls3_streaming.png',
|
||||
'CHARACTER_IGNORE_DISABLE\t122,123,131,139,140,143'
|
||||
'S_PUC_EFFECT_ENABLE'
|
||||
];
|
||||
|
||||
export const INFORMATION6 = {
|
||||
@@ -5707,7 +5705,7 @@ export const COURSES6 = [
|
||||
{
|
||||
id: 17,
|
||||
name: 'SKILL ANALYZER 第7回',
|
||||
isNew: 1,
|
||||
isNew: 0,
|
||||
hasGod: 1,
|
||||
courses: [
|
||||
{
|
||||
@@ -6012,6 +6010,314 @@ export const COURSES6 = [
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 18,
|
||||
name: 'SKILL ANALYZER 第8回',
|
||||
isNew: 1,
|
||||
hasGod: 1,
|
||||
courses: [
|
||||
{
|
||||
id: 1,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.01',
|
||||
level: 1,
|
||||
nameID: 1,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1211,
|
||||
mty: 0,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 781,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 922,
|
||||
mty: 0,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.02',
|
||||
level: 2,
|
||||
nameID: 2,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 191,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 520,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 1740,
|
||||
mty: 1,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.03',
|
||||
level: 3,
|
||||
nameID: 3,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 397,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 1233,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 1387,
|
||||
mty: 1,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.04',
|
||||
level: 4,
|
||||
nameID: 4,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 724,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 829,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 752,
|
||||
mty: 1,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.05',
|
||||
level: 5,
|
||||
nameID: 5,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1618,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 740,
|
||||
mty: 1,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 1795,
|
||||
mty: 1,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.06',
|
||||
level: 6,
|
||||
nameID: 6,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1123,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 1876,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 968,
|
||||
mty: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.07',
|
||||
level: 7,
|
||||
nameID: 7,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1094,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 1167,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 521,
|
||||
mty: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.08',
|
||||
level: 8,
|
||||
nameID: 8,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 955,
|
||||
mty: 4,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 855,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 1682,
|
||||
mty: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 9,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.09',
|
||||
level: 9,
|
||||
nameID: 9,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1677,
|
||||
mty: 4,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 1437,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 2036,
|
||||
mty: 4,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 10,
|
||||
type: 0,
|
||||
name: 'SKILL ANALYZER Level.10',
|
||||
level: 10,
|
||||
nameID: 10,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1803,
|
||||
mty: 4,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 873,
|
||||
mty: 2,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 362,
|
||||
mty: 2,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 11,
|
||||
type: 1,
|
||||
name: 'SKILL ANALYZER Level.11',
|
||||
level: 11,
|
||||
nameID: 11,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 1930,
|
||||
mty: 4,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 1843,
|
||||
mty: 4,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 1276,
|
||||
mty: 4,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 12,
|
||||
type: 1,
|
||||
name: 'SKILL ANALYZER Level.∞',
|
||||
level: 12,
|
||||
nameID: 12,
|
||||
assist: 0,
|
||||
tracks: [
|
||||
{
|
||||
no: 0,
|
||||
mid: 258,
|
||||
mty: 3,
|
||||
},
|
||||
{
|
||||
no: 1,
|
||||
mid: 1582,
|
||||
mty: 4,
|
||||
},
|
||||
{
|
||||
no: 2,
|
||||
mid: 2085,
|
||||
mty: 4,
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
export const SDVX_AUTOMATION_SONGS = [
|
||||
|
||||
@@ -54,6 +54,13 @@ export const common: EPR = async (info, data, send) => {
|
||||
console.log('Game: Exceed Gear')
|
||||
//events = EVENT6;
|
||||
EVENT6.forEach(val => events.push(val));
|
||||
if(IO.Exists('webui/asset/config/flags.json')) {
|
||||
let bufFlagConfig = await IO.ReadFile('webui/asset/config/flags.json')
|
||||
let flagConfig = JSON.parse(bufFlagConfig.toString())
|
||||
for(const flagIter in flagConfig) {
|
||||
if(flagConfig[flagIter]['toggle']) events.push(flagConfig[flagIter]['str'])
|
||||
}
|
||||
}
|
||||
courses = COURSES6;
|
||||
EXTENDS6.forEach(val => extend.push(Object.assign({}, val)));
|
||||
break;
|
||||
|
||||
@@ -782,3 +782,9 @@ export const manageEvents = async (data: {
|
||||
}) => {
|
||||
IO.WriteFile('webui/asset/config/events.json', JSON.stringify(data.eventConfig, null, 4));
|
||||
}
|
||||
|
||||
export const manageStartupFlags = async (data: {
|
||||
flagConfig: {}
|
||||
}) => {
|
||||
IO.WriteFile('webui/asset/config/flags.json', JSON.stringify(data.flagConfig, null, 4));
|
||||
}
|
||||
@@ -7,7 +7,8 @@ import {
|
||||
deleteMix,
|
||||
copyResourcesFromGame,
|
||||
preGeneRoll,
|
||||
manageEvents
|
||||
manageEvents,
|
||||
manageStartupFlags
|
||||
} from './handlers/webui';
|
||||
import {
|
||||
load,
|
||||
@@ -47,6 +48,7 @@ export function register() {
|
||||
R.WebUIEvent('copyResourcesFromGame', copyResourcesFromGame);
|
||||
R.WebUIEvent('preGeneRoll', preGeneRoll);
|
||||
R.WebUIEvent('manageEvents', manageEvents);
|
||||
R.WebUIEvent('manageStartupFlags', manageStartupFlags);
|
||||
R.WebUIEvent('updateProfile', updateProfile);
|
||||
R.WebUIEvent('updateMix', updateMix);
|
||||
R.WebUIEvent('importMix', importMix);
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
function generateEventToggles(eventInfo, eventConfig) {
|
||||
let cardContent = $('<div class="card-content">')
|
||||
cardContent.append('<div class="field is-horizontal"').append(
|
||||
$("<h5>" + eventInfo['key'] + "</h5>")
|
||||
).append(
|
||||
$("<p style='font-size: 15px;'>" + eventInfo['explain'] + "</p>")
|
||||
)
|
||||
|
||||
cardContent.append(
|
||||
$('<div class="field is-horizontal">').append(
|
||||
$('<div class="field-label is-normal"><label class="label" for="' + eventInfo['id'] + '">Enable</label></div>')
|
||||
).append(
|
||||
$('<div class="field-body"><div class="field"><div class="control"><label class="switch is-rounded"><input type="checkbox" ' + (eventConfig['toggle'] ? 'checked' : '') + ' name="' + eventInfo['id'] + '"><span class="check"></span></label></div><p class="help"></p></div></div>')
|
||||
)
|
||||
)
|
||||
return cardContent
|
||||
}
|
||||
|
||||
async function generateNewFlagsConfigFile(eventData) {
|
||||
let flagConfig = {}
|
||||
for(const flagIter in eventData['flags']) {
|
||||
flagConfig[eventData['flags'][flagIter]['id']] = {
|
||||
'toggle': true,
|
||||
'str': eventData['flags'][flagIter]['str']
|
||||
}
|
||||
}
|
||||
return flagConfig
|
||||
}
|
||||
|
||||
async function readFlagsConfigFile(eventData) {
|
||||
try {
|
||||
return await $.getJSON("static/asset/config/flags.json", function(data) {
|
||||
return data
|
||||
})
|
||||
} catch {
|
||||
return await generateNewFlagsConfigFile(eventData)
|
||||
}
|
||||
}
|
||||
|
||||
async function readEventsJsonFile() {
|
||||
return await $.getJSON("static/asset/json/events.json", function(data) {
|
||||
return data
|
||||
})
|
||||
}
|
||||
|
||||
$(document).ready(async function() {
|
||||
let eventData = await readEventsJsonFile()
|
||||
let flagConfig = await readFlagsConfigFile(eventData)
|
||||
for(const flagIter in eventData['flags']) {
|
||||
if(flagConfig[eventData['flags'][flagIter]['id']] === undefined) flagConfig[eventData['flags'][flagIter]['id']] = {
|
||||
'toggle': true
|
||||
}
|
||||
$('.card').append(
|
||||
generateEventToggles(eventData['flags'][flagIter], flagConfig[eventData['flags'][flagIter]['id']])
|
||||
)
|
||||
}
|
||||
console.log(flagConfig)
|
||||
|
||||
$('#flags-submit').on('click', async function() {
|
||||
$.each($('span.check'), function(index, value) {
|
||||
for(const flagIter in eventData['flags']) {
|
||||
let toggle = true
|
||||
if($(value).css('background-color').includes("54, 54, 54")) {
|
||||
toggle = false
|
||||
}
|
||||
if(eventData['flags'][flagIter]['id'] === $(value).parent().children('input').attr('name')) {
|
||||
flagConfig[eventData['flags'][flagIter]['id']] = {
|
||||
'toggle': toggle,
|
||||
'str': eventData['flags'][flagIter]['str']
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
await emit("manageStartupFlags", {flagConfig: flagConfig}).then(
|
||||
function(response) {
|
||||
alert('Saved.')
|
||||
},
|
||||
function(error) {
|
||||
console.log(error)
|
||||
}
|
||||
)
|
||||
})
|
||||
})
|
||||
@@ -5292,6 +5292,13 @@
|
||||
"rtype": "aptitle",
|
||||
"rid": 10326,
|
||||
"troptype": 2
|
||||
},
|
||||
{
|
||||
"id": 757,
|
||||
"title": "HEXA DIVER 10 ―CODE:DimiourGEAR―を全曲獲得。",
|
||||
"rtype": "aptitle",
|
||||
"rid": 10327,
|
||||
"troptype": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -211,5 +211,37 @@
|
||||
"desc": "Online crossover event with CHASE CHASE JOKERS. Obtaining 6 stamps on the event site would unlock a song originally from CCJ.",
|
||||
"info": "Toggle this option on to unlock チェイスチェイスジョーカーズのうた on your next login."
|
||||
}
|
||||
],
|
||||
"flags": [
|
||||
{
|
||||
"id": "cuda",
|
||||
"key": "USE_CUDA_VIDEO_PRESENTER",
|
||||
"str": "USE_CUDA_VIDEO_PRESENTER",
|
||||
"explain": ""
|
||||
},
|
||||
{
|
||||
"id": "hiscoredatalimit",
|
||||
"key": "HISCORE_DATA_LIMIT",
|
||||
"str": "HISCORE_DATA_LIMIT",
|
||||
"explain": ""
|
||||
},
|
||||
{
|
||||
"id": "submonvsync",
|
||||
"key": "SUBMONITOR_VSYNC_ENABLE",
|
||||
"str": "SUBMONITOR_VSYNC_ENABLE",
|
||||
"explain": "Enables vertical sync for secondary display."
|
||||
},
|
||||
{
|
||||
"id": "demoloopinfo",
|
||||
"key": "DEMOLOOP_INFORMATION",
|
||||
"str": "DEMOLOOP_INFORMATION\tdemo_info/230710_bpls3_streaming.png",
|
||||
"explain": "Enables display of available information in attract mode."
|
||||
},
|
||||
{
|
||||
"id": "konami50",
|
||||
"key": "KONAMI_50TH_LOGO",
|
||||
"str": "KONAMI_50TH_LOGO",
|
||||
"explain": "Enables the 50th anniversary KONAMI logo."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
-
|
||||
link(rel="stylesheet" href="static/asset/css/datatables.css")
|
||||
div
|
||||
.card
|
||||
.card-header
|
||||
p.card-header-title
|
||||
span.icon
|
||||
i.mdi.mdi-star
|
||||
| Startup Flags
|
||||
div.field.is-grouped
|
||||
div.control.is-expanded
|
||||
div.control
|
||||
button.button.is-link(id="flags-submit") Apply
|
||||
|
||||
script(src="static/asset/js/flags.js")
|
||||
Reference in New Issue
Block a user