%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(bonk_square).
-export([start/1,init/5,alarm/3]).
start(Bmp) ->
spawn_link(bonk_square, init, [Bmp, self(),
random:uniform(10000),
random:uniform(10000),
random:uniform(10000)]).
init(Bmp, BoardPid, Seed1, Seed2, Seed3) ->
random:seed(Seed1,Seed2,Seed3),
idle(Bmp, BoardPid).
idle(Bmp, BoardPid) ->
receive
start ->
Level = 1,
sleep(Level, Bmp, BoardPid, alarm(sleep_time(Level), wake_up));
quit ->
exit(normal);
_Other ->
idle(Bmp, BoardPid)
end.
sleep(Level, Bmp, BoardPid, Alarm) ->
receive
stop ->
Alarm ! quit,
idle(Bmp, BoardPid);
quit ->
Alarm ! quit,
exit(normal);
{new_level, NewLevel} ->
sleep(NewLevel, Bmp, BoardPid, Alarm);
{Alarm, wake_up} ->
show_me(BoardPid, Bmp),
show(Level, Bmp, BoardPid, alarm(2500, missed));
_Other ->
sleep(Level, Bmp, BoardPid, Alarm)
end.
show(Level, Bmp, BoardPid, Alarm) ->
receive
stop ->
Alarm ! quit,
idle(Bmp, BoardPid);
quit ->
Alarm ! quit,
exit(normal);
{new_level, NewLevel} ->
show(NewLevel, Bmp, BoardPid, Alarm);
sleep -> % The board was too crowded.
Alarm ! quit,
sleep(Level, Bmp, BoardPid, alarm(sleep_time(Level), wake_up));
bonk ->
bonk_me(BoardPid, Bmp),
Alarm ! quit,
bbmed(Level, Bmp, BoardPid, alarm(1500, hide));
bomb ->
bomb_me(BoardPid, Bmp),
Alarm ! quit,
bbmed(Level, Bmp, BoardPid, alarm(1000, hide));
{Alarm, missed} ->
missed_me(BoardPid, Bmp),
bbmed(Level, Bmp, BoardPid, alarm(1500, hide));
_Other ->
show(Level, Bmp, BoardPid, Alarm)
end.
%% bonked, bombed or missed
bbmed(Level, Bmp, BoardPid, Alarm) ->
receive
stop ->
Alarm ! quit,
idle(Bmp, BoardPid);
quit ->
Alarm ! quit,
exit(normal);
{new_level, NewLevel} ->
bbmed(NewLevel, Bmp, BoardPid, Alarm);
{Alarm, hide} ->
hide_me(BoardPid, Bmp),
sleep(Level, Bmp, BoardPid, alarm(sleep_time(Level), wake_up));
_Other ->
bbmed(Level, Bmp, BoardPid, Alarm)
end.
show_me(BoardPid, Bmp) ->
BoardPid ! {show, self(), Bmp}.
hide_me(BoardPid, Bmp) ->
BoardPid ! {hide, self(), Bmp}.
bonk_me(BoardPid, Bmp) ->
BoardPid ! {bonked, self(), Bmp}.
bomb_me(BoardPid, Bmp) ->
BoardPid ! {bombed, self(), Bmp}.
missed_me(BoardPid, Bmp) ->
BoardPid ! {missed, self(), Bmp}.
%% Count sleep time
sleep_time(Level) ->
random:uniform((19000 div (Level+1))*2+1500).
%% Set an alarm
alarm(Time, Msg) ->
spawn(bonk_square, alarm, [Time, Msg, self()]).
alarm(Time, Msg, Pid) ->
receive
quit -> exit(normal)
after
Time -> Pid ! {self(), Msg}
end.