Adding support for custom boolean properties.
diff --git a/Source/Actor.cpp b/Source/Actor.cpp
index c439516..bdc4ce3 100644
--- a/Source/Actor.cpp
+++ b/Source/Actor.cpp
@@ -392,6 +392,9 @@
 			case BlockType::CustomStringProperty:
 				component = CustomStringProperty::read(this, componentBlock);
 				break;
+			case BlockType::CustomBooleanProperty:
+				component = CustomBooleanProperty::read(this, componentBlock);
+				break;
 			default:
 				// Not handled/expected block.
 				break;
diff --git a/Source/Actor.hpp b/Source/Actor.hpp
index 2f14445..a2ee33b 100644
--- a/Source/Actor.hpp
+++ b/Source/Actor.hpp
@@ -31,7 +31,7 @@
 		CustomIntProperty = 13,
 		CustomFloatProperty = 14,
 		CustomStringProperty = 15,
-		CustomBooleanProperty = 16, // TODO
+		CustomBooleanProperty = 16,
 		ColliderRectangle = 17, // TODO
 		ColliderTriangle = 18, // TODO
 		ColliderCircle = 19, // TODO
diff --git a/Source/ActorComponent.cpp b/Source/ActorComponent.cpp
index 096c3d5..4a0eb64 100644
--- a/Source/ActorComponent.cpp
+++ b/Source/ActorComponent.cpp
@@ -101,6 +101,11 @@
 	m_CustomStringProperties.push_back(property);
 }
 
+void ActorComponent::addCustomBooleanProperty(CustomBooleanProperty* property)
+{
+	m_CustomBooleanProperties.push_back(property);
+}
+
 CustomIntProperty* ActorComponent::getCustomIntProperty(const std::string& name)
 {
 	for(CustomIntProperty* prop : m_CustomIntProperties)
@@ -135,4 +140,16 @@
 		}
 	}
 	return nullptr;
+}
+
+CustomBooleanProperty* ActorComponent::getCustomBooleanProperty(const std::string& name)
+{
+	for(CustomBooleanProperty* prop : m_CustomBooleanProperties)
+	{
+		if(prop->name() == name)
+		{
+			return prop;
+		}
+	}
+	return nullptr;
 }
\ No newline at end of file
diff --git a/Source/ActorComponent.hpp b/Source/ActorComponent.hpp
index 68973bd..5a66b7a 100644
--- a/Source/ActorComponent.hpp
+++ b/Source/ActorComponent.hpp
@@ -14,6 +14,7 @@
 	class CustomIntProperty;
 	class CustomFloatProperty;
 	class CustomStringProperty;
+	class CustomBooleanProperty;
 
 	enum class ComponentType
 	{
@@ -26,8 +27,14 @@
 		CustomIntProperty = 13,
 		CustomFloatProperty = 14,
 		CustomStringProperty = 15,
-		ActorStaticMesh = 22,
-		NestedActorNode = 23
+		CustomBooleanProperty = 16,
+		ColliderRectangle = 17, // TODO
+		ColliderTriangle = 18, // TODO
+		ColliderCircle = 19, // TODO
+		ColliderPolygon = 20, // TODO
+		ColliderLine = 21, // TODO
+		ActorStaticMesh = 23,
+		NestedActorNode = 24
 	};
 
 
@@ -41,6 +48,7 @@
 			std::vector<CustomIntProperty*> m_CustomIntProperties;
 			std::vector<CustomFloatProperty*> m_CustomFloatProperties;
 			std::vector<CustomStringProperty*> m_CustomStringProperties;
+			std::vector<CustomBooleanProperty*> m_CustomBooleanProperties;
 
 		private:
 			unsigned short m_ParentIdx;
@@ -69,10 +77,12 @@
 			void addCustomIntProperty(CustomIntProperty* property);
 			void addCustomFloatProperty(CustomFloatProperty* property);
 			void addCustomStringProperty(CustomStringProperty* property);
+			void addCustomBooleanProperty(CustomBooleanProperty* property);
 
 			CustomIntProperty* getCustomIntProperty(const std::string& name);
 			CustomFloatProperty* getCustomFloatProperty(const std::string& name);
 			CustomStringProperty* getCustomStringProperty(const std::string& name);
+			CustomBooleanProperty* getCustomBooleanProperty(const std::string& name);
 	};
 }
 #endif
\ No newline at end of file
diff --git a/Source/Animation/KeyFrames/KeyFrameCustomProperty.cpp b/Source/Animation/KeyFrames/KeyFrameCustomProperty.cpp
index 4f4e8eb..ef318eb 100644
--- a/Source/Animation/KeyFrames/KeyFrameCustomProperty.cpp
+++ b/Source/Animation/KeyFrames/KeyFrameCustomProperty.cpp
@@ -41,4 +41,30 @@
 void KeyFrameStringProperty::applyInterpolation(ActorComponent* component, float time, KeyFrame* toFrame, float mix)
 {
 	apply(component, mix);
+}
+
+bool KeyFrameBooleanProperty::read(BlockReader* reader, ActorComponent* component)
+{
+	if(!Base::read(reader, component))
+	{
+		return false;
+	}
+	m_Value = reader->readByte() == 1;
+	return true;
+}
+
+void KeyFrameBooleanProperty::setNext(KeyFrame* frame)
+{
+	// Intentionally blank, we do not interpolate.
+}
+
+void KeyFrameBooleanProperty::apply(ActorComponent* component, float mix)
+{
+	CustomBooleanProperty* property = reinterpret_cast<CustomBooleanProperty*>(component);
+	property->value(m_Value);
+}
+
+void KeyFrameBooleanProperty::applyInterpolation(ActorComponent* component, float time, KeyFrame* toFrame, float mix)
+{
+	apply(component, mix);
 }
