Previous Next

Home Up


FurryMUCK - spaceship construction

For those wanting to move around FurrySpace, a spaceship of some type is neccesary. I'm a firm advocate of the object+room school of thought, so that's what I'll cover here. It's possible to construct a ship using only a vehicle object, but I don't care for that style as a matter of preference.


Small ship

This will be a small ship, consisting of the ship object plus a single room to act as the cockpit. This model fits many small ships such as shuttlecraft and single- or dual-seat fighters. It's a good, basic starting place if you need personal transportation. You will need quota for 1 room, 1 thing and 6 exits for this, and 25 to 30 pennies should be more than sufficient for all building involved.

The first thing is to create the ship object itself. This will be what moves around the rooms in space. Think of a name for the ship. For my example, I'll use the rather generic name Shuttlecraft. Then do:

@create Shuttlecraft==ship
@set Shuttlecraft=j
@set Shuttlecraft=x
@set Shuttlecraft=v
@lock Shuttlecraft=me
@flock Shuttlecraft=me
@conlock Shuttlecraft=me
This will create an object called Shuttlecraft and place it in your inventory. It will also create a registered name $ship by which you can refer to the object without knowing it's dbref. If you are already using $ship as a registered name for something, pick a different one for the shuttlecraft. The object is then set JUMP_OK and XFORCIBLE so it can move and be forced to do things, made a vehicle, and locked so only you can pick it up, hand it things or force it around.

Now, create a description for the ship. Start by doing:

lsedit Shuttlecraft=_descs/normal
and use the editor to create the description. I'd advice formatting it to 78 columns and indenting paragraphs. Try to keep it short, 10-15 lines or so at most. When you've got it to your satisfaction, use the .end command to save it and edit the editor. Now do:
@set Shuttlecraft=desc?:normal
@desc Shuttlecraft={eval:{list:_descs/{prop:desc?}}}
This will set up the description through the desc? property so that you can create multiple descriptions in the _desc/ propdir and switch between them merely by changing the value of the desc? property. Look at the ship now to make sure the description is working properly. I would then finish out some things by doing:
@set Shuttlecraft=sex:none
@set Shuttlecraft=gender:none
@set Shuttlecraft=species:Shuttlecraft
@set Shuttlecraft=_flight?:yes
@set Shuttlecraft=target?:yes
@set Shuttlecraft=_receive_ok?:yes
@set Shuttlecraft=_remote_look?:yes
@set Shuttlecraft=_throw_ok?:yes
@set Shuttlecraft=_hand/hand_ok?:yes
@set Shuttlecraft=_hand/msg_ok?:yes
to set up various miscellaneous things. You can change the species to match roughly the type or class of ship. Also select a ship size. The current sizes are: You will probably, for a small ship like this, want a size between 2 and 4. Once you have selected the number, do:
@set Shuttlecraft=ship_size:number
You can get more information on ship sizes by doing @list #66364=1-46 to read the program docs on the locking program that uses this information.

The basics of the object are set up. Now we need to create the room that will be the cockpit, and create the exits that will let you get in and out of the cockpit. At this point, find a quiet room where the object won't be disturbed or tripped over by others. Your own home will do. Drop the Shuttlecraft there. Now, dig the room for the cockpit with:

@dig Shuttlecraft Cockpit=#78722=cockpit
This creates the cockpit room, parents it to BoingDragon's Vehicle environment room to get some useful stuff, and creates a registered name $cockpit to refer to the cockpit by if you forget the dbref. Then create the exit that will let you enter the cockpit by doing:
@action board Shuttlecraft=$ship
@link board Shuttlecraft=$cockpit
You have now created an action called 'board Shuttlecraft' and linked it to the cockpit so that by using the action you are taken into the cockpit. You can use any name you want for the action, but 'board' plus the name of the ship is a common pattern. Now set up the messages to be used when someone climbs into the cockpit. You can vary these somewhat to fit your needs.
@succ board Shuttlecraft=You board the Shuttlecraft.
@osucc board Shuttlecraft=boards the Shuttlecraft.
@fail board Shuttlecraft=You cannot enter the Shuttlecraft.
@ofail board Shuttlecraft=tries to board the Shuttlecraft but cannot.
@odrop board Shuttlecraft=enters the Shuttlecraft from outside.
@set board Shuttlecraft=d
The last line makes the exit DARK, to suppress the default messages now that you have your own set up. Now, decide on how you want access restricted. You can have unrestricted access, in which case you don't need any locks. You can restrict access to only yourself, by doing:
@lock board Shuttlecraft=me
so that only you are allowed on board. Or you can limit the number of people allowed on board to a specific number, for example 2 for a dual-seat fighter craft. For this, decide on the number N of people allowed on board, and do the following:
@set board Shuttlecraft=capacity:N
@lock board Shuttlecraft=#13071
Now people will be denied access if there are N or more people in the Shuttlecraft's cockpit. Note that you can always tport $cockpit to get in regardless of how many people are already in there.

At this point, enter the cockpit by:

board Shuttlecraft

