package action import ( "go.uber.org/zap/zapcore" "hexmap-server/state" ) const ( CellColorType SyncableType = "CELL_COLOR" ) // CellColor is the action sent when a cell of the map has been colored a different color. type CellColor struct { // At is the location of the cell in storage coordinates. At state.StorageCoordinates `json:"at"` // Color is the color the cell has been changed to. Color state.HexColor `json:"color"` } func (c CellColor) MarshalLogObject(encoder zapcore.ObjectEncoder) error { encoder.AddString("type", string(CellColorType)) err := encoder.AddObject("at", c.At) encoder.AddString("color", c.Color.String()) return err } func (c CellColor) Type() SyncableType { return CellColorType } // Apply sets the target cell's color, or returns ErrNoOp if it can't. func (c CellColor) Apply(s *state.Synced) error { if c.Color.A < 0xF { return ErrNoTransparentColors } cell, err := s.Map.LineCells.GetCellAt(c.At) if err != nil { return err } if cell.Color == c.Color { return ErrNoOp } cell.Color = c.Color return nil }