Blob Blame Raw

#include <stdio.h>
#include <helianthus.h>


#define CELLSIZE 128


Group edges;
Group group;
Animation frame;
Sprite selected;
double dx, dy;


void generate() {
  int snake[16];
  for(int i = 0; i < 16; ++i)
    snake[i] = i;

  for(int i = 0; i < 128; ++i) {
    int j = randomNumber(0, 15);
    int k = randomNumber(0, 15);
    int s = snake[j];
    snake[j] = snake[k];
    snake[k] = s;
  }

  int count = 0;
  for(int i = 0; i < 16; ++i)
    for(int j = i+1; j < 16; ++j)
      if (snake[i] && snake[j] && snake[i] < snake[j])
        ++count;

  if (count % 2) {
    for(int i = 0; i < 15; ++i) {
      if (snake[i] && snake[i+1]) {
        int s = snake[i];
        snake[i] = snake[i+1];
        snake[i+1] = s;
        break;
      }
    }
  }

  for(int i = 0; i < 16; ++i) {
    int y = i/4;
    int x = i%4;
    if (y%2) x = 3 - x;
    if (snake[i])
      spriteSetXY(groupGet(group, snake[i] - 1), x + 0.5, y + 0.5);
  }
}


void init() {
  edges = createEdgesGroupEx(0, 0, 4, 4, 1, 100);
  groupSetVisibleEach(edges, FALSE);

  frame = createAnimation("data/sprite/15/frame.png");

  group = createGroup();
  for(int i = 0; i < 15; ++i) {
    char filename[256] = {};
    sprintf(filename, "data/sprite/15/%d.png", i+1);
    Sprite sprite = createSpriteEx(0, 0, 1, 1, createAnimation(filename));
    spriteSetColliderRectangle(sprite, 0, 0, 0, 1, 1, 0.1);
    groupAdd(group, sprite);
  }

  generate();
}


void draw() {
  saveState();
  zoom(CELLSIZE);

  noStroke();
  rectTextured(frame, 0, 0, 6, 6);

  translate(1, 1);

  if (mouseDown("left")) {
    double mx = mouseTransformedX();
    double my = mouseTransformedY();
    if (!selected) {
      selected = groupSpriteByPoint(group, mx, my, TRUE);
      if (selected) {
        dx = spriteGetX(selected) - mx;
        dy = spriteGetY(selected) - my;
      }
    }

    if (selected) {
      double d = 0.1;
      double x0 = spriteGetX(selected);
      double y0 = spriteGetY(selected);
      double x1 = mx + dx;
      double y1 = my + dy;
      if (x1 < x0 - d) x1 = x0 - d;
      if (x1 > x0 + d) x1 = x0 + d;
      if (y1 < y0 - d) y1 = y0 - d;
      if (y1 > y0 + d) y1 = y0 + d;
      spriteSetXY(selected, x1, y1);
    }
  } else {
    selected = NULL;
  }

  if (mouseWentDown("right") || keyWentDown("space"))
    generate();

  groupCollideBetween(group);
  groupCollideGroup(edges, group);
  drawSprites();

  restoreState();
}


int main() {
  windowSetTitle("15");
  windowSetInit(&init);
  windowSetDraw(&draw);
  windowSetSize(6*CELLSIZE, 6*CELLSIZE);
  windowSetVariableFrameRate();
  windowRun();
  return 0;
}