diff --git a/Nu/Nu/Nu/Nu.fsproj b/Nu/Nu/Nu/Nu.fsproj
index d27abe0774..ab674a4382 100644
--- a/Nu/Nu/Nu/Nu.fsproj
+++ b/Nu/Nu/Nu/Nu.fsproj
@@ -89,7 +89,6 @@
-
diff --git a/Nu/Nu/Nu/WorldDispatchers.fs b/Nu/Nu/Nu/WorldDispatchers.fs
index 026ec85d32..b230ea9457 100644
--- a/Nu/Nu/Nu/WorldDispatchers.fs
+++ b/Nu/Nu/Nu/WorldDispatchers.fs
@@ -366,7 +366,7 @@ module GuiDispatcherModule =
let gui = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
let handling =
- if World.isSimulantSelected gui world && gui.GetVisible world then
+ if World.isEntitySelected gui world && gui.GetVisible world then
let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (gui.GetViewType world) data.Position) world
if data.Down &&
gui.GetSwallowMouseLeft world &&
@@ -407,7 +407,7 @@ module ButtonDispatcherModule =
let handleMouseLeftDown evt world =
let button = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
- if World.isSimulantSelected button world then
+ if World.isEntitySelected button world then
let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (button.GetViewType world) data.Position) world
if button.GetVisible world &&
Math.isPointInBounds mousePositionWorld (button.GetBounds world) then
@@ -423,7 +423,7 @@ module ButtonDispatcherModule =
let handleMouseLeftUp evt world =
let button = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
- if World.isSimulantSelected button world then
+ if World.isEntitySelected button world then
let wasDown = button.GetDown world
let world = button.SetDown false world
let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (button.GetViewType world) data.Position) world
@@ -595,7 +595,7 @@ module ToggleDispatcherModule =
let handleMouseLeftDown evt world =
let toggle = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
- if World.isSimulantSelected toggle world then
+ if World.isEntitySelected toggle world then
let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (toggle.GetViewType world) data.Position) world
if toggle.GetVisible world &&
Math.isPointInBounds mousePositionWorld (toggle.GetBounds world) then
@@ -609,7 +609,7 @@ module ToggleDispatcherModule =
let handleMouseLeftUp evt world =
let toggle = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
- if World.isSimulantSelected toggle world then
+ if World.isEntitySelected toggle world then
let wasPressed = toggle.GetPressed world
let world = toggle.SetPressed false world
let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (toggle.GetViewType world) data.Position) world
@@ -678,7 +678,7 @@ module FeelerDispatcherModule =
let handleMouseLeftDown evt world =
let feeler = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
- if World.isSimulantSelected feeler world then
+ if World.isEntitySelected feeler world then
let mousePositionWorld = World.getCameraBy (Camera.mouseToWorld (feeler.GetViewType world) data.Position) world
if feeler.GetVisible world &&
Math.isPointInBounds mousePositionWorld (feeler.GetBounds world) then
@@ -694,7 +694,7 @@ module FeelerDispatcherModule =
let handleMouseLeftUp evt world =
let feeler = evt.Subscriber : Entity
let data = evt.Data : MouseButtonData
- if World.isSimulantSelected feeler world && feeler.GetVisible world then
+ if World.isEntitySelected feeler world && feeler.GetVisible world then
if feeler.GetEnabled world then
let world = feeler.SetTouched false world
let eventTrace = EventTrace.record "FeelerDispatcher" "handleMouseLeftDown" EventTrace.empty
diff --git a/Nu/Nu/Nu/WorldEvents.fs b/Nu/Nu/Nu/WorldEvents.fs
index f962c8cc50..ee1d5da628 100644
--- a/Nu/Nu/Nu/WorldEvents.fs
+++ b/Nu/Nu/Nu/WorldEvents.fs
@@ -23,10 +23,6 @@ type [] KeyboardKeyData =
Repeated : bool
Down : bool }
-/// The data for a change in a simulant.
-type SimulantChangeData<'s, 'w when 's :> Simulant and 'w :> 'w Eventable> =
- ParticipantChangeData<'s, 'w>
-
/// The data for a collision event.
type [] CollisionData =
{ Normal : Vector2
@@ -35,7 +31,7 @@ type [] CollisionData =
/// The data for a change in the world's ambient state.
/// NOTE: I couldn't give its field the more normal name of 'OldWorld' due to field name conflicts with the more
-/// pervasive SimulantChangeData type below.
+/// pervasive ParticipantChangeData type.
type [] AmbientStateChangeData =
{ OldWorldWithOldState : World }
@@ -90,16 +86,16 @@ module Events =
let AmbientState = ntoa !!"AmbientState"
let AmbientStateChange = AmbientState -<- ntoa !!"Change"
let Game = ntoa !!"Game"
- let GameChange = Game -<- ntoa> !!"Change"
+ let GameChange = Game -<- ntoa> !!"Change"
let Screen = ntoa !!"Screen"
let ScreenAdd = Screen -<- ntoa !!"Add"
let ScreenRemoving = Screen -<- ntoa !!"Removing"
- let ScreenChange = Screen -<- ntoa> !!"Change"
+ let ScreenChange = Screen -<- ntoa> !!"Change"
let Group = ntoa !!"Group"
let GroupAdd = Group -<- ntoa !!"Add"
let GroupRemoving = Group -<- ntoa !!"Removing"
- let GroupChange = Group -<- ntoa> !!"Change"
+ let GroupChange = Group -<- ntoa> !!"Change"
let Entity = ntoa !!"Entity"
let EntityAdd = Entity -<- ntoa !!"Add"
let EntityRemoving = Entity -<- ntoa !!"Removing"
- let EntityChange = Entity -<- ntoa> !!"Change"
\ No newline at end of file
+ let EntityChange = Entity -<- ntoa> !!"Change"
\ No newline at end of file
diff --git a/Nu/Nu/Nu/WorldGame.fs b/Nu/Nu/Nu/WorldGame.fs
index 10887494f2..12d95fb8df 100644
--- a/Nu/Nu/Nu/WorldGame.fs
+++ b/Nu/Nu/Nu/WorldGame.fs
@@ -88,6 +88,34 @@ module WorldGameModule =
static member setSelectedScreen screen world =
World.setOptSelectedScreen (Some screen) world
+ /// Determine if an entity is selected by being in a group of the currently selected screeen.
+ static member isEntitySelected entity world =
+ let screenName = Address.head entity.EntityAddress
+ match World.getOptSelectedScreen world with
+ | Some selectedScreen -> screenName = selectedScreen.ScreenName
+ | None -> false
+
+ /// Determine if a group is selected by being in the currently selected screeen.
+ static member isGroupSelected group world =
+ let screenName = Address.head group.GroupAddress
+ match World.getOptSelectedScreen world with
+ | Some selectedScreen -> screenName = selectedScreen.ScreenName
+ | None -> false
+
+ /// Determine if a screen is the currently selected screeen.
+ static member isScreenSelected screen world =
+ World.getOptSelectedScreen world = Some screen
+
+ /// Determine if a simulant is contained by, or is the same as, the currently selected screen.
+ /// Game is always considered 'selected' as well.
+ static member isSimulantSelected (simulant : Simulant) world =
+ match Address.getNames simulant.SimulantAddress with
+ | [] -> true
+ | screenName :: _ ->
+ match World.getOptSelectedScreen world with
+ | Some screen -> screen.ScreenName = screenName
+ | None -> false
+
/// Write a game to an xml writer.
static member writeGame (writer : XmlWriter) world =
let gameState = World.getGameState world
diff --git a/Nu/Nu/Nu/WorldObservation.fs b/Nu/Nu/Nu/WorldObservation.fs
index 63b5317b7e..b20f28e2f4 100644
--- a/Nu/Nu/Nu/WorldObservation.fs
+++ b/Nu/Nu/Nu/WorldObservation.fs
@@ -18,11 +18,13 @@ module Observation =
observation |> organize (fun _ world -> World.getUpdateCount world) |> toFst |> choose
/// Take events from an observation only while World.isTicking evaluates to true.
- let [] isTicking _ world = World.isTicking world
+ let [] isTicking _ world =
+ World.isTicking world
- /// Take events from an observation only when the observer is selected in the world (see
- /// documentation for World.isAddressSelected for what this means (it's very useful!)).
- let [] isObserverSelected evt world = World.isSimulantSelected evt.Subscriber world
+ /// Take events from an observation only when the observer is contained by, or is the same as,
+ /// the currently selected screen. Game is always considered 'selected' as well.
+ let [] isObserverSelected evt world =
+ World.isSimulantSelected evt.Subscriber world
/// Take events from an observation only when the currently selected screen is idling (that
/// is, there is no screen transition in progress).
diff --git a/Nu/Nu/Nu/WorldSimulant.fs b/Nu/Nu/Nu/WorldSimulant.fs
deleted file mode 100644
index 3464557c64..0000000000
--- a/Nu/Nu/Nu/WorldSimulant.fs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Nu Game Engine.
-// Copyright (C) Bryan Edds, 2012-2016.
-
-namespace Nu
-open System
-open Prime
-open Nu
-
-[]
-module WorldSimulantModule =
-
- type World with
-
- /// Query that the world contains a simulant.
- static member containsSimulant<'a when 'a :> Simulant> (simulant : 'a) world =
- (world :> World Eventable).ContainsParticipant simulant
-
- /// Query that a simulant is the either currently selected screen or contained by it.
- static member isSimulantSelected<'s when 's :> Simulant> (simulant : 's) world =
- let optScreen = World.getOptSelectedScreen world
- let optScreenNames = Option.map (fun (screen : Screen) -> Address.getNames screen.ScreenAddress) optScreen
- let simulantNames = Address.getNames simulant.SimulantAddress
- match (simulantNames, optScreenNames) with
- | ([], _) -> true
- | (_, None) -> false
- | (_, Some []) -> false
- | (addressHead :: _, Some (screenAddressHead :: _)) -> addressHead = screenAddressHead
\ No newline at end of file
diff --git a/Nu/Prime/Debug/Prime.exe b/Nu/Prime/Debug/Prime.exe
index ca2c3a6048..55863f9554 100644
Binary files a/Nu/Prime/Debug/Prime.exe and b/Nu/Prime/Debug/Prime.exe differ
diff --git a/Nu/Prime/Debug/Prime.pdb b/Nu/Prime/Debug/Prime.pdb
index b8fe1dd7e0..4051b20314 100644
Binary files a/Nu/Prime/Debug/Prime.pdb and b/Nu/Prime/Debug/Prime.pdb differ
diff --git a/Nu/Prime/Release/Prime.exe b/Nu/Prime/Release/Prime.exe
index b937694f9c..e27d08b28e 100644
Binary files a/Nu/Prime/Release/Prime.exe and b/Nu/Prime/Release/Prime.exe differ
diff --git a/Nu/Prime/Release/Prime.pdb b/Nu/Prime/Release/Prime.pdb
index 2559c183aa..27c2083b76 100644
Binary files a/Nu/Prime/Release/Prime.pdb and b/Nu/Prime/Release/Prime.pdb differ