about summary refs log tree commit diff
path: root/src/Xanthous/Entities.hs
diff options
context:
space:
mode:
authorGriffin Smith <root@gws.fyi>2019-10-16T16·10-0400
committerGriffin Smith <root@gws.fyi>2019-10-16T16·10-0400
commit87fedcb6c9bc251a5a23a632ccf985b674b84bc7 (patch)
tree739fab972e9ae8af9849f3e8f65dad0f5bf13c7d /src/Xanthous/Entities.hs
parent4882350f5d7e54a6ae5c8760f2510273dae19c60 (diff)
Add draw priority
Rather than blindly taking one entity from the list when we have
multiple entities on the same tile, add a `drawPriority` method to the
Draw typeclass which allows individual entities to request to be drawn
on top - this avoids the "noodles floating over your head" bug we saw
before.
Diffstat (limited to 'src/Xanthous/Entities.hs')
-rw-r--r--src/Xanthous/Entities.hs16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/Xanthous/Entities.hs b/src/Xanthous/Entities.hs
index 93c4813cc483..ccd3ae42bfc3 100644
--- a/src/Xanthous/Entities.hs
+++ b/src/Xanthous/Entities.hs
@@ -10,6 +10,7 @@ module Xanthous.Entities
   , DrawCharacter(..)
   , DrawStyledCharacter(..)
   , DrawRawChar(..)
+  , DrawRawCharPriority(..)
   , Entity(..)
   , SomeEntity(..)
   , downcastEntity
@@ -97,6 +98,21 @@ instance
   ) => Draw (DrawRawChar rawField a) where
   draw (DrawRawChar e) = draw $ e ^. field @rawField . char
 
+newtype DrawRawCharPriority
+  (rawField :: Symbol)
+  (priority :: Nat)
+  (a :: Type)
+  = DrawRawCharPriority a
+
+instance
+  forall rawField priority a raw.
+  ( HasField rawField a a raw raw
+  , KnownNat priority
+  , HasChar raw EntityChar
+  ) => Draw (DrawRawCharPriority rawField priority a) where
+  draw (DrawRawCharPriority e) = draw $ e ^. field @rawField . char
+  drawPriority = const . fromIntegral $ natVal @priority Proxy
+
 --------------------------------------------------------------------------------
 
 data EntityChar = EntityChar