From: <ave...@us...> - 2008-01-30 17:59:51
|
Revision: 5023 http://gemrb.svn.sourceforge.net/gemrb/?rev=5023&view=rev Author: avenger_teambg Date: 2008-01-30 09:32:28 -0800 (Wed, 30 Jan 2008) Log Message: ----------- added KnowSpell trigger added ExitPocketPlane (but it still needs some work) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.h gemrb/trunk/gemrb/plugins/Core/Triggers.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-01-28 17:45:43 UTC (rev 5022) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-01-30 17:32:28 UTC (rev 5023) @@ -546,6 +546,25 @@ } } +//add some animation effects too? +void GameScript::ExitPocketPlane(Scriptable* /*Sender*/, Action* /*parameters*/) +{ + Game *game = core->GetGame(); + int i = game->GetPartySize(false); + if (!i) return; + Actor *actor = game->GetPC(0, false); + ieResRef area; + Point p((short) actor->GetStat(IE_SAVEDXPOS), (short) actor->GetStat(IE_SAVEDYPOS) ); + //FIXME: calculate area + //This action is not working now!!! + memcpy(area,actor->GetCurrentArea(),sizeof(ieResRef) ); + //end of hack + while (i--) { + Actor *tar = game->GetPC(i, false); + MoveBetweenAreasCore( tar, area, p, -1, true); + } +} + //moves pcs and npcs from an area to another area void GameScript::MoveGlobalsTo(Scriptable* /*Sender*/, Action* parameters) { Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-01-28 17:45:43 UTC (rev 5022) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-01-30 17:32:28 UTC (rev 5023) @@ -213,6 +213,7 @@ {"isweather", GameScript::IsWeather, 0}, //gemrb extension {"itemisidentified", GameScript::ItemIsIdentified, 0}, {"kit", GameScript::Kit, 0}, + {"knowspell", GameScript::KnowSpell, 0}, //gemrb specific {"lastmarkedobject", GameScript::LastMarkedObject_Trigger, 0}, {"lastpersontalkedto", GameScript::LastPersonTalkedTo, 0}, //pst {"level", GameScript::Level, 0}, @@ -524,6 +525,7 @@ {"escapeareadestroy", GameScript::EscapeAreaDestroy, 0}, {"escapeareaobject", GameScript::EscapeAreaObject, 0}, {"escapeareaobjectnosee", GameScript::EscapeAreaObjectNoSee, 0}, + {"exitpocketplane", GameScript::ExitPocketPlane, 0}, {"expansionendcredits", GameScript::QuitGame, 0},//ends game too {"explore", GameScript::Explore, 0}, {"exploremapchunk", GameScript::ExploreMapChunk, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-01-28 17:45:43 UTC (rev 5022) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-01-30 17:32:28 UTC (rev 5023) @@ -812,6 +812,7 @@ static int IsWeather(Scriptable* Sender, Trigger* parameters); static int ItemIsIdentified(Scriptable* Sender, Trigger* parameters); static int Kit(Scriptable* Sender, Trigger* parameters); + static int KnowSpell(Scriptable* Sender, Trigger* parameters); static int LastMarkedObject_Trigger(Scriptable* Sender, Trigger* parameters); static int LastPersonTalkedTo(Scriptable* Sender, Trigger* parameters); static int Level(Scriptable* Sender, Trigger* parameters); @@ -1087,6 +1088,7 @@ static void EquipMostDamagingMelee(Scriptable *Sender, Action *parameters); static void EquipRanged(Scriptable *Sender, Action *parameters); static void EquipWeapon(Scriptable *Sender, Action *parameters); + static void ExitPocketPlane(Scriptable* Sender, Action* parameters); static void ExpansionEndCredits(Scriptable* Sender, Action* parameters); static void Explore(Scriptable *Sender, Action *parameters); static void ExploreMapChunk(Scriptable *Sender, Action *parameters); Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2008-01-28 17:45:43 UTC (rev 5022) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2008-01-30 17:32:28 UTC (rev 5023) @@ -190,6 +190,45 @@ return false; } +bool Spellbook::KnowSpell(int spellid) +{ + int type = spellid/1000; + if (type>4) { + return false; + } + type = sections[type]; + spellid = spellid % 1000; + + for (unsigned int j = 0; j < GetSpellLevelCount(type); j++) { + CRESpellMemorization* sm = spells[type][j]; + for (unsigned int k = 0; k < sm->memorized_spells.size(); k++) { + CREKnownSpell* ks = sm->known_spells[k]; + if (atoi(ks->SpellResRef+4)==spellid) { + return true; + } + } + } + return false; +} + +//if resref=="" then it is a knownanyspell +bool Spellbook::KnowSpell(const char *resref) +{ + for (int i = 0; i < NUM_BOOK_TYPES; i++) { + for (unsigned int j = 0; j < spells[i].size(); j++) { + CRESpellMemorization* sm = spells[i][j]; + for (unsigned int k = 0; k < sm->memorized_spells.size(); k++) { + CREKnownSpell* ks = sm->known_spells[k]; + if (resref[0] && stricmp(ks->SpellResRef, resref) ) { + continue; + } + return true; + } + } + } + return false; +} + //if resref=="" then it is a haveanyspell bool Spellbook::HaveSpell(const char *resref, ieDword flags) { Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.h 2008-01-28 17:45:43 UTC (rev 5022) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.h 2008-01-30 17:32:28 UTC (rev 5023) @@ -165,9 +165,12 @@ static void ReleaseMemory(); void FreeSpellPage(CRESpellMemorization* sm); - /** Check if the spell exists, optionally deplete it (casting) */ + /** Check if the spell is memorised, optionally deplete it (casting) */ bool HaveSpell(const char *resref, ieDword flags); bool HaveSpell(int spellid, ieDword flags); + /** Check if the spell is in the book */ + bool KnowSpell(const char *resref); + bool KnowSpell(int spellid); bool AddSpellMemorization(CRESpellMemorization* sm); int GetTypes() const; Modified: gemrb/trunk/gemrb/plugins/Core/Triggers.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2008-01-28 17:45:43 UTC (rev 5022) +++ gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2008-01-30 17:32:28 UTC (rev 5023) @@ -1161,6 +1161,18 @@ return 0; } +int GameScript::KnowSpell(Scriptable *Sender, Trigger *parameters) +{ + if (Sender->Type!=ST_ACTOR) { + return 0; + } + Actor *actor = (Actor *) Sender; + if (parameters->string0Parameter[0]) { + return actor->spellbook.KnowSpell(parameters->string0Parameter); + } + return actor->spellbook.KnowSpell(parameters->int0Parameter); +} + int GameScript::True(Scriptable * /* Sender*/, Trigger * /*parameters*/) { return 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-02-08 18:23:19
|
Revision: 5034 http://gemrb.svn.sourceforge.net/gemrb/?rev=5034&view=rev Author: avenger_teambg Date: 2008-02-08 10:23:23 -0800 (Fri, 08 Feb 2008) Log Message: ----------- detecting iwd2 style startpos.2da (with rotations and no tutorial) adjusting PlayMode accordingly (this will fixes iwd2 new game) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Game.h gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-02-08 17:56:13 UTC (rev 5033) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-02-08 18:23:23 UTC (rev 5034) @@ -303,8 +303,18 @@ return ( int ) NPCs.size() - 1; } +//determines if startpos.2da has rotation rows (it cannot have tutorial line) +bool Game::DetermineStartPosType(TableMgr *strta) +{ + if ((strta->GetRowCount()>=6) && !stricmp(strta->GetRowName(4),"START_ROT" ) ) + { + return true; + } + return false; +} int Game::JoinParty(Actor* actor, int join) { + bool startorient = 0; actor->CreateStats(); //create stats if they didn't exist yet actor->InitButtons(actor->GetStat(IE_CLASS)); //init actor's buttons actor->SetBase(IE_EXPLORE, 1); @@ -314,6 +324,12 @@ TableMgr* strta = core->GetTable( saindex ); ieDword playmode = 0; core->GetDictionary()->Lookup( "PlayMode", playmode ); + //hack for iwd2 + startorient = DetermineStartPosType(strta); + if (startorient) { + playmode %= 2; + actor->SetOrientation( atoi( strta->QueryField( playmode+4, actor->InParty-1) ), false ); + } playmode *= 2; actor->Pos.x = actor->Destination.x = (short) atoi( strta->QueryField( playmode, actor->InParty-1 ) ); actor->Pos.y = actor->Destination.y = (short) atoi( strta->QueryField( playmode + 1, actor->InParty-1 ) ); @@ -321,7 +337,7 @@ saindex = core->LoadTable( "startare" ); strta = core->GetTable( saindex ); - core->GetDictionary()->Lookup( "PlayMode", playmode ); + playmode /= 2; playmode *= 3; strnlwrcpy(actor->Area, strta->QueryField( playmode, 0 ), 8 ); //TODO: set viewport Modified: gemrb/trunk/gemrb/plugins/Core/Game.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.h 2008-02-08 17:56:13 UTC (rev 5033) +++ gemrb/trunk/gemrb/plugins/Core/Game.h 2008-02-08 18:23:23 UTC (rev 5034) @@ -376,6 +376,8 @@ void SetExpansion(int exp); /** Dumps information about the object */ void DebugDump(); +private: + bool DetermineStartPosType(TableMgr *strta); }; #endif // ! GAME_H Modified: gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp 2008-02-08 17:56:13 UTC (rev 5033) +++ gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp 2008-02-08 18:23:23 UTC (rev 5034) @@ -124,7 +124,7 @@ ieDword playmode = 1; core->GetDictionary()->Lookup( "PlayMode", playmode ); - if (playmode == 2) { + if (playmode >= 2) { return "mpsave"; } return "save"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2008-02-17 15:42:35
|
Revision: 5051 http://gemrb.svn.sourceforge.net/gemrb/?rev=5051&view=rev Author: wjpalenstijn Date: 2008-02-17 07:42:00 -0800 (Sun, 17 Feb 2008) Log Message: ----------- fix ground circle for tiny creatures Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/Map.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2008-02-17 15:33:28 UTC (rev 5050) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2008-02-17 15:42:00 UTC (rev 5051) @@ -732,10 +732,12 @@ core->GetVideoDriver()->BlitSprite( sprite, Pos.x - vp.x, Pos.y - vp.y, true ); } else { - int csize = size; - if (csize < 2) csize = 2; + // for size >= 2, radii are (size-1)*16, (size-1)*12 + // for size == 1, radii are 12, 9 + int csize = (size - 1) * 4; + if (csize < 4) csize = 3; core->GetVideoDriver()->DrawEllipse( (ieWord) (Pos.x - vp.x), (ieWord) (Pos.y - vp.y), - (ieWord) ((csize-1) * 16 ), (ieWord) ((csize-1) * 12 ), *col ); + (ieWord) (csize * 4), (ieWord) (csize * 3), *col ); } } Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2008-02-17 15:33:28 UTC (rev 5050) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2008-02-17 15:42:00 UTC (rev 5051) @@ -2425,7 +2425,7 @@ // actor. This matches the behaviour of the original BG2. if (size > MAX_CIRCLESIZE) size = MAX_CIRCLESIZE; - if (size < 1) size = 1; + if (size < 2) size = 2; unsigned int ppx = Pos.x/16; unsigned int ppy = Pos.y/12; unsigned int r=(size-1)*(size-1)+1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-02-18 19:07:28
|
Revision: 5060 http://gemrb.svn.sourceforge.net/gemrb/?rev=5060&view=rev Author: avenger_teambg Date: 2008-02-18 11:07:04 -0800 (Mon, 18 Feb 2008) Log Message: ----------- Implemented spritecover for area animations, fixes bug #1895642 Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/Map.h Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2008-02-18 17:17:03 UTC (rev 5059) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2008-02-18 19:07:04 UTC (rev 5060) @@ -26,7 +26,6 @@ #include "Ambient.h" #include "../../includes/strrefs.h" #include "AmbientMgr.h" -#include "SpriteCover.h" #include "TileMap.h" #include "ScriptedAnimation.h" #include "Projectile.h" @@ -813,23 +812,7 @@ break; case AOT_AREA: //draw animation - { - int animcount=a->animcount; - - //always draw the animation tinted because tint is also used for - //transparency - Color tint = {255,255,255,255-(ieByte) a->transparency}; - if ((a->Flags&A_ANI_NO_SHADOW)) { - tint = LightMap->GetPixel( a->Pos.x / 16, a->Pos.y / 12); - tint.a = 255-(ieByte) a->transparency; - } - while (animcount--) { - Animation *anim = a->animation[animcount]; - video->BlitGameSprite( anim->NextFrame(), - a->Pos.x + screen.x, a->Pos.y + screen.y, - BLIT_TINTED, tint, 0, a->palette, &screen ); - } - } + a->Draw( screen, this ); a = GetNextAreaAnimation(aniidx,gametime); break; case AOT_SCRIPTED: @@ -943,6 +926,12 @@ aniIterator iter; for(iter=animations.begin(); (iter!=animations.end()) && ((*iter)->height<anim->height); iter++); animations.insert(iter, anim); + /* + Animation *a = anim->animation[0]; + anim->SetSpriteCover(BuildSpriteCover(anim->Pos.x, anim->Pos.y,-a->animArea.x, + -a->animArea.y, a->animArea.w, a->animArea.h,0 + )); + */ } //reapplying all of the effects on the actors of this map @@ -1325,7 +1314,6 @@ { int ret = SearchMap->GetPixelIndex( x, y ); if (ret&(PATH_MAP_DOOR_TRANSPARENT|PATH_MAP_ACTOR)) { -// if (ret&PATH_MAP_DOOR_TRANSPARENT) { ret&=~PATH_MAP_PASSABLE; } if (ret&PATH_MAP_DOOR_OPAQUE) { @@ -1338,7 +1326,7 @@ { // We check a circle of radius size-2 around (px,py) // Note that this does not exactly match BG2. BG2's approximations of - // these circles are slightly different for sizes 7 and up. + // these circles are slightly different for sizes 7 and up. if (size > MAX_CIRCLESIZE) size = MAX_CIRCLESIZE; if (size < 2) size = 2; @@ -2418,7 +2406,7 @@ { // We block a circle of radius size-1 around (px,py) // Note that this does not exactly match BG2. BG2's approximations of - // these circles are slightly different for sizes 6 and up. + // these circles are slightly different for sizes 6 and up. // Note: this is a larger circle than the one tested in GetBlocked. // This means that an actor can get closer to a wall than to another @@ -2708,6 +2696,7 @@ animation=NULL; animcount=0; palette=NULL; + covers=NULL; } AreaAnimation::~AreaAnimation() @@ -2719,6 +2708,12 @@ } free(animation); core->FreePalette(palette, PaletteRef); + if (covers) { + for(int i=0;i<animcount;i++) { + delete covers[i]; + } + free (covers); + } } void AreaAnimation::SetPalette(ieResRef Pal) @@ -2761,3 +2756,36 @@ } return false; } + +void AreaAnimation::Draw(Region &screen, Map *area) +{ + int ac=animcount; + Video* video = core->GetVideoDriver(); + + //always draw the animation tinted because tint is also used for + //transparency + Color tint = {255,255,255,255-(ieByte) transparency}; + if ((Flags&A_ANI_NO_SHADOW)) { + tint = area->LightMap->GetPixel( Pos.x / 16, Pos.y / 12); + tint.a = 255-(ieByte) transparency; + } + if (!(Flags&A_ANI_NO_WALL)) { + if (!covers) { + covers=(SpriteCover **) calloc( animcount, sizeof(SpriteCover *) ); + } + } + ac=animcount; + while (ac--) { + Animation *anim = animation[ac]; + Sprite2D *frame = anim->NextFrame(); + if(covers) { + if(!covers[ac] || !covers[ac]->Covers(Pos.x, Pos.y, frame->XPos, frame->YPos, frame->Width, frame->Height)) { + delete covers[ac]; + covers[ac] = area->BuildSpriteCover(Pos.x, Pos.y, -anim->animArea.x, + -anim->animArea.y, anim->animArea.w, anim->animArea.h, 0); + } + } + video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, + BLIT_TINTED, tint, covers?covers[ac]:0, palette, &screen ); + } +} Modified: gemrb/trunk/gemrb/plugins/Core/Map.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.h 2008-02-18 17:17:03 UTC (rev 5059) +++ gemrb/trunk/gemrb/plugins/Core/Map.h 2008-02-18 19:07:04 UTC (rev 5060) @@ -27,6 +27,7 @@ #include "../../includes/globals.h" #include "ActorBlock.h" #include "IniSpawn.h" +#include "SpriteCover.h" #include <queue> class Actor; @@ -183,11 +184,13 @@ ieResRef BAM; //not only for saving back (StaticSequence depends on this) ieResRef PaletteRef; Palette* palette; + SpriteCover** covers; AreaAnimation(); ~AreaAnimation(); void SetPalette(ieResRef PaletteRef); void BlendAnimation(); bool Schedule(ieDword gametime); + void Draw(Region &screen, Map *area); }; enum AnimationObjectType {AOT_AREA, AOT_SCRIPTED, AOT_ACTOR, AOT_SPARK, AOT_PROJECTILE}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-04-12 06:32:39
|
Revision: 5134 http://gemrb.svn.sourceforge.net/gemrb/?rev=5134&view=rev Author: avenger_teambg Date: 2008-04-11 23:32:39 -0700 (Fri, 11 Apr 2008) Log Message: ----------- fixed handling of startare (in iwd/how) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-04-11 16:59:12 UTC (rev 5133) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-04-12 06:32:39 UTC (rev 5134) @@ -326,7 +326,7 @@ core->GetDictionary()->Lookup( "PlayMode", playmode ); //hack for iwd2 startorient = DetermineStartPosType(strta); - if (startorient) { + if (startorient || strta->GetRowCount()<6) { playmode %= 2; actor->SetOrientation( atoi( strta->QueryField( playmode+4, actor->InParty-1) ), false ); } Modified: gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp 2008-04-11 16:59:12 UTC (rev 5133) +++ gemrb/trunk/gemrb/plugins/Core/SaveGameIterator.cpp 2008-04-12 06:32:39 UTC (rev 5134) @@ -119,9 +119,10 @@ loaded = false; } +/* mission pack save */ static const char* PlayMode() { - ieDword playmode = 1; + ieDword playmode = 0; core->GetDictionary()->Lookup( "PlayMode", playmode ); if (playmode >= 2) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-04-12 10:34:09
|
Revision: 5135 http://gemrb.svn.sourceforge.net/gemrb/?rev=5135&view=rev Author: avenger_teambg Date: 2008-04-12 03:34:08 -0700 (Sat, 12 Apr 2008) Log Message: ----------- fixed a leak in Actor related global variables Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/Interface.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2008-04-12 06:32:39 UTC (rev 5134) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2008-04-12 10:34:08 UTC (rev 5135) @@ -123,6 +123,8 @@ ieDword itemflags; }; +extern void ReleaseMemoryActor(); + class GEM_EXPORT Actor : public Movable { public: //CRE DATA FIELDS Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-04-12 06:32:39 UTC (rev 5134) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-04-12 10:34:08 UTC (rev 5135) @@ -334,6 +334,7 @@ FreeInterface(mm); } + ReleaseMemoryActor(); EffectQueue_ReleaseMemory(); CharAnimations::ReleaseMemory(); delete CurrentStore; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-05-05 16:29:49
|
Revision: 5142 http://gemrb.svn.sourceforge.net/gemrb/?rev=5142&view=rev Author: avenger_teambg Date: 2008-05-05 09:29:48 -0700 (Mon, 05 May 2008) Log Message: ----------- added ChangeTileState (not sure this is what bg2 does, but it is at least partially useful for something) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-05-04 20:50:52 UTC (rev 5141) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-05-05 16:29:48 UTC (rev 5142) @@ -1646,6 +1646,22 @@ } } +void GameScript::ChangeTileState(Scriptable* Sender, Action* parameters) +{ + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); + if (!tar) { + return; + } + if (tar->Type != ST_DOOR) { + return; + } + Door* door = ( Door* ) tar; + int state = parameters->int0Parameter; + if(door) { + door->ToggleTiles(state); /* default is false for playsound */ + } +} + void GameScript::StaticStart(Scriptable* Sender, Action* parameters) { AreaAnimation *anim = Sender->GetCurrentArea()->GetAnimation(parameters->objects[1]->objectName); Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2008-05-04 20:50:52 UTC (rev 5141) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2008-05-05 16:29:48 UTC (rev 5142) @@ -447,11 +447,11 @@ ieResRef Dialog; private: void SetWallgroups(int count, int value); - void ToggleTiles(int State, bool playsound = false); void ImpedeBlocks(int count, Point *points, unsigned int value); void UpdateDoor(); bool BlockedOpen(bool Open, bool ForceOpen); public: + void ToggleTiles(int State, bool playsound = false); void SetName(const char* Name); // sets door ID void SetTiles(unsigned short* Tiles, int count); void SetDoorLocked(bool Locked, bool playsound); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-05-04 20:50:52 UTC (rev 5141) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-05-05 16:29:48 UTC (rev 5142) @@ -435,6 +435,7 @@ {"changestatglobal", GameScript::ChangeStatGlobal, 0}, {"changestoremarkup", GameScript::ChangeStoreMarkup, 0},//iwd2 {"changeteam", GameScript::SetTeam, 0}, //pst + {"changetilestate", GameScript::ChangeTileState, 0}, //bg2 {"chunkcreature", GameScript::Kill, 0}, //should be more graphical {"clearactions", GameScript::ClearActions, 0}, {"clearallactions", GameScript::ClearAllActions, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-05-04 20:50:52 UTC (rev 5141) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-05-05 16:29:48 UTC (rev 5142) @@ -1005,6 +1005,7 @@ static void ChangeStat(Scriptable* Sender, Action* parameters); static void ChangeStatGlobal(Scriptable* Sender, Action* parameters); static void ChangeStoreMarkup(Scriptable* Sender, Action* parameters); + static void ChangeTileState(Scriptable* Sender, Action* parameters); static void ClearActions(Scriptable* Sender, Action* parameters); static void ClearAllActions(Scriptable* Sender, Action* parameters); static void ClearPartyEffects(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-05-12 19:46:54
|
Revision: 5148 http://gemrb.svn.sourceforge.net/gemrb/?rev=5148&view=rev Author: avenger_teambg Date: 2008-05-12 12:46:41 -0700 (Mon, 12 May 2008) Log Message: ----------- Interact now handles inlined interactions (without banter dialog) ctrl-i forces interaction (as in original game) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2008-05-12 19:35:34 UTC (rev 5147) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2008-05-12 19:46:41 UTC (rev 5148) @@ -1548,6 +1548,45 @@ return ret; } +void Actor::Interact(int type) +{ + int start; + int count; + + switch(type) { + case I_INSULT: start=VB_INSULT; count=3; break; + case I_COMPLIMENT: start=VB_COMPLIMENT; count=3; break; + case I_SPECIAL: start=VB_SPECIAL; count=3; break; + default: + return; + } + + count=rand()%count; + while(count && StrRefs[start+count]!=0xffff) count--; + if(count>=0) { + DisplayStringCore(this, start+count, DS_CONSOLE|DS_CONST ); + } +} + +void Actor::Response(int type) +{ + int start; + int count; + + switch(type) { + case I_INSULT: start=VB_RESP_INS; count=3; break; + case I_COMPLIMENT: start=VB_RESP_COMP; count=3; break; + default: + return; + } + + count=rand()%count; + while(count && StrRefs[start+count]!=0xffff) count--; + if(count>=0) { + DisplayStringCore(this, start+count, DS_CONSOLE|DS_CONST ); + } +} + void Actor::ReactToDeath(const char * deadname) { int table = core->LoadTable( "death" ); @@ -1623,6 +1662,8 @@ //if dialoginterrupt was set, no verbal constant if ( Modified[IE_MC_FLAGS]&MC_NO_TALK) return; + + /* this part is unsure */ if (Modified[IE_EA]>=EA_EVILCUTOFF) { DisplayStringCore(this, VB_HOSTILE, DS_CONSOLE|DS_CONST ); } else { @@ -2068,7 +2109,7 @@ item->slot = idx; item->headerindex = headerindex; memcpy(&(item->AttackType), &(ext_header->AttackType), - ((char *) &(item->itemname)) -((char *) &(item->AttackType)) ); + ((char *) &(item->itemname)) -((char *) &(item->AttackType)) ); if (headerindex>=CHARGE_COUNTERS) { item->Charges=0; } else { Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2008-05-12 19:35:34 UTC (rev 5147) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2008-05-12 19:46:41 UTC (rev 5148) @@ -110,6 +110,11 @@ #define VCONST_COUNT 100 +//interact types +#define I_INSULT 1 +#define I_COMPLIMENT 2 +#define I_SPECIAL 3 + // 3 for blur, 8 for mirror images #define EXTRA_ACTORCOVERS 11 @@ -344,6 +349,10 @@ void Panic(); /* sets a multi class flag (actually this is a lot of else too) */ void SetMCFlag(ieDword bitmask, int op); + /* inlined dialogue start */ + void Interact(int type); + /* inlined dialogue response */ + void Response(int type); /* called when someone died in the party */ void ReactToDeath(const char *deadname); /* called when someone talks to Actor */ Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-05-12 19:35:34 UTC (rev 5147) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-05-12 19:46:41 UTC (rev 5148) @@ -256,7 +256,7 @@ Sender->ReleaseCurrentAction(); return; } - + video->ConvertToScreen(point.x, point.y); GameControl *win = core->GetGameControl(); @@ -369,7 +369,7 @@ if (target->Type==ST_ACTOR) { Actor *tar = (Actor *) target; - + if (!tar->ValidTarget(nodead)) { return 0; } @@ -821,6 +821,26 @@ } } +int CheckInteract(const char *talker, const char *target) +{ + int interact = -1; + interact = core->LoadTable( "interact" ); + if(!interact) + return 0; + const char *value = core->GetTable(interact)->QueryField(talker, target); + if(!value) + return 0; + switch(value[0]) { + case 's': + return I_SPECIAL; + case 'c': + return I_COMPLIMENT; + case 'i': + return I_INSULT; + } + return 0; +} + static ieResRef PlayerDialogRes = "PLAYERx\0"; void BeginDialog(Scriptable* Sender, Action* parameters, int Flags) @@ -921,7 +941,6 @@ } } - GameControl* gc = core->GetGameControl(); if (!gc) { printMessage( "GameScript","Dialog cannot be initiated because there is no GameControl.", YELLOW ); @@ -963,8 +982,18 @@ Dialog = ( const char * ) PlayerDialogRes; break; case BD_INTERACT: //using the source for the dialog + const char* scriptingname = scr->GetScriptName(); + + /* use interact.2da for short, inlined dialogue */ + int type = CheckInteract(scriptingname, target->GetScriptName()); + if(type) { + speaker->Interact(type); + target->Response(type); + Sender->ReleaseCurrentAction(); + goto end_of_quest; + } + /* banter dialogue */ pdtable = core->LoadTable( "interdia" ); - const char* scriptingname = scr->GetScriptName(); //Dialog is a borrowed reference, we cannot free pdtable while it is being used if (pdtable!=-1) { Dialog = core->GetTable( pdtable )->QueryField( scriptingname, "FILE" ); Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-05-12 19:35:34 UTC (rev 5147) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2008-05-12 19:46:41 UTC (rev 5148) @@ -286,7 +286,7 @@ draw |= D_UP; } int tmp; - + Sprite2D *spr = core->GetScrollCursorSprite(0,0); tmp = spr->Width; @@ -336,7 +336,7 @@ viewport.x = mapsize.x - viewport.w; else viewport.x += video->moveX; //middle :) - + if ( viewport.y + video->moveY < 0 ) //if we are at the left of the map viewport.y = 0; else if ( (viewport.y + video->moveY + viewport.h ) >= mapsize.y ) //if we are at the right @@ -359,10 +359,10 @@ if (trackerID) { Actor *actor = area->GetActorByGlobalID(trackerID); - + if (actor) { Actor **monsters = area->GetAllActorsInRadius(actor->Pos, GA_NO_DEAD, distance); - + int i = 0; while(monsters[i]) { Actor *target = monsters[i++]; @@ -430,7 +430,7 @@ } else { c->outlineColor = cyan; } - c->DrawOutline(); + c->DrawOutline(); } } @@ -598,7 +598,7 @@ /* doesn't fall through here */ Actor* actor = game->GetPC( whom,false ); - if (!actor) + if (!actor) return; if (type==0) { @@ -707,9 +707,9 @@ break; - case 'o': + case 'o': // origin - pfs.x = lastMouseX; + pfs.x = lastMouseX; pfs.y = lastMouseY; core->GetVideoDriver()->ConvertToGame( pfs.x, pfs.y ); break; @@ -768,6 +768,29 @@ case 'g'://shows loaded areas game->DebugDump(); break; + case 'i': + if (!lastActor) { + lastActor = area->GetActor( p, GA_DEFAULT); + } + if (lastActor && !(lastActor->GetStat(IE_MC_FLAGS)&MC_EXPORTABLE)) { + Actor *target; + int i = game->GetPartySize(true); + if(i<2) break; + i=rand()%i; + do + { + target = game->GetPC(i, true); + if(target==lastActor) continue; + if(target->GetStat(IE_MC_FLAGS)&MC_EXPORTABLE) continue; + + char Tmp[40]; + snprintf(Tmp,sizeof(Tmp),"Interact(\"%s\")",target->GetScriptName() ); + lastActor->AddAction(GenerateAction(Tmp)); + break; + } + while(i--); + } + break; case 'r'://resurrects actor if (!lastActor) { lastActor = area->GetActor( p, GA_DEFAULT); @@ -818,7 +841,7 @@ lastActor->AddAction( GenerateAction(Tmp) ); } break; - case 'z': + case 'z': if (lastActor) { lastActor->GetPrevAnimation(); } @@ -840,7 +863,7 @@ printf("Show searchmap %s\n", DebugFlags & DEBUG_SHOW_SEARCHMAP ? "ON" : "OFF"); break; case '6': - //show the lightmap + //show the lightmap DebugFlags ^= DEBUG_SHOW_LIGHTMAP; printf("Show lightmap %s\n", DebugFlags & DEBUG_SHOW_LIGHTMAP ? "ON" : "OFF"); break; @@ -963,7 +986,7 @@ if (overDoor) { nextCursor = GetCursorOverDoor(overDoor); } - + if (overContainer) { nextCursor = GetCursorOverContainer(overContainer); } @@ -1005,7 +1028,7 @@ } goto end_function; } - + if (lastActor) { switch (lastActor->GetStat(IE_EA)) { case EA_EVILCUTOFF: @@ -1018,17 +1041,17 @@ case EA_CONTROLLED: case EA_CHARMED: case EA_EVILBUTGREEN: - if (target_mode & TARGET_MODE_ALLY) + if (target_mode & TARGET_MODE_ALLY) nextCursor^=1; break; case EA_ENEMY: case EA_GOODBUTRED: - if (target_mode & TARGET_MODE_ENEMY) + if (target_mode & TARGET_MODE_ENEMY) nextCursor^=1; break; default: - if (target_mode & TARGET_MODE_NEUTRAL) + if (target_mode & TARGET_MODE_NEUTRAL) nextCursor^=1; break; } @@ -1272,10 +1295,10 @@ return false; case ST_TRIGGER: //the importer shouldn't load the script - //if it is unallowed anyway (though + //if it is unallowed anyway (though //deactivated scripts could be reactivated) //only the 'trapped' flag should be honoured - //there. Here we have to check on the + //there. Here we have to check on the //reset trap and deactivated flags if (trap->Scripts[0]) { if (!(trap->Flags&TRAP_DEACTIVATED) ) { @@ -1447,7 +1470,7 @@ } else { type = ACT_NONE; //party } - + if (target_mode&TARGET_MODE_ATTACK) { type = ACT_ATTACK; } else if (target_mode&TARGET_MODE_TALK) { @@ -1976,11 +1999,11 @@ return; } Actor *tgt; - Scriptable *target; - + Scriptable *target; + if (targetID!=0xffff) { tgt = GetTarget(); - target = tgt; + target = tgt; } else { //risky!!! target = targetOB; @@ -2006,7 +2029,7 @@ if (tgt) { if (DialogueFlags&DF_TALKCOUNT) { - DialogueFlags&=~DF_TALKCOUNT; + DialogueFlags&=~DF_TALKCOUNT; tgt->TalkCount++; } else if (DialogueFlags&DF_INTERACT) { DialogueFlags&=~DF_INTERACT; @@ -2103,7 +2126,7 @@ //displaying npc text core->DisplayStringName( ds->StrRef, 0x70FF70, target, IE_STR_SOUND|IE_STR_SPEECH); //adding a gap between options and npc text - ta->AppendText("",-1); + ta->AppendText("",-1); int i; int idx = 0; ta->SetMinRow( true ); @@ -2263,14 +2286,14 @@ { // We get preview by first taking a screenshot of size 640x405, // centered in the display. This is to get a decent picture for - // higher screen resolutions. + // higher screen resolutions. // FIXME: how do orig games solve that? Video* video = core->GetVideoDriver(); int w = video->GetWidth(); int h = video->GetHeight(); int x = (w - 640) / 2; int y = (h - 405) / 2; - + if (x < 0) { x = 0; } else { @@ -2283,7 +2306,7 @@ h = 405; } - if (!x) + if (!x) y = 0; HideGUI (); @@ -2324,7 +2347,7 @@ Sprite2D* img = im->GetImage(); core->FreeInterface(im); - if (ratio == 1) + if (ratio == 1) return img; Sprite2D* img_scaled = video->SpriteScaleDown( img, ratio ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-06-02 15:57:19
|
Revision: 5161 http://gemrb.svn.sourceforge.net/gemrb/?rev=5161&view=rev Author: avenger_teambg Date: 2008-06-02 08:56:52 -0700 (Mon, 02 Jun 2008) Log Message: ----------- added raw code for area effects Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.h Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2008-06-01 17:31:57 UTC (rev 5160) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2008-06-02 15:56:52 UTC (rev 5161) @@ -409,7 +409,7 @@ step = NULL; } -//get actors covered in area of effect radius +//get actors covered in area of trigger radius void Projectile::CheckTrigger(unsigned int radius) { //if there are any, then change phase to exploding @@ -418,6 +418,20 @@ } } +//secondary projectiles target all in the explosion radius +void Projectile::SecondaryTarget() +{ + int radius = Extension->ExplosionRadius; + Actor **actors = area->GetAllActorsInRadius(Pos, 0, radius); + Actor **poi=actors; + while(*poi) { + Projectile *pro = core->GetProjectileServer()->GetProjectileByIndex(Extension->ExplProjIdx); + pro->SetEffects(effects); + pro->SetCaster(Caster); + area->AddProjectile(pro, Pos, (*poi)->GetGlobalID()); + } +} + int Projectile::Update() { //if reached target explode @@ -483,7 +497,16 @@ //there is a secondary projectile if (Extension->AFlags&PAF_SECONDARY) { //the secondary projectile will target everyone in the area of effect + SecondaryTarget(); } + + if (Extension->AFlags&PAF_FRAGMENT) { + //there is a character animation in the center of the explosion + //which will go towards the edges (flames, etc) + //Extension->ExplColor fake color for single shades (blue,green,red flames) + //Extension->FragAnimID the animation id for the character animation + } + //the center of the explosion could be another projectile played over the target if (Extension->FragProjIdx) { Projectile *pro = core->GetProjectileServer()->GetProjectileByIndex(Extension->FragProjIdx); Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.h 2008-06-01 17:31:57 UTC (rev 5160) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.h 2008-06-02 15:56:52 UTC (rev 5161) @@ -224,6 +224,7 @@ private: void GetPaletteCopy(Animation *anim[], Palette *&pal); void SetBlend(); + void SecondaryTarget(); void CheckTrigger(unsigned int radius); void DrawTravel(Region &screen); void DrawExplosion(Region &screen); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |