View Single Post
  #1 (permalink)  
Old May 14th, 2008
peterb peterb is offline
Senior Member
 
Join Date: Jan 2008
Location: Lidingö, Sweden
Posts: 110
Default d20 creature conversion

I’ve been fiddling with a conversion of creatures from the d20 SRD (i.e. from the DnD Monster Manual) to BRP. I need the data for my Creature Generator spreadsheet. Since the data is available in XML and DB formats it’s not that difficult to do a translation. I’ve chosen the quick and dirty route and imported all data into Excel and now I’m almost done with the translation scripts.

When I’m done, creating a word document and a PDF printout of all the creatures won’t be that much trouble, in fact it will just be a matter of writing a VBA script in Word that merges the all the information from the Excel spreadsheets per each creature and stores that as a creature description in a Word document. Before I do that I’d like to see if anyone has any objections to my transformation algorithms.

1) Stats
I base the conversion on the average given in the SRD. The stat is divided by the average dice value and the reminder is added as a dice bonus. The choice of dice is based on the average value.

Code:
'---------------------------------------------------------------------------------------
' Procedure : getDiceString
' Author    : Peter Brink
' Date      : 2008-05-10
' Purpose   : The average stat value / 6 would give you the number of dices used. But
'             we dont use more than a handfull dices. We first need to analyze the
'             average value and decide how many dices we will use. We then use the
'             remainder as a point bonus.
'---------------------------------------------------------------------------------------
'
Public Function getDiceString(averageVal As Integer) As String
    
    Dim noDice As Integer
    Dim diceType As Integer
    Dim diceMod As Integer
    
    diceType = 6
    
    Select Case averageVal
        Case 1 To 4 'split in number of d3 and add reminder as +p
            noDice = CInt(averageVal / 1.5)
            diceMod = averageVal Mod 1.5
            diceType = 3
        Case 5 To 10 'split in number of d4 and add reminder as +p
            noDice = CInt(averageVal / 2.5)
            diceMod = averageVal Mod 2.5
            diceType = 4
        Case 11 To 17 'split in 3d6 and add reminder as +p
            noDice = 3
            diceMod = averageVal - 11
        Case 11 To 20 'split in 4d6 and add reminder as +p
            noDice = 4
            diceMod = averageVal - 14
        Case 21 To 40 'split in 6d6 and add reminder as +p
            noDice = 6
            diceMod = averageVal - 21
        Case 41 To 60 'split in 8d6 and add reminder as +p
            noDice = 8
            diceMod = averageVal - 28
        Case 61 To 80 'split in 10d6 and add reminder as +p
            noDice = 10
            diceMod = averageVal - 35
        Case Else 'split in 10d10 and add reminder as +p
            noDice = 10
            diceMod = averageVal - 55
            diceType = 10
    End Select
    
    If averageVal = 0 Then
        getDiceString = "0"
    ElseIf Not diceMod = 0 Then
        getDiceString = noDice & "d" & diceType & "+" & diceMod
    Else
        getDiceString = noDice & "d" & diceType
    End If
    
End Function
SIZ is a little bit different matter as it's not given in the SRD. I base the conversion on the broad size category and the STR stat value.

Code:
'---------------------------------------------------------------------------------------
' Procedure : getSizDice
' Author    : Peter Brink
' Date      : 2008-05-10
' Purpose   : Uses the STR dice and the Size value of a creature to create it's SIZ dice
'---------------------------------------------------------------------------------------
'
Public Function getSizDice(creatureSize As String, strDice As String) As String
    
    Select Case LCase(creatureSize)
        Case "fine" 'SIZ 1
            getSizDice = "1"
        Case "diminutive" 'SIZ 1-2
            getSizDice = "1d2"
        Case "tiny" 'SIZ 2-4
            getSizDice = "1d3+1"
        Case Else
            getSizDice = parseStrDice(strDice, creatureSize)
    End Select
    
End Function
2) Move
I divide the d20 move rate by 10 and drop all reminders, this gives a reliable translation to BRP, IMO.

3) Armour
Here I just parses the armour record and uses the natural AC bonus as a AP value.

4) Skills
I wrote a skill conversion function for the Creature Creator and I use it here to convert a d20 skill to an equivalent BRP skill. The skill ranks are multiplied by 5 and this gives a first rudimentary conversion. However, the skill levels seems a bit high so I'm wondering if I don't need to write a more intelligent conversion routine.

5) Weapons
Same as with skills, the skill rank is converted. This can lead to quite high base chances. But some creatures in RQ also had high base chances. A more general conversion algorithm is probably needed here... The weapon type checked against those I have in the Creator.

6) Hit Locations
I use the categories of hit locations from RQ Creatures. I also need to create a few new ones. No problems here as far as I can see.

7) Description
The description contains of a few sections. The first is just a short description of the creature and that only needs to be extracted. The second is a very brief note on the creature's combat tactics, also only needs to be extracted. Then there are notes about special powers and the like. I don't really plan to keep those - but I haven't decided yet. There are also notes on the creatures skills, or what skills the creature has any racial bonuses in. I'm wondering if one perhaps should use these notes when assessing the average skill values and perhaps that will lead to a better choice of base skill levels.
Reply With Quote