public int Preload <Resource>(string pattern, LoadProgressDelegate progressCallback, string bundle) where Resource : Cv_Resource, new() { Cv_ResourceBundle resBundle; if (!m_ResourceBundles.TryGetValue(bundle, out resBundle)) { Cv_Debug.Error("Could not find requested resource bundle."); return(0); } var resourceList = GetResourceList(pattern, bundle); int loaded = 0; foreach (var r in resourceList) { GetResource <Resource>(r, bundle); loaded++; bool cancel = false; progressCallback(loaded * 100 / resourceList.Length, out cancel); if (cancel) { break; } } return(loaded); }
public void OnModifiedRenderComponent(Cv_Event eventData) { var castEventData = (Cv_Event_ModifiedRenderComponent)eventData; Cv_EntityID entityId = castEventData.EntityID; if (entityId == Cv_EntityID.INVALID_ENTITY) { Cv_Debug.Error("OnModifiedRenderComponent - Unknown entity ID!"); return; } if (Caravel.Logic.State == Cv_GameState.LoadingScene) { return; } var sceneNodes = GetEntityNodes(entityId); if (sceneNodes == null || sceneNodes.Length <= 0) { Cv_Debug.Error("Failed to apply changes to scene node for entity " + entityId); } else { foreach (var n in sceneNodes) { if (!n.VOnChanged()) { Cv_Debug.Error("Error applying changes to scene node for entity " + entityId); } } } }
public bool VLoad(string resourceFile, Stream resourceStream, out int size, Cv_ResourceBundle bundle) { if (resourceStream == null) { Cv_Debug.Error("Invalid resource stream."); size = 0; return(false); } resourceStream.Position = 0; var doc = new XmlDocument(); doc.Load(resourceStream); var newXmlData = new Cv_XmlData(); newXmlData.Document = doc; newXmlData.RootNode = (XmlElement)doc.FirstChild; ResourceData = newXmlData; size = doc.OuterXml.Length; resourceStream.Dispose(); return(true); }
internal bool Initialize(XmlElement bundleInfo, bool useDevDirectories = false) { if (bundleInfo != null) { foreach (XmlElement e in bundleInfo.ChildNodes) { string bundleName, bundleFile; if (e.Attributes["name"] == null || e.Attributes["file"] == null) { Cv_Debug.Error("Bundle is not correctly defined."); return(false); } bundleName = e.Attributes["name"].Value; bundleFile = e.Attributes["file"].Value; if (!useDevDirectories) { AddResourceBundle(bundleName, new Cv_ZipResourceBundle(bundleFile)); } else { AddResourceBundle(bundleName, new Cv_DevelopmentResourceBundle(bundleFile, CaravelApp.Instance.Services)); } } } return(true); }
protected override Stream GetStream(string assetName) { int entry = m_ZipFile.FindEntry(assetName, true); Stream zipStream = null; if (entry != -1) { zipStream = m_ZipFile.GetInputStream(entry); } else { entry = m_ZipFile.FindEntry(assetName + ".xnb", true); if (entry != -1) { zipStream = m_ZipFile.GetInputStream(entry); } } if (zipStream != null) { var memoryStream = new MemoryStream(); zipStream.CopyTo(memoryStream); zipStream.Dispose(); return(memoryStream); } Cv_Debug.Error("Unable to open stream."); return(null); }
internal override void VExecuteStream(string resource, Stream stream, bool runInEditor, Cv_Event runningEvent) { Cv_Debug.Assert((m_iActiveQueue >= 0 && m_iActiveQueue < NUM_QUEUES), "ScriptManager must have an active script queue."); if (stream == null) { Cv_Debug.Error("Invalid stream in VExecuteStream."); return; } string code; using (StreamReader reader = new StreamReader(stream)) { stream.Position = 0; code = reader.ReadToEnd(); } var entity = CaravelApp.Instance.Logic.GetEntity(runningEvent.EntityID); Cv_ScriptExecutionRequest request = new Cv_ScriptExecutionRequest(); request.Code = code; request.Resource = resource; request.Entity = entity; request.Event = runningEvent; request.RunInEditor = runInEditor; lock (m_QueuedScriptLists[m_iActiveQueue]) { m_QueuedScriptLists[m_iActiveQueue].AddLast(request); } Cv_Debug.Log("LuaScript", "Queued script " + resource + " for entity " + (entity != null ? entity.EntityName : "[null]")); }
internal override void VExecuteString(string resource, string str, bool runInEditor, Cv_Event runningEvent, Cv_Entity runningEntity) { Cv_Debug.Assert((m_iActiveQueue >= 0 && m_iActiveQueue < NUM_QUEUES), "ScriptManager must have an active script queue."); if (str == null) { Cv_Debug.Error("Invalid script in VExecuteString."); return; } Cv_ScriptExecutionRequest request = new Cv_ScriptExecutionRequest(); request.Code = str; request.Resource = resource; request.Entity = runningEntity; request.Event = runningEvent; request.RunInEditor = runInEditor; lock (m_QueuedScriptLists[m_iActiveQueue]) { m_QueuedScriptLists[m_iActiveQueue].AddLast(request); } Cv_Debug.Log("LuaScript", "Queued script " + resource + " for entity " + (runningEntity != null ? runningEntity.EntityName : "[null]")); }
public Cv_SoundInstanceData PlaySound2D(string soundResource, Cv_Entity entity, Vector2 listener, Vector2 emitter, bool looping = false, float volume = 1f, float pan = 0f, float pitch = 0f) { if (soundResource == null || soundResource == "" || entity == null) { Cv_Debug.Error("Error - No sound or entity defined when trying to play sound."); return(null); } var playSoundData = GetNewSoundInstance(soundResource, entity, volume, pan, pitch, looping); AddSoundToManager(playSoundData); m_Emitter.Position = new Vector3(emitter, 0) * DistanceFallOff; m_Listener.Forward = new Vector3(0, 0, -1); m_Listener.Up = new Vector3(0, 1, 0); m_Listener.Position = new Vector3(listener, 0) * DistanceFallOff; try { playSoundData.Instance.Apply3D(m_Listener, m_Emitter); playSoundData.Instance.Play(); playSoundData.Instance.Apply3D(m_Listener, m_Emitter); // This is necessary due to a bug in monogame where 3D sounds do //not work correctly unless Apply3D is called both before and after Play } catch (Exception e) { Cv_Debug.Error("Unable to play sound: " + soundResource + "\n" + e.ToString()); } return(playSoundData); }
public bool VLoad(string resourceFile, Stream resourceStream, out int size, Cv_ResourceBundle bundle) { if (resourceStream == null) { Cv_Debug.Error("Invalid resource stream."); size = 0; return(false); } resourceStream.Position = 0; try { var sound = SoundEffect.FromStream(resourceStream); var resData = new Cv_SoundData(); resData.Sound = sound; ResourceData = resData; size = 0; resourceStream.Dispose(); return(true); } catch (Exception e) { Cv_Debug.Error("Error loading sound stream.\n" + e.ToString()); size = 0; return(false); } }
internal override void OnUpdate(float time, float elapsedTime) { var queueToProcess = m_iActiveQueue; m_iActiveQueue = (m_iActiveQueue + 1) % NUM_QUEUES; m_QueuedScriptLists[m_iActiveQueue].Clear(); long currentMs = 0; var stopwatch = new Stopwatch(); stopwatch.Start(); lock (m_QueuedScriptLists[queueToProcess]) { while (m_QueuedScriptLists[queueToProcess].Count > 0) { var script = m_QueuedScriptLists[queueToProcess].First.Value; m_QueuedScriptLists[queueToProcess].RemoveFirst(); if (!CaravelApp.Instance.EditorRunning || script.RunInEditor) { try { m_ScriptState["env.currentEntity"] = script.Entity; m_ScriptState["env.currentEvent"] = script.Event; m_ScriptState.DoString("run [[" + script.Code + "]]", script.Resource); } catch (LuaException e) { Cv_Debug.Error("Error executing Lua script:\n" + e.ToString()); } catch (Exception e) { Cv_Debug.Error("Error executing Lua script:\n" + e.ToString()); } } currentMs = stopwatch.ElapsedMilliseconds; if (MaxProcessTimeMillis != long.MaxValue) { if (currentMs >= MaxProcessTimeMillis) { Cv_Debug.Error("ScriptManager processing time exceeded. Aborting."); stopwatch.Stop(); break; } } } while (m_QueuedScriptLists[queueToProcess].Count > 0) { m_QueuedScriptLists[m_iActiveQueue].AddBefore(m_QueuedScriptLists[m_iActiveQueue].First, m_QueuedScriptLists[queueToProcess].Last); m_QueuedScriptLists[queueToProcess].RemoveLast(); } } }
public Resource GetResource <Resource>(string resourceFile, string bundle, bool reload = false) where Resource : Cv_Resource, new() { var resource = new Resource(); resource.File = resourceFile; var isOwnedByResManager = resource.VIsManuallyManaged(); Cv_ResourceData resData; lock (m_ResourceData) { if (!reload && isOwnedByResManager && m_ResourceData.TryGetValue(resourceFile, out resData)) { resource.ResourceData = resData; } else { var size = 0; Cv_ResourceBundle resBundle; if (!m_ResourceBundles.TryGetValue(bundle, out resBundle)) { Cv_Debug.Error("Could not find requested resource bundle: " + bundle); return(default(Resource)); } if (isOwnedByResManager) { using (var resStream = resBundle.GetResourceStream(resourceFile)) { if (!resource.VLoad(resourceFile, resStream, out size, resBundle)) { Cv_Debug.Error("Unable to load resource: " + resourceFile); return(default(Resource)); } } if (m_ResourceData.ContainsKey(resourceFile)) { m_ResourceData.Remove(resourceFile); } m_ResourceData.Add(resourceFile, resource.ResourceData); } else { if (!resource.VLoad(resourceFile, null, out size, resBundle)) { Cv_Debug.Error("Unable to load resource: " + resourceFile); return(default(Resource)); } } } } return(resource); }
public void RemoveCategory(int category) { if (category >= 32) { Cv_Debug.Error("Invalid category. There are only 32 collision categories."); return; } m_Categories.Set(category, false); }
virtual protected internal Cv_EntityComponent CreateComponent(string componentName) { var component = ComponentFactory.Create(Cv_EntityComponent.GetID(componentName)); if (component == null) { Cv_Debug.Error("Couldn't find component " + componentName + ". All components must be registered before use."); } return(component); }
virtual protected internal Component CreateComponent <Component>() where Component : Cv_EntityComponent { var component = (Component)ComponentFactory.Create(Cv_EntityComponent.GetID(typeof(Component))); if (component == null) { Cv_Debug.Error("Couldn't find component " + typeof(Component).Name + ". All components must be registered before use."); } return(component); }
public XmlElement GetEntityXML(Cv_EntityID entityID) { var entity = GetEntity(entityID); if (entity != null) { return(entity.ToXML()); } Cv_Debug.Error("Could not find entity with ID: " + (int)entityID); return(null); }
public void Unload(string bundle) { Cv_ResourceBundle resBundle; if (!m_ResourceBundles.TryGetValue(bundle, out resBundle)) { Cv_Debug.Error("Could not find requested resource bundle."); return; } resBundle.Unload(); }
virtual protected internal Cv_Entity CreateEntity(string entityTypeResource, Cv_EntityID parent, Cv_EntityID serverEntityID, string resourceBundle, Cv_SceneID sceneID, string sceneName) { Cv_XmlResource resource; resource = Cv_ResourceManager.Instance.GetResource <Cv_XmlResource>(entityTypeResource, resourceBundle, CaravelApp.Instance.EditorRunning); XmlElement root = ((Cv_XmlResource.Cv_XmlData)resource.ResourceData).RootNode; if (root == null) { Cv_Debug.Error("Failed to load entity resource file: " + entityTypeResource); return(null); } Cv_EntityID entityId = serverEntityID; if (entityId == Cv_EntityID.INVALID_ENTITY) { lock (m_Mutex) { entityId = GetNextEntityID(); } } var entity = new Cv_Entity(entityId, resourceBundle, sceneName, sceneID); if (!entity.Initialize(entityTypeResource, root, parent)) { Cv_Debug.Error("Failed to initialize entity: " + entityTypeResource); return(null); } foreach (var componentNode in root.ChildNodes) { if (componentNode.GetType() != typeof(XmlElement)) { continue; } var component = CreateComponent((XmlElement)componentNode); if (component != null) { entity.AddComponent(component); } else { return(null); } } return(entity); }
public bool QueueEvent(Cv_Event newEvent, bool threadSafe = false) { if (!threadSafe) { Cv_Debug.Assert((m_iActiveQueue >= 0 && m_iActiveQueue < NUM_QUEUES), "EventManager must have an active event queue."); if (newEvent == null) { Cv_Debug.Error("Invalid event in QueueEvent."); return(false); } if (newEvent.WriteToLog) { Cv_Debug.Log("Events", "Attempting to queue event " + newEvent.VGetName() + " for entity " + newEvent.EntityID); } lock (m_EventListeners) { if (m_EventListeners.ContainsKey(newEvent.Type)) { m_EventQueues[m_iActiveQueue].AddLast(newEvent); if (newEvent.WriteToLog) { Cv_Debug.Log("Events", "Successfully queued event " + newEvent.VGetName()); } return(true); } } lock (m_ScriptEventListeners) { if (m_ScriptEventListeners.ContainsKey(newEvent.Type)) { m_EventQueues[m_iActiveQueue].AddLast(newEvent); if (newEvent.WriteToLog) { Cv_Debug.Log("Events", "Successfully queued event " + newEvent.VGetName()); } return(true); } } Cv_Debug.Log("Events", "Skipping event " + newEvent.VGetName() + " since there are no listeners for it."); return(false); } else { m_RealTimeEventQueue.Enqueue(newEvent); return(true); } }
public void FadeOutSound(Cv_SoundInstanceData instance, float interval) { if (instance == null) { Cv_Debug.Error("Error - No sound defined when trying to stop sound."); return; } if (m_SoundToDataMap.ContainsKey(instance.Instance)) { FadeSound(instance, 0, interval); } }
public void StopSound(Cv_SoundInstanceData instance, bool immediate = false) { if (instance == null) { Cv_Debug.Error("Error - No sound defined when trying to stop sound."); return; } if (m_SoundToDataMap.ContainsKey(instance.Instance)) { StopSound(instance); } }
private void OnPlaySound(Cv_Event eventData) { var playEvt = (Cv_Event_PlaySound)eventData; var entity = CaravelApp.Instance.Logic.GetEntity(playEvt.EntityID); if (playEvt.Fade && playEvt.Interval > 0) { if (playEvt.Volume <= 0) { Caravel.SoundManager.FadeOutSound(playEvt.SoundResource, playEvt.Interval); return; } if (entity == null) { Cv_Debug.Error("Attempting to play sound without an entity associated."); return; } if (playEvt.Localized) { Caravel.SoundManager.FadeInSound2D(playEvt.SoundResource, entity, playEvt.Listener, playEvt.Emitter, playEvt.Interval, playEvt.Looping, playEvt.Volume, playEvt.Pan, playEvt.Pitch); } else { Caravel.SoundManager.FadeInSound(playEvt.SoundResource, entity, playEvt.Interval, playEvt.Looping, playEvt.Volume, playEvt.Pan, playEvt.Pitch); } } else { if (entity == null) { Cv_Debug.Warning("Attempting to play sound without an entity associated."); return; } if (playEvt.Localized) { Caravel.SoundManager.PlaySound2D(playEvt.SoundResource, entity, playEvt.Listener, playEvt.Emitter, playEvt.Looping, playEvt.Volume, playEvt.Pan, playEvt.Pitch); } else { Caravel.SoundManager.PlaySound(playEvt.SoundResource, entity, playEvt.Looping, playEvt.Volume, playEvt.Pan, playEvt.Pitch); } } }
private ShapeBoundingBox CalculateAABoundingBox() { if (Owner == null) { Cv_Debug.Error("Shape not yet associated with an Entity."); } var rotation = Owner.GetComponent <Cv_TransformComponent>().Rotation; var offsetX = AnchorPoint.X; var offsetY = AnchorPoint.Y; var rotMatrixZ = Matrix.CreateRotationZ(rotation); float minX = float.MaxValue; float minY = float.MaxValue; float maxX = float.MinValue; float maxY = float.MinValue; foreach (var point in Points) { var transformedPoint = new Vector2(point.X - offsetX, point.Y - offsetY); transformedPoint = Vector2.Transform(transformedPoint, rotMatrixZ); if (transformedPoint.X < minX) { minX = transformedPoint.X; } if (transformedPoint.Y < minY) { minY = transformedPoint.Y; } if (transformedPoint.X > maxX) { maxX = transformedPoint.X; } if (transformedPoint.Y > maxY) { maxY = transformedPoint.Y; } } var BoundingBox = new ShapeBoundingBox(); BoundingBox.Start = new Vector2(minX, minY); BoundingBox.Width = maxX - minX; BoundingBox.Height = maxY - minY; return(BoundingBox); }
public string GetString(string stringID) { string localizedString; if (m_TextResource.TryGetValue(stringID, out localizedString)) { return(localizedString); } else { Cv_Debug.Error("Error - String not found!"); return(""); } }
public void ResumeSound(Cv_SoundInstanceData instance) { if (instance == null) { Cv_Debug.Error("Error - No sound defined when trying to resume sound."); return; } if (m_SoundToDataMap.ContainsKey(instance.Instance)) { instance.Instance.Resume(); instance.Paused = false; } }
public bool ChangeState(Cv_GameState newState) { if (newState == Cv_GameState.WaitingForPlayers) { ExpectedPlayers = 1; //NOTE(JM): this must change for splitscreen //ExpectedRemotePlayers = Caravel.GameOptions.ExpectedPlayers - ExpectedPlayers; //ExpectedAI = Caravel.GameOptions.NumAI; HumanPlayersAttached = 0; HumanPlayersLoaded = 0; /*if (!string.IsNullOrEmpty(Caravel.GameOptions.GameHost)) * { * IsProxy = true; * ExpectedAI = 0; * ExpectedRemotePlayers = 0; * * if (!Caravel.AttachAsClient()) * { * return false; * } * } * else if (ExpectedRemotePlayers > 0) * { * //Add socket on GameOptions.ListenPort * }*/ } var changedStateEvt = new Cv_Event_ChangeState(State, newState, this); State = newState; VGameOnChangeState(newState); Cv_EventManager.Instance.TriggerEvent(changedStateEvt); if (newState == Cv_GameState.WaitingForPlayersToLoadScene) { HumanPlayersLoaded++; //TODO(JM): In future maybe change this to event handler (to handle remote players too) } if (newState == Cv_GameState.LoadingScene) { if (!Caravel.VLoadGame()) //TODO(JM): Maybe change this to automatically load the scene set in the options instead of being overriden by subclass { Cv_Debug.Error("Error - Unable to load scene."); Caravel.AbortGame(); } } return(true); }
public Cv_LineBatch(GraphicsDevice graphicsDevice, int bufferSize) { if (graphicsDevice == null) { Cv_Debug.Error("Graphics device must not be null."); } m_Device = graphicsDevice; m_LineVertices = new VertexPositionColor[bufferSize - bufferSize % 2]; // set up a new basic effect, and enable vertex colors. m_BasicEffect = new BasicEffect(graphicsDevice); m_BasicEffect.VertexColorEnabled = true; }
public Cv_SoundInstanceData FadeInSound2D(string soundResource, Cv_Entity entity, Vector2 listener, Vector2 emitter, float interval, bool looping = false, float volume = 1f, float pan = 0f, float pitch = 0f) { if (soundResource == null || soundResource == "" || entity == null) { Cv_Debug.Error("Error - No sound or entity defined when trying to play sound."); return(null); } var fadeSoundData = PlaySound2D(soundResource, entity, listener, emitter, looping, 0, pan, pitch); FadeSound(fadeSoundData, volume, interval); return(fadeSoundData); }
internal override void VExecuteFile(string resource, Cv_Event runningEvent) { try { throw new NotImplementedException(); } catch (LuaException e) { Cv_Debug.Error("Error executing Lua script:\n" + e.ToString()); } catch (Exception e) { Cv_Debug.Error("Error executing Lua script:\n" + e.ToString()); } }
//Note(JM): Used for editor #if EDITOR public void AddComponent(string entityPath, string componentTypeName, Cv_EntityComponent component) { if (component.Owner != null) { Cv_Debug.Error("Trying to add a component that already has an owner."); } var entity = GetEntity(entityPath); if (entity != null) { entity.AddComponent(componentTypeName, component); component.VPostInitialize(); component.VPostLoad(); } }
public void ResumeSound(string soundResource, Cv_Entity entity = null) { if (soundResource == null || soundResource == "") { Cv_Debug.Error("Error - No sound defined when trying to resume sound."); return; } if (entity != null) //If an entity is specified resumes the first instance of that sound belonging to the entity { if (!m_EntityToInstancesMap.ContainsKey(entity.ID)) { return; } var instances = m_EntityToInstancesMap[entity.ID]; Cv_SoundInstanceData soundToResume = null; foreach (var s in instances) { if (s.Resource == soundResource) { soundToResume = s; break; } } if (soundToResume != null) { soundToResume.Instance.Resume(); soundToResume.Paused = false; } } else //Resumes all instances of that sound { if (!m_SoundInstances.ContainsKey(soundResource)) { return; } foreach (var s in m_SoundInstances[soundResource]) { s.Instance.Resume(); s.Paused = false; } } }