1413acc715b3a9852053025f8c7bd2f304a2676e
5 use Services\ISimfileParser
;
8 class SimfileParser
implements ISimfileParser
11 // 'light' => 'Novice',
12 // 'beginner' => 'Novice',
14 // 'medium' => 'Medium',
16 // 'challenge' => 'Expert',
19 private $_smFileLines;
21 public function parse($simfileData)
23 $this->_smFileLines
= explode(";", $simfileData);
26 public function banner()
28 return $this->extractKey('BANNER') ?
: null
;
31 public function title()
33 $title = $this->extractKey('TITLE');
34 if(!$title) throw new Exception ('Invalid SM file. TITLE missing');
39 public function artist()
41 $artist = $this->extractKey('ARTIST');
42 if(!$artist) throw new Exception ('Invalid SM file. ARTIST missing');
44 return new \Domain\VOs\StepMania\
Artist($artist);
47 public function stops()
49 $stops = $this->extractKey('STOPS');
50 if($stops === false
) throw new Exception ('Invalid SM file. STOPS missing');
55 public function fgChanges()
57 $fgChanges = $this->extractKey('FGCHANGES');
58 //XXX: Looks like fgChanges is allowed to be missing.
59 //if($fgChanges === false) throw new Exception ('Invalid SM file. FGCHANGES missing');
61 return (bool
)$fgChanges;
66 $displayBpm = $this->extractKey('DISPLAYBPM');
70 $bpmRange = explode(":",$displayBpm);
71 $bpmRange[1] = @$bpmRange[1] ?
: $bpmRange[0];
73 $bpms = $this->extractKey('BPMS');
74 $bpmRange = $this->parseBpms($bpms);
77 //I have nfi why I made the BPM VO high-low instead of low-high in the constructor but yolo
78 return new \Domain\VOs\StepMania\
BPM($bpmRange[1], $bpmRange[0]);
81 public function bgChanges()
83 $bgChanges = $this->extractKey('BGCHANGES');
84 if($bgChanges === false
) throw new Exception ('Invalid SM file. BGCHANGES missing');
86 return (bool
)$bgChanges;
89 public function bpmChanges()
91 $bpms = $this->extractKey('BPMS');
92 if(!$bpms) throw new Exception ('Invalid SM file. BPMS missing');
94 $bpmRange = $this->parseBpms($bpms);
95 //XXX: We have bpm changes when the high and low bpms are different.
96 return $bpmRange[0] != $bpmRange[1];
99 public function subtitle()
101 $subtitle = $this->extractKey('SUBTITLE');
102 if(!$subtitle) throw new Exception ('Invalid SM file. SUBTITLE missing');
109 if(empty($this->_smFileLines
)) throw new Exception('SM file data not set.');
112 foreach ($this->_smFileLines
as $line)
114 $pos = strpos($line, '#NOTES:');
117 $noteData = trim(substr($line, $pos +
9));
118 $allSteps[] = $this->stepchartFromNoteData($noteData);
122 if(empty($allSteps)) throw new Exception('Invalid Sm file. NOTES missing');
126 private function stepchartFromNoteData($noteData)
128 $stepData = array_map('trim', explode(':', $noteData));
129 return new \Domain\VOs\StepMania\
StepChart(
130 new \Domain\VOs\StepMania\
DanceMode($stepData[0]),
131 new \Domain\VOs\StepMania\
Difficulty($stepData[2]),
132 empty($stepData[1]) ? null
: new \Domain\VOs\StepMania\
StepArtist($stepData[1]),
137 private function extractKey($key)
139 if(empty($this->_smFileLines
)) throw new Exception('SM file data not set.');
141 foreach ($this->_smFileLines
as $line)
143 $pos = strpos($line, '#' . $key . ':');
144 if ($pos !== false
) return trim(substr($line, $pos +
strlen($key) +
2));
150 private function parseBpms($bpms)
152 $bpms = explode(",", $bpms);
153 $bpmRange = array('high' => null
, 'low' => null
);
155 foreach($bpms as $bpm)
157 $bpmMeasure = explode('=', $bpm);
158 $bpmValue = floatval($bpmMeasure[1]);
160 if(empty($bpmRange['low'])) $bpmRange['low'] = $bpmRange['high'] = $bpmValue;
162 $bpmRange['high'] = ($bpmValue > $bpmRange['high']) ?
$bpmValue : $bpmRange['high'];
163 $bpmRange['low'] = ($bpmValue < $bpmRange['low']) ?
$bpmValue : $bpmRange['low'];
166 return array($bpmRange['low'], $bpmRange['high']);