diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 5855b3960..b6bbd984f 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -79,6 +79,8 @@ data World = World , _cameraCenter :: Point2 , _cameraRot :: Float , _cameraZoom :: Float + , _itemZoom :: Float + , _defaultZoom :: Float , _cameraViewFrom :: Point2 , _viewDistance :: Float , _creatures :: IM.IntMap Creature diff --git a/src/Dodge/Default/World.hs b/src/Dodge/Default/World.hs index 961a5a3fe..07ab53106 100644 --- a/src/Dodge/Default/World.hs +++ b/src/Dodge/Default/World.hs @@ -24,6 +24,8 @@ defaultWorld = World , _cameraCenter = V2 0 0 , _cameraRot = 0 , _cameraZoom = 1 + , _itemZoom = 1 + , _defaultZoom = 1 , _cameraViewFrom = V2 0 0 , _viewDistance = 1000 , _modifications = IM.empty diff --git a/src/Dodge/Item/Weapon/BulletGun/Cane.hs b/src/Dodge/Item/Weapon/BulletGun/Cane.hs index 43b45dd90..ff114d747 100644 --- a/src/Dodge/Item/Weapon/BulletGun/Cane.hs +++ b/src/Dodge/Item/Weapon/BulletGun/Cane.hs @@ -151,7 +151,8 @@ rifle = bangCane & itConsumption . ammoBaseMax .~ 1 & itUse . useAim . aimWeight .~ 6 & itUse . useAim . aimRange .~ 1 - & itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5} +-- & itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 1.5} + & itUse . useAim . aimZoom .~ defaultItZoom {_itZoomFac = 2} repeater :: Item repeater = rifle & itModules . at ModRifleMag ?~ DefaultModule diff --git a/src/Dodge/Update/Camera.hs b/src/Dodge/Update/Camera.hs index a9a0ba1dc..052273908 100644 --- a/src/Dodge/Update/Camera.hs +++ b/src/Dodge/Update/Camera.hs @@ -8,6 +8,7 @@ module Dodge.Update.Camera import Dodge.Data import Dodge.Base import Dodge.Zone +import Dodge.Creature.Test import Geometry --import Geometry.ConvexPoly import Dodge.GameRoom @@ -26,8 +27,8 @@ import qualified SDL update where your avatar's view is from. -} updateCamera :: Configuration -> World -> World updateCamera cfig = setViewDistance cfig - . moveCamera cfig - . autoZoomCamera cfig . updateScopeZoom + . moveZoomCamera cfig + . updateScopeZoom . rotateCamera cfig moveZoomCamera :: Configuration -> World -> World @@ -35,20 +36,31 @@ moveZoomCamera cfig w = w & cameraCenter .~ newcen & cameraViewFrom .~ newvf & cameraZoom .~ newzoom + & defaultZoom .~ newDefaultZoom + & itemZoom .~ newItemZoom where newvf = _crPos (you w) +.+ fromMaybe (V2 0 0) (yourItem w ^? _Just . itScope . scopePos) - newcen = newvf - newzoom = changeZoom (_cameraZoom w) - wallZoom = farWallDist newvf cfig w - idealZoom - | SDL.ButtonRight `S.member` _mouseButtons w - = theScopeZoom * maybe zoomNoItem zoomFromItem (yourItem w ^? _Just . itUse . useAim . aimZoom) wallZoom - | otherwise = zoomNoItem wallZoom --- = maybe zoomNoItem zoomFromItem (yourItem w ^? itZoom) wallZoom - changeZoom curZoom + newcen = newvf +.+ offset + offset = rotateV (_cameraRot w) $ ((newzoom - newDefaultZoom)/(newDefaultZoom*newzoom)) *.* _mousePos w + --newzoom = changeZoom (_cameraZoom w) idealZoom' + newzoom = newDefaultZoom * newItemZoom + idealDefaultZoom = clipZoom wallZoom + newDefaultZoom = changeZoom (_defaultZoom w) idealDefaultZoom + idealItemZoom + | crIsAiming (you w) + = fromMaybe 1 $ fmap zoomFromItem' (yourItem w ^? _Just . itUse . useAim . aimZoom) + | otherwise = 1 + newItemZoom = changeZoom (_itemZoom w) idealItemZoom + changeZoom curZoom idealZoom | curZoom > idealZoom + 0.01 = ((zoomOutSpeed-1)*curZoom + idealZoom) / zoomOutSpeed | curZoom < idealZoom - 0.01 = ((zoomInSpeed -1)*curZoom + idealZoom) / zoomInSpeed | otherwise = idealZoom + wallZoom = farWallDist newvf cfig w + idealZoom' + | SDL.ButtonRight `S.member` _mouseButtons w + = theScopeZoom * maybe clipZoom zoomFromItem (yourItem w ^? _Just . itUse . useAim . aimZoom) newDefaultZoom + | otherwise = newDefaultZoom +-- = maybe clipZoom zoomFromItem (yourItem w ^? itZoom) wallZoom -- these speeds are inverted, larger means slower zoomInSpeed = 25 zoomOutSpeed = 15 @@ -62,7 +74,7 @@ moveCamera cfig w = w where camPos = _cameraViewFrom w wallZoom = farWallDist camPos cfig w - basezoom = zoomNoItem wallZoom + basezoom = clipZoom wallZoom aimRangeFactor | _cameraZoom w == 0 = 0 | otherwise = fromMaybe 0 (yourItem w ^? _Just . itUse . useAim . aimRange) / _cameraZoom w @@ -169,6 +181,11 @@ notAtTerminal w = isNothing $ w ^? hud . hudElement . subInventory . termParams --zoomCamBy :: Float -> World -> World --zoomCamBy x w = w {_cameraZoom = max (_cameraZoom w + x) 0.01} +zoomFromItem' + :: ItZoom + -> Float +zoomFromItem' ItZoom {_itZoomMax = zMax, _itZoomMin = zMin, _itZoomFac = zFac} + = min zMax $ max zMin zFac zoomFromItem :: ItZoom @@ -176,10 +193,10 @@ zoomFromItem -> Float zoomFromItem ItZoom {_itZoomMax = zMax, _itZoomMin = zMin, _itZoomFac = zFac} = min zMax . max zMin . (zFac *) -zoomNoItem +clipZoom :: Float -- ^ Furthest viewable distance -> Float -zoomNoItem = min 20 . max 0.2 +clipZoom = min 20 . max 0.2 {- Automatically sets the zoom of the camera according to the surrounding walls. -} autoZoomCamera :: Configuration -> World -> World autoZoomCamera cfig w = w & cameraZoom %~ changeZoom @@ -188,9 +205,9 @@ autoZoomCamera cfig w = w & cameraZoom %~ changeZoom wallZoom = farWallDist camPos cfig w idealZoom | SDL.ButtonRight `S.member` _mouseButtons w - = theScopeZoom * maybe zoomNoItem zoomFromItem (yourItem w ^? _Just . itUse . useAim . aimZoom) wallZoom - | otherwise = zoomNoItem wallZoom --- = maybe zoomNoItem zoomFromItem (yourItem w ^? itZoom) wallZoom + = theScopeZoom * maybe clipZoom zoomFromItem (yourItem w ^? _Just . itUse . useAim . aimZoom) wallZoom + | otherwise = clipZoom wallZoom +-- = maybe clipZoom zoomFromItem (yourItem w ^? itZoom) wallZoom changeZoom curZoom | curZoom > idealZoom + 0.01 = ((zoomOutSpeed-1)*curZoom + idealZoom) / zoomOutSpeed | curZoom < idealZoom - 0.01 = ((zoomInSpeed -1)*curZoom + idealZoom) / zoomInSpeed