Blame onefile/gen-dungeon2.c

Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
#include <math.h>
Ivan Mahonin a5e8d6
#include <stdlib.h>
Ivan Mahonin a5e8d6
#include <string.h>
Ivan Mahonin a5e8d6
#include <helianthus.h>
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
#define WIDTH     285.0
Ivan Mahonin a5e8d6
#define HEIGHT    200.0
Ivan Mahonin a5e8d6
#define RES        10.0
Ivan Mahonin a5e8d6
#define THIKNESS    0.5
Ivan Mahonin a5e8d6
#define ALPHA       0.1
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
#define CELLSIZE   22.5
Ivan Mahonin a5e8d6
#define ITEMSIZE   10.0
Ivan Mahonin a5e8d6
#define WALLSIZE   10.0
Ivan Mahonin a5e8d6
#define WALLJITTER  1.0
Ivan Mahonin a5e8d6
#define WALLBORDER  2.0
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
#define SRCRES    10.0
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
#define SCALE      1.0
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
double itemScale;
Ivan Mahonin a5e8d6
double cellScale;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Animation itemTiles[1024];
Ivan Mahonin a5e8d6
Animation cellTiles[1024];
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
int itemTilesCount = 0;
Ivan Mahonin a5e8d6
int cellTilesCount = 0;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
int rows;
Ivan Mahonin a5e8d6
int cols;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Framebuffer framebuffer;
Ivan Mahonin a5e8d6
Animation fbAnim;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
void shuffle(Animation *anims, int count) {
Ivan Mahonin a5e8d6
  for(int i = 0; i < 2*count; ++i) {
Ivan Mahonin a5e8d6
    int a = randomNumber(0, count-1);
Ivan Mahonin a5e8d6
    int b = randomNumber(0, count-1);
Ivan Mahonin a5e8d6
    if (a != b) {
Ivan Mahonin a5e8d6
      Animation anim = anims[a];
Ivan Mahonin a5e8d6
      anims[a] = anims[b];
Ivan Mahonin a5e8d6
      anims[b] = anim;
Ivan Mahonin a5e8d6
    }
Ivan Mahonin a5e8d6
  }
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
void groundLine(double len, double k) {
Ivan Mahonin a5e8d6
  double x = 0;
Ivan Mahonin a5e8d6
  double y = 0;
Ivan Mahonin a5e8d6
  moveTo(x, y);
Ivan Mahonin a5e8d6
  while(x < len) {
Ivan Mahonin a5e8d6
    double ny;
Ivan Mahonin a5e8d6
    do { ny = (randomFloat()*2 - 1)*k; } while(fabs(y + ny) > k);
Ivan Mahonin a5e8d6
    y += ny;
Ivan Mahonin a5e8d6
    x += (1 + (randomFloat()*2 - 1)*0.5)*2*k;
Ivan Mahonin a5e8d6
    if (x >= len) { x = len; y = 0; }
Ivan Mahonin a5e8d6
    lineTo(x, y);
Ivan Mahonin a5e8d6
  }
Ivan Mahonin a5e8d6
  strokePath();
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
void generate() {
Ivan Mahonin a5e8d6
  int fw = framebufferGetWidth(framebuffer);
Ivan Mahonin a5e8d6
  int fh = framebufferGetHeight(framebuffer);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
  target(framebuffer);
Ivan Mahonin a5e8d6
  background(COLOR_TRANSPARENT);
Ivan Mahonin a5e8d6
  clear();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  translate(fw/2, fh/2);
Ivan Mahonin a5e8d6
  zoom(RES);
Ivan Mahonin a5e8d6
  fill(COLOR_WHITE);
Ivan Mahonin a5e8d6
  noStroke();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  double step = CELLSIZE + WALLSIZE;
Ivan Mahonin a5e8d6
  translate(-(cols-1)*step/2, -(rows-1)*step/2);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  double itemStep = (CELLSIZE - ITEMSIZE)/2;
Ivan Mahonin a5e8d6
  double cellSize = CELLSIZE*cellScale;
Ivan Mahonin a5e8d6
  double itemSize = ITEMSIZE*itemScale;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  int cellId = cellTilesCount;
Ivan Mahonin a5e8d6
  int itemId = itemTilesCount;
Ivan Mahonin a5e8d6
  for(int y = 0; y < rows; ++y) {
Ivan Mahonin a5e8d6
    for(int x = 0; x < cols; ++x) {
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(x*step, y*step);
Ivan Mahonin a5e8d6
      if (cellTilesCount > 0 && randomFloat()*100 < 10) {
Ivan Mahonin a5e8d6
        if (cellId >= cellTilesCount) {
Ivan Mahonin a5e8d6
          shuffle(cellTiles, cellTilesCount);
Ivan Mahonin a5e8d6
          cellId = 0;
Ivan Mahonin a5e8d6
        }
Ivan Mahonin a5e8d6
        rectTextured(cellTiles[cellId++], -cellSize/2, -cellSize/2, cellSize, cellSize);
Ivan Mahonin a5e8d6
      } else
Ivan Mahonin a5e8d6
      if (itemTilesCount > 0) {
Ivan Mahonin a5e8d6
        int cnt = 4;
Ivan Mahonin a5e8d6
        if (cnt < itemTilesCount) cnt = rand()%itemTilesCount;
Ivan Mahonin a5e8d6
        for(int i = 0; i < 4; ++i) {
Ivan Mahonin a5e8d6
          saveState();
Ivan Mahonin a5e8d6
          translate(i%2 ? itemStep : -itemStep, i/2 ? itemStep : -itemStep);
Ivan Mahonin a5e8d6
          if (itemId >= itemTilesCount) {
Ivan Mahonin a5e8d6
            shuffle(itemTiles, itemTilesCount);
Ivan Mahonin a5e8d6
            itemId = 0;
Ivan Mahonin a5e8d6
          }
Ivan Mahonin a5e8d6
          rectTextured(itemTiles[itemId++], -itemSize/2, -itemSize/2, itemSize, itemSize);
Ivan Mahonin a5e8d6
          restoreState();
Ivan Mahonin a5e8d6
        }
Ivan Mahonin a5e8d6
      }
Ivan Mahonin a5e8d6
      restoreState();
Ivan Mahonin a5e8d6
    }
Ivan Mahonin a5e8d6
  }
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  noFill();
Ivan Mahonin a5e8d6
  stroke(COLOR_BLACK);
Ivan Mahonin a5e8d6
  strokeWidth(THIKNESS);
Ivan Mahonin a5e8d6
  double k = WALLJITTER;
Ivan Mahonin a5e8d6
  double wallStep = CELLSIZE/2 + k + WALLBORDER;
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
    translate(-wallStep, 0);
Ivan Mahonin a5e8d6
    double len = (cols-1)*step + 2*wallStep;
Ivan Mahonin a5e8d6
    for(int i = 0; i < rows; ++i) {
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(0, i*step - wallStep);
Ivan Mahonin a5e8d6
      groundLine(len, k);
Ivan Mahonin a5e8d6
      translate(0, 2*wallStep);
Ivan Mahonin a5e8d6
      groundLine(len, k);
Ivan Mahonin a5e8d6
      restoreState();
Ivan Mahonin a5e8d6
    }
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
    rotate(90);
Ivan Mahonin a5e8d6
    scale(1, -1);
Ivan Mahonin a5e8d6
    translate(-wallStep, 0);
Ivan Mahonin a5e8d6
    len = (rows-1)*step + 2*wallStep;
Ivan Mahonin a5e8d6
    for(int i = 0; i < cols; ++i) {
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(0, i*step - wallStep);
Ivan Mahonin a5e8d6
      groundLine(len, k);
Ivan Mahonin a5e8d6
      translate(0, 2*wallStep);
Ivan Mahonin a5e8d6
      groundLine(len, k);
Ivan Mahonin a5e8d6
      restoreState();
Ivan Mahonin a5e8d6
    }
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  viewportSave("data/output/generated-dungeon2.png");
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Animation subImage(int width, int height, unsigned char *pixels, int x, int y, int w, int h) {
Ivan Mahonin a5e8d6
  if (x < 0 || y < 0 || x + w > width || y + h > height || !pixels)
Ivan Mahonin a5e8d6
    return NULL;
Ivan Mahonin a5e8d6
  unsigned char *px = calloc(4, w*h);
Ivan Mahonin a5e8d6
  for(int i = 0; i < h; ++i)
Ivan Mahonin a5e8d6
    memcpy(px + i*w*4, pixels + ((y+i)*width + x)*4, w*4);
Ivan Mahonin a5e8d6
  Animation anim = createAnimationFromImage(w, h, px, FALSE);
Ivan Mahonin a5e8d6
  free(px);
Ivan Mahonin a5e8d6
  return anim;
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
void init() {
Ivan Mahonin a5e8d6
  int w = 0;
Ivan Mahonin a5e8d6
  int h = 0;
Ivan Mahonin a5e8d6
  unsigned char *px = NULL;
Ivan Mahonin a5e8d6
  imageLoad("data/dungeon2.png", &w, &h, &px);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  int is = 128;
Ivan Mahonin a5e8d6
  int cs = 256;
Ivan Mahonin a5e8d6
  itemScale = is/(ITEMSIZE*SRCRES);
Ivan Mahonin a5e8d6
  cellScale = cs/(CELLSIZE*SRCRES);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  int ix0 = (int)round((1*ITEMSIZE + (1 - itemScale)*ITEMSIZE/2)*SRCRES);
Ivan Mahonin a5e8d6
  int iy0 = ix0;
Ivan Mahonin a5e8d6
  int idx = (int)round(2*ITEMSIZE*SRCRES);
Ivan Mahonin a5e8d6
  int idy = idx;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  int cx0 = (int)round((1*ITEMSIZE + (1 - cellScale)*CELLSIZE/2)*SRCRES);
Ivan Mahonin a5e8d6
  int cy0 = (int)round((5*ITEMSIZE + (1 - cellScale)*CELLSIZE/2)*SRCRES);
Ivan Mahonin a5e8d6
  int cdx = (int)round(3*ITEMSIZE*SRCRES);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  int y = iy0;
Ivan Mahonin a5e8d6
  for(int i = 0; i < 6; ++i)
Ivan Mahonin a5e8d6
      if ((itemTiles[itemTilesCount] = subImage(w, h, px, ix0 + i*idx, y, is, is)))
Ivan Mahonin a5e8d6
        ++itemTilesCount;
Ivan Mahonin a5e8d6
  y += idy;
Ivan Mahonin a5e8d6
  for(int i = 0; i < 5; ++i)
Ivan Mahonin a5e8d6
      if ((itemTiles[itemTilesCount] = subImage(w, h, px, ix0 + i*idx, y, is, is)))
Ivan Mahonin a5e8d6
        ++itemTilesCount;
Ivan Mahonin a5e8d6
  y = cy0;
Ivan Mahonin a5e8d6
  for(int i = 0; i < 3; ++i)
Ivan Mahonin a5e8d6
      if ((cellTiles[cellTilesCount] = subImage(w, h, px, cx0 + i*cdx, y, cs, cs)))
Ivan Mahonin a5e8d6
        ++cellTilesCount;
Ivan Mahonin a5e8d6
  free(px);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  rows = HEIGHT/(CELLSIZE + WALLSIZE);
Ivan Mahonin a5e8d6
  cols = WIDTH/(CELLSIZE + WALLSIZE);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  int fw = ceil(WIDTH*RES - 0.001);
Ivan Mahonin a5e8d6
  int fh = ceil(HEIGHT*RES - 0.001);
Ivan Mahonin a5e8d6
  framebuffer = createFramebuffer(fw, fh);
Ivan Mahonin a5e8d6
  fbAnim = createAnimationFromFramebuffer(framebuffer);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  generate();
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
void draw() {
Ivan Mahonin a5e8d6
  background(COLOR_WHITE);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  double w = windowGetWidth();
Ivan Mahonin a5e8d6
  double h = windowGetHeight();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  if (keyWentDown("space")) generate();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
  translate(w/2, h/2);
Ivan Mahonin a5e8d6
  zoom(w/WIDTH);
Ivan Mahonin a5e8d6
  fill(COLOR_WHITE);
Ivan Mahonin a5e8d6
  noStroke();
Ivan Mahonin a5e8d6
  rectTextured(fbAnim, -WIDTH/2.0, -HEIGHT/2.0, WIDTH, HEIGHT);
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
int main() {
Ivan Mahonin a5e8d6
  windowSetVariableFrameRate();
Ivan Mahonin a5e8d6
  windowSetResizable(TRUE);
Ivan Mahonin a5e8d6
  windowSetInit(&init);
Ivan Mahonin a5e8d6
  windowSetDraw(&draw);
Ivan Mahonin a5e8d6
  windowRun();
Ivan Mahonin a5e8d6
}
Ivan Mahonin a5e8d6