ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/cfplus_build.ext
(Generate patch)

Comparing deliantra/server/ext/cfplus_build.ext (file contents):
Revision 1.1 by root, Fri Dec 15 19:29:18 2006 UTC vs.
Revision 1.3 by root, Mon Jun 4 12:19:08 2007 UTC

21 my ($pl, $msg) = @_; 21 my ($pl, $msg) = @_;
22 22
23 (items => { 23 (items => {
24 map { 24 map {
25 my $arch = $_; 25 my $arch = $_;
26 my $buildarch = cf::arch::find ($arch->clone->slaying); 26 my $buildarch = cf::arch::find ($arch->slaying);
27 my $h = { value => $arch->clone->value, build_arch_name => $buildarch->name }; 27 my $h = { value => $arch->value, build_arch_name => $buildarch->name };
28 28
29 if (((grep { $buildarch->clone->type == $_ } @CONNECTABLE) > 0) 29 if (((grep { $buildarch->type == $_ } @CONNECTABLE) > 0)
30 || ($buildarch->name eq 'magic_mouth' && $buildarch->clone->type == cf::SIGN)) { 30 || ($buildarch->name eq 'magic_mouth' && $buildarch->type == cf::SIGN)) {
31 $h->{has_connection} = 1; 31 $h->{has_connection} = 1;
32 } 32 }
33 33
34 if (grep { $buildarch->clone->type == $_ } @READABLE) { 34 if (grep { $buildarch->type == $_ } @READABLE) {
35 $h->{has_name} = 1; 35 $h->{has_name} = 1;
36 $h->{has_text} = 1; 36 $h->{has_text} = 1;
37 } 37 }
38 38
39 $arch->name => $h 39 $arch->name => $h
57 } 57 }
58 58
59 if ($msg->{do_erase}) { 59 if ($msg->{do_erase}) {
60 if ($pl->ob->flag (cf::FLAG_WIZ)) { 60 if ($pl->ob->flag (cf::FLAG_WIZ)) {
61 my ($top) = reverse $pl->ob->map->at ($x, $y); 61 my ($top) = reverse $pl->ob->map->at ($x, $y);
62 $top->destroy if $top; 62 $top->destroy if ($top and $top->flag (cf::FLAG_IS_BUILDABLE));
63 } else { 63 } else {
64 for my $ob ($pl->ob->map->at ($x, $y)) { 64 for my $ob ($pl->ob->map->at ($x, $y)) {
65 unless ($ob->type == cf::WALL || $ob->type == cf::FLOOR || $ob->flag (cf::FLAG_IS_FLOOR)) { 65 unless ($ob->type == cf::BUILDABLE_WALL || $ob->type == cf::FLOOR || $ob->flag (cf::FLAG_IS_FLOOR)) {
66 $ob->destroy; 66 $ob->destroy if $ob->flag (cf::FLAG_IS_BUILDABLE);
67 } 67 }
68 } 68 }
69 } 69 }
70 } 70 }
71 71
72 return unless $msg->{item}; 72 return unless $msg->{item};
73 73
74 return unless $pl->cell_visible ($dx, $dy); 74 return unless $pl->cell_visible ($dx, $dy);
75 my $arch = cf::arch::find $msg->{item}; 75 my $arch = cf::arch::find $msg->{item};
76 76
77 if ($arch->clone->subtype == cf::ST_MAT_FLOOR) { 77 if ($arch->subtype == cf::ST_MAT_FLOOR) {
78 my $above_floor; 78 my $above_floor;
79 for my $ob ($pl->ob->map->at ($x, $y)) { 79 for my $ob ($pl->ob->map->at ($x, $y)) {
80 if ($ob->type == cf::WALL) { 80 if ($ob->type == cf::BUILDABLE_WALL) {
81 undef $above_floor if $above_floor == $ob; 81 undef $above_floor if $above_floor == $ob;
82 $ob->destroy; 82 $ob->destroy;
83 } elsif ($ob->type == cf::FLOOR || $ob->flag (cf::FLAG_IS_FLOOR)) { 83 } elsif ($ob->type == cf::FLOOR || $ob->flag (cf::FLAG_IS_FLOOR)) {
84 undef $above_floor if $above_floor == $ob; 84 undef $above_floor if $above_floor == $ob;
85 $above_floor = $ob->above; 85 $above_floor = $ob->above;
86 $ob->destroy; 86 $ob->destroy;
87 } 87 }
88 } 88 }
89 89
90 my $floor = cf::object::new $arch->clone->slaying; 90 my $floor = cf::object::new $arch->slaying;
91 $floor->flag (cf::FLAG_IS_BUILDABLE, 1); 91 $floor->flag (cf::FLAG_IS_BUILDABLE, 1);
92 $floor->flag (cf::FLAG_UNIQUE, 1); 92 $floor->flag (cf::FLAG_UNIQUE, 1);
93 $floor->flag (cf::FLAG_IS_FLOOR, 1); 93 $floor->flag (cf::FLAG_IS_FLOOR, 1);
94 $floor->type (cf::FLOOR); 94 $floor->type (cf::FLOOR);
95 $floor->insert_ob_in_map_at ($pl->ob->map, $above_floor, ($above_floor ? cf::INS_BELOW_ORIGINATOR : cf::INS_ON_TOP), $x, $y); 95 $floor->insert_ob_in_map_at ($pl->ob->map, $above_floor, ($above_floor ? cf::INS_BELOW_ORIGINATOR : cf::INS_ON_TOP), $x, $y);
96 96
97 $pl->ob->map->fix_walls_around ($x, $y); 97 $pl->ob->map->fix_walls_around ($x, $y);
98 98
99 } elsif ($arch->clone->subtype == cf::ST_MAT_WALL) { 99 } elsif ($arch->subtype == cf::ST_MAT_WALL) {
100 my @obs = $pl->ob->map->at ($x, $y); 100 my @obs = $pl->ob->map->at ($x, $y);
101 my $prev_wall; 101 my $prev_wall;
102 for (@obs) { 102 for (@obs) {
103 if ($_->type == cf::WALL) { 103 if ($_->type == cf::BUILDABLE_WALL) {
104 $prev_wall = $_; 104 $prev_wall = $_;
105 last; 105 last;
106 } 106 }
107 } 107 }
108 108
113 my $above_floor = $floor->above; 113 my $above_floor = $floor->above;
114 if ($above_floor) { 114 if ($above_floor) {
115 return; 115 return;
116 } 116 }
117 117
118 my $wall = cf::object::new $arch->clone->slaying; 118 my $wall = cf::object::new $arch->slaying;
119 $wall->type (cf::WALL); 119 $wall->type (cf::BUILDABLE_WALL);
120 $wall->flag (cf::FLAG_IS_BUILDABLE, 1); 120 $wall->flag (cf::FLAG_IS_BUILDABLE, 1);
121 $wall->insert_ob_in_map_at ($pl->ob->map, undef, cf::INS_ABOVE_FLOOR_ONLY, $x, $y); 121 $wall->insert_ob_in_map_at ($pl->ob->map, undef, cf::INS_ABOVE_FLOOR_ONLY, $x, $y);
122 if ($prev_wall) { 122 if ($prev_wall) {
123 $prev_wall->destroy; 123 $prev_wall->destroy;
124 $pl->ob->map->fix_walls ($pl->ob->x + $dx, $pl->ob->y + $dy); 124 $pl->ob->map->fix_walls ($pl->ob->x + $dx, $pl->ob->y + $dy);
125 } else { 125 } else {
126 $pl->ob->map->fix_walls_around ($pl->ob->x + $dx, $pl->ob->y + $dy); 126 $pl->ob->map->fix_walls_around ($pl->ob->x + $dx, $pl->ob->y + $dy);
127 } 127 }
128 128
129 } elsif ($arch->clone->subtype == cf::ST_MAT_ITEM) { 129 } elsif ($arch->subtype == cf::ST_MAT_ITEM) {
130 my ($floor) = 130 my ($floor) =
131 grep { $_->type == cf::FLOOR || $_->flag (cf::FLAG_IS_FLOOR) } 131 grep { $_->type == cf::FLOOR || $_->flag (cf::FLAG_IS_FLOOR) }
132 $pl->ob->map->at ($x, $y); 132 $pl->ob->map->at ($x, $y);
133 133
134 unless ($floor) { 134 unless ($floor) {
137 137
138 if ($floor->above) { 138 if ($floor->above) {
139 return; 139 return;
140 } 140 }
141 141
142 my $ob = cf::object::new $arch->clone->slaying; 142 my $ob = cf::object::new $arch->slaying;
143 $ob->flag (cf::FLAG_IS_BUILDABLE, 1); 143 $ob->flag (cf::FLAG_IS_BUILDABLE, 1);
144 $ob->flag (cf::FLAG_NO_PICK, 1); 144 $ob->flag (cf::FLAG_NO_PICK, 1);
145 $ob->insert_ob_in_map_at ($pl->ob->map, undef, cf::INS_ABOVE_FLOOR_ONLY, $x, $y); 145 $ob->insert_ob_in_map_at ($pl->ob->map, undef, cf::INS_ABOVE_FLOOR_ONLY, $x, $y);
146 146
147 if (defined $msg->{connection}) { 147 if (defined $msg->{connection}) {
159 $ob->invisible (0); 159 $ob->invisible (0);
160 } 160 }
161 } 161 }
162}; 162};
163 163
164my $farch = cf::arch::first; 164for (0 .. cf::arch::archetypes_size - 1) {
165while ($farch) { 165 my $farch = cf::arch::archetypes $_;
166
166 if ($farch->clone->type == cf::MATERIAL) { 167 if ($farch->type == cf::MATERIAL) {
167 if (cf::arch::find $farch->clone->slaying) { 168 if (cf::arch::find $farch->slaying) {
168 $materials{$farch->name} = $farch; 169 $materials{$farch->name} = $farch;
169 } else { 170 } else {
170 warn "Undefined build archetype '".($farch->clone->slaying)."' for build material '".($farch->name)."'\n"; 171 warn "Undefined build archetype '" . $farch->slaying . "' for build material '" . $farch->name . "'\n";
171 } 172 }
172 } 173 }
173 $farch = $farch->next;
174} 174}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines