Tuesday, January 8, 2008

Inferno is Back

hey guys

Hope you all had a good break. I finished rebuilding the inferno infrastructure and it is ready to be fill with objects. The dark woods still need some touch ups, but i should have that done at the end of the week. I am also working on purgatory right now and it should be done shortly.

-Todd

Wednesday, December 5, 2007

Menu Script

Here's my script for a menu where you can choose to receive a notecard or goto a webpage. Make sure when you put it in an object you place the notecard you want to dispense inside the object also. Thanks for the help ben


// when touched, present two menu choices to give notecard and load URL

integer CHANNEL = 42; // dialog channel
list MENU_MAIN = ["Website", "Notecard"]; // the main menu
key id;

default {
state_entry() {
llListen(CHANNEL, "", NULL_KEY, ""); // listen for dialog answers (from multiple users)
}

touch_start(integer total_number)
{
id = llDetectedKey(0);
llDialog(id, "What do you want to do?", MENU_MAIN, CHANNEL); // present dialog on click
}

listen(integer channel, string name, key id, string message)
{


if (message == "Website")

llLoadURL(id, "", "http://si.ist.psu.edu/neodante"); //load webpage
else if (message == "Notecard")

llGiveInventory(id, "Info"); //give notecard
}
}

Tuesday, December 4, 2007

Models


i made a few more models. A fat model and a skinny model.

Friday, November 30, 2007

Fog Script

Dan - here is the fog script. Its a simple particle script, you can modify the color, if it bounces off the z-plane, effected by wind or have it follow different objects or avatars


// Particle Script

integer glow = TRUE; // Make the particles glow
integer bounce = TRUE; // Make particles bounce on Z plan of object
integer interpColor = TRUE; // Go from start to end color
integer interpSize = TRUE; // Go from start to end size
integer wind = FALSE; // Particles effected by wind
integer followSource = TRUE; // Particles follow the source
integer followVel = TRUE; // Particles turn to velocity direction

// Choose pattern:
// PSYS_SRC_PATTERN_EXPLODE
// PSYS_SRC_PATTERN_DROP
// PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
// PSYS_SRC_PATTERN_ANGLE_CONE
// PSYS_SRC_PATTERN_ANGLE
integer pattern = PSYS_SRC_PATTERN_ANGLE_CONE;

// Select a target for particles to go towards
// "" for nothing, "owner" for creator, "self" for host object

key target = "self";

// Particle paramaters
float age = 8; // Life of each particle
float maxSpeed = 1; // Max speed each particle is spit out at
float minSpeed = 1; // Min speed each particle is spit out at
string texture; // Texture used for particles, default used if blank
float startAlpha = 0.2; // Start alpha (transparency) value
float endAlpha = 0.3; // End alpha (transparency) value
vector startColor = <7,25,34.45>; // Start color of particles
vector endColor = <1,252,34.4>; // End color of particles (if interpColor == TRUE)
vector startSize = <1.0,1.0,1.0>; // Start size of particles
vector endSize = <1.0,1.0,1.0>; // End size of particles (if interpSize == TRUE)
vector push = <0,0,-1>; // Force pushed on particles

// System paramaters
float rate = .1; // How fast (rate) to emit particles
float radius = .9; // Radius to emit particles for BURST pattern
integer count = 500; // How many particles to emit per BURST
float outerAngle = 2.0; // Outer angle for all ANGLE patterns
float innerAngle = 2.0; // Inner angle for all ANGLE patterns
vector omega = <1,2,3>; // Rotation of ANGLE patterns around the source
float life = 0; // Life in seconds for the system to make particles

// Script variables
integer flags;

