<?php
require_once "../../../../account/get_user_path.php";
$GLOBALS["GHOSTS_DIRECTORY"] = "ghosts/";
load_ghost();
function load_ghost()
{
   if (file_exists($path = build_path()))
   {
      ob_start();
      readgzfile($path);
      ob_end_flush();
   }
}
function build_path()
{
   $file = $_GET["level"] . ".gz";
   return account\get_user_path() . $GLOBALS["GHOSTS_DIRECTORY"] . $file;
}
<?php
require_once "../../../../account/get_user_path.php";
$GLOBALS["GHOSTS_DIRECTORY"] = "ghosts/";
save_ghost();
function save_ghost()
{
   create_files();
   $trail = str_replace("|", "\n", $_POST["trail"]);
   gzwrite(gzopen(build_path(), "w"), $trail);
}
function create_files()
{
   create_directory();
   create_file();
}
function create_directory()
{
   $path = build_directory_path();
   if (!file_exists($path))
   {
      mkdir($path, 02770);
   }
}
function create_file()
{
   $path = build_path();
   if (!file_exists($path))
   {
      touch($path);
      chmod($path, 0660);
   }
}
function build_directory_path()
{
   return account\get_user_path() . $GLOBALS["GHOSTS_DIRECTORY"];
}
function build_path()
{
   return build_directory_path() . $_POST["level"] . ".gz";
}
EVR.include("level/road/path/trail/Marker.js");
EVR.Level.Road.Path.Trail = function(level)
{
   this.level = level;
   this.trail = [];
}
EVR.Level.Road.Path.Trail.prototype.add = function(speed, lane)
{
   var level = this.level;
   var time = 0;
   if (!!level.clock)
   {
      time = level.clock.time.get();
   }
   var trail = this.trail;
   var marker = new EVR.Level.Road.Path.Trail.Marker(time, speed, lane);
   trail.push(marker);
}
EVR.Level.Road.Path.Trail.prototype.load = function()
{
   var trail = this.trail;
   var parameters, marker, raw = this.get_raw();
   for (var ii = 0; ii < raw.length; ii++)
   {
      parameters = raw[ii].split(" ");
      marker = new EVR.Level.Road.Path.Trail.Marker();
      EVR.Level.Road.Path.Trail.Marker.apply(marker, parameters);
      trail.push(marker);
   }
}
EVR.Level.Road.Path.Trail.prototype.get_raw = function()
{
   var script = this.get_script_root() + "load_ghost.php";
   var query = this.build_query();
   var raw = new EVR.Requester(script, query, true).execute().split("\n");
   if (raw.length <= 1)
   {
      raw = [];
   }
   return raw;
}
EVR.Level.Road.Path.Trail.prototype.build_query = function()
{
   return "level=" + this.level.id;
}
EVR.Level.Road.Path.Trail.prototype.get_script_root = function()
{
   return SOURCE_PATH + "level/road/path/trail/";
}
EVR.Level.Road.Path.Trail.prototype.save = function()
{
   this.fix();
   var script = this.get_script_root() + "save_ghost.php";
   var query = this.build_query() + "&trail=" + this.serialize();
   new EVR.Requester(script, query, true, true).execute();
}
EVR.Level.Road.Path.Trail.prototype.fix = function()
{
   var trail = this.trail;
   var time;
   for (var ii = 0; ii < trail.length - 1; ii++)
   {
      time = trail[ii].time;
      if (time > 0 && time == trail[ii + 1].time)
      {
	 ii = this.fix_duplicates(ii);
      }
   }
}
EVR.Level.Road.Path.Trail.prototype.fix_duplicates = function(ii)
{
   var trail = this.trail;
   var count = this.count_duplicates(ii);
   var previous = trail[ii - 1].time;
   var difference = trail[ii].time - previous;
   var step = parseInt(difference / count);
   var limit = ii + count;
   while (ii < limit)
   {
      trail[ii].time -= step * (limit - ii++ - 1);
   }
   return ii - 1;
}
EVR.Level.Road.Path.Trail.prototype.count_duplicates = function(ii)
{
   var trail = this.trail;
   var time = trail[ii].time;
   var count = 1;
   while (ii < trail.length - 1 && trail[++ii].time == time)
   {
      count++;
   }
   return count;
}
EVR.Level.Road.Path.Trail.prototype.serialize = function()
{
   return this.trail.join("|");
}
EVR.Level.Road.Path.Trail.prototype.toString = function()
{
   return "[EVR.Level.Road.Path.Trail]";
}
EVR.Level.Road.Path.Trail.Marker = function(time, speed, lane)
{
   this.time = parseInt(time);
   this.speed = parseFloat(speed);
   this.lane = parseInt(lane);
}
EVR.Level.Road.Path.Trail.Marker.prototype.toString = function()
{
   return this.time + " " + this.speed + " " + this.lane;
}
EVR.include("/level/map/Indicator.js");
EVR.Level.Map.Display = function(container, level)
{
   EVR.Component.call(this, container, "table");
   this.level = level;
   this.clusters = level.clusters;
   this.colors = level.beams;
   this.current = 0;
   this.row = this.element.insertRow(-1);
   this.style();
   this.populate();
   this.append();
   this.align();
   this.add_indicators();
}
EVR.Level.Map.Display.prototype = new EVR.Component;
EVR.Level.Map.Display.prototype.style = function()
{
   this.element.cellSpacing = "0";
   this.css.width = MAP_WIDTH;
   this.css.position = "absolute";
   this.css.border = MAP_BORDER;
}
EVR.Level.Map.Display.prototype.populate = function()
{
   var passage, cell;
   for (var ii = 0; ii < this.clusters.length; ii++)
   {
      passage = this.clusters[ii].passage;
      cell = this.row.insertCell(-1);
      cell.style.backgroundColor = this.colors[passage];
   }
}
EVR.Level.Map.Display.prototype.align = function()
{
   var relative = this.level.register.previews[0];
   var coordinates = relative.get_coordinates();
   this.css.height = relative.get_dimensions()[1];
   this.css.left = coordinates[0];
   this.css.top = coordinates[1];
}
EVR.Level.Map.Display.prototype.add_indicators = function()
{
   this.player_indicator = new EVR.Level.Map.Indicator(this, INDICATOR_OPACITY);
   this.ghost_indicator = new EVR.Level.Map.Indicator(
      this, GHOST_INDICATOR_OPACITY);
}
EVR.Level.Map.Display.prototype.draw = function()
{
   this.align();
   this.player_indicator.draw(+this.css.height.slice(0, -2));
   this.ghost_indicator.draw(+this.css.height.slice(0, -2));
}
EVR.Level.Map.Display.prototype.advance_player = function(ii)
{
   var ghost = this.ghost_indicator;
   if (ghost.attached && ghost.get_position() == ii)
   {
      ghost.remove();
   }
   this.player_indicator.advance(ii);
}
EVR.Level.Map.Display.prototype.advance_ghost = function(ii)
{
   var ghost = this.ghost_indicator;
   var player = this.player_indicator;
   if (!player.attached || player.get_position() != ii)
   {
      ghost.advance(ii);
   }
   else
   {
      ghost.remove();
   }
}
EVR.Level.Map.Display.prototype.get_player_position = function()
{
   return this.player_indicator.get_position();
}
EVR.Level.Map.Display.prototype.toString = function()
{
   return "[object EVR.Level.Map.Display]";
}
216.73.216.28
216.73.216.28
216.73.216.28
 
September 30, 2015


Edge of Life is a form I made with Babycastles and Mouth Arcade for an event in New York called Internet Yami-ichi, a flea market of internet-ish goods. We set up our table to look like a doctor's office and pharmacy and offered free examinations and medication prescriptions, a system described by one person as "a whole pharmacy and medical industrial complex".

Diagnoses were based on responses to the form and observations by our doctor during a short examination. The examination typically involved bizarre questions, toy torpedoes being thrown at people and a plastic bucket over the patient's head. The form combined ideas from Myers-Briggs Type Indicators, Codex Seraphinianus and chain-mail personality tests that tell you which TV show character you are. In our waiting room, we had Lake of Roaches installed in a stuffed bat (GIRP bat). It was really fun!

The icons for the food pyramid are from Maple Story and the gun icons are from the dingbat font Outgunned. I'm also using Outgunned to generate the items in Food Spring.