/*
 * NSEWPiece - the cross pipe piece
 *
 * by Adam Doppelt
 * http://www.cs.brown.edu/people/amd/
 */
import java.awt.*;

public class NSEWPiece extends Piece {
    static PieceType type_;

    boolean swap_;
    
    static public void SetupStatics(Component c, Image image) {
	type_ = new PieceType(c);
	for (int loop = 0; loop < SLICES; ++loop) {
            type_.x1_[loop] = WEPiece.type_.x1_[loop];
            type_.y1_[loop] = WEPiece.type_.y1_[loop];
            type_.x2_[loop] = WEPiece.type_.x2_[loop];
            type_.y2_[loop] = WEPiece.type_.y2_[loop];
	    type_.visible_[loop] = true;
	}
	type_.red_ = true;
	type_.green_ = true;
	type_.blue_ = true;
	
	type_.legalDirections_ = NORTH + SOUTH + EAST + WEST;
	type_.flipDirections_ = NORTH + WEST;
	
	if (image == null) {
	    Graphics stampG = type_.stamp_.getGraphics();
	    
	    stampG.setColor(Board.BACKGROUND);
	    stampG.fillRect(0, 0, SIZE, SIZE);
	    for (int loop = 0; loop < SLICES; ++loop)
		if (type_.visible_[loop])
		    PieceType.ShadeLine(stampG, type_.x1_[loop],
					type_.y1_[loop],
					type_.x2_[loop], type_.y2_[loop]);
	
	    for (int loop = 0; loop < SLICES; ++loop)
		if (type_.visible_[loop])
		    PieceType.ShadeLine(stampG, type_.y1_[loop],
					type_.x1_[loop],
					type_.y2_[loop], type_.x2_[loop]);

	    stampG.dispose();
	}
	else
	    type_.stamp_ = image;
    }

    public void WaterEnters(Water water) {
	if (oldDirection_ != NONE)
	    Score.CompletedCross();
	super.WaterEnters(water);
        swap_ = oldDirection_ == NORTH || oldDirection_ == SOUTH;
    }

    public void AdjustWater(Water water, int slice) {
	water.SetColor(type_.red_, type_.green_, type_.blue_,
		       (double)slice / (double)DIV_SLICES);
	if (flip_)
	    slice = DIV_SLICES - slice;
	if (type_.visible_[slice]) {
	    if (swap_)
		water.SetTileOffset(type_.y1_[slice], type_.x1_[slice],
				    type_.y2_[slice], type_.x2_[slice]);
	    else
		water.SetTileOffset(type_.x1_[slice], type_.y1_[slice],
				    type_.x2_[slice], type_.y2_[slice]);
	    water.SetVisible(true);	    
	}
	else
	    water.SetVisible(false);
    }
    
    public NSEWPiece() {
	super(type_);
    }
}
