summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Properties.hs125
1 files changed, 123 insertions, 2 deletions
diff --git a/lib/Properties.hs b/lib/Properties.hs
index 797a1d7..551c502 100644
--- a/lib/Properties.hs
+++ b/lib/Properties.hs
@@ -175,6 +175,8 @@ checkTileset = do
where checkTileProperty :: Property -> LintWriter Tileset
checkTileProperty p@(Property name _) = case name of
"collides" -> isBool p
+ -- named tiles are needed for scripting and do not hurt otherwise
+ "name" -> isString p
_ -> warn $ "unknown tile property " <> prettyprint name
<> " in tile with global id "
<> showText (tileId tile)
@@ -225,7 +227,13 @@ checkLayer = do
checkObjectProperty :: Object -> Property -> LintWriter Layer
checkObjectProperty obj p@(Property name _) = case name of
- "url" -> pure ()
+ "url" -> do
+ pure ()
+ unwrapURI (Proxy @"website") p
+ (dependsOn . Link)
+ (dependsOn . Local)
+ unless (objectType obj == "website")
+ $ complain "\"url\" can only be set for objects of type \"website\""
"allowApi" -> forbidProperty name
"getBadge" -> do
when (1 /= length (getProperties obj))
@@ -245,8 +253,79 @@ checkObjectProperty obj p@(Property name _) = case name of
(Just w, Just h) | w /= 0 && h /= 0 ->
BadgeRect objectX objectY w h
_ -> BadgePoint objectX objectY
- _ -> warn $ "unknown object property " <> prettyprint name <> "."
+ -- | these properties are used by the extended script to allow doors
+ "door" -> do
+ isBool p
+ unless (objectType obj == "variable") $
+ complain "Door variables must be of type \"variable\""
+ when (null (objectName obj) || objectName obj == Just mempty) $
+ complain "Door variables objects must have a name given"
+
+ "default" -> do
+ isBool p
+ suggestProperty "door"
+ "persist" -> do
+ isBool p
+ suggestProperty "door"
+ "openLayer" -> do
+ isString p
+ suggestProperty "door"
+ "closeLayer" -> do
+ isString p
+ suggestProperty "door"
+ "openSound" -> do
+ isString p
+
+ unwrapURI (Proxy @"audio") p
+ (dependsOn . Link)
+ (dependsOn . Local)
+
+ unless (containsProperty obj "soundRadius") $
+ suggest "set \"soundRadius\" to a limit the door sound to a certain area\"."
+
+ suggestProperty "door"
+ "closeSound" -> do
+ isString p
+
+ unwrapURI (Proxy @"audio") p
+ (dependsOn . Link)
+ (dependsOn . Local)
+
+ unless (containsProperty obj "soundRadius") $
+ -- Do not suggest again if already suggested for openSound
+ unless (containsProperty obj "openSound") $
+ suggest "set \"soundRadius\" to a limit the door sound to a certain area\"."
+
+ suggestProperty "door"
+
+ -- | these properties are used by the extended script to allow doors
+ "bell" -> do
+ isBool p
+ unless (objectType obj == "variable") $
+ complain "Bell variables must be of type \"variable\""
+ when (null (objectName obj) || objectName obj == Just mempty) $
+ complain "Bell variables objects must have a name given"
+ "bellSound" -> do
+ isString p
+
+ unwrapURI (Proxy @"audio") p
+ (dependsOn . Link)
+ (dependsOn . Local)
+
+ suggestProperty "bell"
+
+ -- | Applies to doors and bells as well
+ "soundRadius" -> do
+ isInt p
+ -- requireAnyProperty "door" "bell"
+
+
+ _ -> warn $ "unknown object property " <> prettyprint name <> "."
+ where
+ suggestProperty req = do
+ unless (containsProperty obj req) $
+ suggest( "property " <> prettyprint req <> " is suggested for property " <> prettyprint name <> ".")
-- | Checks a single (custom) property of an objectgroup layer
checkObjectGroupProperty :: Property -> LintWriter Layer
@@ -384,6 +463,44 @@ checkTileLayerProperty p@(Property name _value) = case name of
-- False -> warn "property \"collides\" set to 'false' is useless."
"getBadge" -> complain "\"getBadge\" must be set on an \"objectgroup\" \
\ layer; it does not work on tile layers."
+
+ -- | these properties are used by the extended script to allow doors
+ "zone" -> do
+ isString p
+ uselessEmptyLayer
+ "doorVariable" -> do
+ isString p
+ requireProperty "zone"
+ "autoOpen" -> do
+ isBool p
+ requireProperty "doorVariable"
+ "autoClose" -> do
+ isBool p
+ requireProperty "doorVariable"
+ "code" -> do
+ isString p
+ requireProperty "doorVariable"
+ "openTriggerMessage" -> do
+ isString p
+ requireProperty "doorVariable"
+ "closeTriggerMessage" -> do
+ isString p
+ requireProperty "doorVariable"
+
+ -- | these properties are used by the extended script to allow bells
+
+ "bellVariable" -> do
+ isString p
+ requireProperty "zone"
+ "bellButtonText" -> do
+ isString p
+ requireProperty "bellVariable"
+ "bellPopup" -> do
+ isString p
+ requireProperty "bellVariable"
+
+
+ -- name on tile layer unsupported
"name" -> isUnsupported
_ ->
warn $ "unknown property type " <> prettyprint name
@@ -594,6 +711,10 @@ isString = flip unwrapString (const $ pure ())
isBool :: Property -> LintWriter a
isBool = flip unwrapBool (const $ pure ())
+-- | just asserts that this is a int
+isInt:: Property -> LintWriter a
+isInt = flip unwrapInt (const $ pure ())
+
isIntInRange :: Int -> Int -> Property -> LintWriter b
isIntInRange = isOrdInRange @Int unwrapInt