+ boolean prefix_found = FALSE;
+ boolean start_new_row = FALSE;
+
+ // level sketch element number prefixes (may be multi-byte characters)
+ char *prefix_list[] = { "`", "¸" };
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(prefix_list); i++)
+ {
+ char *prefix = prefix_list[i];
+
+ // check if string is large enough for prefix
+ if (strlen(ptr) < strlen(prefix))
+ {
+ stop = TRUE;
+
+ break;
+ }
+
+ // check if string starts with prefix
+ if (strPrefix(ptr, prefix))
+ {
+ ptr += strlen(prefix);
+
+ prefix_found = TRUE;
+
+ break;
+ }
+ }
+
+ // check if prefix found and followed by (at least) three digits
+ if (prefix_found &&
+ strlen(ptr) >= 3 &&
+ ptr[0] >= '0' && ptr[0] <= '9' &&
+ ptr[1] >= '0' && ptr[1] <= '9' &&
+ ptr[2] >= '0' && ptr[2] <= '9')
+ {
+ int element = ((ptr[0] - '0') * 100 +
+ (ptr[1] - '0') * 10 +
+ (ptr[2] - '0'));
+
+ ptr += 3;
+
+ // level sketch element number might consist of four digits
+ if (ptr[0] >= '0' && ptr[0] <= '9')
+ {
+ element = element * 10 + (ptr[0] - '0');
+ ptr++;
+ }
+
+ // remap some (historic, now obsolete) elements
+ element = getMappedElement(element);
+
+ if (element >= NUM_FILE_ELEMENTS)
+ element = EL_UNKNOWN;
+
+ brush_buffer[x][y] = element;
+
+ brush_width = MAX(x + 1, brush_width);
+ brush_height = MAX(y + 1, brush_height);
+
+ x++;
+
+ if (x >= MAX_LEV_FIELDX)
+ start_new_row = TRUE;
+
+ allow_new_row = TRUE;
+ }
+ else
+ {
+ if ((*ptr == '\n' || *ptr == '\r') && allow_new_row)
+ start_new_row = TRUE;
+
+ ptr++; // !!! FIX THIS for real UTF-8 handling !!!
+ }
+
+ if (start_new_row)
+ {
+ x = 0;
+ y++;
+
+ if (y >= MAX_LEV_FIELDY)
+ stop = TRUE;
+
+ allow_new_row = FALSE;
+ }
+ }
+
+ SDL_free(clipboard_text);
+
+ if (brush_width == 0 || brush_height == 0)
+ {
+ Request("No level sketch found in clipboard!", REQ_CONFIRM);
+
+ return;
+ }
+
+ if (copy_to_brush)
+ {
+ struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_DRAWING_LEVEL];
+ int mx, my;
+
+ SDL_GetMouseState(&mx, &my);
+
+ // if inside drawing area, activate and draw brush at last mouse position
+ if (mx >= gi->x && mx < gi->x + gi->width &&
+ my >= gi->y && my < gi->y + gi->height)
+ CopyBrushToCursor(last_cursor_x, last_cursor_y);
+
+ draw_with_brush = TRUE;
+ }
+ else
+ {
+ char request[100];
+
+ sprintf(request, "Replace level with %dx%d level sketch from clipboard?",
+ brush_width, brush_height);
+
+ if (!Request(request, REQ_ASK))
+ return;
+
+ for (x = 0; x < MAX_LEV_FIELDX; x++)
+ for (y = 0; y < MAX_LEV_FIELDY; y++)
+ Tile[x][y] = brush_buffer[x][y];
+
+ lev_fieldx = level.fieldx = brush_width;
+ lev_fieldy = level.fieldy = brush_height;
+
+ boolean use_em_engine = TRUE;
+ boolean use_sp_engine = TRUE;
+ boolean use_mm_engine = TRUE;
+
+ for (x = 0; x < MAX_LEV_FIELDX; x++)