DarkBASIC Professional without Enhancements has basically the same features as DarkBASIC with Enhancements. So when upgrading between the two originally, I felt that was a plus.
You also have Structured Data Types, this I find extremely useful so that rather than having several variables named something like
PlayerX#, PlayerY#, PlayerZ#
I can now have
Type Player_State
X, Y, Z As Float
EndType
Player As Player_State
Now Player.X, Player.Y, Player.Z
Ironically it's slightly more code, but it just feels easier to manage.
What's more is you can cast a type rather than having to use the typecast symbol
So: Variable As Float/Integer/String rather than Variable/#/$
You also can have variable versions of this data as well, so rather than Integers and Floating-Points being 32-bit only; they can be (8/16)/32/64-bit (bracket numbers are integer only)
You also can have Dynamic Arrays. This is a great plus if you don't want to set a giant array to begin with, and just add or remove elements as and when you need them.
Being able to also TypeCast Arrays, also helps a great deal. So rather than multiple arrays or arrays with multiple elements you can just case a type. Have all of the data you need in a single element. e.g.
Dim Player_Name$(16)
Dim Player_Position#(16, 3)
you can now do
Type Player_State
Name As String
X, Y, Z As Float
EndType
Dim Player(16) As Player_State
also you can nestle types, so you could actually have:
Type Vector3
X, Y, Z As Float
EndType
Type Player_State
Name As String
Position As Vector3
EndType
Dim Player(16) As Player_State
Now rather than Player(Index).X you have Player(Index).Position.X
For stuff like that, nestling does nothing but make code much easier to read.
If you use a version before 5.2 i believe, then you still have a bug that was quite useful where you could cast pointers about using zero elements of type data arrays.
So this:
Type Vector3
X, Y, Z As Float
EndType
Dim VectorArray(0) As Vector3
Array Insert At Bottom VectorArray(0)
VectorArray(Array Count(VectorArray(0))) = NewVector(1.0, 1.0, 2.0)
Function NewVector(X As Float, Y As Float, Z As Float)
Dim Vector(0) As Vector3
pVector As Integer = Vector(0)
*pVector = X : Inc pVector, 4
*pVector = Y : Inc pVector, 4
*pVector = Z : Inc pVector, 4
EndFunction Vector(0)
While that code itself is pointless, it should show what we did have available (and i think still is if you turn off safearray in the compiler.ini) to do.
Performance is also much improved, so it's much easier to get more going on at once. Also it has access to bones in models, which I felt was useful; so rather than having them as limb objects that did nothing, they actually work like you skinned them in your favourite modeling app.