/** * @param Replay $replay * @param BinaryReader $br * @param int $frameNumber * @return Replication */ public static function deserialize($replay, $br, $frameNumber) { $r = new self(); $r->actorId = bindec(strrev($br->readBits(10))); $r->channelState = $br->readBit(); if (!$r->channelState) { $replay->closeActor($r->actorId, $frameNumber); return $r; } $r->actorState = $br->readBit(); if ($r->actorState) { // New actor $r->propertyFlag = $br->readBit(); // seems to always be 0 since we are creating a new actor $r->actorObjectId = bindec(strrev($br->readBits(8))); $actor = $replay->createActor($r->actorId, $r->actorObjectId, $frameNumber); $actor->deserializeInit($br); print "Actor #{$actor->id} {$actor->class} R:{$actor->rotator} P:{$actor->position} O:{$actor->orientation}\n"; } else { // Existing actor print "existing actor\n"; $actor = $replay->getActor($r->actorId); while ($br->readBit()) { $actor->updateProperty(ActorProperty::deserialize($replay, $br, $actor)); } } return $r; }
/** * @param BinaryReader $br * @return Vector */ public static function deserializeOrientation($br) { $p = 0; $y = 0; $r = 0; if ($br->readBit()) { $p = bindec(strrev($br->readBits(8))); } if ($br->readBit()) { $y = bindec(strrev($br->readBits(8))); } if ($br->readBit()) { $r = bindec(strrev($br->readBits(8))); } return new self($p, $y, $r); }
/** * @param Replay $replay * @param BinaryReader $br * @param int $number * @return Frame */ public static function deserialize($replay, $br, $number) { $frame = new self($number); $frame->time = $br->readFloat(); $frame->diff = $br->readFloat(); while ($br->readBit() == 1) { $frame->replications[] = Replication::deserialize($replay, $br, $frame->number); } print "end\n"; print $br->readBits(200); print "\n"; return $frame; }