diff options
Diffstat (limited to 'lib/gs/contribs/bonk/bonk_square.erl')
-rw-r--r-- | lib/gs/contribs/bonk/bonk_square.erl | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/gs/contribs/bonk/bonk_square.erl b/lib/gs/contribs/bonk/bonk_square.erl new file mode 100644 index 0000000000..2f6c533079 --- /dev/null +++ b/lib/gs/contribs/bonk/bonk_square.erl @@ -0,0 +1,145 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights 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. |