The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
###  $Id: Chest.pm 424 2008-08-19 16:27:43Z duncan $
####------------------------------------------
###
## @file
# Define Chest Class

## @class Chest
# Chests in game

package OpenGL::QEng::Chest;

use strict;
use warnings;
use OpenGL qw/:all/;
use OpenGL::QEng::Part;

use base qw/OpenGL::QEng::Hinged/;

use constant PI => 4*atan2(1,1); # 3.14159;
use constant RADIANS => PI/180.0;

#####
##### Class Methods - called as Class->function($a,$b,$c)
#####

#-----------------------------------------------------------------
## @cmethod Chest new()
# Create a chest at given location
#
sub new {
  my ($class,@props) = @_;

  my $props = (scalar(@props) == 1) ? $props[0] : {@props};

  $props->{swing} ||= 70;       # how much to open the hinge

  my $self = OpenGL::QEng::Hinged->new(swing => $props->{swing},);
  bless($self,$class);

  $props->{eye_magnet}||= 1,
  $props->{color} ||= 'gold';
  $props->{xsize} ||= 3;
  $props->{ysize} ||= 2.5;
  $props->{zsize} ||= 2;
  $props->{model} ||= {minx => -$props->{xsize}/2,maxx => $props->{xsize}/2,
		       miny => 0.01,              maxy => $props->{ysize}+0.01,
		       minz => -$props->{zsize}/2,maxz => $props->{zsize}/2};
  $props->{cover} ||= OpenGL::QEng::Part->new(x         => 0,
				y         => $props->{model}{miny}+2,
				z         => $props->{model}{maxz},
				xsize     => 3, ysize => 0.5, zsize => 2,
				face      => 1, #[1,1,1,1,1,0],
				texture   => ['chestlid','chestfront','side',
					      'side','side','chest_liner',],
				stretchi  => 1,
				color     => $props->{color},
				eye_magnet=> 1,
				holder    => 1,
				model     => {miny=> 0,   maxy=> 0.5,
					      minx=>-1.5, maxx=>+1.5,
					      minz=>-2,   maxz=> 0,  },   );
  $props->{fixed} ||= OpenGL::QEng::Part->new(x         => 0,
				y         => $props->{model}{miny},
				z         => 0,
				xsize     => 3, ysize => 2, zsize => 2,
				face      => [0,1,1,1,1,1],
				texture   => ['',    'side','side',
					      'side','side','wood',],
				stretchi  => 1,
				color     => $props->{color},
				eye_magnet=> 1,
				holder    => 1,
				store_at  => {x     => 0,
					      y     => 0.01,
					      z     => 0,
					      roll  => 0,
					      pitch => 0,
					      yaw   => 0    },
			          );
  $self->{color} = undef;
  $self->passedArgs($props);
  $self->assimilate($self->{cover});
  $self->assimilate($self->{fixed});
  $self->create_accessors;
  $self->register_events;

  $self;
}

#####
##### Object Methods
#####

#-----------------------------------------------------------------
## @method move()
# Step the animation -- move to open the top
sub move {
  my $self = shift;

  my $saved_hinge = $self->hinge;
  $self->SUPER::move;

  if ($self->hinge > $saved_hinge) {
    # if there is stuff on top of the lid, slide it off when we open
    if ($self->{hinge} > 10 && $self->holds) {
      foreach my $o (@{$self->holds}) {
	next if ($o == $self->cover || $o == $self->fixed);
	if ($o->y >= ($self->y+($self->{model}{maxy}-$self->{model}{miny}))) {
	  $self->is_at->put_thing($self->take_thing($o));
	  $o->{x} = $self->x;
	  $o->{z} = $self->z;
	  $o->{y} = $self->y+2.52;
	  $o->{yaw} = $self->yaw;
	  $o->{target}{x} = $self->x+(sin($self->yaw*RADIANS)*2);
	  $o->{target}{z} = $self->z+(cos($self->yaw*RADIANS)*2);
	  $o->{target}{y} = $self->y;
	}
      }
    }
  }
}

#--------------------------------------------------
sub can_hold {
  my ($self, $thing) = @_;
  1;
}

#==================================================================
1;

__END__

=head1 NAME

Chest -- a container for SimpleThings

=head1 AUTHORS

John D. Overmars E<lt>F<overmars@jdovermarsa.com>E<gt>,
and Rob Duncan E<lt>F<duncan@jdovermarsa.com>E<gt>

=head1 COPYRIGHT

Copyright 2008 John D. Overmars and Rob Duncan, All rights reserved.

=head1 LICENSE

This is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut