1
0
mirror of synced 2025-01-18 22:24:04 +01:00

Initial work to get festo happy with core network packets. For some reason it crashes on coin-in however.

This commit is contained in:
Jennifer Taylor 2022-08-13 20:28:36 +00:00
parent 8c1d272c72
commit 2349529022
2 changed files with 376 additions and 1 deletions

View File

@ -814,6 +814,7 @@ class JubeatClan(
all_music_matching = Node.void('all_music_matching')
info.add_child(all_music_matching)
all_music_matching.add_child(Node.bool('is_available', True))
team = Node.void('team')
all_music_matching.add_child(team)
team.add_child(Node.s32('default_flag', 0))

View File

@ -1,10 +1,11 @@
# vim: set fileencoding=utf-8
from typing import Optional
from typing import Dict, List, Optional
from bemani.backend.jubeat.base import JubeatBase
from bemani.backend.jubeat.clan import JubeatClan
from bemani.common import VersionConstants
from bemani.protocol import Node
class JubeatFesto(JubeatBase):
@ -12,5 +13,378 @@ class JubeatFesto(JubeatBase):
name: str = 'Jubeat Festo'
version: int = VersionConstants.JUBEAT_FESTO
EVENTS: Dict[int, Dict[str, bool]] = {
5: {
'enabled': False,
},
6: {
'enabled': False,
},
# Something to do with maintenance mode?
15: {
'enabled': True,
},
22: {
'enabled': False,
},
23: {
'enabled': False,
},
33: {
'enabled': False,
},
101: {
'enabled': False,
},
102: {
'enabled': False,
},
103: {
'enabled': False,
},
104: {
'enabled': False,
},
105: {
'enabled': False,
},
106: {
'enabled': False,
},
107: {
'enabled': False,
},
108: {
'enabled': False,
},
109: {
'enabled': False,
},
}
# Return the netlog service so that Festo doesn't crash on coin-in.
extra_services: List[str] = [
'netlog',
]
def previous_version(self) -> Optional[JubeatBase]:
return JubeatClan(self.data, self.config, self.model)
def __get_global_info(self) -> Node:
info = Node.void('info')
# Event info.
event_info = Node.void('event_info')
info.add_child(event_info)
for event in self.EVENTS:
evt = Node.void('event')
event_info.add_child(evt)
evt.set_attribute('type', str(event))
evt.add_child(Node.u8('state', 1 if self.EVENTS[event]['enabled'] else 0))
# Each of the following two sections should have zero or more child nodes (no
# particular name) which look like the following:
# <node>
# <id __type="s32">songid</id>
# <stime __type="str">start time?</stime>
# <etime __type="str">end time?</etime>
# </node>
# Share music?
share_music = Node.void('share_music')
info.add_child(share_music)
genre_def_music = Node.void('genre_def_music')
info.add_child(genre_def_music)
weekly_music = Node.void('weekly_music')
info.add_child(weekly_music)
weekly_music.add_child(Node.s32("value", 0))
# The following section should have zero or more child nodes (no particular
# name) which look like the following, with a song ID in the node's id attribute:
# <node id="" />
weekly_music_list = Node.void('music_list')
weekly_music.add_child(weekly_music_list)
info.add_child(Node.s32_array(
'black_jacket_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'white_music_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'add_default_music_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'open_music_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'shareable_music_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'hot_music_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'white_marker_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
info.add_child(Node.s32_array(
'white_theme_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
jbox = Node.void('jbox')
info.add_child(jbox)
jbox.add_child(Node.s32('point', 0))
emblem = Node.void('emblem')
jbox.add_child(emblem)
normal = Node.void('normal')
emblem.add_child(normal)
premium = Node.void('premium')
emblem.add_child(premium)
normal.add_child(Node.s16('index', 2))
premium.add_child(Node.s16('index', 1))
born = Node.void('born')
info.add_child(born)
born.add_child(Node.s8('status', 0))
born.add_child(Node.s16('year', 0))
expert_option = Node.void('expert_option')
info.add_child(expert_option)
expert_option.add_child(Node.bool('is_available', True))
# TODO: Make this configurable.
konami_logo_50th = Node.void('konami_logo_50th')
info.add_child(konami_logo_50th)
konami_logo_50th.add_child(Node.bool('is_available', True))
# TODO: Make this configurable.
all_music_matching = Node.void('all_music_matching')
info.add_child(all_music_matching)
all_music_matching.add_child(Node.bool('is_available', True))
question_list = Node.void('question_list')
info.add_child(question_list)
department = Node.void('department')
info.add_child(department)
department.add_child(Node.void('shop_list'))
# TODO: team_batle
# TODO: qr
# TODO: course_list
# TODO: emo_list
# TODO: hike_event
# TODO: tip_list
# TODO: festo_dungeon
# TODO: travel
# TODO: stamp
return info
def handle_demodata_get_info_request(self, request: Node) -> Node:
root = Node.void('demodata')
data = Node.void('data')
root.add_child(data)
info = Node.void('info')
data.add_child(info)
# This is the same stuff set in the common info, so if we ever do make this
# configurable, I think we'll need to return the same thing in both spots.
info.add_child(Node.s32_array(
'black_jacket_list',
[
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
],
))
return root
def handle_demodata_get_news_request(self, request: Node) -> Node:
root = Node.void('demodata')
data = Node.void('data')
root.add_child(data)
officialnews = Node.void('officialnews')
data.add_child(officialnews)
officialnews.set_attribute('count', '0')
return root
def handle_demodata_get_jbox_list_request(self, request: Node) -> Node:
root = Node.void('demodata')
return root
def handle_ins_netlog_request(self, request: Node) -> Node:
root = Node.void('ins')
return root
def handle_shopinfo_regist_request(self, request: Node) -> Node:
# Update the name of this cab for admin purposes
self.update_machine_name(request.child_value('shop/name'))
shopinfo = Node.void('shopinfo')
data = Node.void('data')
shopinfo.add_child(data)
data.add_child(Node.u32('cabid', 1))
data.add_child(Node.string('locationid', 'nowhere'))
data.add_child(Node.u8('tax_phase', 1))
facility = Node.void('facility')
data.add_child(facility)
facility.add_child(Node.u32('exist', 1))
data.add_child(self.__get_global_info())
return shopinfo