Seku - A traditional folk game

Posted on April 28th, 2008 in Games, Game Design Class, ITP classes by cea276

Here’s a link to the rules.

Seku is a game where all of the players take turns being able score. While the one player is attempting to gain points all other players are united in trying to limit them from doing so. The player trying to score points has two turns until the role is passed to their left. During the second turn of play, the next player knows they are about to become the player who can score points, so two types of rounds emerge. The first round, everyone teams up against the player trying to score. The second round, the player to left of the scoring player tries to set themselves up for scoring more next round. This is just one of the things that can emerge from a game.

Our goal was to bring out a group vs. personal game mechanic and to reward the player who is best in both roles evenly. What we’ve discovered is that the player who wins in seku is usually the best group player, not necessarily the best seku player. The person who wins is the person who wasn’t in the worst group, therefore, they are the best.

It sounds a lot more complicated than it is. I hope we get to play sometime. It will be around for a long long time I hope. Pictures soon to come.

Abaddon - play for keeps

Posted on April 24th, 2008 in Games, Game Design Class by cea276

My last game was about dealing drugs and this one may make it seem like all I do is make games from the darker side of things, but that’s definitely not true. Regardless, Abaddon is an experiment. There’s a stacked deck of cards in a particular order and players draw from this stacked deck by candle light. They are given choices on the cards and a sense of purpose and agency, but a story begins to unravel as some cards are crossed out by an unknown previous player.

I don’t want to spoil it all, but suffice to say that the game has a linear narrative that is experienced by everyone in personal chunks as well as group events. It’s an experiment that worked well, although we certainly have plans for future iterations as always.

I worked on this game with Scott Varland, Adam Simon, and Adam Nash, a great team. Scott built the box, I built the figurines, Nash and I mainly worked on the storyline , Simon came up with some great card move ideas, we spent some long nights together working on the graphic and visual design of everything. We spent a lot of time on the production value since the game was more about an environmental and presentation experience than strategic gameplay. Not to get all heady, but it’s more of a commentary on player agency and the experience of competing in game settings than an actual game one would want to improve their skill at.

Here’s a pdf of the rules.
They’re written by Abaddon himself. For more info on the namesake, here’s a link.
Now for some pretty pictures to give you an idea of the play experience. These were shot by Scott.

The temple is that box in the middle of the board. Also, not shown, is that there is a plank in the middle of the board that lifts up for storing all the supplies. There’s also a section for putting in your wishes that can never be accessed. They are in there forever.

2398665699_1c44277e1f.jpg2398674517_453054c04b.jpg2398679113_3d010b88b7.jpg2399510044_2fbe07577b.jpg2398681387_a8a51d04c1.jpg2399511286_e09d3638f6.jpg

Treggor McMasters visits ITP

Posted on April 6th, 2008 in Wearables Class by cea276

Yes, that’s right. His skin is complete in its naked state and he took it upon himself to test it out amongst the living for the first time ever.

First, some pictures of the suit right before it was finished. It simply needed to have the black lines sewn on in some spots.

dsc_0008.jpg

dsc_0009.jpg

dsc_0010.jpg

dsc_0011.jpg

Ok, now with the suit complete, here’s some pictures taken by students at ITP of the strange figure who appeared one day.

i6zfk9ffm73vb0g7tf8jjcop_400.jpg

20080328-012458.jpg

20080328-012512.jpg

2367575424_83b456ff43_o.jpg

As always, much more to come. And if you have the chance come see Mr. McMasters LIVE on May 12 and 13, 5 to 9pm, kids get in free….actually everyone gets in free.

TLC 5940 daisy chaining and sequence fading

Posted on April 6th, 2008 in Wearables Class by cea276

For my work on the responsive lighting system, I’ve chained three TLC 5940s together and modified some code that I found from peterM from Pratt.

I’m specifically working with RGB LEDs, so the code and the circuit were made to make that easier. I haven’t found any sources online or else where for making multiple RGB LED control easy and simple. The blinkM from sprakfun.com is ridiculously expensive, uses i^2c protocol, and in the end only controls a single freakin’ light. If this has enraged you as well, I hope my code and circuit pictures help you. If this doesn’t make sense to you, feel free to email me: cea276@nyu.edu

Alright, here’s some pictures to start.

