View Source Document

Landscape.pm

# Copyright (c)2000-2013, Chris Pressey, Cat's Eye Technologies.
# All rights reserved.
# Distributed under a BSD-style license; see file LICENSE for more info.

package Terrain;

### TERRAIN ELEMENTS ###

### FOREST: OBSTACLES ###

$clump_of_trees = Terrain->new('name' => 'clump of trees',
                               'climbable' => 5,
                               'condition' => 10,
                               'on_pull' => <<'END',
    my ($puller, $self) = @_;
    my $i = Distribution->new(0.05 => $Item::club->crude,
                              0.05 => $Item::quarterstaff->crude)->pick;
# handful of leaves
# handful of bark
    if(defined $i)
    {
      $i = $i->clone;
      $puller->take($i);
      $puller->seen($i, "<self> manages to tear <# other> from the clump of trees.");
# bash self
    } else
    {
      $puller->seen($self, "<self> can't manage to tear anything from <other>.");
    }
END
                               'color' => 'green',
                               'appearance' => 'tree')->implies($Adj::wood)->implies($Adj::obstacle);

#$dense_forest = Terrain->new('name' => 'dense forest',
#                             'indestructible' => 1,
#                             'color' => 'green',
#                             'appearance' => 'tree')->implies($Adj::wood)->implies($Adj::wall);

$concealed_stash = Terrain->new('name' => 'clump of trees',
                               'condition' => 10,
                               'conceals' => 20,
                               'color' => 'green',
                               'on_reveal' => <<'END',
    my ($self) = @_;
    my $i = Distribution->new(0.5 => $Item::broadsword->fine->magicked(+1),
                              0.5 => $Item::mundane_wand->enchant($Talent::lightning_bolt, ::d(2,4)))->pick->clone;
    shift @{$self->{location}{map}[$self->{x}][$self->{y}]};
    unshift @{$self->{location}{map}[$self->{x}][$self->{y}]}, $i;
    $self->{location}->draw_cell($self->{x}, $self->{y});
    ::msg("This clump of trees looks like a hidden stash!");
END
                               'appearance' => 'tree')->implies($Adj::wood)->implies($Adj::obstacle);

$giant_bluewood = Terrain->new('name' => 'giant bluewood',
                               'climbable' => 25,
                               'condition' => 50,
                               'color' => 'cyan',
                               'appearance' => 'tree')->implies($Adj::wood)->implies($Adj::obstacle);

$Actor::wood_sprite->learn(Talent::create_ring($Terrain::giant_bluewood), 88);

$whipper_tree  = Terrain->new('name' => 'whipper tree',
                               'climbable' => 10,
                               'condition' => 30,
                               'color' => 'lime',
                               'appearance' => 'tree')->implies($Adj::wood)->implies($Adj::obstacle);

$waxwork_wall = Terrain->new('name' => 'waxwork wall',
                               'opacity' => 90,
                               'climbable' => 5,
                               'condition' => 10,
                               'color' => 'yellow',
                               'appearance' => 'honeycomb')->implies($Adj::wax)->implies($Adj::wall);

$dense_wax = Terrain->new('name' => 'dense wax',
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'honeycomb')->implies($Adj::wax)->implies($Adj::wall);

$bedrock = Terrain->new('name' => 'bedrock',
                             'indestructible' => 1,
                             'color' => 'grey',
                             'appearance' => 'rock')->implies($Adj::stone)->implies($Adj::wall);

### FOREST: FLOORS ###

$giant_beehive    = Terrain->new('name' => 'giant beehive',
                              'low' => 1,
                              'color' => 'yellow',
                              'condition' => 100,
                              'opacity' => 0,
                              'appearance' => 'door')->implies($Adj::wax);

$beehive_tunnel   = Terrain->new('name' => 'beehive tunnel',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'yellow',
                               'appearance' => 'tunnel')->implies($Adj::wax);

$forest_floor   = Terrain->new('name' => 'forest floor',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'green',
                               'appearance' => 'floor')->implies($Adj::earth);

### PLAINS: FLOORS ###

$grassy_flat    = Terrain->new('name' => 'grassy flat',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'lime',
                               'appearance' => 'floor')->implies($Adj::plant);

$cultivated_field  = Terrain->new('name' => 'cultivated field',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'yellow',
                               'appearance' => 'floor')->implies($Adj::plant);

$fallow_field  = Terrain->new('name' => 'fallow field',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'floor')->implies($Adj::earth);

$barren_field   = Terrain->new('name' => 'barren field',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'purple',
                               'appearance' => 'floor')->implies($Adj::earth);

### HILLS: FLOORS ###

$rocky_steppes   = Terrain->new('name' => 'rocky steppes',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'floor')->implies($Adj::earth);

$gully  = Terrain->new('name' => 'gully',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'floor')->implies($Adj::earth);

