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

Comparing deliantra/server/ext/map-world.ext (file contents):
Revision 1.11 by root, Sun Feb 11 01:38:47 2007 UTC vs.
Revision 1.21 by root, Tue Apr 17 20:41:15 2007 UTC

41 eval { 41 eval {
42 open my $fh, "convert \Q$path.png\E -depth 8 rgb:- |" 42 open my $fh, "convert \Q$path.png\E -depth 8 rgb:- |"
43 or die "convert: $!"; 43 or die "convert: $!";
44 binmode $fh; 44 binmode $fh;
45 45
46 binmode $fh;
47 $size * 3 == read $fh, my $data, $size * 3 46 $size * 3 == read $fh, my $data, $size * 3
48 or die "$path.png, expected $size rgb triplets: $!"; 47 or die "$path.png, expected $size rgb triplets: $!";
49 48
50 $data =~ s{(...)}{ 49 cf::_quantise $data, [map "$_$plt{$_}", keys %plt];
51 $plt{$1} or die "$path.png: color not in palette: #" . unpack "H*", $1
52 }sge;
53 50
54 binmode STDOUT; 51 binmode STDOUT;
55 syswrite STDOUT, $data; 52 syswrite STDOUT, $data;
56 }; 53 };
57 warn $@ if $@; 54 warn $@ if $@;
67} 64}
68 65
69sub load_gridmap($) { 66sub load_gridmap($) {
70 my ($path) = @_; 67 my ($path) = @_;
71 68
72 if (! -e "/tmp/xxxx.gridmap") { 69# if (! -e "/tmp/xxxx.gridmap") {
73 0 < aio_load "$path/gridmap.meta", my $map 70 0 < aio_load "$path/gridmap.meta", my $map
74 or cf::cleanup "$path/gridmap.meta: $!\n"; 71 or cf::cleanup "$path/gridmap.meta: $!\n";
75 72
76 $map = cf::from_json $map; 73 $map = cf::from_json $map;
77 74
79 or cf::cleanup "$path/gridmap.meta: empty gridmap?"; 76 or cf::cleanup "$path/gridmap.meta: empty gridmap?";
80 77
81 ($map->{arc_data}, $map->{arc_plt}) = load_indexed "$path/gridmap.arch", $size; 78 ($map->{arc_data}, $map->{arc_plt}) = load_indexed "$path/gridmap.arch", $size;
82 ($map->{reg_data}, $map->{reg_plt}) = load_indexed "$path/gridmap.regn", $size; 79 ($map->{reg_data}, $map->{reg_plt}) = load_indexed "$path/gridmap.regn", $size;
83 80
84 Storable::nstore $map, "/tmp/xxxx.gridmap";#d# 81# Storable::nstore $map, "/tmp/xxxx.gridmap" if 0;#d#
85 82
86 $map 83 $map
87 } else { 84# } else {
88 Storable::retrieve "/tmp/xxxx.gridmap"; 85# Storable::retrieve "/tmp/xxxx.gridmap";
89 } 86# }
90} 87}
91 88
92# this is contorted, but likely the correct way to acquire the lock :) 89# this is contorted, but likely the correct way to acquire the lock :)
93cf::sync_job { 90cf::sync_job {
94 my $guard = cf::lock_acquire "ext::world_gridmap"; 91 my $guard = cf::lock_acquire "ext::world_gridmap";
118 $self->height ($WORLD->{tile_h}); 115 $self->height ($WORLD->{tile_h});
119 116
120 $self->name ("'The World' at +$x+$y"); 117 $self->name ("'The World' at +$x+$y");
121 $self->msg ("worldmap dynamically created by map-world extension"); 118 $self->msg ("worldmap dynamically created by map-world extension");
122 $self->outdoor (1); 119 $self->outdoor (1);
123 $self->default_region (undef); 120 $self->default_region (cf::region::find "wilderness");
124 121
125# $self->tile_path (0, sprintf "/world/world_%03d_%03d", $x, $y - 1) if $y > 0; 122 $self->tile_path (0, sprintf "/world/world_%03d_%03d", $x, $y - 1) if $y > 0;
126# $self->tile_path (1, sprintf "/world/world_%03d_%03d", $x + 1, $y) if $x < 999; 123 $self->tile_path (1, sprintf "/world/world_%03d_%03d", $x + 1, $y) if $x < 999;
127# $self->tile_path (2, sprintf "/world/world_%03d_%03d", $x, $y + 1) if $y < 999; 124 $self->tile_path (2, sprintf "/world/world_%03d_%03d", $x, $y + 1) if $y < 999;
128# $self->tile_path (3, sprintf "/world/world_%03d_%03d", $x - 1, $y) if $x > 0; 125 $self->tile_path (3, sprintf "/world/world_%03d_%03d", $x - 1, $y) if $x > 0;
129 $self->tile_path (0, sprintf "/world/world_%03d_%03d", $x, $y - 1) if $y > 100;
130 $self->tile_path (1, sprintf "/world/world_%03d_%03d", $x + 1, $y) if $x < 129;
131 $self->tile_path (2, sprintf "/world/world_%03d_%03d", $x, $y + 1) if $y < 129;
132 $self->tile_path (3, sprintf "/world/world_%03d_%03d", $x - 1, $y) if $x > 100;
133 126
134 $self->{load_path} = sprintf "%s/%s/world-overlay/world_%03d_%03d", cf::datadir, cf::mapdir, $x, $y 127 $self->{load_path} = sprintf "%s/%s/world-overlay/world_%03d_%03d.map", cf::datadir, cf::mapdir, $x, $y
135 if $x >= 100 && $x <= 129 && $y >= 100 && $y <= 129; 128 if $x >= 100 && $x <= 129 && $y >= 100 && $y <= 129;
136 129
137 1 130 1
131}
132
133sub fill {
134 my ($self) = @_;
135
136 $self->add_underlay ("\x00" x ($WORLD->{tile_w} * $WORLD->{tile_h}), 0, $WORLD->{tile_w}, $WORLD->{arc_plt});
137 $self->default_region (cf::region::find $WORLD->{reg_plt}[0]);
138} 138}
139 139
140sub load { 140sub load {
141 my ($self) = @_; 141 my ($self) = @_;
142 142
143 if ($self->{load_path}) { 143 if ($self->{load_path}) {
144 $self->SUPER::load; 144 $self->SUPER::load;
145 } else { 145 } else {
146 $self->alloc; 146 $self->alloc;
147 147 $self->fill;
148 for my $X (0 .. $WORLD->{tile_w} - 1) {
149 Coro::cede;
150 for my $Y (0 .. $WORLD->{tile_h} - 1) {
151 my $ob = cf::object::new "deep_sea";
152 $self->insert ($ob, $X, $Y);
153 }
154 }
155 $self->set_object_flag (cf::FLAG_NO_MAP_SAVE, 1);
156 $self->default_region (cf::region::find "ocean");
157
158 $self->in_memory (cf::MAP_IN_MEMORY); 148 $self->in_memory (cf::MAP_IN_MEMORY);
159 } 149 }
160} 150}
161 151
162sub post_load { 152sub post_load {
164 154
165 my $guard = cf::lock_acquire "ext::world_gridmap"; 155 my $guard = cf::lock_acquire "ext::world_gridmap";
166 156
167 my ($x, $y) = $self->wxwy; 157 my ($x, $y) = $self->wxwy;
168 158
169 return
170 unless $x >= 100 && $x <= 129 && $y >= 100 && $y <= 129; 159 if ($x >= 100 && $x <= 129 && $y >= 100 && $y <= 129) {
160 my $stride = $WORLD->{grid_w} * $WORLD->{tile_w};
161 my $top = ($y - 100) * $WORLD->{tile_h} * $stride
162 + ($x - 100) * $WORLD->{tile_w};
171 163
172 my $stride = $WORLD->{grid_w} * $WORLD->{tile_w}; 164 $self->add_underlay ($WORLD->{arc_data}, $top, $stride, $WORLD->{arc_plt});
173 my $top = ($y - 100) * $WORLD->{tile_h} * $stride 165 $self->set_regiondata ($WORLD->{reg_data}, $top, $stride, $WORLD->{reg_plt});
174 + ($x - 100) * $WORLD->{tile_w};
175 166
176 my $reg; 167 } else {
177 168 $self->fill;
178 for my $Y (0 .. $WORLD->{tile_h} - 1) {
179 Coro::cede;
180 my $row = substr $WORLD->{arc_data}, $top + $Y * $stride, $WORLD->{tile_w};
181 $reg .= substr $WORLD->{reg_data}, $top + $Y * $stride, $WORLD->{tile_w};
182 for my $X (0 .. $WORLD->{tile_w} - 1) {
183 next if grep $_->flag (cf::FLAG_IS_FLOOR), $self->at ($X, $Y);
184 my $ob = cf::object::new $WORLD->{arc_plt}[ord substr $row, $X];
185 $ob->flag (cf::FLAG_NO_MAP_SAVE, 1);
186 $self->insert ($ob, $X, $Y, undef, cf::INS_ABOVE_FLOOR_ONLY);
187 }
188 } 169 }
189
190 $self->set_regiondata ($reg, $WORLD->{reg_plt});
191} 170}
192 171
1931 1721
194 173

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines