From 6c3ac407ed3993142dd46f20c6cfbaa438224eaf Mon Sep 17 00:00:00 2001 From: nek0 Date: Sat, 16 Feb 2019 20:38:00 +0100 Subject: [PATCH] made doors player interactable --- assets/doors/door_asc_0.kra | Bin 476595 -> 503697 bytes assets/doors/door_asc_0.png | Bin 622 -> 1524 bytes assets/doors/door_desc_0.kra | Bin 475135 -> 515221 bytes assets/doors/door_desc_0.png | Bin 608 -> 1686 bytes src/Load.hs | 30 ++++++++++-- src/MainGame/WorldMap.hs | 43 +++++++++++------ src/NPC.hs | 6 +-- src/Object.hs | 14 +++--- src/Object/ActionTime.hs | 20 ++++++++ src/Object/Computer.hs | 25 ++++++++-- src/Object/Door.hs | 88 +++++++++++++++++++++++++++++++++++ src/Types/Entity.hs | 2 +- tracer-game.cabal | 2 + 13 files changed, 196 insertions(+), 34 deletions(-) create mode 100644 src/Object/ActionTime.hs create mode 100644 src/Object/Door.hs diff --git a/assets/doors/door_asc_0.kra b/assets/doors/door_asc_0.kra index 2fc8f05df2dfe06446bea12371216b367ad2b250..0dc75e4c382308cd6cb98bcd3684637cc094802e 100644 GIT binary patch delta 26636 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 diff --git a/assets/doors/door_asc_0.png b/assets/doors/door_asc_0.png index 9e56a784a5e42028e3b89a518741836fabb539eb..cd4cf2efce240ad09ac91a63503055bc70497651 100644 GIT binary patch literal 1524 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 U41c>TR2~%|0k0O`CBeJ@2Z`h#@&Et; delta 13798 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 N0ZHfmo4f_`{{WU%W!(S( diff --git a/assets/doors/door_desc_0.png b/assets/doors/door_desc_0.png index 6ec04a247fb0caba250616a28be4cf00ec4407b4..8d31d3b5a3c21912d7c13da2fa55d1b63267b5e5 100644 GIT binary patch literal 1686 zcmYLJ3s}-u6u+nh;tLj)mVsuGHe2c_wGxR;{BNj9^m44sOs7+0l9r){CPnrX)S>pk zL>JCzSvi|6{FEL(SUK@aM5mRHG;@|wnTq@WUHf*v@7{avls$>mKCxpz@;T#=MLfE7-7p&gGpL%@+KcLafD|%>3SNcj4CRkwx2!&m7Jf zii-X%AC6Bh+H%E@5F7BeeJel!&!vC8G+%)6Y zdT^|Mx+}9|ZTVVpzvsqj)6bLY5B-nG3F$MV$-i0!c!H^{OY1Xq{%Wqe({hQ1DlIZI zJthM#mrM2b_MR~>p{)*KkRPKQaxVDM5|Y&C=VL`2BzN||hL-#Rggs>L1r zVdi^r;l8V)W>nC(HP%9|C)F$amME>Bd#0#lrmh zQeaP87FjaZ3o7Sbd_}#&K9mIFM9a(mbMveGlw6S zk2^QV&m59x;_qS7XNeUYDvW+e-Z02Rqu zZ6AJho2>@J)R6b@TGiDsg6)_aFy1@0XK(>+uqIliKfdWn^o=0~F$C+JZDCDOh6l5s zFR~8}4So3~bV1=Y|Qb1r09v z3*M_0@qC$rJ$-rA_T3{lwRPRe;TiJA=zzCTMunAK)G-QH;5^)FH@%<%@l`Hn&ZA?e2keoswoX`d&f zOebQZc`d~cTu+2mN!oh3hV!w&Ii9aJy{okWrbXLtY0;Rmq2=WF`%N9*iGR7qmhlSP zB0K}3??o}@!Z0?gW`6ueO?Ttax?}glZfRF;B+@c|55HP{x2O8*+l+>IX`b;HH=M9( z?ljd$Y{yC9x1z2X1|-RETeVxXj`&CFNt3*-%37#&j5}dz1EhIP+!i!rpdzt{6vnml zxyj^U>M)*Y`FGbI8;!==YZsunDc5q$h{44JA~3K7Yl<6-EmM4qkQ7b%YR8UbKE|B? zjLh*is}x4ybhb{D#}!G20b-);VO(*;(lW0FeEon2q)drnu?6p7a%Bn+D8Ji$Dnb(J zX#vwkcK{T(^8d*L^fGX4vGbtSiT)X!gRhiB*i!e^>$k{((x?Mc&Xszt{j$L#1$!RJ z2F~YY0{R&%R|jzWi;F%s;i;w9Pe~eCY(9?s#|lptr!|<(pLv!P*w{gF8xMp&7d2l% zC+P=v*diI-%l3(Zp+=25H0?v6(wLr5suQDF(b6bR6X>`ll0uu@Txdnm(`-B=s4hZM zzf=TO*in>?m)fiaStWL2sL3At3A)a4BDl4q+SjVKJ}d#wsmhjiH-jU>mFPY2mnmxS zNEOSift0uf@#T}q*+8aPh_Lcq7F^(k58>BQ*nJW&tGchA&N>Y?pfq04#7XztH|XwC zP6fK)Jd{I1%;n;Cd479YApzgKhG~ba)WvT0o$Q3^&d+ephH~%>G0y|q1LJPTNOgUW zt~;vCVY2r+$^QFMfUdaAXg1|1e#T-a7!uPzruDfEk1qK3{i--GDEWCig`(^{44Z@; zMXt|7!9l}ipRNtQpU$f8ytg@i0qT=8dCyahMmE{^p)~IZ5t5u_<1r|Qf<++FJs=Uy z2_b^I0md8%U`-N}$)UJ8z^=dew}6n_5uxXd)Yc@OtlHbfh^DQi2@mm1W5560x^Zvx iK5rP1Gj2H?ilTwt(Zh=^f22(AM{J-?Apt5zMAkp59L@Ux delta 578 zcmV-I0=@l~4d4Wj77GAM2nGNE01NU`xRD_je*zLoL_t(|+U=T8PJ=)c#s@M>Z=mk6 zhC67)P3e|6OcEBB#a)(ojcb2bFq+BYM%Ab3s#I0m9AAt%M^iaY|{_;VPSR0J?&3 zrUbBL1h+*VN=Eq1vTSFBbpWEzB9ViXi zmu2Zz3G7on^_3V$3!u?Z<7fd)UcTL2e+QsH5Fr2rfB+Bx0zd%ND-1)HB#E~1Ib`EP zd7f*%4Z~#mj2Lr&Caq9qV8@C1kigDur`Wi2aLiRxr-~^z;c=H<-0H{w~I{+-k zwEz(2u^3kl0Gn}ZuR$orjRSyY+!z3;# + ( p + increment + , "Loading Animation \"neDoor0: open\"" + ))) + neDoor0open <- loadAnimationSprites "assets/doors/door_desc_0.png" nvg + [ ( AnimId AnimDoor0 "open" NE + , AnimationConfig (0, 0) (64, 74) (0, 74) 5 1 APOnce + ) + ] modifyMVar_ progress (return . (\(p, _) -> ( p + increment , "Loading Animation \"neDoor0: shut\"" ))) - neDoor0shut <- loadAnimationSprites "assets/doors/door_asc_0.png" nvg + neDoor0shut <- loadAnimationSprites "assets/doors/door_desc_0.png" nvg [ ( AnimId AnimDoor0 "shut" NE - , AnimationConfig (0, 0) (64, 74) (0, 0) 1 0 APLoop + , AnimationConfig (0, 4*74) (64, 74) (0, -74) 5 1 APOnce + ) + ] + modifyMVar_ progress (return . (\(p, _) -> + ( p + increment + , "Loading Animation \"nwDoor0: open\"" + ))) + nwDoor0open <- loadAnimationSprites "assets/doors/door_asc_0.png" nvg + [ ( AnimId AnimDoor0 "open" NW + , AnimationConfig (0, 0) (64, 74) (0, 74) 5 1 APOnce ) ] modifyMVar_ progress (return . (\(p, _) -> ( p + increment , "Loading Animation \"nwDoor0: shut\"" ))) - nwDoor0shut <- loadAnimationSprites "assets/doors/door_desc_0.png" nvg + nwDoor0shut <- loadAnimationSprites "assets/doors/door_asc_0.png" nvg [ ( AnimId AnimDoor0 "shut" NW - , AnimationConfig (0, 0) (64, 74) (0, 0) 1 0 APLoop + , AnimationConfig (0, 4*74) (64, 74) (0, -74) 5 1 APOnce ) ] modifyMVar_ progress (return . (\(p, _) -> @@ -499,7 +517,9 @@ loadFork ws win glc nvg future progress = do toiletFree ++ toiletOccupied ++ neDoor0shut ++ - nwDoor0shut + neDoor0open ++ + nwDoor0shut ++ + nwDoor0open ) , loadAssetIcons = M.fromList icons } diff --git a/src/MainGame/WorldMap.hs b/src/MainGame/WorldMap.hs index a08cf10..ebac05f 100644 --- a/src/MainGame/WorldMap.hs +++ b/src/MainGame/WorldMap.hs @@ -147,7 +147,7 @@ loadMapFork ud ad future progress = do { pos = Just $ reachCoord - V2 1 0 , obstacle = Just $ Boundaries (10/36, 8/36) (28/36, 30/36) , anim = Just $ AnimState (AnimId AnimCopier "open" N) 0 0 - , objAccess = Just (V2 1 0, NW) + , objAccess = Just [(V2 1 0, NW)] , objType = Just ObjCopier , objState = Just "idle" } @@ -167,7 +167,8 @@ loadMapFork ud ad future progress = do void $ createEntity $ newEntity { pos = Just $ reachCoord - fmap fromIntegral access , anim = Just $ AnimState (AnimId AnimComputer "off" dir) 0 0 - , objAccess = Just (access, dir) + , rot = Just dir + , objAccess = Just [(access, dir)] , objType = Just ObjComputer , objState = Just "off" } @@ -183,7 +184,7 @@ loadMapFork ud ad future progress = do { pos = Just $ reachCoord - V2 0 (-1) , obstacle = Just $ Boundaries (0, 0) (1, 1) , anim = Just $ AnimState (AnimId AnimToilet "free" N) 0 0 - , objAccess = Just (V2 0 (-1), dir) + , objAccess = Just [(V2 0 (-1), dir)] , objType = Just ObjToilet } ) (A.log A.Debug ("number of toilets: " ++ show (length toilets)) toilets) @@ -218,6 +219,7 @@ loadMapFork ud ad future progress = do , mmvel = Just (V2 0 0) , player = Just () , rot = Just SE + , clearanceLvl = Just 0 , anim = Just $ AnimState (AnimId AnimIntruder "standing" SE) 0 0 } liftIO $ A.logIO A.Debug $ "number of placed NPCs: " ++ show (length computers) @@ -288,18 +290,31 @@ loadMapFork ud ad future progress = do fromMaybe False (isWall <$> imgmat M.! (r, c))) deltas orientation - | head wall == V2 0 1 || head wall == V2 0 (-1) = NE - | head wall == V2 1 0 || head wall == V2 (-1) 0 = NW + | head wall == V2 0 1 || head wall == V2 0 (-1) = NW + | head wall == V2 1 0 || head wall == V2 (-1) 0 = NE | otherwise = error ("strange wall: " ++ show wall) void $ createEntity $ newEntity { pos = Just (fmap ((+ 0.5) . fromIntegral) coord) , clearanceLvl = Just (maximum $ 0 : Prelude.map clearance (Prelude.map snd rooms)) - , anim = Just $ AnimState (AnimId AnimDoor0 "shut" orientation) 0 0 + , anim = Just $ AnimState (AnimId AnimDoor0 "shut" orientation) 0 1 , obstacle = Just $ case orientation of - NE -> Boundaries (4/9, 0) (5/9, 1) - NW -> Boundaries (0, 4/9) (1, 5/9) + NW -> Boundaries (4/9, 0) (5/9, 1) + NE -> Boundaries (0, 4/9) (1, 5/9) _ -> error "strange orientation for door" , ignoreObstacle = Just () + , rot = Just orientation + , objAccess = Just $ case orientation of + NW -> + [ ((V2 (-1) 0), SE) + , ((V2 1 0), NW) + ] + NE -> + [ ((V2 0 1), SW) + , ((V2 0 (-1)), NE) + ] + _ -> error "strange orientation for door" + , objType = Just ObjDoor + , objState = Just "shut" } ) doors liftIO $ modifyMVar_ progress (return . (\(p, _) -> @@ -467,15 +482,15 @@ playerInteract (MsgMouseButton _ _ SDL.Pressed _ SDL.ButtonRight _ m) = do with objAccess with objType with objState - (rel, dir) <- query objAccess + reldirs <- query objAccess pos' <- query pos otype <- query objType ostate <- query objState ent <- queryEnt - if ((fmap floor ppos :: V2 Int) == (fmap floor pos' :: V2 Int) || + if any (\(rel, dir) -> ((fmap floor ppos :: V2 Int) == (fmap floor pos' :: V2 Int) || (fmap floor ppos :: V2 Int) == (fmap floor pos' :: V2 Int) + rel) && (fmap floor (ppos + V2 dr dc) :: V2 Int) == (fmap floor pos' ::V2 Int) && - pdir == dir + pdir == dir) reldirs then return $ Just (otype, ostate, ent) else return Nothing let relEnts = catMaybes mrelEnts @@ -507,14 +522,14 @@ playerInteract2 (ActionMessage ActActivate _) = do with objAccess with objType with objState - (rel, dir) <- query objAccess + reldirs <- query objAccess pos' <- query pos otype <- query objType ostate <- query objState ent <- queryEnt - if ((fmap floor ppos :: V2 Int) == (fmap floor pos' :: V2 Int) || + if any (\(rel, dir) -> ((fmap floor ppos :: V2 Int) == (fmap floor pos' :: V2 Int) || (fmap floor ppos :: V2 Int) == (fmap floor pos' :: V2 Int) + rel) && - pdir == dir + pdir == dir) reldirs then return $ Just (otype, ostate, ent) else return Nothing let relEnts = catMaybes mrelEnts diff --git a/src/NPC.hs b/src/NPC.hs index 318625a..5c7173c 100644 --- a/src/NPC.hs +++ b/src/NPC.hs @@ -252,7 +252,7 @@ updateStats dt = getObject :: (MonadIO m, RealFrac a1) => V2 a1 - -> SystemT Entity m [(Ent, V2 Double, (V2 Int, Direction))] + -> SystemT Entity m [(Ent, V2 Double, [(V2 Int, Direction)])] getObject npos = do candidates <- efor allEnts $ do with pos @@ -265,8 +265,8 @@ getObject npos = do return (ent, pos', oacc) liftIO $ logIO A.Verbose ("candidates: " ++ show candidates) return $ - filter (\(_, p, (delta, _)) -> - fmap floor p + delta == fmap floor npos + filter (\(_, p, deltaors) -> + any (\(delta, _) -> fmap floor p + delta == fmap floor npos) deltaors ) candidates getPath diff --git a/src/Object.hs b/src/Object.hs index cb440c8..98d7633 100644 --- a/src/Object.hs +++ b/src/Object.hs @@ -18,12 +18,15 @@ import Types import Object.Computer import Object.Copier +import Object.Door instance ObjectAction ObjType ObjState where objectAction dt t@ObjCopier s ent = copierObjectAction dt t s ent objectAction dt t@ObjComputer s ent = computerObjectAction dt t s ent + objectAction dt t@ObjDoor s ent = doorObjectAction dt t s ent + objectAction _ _ _ _ = return () objectTransition t@ObjCopier s pa ent aent = @@ -32,12 +35,7 @@ instance ObjectAction ObjType ObjState where objectTransition t@ObjComputer s pa ent aent = computerObjectTransition t s pa ent aent + objectTransition t@ObjDoor s pa ent aent = + doorObjectTransition t s pa ent aent + objectTransition _ _ _ _ _ = return unchanged - -instance ActionTime ObjType ObjState where - actionTime ObjCopier "copying" = 5 - actionTime ObjComputer "off" = 0 - actionTime ObjComputer "on" = 20 - actionTime ObjComputer "hack" = 20 - - actionTime o s = A.log Error (show o ++ ": " ++ s ++ ": has not a time") 0 diff --git a/src/Object/ActionTime.hs b/src/Object/ActionTime.hs new file mode 100644 index 0000000..815e438 --- /dev/null +++ b/src/Object/ActionTime.hs @@ -0,0 +1,20 @@ +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +module Object.ActionTime where + +import Affection as A + +-- internal imports + +import Types + +instance ActionTime ObjType ObjState where + actionTime ObjCopier "copying" = 5 + actionTime ObjComputer "off" = 0 + actionTime ObjComputer "on" = 20 + actionTime ObjComputer "hack" = 20 + actionTime ObjComputer "hack" = 20 + actionTime ObjDoor "open" = 2 + + actionTime o s = A.log Error (show o ++ ": " ++ s ++ ": has not a time") 0 diff --git a/src/Object/Computer.hs b/src/Object/Computer.hs index 6fe764a..0557bdf 100644 --- a/src/Object/Computer.hs +++ b/src/Object/Computer.hs @@ -7,15 +7,26 @@ module Object.Computer where import Affection as A import Control.Monad (when) +import Control.Monad.IO.Class (MonadIO(..)) import Data.Ecstasy import Data.Maybe import Linear +-- internal imports + import Types +import Object.ActionTime +computerObjectAction + :: (Monad m, MonadIO m) + => Double + -> ObjType + -> ObjState + -> Ent + -> SystemT Entity m () computerObjectAction dt t@ObjComputer s@"on" ent = do pent <- efor (anEnt ent) $ do with objUsedBy @@ -91,10 +102,18 @@ computerObjectAction dt t@ObjComputer s@"hack" ent = do computerObjectAction _ _ _ _ = return () +computerObjectTransition + :: (Monad m, MonadIO m) + => ObjType + -> ObjState + -> Bool + -> Ent + -> Maybe Ent + -> SystemT Entity m (Entity 'SetterOf) computerObjectTransition ObjComputer "off" pa ent (Just aent) = do + [dir] <- efor (anEnt aent) (query rot) e <- efor (anEnt ent) $ do solved <- queryMaybe objSolved - (_, dir) <- query objAccess if pa then if not (fromMaybe False solved) then do @@ -134,7 +153,7 @@ computerObjectTransition ObjComputer "off" pa ent (Just aent) = do computerObjectTransition ObjComputer "on" _ ent _ = do e <- efor (anEnt ent) $ do - (_, dir) <- query objAccess + dir <- query rot let nstat = AnimState (AnimId AnimComputer "off" dir) 0 @@ -152,7 +171,7 @@ computerObjectTransition ObjComputer "hack" pa ent _ = if pa then do e <- efor (anEnt ent) $ do - (_, dir) <- query objAccess + dir <- query rot let nstat = AnimState (AnimId AnimComputer "off" dir) 0 diff --git a/src/Object/Door.hs b/src/Object/Door.hs new file mode 100644 index 0000000..850976f --- /dev/null +++ b/src/Object/Door.hs @@ -0,0 +1,88 @@ +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE FlexibleContexts #-} +module Object.Door where + +import Affection as A + +import Control.Monad (when) + +import Data.Ecstasy +import Data.Maybe + +import Linear + +-- internal imports + +import Types + +import Object.ActionTime + +doorObjectAction dt t@ObjDoor s@"open" ent = do + emap (anEnt ent) $ do + mtime <- queryMaybe objStateTime + case mtime of + Nothing -> do + return unchanged + Just ttl -> + return unchanged + { objStateTime = Set (ttl - dt) + } + trans <- efor (anEnt ent) $ do + mttl <- queryMaybe objStateTime + case mttl of + Nothing -> return False + Just ttl -> return (ttl < 0) + when (head trans) (setEntity ent =<< doorObjectTransition t s False ent Nothing) + +doorObjectAction _ _ _ _ = return () + +doorObjectTransition t@ObjDoor s@"shut" _ ent (Just aent) = do + [clearance] <- efor (anEnt aent) (query clearanceLvl) + e <- efor (anEnt ent) $ do + dir <- query rot + oclear <- query clearanceLvl + liftIO $ A.logIO A.Debug (show aent ++ " is attempting to open door " ++ show ent) + liftIO $ A.logIO A.Debug ("door clearance: " ++ show oclear ++ ", entity clearance: " ++ show clearance) + if clearance == oclear + then do + let nstat = AnimState + (AnimId AnimDoor0 "open" dir) + 0 + 0 + return unchanged + { objState = Set "open" + , objStateTime = Set (actionTime t ("open" :: String)) + , objUsedBy = Set aent + , anim = Set nstat + , obstacle = Unset + } + else + return unchanged + return (head e) + +doorObjectTransition ObjDoor "open" _ ent Nothing = do + e <- efor (anEnt ent) $ do + ttl <- query objStateTime + orientation <- query rot + if ttl < 0 + then do + let nstat = AnimState + (AnimId AnimDoor0 "shut" orientation) + 0 + 0 + return unchanged + { anim = Set nstat + , objState = Set "shut" + , objStateTime = Unset + , objUsedBy = Unset + , obstacle = Set $ case orientation of + NW -> Boundaries (4/9, 0) (5/9, 1) + NE -> Boundaries (0, 4/9) (1, 5/9) + _ -> error "strange orientation for door" + } + else return unchanged + return (head e) + +doorObjectTransition _ _ _ _ _ = return unchanged diff --git a/src/Types/Entity.hs b/src/Types/Entity.hs index a58a961..fe03fe7 100644 --- a/src/Types/Entity.hs +++ b/src/Types/Entity.hs @@ -29,7 +29,7 @@ data Entity f = Entity , npcStats :: Component f 'Field NPCStats , clearanceLvl :: Component f 'Field Word , anim :: Component f 'Field AnimState - , objAccess :: Component f 'Field ((V2 Int), Direction) + , objAccess :: Component f 'Field [((V2 Int), Direction)] , objType :: Component f 'Field ObjType , objState :: Component f 'Field ObjState , objStateTime :: Component f 'Field Double diff --git a/tracer-game.cabal b/tracer-game.cabal index 86e28c7..66e2634 100644 --- a/tracer-game.cabal +++ b/tracer-game.cabal @@ -49,8 +49,10 @@ executable tracer-game , MindMap , NPC , Object + , Object.ActionTime , Object.Computer , Object.Copier + , Object.Door , Util default-extensions: OverloadedStrings , DeriveGeneric