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$");
	}
}
Example #3
0
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$");
	}
}
Example #4
0
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");
			}

		}
	}
}