From: <ave...@us...> - 2010-01-01 09:56:22
|
Revision: 7487 http://gemrb.svn.sourceforge.net/gemrb/?rev=7487&view=rev Author: avenger_teambg Date: 2010-01-01 09:56:16 +0000 (Fri, 01 Jan 2010) Log Message: ----------- implemented SetupWishObject (just for completeness) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.h gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-12-31 11:26:59 UTC (rev 7486) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2010-01-01 09:56:16 UTC (rev 7487) @@ -6692,54 +6692,18 @@ //TODO: investigate what happens with * values void GameScript::SetupWish(Scriptable* Sender, Action* parameters) { - int count; - ieVariable varname; + SetupWishCore(Sender, parameters->int0Parameter, parameters->int1Parameter); +} - AutoTable tm("wish"); - if (!tm) { - printStatus( "ERROR", LIGHT_RED ); - printf( "Cannot find wish.2da.\n"); +//The same as the previous action, except that the column parameter comes from +//the target object's wisdom directly (this action is not used in the original) +void GameScript::SetupWishObject(Scriptable* Sender, Action* parameters) +{ + Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); + if (!tar || tar->Type!=ST_ACTOR) { return; } - - int picks[5]; - int i,j; - count = tm->GetRowCount(); - - for(i=0;i<99;i++) { - snprintf(varname,32, "wishpower%02d", i); - if(CheckVariable(Sender, varname, "GLOBAL") ) { - SetVariable(Sender, varname, "GLOBAL", 0); - } - } - - if (count<5) { - for(i=0;i<count;i++) { - picks[i]=i; - } - while(i++<5) { - picks[i]=-1; - } - } else { - for(i=0;i<5;i++) { - picks[i]=rand()%count; -retry: - for(j=0;j<i;j++) { - if(picks[i]==picks[j]) { - picks[i]++; - goto retry; - } - } - } - } - - for (i = 0; i < 5; i++) { - if (picks[i]<0) - continue; - int spnum = atoi( tm->QueryField( picks[i], parameters->int0Parameter ) ); - snprintf(varname,32,"wishpower%02d", spnum); - SetVariable(Sender, varname, "GLOBAL",1); - } + SetupWishCore(Sender, ((Actor *)tar)->GetStat(IE_WIS), parameters->int0Parameter); } //GemRB specific action Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-12-31 11:26:59 UTC (rev 7486) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2010-01-01 09:56:16 UTC (rev 7487) @@ -2679,3 +2679,58 @@ gamedata->FreeItem(itm, itemres, false); return dist*15; } + +void SetupWishCore(Scriptable *Sender, int column, int picks) +{ + int count; + ieVariable varname; + int *selects; + int i,j; + + AutoTable tm("wish"); + if (!tm) { + printStatus( "ERROR", LIGHT_RED ); + printf( "Cannot find wish.2da.\n"); + return; + } + + selects = (int *) malloc(picks*sizeof(int)); + count = tm->GetRowCount(); + + for(i=0;i<99;i++) { + snprintf(varname,32, "wishpower%02d", i); + if(CheckVariable(Sender, varname, "GLOBAL") ) { + SetVariable(Sender, varname, "GLOBAL", 0); + } + } + + if (count<picks) { + for(i=0;i<count;i++) { + selects[i]=i; + } + while(i++<picks) { + selects[i]=-1; + } + } else { + for(i=0;i<picks;i++) { + selects[i]=rand()%count; +retry: + for(j=0;j<i;j++) { + if(selects[i]==selects[j]) { + selects[i]++; + goto retry; + } + } + } + } + + for (i = 0; i < picks; i++) { + if (selects[i]<0) + continue; + int spnum = atoi( tm->QueryField( selects[i], column ) ); + snprintf(varname,32,"wishpower%02d", spnum); + SetVariable(Sender, varname, "GLOBAL",1); + } + free(selects); +} + Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2009-12-31 11:26:59 UTC (rev 7486) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2010-01-01 09:56:16 UTC (rev 7487) @@ -144,6 +144,7 @@ Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int negate); unsigned int GetSpellDistance(ieResRef spellres, Actor *actor); unsigned int GetItemDistance(ieResRef itemres, int header); +void SetupWishCore(Scriptable *Sender, int column, int picks); inline int Bones(ieDword value) { Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-12-31 11:26:59 UTC (rev 7486) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2010-01-01 09:56:16 UTC (rev 7487) @@ -668,6 +668,7 @@ {"movetopointnorecticle", GameScript::MoveToPointNoRecticle,AF_BLOCKING|AF_ALIVE},//the same until we know better {"movetosavedlocation", GameScript::MoveToSavedLocation,AF_MERGESTRINGS|AF_BLOCKING}, //take care of the typo in the original bg2 action.ids + //FIXME: why doesn't this have MERGESTRINGS like the above entry? {"movetosavedlocationn", GameScript::MoveToSavedLocation,AF_BLOCKING}, {"moveviewobject", GameScript::MoveViewObject, AF_BLOCKING}, {"moveviewpoint", GameScript::MoveViewPoint, AF_BLOCKING}, @@ -819,6 +820,7 @@ {"settokenglobal", GameScript::SetTokenGlobal,AF_MERGESTRINGS}, {"settokenobject", GameScript::SetTokenObject,0}, {"setupwish", GameScript::SetupWish, 0}, + {"setupwishobject", GameScript::SetupWishObject, 0}, {"setvisualrange", GameScript::SetVisualRange, 0}, {"sg", GameScript::SG, 0}, {"shout", GameScript::Shout, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-12-31 11:26:59 UTC (rev 7486) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2010-01-01 09:56:16 UTC (rev 7487) @@ -1350,6 +1350,7 @@ static void SetTokenObject(Scriptable* Sender, Action* parameters); static void SetTrackString(Scriptable* Sender, Action* parameters); static void SetupWish(Scriptable* Sender, Action* parameters); + static void SetupWishObject(Scriptable* Sender, Action* parameters); static void SetVisualRange(Scriptable* Sender, Action* parameters); static void SG(Scriptable* Sender, Action* parameters); static void Shout(Scriptable* Sender, Action* parameters); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |