ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/perl/minesweeper.ext
Revision: 1.3
Committed: Fri Mar 17 02:40:09 2006 UTC (18 years, 2 months ago) by root
Branch: MAIN
Changes since 1.2: +21 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #! perl
2    
3     use Scalar::Util;
4    
5     # minesweeper extension. dumb.
6    
7 root 1.3 sub result {
8     my ($ob, $status) = @_;
9    
10     if (my $teleport = $ob->{options}{"teleport_$status"}) {
11     my ($x, $y) = split /,/, $teleport;
12    
13     (cf::player::find $ob->{player})->ob->transfer ($x, $y);
14     }
15     }
16    
17 root 1.2 sub apply {
18     my ($who) = @_;
19    
20     my $meta = $who->{meta}
21     or return;
22    
23     my $map = $meta->{map};
24    
25     my ($x, $y) = ($who->x - $meta->x, $who->y - $meta->y);
26    
27     $who->{visible} = 1;
28    
29     if ($who->{bomb}) {
30 root 1.3 result $meta, "failure";
31 root 1.2 } else {
32     $meta->{todo}--;
33     # if zero, finished
34    
35     my @neigh;
36    
37     for my $y ($y - 1 .. $y + 1) {
38     next if $y < 0 || $y > $#{$map->[0]};
39     for my $x ($x - 1 .. $x + 1) {
40     next if $x < 0 || $x > $#$map;
41     push @neigh, $map->[$x][$y];
42     }
43     }
44    
45     my $bombs = grep $_->{bomb}, @neigh;
46    
47     my $ob = $map->[$x][$y] = cf::object::new "minesweeper-$bombs";
48    
49     $ob->insert_ob_in_map_at ($who->map, undef, cf::INS_ABOVE_FLOOR_ONLY,
50     $who->x, $who->y);
51    
52     push @{ $meta->{queue} }, grep !$_->{visible}, @neigh
53     unless $bombs;
54    
55     $who->remove;
56     $who->free;
57     }
58    
59     1
60     }
61    
62 root 1.1 sub on_time {
63     my ($event) = @_;
64    
65     my $who = $event->{who};
66    
67 root 1.2 if (my $queue = $who->{queue}) {
68 root 1.3 my $count = 4;
69    
70 root 1.2 while (@$queue) {
71     my $i = int rand @$queue;
72     my $ob = splice @$queue, $i, 1, ();
73    
74     next if $ob->{visible};
75    
76     apply $ob
77     or next;
78    
79 root 1.3 result $who, "success"
80     unless $who->{todo};
81    
82     $count--
83     or last;
84 root 1.2 }
85     } else {
86     # generate minesweeper field
87 root 1.1 my %arg = split /(?:\s+|=)/, $event->{options};
88    
89 root 1.3 $who->{options} = \%arg;
90 root 1.2 $who->{queue} = [];
91 root 1.1
92     my $map = $who->{map} = [];
93    
94 root 1.2 for my $x (0 .. $arg{width} - 1) {
95     for my $y (0 .. $arg{height} - 1) {
96 root 1.1 my $ob = $map->[$x][$y] = cf::object::new "minesweeper-unknown";
97 root 1.2 $ob->set_name ("apply to try your luck or intelligence");
98 root 1.1 Scalar::Util::weaken ($ob->{meta} = $who);
99    
100     my $ev = cf::object::new "event_apply";
101     $ev->set_title ("perl");
102     $ev->set_slaying ("minesweeper");
103     $ev->insert_in_ob ($ob);
104    
105 root 1.2 $ob->insert_ob_in_map_at ($who->map, undef, cf::INS_ABOVE_FLOOR_ONLY,
106     $who->x + $x, $who->y + $y);
107 root 1.1 }
108     }
109    
110 root 1.2 # #tiles that need to be uncovered
111     $who->{todo} = $arg{width} * $arg{height} - $arg{bombs};
112    
113     for (1 .. $arg{bombs}) {
114     my $x = int rand $arg{width};
115     my $y = int rand $arg{height};
116    
117     redo if $map->[$x][$y]{bomb};
118 root 1.1
119 root 1.2 $map->[$x][$y]{bomb} = 1;
120     }
121     }
122 root 1.1 }
123    
124     sub on_apply {
125     my ($event) = @_;
126    
127     my $who = $event->{who};
128 root 1.3 my $activator = $event->{activator};
129 root 1.1
130 root 1.3 $who->{meta}{player} = $activator->name;
131 root 1.2 push @{$who->{meta}{queue}}, $who;
132 root 1.1 }
133    
134