Advertisement
Xlonix

game.go

Dec 2nd, 2017
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.22 KB | None | 0 0
  1. //This file deals with concurency, sets up games, and manages websockets in games
  2.  
  3. package main
  4.  
  5. import(
  6.     "fmt"
  7.     "time"
  8.     "github.com/gorilla/websocket"
  9. )
  10.  
  11. //Groups websockets into games when they send the match signal
  12. func grouper(c chan *websocket.Conn, q chan int16){
  13.     fmt.Println("Running")
  14.     mat := Match{make([]*websocket.Conn, 3), make([]*websocket.Conn, 3)}
  15.     var user *websocket.Conn
  16.     var i int16 = -1
  17.     var count int = 0
  18.     for ;i < 0; {
  19.         select{
  20.             case user = <-c:
  21.                 fmt.Println("Got one!")
  22.                 user.WriteJSON(DataJSON{"matched", ""})
  23.                 if count < 3 {
  24.                     mat.ac[count] = user
  25.                 }else if count < 6 {
  26.                     mat.dc[count-3] = user
  27.                 }
  28.                 count++
  29.                 if count == 6 {
  30.                     fmt.Println("Setting up...")
  31.                     go setupGame(mat)
  32.                     count = 0
  33.                 }
  34.             break
  35.             case i = <-q:
  36.             break
  37.         }
  38.     }
  39.     if count != 0 {
  40.         for k := 0; k < count; k++ {
  41.             if k < 3 {
  42.                 mat.ac[k].Close()
  43.             } else {
  44.                 mat.dc[k-3].Close()
  45.             }
  46.         }
  47.     }
  48. }
  49.  
  50. //Creates the board and sets up the websockets on it
  51. func setupGame(mat Match){
  52.     board := newBoard(10)
  53.     k := uint8(0)
  54.     for k = 0; k < 3; k++ {
  55.         mat.ac[k].WriteJSON(DataJSON{"gen", ""})
  56.         mat.dc[k].WriteJSON(DataJSON{"gen", ""})
  57.     }
  58.     fmt.Println("Gen")
  59.     board.genPaths()
  60.     for k = 0; k < 3; k++ {
  61.         mat.ac[k].WriteJSON(DataJSON{"final", ""})
  62.         mat.dc[k].WriteJSON(DataJSON{"final", ""})
  63.     }
  64.     fmt.Println("Final")
  65.     msgs := make(chan Message)
  66.     for k = 0; k < 3; k++ {
  67.         go worker(mat.ac[k], board, board.addPlayer(mat.ac[k], true), msgs)
  68.         go worker(mat.dc[k], board, board.addPlayer(mat.dc[k], false), msgs)
  69.     }
  70.     reporter(board, msgs)
  71. }
  72.  
  73. //Runs the socket and makes sure that the commands sent are valid
  74. func worker(socket *websocket.Conn, gb *GameBoard, id int8, msgch chan Message){
  75.     msg := DataJSON{"", ""}
  76.     if id < 0 {
  77.         go handleCritical(msgch, gb)
  78.         err := socket.WriteJSON(DataJSON{"err", "err:invalid_id"})
  79.         if err != nil {
  80.             socket.Close()
  81.             return
  82.         }
  83.         go lobby(socket)
  84.         return
  85.     }else{
  86.         err := socket.WriteJSON(Message{id, "success"})
  87.         if err != nil {
  88.             socket.Close()
  89.             go handleError(msgch, gb, id)
  90.             return
  91.         }
  92.     }
  93.     fmt.Println("Grouped!")
  94.     for ;gb.open; {
  95.         err := socket.ReadJSON(&msg)
  96.         if err != nil {
  97.             socket.Close()
  98.             go handleError(msgch, gb, id)
  99.             return
  100.         }
  101.         if gb.checkMove(Message{id, msg.Data}) {
  102.             for i := true;gb.open && i; {
  103.                 select {
  104.                     case msgch <- Message{id, msg.Data}:
  105.                     i = false
  106.                     case <-time.After(time.Millisecond * 200):
  107.                 }
  108.             }
  109.         }else if msg.Data == "lobby" {
  110.             go handleError(msgch, gb, id)
  111.             go lobby(socket)
  112.             return
  113.         }
  114.     }
  115. }
  116.  
  117. //Handles an error if something goes wrong in the reporter when trying to send messages
  118. func handleError(msgch chan Message, gb *GameBoard, id int8) {
  119.     fmt.Println("Sending error")
  120.     if id < 3 {
  121.         gb.pla[id].closed = true
  122.     }else{
  123.         gb.pld[id-3].closed = true
  124.     }
  125.     defer fmt.Println("Stop err send")
  126.     for ;gb.open; {
  127.         select {
  128.             case msgch <- Message{id, "quit"}:
  129.             return
  130.             case <-time.After(time.Millisecond * 200):
  131.         }
  132.     }
  133. }
  134.  
  135. //Handle a critical error
  136. func handleCritical(msgch chan Message, gb *GameBoard){
  137.     fmt.Println("Sending crit")
  138.     defer fmt.Println("Stop crit send")
  139.     for ;gb.open; {
  140.         select {
  141.             case msgch <- Message{-1, "critical"}:
  142.             return
  143.             case <-time.After(time.Millisecond * 200):
  144.         }
  145.     }
  146. }
  147.  
  148. //Reports what each websocket is doing to the others
  149. func reporter(gb *GameBoard, msgch chan Message){
  150.     fmt.Println("Reporting!")
  151.     var msg Message
  152.     var i int8 = 0
  153.     for ;i >= 0; {
  154.         msg = <-msgch
  155.         for i = 0; i < 3; i++ {
  156.             if gb.pla[i].closed == false {
  157.                 err := gb.pla[i].socket.WriteJSON(msg)
  158.                 if err != nil {
  159.                     gb.pla[i].socket.Close()
  160.                     go handleError(msgch, gb, i)
  161.                 }
  162.             }
  163.             if gb.pld[i].closed == false {
  164.                 err := gb.pld[i].socket.WriteJSON(msg)
  165.                 if err != nil {
  166.                     gb.pld[i].socket.Close()
  167.                     go handleError(msgch, gb, i+3)
  168.                 }
  169.             }  
  170.         }
  171.         if msg.T == -1 || msg.Data == "critical"{
  172.             fmt.Println("Critical error")
  173.             i = -1
  174.         }
  175.         for j := 0; j < 3; j++ {
  176.             if gb.pla[j].closed == false || gb.pld[j].closed == false {
  177.                 break
  178.             }else if j == 2 {
  179.                 fmt.Println("Group over")
  180.                 i = -1
  181.             }
  182.         }
  183.     }
  184.     fmt.Println("Closing msgch")
  185.     gb.open = false
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement