{% extends "base.html" %} {% block body %}
As the previous pages have eluded to (you did read them, didn't you?), eAmuse uses HTTP as its main way of getting data around. This means we need an HTTP server running but, as we'll see, we don't need to think too hard about that.
Every request made is a POST
request, to //<model>/<module>/<method>
,
with its body being encoded data as described in the previous sections. In addition to the
X-Compress:
and X-Eamuse-Info:
headers previously detailed, there is also a
X-PCB-ID:
header. that can be set. Your machine's PCB ID uniquely defines the physical board. This
header is added in out-bound requests, and allows the server to identify you. Importantly, it's also the value
that the server uses to identify which machines are authorized to be on the network, and which are not.
Every request is followed immediately by a response. Any response code other than 200
is considered
a failure.
All requests follow a basic format:
<call model="model" srcid="srcid" tag="tag">
<module method="method" ...attributes>
children
</module>
</call>
The responses follow a similar format:
<response>
<module status="status" ...attributes>
children
</module>
</response>
With "0"
being a successful status. Convention is to identify a specific method as
module.method
, and we'll be following this convention in this document too. There are
a lot of possible methods, so the majority of this document is a big reference for them all. There are a
number of generic methods, and a number of game specific ones. If you haven't clocked yet, I've been working on
an SDVX 4 build for most of these pages, and each game also comes with its own set of game-specific methods.
These are namespaces under the game.%s
module and, in the case of SDVX 4, are all
game.sv4_method
. I may or may not document the SDVX 4 specific methods, but I've listed them
here anyway for completeness.
Paths in the XML bodies are formatted using an XPath-like syntax. That is, status@/response
gets the
status
attribute from response
, and response/eacoin/sequence
would return
that node's value.
NOTE: I am using the non-standard notation of <node* ...
and
<node attr*="" ...
to indicate that an attribute or node is not always present! Additionally, I
am going to use the notation of <node[]>
to indicate that a node repeats.
Status | Meaning |
0 |
Success |
109 |
No profile |
110 |
Not allowed |
112 |
Card not found (cardmng.inquire ) |
116 |
Card pin invalid (cardmng.authpass ) |
Turns out bemani have been quite sensible in how they implemented their code for creating structures, so it's rather readable. That said, if you've been using Ghidra (like me!), this is the time to switch to IDA. I'll let the below screenshots below speak for themselves:
I know which of these I'd rather use for reverse engineering (sorry, Ghidra)!
eventlog.%s
playerdata.%s
playerdata.usergamedata_send
playerdata.usergamedata_recv
playerdata.usergamedata_inheritance
playerdata.usergamedata_condrecv
playerdata.usergamedata_scorerank
matching.%s
system.%s
esoc.%s
cardmng.%s
cardmng.inquire
cardmng.getrefid
cardmng.bindmodel
cardmng.bindcard
cardmng.authpass
cardmng.getkeepspan
cardmng.getkeepremain
cardmng.getdatalist
esign.%s
package.%s
userdata.%s
services.%s
pcbtracker.%s
pcbevent.%s
message.%s
facility.%s
apsmanager.%s
sidmgr.%s
dlstatus.%s
eacoin.%s
eacoin.checkin
eacoin.checkout
eacoin.consume
eacoin.getbalance
eacoin.getecstatus
eacoin.touch
eacoin.opchpass
eacoin.opcheckin
eacoin.opcheckout
eacoin.getlog
traceroute.%s
game.%s
game.sv4_sample
game.sv4_new
game.sv4_load
game.sv4_load_m
game.sv4_save
game.sv4_save_m
game.sv4_common
game.sv4_shop
game.sv4_hiscore
game.sv4_buy
game.sv4_exception
game.sv4_entry_s
game.sv4_entry_e
game.sv4_frozen
game.sv4_lounge
game.sv4_save_e
game.sv4_save_pb
game.sv4_save_c
game.sv4_play_s
game.sv4_play_e
game.sv4_serial
game.sv4_save_fi
game.sv4_print
game.sv4_print_h
game.sv4_load_r
game.sv4_save_campaign
services.get
):
numbering
pkglist
userid
local
local2
lobby
lobby2
netlog
globby
I'll try and figure these out in due course, promise!
{% endblock %}