Skip to content

Commit

Permalink
Merge pull request #160 from MahjongPantheon/nagashi-online
Browse files Browse the repository at this point in the history
Add nagashi support for online
  • Loading branch information
ctizen committed Nov 1, 2020
2 parents 353cdd8 + fd55310 commit 648b001
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 11 deletions.
48 changes: 41 additions & 7 deletions Mimir/src/helpers/onlineLog/Parser.php
Expand Up @@ -27,6 +27,7 @@ class OnlineParser
protected $_checkScores = [];
protected $_roundData = [];
/**
* (username => PlayerPrimitive)
* @var PlayerPrimitive[]
*/
protected $_players = [];
Expand Down Expand Up @@ -115,6 +116,31 @@ protected function _parseOutcome($content)
return [];
}

/**
* Get nagashi scores
*
* @param $content
* @return string comma-separated player ids
*/
protected function _parseNagashi($content)
{
list(
/* score1 */, $delta1,
/* score2 */, $delta2,
/* score3 */, $delta3,
/* score4 */, $delta4
) = array_map('intval', explode(',', $content));

$ids = [];
foreach ([$delta1, $delta2, $delta3, $delta4] as $idx => $val) {
if ($val > 0) {
$ids []= array_values($this->_players)[$idx]->getId();
}
}

return implode(',', $ids);
}

protected function _getRiichi()
{
$riichis = $this->_riichi;
Expand Down Expand Up @@ -274,14 +300,10 @@ protected function _tokenINIT()
protected function _tokenRYUUKYOKU(\XMLReader $reader)
{
$rkType = $reader->getAttribute('type');
$this->_checkScores []= $this->_makeScores($reader->getAttribute('sc'));

if ($rkType && $rkType == 'nm') {
// TODO: nagashi mangan (need to implement it in lower layers too)
return;
}
$scoreString = $reader->getAttribute('sc');
$this->_checkScores []= $this->_makeScores($scoreString);

if ($rkType) { // abortive draw
if ($rkType && $rkType != 'nm') { // abortive draw
$this->_roundData []= [
'outcome' => 'abort',
'riichi' => $this->_getRiichi(),
Expand All @@ -308,6 +330,18 @@ function (PlayerPrimitive $el) {
)
);

// Special case for nagashi
if ($rkType && $rkType == 'nm') {
$this->_roundData []= [
'outcome' => 'nagashi',
'riichi' => $this->_getRiichi(),
'nagashi' => $this->_parseNagashi($scoreString),
'tempai' => implode(',', array_keys($tempai)),
];

return;
}

$this->_roundData []= [
'outcome' => 'draw',
'tempai' => implode(',', array_keys($tempai)),
Expand Down
13 changes: 13 additions & 0 deletions Mimir/tests/helpers/onlineLog/ParserTest.php
Expand Up @@ -155,6 +155,19 @@ public function testParseDoubleRonAndHonbaBets()
);
}

public function testParseNagashiMangan()
{
$content = file_get_contents(__DIR__ . '/testdata/nagashi.xml');
list($success, $results/*, $debug*/) = (new OnlineParser($this->_db))
->parseToSession($this->_session, $content);

$this->assertTrue($success);
$this->assertEquals(
$results,
$this->_session->getCurrentState()->getScores()
);
}

public function testHanchanWithWestRound()
{
$content = file_get_contents(__DIR__ . '/testdata/west.xml');
Expand Down
6 changes: 2 additions & 4 deletions Mimir/tests/helpers/onlineLog/testdata/nagashi.xml
Expand Up @@ -9,8 +9,7 @@
seed="mt19937ar-sha512-n288-base64,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"
ref=""/>
<GO type="9" lobby="0"/>
<UN n0="%6D%69%73%61%6B%61%31%31" n1="%E3%81%82%E3%81%B3%E3%82%83%EF%BD%9E"
n2="%E3%82%88%E3%81%97%E3%81%8A%31%31%32%35" n3="%63%6F%70%70%72%6F" dan="3,0,0,6"
<UN n0="player1" n1="player2" n2="player3" n3="player4" dan="3,0,0,6"
rate="1474.36,1500.00,1500.00,1474.86" sx="M,M,M,M"/>
<TAIKYOKU oya="0"/>
<INIT seed="0,0,0,2,0,118" ten="250,250,250,250" oya="0" hai0="17,133,30,27,75,59,45,84,1,23,46,83,76"
Expand Down Expand Up @@ -163,7 +162,6 @@
<E36/>
<RYUUKYOKU type="nm" ba="0,2" sc="240,-40,250,-20,240,-20,250,80" hai0="1,2,3,17,23,27,45,46,48,59,76,83,84"
hai1="13,14,15,49,53,77,78,92,97,98,101,102,105" hai2="4,9,18,21,25,51,52,56,60,61,62,80,81"/>
<UN n0="%6D%69%73%61%6B%61%31%31"/>
<INIT seed="0,1,2,0,3,67" ten="200,230,220,330" oya="0" hai0="30,129,54,131,1,48,12,113,101,8,80,24,2"
hai1="71,40,18,125,7,86,23,91,83,46,65,60,19" hai2="121,45,103,44,38,122,43,123,84,53,115,127,95"
hai3="25,17,89,76,79,66,82,133,105,109,10,81,41"/>
Expand Down Expand Up @@ -1126,4 +1124,4 @@
<AGARI ba="0,0" hai="48,50,52,58,59,60,61,67" m="47179,51818" machi="59" ten="30,7700,0" yaku="20,1,34,2,54,1"
doraHai="80" who="0" fromWho="2" sc="181,77,226,0,228,-77,365,0"
owari="258,6.0,226,-17.0,151,-35.0,365,46.0"/>
</mjloggm>
</mjloggm>

0 comments on commit 648b001

Please sign in to comment.