updateParticles()
{
if (target == "owner") target = llGetOwner();
if (target == "self") target = llGetKey();
if (glow) flags = flags | PSYS_PART_EMISSIVE_MASK;
if (bounce) flags = flags | PSYS_PART_BOUNCE_MASK;
if (interpColor) flags = flags | PSYS_PART_INTERP_COLOR_MASK;
if (interpSize) flags = flags | PSYS_PART_INTERP_SCALE_MASK;
if (wind) flags = flags | PSYS_PART_WIND_MASK;
if (followSource) flags = flags | PSYS_PART_FOLLOW_SRC_MASK;
if (followVel) flags = flags | PSYS_PART_FOLLOW_VELOCITY_MASK;
if (target != "") flags = flags | PSYS_PART_TARGET_POS_MASK;

llParticleSystem([ PSYS_PART_MAX_AGE,age,
PSYS_PART_FLAGS,flags,
PSYS_PART_START_COLOR, startColor,
PSYS_PART_END_COLOR, endColor,
PSYS_PART_START_SCALE,startSize,
PSYS_PART_END_SCALE,endSize,
PSYS_SRC_PATTERN, pattern,
PSYS_SRC_BURST_RATE,rate,
PSYS_SRC_ACCEL, push,
PSYS_SRC_BURST_PART_COUNT,count,
PSYS_SRC_BURST_RADIUS,radius,
PSYS_SRC_BURST_SPEED_MIN,minSpeed,
PSYS_SRC_BURST_SPEED_MAX,maxSpeed,
PSYS_SRC_TARGET_KEY,target,
PSYS_SRC_INNERANGLE,innerAngle,
PSYS_SRC_OUTERANGLE,outerAngle,
PSYS_SRC_OMEGA, omega,
PSYS_SRC_MAX_AGE, life,
PSYS_SRC_TEXTURE, texture,
PSYS_PART_START_ALPHA, startAlpha,
PSYS_PART_END_ALPHA, endAlpha
]);
}

default
{
state_entry()
{
updateParticles();
}
}

Interesting script problem

Hi all,

Ben and I are trying to figure out a script problem that
could be indicitive of a deeper problem.

If you go to the reception room for Inferno, you will
see a picture of Sandro Boticelli. If you touch
the picture a loadURL message comes up and if you
select OK you get a web page with info on Botticelli.

So far so good. Here is the simple script:




string SiteName = " " ;
//Change this to meet your needs.
string SiteURL = "http://si.ist.psu.edu/neodante/afterlife/inferno/sandro-botticelli-1444-1510/";
//Change this to meet your needs.

default
{
state_entry()
{
llSetText(SiteName,<0,1,1>,2);
}


touch_start(integer total_number)
{
llLoadURL(llDetectedKey(0), SiteName, SiteURL);
}

}


Now - I copied my Botticelli picture, and put a copy in
the reception room of Purgatorio.

But now the script does not work! Same exact script!

I then create a new object - paste the script there -
it compiles successfully -- same problem (no message, no
web browser window, no nothing!)

So, again on the new object, I whittle down the
script to the following simplest possible script:


default
{
state_entry()
{
llSay(0, "Hello, Avatar!");
}

touch_start(integer total_number)
{
llLoadURL(llDetectedKey(0), "fred", "http://www.psu.edu");
}
}


Still no work!

Thoughts? Both Ben and I worked on this but could not
find any solution.

- gerry

Thursday, November 29, 2007

floating text script


string SiteName = "Blaw-Knox Steel Mill" ;
//Change this to meet your needs.

default
{
state_entry()
{
llSetText(SiteName,<0,1,1>,2);
}
}

open url script


string SiteName = " " ;
//Change this to meet your needs.
string SiteURL = "http://www.psu.edu.";
//Change this to meet your needs.

default
{
state_entry()
{
llSetText(SiteName,<0,1,1>,2);
}

touch_start(integer total_number)
{
llLoadURL(llDetectedKey(0), SiteName, SiteURL);
}
}

Tuesday, November 27, 2007

Inferno: Level Three


Here's the third level of Inferno. I'm going to hold off on the other ones until I am able to do some building.

Inferno: Level Two


Here is the diagram for circle two -- circles two and three have significantly less going on than circle one. I'll have the third one up by tonight, and then I'll start doing some building.

Monday, November 26, 2007

Let me impress you with my amazing Paint skillz


I made a rough diagram for the first level of Inferno. I have levels two and three drawn out by hand, but I still need to reorganize them in Paint -- I just thought I'd throw this one out there so I can get started building as soon as possible. Let me know what you think!

I've also been attending some classes run by the New Citizens Institute (formally New Citizens Incorporated) that have been really helpful in understanding building and scripting.

Tuesday, November 6, 2007

Blank Avatars & Doors



I finished the blank avatars, The minimum amount of prims i could use for them is 20. Which how many are in the two hooded avatars on top of inferno. With hair there are around 30 or 40 prims for each avatar.


I also placed the wooden doors inside purgatory. I implemented scripts so the doors open automatically when you walk into them or if you click them.

Gerry - They're only on the first two floors for now because i wanted you to check them out and make sure they are what you wanted before i placed them on all the floors. Let me know



- Todd

Friday, October 12, 2007

Divine Comedy Translation

I know we got permission to use the one version of the Longfellow translation, however I found a cleaner, easier to use version:

http://en.wikisource.org/wiki/The_Divine_Comedy

