11use crate :: dungeon:: door:: DoorType ;
2+ use crate :: dungeon:: dungeon:: Dungeon ;
23use crate :: dungeon:: room:: room:: Room ;
34use crate :: dungeon:: room:: room_data:: { RoomData , RoomShape , RoomType :: * } ;
45use crate :: server:: block:: block_parameter:: Axis ;
@@ -121,60 +122,63 @@ impl DungeonMap {
121122 }
122123 }
123124 }
124-
125- pub fn draw_room ( & mut self , room : & Room ) {
126-
125+
126+ pub fn draw_room ( dungeon : & mut Dungeon , room : usize ) {
127+ let room = & dungeon. rooms [ room] ;
128+ let map = & mut dungeon. map ;
127129 let color = get_room_color ( & room. room_data ) ;
128-
130+
129131 for segment in room. segments . iter ( ) {
130132 let x = segment. x * 20 ;
131133 let y = segment. z * 20 ;
132-
133- self . fill_px ( x, y, 16 , 16 , color) ;
134-
134+
135+ map. fill_px ( x, y, 16 , 16 , color) ;
135136 if room. segments . iter ( ) . find ( |seg| seg. x == segment. x + 1 && seg. z == segment. z ) . is_some ( ) {
136- self . fill_px ( x + 16 , y, 4 , 16 , color) ;
137+ map . fill_px ( x + 16 , y, 4 , 16 , color) ;
137138 }
138139 if room. segments . iter ( ) . find ( |seg| seg. x == segment. x && seg. z == segment. z + 1 ) . is_some ( ) {
139- self . fill_px ( x, y + 16 , 16 , 4 , color) ;
140+ map . fill_px ( x, y + 16 , 16 , 4 , color) ;
140141 }
141-
142+
142143 for ( index, neighbour) in segment. neighbours . iter ( ) . enumerate ( ) {
143144 if neighbour. is_none ( ) {
144145 continue ;
145146 }
146- let ( neighbour, door) = {
147+
148+ let ( neighbour_room, door) = {
147149 let neighbour = neighbour. as_ref ( ) . unwrap ( ) ;
148- ( neighbour. room . borrow ( ) , neighbour. door . borrow ( ) )
150+ let room = dungeon. rooms . get ( neighbour. room_index ) . unwrap ( ) ;
151+ let door = dungeon. doors . get ( neighbour. door_index ) . unwrap ( ) ;
152+ ( room, door)
149153 } ;
150-
154+
151155 let mut x = segment. x * 20 + 6 ;
152156 let mut y = segment. z * 20 + 6 ;
153-
157+
154158 match index {
155159 0 => y -= 10 ,
156160 1 => x += 10 ,
157161 2 => y += 10 ,
158162 3 => x -= 10 ,
159163 _ => unreachable ! ( )
160164 }
161-
165+
162166 let ( width, height) = match door. direction {
163167 Axis :: X => ( 4 , 5 ) ,
164168 Axis :: Z => ( 5 , 4 ) ,
165169 _ => unreachable ! ( )
166170 } ;
167-
168- if neighbour . entered {
169- let color = get_door_color ( room, & * neighbour ) ;
170- self . fill_px ( x, y, width, height, color) ;
171+
172+ if neighbour_room . entered {
173+ let color = get_door_color ( room, & * neighbour_room ) ;
174+ map . fill_px ( x, y, width, height, color) ;
171175 } else {
172176 let color = match door. door_type {
173177 DoorType :: WITHER => BLACK ,
174178 DoorType :: BLOOD => RED ,
175179 _ => GRAY ,
176180 } ;
177- self . fill_px ( x, y, width, height, color) ;
181+ map . fill_px ( x, y, width, height, color) ;
178182
179183 let mut x = segment. x * 20 ;
180184 let mut y = segment. z * 20 ;
@@ -187,28 +191,28 @@ impl DungeonMap {
187191 _ => unreachable ! ( )
188192 }
189193
190- self . fill_px ( x , y, 16 , 16 , GRAY ) ;
194+ map . fill_px ( x , y, 16 , 16 , GRAY ) ;
191195
192196 for ( qx, qy) in QUESTION_MARK_POSITIONS {
193- self . set_px ( x + qx + 5 , y + qy + 5 , BLACK ) ;
197+ map . set_px ( x + qx + 5 , y + qy + 5 , BLACK ) ;
194198 }
195199 }
196- }
200+ }
197201 }
198-
202+
199203 // fill in hole
200204 if room. room_data . shape == RoomShape :: TwoByTwo {
201205 let x = room. segments [ 0 ] . x * 20 + 16 ;
202206 let y = room. segments [ 0 ] . z * 20 + 16 ;
203- self . fill_px ( x, y, 4 , 4 , color)
207+ map . fill_px ( x, y, 4 , 4 , color)
204208 }
205209
206210 {
207211 let x = room. segments [ 0 ] . x * 20 + 4 ;
208212 let y = room. segments [ 0 ] . z * 20 + 4 ;
209213
210214 for ( cx, cy) in CHECKMARK_POSITIONS {
211- self . set_px ( x + cx, y + cy, GREEN )
215+ map . set_px ( x + cx, y + cy, GREEN )
212216 }
213217 }
214218 }
0 commit comments