This is just one TLC 5940 hooked up to an Arduino microcontroller. The code is the same as found on Peter’s page. He also has a good diagram for how to set it up. Although, on the right side of my picture you can see how to easily break out RGB LEDs on a separate breadboard.

1xtlc5940.jpg

Alright, now we take a big jump to daisy chaining 3 TLD 5940s. If you can do 3, you can do 40. Doing 2 in a row really isn’t that helpful if you can’t scale up, but you can always scale back from 3.

The essential idea is that the SPI lines (white wires) need to be drawn up to each TLC 5940 so that they’re running in parallel. Also, the SOUT of the first chip needs to go to the SIN of the second, then the SOUT of the second goes to the SIN of the third….and so on. In this picture I have the Arduino going into the bottom TLC 5940 and then having the subsequent chips stacking above. However, because of my code I should have done the opposite and had the arduino at the top of the stack. That way the LEDs would turn on sequence from top to bottom.

Ok here’s the picture:

dsc_7528.jpg

Now, a nice big code drop, take a deep breath, it’s a bit heavy.  I’ll clean it up and make it user-friendly real soon, I promise.

//using the pin codes on the TLC5940NT to name the Arduino ports
#define VPRG 2 //”chip pin 27 to Arduino pin 2″
#define SIN 3
#define SCLK 7
#define XLAT 4
#define BLANK 5
#define DCPRG 6
#define GSCLK 8 //note: but using PORTB method

// rates
#define fadeupRate  .02 //determines how many steps it takes to run the desired range (higher=faster)
#define fadedownRate  .007
#define rMax  4095 //brightness maximums
#define gMax  4095
#define bMax  4095
#define NumberOfLights 15

int totalLeads = (NumberOfLights*3)+(NumberOfLights/5);
int Max = 0;
int lightCounter = 0;
int chipNumber = 0;

int fadeLevel[(NumberOfLights*3)+(NumberOfLights/5)];

int leadNumber = 0; //counter used in this fading sequence

int fadeState[(NumberOfLights*3)+(NumberOfLights/5)]; //stores the direction of fading for each port 1,0,-1
//start with first port

int next; //used for limit checking in fading function

int word[] = {
0,0,0,0,0,0,0,0,0,0,0,0}; //temp storage for reversing bits in a word (for greyscale setting)

