5180 fichiers 38.5 Mo 0 téléchargements 274 vues mis à jour il y a 6 heures ui
types.ts 2.8 Ko Télécharger le fichier
// `blocked` = void tile (no floor, serialized as 'x'). `occupied` = a tile that
// currently has furniture on it (reported by the server); kept separate so it
// stays visible and is NOT voided on save — it can't be edited unless
// `pickUpBlocking` is on, in which case the save picks that furniture up.
export type Tile = { h: number; blocked: boolean; occupied?: boolean };

export type EntryDir = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
export type ThicknessLevel = 0 | 1 | 2 | 3;

export type Door = { x: number; y: number; dir: EntryDir };

export type FloorActionMode = 'SET' | 'UNSET' | 'UP' | 'DOWN' | 'DOOR';

export type Brush = { h: number; action: FloorActionMode };

export type Selection = ReadonlySet<`${number},${number}`>;

export type Lease = {
    holder: number | null;
    me: boolean;
    expiresAt: number | null;
};

export type FloorplanState = {
    tiles: Tile[][];
    door: Door;
    thickness: { wall: ThicknessLevel; floor: ThicknessLevel };
    wallHeight: number;
    brush: Brush;
    selection: Selection;
    squareSelect: boolean;
    pickUpBlocking: boolean;
    lease: Lease;
    seq: number;
};

export type LocalSource = 'local' | 'remote';

export type FloorplanAction =
    | { type: 'PAINT_TILE'; row: number; col: number; h: number; source: LocalSource }
    | { type: 'ERASE_TILE'; row: number; col: number; source: LocalSource }
    | { type: 'ADJUST_HEIGHT'; row: number; col: number; delta: 1 | -1; source: LocalSource }
    | { type: 'SET_DOOR'; x: number; y: number; source: LocalSource }
    | { type: 'SET_DOOR_DIR'; dir: EntryDir; source: LocalSource }
    | { type: 'SET_THICKNESS'; wall?: ThicknessLevel; floor?: ThicknessLevel; source: LocalSource }
    | { type: 'SET_WALL_HEIGHT'; value: number; source: LocalSource }
    | { type: 'SET_OCCUPIED_TILES'; map: boolean[][] }
    | { type: 'BRUSH_SET'; h?: number; action?: FloorActionMode }
    | { type: 'SELECT_RECT'; from: [number, number]; to: [number, number] }
    | { type: 'SELECT_ALL' }
    | { type: 'CLEAR_SELECTION' }
    | { type: 'APPLY_BRUSH_TO_SELECTION'; source: LocalSource }
    | { type: 'SQUARE_SELECT_TOGGLE' }
    | { type: 'SET_PICK_UP_BLOCKING'; value: boolean }
    | { type: 'IMPORT_STRING'; raw: string; door?: Door; thickness?: { wall: ThicknessLevel; floor: ThicknessLevel }; wallHeight?: number; source: LocalSource }
    | {
          type: 'APPLY_REMOTE_DIFF';
          diff: {
              tiles?: Array<{ row: number; col: number; h: number; blocked: boolean }>;
              door?: Door;
              thickness?: { wall: ThicknessLevel; floor: ThicknessLevel };
              wallHeight?: number;
          };
          seq: number;
          editorUserId: number;
      }
    | { type: 'APPLY_REMOTE_SNAPSHOT'; raw: string; door: Door; thickness: { wall: ThicknessLevel; floor: ThicknessLevel }; wallHeight: number; seq: number };
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser