From: <ave...@us...> - 2009-05-03 15:34:50
|
Revision: 5923 http://gemrb.svn.sourceforge.net/gemrb/?rev=5923&view=rev Author: avenger_teambg Date: 2009-05-03 15:34:42 +0000 (Sun, 03 May 2009) Log Message: ----------- fixed compile problems Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-05-03 15:10:41 UTC (rev 5922) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-05-03 15:34:42 UTC (rev 5923) @@ -687,7 +687,7 @@ //a perimeter or an inside point of the explosion radius int rad = Extension->ExplosionRadius; int vx = core->Roll(1,rad,0); - int vy = sqrt(rad*rad-vx*vx); + int vy = (int) sqrt(rad*rad-vx*vx); //if the whole area needs to be filled, then if (apflags&APF_FILL) { vy = core->Roll(1,vy,0); Modified: gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2009-05-03 15:10:41 UTC (rev 5922) +++ gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2009-05-03 15:34:42 UTC (rev 5923) @@ -201,7 +201,7 @@ } } if (idx>=(unsigned int) explosioncount) { - return NULL; + return 0; } return explosions[idx].palette; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-03 21:01:03
|
Revision: 5924 http://gemrb.svn.sourceforge.net/gemrb/?rev=5924&view=rev Author: avenger_teambg Date: 2009-05-03 21:00:55 +0000 (Sun, 03 May 2009) Log Message: ----------- added IsFreezed function to Interface to query if the game was paused (needed by projectiles) 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-05-03 15:34:42 UTC (rev 5923) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-05-03 21:00:55 UTC (rev 5924) @@ -221,6 +221,7 @@ ItemDialTable = NULL; ItemDial2Table = NULL; ItemTooltipTable = NULL; + update_scripts = false; gamedata = new GameData(); ::gamedata = gamedata; @@ -2805,10 +2806,14 @@ return 0; } +bool Interface::IsFreezed() +{ + return !update_scripts; +} + void Interface::GameLoop(void) { - bool update_scripts = false; - + update_scripts = false; GameControl *gc = GetGameControl(); if (gc) { update_scripts = !(gc->GetDialogueFlags() & DF_FREEZE_SCRIPTS); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-05-03 15:34:42 UTC (rev 5923) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-05-03 21:00:55 UTC (rev 5924) @@ -234,10 +234,6 @@ ResourceMgr * key; ProjectileServer * projserv; GameData * gamedata; -public: - StringMgr *strings; - GlobalTimer * timer; -private: ImageMgr * pal256; ImageMgr * pal32; ImageMgr * pal16; @@ -298,7 +294,10 @@ bool UseContainer; // Scrolling speed int mousescrollspd; + bool update_scripts; public: + StringMgr *strings; + GlobalTimer * timer; Palette *InfoTextPalette; int SaveAsOriginal; //if true, saves files in compatible mode int QuitFlag; @@ -639,7 +638,8 @@ void HandleGUIBehaviour(); /** Creates a game control, closes all other windows */ GameControl* StartGameControl(); - + /** Executes everything (non graphical) in the main game loop */ + void GameLoop(void); public: char GameDataPath[_MAX_PATH]; char GameOverridePath[_MAX_PATH]; @@ -675,8 +675,8 @@ bool FullScreen, CaseSensitive, GameOnCD, SkipIntroVideos, DrawFPS; /** The Main program loop */ void Main(void); - /** Executes everything (non graphical) in the main game loop */ - void GameLoop(void); + /** returns true if the game is paused */ + bool IsFreezed(); /** Draws the Visible windows in the Windows Array */ void DrawWindows(void); /** Sends a termination signal to the Video Driver */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-03 21:11:33
|
Revision: 5926 http://gemrb.svn.sourceforge.net/gemrb/?rev=5926&view=rev Author: avenger_teambg Date: 2009-05-03 21:11:23 +0000 (Sun, 03 May 2009) Log Message: ----------- updated area projectile drawing (now it handles icestorm better) 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 2009-05-03 21:04:28 UTC (rev 5925) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-05-03 21:11:23 UTC (rev 5926) @@ -142,6 +142,7 @@ if (a && c!=Cycle) { a->MirrorAnimation(); } + a->gameAnimation = true; anims[Cycle] = a; } } @@ -316,7 +317,7 @@ if (Extension->AFlags&PAF_TRIGGER) { phase = P_TRIGGER; } else { - phase = P_EXPLODING; + phase = P_EXPLODING1; } } @@ -467,11 +468,11 @@ { if (area->GetActorInRadius(Pos, CalculateTargetFlag(), radius)) { if (phase == P_TRIGGER) { - phase = P_EXPLODING; + phase = P_EXPLODING1; extension_delay = Extension->Delay; } } else { - if (phase == P_EXPLODING) { + if (phase == P_EXPLODING1) { //the explosion is revoked if (Extension->AFlags&PAF_SYNC) { phase = P_TRIGGER; @@ -543,14 +544,14 @@ switch (phase) { case P_UNINITED: return; - case P_TRIGGER: case P_EXPLODING: + case P_TRIGGER: case P_EXPLODING1:case P_EXPLODING2: //This extension flag is to enable the travel projectile at //trigger/explosion time if (Extension->AFlags&PAF_VISIBLE) { DrawTravel(screen); } CheckTrigger(Extension->TriggerRadius); - if (phase == P_EXPLODING) { + if (phase == P_EXPLODING1 || phase == P_EXPLODING2) { DrawExplosion(screen); } break; @@ -598,6 +599,11 @@ } } + int pause = core->IsFreezed(); + if (pause) { + return; + } + //Delay explosion, it could even be revoked with PAF_SYNC (see skull trap) if (extension_delay) { extension_delay--; @@ -609,12 +615,6 @@ extension_explosioncount--; } - if (extension_explosioncount) { - extension_delay=Extension->Delay; - } else { - phase = P_EXPLODED; - } - //no idea what is PAF_SECONDARY //probably it is to alter some behaviour in the secondary //projectile generation @@ -646,25 +646,34 @@ } //the center of the explosion is based on hardcoded explosion type (this is fireball.cpp in the original engine) - //these resources are listed in areapro.2da + //these resources are listed in areapro.2da and served by ProjectileServer.cpp if (Extension->ExplType!=0xff) { - //the center animation is in the second column - ieResRef const *res = server->GetExplosion(Extension->ExplType, 1); - //FIXME: * should return a NULL - if (res) { - ScriptedAnimation* vvc = gamedata->GetScriptedAnimation(*res, false); - if (vvc) { - vvc->XPos+=Pos.x; - vvc->YPos+=Pos.y; - area->AddVVCell(vvc); + ieResRef const *res; + int apflags = server->GetExplosionPalette(Extension->ExplType); + + //draw it only once, at the time of explosion + if (phase==P_EXPLODING1) { + //the center animation is in the second column + res = server->GetExplosion(Extension->ExplType, 1); + if (res) { + ScriptedAnimation* vvc = gamedata->GetScriptedAnimation(*res, false); + if (vvc) { + if (apflags & APF_VVCPAL) { + vvc->SetPalette(Extension->ExplColor); + } + vvc->XPos+=Pos.x; + vvc->YPos+=Pos.y; + vvc->PlayOnce(); + area->AddVVCell(vvc); + } } + phase=P_EXPLODING2; } //the spreading animation is in the first column res = server->GetExplosion(Extension->ExplType, 0); //returns if the explosion animation is fake coloured if (res) { - int apflags = server->GetExplosionPalette(Extension->ExplType); if (!children) { child_size=(Extension->ExplosionRadius+15)/16; //more sprites if the whole area needs to be filled @@ -672,7 +681,6 @@ children = (Projectile **) calloc(sizeof(Projectile *), child_size); } - for(int i=0;i<child_size;i++) { //leave this slot free, it is residue from the previous flare up @@ -700,7 +708,11 @@ if (i&1) vx=-vx; if (i&2) vy=-vy; Point newdest(Destination.x+vx, Destination.y+vy ); - pro->MoveTo(area, Pos); + if (apflags&APF_SCATTER) { + pro->MoveTo(area, newdest); + } else { + pro->MoveTo(area, Pos); + } pro->SetTarget(newdest); pro->autofree=true; @@ -712,13 +724,19 @@ pro->StaticTint(tmpColor[PALSIZE/2]); //i'm unsure if we need blending for all anims or just the tinted ones - pro->TFlags|=PTF_BLEND; } + pro->TFlags|=PTF_BLEND; pro->Setup(); children[i]=pro; } } } + + if (extension_explosioncount) { + extension_delay=Extension->Delay; + } else { + phase = P_EXPLODED; + } } int Projectile::GetTravelPos(int face) Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.h 2009-05-03 21:04:28 UTC (rev 5925) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.h 2009-05-03 21:11:23 UTC (rev 5926) @@ -52,16 +52,17 @@ //projectile phases #define P_UNINITED -1 -#define P_TRAVEL 0 //projectile moves to target -#define P_TRIGGER 1 //projectile hovers over target, waits for trigger -#define P_EXPLODING 2 //projectile explosion spreads -#define P_EXPLODED 3 //projectile spread over area -#define P_EXPIRED 99 //projectile scheduled for removal (existing parts are still drawn) +#define P_TRAVEL 0 //projectile moves to target +#define P_TRIGGER 1 //projectile hovers over target, waits for trigger +#define P_EXPLODING1 2 //projectile explosion spreads +#define P_EXPLODING2 3 //projectile explosion repeats +#define P_EXPLODED 4 //projectile spread over area +#define P_EXPIRED 99 //projectile scheduled for removal (existing parts are still drawn) //projectile spark flags #define PSF_SPARKS 1 #define PSF_FLYING 2 -#define PSF_LOOPING 4 //looping sound +#define PSF_LOOPING 4 //looping sound #define PSF_IGNORE_CENTER 16 //projectile travel flags @@ -72,6 +73,11 @@ #define PTF_LIGHT 64 //has light shadow #define PTF_BLEND 128 //blend colours +//gemrb specific projectile travel flags +//these flags are arbitrary, I start assigning them from backwards to avoid +//collision with existing flags (if possible) +#define PTF_FREEZE 0x80000000 + //projectile area flags #define PAF_VISIBLE 1 //the travel projectile is visible until explosion #define PAF_INANIMATE 2 //target inanimates @@ -83,12 +89,18 @@ #define PAF_PARTY 128 //target party #define PAF_TARGET (64|128) -//gemrb flag -#define PTF_FREEZE 0x80000000 //area projectile flags (in areapro.2da) -#define APF_PALETTE 1 //child projectiles need to be tinted -#define APF_FILL 2 //child projectiles fill the whole area +//this functionality was hardcoded in the original engine, so the bit flags are +//completely arbitrary (i assign them as need arises) +//child projectiles need to be tinted (example: stinking cloud, counter example: fireball) +#define APF_PALETTE 1 +//child projectiles fill the whole area (example: stinking cloud, counter example: fireball) +#define APF_FILL 2 +//child projectiles start in their destination (example: icestorm, counter example: fireball) +#define APF_SCATTER 4 +//the explosion vvc has gradient (example: icestorm, counter example: fireball) +#define APF_VVCPAL 8 struct ProjectileExtension { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-05-15 16:04:39
|
Revision: 5971 http://gemrb.svn.sourceforge.net/gemrb/?rev=5971&view=rev Author: fuzzie Date: 2009-05-15 16:04:26 +0000 (Fri, 15 May 2009) Log Message: ----------- don't unlock doors or remove keys when opening locked doors in PS:T Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-05-15 13:10:28 UTC (rev 5970) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-05-15 16:04:26 UTC (rev 5971) @@ -2167,8 +2167,8 @@ return; //don't open door } - //remove the key - if (door->Flags&DOOR_KEY) { + // remove the key (but not in PS:T!) + if (!core->HasFeature(GF_REVERSE_DOOR) && door->Flags&DOOR_KEY) { CREItem *item = NULL; actor->inventory.RemoveItem(Key,0,&item); //the item should always be existing!!! Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-15 13:10:28 UTC (rev 5970) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-15 16:04:26 UTC (rev 5971) @@ -1438,7 +1438,11 @@ } if (Open) { LastEntered = ID; //used as lastOpener - SetDoorLocked(FALSE,playsound); + + // in PS:T, opening a door does not unlock it + if (!core->HasFeature(GF_REVERSE_DOOR)) { + SetDoorLocked(FALSE,playsound); + } } else { LastTrigger = ID; //used as lastCloser } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-17 19:43:06
|
Revision: 5993 http://gemrb.svn.sourceforge.net/gemrb/?rev=5993&view=rev Author: avenger_teambg Date: 2009-05-17 19:42:49 +0000 (Sun, 17 May 2009) Log Message: ----------- DS_AREA flag (for floating text that doesn't stick on the target) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-05-17 19:31:35 UTC (rev 5992) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-05-17 19:42:49 UTC (rev 5993) @@ -1405,7 +1405,7 @@ if (Sender->Type==ST_ACTOR) { DisplayStringCore( target, parameters->int0Parameter, DS_CONSOLE); } else { - DisplayStringCore( target, parameters->int0Parameter, DS_CONSOLE|DS_HEAD); + DisplayStringCore( target, parameters->int0Parameter, DS_AREA); } } Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-17 19:31:35 UTC (rev 5992) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-17 19:42:49 UTC (rev 5993) @@ -355,6 +355,15 @@ Sender->DisplayHeadText( sb.text ); //don't free sb.text, it is residing in Sender } else { + if (flags&DS_AREA) { + GameControl *gc = core->GetGameControl(); + if (gc) { + Point p; + + GetPositionFromScriptable(Sender,p,0); + gc->DisplayString(p, sb.text); + } + } core->FreeString( sb.text ); } } Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-05-17 19:31:35 UTC (rev 5992) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-05-17 19:42:49 UTC (rev 5993) @@ -42,6 +42,7 @@ #define DS_NONAME 16 #define DS_SILENT 32 #define DS_SPEECH 64 +#define DS_AREA 128 //verbal constant (bg2), we need a lookup table for other games #define VB_PANIC 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-05-21 20:38:38
|
Revision: 6032 http://gemrb.svn.sourceforge.net/gemrb/?rev=6032&view=rev Author: zefklop Date: 2009-05-21 20:38:24 +0000 (Thu, 21 May 2009) Log Message: ----------- Take actors size into account anywhere it is needed :) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-21 20:07:16 UTC (rev 6031) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-21 20:38:24 UTC (rev 6032) @@ -2784,7 +2784,8 @@ WeaponInfo wi; ITMExtHeader *header; //can't reach target, zero range shouldn't be allowed - if (GetWeapon(header, &wi, leftorright)*10<PersonalDistance(this, target)+1) { + //Don't forget to take size of the opponents into account + if ((GetWeapon(header, &wi, leftorright)*10+(size + target->size)*5)<PersonalDistance(this, target)) { return; } ieDword Flags; Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-21 20:07:16 UTC (rev 6031) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-21 20:38:24 UTC (rev 6032) @@ -1191,10 +1191,11 @@ //if distance is too much, insert a move action and requeue the action ITMExtHeader *header; - unsigned int wrange = actor->GetWeapon(header, NULL)*10; + unsigned int wrange = actor->GetWeapon(header, NULL) * 10; if ( target->Type == ST_DOOR || target->Type == ST_CONTAINER) { wrange = 10; } + wrange += actor->size * 5 ; Actor *tar = NULL; ieDword targetID = 0; @@ -1217,10 +1218,10 @@ //action performed if(target->Type == ST_ACTOR) { actor->SetTarget( target ); - wrange += ((Actor*)target)->size*5; + wrange += ((Actor*)target)->size * 5 ; } - if ( PersonalDistance(Sender, target) > wrange ) { + if ( PersonalDistance(Sender, target) > wrange) { //we couldn't perform the action right now //so we add it back to the queue with an additional movement //increases refcount of Sender->CurrentAction, by pumping it back This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-22 16:22:03
|
Revision: 6042 http://gemrb.svn.sourceforge.net/gemrb/?rev=6042&view=rev Author: avenger_teambg Date: 2009-05-22 16:21:49 +0000 (Fri, 22 May 2009) Log Message: ----------- SetPortrait will set the EF_PORTRAIT flag Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-22 14:50:21 UTC (rev 6041) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-22 16:21:49 UTC (rev 6042) @@ -3602,6 +3602,32 @@ memcpy(ar,DefaultButtons,3*sizeof(ieByte) ); } +void Actor::SetPortrait(const char* ResRef, int Which) +{ + int i; + + if (ResRef == NULL) { + return; + } + if (InParty) { + core->SetEventFlag(EF_PORTRAIT); + } + + if(Which!=1) { + memset( SmallPortrait, 0, 8 ); + strncpy( SmallPortrait, ResRef, 8 ); + } + if(Which!=2) { + memset( LargePortrait, 0, 8 ); + strncpy( LargePortrait, ResRef, 8 ); + } + if(!Which) { + for (i = 0; i < 8 && ResRef[i]; i++) {}; + SmallPortrait[i] = 'S'; + LargePortrait[i] = 'M'; + } +} + void Actor::SetSoundFolder(const char *soundset) { if (core->HasFeature(GF_SOUNDFOLDERS)) { @@ -3952,8 +3978,8 @@ anims->SetWeaponType(WeaponType); SetAttackMoveChances(MeleeAnimation); if (InParty) { - //update the paperdoll weapon animation - core->SetEventFlag(EF_UPDATEANIM); + //update the paperdoll weapon animation + core->SetEventFlag(EF_UPDATEANIM); } ITMExtHeader *header ; GetWeapon(header, NULL) ; @@ -3977,8 +4003,8 @@ anims->SetOffhandRef(AnimationType); anims->SetWeaponType(WeaponType); if (InParty) { - //update the paperdoll weapon animation - core->SetEventFlag(EF_UPDATEANIM); + //update the paperdoll weapon animation + core->SetEventFlag(EF_UPDATEANIM); } } @@ -3989,8 +4015,8 @@ return; anims->SetHelmetRef(AnimationType); if (InParty) { - //update the paperdoll weapon animation - core->SetEventFlag(EF_UPDATEANIM); + //update the paperdoll weapon animation + core->SetEventFlag(EF_UPDATEANIM); } } Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-22 14:50:21 UTC (rev 6041) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-22 16:21:49 UTC (rev 6042) @@ -307,27 +307,7 @@ } /** Sets the Icon ResRef */ //Which - 0 both, 1 Large, 2 Small - void SetPortrait(const char* ResRef, int Which=0) - { - int i; - - if (ResRef == NULL) { - return; - } - if(Which!=1) { - memset( SmallPortrait, 0, 8 ); - strncpy( SmallPortrait, ResRef, 8 ); - } - if(Which!=2) { - memset( LargePortrait, 0, 8 ); - strncpy( LargePortrait, ResRef, 8 ); - } - if(!Which) { - for (i = 0; i < 8 && ResRef[i]; i++) {}; - SmallPortrait[i] = 'S'; - LargePortrait[i] = 'M'; - } - } + void SetPortrait(const char* ResRef, int Which=0); void SetSoundFolder(const char *soundset); /** Gets the Character Long Name/Short Name */ char* GetName(int which) const This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-05-23 22:43:31
|
Revision: 6084 http://gemrb.svn.sourceforge.net/gemrb/?rev=6084&view=rev Author: fuzzie Date: 2009-05-23 22:43:23 +0000 (Sat, 23 May 2009) Log Message: ----------- better implementation of DS_AREA Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-23 20:56:05 UTC (rev 6083) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-23 22:43:23 UTC (rev 6084) @@ -176,6 +176,7 @@ core->FreeString( overHeadText ); } overHeadText = (char *) text; + overHeadTextPos.empty(); if (text) { timeStartDisplaying = core->GetGame()->Ticks; textDisplaying = 1; @@ -186,6 +187,12 @@ } } +/* 'fix' the current overhead text in the current position */ +void Scriptable::FixHeadTextPos() +{ + overHeadTextPos = Pos; +} + #define MAX_DELAY 6000 static const Color black={0,0,0,0}; @@ -215,7 +222,16 @@ cs = ((Selectable *) this)->size*50; } - Region rgn( Pos.x-100+screen.x, Pos.y - cs + screen.y, 200, 400 ); + short x, y; + if (overHeadTextPos.isempty()) { + x = Pos.x; + y = Pos.y; + } else { + x = overHeadTextPos.x; + y = overHeadTextPos.y; + } + + Region rgn( x-100+screen.x, y - cs + screen.y, 200, 400 ); font->Print( rgn, ( unsigned char * ) overHeadText, palette?palette:core->InfoTextPalette, IE_FONT_ALIGN_CENTER | IE_FONT_ALIGN_TOP, false ); gamedata->FreePalette(palette); Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-05-23 20:56:05 UTC (rev 6083) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-05-23 22:43:23 UTC (rev 6084) @@ -189,6 +189,7 @@ ieStrRef DialogName; GameScript* Scripts[MAX_SCRIPTS]; char* overHeadText; + Point overHeadTextPos; unsigned char textDisplaying; unsigned long timeStartDisplaying; ieDword UnselectableTimer; @@ -233,6 +234,7 @@ void SetMap(Map *map); void SetScript(int index, GameScript* script); void DisplayHeadText(const char* text); + void FixHeadTextPos(); void SetScriptName(const char* text); //call this to deny script running in the next AI cycle void DelayedEvent(); Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-23 20:56:05 UTC (rev 6083) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-23 22:43:23 UTC (rev 6084) @@ -351,28 +351,14 @@ core->DisplayStringName( Strref, 0xf0f0f0, Sender, 0); } } - if (flags & DS_HEAD) { + if (flags & (DS_HEAD | DS_AREA)) { Sender->DisplayHeadText( sb.text ); //don't free sb.text, it is residing in Sender - } else { - GameControl *gc = NULL; - - if (flags&DS_AREA) { - gc = core->GetGameControl(); + if (flags & DS_AREA) { + Sender->FixHeadTextPos(); } - - //if gc was not needed, or didn't resolve, free the string - //otherwise display it in the area - if (gc) { - Point p; - - GetPositionFromScriptable(Sender,p,0); - gc->DisplayString(p, sb.text); - //don't free sb.text, it is residing in Sender - } else { - //we free the text since it isn't used anymore - core->FreeString( sb.text ); - } + } else { + core->FreeString( sb.text ); } } if (sb.Sound[0] && !(flags&DS_SILENT) ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-05-23 22:58:12
|
Revision: 6085 http://gemrb.svn.sourceforge.net/gemrb/?rev=6085&view=rev Author: fuzzie Date: 2009-05-23 22:58:04 +0000 (Sat, 23 May 2009) Log Message: ----------- draw actor overhead text after fog Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Map.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-23 22:43:23 UTC (rev 6084) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-23 22:58:04 UTC (rev 6085) @@ -3444,9 +3444,6 @@ //draw videocells over the actor DrawVideocells(screen, vvcOverlays, tint); - - //text feedback - DrawOverheadText(screen); } /* Handling automatic stance changes */ Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-05-23 22:43:23 UTC (rev 6084) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-05-23 22:58:04 UTC (rev 6085) @@ -968,6 +968,15 @@ dr->DrawOverheadText(screen); } + size_t i = actors.size(); + while (i--) { + //For each Actor present + //This must go AFTER the fog! + //(maybe we should be using the queue?) + Actor* actor = actors[i]; + actor->DrawOverheadText(screen); + } + oldgametime=gametime; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-05-24 16:02:30
|
Revision: 6091 http://gemrb.svn.sourceforge.net/gemrb/?rev=6091&view=rev Author: zefklop Date: 2009-05-24 16:02:20 +0000 (Sun, 24 May 2009) Log Message: ----------- Do launch projectiles with arrows. Breaking a stacked item will unstack it, and it will break if there is nothing left :) Untested with crossbows and slings, anyway this is still a big WIP. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp gemrb/trunk/gemrb/plugins/Core/Item.cpp gemrb/trunk/gemrb/plugins/Core/Item.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-24 16:02:20 UTC (rev 6091) @@ -2863,6 +2863,7 @@ //critical success DisplayStringCore(this, VB_CRITHIT, DS_CONSOLE|DS_CONST ); DealDamage (target, damage, damagetype, &wi, true); + UseItem(inventory.GetEquippedSlot(), Flags&WEAPON_RANGED?-2:-1, target, false) ; return; } tohit += roll; @@ -2879,6 +2880,7 @@ return; } DealDamage (target, damage, damagetype, &wi, false); + UseItem(inventory.GetEquippedSlot(), Flags&WEAPON_RANGED?-2:-1, target, false) ; } static const int weapon_damagetype[] = {DAMAGE_CRUSHING, DAMAGE_PIERCING, Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-24 16:02:20 UTC (rev 6091) @@ -431,7 +431,7 @@ } CREItem *returned = new CREItem(*item); - item->Usages[0]=(ieWord) (item->Usages[0]-count); + item->Usages[0]-=count; returned->Usages[0]=(ieWord) count; return returned; } @@ -1219,9 +1219,14 @@ const Item *itm = GetItemPointer(slot, Slot); if (!itm) return; memcpy(newItem, itm->ReplacementItem,sizeof(newItem) ); - gamedata->FreeItem( itm, Slot->ItemResRef, true ); - //this depends on setslotitemres using setslotitem - SetSlotItemRes(newItem, slot, 0,0,0); + //remove one item + RemoveItem(slot, 1) ; + //and if there are no more of them, break it! + if(!Slots[slot]) { + gamedata->FreeItem( itm, Slot->ItemResRef, true ); + //this depends on setslotitemres using setslotitem + SetSlotItemRes(newItem, slot, 0,0,0); + } } void Inventory::dump() Modified: gemrb/trunk/gemrb/plugins/Core/Item.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.cpp 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Item.cpp 2009-05-24 16:02:20 UTC (rev 6091) @@ -123,10 +123,12 @@ ITMExtHeader *ieh = GetExtHeader(header); if (!ieh) return 0; int type = ieh->ChargeDepletion; - int ccount = Charges[header]; - if (header>=CHARGE_COUNTERS) { + + int ccount = 0; + if ((header>=CHARGE_COUNTERS) || (header<0/*weapon header*/)) { header = 0; } + ccount=Charges[header] ; //if the item started from 0 charges, then it isn't depleting if (ieh->Charges==0) { @@ -136,6 +138,7 @@ Charges[header] = --ccount; } + printf("ccount is %d", ccount) ; if (ccount>0) { return CHG_NONE; } Modified: gemrb/trunk/gemrb/plugins/Core/Item.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.h 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Item.h 2009-05-24 16:02:20 UTC (rev 6091) @@ -231,8 +231,11 @@ int UseCharge(ieWord *Charges, int header, bool expend) const; //returns the requested extended header - ITMExtHeader *GetExtHeader(unsigned int which) const + //-1 will return melee weapon header, -2 the ranged one + ITMExtHeader *GetExtHeader(int which) const { + if(which < 0) + return GetWeaponHeader(which == -2) ; if(ExtHeaderCount<=which) { return NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-26 16:42:15
|
Revision: 6106 http://gemrb.svn.sourceforge.net/gemrb/?rev=6106&view=rev Author: avenger_teambg Date: 2009-05-26 16:42:07 +0000 (Tue, 26 May 2009) Log Message: ----------- new state: LOCKED_PRESSED (needs because portraits don't sink but they are draggable) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Button.cpp gemrb/trunk/gemrb/plugins/Core/Button.h Modified: gemrb/trunk/gemrb/plugins/Core/Button.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.cpp 2009-05-25 20:35:41 UTC (rev 6105) +++ gemrb/trunk/gemrb/plugins/Core/Button.cpp 2009-05-26 16:42:07 UTC (rev 6106) @@ -30,7 +30,6 @@ Button::Button() { Unpressed = Pressed = Selected = Disabled = NULL; - //this->Clear = Clear; State = IE_GUI_BUTTON_UNPRESSED; ResetEventHandler( ButtonOnPress ); ResetEventHandler( ButtonOnDoublePress ); @@ -86,6 +85,7 @@ switch (type) { case IE_GUI_BUTTON_UNPRESSED: case IE_GUI_BUTTON_LOCKED: + case IE_GUI_BUTTON_LOCKED_PRESSED: core->GetVideoDriver()->FreeSprite( Unpressed ); Unpressed = img; break; @@ -157,6 +157,7 @@ switch (State) { case IE_GUI_BUTTON_UNPRESSED: case IE_GUI_BUTTON_LOCKED: + case IE_GUI_BUTTON_LOCKED_PRESSED: Image = Unpressed; break; @@ -257,7 +258,7 @@ if (State == IE_GUI_BUTTON_DISABLED) ppoi = disabled_palette; - // FIXME: hopefully there's no button which sunks when selected + // FIXME: hopefully there's no button which sinks when selected // AND has text label //else if (State == IE_GUI_BUTTON_PRESSED || State == IE_GUI_BUTTON_SELECTED) { @@ -296,13 +297,13 @@ /** Sets the Button State */ void Button::SetState(unsigned char state) { - if (state > IE_GUI_BUTTON_SECOND) {// If wrong value inserted + if (state > IE_GUI_BUTTON_LOCKED_PRESSED) {// If wrong value inserted return; } if (State != state) { Changed = true; + State = state; } - State = state; } void Button::SetBorder(int index, int dx1, int dy1, int dx2, int dy2, const Color &color, bool enabled, bool filled) { @@ -386,10 +387,10 @@ drag_start.y = Owner->YPos + YPos + y; if (State == IE_GUI_BUTTON_LOCKED) { + SetState( IE_GUI_BUTTON_LOCKED_PRESSED ); return; } - State = IE_GUI_BUTTON_PRESSED; - Changed = true; + SetState( IE_GUI_BUTTON_PRESSED ); if (Flags & IE_GUI_BUTTON_SOUND) { core->PlaySound( DS_BUTTON_PRESSED ); } @@ -422,12 +423,17 @@ if (core->GetDraggedItem () && !ButtonOnDragDrop[0]) return; - if (State == IE_GUI_BUTTON_PRESSED) { + switch (State) { + case IE_GUI_BUTTON_PRESSED: if (ToggleState) { SetState( IE_GUI_BUTTON_SELECTED ); } else { SetState( IE_GUI_BUTTON_UNPRESSED ); } + break; + case IE_GUI_BUTTON_LOCKED_PRESSED: + SetState( IE_GUI_BUTTON_LOCKED ); + break; } if (( x >= Width ) || ( y >= Height )) { return; @@ -497,7 +503,9 @@ Owner->Cursor = IE_CURSOR_NORMAL; - if ((Flags & IE_GUI_BUTTON_DRAGGABLE) && (State == IE_GUI_BUTTON_PRESSED)) { + //portrait buttons are draggable and locked + if ((Flags & IE_GUI_BUTTON_DRAGGABLE) && + (State == IE_GUI_BUTTON_PRESSED || State ==IE_GUI_BUTTON_LOCKED_PRESSED)) { // We use absolute screen position here, so drag_start // remains valid even after window/control is moved int dx = Owner->XPos + XPos + x - drag_start.x; @@ -614,11 +622,10 @@ return; } //other buttons, nothing to redraw if (ToggleState) { - State = IE_GUI_BUTTON_SELECTED; + SetState(IE_GUI_BUTTON_SELECTED); } else { - State = IE_GUI_BUTTON_UNPRESSED; + SetState(IE_GUI_BUTTON_UNPRESSED); } - Changed = true; } /** Sets the Picture */ void Button::SetPicture(Sprite2D* newpic) Modified: gemrb/trunk/gemrb/plugins/Core/Button.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.h 2009-05-25 20:35:41 UTC (rev 6105) +++ gemrb/trunk/gemrb/plugins/Core/Button.h 2009-05-26 16:42:07 UTC (rev 6106) @@ -47,6 +47,7 @@ // Draws the disabled bitmap, but otherwise works like unpressed #define IE_GUI_BUTTON_THIRD 5 #define IE_GUI_BUTTON_SECOND 6 +#define IE_GUI_BUTTON_LOCKED_PRESSED 7 //all the same as LOCKED #define IE_GUI_BUTTON_NO_IMAGE 0x00000001 // don't draw image (BAM) #define IE_GUI_BUTTON_PICTURE 0x00000002 // draw picture (BMP, MOS, ...) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-05-26 19:35:27
|
Revision: 6112 http://gemrb.svn.sourceforge.net/gemrb/?rev=6112&view=rev Author: fuzzie Date: 2009-05-26 19:34:26 +0000 (Tue, 26 May 2009) Log Message: ----------- parse some resdata.ini data into AvatarTable Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp gemrb/trunk/gemrb/plugins/Core/CharAnimations.h Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2009-05-26 19:15:05 UTC (rev 6111) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2009-05-26 19:34:26 UTC (rev 6112) @@ -308,11 +308,11 @@ PaletteResRef[0]=0; //handling special palettes like MBER_BL (black bear) if (PType!=1) { - if (GetAnimType()==IE_ANI_NINE_FRAMES) { - snprintf(PaletteResRef,9,"%.4s_%-.2s%s",ResRef, (char *) &PType, StancePrefix[StanceID]); - } else { - snprintf(PaletteResRef,9,"%.4s_%-.2s",ResRef, (char *) &PType); - } + if (GetAnimType()==IE_ANI_NINE_FRAMES) { + snprintf(PaletteResRef,9,"%.4s_%-.2s%s",ResRef, (char *) &PType, StancePrefix[StanceID]); + } else { + snprintf(PaletteResRef,9,"%.4s_%-.2s",ResRef, (char *) &PType); + } strlwr(PaletteResRef); Palette *tmppal = gamedata->GetPalette(PaletteResRef); if (tmppal) { @@ -387,6 +387,7 @@ } AvatarTable = (AvatarStruct *) calloc ( AvatarsCount = Avatars->GetRowCount(), sizeof(AvatarStruct) ); int i=AvatarsCount; + DataFileMgr *resdata = core->GetResDataINI(); while(i--) { AvatarTable[i].AnimID=(unsigned int) strtol(Avatars->GetRowName(i),NULL,0 ); strnlwrcpy(AvatarTable[i].Prefixes[0],Avatars->QueryField(i,AV_PREFIX1),8); @@ -407,6 +408,23 @@ AvatarTable[i].PaletteType=atoi(Avatars->QueryField(i,AV_USE_PALETTE) ); } AvatarTable[i].Size=Avatars->QueryField(i,AV_SIZE)[0]; + + AvatarTable[i].WalkScale = 0; + AvatarTable[i].RunScale = 0; + AvatarTable[i].Bestiary = -1; + + if (resdata) { + char section[12]; + snprintf(section,10,"%d", i); + + if (!resdata->GetKeysCount(section)) continue; + + float walkscale = resdata->GetKeyAsFloat(section, "walkscale", 0.0f); + if (walkscale != 0.0f) AvatarTable[i].WalkScale = (int)(1000.0f / walkscale); + float runscale = resdata->GetKeyAsFloat(section, "runscale", 0.0f); + if (runscale != 0.0f) AvatarTable[i].RunScale = (int)(1000.0f / runscale); + AvatarTable[i].Bestiary = resdata->GetKeyAsInt(section, "bestiary", -1); + } } } @@ -419,7 +437,7 @@ palette[i] = NULL; } nextStanceID = 0; - StanceID = 0; + StanceID = 0; autoSwitchOnEnd = false; lockPalette = false; if (!AvatarsCount) { Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.h 2009-05-26 19:15:05 UTC (rev 6111) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.h 2009-05-26 19:34:26 UTC (rev 6112) @@ -116,6 +116,11 @@ unsigned char AnimationType; unsigned char CircleSize; char Size; + + /* resdata entries */ + unsigned int WalkScale; /* 1000 / walkscale */ + unsigned int RunScale; /* 1000 / runscale */ + int Bestiary; }; struct EquipResRefData; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-27 17:48:14
|
Revision: 6127 http://gemrb.svn.sourceforge.net/gemrb/?rev=6127&view=rev Author: avenger_teambg Date: 2009-05-27 17:47:21 +0000 (Wed, 27 May 2009) Log Message: ----------- running in pst on doubleclick Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.h Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-05-27 17:38:25 UTC (rev 6126) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-05-27 17:47:21 UTC (rev 6127) @@ -226,7 +226,11 @@ p.y*=12; } // generate an action to do the actual movement - sprintf( Tmp, "MoveToPoint([%d.%d])", p.x, p.y ); + if (DoubleClick) { + sprintf( Tmp, "RunToPoint([%d.%d])", p.x, p.y ); + } else { + sprintf( Tmp, "MoveToPoint([%d.%d])", p.x, p.y ); + } actor->AddAction( GenerateAction( Tmp) ); } @@ -1509,6 +1513,7 @@ short px=x; short py=y; + DoubleClick = false; switch(Button) { case GEM_MB_SCRLUP: @@ -1517,6 +1522,8 @@ case GEM_MB_SCRLDOWN: OnSpecialKeyPress(GEM_DOWN); break; + case GEM_MB_ACTION|GEM_MB_DOUBLECLICK: + DoubleClick = true; case GEM_MB_ACTION: core->GetVideoDriver()->ConvertToGame( px, py ); MouseIsDown = true; @@ -1578,6 +1585,7 @@ core->GetGUIScriptEngine()->RunFunction( "OpenFloatMenuWindow" ); return; } + if (Button != GEM_MB_ACTION) { return; } @@ -1608,7 +1616,12 @@ actor=game->selected[0]; actor->ClearPath(); actor->ClearActions(); - sprintf( Tmp, "MoveToPoint([%d.%d])", p.x, p.y ); + if (DoubleClick) { + sprintf( Tmp, "RunToPoint([%d.%d])", p.x, p.y ); + } else { + sprintf( Tmp, "MoveToPoint([%d.%d])", p.x, p.y ); + } + actor->AddAction( GenerateAction( Tmp) ); //p is a searchmap travel region if ( actor->GetCurrentArea()->GetCursor(p) == IE_CURSOR_TRAVEL) { Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.h 2009-05-27 17:38:25 UTC (rev 6126) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.h 2009-05-27 17:47:21 UTC (rev 6127) @@ -119,6 +119,7 @@ std::vector< Actor*> highlighted; bool DrawSelectionRect; bool MouseIsDown; + bool DoubleClick; Region SelectionRect; short StartX, StartY; //int action; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-27 18:16:20
|
Revision: 6128 http://gemrb.svn.sourceforge.net/gemrb/?rev=6128&view=rev Author: avenger_teambg Date: 2009-05-27 18:15:31 +0000 (Wed, 27 May 2009) Log Message: ----------- don't create RunToPoint action where it doesn't exist Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.h Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-05-27 17:47:21 UTC (rev 6127) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-05-27 18:15:31 UTC (rev 6128) @@ -185,7 +185,6 @@ //WARNING: don't pass p as a reference because it gets modified void GameControl::MoveToPointFormation(Actor *actor, unsigned int pos, Point src, Point p) { - char Tmp[256]; Map* map = actor->GetCurrentArea() ; int formation=core->GetGame()->GetFormation(); @@ -225,13 +224,27 @@ p.x*=16; p.y*=12; } - // generate an action to do the actual movement + CreateMovement(actor, p); +} + +// generate an action to do the actual movement +// only PST supports RunToPoint +void GameControl::CreateMovement(Actor *actor, Point &p) +{ + char Tmp[256]; + + Action *action = NULL; if (DoubleClick) { sprintf( Tmp, "RunToPoint([%d.%d])", p.x, p.y ); - } else { + action = GenerateAction( Tmp ); + } + if (!action) + { sprintf( Tmp, "MoveToPoint([%d.%d])", p.x, p.y ); + action = GenerateAction( Tmp ); } - actor->AddAction( GenerateAction( Tmp) ); + + actor->AddAction( action ); } GameControl::~GameControl(void) @@ -1616,6 +1629,8 @@ actor=game->selected[0]; actor->ClearPath(); actor->ClearActions(); + CreateMovement(actor, p); +/* if (DoubleClick) { sprintf( Tmp, "RunToPoint([%d.%d])", p.x, p.y ); } else { @@ -1623,6 +1638,7 @@ } actor->AddAction( GenerateAction( Tmp) ); +*/ //p is a searchmap travel region if ( actor->GetCurrentArea()->GetCursor(p) == IE_CURSOR_TRAVEL) { sprintf( Tmp, "NIDSpecial2()" ); Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.h 2009-05-27 17:47:21 UTC (rev 6127) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.h 2009-05-27 18:15:31 UTC (rev 6128) @@ -230,6 +230,8 @@ Point GetFormationOffset(ieDword formation, ieDword pos); void MoveToPointFormation(Actor *actor, unsigned int pos, Point src, Point p); + /** calls MoveToPoint or RunToPoint */ + void CreateMovement(Actor *actor, Point &p); void InitDialog(Scriptable* speaker, Scriptable* target, const char* dlgref); void EndDialog(bool try_to_break=false); void DialogChoose(unsigned int choose); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-28 18:29:52
|
Revision: 6154 http://gemrb.svn.sourceforge.net/gemrb/?rev=6154&view=rev Author: avenger_teambg Date: 2009-05-28 18:29:48 +0000 (Thu, 28 May 2009) Log Message: ----------- moved IsPortal into ActorBlock Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/TileMap.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-28 18:29:45 UTC (rev 6153) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-28 18:29:48 UTC (rev 6154) @@ -1644,21 +1644,33 @@ } } -bool Highlightable::PossibleToSeeTrap() { +bool Highlightable::PossibleToSeeTrap() +{ return CanDetectTrap(); } -bool InfoPoint::PossibleToSeeTrap() { +bool InfoPoint::PossibleToSeeTrap() +{ // Only detectable trap-type infopoints. return (CanDetectTrap() && (Type == ST_PROXIMITY) ); } -bool InfoPoint::CanDetectTrap() { +bool InfoPoint::CanDetectTrap() +{ // Traps can be detected on all types of infopoint, as long // as the trap is detectable and isn't deactivated. return ((Flags&TRAP_DETECTABLE) && !(Flags&TRAP_DEACTIVATED)); } +// returns true if the infopoint is a PS:T portal +// GF_REVERSE_DOOR is the closest game feature (exists only in PST, and about area objects) +bool InfoPoint::IsPortal() +{ + if (Type!=ST_TRAVEL) return false; + if (Cursor != IE_CURSOR_PORTAL) return false; + return !core->HasFeature(GF_REVERSE_DOOR); +} + //trap that is visible on screen (marked by red) //if TrapDetected is a bitflag, we could show traps selectively for //players, really nice for multiplayer Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-05-28 18:29:45 UTC (rev 6153) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-05-28 18:29:48 UTC (rev 6154) @@ -538,6 +538,7 @@ int TrapResets() { return Flags & TRAP_RESET; } bool CanDetectTrap(); bool PossibleToSeeTrap(); + bool IsPortal(); public: ieResRef Destination; Modified: gemrb/trunk/gemrb/plugins/Core/TileMap.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TileMap.cpp 2009-05-28 18:29:45 UTC (rev 6153) +++ gemrb/trunk/gemrb/plugins/Core/TileMap.cpp 2009-05-28 18:29:48 UTC (rev 6154) @@ -552,15 +552,10 @@ if ((ip->Type==ST_PROXIMITY) && !ip->VisibleTrap(0) ) { continue; } - if (ip->Type==ST_TRAVEL) { - // PS:T portals (abusing a GF flag somewhat here..) - if (core->HasFeature(GF_REVERSE_DOOR)) { - if (ip->Cursor == IE_CURSOR_PORTAL) { - // skip portals without PORTAL_CURSOR set - if (!(ip->Trapped & PORTAL_CURSOR)) { - continue; - } - } + if (ip->IsPortal()) { + // skip portals without PORTAL_CURSOR set + if (!(ip->Trapped & PORTAL_CURSOR)) { + continue; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-28 19:54:02
|
Revision: 6157 http://gemrb.svn.sourceforge.net/gemrb/?rev=6157&view=rev Author: avenger_teambg Date: 2009-05-28 19:53:52 +0000 (Thu, 28 May 2009) Log Message: ----------- hardcoded pst portal animation Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/Map.h gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-28 19:28:18 UTC (rev 6156) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-05-28 19:53:52 UTC (rev 6157) @@ -1668,7 +1668,7 @@ { if (Type!=ST_TRAVEL) return false; if (Cursor != IE_CURSOR_PORTAL) return false; - return !core->HasFeature(GF_REVERSE_DOOR); + return core->HasFeature(GF_REVERSE_DOOR); } //trap that is visible on screen (marked by red) Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-05-28 19:28:18 UTC (rev 6156) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-05-28 19:53:52 UTC (rev 6157) @@ -56,6 +56,8 @@ #define YESNO(x) ( (x)?"Yes":"No") +static ieResRef PortalResRef={"EF03TPR3"}; +static unsigned int PortalTime = 15; static unsigned int MAX_CIRCLESIZE = 8; static int MaxVisibility = 30; static int VisibilityPerimeter; //calculated from MaxVisibility @@ -517,6 +519,27 @@ } } +//Draw two overlapped animations to achieve the original effect +//PlayOnce makes sure that if we stop drawing them, they will go away +void Map::DrawPortal(InfoPoint *ip, int enable) +{ + ieDword gotportal = HasVVCCell(PortalResRef, ip->Pos); + + if (enable) { + if (gotportal>PortalTime) return; + ScriptedAnimation *sca = gamedata->GetScriptedAnimation(PortalResRef, false); + if (sca) { + sca->SetBlend(); + sca->PlayOnce(); + sca->XPos=ip->Pos.x; + sca->YPos=ip->Pos.y; + sca->ZPos=gotportal; + AddVVCell(sca); + } + return; + } +} + void Map::UpdateScripts() { // if masterarea, then we allow 'any' actors @@ -666,6 +689,10 @@ continue; } + if (ip->IsPortal()) { + DrawPortal(ip, ip->Trapped&PORTAL_TRAVEL); + } + if (wasActive) { q=Qcount[PR_SCRIPT]; while (q--) { @@ -1675,6 +1702,27 @@ projectiles.insert(iter, pro); } +//returns the longest duration of the VVC cell named 'resource' (if it exists) +//if P is empty, the position won't be checked +ieDword Map::HasVVCCell(const ieResRef resource, Point &p) +{ + scaIterator iter; + ieDword ret = 0; + + for(iter=vvcCells.begin();iter!=vvcCells.end(); iter++) { + if (!p.isempty()) { + if ((*iter)->XPos!=p.x) continue; + if ((*iter)->YPos!=p.y) continue; + } + if (strnicmp(resource, (*iter)->ResName, sizeof(ieResRef) )) continue; + ieDword tmp = (*iter)->GetSequenceDuration(15)-(*iter)->GetCurrentFrame(); + if (tmp>ret) { + ret = tmp; + } + } + return ret; +} + //adding videocell in order, based on its height parameter void Map::AddVVCell(ScriptedAnimation* vvc) { Modified: gemrb/trunk/gemrb/plugins/Core/Map.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.h 2009-05-28 19:28:18 UTC (rev 6156) +++ gemrb/trunk/gemrb/plugins/Core/Map.h 2009-05-28 19:53:52 UTC (rev 6157) @@ -347,6 +347,8 @@ void AddProjectile(Projectile* pro, Point &source, Point &dest); void AddProjectile(Projectile* pro, Point &source, ieWord actorID); + //returns the duration of a VVC cell set in the area (point may be set to empty) + ieDword HasVVCCell(const ieResRef resource, Point &p); void AddVVCell(ScriptedAnimation* vvc); bool CanFree(); int GetCursor( Point &p); @@ -462,6 +464,7 @@ //separated position adjustment, so their order could be randomised */ bool AdjustPositionX(Point &goal, unsigned int radius); bool AdjustPositionY(Point &goal, unsigned int radius); + void DrawPortal(InfoPoint *ip, int enable); }; #endif Modified: gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp 2009-05-28 19:28:18 UTC (rev 6156) +++ gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp 2009-05-28 19:53:52 UTC (rev 6157) @@ -456,6 +456,15 @@ } } +int ScriptedAnimation::GetCurrentFrame() +{ + Animation *anim = anims[P_HOLD*MAX_ORIENT]; + if (anim) { + return anim->GetCurrentFrame(); + } + return 0; +} + ieDword ScriptedAnimation::GetSequenceDuration(ieDword multiplier) { //P_HOLD * MAX_ORIENT == MAX_ORIENT Modified: gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h 2009-05-28 19:28:18 UTC (rev 6156) +++ gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h 2009-05-28 19:53:52 UTC (rev 6157) @@ -116,6 +116,7 @@ void SetSpriteCover(SpriteCover* c) { delete cover; cover = c; } /* get stored SpriteCover */ SpriteCover* GetSpriteCover() const { return cover; } + int GetCurrentFrame(); ieDword GetSequenceDuration(ieDword multiplier); /* sets default duration if it wasn't set yet */ void SetDefaultDuration(unsigned int duration); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2009-05-30 19:41:09
|
Revision: 6192 http://gemrb.svn.sourceforge.net/gemrb/?rev=6192&view=rev Author: mattinm Date: 2009-05-30 19:40:29 +0000 (Sat, 30 May 2009) Log Message: ----------- count on bits in multiclass to determine the true number of classes store multiclass as an ieDword Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-30 17:55:25 UTC (rev 6191) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-30 19:40:29 UTC (rev 6192) @@ -202,6 +202,17 @@ #define WEAPON_LEFTHAND 16 #define WEAPON_USESTRENGTH 32 +/* counts the on bits in a number */ +ieDword bitcount (ieDword n) +{ + ieDword count=0; + while (n) { + count += n & 0x1u; + n >>= 1; + } + return count; +} + void ReleaseMemoryActor() { if (mxsplwis) { @@ -2011,15 +2022,10 @@ } else { if (IsMultiClassed()) { - if (levels[1] > 0) { - classcount++; - average += levels[1]; - } - // TODO: rather deduce the number of classes from the name - if (levels[2] > 0 && (levels[0]-levels[2]) < 5) { //HACK for jaheira (starts as 6-7-1) - classcount++; - average += levels[2]; - } + //classcount is the number of on bits in the MULTI field + classcount = bitcount (multiclass); + for (int i=1; i<classcount; i++) + average += levels[i]; } // else single class } average = average / classcount + 0.5; @@ -4353,23 +4359,29 @@ void Actor::CreateDerivedStats() { + //we have to calculate multiclass for further code + AutoTable tm("classes"); + if (tm) { + // currently we need only the MULTI value + char tmpmulti[8]; + long tmp; + strcpy(tmpmulti, tm->QueryField(tm->FindTableValue(5, BaseStats[IE_CLASS]), 4)); + if (!valid_number(tmpmulti, tmp)) + multiclass = 0; + else + multiclass = (ieDword)tmp; + } + if (core->HasFeature(GF_IWD2_SCRIPTNAME)) { CreateDerivedStatsIWD2(); } else { CreateDerivedStatsBG(); } - AutoTable tm("classes"); - if (tm) { - // currently we need only the MULTI value - strcpy(multiclass, tm->QueryField(tm->FindTableValue(5, BaseStats[IE_CLASS]), 4)); - } } - /* Checks if the actor is multiclassed (the MULTI column is positive) */ bool Actor::IsMultiClassed() const { - long multi2; - return (valid_number(multiclass, multi2) && multi2 > 0); + return (multiclass > 0); } /* Checks if the actor is dualclassed */ Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-30 17:55:25 UTC (rev 6191) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-30 19:40:29 UTC (rev 6192) @@ -218,7 +218,7 @@ char HelmetRef[2]; char WeaponRef[2]; int WeaponType; - char multiclass[8]; + ieDword multiclass; int LastCommand; //lastcommander int LastShout; //lastheard This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-05-30 21:00:36
|
Revision: 6196 http://gemrb.svn.sourceforge.net/gemrb/?rev=6196&view=rev Author: fuzzie Date: 2009-05-30 21:00:07 +0000 (Sat, 30 May 2009) Log Message: ----------- add undocumented KeepCache option (using it probably causes bugs) 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-05-30 20:45:45 UTC (rev 6195) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-05-30 21:00:07 UTC (rev 6196) @@ -168,6 +168,7 @@ GameOnCD = false; SkipIntroVideos = false; DrawFPS = false; + KeepCache = false; TooltipDelay = 100; GUIScriptsPath[0] = 0; GamePath[0] = 0; @@ -447,7 +448,7 @@ delete plugin; // Removing all stuff from Cache, except bifs - DelTree((const char *) CachePath, true); + if (!KeepCache) DelTree((const char *) CachePath, true); } void Interface::SetWindowFrame(int i, Sprite2D *Picture) @@ -1941,6 +1942,8 @@ DrawFPS = ( atoi( value ) == 0 ) ? false : true; } else if (stricmp( name, "EnableCheatKeys" ) == 0) { EnableCheatKeys ( atoi( value ) ); + } else if (stricmp( name, "KeepCache" ) == 0) { + KeepCache = ( atoi( value ) == 0 ) ? false : true; } else if (stricmp( name, "FogOfWar" ) == 0) { FogOfWar = atoi( value ); } else if (stricmp( name, "EndianSwitch" ) == 0) { @@ -2080,7 +2083,7 @@ printf( "Cache path %s doesn't exist, not a folder or contains alien files!\n", CachePath ); return false; } - DelTree((const char *) CachePath, false); + if (!KeepCache) DelTree((const char *) CachePath, false); FixPath( CachePath, true ); return true; @@ -3535,7 +3538,7 @@ WorldMapArray* new_worldmap = NULL; LoadProgress(15); - DelTree((const char *) CachePath, true); + if (!KeepCache) DelTree((const char *) CachePath, true); LoadProgress(20); if (index == -1) { Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-05-30 20:45:45 UTC (rev 6195) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-05-30 21:00:07 UTC (rev 6196) @@ -673,6 +673,7 @@ unsigned int TooltipDelay; unsigned int FogOfWar; bool FullScreen, CaseSensitive, GameOnCD, SkipIntroVideos, DrawFPS; + bool KeepCache; /** The Main program loop */ void Main(void); /** returns true if the game is paused */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2009-05-31 04:12:52
|
Revision: 6204 http://gemrb.svn.sourceforge.net/gemrb/?rev=6204&view=rev Author: mattinm Date: 2009-05-31 04:12:51 +0000 (Sun, 31 May 2009) Log Message: ----------- added GetFighterLevel, GetMageLevel, etc functions pre-caches IE_LEVEL1,2,3 references from classes.2da gets correct backstab and turn undead in bg2 someone else should probably look at this too Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-30 22:26:19 UTC (rev 6203) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-31 04:12:51 UTC (rev 6204) @@ -69,6 +69,8 @@ static int *xpbonus = NULL; static int xpbonustypes = -1; static int xpbonuslevels = -1; +static int **levelslots = NULL; +static int *dualswap = NULL; static int FistRows = -1; typedef ieResRef FistResType[MAX_LEVEL+1]; @@ -101,18 +103,11 @@ //conversion for 3rd ed static int isclass[11]={0,0,0,0,0,0,0,0,0,0,0}; -#define ISBARBARIAN 0 -#define ISBARD 1 -#define ISCLERIC 2 -#define ISDRUID 3 -#define ISFIGHTER 4 -#define ISMONK 5 -#define ISPALADIN 6 -#define ISRANGER 7 -#define ISROGUE 8 -#define ISSORCERER 9 -#define ISWIZARD 10 -static const int levelslots[11]={IE_LEVELFIGHTER,IE_LEVELMAGE,IE_LEVELTHIEF, + +static const char *isclassnames[11] = { + "FIGHTER", "MAGE", "THIEF", "BARBARIAN", "BARD", "CLERIC", + "DRUID", "MONK", "PALADIN", "RANGER", "SORCERER" }; +static const int levelslotsiwd2[11]={IE_LEVELFIGHTER,IE_LEVELMAGE,IE_LEVELTHIEF, IE_LEVELBARBARIAN,IE_LEVELBARD,IE_LEVELCLERIC,IE_LEVELDRUID,IE_LEVELMONK, IE_LEVELPALADIN,IE_LEVELRANGER,IE_LEVELSORCEROR}; @@ -593,17 +588,17 @@ void pcf_level (Actor *actor, ieDword /*oldValue*/, ieDword /*newValue*/) { ieDword sum = - actor->BaseStats[IE_LEVELFIGHTER]+ - actor->BaseStats[IE_LEVELMAGE]+ - actor->BaseStats[IE_LEVELTHIEF]+ - actor->BaseStats[IE_LEVELBARBARIAN]+ - actor->BaseStats[IE_LEVELBARD]+ - actor->BaseStats[IE_LEVELCLERIC]+ - actor->BaseStats[IE_LEVELDRUID]+ - actor->BaseStats[IE_LEVELMONK]+ - actor->BaseStats[IE_LEVELPALADIN]+ - actor->BaseStats[IE_LEVELRANGER]+ - actor->BaseStats[IE_LEVELSORCEROR]; + actor->GetFighterLevel()+ + actor->GetMageLevel()+ + actor->GetThiefLevel()+ + actor->GetBarbarianLevel()+ + actor->GetBardLevel()+ + actor->GetClericLevel()+ + actor->GetDruidLevel()+ + actor->GetMonkLevel()+ + actor->GetPaladinLevel()+ + actor->GetRangerLevel()+ + actor->GetSorcererLevel(); actor->SetBase(IE_CLASSLEVELSUM,sum); //this will be called anyway //actor->SetupFist(); @@ -995,6 +990,19 @@ xpbonuslevels = -1; xpbonustypes = -1; } + if (levelslots) { + for (i=0; i<classcount; i++) { + if (levelslots[i]) { + free(levelslots[i]); + } + } + free(levelslots); + levelslots=NULL; + } + if (dualswap) { + free(dualswap); + dualswap=NULL; + } } if (GUIBTDefaults) { free (GUIBTDefaults); @@ -1014,6 +1022,17 @@ #define COL_SPARKS 1 #define COL_GRADIENT 2 +/* returns the ISCLASS for the class based on name */ +int IsClassFromName (const char* name) +{ + //TODO: is there a better way of doing this? + for (int i=0; i<ISCLASSES; i++) { + if (strcmp(name, isclassnames[i]) == 0) + return i; + } + return -1; +} + static void InitActorTables() { int i, j; @@ -1082,7 +1101,7 @@ field = tm->QueryField( i, 2 ); if (field[0]!='*') { - isclass[ISWIZARD] |= bitmask; + isclass[ISMAGE] |= bitmask; wizardspelltables[i]=strdup(field); } @@ -1236,6 +1255,98 @@ featstats[i] = (ieByte) tmp; } } + + tm.load("classes"); + if (tm && !core->HasFeature(GF_IWD2_SCRIPTNAME)) { + //iwd2 just uses levelslotsiwd2 instead + printf("Examining classes.2da\n"); + + //when searching the levelslots, you must search for + //levelslots[BaseStats[IE_CLASS]-1] as there is no class id of 0 + levelslots = (int **) calloc(classcount, sizeof(int*)); + dualswap = (int *) calloc(classcount, sizeof(int*)); + //default all dualswaps to 0 + memset(dualswap, 0, sizeof(dualswap)); + ieDword tmpindex; + for (i=0; i<classcount; i++) { + //make sure we have a valid classid, then decrement + //it to get the correct array index + tmpindex = atoi(tm->QueryField(i, 5)); + if (!tmpindex) + continue; + tmpindex--; + + printf("\tID: %d ", tmpindex); + //only create the array if it isn't yet made + //i.e. barbarians would overwrite fighters in bg2 + if (levelslots[tmpindex]) { + printf ("Already Found!\n"); + continue; + } + + const char* classname = tm->GetRowName(i); + printf("Name: %s ", classname); + int classis = 0; + //default all levelslots to 0 + levelslots[tmpindex] = (int *) calloc(ISCLASSES, sizeof(int*)); + memset(levelslots[tmpindex], 0, sizeof(levelslots[tmpindex])); + + //single classes only worry about IE_LEVEL + ieDword tmpclass = atoi(tm->QueryField(i, 4)); + if (!tmpclass) { + classis = IsClassFromName(classname); + if (classis>=0) { + printf("Classis: %d ", classis); + levelslots[tmpindex][classis] = IE_LEVEL; + } + printf("DS: %d\n", dualswap[tmpindex]); + continue; + } + + //we have to account for dual-swap in the multiclass field + ieDword numfound = 0; + ieDword tmpbits = bitcount (tmpclass); + for (int j=0; j<classcount; j++) { + //no sense continuing if we've found all to be found + if (numfound==tmpbits) + break; + if ((1<<j)&tmpclass) { + //save the IE_LEVEL information + const char* currentname = tm->GetRowName((ieDword)(tm->FindTableValue(5, j+1))); + classis = IsClassFromName(currentname); + if (classis>=0) { + printf("Classis: %d ", classis); + if (numfound==0) { + levelslots[tmpindex][classis] = IE_LEVEL; + } else if (numfound==1) { + levelslots[tmpindex][classis] = IE_LEVEL2; + } else if (numfound==2) { + levelslots[tmpindex][classis] = IE_LEVEL3; + } + } + + //figure out if this is a dualswap situation + if (numfound==0 && tmpbits==2) { + char* firstclass = (char*)strtok((char*)classname, "_"); + if (strcmp(firstclass, currentname) != 0) { + dualswap[tmpindex] = 1; + } + } + numfound++; + } + } + printf("DS: %d\n", dualswap[tmpindex]); + } + /*this could be enabled to ensure all levelslots are filled with at least 0's; + *however, the access code should ensure this never happens + for (i=0; i<classcount; i++) { + if (!levelslots[i]) { + levelslots[i] = (int *) calloc(ISCLASSES, sizeof(int *)); + memset(levelslots[i], 0, sizeof(levelslots[i])); + } + }*/ + } + printf("Finished examining classes.2da\n"); } void Actor::SetLockedPalette(const ieDword *gradients) @@ -2005,7 +2116,7 @@ if (core->HasFeature(GF_IWD2_SCRIPTNAME)) { // iwd2 for (int i=0; i < 11; i++) { - if (stats[levelslots[i]] > 0) classcount++; + if (stats[levelslotsiwd2[i]] > 0) classcount++; } average = stats[IE_CLASSLEVELSUM] / classcount + 0.5; } @@ -2020,14 +2131,12 @@ average += levels[1]; } } - else { - if (IsMultiClassed()) { + else if (IsMultiClassed()) { //classcount is the number of on bits in the MULTI field classcount = bitcount (multiclass); for (int i=1; i<classcount; i++) average += levels[i]; - } // else single class - } + } //else single classed average = average / classcount + 0.5; } return ieDword(average); @@ -4294,45 +4403,47 @@ //2nd edition rules void Actor::CreateDerivedStatsBG() { - int i; int turnundeadlevel = 0; - int levels[3]={BaseStats[IE_LEVEL],BaseStats[IE_LEVEL2],BaseStats[IE_LEVEL3]}; - int classid = BaseStats[IE_CLASS]; - int slot = 0; //this works only for PC classes if (classid<32) { - for (i=0;i<11;i++) { - //this is not good for multiclassing yet - if ((1<<classid)&isclass[i]) { - BaseStats[levelslots[i]]=levels[slot]; - slot++; - } - } //recalculate all level based changes pcf_level(this,0,0); + //even though the original didn't allow a cleric/paladin dual or multiclass + //we shouldn't restrict the possibility by using "else if" here if (isclass[ISCLERIC]&(1<<classid)) { - turnundeadlevel = BaseStats[IE_LEVELCLERIC]+1-turnlevels[classid]; + turnundeadlevel += GetClericLevel()+1-turnlevels[classid]; if (turnundeadlevel<0) turnundeadlevel=0; } - else if (isclass[ISPALADIN]&(1<<classid)) { - turnundeadlevel = BaseStats[IE_LEVELPALADIN]+1-turnlevels[classid]; + if (isclass[ISPALADIN]&(1<<classid)) { + turnundeadlevel += GetPaladinLevel()+1-turnlevels[classid]; if (turnundeadlevel<0) turnundeadlevel=0; - } else { - turnundeadlevel = 0; } } - ieDword backstabdamagemultiplier=BaseStats[IE_LEVELTHIEF]; + ieDword backstabdamagemultiplier=GetThiefLevel(); if (backstabdamagemultiplier) { - backstabdamagemultiplier=backstabdamagemultiplier+3/4; + AutoTable tm("backstab"); + //fallback to a general algorithm (bg2 backstab.2da version) if we can't find backstab.2da + //TODO: AP_SPCL332 (increase backstab by one) seems to not be effecting this at all + //for assassins perhaps the effect is being called prior to this, and this overwrites it; + //stalkers work correctly, which is even more odd, considering as they use the same + //effect and backstabmultiplier would be 0 for them + if (tm) { + ieDword cols = tm->GetColumnCount(); + if (backstabdamagemultiplier >= cols) backstabdamagemultiplier = cols; + backstabdamagemultiplier = atoi(tm->QueryField(0, backstabdamagemultiplier)); + } else { + backstabdamagemultiplier = (backstabdamagemultiplier+7)/4; + } + printf("\n"); if (backstabdamagemultiplier>7) backstabdamagemultiplier=7; } BaseStats[IE_TURNUNDEADLEVEL]=turnundeadlevel; BaseStats[IE_BACKSTABDAMAGEMULTIPLIER]=backstabdamagemultiplier; - BaseStats[IE_LAYONHANDSAMOUNT]=BaseStats[IE_LEVELPALADIN]*2; + BaseStats[IE_LAYONHANDSAMOUNT]=GetPaladinLevel()*2; } //3rd edition rules @@ -4421,3 +4532,35 @@ newActor->RefreshEffects(newFXQueue); return newActor; } + +ieDword Actor::GetClassLevel(const ieDword id) const { + if (id>=ISCLASSES) + return 0; + + //return iwd2 value if appropriate + if (version==22) + return BaseStats[levelslotsiwd2[id]]; + + //houston, we gots a problem! + if (!levelslots || !dualswap) + return 0; + + //only works with PC's + ieDword classid = BaseStats[IE_CLASS]-1; + if (classid>=(ieDword)classcount || !levelslots[classid]) + return 0; + + //get the levelid (IE_LEVEL,*2,*3) + ieDword levelid = levelslots[classid][id]; + if (!levelid) + return 0; + + //do dual-swap + if (IsDualClassed() && dualswap[classid]) { + if (levelid==IE_LEVEL) + levelid = IE_LEVEL2; + else + levelid = IE_LEVEL; + } + return BaseStats[levelid]; +} Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-30 22:26:19 UTC (rev 6203) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-31 04:12:51 UTC (rev 6204) @@ -136,6 +136,20 @@ #define UI_SILENT 1 //no sound when used up #define UI_MISS 2 //ranged miss (projectile has no effects) +//locations of classes in the isclass/levelslots arrays +#define ISFIGHTER 0 +#define ISMAGE 1 +#define ISTHIEF 2 +#define ISBARBARIAN 3 +#define ISBARD 4 +#define ISCLERIC 5 +#define ISDRUID 6 +#define ISMONK 7 +#define ISPALADIN 8 +#define ISRANGER 9 +#define ISSORCERER 10 +#define ISCLASSES 11 + typedef ieByte ActionButtonRow[GUIBT_COUNT]; typedef std::vector< ScriptedAnimation*> vvcVector; @@ -260,6 +274,8 @@ void CreateDerivedStatsBG(); /* Set up all the missing stats on load time, or after level up */ void CreateDerivedStatsIWD2(); + /* Gets the given ISCLASS level */ + ieDword GetClassLevel (const ieDword id) const; public: Actor(void); ~Actor(void); @@ -530,5 +546,17 @@ bool IsDualClassed() const; /* Returns an exact copy of this actor */ Actor *CopySelf() const; + /* Returns the actor's level of the given class */ + ieDword GetFighterLevel () const { return GetClassLevel(ISFIGHTER); } + ieDword GetMageLevel () const { return GetClassLevel(ISMAGE); } + ieDword GetThiefLevel () const { return GetClassLevel(ISTHIEF); } + ieDword GetBarbarianLevel () const { return GetClassLevel(ISBARBARIAN); } + ieDword GetBardLevel () const { return GetClassLevel(ISBARD); } + ieDword GetClericLevel () const { return GetClassLevel(ISCLERIC); } + ieDword GetDruidLevel () const { return GetClassLevel(ISDRUID); } + ieDword GetMonkLevel () const { return GetClassLevel(ISMONK); } + ieDword GetPaladinLevel () const { return GetClassLevel(ISPALADIN); } + ieDword GetRangerLevel () const { return GetClassLevel(ISRANGER); } + ieDword GetSorcererLevel () const { return GetClassLevel(ISSORCERER); } }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-05-31 15:28:37
|
Revision: 6208 http://gemrb.svn.sourceforge.net/gemrb/?rev=6208&view=rev Author: zefklop Date: 2009-05-31 15:28:35 +0000 (Sun, 31 May 2009) Log Message: ----------- Let's attack with throwing daggers :) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-31 15:16:16 UTC (rev 6207) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-31 15:28:35 UTC (rev 6208) @@ -2314,10 +2314,10 @@ //remove all effects that are not 'permanent after death' here //permanent after death type is 9 SetBaseBit(IE_STATE_ID, STATE_DEAD, true); - + // party actors are never removed if (InParty) return false; - + if (Modified[IE_MC_FLAGS]&MC_REMOVE_CORPSE) return true; if (Modified[IE_MC_FLAGS]&MC_KEEP_CORPSE) return false; //if chunked death, then return true @@ -2748,8 +2748,10 @@ //even spells got this attack style int Actor::GetAttackStyle() { - int effect = core->QuerySlotEffects(inventory.GetEquippedSlot()); - if (effect == SLOT_EFFECT_MISSILE) return WEAPON_RANGED; + WeaponInfo wi ; + //Non NULL if the equipped slot is a projectile or a throwing weapon + //TODO some weapons have both melee and ranged capability + if (GetRangedWeapon(wi) != NULL) return WEAPON_RANGED ; return WEAPON_MELEE; } @@ -2924,7 +2926,6 @@ if (!header) { return; } - //can't reach target, zero range shouldn't be allowed //Don't forget to take size of the opponents into account //Actually, this version of PersonalDistance already calculates with the size!!! Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-31 15:16:16 UTC (rev 6207) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-31 15:28:35 UTC (rev 6208) @@ -1127,7 +1127,7 @@ } } slot = GetEquippedSlot(); - if(core->QuerySlotEffects(slot)) { + if((core->QuerySlotEffects(slot) & SLOT_EFFECT_MISSILE) == SLOT_EFFECT_MISSILE) { slot = FindRangedWeapon(); } ret = GetSlotItem(slot); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-05-31 17:25:44
|
Revision: 6215 http://gemrb.svn.sourceforge.net/gemrb/?rev=6215&view=rev Author: avenger_teambg Date: 2009-05-31 17:25:36 +0000 (Sun, 31 May 2009) Log Message: ----------- use SetPosition so the copy is placed besides the master, not onto it Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-31 17:07:58 UTC (rev 6214) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-31 17:25:36 UTC (rev 6215) @@ -1973,8 +1973,8 @@ #if 0 void Actor::DumpMaxValues() { - int symbol = core->LoadSymbol( "stats" ); - SymbolMgr *sym = core->GetSymbol( symbol ); + int symbol = core->LoadSymbol( "stats" ); + SymbolMgr *sym = core->GetSymbol( symbol ); for(int i=0;i<MAX_STATS;i++) { printf("%d (%s) %d\n", i, sym->GetValue(i), maximum_values[i]); @@ -2082,7 +2082,7 @@ } } -void Actor::SetPosition(Point &position, int jump, int radius) +void Actor::SetPosition(const Point &position, int jump, int radius) { PathTries = 0; ClearPath(); @@ -2500,8 +2500,8 @@ { if (!PCStats) return; PCStats->InitQuickSlot(which, slot, headerindex); - //something changed about the quick items - core->SetEventFlag(EF_ACTION); + //something changed about the quick items + core->SetEventFlag(EF_ACTION); } bool Actor::ValidTarget(int ga_flags) const @@ -4528,11 +4528,9 @@ EffectQueue *newFXQueue = fxqueue.CopySelf(); area->AddActor(newActor); - newActor->Pos.x = Pos.x; - newActor->Pos.y = Pos.y; - newActor->Destination.x = Destination.x; - newActor->Destination.y = Destination.y; + newActor->SetPosition( Pos, CC_CHECK_IMPASSABLE, 0 ); newActor->SetOrientation(GetOrientation(),0); + //and apply them newActor->RefreshEffects(newFXQueue); return newActor; Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-31 17:07:58 UTC (rev 6214) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-31 17:25:36 UTC (rev 6215) @@ -293,7 +293,7 @@ /** places the actor on the map with a unique object ID */ void SetMap(Map *map, ieWord LID, ieWord GID); /** sets the actor's position, calculating with the nojump flag*/ - void SetPosition(Point &position, int jump, int radius=0); + void SetPosition(const Point &position, int jump, int radius=0); /** you better use SetStat, this stuff is only for special cases*/ void SetAnimationID(unsigned int AnimID); /** returns the animations */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2009-06-01 07:08:59
|
Revision: 6225 http://gemrb.svn.sourceforge.net/gemrb/?rev=6225&view=rev Author: mattinm Date: 2009-06-01 07:08:24 +0000 (Mon, 01 Jun 2009) Log Message: ----------- GetClassLevel now takes into account inactive dual-classes calloc'd levelslots[i] to (int*) instead of (int) as correct fixed potential (likely?) out-of-range in maxhpconbon in RefreshEffects SIDE-EFFECT: since GetClassLevel returns 0 when getting the level of an inactive class, dualing from a warrior class to a non-warrior class will actually reduce HP bonus until reactivation; I like this feature, however, the actual IE doesn't do this, so it's something to consider Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-06-01 06:27:49 UTC (rev 6224) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-06-01 07:08:24 UTC (rev 6225) @@ -105,6 +105,9 @@ //conversion for 3rd ed static int isclass[11]={0,0,0,0,0,0,0,0,0,0,0}; +static const int mcwasflags[11] = { + MC_WAS_FIGHTER, MC_WAS_MAGE, MC_WAS_THIEF, 0, 0, MC_WAS_CLERIC, + MC_WAS_DRUID, 0, 0, MC_WAS_RANGER, 0}; static const char *isclassnames[11] = { "FIGHTER", "MAGE", "THIEF", "BARBARIAN", "BARD", "CLERIC", "DRUID", "MONK", "PALADIN", "RANGER", "SORCERER" }; @@ -1275,7 +1278,6 @@ //levelslots[BaseStats[IE_CLASS]-1] as there is no class id of 0 levelslots = (int **) calloc(classcount, sizeof(int*)); dualswap = (int *) calloc(classcount, sizeof(int)); - //default all dualswaps to 0 memset(dualswap, 0, sizeof(dualswap)); ieDword tmpindex; for (i=0; i<classcount; i++) { @@ -1298,7 +1300,7 @@ printf("Name: %s ", classname); int classis = 0; //default all levelslots to 0 - levelslots[tmpindex] = (int *) calloc(ISCLASSES, sizeof(int*)); + levelslots[tmpindex] = (int *) calloc(ISCLASSES, sizeof(int)); memset(levelslots[tmpindex], 0, sizeof(levelslots[tmpindex])); //single classes only worry about IE_LEVEL @@ -1319,7 +1321,6 @@ if (tmphp) maxhpconbon[tmpindex] = tmphp; } } - printf("DS: %d\n", dualswap[tmpindex]); continue; } @@ -1672,11 +1673,11 @@ int bonus; int bonlevel = GetXPLevel(true); //we must limit the levels to the max allowable - if (bonlevel>maxhpconbon[BaseStats[IE_CLASS]]) - bonlevel = maxhpconbon[BaseStats[IE_CLASS]]; + if (bonlevel>maxhpconbon[BaseStats[IE_CLASS]-1]) + bonlevel = maxhpconbon[BaseStats[IE_CLASS]-1]; // warrior (fighter, barbarian, ranger, or paladin) or not - // TODO: for dualclassed characters we take the best only if both are active + // GetClassLevel now takes into consideration inactive dual-classes if (IsWarrior()) { bonus = core->GetConstitutionBonus(STAT_CON_HP_WARRIOR,Modified[IE_CON]); } else { @@ -4583,7 +4584,8 @@ return newActor; } -ieDword Actor::GetClassLevel(const ieDword id) const { +ieDword Actor::GetClassLevel(const ieDword id) const +{ if (id>=ISCLASSES) return 0; @@ -4596,7 +4598,7 @@ return 0; //only works with PC's - ieDword classid = BaseStats[IE_CLASS]-1; + ieDword classid = BaseStats[IE_CLASS]-1; if (classid>=(ieDword)classcount || !levelslots[classid]) return 0; @@ -4606,11 +4608,36 @@ return 0; //do dual-swap - if (IsDualClassed() && dualswap[classid]) { - if (levelid==IE_LEVEL) - levelid = IE_LEVEL2; - else - levelid = IE_LEVEL; + if (IsDualClassed()) { + //if the old class is inactive, and it is the class + //being searched for, return 0 + if (IsDualInactive() && (Modified[IE_MC_FLAGS]&mcwasflags[id])) + return 0; + + //flip the IE_LEVEL if we need to + if (IsDualSwap()) { + levelid = (levelid == IE_LEVEL) ? IE_LEVEL2 : IE_LEVEL; + } } return BaseStats[levelid]; } + +bool Actor::IsDualInactive() const +{ + if (!IsDualClassed()) return 0; + + //we assume the old class is in IE_LEVEL2, unless swapped + ieDword oldlevel = IsDualSwap() ? BaseStats[IE_LEVEL] : BaseStats[IE_LEVEL2]; + + //since GetXPLevel returns the average of the 2 levels, oldclasslevel will + //only be less than GetXPLevel when the new class surpasses it + return oldlevel>=GetXPLevel(false); +} + +bool Actor::IsDualSwap() const +{ + //the dualswap[class-1] holds the info + if (!IsDualClassed()) return false; + if ((BaseStats[IE_CLASS]-1)>=ISCLASSES) return false; + return dualswap[BaseStats[IE_CLASS]-1]; +} Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-06-01 06:27:49 UTC (rev 6224) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-06-01 07:08:24 UTC (rev 6225) @@ -276,6 +276,8 @@ void CreateDerivedStatsIWD2(); /* Gets the given ISCLASS level */ ieDword GetClassLevel (const ieDword id) const; + /* Returns true if the dual class is backwards */ + bool IsDualSwap() const; public: Actor(void); ~Actor(void); @@ -547,19 +549,20 @@ /* Returns an exact copy of this actor */ Actor *CopySelf() const; /* Returns the actor's level of the given class */ - ieDword GetFighterLevel () const { return GetClassLevel(ISFIGHTER); } - ieDword GetMageLevel () const { return GetClassLevel(ISMAGE); } - ieDword GetThiefLevel () const { return GetClassLevel(ISTHIEF); } - ieDword GetBarbarianLevel () const { return GetClassLevel(ISBARBARIAN); } - ieDword GetBardLevel () const { return GetClassLevel(ISBARD); } - ieDword GetClericLevel () const { return GetClassLevel(ISCLERIC); } - ieDword GetDruidLevel () const { return GetClassLevel(ISDRUID); } - ieDword GetMonkLevel () const { return GetClassLevel(ISMONK); } - ieDword GetPaladinLevel () const { return GetClassLevel(ISPALADIN); } - ieDword GetRangerLevel () const { return GetClassLevel(ISRANGER); } - ieDword GetSorcererLevel () const { return GetClassLevel(ISSORCERER); } - + ieDword GetFighterLevel() const { return GetClassLevel(ISFIGHTER); } + ieDword GetMageLevel() const { return GetClassLevel(ISMAGE); } + ieDword GetThiefLevel() const { return GetClassLevel(ISTHIEF); } + ieDword GetBarbarianLevel() const { return GetClassLevel(ISBARBARIAN); } + ieDword GetBardLevel() const { return GetClassLevel(ISBARD); } + ieDword GetClericLevel() const { return GetClassLevel(ISCLERIC); } + ieDword GetDruidLevel() const { return GetClassLevel(ISDRUID); } + ieDword GetMonkLevel() const { return GetClassLevel(ISMONK); } + ieDword GetPaladinLevel() const { return GetClassLevel(ISPALADIN); } + ieDword GetRangerLevel() const { return GetClassLevel(ISRANGER); } + ieDword GetSorcererLevel() const { return GetClassLevel(ISSORCERER); } /* Returns true if the character is a warrior */ bool IsWarrior() const { return (GetFighterLevel()||GetBarbarianLevel()||GetRangerLevel()||GetPaladinLevel()); } + /* Returns true if the old class is inactive */ + bool IsDualInactive() const; }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-06-01 20:49:39
|
Revision: 6250 http://gemrb.svn.sourceforge.net/gemrb/?rev=6250&view=rev Author: fuzzie Date: 2009-06-01 20:49:30 +0000 (Mon, 01 Jun 2009) Log Message: ----------- it seems that DestroyItem should destroy UNDROPPABLE items too Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-06-01 20:17:58 UTC (rev 6249) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-06-01 20:49:30 UTC (rev 6250) @@ -398,9 +398,9 @@ if (WaitCounter) return; } - //don't do anything while moving? + //don't do anything while moving without interruptions allowed //maybe this should be fixed - if (InMove()) { + if (InMove() && (InternalFlags & IF_NOINT)) { return; } @@ -430,7 +430,7 @@ break; } //break execution in case of movement - if (InMove()) { + if (InMove() && (InternalFlags & IF_NOINT)) { break; } } Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-06-01 20:17:58 UTC (rev 6249) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-06-01 20:49:30 UTC (rev 6250) @@ -377,8 +377,8 @@ continue; } // here you can simply destroy all items of a specific type - if ( ((flags^IE_INV_ITEM_UNDROPPABLE)&item->Flags)!=flags) { - continue; + if ( (flags&item->Flags)!=flags) { + continue; } if (resref[0] && strnicmp(item->ItemResRef, resref, 8) ) { continue; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-06-01 21:16:26
|
Revision: 6252 http://gemrb.svn.sourceforge.net/gemrb/?rev=6252&view=rev Author: avenger_teambg Date: 2009-06-01 21:16:18 +0000 (Mon, 01 Jun 2009) Log Message: ----------- updated projectile server with sound resource columns Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-06-01 20:53:24 UTC (rev 6251) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-06-01 21:16:18 UTC (rev 6252) @@ -703,7 +703,7 @@ //these resources are listed in areapro.2da and served by ProjectileServer.cpp if (Extension->ExplType!=0xff) { ieResRef const *res; - int apflags = server->GetExplosionPalette(Extension->ExplType); + int apflags = server->GetExplosionFlags(Extension->ExplType); //draw it only once, at the time of explosion if (phase==P_EXPLODING1) { Modified: gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2009-06-01 20:53:24 UTC (rev 6251) +++ gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2009-06-01 21:16:18 UTC (rev 6252) @@ -147,10 +147,13 @@ explosions = new ExplosionEntry[rows]; while(rows--) { - strnuprcpy(explosions[rows].resource1, explist->QueryField(rows, 0), 8); - strnuprcpy(explosions[rows].resource2, explist->QueryField(rows, 1), 8); - strnuprcpy(explosions[rows].resource3, explist->QueryField(rows, 2), 8); - explosions[rows].palette = atoi(explist->QueryField(rows,3)); + int i; + + for(i=0;i<AP_RESCNT;i++) { + strnuprcpy(explosions[rows].resources[i], explist->QueryField(rows, i), 8); + } + //using i so the flags field will always be after the resources + explosions[rows].flags = atoi(explist->QueryField(rows,i)); } } return explosioncount; @@ -192,7 +195,8 @@ return (unsigned int) projectilecount; } -int ProjectileServer::GetExplosionPalette(unsigned int idx) +//return various flags for the explosion type +int ProjectileServer::GetExplosionFlags(unsigned int idx) { if (explosioncount==-1) { if (InitExplosion()<0) { @@ -204,7 +208,7 @@ return 0; } - return explosions[idx].palette; + return explosions[idx].flags; } ieResRef const *ProjectileServer::GetExplosion(unsigned int idx, int type) @@ -220,18 +224,7 @@ } ieResRef const *ret = NULL; - switch (type) { - case 0: - ret = &explosions[idx].resource1; - break; - case 1: - ret = &explosions[idx].resource2; - break; - case 2: - //i'm still unsure if we need the third resource column - ret = &explosions[idx].resource3; - break; - } + ret = &explosions[idx].resources[type]; if (ret && *ret[0]=='*') ret = NULL; return ret; Modified: gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h 2009-06-01 20:53:24 UTC (rev 6251) +++ gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h 2009-06-01 21:16:18 UTC (rev 6252) @@ -25,6 +25,9 @@ #include "PluginMgr.h" #include "Projectile.h" +//the number of resrefs in areapro.2da (before the flags field) +#define AP_RESCNT 5 + //this represents a line of projectl.ids class ProjectileEntry { @@ -50,10 +53,8 @@ { memset(this,0,sizeof(ExplosionEntry)); } - ieResRef resource1; - ieResRef resource2; - ieResRef resource3; - int palette; + ieResRef resources[AP_RESCNT]; + int flags; }; #ifdef WIN32 @@ -81,7 +82,7 @@ //returns the highest projectile id unsigned int GetHighestProjectileNumber(); int InitExplosion(); - int GetExplosionPalette(unsigned int idx); + int GetExplosionFlags(unsigned int idx); ieResRef const *GetExplosion(unsigned int idx, int type); //creates an empty projectile on the fly Projectile *CreateDefaultProjectile(unsigned int idx); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-06-02 17:09:50
|
Revision: 6263 http://gemrb.svn.sourceforge.net/gemrb/?rev=6263&view=rev Author: avenger_teambg Date: 2009-06-02 17:09:48 +0000 (Tue, 02 Jun 2009) Log Message: ----------- implemented SendTrigger and Trigger 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/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h gemrb/trunk/gemrb/plugins/Core/Triggers.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-06-02 14:16:24 UTC (rev 6262) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-06-02 17:09:48 UTC (rev 6263) @@ -4363,6 +4363,15 @@ worldmap->SetAreaStatus(parameters->string0Parameter, WMP_ENTRY_VISIBLE, BM_NAND); } +void GameScript::SendTrigger(Scriptable* Sender, Action* parameters) +{ + Scriptable *tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); + if (!tar) { + return; + } + tar->TriggerID=parameters->int0Parameter; +} + void GameScript::Shout( Scriptable* Sender, Action* parameters) { if (Sender->Type!=ST_ACTOR) { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-06-02 14:16:24 UTC (rev 6262) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-06-02 17:09:48 UTC (rev 6263) @@ -54,6 +54,7 @@ textDisplaying = 0; timeStartDisplaying = 0; scriptName[0] = 0; + TriggerID = 0; //used by SendTrigger LastTrigger = 0; LastEntered = 0; LastDisarmed = 0; Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-06-02 14:16:24 UTC (rev 6262) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-06-02 17:09:48 UTC (rev 6263) @@ -193,6 +193,7 @@ unsigned char textDisplaying; unsigned long timeStartDisplaying; ieDword UnselectableTimer; + ieDword TriggerID; //for sendtrigger ieDword LastTrigger; // also LastClosed ieDword LastEntered; // also LastOpened ieDword LastDisarmed; // also LastAttacker Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-06-02 14:16:24 UTC (rev 6262) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-06-02 17:09:48 UTC (rev 6263) @@ -351,6 +351,7 @@ {"totalitemcntgt", GameScript::TotalItemCntGT, 0}, //iwd2 {"totalitemcntlt", GameScript::TotalItemCntLT, 0}, //iwd2 {"traptriggered", GameScript::TrapTriggered, 0}, + {"trigger", GameScript::TriggerTrigger, 0}, {"triggerclick", GameScript::Clicked, 0}, //not sure {"triggersetglobal", GameScript::TriggerSetGlobal,0}, //iwd2, but never used {"true", GameScript::True, 0}, @@ -739,6 +740,7 @@ {"saveobjectlocation", GameScript::SaveObjectLocation, 0}, {"screenshake", GameScript::ScreenShake,AF_BLOCKING}, {"selectweaponability", GameScript::SelectWeaponAbility, 0}, + {"sendtrigger", GameScript::SendTrigger, 0}, {"setanimstate", GameScript::PlaySequence, AF_ALIVE},//pst {"setapparentnamestrref", GameScript::SetApparentName, 0}, {"setareaflags", GameScript::SetAreaFlags, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-06-02 14:16:24 UTC (rev 6262) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-06-02 17:09:48 UTC (rev 6263) @@ -946,6 +946,7 @@ static int TotalItemCntGT(Scriptable* Sender, Trigger* parameters); static int TotalItemCntLT(Scriptable* Sender, Trigger* parameters); static int TrapTriggered(Scriptable* Sender, Trigger* parameters); + static int TriggerTrigger(Scriptable* Sender, Trigger* parameters); static int TriggerSetGlobal(Scriptable* Sender, Trigger* parameters); static int True(Scriptable* Sender, Trigger* parameters); static int Unlocked(Scriptable* Sender, Trigger* parameters); @@ -1286,6 +1287,7 @@ static void SaveObjectLocation(Scriptable* Sender, Action* parameters); static void ScreenShake(Scriptable* Sender, Action* parameters); static void SelectWeaponAbility(Scriptable* Sender, Action* parameters); + static void SendTrigger(Scriptable* Sender, Action* parameters); static void SetAnimState(Scriptable* Sender, Action* parameters); static void SetApparentName(Scriptable* Sender, Action* parameters); static void SetAreaFlags(Scriptable* Sender, Action* parameters); Modified: gemrb/trunk/gemrb/plugins/Core/Triggers.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2009-06-02 14:16:24 UTC (rev 6262) +++ gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2009-06-02 17:09:48 UTC (rev 6263) @@ -1422,6 +1422,15 @@ return parameters->int0Parameter; } +int GameScript::TriggerTrigger(Scriptable* Sender, Trigger* parameters) +{ + if(Sender->TriggerID==(ieDword) parameters->int0Parameter) { + Sender->AddTrigger (&Sender->TriggerID); + return 1; + } + return 0; +} + int GameScript::WalkedToTrigger(Scriptable* Sender, Trigger* parameters) { Actor *target = Sender->GetCurrentArea()->GetActorByGlobalID(Sender->LastTrigger); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |