Ok this is my most difficult task yet.I plan to make a game were bosses and all elements are polygon based. The boss will add more polygons as the game progresses. The most difficult aspect is simply having the ngons line up edge to edge.
I have written a function to create new boss elements called spawn() the problem is that something is wrong with the code, when the boss core is a hexagon the hexagons line up and the other random n-gons are frusteratingly off.
They have the proper centers but the rotation has been corrupted. If the boss shape is anything other than a hexagon the whole system fouls up and the sides are not bisected by the base angles properly. I know this is a daunting task to fix, if you are very good with trig please consider looking this over. I have tried to comment where needed to give you an idea of where i am going.
Ok the blue shape is the boss core and the black ngons are the boss_fragments.

I think everything works it shouldn't require external files.
I have written a function to create new boss elements called spawn() the problem is that something is wrong with the code, when the boss core is a hexagon the hexagons line up and the other random n-gons are frusteratingly off.
They have the proper centers but the rotation has been corrupted. If the boss shape is anything other than a hexagon the whole system fouls up and the sides are not bisected by the base angles properly. I know this is a daunting task to fix, if you are very good with trig please consider looking this over. I have tried to comment where needed to give you an idea of where i am going.
Ok the blue shape is the boss core and the black ngons are the boss_fragments.

'************************************************************************************************** ' This program was written with BLIde (for great justice!) ' Application: 1/2 of a tube twice daily ' Author: Ryan Burnside ' License: Class C driver's licence '************************************************************************************************** Strict Graphics 640,480,0 SeedRnd MilliSecs() Global score%=100000000 ' just a placeholder for now SetBlend ALPHABLEND ' make some functions Function poly_radius#(sidelength:Float,num_sides:Int)' finds circumscribed radius of an ngon Local r:Float = sidelength /(2*Sin(180.0/num_sides)) Return r End Function Function poly_smallradius#(sidelength#,numsides%)' finds the inscribed radius of an ngon Local side#=sidelength/2 Local large_angle#=360/numsides Local small_angle#=large_angle/2.0 Local answer#= side/Tan(small_angle) Return answer EndFunction Function draw_ngon#(x#,y#,numsides%,sidelength#,rotation#)' draws an ngon taking into account rotation Local small_angle# =360.0/numsides Local radius#=poly_radius(sidelength,numsides) For Local i=0 To numsides-1 DrawLine x+Sin(i*small_angle+rotation)*radius,y-Cos(i*small_angle+rotation)*radius,x+Sin((i*small_angle)+small_angle+rotation)*radius,y-Cos((i*small_angle)+small_angle+rotation)*radius Next End Function Function inside_view(x#,y#)' checks to see that an instance is inside the play area If x>160 and x<480 and y>0 and y<480 Return True Else Return False EndIf End Function Function spawn#(parent_x#,parent_y#,parent_numsides#,parent_rotation#,parent_radius#) 'here is the problem code this should simulate random ngons whose edges snugly meet the boss core's edges. ' later this code will be used to make new boss fragments at a set rate and add them on to the boss polygone 'I'm just representing them now by drawing them ' define radi Local new_side_number%=Rand(0,3)+3 ' make a new random sided ngon Local new_radius#=poly_smallradius(32.0,new_side_number) 'find the inner radius of that new ngon Local new_rot_angle#= 360.0/new_side_number ' find the size of the inner angles in the new ngon Local parent_base_angle#=(360.0/parent_numsides) ' find the parent's inner angle measures Local parent_final_angle#=parent_base_angle*Rand(parent_numsides)+parent_rotation ' find a random angle that bisects an enge Local new_x#=parent_x+Cos(parent_final_angle)*(new_radius+parent_radius)' find the new x point of the new ngon Local new_y#=parent_y-Sin(parent_final_angle)*(new_radius+parent_radius)' find the new y point of the new ngon Local new_rotation#=parent_final_angle+new_rot_angle 'add the base angle to the new ngon's inner angle measurement DrawLine parent_x,parent_y, new_x,new_y ' draw a line so we can visually see the radius draw_ngon(new_x,new_y,new_side_number,32,new_rotation)' draw the ngon to visuallize what a new ngon to visualize would look like End Function 'here we will store the types Type player Global player_list:TList=New TList Field x#,y#,timer%=0 ' make a list to hold them Function Create(x,y) Local temp_ship:player=New player temp_ship.x=x temp_ship.y=y ListAddLast(player_list,temp_ship) End Function Method Draw() SetColor 0,0,0 draw_ngon(x,y,3,20,0) SetColor 0,0,0 DrawOval x-1,y-1,3,3 SetOrigin( 0,0 ) End Method Method Update() ' take care of movement If KeyDown(KEY_LEFT) x:-2 End If If KeyDown(KEY_RIGHT) x:+2 End If If KeyDown(KEY_UP) y:-2 End If If KeyDown(KEY_DOWN) y:+2 End If If KeyDown(KEY_SPACE)and timer=2 player_shot.Create(x,y,Rand(29)+RndFloat#()+255) timer=0 End If snap_view() If timer <2 timer:+1 End If Function snap_view() ' snaps objects to the borders of the views If x<160 x=160 End If If y<0 y=0 End If If x >480 x=480 End If If y >480 y=480 End If End Function Draw() End Method Method Destroy() ListRemove(player_list,Self) End Method End Type ' this is the player's ship Type player_shot Global player_shot_list:TList=New TList Field x#,y#,speed#=6,direction# Function Create(x#,y#,direction#) Local temp:player_shot=New player_shot temp.x=x temp.y=y temp.speed=4 temp.direction=direction ListAddLast(player_shot_list,temp) EndFunction Method Draw() SetColor 0,0,0 draw_ngon(x,y,5,5,direction+18) DrawLine x,y,x+Sin(direction+90)*13,y-Cos(direction+90)*13 End Method Method Update() x:+Cos(direction)*speed y:+Sin(direction)*speed If inside_view(x,y)=False Destroy() End If Draw() End Method Method Destroy() ListRemove(player_shot_list,Self) End Method End Type ' this is the player's shot Type boss_core Global boss_core_list:TList=New TList Field x#,y#,side_number%,HP%,rotation#,small_radius#,large_radius# Function Create(x#,y#,HP#,side_number%,rotation#=0) Local temp:boss_core=New boss_core temp.x=x temp.y=y temp.HP=HP temp.side_number=side_number temp.small_radius=poly_smallradius(32,side_number) temp.large_radius=poly_radius(32,side_number) temp.rotation=rotation ListAddLast(boss_core_list,temp) EndFunction Method Draw() SetColor 0,0,0 draw_ngon(x,y,side_number,32.0,rotation) spawn#(x,y,side_number,rotation,small_radius)' this normally wouldn;t be here but it's here to show the dynamic spawning. End Method Method Update() Draw() End Method Method Destroy() ListRemove(boss_core_list,Self) End Method End Type ' this is the center of theboss Type boss_fragment Global boss_fragment_list:TList=New TList Field x,y,side_number%,HP%,rotation#,small_radius#,large_radius# Function Create(x#,y#,HP#,side_number%,rotation#) Local temp:boss_fragment=New boss_fragment temp.x=x temp.y=y temp.HP=HP temp.side_number=side_number temp.small_radius=poly_smallradius(32,side_number) temp.large_radius=poly_radius(32,side_number) ListAddLast(boss_fragment_list,temp) EndFunction Method Draw() SetColor 0,0,0 draw_ngon(x,y,side_number,32,rotation) End Method Method Update() Draw() End Method Method Destroy() ListRemove(boss_fragment_list,Self) End Method End Type 'this is a piece that will be spawned off the core and off each other player.Create(320,420) ' make the first player boss_core.Create(320,200,100,6,0.0) ' make the first boss_core While not KeyDown(KEY_ESCAPE) Cls ' draw the background SetColor 234, 226, 200 ' tyhis is te tan color DrawRect 0,0,640,480 For Local i:player=EachIn(player.player_list) i.Update() Next For Local i:boss_core=EachIn(boss_core.boss_core_list) i.Update() Next For Local i:player_shot=EachIn(player_shot.player_shot_list) i.Update() Next For Local i:boss_fragment=EachIn(boss_fragment.boss_fragment_list) i.Update() Next SetColor 98,135,152 DrawRect 0,0,160,480 DrawRect 640-160,0,480,640 SetColor 255,255,255 DrawText score,12,12 Flip Wend 'main game loop
I think everything works it shouldn't require external files.