Games-FrozenBubble

 view release on metacpan or  search on metacpan

bin/frozen-bubble  view on Meta::CPAN

                    play_sound('typewriter');
                } elsif ($message =~ /^JOINED: (.+)/) {
                    my $joined = $1;
                    smg_add_status_msg(loc("*** %s joined the game!", $joined));
                    if ($can_start && exists $autokick{$joined}) {
                        $autokick{$joined} and Games::FrozenBubble::Net::send_("TALK $joined <-- $autokick{$joined}");
                        $kick->($joined);
                    } else {
                        push @wholist, $joined;
                        play_sound('newroot_solo');
                        if ($can_start
                            && ($chain_reaction_state eq loc("enabled")
                                || $victories_limit_index > 0
                                || $continue_game_when_players_leave_state eq loc("enabled")
                                || $single_player_targetting_state eq loc("disabled"))) {
                            my $level = Games::FrozenBubble::Net::send_and_receive('PROTOCOL_LEVEL');
                            if ($level < 1) {  #- available from minor level 1 onwards
                                if ($chain_reaction_state eq loc("enabled")) {
                                    smg_add_status_msg(loc("*** Chain-reaction disabled, %s is using a too old version of Frozen-Bubble", $joined));
                                    $chain_reaction_state = loc("disabled");
                                }
                                if ($victories_limit_index > 0) {
                                    smg_add_status_msg(loc("*** Victories limit reset, %s is using a too old version of Frozen-Bubble", $joined));
                                    $victories_limit_index = 0;
                                }
                            }
                            if ($level < 2) {  #- available from minor level 2 onwards
                                if ($continue_game_when_players_leave_state eq loc("enabled")) {
                                    smg_add_status_msg(loc("*** Continue game when players leave disabled, %s has a too old version", $joined));
                                    $continue_game_when_players_leave_state = loc("disabled");
                                }
                                if ($single_player_targetting_state eq loc("disabled")) {
                                    smg_add_status_msg(loc("*** Single player targetting enabled, %s has a too old version", $joined));
                                    $single_player_targetting_state = loc("disabled");
                                }
                            }
                        }
                        $can_start and $setoptions->();  #- new joiner needs to get parameters anyway
                    }
                } elsif ($message =~ /^PARTED: (.+)/) {
                    if ($1 eq $joined_leader) {
                        smg_add_status_msg(loc("*** Game creator left the game..."));
                        play_sound('cancel');
                        Games::FrozenBubble::Net::reconnect();
                        return smg_choose_game();
                    } else {
                        smg_add_status_msg(loc("*** %s left the game...", $1));
                        @wholist = difference2(\@wholist, [ $1 ]);
                        play_sound('newroot_solo');
                    }
                } elsif ($message =~ /^KICKED: (.+)/) {
                    smg_add_status_msg(loc("*** %s was kicked out of the game...", $1));
                    @wholist = difference2(\@wholist, [ $1 ]);
                    play_sound('newroot_solo');
                } elsif ($message eq 'KICKED') {
                    $forget_because_kicked = $joined_leader;
                    smg_add_status_msg(loc("*** You were kicked out of the game..."));
                    play_sound('cancel');
                    Games::FrozenBubble::Net::reconnect();
                    return smg_choose_game();
                } elsif ($message eq 'NO_ACTIVITY_WITHIN_GRACETIME') {
                    smg_add_status_msg(loc("*** You were disconnected because of too long inactivity"));
                    play_sound('cancel');
                    Games::FrozenBubble::Net::reconnect();
                    return smg_choose_game();
                } elsif ($message =~ /^OPTIONS: (.*)/) {
                    my $options = $1;
                    while ($options =~ /([^,]+),?/g) {
                        my $option = $1;
                        if ($option =~ /^CHAINREACTION:(.)/) {
                            $chainreaction = $1;
                        } elsif ($option =~ /^CONTINUEGAMEWHENPLAYERSLEAVE:(.)/) {
                            $continuegamewhenplayersleave = $1;
                        } elsif ($option =~ /^SINGLEPLAYERTARGETTING:(.)/) {
                            $singleplayertargetting = $1;
                        } elsif ($option =~ /^VICTORIESLIMIT:(\d*)/) {
                            $pdata{scorelimit} = $1;
                        } elsif ($option =~ /^PROTOCOLLEVEL:(\d+)/) {
                            $pdata{protocollevel} = $1;
                            if ($pdata{protocollevel} < 2) {
                                $continuegamewhenplayersleave = 0;
                                $singleplayertargetting = 1;
                            }
                        } else {
                            print "Unrecognized option: $option\n";
                        }
                    }
                    play_sound('menu_selected');
                } elsif ($message =~ /^GAME_CAN_START: (.+)/) {
                    @PLAYERS = qw(p1);
                    my $msg = $1;
                    my @mappings;
                    while ($msg) {
                        my $id = substr($msg, 0, 1);
                        $msg = substr($msg, 1);
                        my ($nick, undef, $rest) = $msg =~ /([^,]+)(,(.*))?/;
                        $msg = $rest;
                        push @mappings, { id => $id, nick => $nick };
                    }
                    foreach (@ALL_PLAYERS) {
                        delete $pdata{$_}{id};
                        delete $pdata{$_}{nick};
                    }
                    %{$pdata{id2p}} = ();
                    foreach my $m (@mappings) {
                        my $player;
                        if ($m->{nick} eq $mynick) {
                            $player = 'p1';
                        } else {
                            foreach (@ALL_PLAYERS) {
                                /rp/ or next;
                                exists $pdata{$_}{id} or $player ||= $_;
                            }
                            push @PLAYERS, $player;
                        }
                        $pdata{$player}{id} = $m->{id};
                        $pdata{$player}{nick} = $m->{nick};
                        $pdata{id2p}{$m->{id}} = $player;
                    }
                    Games::FrozenBubble::Net::setmyid($pdata{p1}{id});
                    $pdata{$_}{score} = 0 foreach @PLAYERS;



( run in 2.698 seconds using v1.01-cache-2.11-cpan-98e64b0badf )