Blame onefile/gen-dungeon.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 TILESIZE     512
Ivan Mahonin a5e8d6
#define ROWS           8
Ivan Mahonin a5e8d6
#define COLS          12
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
const double cellRatio = 1.0;
Ivan Mahonin a5e8d6
const double genRatio  = 0.5;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Animation tiles[1024];
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
int tilesCount = 0;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Framebuffer framebuffer;
Ivan Mahonin a5e8d6
Animation fbAnim;
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
void groundLine(double len) {
Ivan Mahonin a5e8d6
  double ky = 0.02;
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)*ky; } while(fabs(y + ny) > ky);
Ivan Mahonin a5e8d6
    y += ny;
Ivan Mahonin a5e8d6
    x += (1 + (randomFloat()*2 - 1)*0.5)*ky;
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
  saveState();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  target(framebuffer);
Ivan Mahonin a5e8d6
  background(COLOR_TRANSPARENT);
Ivan Mahonin a5e8d6
  clear();
Ivan Mahonin a5e8d6
  zoom(TILESIZE*cellRatio*genRatio);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  fill(colorByRGBA(1, 1, 1, 1));
Ivan Mahonin a5e8d6
  noStroke();
Ivan Mahonin a5e8d6
  double thikness  = 0.02/cellRatio*genRatio;
Ivan Mahonin a5e8d6
  strokeWidth(thikness);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
  translate(0.5, 0.5);
Ivan Mahonin a5e8d6
  if (tilesCount > 0)
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, y);
Ivan Mahonin a5e8d6
        zoom(1/cellRatio);
Ivan Mahonin a5e8d6
        rectTextured(tiles[rand()%tilesCount], -0.5, -0.5, 1, 1);
Ivan Mahonin a5e8d6
        restoreState();
Ivan Mahonin a5e8d6
      }
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
  stroke(COLOR_BLACK);
Ivan Mahonin a5e8d6
  double k = 1/3.0;
Ivan Mahonin a5e8d6
  saveState();
Ivan Mahonin a5e8d6
    translate(0.5 - k, 0.5);
Ivan Mahonin a5e8d6
    for(int i = 0; i < ROWS; ++i) {
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(0, i - k);
Ivan Mahonin a5e8d6
      groundLine(COLS + 2*k - 1);
Ivan Mahonin a5e8d6
      restoreState();
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(0, i + k);
Ivan Mahonin a5e8d6
      groundLine(COLS + 2*k - 1);
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(0.5 - k, 0.5);
Ivan Mahonin a5e8d6
    for(int i = 0; i < COLS; ++i) {
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(0, i - k);
Ivan Mahonin a5e8d6
      groundLine(ROWS + 2*k - 1);
Ivan Mahonin a5e8d6
      restoreState();
Ivan Mahonin a5e8d6
      saveState();
Ivan Mahonin a5e8d6
      translate(0, i + k);
Ivan Mahonin a5e8d6
      groundLine(ROWS + 2*k -  1);
Ivan Mahonin a5e8d6
      restoreState();
Ivan Mahonin a5e8d6
    }
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
  restoreState();
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  viewportSave("data/output/generated-dungeon.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/dungeon.png", &w, &h, &px);
Ivan Mahonin a5e8d6
  int s = TILESIZE + TILESIZE/2;
Ivan Mahonin a5e8d6
  for(int y = 0; y < 2; ++y)
Ivan Mahonin a5e8d6
    for(int x = 0; x < 6; ++x)
Ivan Mahonin a5e8d6
      if ((tiles[tilesCount] = subImage(w, h, px, x*TILESIZE + TILESIZE/4, y*TILESIZE + TILESIZE/4, TILESIZE, TILESIZE)))
Ivan Mahonin a5e8d6
        ++tilesCount;
Ivan Mahonin a5e8d6
  free(px);
Ivan Mahonin a5e8d6
Ivan Mahonin a5e8d6
  w = ceil(TILESIZE*COLS*cellRatio*genRatio - 0.001);
Ivan Mahonin a5e8d6
  h = ceil(TILESIZE*ROWS*cellRatio*genRatio - 0.001);
Ivan Mahonin a5e8d6
  framebuffer = createFramebuffer(w, h);
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/COLS);
Ivan Mahonin a5e8d6
  fill(COLOR_WHITE);
Ivan Mahonin a5e8d6
  noStroke();
Ivan Mahonin a5e8d6
  rectTextured(fbAnim, -COLS/2.0, -ROWS/2.0, COLS, ROWS);
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