/* Cellular-U phone the U-phone is a funky object, since they all share a common pool of strings and functions, as well as a subscriber list. Thus, each phone only has a few local variables, and a couple references to other functions. */ #define PHONENUM #6 /* shared strings */ PHONENUM.nam = "Cell-U-lar One cellular phone"; PHONENUM.dsc = "a small black portable telephone with the Cell-U-lar One corporation logo on it. a little label on the side has instructions for use"; PHONENUM.txt = "instructions: list, dial '#', answer, hangup, say, on, off"; PHONENUM.hmsg = "perhaps you should hang up first.\n"; /* put the first phone in its subscriber list */ PHONENUM.plist = listnew(PHONENUM); /* null these to be safe */ PHONENUM.ohook = NULL; PHONENUM.cfrom = NULL; PHONENUM.dest = NULL; PHONENUM.user = NULL; /* list current phones / locations */ func PHONENUM.list { foreach $phone in (#self.plist) { if($phone.user.nam != NULL) { echo($phone," - ",$phone.user.nam); if($phone.ohook != NULL) echo(" (in use)\n"); else echo("\n"); } } } /* talk into the phone */ func PHONENUM.say { if(#self.ohook == NULL) { echo("the phone is hung up\n"); foreach $guy in (#actor._loc._ply) { if($guy != #actor) { echoto($guy,#actor.nam," says, \""); foreacharg $tmp echoto($guy,$tmp," "); echoto($guy,"\"\n"); } else { echo("You say, \""); foreacharg $tmp echo($tmp," "); echo("\"\n"); } } return; } echoto(#self.ohook.user,#actor.nam," says, \""); foreacharg $tmp echoto(#self.ohook.user,$tmp," "); echoto(#self.ohook.user,"\" into the phone\n"); echo("You say, \""); foreacharg $tmp echo($tmp," "); echo("\" into the phone\n"); } /* dial a phone */ func PHONENUM.dial { if(#self.ohook) { echo(PHONENUM.hmsg); return; } if($# != 1) { echo("dial what number ? (give the #, not the user)\n"); return; } $num = atoobj($1); if($num == NULL) { echo($1," cannot be completed as dialed. please check the number and try again.\n"); return; } if(listsearch(#self.plist,$num) == NULL) { echo($num," is not in service.\n"); return; } if($num.ohook != NULL) { echo($num," is busy.\n"); return; } if($num.user == NULL) { echo($num," is turned off.\n"); return; } /* mark the other phone as being rung by us. */ $num.cfrom = #self; /* mark us as trying to talk to them */ $tmp = #self.ohook = $num; if($tmp == NULL) echo("cannot unhook phone: ",$tmp,"\n"); echoto($num.user,$num.nam," rings softly\n"); echo("...ring...\n"); } chmod(&PHONENUM.dial,"W:rs"); /* answer a phone */ func PHONENUM.answer { if(#self.ohook) { echo(PHONENUM.hmsg); return; } if(#self.cfrom == NULL) { echo("the other party has hung up\n"); return; } $tmp = #self.ohook = #self.cfrom; if($tmp == NULL) echo("cannot unhook phone: ",$tmp,"\n"); #self.user = #actor; #self.cfrom = NULL; echoto(#self.ohook.user,#actor.nam," answers the phone\n"); echo("you are connected to ",#self.ohook.user.nam,"\n"); } chmod(&PHONENUM.answer,"W:rs"); /* hang up a phone */ func PHONENUM.hangup { if(#self.ohook == NULL) { echo("it is already hung up\n"); return; } echoto(#self.ohook.user,"<click>\n",#actor.nam," hangs up the phone\n"); #self.ohook.ohook = NULL; #self.ohook = NULL; echo("<click>\n"); } chmod(&PHONENUM.hangup,"W:rs"); /* turn on a phone */ func PHONENUM.on { if(#self.user) { echo("it is already on.\n"); return; } #self.user = #actor; #self.ohook = NULL; echo("you turn the phone on.\n"); } chmod(&PHONENUM.on,"W:rs"); /* turn off a phone */ func PHONENUM.off { if(#self.user == NULL) { echo("it is already off.\n"); return; } if(#self.ohook.user) { echoto(#self.ohook.user,"<click>\n",#actor.nam," turns off the phone\n"); #self.ohook.ohook = NULL; } #self.ohook = NULL; #self.user = NULL; echo("<click>\n"); } chmod(&PHONENUM.off,"W:rs"); /* make a new phone - clone a phone of my own! */ func PHONENUM.clone { $phone = @.create(PHONENUM.nam); if($phone == NULL) { echo("create failed: ",error($phone),"!!\n"); return; } /* share descs */ $phone.nam = &PHONENUM.nam; $phone.dsc = &PHONENUM.dsc; $phone.txt = &PHONENUM.txt; /* share subscriber list */ $phone.plist = &PHONENUM.plist; /* add to subscriber list */ *$phone.plist = listadd($phone.plist,$phone); echo("added new phone ",$phone," to subscriber list\n"); /* share functions */ $phone.clone = &PHONENUM.clone; $phone.update = &PHONENUM.update; $phone.dial = &PHONENUM.dial; $phone.answer = &PHONENUM.answer; $phone.hangup = &PHONENUM.hangup; $phone.say = &PHONENUM.say; $phone.list = &PHONENUM.list; $phone.on = &PHONENUM.on; $phone.off = &PHONENUM.off; /* unshared vars */ $phone.ohook = NULL; $phone.dest = NULL; $phone.cfrom = NULL; $phone.user = NULL; } /* make it so that only the telephone company can see/use this */ chmod(&PHONENUM.clone,"O:r"); /* update a phone's software - reload it from the master phone */ func PHONENUM.update { if($1 == NULL) { echo("which phone?\n"); return; } $num = atoobj($1); if(!isobj($num)) { echo("invalid number\n"); return; } /* share descs */ $num.nam = &PHONENUM.nam; $num.dsc = &PHONENUM.dsc; $num.txt = &PHONENUM.txt; /* share subscriber list */ $num.plist = &PHONENUM.plist; /* share functions */ $num.clone = &PHONENUM.clone; $num.update = &PHONENUM.update; $num.dial = &PHONENUM.dial; $num.answer = &PHONENUM.answer; $num.hangup = &PHONENUM.hangup; $num.say = &PHONENUM.say; $num.list = &PHONENUM.list; $num.on = &PHONENUM.on; $num.off = &PHONENUM.off; /* unshared vars */ $num.ohook = NULL; $num.dest = NULL; $num.cfrom = NULL; $num.user = NULL; echo("updated service for ",$num,"\n"); } /* make it so that only the telephone company can see/use this */ chmod(&PHONENUM.update,"O:r"); /* add a phone to the service list. */ func PHONENUM.addphone { if($1 == NULL) { echo("which phone?\n"); return; } $num = atoobj($1); if(isobj($num)) { *PHONENUM.plist = listadd(PHONENUM.plist,$num); echo("added\n"); } else { echo("invalid number\n"); } }