void setup() {
beginSerial(9600);
Serial.println(”Let’s do this…”);
pinMode(VPRG, OUTPUT);
pinMode(SIN, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(XLAT, OUTPUT);
pinMode(BLANK, OUTPUT);
pinMode(DCPRG, OUTPUT);
pinMode(GSCLK, OUTPUT); //could also set DDRB directly
fadeState[0] = 1;
fadeState[1] = 1;
fadeState[2] = 1;
preset(); //input ‘Dot Correction’ data
}

void loop () {
setGreys();
feedPorts();
incrementFades();
}

void incrementFades() {
//a very particular sequence: fade up from LED 0 to 15 then fade down in same direction
//overlaps incoming&outgoing adjacent ports’ fade level

for (leadNumber=0; leadNumber<(totalLeads-1); leadNumber++) {

if ((leadNumber+1)%16 == 0){
leadNumber++;
}

lightCounter = leadNumber;

if ((lightCounter)%16 == 0){
chipNumber = lightCounter/16;
}
lightCounter-=chipNumber;

//Figure out the color
if (lightCounter%3 == 0){
Max = rMax;
}else if (lightCounter%3 == 1){
Max = gMax;
}else if (lightCounter%3 == 2){
Max = bMax;
}

if (fadeState[leadNumber]!=0) { //if the state for this LED is not 0…
if (fadeState[leadNumber]==1) { //then fade up…

next = fadeLevel[leadNumber]+(Max*fadeupRate);
if (next<Max) {
fadeLevel[leadNumber] = next; //…by incrementing the value in the fadeLevel array
}
else { //keep this one bright for sec then set state for this LED to fade down
fadeLevel[leadNumber] = Max; //be sure is at “max level”
//if this LED is pretty bright, make next neighbor begin a fade up

if (leadNumber== 14 + (16*chipNumber)){
fadeState[leadNumber+2] = 1;
fadeState[leadNumber+3] = 1;
fadeState[leadNumber+4] = 1;
} else if (leadNumber < (totalLeads -1)){
fadeState[leadNumber+1] = 1;
fadeState[leadNumber+2] = 1;
fadeState[leadNumber+3] = 1;
}

if (leadNumber > (totalLeads - 3)){
fadeState[0] = 1;
fadeState[1] = 1;
fadeState[2] = 1;
}
fadeState[leadNumber] = -1; //NOW flip my sign
}//————————————————
}

else {

next = fadeLevel[leadNumber]-(Max*fadedownRate);
if (next>0) { //—————–
fadeLevel[leadNumber] = next;
}
else {
//set me to fade down
fadeLevel[leadNumber] = 0; //be sure at minimum level
fadeState[leadNumber] = 0; //stop fading me until neighbor sets me to fade up
}
}//————————————————

}// end check for state not 0
}// end of cycle thru each port
}// end increment fades

//=======5940 control======================================

void setGreys() {
//data for each port (12 bit word * 16 ports =192 bits in this loop)…
//read the fadeLevel array
for (int i=(totalLeads-1); i>=0; i–) { // ports, count DOWN
int datb = fadeLevel[i];

//load fade level bits into the temp array BACKWARDS
for (int j=11; j>=0; j–) {
word[j]=(datb & 1); //& bitwise AND
datb >>= 1; //shift right and assign
// (maybe there’s a slicker way to do this!? but this works…)
}
//send the data to the 5940
for (int j=0; j<12; j++) {
digitalWrite(SIN,word[j]);
pulseSCLK();
}
}
digitalWrite(XLAT, HIGH);
digitalWrite(XLAT, LOW);
}

void feedPorts() {
//The actual sequencing of the PWM data into the LEDs, must do constantly…
digitalWrite(BLANK, HIGH);
digitalWrite(BLANK, LOW); //=all outputs ON, start PWM cycle

for (int i=0; i<4096; i++) {
pulseGSCLK();
}
}

//DOT CORRECTION…do once
void preset() {
//Input ‘DotCorrex’ Data
//16 outputs, 64 posssible levels of adjustment, 6 bits/chan = 96 bits total
//[use if any LEDs in array are physically too bright]

digitalWrite(DCPRG, HIGH); //leaving it H is my arbitrary choice (=”write to register not EEPROM”)
digitalWrite(VPRG, HIGH); //=inputting data into dot correx register

digitalWrite(BLANK, HIGH); //=all outputs off, when this goes high it resets the greyscale counter
digitalWrite(SIN, LOW); //to start dot correction
digitalWrite(XLAT, LOW);

//begin loading in the dot correx data, most significant bit first…
//but here we are not correcting anything, so LSB is going first!
for (int i=0; i<totalLeads; i++) { //16 ports
for (int j=0; j<6; j++) { //6 bits of data for each port
digitalWrite(SIN, HIGH); //for now, 111111 for everybody
pulseSCLK();
digitalWrite(SIN, LOW);
}
}

//—-doing the FIRST GREYSCALE SETTING here becuz of the unique 193rd clock pulse

digitalWrite(XLAT, HIGH); //latch the dot data into the dot correx register
digitalWrite(XLAT, LOW);
digitalWrite(VPRG, LOW); //entering greyscale mode

for (int i=0; i<totalLeads; i++) { //16 ports
int datb = 4095; //using same fade level for all ports this first time

for (int j=0; j<12; j++) { //data for each port, all the same value to start
digitalWrite(SIN, datb & 01);
pulseSCLK();
datb>>=1;
}
}
digitalWrite(XLAT, HIGH); //latch the greyscale data
digitalWrite(XLAT, LOW);
pulseSCLK(); //193rd clock pulse only need to do the FIRST time after dot correx

digitalWrite(BLANK, LOW); //=all outputs ON, start PWM cycle… moved here
}

//SCLK used in dot correx and greyscale setting
void pulseSCLK() {
digitalWrite(SCLK, HIGH);
digitalWrite(SCLK, LOW);
}

void pulseGSCLK() {
//ultra fast pulse trick, using digitalWrite caused flickering
PORTB=0×01; //bring PORTB0 high (pin 8), other ports go low [0×01 does only pin 8, 0×21 also lifts pin 13]
//16nanosecs is the min pulse width for the 5940, but no pause seems needed here
PORTB=0×20; //keep pin13 high [0×00 would be all low]
}

Enjoy.

Next Page »