ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/perl/cfplus_build.ext
Revision: 1.1
Committed: Mon Dec 4 15:15:08 2006 UTC (17 years, 5 months ago) by elmex
Branch: MAIN
Log Message:
added builder ui extension

File Contents

# Content
1 #!perl
2
3 our %materials;
4
5 $cf::CFG{"editor_builder_ui"}
6 or return;
7
8 cf::register_extcmd builder_player_items => sub {
9 my ($pl, $msg) = @_;
10
11 # my @builditems = ext::reseller::find_rec ($pl->ob, sub {
12 # my ($item) = @_;
13 # return $item->type == cf::MATERIAL
14 # });
15
16 (items => { map { $_->name => { value => $_->clone->value } } values %materials })
17 };
18
19 cf::register_extcmd builder_build => sub {
20 my ($pl, $msg) = @_;
21 my ($dx, $dy) = @$msg{qw(dx dy)};
22 my ($x, $y) = ($pl->ob->x + $dx, $pl->ob->y + $dy);
23
24 my $near = (abs $dx) <= 2 && (abs $dy) <= 2;
25
26 return unless $near;
27
28 my $buildable = 0;
29
30 for ($pl->ob->map->at ($x, $y)) {
31 unless ($_->flag (cf::FLAG_IS_BUILDABLE)) {
32 return;
33 }
34 }
35
36 if ($msg->{do_erase}) {
37 for my $ob ($pl->ob->map->at ($x, $y)) {
38 unless ($ob->type == cf::WALL || $ob->type == cf::FLOOR || $ob->flag (cf::FLAG_IS_FLOOR)) {
39 $ob->remove;
40 $ob->free;
41 }
42 }
43 }
44
45 return unless $msg->{item};
46
47 if ($pl->cell_visible ($dx, $dy)) {
48 my $arch = cf::arch::find $msg->{item};
49
50 if ($arch->clone->subtype == cf::ST_MAT_FLOOR) {
51 my $above_floor;
52 for my $ob ($pl->ob->map->at ($x, $y)) {
53 if ($ob->type == cf::WALL) {
54 undef $above_floor if $above_floor == $ob;
55 $ob->remove;
56 $ob->free;
57 } elsif ($ob->type == cf::FLOOR || $ob->flag (cf::FLAG_IS_FLOOR)) {
58 undef $above_floor if $above_floor == $ob;
59 $above_floor = $ob->above;
60 $ob->remove;
61 $ob->free;
62 }
63 }
64
65 # my @obs = $pl->ob->map->at ($x, $y);
66 # for (@obs) { $_->remove; $_->free }
67
68 my $floor = cf::object::new $arch->clone->slaying;
69 $floor->flag (cf::FLAG_IS_BUILDABLE, 1);
70 $floor->flag (cf::FLAG_UNIQUE, 1);
71 $floor->flag (cf::FLAG_IS_FLOOR, 1);
72 $floor->type (cf::FLOOR);
73 $floor->insert_ob_in_map_at ($pl->ob->map, $above_floor, ($above_floor ? cf::INS_BELOW_ORIGINATOR : cf::INS_ON_TOP), $x, $y);
74
75 $pl->ob->map->fix_walls_around ($x, $y);
76
77 } elsif ($arch->clone->subtype == cf::ST_MAT_WALL) {
78 my @obs = $pl->ob->map->at ($x, $y);
79 my $prev_wall;
80 for (@obs) {
81 if ($_->type == cf::WALL) {
82 $prev_wall = $_;
83 last;
84 }
85 }
86
87 my ($floor) =
88 grep { $_->type == cf::FLOOR || $_->flag (cf::FLAG_IS_FLOOR) }
89 $pl->ob->map->at ($x, $y);
90
91 my $above_floor = $floor->above;
92 if ($above_floor) {
93 return;
94 }
95
96 my $wall = cf::object::new $arch->clone->slaying;
97 $wall->type (cf::WALL);
98 $wall->flag (cf::FLAG_IS_BUILDABLE, 1);
99 $wall->insert_ob_in_map_at ($pl->ob->map, undef, cf::INS_ABOVE_FLOOR_ONLY, $x, $y);
100 if ($prev_wall) {
101 $prev_wall->remove;
102 $prev_wall->free;
103 $pl->ob->map->fix_walls ($pl->ob->x + $dx, $pl->ob->y + $dy);
104 } else {
105 $pl->ob->map->fix_walls_around ($pl->ob->x + $dx, $pl->ob->y + $dy);
106 }
107
108 } elsif ($arch->clone->subtype == cf::ST_MAT_ITEM) {
109 my ($floor) =
110 grep { $_->type == cf::FLOOR || $_->flag (cf::FLAG_IS_FLOOR) }
111 $pl->ob->map->at ($x, $y);
112
113 unless ($floor) {
114 return;
115 }
116
117 my $above_floor = $floor->above;
118 if ($above_floor) {
119 return;
120 }
121
122 my $ob = cf::object::new $arch->clone->slaying;
123 $ob->flag (cf::FLAG_IS_BUILDABLE, 1);
124 $ob->flag (cf::FLAG_NO_PICK, 1);
125 $ob->insert_ob_in_map_at ($pl->ob->map, undef, cf::INS_ABOVE_FLOOR_ONLY, $x, $y);
126 }
127 }
128
129 # my $arch = cf::arch::find ($msg->{item});
130 };
131
132 my $farch = cf::arch::first;
133 while ($farch) {
134 if ($farch->clone->type == cf::MATERIAL) {
135 $materials{$farch->name} = $farch;
136 }
137 $farch = $farch->next;
138 }