mirror of
https://github.com/asphyxia-core/plugins.git
synced 2026-03-21 17:34:46 -05:00
Initial Nostalgia Support.
This commit is contained in:
parent
7e52d72c26
commit
2f59174f18
14
nostalgia@asphyxia/README.md
Normal file
14
nostalgia@asphyxia/README.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# Nostalgia
|
||||
|
||||
Plugin Version: **v1.0.0**
|
||||
|
||||
Supported Versions
|
||||
-------------------
|
||||
- Op.2
|
||||
|
||||
Changelog
|
||||
=========
|
||||
1.0.0
|
||||
-----
|
||||
Initial Release.
|
||||
|
||||
699
nostalgia@asphyxia/data/course.xml
Normal file
699
nostalgia@asphyxia/data/course.xml
Normal 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>
|
||||
1996
nostalgia@asphyxia/data/island.xml
Normal file
1996
nostalgia@asphyxia/data/island.xml
Normal file
File diff suppressed because it is too large
Load Diff
114
nostalgia@asphyxia/handler/common.ts
Normal file
114
nostalgia@asphyxia/handler/common.ts
Normal 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),
|
||||
},
|
||||
});
|
||||
};
|
||||
553
nostalgia@asphyxia/handler/player.ts
Normal file
553
nostalgia@asphyxia/handler/player.ts
Normal 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),
|
||||
},
|
||||
}
|
||||
28
nostalgia@asphyxia/index.ts
Normal file
28
nostalgia@asphyxia/index.ts
Normal 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)
|
||||
}
|
||||
82
nostalgia@asphyxia/models/profile.ts
Normal file
82
nostalgia@asphyxia/models/profile.ts
Normal 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[];
|
||||
};
|
||||
}
|
||||
30
nostalgia@asphyxia/models/scores.ts
Normal file
30
nostalgia@asphyxia/models/scores.ts
Normal 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;
|
||||
};
|
||||
};
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user