Ok, so I kinda solved the problem. Instead of trying to make the program glue the object to random limb 1 to 90, I duplicated the sphere that the limbs attach to to make three spheres occupying the same location in 3D space, then created 30 limbs on each set at the proper offsets to give the appearance of one sphere with 90 limbs. After making my code a little hairier, I finally got my program to behave like I want it to. So until the next hurdle, thanks everyone!
Here's what my code looks like now in case anyone is interested...
sync on
`load bitmap
load bitmap "grass08.bmp",1 : get image 1,0,0,128,128 : delete bitmap 1
`create and texture objects
for x=1 to 3
make object sphere x,120
texture object x,1
position object x,0,0,0
next x
make object sphere 4,5 : make mesh from object 1,4 : delete object 4
load object "AIRDHANG.X",5
load object "CASTLE4.X",6 : scale object 6,150,150,150
load object "BUILDG16.X",7 : scale object 7,50,50,50
load object "TREE5.X",8 : scale object 8,500,500,500
load object "ARTSTORE.X",9 : scale object 9,200,200,200
load object "MUSHROOM.X",10 : scale object 10,10000,10000,10000
load object "TREE3.X",11 : scale object 11,400,400,400
load object "MOBILE.X",12 : scale object 12,6000,6000,6000
load object "WINDMIL3.X",13 : scale object 13,400,400,400
load object "WINDMIL3.X",14 : scale object 14,400,400,400
load object "WINDMIL3.X",15 : scale object 15,400,400,400
for x=1 to 3
for y=1 to 30
add limb x,y,1
hide limb 1,y
next y
next x
`array creation
dim rotation(30,3,2)
dim limb(30,3,1)
for r=1 to 10 : rotation(r,1,1)=30 : next r
for r=11 to 20 : rotation(r,1,1)=50 : next r
for r=21 to 30 : rotation(r,1,1)=67 : next r
for r=1 to 10 : rotation(r,2,1)=78 : next r
for r=11 to 20 : rotation(r,2,1)=90 : next r
for r=21 to 30 : rotation(r,2,1)=102 : next r
for r=1 to 10 : rotation(r,3,1)=113 : next r
for r=11 to 20 : rotation(r,3,1)=130 : next r
for r=21 to 30 : rotation(r,3,1)=150 : next r
`********** OFFSET LIMBS **********
`LIMB SET 1
y=0
for x=1 to 10
rotation(x,1,2)=360-y
rotation(x,2,2)=360-y
rotation(x,3,2)=360-y
offset limb 1,x,cos(y)*33,50,sin(y)*33
offset limb 2,x,cos(y)*58,13,sin(y)*58
offset limb 3,x,cos(y)*55,-26,sin(y)*55
y=y+36
show limb 1,x
next x
`LIMB SET 2
y=0
for x=11 to 20
rotation(x,1,2)=360-y
rotation(x,2,2)=360-y
rotation(x,3,2)=360-y
offset limb 1,x,cos(y)*46,40,sin(y)*46
offset limb 2,x,cos(y)*60,0,sin(y)*60
offset limb 3,x,cos(y)*46,-40,sin(y)*46
y=y+36
show limb 1,x
next x
`LIMB SET 3
y=0
for x=21 to 30
rotation(x,1,2)=360-y
rotation(x,2,2)=360-y
rotation(x,3,2)=360-y
offset limb 1,x,cos(y)*55,26,sin(y)*55
offset limb 2,x,cos(y)*58,-13,sin(y)*58
offset limb 3,x,cos(y)*33,-50,sin(y)*33
y=y+36
show limb 1,x
next x
for s=1 to 3
for h=1 to 30
hide limb s,h
next h
next s
object=5
random:
r=rnd(29)+1
s=rnd(2)+1
if limb(r,s,1)=0
glue object to limb object,s,r
turn object right object,rotation(r,s,2)
roll object right object,rotation(r,s,1)
limb(r,s,1)=1
else
goto random
endif
object=object+1
if object<16 then goto random
x=0
move=0
speed#=0.5
position camera 0,0,-150
point camera 0,0,0
`************** LOOP START **************
DO
for x=1 to 3
yrotate object x, wrapvalue(object angle y(x) + speed#)
next x
if upkey()=1
for x=1 to 3
xrotate object x, wrapvalue(object angle x(x) +0.5)
next x
endif
if downkey()=1
for x=1 to 3
xrotate object x, wrapvalue(object angle x(x) -0.5)
next x
endif
if leftkey()=1
speed#=2
else
speed#=0.5
endif
sync
LOOP