diff --git a/data/texture/smudgedDirt.png b/data/texture/smudgedDirt.png index d2a3debe2..a1f5368c0 100644 Binary files a/data/texture/smudgedDirt.png and b/data/texture/smudgedDirt.png differ diff --git a/src/Dodge/Combine.hs b/src/Dodge/Combine.hs index 1820cb0fd..106b8b438 100644 --- a/src/Dodge/Combine.hs +++ b/src/Dodge/Combine.hs @@ -16,20 +16,20 @@ invert = M.foldrWithKey (\k val -> M.insertWith (++) val [k]) M.empty combineList :: [([ItemType], ItemType)] combineList = - [ ( [ Pistol, Pipe, Hardware ] , Rifle ) - , ( [ Rifle, Hardware ] , Pistol ) - , ( [ Pistol, Pistol, Hardware ] , SpreadGun 2 ) - , ( [ SpreadGun 2, Pistol, Hardware ] , SpreadGun 3 ) - , ( [ SpreadGun 3, Pistol, Hardware ] , SpreadGun 4 ) - , ( [ SpreadGun 4, Pistol, Hardware ] , SpreadGun 5 ) - , ( [ Pistol, AutoGun, Hardware ] , LtAutoGun ) - , ( [ LtAutoGun, Pipe, Hardware ] , AutoGun ) - , ( [ Rifle, Rifle, Hardware ] , MultGun 2 ) - , ( [ MultGun 2, Rifle, Hardware ] , MultGun 3 ) - , ( [ MultGun 3, Rifle, Hardware ] , MultGun 4 ) - , ( [ MultGun 4, Rifle, Hardware ] , MultGun 5 ) - , ( [ LtAutoGun, Pipe, Hardware ] , AutoGun ) - , ( [ Pistol, BigTube, Hardware] , Launcher 1 ) - , ( [ Launcher 1, BigTube, Pistol, Hardware] , Launcher 2) - , ( [ Launcher 2, BigTube, Pistol, Hardware] , Launcher 3) + [ ( [ TPistol, TPipe, THardware ] , TRifle ) + , ( [ TRifle, THardware ] , TPistol ) + , ( [ TPistol, TPistol, THardware ] , TSpreadGun 2 ) + , ( [ TSpreadGun 2, TPistol, THardware ] , TSpreadGun 3 ) + , ( [ TSpreadGun 3, TPistol, THardware ] , TSpreadGun 4 ) + , ( [ TSpreadGun 4, TPistol, THardware ] , TSpreadGun 5 ) + , ( [ TPistol, TAutoGun, THardware ] , TLtAutoGun ) + , ( [ TLtAutoGun, TPipe, THardware ] , TAutoGun ) + , ( [ TRifle, TRifle, THardware ] , TMultGun 2 ) + , ( [ TMultGun 2, TRifle, THardware ] , TMultGun 3 ) + , ( [ TMultGun 3, TRifle, THardware ] , TMultGun 4 ) + , ( [ TMultGun 4, TRifle, THardware ] , TMultGun 5 ) + , ( [ TLtAutoGun, TPipe, THardware ] , TAutoGun ) + , ( [ TPistol, TBigTube, THardware] , TLauncher 1 ) + , ( [ TLauncher 1, TBigTube, TPistol, THardware] , TLauncher 2) + , ( [ TLauncher 2, TBigTube, TPistol, THardware] , TLauncher 3) ] diff --git a/src/Dodge/Combine/Data.hs b/src/Dodge/Combine/Data.hs index f4e14208d..696136385 100644 --- a/src/Dodge/Combine/Data.hs +++ b/src/Dodge/Combine/Data.hs @@ -1,34 +1,34 @@ module Dodge.Combine.Data where data ItemType - = Pipe - | BigTube - | Plate - | MChip - | Magnet - | Motor - | LED - | Hardware - | Nailbox - | Plank - | Prism - | LightSensor - | SoundSensor - | HeatSensor - | CopperWire - | EmptyCan - | Pistol - | AutoGun - | Rifle - | LtAutoGun - | HvAutoGun - | HvRifle - | MultGun Int - | SpreadGun Int - | Launcher Int - | Battery - | PortableFusion - | AutoFiringMech - | FiringMech - | TargetingModule + = TPipe + | TBigTube + | TPlate + | TMChip + | TMagnet + | TMotor + | TLED + | THardware + | TNailbox + | TPlank + | TPrism + | TLightSensor + | TSoundSensor + | THeatSensor + | TCopperWire + | TEmptyCan + | TPistol + | TAutoGun + | TRifle + | TLtAutoGun + | THvAutoGun + | THvRifle + | TMultGun Int + | TSpreadGun Int + | TLauncher Int + | TBattery + | TPortableFusion + | TAutoFiringMech + | TFiringMech + | TTargetingModule deriving (Eq,Ord) diff --git a/src/Dodge/Creature.hs b/src/Dodge/Creature.hs index fab2f82b9..336238160 100644 --- a/src/Dodge/Creature.hs +++ b/src/Dodge/Creature.hs @@ -30,6 +30,7 @@ import Dodge.Data import Dodge.Default import Dodge.Item.Weapon import Dodge.Item.Weapon.Launcher +import Dodge.Item.Weapon.AutoGun import Dodge.Item.Weapon.Bezier import Dodge.Item.Equipment import Dodge.Item.Consumable @@ -158,6 +159,7 @@ startInventory :: IM.IntMap Item startInventory = IM.fromList (zip [0..20] ( [hvAutoGun + ,pistol ,teslaGun ,blinkGun ,miniGun diff --git a/src/Dodge/Creature/Action/Movement.hs b/src/Dodge/Creature/Action/Movement.hs index a3d0e6b8d..0f653e15a 100644 --- a/src/Dodge/Creature/Action/Movement.hs +++ b/src/Dodge/Creature/Action/Movement.hs @@ -15,7 +15,9 @@ crMvBy :: Point2 -- ^ Movement translation vector, will be made relative to creature direction -> Creature -> Creature -crMvBy p' cr = advanceStepCounter (magV p) $ over crPos (+.+ p) cr +crMvBy p' cr = advanceStepCounter (magV p) cr + & crPos %~ (+.+ p) + & crMvDir .~ argV p where p = (*.*) (equipFactor * aimingFactor) $ rotateV (_crDir cr) p' equipFactor @@ -31,7 +33,9 @@ crMvAbsolute :: Point2 -- ^ Movement translation vector -> Creature -> Creature -crMvAbsolute p' cr = advanceStepCounter (magV p) $ over crPos (+.+ p) cr +crMvAbsolute p' cr = advanceStepCounter (magV p) cr + & crPos %~ (+.+ p) + & crMvDir .~ argV p where p = (*.*) (equipFactor * aimingFactor) p' equipFactor diff --git a/src/Dodge/Creature/AutoCrit.hs b/src/Dodge/Creature/AutoCrit.hs index 7c25c8143..82b48feb8 100644 --- a/src/Dodge/Creature/AutoCrit.hs +++ b/src/Dodge/Creature/AutoCrit.hs @@ -9,7 +9,7 @@ import Dodge.Creature.SentinelAI import Dodge.Creature.Rationality import Dodge.Creature.State --import Dodge.Creature.State.Data -import Dodge.Item.Weapon +import Dodge.Item.Weapon.AutoGun import Dodge.Item.Consumable --import Geometry import Picture diff --git a/src/Dodge/Creature/Picture.hs b/src/Dodge/Creature/Picture.hs index e4281a187..8e08ef84e 100644 --- a/src/Dodge/Creature/Picture.hs +++ b/src/Dodge/Creature/Picture.hs @@ -9,8 +9,11 @@ module Dodge.Creature.Picture import Dodge.Data --import Dodge.Creature.Stance.Data import Dodge.Creature.State.Data +import Dodge.Creature.Stance.Data +import Dodge.Creature.Test --import Dodge.Creature.AlertLevel.Data import Dodge.Picture.Layer +import Dodge.Item.Data import Picture import Geometry @@ -24,27 +27,16 @@ basicCrPict -> Picture basicCrPict col cr w = pictures $ targetingPic ++ - [ tr . onLayer CrLayer . piercingMod $ bluntScale $ naked --- , drawAwakeLevel cr + [ tr . piercingMod $ bluntScale $ naked col cr + , trFeet $ feet cr , tr $ drawEquipment cr ] where targetingPic = IM.elems $ IM.mapMaybeWithKey f $ _crInv cr f invid it = fmap ((\g -> g invid it cr w) . snd) (it ^? itTargeting . _Just) tr = uncurry translate (_crPos cr) . rotate (_crDir cr) + trFeet = uncurry translate (_crPos cr) . rotate (_crMvDir cr) cdir = _crDir cr - naked - | strikeMelee = color white $ circleSolid $ _crRad cr - | pdam > 200 = color red $ circleSolid $ _crRad cr - | pdam > 99 = color white $ circleSolid $ _crRad cr - | otherwise = pictures - [ translate (0.25 * crad) 0 $ circleSolid (crad * 0.5) - , scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr - ] - crad = _crRad cr - pastDams = _crPastDamage $ _crState cr - pdam = sum $ concatMap (map _dmAmount) pastDams - col' = light . light . light $ light col bluntDam :: Maybe Point2 bluntDam = find isBluntDam (concat pastDams) >>= (\dm -> (-.-) <$> dm ^? dmFrom <*> dm ^? dmTo) bluntScale = case fmap argV bluntDam of @@ -58,9 +50,64 @@ basicCrPict col cr w = pictures $ piercingMod = case fmap argV piercingDam of Just a -> rotate (a + cdir) . scale 0.8 1.2 . rotate (negate $ cdir + a) _ -> id + pastDams = _crPastDamage $ _crState cr + +feet :: Creature -> Picture +feet cr = case cr ^? crStance . carriage of + Just (Walking _ LeftForward) -> setL + [ translate up off $ circleSolid 5 + , translate (-up) (-off) $ circleSolid 5 + ] + Just (Walking _ RightForward) -> setL + [ translate (-up) off $ circleSolid 5 + , translate (up) (-off) $ circleSolid 5 + ] + _ -> setL + [ translate 0 off $ circleSolid 5 + , translate 0 (-off) $ circleSolid 5 + ] + where + setL = onLayerL [levLayer CrLayer, (-2)] . color (greyN 0.2) . pictures + off = 5 + up = 5 + +naked :: Color -> Creature -> Picture +naked col cr + | strikeMelee = onCrL . color white $ circleSolid $ _crRad cr + | pdam > 200 = onCrL . color red $ circleSolid $ _crRad cr + | pdam > 99 = onCrL . color white $ circleSolid $ _crRad cr + | aimingTwist = rotate twistA $ pictures + [ aboveIt . translate (negate 0.25 * crad) 0.25 $ + circleSolid (crad * 0.5) + , onCrL . translate 0 3 . rotate (negate 0.2) . scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr + , onCrL . translate 0 (negate 3) . rotate (0.2) . scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr + --, shoulderRot . scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr + ] + + | otherwise = onCrL $ pictures + [ translate (0.25 * crad) 0 $ circleSolid (crad * 0.5) + , translate 0 3 . rotate (negate 0.2) . scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr + , translate 0 (negate 3) . rotate (0.2) . scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr + --, shoulderRot . scale 0.5 1 $ color col' $ circleSolid $ _crRad cr, circLine $ _crRad cr + ] + where + aboveIt = onLayer HPtLayer + onCrL = onLayer CrLayer + twistA = negate 1 + aimingOneHand = crIsAiming' cr && crIt ^? itAimStance == Just OneHand + aimingTwist = crIsAiming' cr && crIt ^? itAimStance == Just TwoHandTwist + crIt = _crInv cr IM.! _crInvSel cr + shoulderRot = case cr ^? crStance . carriage of + Just (Walking _ LeftForward) -> rotate 0.1 + Just (Walking _ RightForward) -> rotate $ negate 0.1 + _ -> id strikeMelee = case _crMeleeCooldown cr of Nothing -> False Just x -> x > 5 + pdam = sum $ concatMap (map _dmAmount) pastDams + crad = _crRad cr + pastDams = _crPastDamage $ _crState cr + col' = light . light . light $ light col --drawAwakeLevel -- :: Creature diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 77eda66f5..3c66ed17c 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -144,6 +144,7 @@ data Creature = Creature , _crOldPos :: Point2 , _crVel :: Point2 , _crDir :: Float + , _crMvDir :: Float , _crID :: Int , _crPict :: Creature -> World -> Picture , _crUpdate diff --git a/src/Dodge/Default.hs b/src/Dodge/Default.hs index b5d1a9e79..08cf35594 100644 --- a/src/Dodge/Default.hs +++ b/src/Dodge/Default.hs @@ -95,6 +95,7 @@ defaultCreature = Creature , _crOldPos = (0,0) , _crVel = (0,0) , _crDir = 0 + , _crMvDir = 0 , _crID = 1 , _crPict = \_ _ -> onLayer CrLayer $ circleSolid 10 , _crUpdate = \ _ f cr -> (f , Just cr) diff --git a/src/Dodge/Item/Data.hs b/src/Dodge/Item/Data.hs index f89443f24..f5af13b05 100644 --- a/src/Dodge/Item/Data.hs +++ b/src/Dodge/Item/Data.hs @@ -45,3 +45,5 @@ data AimStance | TwoHand | OneHand | LeaveHolstered + deriving + (Eq,Show,Ord,Enum) diff --git a/src/Dodge/Item/Draw.hs b/src/Dodge/Item/Draw.hs index 3a547a05e..7bedbf900 100644 --- a/src/Dodge/Item/Draw.hs +++ b/src/Dodge/Item/Draw.hs @@ -1,25 +1,34 @@ module Dodge.Item.Draw where import Dodge.Data +import Dodge.Item.Data import Dodge.Picture.Layer import Dodge.Creature.Stance.Data import Picture -{- | -Places an item picture onto a creature when the item is selected. -} + +import qualified Data.IntMap.Strict as IM +{- | Places an item picture onto a creature when the item is selected. -} pictureWeaponOnAim :: Picture -> Creature -> Int -- ^ Position of item in inventory -> Picture pictureWeaponOnAim p cr posInInv - | _crInvSel cr == posInInv && _posture (_crStance cr) == Aiming + | isSelected && _posture (_crStance cr) == Aiming + && isTwisting + = onLayer PtLayer twistWep + | isSelected && _posture (_crStance cr) == Aiming = onLayer PtLayer drawnWep - | _crInvSel cr == posInInv + | isSelected = onLayer PtLayer holsteredWep | otherwise = blank where + isSelected = _crInvSel cr == posInInv drawnWep = uncurry translate (_crRad cr,0) p + twistWep = uncurry translate (0.5 * _crRad cr,negate 0.5 * _crRad cr) p holsteredWep = uncurry translate (_crRad cr,0) (scale 0.1 1 p) + theIt = _crInv cr IM.! posInInv + isTwisting = _itAimStance theIt == TwoHandTwist pictureItem :: Picture diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index abf3ace78..5002f7d44 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -20,6 +20,7 @@ import Dodge.Item.Weapon.ExtraEffect import Dodge.Item.Weapon.UseEffect import Dodge.Item.Weapon.Laser import Dodge.Item.Weapon.Shell +import Dodge.Item.Weapon.Bullet import Dodge.Default.Weapon import Dodge.Item.Weapon.Booster import Dodge.Item.Weapon.Grenade @@ -83,13 +84,6 @@ pistol = defaultGun , _itWorldTrigger = Nothing , _wpAmmo = basicBullet } -basicBullet :: Ammo -basicBullet = BulletAmmo - { _amString = "BULLET" - , _amBulEff = destroyOnImpact bulHitCr bulHitWall' bulHitFF' - , _amBulWth = 2 - , _amBulVel = (30,0) - } useAmmoParams :: Item -> Creature -> World -> World useAmmoParams it = withVelWthHiteff (_amBulVel b) (_amBulWth b) (_amBulEff b) where @@ -105,45 +99,6 @@ autoEffectGun name eff = defaultAutoGun { _itName = name ++ "Gun" , _itUse = \_ -> eff } -autoGun :: Item -autoGun = defaultGun - { _itName = "AUTOGUN" - , _itIdentity = AutoGun - , _wpMaxAmmo = 30 - , _wpLoadedAmmo = 30 - , _wpReloadTime = 80 - , _wpReloadState = 0 - , _itUseRate = 6 - , _itUseTime = 0 - , _itUse = \_ -> charFiringStrat - [('M',autoFireMode) - ,('S',singleFireMode) - ] - , _wpSpread = autogunSpread - , _wpRange = 20 - , _itHammer = HammerUp - , _itFloorPict = onLayer FlItLayer $ color red $ pictures [polygon [(-4,-4),(-4,4),(4,4),(4,-4)]] - , _itAimingSpeed = 0.4 - , _itAimingRange = 1 - , _itZoom = defaultItZoom {_itAimZoomFac = 1.5} - , _itEquipPict = pictureWeaponOnAim $ color red $ polygon $ rectNESW 4 4 (-4) (-4) - , _itEffect = wpRecock - , _itAttachment = Just $ ItCharMode $ Seq.fromList "MS" - , _itScrollUp = incCharMode - , _itScrollDown = decCharMode - , _itInvDisplay = basicWeaponDisplay - , _wpAmmo = basicBullet - } -autoFireMode, singleFireMode, autoGunNonTwistEff :: Creature -> World -> World -autoFireMode = shootWithSound (fromIntegral autoGunSound) - . torqueBefore 0.05 - $ autoGunNonTwistEff -singleFireMode = hammerCheck $ shootWithSound (fromIntegral autoGunSound) autoGunNonTwistEff -autoGunNonTwistEff = withRecoil 40 - . withRandomDir (autogunSpread/2) - . withMuzFlare - . withVelWthHiteff (50,0) 3 - $ destroyOnImpact bulHitCr bulHitWall' bulHitFF' rezGun :: Item rezGun = defaultGun { _itName = "REANIMATOR" @@ -364,11 +319,17 @@ miniGun = defaultAutoGun . withVelWthHiteff (30,0) 2 $ destroyOnImpact bulBounceArmCr' bulHitWall' bulHitFF' , _wpRange = 20 - , _itFloorPict = onLayer FlItLayer $ color red $ polygon $ rectNESW 9 5 (-9) (-5) + , _itFloorPict = onLayer FlItLayer miniGunPict , _itAimingSpeed = 0.4 , _itAimingRange = 1 - , _itEquipPict = pictureWeaponOnAim $ color red $ polygon $ rectNESW 9 5 (-9) (-5) + , _itEquipPict = pictureWeaponOnAim miniGunPict } +miniGunPict :: Picture +miniGunPict = pictures + [ translate 5 0 . color red $ polygon $ rectNESW 9 7 (-9) (-5) + , color red . polygon $ rectNESW 4 12 (-4) (-12) + ] + spreadGun :: Item spreadGun = defaultGun { _itName = "SPREAD" @@ -1023,7 +984,7 @@ spawnGun cr = defaultGun , _wpReloadTime = 80 , _wpReloadState = 0 , _itUseRate = 100 - , _itUse = \_ -> spawnCrNextTo cr + , _itUse = \_ -> hammerCheck $ spawnCrNextTo cr } spawnCrNextTo :: Creature -- ^ Creature to spawn diff --git a/src/Dodge/Item/Weapon/AutoGun.hs b/src/Dodge/Item/Weapon/AutoGun.hs new file mode 100644 index 000000000..fda67fb06 --- /dev/null +++ b/src/Dodge/Item/Weapon/AutoGun.hs @@ -0,0 +1,68 @@ +module Dodge.Item.Weapon.AutoGun + where +import Dodge.Data +import Dodge.Default.Weapon +import Dodge.Default +import Dodge.Item.Attachment +import Dodge.Item.Attachment.Data +import Dodge.Item.Weapon.ExtraEffect +import Dodge.Item.Weapon.InventoryDisplay +import Dodge.Item.Data +import Dodge.Picture.Layer +import Dodge.Item.Draw +import Dodge.Item.Weapon.Bullet +import Dodge.Item.Weapon.TriggerType +import Dodge.SoundLogic.Synonyms +import Dodge.WorldEvent.HitEffect +import Dodge.Particle.Bullet.HitEffect +import Picture +import Geometry + +import qualified Data.Sequence as Seq + +autoGun :: Item +autoGun = defaultAutoGun + { _itName = "AUTOGUN" + , _itIdentity = AutoGun + , _wpMaxAmmo = 30 + , _wpLoadedAmmo = 30 + , _wpReloadTime = 80 + , _wpReloadState = 0 + , _itUseRate = 6 + , _itUseTime = 0 + , _itUse = \_ -> charFiringStrat + [('M',autoFireMode) + ,('S',singleFireMode) + ] + , _wpSpread = autogunSpread + , _wpRange = 20 + , _itHammer = HammerUp + , _itFloorPict = onLayer FlItLayer autoGunPict + , _itAimingSpeed = 0.4 + , _itAimingRange = 1 + , _itZoom = defaultItZoom {_itAimZoomFac = 1.5} + , _itEquipPict = pictureWeaponOnAim autoGunPict + , _itEffect = wpRecock + , _itAttachment = Just $ ItCharMode $ Seq.fromList "MS" + , _itScrollUp = incCharMode + , _itScrollDown = decCharMode + , _itInvDisplay = basicWeaponDisplay + , _wpAmmo = basicBullet + } +autoFireMode, singleFireMode, autoGunNonTwistEff :: Creature -> World -> World +autoFireMode = shootWithSound (fromIntegral autoGunSound) + . torqueBefore 0.05 + $ autoGunNonTwistEff +singleFireMode = hammerCheck $ shootWithSound (fromIntegral autoGunSound) autoGunNonTwistEff +autoGunNonTwistEff = withRecoil 40 + . withRandomDir (autogunSpread/2) + . withMuzFlare + . withVelWthHiteff (50,0) 3 + $ destroyOnImpact bulHitCr bulHitWall' bulHitFF' + +autoGunPict :: Picture +autoGunPict = color red $ polygon $ rectNESW 4 12 (-4) (-12) + +autogunSpread :: Float +autogunSpread = 0.07 + diff --git a/src/Dodge/Item/Weapon/Bullet.hs b/src/Dodge/Item/Weapon/Bullet.hs new file mode 100644 index 000000000..d449eef78 --- /dev/null +++ b/src/Dodge/Item/Weapon/Bullet.hs @@ -0,0 +1,12 @@ +module Dodge.Item.Weapon.Bullet + where +import Dodge.Data +import Dodge.WorldEvent.HitEffect +import Dodge.Particle.Bullet.HitEffect +basicBullet :: Ammo +basicBullet = BulletAmmo + { _amString = "BULLET" + , _amBulEff = destroyOnImpact bulHitCr bulHitWall' bulHitFF' + , _amBulWth = 2 + , _amBulVel = (30,0) + } diff --git a/src/Dodge/Room.hs b/src/Dodge/Room.hs index c47bebab1..6849087c0 100644 --- a/src/Dodge/Room.hs +++ b/src/Dodge/Room.hs @@ -7,6 +7,7 @@ module Dodge.Room ) where import Dodge.Data import Dodge.Item.Weapon +import Dodge.Item.Weapon.AutoGun import Dodge.Item.Weapon.Launcher import Dodge.Creature --import Dodge.Creature.Inanimate diff --git a/src/Picture/Preload.hs b/src/Picture/Preload.hs index 73cd0ba2b..ed1cde0d1 100644 --- a/src/Picture/Preload.hs +++ b/src/Picture/Preload.hs @@ -78,7 +78,8 @@ preloadRender = do _ <- F.foldM (pokeShader grayscaleShad) [()] -- fix fullscreen vertex positions now -- background shader bgShad <- makeShader "background" [vert,geom,frag] [(0,4),(1,2)] Points pokeBGStrat - >>= addTexture "data/texture/smudgedDirt.png" + >>= addTexture "data/texture/marbleSlabs.png" +-- >>= addTexture "data/texture/smudgedDirt.png" -- blank wallShader wlBlank <- makeShader "wall/blank" [vert,geom,frag] [(0,4),(1,4)] Points pokeWPColStrat -- >>= addTexture "data/texture/grayscaleDirt.png"