Interactive Structure Model Code

Script 2: within or click on room

on mouseWithin me global roomNames -- get the model that the mouse is over whatSprite = sprite(me.spriteNum) clickedmodel = whatSprite.camera.modelUnderLoc(the mouseLoc - point(whatSprite.left, whatSprite.top)) -- no model was clicked if clickedmodel = VOID then member("room over").text = "" member("link over").text = "" exit end if -- extract the name of the model tempmodelname = clickedmodel.name prefixtempmodelname = char 1 to 6 of tempmodelname -- is the model a box? (room) if prefixtempmodelname = "newBox" then member("room over").text = extractRoomname(tempmodelname) else member("room over").text = "" end if prefixtempmodelname = char 1 to 4 of tempmodelname -- is the model a link? if prefixtempmodelname = "link" then jic = the itemdelimiter the itemdelimiter = "t" linkraw = tempmodelname.char[5..tempmodelname.length] link1 = value(item 1 of linkraw) the itemdelimiter = "o" link2 = value(item 2 of linkraw) if link1 = -1 then link1 = "attic" else if link1 = -2 then link1 = "hall of time" else link1 = roomNames.getAt(link1) end if if link2 = -1 then link2 = "attic" else if link2 = -2 then link2 = "hall of time" else link2 = roomNames.getAt(link2) end if member("link over").text = link1 & " to " & link2 the itemdelimiter = jic --member("link over").text = tempmodelname.char[5..tempmodelname.length] exit else member("link over").text = "" end if end mouseWithin   on mouseUp me cursor 4 global last8rooms, roomnames, hotlinks, atticlinks, roomlinkslist global lastroom, currentroom, lastrotationroom -- what model was clicked on whatSprite = sprite(me.spriteNum) clickedmodel = whatSprite.camera.modelUnderLoc(the mouseLoc - point(whatSprite.left, whatSprite.top)) if clickedmodel = VOID then exit tempmodelname = clickedmodel.name prefixtempmodelname = char 1 to 6 of clickedmodel.name -- is it a room? if prefixtempmodelname = "newBox" then tempcurrentroom = value(char 7 to length(clickedmodel.name) of clickedmodel.name) if (tempcurrentroom = currentroom) then exit end if if currentroom = -2 then put hotlinks.findPos(tempcurrentroom)=0 if hotlinks.findPos(tempcurrentroom)=0 then member("alerttext").text = "You can't get to room:" & return & roomnames.getAt(tempcurrentroom) beep exit end if else if currentroom = -1 then if atticlinks.findPos(tempcurrentroom)=0 then member("alerttext").text = "You can't get to room:" & return & roomnames.getAt(tempcurrentroom) beep exit end if else if roomlinkslist.getAt(currentroom).findPos(tempcurrentroom)=0 then -- problem here if cant get to HoT or attic member("alerttext").text = "You can't get to room:" & return & roomnames.getAt(tempcurrentroom) beep exit end if end if member("alerttext").text = "" -- add the room to the list of last 8 rooms last8rooms.addAt(1,value(char 7 to length(clickedmodel.name) of clickedmodel.name)) if last8rooms.count() > 8 then last8rooms.deleteAt(9) end if member("last4").text = formatlast8rooms() reshadelinks() -- reorient the space put "moving to box " & clickedmodel.name lastroom = currentroom currentroom = value(char 7 to length(clickedmodel.name) of clickedmodel.name) if tempcurrentroom > 0 then moveCameraBehind(clickedmodel.name) lastrotationroom = tempcurrentroom else if tempcurrentroom = -2 then else if tempcurrentroom = -1 then end if end if cursor 0 end   on extractRoomname(nstring) global roomnames roomindex = value(nstring.char[7..nstring.length]) if roomindex = -2 then return "the_hall_of_time" else if roomindex = -1 then return "attic" else return roomnames.getAt(roomindex) end if end

Script 3: interactive rotate

