Codebase list pangzero / 09eba78 lib / Games / PangZero / RecordGame.pm
09eba78

Tree @09eba78 (Download .tar.gz)

RecordGame.pm @09eba78raw · history · blame

##########################################################################
package Games::PangZero::RecordGame;
##########################################################################

@ISA = qw(Games::PangZero::PanicGame);
use strict;
use warnings;
use SDL;

sub Rand {
  my $self = shift;
  my $result = int(rand($_[0]) * 100) / 100;
  push @{$self->{rand}}, ($result);
  return $result;
}

sub Rewind {
  my $self = shift;
  my ($recordEnd, $playback);
  
  $recordEnd = length($self->{record}) - $Games::PangZero::NumGuys * 1000;
  return if $recordEnd <= 0;
  $self->{record}   = substr($self->{record}, 0, $recordEnd);
  $Games::PangZero::Game   = $playback
                    = DemoPlaybackGame->new($Games::PangZero::NumGuys, $Games::PangZero::DifficultyLevel, $self->{record}, $self->{rand}, {});
  $playback->{skip} = 1;
  SDL::Video::blit_surface($Games::PangZero::Background, SDL::Rect->new(0, 0, $Games::PangZero::App->w, $Games::PangZero::App->h), $Games::PangZero::App, SDL::Rect->new(0, 0, $Games::PangZero::App->w, $Games::PangZero::App->h));
  $playback->Run();
  
  $playback->RestoreGameSettings();
  %{$self}           = %{$playback};
  $Games::PangZero::Game    = $self;
  $self->{abortgame} = 0;
  print "Splicing {rand}: original length is ", scalar(@{$self->{rand}}), "; playback randpointer is $playback->{randpointer}.\n";
  splice @{$self->{rand}}, $playback->{randpointer};
  SDL::Video::blit_surface($Games::PangZero::Background, SDL::Rect->new(0, 0, $Games::PangZero::App->w, $Games::PangZero::App->h), $Games::PangZero::App, SDL::Rect->new(0, 0, $Games::PangZero::App->w, $Games::PangZero::App->h));
  $self->DrawGame();
  %Games::PangZero::Events = %Games::PangZero::Keys = ();
  
  while( not %Games::PangZero::Events ) {
    Games::PangZero::HandleEvents();
    SDL::delay(100);
  }
  GameTimer::ResetTimer();
}

sub PreAdvanceAction {
  my $self = shift;
  $self->Rewind() if $Games::PangZero::Events{::SDLK_F3()};
  
  for (my $i = 0; $i < $Games::PangZero::NumGuys; ++$i) {
    my $keys = $Games::PangZero::Players[$i]->{keys};
    my $record = 0;
    $record   += 1 if $Games::PangZero::Keys{$keys->[0]};
    $record   += 2 if $Games::PangZero::Keys{$keys->[1]};
    $record   += 4 if $Games::PangZero::Events{$keys->[2]};
    if ($Games::PangZero::Events{SDLK_F2()} and $Games::PangZero::NumGuys == 1) {
      $record += 8;
      $Games::PangZero::GameEvents{superkill} = 1;
    }
    $self->{record} .= $record;
  }
}

1;