Game Development Community

Can I put an mDataBlock in an mDataBlock?

by Dan Chao · in RTS Starter Kit · 01/03/2006 (11:30 pm) · 1 replies

Here's what I basically want to do:

I want to put spells inside a given RTSUnit. these spells are composed of an RTSSpell and RTSSpellData just like all the other script objects. here's what I've done:

class RTSUnitData : public PlayerData
{
...
RTSSpellData* mSpellDataBlock[4];
...
};

class RTSUnit : public Player
{
...
RTSSpell* mSpells[4];
...
}

void RTSUnitData::initPersistFields()
{
...
addField("spellDataBlock0", TypeGameBaseDataPtr, Offset(mSpellDataBlock[0], RTSUnitData));
addField("spellDataBlock1", TypeGameBaseDataPtr, Offset(mSpellDataBlock[1], RTSUnitData));
addField("spellDataBlock2", TypeGameBaseDataPtr, Offset(mSpellDataBlock[2], RTSUnitData));
addField("spellDataBlock3", TypeGameBaseDataPtr, Offset(mSpellDataBlock[3], RTSUnitData));
}

bool RTSUnit::onNewDataBlock(GameBaseData* dptr)
{
if (!Parent::onNewDataBlock(dptr))
return false;

mSpells[0] = new RTSSpell();
mSpells[1] = new RTSSpell();
mSpells[2] = new RTSSpell();
mSpells[3] = new RTSSpell();

if (RTSUnitData* db = dynamic_cast(mDataBlock)) {
mSpells[0]->onNewDataBlock(db->mSpellDataBlock[0]);
mSpells[1]->onNewDataBlock(db->mSpellDataBlock[1]);
mSpells[2]->onNewDataBlock(db->mSpellDataBlock[2]);
mSpells[3]->onNewDataBlock(db->mSpellDataBlock[3]);
}
return true;
}


in rifleman.cs
datablock RTSUnitData(riflemanBlock : UnitBaseBlock)
{
...
spellDataBlock0 = nukeSpellBlock;
spellDataBlock1 = nukeSpellBlock;
spellDataBlock2 = nukeSpellBlock;
spellDataBlock3 = nukeSpellBlock;
};

in nukespell.cs
datablock RTSSpellData(nukeSpellBlock)
{
}



I haven't found examples of this anywhere else, but I guess I haven't checked the other gg games like domination. is this the best way to go about this? I'm getting a random crash right now, which I'm tracking down but I figure I'd ask just in case I'm doing something totally nuts.

thanks in advance,
dan

#1
01/06/2006 (7:36 pm)
For any interested in doing something similar, I ended up adding a setSpellDataBlock() function similar to how setProjectileData() is done.