game_okey.hrl 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. %% data structures send over the wire
  2. -record('OkeyPiece', {
  3. color = -1 :: integer(), %% 1..4
  4. value = -1 :: integer() %% 1..13
  5. %% color set to 1 and value set to zero mean that this is false okey
  6. }).
  7. -define(FALSE_OKEY, #'OkeyPiece'{value = 0, color = 1}).
  8. -record('OkeyScoringDetail', {
  9. reason = [] :: list(atom()),
  10. score = 0 :: integer()
  11. }).
  12. -record('OkeyGameR', {
  13. player_id, %%
  14. disconnected = false :: boolean(),
  15. winner = <<"none">> :: binary(), %% similar to skill_delta
  16. good_shot :: boolean(),
  17. skill, %% skill level the start of the game
  18. skill_delta, %% 0 for defeat, 0.25 for draw and 1 for win
  19. score = 0, %% total accumulated score for this set
  20. score_delta = 0, %% delta of okey game points
  21. breakdown = [] :: list(#'OkeyScoringDetail'{}) %% breakdown of okey game points
  22. }).
  23. -record('OkeySeriesResult', {
  24. player_id :: 'PlayerId'(),
  25. place :: integer(),
  26. winner = <<"none">> :: binary(),
  27. score :: integer()
  28. }).
  29. -record('OkeyGameResults', {
  30. game_id :: integer(),
  31. start_datetime = 0 :: integer(),
  32. end_datetime = 0 :: integer(),
  33. results = [] :: list(#'OkeyGameR'{}),
  34. series_results = [] :: list(#'OkeySeriesResult'{})
  35. }).
  36. -record('PlayerOkeyStats', {
  37. playerId, %% : int
  38. playerName, %% : String;
  39. level, %% : int; Number
  40. levelName, %% : String;
  41. badges, %% : Array; Array of int between [1; 5],
  42. %%from 1 to 5 items in array
  43. %%Okey Game Stats
  44. skill, %% : int;
  45. score, %% : int;
  46. totalWins, %% : int;
  47. totalLose, %% : int;
  48. totalDisconnects, %% : int;
  49. overalSuccessRatio, %% : Number;
  50. averagePlayDuration, %% : Number;
  51. %%Okey Game Detailed Stats
  52. number8Tashes, %% : int;
  53. numberColor, %% : int;
  54. numberColorOkey, %% : int;
  55. numberColorOdd, %% : int;
  56. numberColorOddOkey, %% : int;
  57. numberOkey, %% : int;
  58. numberOdd %% : int;
  59. }).
  60. %% incoming messages, wrapped in #kaka_game_action
  61. -record(okey_ready, {}).
  62. -record(okey_has_gosterge, {}).
  63. -record(okey_discard, {
  64. tile :: #'OkeyPiece'{}
  65. }).
  66. -record(okey_reveal, {
  67. discarded :: #'OkeyPiece'{},
  68. hand :: list(#'OkeyPiece'{} | null)
  69. }).
  70. -record(okey_surrender, {
  71. }).
  72. -record(okey_take, {
  73. pile :: integer() %% 0 or 1
  74. }).
  75. -record(okey_challenge, {
  76. challenge = false :: boolean()
  77. }).
  78. -record(okey_i_saw_okey, {}).
  79. -record(okey_i_have_8_tashes, {}).
  80. -record('OkeyTimeouts', {
  81. speed :: atom(), %% [slow, normal, fast, blitz]
  82. turn_timeout :: integer(), %% timeout value for player turn
  83. challenge_timeout :: integer(), %% timeout value for challenge
  84. ready_timeout :: integer(), %% timeout value for ready msg
  85. rematch_timeout :: integer() %% timeout value for general api #rematch{} msg
  86. }).
  87. -type tournament() :: standalone | elimination | pointing | lucky.
  88. %% outgoing messages; wrapped into #'KakaMessage'
  89. -record(okey_game_info, {
  90. players :: list(#'PlayerInfo'{}),
  91. timeouts :: #'OkeyTimeouts'{}, %% timeout value for player turn
  92. game_type :: atom(),
  93. finish_with_gosterge :: boolean(),
  94. pairs = null :: null | list(list('PlayerId'())),
  95. table_name :: binary(),
  96. sets :: integer(), %% number of sets defined for this table
  97. set_no :: integer(), %% number of current set
  98. rounds :: integer(), %% number of rounds in this set
  99. mul_factor :: pos_integer(),
  100. slang_flag :: boolean(),
  101. observer_flag :: boolean(),
  102. pause_enabled = true :: boolean(),
  103. social_actions_enabled = true :: boolean(),
  104. tournament_type = standalone :: tournament(),
  105. series_confirmation_mode = yes_exit :: yes_exit | no_exit | no
  106. }).
  107. -record(okey_player_ready, {
  108. player :: 'PlayerId'()
  109. }).
  110. -record(okey_player_has_gosterge, {
  111. player :: 'PlayerId'()
  112. }).
  113. -record(okey_game_started, {
  114. tiles :: list(#'OkeyPiece'{}),
  115. gosterge :: #'OkeyPiece'{},
  116. pile_height :: integer(),
  117. current_round :: integer,
  118. current_set :: integer,
  119. game_type = null :: atom(), %% FIXME Deprecated
  120. game_speed = null :: atom(), %% FIXME Deprecated
  121. game_submode = null :: atom(), %% FIXME Deprecated
  122. chanak_points :: integer(),
  123. round_timeout = null :: null | integer(),
  124. set_timeout = null :: null | integer()
  125. }).
  126. -record(okey_game_player_state, {
  127. whos_move :: 'PlayerId'(),
  128. game_state :: atom(),
  129. piles :: list(#'OkeyPiece'{} | null),
  130. %% piles are in counterclock-wise order,
  131. %% with addressie pile being first one
  132. %% (the pile he is taking tiles from)
  133. tiles :: list(#'OkeyPiece'{}),
  134. gosterge :: #'OkeyPiece'{},
  135. pile_height :: integer(),
  136. current_round :: integer(),
  137. game_sub_type = null :: atom(), %% FIXME Deprecated
  138. next_turn_in :: integer() | atom(),
  139. %% number of milliseconds until next turn or 'infinity'
  140. paused = false :: boolean(),
  141. chanak_points = 0 :: integer(),
  142. round_timeout = null :: null | integer(),
  143. set_timeout = null :: null | integer()
  144. }).
  145. -record(okey_next_turn, {
  146. player :: 'PlayerId'(),
  147. can_challenge = false :: boolean()
  148. }).
  149. -record(okey_disable_okey, {
  150. player :: 'PlayerId'(),
  151. who_disabled :: list('PlayerId'())
  152. }).
  153. -record(okey_tile_taken, {
  154. player :: 'PlayerId'(),
  155. pile :: integer(),
  156. revealed :: #'OkeyPiece'{},
  157. pile_height :: integer()
  158. }).
  159. -record(okey_turn_timeout, {
  160. tile_taken = null :: #'OkeyPiece'{} | null,
  161. tile_discarded :: #'OkeyPiece'{}
  162. }).
  163. -record(okey_tile_discarded, {
  164. player :: 'PlayerId'(),
  165. tile :: #'OkeyPiece'{},
  166. timeouted = false :: boolean
  167. }).
  168. -record(okey_revealed, {
  169. player :: 'PlayerId'(),
  170. discarded :: #'OkeyPiece'{},
  171. hand :: list(#'OkeyPiece'{} | null)
  172. }).
  173. -record(okey_round_ended, {
  174. good_shot :: boolean(),
  175. reason :: atom(),
  176. results :: #'OkeyGameResults'{},
  177. next_action :: atom() | binary()
  178. }).
  179. -record(okey_series_ended, {
  180. standings :: list(#'OkeySeriesResult'{}),
  181. dialog_type = yes_no :: yes_no | ok
  182. }).
  183. -record(okey_turn_record, {
  184. player_id :: 'PlayerId'(),
  185. place :: integer(),
  186. score :: integer(),
  187. status :: atom() | binary() %% active | eliminated
  188. }).
  189. -record(okey_turn_result, {
  190. turn_num :: integer(),
  191. records :: list(#okey_turn_record{})
  192. }).
  193. -record(okey_player_has_8_tashes, {
  194. player :: 'PlayerId'(),
  195. value :: integer() %% 1 - 13
  196. }).
  197. -record(okey_playing_tables, {
  198. num :: integer()
  199. }).
  200. %%%%%
  201. %%%%% Debug
  202. %%%%%
  203. -record(okey_debug, {}).
  204. -record(okey_player, {
  205. pid :: pid(),
  206. player_id :: 'PlayerId'(),
  207. player_info :: #'PlayerInfo'{},
  208. hand :: list(#'OkeyPiece'{}),
  209. pile = [] :: list(#'OkeyPiece'{}), %% a pile player draws from; aka pile number 1
  210. skill :: integer(),
  211. can_show_gosterge = true :: boolean()
  212. }).
  213. -record('OkeySetState', {
  214. round_cur,
  215. round_max,
  216. set_cur,
  217. set_max
  218. }).