I'm giving a full answer so I can add the info to my site. The first part of your question is easy:
In theory any square size will work (if the dat is configured properly), in practice:
| Scout | 32x32 |
| Destroyer | 40x40 |
| Cruiser | 40x40 |
| Battleship | 64x64 |
| Dreadnought | 48x48 |
| Starbase | 80x80 |
| Freighter | 56x56 |
>>One more thing where in the dat file do i edit the bmp?
This can be very tricky until you understand how it all works together. Lets walk through it. We'll start with the entry in the .dat file (I'm using FirstContact.dat for my example)
ship bitmaps {
#INCLUDE sf_bmp_ships.sec([race]=Arcean, [nr]=0, [r]=a)
#INCLUDE sf_bmp_ships.sec([race]=Terran, [nr]=1, [r]=t)
#INCLUDE sf_bmp_ships.sec([race]=Drengin, [nr]=2, [r]=d)
#INCLUDE sf_bmp_ships.sec([race]=Pirate, [nr]=3, [r]=p)
}
Which tells us we need to look at the sf_bmp_ships.sec file. Fortunatly this one is nicely documented:
**************************** bitmap sections *******************************
*
* class : Bitmap class
* name : Bitmap name. Used as a default in case object has no name
* file : Bitmap filename without the .bmp and without the path
* nF : Number of frames in bitmap. Frame 0 starts at bottom of bmp
* and frame nF-1 is at the top.
* Sz : Size of the bitmap. Used for collision detection in the game.
* Saturn is a good example of why you would want to specify this
* parameter at all.
* seqT : Sequence type: time - Continuous cycle from frame 0 to frame nF-1
* and starting back at frame 0 again.
* spin - use frame that corresponds to ship heading.
* tc : Transparent color. 0 for black. Use something like 10 to set
* all pixels darker than RGB 10:10:10 transparent.
* alpha : Alpha factor. 100 sets all pixels to their full brightness. 50
* is 50% brightness. 0 is completely black.
****************************************************************************
* class race name file nF Sz seqT tc alpha
* ---------------------------------------------------------------------------
#IF [race] != Pirate
ship [race] Scout[nr] sf-[r]-sc 36 32 spin 0 100
ship [race] Destroyer[nr] sf-[r]-ds 36 40 spin 0 100
ship [race] Cruiser[nr] sf-[r]-cr 36 40 spin 0 100
ship [race] Battleship[nr] sf-[r]-bs 36 64 spin 0 100
ship [race] Dreadnought[nr] sf-[r]-dn 36 48 spin 0 100
ship [race] Starbase[nr] sf-[r]-sb 36 80 time 0 100
ship [race] Freighter[nr] sf-[r]-fr 36 56 spin 0 100
#ENDIF
#IF [race] == Pirate
ship [race] Destroyer[nr] sf-[r]-rd 36 40 spin 0 100
#ENDIF
Ok, here goes. The server reads the .dat file, and finds #INCLUDE sf_bmp_ships.sec([race]=Arcean, [nr]=0, [r]=a) so it loads sf_bmp_ships.sec, replaces every instance of [race] with Arcean, every instance of [nr] with 0 and every [r] with a. The result is:
IF Arcean != Pirate
ship Arcean Scout0 sf-a-sc 36 32 spin 0 100
ship Arcean Destroyer0 sf-a-ds 36 40 spin 0 100
ship Arcean Cruiser0 sf-a-cr 36 40 spin 0 100
ship Arcean Battleship0 sf-a-bs 36 64 spin 0 100
ship Arcean Dreadnought0 sf-a-dn 36 48 spin 0 100
ship Arcean Starbase0 sf-a-sb 36 80 time 0 100
ship Arcean Freighter0 sf-a-fr 36 56 spin 0 100
#ENDIF
#IF Arcean == Pirate
ship Arcean Destroyer0 sf-a-rd 36 40 spin 0 100
#ENDIF
Then the logic is evaluated. != is Not Equals, so this would be reduced to:
* class race name file nF Sz seqT tc alpha
*------------------------------------------------
ship Arcean Scout0 sf-a-sc 36 32 spin 0 100
ship Arcean Destroyer0 sf-a-ds 36 40 spin 0 100
ship Arcean Cruiser0 sf-a-cr 36 40 spin 0 100
ship Arcean Battleship0 sf-a-bs 36 64 spin 0 100
ship Arcean Dreadnought0 sf-a-dn 36 48 spin 0 100
ship Arcean Starbase0 sf-a-sb 36 80 time 0 100
ship Arcean Freighter0 sf-a-fr 36 56 spin 0 100
The file names for the Arcean fleet are therefore sf-a-sc.bmp ... sf-a-fr.bmp. The name field must be unique, which is why the race numbers are appended to them.
Now that the server is done with the Arceans, it goes through the same process for each of the other races.