… | |
… | |
21 | update_stack_view => { return_type => undef, param_types => [Glib::Int, Glib::Int, Glib::Scalar] }, |
21 | update_stack_view => { return_type => undef, param_types => [Glib::Int, Glib::Int, Glib::Scalar] }, |
22 | }; |
22 | }; |
23 | |
23 | |
24 | use strict; |
24 | use strict; |
25 | |
25 | |
26 | |
|
|
27 | sub delete_arch { |
26 | sub delete_arch { |
28 | my ($self, $x, $y) = @_; |
27 | my ($self, $x, $y) = @_; |
29 | |
28 | |
30 | return 0 unless |
29 | return 0 unless |
31 | defined $self->{map}; |
30 | defined $self->{map}; |
32 | |
31 | |
33 | my ($mx, $my) = $self->{map}->coord ($x, $y); |
|
|
34 | my $s = map_pop_tile_stack ($self->{map}, $mx, $my); |
32 | my $s = map_pop_tile_stack ($self->{map}, $x, $y); |
35 | $self->{map}->update_map ($mx, $my, 1, 1); |
33 | $self->{map}->update_map ($x, $y, 1, 1); |
36 | } |
34 | } |
37 | |
|
|
38 | |
35 | |
39 | sub get_top_arch { |
36 | sub get_top_arch { |
40 | my ($self, $x, $y) = @_; |
37 | my ($self, $x, $y) = @_; |
41 | |
38 | |
42 | return 0 unless |
39 | return 0 unless |
… | |
… | |
50 | |
47 | |
51 | return 0 unless |
48 | return 0 unless |
52 | defined $self->{map} |
49 | defined $self->{map} |
53 | and defined $self->{pick_arch}; |
50 | and defined $self->{pick_arch}; |
54 | |
51 | |
55 | my ($mx, $my) = $self->{map}->coord ($x, $y); |
|
|
56 | my $s = map_get_tile_stack ($self->{map}, $mx, $my); |
52 | my $s = map_get_tile_stack ($self->{map}, $x, $y); |
57 | my $top = $s->[-1]; |
53 | my $top = $s->[-1]; |
58 | my $arch = { _name => $self->{pick_arch}->{_name} }; |
54 | my $arch = { _name => $self->{pick_arch}->{_name} }; |
59 | |
55 | |
60 | if ($top->{_name} ne $arch->{_name}) { |
56 | if ($top->{_name} ne $arch->{_name}) { |
61 | map_push_tile_stack ($self->{map}, $mx, $my, $arch); |
57 | map_push_tile_stack ($self->{map}, $x, $y, $arch); |
62 | } |
58 | } |
63 | |
59 | |
64 | $self->{map}->update_map ($mx, $my, 1, 1); |
60 | $self->{map}->update_map ($x, $y, 1, 1); |
65 | } |
61 | } |
66 | |
62 | |
67 | sub INIT_INSTANCE { |
63 | sub INIT_INSTANCE { |
68 | my ($self) = @_; |
64 | my ($self) = @_; |
69 | |
65 | |
… | |
… | |
141 | # XXX:load $ARGV _cleanly_? |
137 | # XXX:load $ARGV _cleanly_? |
142 | my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3"; |
138 | my $path = $ARGV[0] || "$Crossfire::LIB/maps/dragonisland/advguild3"; |
143 | $map->set_map (arch2map read_arch $path); |
139 | $map->set_map (arch2map read_arch $path); |
144 | $self->{map} = $map; |
140 | $self->{map} = $map; |
145 | |
141 | |
146 | |
|
|
147 | $map->signal_connect (button_press_event => sub { |
142 | $map->signal_connect (button_press_event => sub { |
148 | my ($mself, $event) = @_; |
143 | my ($map, $event) = @_; |
149 | return 0 unless defined $self->{map}; |
144 | |
|
|
145 | my ($x, $y) = $map->coord ($event->x, $event->y); |
150 | |
146 | |
151 | if ($event->button == 1) { |
147 | if ($event->button == 1) { |
|
|
148 | $map->disable_tooltip unless $self->{draw_mode}; |
152 | $self->{draw_mode} = 1; |
149 | $self->{draw_mode} = [1, $x, $y]; |
|
|
150 | $self->place_pick ($x, $y); |
153 | return 1; |
151 | return 1; |
154 | |
152 | |
155 | } elsif ($event->button == 3) { |
153 | } elsif ($event->button == 3) { |
|
|
154 | $map->disable_tooltip unless $self->{draw_mode}; |
156 | $self->{draw_mode} = 2; |
155 | $self->{draw_mode} = [2, $x, $y]; |
|
|
156 | $self->delete_arch ($x, $y); |
157 | return 1; |
157 | return 1; |
158 | } |
158 | } |
159 | |
159 | |
160 | 0 |
160 | 0 |
161 | }); |
161 | }); |
162 | |
162 | |
163 | $map->signal_connect (motion_notify_event => sub { |
163 | $map->signal_connect_after (motion_notify_event => sub { |
164 | my ($mself, $event) = @_; |
164 | my ($map, $event) = @_; |
165 | |
165 | |
|
|
166 | return unless $self->{draw_mode}; |
|
|
167 | |
|
|
168 | my ($x, $y) = $map->coord ($map->get_pointer); |
|
|
169 | |
|
|
170 | return if $x == $self->{draw_mode}[1] |
|
|
171 | && $y == $self->{draw_mode}[2]; |
|
|
172 | |
|
|
173 | @{$self->{draw_mode}}[1,2] = ($x, $y); |
|
|
174 | |
166 | if ($self->{draw_mode} == 1) { |
175 | if ($self->{draw_mode}[0] == 1) { |
167 | $self->place_pick ($event->x, $event->y); |
176 | $self->place_pick ($x, $y); |
168 | |
|
|
169 | return 1; |
177 | return 1; |
|
|
178 | |
170 | } elsif ($self->{draw_mode} == 2) { |
179 | } elsif ($self->{draw_mode}[0] == 2) { |
171 | $self->delete_arch ($event->x, $event->y); |
180 | $self->delete_arch ($x, $y); |
172 | |
|
|
173 | return 1; |
181 | return 1; |
|
|
182 | |
174 | } |
183 | } |
|
|
184 | |
|
|
185 | 0 |
175 | }); |
186 | }); |
|
|
187 | |
176 | $self->signal_connect (button_release_event => sub { |
188 | $map->signal_connect (button_release_event => sub { |
177 | my ($mself, $event) = @_; |
189 | my ($map, $event) = @_; |
178 | |
190 | |
179 | delete $self->{draw_mode}; |
191 | $map->enable_tooltip if delete $self->{draw_mode}; |
|
|
192 | |
180 | if ($event->button == 1 && $event->state * "shift-mask") { |
193 | if ($event->button == 1 && $event->state * "shift-mask") { |
181 | return 0 unless defined $self->{attr_edit}; |
194 | return 0 unless defined $self->{attr_edit}; |
182 | $self->{attr_edit}->set_arch ($self->get_top_arch ($event->x, $event->y)); |
195 | $self->{attr_edit}->set_arch ($self->get_top_arch ($event->x, $event->y)); |
183 | return 1; |
196 | return 1; |
184 | } elsif ($event->button == 1) { |
|
|
185 | $self->place_pick ($event->x, $event->y); |
|
|
186 | return 1; |
|
|
187 | |
|
|
188 | } elsif ($event->button == 3) { |
|
|
189 | $self->delete_arch ($event->x, $event->y); |
|
|
190 | return 1; |
|
|
191 | } |
197 | } |
192 | }); |
|
|
193 | |
198 | |
194 | |
199 | 0 |
|
|
200 | }); |
195 | |
201 | |
196 | $vb->pack_start ($map, 1, 1, 0); |
202 | $vb->pack_start ($map, 1, 1, 0); |
197 | } |
203 | } |
198 | |
204 | |
199 | sub new_cb { |
205 | sub new_cb { |