# Jacobs, Lara, and Jeffery # representation of the PLEASE Lab # formerly please8.icn link cve global gwin procedure make_cooridoor() local cooridoor cooridoor := Room("cooridoor", -5, 0, 4, 10, 5, 3.95, "wall2.gif") put(Rooms, cooridoor) return cooridoor end procedure make_SH167(cooridoor) local SH167, d, pillar, pleasewindow, whiteboard SH167 := Room("SH 167", -5, 0, 0, 10, 5, 6) SH167.floor := Wall("floor2.gif",-5,0,0, -5,0,-6, 5,0,-6, 5,0,0) d := Door(3, 0, 0) SH167.add_door(d) cooridoor.add_door(d, 1) # PILLAR -- should redo as a single (cube) object pillar := Box() pillar.mkwall(4,0,-6,4,5,-6, 4,5,-5.5,4,0,-5.5) pillar.mkwall(4,0,-5.5,3.5,0,-5.5,3.5,5,-5.5,4,5,-5.5) pillar.mkwall(3.5,0,-5.5,3.5,5,-5.5,3.5,5,-6,3.5,0,-6) SH167.add_obstacle(pillar) pleasewindow := Wall("wall2.gif", -5,1.5,-6.2,-5,5,-6.2,5,5,-6.2,5,1.5,-6.2) SH167.add_decoration(pleasewindow) whiteboard := Wall("whiteboard.gif", -4.95,1.5,-.5,-4.95,4,-.5,-4.95,4,-5.5,-4.95,1.5,-5.5) SH167.add_decoration(whiteboard) put(Rooms, SH167) return SH167 end #CONTROLS: #up arrow - move foward #down arrow - move backward #left arrow - rotate camera left #right arrow - rotate camera right # ' w ' key - look up # ' s ' key - look down # ' d ' key - toggle door open/closed #if you get lost in space (may happen once in a while) #just restart the program $include "keysyms.icn" #GLOBAL variables global posx, posy, posz # current eye x,y,z position global lookx, looky, lookz # current look x position and so on global cam_lx, cam_lz, cam_angle # eye angles for orientation global Rooms, curr_room procedure start_please8() local gwin, cooridoor gwin := &window := open("PLEASE Lab", "gl", "size=400,325", "bg=grey", "inputmask=k") WAttrib("texmode=on") #initialize globals posx := 0.0; posy := 2.75; posz := -3.0 lookx := lookz := 0.0; looky := 2.5 cam_lx := cam_angle := 0.0; cam_lz := -1.0 # render graphics Rooms := [ ] cooridoor := make_cooridoor() curr_room := make_SH167(cooridoor) every (!Rooms).render() return gwin end global xdelta, ydelta, lookdelta # #Set up the camera # procedure camera() local dor, ev, L, s, usercmd, message initial { Lselect := [wwindow] } repeat { L := (select(Lselect,0) | []) if *L = 0 then { if /gwin then { delay(200); next } if \xdelta ~= 0 then cam_move(xdelta) if \ydelta ~= 0 then cam_orient_yaxis(ydelta) if \lookdelta ~= 0 then looky +:= lookdelta if (\ ((dor := (\ curr_room).exits[1]).delt)) ~=== 0 then { if not (dor.delta()) then dor.done_opening() else Refresh() } } else { every x := !L do { case x of { wwindow: { #send user input to the server handle_wwindow() &window := \gwin } net: { # note: blocks if no newline or EOF is to be found. fix. s := read(net) | break write("netread: ", image(s)) Cmds.ClientCommand(net, s) WSync() } gwin: { &window := gwin case ev := Event(gwin) of { Key_Up: cam_move(xdelta := 0.05) # Move Foward Key_Down: cam_move(xdelta := -0.05) # Move Backward Key_Left: { ydelta := -0.05 while Pending()[1] === -Key_Left-128 & Pending()[4] === Key_Left do { Event(); Event(); ydelta -:= 0.05 } cam_orient_yaxis(ydelta) # Turn Left } Key_Right: { ydelta := 0.05 while Pending()[1] === -Key_Right-128 & Pending()[4] === Key_Right do { Event(); Event(); ydelta +:= 0.05 } cam_orient_yaxis(ydelta) # Turn_Right } "w": looky +:= (lookdelta := 0.05) #Look Up "s": looky +:= (lookdelta := -0.05) #Look Down "q": exit(0) "d": { dor := curr_room.exits[1] if \ (dor.delt) === 0 then { dor.start_opening() } else dor.done_opening() dor.delta() } -166 | -168 | (-(Key_Up|Key_Down) - 128) : xdelta := 0 -165 | -167 | (-(Key_Left|Key_Right) - 128) : ydelta := 0 -215 | -211 : lookdelta := 0 default: write("unknown event ", image(ev)) } } default: { write("eh?") } } } } Eye(posx,posy,posz,lookx,looky,lookz) } end procedure cam_move(dir) local deltax := dir * cam_lx, deltaz := dir * cam_lz if curr_room.disallows(posx+deltax,posz+deltaz) then { deltax := 0 if curr_room.disallows(posx+deltax,posz+deltaz) then { deltaz := 0; deltax := dir*cam_lx if curr_room.disallows(posx+deltax,posz+deltaz) then { fail } } } #calculate new position posx +:= deltax posz +:= deltaz #update look at spot lookx := posx + cam_lx lookz := posz + cam_lz end # # Orient the camera # procedure cam_orient_yaxis(turn) #update camera angle cam_angle +:= turn if abs(cam_angle) > 2 * &pi then cam_angle := 0.0 cam_lx := sin(cam_angle) cam_lz := -cos(cam_angle) lookx := posx + cam_lx lookz := posz + cam_lz end procedure handle_wwindow() static datagram local e, newdatagram := "", buffer := "", usercmd, message initial datagram := "" &window := wwindow e := Event(wwindow) if type(e) == "integer" & (&lpress >= e >= &rdrag) then fail if not string(e) then { write("nonstring ", image(e)) } else { datagram := datagram || e handle_char(2,e) | fail if e == ("\n"|"\r") then { if Cmds.IsCommand(datagram) then { #check for correct protocol usercmd := Cmds.GetCommand(datagram)#get cmd from cmd line #validate command is available if Cmds.ValidCommand(usercmd) then { #open up connection to server if user requests \login if User.NotLogged(usercmd) then { #make sure user name is given if User.CheckUid(datagram, *usercmd+2) then { if net := open(server || ":" || port, "n") then { put(Lselect, net) write(net, datagram) handle_char(1, "Logging into server as: "|| User.uid, "\n") gwin := start_please8() xdelta := ydelta := lookdelta := 0 cam_move(0.01) Eye(posx,posy,posz,lookx,looky,lookz) put(Lselect, gwin) } else { handle_char(1, "Net open failed", "\n") write(&errout, "Open failed: ") write(&errout, "\t", sys_errstr(&errno)) delay(2000) exit(-1) } } else { handle_char(1, "Unable to connect to server. _ No user name given", "\n") User.uid := "" } } #check for net connection and send message to server else { if net === "" then { handle_char(1, "Not connected to server", "\n") } else { #deny login if already connected to server if usercmd === "login" then { message:="Already logged into server as: " || User.uid handle_char(1, message, "\n") } else write(net, datagram) } } usercmd := "" } #if member else { message := "\\" || usercmd || " is not a command. _ Message not sent to server." handle_char(1, message, "\n") } } #send message to user that command is not valid else { handle_char(1,"\"", image(datagram), "\" is not a correct command line. _ Message not sent to server." , "\n") } #clear variables datagram := "" usercmd := "" WSync() } } end