From: <ave...@us...> - 2008-08-01 16:15:17
|
Revision: 5240 http://gemrb.svn.sourceforge.net/gemrb/?rev=5240&view=rev Author: avenger_teambg Date: 2008-08-01 16:15:25 +0000 (Fri, 01 Aug 2008) Log Message: ----------- added feature: move near to target (object) when casting spells 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 gemrb/trunk/gemrb/plugins/Core/Spell.cpp gemrb/trunk/gemrb/plugins/Core/Spell.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -546,6 +546,19 @@ } } +//this is unfinished, maybe the original moves actors too? +//creates savegame? +void GameScript::MoveToExpansion(Scriptable* /*Sender*/, Action* /*parameters*/) +{ + Game *game = core->GetGame(); + + game->SetExpansion(1); + SaveGameIterator *sg = core->GetSaveGameIterator(); + if (sg) { + sg->Invalidate(); + } +} + //add some animation effects too? void GameScript::ExitPocketPlane(Scriptable* /*Sender*/, Action* /*parameters*/) { @@ -2188,6 +2201,18 @@ return; } + if(Sender->Type==ST_ACTOR) { + Actor *act = (Actor *) Sender; + + unsigned int dist = GetSpellDistance(spellres, act); + + if (PersonalDistance(tar, Sender) > dist) { + GoNearAndRetry(Sender, tar, true, dist); + Sender->ReleaseCurrentAction(); + return; + } + } + //set target Actor *actor = (Actor *) Sender; if (tar != Sender) { @@ -5961,3 +5986,5 @@ if (!map) return; map->SetTrackString(parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter); } + + Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -26,6 +26,7 @@ #include "ResourceMgr.h" #include "Video.h" #include "Audio.h" +#include "Spell.h" #include "Item.h" #include "Map.h" #include "Game.h" @@ -2322,3 +2323,19 @@ p.y=(short) y; return p; } + +/* returns a spell's casting distance, it depends on the caster */ +unsigned int GetSpellDistance(ieResRef spellres, Actor *actor) +{ + unsigned int dist; + + Spell* spl = core->GetSpell( spellres ); + if (!spl) { + printMessage("GameScript"," ",LIGHT_RED); + printf("Spell couldn't be found:%.8s.\n", spellres); + return 0; + } + dist=spl->GetCastingDistance(actor); + core->FreeSpell(spl, spellres, false); + return dist*15; +} Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2008-08-01 16:15:25 UTC (rev 5240) @@ -112,6 +112,7 @@ GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context, bool *valid = NULL); Action* GenerateActionCore(const char *src, const char *str, int acIndex); Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int negate); +unsigned int GetSpellDistance(ieResRef spellres, Actor *actor); inline int Bones(ieDword value) { Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -641,6 +641,7 @@ {"moveglobalsto", GameScript::MoveGlobalsTo, 0}, {"transferinventory", GameScript::MoveInventory, 0}, {"movetocenterofscreen", GameScript::MoveToCenterOfScreen,AF_BLOCKING}, + {"movetoexpansion", GameScript::MoveToExpansion,AF_BLOCKING}, {"movetoobject", GameScript::MoveToObject,AF_BLOCKING|AF_ALIVE}, {"movetoobjectfollow", GameScript::MoveToObjectFollow,AF_BLOCKING|AF_ALIVE}, {"movetoobjectnointerrupt", GameScript::MoveToObjectNoInterrupt,AF_BLOCKING|AF_ALIVE}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-08-01 16:15:25 UTC (rev 5240) @@ -1199,6 +1199,7 @@ static void MoveGlobalsTo(Scriptable* Sender, Action* parameters); static void MoveInventory(Scriptable *Sender, Action* parameters); static void MoveToCenterOfScreen(Scriptable* Sender, Action* parameters); + static void MoveToExpansion(Scriptable* Sender, Action* parameters); static void MoveToObject(Scriptable* Sender, Action* parameters); static void MoveToObjectFollow(Scriptable* Sender, Action* parameters); static void MoveToObjectNoInterrupt(Scriptable* Sender, Action* parameters); Modified: gemrb/trunk/gemrb/plugins/Core/Spell.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -20,6 +20,7 @@ */ #include "../../includes/win32def.h" +#include "Actor.h" #include "Spell.h" #include "Projectile.h" #include "ProjectileServer.h" @@ -120,3 +121,31 @@ } return NULL; } + +//get the casting distance of the spell +//it depends on the casting level of the actor +//if actor isn't given, then the first header is used +//TODO: fix casting level for all class combos +unsigned int Spell::GetCastingDistance(Actor *actor) const +{ + int level = 1; + if(!actor) { + level = actor->GetStat(IE_LEVEL); + if(SpellType==IE_SPL_WIZARD) { + level+=actor->GetStat(IE_CASTINGLEVELBONUSMAGE); + } + else if(SpellType==IE_SPL_PRIEST) { + level+=actor->GetStat(IE_CASTINGLEVELBONUSCLERIC); + } + } + + if(level<1) level=1; + int idx = GetHeaderIndexFromLevel(level); + SPLExtHeader *seh = GetExtHeader(idx); + if (!seh) { + printMessage("Spell", "Cannot retrieve spell header!!! ",RED); + printf("required header: %d, maximum: %d\n", idx, (int) ExtHeaderCount); + return 0; + } + return (unsigned int) seh->Range; +} Modified: gemrb/trunk/gemrb/plugins/Core/Spell.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.h 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/Spell.h 2008-08-01 16:15:25 UTC (rev 5240) @@ -169,6 +169,7 @@ EffectQueue *GetEffectBlock(int block_index, int ext_index=-1) const; //returns a projectile created from an extended header Projectile *GetProjectile(int headerindex) const; + unsigned int GetCastingDistance(Actor *actor) const; }; #endif // ! SPELL_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-02 16:35:33
|
Revision: 5248 http://gemrb.svn.sourceforge.net/gemrb/?rev=5248&view=rev Author: avenger_teambg Date: 2008-09-02 16:35:34 +0000 (Tue, 02 Sep 2008) Log Message: ----------- scrollbars handle the mousewheel Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp gemrb/trunk/gemrb/plugins/Core/ScrollBar.h Modified: gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp 2008-09-02 16:31:47 UTC (rev 5247) +++ gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp 2008-09-02 16:35:34 UTC (rev 5248) @@ -71,6 +71,18 @@ SetPos( Sum ); } +void ScrollBar::ScrollUp() +{ + if (Pos > 0) + SetPos( Pos - 1 ); +} + +void ScrollBar::ScrollDown() +{ + if ( (ieDword) Pos + 1 < Value ) + SetPos( Pos + 1 ); +} + void ScrollBar::Draw(unsigned short x, unsigned short y) { if (!Changed && !(Owner->Flags&WF_FLOAT) ) { @@ -133,9 +145,19 @@ } /** Mouse Button Down */ void ScrollBar::OnMouseDown(unsigned short x, unsigned short y, - unsigned char /*Button*/, unsigned short /*Mod*/) + unsigned char Button, unsigned short /*Mod*/) { core->RedrawAll(); + + if (Button==GEM_MB_SCRLUP) { + ScrollUp(); + return; + } + if (Button==GEM_MB_SCRLDOWN) { + ScrollDown(); + return; + } + unsigned short upMx = (unsigned short) Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED]->Width; unsigned short upMy = (unsigned short) Frames[IE_GUI_SCROLLBAR_UP_UNPRESSED]->Height; unsigned short domy = (unsigned short) (Height - Frames[IE_GUI_SCROLLBAR_DOWN_UNPRESSED]->Height); Modified: gemrb/trunk/gemrb/plugins/Core/ScrollBar.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScrollBar.h 2008-09-02 16:31:47 UTC (rev 5247) +++ gemrb/trunk/gemrb/plugins/Core/ScrollBar.h 2008-09-02 16:35:34 UTC (rev 5248) @@ -71,6 +71,8 @@ ~ScrollBar(void); /**sets position, updates associated stuff */ void SetPos(int NewPos); + void ScrollUp(); + void ScrollDown(); /**redraws scrollbar if associated with VarName */ void RedrawScrollBar(const char* VarName, int Sum); /**/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-02 17:48:08
|
Revision: 5252 http://gemrb.svn.sourceforge.net/gemrb/?rev=5252&view=rev Author: avenger_teambg Date: 2008-09-02 17:48:10 +0000 (Tue, 02 Sep 2008) Log Message: ----------- initialize the attached scrollbar pointer in Control now Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Control.cpp gemrb/trunk/gemrb/plugins/Core/TextArea.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Control.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Control.cpp 2008-09-02 17:44:21 UTC (rev 5251) +++ gemrb/trunk/gemrb/plugins/Core/Control.cpp 2008-09-02 17:48:10 UTC (rev 5252) @@ -43,6 +43,7 @@ XPos = 0; YPos = 0; + sb = NULL; animation = NULL; AnimPicture = NULL; ControlType = IE_GUI_INVALID; Modified: gemrb/trunk/gemrb/plugins/Core/TextArea.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextArea.cpp 2008-09-02 17:44:21 UTC (rev 5251) +++ gemrb/trunk/gemrb/plugins/Core/TextArea.cpp 2008-09-02 17:48:10 UTC (rev 5252) @@ -41,7 +41,6 @@ minrow = 0; seltext = -1; Value = 0xffffffff; - sb = NULL; ResetEventHandler( TextAreaOnChange ); ResetEventHandler( TextAreaOutOfText ); PortraitResRef[0]=0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-12 15:47:28
|
Revision: 5262 http://gemrb.svn.sourceforge.net/gemrb/?rev=5262&view=rev Author: avenger_teambg Date: 2008-09-12 15:47:38 +0000 (Fri, 12 Sep 2008) Log Message: ----------- added xpbonus.2da support (bg2/tob feature) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2008-09-07 07:45:04 UTC (rev 5261) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2008-09-12 15:47:38 UTC (rev 5262) @@ -66,7 +66,15 @@ static char **druidspelltables = NULL; static char **wizardspelltables = NULL; static int *turnlevels = NULL; +static int *xpbonus = NULL; +static int xpbonustypes = -1; +static int xpbonuslevels = -1; +//xp bonus types (for xpbonus.2da) +#define XP_LOCKPICK 0 +#define XP_DISARM 1 +#define XP_LEARNSPELL 2 + static int FistRows = -1; typedef ieResRef FistResType[MAX_LEVEL+1]; @@ -961,12 +969,18 @@ free(turnlevels); turnlevels=NULL; } + if (xpbonus) { + free(xpbonus); + xpbonus=NULL; + xpbonuslevels = -1; + xpbonustypes = -1; + } } if (GUIBTDefaults) { free (GUIBTDefaults); GUIBTDefaults=NULL; } - classcount=-1; + classcount = -1; } #define COL_HATERACE 0 //ranger type racial enemy @@ -982,7 +996,7 @@ static void InitActorTables() { - int i; + int i, j; if (core->HasFeature(GF_CHALLENGERATING)) { sharexp=SX_DIVIDE|SX_CR; @@ -993,10 +1007,32 @@ CheckAbilities=(bool) core->HasFeature(GF_CHECK_ABILITIES); DeathOnZeroStat=(bool) core->HasFeature(GF_DEATH_ON_ZERO_STAT); + //this table lists various level based xp bonuses + int table = core->LoadTable( "xpbonus" ); + TableMgr *tm = core->GetTable( table ); + + if (tm) { + xpbonustypes = tm->GetRowCount(); + if (xpbonustypes == 0) { + core->DelTable( table ); + xpbonuslevels = 0; + } else { + xpbonuslevels = tm->GetColumnCount(0); + xpbonus = (int *) calloc(xpbonuslevels*xpbonustypes, sizeof(int)); + for (i = 0; i<xpbonustypes; i++) { + for(j = 0; j<xpbonuslevels; j++) { + xpbonus[i*xpbonuslevels+j] = atoi(tm->QueryField(i,j)); + } + } + } + } else { + xpbonustypes = 0; + xpbonuslevels = 0; + } //this table lists skill groups assigned to classes //it is theoretically possible to create hybrid classes - int table = core->LoadTable( "clskills" ); - TableMgr *tm = core->GetTable( table ); + table = core->LoadTable( "clskills" ); + tm = core->GetTable( table ); if (tm) { classcount = tm->GetRowCount(); memset (isclass,0,sizeof(isclass)); @@ -2403,7 +2439,7 @@ if (!spell) { return LSR_INVALID; //not existent spell } - int exp = spellbook.LearnSpell(spell, flags&LS_MEMO); + int explev = spellbook.LearnSpell(spell, flags&LS_MEMO); int tmp = spell->SpellNameIdentified; if (flags&LS_LEARN) { core->GetTokenDictionary()->SetAt("SPECIALABILITYNAME", core->GetString(tmp)); @@ -2420,14 +2456,14 @@ } } else tmp = 0; core->FreeSpell(spell, spellname, false); - if (!exp) { + if (!explev) { return LSR_INVALID; } if (tmp) { core->DisplayConstantStringName(tmp, 0xffffff, this); } if (flags&LS_ADDXP) { - AddExperience(exp); + AddExperience(XP_LEARNSPELL, explev); } return LSR_OK; } @@ -2886,6 +2922,19 @@ SetBase(IE_XP,BaseStats[IE_XP]+exp); } +void Actor::AddExperience(int type, int level) +{ + if (type>=xpbonustypes) { + return; + } + unsigned int l = (unsigned int) (level - 1); + + if (l>=(unsigned int) xpbonuslevels) { + l=xpbonuslevels-1; + } + AddExperience(xpbonus[type*xpbonuslevels+l]); +} + bool Actor::Schedule(ieDword gametime) { if (!(InternalFlags&IF_VISIBLE) ) { Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2008-09-07 07:45:04 UTC (rev 5261) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2008-09-12 15:47:38 UTC (rev 5262) @@ -409,6 +409,8 @@ void Heal(int days); /* Receive experience (handle dual/multi class) */ void AddExperience(int exp); + /* Receive experience bonus */ + void AddExperience(int type, int level); /* Sets the modal state after checks */ void SetModal(ieDword newstate); /* returns current attack style */ Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2008-09-07 07:45:04 UTC (rev 5261) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2008-09-12 15:47:38 UTC (rev 5262) @@ -430,7 +430,7 @@ if (!ret) { delete spl; } - return spell->SpellLevel*100; + return spell->SpellLevel; // return only the spell level (xp is based on xpbonus) } //if flg is set, it will be also memorized This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-13 13:28:47
|
Revision: 5278 http://gemrb.svn.sourceforge.net/gemrb/?rev=5278&view=rev Author: avenger_teambg Date: 2008-09-13 13:28:58 +0000 (Sat, 13 Sep 2008) Log Message: ----------- GetFont (needed for converting textedit to textarea) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/TextEdit.cpp gemrb/trunk/gemrb/plugins/Core/TextEdit.h Modified: gemrb/trunk/gemrb/plugins/Core/TextEdit.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextEdit.cpp 2008-09-13 12:47:59 UTC (rev 5277) +++ gemrb/trunk/gemrb/plugins/Core/TextEdit.cpp 2008-09-13 13:28:58 UTC (rev 5278) @@ -84,6 +84,8 @@ printMessage("TextEdit","Invalid font set!\n", LIGHT_RED); } +Font *TextEdit::GetFont() { return font; } + /** Set Cursor */ void TextEdit::SetCursor(Sprite2D* cur) { Modified: gemrb/trunk/gemrb/plugins/Core/TextEdit.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextEdit.h 2008-09-13 12:47:59 UTC (rev 5277) +++ gemrb/trunk/gemrb/plugins/Core/TextEdit.h 2008-09-13 13:28:58 UTC (rev 5278) @@ -67,6 +67,7 @@ void Draw(unsigned short x, unsigned short y); /** Set Font */ void SetFont(Font* f); + Font *GetFont(); /** Set Cursor */ void SetCursor(Sprite2D* cur); /** Set BackGround */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-14 11:06:37
|
Revision: 5290 http://gemrb.svn.sourceforge.net/gemrb/?rev=5290&view=rev Author: avenger_teambg Date: 2008-09-14 11:06:46 +0000 (Sun, 14 Sep 2008) Log Message: ----------- added multi line edit feature to TextArea (cursor is still not visible) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/Core/TextArea.cpp gemrb/trunk/gemrb/plugins/Core/TextArea.h Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2008-09-14 10:50:06 UTC (rev 5289) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2008-09-14 11:06:46 UTC (rev 5290) @@ -302,7 +302,8 @@ //gamecontrols will receive all special keys break; case IE_GUI_EDIT: - //editboxes will receive all special keys + case IE_GUI_TEXTAREA: + //editboxes and textareas will receive all special keys break; default: //other controls don't receive any Modified: gemrb/trunk/gemrb/plugins/Core/TextArea.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextArea.cpp 2008-09-14 10:50:06 UTC (rev 5289) +++ gemrb/trunk/gemrb/plugins/Core/TextArea.cpp 2008-09-14 11:06:46 UTC (rev 5290) @@ -39,6 +39,9 @@ rows = 0; startrow = 0; minrow = 0; + Cursor = NULL; + CurPos = 0; + CurLine = 0; seltext = -1; Value = 0xffffffff; ResetEventHandler( TextAreaOnChange ); @@ -68,6 +71,7 @@ core->FreePalette( initpalette ); core->FreePalette( selected ); core->FreePalette( lineselpal ); + core->GetVideoDriver()->FreeSprite( Cursor ); for (size_t i = 0; i < lines.size(); i++) { free( lines[i] ); } @@ -173,7 +177,7 @@ //but then it is like the dialog window in the main game screen: //the selected value is encoded into the line if (!(Flags & IE_GUI_TEXTAREA_SELECTABLE) ) { - char* Buffer = ( char* ) malloc( 1 ); + char* Buffer = (char *) malloc( 1 ); Buffer[0] = 0; int len = 0; int lastlen = 0; @@ -195,7 +199,7 @@ if (tlen < 0) goto notmatched; len += tlen + 23; - Buffer = ( char * ) realloc( Buffer, len + 2 ); + Buffer = (char *) realloc( Buffer, len + 2 ); if (seltext == (int) i) { sprintf( Buffer + lastlen, "[color=%6.6lX]%.*s[/color]", acolor, tlen, rest + 1 ); @@ -206,7 +210,7 @@ } else { notmatched: len += ( int ) strlen( lines[i] ) + 1; - Buffer = ( char * ) realloc( Buffer, len + 2 ); + Buffer = (char *) realloc( Buffer, len + 2 ); memcpy( &Buffer[lastlen], lines[i], len - lastlen ); } lastlen = len; @@ -216,9 +220,17 @@ } } video->SetClipRect( &clip ); + + int pos; + + if (startrow==CurLine) { + pos = CurPos; + } else { + pos = -1; + } ftext->PrintFromLine( startrow, clip, ( unsigned char * ) Buffer, palette, - IE_FONT_ALIGN_LEFT, finit, NULL ); + IE_FONT_ALIGN_LEFT, finit, Cursor, pos ); free( Buffer ); video->SetClipRect( NULL ); //streaming text @@ -308,14 +320,16 @@ int newlen = ( int ) strlen( text ); if (pos == -1) { - char* str = ( char* ) malloc( newlen + 1 ); + char* str = (char *) malloc( newlen + 1 ); memcpy( str, text, newlen + 1 ); lines.push_back( str ); lrows.push_back( 0 ); } else { - lines[pos] = ( char * ) realloc( lines[pos], newlen + 1 ); + lines[pos] = (char *) realloc( lines[pos], newlen + 1 ); memcpy( lines[pos], text, newlen + 1 ); } + CurPos = newlen; + CurLine = lines.size()-1; UpdateControls(); return 0; } @@ -358,12 +372,12 @@ const char *note = strstr(text,"\r\n\r\nNOTE:"); char *str; if (NULL == note) { - str = ( char* ) malloc( newlen +1 ); + str = (char *) malloc( newlen +1 ); memcpy(str,text, newlen+1); } else { unsigned int notepos = (unsigned int) (note - text); - str = ( char* ) malloc( newlen + CRAPLENGTH+1 ); + str = (char *) malloc( newlen + CRAPLENGTH+1 ); memcpy(str,text,notepos); memcpy(str+notepos,inserted_crap,CRAPLENGTH); memcpy(str+notepos+CRAPLENGTH, text+notepos, newlen-notepos+1); @@ -374,7 +388,7 @@ } else { int mylen = ( int ) strlen( lines[pos] ); - lines[pos] = ( char * ) realloc( lines[pos], mylen + newlen + 1 ); + lines[pos] = (char *) realloc( lines[pos], mylen + newlen + 1 ); memcpy( lines[pos]+mylen, text, newlen + 1 ); ret = pos; } @@ -452,6 +466,26 @@ /** Key Press Event */ void TextArea::OnKeyPress(unsigned char Key, unsigned short /*Mod*/) { + if (Flags & IE_GUI_TEXTAREA_EDITABLE) { + if (Key >= 0x20) { + Owner->Invalidate(); + Changed = true; + int len = GetRowLength(CurLine); + printf("len: %d Before: %s\n",len, lines[CurLine]); + lines[CurLine] = (char *) realloc( lines[CurLine], len + 2 ); + for (int i = len; i > CurPos; i--) { + lines[CurLine][i] = lines[CurLine][i - 1]; + } + lines[CurLine][CurPos] = Key; + lines[CurLine][len + 1] = 0; + CurPos++; + printf("pos: %d After: %s\n",CurPos, lines[CurLine]); + CalcRowCount(); + RunEventHandler( TextAreaOnChange ); + } + return; + } + //Selectable=false for dialogs, rather unintuitive, but fact if ((Flags & IE_GUI_TEXTAREA_SELECTABLE) || ( Key < '1' ) || ( Key > '9' )) return; @@ -481,9 +515,125 @@ gc->DialogChoose( idx ); } } + /** Special Key Press */ -void TextArea::OnSpecialKeyPress(unsigned char /*Key*/) +void TextArea::OnSpecialKeyPress(unsigned char Key) { + int len; + + if (!(Flags&IE_GUI_TEXTAREA_EDITABLE)) { + return; + } + Owner->Invalidate(); + Changed = true; + switch (Key) { + case GEM_HOME: + CurPos = 0; + CurLine = 0; + break; + case GEM_UP: + if (CurLine) { + CurLine--; + } + break; + case GEM_DOWN: + if (CurLine<lines.size()) { + CurLine++; + } + break; + case GEM_END: + CurLine=lines.size()-1; + CurPos = GetRowLength((unsigned int) CurLine); + break; + case GEM_LEFT: + if (CurPos > 0) { + CurPos--; + } else { + if (CurLine) { + CurLine--; + CurPos = GetRowLength(CurLine); + } + } + break; + case GEM_RIGHT: + len = GetRowLength(CurLine); + if (CurPos < len) { + CurPos++; + } else { + if(CurLine<lines.size()) { + CurPos=0; + CurLine++; + } + } + break; + case GEM_DELETE: + len = GetRowLength(CurLine); + printf("len: %d Before: %s\n",len, lines[CurLine]); + if (CurPos>=len) { + //TODO: merge next line + break; + } + lines[CurLine] = (char *) realloc( lines[CurLine], len ); + for (int i = CurPos; i < len; i++) { + lines[CurLine][i] = lines[CurLine][i + 1]; + } + printf("pos: %d After: %s\n",CurPos, lines[CurLine]); + break; + case GEM_BACKSP: + len = GetRowLength(CurLine); + if (CurPos != 0) { + printf("len: %d Before: %s\n",len, lines[CurLine]); + if (len<1) { + break; + } + lines[CurLine] = (char *) realloc( lines[CurLine], len ); + for (int i = CurPos; i < len; i++) { + lines[CurLine][i - 1] = lines[CurLine][i]; + } + lines[CurLine][len - 1] = 0; + CurPos--; + printf("pos: %d After: %s\n",CurPos, lines[CurLine]); + } else { + if (CurLine) { + //TODO: merge lines + int oldline = CurLine; + CurLine--; + int old = GetRowLength(CurLine); + printf("len: %d Before: %s\n",old, lines[CurLine]); + printf("len: %d Before: %s\n",len, lines[oldline]); + lines[CurLine] = (char *) realloc (lines[CurLine], len+old); + memcpy(lines[CurLine]+old, lines[oldline],len); + free(lines[oldline]); + lines[CurLine][old+len]=0; + lines.erase(lines.begin()+oldline); + lrows.erase(lrows.begin()+oldline); + CurPos = old; + printf("pos: %d len: %d After: %s\n",CurPos, GetRowLength(CurLine), lines[CurLine]); + } + } + break; + case GEM_RETURN: + //add an empty line after CurLine + printf("pos: %d Before: %s\n",CurPos, lines[CurLine]); + lrows.insert(lrows.begin()+CurLine, 0); + len = GetRowLength(CurLine); + //copy the text after the cursor into the new line + char *str = (char *) malloc(len-CurPos+2); + memcpy(str, lines[CurLine]+CurPos, len-CurPos+1); + str[len-CurPos+1] = 0; + lines.insert(lines.begin()+CurLine+1, str); + //truncate the current line + lines[CurLine] = (char *) realloc (lines[CurLine], CurPos+1); + lines[CurLine][CurPos]=0; + //move cursor to next line beginning + CurLine++; + CurPos=0; + printf("len: %d After: %s\n",GetRowLength(CurLine-1), lines[CurLine-1]); + printf("len: %d After: %s\n",GetRowLength(CurLine), lines[CurLine]); + break; + } + CalcRowCount(); + RunEventHandler( TextAreaOnChange ); } /** Returns Row count */ @@ -492,6 +642,15 @@ return ( int ) lines.size(); } +int TextArea::GetRowLength(unsigned int row) +{ + if (lines.size()<=row) { + return 0; + } + //this is just roughly the line size, escape sequences need to be removed + return strlen( lines[row] ); +} + int TextArea::GetVisibleRowCount() { return (Height-5) / ftext->maxHeight; @@ -540,7 +699,7 @@ rows++; int tr = 0; int len = ( int ) strlen( lines[i] ); - char* tmp = ( char* ) malloc( len + 1 ); + char* tmp = (char *) malloc( len + 1 ); memcpy( tmp, lines[i], len + 1 ); ftext->SetupString( tmp, w ); for (int p = 0; p <= len; p++) { @@ -569,6 +728,21 @@ free( tmp ); } } + + if (lines.size()) + { + if (CurLine>=lines.size()) { + CurLine=lines.size()-1; + } + w = strlen(lines[CurLine]); + if (CurPos>w) { + CurPos = w; + } + } else { + CurLine=0; + CurPos=0; + } + if (!sb) { return; } Modified: gemrb/trunk/gemrb/plugins/Core/TextArea.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextArea.h 2008-09-14 10:50:06 UTC (rev 5289) +++ gemrb/trunk/gemrb/plugins/Core/TextArea.h 2008-09-14 11:06:46 UTC (rev 5290) @@ -46,6 +46,7 @@ #define IE_GUI_TEXTAREA_HISTORY 8 #define IE_GUI_TEXTAREA_SPEAKER 16 #define IE_GUI_TEXTAREA_ALT_FONT 32 //this one disables drop capitals +#define IE_GUI_TEXTAREA_EDITABLE 64 // internal flags #define TA_INITIALS 1 @@ -99,6 +100,8 @@ void SetFonts(Font* init, Font* text); /** Returns Number of Rows */ int GetRowCount(); + /** Returns the length of a Row */ + int GetRowLength(unsigned int row); /** Returns Number of Visible Rows */ int GetVisibleRowCount(); /** Returns Starting Row */ @@ -146,9 +149,16 @@ /** Fonts */ Font* finit, * ftext; ieResRef PortraitResRef; + + /** Text Editing Cursor Sprite */ + Sprite2D* Cursor; + unsigned short CurPos, CurLine; + +private: //internal functions void CalcRowCount(); void UpdateControls(); void RefreshSprite(const char *portrait); + public: //Events /** Key Press Event */ void OnKeyPress(unsigned char Key, unsigned short Mod); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-23 18:51:03
|
Revision: 5347 http://gemrb.svn.sourceforge.net/gemrb/?rev=5347&view=rev Author: avenger_teambg Date: 2008-09-23 18:48:45 +0000 (Tue, 23 Sep 2008) Log Message: ----------- added some of zefklop's patch about MoveViewport speed and timing Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-09-23 18:47:22 UTC (rev 5346) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-09-23 18:48:45 UTC (rev 5347) @@ -925,7 +925,7 @@ void GameScript::MoveViewPoint(Scriptable* /*Sender*/, Action* parameters) { - core->timer->SetMoveViewPort( parameters->pointParameter.x, parameters->pointParameter.y, parameters->int0Parameter, true ); + core->timer->SetMoveViewPort( parameters->pointParameter.x, parameters->pointParameter.y, parameters->int0Parameter<<1, true ); } void GameScript::MoveViewObject(Scriptable* Sender, Action* parameters) @@ -934,7 +934,7 @@ if (!scr) { return; } - core->timer->SetMoveViewPort( scr->Pos.x, scr->Pos.y, parameters->int0Parameter, true ); + core->timer->SetMoveViewPort( scr->Pos.x, scr->Pos.y, parameters->int0Parameter<<1, true ); } void GameScript::AddWayPoint(Scriptable* Sender, Action* parameters) Modified: gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp 2008-09-23 18:47:22 UTC (rev 5346) +++ gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp 2008-09-23 18:48:45 UTC (rev 5347) @@ -144,10 +144,15 @@ if (video->isScrolling() ) video->drawScrollCursorSprite(video->whereIsTheCursor()); - UpdateAnimations(); GetTime( thisTime ); + + if (!startTime) { + startTime = thisTime; + return; + } + advance = thisTime - startTime; if ( advance < interval) { return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-28 14:54:53
|
Revision: 5366 http://gemrb.svn.sourceforge.net/gemrb/?rev=5366&view=rev Author: avenger_teambg Date: 2008-09-28 14:54:41 +0000 (Sun, 28 Sep 2008) Log Message: ----------- detecting double clicks Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Button.cpp gemrb/trunk/gemrb/plugins/Core/Button.h gemrb/trunk/gemrb/plugins/Core/Control.cpp gemrb/trunk/gemrb/plugins/Core/Control.h gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/Core/EventMgr.h gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.h gemrb/trunk/gemrb/plugins/Core/Label.cpp gemrb/trunk/gemrb/plugins/Core/Label.h gemrb/trunk/gemrb/plugins/Core/MapControl.cpp gemrb/trunk/gemrb/plugins/Core/MapControl.h gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp gemrb/trunk/gemrb/plugins/Core/ScrollBar.h gemrb/trunk/gemrb/plugins/Core/Slider.cpp gemrb/trunk/gemrb/plugins/Core/Slider.h gemrb/trunk/gemrb/plugins/Core/TextArea.cpp gemrb/trunk/gemrb/plugins/Core/TextArea.h gemrb/trunk/gemrb/plugins/Core/WorldMapControl.cpp gemrb/trunk/gemrb/plugins/Core/WorldMapControl.h Modified: gemrb/trunk/gemrb/plugins/Core/Button.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Button.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -340,7 +340,7 @@ /** Mouse Button Down */ void Button::OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod) + unsigned short Button, unsigned short Mod) { if (State == IE_GUI_BUTTON_DISABLED) { Control::OnMouseDown(x,y,Button,Mod); @@ -393,7 +393,7 @@ } /** Mouse Button Up */ void Button::OnMouseUp(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod) + unsigned short Button, unsigned short Mod) { if (State == IE_GUI_BUTTON_DISABLED) { return; Modified: gemrb/trunk/gemrb/plugins/Core/Button.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Button.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -158,10 +158,10 @@ /** Mouse Over */ void OnMouseOver(unsigned short x, unsigned short y); /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** A special key has been pressed */ void OnSpecialKeyPress(unsigned char Key); Modified: gemrb/trunk/gemrb/plugins/Core/Control.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Control.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Control.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -160,7 +160,7 @@ /** Mouse Button Down */ void Control::OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod) + unsigned short Button, unsigned short Mod) { if (Button == GEM_MB_SCRLUP || Button == GEM_MB_SCRLDOWN) { Control *ctrl = Owner->GetScrollControl(); @@ -172,7 +172,7 @@ /** Mouse Button Up */ void Control::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned char /*Button*/, unsigned short /*Mod*/) + unsigned short /*Button*/, unsigned short /*Mod*/) { //printf("OnMouseUp: CtrlID = 0x%08X, x = %hd, y = %hd, Button = %d, Mos = %hd\n", (unsigned int) ControlID, x, y, Button, Mod); } Modified: gemrb/trunk/gemrb/plugins/Core/Control.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Control.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Control.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -155,10 +155,10 @@ virtual void OnMouseOver(unsigned short x, unsigned short y); /** Mouse Button Down */ virtual void OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod); + unsigned short Button, unsigned short Mod); /** Mouse Button Up */ virtual void OnMouseUp(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod); + unsigned short Button, unsigned short Mod); /** Special Key Press */ virtual void OnSpecialKeyPress(unsigned char Key); virtual bool IsPixelTransparent(unsigned short /*x*/, unsigned short /*y*/) { Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -24,12 +24,18 @@ #include "Interface.h" #include "Video.h" +//double click time (configure? system variable?) +#define DC_TIME 500 + EventMgr::EventMgr(void) { last_win_focused = NULL; // Last window we were over. Used to determine MouseEnter and MouseLeave events last_win_over = NULL; MButtons = 0; + dc_x = 0; + dc_y = 0; + dc_time = 0; } EventMgr::~EventMgr(void) @@ -198,13 +204,27 @@ } /** BroadCast Mouse Move Event */ -void EventMgr::MouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod) +void EventMgr::MouseDown(unsigned short x, unsigned short y, unsigned short Button, + unsigned short Mod) { std::vector< int>::iterator t; std::vector< Window*>::iterator m; Control *ctrl; + unsigned long thisTime; + GetTime( thisTime ); + if (dc_x==x && dc_y==y && dc_time>thisTime) { + Button |= GEM_MB_DOUBLECLICK; + dc_x = 0; + dc_y = 0; + dc_time = 0; + } else { + printMessage("EventMgr","",GREEN); + printf("time: %d\n", (int) (thisTime-dc_time) ); + dc_x = x; + dc_y = y; + dc_time = thisTime+DC_TIME; + } MButtons |= Button; for (t = topwin.begin(); t != topwin.end(); ++t) { m = windows.begin(); @@ -247,8 +267,8 @@ } } /** BroadCast Mouse Up Event */ -void EventMgr::MouseUp(unsigned short x, unsigned short y, - unsigned char Button, unsigned short Mod) +void EventMgr::MouseUp(unsigned short x, unsigned short y, unsigned short Button, + unsigned short Mod) { MButtons &= ~Button; if (last_win_focused == NULL) return; Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -56,7 +56,8 @@ #define GEM_MB_MENU 4 #define GEM_MB_SCRLUP 8 #define GEM_MB_SCRLDOWN 16 -//not working actually + +#define GEM_MB_NORMAL 255 #define GEM_MB_DOUBLECLICK 256 #ifdef WIN32 @@ -82,6 +83,8 @@ std::vector< Window*> windows; std::vector< int> topwin; + unsigned short dc_x, dc_y; + unsigned long dc_time; public: EventMgr(void); ~EventMgr(void); @@ -97,10 +100,10 @@ /** BroadCast Mouse Move Event */ void MouseMove(unsigned short x, unsigned short y); /** BroadCast Mouse Move Event */ - void MouseDown(unsigned short x, unsigned short y, unsigned char Button, + void MouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** BroadCast Mouse Move Event */ - void MouseUp(unsigned short x, unsigned short y, unsigned char Button, + void MouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** BroadCast Mouse Idle Event */ void MouseIdle(unsigned long time); Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -1343,8 +1343,8 @@ return false; } /** Mouse Button Down */ -void GameControl::OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short /*Mod*/) +void GameControl::OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, + unsigned short /*Mod*/) { if (ScreenFlags&SF_DISABLEMOUSE) return; @@ -1371,8 +1371,8 @@ } } /** Mouse Button Up */ -void GameControl::OnMouseUp(unsigned short x, unsigned short y, - unsigned char Button, unsigned short /*Mod*/) +void GameControl::OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, + unsigned short /*Mod*/) { unsigned int i; char Tmp[256]; Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -136,10 +136,10 @@ /** Mouse Over Event */ void OnMouseOver(unsigned short x, unsigned short y); /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Special Key Press */ void OnSpecialKeyPress(unsigned char Key); Modified: gemrb/trunk/gemrb/plugins/Core/Label.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Label.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Label.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -114,7 +114,7 @@ } void Label::OnMouseUp(unsigned short x, unsigned short y, - unsigned char /*Button*/, unsigned short /*Mod*/) + unsigned short /*Button*/, unsigned short /*Mod*/) { printf( "Label::OnMouseUp\n" ); if (( x <= Width ) && ( y <= Height )) { Modified: gemrb/trunk/gemrb/plugins/Core/Label.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Label.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Label.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -70,7 +70,7 @@ const char* QueryText(); /** Mouse Button Down */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Set handler for specified event */ bool SetEvent(int eventType, const char *handler); Modified: gemrb/trunk/gemrb/plugins/Core/MapControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/MapControl.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/MapControl.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -86,6 +86,8 @@ // initialize var and event callback to no-ops VarName[0] = 0; ResetEventHandler( MapControlOnPress ); + ResetEventHandler( MapControlOnRightPress ); + ResetEventHandler( MapControlOnDoublePress ); MyMap = core->GetGame()->GetCurrentArea(); MapMOS = MyMap->SmallMap->GetImage(); @@ -325,11 +327,24 @@ Owner->Cursor = IE_CURSOR_NORMAL; } -void MapControl::ClickHandle() +void MapControl::ClickHandle(unsigned char Button) { core->GetDictionary()->SetAt( "MapControlX", NotePosX ); core->GetDictionary()->SetAt( "MapControlY", NotePosY ); - RunEventHandler( MapControlOnPress ); + switch(Button&GEM_MB_NORMAL) + { + case GEM_MB_ACTION: + if (Button&GEM_MB_DOUBLECLICK) { + RunEventHandler( MapControlOnDoublePress ); + printMessage("MapControl","Doubleclick detected\n",GREEN); + } else { + RunEventHandler( MapControlOnPress ); + } + break; + case GEM_MB_MENU: + RunEventHandler( MapControlOnRightPress ); + break; + } } void MapControl::ViewHandle(unsigned short x, unsigned short y) @@ -346,16 +361,20 @@ } /** Mouse Button Down */ -void MapControl::OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short /*Mod*/) +void MapControl::OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, + unsigned short /*Mod*/) { - switch(Button) { + switch((unsigned char) Button) { case GEM_MB_SCRLUP: OnSpecialKeyPress(GEM_UP); return; case GEM_MB_SCRLDOWN: OnSpecialKeyPress(GEM_DOWN); return; + case GEM_MB_ACTION: + if (Button & GEM_MB_DOUBLECLICK) { + ClickHandle((unsigned char) Button); + } } mouseIsDown = true; @@ -374,8 +393,8 @@ } /** Mouse Button Up */ -void MapControl::OnMouseUp(unsigned short x, unsigned short y, - unsigned char Button, unsigned short /*Mod*/) +void MapControl::OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, + unsigned short /*Mod*/) { if (!mouseIsDown) { return; @@ -388,7 +407,7 @@ ViewHandle(x,y); NotePosX = (short) SCREEN_TO_MAPX(x) * MAP_MULT / MAP_DIV; NotePosY = (short) SCREEN_TO_MAPY(y) * MAP_MULT / MAP_DIV; - ClickHandle(); + ClickHandle((unsigned char) Button); return; case MAP_NO_NOTES: ViewHandle(x,y); @@ -398,10 +417,10 @@ if ((Button == GEM_MB_ACTION) ) { ViewHandle(x,y); } - ClickHandle(); - break; + ClickHandle((unsigned char) Button); + return; default: - ClickHandle(); + ClickHandle((unsigned char) Button); return; } } @@ -448,6 +467,12 @@ case IE_GUI_MAP_ON_PRESS: SetEventHandler( MapControlOnPress, handler ); break; + case IE_GUI_MAP_ON_RIGHT_PRESS: + SetEventHandler( MapControlOnRightPress, handler ); + break; + case IE_GUI_MAP_ON_DOUBLE_PRESS: + SetEventHandler( MapControlOnDoublePress, handler ); + break; default: return false; } Modified: gemrb/trunk/gemrb/plugins/Core/MapControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/MapControl.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/MapControl.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -33,9 +33,10 @@ #include "Interface.h" // !!! Keep these synchronized with GUIDefines.py !!! -#define IE_GUI_MAP_ON_PRESS 0x09000000 +#define IE_GUI_MAP_ON_PRESS 0x09000000 +#define IE_GUI_MAP_ON_RIGHT_PRESS 0x09000001 +#define IE_GUI_MAP_ON_DOUBLE_PRESS 0x09000002 - #ifdef WIN32 #ifdef GEM_BUILD_DLL @@ -77,6 +78,8 @@ short ViewWidth, ViewHeight; short XCenter, YCenter; EventHandler MapControlOnPress; + EventHandler MapControlOnRightPress; + EventHandler MapControlOnDoublePress; MapControl(void); ~MapControl(void); @@ -97,10 +100,10 @@ /** Mouse Leave Event */ void OnMouseLeave(unsigned short x, unsigned short y); /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Key Release Event */ void OnKeyRelease(unsigned char Key, unsigned short Mod); @@ -110,7 +113,7 @@ bool SetEvent(int eventType, const char *handler); private: /** Call event handler on click */ - void ClickHandle(); + void ClickHandle(unsigned char Button); /** Move viewport */ void ViewHandle(unsigned short x, unsigned short y); }; Modified: gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -145,7 +145,7 @@ } /** Mouse Button Down */ void ScrollBar::OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short /*Mod*/) + unsigned short Button, unsigned short /*Mod*/) { core->RedrawAll(); @@ -212,7 +212,7 @@ } /** Mouse Button Up */ void ScrollBar::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned char /*Button*/, unsigned short /*Mod*/) + unsigned short /*Button*/, unsigned short /*Mod*/) { Changed = true; State = 0; Modified: gemrb/trunk/gemrb/plugins/Core/ScrollBar.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScrollBar.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/ScrollBar.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -95,10 +95,10 @@ Control* ta; public: // Public Events /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse Over Event */ void OnMouseOver(unsigned short x, unsigned short y); Modified: gemrb/trunk/gemrb/plugins/Core/Slider.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Slider.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Slider.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -90,11 +90,13 @@ break; } } + /** Returns the actual Slider Position */ unsigned int Slider::GetPosition() { return Pos; } + /** Sets the actual Slider Position trimming to the Max and Min Values */ void Slider::SetPosition(unsigned int pos) { @@ -108,6 +110,7 @@ } Changed = true; } + /** Redraws a slider which is associated with VariableName */ void Slider::RedrawSlider(const char* VariableName, int Sum) { @@ -123,6 +126,7 @@ } Changed = true; } + /** Sets the selected image */ void Slider::SetImage(unsigned char type, Sprite2D* img) { @@ -149,8 +153,8 @@ } /** Mouse Button Down */ -void Slider::OnMouseDown(unsigned short x, unsigned short y, - unsigned char /*Button*/, unsigned short /*Mod*/) +void Slider::OnMouseDown(unsigned short x, unsigned short y, unsigned short /*Button*/, + unsigned short /*Mod*/) { Changed = true; unsigned int oldPos = Pos; @@ -220,15 +224,17 @@ } } } + /** Mouse Button Up */ -void Slider::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned char /*Button*/, unsigned short /*Mod*/) +void Slider::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, unsigned short /*Button*/, + unsigned short /*Mod*/) { if (State != IE_GUI_SLIDER_KNOB) { Changed = true; } State = IE_GUI_SLIDER_KNOB; } + /** Mouse Over Event */ void Slider::OnMouseOver(unsigned short x, unsigned short /*y*/) { @@ -270,6 +276,7 @@ return 0; } +/** Sets the slider change event */ bool Slider::SetEvent(int eventType, const char *handler) { Changed = true; Modified: gemrb/trunk/gemrb/plugins/Core/Slider.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Slider.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/Slider.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -101,9 +101,11 @@ unsigned int Pos; public: // Public Events /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, unsigned short Mod); + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, + unsigned short Mod); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, unsigned short Mod); + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, + unsigned short Mod); /** Mouse Over Event */ void OnMouseOver(unsigned short x, unsigned short y); /** Set handler for specified event */ Modified: gemrb/trunk/gemrb/plugins/Core/TextArea.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextArea.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/TextArea.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -775,8 +775,8 @@ } /** Mouse Button Up */ -void TextArea::OnMouseUp(unsigned short x, unsigned short y, - unsigned char /*Button*/, unsigned short /*Mod*/) +void TextArea::OnMouseUp(unsigned short x, unsigned short y, unsigned short /*Button*/, + unsigned short /*Mod*/) { if (( x <= Width ) && ( y <= ( Height - 5 ) ) && ( seltext != -1 )) { Value = (unsigned int) seltext; @@ -912,8 +912,8 @@ AppendText("\n",-1); } -void TextArea::OnMouseDown(unsigned short /*x*/, unsigned short /*y*/, - unsigned char Button, unsigned short /*Mod*/) +void TextArea::OnMouseDown(unsigned short /*x*/, unsigned short /*y*/, unsigned short Button, + unsigned short /*Mod*/) { ScrollBar* scrlbr = (ScrollBar*) sb; Modified: gemrb/trunk/gemrb/plugins/Core/TextArea.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TextArea.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/TextArea.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -167,10 +167,10 @@ /** Mouse Over Event */ void OnMouseOver(unsigned short x, unsigned short y); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse button down*/ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Set handler for specified event */ bool SetEvent(int eventType, const char *handler); Modified: gemrb/trunk/gemrb/plugins/Core/WorldMapControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/WorldMapControl.cpp 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/WorldMapControl.cpp 2008-09-28 14:54:41 UTC (rev 5366) @@ -276,7 +276,7 @@ /** Mouse Button Down */ void WorldMapControl::OnMouseDown(unsigned short x, unsigned short y, - unsigned char Button, unsigned short /*Mod*/) + unsigned short Button, unsigned short /*Mod*/) { switch(Button) { case GEM_MB_ACTION: @@ -294,7 +294,7 @@ } /** Mouse Button Up */ void WorldMapControl::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, - unsigned char Button, unsigned short /*Mod*/) + unsigned short Button, unsigned short /*Mod*/) { if (Button != GEM_MB_ACTION) { return; Modified: gemrb/trunk/gemrb/plugins/Core/WorldMapControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/WorldMapControl.h 2008-09-27 09:06:19 UTC (rev 5365) +++ gemrb/trunk/gemrb/plugins/Core/WorldMapControl.h 2008-09-28 14:54:41 UTC (rev 5366) @@ -108,10 +108,10 @@ /** Mouse Leave Event */ void OnMouseLeave(unsigned short x, unsigned short y); /** Mouse Button Down */ - void OnMouseDown(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Mouse Button Up */ - void OnMouseUp(unsigned short x, unsigned short y, unsigned char Button, + void OnMouseUp(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); /** Key Release Event */ void OnKeyRelease(unsigned char Key, unsigned short Mod); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-09-28 15:24:00
|
Revision: 5368 http://gemrb.svn.sourceforge.net/gemrb/?rev=5368&view=rev Author: avenger_teambg Date: 2008-09-28 15:23:47 +0000 (Sun, 28 Sep 2008) Log Message: ----------- handling 'DoubleClickDelay' in gemrb.cfg (default= 500) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/Core/EventMgr.h gemrb/trunk/gemrb/plugins/Core/Interface.cpp Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2008-09-28 15:01:49 UTC (rev 5367) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2008-09-28 15:23:47 UTC (rev 5368) @@ -24,9 +24,6 @@ #include "Interface.h" #include "Video.h" -//double click time (configure? system variable?) -#define DC_TIME 500 - EventMgr::EventMgr(void) { last_win_focused = NULL; @@ -36,6 +33,7 @@ dc_x = 0; dc_y = 0; dc_time = 0; + dc_delay = 500; } EventMgr::~EventMgr(void) @@ -203,6 +201,16 @@ video->SetCursor( core->Cursors[idx], core->Cursors[idx ^ 1] ); } +bool EventMgr::ClickMatch(unsigned short x, unsigned short y, unsigned long thisTime) +{ + if (dc_x+10<x) return false; + if (dc_x>x+10) return false; + if (dc_y+10<y) return false; + if (dc_y>y+10) return false; + if (dc_time<thisTime) return false; + return true; +} + /** BroadCast Mouse Move Event */ void EventMgr::MouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod) @@ -213,7 +221,7 @@ unsigned long thisTime; GetTime( thisTime ); - if (dc_x==x && dc_y==y && dc_time>thisTime) { + if (ClickMatch(x, y, thisTime)) { Button |= GEM_MB_DOUBLECLICK; dc_x = 0; dc_y = 0; @@ -223,7 +231,7 @@ printf("time: %d\n", (int) (thisTime-dc_time) ); dc_x = x; dc_y = y; - dc_time = thisTime+DC_TIME; + dc_time = thisTime+dc_delay; } MButtons |= Button; for (t = topwin.begin(); t != topwin.end(); ++t) { @@ -364,3 +372,9 @@ core->GetVideoDriver()->GetMousePos(x,y); MouseMove((unsigned short) x, (unsigned short) y); } + +void EventMgr::SetDCDelay(unsigned long t) +{ + dc_delay = t; +} + Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.h 2008-09-28 15:01:49 UTC (rev 5367) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.h 2008-09-28 15:23:47 UTC (rev 5368) @@ -84,7 +84,7 @@ std::vector< int> topwin; unsigned short dc_x, dc_y; - unsigned long dc_time; + unsigned long dc_time, dc_delay; public: EventMgr(void); ~EventMgr(void); @@ -115,6 +115,9 @@ void OnSpecialKeyPress(unsigned char Key); /** Sets focus to the control of the window */ void SetFocused(Window *win, Control *ctrl); + /** Sets the maximum accepted doubleclick delay */ + void SetDCDelay(unsigned long t); + /** Mask of which Mouse Buttons are pressed */ unsigned char MButtons; private: @@ -125,6 +128,7 @@ /** Sets a Window on the Top of the Window Queue */ void SetDefaultFocus(Window *win); void SetOnTop(int Index); + bool ClickMatch(unsigned short x, unsigned short y, unsigned long thisTime); }; #endif // ! EVENTMGR_H Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-09-28 15:01:49 UTC (rev 5367) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-09-28 15:23:47 UTC (rev 5368) @@ -1224,6 +1224,9 @@ int Interface::Init() { + printMessage( "Core", "Initializing the Event Manager...", WHITE ); + evntmgr = new EventMgr(); + printMessage( "Core", "Initializing Variables Dictionary...", WHITE ); vars = new Variables(); if (!vars) { @@ -1396,10 +1399,8 @@ return GEM_ERROR; } - printMessage( "Core", "Initializing the Event Manager...", WHITE ); - evntmgr = new EventMgr(); printStatus( "OK", LIGHT_GREEN ); - printMessage( "Core", "BroadCasting Event Manager...", WHITE ); + printMessage( "Core", "Broadcasting Event Manager...", WHITE ); video->SetEventMgr( evntmgr ); printStatus( "OK", LIGHT_GREEN ); printMessage( "Core", "Initializing Window Manager...", WHITE ); @@ -1485,18 +1486,6 @@ printMessage( "Core", "Loading resource data File...", WHITE ); INIresdata = ( DataFileMgr * ) GetInterface( IE_INI_CLASS_ID ); DataStream* ds = key->GetResource("resdata", IE_INI_CLASS_ID); -/* - FileStream* fs = new FileStream(); - char tINIresdata[_MAX_PATH]; - PathJoin( tINIresdata, GamePath, "resdata.ini", NULL ); - ResolveFilePath( tINIresdata ); - struct stat fst; - if ( stat(tINIresdata, &fst) == -1 ) { - printStatus( "ERROR", LIGHT_RED ); - return GEM_ERROR; - } - fs->Open( tINIresdata, true ); -*/ if (!INIresdata->Open( ds, true )) { printStatus( "ERROR", LIGHT_RED ); } else { @@ -1986,6 +1975,8 @@ FullScreen = ( atoi( value ) == 0 ) ? false : true; } else if (stricmp( name, "TooltipDelay" ) == 0) { TooltipDelay = atoi( value ); + } else if (stricmp( name, "DoubleClickDelay" ) == 0) { + evntmgr->SetDCDelay( atoi( value ) ); } else if (stricmp( name, "SkipIntroVideos" ) == 0) { SkipIntroVideos = ( atoi( value ) == 0 ) ? false : true; } else if (stricmp( name, "DrawFPS" ) == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-04 09:15:29
|
Revision: 5381 http://gemrb.svn.sourceforge.net/gemrb/?rev=5381&view=rev Author: avenger_teambg Date: 2008-10-04 09:15:28 +0000 (Sat, 04 Oct 2008) Log Message: ----------- accumulate kill statistics (for information screen) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Game.h gemrb/trunk/gemrb/plugins/Core/PCStatStruct.cpp gemrb/trunk/gemrb/plugins/Core/PCStatStruct.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2008-10-03 16:04:23 UTC (rev 5380) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2008-10-04 09:15:28 UTC (rev 5381) @@ -1774,28 +1774,28 @@ //returns actual damage int Actor::Damage(int damage, int damagetype, Actor *hitter) { + //add lastdamagetype up + LastDamageType|=damagetype; + LastHitter=hitter->GetID(); //recalculate damage based on resistances and difficulty level //the lower 2 bits are actually modifier types switch(damagetype&3) { case MOD_ADDITIVE: - NewBase(IE_HITPOINTS, (ieDword) -damage, MOD_ADDITIVE); + damage = -NewBase(IE_HITPOINTS, (ieDword) -damage, MOD_ADDITIVE); break; case MOD_ABSOLUTE: - NewBase(IE_HITPOINTS, (ieDword) damage, MOD_ABSOLUTE); + damage = -NewBase(IE_HITPOINTS, (ieDword) damage, MOD_ABSOLUTE); break; case MOD_PERCENT: - NewBase(IE_HITPOINTS, (ieDword) damage, MOD_PERCENT); + damage = -NewBase(IE_HITPOINTS, (ieDword) damage, MOD_PERCENT); break; default: //this shouldn't happen printMessage("Actor","Invalid damagetype!\n",RED); + return 0; } - //this is just a guess, probably morale is much more complex - //add lastdamagetype up - LastDamageType|=damagetype; LastDamage=damage; - LastHitter=hitter->GetID(); InternalFlags|=IF_ACTIVE; int chp = (signed) Modified[IE_HITPOINTS]; int damagelevel = 3; @@ -2040,9 +2040,13 @@ act = (Actor *) killer; } } + if (act && act->InParty) { - //adjust game statistics here - //game->KillStat(this, killer); + //adjust kill statistics here + PCStatsStruct *stat = act->PCStats; + if (stat) { + stat->NotifyKill(Modified[IE_XPVALUE], ShortStrRef); + } InternalFlags|=IF_GIVEXP; } } @@ -2095,7 +2099,6 @@ //give experience to party game->ShareXP(Modified[IE_XPVALUE], sharexp ); //handle reputation here - // } if (KillVar[0]) { Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-10-03 16:04:23 UTC (rev 5380) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-10-04 09:15:28 UTC (rev 5381) @@ -812,23 +812,27 @@ } } +int Game::GetXPFromCR(int cr) +{ + if (!crtable) LoadCRTable(); + if (crtable) { + int level = GetPartyLevel(true); + if (cr>=MAX_CRLEVEL) { + cr=MAX_CRLEVEL-1; + } + printf("Challenge Rating: %d, party level: %d ", cr, level); + return crtable[level][cr]; + } + printMessage("Game","Cannot find moncrate.2da!\n", LIGHT_RED); + return 0; +} + void Game::ShareXP(int xp, int flags) { int individual; if (flags&SX_CR) { - if (!crtable) LoadCRTable(); - if (crtable) { - int level = GetPartyLevel(true); - if (xp>=MAX_CRLEVEL) { - xp=MAX_CRLEVEL-1; - } - printf("Challenge Rating: %d, party level: %d ", xp, level); - xp = crtable[level][xp]; - printf(" to %d xp.\n",xp); - } else { - printMessage("Game","Cannot find moncrate.2da!", LIGHT_RED); - } + xp = GetXPFromCR(xp); } if (flags&SX_DIVIDE) { Modified: gemrb/trunk/gemrb/plugins/Core/Game.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.h 2008-10-03 16:04:23 UTC (rev 5380) +++ gemrb/trunk/gemrb/plugins/Core/Game.h 2008-10-04 09:15:28 UTC (rev 5381) @@ -331,6 +331,9 @@ return Attackers.size(); } + /** converts challenge rating to xp */ + int GetXPFromCR(int cr); + /** shares XP among all party members */ void ShareXP(int XP, int flags); /** returns true if we should start the party overflow window */ bool PartyOverflow() const; Modified: gemrb/trunk/gemrb/plugins/Core/PCStatStruct.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/PCStatStruct.cpp 2008-10-03 16:04:23 UTC (rev 5380) +++ gemrb/trunk/gemrb/plugins/Core/PCStatStruct.cpp 2008-10-04 09:15:28 UTC (rev 5381) @@ -58,6 +58,20 @@ KillsChapterCount = 0; } +void PCStatsStruct::NotifyKill(ieDword xp, ieStrRef name) +{ + if (BestKilledXP<=xp) { + BestKilledXP = xp; + BestKilledName = name; + } + + KillsTotalXP += xp; + KillsChapterXP += xp; + KillsTotalCount ++; + KillsChapterCount ++; +printf("Killcount increased\n"); +} + //init quick weapon/item slots void PCStatsStruct::InitQuickSlot(unsigned int which, ieWord slot, ieWord headerindex) { Modified: gemrb/trunk/gemrb/plugins/Core/PCStatStruct.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/PCStatStruct.h 2008-10-03 16:04:23 UTC (rev 5380) +++ gemrb/trunk/gemrb/plugins/Core/PCStatStruct.h 2008-10-04 09:15:28 UTC (rev 5381) @@ -113,6 +113,7 @@ public: PCStatsStruct(); void IncrementChapter(); + void NotifyKill(ieDword xp, ieStrRef name); void InitQuickSlot(unsigned int which, ieWord slot, ieWord headerindex); void SetSlotIndex(unsigned int which, ieWord headerindex); void GetSlotAndIndex(unsigned int which, ieWord &slot, ieWord &headerindex); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-04 11:16:32
|
Revision: 5385 http://gemrb.svn.sourceforge.net/gemrb/?rev=5385&view=rev Author: avenger_teambg Date: 2008-10-04 11:16:23 +0000 (Sat, 04 Oct 2008) Log Message: ----------- fixed save game directory case sensitivity handling (won't create the lowercase directory if it exists as uppercase) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-04 11:14:23 UTC (rev 5384) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-04 11:16:23 UTC (rev 5385) @@ -2109,9 +2109,9 @@ FixPath( GamePath, true ); } - FixPath( SavePath, false ); - mkdir( SavePath, S_IREAD|S_IWRITE|S_IEXEC ); - chmod( SavePath, S_IREAD|S_IWRITE|S_IEXEC ); + //FixPath( SavePath, false ); + //mkdir( SavePath, S_IREAD|S_IWRITE|S_IEXEC ); + //chmod( SavePath, S_IREAD|S_IWRITE|S_IEXEC ); FixPath( SavePath, true ); FixPath( CachePath, false ); Modified: gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp 2008-10-04 11:14:23 UTC (rev 5384) +++ gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp 2008-10-04 11:16:23 UTC (rev 5385) @@ -234,10 +234,12 @@ char Path[_MAX_PATH]; snprintf( Path, _MAX_PATH, "%s%s", core->SavePath, PlayMode() ); + ResolveFilePath( Path ); DIR* dir = opendir( Path ); // create the save game directory at first access if (dir == NULL) { mkdir(Path,S_IWRITE|S_IREAD|S_IEXEC); + chmod(Path,S_IWRITE|S_IREAD|S_IEXEC); dir = opendir( Path ); } if (dir == NULL) { //If we cannot open the Directory @@ -300,6 +302,7 @@ return false; } + ResolveFilePath( Path ); DIR* ndir = opendir( Path ); //If we cannot open the Directory if (ndir == NULL) { @@ -421,10 +424,19 @@ snprintf( Path, _MAX_PATH, "%09d-%s", index, slotname ); save_slots.insert( save_slots.end(), strdup( Path ) ); snprintf( Path, _MAX_PATH, "%s%s", core->SavePath, PlayMode() ); + + //if the path exists in different case, don't make it again + ResolveFilePath( Path ); mkdir(Path,S_IWRITE|S_IREAD|S_IEXEC); - snprintf( Path, _MAX_PATH, "%s%s%s%09d-%s", core->SavePath, PlayMode(), SPathDelimiter, index, slotname ); - core->DelTree(Path, false); //this is required in case the old slot wasn't recognised but still there + chmod(Path,S_IWRITE|S_IREAD|S_IEXEC); + //keep the first part we already determined existing + int len = strlen(Path); + snprintf( Path+len, _MAX_PATH-len, "%s%09d-%s", SPathDelimiter, index, slotname ); + ResolveFilePath( Path ); + //this is required in case the old slot wasn't recognised but still there + core->DelTree(Path, false); mkdir(Path,S_IWRITE|S_IREAD|S_IEXEC); + chmod(Path,S_IWRITE|S_IREAD|S_IEXEC); //save files here Game *game = core->GetGame(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-05 17:53:47
|
Revision: 5400 http://gemrb.svn.sourceforge.net/gemrb/?rev=5400&view=rev Author: avenger_teambg Date: 2008-10-05 17:49:26 +0000 (Sun, 05 Oct 2008) Log Message: ----------- more consts in Interface, more comments in ScrollBar Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp gemrb/trunk/gemrb/plugins/Core/ScrollBar.h Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-05 15:36:46 UTC (rev 5399) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-05 17:49:26 UTC (rev 5400) @@ -1784,7 +1784,7 @@ return NULL; } -void Interface::FreeString(char *&str) +void Interface::FreeString(char *&str) const { if (str) { strings->FreeString(str); @@ -1792,7 +1792,7 @@ str = NULL; } -char* Interface::GetString(ieStrRef strref, ieDword options) +char* Interface::GetString(ieStrRef strref, ieDword options) const { ieDword flags = 0; @@ -3995,14 +3995,14 @@ //switch for IE_INV_ITEM_* if it is a CREItem if (item->Flags&IE_ITEM_TWO_HANDED) { //cannot equip twohanded in offhand - if (feedback) core->DisplayConstantString(STR_2HANDEDOFFHAND, 0xf0f0f0); + if (feedback) DisplayConstantString(STR_2HANDEDOFFHAND, 0xf0f0f0); return 0; } } if ( (unsigned int) item->ItemType>=(unsigned int) ItemTypes) { //invalid itemtype - if (feedback) core->DisplayConstantString(STR_WRONGITEMTYPE, 0xf0f0f0); + if (feedback) DisplayConstantString(STR_WRONGITEMTYPE, 0xf0f0f0); return 0; } @@ -4010,7 +4010,7 @@ if (actor) { ieStrRef str = actor->Unusable(item); if (str) { - if (feedback) core->DisplayConstantString(str, 0xf0f0f0); + if (feedback) DisplayConstantString(str, 0xf0f0f0); return 0; } } @@ -4018,7 +4018,7 @@ //if any bit is true, the answer counts as true int ret = (slotmatrix[item->ItemType]&slottype); if (!ret) { - if (feedback) core->DisplayConstantString(STR_WRONGITEMTYPE, 0xf0f0f0); + if (feedback) DisplayConstantString(STR_WRONGITEMTYPE, 0xf0f0f0); } return ret; } @@ -4059,7 +4059,7 @@ return NULL; } -void Interface::DisplayString(const char* Text) +void Interface::DisplayString(const char* Text) const { Label *l = GetMessageLabel(); if (l) { @@ -4075,12 +4075,12 @@ static const char* DisplayFormat = "[/color][p][color=%lX]%s[/color][/p]"; static const char* DisplayFormatValue = "[/color][p][color=%lX]%s: %d[/color][/p]"; -ieStrRef Interface::GetStringReference(int stridx) +ieStrRef Interface::GetStringReference(int stridx) const { return strref_table[stridx]; } -void Interface::DisplayConstantString(int stridx, unsigned int color) +void Interface::DisplayConstantString(int stridx, unsigned int color) const { if (stridx<0) return; char* text = GetString( strref_table[stridx], IE_STR_SOUND ); @@ -4092,7 +4092,7 @@ free( newstr ); } -void Interface::DisplayString(int stridx, unsigned int color, ieDword flags) +void Interface::DisplayString(int stridx, unsigned int color, ieDword flags) const { if (stridx<0) return; char* text = GetString( stridx, flags); @@ -4104,7 +4104,7 @@ free( newstr ); } -void Interface::DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) +void Interface::DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const { if (stridx<0) return; char* text = GetString( strref_table[stridx], IE_STR_SOUND ); @@ -4119,7 +4119,7 @@ #define PALSIZE 8 static Color ActorColor[PALSIZE]; -void Interface::DisplayConstantStringName(int stridx, unsigned int color, Scriptable *speaker) +void Interface::DisplayConstantStringName(int stridx, unsigned int color, Scriptable *speaker) const { unsigned int speaker_color; const char *name; @@ -4152,7 +4152,7 @@ free( newstr ); } -void Interface::DisplayConstantStringAction(int stridx, unsigned int color, Scriptable *attacker, Scriptable *target) +void Interface::DisplayConstantStringAction(int stridx, unsigned int color, Scriptable *attacker, Scriptable *target) const { unsigned int attacker_color; const char *name1; @@ -4190,7 +4190,7 @@ free( newstr ); } -void Interface::DisplayStringName(int stridx, unsigned int color, Scriptable *speaker, ieDword flags) +void Interface::DisplayStringName(int stridx, unsigned int color, Scriptable *speaker, ieDword flags) const { unsigned int speaker_color; const char *name; Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-05 15:36:46 UTC (rev 5399) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-05 17:49:26 UTC (rev 5400) @@ -334,9 +334,9 @@ Video * GetVideoDriver() const; ResourceMgr * GetResourceMgr() const; /* returns a newly created string */ - char * GetString(ieStrRef strref, ieDword options = 0); + char * GetString(ieStrRef strref, ieDword options = 0) const; /* makes sure the string is freed in TLKImp */ - void FreeString(char *&str); + void FreeString(char *&str) const; void FreeInterface(void * ptr); Factory * GetFactory() const; /* sets the floattext color */ @@ -392,21 +392,21 @@ /** returns the textarea of the main game screen */ TextArea *GetMessageTextArea() const; /** returns a string reference from a string reference index constant*/ - ieStrRef GetStringReference(int stridx); + ieStrRef GetStringReference(int stridx) const; /** displays any string in the textarea */ - void DisplayString(const char *txt); + void DisplayString(const char *txt) const; /** displays a string constant in the textarea */ - void DisplayConstantString(int stridx, unsigned int color); + void DisplayConstantString(int stridx, unsigned int color) const; /** displays a string constant followed by a number in the textarea */ - void DisplayConstantStringValue(int stridx, unsigned int color, ieDword value); + void DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const; /** displays a string constant in the textarea, starting with speaker's name */ - void DisplayConstantStringName(int stridx, unsigned int color, Scriptable *speaker); + void DisplayConstantStringName(int stridx, unsigned int color, Scriptable *speaker) const; /** displays a string constant in the textarea, starting with actor, and ending with target */ - void DisplayConstantStringAction(int stridx, unsigned int color, Scriptable *actor, Scriptable *target); + void DisplayConstantStringAction(int stridx, unsigned int color, Scriptable *actor, Scriptable *target) const; /** displays a string in the textarea */ - void DisplayString(int stridx, unsigned int color, ieDword flags); + void DisplayString(int stridx, unsigned int color, ieDword flags) const; /** displays a string in the textarea, starting with speaker's name */ - void DisplayStringName(int stridx, unsigned int color, Scriptable *speaker, ieDword flags); + void DisplayStringName(int stridx, unsigned int color, Scriptable *speaker, ieDword flags) const; /** returns the Window Visible Flag */ int GetVisible(unsigned short WindowIndex) const; /** Set a Window Visible Flag */ Modified: gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp 2008-10-05 15:36:46 UTC (rev 5399) +++ gemrb/trunk/gemrb/plugins/Core/ScrollBar.cpp 2008-10-05 17:49:26 UTC (rev 5400) @@ -32,7 +32,7 @@ State = 0; ResetEventHandler( ScrollBarOnChange ); ta = NULL; - for(int i=0;i<6;i++) { + for(int i=0;i<SB_RES_COUNT;i++) { Frames[i]=NULL; } } @@ -40,13 +40,15 @@ ScrollBar::~ScrollBar(void) { Video *video=core->GetVideoDriver(); - for(int i=0;i<6;i++) { + for(int i=0;i<SB_RES_COUNT;i++) { if(Frames[i]) { video->FreeSprite(Frames[i]); } } } +/** Sets a new position, relays the change to an associated textarea and calls + any existing GUI OnChange callback */ void ScrollBar::SetPos(int NewPos) { if (Pos && ( Pos == NewPos )) { @@ -64,6 +66,7 @@ RunEventHandler( ScrollBarOnChange ); } +/** Refreshes the ScrollBar according to a guiscript variable */ void ScrollBar::RedrawScrollBar(const char* Variable, int Sum) { if (strnicmp( VarName, Variable, MAX_VARIABLE_LENGTH )) { @@ -72,6 +75,7 @@ SetPos( Sum ); } +/** Mousewheel support */ void ScrollBar::ScrollUp() { if (Pos > 0) { @@ -79,6 +83,7 @@ } } +/** Mousewheel support */ void ScrollBar::ScrollDown() { if ( (ieDword) Pos + 1 < Value ) { @@ -86,6 +91,7 @@ } } +/** Draws the ScrollBar control */ void ScrollBar::Draw(unsigned short x, unsigned short y) { if (!Changed && !(Owner->Flags&WF_FLOAT) ) { @@ -135,9 +141,10 @@ true ); } +/** Sets a ScrollBar GUI resource */ void ScrollBar::SetImage(unsigned char type, Sprite2D* img) { - if (type > IE_GUI_SCROLLBAR_SLIDER) { + if (type >= SB_RES_COUNT) { return; } if (Frames[type]) { @@ -146,6 +153,7 @@ Frames[type] = img; Changed = true; } + /** Mouse Button Down */ void ScrollBar::OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short /*Mod*/) @@ -212,6 +220,7 @@ SetPos( aftst ); } } + /** Mouse Button Up */ void ScrollBar::OnMouseUp(unsigned short /*x*/, unsigned short /*y*/, unsigned short /*Button*/, unsigned short /*Mod*/) @@ -219,6 +228,7 @@ Changed = true; State = 0; } + /** Mouse Over Event */ void ScrollBar::OnMouseOver(unsigned short /*x*/, unsigned short y) { @@ -269,6 +279,7 @@ } } +/** Sets the ScrollBarOnChange event (guiscript callback) */ bool ScrollBar::SetEvent(int eventType, const char *handler) { Changed = true; Modified: gemrb/trunk/gemrb/plugins/Core/ScrollBar.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScrollBar.h 2008-10-05 15:36:46 UTC (rev 5399) +++ gemrb/trunk/gemrb/plugins/Core/ScrollBar.h 2008-10-05 17:49:26 UTC (rev 5400) @@ -66,6 +66,8 @@ * Widget displaying scrollbars for paging in long text windows */ +#define SB_RES_COUNT 6 + class GEM_EXPORT ScrollBar : public Control { public: ScrollBar(void); @@ -80,7 +82,7 @@ void Draw(unsigned short x, unsigned short y); private: //Private attributes /** Images for drawing the Scroll Bar */ - Sprite2D* Frames[6]; + Sprite2D* Frames[SB_RES_COUNT]; /** Cursor Position */ unsigned short Pos; /** Scroll Bar Status */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-08 20:39:15
|
Revision: 5415 http://gemrb.svn.sourceforge.net/gemrb/?rev=5415&view=rev Author: avenger_teambg Date: 2008-10-08 20:39:05 +0000 (Wed, 08 Oct 2008) Log Message: ----------- fixed compilation (waitfordisc) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-08 20:30:26 UTC (rev 5414) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-08 20:39:05 UTC (rev 5415) @@ -5377,7 +5377,7 @@ return stat; } -bool Interface::WaitForDisc(int disc_number, const char* path) +void Interface::WaitForDisc(int disc_number, const char* path) { Video* video = GetVideoDriver(); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-08 20:30:26 UTC (rev 5414) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-08 20:39:05 UTC (rev 5415) @@ -634,7 +634,7 @@ /** translates a stat symbol to numeric value */ ieDword TranslateStat(const char *stat_name); /** Opens CD prompt window and waits for the specified disc */ - bool WaitForDisc(int disc_number, const char* path); + void WaitForDisc(int disc_number, const char* path); private: int LoadSprites(); bool LoadConfig(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-08 21:03:13
|
Revision: 5416 http://gemrb.svn.sourceforge.net/gemrb/?rev=5416&view=rev Author: avenger_teambg Date: 2008-10-08 21:03:03 +0000 (Wed, 08 Oct 2008) Log Message: ----------- fixed GameControl preview Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-08 20:39:05 UTC (rev 5415) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-08 21:03:03 UTC (rev 5416) @@ -284,8 +284,6 @@ value = parameters->int2Parameter; break; } -parameters->Dump(); -printf("Setting STat to: %d\n", (int) value); actor->SetBase( parameters->int0Parameter, value); } Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-10-08 20:39:05 UTC (rev 5415) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-10-08 21:03:03 UTC (rev 5416) @@ -2331,7 +2331,10 @@ y = 0; HideGUI (); + signed char v = Owner->Visible; + Owner->Visible = WINDOW_VISIBLE; Draw (0, 0); + Owner->Visible = v; Sprite2D *screenshot = video->GetScreenshot( Region(x, y, w, h) ); UnhideGUI (); core->DrawWindows(); Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2008-10-08 20:39:05 UTC (rev 5415) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2008-10-08 21:03:03 UTC (rev 5416) @@ -320,7 +320,6 @@ if (!itm) { return; } -printf("Equipped is: %d\n", Equipped); ItemExcl &= ~itm->ItemExcl; switch (effect) { @@ -351,7 +350,6 @@ } break; } -printf("Equipped is: %d\n", Equipped); core->FreeItem(itm, item->ItemResRef, false); } /** if resref is "", then destroy ALL items This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-15 18:24:17
|
Revision: 5451 http://gemrb.svn.sourceforge.net/gemrb/?rev=5451&view=rev Author: avenger_teambg Date: 2008-10-15 18:24:12 +0000 (Wed, 15 Oct 2008) Log Message: ----------- fixed Attack to not continue when target is dead (fixed the core problem, not just the symptoms) Modified Paths: -------------- 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/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-10-15 18:20:20 UTC (rev 5450) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-10-15 18:24:12 UTC (rev 5451) @@ -508,6 +508,11 @@ if (oC->objectFields[0]==-1) { Actor* aC = map->GetActorByGlobalID( (ieDword) oC->objectFields[1] ); + /* TODO: this hack will throw away an invalid target */ + /* Consider putting this in GetActorByGlobalID */ + if (aC && !aC->ValidTarget(ga_flags)) { + aC = NULL; + } return ReturnActorAsTarget(aC); } @@ -586,7 +591,7 @@ } ObjectFunction func = objects[filterid]; if (func) { - tgts = func( Sender, tgts); + tgts = func( Sender, tgts, ga_flags); } else { printMessage("GameScript"," ", YELLOW); @@ -2073,7 +2078,7 @@ return 0; } -Targets *GetMyTarget(Scriptable *Sender, Actor *actor, Targets *parameters) +Targets *GetMyTarget(Scriptable *Sender, Actor *actor, Targets *parameters, int ga_flags) { if (!actor) { if (Sender->Type==ST_ACTOR) { @@ -2084,7 +2089,7 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTarget); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; @@ -2120,7 +2125,7 @@ return parameters; } -Targets *XthNearestOf(Targets *parameters, int count) +Targets *XthNearestOf(Targets *parameters, int count, int ga_flags) { Scriptable *origin; @@ -2134,12 +2139,12 @@ if (!origin) { return parameters; } - parameters->AddTarget(origin, 0, 0); + parameters->AddTarget(origin, 0, ga_flags); return parameters; } //mygroup means the same specifics as origin -Targets *XthNearestMyGroupOfType(Scriptable *origin, Targets *parameters, unsigned int count) +Targets *XthNearestMyGroupOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags) { if (origin->Type != ST_ACTOR) { parameters->Clear(); @@ -2167,10 +2172,10 @@ } t = parameters->GetNextTarget(m, ST_ACTOR); } - return XthNearestOf(parameters,count); + return XthNearestOf(parameters,count, ga_flags); } -Targets *NearestEnemySummoned(Scriptable *origin, Targets *parameters) +Targets *ClosestEnemySummoned(Scriptable *origin, Targets *parameters, int ga_flags) { if (origin->Type != ST_ACTOR) { parameters->Clear(); @@ -2215,11 +2220,11 @@ t = parameters->GetNextTarget(m, ST_ACTOR); } parameters->Clear(); - parameters->AddTarget(actor, 0, GA_NO_DEAD); + parameters->AddTarget(actor, 0, ga_flags); return parameters; } -Targets *XthNearestEnemyOfType(Scriptable *origin, Targets *parameters, unsigned int count) +Targets *XthNearestEnemyOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags) { if (origin->Type != ST_ACTOR) { parameters->Clear(); @@ -2264,10 +2269,10 @@ } t = parameters->GetNextTarget(m, ST_ACTOR); } - return XthNearestOf(parameters,count); + return XthNearestOf(parameters,count, ga_flags); } -Targets *XthNearestEnemyOf(Targets *parameters, int count) +Targets *XthNearestEnemyOf(Targets *parameters, int count, int ga_flags) { Actor *origin = (Actor *) parameters->GetTarget(0, ST_ACTOR); parameters->Clear(); @@ -2293,16 +2298,16 @@ int distance = Distance(ac, origin); if (type) { //origin is PC if (ac->GetStat(IE_EA) >= EA_EVILCUTOFF) { - parameters->AddTarget(ac, distance, GA_NO_DEAD); + parameters->AddTarget(ac, distance, ga_flags); } } else { if (ac->GetStat(IE_EA) <= EA_GOODCUTOFF) { - parameters->AddTarget(ac, distance, GA_NO_DEAD); + parameters->AddTarget(ac, distance, ga_flags); } } } - return XthNearestOf(parameters,count); + return XthNearestOf(parameters,count, ga_flags); } Point GetEntryPoint(const char *areaname, const char *entryname) Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2008-10-15 18:20:20 UTC (rev 5450) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2008-10-15 18:24:12 UTC (rev 5451) @@ -82,13 +82,13 @@ #define BINARY_MORE 10 //left has more bits than right #define BINARY_LESS 11 //left has less bits than right -Targets *GetMyTarget(Scriptable *Sender, Actor *actor, Targets *parameters); -Targets *XthNearestOf(Targets *parameters, int count); +Targets *GetMyTarget(Scriptable *Sender, Actor *actor, Targets *parameters, int ga_flags); +Targets *XthNearestOf(Targets *parameters, int count, int ga_flags); Targets *XthNearestDoor(Targets *parameters, unsigned int count); -Targets *XthNearestEnemyOf(Targets *parameters, int count); -Targets *NearestEnemySummoned(Scriptable *origin, Targets *parameters); -Targets *XthNearestEnemyOfType(Scriptable *origin, Targets *parameters, unsigned int count); -Targets *XthNearestMyGroupOfType(Scriptable *origin, Targets *parameters, unsigned int count); +Targets *XthNearestEnemyOf(Targets *parameters, int count, int ga_flags); +Targets *ClosestEnemySummoned(Scriptable *origin, Targets *parameters, int ga_flags); +Targets *XthNearestEnemyOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags); +Targets *XthNearestMyGroupOfType(Scriptable *origin, Targets *parameters, unsigned int count, int ga_flags); void FreeSrc(SrcVector *poi, const ieResRef key); SrcVector *LoadSrc(const ieResRef resname); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-10-15 18:20:20 UTC (rev 5450) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-10-15 18:24:12 UTC (rev 5451) @@ -1782,59 +1782,59 @@ //in this implementation, Myself will drop the parameter array //i think all object filters could be expected to do so //they should remove unnecessary elements from the parameters -Targets *GameScript::Myself(Scriptable* Sender, Targets* parameters) +Targets *GameScript::Myself(Scriptable* Sender, Targets* parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(Sender, 0, 0); + parameters->AddTarget(Sender, 0, ga_flags); return parameters; } -Targets *GameScript::NearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::NearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 0); } -Targets *GameScript::SecondNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SecondNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 1); } -Targets *GameScript::ThirdNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::ThirdNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 2); } -Targets *GameScript::FourthNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FourthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 3); } -Targets *GameScript::FifthNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FifthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 4); } -Targets *GameScript::SixthNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SixthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 5); } -Targets *GameScript::SeventhNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SeventhNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 6); } -Targets *GameScript::EighthNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::EighthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 7); } -Targets *GameScript::NinthNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::NinthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 8); } -Targets *GameScript::TenthNearestDoor(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::TenthNearestDoor(Scriptable* /*Sender*/, Targets *parameters, int /*ga_flags*/) { return XthNearestDoor(parameters, 9); } @@ -1843,14 +1843,14 @@ //in iwd2 this is the Gabber!!! //but also, if there is no gabber, it is the first PC //probably it is simply the nearest exportable character... -Targets *GameScript::Protagonist(Scriptable* Sender, Targets *parameters) +Targets *GameScript::Protagonist(Scriptable* Sender, Targets *parameters, int ga_flags) { parameters->Clear(); //this sucks but IWD2 is like that... if (charnameisgabber) { GameControl* gc = core->GetGameControl(); if (gc) { - parameters->AddTarget(gc->GetSpeaker(), 0, 0); + parameters->AddTarget(gc->GetSpeaker(), 0, ga_flags); } if (parameters->Count()) { return parameters; @@ -1860,36 +1860,36 @@ int i = game->GetPartySize(false); while(i--) { Actor *target = game->GetPC(i,false); - parameters->AddTarget(target, Distance(Sender, target), 0 ); + parameters->AddTarget(target, Distance(Sender, target), ga_flags); } return parameters; } - parameters->AddTarget(core->GetGame()->FindPC(1), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(1), 0, ga_flags); return parameters; } //last talker -Targets *GameScript::Gabber(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Gabber(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); GameControl* gc = core->GetGameControl(); if (gc) { - parameters->AddTarget(gc->GetSpeaker(), 0, 0); + parameters->AddTarget(gc->GetSpeaker(), 0, ga_flags); } return parameters; } -Targets *GameScript::LastTrigger(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastTrigger(Scriptable *Sender, Targets *parameters, int ga_flags) { parameters->Clear(); if (Sender->LastTrigger) { Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } return parameters; } -Targets *GameScript::LastMarkedObject(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastMarkedObject(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -1901,14 +1901,14 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastMarked); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } //actions should always use LastMarkedObject, because LastSeen could be deleted -Targets *GameScript::LastSeenBy(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastSeenBy(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -1920,13 +1920,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastSeen); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LastHelp(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastHelp(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -1938,13 +1938,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHelp); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LastHeardBy(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastHeardBy(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -1956,7 +1956,7 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHeard); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; @@ -1964,7 +1964,7 @@ //i was told that Group means the same specifics, so this is just an //object selector for everyone with the same specifics as the current object -Targets *GameScript::GroupOf(Scriptable *Sender, Targets *parameters) +Targets *GameScript::GroupOf(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -1980,7 +1980,7 @@ while (i--) { Actor *target=cm->GetActor(i,true); if (target && (target->GetStat(IE_SPECIFIC)==tmp) ) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } } @@ -1988,7 +1988,7 @@ } /*this one is tough, but done */ -Targets *GameScript::ProtectorOf(Scriptable *Sender, Targets *parameters) +Targets *GameScript::ProtectorOf(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2004,14 +2004,14 @@ while (i--) { Actor *target=cm->GetActor(i,true); if (target && (target->LastProtected ==tmp) ) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } } return parameters; } -Targets *GameScript::ProtectedBy(Scriptable *Sender, Targets *parameters) +Targets *GameScript::ProtectedBy(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2023,13 +2023,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastProtected); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LastCommandedBy(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastCommandedBy(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2041,7 +2041,7 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastCommander); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; @@ -2049,18 +2049,18 @@ // this is essentially a LastTargetedBy(0) - or MySelf // but IWD2 defines it -Targets *GameScript::MyTarget(Scriptable *Sender, Targets *parameters) +Targets *GameScript::MyTarget(Scriptable *Sender, Targets *parameters, int ga_flags) { - return GetMyTarget(Sender, NULL, parameters); + return GetMyTarget(Sender, NULL, parameters, ga_flags); } -Targets *GameScript::LastTargetedBy(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastTargetedBy(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); - return GetMyTarget(Sender, actor, parameters); + return GetMyTarget(Sender, actor, parameters, ga_flags); } -Targets *GameScript::LastAttackerOf(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastAttackerOf(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2072,13 +2072,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHitter); if (target) { - parameters->AddTarget(target, 0, GA_NO_DEAD); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LastHitter(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastHitter(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2090,13 +2090,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastHitter); if (target) { - parameters->AddTarget(target, 0, GA_NO_DEAD); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LeaderOf(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LeaderOf(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2108,13 +2108,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastFollowed); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LastTalkedToBy(Scriptable *Sender, Targets *parameters) +Targets *GameScript::LastTalkedToBy(Scriptable *Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2126,13 +2126,13 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTalkedTo); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::LastSummonerOf(Scriptable* Sender, Targets *parameters) +Targets *GameScript::LastSummonerOf(Scriptable* Sender, Targets *parameters, int ga_flags) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); if (!actor) { @@ -2144,125 +2144,125 @@ if (actor) { Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastSummoner); if (target) { - parameters->AddTarget(target, 0, 0); + parameters->AddTarget(target, 0, ga_flags); } } return parameters; } -Targets *GameScript::Player1(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player1(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(1), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(1), 0, ga_flags); return parameters; } -Targets *GameScript::Player1Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player1Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(0,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(0,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player2(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player2(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(2), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(2), 0, ga_flags); return parameters; } -Targets *GameScript::Player2Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player2Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(1,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(1,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player3(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player3(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(3), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(3), 0, ga_flags); return parameters; } -Targets *GameScript::Player3Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player3Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(2,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(2,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player4(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player4(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(4), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(4), 0, ga_flags); return parameters; } -Targets *GameScript::Player4Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player4Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(3,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(3,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player5(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player5(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(5), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(5), 0, ga_flags); return parameters; } -Targets *GameScript::Player5Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player5Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(4,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(4,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player6(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player6(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(6), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(6), 0, ga_flags); return parameters; } -Targets *GameScript::Player6Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player6Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(5,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(5,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player7(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player7(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(7), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(7), 0, ga_flags); return parameters; } -Targets *GameScript::Player7Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player7Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(6,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(6,false), 0, ga_flags); return parameters; } -Targets *GameScript::Player8(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player8(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->FindPC(8), 0, 0); + parameters->AddTarget(core->GetGame()->FindPC(8), 0, ga_flags); return parameters; } -Targets *GameScript::Player8Fill(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Player8Fill(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { parameters->Clear(); - parameters->AddTarget(core->GetGame()->GetPC(7,false), 0, 0); + parameters->AddTarget(core->GetGame()->GetPC(7,false), 0, ga_flags); return parameters; } -Targets *GameScript::BestAC(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::BestAC(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2283,12 +2283,12 @@ } parameters->Clear(); - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); return parameters; } /*no idea why this object exists since the gender could be filtered easier*/ -Targets *GameScript::StrongestOfMale(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::StrongestOfMale(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2310,12 +2310,12 @@ } parameters->Clear(); if (scr) { - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); } return parameters; } -Targets *GameScript::StrongestOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::StrongestOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2335,11 +2335,11 @@ } } parameters->Clear(); - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); return parameters; } -Targets *GameScript::WeakestOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::WeakestOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2359,11 +2359,11 @@ } } parameters->Clear(); - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); return parameters; } -Targets *GameScript::WorstAC(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::WorstAC(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2383,11 +2383,11 @@ } } parameters->Clear(); - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); return parameters; } -Targets *GameScript::MostDamagedOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::MostDamagedOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2407,10 +2407,10 @@ } } parameters->Clear(); - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); return parameters; } -Targets *GameScript::LeastDamagedOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::LeastDamagedOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { targetlist::iterator m; const targettype *t = parameters->GetFirstTarget(m, ST_ACTOR); @@ -2430,182 +2430,182 @@ } } parameters->Clear(); - parameters->AddTarget(scr, 0, GA_NO_DEAD); + parameters->AddTarget(scr, 0, ga_flags); return parameters; } -Targets *GameScript::Farthest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Farthest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { const targettype *t = parameters->GetLastTarget(ST_ACTOR); parameters->Clear(); if (t) { - parameters->AddTarget(t->actor, 0, 0); + parameters->AddTarget(t->actor, 0, ga_flags); } return parameters; } -Targets *GameScript::FarthestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FarthestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, -1); + return XthNearestEnemyOf(parameters, -1, ga_flags); } -Targets *GameScript::NearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::NearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 0); + return XthNearestEnemyOf(parameters, 0, ga_flags); } -Targets *GameScript::SecondNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SecondNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 1); + return XthNearestEnemyOf(parameters, 1, ga_flags); } -Targets *GameScript::ThirdNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::ThirdNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 2); + return XthNearestEnemyOf(parameters, 2, ga_flags); } -Targets *GameScript::FourthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FourthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 3); + return XthNearestEnemyOf(parameters, 3, ga_flags); } -Targets *GameScript::FifthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FifthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 4); + return XthNearestEnemyOf(parameters, 4, ga_flags); } -Targets *GameScript::SixthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SixthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 5); + return XthNearestEnemyOf(parameters, 5, ga_flags); } -Targets *GameScript::SeventhNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SeventhNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 6); + return XthNearestEnemyOf(parameters, 6, ga_flags); } -Targets *GameScript::EighthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::EighthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 7); + return XthNearestEnemyOf(parameters, 7, ga_flags); } -Targets *GameScript::NinthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::NinthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 8); + return XthNearestEnemyOf(parameters, 8, ga_flags); } -Targets *GameScript::TenthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::TenthNearestEnemyOf(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestEnemyOf(parameters, 9); + return XthNearestEnemyOf(parameters, 9, ga_flags); } -Targets *GameScript::NearestEnemySummoned(Scriptable* Sender, Targets *parameters) +Targets *GameScript::NearestEnemySummoned(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 0); + return ClosestEnemySummoned(Sender, parameters, ga_flags); } -Targets *GameScript::NearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::NearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 0); + return XthNearestEnemyOfType(Sender, parameters, 0, ga_flags); } -Targets *GameScript::SecondNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::SecondNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 1); + return XthNearestEnemyOfType(Sender, parameters, 1, ga_flags); } -Targets *GameScript::ThirdNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::ThirdNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 2); + return XthNearestEnemyOfType(Sender, parameters, 2, ga_flags); } -Targets *GameScript::FourthNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::FourthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 3); + return XthNearestEnemyOfType(Sender, parameters, 3, ga_flags); } -Targets *GameScript::FifthNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::FifthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 4); + return XthNearestEnemyOfType(Sender, parameters, 4, ga_flags); } -Targets *GameScript::SixthNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::SixthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 5); + return XthNearestEnemyOfType(Sender, parameters, 5, ga_flags); } -Targets *GameScript::SeventhNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::SeventhNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 6); + return XthNearestEnemyOfType(Sender, parameters, 6, ga_flags); } -Targets *GameScript::EighthNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::EighthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 7); + return XthNearestEnemyOfType(Sender, parameters, 7, ga_flags); } -Targets *GameScript::NinthNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::NinthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 8); + return XthNearestEnemyOfType(Sender, parameters, 8, ga_flags); } -Targets *GameScript::TenthNearestEnemyOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::TenthNearestEnemyOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestEnemyOfType(Sender, parameters, 9); + return XthNearestEnemyOfType(Sender, parameters, 9, ga_flags); } -Targets *GameScript::NearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::NearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 0); + return XthNearestMyGroupOfType(Sender, parameters, 0, ga_flags); } -Targets *GameScript::SecondNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::SecondNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 1); + return XthNearestMyGroupOfType(Sender, parameters, 1, ga_flags); } -Targets *GameScript::ThirdNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::ThirdNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 2); + return XthNearestMyGroupOfType(Sender, parameters, 2, ga_flags); } -Targets *GameScript::FourthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::FourthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 3); + return XthNearestMyGroupOfType(Sender, parameters, 3, ga_flags); } -Targets *GameScript::FifthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::FifthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 4); + return XthNearestMyGroupOfType(Sender, parameters, 4, ga_flags); } -Targets *GameScript::SixthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::SixthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 5); + return XthNearestMyGroupOfType(Sender, parameters, 5, ga_flags); } -Targets *GameScript::SeventhNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::SeventhNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 6); + return XthNearestMyGroupOfType(Sender, parameters, 6, ga_flags); } -Targets *GameScript::EighthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::EighthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 7); + return XthNearestMyGroupOfType(Sender, parameters, 7, ga_flags); } -Targets *GameScript::NinthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::NinthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 8); + return XthNearestMyGroupOfType(Sender, parameters, 8, ga_flags); } -Targets *GameScript::TenthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters) +Targets *GameScript::TenthNearestMyGroupOfType(Scriptable* Sender, Targets *parameters, int ga_flags) { - return XthNearestMyGroupOfType(Sender, parameters, 9); + return XthNearestMyGroupOfType(Sender, parameters, 9, ga_flags); } /* returns only living PC's? if not, alter getpartysize/getpc flag*/ -Targets *GameScript::NearestPC(Scriptable* Sender, Targets *parameters) +Targets *GameScript::NearestPC(Scriptable* Sender, Targets *parameters, int ga_flags) { parameters->Clear(); Map *map = Sender->GetCurrentArea(); @@ -2630,62 +2630,62 @@ } } if (ac) { - parameters->AddTarget(ac, 0, 0); + parameters->AddTarget(ac, 0, ga_flags); } return parameters; } -Targets *GameScript::Nearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::Nearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 0); + return XthNearestOf(parameters, 0, ga_flags); } -Targets *GameScript::SecondNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SecondNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 1); + return XthNearestOf(parameters, 1, ga_flags); } -Targets *GameScript::ThirdNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::ThirdNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 2); + return XthNearestOf(parameters, 2, ga_flags); } -Targets *GameScript::FourthNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FourthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 3); + return XthNearestOf(parameters, 3, ga_flags); } -Targets *GameScript::FifthNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::FifthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 4); + return XthNearestOf(parameters, 4, ga_flags); } -Targets *GameScript::SixthNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SixthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 5); + return XthNearestOf(parameters, 5, ga_flags); } -Targets *GameScript::SeventhNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::SeventhNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 6); + return XthNearestOf(parameters, 6, ga_flags); } -Targets *GameScript::EighthNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::EighthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 7); + return XthNearestOf(parameters, 7, ga_flags); } -Targets *GameScript::NinthNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::NinthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 8); + return XthNearestOf(parameters, 8, ga_flags); } -Targets *GameScript::TenthNearest(Scriptable* /*Sender*/, Targets *parameters) +Targets *GameScript::TenthNearest(Scriptable* /*Sender*/, Targets *parameters, int ga_flags) { - return XthNearestOf(parameters, 9); + return XthNearestOf(parameters, 9, ga_flags); } -Targets *GameScript::SelectedCharacter(Scriptable* Sender, Targets* parameters) +Targets *GameScript::SelectedCharacter(Scriptable* Sender, Targets* parameters, int ga_flags) { Map *cm = Sender->GetCurrentArea(); parameters->Clear(); @@ -2696,13 +2696,13 @@ continue; } if (ac->IsSelected()) { - parameters->AddTarget(ac, Distance(Sender, ac), GA_NO_DEAD ); + parameters->AddTarget(ac, Distance(Sender, ac), ga_flags ); } } return parameters; } -Targets *GameScript::Nothing(Scriptable* /*Sender*/, Targets* parameters) +Targets *GameScript::Nothing(Scriptable* /*Sender*/, Targets* parameters, int /*ga_flags*/) { parameters->Clear(); return parameters; Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-10-15 18:20:20 UTC (rev 5450) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-10-15 18:24:12 UTC (rev 5451) @@ -534,7 +534,7 @@ typedef int (* TriggerFunction)(Scriptable*, Trigger*); typedef void (* ActionFunction)(Scriptable*, Action*); -typedef Targets* (* ObjectFunction)(Scriptable *, Targets*); +typedef Targets* (* ObjectFunction)(Scriptable *, Targets*, int ga_flags); typedef int (* IDSFunction)(Actor *, int parameter); #define TF_NONE 0 @@ -1410,100 +1410,100 @@ static void XEquipItem(Scriptable *Sender, Action *parameters); public: //Objects - static Targets *BestAC(Scriptable *Sender, Targets *parameters); - static Targets *EighthNearest(Scriptable *Sender, Targets *parameters); - static Targets *EighthNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *EighthNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *EighthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *EighthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *Farthest(Scriptable *Sender, Targets *parameters); - static Targets *FarthestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *FifthNearest(Scriptable *Sender, Targets *parameters); - static Targets *FifthNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *FifthNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *FifthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *FifthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *FourthNearest(Scriptable *Sender, Targets *parameters); - static Targets *FourthNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *FourthNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *FourthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *FourthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *Gabber(Scriptable *Sender, Targets *parameters); - static Targets *GroupOf(Scriptable *Sender, Targets *parameters); - static Targets *LastAttackerOf(Scriptable *Sender, Targets *parameters); - static Targets *LastCommandedBy(Scriptable *Sender, Targets *parameters); - static Targets *LastHeardBy(Scriptable *Sender, Targets *parameters); - static Targets *LastHelp(Scriptable *Sender, Targets *parameters); - static Targets *LastHitter(Scriptable *Sender, Targets *parameters); - static Targets *LastMarkedObject(Scriptable *Sender, Targets *parameters); - static Targets *LastSeenBy(Scriptable *Sender, Targets *parameters); - static Targets *LastSummonerOf(Scriptable *Sender, Targets *parameters); - static Targets *LastTalkedToBy(Scriptable *Sender, Targets *parameters); - static Targets *LastTargetedBy(Scriptable *Sender, Targets *parameters); - static Targets *LastTrigger(Scriptable *Sender, Targets *parameters); - static Targets *LeaderOf(Scriptable *Sender, Targets *parameters); - static Targets *LeastDamagedOf(Scriptable *Sender, Targets *parameters); - static Targets *MostDamagedOf(Scriptable *Sender, Targets *parameters); - static Targets *Myself(Scriptable *Sender, Targets *parameters); - static Targets *MyTarget(Scriptable *Sender, Targets *parameters); - static Targets *Nearest(Scriptable *Sender, Targets *parameters); - static Targets *NearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *NearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *NearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *NearestEnemySummoned(Scriptable *Sender, Targets *parameters); - static Targets *NearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *NearestPC(Scriptable *Sender, Targets *parameters); - static Targets *NinthNearest(Scriptable *Sender, Targets *parameters); - static Targets *NinthNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *NinthNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *NinthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *NinthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *Nothing(Scriptable *Sender, Targets *parameters); - static Targets *Player1(Scriptable *Sender, Targets *parameters); - static Targets *Player1Fill(Scriptable *Sender, Targets *parameters); - static Targets *Player2(Scriptable *Sender, Targets *parameters); - static Targets *Player2Fill(Scriptable *Sender, Targets *parameters); - static Targets *Player3(Scriptable *Sender, Targets *parameters); - static Targets *Player3Fill(Scriptable *Sender, Targets *parameters); - static Targets *Player4(Scriptable *Sender, Targets *parameters); - static Targets *Player4Fill(Scriptable *Sender, Targets *parameters); - static Targets *Player5(Scriptable *Sender, Targets *parameters); - static Targets *Player5Fill(Scriptable *Sender, Targets *parameters); - static Targets *Player6(Scriptable *Sender, Targets *parameters); - static Targets *Player6Fill(Scriptable *Sender, Targets *parameters); - static Targets *Protagonist(Scriptable *Sender, Targets *parameters); - static Targets *ProtectedBy(Scriptable *Sender, Targets *parameters); - static Targets *ProtectorOf(Scriptable *Sender, Targets *parameters); - static Targets *SecondNearest(Scriptable *Sender, Targets *parameters); - static Targets *SecondNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *SecondNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *SecondNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *SecondNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *SelectedCharacter(Scriptable *Sender, Targets *parameters); - static Targets *SeventhNearest(Scriptable *Sender, Targets *parameters); - static Targets *SeventhNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *SeventhNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *SeventhNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *SeventhNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *SixthNearest(Scriptable *Sender, Targets *parameters); - static Targets *SixthNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *SixthNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *SixthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *SixthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *StrongestOf(Scriptable *Sender, Targets *parameters); - static Targets *StrongestOfMale(Scriptable *Sender, Targets *parameters); - static Targets *TenthNearest(Scriptable *Sender, Targets *parameters); - static Targets *TenthNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *TenthNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *TenthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *TenthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *ThirdNearest(Scriptable *Sender, Targets *parameters); - static Targets *ThirdNearestDoor(Scriptable *Sender, Targets *parameters); - static Targets *ThirdNearestEnemyOf(Scriptable *Sender, Targets *parameters); - static Targets *ThirdNearestEnemyOfType(Scriptable *Sender, Targets *parameters); - static Targets *ThirdNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); - static Targets *WeakestOf(Scriptable *Sender, Targets *parameters); - static Targets *WorstAC(Scriptable *Sender, Targets *parameters); + static Targets *BestAC(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *EighthNearest(Scriptable *Sender, Targets *parameter, int ga_flagss); + static Targets *EighthNearestDoor(Scriptable *Sender, Targets *parameter, int ga_flagss); + static Targets *EighthNearestEnemyOf(Scriptable *Sender, Targets *parameter, int ga_flagss); + static Targets *EighthNearestEnemyOfType(Scriptable *Sender, Targets *parameter, int ga_flagss); + static Targets *EighthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Farthest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FarthestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FifthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FifthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FifthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FifthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FifthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FourthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FourthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FourthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FourthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *FourthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Gabber(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *GroupOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastAttackerOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastCommandedBy(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastHeardBy(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastHelp(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastHitter(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastMarkedObject(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastSeenBy(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastSummonerOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastTalkedToBy(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastTargetedBy(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LastTrigger(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LeaderOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *LeastDamagedOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *MostDamagedOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Myself(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *MyTarget(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Nearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NearestEnemySummoned(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NearestPC(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NinthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NinthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NinthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NinthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *NinthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Nothing(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player1(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player1Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player2(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player2Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player3(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player3Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player4(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player4Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player5(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player5Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player6(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player6Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Protagonist(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ProtectedBy(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ProtectorOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SecondNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SecondNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SecondNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SecondNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SecondNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SelectedCharacter(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SeventhNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SeventhNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SeventhNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SeventhNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SeventhNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SixthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SixthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SixthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SixthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *SixthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *StrongestOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *StrongestOfMale(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *TenthNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *TenthNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *TenthNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *TenthNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *TenthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ThirdNearest(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ThirdNearestDoor(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ThirdNearestEnemyOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ThirdNearestEnemyOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *ThirdNearestMyGroupOfType(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *WeakestOf(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *WorstAC(Scriptable *Sender, Targets *parameters, int ga_flags); public: /*GemRB extensions/actions*/ @@ -1512,10 +1512,10 @@ static void UnloadArea(Scriptable* Sender, Action* parameters); /*GemRB extensions/objects*/ - static Targets *Player7(Scriptable *Sender, Targets *parameters); - static Targets *Player7Fill(Scriptable *Sender, Targets *parameters); - static Targets *Player8(Scriptable *Sender, Targets *parameters); - static Targets *Player8Fill(Scriptable *Sender, Targets *parameters); + static Targets *Player7(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player7Fill(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player8(Scriptable *Sender, Targets *parameters, int ga_flags); + static Targets *Player8Fill(Scriptable *Sender, Targets *parameters, int ga_flags); }; Action* GenerateAction(char* String); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-26 21:01:56
|
Revision: 5472 http://gemrb.svn.sourceforge.net/gemrb/?rev=5472&view=rev Author: avenger_teambg Date: 2008-10-26 21:01:52 +0000 (Sun, 26 Oct 2008) Log Message: ----------- fixed typo in SetCreatureAreaFlag(s) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 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 2008-10-26 20:59:40 UTC (rev 5471) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-26 21:01:52 UTC (rev 5472) @@ -3253,7 +3253,7 @@ } /*iwd2 sets the high MC bits this way*/ -void GameScript::SetCreatureAreaFlags(Scriptable* Sender, Action* parameters) +void GameScript::SetCreatureAreaFlag(Scriptable* Sender, Action* parameters) { if (Sender->Type != ST_ACTOR) { return; Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-10-26 20:59:40 UTC (rev 5471) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-10-26 21:01:52 UTC (rev 5472) @@ -745,7 +745,7 @@ {"setbeeninpartyflags", GameScript::SetBeenInPartyFlags, 0}, {"setbestweapon", GameScript::SetBestWeapon, 0}, {"setcorpseenabled", GameScript::AmbientActivate, 0},//another weird name - {"setcreatureareaflags", GameScript::SetCreatureAreaFlags, 0}, + {"setcreatureareaflag", GameScript::SetCreatureAreaFlag, 0}, {"setcriticalpathobject", GameScript::SetCriticalPathObject, 0}, {"setdialog", GameScript::SetDialogue,0}, {"setdialogrange", GameScript::SetDialogueRange, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-10-26 20:59:40 UTC (rev 5471) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-10-26 21:01:52 UTC (rev 5472) @@ -1289,7 +1289,7 @@ static void SetArmourLevel(Scriptable* Sender, Action* parameters); static void SetBeenInPartyFlags(Scriptable* Sender, Action* parameters); static void SetBestWeapon(Scriptable *Sender, Action *parameters); - static void SetCreatureAreaFlags(Scriptable* Sender, Action* parameters); + static void SetCreatureAreaFlag(Scriptable* Sender, Action* parameters); static void SetCriticalPathObject(Scriptable* Sender, Action* parameters); static void SetDialogue(Scriptable* Sender, Action* parameters); static void SetDialogueRange(Scriptable* Sender, Action* parameters); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-29 22:15:56
|
Revision: 5477 http://gemrb.svn.sourceforge.net/gemrb/?rev=5477&view=rev Author: avenger_teambg Date: 2008-10-29 22:15:50 +0000 (Wed, 29 Oct 2008) Log Message: ----------- half implemented disarming of traps Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 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 2008-10-29 21:37:48 UTC (rev 5476) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-29 22:15:50 UTC (rev 5477) @@ -1981,6 +1981,87 @@ } } +void GameScript::RemoveTraps(Scriptable* Sender, Action* parameters) +{ + //only actors may try to pick a lock + if (Sender->Type != ST_ACTOR) { + Sender->ReleaseCurrentAction(); + return; + } + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); + if (!tar) { + Sender->ReleaseCurrentAction(); + return; + } + unsigned int distance; + Point *p, *otherp; + Door *door = NULL; + Container *container = NULL; + InfoPoint *trigger = NULL; + ScriptableType type = tar->Type; + ieDword flags; + + switch (type) { + case ST_DOOR: + door = ( Door* ) tar; + if (door->IsOpen()) { + //door is already open + Sender->ReleaseCurrentAction(); + return; + } + p = door->toOpen; + otherp = door->toOpen+1; + distance = FindNearPoint( Sender, p, otherp); + flags = door->Trapped && door->TrapDetected; + break; + case ST_CONTAINER: + container = (Container *) tar; + p = &container->Pos; + otherp = p; + distance = Distance(*p, Sender); + flags = container->Trapped && container->TrapDetected; + break; + case ST_PROXIMITY: + trigger = (InfoPoint *) tar; + distance = Distance(tar, Sender); + flags = trigger->Trapped && trigger->TrapDetected; + break; + default: + Sender->ReleaseCurrentAction(); + return; + } + Actor * actor = (Actor *) Sender; + actor->SetOrientation( GetOrient( *otherp, actor->Pos ), false); + if (distance <= MAX_OPERATING_DISTANCE) { + if (flags) { + switch(type) { + case ST_DOOR: +printf("RemoveTraps on door\n"); + door->TryDisarm(actor); + break; + case ST_CONTAINER: +printf("RemoveTraps on container\n"); + container->TryDisarm(actor); + break; + case ST_PROXIMITY: +printf("RemoveTraps on trap\n"); + trigger->TryDisarm(actor); + break; + default: + //not gonna happen! + assert(false); + } + } else { + //no trap here + //core->DisplayString(STR_NOT_TRAPPED); + } + } else { + GoNearAndRetry(Sender, *p, MAX_OPERATING_DISTANCE); + } + Sender->SetWait(1); + Sender->ReleaseCurrentAction(); +} + void GameScript::PickLock(Scriptable* Sender, Action* parameters) { //only actors may try to pick a lock Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2008-10-29 21:37:48 UTC (rev 5476) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2008-10-29 22:15:50 UTC (rev 5477) @@ -1430,6 +1430,16 @@ } } +void Door::TryDisarm(Actor *actor) +{ +//first lets do this automatically succeeding +//TODO: skill check, set off + Trapped = 0; + TrapDetected = 0; + LastDisarmed = actor->GetID(); + ImmediateEvent(); +} + void Door::TryPickLock(Actor *actor) { if (Trapped) { @@ -1523,6 +1533,16 @@ return CT_ACTIVE; } +void InfoPoint::TryDisarm(Actor *actor) +{ +//first lets do this automatically succeeding +//TODO: skill check, set off + Trapped = 0; + TrapDetected = 0; + LastDisarmed = actor->GetID(); + ImmediateEvent(); +} + //detect this trap, using a skill, skill could be set to 256 for 'sure' //skill is the all around modified trap detection skill //a trapdetectiondifficulty of 100 means impossible detection short of a spell @@ -1626,7 +1646,7 @@ break; } printf( "TrapDetected: %d, Trapped: %s\n", TrapDetected, YESNO(Trapped)); - printf( "Trap detection: %d, Trap removal: %d\n", TrapDetectionDiff, + printf( "Trap detection: %d%%, Trap removal: %d%%\n", TrapDetectionDiff, TrapRemovalDiff ); const char *name = "NONE"; if (Scripts[0]) { @@ -1818,6 +1838,16 @@ return true; } +void Container::TryDisarm(Actor *actor) +{ +//first lets do this automatically succeeding +//TODO: skill check, set off + Trapped = 0; + TrapDetected = 0; + LastDisarmed = actor->GetID(); + ImmediateEvent(); +} + void Container::TryPickLock(Actor *actor) { if (Trapped) { @@ -1851,8 +1881,8 @@ { printf( "Debugdump of Container %s\n", GetScriptName() ); printf( "Type: %d, LockDifficulty: %d\n", Type, LockDifficulty ); - printf( "Flags: %d, Trapped: %d\n", Flags, Trapped ); - printf( "Trap detection: %d, Trap removal: %d\n", TrapDetectionDiff, + printf( "Flags: %d, Trapped: %s, Detected: %d\n", Flags, YESNO(Trapped), TrapDetected ); + printf( "Trap detection: %d%%, Trap removal: %d%%\n", TrapDetectionDiff, TrapRemovalDiff ); const char *name = "NONE"; if (Scripts[0]) { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2008-10-29 21:37:48 UTC (rev 5476) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2008-10-29 22:15:50 UTC (rev 5477) @@ -458,6 +458,7 @@ void SetDoorOpen(bool Open, bool playsound, ieDword ID); void SetPolygon(bool Open, Gem_Polygon* poly); bool IsOpen() const; + void TryDisarm(Actor *actor); void TryPickLock(Actor *actor); void DebugDump(); }; @@ -478,6 +479,7 @@ //returns dithering option int WantDither(); bool IsOpen() const; + void TryDisarm(Actor *actor); void TryPickLock(Actor *actor); void DebugDump(); private: @@ -506,6 +508,7 @@ public: InfoPoint(void); ~InfoPoint(void); + void TryDisarm(Actor *actor); //detect trap, set skill to 256 if you want sure fire void DetectTrap(int skill); //returns true if trap is visible, only_detected must be true Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-10-29 21:37:48 UTC (rev 5476) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-10-29 22:15:50 UTC (rev 5477) @@ -911,6 +911,10 @@ int GameControl::GetCursorOverDoor(Door *overDoor) { overDoor->Highlight = true; + if (overDoor->TrapDetected && overDoor->Trapped) { + overDoor->outlineColor = red; + return IE_CURSOR_TRAP; + } overDoor->outlineColor = cyan; if (overDoor->Flags & DOOR_LOCKED) { return IE_CURSOR_LOCK; @@ -1100,7 +1104,11 @@ source->ClearPath(); source->ClearActions(); - snprintf(Tmp, sizeof(Tmp), "PickLock(\"%s\")", tgt->GetScriptName() ); + if (tgt->TrapDetected) { + snprintf(Tmp, sizeof(Tmp), "RemoveTraps(\"%s\")", tgt->GetScriptName() ); + } else { + snprintf(Tmp, sizeof(Tmp), "PickLock(\"%s\")", tgt->GetScriptName() ); + } source->AddAction( GenerateAction( Tmp ) ); } @@ -1110,7 +1118,11 @@ source->ClearPath(); source->ClearActions(); - snprintf(Tmp, sizeof(Tmp), "PickLock(\"%s\")", tgt->GetScriptName() ); + if (tgt->TrapDetected) { + snprintf(Tmp, sizeof(Tmp), "RemoveTraps(\"%s\")", tgt->GetScriptName() ); + } else { + snprintf(Tmp, sizeof(Tmp), "PickLock(\"%s\")", tgt->GetScriptName() ); + } source->AddAction( GenerateAction( Tmp ) ); } @@ -1246,7 +1258,7 @@ return; } - if (target_mode&TARGET_MODE_PICK) { + if ((target_mode&TARGET_MODE_PICK) || container->TrapDetected) { TryToPick(actor, container); return; } @@ -1273,7 +1285,7 @@ return; } - if (target_mode&TARGET_MODE_PICK) { + if ( (target_mode&TARGET_MODE_PICK) || door->TrapDetected) { TryToPick(actor, door); return; } Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-10-29 21:37:48 UTC (rev 5476) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-10-29 22:15:50 UTC (rev 5477) @@ -708,6 +708,7 @@ {"removepaladinhood", GameScript::RemovePaladinHood, 0}, {"removerangerhood", GameScript::RemoveRangerHood, 0}, {"removespell", GameScript::RemoveSpell, 0}, + {"removetraps", GameScript::RemoveTraps, AF_BLOCKING}, {"reputationinc", GameScript::ReputationInc, 0}, {"reputationset", GameScript::ReputationSet, 0}, {"resetfogofwar", GameScript::UndoExplore, 0}, //pst Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-10-29 21:37:48 UTC (rev 5476) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-10-29 22:15:50 UTC (rev 5477) @@ -1257,6 +1257,7 @@ static void RemovePaladinHood(Scriptable* Sender, Action* parameters); static void RemoveRangerHood(Scriptable* Sender, Action* parameters); static void RemoveSpell(Scriptable* Sender, Action* parameters); + static void RemoveTraps(Scriptable* Sender, Action* parameters); static void ReputationInc(Scriptable* Sender, Action* parameters); static void ReputationSet(Scriptable* Sender, Action* parameters); static void RestorePartyLocation(Scriptable *Sender, Action* parameters); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-25 20:55:11
|
Revision: 5536 http://gemrb.svn.sourceforge.net/gemrb/?rev=5536&view=rev Author: wjpalenstijn Date: 2009-01-25 20:55:07 +0000 (Sun, 25 Jan 2009) Log Message: ----------- cleanup Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Control.cpp gemrb/trunk/gemrb/plugins/Core/Window.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Control.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Control.cpp 2009-01-25 20:43:23 UTC (rev 5535) +++ gemrb/trunk/gemrb/plugins/Core/Control.cpp 2009-01-25 20:55:07 UTC (rev 5536) @@ -55,13 +55,9 @@ printMessage("Control","Destroying control inside event handler, crash may occur!\n", LIGHT_RED); } core->DisplayTooltip( 0, 0, NULL ); - if (Tooltip) { - free (Tooltip); - } + free (Tooltip); - if (animation) { - delete animation; - } + delete animation; core->GetVideoDriver()->FreeSprite(AnimPicture); } @@ -69,8 +65,7 @@ /** Sets the Tooltip text of the current control */ int Control::SetTooltip(const char* string) { - if (Tooltip) - free(Tooltip); + free(Tooltip); if ((string == NULL) || (string[0] == 0)) { Tooltip = NULL; Modified: gemrb/trunk/gemrb/plugins/Core/Window.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Window.cpp 2009-01-25 20:43:23 UTC (rev 5535) +++ gemrb/trunk/gemrb/plugins/Core/Window.cpp 2009-01-25 20:55:07 UTC (rev 5536) @@ -53,13 +53,11 @@ std::vector< Control*>::iterator m = Controls.begin(); while (Controls.size() != 0) { Control* ctrl = ( *m ); - delete( ctrl ); + delete ctrl; Controls.erase( m ); m = Controls.begin(); } - if (BackGround) { - core->GetVideoDriver()->FreeSprite( BackGround ); - } + core->GetVideoDriver()->FreeSprite( BackGround ); BackGround = NULL; } /** Add a Control in the Window */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 18:17:56
|
Revision: 5548 http://gemrb.svn.sourceforge.net/gemrb/?rev=5548&view=rev Author: wjpalenstijn Date: 2009-01-27 18:17:54 +0000 (Tue, 27 Jan 2009) Log Message: ----------- new AutoTable utility class for easier temporary access to 2DA tables Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp gemrb/trunk/gemrb/plugins/Core/TableMgr.h Modified: gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp 2009-01-27 15:30:11 UTC (rev 5547) +++ gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp 2009-01-27 18:17:54 UTC (rev 5548) @@ -20,6 +20,8 @@ */ #include "TableMgr.h" +#include "GameData.h" +#include "Interface.h" TableMgr::TableMgr() { @@ -27,3 +29,42 @@ TableMgr::~TableMgr() { } + + +AutoTable::AutoTable() +{ + table = 0; +} + +AutoTable::AutoTable(const char* ResRef) +{ + table = 0; + load(ResRef); +} + +bool AutoTable::load(const char* ResRef) +{ + release(); + + int ref = gamedata->LoadTable(ResRef); + if (ref == -1) + return false; + + tableref = (unsigned int)ref; + table = gamedata->GetTable(tableref); + return true; +} + +AutoTable::~AutoTable() +{ + release(); +} + +void AutoTable::release() +{ + if (table) { + gamedata->DelTable(tableref); + table = 0; + } +} + Modified: gemrb/trunk/gemrb/plugins/Core/TableMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 15:30:11 UTC (rev 5547) +++ gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 18:17:54 UTC (rev 5548) @@ -69,12 +69,37 @@ virtual int GetColumnIndex(const char* colname) const = 0; virtual int GetRowIndex(const char* rowname) const = 0; virtual const char* GetColumnName(unsigned int index) const = 0; + /** Returns a Row Name, returns NULL on error */ virtual const char* GetRowName(unsigned int index) const = 0; virtual unsigned int FindTableValue(unsigned int column, long value, int start = 0) const = 0; /** Opens a Table File */ virtual bool Open(DataStream* stream, bool autoFree = true) = 0; - /** Returns a Row Name, returns NULL on error */ }; +/** + * Utility class to automatically handle loading a table, + * and obtain and free a reference to it. + */ +class AutoTable +{ +public: + AutoTable(); + AutoTable(const char* ResRef); + ~AutoTable(); + + bool load(const char* ResRef); + void release(); + bool ok() const { return table != 0; } + + const TableMgr& operator*() const { return *table; } + const TableMgr* operator->() const { return table; } + const TableMgr* ptr() const { return table; } + +private: + TableMgr* table; + unsigned int tableref; +}; + + #endif // ! TABLEMGR_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 19:13:05
|
Revision: 5550 http://gemrb.svn.sourceforge.net/gemrb/?rev=5550&view=rev Author: wjpalenstijn Date: 2009-01-27 19:12:56 +0000 (Tue, 27 Jan 2009) Log Message: ----------- copy constructor Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp gemrb/trunk/gemrb/plugins/Core/TableMgr.h Modified: gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp 2009-01-27 18:20:59 UTC (rev 5549) +++ gemrb/trunk/gemrb/plugins/Core/TableMgr.cpp 2009-01-27 19:12:56 UTC (rev 5550) @@ -42,6 +42,22 @@ load(ResRef); } +AutoTable::AutoTable(const AutoTable& other) +{ + *this = other; +} + +AutoTable& AutoTable::operator=(const AutoTable& other) +{ + if (other.table) { + tableref = other.tableref; + table = gamedata->GetTable(tableref); + } else { + table = 0; + } + return *this; +} + bool AutoTable::load(const char* ResRef) { release(); Modified: gemrb/trunk/gemrb/plugins/Core/TableMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 18:20:59 UTC (rev 5549) +++ gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 19:12:56 UTC (rev 5550) @@ -87,6 +87,8 @@ AutoTable(); AutoTable(const char* ResRef); ~AutoTable(); + AutoTable(const AutoTable &); + AutoTable& operator=(const AutoTable&); bool load(const char* ResRef); void release(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 19:14:12
|
Revision: 5551 http://gemrb.svn.sourceforge.net/gemrb/?rev=5551&view=rev Author: wjpalenstijn Date: 2009-01-27 19:14:09 +0000 (Tue, 27 Jan 2009) Log Message: ----------- simplify GetCreature calls Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GameData.cpp gemrb/trunk/gemrb/plugins/Core/GameData.h gemrb/trunk/gemrb/plugins/Core/IniSpawn.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Map.cpp Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-01-27 19:12:56 UTC (rev 5550) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-01-27 19:14:09 UTC (rev 5551) @@ -653,16 +653,15 @@ void CreateCreatureCore(Scriptable* Sender, Action* parameters, int flags) { - DataStream* ds; Scriptable *tmp = GetActorFromObject( Sender, parameters->objects[1] ); + Actor* ab; if (flags & CC_STRING1) { - ds = core->GetResourceMgr()->GetResource( parameters->string1Parameter, IE_CRE_CLASS_ID ); + ab = gamedata->GetCreature(parameters->string1Parameter); } else { - ds = core->GetResourceMgr()->GetResource( parameters->string0Parameter, IE_CRE_CLASS_ID ); + ab = gamedata->GetCreature(parameters->string0Parameter); } - Actor *ab = gamedata->GetCreature(ds); //iwd2 allows an optional scriptname to be set //but bg2 doesn't have this feature @@ -759,8 +758,7 @@ //this destroys the current actor and replaces it with another void ChangeAnimationCore(Actor *src, const char *resref, bool effect) { - DataStream* ds = core->GetResourceMgr()->GetResource( resref, IE_CRE_CLASS_ID ); - Actor *tar = gamedata->GetCreature(ds); + Actor *tar = gamedata->GetCreature(resref); if (tar) { Map *map = src->GetCurrentArea(); map->AddActor( tar ); Modified: gemrb/trunk/gemrb/plugins/Core/GameData.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-01-27 19:12:56 UTC (rev 5550) +++ gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-01-27 19:14:09 UTC (rev 5551) @@ -90,22 +90,27 @@ PaletteCache.RemoveAll(ReleasePalette); } -Actor *GameData::GetCreature(DataStream *stream, unsigned char InParty) +Actor *GameData::GetCreature(const char* ResRef, unsigned int PartySlot) { + DataStream* ds = core->GetResourceMgr()->GetResource( ResRef, IE_CRE_CLASS_ID ); + if (!ds) + return 0; + ActorMgr* actormgr = ( ActorMgr* ) core->GetInterface( IE_CRE_CLASS_ID ); - if (!actormgr->Open( stream, true )) { + if (!actormgr->Open( ds, true )) { core->FreeInterface( actormgr ); - return NULL; + return 0; } - Actor* actor = actormgr->GetActor(InParty); + Actor* actor = actormgr->GetActor(PartySlot); core->FreeInterface( actormgr ); return actor; } -int GameData::LoadCreature(const char* ResRef, int InParty, bool character) +int GameData::LoadCreature(const char* ResRef, unsigned int PartySlot, bool character) { DataStream *stream; + Actor* actor; if (character) { char nPath[_MAX_PATH], fName[16]; snprintf( fName, sizeof(fName), "%s.chr", ResRef); @@ -114,15 +119,21 @@ FileStream *fs = new FileStream(); fs -> Open( nPath, true ); stream = (DataStream *) fs; + ActorMgr* actormgr = ( ActorMgr* ) core->GetInterface( IE_CRE_CLASS_ID ); + if (!actormgr->Open( stream, true )) { + core->FreeInterface( actormgr ); + return -1; + } + actor = actormgr->GetActor(PartySlot); + core->FreeInterface( actormgr ); + } else { + actor = GetCreature(ResRef, PartySlot); } - else { - stream = core->GetResourceMgr()->GetResource( ResRef, IE_CRE_CLASS_ID ); - } - Actor* actor = GetCreature(stream, InParty); + if ( !actor ) { return -1; } - //actor->InParty = (ieByte) InParty; + //both fields are of length 9, make this sure! memcpy(actor->Area, core->GetGame()->CurrentArea, sizeof(actor->Area) ); if (actor->BaseStats[IE_STATE_ID] & STATE_DEAD) { @@ -132,7 +143,7 @@ } actor->SetOrientation( 0, false ); - if ( InParty ) { + if ( PartySlot != 0 ) { return core->GetGame()->JoinParty( actor, JP_JOIN|JP_INITPOS ); } else { @@ -201,6 +212,7 @@ } return tables[index].tm; } + /** Frees a Loaded Table, returns false on error, true on success */ bool GameData::DelTable(unsigned int index) { Modified: gemrb/trunk/gemrb/plugins/Core/GameData.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-27 19:12:56 UTC (rev 5550) +++ gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-27 19:14:09 UTC (rev 5551) @@ -52,15 +52,15 @@ Factory* GetFactory() const { return factory; } - // TODO: don't require manually opening a DataStream for this /** Returns actor */ - Actor *GetCreature(DataStream *stream, unsigned char InParty=0); + Actor *GetCreature(const char *ResRef, unsigned int PartySlot=0); /** Returns a PC index, by loading a creature */ - int LoadCreature(const char *ResRef, int InParty, bool character=false); + int LoadCreature(const char *ResRef, unsigned int PartySlot, bool character=false); - // TODO: make it more convenient to look up a value from a table - // There should be no need for a full Load, Get, Del sequence + // 2DA table functions. + // (See also the AutoTable class) + /** Loads a 2DA Table, returns -1 on error or the Table Index on success */ int LoadTable(const char * ResRef); /** Gets the index of a loaded table, returns -1 on error */ Modified: gemrb/trunk/gemrb/plugins/Core/IniSpawn.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/IniSpawn.cpp 2009-01-27 19:12:56 UTC (rev 5550) +++ gemrb/trunk/gemrb/plugins/Core/IniSpawn.cpp 2009-01-27 19:14:09 UTC (rev 5551) @@ -620,11 +620,7 @@ } int x = core->Roll(1,critter.creaturecount,-1); - DataStream *stream = core->GetResourceMgr()->GetResource( critter.CreFile[x], IE_CRE_CLASS_ID ); - if (!stream) { - return; - } - Actor* cre = gamedata->GetCreature(stream); + Actor* cre = gamedata->GetCreature(critter.CreFile[x]); if (!cre) { return; } Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-27 19:12:56 UTC (rev 5550) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-27 19:14:09 UTC (rev 5551) @@ -2398,8 +2398,7 @@ Actor * ab = NULL; while(cnt-- && level>0) { - DataStream* ds = key->GetResource( resource, IE_CRE_CLASS_ID ); - ab = gamedata->GetCreature(ds); + ab = gamedata->GetCreature(resource); if (!ab) { return NULL; } Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-01-27 19:12:56 UTC (rev 5550) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-01-27 19:14:09 UTC (rev 5551) @@ -2286,8 +2286,7 @@ Actor *creature; void* lookup; if ( !Spawns.Lookup( CreName, lookup) ) { - DataStream *stream = core->GetResourceMgr()->GetResource( CreName, IE_CRE_CLASS_ID ); - creature = gamedata->GetCreature(stream); + creature = gamedata->GetCreature(CreName); if ( creature ) { AddActor(creature); creature->SetPosition( pos, true, radius ); @@ -2300,8 +2299,7 @@ unsigned int count = sg->Count; //unsigned int difficulty = sg->Level; while ( count-- ) { - DataStream *stream = core->GetResourceMgr()->GetResource( sg->ResRefs[count], IE_CRE_CLASS_ID ); - creature = gamedata->GetCreature(stream); + creature = gamedata->GetCreature(sg->ResRefs[count]); if ( creature ) { AddActor(creature); creature->SetPosition( pos, true, radius ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 20:37:53
|
Revision: 5553 http://gemrb.svn.sourceforge.net/gemrb/?rev=5553&view=rev Author: wjpalenstijn Date: 2009-01-27 20:37:48 +0000 (Tue, 27 Jan 2009) Log Message: ----------- GEM_EXPORT Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GameData.h gemrb/trunk/gemrb/plugins/Core/TableMgr.h Modified: gemrb/trunk/gemrb/plugins/Core/GameData.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-27 19:41:33 UTC (rev 5552) +++ gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-27 20:37:48 UTC (rev 5553) @@ -42,7 +42,19 @@ bool free; }; -class GameData +#ifdef WIN32 + +#ifdef GEM_BUILD_DLL +#define GEM_EXPORT __declspec(dllexport) +#else +#define GEM_EXPORT __declspec(dllimport) +#endif + +#else +#define GEM_EXPORT +#endif + +class GEM_EXPORT GameData { public: GameData(); Modified: gemrb/trunk/gemrb/plugins/Core/TableMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 19:41:33 UTC (rev 5552) +++ gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 20:37:48 UTC (rev 5553) @@ -81,7 +81,7 @@ * Utility class to automatically handle loading a table, * and obtain and free a reference to it. */ -class AutoTable +class GEM_EXPORT AutoTable { public: AutoTable(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 23:04:59
|
Revision: 5556 http://gemrb.svn.sourceforge.net/gemrb/?rev=5556&view=rev Author: wjpalenstijn Date: 2009-01-27 22:13:26 +0000 (Tue, 27 Jan 2009) Log Message: ----------- replaced more Load/Get/DelTable calls Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-01-27 22:11:22 UTC (rev 5555) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-01-27 22:13:26 UTC (rev 5556) @@ -1484,9 +1484,8 @@ /*switchplaylist could implement fade */ void GameScript::StartSong(Scriptable* /*Sender*/, Action* parameters) { - int MusicTable = gamedata->LoadTable( "music" ); - if (MusicTable >= 0) { - TableMgr* music = gamedata->GetTable( MusicTable ); + AutoTable music("music"); + if (music) { const char* string = music->QueryField( parameters->int0Parameter, 0 ); if (string[0] == '*') { core->GetMusicMgr()->HardEnd(); @@ -2689,22 +2688,22 @@ void GameScript::AddXP2DA(Scriptable* /*Sender*/, Action* parameters) { - int xptable; + AutoTable xptable; if (core->HasFeature(GF_HAS_EXPTABLE) ) { - xptable = gamedata->LoadTable("exptable"); + xptable.load("exptable"); } else { - xptable = gamedata->LoadTable( "xplist" ); + xptable.load("xplist"); } if (parameters->int0Parameter>0) { core->DisplayString(parameters->int0Parameter, 0x40f0f000,IE_STR_SOUND); } - if (xptable<0) { + if (!xptable) { printMessage("GameScript","Can't perform ADDXP2DA",LIGHT_RED); return; } - const char * xpvalue = gamedata->GetTable( xptable )->QueryField( parameters->string0Parameter, "0" ); //level is unused + const char * xpvalue = xptable->QueryField( parameters->string0Parameter, "0" ); //level is unused if ( xpvalue[0]=='P' && xpvalue[1]=='_') { //divide party xp @@ -2713,7 +2712,6 @@ //give xp everyone core->GetGame()->ShareXP(atoi(xpvalue), 0 ); } - gamedata->DelTable( xptable ); } void GameScript::AddExperienceParty(Scriptable* /*Sender*/, Action* parameters) @@ -2804,17 +2802,15 @@ act->SetScript( "", AI_SCRIPT_LEVEL, true ); act->SetScript( "DPLAYER2", SCR_DEFAULT, false ); } - int pdtable = gamedata->LoadTable( "pdialog" ); - if ( pdtable >= 0 ) { + AutoTable pdtable("pdialog"); + if (pdtable) { const char* scriptname = act->GetScriptName(); ieResRef resref; - TableMgr *tab=gamedata->GetTable( pdtable ); //set dialog only if we got a row - if (tab->GetRowIndex( scriptname ) != -1) { - strnlwrcpy(resref, tab->QueryField( scriptname, "JOIN_DIALOG_FILE"),8); + if (pdtable->GetRowIndex( scriptname ) != -1) { + strnlwrcpy(resref, pdtable->QueryField( scriptname, "JOIN_DIALOG_FILE"),8); act->SetDialog( resref ); } - gamedata->DelTable( pdtable ); } core->GetGame()->JoinParty( act, JP_JOIN ); core->GetGUIScriptEngine()->RunFunction( "UpdatePortraitWindow" ); @@ -3288,12 +3284,10 @@ if (Sender->Type != ST_ACTOR) { return; } - int pdtable = gamedata->LoadTable( "pdialog" ); + AutoTable pdtable("pdialog"); Actor* act = ( Actor* ) Sender; const char* scriptingname = act->GetScriptName(); - act->SetDialog( gamedata->GetTable( pdtable )->QueryField( scriptingname, - "POST_DIALOG_FILE" ) ); - gamedata->DelTable( pdtable ); + act->SetDialog( pdtable->QueryField( scriptingname, "POST_DIALOG_FILE" ) ); } void GameScript::TextScreen(Scriptable* /*Sender*/, Action* parameters) @@ -4081,66 +4075,55 @@ if (!tar || tar->Type!=ST_ACTOR) { return; } - int table = gamedata->LoadTable(parameters->string0Parameter); - if (table<0) { + AutoTable tab(parameters->string0Parameter); + if (!tab) { return; } - TableMgr *tab=gamedata->GetTable( table ); - if (tab) { - int rows = tab->GetRowCount(); - for (int i=0;i<rows;i++) { - MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); - } + + int rows = tab->GetRowCount(); + for (int i=0;i<rows;i++) { + MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); } - gamedata->DelTable(table); } void GameScript::TakeItemListParty(Scriptable * Sender, Action* parameters) { - int table = gamedata->LoadTable(parameters->string0Parameter); - if (table<0) { + AutoTable tab(parameters->string0Parameter); + if (!tab) { return; } Game *game = core->GetGame(); - TableMgr *tab=gamedata->GetTable( table ); - if (tab) { - int rows = tab->GetRowCount(); - for (int i=0;i<rows;i++) { - int j = game->GetPartySize(false); - while (j--) { - Actor *tar = game->GetPC(j, false); - MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); - } + int rows = tab->GetRowCount(); + for (int i=0;i<rows;i++) { + int j = game->GetPartySize(false); + while (j--) { + Actor *tar = game->GetPC(j, false); + MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); } } - gamedata->DelTable(table); } void GameScript::TakeItemListPartyNum(Scriptable * Sender, Action* parameters) { - int table = gamedata->LoadTable(parameters->string0Parameter); - if (table<0) { + AutoTable tab(parameters->string0Parameter); + if (!tab) { return; } Game *game = core->GetGame(); - TableMgr *tab=gamedata->GetTable( table ); - if (tab) { - int rows = tab->GetRowCount(); - for (int i=0;i<rows;i++) { - int count = parameters->int0Parameter; - int j = game->GetPartySize(false); - while (j--) { - Actor *tar = game->GetPC(j, false); - int res=MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); - if (res==MIC_GOTITEM) { - j++; - count--; - } - if (!count) break; + int rows = tab->GetRowCount(); + for (int i=0;i<rows;i++) { + int count = parameters->int0Parameter; + int j = game->GetPartySize(false); + while (j--) { + Actor *tar = game->GetPC(j, false); + int res=MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); + if (res==MIC_GOTITEM) { + j++; + count--; } + if (!count) break; } } - gamedata->DelTable(table); } //bg2 @@ -5078,9 +5061,8 @@ char FolderName[_MAX_PATH]; const char *folder = ""; - int SlotTable = gamedata->LoadTable( "savegame" ); - if (SlotTable >= 0) { - TableMgr* tab = gamedata->GetTable( SlotTable ); + AutoTable tab("savegame"); + if (tab) { type = atoi(tab->QueryField((unsigned int) -1)); if (type) { char * str = core->GetString( parameters->int0Parameter, IE_STR_STRREFOFF); @@ -5092,9 +5074,6 @@ } } core->GetSaveGameIterator()->CreateSaveGame(parameters->int0Parameter, folder); - if (SlotTable >= 0) { - gamedata->DelTable(SlotTable); - } } /*EscapeAreaMove(S:Area*,I:X*,I:Y*,I:Face*)*/ @@ -5896,15 +5875,13 @@ void GameScript::GeneratePartyMember(Scriptable* /*Sender*/, Action* parameters) { - int PCTable = gamedata->LoadTable( "bios" ); - if (PCTable<0) { + AutoTable pcs("bios"); + if (!pcs) { return; } - TableMgr* pcs = gamedata->GetTable( PCTable ); const char* string = pcs->QueryField( parameters->int0Parameter, 0 ); printf ("GeneratePartyMember: %s\n", string); int pos = gamedata->LoadCreature(string,0,false); - gamedata->DelTable( PCTable ); if (pos<0) { return; } Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-01-27 22:11:22 UTC (rev 5555) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-01-27 22:13:26 UTC (rev 5556) @@ -487,8 +487,7 @@ void ApplyClab(Actor *actor, const char *clab, int level) { - int tidx = gamedata->LoadTable(clab); - TableMgr *table = gamedata->GetTable(tidx); + AutoTable table(clab); if (table) { int row = table->GetRowCount(); for(int i=0;i<level;i++) { @@ -514,7 +513,6 @@ } } } - gamedata->DelTable(tidx); } } @@ -527,8 +525,7 @@ { //get current unmodified level (i guess) int level = GetXPLevel(false); - int tidx = gamedata->LoadTable("kitlist"); - TableMgr *table = gamedata->GetTable(tidx); + AutoTable table("kitlist"); if (table) { ieDword row; //find row by unusability @@ -1008,13 +1005,10 @@ DeathOnZeroStat=(bool) core->HasFeature(GF_DEATH_ON_ZERO_STAT); //this table lists various level based xp bonuses - int table = gamedata->LoadTable( "xpbonus" ); - TableMgr *tm = gamedata->GetTable( table ); - + AutoTable tm("xpbonus"); if (tm) { xpbonustypes = tm->GetRowCount(); if (xpbonustypes == 0) { - gamedata->DelTable( table ); xpbonuslevels = 0; } else { xpbonuslevels = tm->GetColumnCount(0); @@ -1031,8 +1025,7 @@ } //this table lists skill groups assigned to classes //it is theoretically possible to create hybrid classes - table = gamedata->LoadTable( "clskills" ); - tm = gamedata->GetTable( table ); + tm.load("clskills"); if (tm) { classcount = tm->GetRowCount(); memset (isclass,0,sizeof(isclass)); @@ -1086,7 +1079,6 @@ } bitmask <<=1; } - gamedata->DelTable( table ); } else { classcount = 0; //well } @@ -1107,8 +1099,7 @@ } //initializing the vvc resource references - table = gamedata->LoadTable( "damage" ); - tm = gamedata->GetTable( table ); + tm.load("damage"); if (tm) { for (i=0;i<DAMAGE_LEVELS;i++) { const char *tmp = tm->QueryField( i, COL_MAIN ); @@ -1124,11 +1115,9 @@ tmp = tm->QueryField( i, COL_GRADIENT ); d_gradient[i]=atoi(tmp); } - gamedata->DelTable( table ); } - table = gamedata->LoadTable( "overlay" ); - tm = gamedata->GetTable( table ); + tm.load("overlay"); if (tm) { ieDword mask = 1; for (i=0;i<OVERLAY_COUNT;i++) { @@ -1139,14 +1128,12 @@ } mask<<=1; } - gamedata->DelTable( table ); } //csound for bg1/bg2 memset(csound,0,sizeof(csound)); if (!core->HasFeature(GF_SOUNDFOLDERS)) { - table = gamedata->LoadTable( "csound" ); - tm = gamedata->GetTable( table ); + tm.load("csound"); if (tm) { for(i=0;i<VCONST_COUNT;i++) { const char *tmp = tm->QueryField( i, 0 ); @@ -1154,12 +1141,10 @@ csound[i]=tmp[0]; } } - gamedata->DelTable( table ); } } - table = gamedata->LoadTable( "qslots" ); - tm = gamedata->GetTable( table ); + tm.load("qslots"); GUIBTDefaults = (ActionButtonRow *) calloc( classcount,sizeof(ActionButtonRow) ); for (i = 0; i < classcount; i++) { @@ -1170,12 +1155,8 @@ } } } - if (tm) { - gamedata->DelTable( table ); - } - table = gamedata->LoadTable( "itemuse" ); - tm = gamedata->GetTable( table ); + tm.load("itemuse"); if (tm) { usecount = tm->GetRowCount(); itemuse = new ItemUseType[usecount]; @@ -1190,11 +1171,9 @@ itemuse[i].which=0; } } - gamedata->DelTable( table ); } - table = gamedata->LoadTable( "itemanim" ); - tm = gamedata->GetTable( table ); + tm.load("itemanim"); if (tm) { animcount = tm->GetRowCount(); itemanim = new ItemAnimType[animcount]; @@ -1202,12 +1181,9 @@ strnlwrcpy(itemanim[i].itemname, tm->QueryField(i,0),8 ); itemanim[i].animation = (ieByte) atoi( tm->QueryField(i,1) ); } - gamedata->DelTable( table ); } - - table = gamedata->LoadTable( "mxsplwis" ); - tm = gamedata->GetTable( table ); + tm.load("mxsplwis"); if (tm) { spllevels = tm->GetColumnCount(0); int max = core->GetMaximumAbility(); @@ -1220,11 +1196,9 @@ } } } - gamedata->DelTable( table ); } - table = gamedata->LoadTable( "featreq" ); - tm = gamedata->GetTable( table ); + tm.load("featreq"); if (tm) { unsigned int tmp; @@ -1238,7 +1212,6 @@ } featstats[i] = (ieByte) tmp; } - gamedata->DelTable( table ); } } @@ -1662,8 +1635,7 @@ void Actor::ReactToDeath(const char * deadname) { - int table = gamedata->LoadTable( "death" ); - TableMgr *tm = gamedata->GetTable( table ); + AutoTable tm("death"); if (!tm) return; // lookup value based on died's scriptingname and ours // if value is 0 - use reactdeath @@ -1698,7 +1670,6 @@ break; } } - gamedata->DelTable(table); } //call this only from gui selects @@ -3391,15 +3362,9 @@ void Actor::GetSoundFrom2DA(ieResRef Sound, unsigned int index) { - int table=gamedata->LoadTable( anims->ResRef ); - - if (table<0) { + AutoTable tab(anims->ResRef); + if (!tab) return; - } - TableMgr * tab = gamedata->GetTable( table ); - if (!tab) { - goto end; - } switch (index) { case VB_ATTACK: @@ -3416,8 +3381,6 @@ break; } strnlwrcpy(Sound, tab->QueryField (index, 0), 8); -end: - gamedata->DelTable( table ); } void Actor::GetSoundFromINI(ieResRef Sound, unsigned int index) @@ -3872,8 +3835,7 @@ if (FistRows<0) { FistRows=0; - int table = gamedata->LoadTable( "fistweap" ); - TableMgr *fist = gamedata->GetTable( table ); + AutoTable fist("fistweap"); if (fist) { //default value strnlwrcpy( DefaultFist, fist->QueryField( (unsigned int) -1), 8); @@ -3887,7 +3849,6 @@ *(int *) fistres[i] = atoi(fist->GetRowName( i)); } } - gamedata->DelTable( table ); } if (col>MAX_LEVEL) col=MAX_LEVEL; if (col<1) col=1; Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2009-01-27 22:11:22 UTC (rev 5555) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2009-01-27 22:13:26 UTC (rev 5556) @@ -76,17 +76,15 @@ */ static ieResRef *GetSpellTable(const ieResRef tableresref, int column) { - int table = gamedata->LoadTable(tableresref); - if (table<0) { - return NULL; - } - TableMgr *tab = gamedata->GetTable((unsigned int) table); + AutoTable tab(tableresref); + if (!tab) + return 0; + int count = tab->GetRowCount(); ieResRef *reslist = (ieResRef *) malloc (sizeof(ieResRef) * count); for(int i = 0; i<count;i++) { strnlwrcpy(reslist[i], tab->QueryField(i, column), 8); } - gamedata->DelTable((unsigned int) table); return reslist; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 23:22:24
|
Revision: 5555 http://gemrb.svn.sourceforge.net/gemrb/?rev=5555&view=rev Author: wjpalenstijn Date: 2009-01-27 22:11:22 +0000 (Tue, 27 Jan 2009) Log Message: ----------- 2DA refcounting. (Not really used yet.) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GameData.cpp gemrb/trunk/gemrb/plugins/Core/GameData.h Modified: gemrb/trunk/gemrb/plugins/Core/GameData.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-01-27 21:09:16 UTC (rev 5554) +++ gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-01-27 22:11:22 UTC (rev 5555) @@ -65,9 +65,9 @@ { \ std::vector<type>::iterator i; \ for(i = (variable).begin(); i != (variable).end(); ++i) { \ - if (!(*i).free) { \ + if ((*i).refcount) { \ core->FreeInterface((*i).member); \ - (*i).free = true; \ + (*i).refcount = 0; \ } \ } \ } @@ -173,12 +173,12 @@ return -1; } Table t; - t.free = false; + t.refcount = 1; strncpy( t.ResRef, ResRef, 8 ); t.tm = tm; ind = -1; for (size_t i = 0; i < tables.size(); i++) { - if (tables[i].free) { + if (tables[i].refcount == 0) { ind = ( int ) i; break; } @@ -194,7 +194,7 @@ int GameData::GetTableIndex(const char* ResRef) const { for (size_t i = 0; i < tables.size(); i++) { - if (tables[i].free) + if (tables[i].refcount == 0) continue; if (strnicmp( tables[i].ResRef, ResRef, 8 ) == 0) return ( int ) i; @@ -207,7 +207,7 @@ if (index >= tables.size()) { return NULL; } - if (tables[index].free) { + if (tables[index].refcount == 0) { return NULL; } return tables[index].tm; @@ -224,11 +224,12 @@ if (index >= tables.size()) { return false; } - if (tables[index].free) { + if (tables[index].refcount == 0) { return false; } - core->FreeInterface( tables[index].tm ); - tables[index].free = true; + tables[index].refcount--; + if (tables[index].refcount == 0) + core->FreeInterface( tables[index].tm ); return true; } bool GameData::Exists(const char *ResRef, SClass_ID type, bool silent) Modified: gemrb/trunk/gemrb/plugins/Core/GameData.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-27 21:09:16 UTC (rev 5554) +++ gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-27 22:11:22 UTC (rev 5555) @@ -39,7 +39,7 @@ struct Table { TableMgr * tm; char ResRef[8]; - bool free; + unsigned int refcount; }; #ifdef WIN32 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-01-28 12:35:07
|
Revision: 5557 http://gemrb.svn.sourceforge.net/gemrb/?rev=5557&view=rev Author: fuzzie Date: 2009-01-28 12:00:53 +0000 (Wed, 28 Jan 2009) Log Message: ----------- move hardcoded gui behaviour from DrawWindows to a separate function Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-27 22:13:26 UTC (rev 5556) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-28 12:00:53 UTC (rev 5557) @@ -923,6 +923,7 @@ if (EventFlag) { HandleEvents(); } + HandleGUIBehaviour(); GameLoop(); DrawWindows(); @@ -2868,7 +2869,8 @@ } } -void Interface::DrawWindows(void) +/** handles hardcoded gui behaviour */ +void Interface::HandleGUIBehaviour(void) { GameControl *gc = GetGameControl(); if (gc) { @@ -2877,10 +2879,6 @@ //the following part is a series of hardcoded gui behaviour - //updating panes according to the saved game - //pst requires this before initiating dialogs because it has - //no dialog window by default - //initiating dialog if (flg & DF_IN_DIALOG) { // -3 noaction @@ -2918,7 +2916,10 @@ } //end of gui hacks } +} +void Interface::DrawWindows(void) +{ //here comes the REAL drawing of windows if (ModalWindow) { ModalWindow->DrawWindow(); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-01-27 22:13:26 UTC (rev 5556) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-01-28 12:00:53 UTC (rev 5557) @@ -630,6 +630,8 @@ void HandleFlags(); /** handles the EventFlag bits (conditional events) */ void HandleEvents(); + /** handles hardcoded gui behaviour */ + void HandleGUIBehaviour(); /** Creates a game control, closes all other windows */ GameControl* StartGameControl(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |