Skip to content

Commit

Permalink
imported 0.04
Browse files Browse the repository at this point in the history
  • Loading branch information
iamcal committed Apr 23, 2008
1 parent 563cc66 commit f6655d6
Show file tree
Hide file tree
Showing 13 changed files with 283 additions and 31 deletions.
7 changes: 6 additions & 1 deletion Changes
Expand Up @@ -8,10 +8,15 @@ Revision history for Perl extension Language::Homespring.
- added Language::Homepsring::Salmon class
- basic implementation of runtime

0.03 Tue Jul 01 2003
0.03 Tue Jul 01 2003
- added Language::Homespring::River
- added Language::Homespring::Snowmelt
- moved salmon to rivers instead of nodes
- fixed up example scripts
- got hello2.hs to work!
- add run() method to Language::Homespring

0.04 Wed Jul 02 2003
- added more ops
- added supported ops list to pod
- updated test suite to have full coverage of surrently supported ops
74 changes: 68 additions & 6 deletions Homespring.pm
@@ -1,6 +1,6 @@
package Language::Homespring;

$VERSION = 0.03;
$VERSION = 0.04;

use strict;
use warnings;
Expand Down Expand Up @@ -109,19 +109,22 @@ sub tick {

# process "powers"
@nodes = $self->_get_nodes('powers');
# $_->{power} = 'woo' for @nodes; return;
$self->_power_downwards($_) for @nodes;
for(@nodes){
if (!$_->{destroyed}){
$self->_power_downwards($_);
}
}

# process "hydro power"
@nodes = $self->_get_nodes('hydro power');
for (@nodes){
$self->_power_downwards($_) if $_->{water};
$self->_power_downwards($_) if $_->{water} && !$_->{destroyed};
}

# process "power invert"
@nodes = $self->_get_nodes('power invert');
for (@nodes){
$self->_power_downwards($_) if !$_->{power};
$self->_power_downwards($_) if !$_->{power} && !$_->{destroyed};
}

# process salmon
Expand Down Expand Up @@ -163,10 +166,11 @@ sub tick {
}

sub run{
my ($self, $max_ticks) = @_;
my ($self, $max_ticks, $delimit) = @_;
my $tick = 0;
while(1){
print $self->tick();
print $delimit if defined($delimit);
$tick++;
return if (defined($max_ticks) && ($tick >= $max_ticks));
return if !$self->{universe_ok};
Expand Down Expand Up @@ -290,6 +294,64 @@ reached. Output is sent to STDOUT;
=back
=head1 NODE OPS
=head2 Supported Node Ops
powers
hydro power
power invert
marshy
shallows
rapids
bear
young bear
bird
net
current
insulated
=head2 Partially Supported Node Ops
force field
hatchery
snowmelt
universe
=head2 Unsupported Node Ops
upstream killing device
bridge
waterfall
evaporates
pump
fear
lock
inverse lock
narrows
sense
switch
upstream sense
downstream sense
range sense
range switch
young sense
young switch
young range sense
young range switch
youth fountain
time
reverse up
reverse down
force up
force down
append down
append up
clone
oblivion
spawn
split
=head1 AUTHOR
Copyright (C) 2003 Cal Henderson <cal@iamcal.com>
Expand Down
7 changes: 7 additions & 0 deletions Homespring/Node.pm
Expand Up @@ -25,6 +25,7 @@ sub new {
$self->{uid} = ++$node_count;
$self->{depth} = 0;
$self->{node_name_safe} = $self->_make_safe($options->{node_name});
$self->{toggle} = 0;

# easier to deal with lowercase commands :)
$self->{node_name} = lc($self->{node_name}) if (!$self->{spring});
Expand Down Expand Up @@ -148,5 +149,11 @@ sub debug {
return "node $self->{uid} ($self->{node_name_safe})";
}

sub every_other {
my ($self) = @_;
$self->{toggle} = !$self->{toggle};
return $self->{toggle};
}

1;

27 changes: 23 additions & 4 deletions Homespring/Salmon.pm
Expand Up @@ -51,9 +51,8 @@ sub move {

my $node_name = $node_to_pass->{node_name};

return if (($node_to_pass->{node_name} eq 'marshy') && ($self->{time_at_node} == 1));
return if (($node_to_pass->{node_name} eq 'shallows') && ($self->{mature}) && ($self->{time_at_node} == 1));
return if (($node_to_pass->{node_name} eq 'rapids') && (!$self->{mature}) && ($self->{time_at_node} == 1));
return if (($node_to_pass->{node_name} eq 'shallows') && ($self->{mature}) && ($self->{time_in_river} == 1));
return if (($node_to_pass->{node_name} eq 'rapids') && (!$self->{mature}) && ($self->{time_in_river} == 1));

return if (($node_to_pass->{node_name} eq 'net') && ($self->{mature}));
return if (($node_to_pass->{node_name} eq 'current') && (!$self->{mature}));
Expand All @@ -63,6 +62,26 @@ sub move {
return;
}

if (($node_to_pass->{node_name} eq 'young bear') && ($self->{mature})){
if ($node_to_pass->every_other()){
$self->kill();
return;
}
}

if (($node_to_pass->{node_name} eq 'bird') && (!$self->{mature})){
$self->kill();
return;
}

if (($node_to_pass->{node_name} eq 'force field') && ($node_to_pass->{power})){
if ($self->{upstream}){
$self->spawn($node_to_pass);
}else{
return;
}
}

##
## do we have a new river to swim into?
##
Expand Down Expand Up @@ -91,7 +110,7 @@ sub spawn {

#print "spawning in river ".$self->{location}->{uid}." from node ".$spring->debug()."\n";

my $value = ($spring->{spring})?$spring->{node_name}:'UNKNOWN!!';
my $value = ($spring->{spring})?$spring->{node_name}:'nameless';
my $new_salmon = new Language::Homespring::Salmon({
'interp' => $self->{interp},
'value' => $value,
Expand Down
2 changes: 2 additions & 0 deletions Homespring/Snowmelt.pm
Expand Up @@ -56,6 +56,8 @@ sub smash {

#print "Smashing up a $node_name...\n";

$self->{location}->{destroyed} = 1;

if ($node_name eq 'universe'){
$self->{interp}->{universe_ok} = 0;
}
Expand Down
7 changes: 6 additions & 1 deletion MANIFEST
Expand Up @@ -12,5 +12,10 @@ examples/run.pl
examples/visual.pl
examples/hello1.hs
examples/hello2.hs
t/op_gen.t
examples/hi.hs
t/harness.inc
t/ops_01_generators.t
t/ops_02_slowing.t
t/ops_03_destruction.t
t/ops_04_blocking.t

8 changes: 8 additions & 0 deletions examples/hi.hs
@@ -0,0 +1,8 @@
Universe marshy now. The marshy stuff evaporates downstream. Sense
rapids
upstream. Killing. Device downstream. Sense shallows and say Hi,.
That powers the force. Field sense shallows hatchery power.
Hi .. What's. your. name?.
Hydro. Power spring when snowmelt then powers
insulated bear hatchery !.
Powers felt; powers feel snowmelt themselves.
3 changes: 2 additions & 1 deletion examples/run.pl
Expand Up @@ -14,6 +14,7 @@

my $hs = new Language::Homespring();
$hs->parse($code);
$hs->run(100);

$hs->run(15, "---\n");

#print Dumper($hs->{root_node}, $hs->{salmon}, $hs->{new_salmon});
18 changes: 0 additions & 18 deletions t/op_gen.t

This file was deleted.

32 changes: 32 additions & 0 deletions t/ops_01_generators.t
@@ -0,0 +1,32 @@
use Test::Simple tests => 9;

use Language::Homespring;
require "t/harness.inc";

#
# powers
# Generates electricity for everything downstream of the 'powers' node
#

ok(test_hs_return("bear hatchery foo powers", ['','','','foo','foo','foo']));
ok(test_hs_return("bear hatchery foo", ['','','','','','','']));
ok(test_hs_return("bear hatchery foo powers marshy snowmelt", ['','','','foo','foo','','','']));

#
# hydro power
# Generates electricity only when supplied with water. This can be destroyed by snowmelt
#

ok(test_hs_return("bear hatchery foo hydro. power", ['','','','','']));
ok(test_hs_return("bear hatchery foo hydro. power bar", ['','','','foo','foo','foo']));
ok(test_hs_return("bear hatchery foo hydro. power bar marshy snowmelt", ['','','','foo','foo','','','']));

#
# power invert
# Blocks electricity; generates electricity when not powered. This can be destroyed by snowmelt.
#

ok(test_hs_return("bear hatchery foo power. invert", ['','','','foo','foo','foo']));
ok(test_hs_return("bear hatchery foo power. invert powers", ['','','','','']));
ok(test_hs_return("bear hatchery foo power. invert marshy snowmelt", ['','','','foo','foo','','']));

27 changes: 27 additions & 0 deletions t/ops_02_slowing.t
@@ -0,0 +1,27 @@
use Test::Simple tests => 5;

use Language::Homespring;
require "t/harness.inc";

#
# marshy
# Snowmelts take two turns to pass through
#

ok(test_hs_return("universe hatchery foo powers marshy marshy snowmelt", ['','','','homelessfoo','homelessfoo','']));
ok(test_hs_return("universe hatchery foo powers snowmelt", ['','','','','','']));
ok(test_hs_return("marshy hatchery foo powers", ['','','','homelessfoo','homelessfoo','homelessfoo']));

#
# shallows
# Similar to marshy, but it affects mature salmon.
#

ok(test_hs_return("shallows hatchery foo powers", ['','','','foo','homelessfoo','homelessfoo']));

#
# rapids
# Similar to shallows, but for young salmon.
#

ok(test_hs_return("rapids hatchery foo powers", ['','','','homeless','foohomeless','foohomeless']));
26 changes: 26 additions & 0 deletions t/ops_03_destruction.t
@@ -0,0 +1,26 @@
use Test::Simple tests => 4;

use Language::Homespring;
require "t/harness.inc";

#
# bear
# Eats mature salmon.
#

ok(test_hs_return("bar hatchery foo powers", ['','','','homelessfoo','homelessfoo']));
ok(test_hs_return("bear hatchery foo powers", ['','','','foo','foo']));

#
# young bear
# Like a bear, but only kills every other mature fish.
#

ok(test_hs_return("young. bear hatchery foo powers", ['','','','foo','homelessfoo','foo','homelessfoo']));

#
# bird
# Like a bear, but kills young fish.
#

ok(test_hs_return("bird hatchery foo powers", ['','','','homeless','homeless']));

0 comments on commit f6655d6

Please sign in to comment.