It has specific links for each book, and then each canto, so rather than have people looking at the canto on the current place we can use, where the canto starts somewhere in the middle of the page sometimes, this would be just the specific canto.

This new version IS the Longfellow translation.

Let me know what you think (Gerry).

Ben

Tuesday, October 9, 2007

Useful (i hope) Scripts

The scripts I've attached are utilized in the book object, however I commented them so they can be used for whatever you need them for.

The scripts:

NestedMenuScript
  • provides nested dialog windows
  • provides method of going back through menus
  • provides a notecard (the notecard must be added to the object's inventory - NOT INCLUDED)
RotationScript
  • provides a method for rotation an object on its local y-axis
  • play with the value of the rotation to get the desired rotation you want
  • provides a time delayed action of resetting the object so the object will return to its original rotation after being rotated
Any questions please post comments


Scripts:

// ========== Nested Menu Script
// ========== Written by Doodle Fadoodle
// ===================================
// ==
// == Feel free to edit this script and use
// == for whatever purpose you need
// ==
// ===================================
// ===================================


// Create lists for menu buttons
// Make one list per dialog screen

list MAIN_MENU = ["Description", "See Cantos"];
list CANTOS = ["Canto I", "Canto II", "Canto III", "Canto IV", "Canto V", "Canto VI", "Canto VII", "Canto VIII", "more...", "...back"];
list CANTOS_MORE = ["button1", "button2"];

// Create a key to remember who is using the menus

key avatar;

// Begin script

default
{
state_entry()
{
// When object is first placed out of inventory, start listening on specific channel
// Use a negative channel to avoid confusion

// llListen syntax: llListen(channel, "object name", key, "message");
// channel is the talk channel to begin listening on (an integer value)
// "object name" is the name of an object sending a message (a string value)
// key can be the owner of the object's key, a specific avatar, or other key (a key value)
// "message" is a specific message an avatar or other object will say on a given channel (a string value)

llListen(-199392, "", NULL_KEY, "");
llSay(0, "Book cover placed - position above book."); // Not needed - just directions for object placement
}

// Actions to perform when the object is touched:

touch_start(integer total_number)
{
// Assign the key of the avatar touching the object to the key "avatar"
avatar = llDetectedKey(0);

// Create first dialog menu, the "main" menu
// llDialog syntax: llDialog(key, "text directions for the user to read explaining options available", [list_of_buttons], channel);

llDialog(avatar, "This menu allows you to gain information pertaining to this level.\nYour options include:", MAIN_MENU, -199392);

}

// Action to perform when a button is pressed. (Used through the listen function)
// This is used for ALL button options, regardless of which list the buttons are in
// All "if" or "else if" statements should be (message = "button_text") where "button_text" is what the button's are labeled as

listen(integer channel, string name, key id, string message)
{
if(message == "Description")
{
// Give a notecard through the llGiveInventory function
// llGiveInventory syntax: llGiveInventory(key, "item_in_inventory_name");
// The key is what you set from the avatar touching the object and the item (notecard in this case) must be in the object's inventory

llGiveInventory(avatar, "ParCantoI");
}
else if(message == "See Cantos")
{
// Opens another dialog menu; now we have nested menus!

llDialog(avatar, "The following Cantos refer to this level:", CANTOS, -199392);
}
else if(message == "Canto I")
{
// Ask the avatar to open a website in the user's default web browser; using llLoadURL function
// llLoadURL syntax: llLoadURL(key, "text for user to know what the website is", "website_URL");

llLoadURL(avatar, "Paradiso Canto I Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=261");
}
else if(message == "Canto II")
{
llLoadURL(avatar, "Paradiso Canto II Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=265");
}
else if(message == "Canto III")
{
llLoadURL(avatar, "Paradiso Canto III Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=269");
}
else if(message == "Canto IV")
{
llLoadURL(avatar, "Paradiso Canto IV Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=272");
}
else if(message == "Canto V")
{
llLoadURL(avatar, "Paradiso Canto V Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=276");
}
else if(message == "Canto VI")
{
llLoadURL(avatar, "Paradiso Canto VI Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=279");
}
else if(message == "Canto VII")
{
llLoadURL(avatar, "Paradiso Canto VII Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=283");
}
else if(message == "Canto VIII")
{
llLoadURL(avatar, "Paradiso Canto VII Online", "http://www.gutenberg.org/catalog/world/readfile?fk_files=36790&pageno=287");
}
else if(message == "...back")
{
// This will open a new dialog menu which happens to be the original "main" menu!

llDialog(avatar, "This menu allows you to gain information pertaining to this level.\nYour options include:", MAIN_MENU, -199392);
}
else if(message == "more...")
{
// This is another dialog menu; still nesting our menus!

llDialog(avatar, "The following Cantos also refer to this level:", CANTOS_MORE, -199392);
}
else if(message == "button1")
{
llSay(0, "This was just an example!");
}
else if(message == "button2")
{
llSay(0, "This was a test!");
}

// This is just so a message will show up if for some reason you have not
// put an "if"/"else if" statement for a button in the list you made

else
{
llSay(0, "Um, doesn't work?");
}
}

}
// End of Script
// =========================================================================



// ========== Rotation Script
// ========== Written by Doodle Fadoodle
// ===================================
// ==
// == Feel free to edit this script and use
// == for whatever purpose you need
// ==
// ===================================
// ===================================


// Create rotation variables to store rotations

rotation original_rot;
rotation open_rot;

// Create a float variable to store the delay time for a timed event

float delay = 3.0;

// Begin script

default
{
state_entry()
{
// There is no action to perform when the object is first placed out of inventory
}

// Action to perform when the object is touched:

touch_start(integer total_number)
{

// Move to the "open" state

state open;
}


}

// Define the states

state closed
{
state_entry()
{
// When the "closed" state is entered, set the rotation of the object to the "original" rotation
// "original" rotation is defined in the "open" state

llSetRot(original_rot);
}

// Action to perform when the object is touched while in the "closed" state

touch_start(integer total_number)
{
// Move to the "open" state

state open;
}
}

state open
{
state_entry()
{
// Actions performed when the object enters the "open" state

// Set the "original" rotation variable (original_rot) to the object's current rotation

original_rot = llGetRot();

// Create and set a rotation variable to rotate the object on the object's local negative y-axis

rotation y_neg145 = llEuler2Rot(<0,-145*deg_to_rad,0>);

// Set the "new" rotation variable (open_rot) to the rotation we want

open_rot = y_neg145 * original_rot;

// Give our object the "new" rotation values

llSetRot(open_rot);

// Start our timer event after a set value of time (delay)

llSetTimerEvent(delay);
}


// Our timer event

timer()
{
// Move to the "closed" state

state closed;
}
}

// End of Script
// ====================================================================

Monday, October 8, 2007

New Movie Online

Hi all,

I posted a new movie about the Neo-Dante project. This can be goiod
for showing someone (esp. at a distance) what we are doing.

http://www.youtube.com/watch?v=kjlt6dqGBag

- gerry

Need to trim prims

Hi all,

This is mainly for Todd and Dan ...

We need to try to reduce the number of prims we are using as
we are getting dangerously close to the 13000 prim limit
for the island. According to Bart we are using about 7000
prims already. I figure we will need another 1000 or so
for the content objects.

I am hoping that there are a lot of little, or hidden, items that
could be used to reduce the prim count?

Worse comes to worse, I offered to lose the stadium
to free up room for a networking research project that
has been committed for the island. We won't actually
lose it - it can be put into inventory and used later if
needed. It was a great idea but there may not be any other way
around it.

My preference then is to take the prims from places
where they won't be missed so we have them available for our info
objects.

- gerry

- gerry

Sunday, October 7, 2007

Wednesday, September 26, 2007

Meeting Friday morning

Hi all,

I'd like to have a meeting this Friday morning to look at progress so far and to start detailing the levels. I'll also give out the pw's for the buildbots and we can discuss a way to schedule them.

Lets meet in the IST Atrium (3'rd floor) at 9:30. I'll buy coffee and donuts for any sleepy or hungry people.

A few things we should discuss:

- specific level designs leading to placement of info objects - my thought is that this should follow a process where a level is first explored (so you understand the layout) then after reading the UT info on that level (and perhaps some of the Canto translations and commentary on that level) develop a plan for which objects (pictures and 3D objects) would be placed there and what info they would link to

- starting on the accompanying Plone site -- I'd like to give this to one of the team members so we can start designing the info to be placed there and start putting it together in conjunction with the info objects in the towers

- I've been playing more with video development in SL. I downloaded the paid version of FRAPS and think it has some promise. There is a free version which limits you to 30-second clips - doable if you have a stopwatch - then you string the bits together.

- training seminars - do we need any and what topics? We can put these together for this semester (I'll find teachers) and we would have them for the team and other students as room permits.

- lastly: an update on progress on the previous assigmnents.

cheers - gerry

ps - let me know if you are unable to be there - I'll post meeting notes here