preparation for release
[cave9.git] / src / sfcave9.pl
blob8f4f87d8544ab65d0d7911bebb05c372649b5f32
1 #!/usr/bin/perl
2 use strict;
3 $\="\n";
5 # settings
6 my $max_time = 10000;
7 my $min_cave_height = 0;
8 my $max_cave_height = 30;
9 my $max_screen_height = $ENV{COLUMNS} - 15;
10 my $cave_change_rate = .2;
11 my $accel = .2;
12 my $stala_rate = .1;
13 my $stala_size = 3;
14 my $max_velocity = 1;
16 # vars
17 my $key = 0;
18 my $velocity = 0;
19 my $time = 1;
20 my $cave_height = int rand $max_cave_height;
21 my @tunnel;
23 $tunnel[0] = int rand $max_screen_height-1;
25 sub skill() {
26 (log(($time+200)/200));
29 my $repeat = 0;
30 my $cave_change = 1;
32 sub key_state(){
33 $repeat = 0 if $repeat * $velocity < 0;
34 $repeat += $velocity/1000;
36 my $dir = $key ? -1: 1;
37 $key = !$key if
38 (rand() < abs($velocity/skill()/3) and $velocity * $dir < 0)
39 || (rand() < abs($repeat * skill()) and $repeat * $dir < 0);
41 $max_cave_height = 10+30/(1+skill());
42 $min_cave_height = $max_cave_height/skill();
44 $cave_change != $cave_change if
45 (rand() > $cave_change_rate/skill());
47 $cave_change != $cave_change,
48 $cave_height = $min_cave_height
49 if $cave_height < $min_cave_height;
51 $cave_change != $cave_change,
52 $cave_height = $max_cave_height
53 if $cave_height > $max_cave_height;
55 $cave_height += rand()>.5?-1:1 if $cave_change;
58 sub bound($){
59 $_ = shift;
60 $_ = $max_screen_height if $_ < 0;
61 $_ = 0 if $_ > $max_screen_height;
62 $_;
65 sub next_height(){
66 key_state();
67 $velocity += ($key?1:-1)*$accel;
68 $tunnel[$time-1]+= $velocity;
71 sub hud() {
72 sprintf ("%6.3f ",skill);
75 sub cave() {
76 my $ceil = $max_screen_height-$tunnel[$time]-1-$cave_height;
77 '#'x$tunnel[$time] , ' 'x$cave_height , ($ceil > 0 ? '#'x $ceil : '');
80 for ($time = 1; $time <= $max_time; $time++) {
81 $tunnel[$time] = bound(next_height());
82 print hud(),cave();
83 use Time::HiRes qw/sleep/;
84 sleep .02;