Browse Source

deny wrong reveals

Maxim Sokhatsky 11 years ago
parent
commit
98b0aa3e75

+ 1 - 0
apps/server/include/game_okey.hrl

@@ -227,6 +227,7 @@
 %%%%%
 -record(okey_debug, {}).
 
+-record(okey_deny_wrong_reveal, {}).
 
 -record(okey_player, {
           pid                      :: pid(),

+ 1 - 0
apps/server/src/lib/known_records.erl

@@ -39,6 +39,7 @@ fields(okey_has_gosterge) ->       record_info(fields, okey_has_gosterge);
 fields(okey_discard) ->            record_info(fields, okey_discard);
 fields(okey_reveal) ->             record_info(fields, okey_reveal);
 fields(okey_surrender) ->          record_info(fields, okey_surrender);
+fields(okey_deny_wrong_reveal) ->  record_info(fields, okey_deny_wrong_reveal);
 fields(okey_take) ->               record_info(fields, okey_take);
 fields(okey_i_saw_okey) ->         record_info(fields, okey_i_saw_okey);
 fields(okey_i_have_8_tashes) ->    record_info(fields, okey_i_have_8_tashes);

+ 16 - 5
apps/server/src/okey/okey_desk.erl

@@ -351,11 +351,14 @@ handle_player_action(PlayerId, take_from_table, ?STATE_TAKE,
     end;
 
 
-handle_player_action(PlayerId, {discard, Tash}, ?STATE_DISCARD,
+handle_player_action(PlayerId, {discard, Tash}, StateName,
                      #state{cur_player = CurPlayerId,
                             players = Players,
-                            deck = Deck} = StateData) ->
-    if PlayerId == CurPlayerId ->
+                            deck = Deck} = StateData) when
+    StateName == ?STATE_DISCARD ->
+
+    case {PlayerId,StateName} of
+        {CurPlayerId,?STATE_DISCARD} ->
            case discard_tash(Tash, PlayerId, Players) of
                error ->
                    gas:info(?MODULE,"OKEY_NG_DESK Discard error. SeatNum: ~p. Tash: ~p", [PlayerId, Tash]),
@@ -374,14 +377,22 @@ handle_player_action(PlayerId, {discard, Tash}, ?STATE_DISCARD,
                             StateData#state{players = NewPlayers, cur_player = NextPlayerId}}
                    end
             end;
-       true ->
+       {_,?STATE_DISCARD} ->
            {error, not_your_order}
     end;
 
-handle_player_action(PlayerId, {reveal, Tash, TashPlaces}, ?STATE_DISCARD,
+handle_player_action(PlayerId, wrong_reveal, StateName, #state{cur_player = CurPlayerId} = State) ->
+    case PlayerId == CurPlayerId of
+        true -> {ok, [{wrong_reveal,PlayerId}], StateName, State};
+        false -> {error, not_your_order} end;
+
+handle_player_action(PlayerId, {reveal, Tash, TashPlaces}, StateName = ?STATE_DISCARD,
                      #state{cur_player = CurPlayerId,
                             players = Players
                            } = StateData) ->
+    wf:info(?MODULE,"DESK PLAYER ACTION REVEAL STATE ~p",[StateName]),
+
+
     if PlayerId == CurPlayerId ->
            case discard_tash(Tash, PlayerId, Players) of
                error ->

+ 25 - 3
apps/server/src/okey/okey_table.erl

@@ -581,7 +581,15 @@ do_action(SeatNum, #okey_reveal{discarded = ExtDiscarded, hand = ExtHand}, From,
     Hand = [[if ExtTash == null -> null;
                 true -> ext_to_tash(ExtTash)
              end || ExtTash <- Row] || Row <- ExtHand],
-    do_game_action(SeatNum, {reveal, Discarded, Hand}, From, StateName, StateData);
+
+    DeskState = StateData#okey_state.desk_state,
+    Gosterme = DeskState#desk_state.gosterge,
+    {Revealed,_,_} = ?SCORING:check_reveal(Hand,Gosterme),
+    wf:info(?MODULE,"REVEAL STATE DATA ~p",[StateData]),
+    case Revealed of
+        true -> do_game_action(SeatNum, {reveal, Discarded, Hand}, From, StateName, StateData);
+        false -> do_game_action(SeatNum, wrong_reveal, From, StateName, StateData)
+    end;
 
 do_action(_SeatNum, #okey_reveal{}, _From, StateName, StateData) ->
     {reply, {error, message_not_valid_for_a_current_state}, StateName, StateData};
@@ -629,7 +637,9 @@ do_timeout_moves(#okey_state{desk_rule_pid = Desk, desk_state = DeskState} = Sta
                 state = DeskStateName} = DeskState,
     case DeskStateName of
         state_take ->
-            {ok, Events1} = desk_player_action(Desk, CurSeatNum, take_from_table),
+            Events1 = case desk_player_action(Desk, CurSeatNum, take_from_table) of
+                {ok,E} -> E;
+                _ -> [] end,
             [Tash] = [Tash || {taked_from_table, S, Tash} <- Events1, S==CurSeatNum],
             {ok, Events2} = desk_player_action(Desk, CurSeatNum, {discard, Tash}),
             Events2_1 = [case E of
@@ -641,7 +651,10 @@ do_timeout_moves(#okey_state{desk_rule_pid = Desk, desk_state = DeskState} = Sta
             process_game_events(Events, StateData);
         state_discard ->
             {_, [Tash | _]} = lists:keyfind(CurSeatNum, 1, Hands),
-            {ok, Events1} = desk_player_action(Desk, CurSeatNum, {discard, Tash}),
+            Res = desk_player_action(Desk, CurSeatNum, {discard, Tash}),
+            Events1 = case Res of
+                {ok,E} -> E;
+                _ -> [] end,
             Events1_1 = [case E of
                              {tash_discarded, SeatNum, Tash} ->
                                  {tash_discarded_timeout, SeatNum, Tash};
@@ -674,6 +687,7 @@ do_game_action(SeatNum, GameAction, From, StateName,
             gen_fsm:reply(From, Response),
             process_game_events(Events, StateData);
         {error, Reason} ->
+            wf:info(?MODULE,"do game action error: ~p",[{Reason,GameAction}]),
             ExtError = desk_error_to_ext(Reason),
             {reply, ExtError, StateName, StateData}
     end.
@@ -847,7 +861,13 @@ handle_desk_events([Event | Events], DeskState, Players, Relay, #okey_state{} =
             no_winner_finish ->
                 DeskState#desk_state{state = state_finished,
                                      finish_reason = tashes_out};
+            {wrong_reveal,SeatNum} ->
+                #player{id = PlayerId, user_id = UserId} = get_player_by_seat_num(SeatNum, Players),
+                Msg = create_deny_wrong_reveal(),
+                send_to_client_ge(Relay, PlayerId, Msg, StateData),
+                DeskState;
             {reveal, SeatNum, RevealedTashes, DiscardedTash} ->
+                #player{id = PlayerId, user_id = UserId} = get_player_by_seat_num(SeatNum, Players),
                 Msg = create_okey_revealed(SeatNum, DiscardedTash, RevealedTashes, Players),
                 relay_publish_ge(Relay, Msg, StateData),
                 DeskState#desk_state{state = state_finished,
@@ -860,6 +880,8 @@ handle_desk_events([Event | Events], DeskState, Players, Relay, #okey_state{} =
         end,
     handle_desk_events(Events, NewDeskState, Players, Relay, StateData).
 
+create_deny_wrong_reveal() -> #okey_deny_wrong_reveal{}.
+
 %%===================================================================
 init_scoring(GameType, PlayersInfo, Rounds) ->
     SeatsInfo = [{SeatNum, Points} || {_PlayerId, _UserInfo, SeatNum, Points} <- PlayersInfo],

+ 5 - 0
apps/web/priv/static/app/js/bootloader.js

@@ -334,6 +334,11 @@ function hideOverlay()
     if (scope.ended) scope.deck.fill([]);
 }
 
+function denyWrongReveal() {
+    $overlay.show();
+    $("#Overlay-Text").text("Wrong reveal. Try next time.");
+}
+
 function showRevealHand(o) {
 
     var player    = o.value[0][3][0].value[0][1],

+ 4 - 0
apps/web/priv/static/app/js/okey/okey.js

@@ -226,6 +226,10 @@ function PostLoad()
         // $gosterme.remove();
     });
 
+    scope.apiProvider.on("okey_deny_wrong_reveal", function(x) {
+        denyWrongReveal();
+    });
+
     scope.apiProvider.on("okey_round_ended", function(x) {
         var e = {detail: x.detail.json, raw: x.detail.bert};
         showRoundEnd(e);

+ 1 - 0
apps/web/priv/static/app/js/okey/okey_protocol.js

@@ -34,6 +34,7 @@ function OkeyApiProviderScope(scope) {
         "okey_game_started",
         "okey_game_player_state",
         "okey_next_turn",
+        "okey_deny_wrong_reveal",
         "okey_tile_discarded",
         "okey_tile_taken",
         "okey_round_ended",

+ 2 - 1
apps/web/src/logallow.erl

@@ -7,7 +7,8 @@ log_modules() -> [
 %    okey_bot,
 %    game_session,
 %    bullet_handler,
-%    okey_table,
+    okey_table,
+    okey_desk,
 %    okey_scoring,
 %    journal,
 %    lucky,