PlayerManager.cs 3.5 KB
//UnityEngine.Debug.Log Dir		 http://docs.unity3d.com/Manual/UnityEngine.Debug.LogFiles.html
using UnityEngine;
using System;
using System.IO;
using System.Threading;
using System.Collections;
using System.Collections.Generic;

public class PlayerManager : GenericPlayerManager {

	private Server server = null;
	private volatile Queue<Message> messages = new Queue<Message>();

	private readonly Semaphore finalizationLocker = new Semaphore(0, 1);
	private readonly object messageQueueLocker = new object();

	public Semaphore FinalizationLocker {
		get { return this.finalizationLocker; }
	}

	public object MessageQueueLocker {
		get { return this.messageQueueLocker; }
	}

	public override void Start()
	{
		base.Start();
		Screen.SetResolution(800, 600, false);

		Debug.Log("PM.S(): Setting args");

		string[] args = Environment.GetCommandLineArgs();

		if (args.Length >= 5)
		{
			float speedRate = (int.Parse(args[4]) + 100F) / 100F;
			
			if (speedRate > 100)
				base.fadeLength = 0.5F;

			DefaultSignSpeed ds = base.subtitles.DefaultWordSpeed;
			base.subtitles.DefaultWordSpeed = new DefaultSignSpeed(
				ds.Speed * speedRate,
				ds.Max * speedRate
			);
		}

		if (args.Length >= 6)
		{
			float speedRate = (int.Parse(args[5]) + 100F) / 100F;

			if (speedRate > 100F)
				base.fadeLength = 0.5F;

			DefaultSignSpeed ds = base.subtitles.DefaultFirstLetterSpeed;
			base.subtitles.DefaultFirstLetterSpeed = new DefaultSignSpeed(
				ds.Speed * speedRate,
				ds.Max * speedRate
			);

			ds = base.subtitles.DefaultLetterSpeed;
			base.subtitles.DefaultLetterSpeed = new DefaultSignSpeed(
				ds.Speed * speedRate,
				ds.Max * speedRate
			);
		}

		Debug.Log("PM.S(): Setting lockers");

		// Starts thread to wait for app finalization
		new Thread(new ThreadStart(waitFinalize)).Start();

		Debug.Log("PM.S(): Starting server");

		// Start server
		server = new Server(this);
		new Thread(new ThreadStart(server.StartCommunication)).Start();

		// Starts communication thread and wait for finalize
		StartCoroutine(MessageChecker());
	}

	public void enqueueMessage(Message message)
	{
		UnityEngine.Debug.Log("PM.eM(): " + message.Text + ", " + message.Time);
		messages.Enqueue(message);
	}

	private void waitFinalize()
	{
		Debug.Log("PM.WF(): START");
		FinalizationLocker.WaitOne();
		Debug.Log("PM.WF(): Finalize command received");

		Application.Quit();
	}

	IEnumerator MessageChecker()
	{
		Debug.Log("PM.MC(): START");

		while (server.IsNotReady)
			yield return null;

		Debug.Log("PM.MC(): Starting to read messages");

		CameraCapture.capture = true;
		foreach (Message message in messages)
		{
			while ((CameraCapture.frameNumber * 1000) / CameraCapture.frameRate < message.Time)
				yield return null;

			UnityEngine.Debug.Log("PM.MC(): Loading " + message.Text);
			base.playQueued(message.Text);
		}

		while (base.isPlaying() || base.isLoading())
			yield return null;

		UnityEngine.Debug.Log("PM.MC(): All done!");

		server.SendFinalizeToCore();
		CameraCapture.capture = false;
		UnityEngine.Debug.Log("PM.MC(): CameraCapture.capture == " + CameraCapture.capture);

		Application.Quit();
	}

	public override WWW loadAssetBundle(string aniName)
	{
		string assetPath = Application.dataPath + "/Bundles/" + aniName;

		if ( ! File.Exists(assetPath))
			return null;

		try {
			WWW www = new WWW("file://" + assetPath);
			return www;
		} catch (Exception e) {
			UnityEngine.Debug.Log(e);
		}

		return null;
	}

	public override void onPlayingStateChange() { }

	public override void onConnectionError(string gloss, string word) { }

}