The room is extremely blank right now. Don't worry, we'll fix that very quickly. First off, do:

@set here=j
@succ here=@$ObvExits
This will allow things to be handed and tossed in the cockpit, and will temporarily make all actions in the room visible when you look at the room. You can remove this later, but for now it makes it easier to keep track of what's there.

Now it's time to set the properties that link the cockpit and ship object for various programs. Do an ex me=_reg/ and look at the lines for ship and cockpit. Each will have a number after the colon (':'). Substitute the number on the ship line for 12345 and the number from the cockpit line for 67890 in the following commands:

@set $cockpit=goto:12345
@set $cockpit=_map/ref:12345
@set $ship=cont:67890
@set $ship=cockpit:67890
@set $ship=shields_up?:no

The goto property on the cockpit is used by most programs to determine the ship object. The _map/ref property is used by the map command to decide which room's map to show. Since there's only one room on our ship, this is set permanently to the ship object so that using the map command shows the map for the room the ship is is. The cont property on the ship is used by most programs to locate the ship's room from the ship object. The cockpit property is used similarly by a couple of oddball programs. The shields_up property says that your defense shields are not active at the moment.

Now that we've gotten ourselves in here, it's time to make a way back out. Create an exit by:

@action out=here
@link out=#32153
This will create an out exit and link it to a program that will use the goto property to take you to whatever room the ship object is in when you use the exit. At this point, going out should take you back to the room you have the ship in. You can test this, then re-enter the cockpit. Now we will describe the exit so that you can look out and see what's outside:
@desc out=@36002 You look out and see:
@set out=show:ndcs
You can vary the text in the @desc line to suit, but leave the @36002 at the start in place since that is the part that triggers showing the room the ship is in when you look at the exit. You can set messages on the exit for when you leave the ship, but it's done in a slightly different way than for boarding:
@set out=exit_drop:You leave the Shuttlecraft.
@set out=exit_osucc:leaves the Shuttlecraft.
@set out=exit_odrop:comes out of the Shuttlecraft.
@set out=exit_fail:You cannot get out of the Shuttlecraft here.
@set out=exit_ofail:tries to leave the Shuttlecraft but cannot.
@set out=d

The out exit is fine if you're in a landing bay or on a planet. But what about ship-to-ship transfers in space? You've no docking tube, and a small fighter or shuttle can't carry one. There's always the transporter, though. This functions the same way the Star Trek transporters do. There are two parts: setting up to allow transport, and creating an action to act as a transporter. To allow transport:

@set $cockpit=trans_on?:yes
@set $ship=trans_on?:yes
You can use @list #61809=1-29 to get information on all the properties used by the transporter program. If the shields_up? property is set to "yes" on the ship object, the transporter will not function through the active defense shields. When you beam to your ship, you will be sent to the room specified in the cont property on the ship object, in this case your cockpit. This only allows you to transport from somewhere else onto your ship. To transport from your ship to elsewhere, do:
@action transport=here
@link transport=#61809
@fail transport=You are not allowed to use the transporter
You can then use transport <destination object> to transport to another ship or station that is set up for transporter use. You will be beamed to the room the owner has configured via the cont property on the object. Doing transport #help will get the help screen. Note that in-character use of the transporter requires some thought. A small ship, for example a fighter, can't mount a transporter of it's own. A larger ship could beam you off, though. The only way to simulate this is to have a transporter action on your ship, but only use it when the other ship could and would beam you. Of course, this sort of role-playing, limiting what your ship can do to match the abilities your ship ought to have, is part of the game.

You should now set up a couple of properties for miscellaneous use:

@set here=_mech/name:Shuttlecraft
@set here=_unfindable:no
look #option here=remote?:yes
Change the value of the name property above to match whatever the name of the ship is. This is for use by various programs. The _unfindable setting makes it so that people can find you when you are in the cockpit. The look command sets it so that people can look at objects other people are carrying.

Next step is to set up the command to scan locations and objects outside the ship. This is a fairly easy process. First, we need to create the action to do the scanning:

@action scan=here
@link scan=#82576
@succ scan=Scanning {&arg}
@fail scan=You are not allowed to scan.
@set scan=d
This will let you do scan to scan and see the area you're in, or scan <object> to scan a particular object in the area.

Now that you can see actively by using an action, you need to be able to see and hear passively what happens near your ship. This is done by setting a listen program up to process anything that your ship object sees and hears and pass it along to the cockpit room. Do this by:

@set $ship=_listen/tell:133065
@set $ship=listen/dest:67890
@set $ship=listen/filter:off
@set $ship=listen/power:on
@set $ship=listen/recurse:off
@set $ship=listen/pre:Outside>
Note the leading underscore on the first line only. This sets up the Listen.MUF program to handle messages in the room the ship object is in. The remaining 5 commands set up the properties for Listen.MUF including what room to forward the messages to. You can check the docs on Listen.MUF for more information by doing @list #133065=1-33 and reading the descriptions of all the properties. The way I have this set up, anything happening outside the ship, including the ship's poses and such, will be echoed in the cockpit prefixed by "Outside>". I also turn off recursion, which means that the messages will only be echoed to the cockpit and not any child rooms. The cockpit doesn't have any child rooms, so this is correct. Recursion is used on multi-room ships.

