Rafael Fajardo
Director, SWEAT collaborative
Associate Professor,
Emergent Digital Practices
University of Denver

 

Projects: Making Generative Game Engine Source Code

<?xml version="1.0" encoding="UTF-8"?>
<widget version="0.1">
<debug>off</debug>

  <window title="Generative Game Engine">
    <name>main_window</name>
    <width>512</width>
    <height>512</height>
    <shadow>false</shadow>
  </window>
  
  <image src="images/chrome/backing.png">
    <name>background</name>
    <voffset>0</voffset>
    <hoffset>0</hoffset>
    <zorder>1</zorder>
    <opacity>0</opacity>
  </image>

  <image src="images/chrome/dropBoxNormal.jpg">
    <name>dropBox</name>
    <hoffset>0</hoffset>
    <voffset>0</voffset>
    <ondragenter>
      dropBox.src="images/chrome/dropBoxDropping.jpg"
    </ondragenter>
    <ondragdrop>
      dropBox.src="images/chrome/dropBoxDropped.jpg"
      if(checkText()){
	generateGame();
	clearScreen();
	loadScene();
      }
    </ondragdrop>
    <ondragexit>
      dropBox.src="images/chrome/dropBoxNormal.jpg"
    </ondragexit>
  </image>

  <action trigger="onLoad">

    var text = "";
    var textArray = new Array();
    var map = new Array();
    var visualMap = new Array();
    var x_position = 0;
    var y_position = 0;
    var tiles = 8;
    var tileSize = 64;
    var maxTiles = 0;
    var started = false;
    var user;
    var terrain = {			
      a: ["images/tiles/a_cap.png", true], b: ["images/tiles/b_cap.png", false], c: ["images/tiles/c_cap.png", true],
      d: ["images/tiles/d_cap.png", false], e: ["images/tiles/e_cap.png", true], f: ["images/tiles/f_cap.png", true],
      g: ["images/tiles/g_cap.png", true], h: ["images/tiles/h_cap.png", true], i: ["images/tiles/i_cap.png", true],
      j: ["images/tiles/j_cap.png", true], k: ["images/tiles/k_cap.png", true], l: ["images/tiles/l_cap.png", true],
      m: ["images/tiles/m_cap.png", true], n: ["images/tiles/n_cap.png", true], o: ["images/tiles/o_cap.png", true],
      p: ["images/tiles/p_cap.png", true], q: ["images/tiles/q_cap.png", true], r: ["images/tiles/r_cap.png", true],
      s: ["images/tiles/s_cap.png", true], t: ["images/tiles/t_cap.png", true], u: ["images/tiles/u_cap.png", true],
      v: ["images/tiles/v_cap.png", true], w: ["images/tiles/w_cap.png", true], x: ["images/tiles/x_cap.png", true],
      y: ["images/tiles/y_cap.png", true], z: ["images/tiles/z_cap.png", true], A: ["images/tiles/a_cap.png", true],
      B: ["images/tiles/b_cap.png", false], C: ["images/tiles/c_cap.png", true], D: ["images/tiles/d_cap.png", false],
      E: ["images/tiles/e_cap.png", true], F: ["images/tiles/f_cap.png", true], G: ["images/tiles/g_cap.png", true],
      H: ["images/tiles/h_cap.png", true], I: ["images/tiles/i_cap.png", true], J: ["images/tiles/j_cap.png", true],
      K: ["images/tiles/k_cap.png", true], L: ["images/tiles/l_cap.png", true], M: ["images/tiles/m_cap.png", true],
      N: ["images/tiles/n_cap.png", true], O: ["images/tiles/o_cap.png", true], P: ["images/tiles/p_cap.png", true], 
      Q: ["images/tiles/q_cap.png", true], R: ["images/tiles/r_cap.png", true], S: ["images/tiles/s_cap.png", true],
      T: ["images/tiles/t_cap.png", true], U: ["images/tiles/u_cap.png", true], V: ["images/tiles/v_cap.png", true],
      W: ["images/tiles/w_cap.png", true], X: ["images/tiles/x_cap.png", true], Y: ["images/tiles/y_cap.png", true],
      Z: ["images/tiles/z_cap.png", true],
    };

    function checkText()
    {
      var name;
      var extension;

      if(system.event.data[0] == "filenames"){
	name = system.event.data[1];
	extension = name.substr(name.length-3, 3);
	if(extension == "txt"){
	  return true;
	}
      }else{
	alert("Please only drop in .txt files");
	return false;
      }
    }
    
    function generateGame()
    {
      getText();
      stripText();
      generateMap();
      generateCharacter();
    }

    function getText()
    {
      text = runCommand("cat -u " + system.event.data[1]);
    }

    function stripText()
    {
      var i = 0;
      
      for(i=0; i < text.length; i++){
	if(text.charCodeAt(i) > 96 && text.charCodeAt(i) < 123){
	  textArray.push(text.charAt(i));
	}
	if(text.charCodeAt(i) > 64 && text.charCodeAt(i) < 91){
	  textArray.push(text.charAt(i));
	}
      }
      text = null;	

    }

    function generateMap()
    {
      var i = 0;
      var j = 0;
      var k = 0;
      var scenes = 0;
      var sceneShiftRight = 0;
      var sceneShiftDown = 0;
      var imageShiftRight = 0;
      var imageShiftDown = 0;
      
      maxTiles = Math.floor(Math.sqrt(textArray.length));
      scenes = Math.ceil(maxTiles/tiles);
      
      for(i=0; i< scenes; i++){
	map[i] = new Array();
	for(j=0; j< scenes; j++){
	  map[i][j] = new Array();
	}
      }

      for(i=0; i< scenes; i++){
	for(j=0; j< scenes; j++){
	  for(k=0; k < (tiles*tiles); k++){
	    sceneShiftRight = (i*tiles);
	    sceneShiftDown = ((j*tiles)*maxTiles);
	    imageShiftRight = (k%tiles)
	    imageShiftDown = (Math.floor(k/tiles)*maxTiles)
	    if(i+1 == scenes){
	      sceneShiftRight = ((i*tiles-(tiles-(maxTiles-i*tiles))));
	    }
	    if(j+1 == scenes){
	      sceneShiftDown = (((j*tiles)-(tiles-(maxTiles-j*tiles)))*maxTiles);  
	    }
	    map[i][j][k] = textArray[sceneShiftRight+sceneShiftDown+imageShiftDown+imageShiftRight];
	  }
	}
      }
      
      for(i=0; i < (tiles*tiles); i++){
	visualMap.push(new piece(i));
      }      
    }
      
    function piece(i)
    {
      this.image = new Image();
      this.image.src = "images/blank.gif";
      this.image.hOffset = (tileSize*(i%tiles));
      this.image.vOffset = (tileSize*Math.floor(i/tiles));
      this.image.zOrder = 10;
      this.image.width = tileSize;
      this.image.height = tileSize;
    }  

    function generateCharacter()
    {
      user = new character();
    }

    function character()
    {
      this.image = new Image();
      this.image.src = "images/chrome/character/down.gif"
      this.image.hOffset = 0;
      this.image.vOffset = 0;
      this.image.zOrder = 20;
      this.image.width = tileSize;
      this.image.height = tileSize;
      this.image.opacity = 0;
      this.dir = "down";
    }  
      
    function clearScreen()
    {
      dropBox.fade(255, 0, 10);
      dropBox.zOrder = 0;
      background.fade(0, 255, 10);
    }

    function loadScene()
    {
      print(visualMap);
      loadMap();
      user.image.opacity = 255;
    }
      

    function loadMap()
    {
      var i = 0;
      for(i=0; i < map[x_position][y_position].length; i++){
	visualMap[i].image.src = terrain[map[x_position][y_position][i]][0];
      }
    }

  </action>

  <action trigger="onKeyDown">
    if(system.event.keyString == "RightArrow"){
      moveRight()
      checkRight();
    }
    if(system.event.keyString == "LeftArrow"){
      moveLeft()
      checkLeft();
    }
    if(system.event.keyString == "UpArrow"){
      moveUp()
      checkUp();
    }
    if(system.event.keyString == "DownArrow"){
      moveDown()
      checkDown();
    }

    function moveRight()
    {
      user.image.hOffset+=7;
      if(user.dir != "right"){
	user.image.src = "images/chrome/character/right.gif";
	user.dir = "right";
      }
    }

    function moveLeft()
    {
      user.image.hOffset-=7;
      if(user.dir != "left"){
	user.image.src = "images/chrome/character/left.gif";
	user.dir = "left";
      }
    }

    function moveUp()
    {
      user.image.vOffset-=7;
      if(user.dir != "up"){
	user.image.src = "images/chrome/character/up.gif";
	user.dir = "up";
      }
    }

    function moveDown()
    {
      user.image.vOffset+=7;
      if(user.dir != "down"){
	user.image.src = "images/chrome/character/down.gif";
	user.dir = "down";
      }
    }
      
    function checkRight()
    {  
      if(user.image.hOffset+tileSize > (tileSize*tiles)){
	x_position++;
	user.image.hOffset = 0;
	user.image.opacity = 0;
	loadScene();
      }
    }
    
    function checkDown()
    {  
      if(user.image.vOffset+tileSize > (tileSize*tiles)){
	y_position++;
	user.image.vOffset = 0;
	user.image.opacity = 0;
	loadScene();
      }
    }	

    function checkLeft()
    {
      if(user.image.hOffset < 0){
	x_position--;
	user.image.hOffset = (tileSize*tiles)-tileSize;
	user.image.opacity = 0;
	loadScene();
      }
    }
    
    function checkUp()
    {
      if(user.image.vOffset < 0){
	y_position--;
	user.image.vOffset = (tileSize*tiles)-tileSize;
	user.image.opacity = 0;
	loadScene();
      }
    }
	  
  </action>
</widget>