$low_hillside  = Terrain->new('name' => 'low hillside',
                               'low' => 1,
                               'opacity' => 10,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'hill')->implies($Adj::earth);

### MOUNTAINS: OBSTACLES ###

$rocky_cliff    = Terrain->new('name' => 'rocky cliff',
                               'low' => 0,
                               'opacity' => 100,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'mountain')->implies($Adj::stone)->implies($Adj::obstacle);

$icy_cliff      = Terrain->new('name' => 'icy cliff',
                               'low' => 0,
                               'opacity' => 100,
                               'indestructible' => 1,
                               'color' => 'white',
                               'appearance' => 'mountain')->implies($Adj::stone)->implies($Adj::obstacle);

### MOUNTAINS: OBSTACLES ###

$mountain_pass  = Terrain->new('name' => 'mountain pass',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'floor')->implies($Adj::earth);

### DESERT: FLOORS ###

$alkali_flat    = Terrain->new('name' => 'alkali flat',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'grey',
                               'appearance' => 'floor')->implies($Adj::earth);

$hardpan        = Terrain->new('name' => 'hardpan',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'floor')->implies($Adj::earth);

$sandy_expanse  = Terrain->new('name' => 'sandy expanse',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'yellow',
                               'appearance' => 'floor')->implies($Adj::earth);

$sand_dune      = Terrain->new('name' => 'sand dune',
                               'low' => 1,
                               'opacity' => 25,
                               'indestructible' => 1,
                               'color' => 'yellow',
                               'appearance' => 'hill')->implies($Adj::earth);

### WATER: OBSTACLES ###

$ocean = Terrain->new('name' => 'ocean',
                                'opacity' => 0,
                                'indestructible' => 1,
                                'color' => 'aqua',
                                'appearance' => 'water')->implies($Adj::water);

### WATER: FLOORS ###

$freshwater_pool = Terrain->new('name' => 'freshwater pool',
                                'low' => 1,
                                'opacity' => 0,
                                'indestructible' => 1,
                                'color' => 'sky',
                                'appearance' => 'water')->implies($Adj::water);

$marsh = Terrain->new('name' => 'marsh',
                      'low' => 1,
                      'opacity' => 25,
                      'indestructible' => 1,
                      'color' => 'aqua',
                      'appearance' => 'marsh')->implies($Adj::mud);

### WILDERNESS: PORTALS ###

$small_hole    = Terrain->new('name' => 'small hole',
                              'low' => 1,
                              'opacity' => 0,
                              'indestructible' => 1,
                              'color' => 'grey',
                              'appearance' => 'hole')->implies($Adj::mud);


### AIR: FLOORS ###

$fog             = Terrain->new('name' => 'fog',
                                'opacity' => 66,
                                'low' => 1,
                                'indestructible' => 1,
                                'color' => 'grey',
                                'appearance' => 'gas')->implies($Adj::gas);

$Actor::swamp_hag->learn(Talent::create_cloud($Terrain::fog), 100);

$mist            = Terrain->new('name' => 'mist',
                                'opacity' => 33,
                                'low' => 1,
                                'indestructible' => 1,
                                'color' => 'white',
                                'appearance' => 'gas')->implies($Adj::gas);

$smoke           = Terrain->new('name' => 'smoke',
                                'opacity' => 90,
                                'low' => 1,
                                'indestructible' => 1,
                                'color' => 'black',
                                'appearance' => 'gas')->implies($Adj::gas);

### ARTIFICE: OBSTACLES ###

$ancient_ruins = Terrain->new('name' => 'ancient ruins',
                              'climbable' => 10,
                              'condition' => 75,
                              'color' => 'grey',
                              'appearance' => 'brick')->implies($Adj::stone)->implies($Adj::obstacle);

$city_wall = Terrain->new('name' => 'city wall',
                              'climbable' => 60,
                              'condition' => 500,
                              'color' => 'grey',
                              'appearance' => 'brick')->implies($Adj::stone)->implies($Adj::obstacle);

$iron_portcullis = Terrain->new('name' => 'iron portcullis',
                              'opacity' => 33,
                              'climbable' => 50,
                              'condition' => 400,
                              'color' => 'blue',
                              'appearance' => 'gate')->implies($Adj::iron)->implies($Adj::wall);

$building_wall = Terrain->new('name' => 'building wall',
                              'climbable' => 40,
                              'condition' => 200,
                              'color' => 'red',
                              'appearance' => 'brick')->implies($Adj::stone)->implies($Adj::obstacle);

$small_farmhouse  = Terrain->new('name' => 'small farmhouse',
                               'indestructible' => 1,
                               'color' => 'grey',
                               'appearance' => 'hut')->implies($Adj::wood)->implies($Adj::obstacle);

$stonework_wall = Terrain->new('name' => 'stonework wall',
                             'condition' => 325,
                             'color' => 'grey',
                             'appearance' => 'brick')->implies($Adj::stone)->implies($Adj::wall);