OK, you can get in and out, see where your ship is, examine objects in space near you and see and hear what happens around your ship. Now you need to be able to move. There are two actions needed for this, one to actually force the ship object to execute commands and one to make it pose actions. First, to move:

@action fly=here
@link fly=#188557
@fail fly=You are not allowed to move the ship.
@set fly=d
@set fly=_object:12345
That's all that's needed, the StarDrive.MUF program will take care of the rest. Note that we set the _object property on the action to the dbref number of the ship object, so that StarDrive.MUF knows which object to force around. To move, just do fly <exit> to move through a given exit. The fly command will actually let you execute almost any command by doing fly <command string>. In theory you can use the pose command in conjunction with fly to pose actions, but it's easier to use an action linked to the NewSend program:
@action send=here
@link send=#133559
@fail send=You are not allowed to pose the ship.
@set send=d
@set send=send/dest:12345
Now if you do send <string> the ship will pose the string prefixed with the ship's name just like the pose command or ':' works for your character.

Last thing needed is a way to communicate. In FurrySpace, the FoxCom program is used for communicating with other people, other ships, stations, planets and such. To set up a com unit in the cockpit, do:

@action comc;pubc;switchc;squelchc=here
@link comc=#157433
comc #setup
switchc #name <ship name>
switchc #on space
switchc #on
This will create a room com, set it up, tune it to the Public and Space channels and turn it on. The 4 names for the action all take #help as an argument and display help. If you need to remove the com, do comc #unsetup first before unlinking and recycling the action. This will keep you from creating an invalid entry in the system database of all com units when an active com action is recycled. I use the "c" suffix, standing for "cockpit", to reduce the chance that this com action's name will conflict with personal or portable com units carried by people in the cockpit. For more information on FoxCom, go to the Communications Center by doing taxi then mos then com and reading the bulletin board there.

Common usage of the com unit is to contact a station for docking or departure clearance. For example, before approaching Dreamstar Station, you would set your com to receive channel DSC, broadcast a request for approach and docking clearance on that channel, and wait for Romonova or one of the other Dreamstar traffic controllers to give you clearance. You would similarly broadcast a request for departure clearance before launching, and wait for clearance before proceeding out of the docking bays. Ignoring the controller's instructions or not requesting clearance can get station control mad at you, something you don't want.

Last thing on the agenda. You've got a description for your ship, but a scan of your ship should logically show information about ship's systems and such, right? Well, that has been accounted for by the readout properties. These are additional information shown when someone scans your ship with sensors, and do not show up in the description. The common usage is that the description gives what the naked eye could see, while the readout gives technical information that sensors would report. To set it up, first create the readout text using lsedit $ship=_readouts/normal. Edit the text appropriately, using .indent as needed, and save it using .end. The readout text for my ship looks something like this:

Scanners indicate:
------------------------------------------------------------
Name:     Gypsy Dancer        Owner:    Jeran
Type:     Kestrel 36/I        Class:    Heavy Interceptor, modified
Assigned: N/A                 Ident:    N/A
Com Ch:   GypsyDancer
------------------------------------------------------------
Length    32 meters
Height:   Body:  6 meters     Overall: 10 meters  
Width:    Body: 10 meters     Overall: 29 meters
------------------------------------------------------------
Sublight Engines:   2 DiMarkos/Valiant Mk.7 gravitonic drives
FTL Engines:        2 KTL-437 microwarp drive units
------------------------------------------------------------
Weapons:            2 light railguns, fixed forward mount
Shields:              Vr'Keshn Industries Model 27 light shields
Cloaking:             present, type unidentifiable
EW/ECM:               extensive, deception mode, comm intercept
You'll probably want to vary it, but it should give you a general idea of the format and kinds of information to put in. Yes, you will have to think a bit about the equipment on your ship. Once you have the text prepared, do:
@set $ship=_/mpilok.xlist:!#0
@set $ship=readout?:normal
@set $ship=sensor/readout:Scanners indicate:{nl}{xleval:_readouts/{prop:readout?}}
Now if you scan your own ship, you'll get the readout appended to the description. As with the description, this is set up so you could create multiple readout texts in the _readouts propdir on the ship object and simply point the readout? property to the one you want to use at the moment.

You now have a functioning spaceship. You can now get out, take the ship object, go to someplace like the Mos Ottersley landing bays, drop it, get in and fly yourself to orbit. All of the actions in the cockpit are unlocked, so anyone can get in your ship and pilot it around. You can, if you want, lock the boarding action and/or the actions in the cockpit in various ways to prevent others from using your ship without permission. The most common methods are to lock them to your character, or to create a key object and lock them to your character or the key object. Your best bet for help on locking is to ask another experienced player, or check with the Helpstaff.


Large ship

Under construction
Under construction. I have not yet built a true large
ship, and I want to do so before finishing this section.


Previous Next

Home Up


tknarr@silverglass.org