Initial Nostalgia Support.

This commit is contained in:
DitFranXX 2020-11-26 02:38:07 +09:00
parent 7e52d72c26
commit 2f59174f18
8 changed files with 3516 additions and 0 deletions

View File

@ -0,0 +1,14 @@
# Nostalgia
Plugin Version: **v1.0.0**
Supported Versions
-------------------
- Op.2
Changelog
=========
1.0.0
-----
Initial Release.

View File

@ -0,0 +1,699 @@
<?xml version="1.0" encoding="shift_jis"?>
<course_data_list release_code="2019022700">
<course_data index="1">
<name __type="str">ベーシック10級検定</name>
<priority __type="s32">40</priority>
<req_nos __type="s32">1000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">80000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">140</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">850000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">225</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">1725000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">170</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">2625000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="2">
<name __type="str">ベーシック9級検定</name>
<priority __type="s32">39</priority>
<req_nos __type="s32">1500</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">120000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">199</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">875000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">209</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">1775000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">212</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">2700000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="3">
<name __type="str">ベーシック8級検定</name>
<priority __type="s32">38</priority>
<req_nos __type="s32">2000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">200000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">220</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">900000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">232</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">1825000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">82</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">2775000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="4">
<name __type="str">ベーシック7級検定</name>
<priority __type="s32">37</priority>
<req_nos __type="s32">2500</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">300000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">186</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">141</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">32</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="5">
<name __type="str">ベーシック6級検定</name>
<priority __type="s32">36</priority>
<req_nos __type="s32">3000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">400000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">36</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">87</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">242</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="6">
<name __type="str">ベーシック5級検定</name>
<priority __type="s32">35</priority>
<req_nos __type="s32">3500</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">450000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">122</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">40</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">85</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="7">
<name __type="str">ベーシック4級検定</name>
<priority __type="s32">34</priority>
<req_nos __type="s32">4000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">500000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">7</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">28</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">49</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="8">
<name __type="str">ベーシック3級検定</name>
<priority __type="s32">33</priority>
<req_nos __type="s32">4500</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">525000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">8</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">29</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">50</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="9">
<name __type="str">ベーシック2級検定</name>
<priority __type="s32">32</priority>
<req_nos __type="s32">5000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">540000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">9</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">30</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">51</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="10">
<name __type="str">ベーシック1級検定</name>
<priority __type="s32">31</priority>
<req_nos __type="s32">6000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">550000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">10</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">31</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">52</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="11">
<name __type="str">リサイタル10級検定</name>
<priority __type="s32">30</priority>
<req_nos __type="s32">1000</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">80000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">7</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">34000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">238</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">72000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">227</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">114000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="12">
<name __type="str">リサイタル9級検定</name>
<priority __type="s32">29</priority>
<req_nos __type="s32">1500</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">120000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">19</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">36000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">220</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">76000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">214</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">120000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="13">
<name __type="str">リサイタル8級検定</name>
<priority __type="s32">28</priority>
<req_nos __type="s32">2000</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">200000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">8</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">38000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">63</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">80000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">86</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">126000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="14">
<name __type="str">リサイタル7級検定</name>
<priority __type="s32">27</priority>
<req_nos __type="s32">2500</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">300000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">72</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">71</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">70</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="15">
<name __type="str">リサイタル6級検定</name>
<priority __type="s32">26</priority>
<req_nos __type="s32">3000</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">400000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">105</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">101</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">186</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="16">
<name __type="str">リサイタル5級検定</name>
<priority __type="s32">25</priority>
<req_nos __type="s32">3500</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">450000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">26</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">160</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">133</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2019-01-01 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="17">
<name __type="str">リサイタル4級検定</name>
<priority __type="s32">24</priority>
<req_nos __type="s32">4000</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">500000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">17</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">38</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">59</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="18">
<name __type="str">リサイタル3級検定</name>
<priority __type="s32">23</priority>
<req_nos __type="s32">4500</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">525000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">18</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">39</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">60</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="19">
<name __type="str">リサイタル2級検定</name>
<priority __type="s32">22</priority>
<req_nos __type="s32">5000</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">540000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">19</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">40</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">61</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="20">
<name __type="str">リサイタル1級検定</name>
<priority __type="s32">21</priority>
<req_nos __type="s32">6000</req_nos>
<mode_type __type="s32">2</mode_type>
<req_grade __type="s32">550000</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">20</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">40000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">41</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">84000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">62</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">132000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">0</unlock_music>
<unlock_item_list />
<start_date __type="str">2020-01-21 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="21">
<name __type="str">KACスペシャル検定(Normal)</name>
<priority __type="s32">60</priority>
<req_nos __type="s32">2000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">0</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">261</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">900000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">262</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">1800000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">263</index>
<difficulty __type="s32">0</difficulty>
<clear_point __type="s32">2750000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">263</unlock_music>
<unlock_item_list>
<unlock_item unlock_item_no="0">
<type __type="s32">1</type>
<index __type="s32">263</index>
<unlock_condition __type="s32">2</unlock_condition>
</unlock_item>
</unlock_item_list>
<start_date __type="str">2019-02-28 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="22">
<name __type="str">KACスペシャル検定(Hard)</name>
<priority __type="s32">59</priority>
<req_nos __type="s32">2000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">0</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">261</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">262</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">263</index>
<difficulty __type="s32">1</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">263</unlock_music>
<unlock_item_list>
<unlock_item unlock_item_no="0">
<type __type="s32">1</type>
<index __type="s32">263</index>
<unlock_condition __type="s32">2</unlock_condition>
</unlock_item>
</unlock_item_list>
<start_date __type="str">2019-02-28 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="23">
<name __type="str">KACスペシャル検定(Expert)</name>
<priority __type="s32">58</priority>
<req_nos __type="s32">2000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">0</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">261</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">262</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">263</index>
<difficulty __type="s32">2</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">263</unlock_music>
<unlock_item_list>
<unlock_item unlock_item_no="0">
<type __type="s32">1</type>
<index __type="s32">263</index>
<unlock_condition __type="s32">2</unlock_condition>
</unlock_item>
</unlock_item_list>
<start_date __type="str">2019-02-28 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
<course_data index="24">
<name __type="str">KACスペシャル検定(Real)</name>
<priority __type="s32">57</priority>
<req_nos __type="s32">2000</req_nos>
<mode_type __type="s32">1</mode_type>
<req_grade __type="s32">0</req_grade>
<seq_list>
<tune tune_no="0">
<index __type="s32">261</index>
<difficulty __type="s32">3</difficulty>
<clear_point __type="s32">925000</clear_point>
</tune>
<tune tune_no="1">
<index __type="s32">262</index>
<difficulty __type="s32">3</difficulty>
<clear_point __type="s32">1875000</clear_point>
</tune>
<tune tune_no="2">
<index __type="s32">263</index>
<difficulty __type="s32">3</difficulty>
<clear_point __type="s32">2850000</clear_point>
</tune>
</seq_list>
<unlock_music __type="s32">263</unlock_music>
<unlock_item_list>
<unlock_item unlock_item_no="0">
<type __type="s32">1</type>
<index __type="s32">263</index>
<unlock_condition __type="s32">2</unlock_condition>
</unlock_item>
</unlock_item_list>
<start_date __type="str">2019-02-28 10:00</start_date>
<end_date __type="str">9999-01-01 00:00</end_date>
</course_data>
</course_data_list>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,114 @@
import * as path from "path";
export const permitted_list = {
flag: [
K.ARRAY('s32', Array(32).fill(-1), { sheet_type: '0' }),
K.ARRAY('s32', Array(32).fill(-1), { sheet_type: '1' }),
K.ARRAY('s32', Array(32).fill(-1), { sheet_type: '2' }),
K.ARRAY('s32', Array(32).fill(-1), { sheet_type: '3' }),
],
};
async function ReadData(filename: string) {
const xml = await IO.ReadFile(`data/${filename}.xml`, { encoding: 'utf-8'});
const json = U.parseXML(xml, false)
return json
}
async function processIslandData() {
const islandData = (await ReadData('island')).island_data_list.island_data;
for (const island of islandData) {
island.flag_permitted = K.ITEM('bool', 1);
island.cost['@content'][0] = ~~(island.cost['@content'][0] / 10);
let containers = island.get_music_index_list.container;
if (!_.isArray(containers)) {
containers = [containers];
}
for (const cont of containers) {
cont['@attr'].no = cont['@attr'].container_no;
delete cont['@attr'].container_no;
if (!_.isArray(cont.music)) {
cont.music = [cont.music];
}
for (const m of cont.music) {
m.get_point['@content'][0] = ~~(m.get_point['@content'][0] / 6);
}
}
island.get_music_index_list.container = containers;
};
return { island_data: islandData };
}
async function processCourseData() {
const courseData = (await ReadData('course')).course_data_list.course_data;
for (const course of courseData) {
course.req_nos['@content'][0] = ~~(course.req_nos['@content'][0] / 10);
if (course.seq_list && course.seq_list.tune) {
course.seq_list = course.seq_list.tune;
course.is_open = K.ITEM('bool', 1);
}
}
return { course_data: courseData };
}
export const get_common_info = async (req, data, send) => {
send.object({
permitted_list,
olupdate: {
delete_flag: K.ITEM('bool', 0),
},
});
};
export const get_music_info: EPR = async (req, data, send) => {
const music_spec: any = [];
for (let i = 1; i < 400; ++i) {
music_spec.push(K.ATTR({ index: `${i}`}, {
jk_jpn: K.ITEM('bool', 1),
jk_asia: K.ITEM('bool', 1),
jk_kor: K.ITEM('bool', 1),
jk_idn: K.ITEM('bool', 1),
start_date: K.ITEM('str', '2017-01-11 10:00'),
end_date: K.ITEM('str', '9999-12-31 23:59'),
expiration_date: K.ITEM('str', '9999-12-31 23:59'),
real_start_date: K.ITEM('str', '2017-01-11 10:00'),
real_end_date: K.ITEM('str', '9999-12-31 23:59'),
real_once_price: K.ITEM('s32', 300),
real_forever_price: K.ITEM('s32', 7500),
}));
}
send.object({
permitted_list,
island_data_list: await processIslandData(),
course_data_list: await processCourseData(),
overwrite_music_list: K.ATTR({
revision: '16706',
release_code: '2019100200',
}, {
music_spec: music_spec,
}),
gamedata_flag_list: {
event: {
index: K.ITEM('s32', 0),
status: K.ITEM('s8', 1),
start_time: K.ITEM('u64', BigInt(0)),
end_time: K.ITEM('u64', BigInt(0)),
param1: K.ITEM('u64', BigInt(0)),
param2: K.ITEM('u64', BigInt(0)),
},
},
olupdate: {
delete_flag: K.ITEM('bool', 0),
},
});
};

