game_okey.hrl 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. player :: 'PlayerId'(),
  161. tile_taken = null :: #'OkeyPiece'{} | null,
  162. tile_discarded :: #'OkeyPiece'{}
  163. }).
  164. -record(okey_tile_discarded, {
  165. player :: 'PlayerId'(),
  166. tile :: #'OkeyPiece'{},
  167. timeouted = false :: boolean
  168. }).
  169. -record(okey_revealed, {
  170. player :: 'PlayerId'(),
  171. discarded :: #'OkeyPiece'{},
  172. hand :: list(#'OkeyPiece'{} | null)
  173. }).
  174. -record(okey_round_ended, {
  175. % good_shot :: boolean(),
  176. round,
  177. reason :: atom(),
  178. results :: #'OkeyGameResults'{},
  179. next_action :: atom() | binary()
  180. }).
  181. -record(okey_series_ended, {
  182. standings :: list(#'OkeySeriesResult'{}),
  183. dialog_type = yes_no :: yes_no | ok
  184. }).
  185. -record(okey_turn_record, {
  186. player_id :: 'PlayerId'(),
  187. place :: integer(),
  188. score :: integer(),
  189. status :: atom() | binary() %% active | eliminated
  190. }).
  191. -record(okey_turn_result, {
  192. turn_num :: integer(),
  193. records :: list(#okey_turn_record{})
  194. }).
  195. -record(okey_player_has_8_tashes, {
  196. player :: 'PlayerId'(),
  197. value :: integer() %% 1 - 13
  198. }).
  199. -record(okey_playing_tables, {
  200. num :: integer()
  201. }).
  202. %%%%%
  203. %%%%% Debug
  204. %%%%%
  205. -record(okey_debug, {}).
  206. -record(okey_player, {
  207. pid :: pid(),
  208. player_id :: 'PlayerId'(),
  209. player_info :: #'PlayerInfo'{},
  210. hand :: list(#'OkeyPiece'{}),
  211. pile = [] :: list(#'OkeyPiece'{}), %% a pile player draws from; aka pile number 1
  212. skill :: integer(),
  213. can_show_gosterge = true :: boolean()
  214. }).
  215. -record('OkeySetState', {
  216. round_cur,
  217. round_max,
  218. set_cur,
  219. set_max
  220. }).