from os import listdir
from os.path import join

from transistors.GameChild import *
from Slide import *

class Slides(GameChild):

    def __init__(self, parent):
        GameChild.__init__(self, parent)
        self.load()
        self.current = 0

    def load(self):
        slides = []
        directory = self.get_resource("introduction-images-path")
        for path in sorted(listdir(directory)):
            slides.append(Slide(self, join(directory, path)))
        self.slides = slides

    def reset(self):
        self.current = 0

    def advance(self):
        looped = False
        current = self.current + 1
        if current >= len(self.slides):
            current = 0
            looped = True
        self.current = current
        return not looped

    def draw(self):
        self.slides[self.current].draw()
from pygame import image
from pygame.transform import smoothscale

from transistors.GameChild import *

class Slide(GameChild):

    def __init__(self, parent, path):
        GameChild.__init__(self, parent)
        self.path = path
        self.destination = self.get_screen()
        self.load()

    def load(self):
        size = self.destination.get_size()
        self.slide = smoothscale(image.load(self.path), size).convert()

    def draw(self):
        self.destination.blit(self.slide, (0, 0))
class Parameters:

    ints = ["time-limit", "display-frame-duration", "display-wait-duration",
            "terrain-size", "orb-size", "orb-padding", "manna-size",
            "cells-type-count", "audio-bg-channel", "terrain-border"]

    floats = ["territory-initial-coverage"]

    tuples = ["display-dimensions"]

    paths = ["introduction-images-path", "capture-path"]

    str_lists = ["territory-colors", "keys-reset", "keys-capture-screen",
                 "keys-quit"]

    bools = []
import re
import os
from os.path import isfile, join

import pygame

from Parameters import *

class Configuration(dict):

    assignment_operator = "="
    comments_operator = "#"
    field_separator = ","
    keys_prefix = "keys_"
    true_values = ["yes", "y", "true", "t", "1"]
    
    def __init__(self):
        self.set_file_path()
        self.parse()

    def set_file_path(self):
        path = "config"
        if not isfile(path):
            path = join("/usr/local/share/transistors/", path)
        self.file_path = path            
    
    def parse(self):
        for line in file(self.file_path):
            line = line.strip()
            if len(line) > 0 and line[0] != self.comments_operator:
                (lval, rval) = map(
                    str.strip, line.split(self.assignment_operator))
                if lval in Parameters.ints:
                    rval = int(rval)
                if lval in Parameters.floats:
                    rval = float(rval)
                if lval in Parameters.bools:
                    rval = True if self.is_true_value(rval) else False
                if lval in Parameters.paths:
                    rval = os.path.join(*rval.split(os.sep))
                if lval in Parameters.tuples:
                    rval = eval(rval)
                if lval in Parameters.str_lists:
                    rval = map(str.strip, rval.split(self.field_separator))
                    if self.is_key_assignment(lval):
                        rval = map(lambda key: getattr(pygame, key), rval)
                self[lval] = rval

    def is_true_value(self, rval):
        return rval.lower() in self.true_values

    def is_key_assignment(self, lval):
        pattern = "^" + self.keys_prefix + "*"
        return re.match(pattern, lval) is not None
from transistors.GameChild import *
from transistors.EventDelegate import *
from terrain.Terrain import *

class World(GameChild):

    def __init__(self, parent):
        GameChild.__init__(self, parent)
        self.deactivate()
        self.subscribe_to_events()
        self.add_terrain()

    def subscribe_to_events(self):
        self.subscribe_to(EventDelegate.state_change_event,
                          self.respond_to_state_change)

    def respond_to_state_change(self, evt):
        if evt.state == "introduction-finished":
            self.activate()

    def activate(self):
        self.active = True
        self.set_music()

    def set_music(self):
        self.get_audio().play_bgm(self.get_resource("world-music-path"))

    def deactivate(self):
        self.active = False

    def add_terrain(self):
        width, height = self.get_screen().get_size()
        terrain_width = self.get_configuration()["terrain-size"]
        terrain = []
        for ii in range(width / terrain_width + 1):
            for jj in range(height / terrain_width + 1):
                terrain.append(Terrain(self, (ii, jj)))
        self.terrain = terrain        

    def update(self):
        if self.active:
            for terrain in self.terrain:
                terrain.update()
from pygame import Surface, Rect, Color

from transistors.GameChild import *

class Terrain(GameChild, Surface):

    def __init__(self, parent, coordinates):
        GameChild.__init__(self, parent)
        self.coordinates = coordinates
        self.init_surface()
        self.set_rect()
        self.set_background()
        self.set_clip()

    def init_surface(self):
        width = self.get_configuration()["terrain-size"]
        Surface.__init__(self, (width, width))

    def set_rect(self):
        rect = self.get_rect()
        ii, jj = self.coordinates
        offset = self.get_width() / 2
        rect.topleft = ii * rect.w - offset, jj * rect.w - offset
        self.rect = rect

    def set_background(self):
        background = Surface(self.get_size())
        background.fill(Color(self.get_configuration()["terrain-border-color"]))
        self.blit(background, (0, 0))
        self.background = background

    def set_clip(self):
        width = self.get_width() - self.get_configuration()["terrain-border"]
        Surface.set_clip(self, Rect(0, 0, width, width))

    def update(self):
        self.clear()
        self.draw()

    def clear(self):
        self.blit(self.background, (0, 0))

    def draw(self):
        self.fill(Color("black"))
        self.get_screen().blit(self, self.rect)
18.223.125.219
18.223.125.219
18.223.125.219
 
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.