void CModelViewRender::OnDestroy() { StopSequence(); // delete scene root DeleteEEObject(&m_hszSceneName); DeactivateView(); CView::OnDestroy(); }
public func Dlg_IolosFather(object player) { var has_dialogue_iolo = player.dialogue_guardsman_elevator && !player.dialogue_iolo_arrow; // talked to guardsman about the elevator var has_dialogue_crowbar = player.dialogue_pirat_get_quest == DIALOGUE_Pirat_QuestWaiting && !player.dialogue_carpenter_crowbar && !player.dialogue_iolos_father_angry; var has_final_dialogue = player.dialogue_iolos_father_angry; if (has_dialogue_iolo) { var in_sequence = GetActiveSequence() && GetActiveSequence().seq_name == "Iolo_Comes"; if (!in_sequence) { DlgText("$DlgIoloFatherA01$", player); DlgText("$DlgIoloFatherA02$"); DlgText("$DlgIoloFatherA03$"); DlgText("$DlgIoloFatherA04$"); DlgText("$DlgIoloFatherA05$"); DlgText("$DlgIoloFatherA06$"); DlgText("$DlgIoloFatherA07$"); if (DlgEvent()) { StartSequence("Iolo_Comes", 0, this, player, false); } } else { DlgText("$DlgIoloFatherA08$", npc_iolo); DlgText("$DlgIoloFatherA09$"); DlgText("$DlgIoloFatherA10$", player); DlgText("$DlgIoloFatherA11$", player); DlgText("$DlgIoloFatherA12$", player); DlgText("$DlgIoloFatherA13$", npc_iolo); if (DlgEvent()) { player.dialogue_iolo_arrow = true; StopSequence(); } } } else if (has_dialogue_crowbar) { DlgText("$DlgIoloFatherB01$", player); DlgText("$DlgIoloFatherB02$"); if (DlgEvent()) { player.dialogue_iolos_father_angry = true; } } else if (has_final_dialogue) { DlgText("$DlgIoloFatherB03$"); } else // default dialogue { DlgText("$DlgIoloFatherB04$", player); DlgText("$DlgIoloFatherB05$"); } }
public func Dlg_Iolo(object player) { var has_dialogue_arrow = player.dialogue_iolo_arrow && !player.dialogue_iolo_has_arrow; var has_dialogue_elevator = GetActiveSequence() && GetActiveSequence().seq_name == "Iolo_Elevator"; var has_dialogue_iolo = player.dialogue_guardsman_elevator // same as in Iolo's father dialogue && !player.dialogue_iolo_arrow; // talked to guardsman about the elevator if (has_dialogue_arrow) { var arrows = player->FindContents(BombArrow); DlgText("$DlgIoloA01$"); if (arrows) { DlgText("$DlgIoloA02$", player); DlgText("$DlgIoloA03$"); if (DlgEvent()) { arrows->RemoveObject(); player.dialogue_iolo_has_arrow = true; StartSequence("Iolo_Elevator", 0, this, player); } } else { DlgText("$DlgIoloA04$", player); } } else if (has_dialogue_elevator) { DlgText("$DlgIoloB01$"); DlgText("$DlgIoloB02$", player); if (DlgEvent()) { StopSequence(); } } else if (has_dialogue_iolo) { var in_sequence = GetActiveSequence() && GetActiveSequence().seq_name == "Iolo_Comes"; if (!in_sequence) { DlgText("$DlgIoloC01$"); // from father dialoge DlgText("$DlgIoloFatherA10$", player); DlgText("$DlgIoloFatherA11$", player); DlgText("$DlgIoloFatherA12$", player); DlgText("$DlgIoloFatherA13$"); // end of father dialoge DlgText("$DlgIoloC02$"); if (DlgEvent()) { StartSequence("Iolo_Comes", 0, this, player, true); } } else { DlgText("$DlgIoloC03$"); if (DlgEvent()) { player.dialogue_iolo_arrow = true; StopSequence(); } } } else { DlgText("$DlgIoloD01$"); DlgText("$DlgIoloD02$", player); DlgText("$DlgIoloD03$"); } }
int SequencePlayer::LoadSequenceStream(Oddlib::Stream& stream) { StopSequence(); m_MessageList.clear(); SeqHeader seqHeader; // Read the header stream.ReadUInt32(seqHeader.mMagic); stream.ReadUInt32(seqHeader.mVersion); stream.ReadUInt16(seqHeader.mResolutionOfQuaterNote); stream.ReadBytes(seqHeader.mTempo, sizeof(seqHeader.mTempo)); stream.ReadUInt8(seqHeader.mTimeSignatureBars); stream.ReadUInt8(seqHeader.mTimeSignatureBeats); int tempoValue = 0; for (int i = 0; i < 3; i++) { tempoValue += seqHeader.mTempo[2 - i] << (8 * i); } m_TimeSignatureBars = seqHeader.mTimeSignatureBars; m_SongTempo = 60000000.0 / tempoValue; int channels[16]; unsigned int deltaTime = 0; const size_t midiDataStart = stream.Pos(); // Context state SeqInfo gSeqInfo = {}; for (;;) { // Read event delta time Uint32 delta = _MidiReadVarLen(stream); deltaTime += delta; //std::cout << "Delta: " << delta << " over all " << deltaTime << std::endl; // Obtain the event/status byte Uint8 eventByte = 0; stream.ReadUInt8(eventByte); if (eventByte < 0x80) { // Use running status if (!gSeqInfo.running_status) // v1 { return 0; // error if no running status? } eventByte = gSeqInfo.running_status; // Go back one byte as the status byte isn't a status stream.Seek(stream.Pos() - 1); } else { // Update running status gSeqInfo.running_status = eventByte; } if (eventByte == 0xff) { // Meta event Uint8 metaCommand = 0; stream.ReadUInt8(metaCommand); Uint8 metaCommandLength = 0; stream.ReadUInt8(metaCommandLength); switch (metaCommand) { case 0x2f: { //std::cout << "end of track" << std::endl; m_MessageList.push_back(AliveAudioMidiMessage(ALIVE_MIDI_ENDTRACK, deltaTime, 0, 0, 0)); return 0; int loopCount = gSeqInfo.iNumTimesToLoop;// v1 some hard coded data?? or just a local static? if (loopCount) // If zero then loop forever { --loopCount; //char buf[256]; //sprintf(buf, "EOT: %d loops left\n", loopCount); // OutputDebugString(buf); gSeqInfo.iNumTimesToLoop = loopCount; //v1 if (loopCount <= 0) { //getNext_q(aSeqIndex); // Done playing? Ptr not reset to start return 1; } } //OutputDebugString("EOT: Loop forever\n"); // Must be a loop back to the start? stream.Seek(midiDataStart); } case 0x51: // Tempo in microseconds per quarter note (24-bit value) { //std::cout << "Temp change" << std::endl; // TODO: Not sure if this is correct Uint8 tempoByte = 0; int t = 0; for (int i = 0; i < 3; i++) { stream.ReadUInt8(tempoByte); t = tempoByte << 8 * i; } } break; default: { //std::cout << "Unknown meta event " << Uint32(metaCommand) << std::endl; // Skip unknown events // TODO Might be wrong _SndMidiSkipLength(stream, metaCommandLength); } } } else if (eventByte < 0x80) { // Error throw std::runtime_error("Unknown midi event"); } else { const Uint8 channel = eventByte & 0xf; switch (eventByte >> 4) { case 0x9: // Note On { Uint8 note = 0; stream.ReadUInt8(note); Uint8 velocity = 0; stream.ReadUInt8(velocity); if (velocity == 0) // If velocity is 0, then the sequence means to do "Note Off" { m_MessageList.push_back(AliveAudioMidiMessage(ALIVE_MIDI_NOTE_OFF, deltaTime, channel, note, velocity)); } else { m_MessageList.push_back(AliveAudioMidiMessage(ALIVE_MIDI_NOTE_ON, deltaTime, channel, note, velocity)); } } break; case 0x8: // Note Off { Uint8 note = 0; stream.ReadUInt8(note); Uint8 velocity = 0; stream.ReadUInt8(velocity); m_MessageList.push_back(AliveAudioMidiMessage(ALIVE_MIDI_NOTE_OFF, deltaTime, channel, note, velocity)); } break; case 0xc: // Program Change { Uint8 prog = 0; stream.ReadUInt8(prog); m_MessageList.push_back(AliveAudioMidiMessage(ALIVE_MIDI_PROGRAM_CHANGE, deltaTime, channel, 0, 0, prog)); } break; case 0xa: // Polyphonic key pressure (after touch) { Uint8 note = 0; Uint8 pressure = 0; stream.ReadUInt8(note); stream.ReadUInt8(pressure); } break; case 0xb: // Controller Change { Uint8 controller = 0; Uint8 value = 0; stream.ReadUInt8(controller); stream.ReadUInt8(value); } break; case 0xd: // After touch { Uint8 value = 0; stream.ReadUInt8(value); } break; case 0xe: // Pitch Bend { Uint16 bend = 0; stream.ReadUInt16(bend); } break; case 0xf: // Sysex len { const Uint32 length = _MidiReadVarLen(stream); _SndMidiSkipLength(stream, length); } break; default: throw std::runtime_error("Unknown MIDI command"); } } } }