Browse Source

added series events and skill/score points

Maxim Sokhatsky 11 years ago
parent
commit
f203969b06

+ 3 - 3
apps/db/include/game_log.hrl

@@ -7,10 +7,10 @@
 -record(container_log, {?CONTAINER_LOG}).
 -record(container_event, {?ITERATOR(container_log), ?LOG_HEADER }).
 
--record(series_log,  {?CONTAINER_LOG}).
--record(series_event,  {?ITERATOR(series_log),?LOG_HEADER}).
+-record(series_log,  {?CONTAINER_LOG, score }).
+-record(series_event,  {?ITERATOR(series_log),?LOG_HEADER, result, score}).
 
--record(reveal_log,  {?CONTAINER_LOG}).
+-record(reveal_log,  {?CONTAINER_LOG, skill }).
 -record(reveal_event,  {?ITERATOR(reveal_log), ?LOG_HEADER, reason, winner, score, total}).
 
 -record(protocol_log,  {?CONTAINER_LOG}).

+ 12 - 16
apps/server/src/okey/game_okey_table.erl

@@ -362,7 +362,7 @@ handle_parent_message(show_round_result, StateName,
 handle_parent_message({show_series_result, Results}, StateName,
                       #okey_state{relay = Relay, players = Players,
                              next_series_confirmation = Confirm} = StateData) ->
-    Msg = create_okey_series_ended(Results, Players, Confirm),
+    Msg = create_okey_series_ended(Results, Players, Confirm, StateData),
     relay_publish_ge(Relay, Msg, StateData),
     {next_state, StateName, StateData#okey_state{}};
 
@@ -1333,21 +1333,17 @@ round_results(
         results = Results,
         next_action = next_round}.
 
-create_okey_series_ended(Results, Players, Confirm) ->
-    Standings = [begin
-                     #player{user_id = UserId} = fetch_player(PlayerId, Players),
-                     Winner = case Status of    %% TODO: Implement in the client support of all statuses
-                                  winner -> <<"true">>;
-                                  _ -> <<"none">>
-                              end,
-                     #'OkeySeriesResult'{player_id = UserId, place = Position, score = Score,
-                                         winner = Winner}
-                 end || {PlayerId, Position, Score, Status} <- Results],
-    DialogType = if Confirm -> yes_no;
-                    true -> ok
-                 end,
-    #okey_series_ended{standings = Standings,
-                       dialog_type = DialogType}.
+create_okey_series_ended(Results, Players, Confirm,
+    #okey_state{tournament_type=GameKind,game_mode=GameMode,speed=Speed,rounds=Rounds}=GameState) ->
+    {Date,Time} = calendar:local_time(),
+    [begin
+        #player{user_id = UserId} = fetch_player(PlayerId, Players),
+        Event = #series_event{result=Status,user=UserId,date=Date,time=Time,score=Score,
+            speed=Speed,rounds=Rounds,feed_id={GameMode,Speed,Rounds,UserId},
+            id=game_log:timestamp()},
+        game_log:series_event(UserId,Event,GameState)
+    end || {PlayerId, Position, Score, Status} <- Results],
+    #okey_series_ended{standings = Results}.
 
 create_okey_tour_result(TurnNum, Results) ->
     Records = [begin

+ 11 - 0
apps/server/src/sup/game_log.erl

@@ -14,6 +14,7 @@ mypid() -> gen_server:call(?SERVER, mypid).
 clear_history() -> gen_server:cast(?SERVER, clear_history).
 get_history() -> gen_server:call(?SERVER, get_history).
 protocol_event(User,Event,State) -> gen_server:cast(?SERVER, {protocol_event, User, Event, State}).
+series_event(User,Event,State) -> gen_server:cast(?SERVER, {series_event, User, Event, State}).
 reveal_event(User,Event,State) -> gen_server:cast(?SERVER, {reveal_event, User, Event, State}).
 update_stats(User,Event,Pos,State) -> gen_server:cast(?SERVER, {update_stats, User, Event, Pos, State}).
 timestamp() -> {MegaSec, Sec, MiliSec} = erlang:now(), MegaSec * 1000 * 1000 * 1000  + Sec * 1000 + MiliSec.
@@ -62,6 +63,16 @@ handle_cast({update_stats, User, Event, Pos, GameState}, State) ->
 handle_cast({reveal_event, User, Event, GameState}, State) ->
     kvs:add(Event),
     update_container_stats(User, Event, #reveal_event.reason, GameState),
+    {ok, SE} = kvs:get(reveal_log,Event#reveal_event.feed_id),
+    Skill = case SE#reveal_log.skill of X when is_integer(X) -> X; _ -> 0 end,
+    kvs:put(SE#reveal_log{skill=Skill+1}),
+    {noreply, State};
+handle_cast({series_event, User, Event, GameState}, State) ->
+    kvs:add(Event),
+    update_container_stats(User, Event, #series_event.result, GameState),
+    {ok, SE} = kvs:get(series_log,Event#series_event.feed_id),
+    Score = case SE#series_log.score of X when is_integer(X) -> X; _ -> 0 end,
+    kvs:put(SE#series_log{score=Score+Event#series_event.score}),
     {noreply, State};
 handle_cast(clear_history, State) -> {noreply, State#state{history = []}};
 handle_cast(_Msg, State) -> gas:info(?MODULE, "Event Log: cast message ~p", [_Msg]), {noreply, State}.