\ No newline at end of file
diff --git a/Source/Animation/KeyFrames/KeyFrameCustomProperty.hpp b/Source/Animation/KeyFrames/KeyFrameCustomProperty.hpp
index 62b1f0d..87e12b0 100644
--- a/Source/Animation/KeyFrames/KeyFrameCustomProperty.hpp
+++ b/Source/Animation/KeyFrames/KeyFrameCustomProperty.hpp
@@ -32,6 +32,19 @@
 			void apply(ActorComponent* component, float mix) override;
 			void applyInterpolation(ActorComponent* component, float time, KeyFrame* toFrame, float mix) override;
 	};
+
+	class KeyFrameBooleanProperty : public KeyFrame
+	{
+		typedef KeyFrame Base;
+		private:
+			bool m_Value;
+
+		public:	
+			bool read(BlockReader* reader, ActorComponent* component) override;
+			void setNext(KeyFrame* frame) override;
+			void apply(ActorComponent* component, float mix) override;
+			void applyInterpolation(ActorComponent* component, float time, KeyFrame* toFrame, float mix) override;
+	};
 }
 
 #endif
\ No newline at end of file
diff --git a/Source/Animation/PropertyAnimation.cpp b/Source/Animation/PropertyAnimation.cpp
index e91c9bb..f3d0a01 100644
--- a/Source/Animation/PropertyAnimation.cpp
+++ b/Source/Animation/PropertyAnimation.cpp
@@ -108,6 +108,9 @@
 			case PropertyType::StringProperty:
 				frame = new KeyFrameStringProperty();
 				break;
+			case PropertyType::BooleanProperty:
+				frame = new KeyFrameBooleanProperty();
+				break;
 			default:
 				// This will only happen if the code isn't handling a property type it should handle.
 				// Check the PropertyType enum and make sure Max is in the right place (and that you're not missing a case).
diff --git a/Source/Animation/PropertyAnimation.hpp b/Source/Animation/PropertyAnimation.hpp
index eb93fbf..14b1f99 100644
--- a/Source/Animation/PropertyAnimation.hpp
+++ b/Source/Animation/PropertyAnimation.hpp
@@ -25,6 +25,7 @@
 		IntProperty = 12,
 		FloatProperty = 13,
 		StringProperty = 14,
+		BooleanProperty = 15,
 		Max
 	};
 
diff --git a/Source/CustomProperty.cpp b/Source/CustomProperty.cpp
index 15e4bfe..4834077 100644
--- a/Source/CustomProperty.cpp
+++ b/Source/CustomProperty.cpp
@@ -150,4 +150,54 @@
 void CustomStringProperty::value(const std::string& v)
 {
 	m_Value = v;
+}
+
+CustomBooleanProperty::CustomBooleanProperty() : ActorComponent(ComponentType::CustomBooleanProperty)
+{
+
+}
+
+ActorComponent* CustomBooleanProperty::makeInstance(Actor* resetActor)
+{
+	CustomBooleanProperty* instanceProp = new CustomBooleanProperty();
+	instanceProp->copy(this, resetActor);
+	return instanceProp;
+}
+
+void CustomBooleanProperty::copy(CustomBooleanProperty* property, Actor* resetActor)
+{
+	Base::copy(property, resetActor);
+	m_Value = property->m_Value;
+}
+
+CustomBooleanProperty* CustomBooleanProperty::read(Actor* actor, BlockReader* reader, CustomBooleanProperty* property)
+{
+	if(property == nullptr)
+	{
+		property = new CustomBooleanProperty();
+	}
+	ActorComponent::read(actor, reader, property);
+	property->m_Value = reader->readByte() == 1;
+	return property;
+}
+
+void CustomBooleanProperty::resolveComponentIndices(ActorComponent** components)
+{
+	Base::resolveComponentIndices(components);
+
+	ActorComponent* parent = components[parentIdx()];
+	if(parent != nullptr)
+	{
+		parent->addCustomBooleanProperty(this);
+	}
+}
+
+const bool CustomBooleanProperty::value() const
+{
+	return m_Value;
+}
+
+void CustomBooleanProperty::value(const bool v)
+{
+	m_Value = v;
 }
\ No newline at end of file
diff --git a/Source/CustomProperty.hpp b/Source/CustomProperty.hpp
index 8d5c0b5..d1a7f65 100644
--- a/Source/CustomProperty.hpp
+++ b/Source/CustomProperty.hpp
@@ -55,5 +55,21 @@
 			const std::string& value() const;
 			void value(const std::string& v);
 	};
+	class CustomBooleanProperty : public ActorComponent
+	{
+		typedef ActorComponent Base;
+		private:
+			bool m_Value;
+			
+		public:
+			CustomBooleanProperty();
+			ActorComponent* makeInstance(Actor* resetActor) override;
+			void copy(CustomBooleanProperty* property, Actor* resetActor);
+			static CustomBooleanProperty* read(Actor* actor, BlockReader* reader, CustomBooleanProperty* property = NULL);
+
+			void resolveComponentIndices(ActorComponent** components) override;
+			const bool value() const;
+			void value(const bool v);
+	};
 }
 #endif
\ No newline at end of file