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 )