View File

@ -0,0 +1,553 @@
// import { EAHandler } from '../../util/EAHandler';
// import { get, _.isArray } from 'lodash';
// import { Logger } from '../../util/Logger';
import { Profile } from '../models/profile';
import { Scores } from '../models/scores';
import { permitted_list } from './common';
// import { getValue, getArray, getAttr, getStr, getBigInt } from '../../util/Helper';
// export const event_list = {
// event: {
// '@attr': {
// index: 1,
// },
// 'status': K.ITEM('s8', 1),
// 'start_time': K.ITEM('u64', BigInt(0)),
// 'end_time': K.ITEM('u64', BigInt(0)),
// },
// };
const getEventInfo = () => {
const event: any[] = [];
for (let i = 1; i <= 17; ++i) {
event.push({
type: K.ITEM('s32', 4),
index: K.ITEM('s32', i),
status: K.ITEM('s8', 1),
start_time: K.ITEM('u64', BigInt(0)),
end_time: K.ITEM('u64', BigInt(0)),
param1: K.ITEM('u64', BigInt(0)),
param2: K.ITEM('u64', BigInt(0)),
});
}
return event;
};
const getPlayerData = async (refid: string, name?: string) => {
const p = await readProfile(refid);
if (name && name.length > 0) {
p.name = name;
await writeProfile(refid, p);
}
const param: any[] = [];
for (const t in p.params) {
const para = p.params[t];
param.push(K.ATTR({type: t}, {
count: K.ITEM('s32', para.length),
params_array: K.ARRAY('s32', para),
}));
}
const brooch: any[] = [];
for (const b in p.brooches) {
const bData = p.brooches[b];
brooch.push(K.ATTR({ index: b }, {
watch_count: K.ITEM('s32', bData.watch),
level: K.ITEM('s8', bData.level),
invested_steps: K.ITEM('s32', bData.steps),
is_new_brooch: K.ITEM('bool', bData.new),
}));
}
// Unlock brooches
for (let i = 101; i <= 124; ++i) {
brooch.push(K.ATTR({ index: `${i}` }, {
'watch_count': K.ITEM('s32', 0),
'level': K.ITEM('s8', 1),
'invested_steps': K.ITEM('s32', 0),
'is_new_brooch': K.ITEM('bool', 0),
}));
}
const kentei_record: any[] = [];
for (const k in p.kentei) {
const kentei = p.kentei[k];
kentei_record.push({
stage_prog: K.ITEM('s8', kentei.stage),
kentei_index: K.ITEM('s32', parseInt(k, 10)),
score: K.ARRAY('s32', kentei.score),
clear_rate: K.ITEM('s32', kentei.rate),
clear_flag: K.ITEM('u32', kentei.flag),
play_count: K.ITEM('s32', kentei.count),
});
}
const island_progress: any[] = [];
for (const i in p.islands) {
const island = p.islands[i];
const container: any[] = [];
for (const c in island.containers) {
const cont = island.containers[c];
const reward: any[] = [];
for (const r in cont.rewards) {
const rew = cont.rewards[r];
reward.push({
reward_index: K.ITEM('s32', parseInt(r, 10)),
point: K.ITEM('s32', rew),
});
}
container.push({
container_no: K.ITEM('s32', parseInt(c, 10)),
movie_prog: K.ITEM('s8', cont.prog),
reward,
});
}
island_progress.push(K.ATTR({ index: i }, {
lookUnlockWin: K.ITEM('s32', island.look),
select_container: K.ITEM('s32', island.select),
travelledTime: K.ITEM('u32', island.time),
container,
}));
}
return {
name: K.ITEM('str', p.name),
play_count: K.ITEM('s32', p.playCount),
today_play_count: K.ITEM('s32', p.todayPlayCount),
permitted_list,
event_info_list: { event: getEventInfo() },
music_list: {
flag: [
K.ARRAY('s32', p.musicList.type_0, { sheet_type: '0' }),
K.ARRAY('s32', p.musicList.type_1, { sheet_type: '1' }),
K.ARRAY('s32', p.musicList.type_2, { sheet_type: '2' }),
K.ARRAY('s32', p.musicList.type_3, { sheet_type: '3' }),
],
},
free_for_play_music_list: {
flag: [
K.ARRAY('s32', p.musicList2.type_0, { sheet_type: '0' }),
K.ARRAY('s32', p.musicList2.type_1, { sheet_type: '1' }),
K.ARRAY('s32', p.musicList2.type_2, { sheet_type: '2' }),
K.ARRAY('s32', p.musicList2.type_3, { sheet_type: '3' }),
],
},
last: {
music_index: K.ITEM('s32', p.music),
sheet_type: K.ITEM('s8', p.sheet),
brooch_index: K.ITEM('s32', p.brooch),
hi_speed_level: K.ITEM('s32', p.hispeed),
beat_guide: K.ITEM('s8', p.beatGuide),
headphone_volume: K.ITEM('s8', p.headphone),
judge_bar_pos: K.ITEM('s32', p.judgeBar),
music_group: K.ITEM('s32', p.group),
hands_mode: K.ITEM('s8', p.mode),
near_setting: K.ITEM('s8', p.near),
judge_delay_offset: K.ITEM('s8', p.offset),
bingo_index: K.ITEM('s32', p.bingo),
total_skill_value: K.ITEM('u64', BigInt(p.skill)),
key_beam_level: K.ITEM('s8', p.keyBeam),
orbit_type: K.ITEM('s8', p.orbit),
note_height: K.ITEM('s8', p.noteHeight),
note_width: K.ITEM('s8', p.noteWidth),
judge_width_type: K.ITEM('s8', p.judgeWidth),
beat_guide_volume: K.ITEM('s8', p.beatVolume),
beat_guide_type: K.ITEM('s8', p.beatType),
key_volume_offset: K.ITEM('s8', p.keyVolume),
bgm_volume_offset: K.ITEM('s8', p.bgmVolume),
note_disp_type: K.ITEM('s8', p.note),
slow_fast: K.ITEM('s8', p.sf),
judge_effect_adjust: K.ITEM('s8', p.judgeFX),
simple_bg: K.ITEM('s8', p.simple),
},
brooch_list: {
brooch,
},
extra_param: { param },
present_list: {},
various_music_list: {
data: [
K.ATTR({ list_type: '0' }, {
cond_flag: K.ITEM('s32', 0),
flag: K.ITEM('s32', 0, { sheet_type: '0' }),
}),
],
},
island_progress_list: { island_progress },
player_information_list: {},
kentei_record_list: { kentei_record },
linkage_data_list: {},
travel: {
money: K.ITEM('s32', p.money),
fame: K.ITEM('s32', p.fame),
fame_index: K.ITEM('s32', p.fameId),
island_id: K.ITEM('s32', p.island),
},
};
};
export const regist_playdata: EPR = async (info, data, send) => {
const refid = $(data).str('refid');
if (!refid) return send.deny();
const name = $(data).str('name');
console.debug(`nos op2 regist: ${name}`);
send.object(await getPlayerData(refid, name));
};
export const get_playdata: EPR = async (info, data, send) => {
const refid = $(data).str('refid');
if (!refid) return send.deny();
send.object(await getPlayerData(refid));
};
// export const set_stage_result: EPR = async (info, data, send) => {
// return send.object();
// };
export const set_total_result: EPR = async (info, data, send) => {
const refid = $(data).str('refid');
if (!refid) return send.deny();
const p = await readProfile(refid);
p.playCount = $(data).number('play_count', p.playCount);
p.todayPlayCount = $(data).number('today_play_count', p.todayPlayCount);
const last = $(data).element('last');
p.music = last.number('music_index', p.music);
p.sheet = last.number('sheet_type', p.sheet);
p.brooch = last.number('brooch_index', p.brooch);
p.hispeed = last.number('hi_speed_level', p.hispeed);
p.beatGuide = last.number('beat_guide', p.beatGuide);
p.headphone = last.number('headphone_volume', p.headphone);
p.judgeBar = last.number('judge_bar_pos', p.judgeBar);
p.group = last.number('music_group', p.group);
p.mode = last.number('hands_mode', p.mode);
p.near = last.number('near_setting', p.near);
p.offset = last.number('judge_delay_offset', p.offset);
p.bingo = last.number('bingo_index', p.bingo);
p.skill = `${last.bigint('total_skill_value') || p.skill}`;
p.keyBeam = last.number('key_beam_level', p.keyBeam);
p.orbit = last.number('orbit_type', p.orbit);
p.noteHeight = last.number('note_height', p.noteHeight);
p.noteWidth = last.number('note_width', p.noteWidth);
p.judgeWidth = last.number('judge_width_type', p.judgeWidth);
p.beatVolume = last.number('beat_guide_volume', p.beatVolume);
p.beatType = last.number('beat_guide_type', p.beatType);
p.keyVolume = last.number('key_volume_offset', p.keyVolume);
p.bgmVolume = last.number('bgm_volume_offset', p.bgmVolume);
p.note = last.number('note_disp_type', p.note);
p.sf = last.number('slow_fast', p.sf);
p.judgeFX = last.number('judge_effect_adjust', p.judgeFX);
p.simple = last.number('simple_bg', p.simple);
p.money = $(data).number('travel.money', p.money);
p.fame = $(data).number('travel.fame', p.fame);
p.fameId = $(data).number('travel.fame_index', p.fameId);
p.island = $(data).number('travel.island_id', p.island);
let flags = _.get($(data).obj, 'music_list.flag', []);
if (!_.isArray(flags)) flags = [flags];
for (const flag of flags) {
const sheet = _.get(flag, '@attr.sheet_type', -1);
if (sheet == '0') {
p.musicList.type_0 = _.get(flag, '@content', p.musicList.type_0);
} else if (sheet == '1') {
p.musicList.type_1 = _.get(flag, '@content', p.musicList.type_1);
} else if (sheet == '2') {
p.musicList.type_2 = _.get(flag, '@content', p.musicList.type_2);
} else if (sheet == '3') {
p.musicList.type_3 = _.get(flag, '@content', p.musicList.type_3);
}
}
let freeFlags = _.get($(data).obj, 'free_for_play_music_list.flag', []);
if (!_.isArray(freeFlags)) freeFlags = [freeFlags];
for (const flag of freeFlags) {
const sheet = _.get(flag, '@attr.sheet_type', -1);
if (sheet == '0') {
p.musicList2.type_0 = _.get(flag, '@content', p.musicList2.type_0);
} else if (sheet == '1') {
p.musicList2.type_1 = _.get(flag, '@content', p.musicList2.type_1);
} else if (sheet == '2') {
p.musicList2.type_2 = _.get(flag, '@content', p.musicList2.type_2);
} else if (sheet == '3') {
p.musicList2.type_3 = _.get(flag, '@content', p.musicList2.type_3);
}
}
// KENTEI
let kenteis = $(data).elements('kentei_result_list.kentei_result');
for (const kentei of kenteis) {
const index = kentei.number('kentei_index', -1);
if (index < 0) continue;
const clearRate = kentei.number('clear_rate', 0);
const oldClearRate = _.get(p, `kentei.${index}.rate`, 0);
const isHigh = clearRate >= oldClearRate;
p.kentei[index] = {
rate: isHigh ? clearRate : oldClearRate,
score: isHigh ? kentei.number('score', 0) : _.get(p, `kentei.${index}.score`, 0),
stage: Math.max(kentei.number('stage_prog', 0), _.get(p, `kentei.${index}.stage`, 0)),
flag: Math.max(kentei.number('clear_flag', 0), _.get(p, `kentei.${index}.flag`, 0)),
count: Math.max(kentei.number('play_count', 0), _.get(p, `kentei.${index}.count`, 0)),
};
}
// PARAMS
let params = $(data).elements('extra_param.param');
for (const param of params) {
const type = param.attr().type;
const parray = param.numbers('params_array');
if (type == null || parray == null) continue;
p.params[type] = parray;
}
// BROOCHES
let broochs = $(data).elements('brooch_list.brooch');
for (const brooch of broochs) {
const index = parseInt(_.get(brooch, '@attr.index', '-1'));
if (index < 0) continue;
p.brooches[index] = {
watch: brooch.number('watch_count', 0),
level: brooch.number('level', 1),
steps: brooch.number('invested_steps', 0),
new: brooch.number('is_new_brooch', 0),
};
}
// ISLAND
let islands = $(data).elements('island_progress_list.island_progress');
for (const island of islands) {
const index = parseInt(_.get(island, '@attr.index', '-1'));
if (index < 0) continue;
const containers: Profile['islands']['0']['containers'] = {};
let conts = $(data).elements('container');
for (const cont of conts) {
const index = cont.number('container_no', -1);
if (index < 0) continue;
const rewards: { [key: string]: number } = {};
let rews = $(data).elements('reward');
for (const rew of rews) {
const index = rew.number('reward_index', -1);
if (index < 0) continue;
rewards[index] = rew.number('point', 0);
}
containers[index] = {
prog: cont.number('movie_prog', 1),
rewards,
};
}
p.islands[index] = {
look: island.number('lookUnlockWin', 0),
select: island.number('select_container', 0),
time: island.number('travelledTime', 0),
containers,
};
}
await writeProfile(refid, p);
const scoreData = await readScores(refid);
// Save Scores
let stages = $(data).elements('stageinfo.stage');
for (const stage of stages) {
const mid = stage.attr().music_index
const type = stage.attr().sheet_type
const key = `${mid}:${type}`;
const c = stage.element('common');
const o = _.get(scoreData, `scores.${key}`, {});
const isHigh = c.number('score', 0) >= _.get(o, 'score', 0);
scoreData.scores[key] = {
score: Math.max(c.number('score', 0), _.get(o, 'score', 0)),
grade: Math.max(c.number('grade_basic', 0), _.get(o, 'grade', 0)),
recital: Math.max(c.number('grade_recital', 0), _.get(o, 'recital', 0)),
mode: isHigh ? c.number('hands_mode', 0) : _.get(o, 'mode', 0),
count: Math.max(c.number('play_count', 0), _.get(o, 'count', 1)),
clear: c.number('clear_count', _.get(o, 'clear', 0)),
multi: c.number('multi_count', _.get(o, 'multi', 0)),
flag: Math.max(c.number('clear_flag', 0), _.get(o, 'flag', 0)),
};
}
// Save Recitals
const rInfo = $(data).element('recital_info.recital');
if (rInfo){
const rIndex = rInfo.number('recital_index', -1);
if (rIndex >= 0) {
const r = rInfo.element('result');
const o = _.get(scoreData, `recitals.${rIndex}`);
const isHigh = r.number('total_score', 0) >= _.get(o, 'score', 0);
scoreData.recitals[rIndex] = {
count: Math.max(rInfo.number('recital_count', 0), _.get(o, 'count', 1)),
hall: isHigh ? rInfo.number('hall_index') : _.get(o, 'hall', 0),
cat: isHigh ? rInfo.numbers('cat_index') : _.get(o, 'cat', [3, 7, 9, 5, 16]),
audience: isHigh ? r.number('audience') : _.get(o, 'audience', 0),
money: isHigh ? r.number('money') : _.get(o, 'money', 0),
fame: isHigh ? r.number('fame') : _.get(o, 'fame', 0),
player: isHigh ? r.number('player_fame') : _.get(o, 'player', 0),
score: isHigh ? r.number('total_score', 0) : _.get(o, 'score', 0),
start: (isHigh ? r.number('recital_start_time', 0) : _.get(o, 'start', 0)).toString(),
end: (isHigh ? r.number('recital_end_time', 0) : _.get(o, 'end', 0)).toString(),
};
}
}
await writeScores(refid, scoreData);
send.success()
};
export const get_musicdata: EPR = async (info, data, send) => {
const refid = $(data).str('refid');
if (!refid) return send.deny();
const scoreData = await readScores(refid);
const recital_record: any[] = [];
const music: any[] = [];
for (const r in scoreData.recitals) {
const reci = scoreData.recitals[r];
recital_record.push({
recital_index: K.ITEM('s32', parseInt(r, 10)),
recital_count: K.ITEM('s32', reci.count),
hall_index: K.ITEM('s8', reci.hall),
cat_index: K.ARRAY('s16', reci.cat),
audience: K.ITEM('s32', reci.audience),
money: K.ITEM('s32', reci.money),
fame: K.ITEM('s32', reci.fame),
player_fame: K.ITEM('s32', reci.player),
total_score: K.ITEM('s32', reci.score),
total_base_score: K.ITEM('s32', reci.score),
best_start_time: K.ITEM('u64', BigInt(reci.start)),
best_end_time: K.ITEM('u64', BigInt(reci.end)),
});
}
for (const m in scoreData.scores) {
const mdata = m.split(':');
const musi = scoreData.scores[m];
music.push(K.ATTR({
music_index: mdata[0],
sheet_type: mdata[1],
}, {
'score': K.ITEM('s32', musi.score),
'grade_basic': K.ITEM('u32', musi.grade),
'grade_recital': K.ITEM('u32', musi.recital),
'play_count': K.ITEM('s32', musi.count),
'clear_count': K.ITEM('s32', musi.clear),
'multi_count': K.ITEM('s32', musi.multi),
'hands_mode': K.ITEM('s8', musi.mode),
'clear_flag': K.ITEM('s32', musi.flag),
}));
}
send.object({
recital_record,
music,
});
};
async function readProfile(refid: string): Promise<Profile> {
const profile = await DB.FindOne<Profile>(refid, { collection: 'profile'} )
return profile || defaultProfile
}
async function writeProfile(refid: string, profile: Profile) {
await DB.Upsert<Profile>(refid, { collection: 'profile'}, profile)
}
async function readScores(refid: string): Promise<Scores> {
const score = await DB.FindOne<Scores>(refid, { collection: 'scores'} )
return score || { collection: 'scores', recitals: {}, scores: {}}
}
async function writeScores(refid: string, scores: Scores) {
await DB.Upsert<Scores>(refid, { collection: 'scores'}, scores)
}
const defaultProfile: Profile = {
collection: 'profile',
name: 'GUEST',
music: 0,
sheet: 0,
brooch: 0,
hispeed: 0,
beatGuide: 1,
headphone: 0,
judgeBar: 250,
group: 0,
mode: 0,
near: 0,
offset: 0,
bingo: 0,
skill: '0',
playCount: 0,
todayPlayCount: 0,
keyBeam: 0,
orbit: 0,
noteHeight: 10,
noteWidth: 0,
judgeWidth: 0,
beatVolume: 0,
beatType: 0,
keyVolume: 0,
bgmVolume: 0,
note: 0,
sf: 0,
judgeFX: 0,
simple: 0,
money: 0,
fame: 0,
fameId: 0,
island: 0,
brooches: {
'1': {
level: 1,
watch: 0,
steps: 0,
new: 0,
},
},
islands: {},
kentei: {},
params: {
'1': [0],
},
musicList: {
type_0: Array(32).fill(-1),
type_1: Array(32).fill(-1),
type_2: Array(32).fill(-1),
type_3: Array(32).fill(-1),
},
musicList2: {
type_0: Array(32).fill(-1),
type_1: Array(32).fill(-1),
type_2: Array(32).fill(-1),
type_3: Array(32).fill(-1),
},
}

