예제 #1
0
파일: mgm.c 프로젝트: Sappharad/mgba
uint16_t GBAMGMQueryInput(struct GBARRContext* rr) {
	if (!rr->isPlaying(rr)) {
		return 0;
	}

	struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr;
	if (mgm->peekedTag == TAG_INPUT) {
		_readTag(mgm, mgm->movieStream);
	}
	mgm->inputThisFrame = true;
	if (mgm->currentInput == INVALID_INPUT) {
		GBALog(0, GBA_LOG_WARN, "[RR] Stream did not specify input");
	}
	GBALog(0, GBA_LOG_DEBUG, "[RR] Input replay: %03X", mgm->currentInput);
	return mgm->currentInput;
}
예제 #2
0
void XmlParser::_processXmlNode() {
    const int nodeType       = xmlTextReaderNodeType(_reader);
//        const int isEmptyElement = xmlTextReaderIsEmptyElement(_reader);
//        const int hasTextValue   = xmlTextReaderHasValue(_reader);
    
    std::string value;
    const xmlChar *val = xmlTextReaderConstValue(_reader);
    if (val != NULL) {
        value = (char*) val;
    }
    
    std::string name;
    const xmlChar *n = xmlTextReaderConstName(_reader);
    if (n != NULL) {
        name = (char*) n;
    }
    
    
//        std::cout   << "name: " << name << '\n'
//        << "value: " << value << '\n'
//        << "nodeType: " << nodeType << '\n'
//        << "isEmptyElement: " << isEmptyElement << '\n'
//        << "hasTextValue: " << hasTextValue << "\n\n";
    
    if (nodeType == XmlNodeType::ELEMENT) {
        if (name == "osm") {
            _readOsm();
        } else if (name == "note") {
            _readNote();
        } else if (name == "meta") {
            _readMeta();
        } else if (name == "node") {
            _readNode();
        } else if (name == "way") {
            _readWay();
        } else if (name == "relation") {
            _readRelation();
        } else if (name == "tag") {
            _readTag();
        } else if (name == "nd") {
            _readNd();
        } else if (name == "member") {
            _readMember();
        }
    }
}
예제 #3
0
파일: mgm.c 프로젝트: Sappharad/mgba
void GBAMGMNextFrame(struct GBARRContext* rr) {
	if (!rr->isRecording(rr) && !rr->isPlaying(rr)) {
		return;
	}

	struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr;
	if (rr->isPlaying(rr)) {
		while (mgm->peekedTag == TAG_INPUT) {
			_readTag(mgm, mgm->movieStream);
			GBALog(0, GBA_LOG_WARN, "[RR] Desync detected!");
		}
		if (mgm->peekedTag == TAG_LAG) {
			GBALog(0, GBA_LOG_DEBUG, "[RR] Lag frame marked in stream");
			if (mgm->inputThisFrame) {
				GBALog(0, GBA_LOG_WARN, "[RR] Lag frame in stream does not match movie");
			}
		}
	}

	++mgm->d.frames;
	GBALog(0, GBA_LOG_DEBUG, "[RR] Frame: %u", mgm->d.frames);
	if (!mgm->inputThisFrame) {
		++mgm->d.lagFrames;
		GBALog(0, GBA_LOG_DEBUG, "[RR] Lag frame: %u", mgm->d.lagFrames);
	}

	if (rr->isRecording(rr)) {
		if (!mgm->inputThisFrame) {
			_emitTag(mgm, mgm->movieStream, TAG_LAG);
		}
		_emitTag(mgm, mgm->movieStream, TAG_FRAME);
		mgm->inputThisFrame = false;
	} else {
		if (!_seekTag(mgm, mgm->movieStream, TAG_FRAME)) {
			_streamEndReached(mgm);
		}
	}
}
예제 #4
0
파일: mgm.c 프로젝트: Sappharad/mgba
bool _parseMetadata(struct GBAMGMContext* mgm, struct VFile* vf) {
	if (!_verifyMagic(mgm, vf)) {
		return false;
	}
	while (_readTag(mgm, vf) != TAG_EOF) {
		switch (mgm->peekedTag) {
		case TAG_MAX_STREAM:
			mgm->maxStreamIdOffset = vf->seek(vf, 0, SEEK_CUR);
			break;
		case TAG_INIT_EX_NIHILO:
		case TAG_INIT_FROM_SAVEGAME:
		case TAG_INIT_FROM_SAVESTATE:
		case TAG_INIT_FROM_BOTH:
			mgm->initFromOffset = vf->seek(vf, 0, SEEK_CUR);
			break;
		case TAG_RR_COUNT:
			mgm->rrCountOffset = vf->seek(vf, 0, SEEK_CUR);
			break;
		default:
			break;
		}
	}
	return true;
}