$wooden_signpost = Terrain->new('name' => 'wooden signpost',
                              'climbable' => 80,
                              'condition' => 100,
                              'color' => 'red',
                              'appearance' => 'stair')->implies($Adj::wood)->implies($Adj::obstacle);

### ARTIFICE: STAIRS ###

$ascending_staircase = Terrain->new('name' => 'ascending staircase',
                              'low' => 1,
                              'opacity' => 0,
                              'indestructible' => 1,
                              'color' => 'white',
                              'appearance' => 'stair')->implies($Adj::stone);

$descending_staircase = Terrain->new('name' => 'descending staircase',
                              'low' => 1,
                              'opacity' => 0,
                              'indestructible' => 1,
                              'color' => 'grey',
                              'appearance' => 'stair')->implies($Adj::stone);

### ARTIFICE: PORTALS ###

$stone_archway = Terrain->new('name' => 'stone archway',
                              'low' => 1,
                              'opacity' => 12,
                              'color' => 'grey',
                              'climbable' => 60,
                              'condition' => 200,
                              'appearance' => 'door')->implies($Adj::stone);

$wooden_doorway = Terrain->new('name' => 'wooden doorway',
                              'low' => 1,
                              'opacity' => 12,
                              'color' => 'brown',
                              'climbable' => 60,
                              'condition' => 200,
                              'appearance' => 'door',
                              'on_open' => <<'END',
{
  my ($self, $actor) = @_;
  shift @{$self->{location}{map}[$self->{x}][$self->{y}]};
  my $t = $Terrain::closed_wooden_door->clone;
  $t->{x} = $self->{x};
  $t->{y} = $self->{y};
  $t->{location} = $self->{location};
  unshift @{$self->{location}{map}[$self->{x}][$self->{y}]}, $t;
}
END
)->implies($Adj::wood);

$closed_wooden_door = Terrain->new('name' => 'closed wooden door',
                              'color' => 'brown',
                              'climbable' => 60,
                              'condition' => 200,
                              'appearance' => 'closed',
                              'on_open' => <<'END',
{
  my ($self, $actor) = @_;
  shift @{$self->{location}{map}[$self->{x}][$self->{y}]};
  my $t = $Terrain::wooden_doorway->clone;
  $t->{x} = $self->{x};
  $t->{y} = $self->{y};
  $t->{location} = $self->{location};
  unshift @{$self->{location}{map}[$self->{x}][$self->{y}]}, $t;
}
END
)->implies($Adj::wood)->implies($Adj::obstacle);

### ARTIFICE: FLOORS ###

$cobblestone_road   = Terrain->new('name' => 'cobblestone road',
                               'low' => 1,
                               'opacity' => 0,
                               'color' => 'grey',
                               'appearance' => 'floor')->implies($Adj::stone);

$dirt_road   = Terrain->new('name' => 'dirt road',
                               'low' => 1,
                               'opacity' => 0,
                               'indestructible' => 1,
                               'color' => 'brown',
                               'appearance' => 'floor')->implies($Adj::earth);

$wooden_docks = Terrain->new('name' => 'wooden docks',
                              'low' => 1,
                              'opacity' => 0,
                              'indestructible' => 1,
                              'color' => 'brown',
                              'appearance' => 'stair')->implies($Adj::wood);

$marble_steps = Terrain->new('name' => 'marble steps',
                              'low' => 1,
                              'opacity' => 0,
                              'indestructible' => 1,
                              'color' => 'pink',
                              'appearance' => 'stair')->implies($Adj::marble);

$stonework_floor = Terrain->new('name' => 'stonework floor',
                                'low' => 1,
                                'opacity' => 0,
                                'indestructible' => 1,
                                'color' => 'grey',
                                'appearance' => 'floor')->implies($Adj::stone);

sub diseased
{
  my $self = shift;
  my $disease = shift;
  my $n = $self->copy;
  $n->{_disease} = $disease;
  $n->{on_enter} = <<'END';
{
  my ($self, $actor) = @_;
  my $d = $self->{_disease};
  $d = $d->pick if ref($d) eq 'Distribution');
  $d->clone->poison($actor);
}
END
  return $n;
}

$magic_circle    = Terrain->new('name' => 'magic circle',
                                'low' => 1,
                                'opacity' => 0,
                                'indestructible' => 1,
                                'on_enter' => <<'END',
{
  my ($self, $actor) = @_;
  $actor->seen($self, "<self> is protected from demons by <other>.");
  $actor->alter_resistances('demon' => 1.00);
}
END
                                'on_exit' => <<'END',
{
  my ($self, $actor) = @_;
  $actor->seen($self, "<self> is no longer protected by <other>.");
  $actor->alter_resistances('demon' => -1.00);
}
END
                                'color' => 'white',
                                'appearance' => 'circle')->implies($Adj::magic);

1;