View File

@ -0,0 +1,28 @@
import { get_common_info, get_music_info } from "./handler/common";
import { get_musicdata, get_playdata, regist_playdata, set_total_result} from "./handler/player"
export function register() {
R.GameCode('PAN');
const MultiRoute = (method: string, handler: EPR | boolean) => {
// Helper for register multiple versions.
// But.. only Opus 2 for now.
R.Route(`op2_${method}`, handler);
};
const CommonRoute = (method: string, handler: EPR | boolean) =>
MultiRoute(`common.${method}`, handler)
const PlayerRoute = (method: string, handler: EPR | boolean) =>
MultiRoute(`player.${method}`, handler)
// Common
CommonRoute('get_common_info', get_common_info);
CommonRoute('get_music_info', get_music_info);
// Player
PlayerRoute('get_musicdata', get_musicdata)
PlayerRoute('get_playdata', get_playdata)
PlayerRoute('regist_playdata', regist_playdata)
PlayerRoute('set_total_result', set_total_result)
}

View File

@ -0,0 +1,82 @@
export interface Profile {
collection: 'profile',
name: string;
playCount: number;
todayPlayCount: number;
music: number;
sheet: number;
brooch: number;
hispeed: number;
beatGuide: number;
headphone: number;
judgeBar: number;
group: number;
mode: number;
near: number;
offset: number;
bingo: number;
skill: string;
keyBeam: number;
orbit: number;
noteHeight: number;
noteWidth: number;
judgeWidth: number;
beatVolume: number;
beatType: number;
keyVolume: number;
bgmVolume: number;
note: number;
sf: number;
judgeFX: number;
simple: number;
money: number;
fame: number;
fameId: number;
island: number;
params: {
[key: string]: number[];
};
brooches: {
[key: string]: {
watch: number;
level: number;
steps: number;
new: number;
};
};
islands: {
[key: string]: {
look: number;
select: number;
time: number;
containers: {
[key: string]: {
prog: number;
rewards: { [key: string]: number };
};
};
};
};
kentei: {
[key: string]: {
stage: number;
score: number[];
rate: number;
flag: number;
count: number;
};
};
musicList: {
type_0: number[];
type_1: number[];
type_2: number[];
type_3: number[];
};
musicList2: {
type_0: number[];
type_1: number[];
type_2: number[];
type_3: number[];
};
}

View File

@ -0,0 +1,30 @@
export interface Scores {
collection: 'scores',
recitals: {
[key: string]: {
count: number;
hall: number;
cat: number[];
audience: number;
money: number;
fame: number;
player: number;
score: number;
start: string;
end: string;
};
};
scores: {
[key: string]: {
score: number;
grade: number;
recital: number;
count: number;
clear: number;
multi: number;
mode: number;
flag: number;
};
};
}