Guest User

Untitled

a guest
Jan 18th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.38 KB | None | 0 0
  1. update : Msg -> Model -> ( Model, Cmd Msg )
  2. update msg model =
  3. case msg of
  4. NoOp ->
  5. ( model, Cmd.none )
  6.  
  7. Mdl action_ ->
  8. Material.update Mdl action_ model
  9.  
  10. SelectTab idx ->
  11. model
  12. |> pure
  13.  
  14. TooltipMsg msg_ ->
  15. let
  16. updated =
  17. Tuple.first <| Tooltip.update msg_ model.tooltip_
  18. in
  19. ( { model | tooltip_ = updated }, Cmd.none )
  20.  
  21. ShuffleList ->
  22. { model | history = [] }
  23. |> effect
  24. (Random.generate SetGame
  25. (Random.pair (shuffle (createDominoes 6))
  26. (selectWithDefault One [ One, Two, Three, Four ])
  27. )
  28. )
  29. |> updateBoardMsg NoBoard
  30. |> updateBlockedMsg Reset
  31. |> updateSelectionMsg Nothing
  32. |> updateStatusMsg ""
  33. |> updateHistoryToggleMsg False
  34.  
  35. SetGame ( newSet, name ) ->
  36. case initializePlayers name newSet of
  37. Nothing ->
  38. ( { model | game = ErrorGame }, Cmd.none )
  39.  
  40. Maybe.Just players ->
  41. { model | game = ActiveGame, players = players } ! [ cmd RunGame ]
  42.  
  43. RealPlay index domino boardside ->
  44. case model.board of
  45. Nothing ->
  46. let
  47. current_player =
  48. Zipper.current model.players
  49.  
  50. newHand =
  51. removeDominoFromHand index current_player.hand
  52.  
  53. updated_player =
  54. updatePlayerHand newHand current_player
  55. in
  56. model
  57. |> effect (cmd ResolveTurn)
  58. |> updatePlayerMsg updated_player
  59. |> updateBlockedMsg Reset
  60. |> updateBoardMsg (NewDom domino boardside)
  61. |> updateHistoryMsg ( Four, domino )
  62.  
  63. Maybe.Just board ->
  64. case calculateHumanMatch domino boardside board of
  65. Maybe.Just ( newDom, side ) ->
  66. let
  67. current_player =
  68. Zipper.current model.players
  69.  
  70. newHand =
  71. removeDominoFromHand index current_player.hand
  72.  
  73. updated_player =
  74. updatePlayerHand newHand current_player
  75. in
  76. model
  77. |> effect (cmd ResolveTurn)
  78. |> updatePlayerMsg updated_player
  79. |> updateBlockedMsg Reset
  80. |> updateBoardMsg (NewDom newDom side)
  81. |> updateHistoryMsg ( Four, newDom )
  82.  
  83. Nothing ->
  84. model
  85. |> pure
  86. |> updateStatusMsg "You can't play that there. Try Again :} "
  87.  
  88. PlayerResponse response ->
  89. case response of
  90. Pass ->
  91. model
  92. ! [ cmd ResolveTurn ]
  93. |> updateBlockedMsg Increment
  94.  
  95. Play index domino ->
  96. model
  97. |> pure
  98. |> updateSelectionMsg (Maybe.Just ( index, domino ))
  99. |> updateButtonMsg True
  100. |> updateStatusMsg "Now pick a side!"
  101.  
  102. PopUpResponse boardSide ->
  103. case model.selection of
  104. Nothing ->
  105. ( model, Cmd.none )
  106.  
  107. Maybe.Just ( index, domino ) ->
  108. model
  109. |> effect (cmd <| RealPlay index domino boardSide)
  110. |> updateSelectionMsg Nothing
  111. |> updateButtonMsg False
  112.  
  113. RunGame ->
  114. case .name (Zipper.current model.players) of
  115. Four ->
  116. model
  117. |> pure
  118. |> updateStatusMsg "Your turn!"
  119.  
  120. _ ->
  121. model |> effect (cmd RobotResponse)
  122.  
  123. RobotResponse ->
  124. case model.board of
  125. Nothing ->
  126. let
  127. newhand =
  128. Zipper.current model.players
  129. |> .hand
  130. |> removeDominoFromHand 0
  131.  
  132. current_player =
  133. Zipper.current model.players
  134.  
  135. domino =
  136. getDominoForInitial current_player.hand
  137.  
  138. updated_player =
  139. updatePlayerHand newhand current_player
  140. in
  141. case domino of
  142. Nothing ->
  143. model
  144. |> pure
  145.  
  146. Maybe.Just domino ->
  147. model
  148. |> effect (cmd ResolveTurn)
  149. |> updateBoardMsg (NewDom domino Left)
  150. |> updatePlayerMsg updated_player
  151. |> updateBlockedMsg Reset
  152. |> updateHistoryMsg ( current_player.name, domino )
  153.  
  154. Maybe.Just board ->
  155. let
  156. current_player =
  157. Zipper.current model.players
  158. in
  159. case calculateMatch current_player.hand model.board of
  160. Maybe.Just ( newDom, newHand, side ) ->
  161. let
  162. updated_player =
  163. updatePlayerHand newHand current_player
  164. in
  165. model
  166. |> effect (cmd ResolveTurn)
  167. |> updatePlayerMsg updated_player
  168. |> updateBlockedMsg Reset
  169. |> updateBoardMsg (NewDom newDom side)
  170. |> updateHistoryMsg ( current_player.name, newDom )
  171.  
  172. Nothing ->
  173. model
  174. |> effect (cmd ResolveTurn)
  175. |> updateBlockedMsg Increment
  176.  
  177. ResolveTurn ->
  178. case List.length <| .hand <| Zipper.current model.players of
  179. 0 ->
  180. ( model, Cmd.none )
  181. |> updateWinnerMsg EmptyHand
  182. |> updateBlockedMsg Reset
  183. |> updateBoardMsg NoBoard
  184.  
  185. _ ->
  186. case model.blocked of
  187. 4 ->
  188. ( model, Cmd.none )
  189. |> updateWinnerMsg Blocked
  190. |> updateBlockedMsg Reset
  191. |> updateBoardMsg NoBoard
  192.  
  193. _ ->
  194. model
  195. ! [ delay waitTime RunGame ]
  196. |> updateActiveMsg
  197. |> updateStatusMsg ""
  198. |> updateButtonMsg False
  199.  
  200. ReturnToHome ->
  201. model
  202. |> pure
  203. |> updateGameMsg NoGame
  204. |> updateBlockedMsg Reset
  205. |> updateStatusMsg ""
  206. |> updateBoardMsg NoBoard
  207.  
  208. ToggleTooltips ->
  209. let
  210. toggle =
  211. if model.tooltip == True then
  212. False
  213. else
  214. True
  215. in
  216. ( { model | tooltip = toggle }, Cmd.none )
  217.  
  218. ToggleHistory ->
  219. let
  220. historytoggle =
  221. if model.showhistory == True then
  222. False
  223. else
  224. True
  225. in
  226. model
  227. |> pure
  228. |> updateHistoryToggleMsg historytoggle
  229.  
  230.  
  231. updateHistoryToggleMsg : Bool -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  232. updateHistoryToggleMsg bool ( model, cmsg ) =
  233. ( { model | showhistory = bool }, cmsg )
  234.  
  235.  
  236. updateHistoryMsg : ( PlayerName, Domino ) -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  237. updateHistoryMsg entry ( model, cmsg ) =
  238. let
  239. newhistory =
  240. List.append model.history [ entry ]
  241. in
  242. ( { model | history = newhistory }, cmsg )
  243.  
  244.  
  245. updateGameMsg : Game -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  246. updateGameMsg newgamestate ( model, cmsg ) =
  247. ( { model | game = newgamestate }, cmsg )
  248.  
  249.  
  250. updateSelectionMsg : Maybe ( Int, Domino ) -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  251. updateSelectionMsg selection ( model, cmsg ) =
  252. ( { model | selection = selection }, cmsg )
  253.  
  254.  
  255. updateButtonMsg : Bool -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  256. updateButtonMsg showy ( model, cmsg ) =
  257. ( { model | buttonToggle = showy }, cmsg )
  258.  
  259.  
  260. updateStatusMsg : String -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  261. updateStatusMsg message ( model, cmsg ) =
  262. ( { model | statusupdate = message }, cmsg )
  263.  
  264.  
  265. updateWinnerMsg : WinMessage -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  266. updateWinnerMsg message ( model, cmsg ) =
  267. case message of
  268. Blocked ->
  269. let
  270. ( name, score ) =
  271. findPlayerWithLowest model.players
  272.  
  273. message =
  274. "His final score was just " ++ toString score ++ "!"
  275. in
  276. ( { model | game = WonGame name message }, cmsg )
  277.  
  278. EmptyHand ->
  279. let
  280. winMessage : Domino -> String
  281. winMessage domino =
  282. "The winning domino was " ++ dominoToString domino
  283.  
  284. lastdom : Maybe String
  285. lastdom =
  286. model.history
  287. |> List.reverse
  288. |> List.head
  289. |> Maybe.map (\( _, domino ) -> winMessage domino)
  290.  
  291. wonresult : String
  292. wonresult =
  293. Maybe.withDefault "" lastdom
  294.  
  295. lastPlayer =
  296. .name (Zipper.current model.players)
  297. in
  298. ( { model | game = WonGame lastPlayer wonresult }, cmsg )
  299.  
  300.  
  301. updateBoardMsg : BoardMessage -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  302. updateBoardMsg message ( model, cmsg ) =
  303. case message of
  304. NoBoard ->
  305. ( { model | board = Nothing }, cmsg )
  306.  
  307. NewDom domino side ->
  308. ( { model | board = Maybe.Just (updateBoard domino side model.board) }, cmsg )
  309.  
  310.  
  311. updateBlockedMsg : BlockedMessage -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  312. updateBlockedMsg bm ( model, cmsg ) =
  313. case bm of
  314. Reset ->
  315. ( { model | blocked = 0 }, cmsg )
  316.  
  317. Increment ->
  318. ( { model | blocked = model.blocked + 1 }, cmsg )
  319.  
  320.  
  321. updateActiveMsg : ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  322. updateActiveMsg ( model, cmsg ) =
  323. ( { model | players = nextPlayer model.players }, cmsg )
  324.  
  325.  
  326. updatePlayerMsg : Player -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
  327. updatePlayerMsg player ( model, cmsg ) =
  328. ( { model | players = updatePlayers player model.players }, cmsg )
Add Comment
Please, Sign In to add comment