Codebase list pangzero / upstream/latest lib / Games / PangZero / Highscore.pm
upstream/latest

Tree @upstream/latest (Download .tar.gz)

Highscore.pm @upstream/latestraw · history · blame

##########################################################################
# HIGH SCORE TABLE
##########################################################################
package Games::PangZero::Highscore;

use vars qw( @Games::PangZero::UnsavedHighScores );

foreach (@Games::PangZero::DifficultyLevels) {
  $_->{highScoreTablePan} = [ ['UPI', 250000], ['UPI', 200000], ['UPI', 150000], ['UPI', 100000], ['UPI', 50000] ];
  $_->{highScoreTablePan} = [ ['UPI', 2500], ['UPI', 2000], ['UPI', 1500], ['UPI', 1000], ['UPI', 500] ] if $_->{name} eq 'Miki';
  $_->{highLevelTablePan} = [ ['UPI', 50], ['UPI', 40], ['UPI', 30], ['UPI', 20], ['UPI', 10] ];
  $_->{highLevelTablePan} = [ ['UPI', 20], ['UPI', 16], ['UPI', 12], ['UPI', 8], ['UPI', 4] ] if $_->{name} eq 'Miki';
  $_->{highScoreTableCha} = [ ['UPI', 250000], ['UPI', 200000], ['UPI', 150000], ['UPI', 100000], ['UPI', 50000] ];
  $_->{highLevelTableCha} = [ ['UPI', 30], ['UPI', 25], ['UPI', 20], ['UPI', 15], ['UPI', 10] ];
}

sub AddHighScore {
  my ($player, $score, $level) = @_;
  
  unshift @Games::PangZero::UnsavedHighScores, [$player, $score, $level];
}

sub MergeUnsavedHighScores {
  my ($table) = @_;
  my ($unsavedHighScore, $player, $score, $level);
  
  die unless ($table =~ /^(Cha|Pan)$/);
  foreach $unsavedHighScore (@Games::PangZero::UnsavedHighScores) {
    ($player, $score, $level) = @{$unsavedHighScore};
    &MergeUnsavedHighScore( $Games::PangZero::DifficultyLevel->{"highScoreTable$table"}, $player, $score );
    &MergeUnsavedHighScore( $Games::PangZero::DifficultyLevel->{"highLevelTable$table"}, $player, $level );
  }
  
  splice @{$Games::PangZero::DifficultyLevel->{"highScoreTable$table"}}, 5;
  splice @{$Games::PangZero::DifficultyLevel->{"highLevelTable$table"}}, 5;
  @Games::PangZero::UnsavedHighScores = ();
  my $newHighScore = &InputPlayerNames($table);
  if ($newHighScore) {
    $Games::PangZero::Game->RunHighScore( $Games::PangZero::DifficultyLevelIndex, $table, 0 );
  }
}

sub MergeUnsavedHighScore {
  my ($highScoreList, $player, $score) = @_;
  my ($i);
  
  for ($i = 0; $i < scalar @{$highScoreList}; ++$i) {
    if ($highScoreList->[$i]->[1] < $score) {
      splice @{$highScoreList}, $i, 0, [$player, $score];
      return;
    }
  }
}

sub InputPlayerNames {
  my ($table) = @_;
  my ($highScoreEntry, $player, $score, $message, $retval);
  
  die unless ($table =~ /^(Cha|Pan)$/);
  $retval = 0;
  foreach $highScoreEntry (@{$Games::PangZero::DifficultyLevel->{"highScoreTable$table"}}, @{$Games::PangZero::DifficultyLevel->{"highLevelTable$table"}}) {
    $player = $highScoreEntry->[0];
    next unless ref $player;
    unless ($player->{highScoreName}) {
      $score                   = $highScoreEntry->[1];
      $message                 = $score < 1000 ? "Level $score" : "Score $score";
      $player->{highScoreName} = &InputPlayerName($player, $message);
    }
    $highScoreEntry->[0] = $player->{highScoreName};
    $retval              = 1;
  }
  foreach $player (@Games::PangZero::Players) {
    delete $player->{highScoreName};
  }
  return $retval;
}

sub InputPlayerName {
  my ($player, $message) = @_;
  my ($nameMenuItem, @menuItems, $x, $y, $yInc);
  
  SDL::Events::enable_unicode(1);
  $Games::PangZero::UnicodeMode = 1;
  my $name               = ($player->{name} or '') . '|';
  my $guy                = Games::PangZero::Guy->new($player);
  ($guy->{x}, $guy->{y}) = (150, 150);
  $guy->DemoMode();
  
  ($x, $y, $yInc) = (230, 80, 45);
  push @menuItems, (
    Games::PangZero::MenuItem->new( $x, $y += $yInc, "HIGH SCORE!!!"),
    Games::PangZero::MenuItem->new( $x, $y += $yInc, $message),
    Games::PangZero::MenuItem->new( $x, $y += $yInc, "Please enter your name:"),
    $nameMenuItem = Games::PangZero::MenuItem->new( $x, $y += $yInc, $name ),
  );
  push @Games::PangZero::GameObjects, ($guy, @menuItems);
  
  while (1) {
    $Games::PangZero::LastUnicodeKey = 0;
    $Games::PangZero::Game->MenuAdvance();
    last if $Games::PangZero::Game->{abortgame};
    if (%Games::PangZero::Events) {
      if ($Games::PangZero::MenuEvents{BACKSP}) {
        substr($name, -2, 1, '');        # Remove next to last char
        $nameMenuItem->SetText($name);
      } elsif ($Games::PangZero::MenuEvents{BUTTON}) {
        last;
      } elsif ($Games::PangZero::LastUnicodeKey < 127 and $Games::PangZero::LastUnicodeKey >= 32 and length($name) < 9) {
        substr($name, -1, 0, chr($Games::PangZero::LastUnicodeKey));   # Insert before last char
        $nameMenuItem->SetText($name);
      }
    }
  }
  $name           =~ s/\|$//;
  $player->{name} = $name;
  $name           = "Anonymous" if $name =~ /^\s*$/;
  $guy->Delete();
  foreach (@menuItems) {
    $_->Delete();
  }
  SDL::Events::enable_unicode(0); $Games::PangZero::UnicodeMode = 0;
  return $name;
}

1;