-- rotate the space when the mouse is held down on mouseDown initialmouseV = the mouseV currentcampos = member("scene").camera("DefaultView").transform.position rotationaxis = vector(-currentcampos.y, currentcampos.x, 0) repeat while the mouseDown initialmouseV = the mouseV t=the ticks repeat while the ticks - t < 5 end repeat rotateamount = initialmouseV - the mouseV member("scene").camera("DefaultView").rotate(vector(0,0,0),rotationaxis, rotateamount, member("scene").model("newBox0")) updatestage end repeat end mouseDown

Script 4: set things up

on prepareFrame me global AHOTheight, last8rooms, currentroom, lastroom, lastrotationroom -- create center box, attic, and hall of time createmybox(0, 0, 0, 0, 0, 0, 0) createmybox(-2, 0,0, AHOTheight, 20, 20, 20) createmybox(-1, 0,0, -1*AHOTheight, 20, 20, 20) -- create all other rooms spreadoutboxes(31) -- put member("scene").camera("DefaultView").transform.position member("scene").camera("DefaultView").transform.position = vector(0,-525,150) member("scene").camera("DefaultView").pointAt(vector(0,0,0)) createAllLinks shadeAllLinks -- set HOT as first room last8rooms.addAt(1,-2) currentroom = -2 lastroom = 24 lastrotationroom = 24 if last8rooms.length > 8 then last8rooms.deleteAt(9) end if member("room over").text = "" member("link over").text = "" member("last4").text = "" member("alerttext").text = "" member("last4").text = formatlast8rooms() reshadelinks() end prepareFrame

Script 12

on exitFrame me go to the frame end

Script 13: create all links

on createAllLinks global roomnames, hotlinks, atticlinks, roomlinkslist, linkstodefer repeat with l in hotlinks linkrooms(-2,l) end repeat repeat with l in atticlinks linkrooms(-1,l) end repeat repeat with r = 1 to roomlinkslist.count repeat with l in roomlinkslist.getAt(r) linkrooms(r,l) end repeat end repeat repeat with l in linkstodefer --member("3D World").modelResource("Tube").topRadius = 0.0 member("scene").modelResource(l).topRadius = 2 end repeat end createalllinks

Script 15: format last 8 rooms

on formatlast8rooms global last8rooms, roomnames tt = "" repeat with r in last8rooms if r = -2 then n = "the_hall_of_time" else if r = -1 then n = "attic" else n = roomnames.getAt(r) end if tt = tt & n & return end repeat return tt end

Script 16: linkrooms

