@@ -459,68 +459,6 @@ public override void Render(DrawingContext context)
459459 superEndZ = floor ;
460460 }
461461
462- // ── Ghost higher floors: draw ONE floor above current with alpha (~65%) ──
463- if ( ghostHigherFloors && floor > 0 )
464- {
465- byte upperFloor = ( byte ) ( floor - 1 ) ;
466- double ghostOffset ;
467- if ( upperFloor <= 7 )
468- ghostOffset = ( 7 - upperFloor ) * TileSize * zoom ;
469- else
470- ghostOffset = ( floor - upperFloor ) * TileSize * zoom ;
471-
472- using ( context . PushOpacity ( 0.65 ) )
473- {
474- for ( int ty = startTileY ; ty <= endTileY ; ty ++ )
475- {
476- for ( int tx = startTileX ; tx <= endTileX ; tx ++ )
477- {
478- var pos = new MapPosition ( ( ushort ) tx , ( ushort ) ty , upperFloor ) ;
479- if ( ! _mapData . Tiles . TryGetValue ( pos , out var tile ) ) continue ;
480- double baseScreenX = ( tx * TileSize - _viewX ) * zoom - ghostOffset ;
481- double baseScreenY = ( ty * TileSize - _viewY ) * zoom - ghostOffset ;
482- if ( showAsMinimap )
483- DrawMinimapTile ( context , tile , baseScreenX , baseScreenY , tilePixelSize ) ;
484- else
485- foreach ( var item in tile . Items )
486- DrawItem ( context , ResolveClientId ( item . Id ) , pos ,
487- baseScreenX , baseScreenY , zoom , 0 , 1.0 ) ;
488- }
489- }
490- }
491- }
492-
493- // ── Ghost lower floors: draw ONE floor below current with alpha (~65%) ──
494- if ( ghostLowerFloors && floor < 15 )
495- {
496- byte lowerFloor = ( byte ) ( floor + 1 ) ;
497- double ghostOffset ;
498- if ( lowerFloor <= 7 )
499- ghostOffset = ( 7 - lowerFloor ) * TileSize * zoom ;
500- else
501- ghostOffset = ( floor - lowerFloor ) * TileSize * zoom ;
502-
503- using ( context . PushOpacity ( 0.65 ) )
504- {
505- for ( int ty = startTileY ; ty <= endTileY ; ty ++ )
506- {
507- for ( int tx = startTileX ; tx <= endTileX ; tx ++ )
508- {
509- var pos = new MapPosition ( ( ushort ) tx , ( ushort ) ty , lowerFloor ) ;
510- if ( ! _mapData . Tiles . TryGetValue ( pos , out var tile ) ) continue ;
511- double baseScreenX = ( tx * TileSize - _viewX ) * zoom - ghostOffset ;
512- double baseScreenY = ( ty * TileSize - _viewY ) * zoom - ghostOffset ;
513- if ( showAsMinimap )
514- DrawMinimapTile ( context , tile , baseScreenX , baseScreenY , tilePixelSize ) ;
515- else
516- foreach ( var item in tile . Items )
517- DrawItem ( context , ResolveClientId ( item . Id ) , pos ,
518- baseScreenX , baseScreenY , zoom , 0 , 1.0 ) ;
519- }
520- }
521- }
522- }
523-
524462 // ── Multi-floor loop: render from startZ down to superEndZ ──
525463 // Reference: for(map_z = start_z; map_z >= superend_z; map_z--)
526464 // Shade is drawn ONCE when map_z reaches end_z (current floor) and start_z != end_z
@@ -643,6 +581,68 @@ public override void Render(DrawingContext context)
643581 }
644582 }
645583
584+ // ── Ghost higher floors: draw ONE floor above current with alpha (~65%) ──
585+ if ( ghostHigherFloors && floor > 0 )
586+ {
587+ byte upperFloor = ( byte ) ( floor - 1 ) ;
588+ double ghostOffset ;
589+ if ( upperFloor <= 7 )
590+ ghostOffset = ( 7 - upperFloor ) * TileSize * zoom ;
591+ else
592+ ghostOffset = ( floor - upperFloor ) * TileSize * zoom ;
593+
594+ using ( context . PushOpacity ( 0.65 ) )
595+ {
596+ for ( int ty = startTileY ; ty <= endTileY ; ty ++ )
597+ {
598+ for ( int tx = startTileX ; tx <= endTileX ; tx ++ )
599+ {
600+ var pos = new MapPosition ( ( ushort ) tx , ( ushort ) ty , upperFloor ) ;
601+ if ( ! _mapData . Tiles . TryGetValue ( pos , out var tile ) ) continue ;
602+ double baseScreenX = ( tx * TileSize - _viewX ) * zoom - ghostOffset ;
603+ double baseScreenY = ( ty * TileSize - _viewY ) * zoom - ghostOffset ;
604+ if ( showAsMinimap )
605+ DrawMinimapTile ( context , tile , baseScreenX , baseScreenY , tilePixelSize ) ;
606+ else
607+ foreach ( var item in tile . Items )
608+ DrawItem ( context , ResolveClientId ( item . Id ) , pos ,
609+ baseScreenX , baseScreenY , zoom , 0 , 1.0 ) ;
610+ }
611+ }
612+ }
613+ }
614+
615+ // ── Ghost lower floors: draw ONE floor below current with alpha (~65%) ──
616+ if ( ghostLowerFloors && floor < 15 )
617+ {
618+ byte lowerFloor = ( byte ) ( floor + 1 ) ;
619+ double ghostOffset ;
620+ if ( lowerFloor <= 7 )
621+ ghostOffset = ( 7 - lowerFloor ) * TileSize * zoom ;
622+ else
623+ ghostOffset = ( floor - lowerFloor ) * TileSize * zoom ;
624+
625+ using ( context . PushOpacity ( 0.65 ) )
626+ {
627+ for ( int ty = startTileY ; ty <= endTileY ; ty ++ )
628+ {
629+ for ( int tx = startTileX ; tx <= endTileX ; tx ++ )
630+ {
631+ var pos = new MapPosition ( ( ushort ) tx , ( ushort ) ty , lowerFloor ) ;
632+ if ( ! _mapData . Tiles . TryGetValue ( pos , out var tile ) ) continue ;
633+ double baseScreenX = ( tx * TileSize - _viewX ) * zoom - ghostOffset ;
634+ double baseScreenY = ( ty * TileSize - _viewY ) * zoom - ghostOffset ;
635+ if ( showAsMinimap )
636+ DrawMinimapTile ( context , tile , baseScreenX , baseScreenY , tilePixelSize ) ;
637+ else
638+ foreach ( var item in tile . Items )
639+ DrawItem ( context , ResolveClientId ( item . Id ) , pos ,
640+ baseScreenX , baseScreenY , zoom , 0 , 1.0 ) ;
641+ }
642+ }
643+ }
644+ }
645+
646646 // ── Tile overlays pass (drawn AFTER all items to avoid multi-tile sprites covering them) ──
647647 if ( ! showAsMinimap )
648648 {
0 commit comments