on linkrooms a, b global roomlinks, nPMNodes global roomnames, hotlinks, atticlinks, roomlinkslist, linkstodefer -- link two rooms t3DspriteNum = 1 --Create the new Cylinder modelResource cylname = "link" & string(a) & "to" & string(b) cylresname = "reslink" & string(a) & "to" & string(b) -- if the link exists, then remember it so that the cone can be changed to a cylinder later if linkexists(a,b) then cylresnameFLIP = "reslink" & string(b) & "to" & string(a) linkstodefer.append(cylresnameFLIP) -- member("scene").modelResource(cylresnameFLIP).topRadius = 2 exit end if add(roomlinks,cylname) if voidP( sprite(1).member.model(cylname)) then -- put "linking: " & string(a) & " to " & string(b) tCylinderResource=member("scene").newmodelresource(cylresname, #cylinder, #both) --Create a new model, based upon the new Cylinder modelResource cylnamemodel = member("scene").newmodel(cylname, tCylinderResource) cylnamemodel.addtoworld() member("scene").modelResource(cylresname).bottomRadius = 2 member("scene").modelResource(cylresname).topRadius = .1 POSa = member("scene").model("newBox" & a).transform.position POSb = member("scene").model("newBox" & b).transform.position member("scene").modelResource(cylresname).height = POSa.distanceTo(POSb) linkpos = ((POSa + POSb)/2) -- put POSa & " - " & POSb & " - " & linkpos member("scene").model(cylname).transform.position = linkpos -- if the link is not in the plane of rooms excluding hall of time and attic then -- there is no need to rotate it in the yz plane otherwise rotate it if (POSb.z - POSa.z) = 0 then angletorotateyz = 0 else -- angletorotateyz = -(atan((POSb.y - POSa.y)/(POSb.z - POSa.z)))/PI*180 if (a=-1 and b=-2) or (a=-2 and b=-1) then angletorotateyz = 90 else if a=-1 or b=-1 then if linkpos.x > 0 then angletorotateyz = -45 -- -25.5 else angletorotateyz = 225 -- 205.5 end if else if linkpos.x > 0 then angletorotateyz = 225 -- 205.5 else angletorotateyz = -45 -- -25.5 end if end if end if -- rotate to angle between rooms if (POSb.x - POSa.x) = 0 then angletorotatexy = 180 else angletorotatexy = 90+(atan((POSb.y - POSa.y)/(POSb.x - POSa.x)))/PI*180 end if -- put angletorotatexy & " - " & angletorotateyz member("scene").model(cylname).rotate(vector(angletorotateyz,0,angletorotatexy)) end if end linkrooms on linkexists(a,b) -- trying to create a link from a to b is there already link from b to a? global roomlinks,roomnames, hotlinks, atticlinks, roomlinkslist cylresnameFLIP = "link" & string(b) & "to" & string(a) return roomlinks.findPos(cylresnameFLIP)<>0 end linkexists

Script 17: create boxes

on spreadoutboxes(x) baseangle = 2*PI/x global nPMNodes, currentroom -- spread out boxes around a cirle of a given radius currentroom = x/2 nPMNodes = (x).float repeat with i = 1 to x createmybox(i,150*(cos(baseangle*i),150*(sin(baseangle*i)),0,10,10,10) end repeat end spreadoutboxes on createmybox(n,x,y,z,w,h,l) global boxlist -- create a specified box with given number (model name is 'newBox' & n) -- x,y,z is position, w,h,l is size if findPos(boxlist, n)=0 then add boxlist, n else beep exit end if boxname = "newBox" & value(n) boxresourcename = "newBoxResource" & value(n) if voidP( sprite(1).member.model(boxname)) then tSprite = sprite(1) tMember = tSprite.member tTempModel = tMember.newModel(boxname) tBoxResource = tMember.newModelResource(boxresourcename, #box) tBoxResource.width = w tBoxResource.height = h tBoxResource.length = l tBoxResource.left = 1 tBoxResource.right = 1 tBoxResource.top = 1 tBoxResource.bottom = 1 tBoxResource.front = 1 tBoxResource.back = 1 tTempModel.resource = tBoxResource tTempModel.parent = tMember.group("world") tTempModel.addToWorld() tMember.model(tTempModel.name).transform.position = vector(x, y, z) if n > 0 then thisWorldPosn = member("Scene").model("newBox0").worldPosition sprite(1).member.model(boxname).pointAt(thisWorldPosn) end if end if end createmybox

Script 18: Create box

on mouseUp(me) createmybox(1,.25,.25) createmybox(2,.5,.55) createmybox(3,.75,.75) go next end on createmybox(n,w,h) boxname = "newBox" & value(n) boxresourcename = "newBoxResource" & value(n) repeat with m= 1 to sprite(1).member.model.count -- put sprite(1).member.model[m] end repeat if voidP( sprite(1).member.model(boxname)) then tSprite = sprite(1) tMember = tSprite.member tTempModel = tMember.newModel(boxname) tBoxResource = tMember.newModelResource(boxresourcename, #box) tBoxResource.width = 20 tBoxResource.height = 20 tBoxResource.length = 20 tBoxResource.left = 1 tBoxResource.right = 1 tBoxResource.top = 1 tBoxResource.bottom = 1 tBoxResource.front = 1 tBoxResource.back = 1 tTempModel.resource = tBoxResource tTempModel.parent = tMember.group("world") tTempModel.addToWorld() updatestage tCenterPoint = point(sprite(1).width*w, sprite(1).height*h) updatestage tPointToVector = tSprite.camera.spriteSpaceToWorldSpace(tCenterPoint - point(tSprite.left, tSprite.top)) updatestage tMember.model(tTempModel.name).transform.position = tPointToVector end if end createmybox

Script 30: shade all links

on shadeAllLinks global roomlinks, mydefaulttexture, textureIntensity1, textureIntensity2, textureIntensity3, textureIntensity4 global THEshader, shaderI1, shaderI2, shaderI3, shaderI4, shaderpath, texturepath -- create default link shaders and textures then apply them tSprite = sprite(1) tMember = tSprite.member if voidP(sprite(1).member.shader("THEshader")) then THEshader = tMember.newShader("THEshader", #standard) end if if voidP(sprite(1).member.shader("shaderI1")) then shaderI1 = tMember.newShader("shaderI1", #standard) end if if voidP(sprite(1).member.shader("shaderI2")) then shaderI2 = tMember.newShader("shaderI2", #standard) end if if voidP(sprite(1).member.shader("shaderI3")) then shaderI3 = tMember.newShader("shaderI3", #standard) end if if voidP(sprite(1).member.shader("shaderI4")) then shaderI4 = tMember.newShader("shaderI4", #standard) end if if voidP(sprite(1).member.shader("shaderpath")) then shaderpath = tMember.newShader("shaderpath", #standard) end if if voidP(sprite(1).member.texture("mydefaulttexture")) then mydefaulttexture = tMember.newTexture("mydefaulttexture" , #fromCastMember, member("my default texture")) end if if voidP(sprite(1).member.texture("textureIntensity1")) then textureIntensity1 = tMember.newTexture("textureIntensity1" , #fromCastMember, member("texture intensity 1")) end if if voidP(sprite(1).member.texture("textureIntensity2")) then textureIntensity2 = tMember.newTexture("textureIntensity2" , #fromCastMember, member("texture intensity 2")) end if if voidP(sprite(1).member.texture("textureIntensity3")) then textureIntensity3 = tMember.newTexture("textureIntensity3" , #fromCastMember, member("texture intensity 3")) end if if voidP(sprite(1).member.texture("textureIntensity4")) then textureIntensity4 = tMember.newTexture("textureIntensity4" , #fromCastMember, member("texture intensity 4")) end if if voidP(sprite(1).member.texture("texturepath")) then texturepath = tMember.newTexture("texturepath" , #fromCastMember, member("texture path")) end if repeat with m in roomlinks tMember.model(m).shader = THEshader tMember.model(m).shader.texture = mydefaulttexture tMember.model(m).shader.textureMode = #none end repeat end on reshadelinks global roomlinks, last8rooms, mydefaulttexture, textureIntensity1, textureIntensity2, textureIntensity3, textureIntensity4 global THEshader, shaderI1, shaderI2, shaderI3, shaderI4, shaderpath, texturepath global roomlinkslist, hotlinks, atticlinks shadealltodefault i = 1 repeat with r in last8rooms if r = -2 then rls = hotlinks else if r = -1 then rls = atticlinks else rls = roomlinkslist.getAt(r) end if put "Links from room " & r & ":" & rls repeat with l in rls -- m is link name m = "link" & string(r) & "to" & string(l) if roomlinks.findPos(m)=0 then m = "link" & string(l) & "to" & string(r) end if case i of 1 : sprite(1).member.model(m).shader = shaderI1 sprite(1).member.model(m).shader.texture = textureIntensity1 2 : --sprite(1).member.model(m).shader = shaderI2 --sprite(1).member.model(m).shader.texture = textureIntensity2 3 : --sprite(1).member.model(m).shader = shaderI3 --sprite(1).member.model(m).shader.texture = textureIntensity3 4 : --sprite(1).member.model(m).shader = shaderI4 --sprite(1).member.model(m).shader.texture = textureIntensity4 end case if i = 1 then roomname = "newBox" & string(l) --put "shading box: " & roomname shadeabox(roomname, shaderI1) end if end repeat i = i + 1 end repeat --shade users path red repeat with i = 1 to (last8rooms.count()) if last8rooms.count() <> i then m = "link" & string(last8rooms.getAt(i)) & "to" & string(last8rooms.getAt(i+1)) if roomlinks.findPos(m)=0 then m = "link" & string(last8rooms.getAt(i+1)) & "to" & string(last8rooms.getAt(i)) end if sprite(1).member.model(m).shader = shaderpath sprite(1).member.model(m).shader.texture = texturepath end if shadeabox("newBox" & string(last8rooms.getAt(i)), shaderpath) sprite(1).member.model("newBox" & string(last8rooms.getAt(i))).shader.texture = texturepath end repeat end on shadealltodefault global roomlinks, mydefaulttexture, textureIntensity1, textureIntensity2, textureIntensity3, textureIntensity4 global THEshader, shaderI1, shaderI2, shaderI3, shaderI4, shaderpath, texturepath repeat with m in roomlinks sprite(1).member.model(m).shader = THEshader sprite(1).member.model(m).shader.texture = mydefaulttexture sprite(1).member.model(m).shader.textureMode = #none end repeat repeat with i = 1 to 31 shadeabox("newBox" & string(i), THEshader) end repeat shadeabox("newBox-1", THEshader) shadeabox("newBox-2", THEshader) end on shadeabox(b, s) repeat with i = 1 to 6 sprite(1).member.model(b).shaderlist[i] = s end repeat end

Script 31: set/clean up

on startMovie global roomnames, hotlinks, atticlinks, roomlinkslist, linkstodefer global AHOTheight, last8rooms -- hall of time is -2, attic is -1 last8rooms = [] linkstodefer = [] roomnames = ["anechoic_chamber","answering_machine","aquarium","breakfast_table","cartoon","chalk","cutting","ear","eye_as_camera","fax","green_room","hotel","ice_rink","lab","love_line","music","night_flight","ouija","palm_reader","phone","planetarium","plug","psychiatrist’s","shadow","stage","ugly_one_with_the_jewels","waiting","wave","web","writing","you_know_those_nights"] hotlinks = [-1,1,3,5,6,7,8,11,12,13,16,18,20,21,22,24,25,26,27,28,30] atticlinks = [1,4,5,6,7,8,11,12,13,14,15,16,18,19,20,22,23,24,25,-2,27,29,30] roomlinkslist = [[-1,-2,16], [1,3,5,6,7,8,11,12,13,16,18,19,20,21,22,23,24,25,26,27,28,29,30,-1,-2], [-1,-2], [-1,-2,22,24], [-1,-2], [5,16,30,-1,-2], [-1,-2], [18,-1,-2], [-1,-2,1,3,5,6,7,8,11,12,13,16,18,19,20,21,22,23,24,25,26,27,28,30], [-1], [-1,-2], [-1,-2], [-1,-2], [-1,-2], [-1,-2], [-1,-2], [-1,-2], [-1,-2], [-1,-2], [2,6,15,29,-1], [9,13,17,26,31,-1], [-1,16,18,24,30], [-1,-2], [-1,-2], [-1], [-1,-2], [-1,18,24], [1,-1], [-1,-2], [-1,-2], [-1,-2]] --roomlinkslist = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] AHOTheight = 150 member("last4").text = "" cleanUp end startMovie   on stopMovie cleanUp end stopMovie on cleanUp global boxlist, roomlinks if voidp(boxlist) then boxlist = [] if voidp(roomlinks) then roomlinks = [] cleanUpobject("Sphere", 1) cleanUpobject("Sphere", 2) repeat with b in boxlist cleanUpobject("Box", b) end repeat boxlist = [] repeat with b in roomlinks cleanUpobject("link", b) end repeat roomlinks = [] if NOT(voidP(sprite(1).member.texture("mydefaulttexture"))) then sprite(1).member.deleteTexture("mydefaulttexture") end if if NOT(voidP( sprite(1).member.texture("textureIntensity1"))) then sprite(1).member.deleteTexture("textureIntensity1") end if if NOT(voidP( sprite(1).member.texture("textureIntensity2"))) then sprite(1).member.deleteTexture("textureIntensity2") end if if NOT(voidP( sprite(1).member.texture("textureIntensity3"))) then sprite(1).member.deleteTexture("textureIntensity3") end if if NOT(voidP( sprite(1).member.texture("textureIntensity4"))) then sprite(1).member.deleteTexture("textureIntensity4") end if if NOT(voidP( sprite(1).member.texture("texturepath"))) then sprite(1).member.deleteTexture("texturepath") end if if NOT(voidP( sprite(1).member.shader("THEshader"))) then sprite(1).member.deleteShader("THEshader") end if if NOT(voidP(sprite(1).member.shader("shaderI1"))) then sprite(1).member.deleteShader("shaderI1") end if if NOT(voidP(sprite(1).member.shader("shaderI2"))) then sprite(1).member.deleteShader("shaderI2") end if if NOT(voidP(sprite(1).member.shader("shaderI3"))) then sprite(1).member.deleteShader("shaderI3") end if if NOT(voidP(sprite(1).member.shader("shaderI4"))) then sprite(1).member.deleteShader("shaderI4") end if if NOT(voidP(sprite(1).member.shader("shaderpath"))) then sprite(1).member.deleteShader("shaderpath") end if if NOT(voidP( sprite(1).member.model("newParticles"))) then sprite(1).member.deleteModel("newParticles") end if if NOT(voidP( sprite(1).member.modelResource("newParticleResource"))) then sprite(1).member.deleteModelResource("newParticleResource") end if end cleanUp on cleanUpobject(what, n) if what = "Box" or what = "Sphere" then Oname = "new" & what & value(n) Oresourcename = "new" & what & "Resource" & value(n) else if what = "link" then Oname = n Oresourcename = "res" & n end if if NOT(voidP( sprite(1).member.model(Oname))) then sprite(1).member.deleteModel(Oname) end if if NOT(voidP( sprite(1).member.modelResource(Oresourcename))) then sprite(1).member.deleteModelResource(Oresourcename) end if end cleanUpBox

Script 32: move camera behind

on moveCameraTo(v) global nPMNodes, lastroom, currentroom, lastrotationroom currCamVect = member("scene").camera("DefaultView").transform.position if lastroom < 0 then lasttemp = lastrotationroom else lasttemp = lastroom end if put "lasttemp: " & lasttemp modcalc = (currentroom - lasttemp) mod nPMNodes put "modcalc: " & modcalc if modcalc < 0 then modcalc = modcalc + nPMNodes put v & " - " & currentroom & " - " & lastroom & " - " & modcalc if modcalc > (nPMNodes/2) then rotationvector = vector(0,0,-5) else rotationvector = vector(0,0,5) end if vtemp = vector(v.x, v.y, 0) currCamVect = member("scene").camera("DefaultView").transform.position currCamVecttemp =vector(currCamVect.x, currCamVect.y, 0) -- put vtemp & "+"& currCamVecttemp & "+"& vtemp.angleBetween(currCamVecttemp) anglebetweenV = 5 smallstep = false repeat while (vtemp.angleBetween(currCamVecttemp) > anglebetweenV) if vtemp.angleBetween(currCamVecttemp) < 10 and not smallstep then anglebetweenV = 1 rotationvector = rotationvector / 5 smallstep = true end if member("scene").camera("DefaultView").rotate(rotationvector, member("scene").model("newBox0")) vtemp = vector(v.x, v.y, 0) currCamVect = member("scene").camera("DefaultView").transform.position currCamVecttemp =vector(currCamVect.x, currCamVect.y, 0) put vtemp & "+"& currCamVecttemp & "+"& vtemp.angleBetween(currCamVecttemp) updatestage --repeat while (the controlDown = false) --end repeat end repeat --beep 2 end moveCameraTo on moveCameraBehind(o) objectposition = member("scene").model(o).transform.position objectposition.x = objectposition.x * 3 objectposition.y = objectposition.y * 3 objectposition.z = objectposition.z + 50 moveCameraTo(objectposition) end moveCameraBehind