From: <ave...@us...> - 2008-09-24 21:13:38
|
Revision: 5353 http://gemrb.svn.sourceforge.net/gemrb/?rev=5353&view=rev Author: avenger_teambg Date: 2008-09-24 21:13:28 +0000 (Wed, 24 Sep 2008) Log Message: ----------- labels will render animated pictures assigned to them guiscript functions that create controls will return the control index Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Label.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Label.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Label.cpp 2008-09-24 20:06:17 UTC (rev 5352) +++ gemrb/trunk/gemrb/plugins/Core/Label.cpp 2008-09-24 21:13:28 UTC (rev 5353) @@ -59,6 +59,14 @@ useRGB?palette:NULL, Alignment | IE_FONT_SINGLE_LINE, true ); } + + if (AnimPicture) { + int xOffs = ( Width / 2 ) - ( AnimPicture->Width / 2 ); + int yOffs = ( Height / 2 ) - ( AnimPicture->Height / 2 ); + Region r( x + XPos + xOffs, y + YPos + yOffs, (int)(AnimPicture->Width), AnimPicture->Height ); + core->GetVideoDriver()->BlitSprite( AnimPicture, x + XPos + xOffs, y + YPos + yOffs, true, &r ); + } + } /** This function sets the actual Label Text */ int Label::SetText(const char* string, int /*pos*/) Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2008-09-24 20:06:17 UTC (rev 5352) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2008-09-24 21:13:28 UTC (rev 5353) @@ -1798,7 +1798,7 @@ } PyDoc_STRVAR( GemRB_CreateLabelOnButton__doc, -"CreateLabelOnButton(WindowIndex, ControlIndex, NewControlID, font, text, align)" +"CreateLabelOnButton(WindowIndex, ControlIndex, NewControlID, font, align)" "Creates a label on top of a button, copying the button's size and position." ); static PyObject* GemRB_CreateLabelOnButton(PyObject * /*self*/, PyObject* args) @@ -1830,8 +1830,14 @@ lbl->SetAlignment( align ); win->AddControl( lbl ); - Py_INCREF( Py_None ); - return Py_None; + int ret = core->GetControl( WindowIndex, ControlID ); + + if (ret<0) { + return NULL; + } + return PyInt_FromLong( ret ); + //Py_INCREF( Py_None ); + //return Py_None; } PyDoc_STRVAR( GemRB_CreateLabel__doc, @@ -1864,8 +1870,14 @@ lbl->SetAlignment( align ); win->AddControl( lbl ); - Py_INCREF( Py_None ); - return Py_None; + int ret = core->GetControl( WindowIndex, ControlID ); + + if (ret<0) { + return NULL; + } + return PyInt_FromLong( ret ); + //Py_INCREF( Py_None ); + //return Py_None; } PyDoc_STRVAR( GemRB_SetLabelTextColor__doc, @@ -1930,8 +1942,14 @@ win->AddControl( edit ); - Py_INCREF( Py_None ); - return Py_None; + int ret = core->GetControl( WindowIndex, ControlID ); + + if (ret<0) { + return NULL; + } + return PyInt_FromLong( ret ); + //Py_INCREF( Py_None ); + //return Py_None; } PyDoc_STRVAR( GemRB_CreateButton__doc, @@ -1962,8 +1980,14 @@ btn->Owner = win; win->AddControl( btn ); - Py_INCREF( Py_None ); - return Py_None; + int ret = core->GetControl( WindowIndex, ControlID ); + + if (ret<0) { + return NULL; + } + return PyInt_FromLong( ret ); + //Py_INCREF( Py_None ); + //return Py_None; } @@ -2357,8 +2381,14 @@ wmap->Owner = win; win->AddControl( wmap ); - Py_INCREF( Py_None ); - return Py_None; + int ret = core->GetControl( WindowIndex, ControlID ); + + if (ret<0) { + return NULL; + } + return PyInt_FromLong( ret ); + //Py_INCREF( Py_None ); + //return Py_None; } PyDoc_STRVAR( GemRB_SetWorldMapTextColor__doc, @@ -2466,8 +2496,14 @@ setup_done: win->AddControl( map ); - Py_INCREF( Py_None ); - return Py_None; + int ret = core->GetControl( WindowIndex, ControlID ); + + if (ret<0) { + return NULL; + } + return PyInt_FromLong( ret ); + //Py_INCREF( Py_None ); + //return Py_None; } PyDoc_STRVAR( GemRB_SetControlPos__doc, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-08 20:30:36
|
Revision: 5414 http://gemrb.svn.sourceforge.net/gemrb/?rev=5414&view=rev Author: avenger_teambg Date: 2008-10-08 20:30:26 +0000 (Wed, 08 Oct 2008) Log Message: ----------- removed possible infinite loop problem with calling SelectionChanged fixed magic weapon equipping/creation added some comments Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h gemrb/trunk/gemrb/plugins/Core/Inventory.cpp gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -2078,6 +2078,8 @@ actor->SetOrientation( GetOrient( *otherp, actor->Pos ), false); if (door->Flags&DOOR_LOCKED) { const char *Key = door->GetKey(); + //TODO: the original engine allowed opening of a door when the + //key was on any of the partymembers if (!Key || !actor->inventory.HasItem(Key,0) ) { //playsound unsuccessful opening of door core->PlaySound(DS_OPEN_FAIL); Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -445,8 +445,9 @@ } } - if (! (flags & SELECT_QUIET)) { - core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); + if (! (flags & SELECT_QUIET)) { + core->SetEventFlag(EF_SELECTION); + //core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); } return true; } @@ -480,7 +481,8 @@ } if (! (flags & SELECT_QUIET)) { - core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); + core->SetEventFlag(EF_SELECTION); + //core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); } return true; } Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -516,6 +516,11 @@ gc=NULL; } + if (EventFlag&EF_SELECTION) { + EventFlag&=~EF_SELECTION; + guiscript->RunFunction( "SelectionChanged", false); + } + if (EventFlag&EF_UPDATEANIM) { EventFlag&=~EF_UPDATEANIM; guiscript->RunFunction( "UpdateAnimation", false); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-08 20:30:26 UTC (rev 5414) @@ -161,6 +161,7 @@ #define EF_UPDATEANIM 8 //updates avatar animation #define EF_SEQUENCER 16 //starts sequencer/contingency creation #define EF_IDENTIFY 32 //starts identify screen +#define EF_SELECTION 64 //selection changed //autopause #define AP_UNUSABLE 0 Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -320,6 +320,7 @@ if (!itm) { return; } +printf("Equipped is: %d\n", Equipped); ItemExcl &= ~itm->ItemExcl; switch (effect) { @@ -331,8 +332,12 @@ // reset Equipped if it was the removed item if (Equipped+SLOT_MELEE == (int)index) Equipped = IW_NO_EQUIPPED; - if (Equipped < 0 && FindRangedWeapon() == SLOT_FIST) - Equipped = IW_NO_EQUIPPED; + // reset Equipped if it is a ranged weapon slot + // but not magic weapon slot! + if (Equipped != SLOT_MAGIC-SLOT_MELEE) { + if (Equipped < 0 && FindRangedWeapon() == SLOT_FIST) + Equipped = IW_NO_EQUIPPED; + } UpdateWeaponAnimation(); break; @@ -346,6 +351,7 @@ } break; } +printf("Equipped is: %d\n", Equipped); core->FreeItem(itm, item->ItemResRef, false); } /** if resref is "", then destroy ALL items @@ -464,9 +470,11 @@ InvalidSlot(slot); } + //check for equipping weapons if (WhyCantEquip(slot,twohanded)) { return ASI_FAILED; } + if (!Slots[slot]) { item->Flags |= IE_INV_ITEM_ACQUIRED; Slots[slot] = item; @@ -1040,26 +1048,30 @@ bool Inventory::SetEquippedSlot(int slotcode) { - if (Equipped != IW_NO_EQUIPPED) { - RemoveSlotEffects( SLOT_MELEE+Equipped); - } - - //doesn't work if magic slot is used - if (HasItemInSlot("",SLOT_MAGIC)) { + //doesn't work if magic slot is used, refresh the magic slot just in case + if (HasItemInSlot("",SLOT_MAGIC) && (slotcode!=SLOT_MAGIC-SLOT_MELEE)) { Equipped = SLOT_MAGIC-SLOT_MELEE; + UpdateWeaponAnimation(); return false; } - if (slotcode == IW_NO_EQUIPPED) { + //unequipping (fist slot will be used now) + if (slotcode == IW_NO_EQUIPPED || !HasItemInSlot("",slotcode+SLOT_MELEE)) { + if (Equipped != IW_NO_EQUIPPED) { + RemoveSlotEffects( SLOT_MELEE+Equipped); + } Equipped = IW_NO_EQUIPPED; + //fist slot equipping effects + AddSlotEffects(0); UpdateWeaponAnimation(); return true; } - if (!HasItemInSlot("",slotcode+SLOT_MELEE)) { - Equipped = IW_NO_EQUIPPED; - UpdateWeaponAnimation(); - return true; + + //equipping a weapon, but remove its effects first + if (Equipped != IW_NO_EQUIPPED) { + RemoveSlotEffects( SLOT_MELEE+Equipped); } + Equipped = slotcode; int effects = core->QuerySlotEffects( SLOT_MELEE+Equipped ); if (effects) { @@ -1220,6 +1232,11 @@ char AnimationType[2]={0,0}; ieWord MeleeAnimation[3]={100,0,0}; + //cannot change equipment when holding magic weapons + if (Equipped == SLOT_MELEE-SLOT_MAGIC) { + return; + } + if (flags&EQUIP_RANGED) { for(i=SLOT_RANGED;i<LAST_RANGED;i++) { const Item *itm = GetItemPointer(i, Slot); @@ -1421,6 +1438,8 @@ if (itm) core->FreeItem( itm, Slot->ItemResRef, false ); Owner->SetUsedWeapon(AnimationType, MeleeAnimation, WeaponType); + //update the weapon animation + core->SetEventFlag(EF_SELECTION); } //this function will also check disabled slots (if that feature will be imped) @@ -1451,6 +1470,17 @@ int Inventory::WhyCantEquip(int slot, int twohanded) const { + // check only for hand slots + if ((slot<SLOT_MELEE || slot>LAST_MELEE) && (slot != SLOT_LEFT) ) { + return 0; + } + + //magic items have the highest priority + if ( HasItemInSlot("", GetMagicSlot())) { + //magic weapon is in use + return STR_MAGICWEAPON; + } + //can't equip in shield slot if a weapon slot is twohanded for (int i=SLOT_MELEE; i<=LAST_MELEE;i++) { //see GetShieldSlot @@ -1482,9 +1512,5 @@ return STR_OFFHAND_USED; } } - if ( HasItemInSlot("", GetMagicSlot())) { - //magic weapon is in use - return STR_MAGICWEAPON; - } return 0; } Modified: gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -2736,6 +2736,8 @@ { //charge count is incorrect target->inventory.SetSlotItemRes(fx->Resource, target->inventory.GetMagicSlot(),fx->Parameter1,fx->Parameter3,fx->Parameter4); + //equip the weapon + target->inventory.SetEquippedSlot(target->inventory.GetMagicSlot()-target->inventory.GetWeaponSlot()); if (fx->TimingMode==FX_DURATION_INSTANT_LIMITED) { //if this effect has expiration, then it will remain as a remove_item //on the effect queue, inheriting all the parameters This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-10-26 22:16:29
|
Revision: 5474 http://gemrb.svn.sourceforge.net/gemrb/?rev=5474&view=rev Author: avenger_teambg Date: 2008-10-26 22:16:25 +0000 (Sun, 26 Oct 2008) Log Message: ----------- new displaystring function with format <charname> - action : name improved some iwd2 opcodes Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-26 21:11:36 UTC (rev 5473) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-26 22:16:25 UTC (rev 5474) @@ -4105,16 +4105,44 @@ ta->AppendText( Text, -1 ); } +#define PALSIZE 8 +static Color ActorColor[PALSIZE]; static const char* DisplayFormatName = "[color=%lX]%s - [/color][p][color=%lX]%s[/color][/p]"; static const char* DisplayFormatAction = "[color=%lX]%s - [/color][p][color=%lX]%s %s[/color][/p]"; static const char* DisplayFormat = "[/color][p][color=%lX]%s[/color][/p]"; static const char* DisplayFormatValue = "[/color][p][color=%lX]%s: %d[/color][/p]"; +static const char* DisplayFormatNameString = "[color=%lX]%s - [/color][p][color=%lX]%s: %s[/color][/p]"; ieStrRef Interface::GetStringReference(int stridx) const { return strref_table[stridx]; } + +unsigned int Interface::GetSpeakerColor(const char *&name, Scriptable *&speaker) const +{ + unsigned int speaker_color; + + switch (speaker->Type) { + case ST_ACTOR: + name = ((Actor *) speaker)->GetName(-1); + GetPalette( ((Actor *) speaker)->GetStat(IE_MAJOR_COLOR), PALSIZE, ActorColor ); + speaker_color = (ActorColor[4].r<<16) | (ActorColor[4].g<<8) | ActorColor[4].b; + break; + case ST_TRIGGER: case ST_PROXIMITY: case ST_TRAVEL: + name = GetString( ((InfoPoint *) speaker)->DialogName ); + speaker_color = 0xc0c0c0; + break; + default: + name = ""; + speaker_color = 0x800000; + break; + } + return speaker_color; +} + + +//simply displaying a constant string void Interface::DisplayConstantString(int stridx, unsigned int color) const { if (stridx<0) return; @@ -4133,12 +4161,14 @@ char* text = GetString( stridx, flags); int newlen = (int)(strlen( DisplayFormat) + strlen( text ) + 10); char* newstr = ( char* ) malloc( newlen ); - sprintf( newstr, DisplayFormat, color, text ); + snprintf( newstr, newlen, DisplayFormat, color, text ); FreeString( text ); DisplayString( newstr ); free( newstr ); } +// String format is +// blah : whatever void Interface::DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const { if (stridx<0) return; @@ -4151,36 +4181,44 @@ free( newstr ); } -#define PALSIZE 8 -static Color ActorColor[PALSIZE]; +// String format is +// <charname> - blah blah : whatever +void Interface::DisplayConstantStringNameString(int stridx, unsigned int color, int stridx2, Scriptable *actor) const +{ + unsigned int actor_color; + const char *name; + if (stridx<0) return; + actor_color = GetSpeakerColor(name, actor); + char* text = GetString( strref_table[stridx], IE_STR_SOUND ); + char* text2 = GetString( strref_table[stridx2], IE_STR_SOUND ); + int newlen = (int)(strlen( DisplayFormat ) + strlen(name) + strlen( text ) + strlen(text2) + 18); + char* newstr = ( char* ) malloc( newlen ); + if (strlen(text2)) { + snprintf( newstr, newlen, DisplayFormatNameString, actor_color, name, color, text, text2 ); + } else { + snprintf( newstr, newlen, DisplayFormatName, color, name, color, text ); + } + FreeString( text ); + FreeString( text2 ); + DisplayString( newstr ); + free( newstr ); +} + +// String format is +// <charname> - blah blah void Interface::DisplayConstantStringName(int stridx, unsigned int color, Scriptable *speaker) const { unsigned int speaker_color; const char *name; if (stridx<0) return; - switch (speaker->Type) { - case ST_ACTOR: - name = ((Actor *) speaker)->GetName(-1); - GetPalette( ((Actor *) speaker)->GetStat(IE_MAJOR_COLOR), PALSIZE, ActorColor ); - speaker_color = (ActorColor[4].r<<16) | (ActorColor[4].g<<8) | ActorColor[4].b; - break; - case ST_TRIGGER: case ST_PROXIMITY: case ST_TRAVEL: - name = GetString( ((InfoPoint *) speaker)->DialogName ); - speaker_color = 0xc0c0c0; - break; - default: - name = ""; - speaker_color = 0x800000; - break; - } - + speaker_color = GetSpeakerColor(name, speaker); char* text = GetString( strref_table[stridx], IE_STR_SOUND|IE_STR_SPEECH ); int newlen = (int)(strlen( DisplayFormatName ) + strlen( name ) + + strlen( text ) + 18); char* newstr = ( char* ) malloc( newlen ); - sprintf( newstr, DisplayFormatName, speaker_color, name, color, + snprintf( newstr, newlen, DisplayFormatName, speaker_color, name, color, text ); FreeString( text ); DisplayString( newstr ); @@ -4194,6 +4232,10 @@ const char *name2; if (stridx<0) return; + + GetSpeakerColor(name2, target); + attacker_color = GetSpeakerColor(name1, attacker); +/* switch (attacker->Type) { case ST_ACTOR: name1 = ((Actor *) attacker)->GetName(-1); @@ -4213,12 +4255,12 @@ name2 = ""; break; } - +*/ char* text = GetString( strref_table[stridx], IE_STR_SOUND|IE_STR_SPEECH ); int newlen = (int)(strlen( DisplayFormatAction ) + strlen( name1 ) + + strlen( name2 ) + strlen( text ) + 18); char* newstr = ( char* ) malloc( newlen ); - sprintf( newstr, DisplayFormatAction, attacker_color, name1, color, + snprintf( newstr, newlen, DisplayFormatAction, attacker_color, name1, color, text, name2); FreeString( text ); DisplayString( newstr ); @@ -4251,8 +4293,7 @@ int newlen = (int)(strlen( DisplayFormatName ) + strlen( name ) + + strlen( text ) + 10); char* newstr = ( char* ) malloc( newlen ); - sprintf( newstr, DisplayFormatName, speaker_color, name, color, - text ); + snprintf( newstr, newlen, DisplayFormatName, speaker_color, name, color, text ); FreeString( text ); DisplayString( newstr ); free( newstr ); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-26 21:11:36 UTC (rev 5473) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-26 22:16:25 UTC (rev 5474) @@ -395,10 +395,14 @@ TextArea *GetMessageTextArea() const; /** returns a string reference from a string reference index constant*/ ieStrRef GetStringReference(int stridx) const; + /** returns the speaker's color and name */ + unsigned int GetSpeakerColor(const char *&name, Scriptable *&speaker) const; /** displays any string in the textarea */ void DisplayString(const char *txt) const; /** displays a string constant in the textarea */ void DisplayConstantString(int stridx, unsigned int color) const; + /** displays actor name - action : parameter */ + void DisplayConstantStringNameString(int stridx, unsigned int color, int stridx2, Scriptable *actor) const; /** displays a string constant followed by a number in the textarea */ void DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const; /** displays a string constant in the textarea, starting with speaker's name */ Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2008-10-26 21:11:36 UTC (rev 5473) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2008-10-26 22:16:25 UTC (rev 5474) @@ -22,6 +22,7 @@ #include "../../includes/win32def.h" #include "../../includes/overlays.h" #include "../../includes/opcode_params.h" +#include "../../includes/ie_feats.h" //cannot avoid declaring these #include "../Core/Actor.h" #include "../Core/EffectQueue.h" #include "../Core/Interface.h" @@ -2397,6 +2398,10 @@ } //417 AreaEffect +//move these flags to a header file if used by elsewhere +#define AE_REPEAT 1 +#define AE_TARGETEXCL 2 + int fx_area_effect (Actor* Owner, Actor* target, Effect* fx) { if (0) printf( "fx_area_effect (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); @@ -2410,11 +2415,12 @@ EffectQueue *fxqueue = spell->GetEffectBlock(0); fxqueue->SetOwner(Owner); - fxqueue->AffectAllInRange(target->GetCurrentArea(), pos, 0, 0,fx->Parameter1, target); - + //bit 2 original target is excluded or not excluded + fxqueue->AffectAllInRange(target->GetCurrentArea(), pos, 0, 0,fx->Parameter1, fx->Parameter2&AE_TARGETEXCL?target:NULL); delete fxqueue; - if (fx->Parameter2&1) { + //bit 1 repeat or only once + if (fx->Parameter2&AE_REPEAT) { return FX_APPLIED; } return FX_NOT_APPLIED; @@ -2978,38 +2984,94 @@ } //453 PowerAttack +static EffectRef fx_expertise_ref={"Expertise",NULL,-1}; + int fx_power_attack (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_power_attack (%2d)\n", fx->Opcode); - if (target->SetSpellState( SS_POWERATTACK)) return FX_APPLIED; - //TODO: + + if (fx->FirstApply) { + if (target->HasSpellState(SS_EXPERTISE)) { + //stopped using feat: Expertise + target->fxqueue.RemoveAllEffects(fx_expertise_ref); + } + } + unsigned int x; + x = target->GetFeat(FEAT_POWER_ATTACK); + if (x>5) x=5; + for(unsigned int i = 0;i<5;i++) { + if (i<x) { + target->SetSpellState( SS_POWERATTACK); + } else { + //FIXME: doubt we need UnSetSpellState + //target->UnSetSpellState(SS_POWERATTACK+x); + } + } return FX_APPLIED; } //454 Expertise +static EffectRef fx_powerattack_ref={"PowerAttack",NULL,-1}; + int fx_expertise (Actor* /*Owner*/, Actor* target, Effect* fx) { +//expertise feat: +//convert positive base attack bonus into AC (dodge bonus) +//up to feat_expertise count (player's choice) if (0) printf( "fx_expertise (%2d)\n", fx->Opcode); - if (target->SetSpellState( SS_EXPERTISE)) return FX_APPLIED; - //TODO: + if (fx->FirstApply) { + if (target->HasSpellState(SS_POWERATTACK)) { + target->fxqueue.RemoveAllEffects(fx_powerattack_ref); + } + } + unsigned int x; + + x = target->GetFeat(FEAT_EXPERTISE); + if (x>5) x=5; + for(unsigned int i = 0;i<5;i++) { + if (i<x) { + target->SetSpellState(SS_EXPERTISE+x); + } else { + //FIXME: doubt we need UnSetSpellState + //target->UnSetSpellState(SS_EXPERTISE+x); + } + } return FX_APPLIED; } //455 ArterialStrike +static EffectRef fx_hamstring_ref={"HamString",NULL,-1}; + int fx_arterial_strike (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_arterial_strike (%2d)\n", fx->Opcode); - if (target->SetSpellState( SS_ARTERIAL)) return FX_APPLIED; - //TODO: + if (fx->FirstApply) { + if (target->HasSpellState(SS_HAMSTRING)) { + target->fxqueue.RemoveAllEffects(fx_hamstring_ref); + } + } + if (target->SetSpellState( SS_ARTERIAL)) { + //TODO:display using feat arterial strike + return FX_APPLIED; + } return FX_APPLIED; } //456 HamString +static EffectRef fx_arterialstrike_ref={"ArterialStrike",NULL,-1}; + int fx_hamstring (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_hamstring (%2d)\n", fx->Opcode); - if (target->SetSpellState( SS_HAMSTRING)) return FX_APPLIED; - //TODO: + if (fx->FirstApply) { + if (target->HasSpellState(SS_ARTERIAL)) { + target->fxqueue.RemoveAllEffects(fx_arterialstrike_ref); + } + } + if (target->SetSpellState( SS_HAMSTRING)) { + //TODO:display using feat hamstring + return FX_APPLIED; + } return FX_APPLIED; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-11-02 00:06:00
|
Revision: 5478 http://gemrb.svn.sourceforge.net/gemrb/?rev=5478&view=rev Author: avenger_teambg Date: 2008-11-02 00:05:56 +0000 (Sun, 02 Nov 2008) Log Message: ----------- bard song fields in .gam and .chr files Modified Paths: -------------- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp Modified: gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2008-10-29 22:15:50 UTC (rev 5477) +++ gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2008-11-02 00:05:56 UTC (rev 5478) @@ -201,7 +201,12 @@ for (i=0;i<QSPCount;i++) { stream->WriteResRef (act->PCStats->QuickSpells[i]); } + //This is 9 for IWD2 and GemRB if (QSPCount==9) { + //NOTE: the gemrb internal format stores + //0xff or 0xfe in case of innates and bardsongs + //if IWD2 doesn't tolerate this, then this field + //should be sanitized for IWD2 (not for GemRB) stream->Write( act->PCStats->QuickSpellClass,9); tmpByte = 0; stream->Write( &tmpByte, 1); @@ -216,15 +221,25 @@ } switch (CREVersion) { case IE_CRE_V2_2: - //IWD2 quick innates are saved elsewhere, redundantly + //gemrb format doesn't save these redundantly for (i=0;i<QSPCount;i++) { - stream->WriteResRef (act->PCStats->QuickSpells[i]); + if (act->PCStats->QuickSpellClass[i]==0xff) { + stream->WriteResRef (act->PCStats->QuickSpells[i]); + } else { + //empty field + stream->Write( Signature, 8); + } } + for (i=0;i<QSPCount;i++) { + if (act->PCStats->QuickSpellClass[i]==0xfe) { + stream->WriteResRef (act->PCStats->QuickSpells[i]); + } else { + //empty field + stream->Write( Signature, 8); + } + } //fallthrough case IE_CRE_GEMRB: - for (i=0;i<18;i++) { - stream->WriteDword( &tmpDword); - } for (i=0;i<QSPCount;i++) { tmpDword = act->PCStats->QSlots[i]; stream->WriteDword( &tmpDword); Modified: gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp 2008-10-29 22:15:50 UTC (rev 5477) +++ gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp 2008-11-02 00:05:56 UTC (rev 5478) @@ -339,20 +339,33 @@ } pcInfo.QuickItemHeader[3]=0xffff; pcInfo.QuickItemHeader[4]=0xffff; - //innates, we spare some memory and time by storing them in the - //same place if (version == GAM_VER_IWD2) { + //quick innates + //we spare some memory and time by storing them in the same place + //this may be slightly buggy because IWD2 doesn't clear the + //fields, but QuickSpellClass is set correctly, problem is + //that GemRB doesn't clear QuickSpellClass for (i = 0; i < MAX_QSLOTS; i++) { str->Read( &tmp[i], 8 ); if ((tmp[0]!=0) && (pcInfo.QuickSpellResRef[0]==0)) { memcpy( pcInfo.QuickSpellResRef[i], tmp, 8); + //innates pcInfo.QuickSpellClass[i]=0xff; } } + //recently discovered fields (bard songs) + //str->Seek( 72, GEM_CURRENT_POS); + for(i = 0; i<MAX_QSLOTS;i++) { + str->Read( &tmp[i], 8 ); + if ((tmp[0]!=0) && (pcInfo.QuickSpellResRef[0]==0)) { + memcpy( pcInfo.QuickSpellResRef[i], tmp, 8); + //bardsongs + pcInfo.QuickSpellClass[i]=0xfe; + } + } } //QuickSlots are customisable in iwd2 and GemRB //thus we adopt the iwd2 style actor info - str->Seek( 72, GEM_CURRENT_POS); for (i=0;i<MAX_QSLOTS;i++) { str->ReadDword( &tmpDword ); pcInfo.QSlots[i] = (ieByte) tmpDword; @@ -805,15 +818,23 @@ //quickspells if (version==GAM_VER_IWD2 || version==GAM_VER_GEMRB) { for (i=0;i<MAX_QSLOTS;i++) { - if (ac->PCStats->QuickSpellClass[i]==0xff) { + if ( (ieByte) ac->PCStats->QuickSpellClass[i]>=0xfe) { stream->Write(filling,8); } else { stream->Write(ac->PCStats->QuickSpells[i],8); } } - //quick spell classes - stream->Write(ac->PCStats->QuickSpellClass,MAX_QSLOTS); - stream->Write(filling,1); + //quick spell classes, clear the field for iwd2 if it is + //a bard song/innate slot (0xfe or 0xff) + memcpy(filling, ac->PCStats->QuickSpellClass, MAX_QSLOTS); + if (version==GAM_VER_IWD2) { + for(i=0;i<MAX_QSLOTS;i++) { + if((ieByte) filling[i]>=0xfe) { + filling[i]=0; + } + } + } + stream->Write(filling,10); } else { for (i=0;i<3;i++) { stream->Write(ac->PCStats->QuickSpells[i],8); @@ -840,20 +861,23 @@ break; } - //innates + //innates, bard songs and quick slots are saved only in iwd2 if (version==GAM_VER_IWD2 || version==GAM_VER_GEMRB) { for (i=0;i<MAX_QSLOTS;i++) { - if (ac->PCStats->QuickSpellClass[i]==0xff) { + if ( (ieByte) ac->PCStats->QuickSpellClass[i]==0xff) { stream->Write(ac->PCStats->QuickSpells[i],8); } else { stream->Write(filling,8); } } - } - - if (version==GAM_VER_IWD2 || version==GAM_VER_GEMRB) { - stream->Write( filling, 72); for (i=0;i<MAX_QSLOTS;i++) { + if ((ieByte) ac->PCStats->QuickSpellClass[i]==0xfe) { + stream->Write(ac->PCStats->QuickSpells[i],8); + } else { + stream->Write(filling,8); + } + } + for (i=0;i<MAX_QSLOTS;i++) { tmpDword = ac->PCStats->QSlots[i]; stream->WriteDword( &tmpDword); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-11-29 13:40:50
|
Revision: 5484 http://gemrb.svn.sourceforge.net/gemrb/?rev=5484&view=rev Author: avenger_teambg Date: 2008-11-29 13:40:39 +0000 (Sat, 29 Nov 2008) Log Message: ----------- fixed not depleting items implemented CreateLight in SDLVideoDriver to support light blot creation in light emitting projectiles Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Item.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/Video.h gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h Modified: gemrb/trunk/gemrb/plugins/Core/Item.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.cpp 2008-11-11 17:40:35 UTC (rev 5483) +++ gemrb/trunk/gemrb/plugins/Core/Item.cpp 2008-11-29 13:40:39 UTC (rev 5484) @@ -127,10 +127,11 @@ if (header>=CHARGE_COUNTERS) { header = 0; } - ccount = --Charges[header]; + //if the item started from 0 charges, then it isn't depleting if (ieh->Charges==0) { return CHG_NONE; } + ccount = --Charges[header]; if (ccount>0) { return CHG_NONE; } Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2008-11-11 17:40:35 UTC (rev 5483) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2008-11-29 13:40:39 UTC (rev 5484) @@ -197,9 +197,7 @@ //} } if (TFlags&PTF_LIGHT) { - //TODO: create the light spot sprite - //it is a per pixel blend thingie, mostly white - //light = CreateLight(LightX, LightY, LightZ); + light = core->GetVideoDriver()->CreateLight(LightX, LightZ); } if (TFlags&PTF_BLEND) { SetBlend(); @@ -574,8 +572,11 @@ Sprite2D *frame = shadow[face]->NextFrame(); video->BlitGameSprite( frame, pos.x, pos.y, flag, tint, NULL, NULL, &screen); } + if (light) { - video->BlitGameSprite( light, pos.x, pos.y, flag, tint, NULL, NULL, &screen); + //FIXME: wallgroup cover for light is not rendered correctly + //it is not a BAM sprite, we need a conversion? + video->BlitGameSprite( light, pos.x, pos.y, 0, tint, NULL, NULL, &screen); } if (SFlags&PSF_FLYING) { Modified: gemrb/trunk/gemrb/plugins/Core/Video.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Video.h 2008-11-11 17:40:35 UTC (rev 5483) +++ gemrb/trunk/gemrb/plugins/Core/Video.h 2008-11-29 13:40:39 UTC (rev 5484) @@ -233,7 +233,11 @@ * is transparent. * It is used to mask clicks to non-rectangular shaped controls */ virtual bool IsSpritePixelTransparent(Sprite2D* sprite, unsigned short x, unsigned short y) = 0; + /** Scales down a sprite by a ratio */ virtual Sprite2D* SpriteScaleDown( Sprite2D* sprite, unsigned int ratio ) = 0; + /** Creates an ellipse or circle shaped sprite with various intensity + * for projectile light spots */ + virtual Sprite2D* CreateLight(int radius, int intensity) = 0; virtual void SetGamma(int brightness, int contrast) = 0; virtual void SetMouseScrollSpeed(int speed) = 0; }; Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2008-11-11 17:40:35 UTC (rev 5483) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2008-11-29 13:40:39 UTC (rev 5484) @@ -2114,6 +2114,37 @@ return sum; } +//both parameters must be signed for correct calculation +Sprite2D* SDLVideoDriver::CreateLight(int radius, int intensity) +{ + if(!radius) return NULL; + Point p, q; + int a; + void* pixels = malloc( radius * radius * 4 * 4); + int i = 0; + + for (p.y = -radius; p.y < radius; p.y++) { + for (p.x = -radius; p.x < radius; p.x++) { + a = intensity*(radius-(signed) Distance(p,q))/radius; + + if(a<0) a=0; + else if(a>255) a = 255; + + *((unsigned char*)pixels + i++) = 255; + *((unsigned char*)pixels + i++) = 255; + *((unsigned char*)pixels + i++) = 255; + *((unsigned char*)pixels + i++) = (unsigned char) a/2; + } + } + + Sprite2D* light = CreateSprite( radius*2, radius*2, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000, pixels); + + light->XPos = radius; + light->YPos = radius; + + return light; +} + Sprite2D* SDLVideoDriver::SpriteScaleDown( Sprite2D* sprite, unsigned int ratio ) { unsigned int Width = sprite->Width / ratio; Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2008-11-11 17:40:35 UTC (rev 5483) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2008-11-29 13:40:39 UTC (rev 5484) @@ -172,7 +172,8 @@ Color SpriteGetPixel (Sprite2D* sprite, unsigned short x, unsigned short y); Color SpriteGetPixelSum (Sprite2D* sprite, unsigned short xbase, unsigned short ybase, unsigned int ratio); bool IsSpritePixelTransparent (Sprite2D* sprite, unsigned short x, unsigned short y); - Sprite2D* SpriteScaleDown( Sprite2D* sprite, unsigned int ratio ); + Sprite2D* SpriteScaleDown( Sprite2D* sprite, unsigned int ratio ); + Sprite2D* CreateLight(int radius, int intensity); //both parameters must be signed void SetGamma(int brightness, int contrast); void SetMouseScrollSpeed(int speed); void release(void) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-12-06 10:58:09
|
Revision: 5497 http://gemrb.svn.sourceforge.net/gemrb/?rev=5497&view=rev Author: avenger_teambg Date: 2008-12-06 10:57:59 +0000 (Sat, 06 Dec 2008) Log Message: ----------- added extended night support (alternate tilesets/lightmap/minimap for day/night) added night/day switching movies (movies are customisable by the restmov.2da file) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp gemrb/trunk/gemrb/plugins/AREImporter/AREImp.h gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Game.h gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/Map.h gemrb/trunk/gemrb/plugins/Core/MapMgr.h gemrb/trunk/gemrb/plugins/Core/TileMap.cpp gemrb/trunk/gemrb/plugins/Core/TileMap.h gemrb/trunk/gemrb/plugins/Core/TileMapMgr.h gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.cpp gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.h Modified: gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2008-12-06 10:57:59 UTC (rev 5497) @@ -225,8 +225,64 @@ return true; } -Map* AREImp::GetMap(const char *ResRef) +//alter a map to the night/day version in case of an extended night map (bg2 specific) +//return true, if change happened, in which case a movie is played by the Game object +bool AREImp::ChangeMap(Map *map, bool day_or_night) { + ieResRef TmpResRef; + + //get the right tilemap name + if (day_or_night) { + memcpy( TmpResRef, map->WEDResRef, 9); + } else { + snprintf( TmpResRef, 9, "%sN", map->WEDResRef); + } + TileMapMgr* tmm = ( TileMapMgr* ) core->GetInterface( IE_WED_CLASS_ID ); + DataStream* wedfile = core->GetResourceMgr()->GetResource( TmpResRef, IE_WED_CLASS_ID ); + tmm->Open( wedfile ); + + //alter the tilemap object, not all parts of that object are coming from the wed/tis + //this is why we have to be careful + //TODO: consider refactoring TileMap so invariable data coming from the .ARE file + //are not handled by it, then TileMap could be simply swapped + TileMap* tm = map->GetTileMap(); + + if (tm) { + tm->ClearOverlays(); + } + tm = tmm->GetTileMap(tm); + if (!tm) { + printf( "[AREImporter]: No Tile Map Available.\n" ); + core->FreeInterface( tmm ); + return false; + } + + // Small map for MapControl + ImageMgr* sm = ( ImageMgr* ) core->GetInterface( IE_MOS_CLASS_ID ); + DataStream* smstr = core->GetResourceMgr()->GetResource( TmpResRef, IE_MOS_CLASS_ID ); + sm->Open( smstr, true ); + + //the map state was altered, no need to hold this off for any later + map->DayNight = day_or_night; + + //get the lightmap name + if (day_or_night) { + snprintf( TmpResRef, 9, "%sLM", map->WEDResRef); + } else { + snprintf( TmpResRef, 9, "%sLN", map->WEDResRef); + } + + ImageMgr* lm = ( ImageMgr* ) core->GetInterface( IE_BMP_CLASS_ID ); + DataStream* lmstr = core->GetResourceMgr()->GetResource( TmpResRef, IE_BMP_CLASS_ID ); + lm->Open( lmstr, true ); + + //alter the lightmap and the minimap (the tileset was already swapped) + map->ChangeTileMap(lm, sm); + return true; +} + +Map* AREImp::GetMap(const char *ResRef, bool day_or_night) +{ unsigned int i,x; Map* map = new Map(); @@ -238,12 +294,13 @@ map->version = bigheader; } - map->AreaFlags=AreaFlags; - map->Rain=WRain; - map->Snow=WSnow; - map->Fog=WFog; - map->Lightning=WLightning; - map->AreaType=AreaType; + map->AreaFlags = AreaFlags; + map->Rain = WRain; + map->Snow = WSnow; + map->Fog = WFog; + map->Lightning = WLightning; + map->AreaType = AreaType; + map->DayNight = day_or_night; //we have to set this here because the actors will receive their //current area setting here, areas' 'scriptname' is their name @@ -259,16 +316,30 @@ printf( "[AREImporter]: No Tile Map Manager Available.\n" ); return false; } + ieResRef TmpResRef; + + if (day_or_night) { + memcpy( TmpResRef, map->WEDResRef, 9); + } else { + snprintf( TmpResRef, 9, "%sN", map->WEDResRef); + } TileMapMgr* tmm = ( TileMapMgr* ) core->GetInterface( IE_WED_CLASS_ID ); DataStream* wedfile = core->GetResourceMgr()->GetResource( WEDResRef, IE_WED_CLASS_ID ); tmm->Open( wedfile ); - TileMap* tm = tmm->GetTileMap(); + + //there was no tilemap set yet, so lets just send a NULL + TileMap* tm = tmm->GetTileMap(NULL); if (!tm) { printf( "[AREImporter]: No Tile Map Available.\n" ); core->FreeInterface( tmm ); return false; } + // Small map for MapControl + ImageMgr* sm = ( ImageMgr* ) core->GetInterface( IE_MOS_CLASS_ID ); + DataStream* smstr = core->GetResourceMgr()->GetResource( TmpResRef, IE_MOS_CLASS_ID ); + sm->Open( smstr, true ); + if (Script[0]) { map->Scripts[0] = new GameScript( Script, ST_AREA ); } else { @@ -278,8 +349,11 @@ map->Scripts[0]->MySelf = map; } - ieResRef TmpResRef; - snprintf( TmpResRef, 9, "%sLM", WEDResRef); + if (day_or_night) { + snprintf( TmpResRef, 9, "%sLM", WEDResRef); + } else { + snprintf( TmpResRef, 9, "%sLN", WEDResRef); + } ImageMgr* lm = ( ImageMgr* ) core->GetInterface( IE_BMP_CLASS_ID ); DataStream* lmstr = core->GetResourceMgr()->GetResource( TmpResRef, IE_BMP_CLASS_ID ); @@ -297,11 +371,6 @@ DataStream* hmstr = core->GetResourceMgr()->GetResource( TmpResRef, IE_BMP_CLASS_ID ); hm->Open( hmstr, true ); - // Small map for MapControl - ImageMgr* sm = ( ImageMgr* ) core->GetInterface( IE_MOS_CLASS_ID ); - DataStream* smstr = core->GetResourceMgr()->GetResource( WEDResRef, IE_MOS_CLASS_ID ); - sm->Open( smstr, true ); - map->AddTileMap( tm, lm, sr, sm, hm ); strnlwrcpy( map->WEDResRef, WEDResRef, 8); Modified: gemrb/trunk/gemrb/plugins/AREImporter/AREImp.h =================================================================== --- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/AREImporter/AREImp.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -55,7 +55,8 @@ AREImp(void); ~AREImp(void); bool Open(DataStream* stream, bool autoFree = true); - Map* GetMap(const char* ResRef); + bool ChangeMap(Map *map, bool day_or_night); + Map* GetMap(const char* ResRef, bool day_or_night); int GetStoredFileSize(Map *map); /* stores an area in the Cache (swaps it out) */ int PutArea(DataStream *stream, Map *map); Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-12-06 10:57:59 UTC (rev 5497) @@ -75,16 +75,21 @@ core->DelTable(mtab); } - //loading rest movies (only bg2 has them) + //loading rest/daylight switching movies (only bg2 has them) memset(restmovies,'*',sizeof(restmovies)); + memset(daymovies,'*',sizeof(restmovies)); + memset(nightmovies,'*',sizeof(restmovies)); mtab = core->LoadTable("restmov"); table = core->GetTable(mtab); if (table) { for(int i=0;i<8;i++) { strnuprcpy(restmovies[i],table->QueryField(i,0),8); + strnuprcpy(daymovies[i],table->QueryField(i,1),8); + strnuprcpy(nightmovies[i],table->QueryField(i,2),8); } core->DelTable(mtab); } + interval = 1000/AI_UPDATE_TIME; //FIXME:i'm not sure in this... NoInterrupt(); @@ -532,6 +537,8 @@ area = GetMap(index); memcpy (CurrentArea, areaname, 8); area->SetupAmbients(); + //change the tileset if needed + area->ChangeMap(IsDay()); ChangeSong(); return area; } @@ -655,7 +662,7 @@ core->FreeInterface( mM ); return -1; } - Map* newMap = mM->GetMap(ResRef); + Map* newMap = mM->GetMap(ResRef, IsDay()); core->FreeInterface( mM ); if (!newMap) { return -1; @@ -907,6 +914,7 @@ //called when someone died void Game::PartyMemberDied(Actor *actor) { + //this could be null, in some extreme cases... Map *area = actor->GetCurrentArea(); for (unsigned int i=0; i<PCs.size(); i++) { @@ -1000,6 +1008,25 @@ WeatherBits&=~WB_HASWEATHER; } Ticks+=add*interval; + //change the tileset if needed + Map *map = GetCurrentArea(); + if (map && map->ChangeMap(IsDay())) { + //play the daylight transition movie appropriate for the area + //it is needed to play only when the area truly changed its tileset + //this is signalled by ChangeMap + int areatype = (area->AreaType&(AT_FOREST|AT_CITY|AT_DUNGEON))>>3; + ieResRef *res; + + printMessage("Game","Switching DayLight\n",GREEN); + if (IsDay()) { + res=&nightmovies[areatype]; + } else { + res=&daymovies[areatype]; + } + if (*res[0]!='*') { + core->PlayMovie(*res); + } + } } //returns true if there are excess players in the team @@ -1283,16 +1310,25 @@ if ((map->AreaType&(AT_OUTDOOR|AT_DAYNIGHT|AT_EXTENDED_NIGHT)) == (AT_OUTDOOR|AT_DAYNIGHT) ) { //get daytime colour ieDword daynight = (GameTime%7200/300); - if (daynight<2 || daynight>11) { + if (daynight<2 || daynight>22) { return &NightTint; } - if (daynight>9 || daynight<4) { + if (daynight>20 || daynight<4) { return &DuskTint; } } return NULL; } +bool Game::IsDay() +{ + ieDword daynight = (GameTime%7200/300); + if(daynight<4 || daynight>20) { + return false; + } + return true; +} + void Game::InAttack(ieDword globalID) { std::vector< ieDword>::const_iterator idx; Modified: gemrb/trunk/gemrb/plugins/Core/Game.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/Game.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -180,6 +180,8 @@ std::vector< ieDword> Attackers; CRRow *crtable; ieResRef restmovies[8]; + ieResRef daymovies[8]; + ieResRef nightmovies[8]; int MapIndex; public: std::vector< Actor*> selected; @@ -270,8 +272,6 @@ Map* GetMap(const char *areaname, bool change); /** Returns slot of the map if found */ int FindMap(const char *ResRef); - /* use GetCurrentArea() */ - //Map * GetCurrentMap(); int AddMap(Map* map); /** Determine if area is master area*/ bool MasterArea(const char *area); @@ -284,6 +284,7 @@ int DelMap(unsigned int index, int forced = 0); int AddNPC(Actor* npc); Actor* GetNPC(unsigned int Index); + bool IsDay(); void InAttack(ieDword globalID); void OutAttack(ieDword globalID); int AttackersOf(ieDword globalID, Map *area) const; Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2008-12-06 10:57:59 UTC (rev 5497) @@ -38,6 +38,7 @@ #include "WorldMap.h" #include "GameControl.h" #include "Palette.h" +#include "MapMgr.h" #include <cmath> #include <cassert> @@ -391,6 +392,23 @@ WallCount=0; } +void Map::ChangeTileMap(ImageMgr* lm, ImageMgr* sm) +{ + delete LightMap; + delete SmallMap; + + LightMap = lm; + SmallMap = sm; + +/* move this to the tilemap swapper code + if (Width!=(unsigned int) (TMap->XCellCount * 4) || + Height!=(unsigned int) (( TMap->YCellCount * 64 ) / 12) ) { + printMessage("Map", " ", RED); + printf( "TileSet dimensions for %s and %sN are different \n", WEDResRef, WEDResRef ); + } +*/ +} + void Map::AddTileMap(TileMap* tm, ImageMgr* lm, ImageMgr* sr, ImageMgr* sm, ImageMgr* hm) { // CHECKME: leaks? Should the old TMap, LightMap, etc... be freed? @@ -399,8 +417,8 @@ SearchMap = sr; HeightMap = hm; SmallMap = sm; - Width=TMap->XCellCount * 4; - Height=( TMap->YCellCount * 64 ) / 12; + Width = (unsigned int) (TMap->XCellCount * 4); + Height = (unsigned int) (( TMap->YCellCount * 64 ) / 12); //Filling Matrices MapSet = (unsigned short *) malloc(sizeof(unsigned short) * Width * Height); //converting searchmap to internal format @@ -2823,3 +2841,21 @@ BLIT_TINTED, tint, covers?covers[ac]:0, palette, &screen ); } } + +//change the tileset if needed and possible, return true if changed +bool Map::ChangeMap(bool day_or_night) +{ + //no need of change if the area is not extended night + if (! (AreaType&AT_EXTENDED_NIGHT)) return false; + //no need of change if the area already has the right tilemap + if ((DayNight == day_or_night) && GetTileMap()) return false; + + MapMgr* mM = ( MapMgr* ) core->GetInterface( IE_ARE_CLASS_ID ); + //no need to open and read the .are file again + //using the ARE class for this because ChangeMap is similar to LoadMap + //it loads the lightmap and the minimap too, besides swapping the tileset + mM->ChangeMap(this, day_or_night); + core->FreeInterface( mM ); + return true; +} + Modified: gemrb/trunk/gemrb/plugins/Core/Map.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/Map.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -225,6 +225,8 @@ ieResRef WEDResRef; ieWord localActorCounter; bool MasterArea; + //this is set by the importer (not stored in the file) + bool DayNight; private: ieStrRef trackString; bool trackFlag; @@ -253,6 +255,12 @@ /** prints useful information on console */ void DebugDump(); + TileMap *GetTileMap() { return TMap; } + /* gets the signal of daylight changes */ + bool ChangeMap(bool day_or_night); + /* low level function to perform the daylight changes */ + void ChangeTileMap(ImageMgr* lm, ImageMgr* sm); + /* sets all the auxiliary maps and the tileset */ void AddTileMap(TileMap* tm, ImageMgr* lm, ImageMgr* sr, ImageMgr* sm, ImageMgr* hm); void UpdateScripts(); void UpdateEffects(); Modified: gemrb/trunk/gemrb/plugins/Core/MapMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/MapMgr.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/MapMgr.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -55,7 +55,8 @@ MapMgr(void); virtual ~MapMgr(void); virtual bool Open(DataStream* stream, bool autoFree = true) = 0; - virtual Map* GetMap(const char* ResRef) = 0; + virtual bool ChangeMap(Map *map, bool day_or_night) = 0; + virtual Map* GetMap(const char* ResRef, bool day_or_night) = 0; virtual int GetStoredFileSize(Map *map) = 0; virtual int PutArea(DataStream* stream, Map *map) = 0; Modified: gemrb/trunk/gemrb/plugins/Core/TileMap.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TileMap.cpp 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/TileMap.cpp 2008-12-06 10:57:59 UTC (rev 5497) @@ -54,6 +54,21 @@ } } +//this needs in case of a tileset switch (for extended night) +void TileMap::ClearOverlays() +{ + size_t i; + + for (i = 0; i < overlays.size(); i++) { + delete( overlays[i] ); + } + overlays.clear(); + for (i = 0; i < overlays.size(); i++) { + delete( rain_overlays[i]); + } + rain_overlays.clear(); +} + //tiled objects TileObject* TileMap::AddTile(const char *ID, const char* Name, unsigned int Flags, unsigned short* openindices, int opencount, unsigned short* closeindices, int closecount) Modified: gemrb/trunk/gemrb/plugins/Core/TileMap.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TileMap.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/TileMap.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -84,6 +84,7 @@ TileObject* GetTile(const char* Name); size_t GetTileCount() { return tiles.size(); } + void ClearOverlays(); void AddOverlay(TileOverlay* overlay); void AddRainOverlay(TileOverlay* overlay); void DrawOverlays(Region screen, int rain); Modified: gemrb/trunk/gemrb/plugins/Core/TileMapMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TileMapMgr.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/Core/TileMapMgr.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -43,7 +43,7 @@ TileMapMgr(void); virtual ~TileMapMgr(void); virtual bool Open(DataStream* stream, bool autoFree = true) = 0; - virtual TileMap* GetTileMap() = 0; + virtual TileMap* GetTileMap(TileMap *tm) = 0; virtual ieWord* GetDoorIndices(char* ResRef, int* count, bool& BaseClosed) = 0; virtual void SetupOpenDoor(unsigned int &index, unsigned int &count) = 0; Modified: gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.cpp 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.cpp 2008-12-06 10:57:59 UTC (rev 5497) @@ -151,7 +151,8 @@ return usedoverlays; } -TileMap* WEDImp::GetTileMap() +//this will replace the tileset of an existing tilemap, or create a new one +TileMap* WEDImp::GetTileMap(TileMap *tm) { int usedoverlays; @@ -162,8 +163,11 @@ if (!overlays.size()) { return NULL; } - TileMap* tm = new TileMap(); + if (!tm) { + tm = new TileMap(); + } + usedoverlays = AddOverlay(tm, &overlays.at(0), false); AddOverlay(tm, &overlays.at(0), true); Modified: gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.h =================================================================== --- gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.h 2008-12-06 10:52:46 UTC (rev 5496) +++ gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.h 2008-12-06 10:57:59 UTC (rev 5497) @@ -54,7 +54,8 @@ WEDImp(void); ~WEDImp(void); bool Open(DataStream* stream, bool autoFree = true); - TileMap* GetTileMap(); + //if tilemap already exists, don't create it + TileMap* GetTileMap(TileMap *tm); ieWord* GetDoorIndices(char* ResRef, int* count, bool& BaseClosed); Wall_Polygon **GetWallGroups(); ieDword GetWallPolygonsCount() { return WallPolygonsCount; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-25 20:26:54
|
Revision: 5532 http://gemrb.svn.sourceforge.net/gemrb/?rev=5532&view=rev Author: wjpalenstijn Date: 2009-01-25 20:26:48 +0000 (Sun, 25 Jan 2009) Log Message: ----------- patch from fuzzie: refactor scrolling code Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.h gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h gemrb/trunk/gemrb/plugins/Core/Video.h gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2009-01-25 20:26:48 UTC (rev 5532) @@ -21,6 +21,7 @@ #include "../../includes/win32def.h" #include "EventMgr.h" +#include "GameControl.h" #include "Interface.h" #include "Video.h" @@ -147,6 +148,11 @@ if (!last_win_focused) { return; } + GameControl *gc = core->GetGameControl(); + if (gc) { + // for scrolling + gc->OnGlobalMouseMove(x, y); + } std::vector< int>::iterator t; std::vector< Window*>::iterator m; for (t = topwin.begin(); t != topwin.end(); ++t) { Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-01-25 20:26:48 UTC (rev 5532) @@ -109,6 +109,8 @@ pfs.null(); lastCursor = IE_CURSOR_NORMAL; moveX = moveY = 0; + scrolling = false; + numScrollCursor = 0; DebugFlags = 0; AIUpdateCounter = 1; // effect = NULL; @@ -338,23 +340,20 @@ Video* video = core->GetVideoDriver(); Region viewport = video->GetViewport(); - if (video->moveX || video->moveY) { - viewport.x += video->moveX; - viewport.y += video->moveY; + if (moveX || moveY) { + viewport.x += moveX; + viewport.y += moveY; Point mapsize = core->GetGame()->GetCurrentArea()->TMap->GetMapSize(); - if ( viewport.x + video->moveX < 0 )//if we are at top of the map + if ( viewport.x < 0 )//if we are at top of the map viewport.x = 0; - else if ( (viewport.x + video->moveX + viewport.w) >= mapsize.x) //if we are at the bottom + else if ( (viewport.x + viewport.w) >= mapsize.x) //if we are at the bottom viewport.x = mapsize.x - viewport.w; - else - viewport.x += video->moveX; //middle :) - if ( viewport.y + video->moveY < 0 ) //if we are at the left of the map + if ( viewport.y < 0 ) //if we are at the left of the map viewport.y = 0; - else if ( (viewport.y + video->moveY + viewport.h ) >= mapsize.y ) //if we are at the right + else if ( (viewport.y + viewport.h ) >= mapsize.y ) //if we are at the right viewport.y = mapsize.y - viewport.h; - else - viewport.y += video->moveY; //middle :) + core->timer->SetMoveViewPort( viewport.x, viewport.y, 0, false ); } Region screen( x + XPos, y + YPos, Width, Height ); @@ -1055,6 +1054,75 @@ } } +#define SCROLL_BORDER 5 + +/** Global Mouse Move Event */ +void GameControl::OnGlobalMouseMove(unsigned short x, unsigned short y) +{ + if (ScreenFlags & SF_DISABLEMOUSE) { + return; + } + + if (Owner->Visible!=WINDOW_VISIBLE) { + return; + } + + int mousescrollspd = core->GetMouseScrollSpeed(); + + if (x <= SCROLL_BORDER) + moveX = -mousescrollspd; + else { + if (x >= ( core->Width - SCROLL_BORDER )) + moveX = mousescrollspd; + else + moveX = 0; + } + if (y <= SCROLL_BORDER) + moveY = -mousescrollspd; + else { + if (y >= ( core->Height - SCROLL_BORDER )) + moveY = mousescrollspd; + else + moveY = 0; + } + + if (moveX != 0 || moveY != 0) { + scrolling = true; + } else if (scrolling) { + scrolling = false; + + Video* video = core->GetVideoDriver(); + video->SetDragCursor(NULL); + } +} + +void GameControl::UpdateScrolling() { + if (!scrolling) return; + + int mousescrollspd = core->GetMouseScrollSpeed(); // TODO: why check against this value and not +/-? + Video* video = core->GetVideoDriver(); + + if (moveX == mousescrollspd && moveY == 0) { // right + video->SetDragCursor(core->GetScrollCursorSprite(0,numScrollCursor)); + } else if (moveX == mousescrollspd && moveY == -mousescrollspd) { // upper right + video->SetDragCursor(core->GetScrollCursorSprite(1,numScrollCursor)); + } else if (moveX == 0 && moveY == -mousescrollspd) { // up + video->SetDragCursor(core->GetScrollCursorSprite(2,numScrollCursor)); + } else if (moveX == -mousescrollspd && moveY == -mousescrollspd) { // upper left + video->SetDragCursor(core->GetScrollCursorSprite(3,numScrollCursor)); + } else if (moveX == -mousescrollspd && moveY == 0) { // left + video->SetDragCursor(core->GetScrollCursorSprite(4,numScrollCursor)); + } else if (moveX == -mousescrollspd && moveY == mousescrollspd) { // bottom left + video->SetDragCursor(core->GetScrollCursorSprite(5,numScrollCursor)); + } else if (moveX == 0 && moveY == mousescrollspd) { // bottom + video->SetDragCursor(core->GetScrollCursorSprite(6,numScrollCursor)); + } else if (moveX == mousescrollspd && moveY == mousescrollspd) { // bottom right + video->SetDragCursor(core->GetScrollCursorSprite(7,numScrollCursor)); + } + + numScrollCursor = (numScrollCursor+1) % 15; +} + void GameControl::TryToAttack(Actor *source, Actor *tgt) { char Tmp[40]; @@ -1673,6 +1741,8 @@ { if (active) { ScreenFlags |= (SF_DISABLEMOUSE | SF_LOCKSCROLL | SF_CUTSCENE); + moveX = 0; + moveY = 0; } else { ScreenFlags &= ~(SF_DISABLEMOUSE | SF_LOCKSCROLL | SF_CUTSCENE); } Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.h 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.h 2009-01-25 20:26:48 UTC (rev 5532) @@ -121,6 +121,8 @@ private: unsigned char lastCursor; short moveX, moveY; + int numScrollCursor; + bool scrolling; unsigned short lastMouseX, lastMouseY; int DebugFlags; Point pfs; @@ -135,6 +137,8 @@ void OnKeyRelease(unsigned char Key, unsigned short Mod); /** Mouse Over Event */ void OnMouseOver(unsigned short x, unsigned short y); + /** Global Mouse Move Event */ + void OnGlobalMouseMove(unsigned short x, unsigned short y); /** Mouse Button Down */ void OnMouseDown(unsigned short x, unsigned short y, unsigned short Button, unsigned short Mod); @@ -143,6 +147,7 @@ unsigned short Mod); /** Special Key Press */ void OnSpecialKeyPress(unsigned char Key); + void UpdateScrolling(); void SetScreenFlags(int value, int mode); void SetDialogueFlags(int value, int mode); int GetScreenFlags() { return ScreenFlags; } Modified: gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/GlobalTimer.cpp 2009-01-25 20:26:48 UTC (rev 5532) @@ -141,8 +141,9 @@ Video *video = core->GetVideoDriver(); - if (video->isScrolling() ) - video->drawScrollCursorSprite(video->whereIsTheCursor()); + gc = core->GetGameControl(); + if (gc) + gc->UpdateScrolling(); UpdateAnimations(); @@ -190,7 +191,6 @@ if (fadeFromCounter==fadeFromMax) { video->SetFadePercent( 0 ); } - gc = core->GetGameControl(); if (!gc) { goto end; } Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-25 20:26:48 UTC (rev 5532) @@ -151,6 +151,8 @@ CursorCount = 0; Cursors = NULL; + mousescrollspd = 10; + ConsolePopped = false; CheatFlag = false; FogOfWar = 1; @@ -923,7 +925,7 @@ vars->Lookup("Gamma Correction", contrast); vars->Lookup("Mouse Scroll Speed", speed); video->SetGamma(brightness, contrast); - video->SetMouseScrollSpeed((int) speed); + SetMouseScrollSpeed((int) speed); if (vars->Lookup("Tooltips", TooltipDelay)) { // the games store the slider position*10, not the actual delay TooltipDelay *= TOOLTIP_DELAY_FACTOR/10; @@ -3695,8 +3697,6 @@ } } video->SetMouseEnabled(!active); - video->moveX = 0; - video->moveY = 0; } bool Interface::InCutSceneMode() const @@ -4904,6 +4904,14 @@ return CurrentStore; } +void Interface::SetMouseScrollSpeed(int speed) { + mousescrollspd = (speed+1)*2; +} + +int Interface::GetMouseScrollSpeed() { + return mousescrollspd; +} + ieStrRef Interface::GetRumour(const ieResRef dlgref) { DialogMgr* dm = ( DialogMgr* ) GetInterface( IE_DLG_CLASS_ID ); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2009-01-25 20:26:48 UTC (rev 5532) @@ -300,6 +300,8 @@ // Index of current container Container* CurrentContainer; bool UseContainer; + // Scrolling speed + int mousescrollspd; public: Palette *InfoTextPalette; int SaveAsOriginal; //if true, saves files in compatible mode @@ -560,6 +562,8 @@ Store *GetCurrentStore(); int CloseCurrentStore(); Store *SetCurrentStore(const ieResRef resname, const ieVariable owner); + void SetMouseScrollSpeed(int speed); + int GetMouseScrollSpeed(); // FIXME: due to Win32 we have to allocate/release all common // memory from Interface. Yes, it is ugly. ITMExtHeader *GetITMExt(int count); Modified: gemrb/trunk/gemrb/plugins/Core/Video.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Video.h 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/Core/Video.h 2009-01-25 20:26:48 UTC (rev 5532) @@ -212,21 +212,14 @@ public: /** Event Manager Pointer */ EventMgr* Evnt; - short moveX, moveY; void SetMouseEnabled(int enabled); void SetMouseGrayed(bool grayed); - //Scroll Cursor stuff - virtual int whereIsTheCursor() =0; - virtual void drawScrollCursorSprite(int Position) = 0; - virtual bool isScrolling() = 0; - protected: int DisableMouse; public: - bool DisableScroll; short xCorr, yCorr; /** Returns true if a pixel on a given position in the sprite @@ -239,7 +232,6 @@ * for projectile light spots */ virtual Sprite2D* CreateLight(int radius, int intensity) = 0; virtual void SetGamma(int brightness, int contrast) = 0; - virtual void SetMouseScrollSpeed(int speed) = 0; }; #endif Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-01-25 20:26:48 UTC (rev 5532) @@ -8226,7 +8226,7 @@ return AttributeError( GemRB_SetMouseScrollSpeed__doc ); } - core->GetVideoDriver()->SetMouseScrollSpeed(mouseSpeed); + core->SetMouseScrollSpeed(mouseSpeed); Py_INCREF( Py_None ); return Py_None; Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-01-25 20:26:48 UTC (rev 5532) @@ -54,10 +54,7 @@ Cursor[2] = NULL; CursorPos.x = 0; CursorPos.y = 0; - moveX = 0; - moveY = 0; DisableMouse = 0; - DisableScroll = false; xCorr = 0; yCorr = 0; lastTime = 0; @@ -66,8 +63,6 @@ extra=NULL; subtitlestrref = 0; subtitletext = NULL; - mousescrollspd = 10; - scrolling = false; } SDLVideoDriver::~SDLVideoDriver(void) @@ -2274,8 +2269,6 @@ y=CursorPos.y; } -#define SCROLL_BORDER 5 - void SDLVideoDriver::MouseMovement(int x, int y) { GetTime( lastMouseTime ); @@ -2283,36 +2276,6 @@ return; CursorPos.x = x; // - mouseAdjustX[CursorIndex]; CursorPos.y = y; // - mouseAdjustY[CursorIndex]; - if (DisableScroll) { - moveX = 0; - moveY = 0; - } else { - if (x <= SCROLL_BORDER) - moveX = -mousescrollspd; - else { - if (event.motion.x >= ( core->Width - SCROLL_BORDER )) - moveX = mousescrollspd; - else - moveX = 0; - } - if (y <= SCROLL_BORDER) - moveY = -mousescrollspd; - else { - if (y >= ( core->Height - SCROLL_BORDER )) - moveY = mousescrollspd; - else - moveY = 0; - } - } - - if (moveX != 0 || moveY != 0) { - scrolling = true; - CursorPosition = moveX + moveY; - } else if (scrolling) { - scrolling = false; - SetDragCursor(NULL); - } - if (Evnt) Evnt->MouseMove(x, y); } @@ -2461,46 +2424,3 @@ SDL_SetGamma(0.8+brightness/50.0,0.8+brightness/50.0,0.8+brightness/50.0); } -void SDLVideoDriver::SetMouseScrollSpeed(int speed) -{ - mousescrollspd=(speed+1)*2; -} - -int SDLVideoDriver::whereIsTheCursor() -{ - return CursorPosition; -} - -bool SDLVideoDriver::isScrolling() -{ - return scrolling; -} - -void SDLVideoDriver::drawScrollCursorSprite(int Position) -{ - if (Position == 0) { - if (moveX == -mousescrollspd) {//bottom left - SetDragCursor(core->GetScrollCursorSprite(5,numScrollCursor)); - } else if (moveX == mousescrollspd ) {//upper right - SetDragCursor(core->GetScrollCursorSprite(1,numScrollCursor)); - } - } else if (Position == mousescrollspd) { - if (moveX == mousescrollspd) {//right - SetDragCursor(core->GetScrollCursorSprite(0,numScrollCursor)); - } else { //bottom - SetDragCursor(core->GetScrollCursorSprite(6,numScrollCursor)); - } - } else if (Position == -mousescrollspd ) { - if (moveX == -mousescrollspd) {//left - SetDragCursor(core->GetScrollCursorSprite(4,numScrollCursor)); - } else { //upper - SetDragCursor(core->GetScrollCursorSprite(2,numScrollCursor)); - } - } else if (Position == -2 * mousescrollspd ) { //upper left - SetDragCursor(core->GetScrollCursorSprite(3,numScrollCursor)); - } else if (Position == 2 * mousescrollspd ) { //bottom right - SetDragCursor(core->GetScrollCursorSprite(7,numScrollCursor)); - } - numScrollCursor = (numScrollCursor+1) % 15; -} - Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2009-01-25 17:23:21 UTC (rev 5531) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2009-01-25 20:26:48 UTC (rev 5532) @@ -49,10 +49,6 @@ ieDword subtitlestrref; int width,height,bpp; bool fullscreen; - int mousescrollspd; - int numScrollCursor; - bool scrolling; - int CursorPosition; public: SDLVideoDriver(void); @@ -161,9 +157,6 @@ unsigned int h, unsigned int dstx, unsigned int dsty, int truecolor, unsigned char *palette, ieDword strRef); int PollMovieEvents(); - void drawScrollCursorSprite(int Position ); - int whereIsTheCursor(); - bool isScrolling(); private: void DrawMovieSubtitle(ieDword strRef); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-25 22:09:46
|
Revision: 5538 http://gemrb.svn.sourceforge.net/gemrb/?rev=5538&view=rev Author: wjpalenstijn Date: 2009-01-25 22:09:39 +0000 (Sun, 25 Jan 2009) Log Message: ----------- major refactoring patch: moving data file access functions from Interface to a new GameData class. Still needs a lot of cleaning up. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp gemrb/trunk/gemrb/plugins/BAMImporter/BAMImp.cpp gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/Button.cpp gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp gemrb/trunk/gemrb/plugins/Core/Console.cpp gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp gemrb/trunk/gemrb/plugins/Core/Font.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/IniSpawn.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h gemrb/trunk/gemrb/plugins/Core/Inventory.cpp gemrb/trunk/gemrb/plugins/Core/Label.cpp gemrb/trunk/gemrb/plugins/Core/Makefile.am gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/Particles.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp gemrb/trunk/gemrb/plugins/Core/Store.cpp gemrb/trunk/gemrb/plugins/Core/TextArea.cpp gemrb/trunk/gemrb/plugins/Core/TextEdit.cpp gemrb/trunk/gemrb/plugins/Core/Triggers.cpp gemrb/trunk/gemrb/plugins/Core/WorldMapControl.cpp gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp gemrb/trunk/gemrb/plugins/KEYImporter/KeyImp.cpp gemrb/trunk/gemrb/plugins/PSTOpcodes/PSTOpc.cpp gemrb/trunk/gemrb/plugins/STOImporter/STOImp.cpp gemrb/trunk/gemrb/plugins/TLKImporter/TLKImp.cpp gemrb/trunk/gemrb/plugins/WEDImporter/WEDImp.cpp Added Paths: ----------- gemrb/trunk/gemrb/plugins/Core/GameData.cpp gemrb/trunk/gemrb/plugins/Core/GameData.h Modified: gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -89,13 +89,13 @@ bool trackflag = core->GetStringReference(STR_TRACKING)!=(ieStrRef) -1; if (!tracks) { - int trackdata = core->LoadTable( "tracking" ); + int trackdata = gamedata->LoadTable( "tracking" ); if (trackdata < 0) { return -1; } - TableMgr* tm = core->GetTable( trackdata ); + TableMgr* tm = gamedata->GetTable( trackdata ); if (!tm) { - core->DelTable( trackdata ); + gamedata->DelTable( trackdata ); return -1; } trackcount = tm->GetRowCount(); @@ -128,8 +128,8 @@ str = NULL; if (Sounds[0][0] == UNINITIALIZED_BYTE) { memset( Sounds, 0, sizeof( Sounds ) ); - int SoundTable = core->LoadTable( "defsound" ); - TableMgr* at = core->GetTable( SoundTable ); + int SoundTable = gamedata->LoadTable( "defsound" ); + TableMgr* at = gamedata->GetTable( SoundTable ); if (at) { for (int i = 0; i < DEF_COUNT; i++) { strncpy( Sounds[i], at->QueryField( i, 0 ), 8 ); @@ -138,7 +138,7 @@ } } } - core->DelTable( SoundTable ); + gamedata->DelTable( SoundTable ); } } Modified: gemrb/trunk/gemrb/plugins/BAMImporter/BAMImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/BAMImporter/BAMImp.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/BAMImporter/BAMImp.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -45,7 +45,7 @@ } delete[] frames; delete[] cycles; - core->FreePalette(palette); + gamedata->FreePalette(palette); } bool BAMImp::Open(DataStream* stream, bool autoFree) @@ -60,7 +60,7 @@ } delete[] frames; delete[] cycles; - core->FreePalette(palette); + gamedata->FreePalette(palette); str = stream; this->autoFree = autoFree; Modified: gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -362,8 +362,8 @@ if (RandColor==-1) { RandColor=0; RandRows=0; - int table = core->LoadTable( "randcolr" ); - TableMgr *rndcol = core->GetTable( table ); + int table = gamedata->LoadTable( "randcolr" ); + TableMgr *rndcol = gamedata->GetTable( table ); if (rndcol) { RandColor = rndcol->GetColumnCount(); RandRows = rndcol->GetRowCount(); @@ -383,7 +383,7 @@ else { RandColor=0; } - core->DelTable( table ); + gamedata->DelTable( table ); } if (stat<200) return; @@ -767,7 +767,7 @@ continue; } CREItem *item = items[index]; - if (item && core->Exists(item->ItemResRef, IE_ITM_CLASS_ID)) { + if (item && gamedata->Exists(item->ItemResRef, IE_ITM_CLASS_ID)) { act->inventory.SetSlotItem( item, Slot ); /* this stuff will be done in Actor::SetMap * after the actor gets an area (and game obj) Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -1484,9 +1484,9 @@ /*switchplaylist could implement fade */ void GameScript::StartSong(Scriptable* /*Sender*/, Action* parameters) { - int MusicTable = core->LoadTable( "music" ); + int MusicTable = gamedata->LoadTable( "music" ); if (MusicTable >= 0) { - TableMgr* music = core->GetTable( MusicTable ); + TableMgr* music = gamedata->GetTable( MusicTable ); const char* string = music->QueryField( parameters->int0Parameter, 0 ); if (string[0] == '*') { core->GetMusicMgr()->HardEnd(); @@ -2692,9 +2692,9 @@ int xptable; if (core->HasFeature(GF_HAS_EXPTABLE) ) { - xptable = core->LoadTable("exptable"); + xptable = gamedata->LoadTable("exptable"); } else { - xptable = core->LoadTable( "xplist" ); + xptable = gamedata->LoadTable( "xplist" ); } if (parameters->int0Parameter>0) { @@ -2704,7 +2704,7 @@ printMessage("GameScript","Can't perform ADDXP2DA",LIGHT_RED); return; } - const char * xpvalue = core->GetTable( xptable )->QueryField( parameters->string0Parameter, "0" ); //level is unused + const char * xpvalue = gamedata->GetTable( xptable )->QueryField( parameters->string0Parameter, "0" ); //level is unused if ( xpvalue[0]=='P' && xpvalue[1]=='_') { //divide party xp @@ -2713,7 +2713,7 @@ //give xp everyone core->GetGame()->ShareXP(atoi(xpvalue), 0 ); } - core->DelTable( xptable ); + gamedata->DelTable( xptable ); } void GameScript::AddExperienceParty(Scriptable* /*Sender*/, Action* parameters) @@ -2804,17 +2804,17 @@ act->SetScript( "", AI_SCRIPT_LEVEL, true ); act->SetScript( "DPLAYER2", SCR_DEFAULT, false ); } - int pdtable = core->LoadTable( "pdialog" ); + int pdtable = gamedata->LoadTable( "pdialog" ); if ( pdtable >= 0 ) { const char* scriptname = act->GetScriptName(); ieResRef resref; - TableMgr *tab=core->GetTable( pdtable ); + TableMgr *tab=gamedata->GetTable( pdtable ); //set dialog only if we got a row if (tab->GetRowIndex( scriptname ) != -1) { strnlwrcpy(resref, tab->QueryField( scriptname, "JOIN_DIALOG_FILE"),8); act->SetDialog( resref ); } - core->DelTable( pdtable ); + gamedata->DelTable( pdtable ); } core->GetGame()->JoinParty( act, JP_JOIN ); core->GetGUIScriptEngine()->RunFunction( "UpdatePortraitWindow" ); @@ -3288,12 +3288,12 @@ if (Sender->Type != ST_ACTOR) { return; } - int pdtable = core->LoadTable( "pdialog" ); + int pdtable = gamedata->LoadTable( "pdialog" ); Actor* act = ( Actor* ) Sender; const char* scriptingname = act->GetScriptName(); - act->SetDialog( core->GetTable( pdtable )->QueryField( scriptingname, + act->SetDialog( gamedata->GetTable( pdtable )->QueryField( scriptingname, "POST_DIALOG_FILE" ) ); - core->DelTable( pdtable ); + gamedata->DelTable( pdtable ); } void GameScript::TextScreen(Scriptable* /*Sender*/, Action* parameters) @@ -4081,28 +4081,28 @@ if (!tar || tar->Type!=ST_ACTOR) { return; } - int table = core->LoadTable(parameters->string0Parameter); + int table = gamedata->LoadTable(parameters->string0Parameter); if (table<0) { return; } - TableMgr *tab=core->GetTable( table ); + TableMgr *tab=gamedata->GetTable( table ); if (tab) { int rows = tab->GetRowCount(); for (int i=0;i<rows;i++) { MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); } } - core->DelTable(table); + gamedata->DelTable(table); } void GameScript::TakeItemListParty(Scriptable * Sender, Action* parameters) { - int table = core->LoadTable(parameters->string0Parameter); + int table = gamedata->LoadTable(parameters->string0Parameter); if (table<0) { return; } Game *game = core->GetGame(); - TableMgr *tab=core->GetTable( table ); + TableMgr *tab=gamedata->GetTable( table ); if (tab) { int rows = tab->GetRowCount(); for (int i=0;i<rows;i++) { @@ -4113,17 +4113,17 @@ } } } - core->DelTable(table); + gamedata->DelTable(table); } void GameScript::TakeItemListPartyNum(Scriptable * Sender, Action* parameters) { - int table = core->LoadTable(parameters->string0Parameter); + int table = gamedata->LoadTable(parameters->string0Parameter); if (table<0) { return; } Game *game = core->GetGame(); - TableMgr *tab=core->GetTable( table ); + TableMgr *tab=gamedata->GetTable( table ); if (tab) { int rows = tab->GetRowCount(); for (int i=0;i<rows;i++) { @@ -4140,7 +4140,7 @@ } } } - core->DelTable(table); + gamedata->DelTable(table); } //bg2 @@ -5078,9 +5078,9 @@ char FolderName[_MAX_PATH]; const char *folder = ""; - int SlotTable = core->LoadTable( "savegame" ); + int SlotTable = gamedata->LoadTable( "savegame" ); if (SlotTable >= 0) { - TableMgr* tab = core->GetTable( SlotTable ); + TableMgr* tab = gamedata->GetTable( SlotTable ); type = atoi(tab->QueryField((unsigned int) -1)); if (type) { char * str = core->GetString( parameters->int0Parameter, IE_STR_STRREFOFF); @@ -5093,7 +5093,7 @@ } core->GetSaveGameIterator()->CreateSaveGame(parameters->int0Parameter, folder); if (SlotTable >= 0) { - core->DelTable(SlotTable); + gamedata->DelTable(SlotTable); } } @@ -5896,15 +5896,15 @@ void GameScript::GeneratePartyMember(Scriptable* /*Sender*/, Action* parameters) { - int PCTable = core->LoadTable( "bios" ); + int PCTable = gamedata->LoadTable( "bios" ); if (PCTable<0) { return; } - TableMgr* pcs = core->GetTable( PCTable ); + TableMgr* pcs = gamedata->GetTable( PCTable ); const char* string = pcs->QueryField( parameters->int0Parameter, 0 ); printf ("GeneratePartyMember: %s\n", string); - int pos = core->LoadCreature(string,0,false); - core->DelTable( PCTable ); + int pos = gamedata->LoadCreature(string,0,false); + gamedata->DelTable( PCTable ); if (pos<0) { return; } @@ -5959,7 +5959,7 @@ } Actor *actor = (Actor *)tar; RebusResRef[5]=(char) core->Roll(1,5,'0'); - ScriptedAnimation *vvc = core->GetScriptedAnimation(RebusResRef, 0); + ScriptedAnimation *vvc = gamedata->GetScriptedAnimation(RebusResRef, 0); if (vvc) { //setting the height vvc->ZPos=actor->size*20; Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -487,8 +487,8 @@ void ApplyClab(Actor *actor, const char *clab, int level) { - int tidx = core->LoadTable(clab); - TableMgr *table = core->GetTable(tidx); + int tidx = gamedata->LoadTable(clab); + TableMgr *table = gamedata->GetTable(tidx); if (table) { int row = table->GetRowCount(); for(int i=0;i<level;i++) { @@ -514,7 +514,7 @@ } } } - core->DelTable(tidx); + gamedata->DelTable(tidx); } } @@ -527,8 +527,8 @@ { //get current unmodified level (i guess) int level = GetXPLevel(false); - int tidx = core->LoadTable("kitlist"); - TableMgr *table = core->GetTable(tidx); + int tidx = gamedata->LoadTable("kitlist"); + TableMgr *table = gamedata->GetTable(tidx); if (table) { ieDword row; //find row by unusability @@ -748,7 +748,7 @@ if (actor->FindOverlay(idx)) return; ieDword flag = hc_locations&(1<<idx); - ScriptedAnimation *sca = core->GetScriptedAnimation(hc_overlays[idx], false); + ScriptedAnimation *sca = gamedata->GetScriptedAnimation(hc_overlays[idx], false); if (sca) { if (flag) { sca->ZPos=-1; @@ -1008,13 +1008,13 @@ DeathOnZeroStat=(bool) core->HasFeature(GF_DEATH_ON_ZERO_STAT); //this table lists various level based xp bonuses - int table = core->LoadTable( "xpbonus" ); - TableMgr *tm = core->GetTable( table ); + int table = gamedata->LoadTable( "xpbonus" ); + TableMgr *tm = gamedata->GetTable( table ); if (tm) { xpbonustypes = tm->GetRowCount(); if (xpbonustypes == 0) { - core->DelTable( table ); + gamedata->DelTable( table ); xpbonuslevels = 0; } else { xpbonuslevels = tm->GetColumnCount(0); @@ -1031,8 +1031,8 @@ } //this table lists skill groups assigned to classes //it is theoretically possible to create hybrid classes - table = core->LoadTable( "clskills" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "clskills" ); + tm = gamedata->GetTable( table ); if (tm) { classcount = tm->GetRowCount(); memset (isclass,0,sizeof(isclass)); @@ -1086,7 +1086,7 @@ } bitmask <<=1; } - core->DelTable( table ); + gamedata->DelTable( table ); } else { classcount = 0; //well } @@ -1107,8 +1107,8 @@ } //initializing the vvc resource references - table = core->LoadTable( "damage" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "damage" ); + tm = gamedata->GetTable( table ); if (tm) { for (i=0;i<DAMAGE_LEVELS;i++) { const char *tmp = tm->QueryField( i, COL_MAIN ); @@ -1124,11 +1124,11 @@ tmp = tm->QueryField( i, COL_GRADIENT ); d_gradient[i]=atoi(tmp); } - core->DelTable( table ); + gamedata->DelTable( table ); } - table = core->LoadTable( "overlay" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "overlay" ); + tm = gamedata->GetTable( table ); if (tm) { ieDword mask = 1; for (i=0;i<OVERLAY_COUNT;i++) { @@ -1139,14 +1139,14 @@ } mask<<=1; } - core->DelTable( table ); + gamedata->DelTable( table ); } //csound for bg1/bg2 memset(csound,0,sizeof(csound)); if (!core->HasFeature(GF_SOUNDFOLDERS)) { - table = core->LoadTable( "csound" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "csound" ); + tm = gamedata->GetTable( table ); if (tm) { for(i=0;i<VCONST_COUNT;i++) { const char *tmp = tm->QueryField( i, 0 ); @@ -1154,12 +1154,12 @@ csound[i]=tmp[0]; } } - core->DelTable( table ); + gamedata->DelTable( table ); } } - table = core->LoadTable( "qslots" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "qslots" ); + tm = gamedata->GetTable( table ); GUIBTDefaults = (ActionButtonRow *) calloc( classcount,sizeof(ActionButtonRow) ); for (i = 0; i < classcount; i++) { @@ -1171,11 +1171,11 @@ } } if (tm) { - core->DelTable( table ); + gamedata->DelTable( table ); } - table = core->LoadTable( "itemuse" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "itemuse" ); + tm = gamedata->GetTable( table ); if (tm) { usecount = tm->GetRowCount(); itemuse = new ItemUseType[usecount]; @@ -1190,11 +1190,11 @@ itemuse[i].which=0; } } - core->DelTable( table ); + gamedata->DelTable( table ); } - table = core->LoadTable( "itemanim" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "itemanim" ); + tm = gamedata->GetTable( table ); if (tm) { animcount = tm->GetRowCount(); itemanim = new ItemAnimType[animcount]; @@ -1202,12 +1202,12 @@ strnlwrcpy(itemanim[i].itemname, tm->QueryField(i,0),8 ); itemanim[i].animation = (ieByte) atoi( tm->QueryField(i,1) ); } - core->DelTable( table ); + gamedata->DelTable( table ); } - table = core->LoadTable( "mxsplwis" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "mxsplwis" ); + tm = gamedata->GetTable( table ); if (tm) { spllevels = tm->GetColumnCount(0); int max = core->GetMaximumAbility(); @@ -1220,11 +1220,11 @@ } } } - core->DelTable( table ); + gamedata->DelTable( table ); } - table = core->LoadTable( "featreq" ); - tm = core->GetTable( table ); + table = gamedata->LoadTable( "featreq" ); + tm = gamedata->GetTable( table ); if (tm) { unsigned int tmp; @@ -1238,7 +1238,7 @@ } featstats[i] = (ieByte) tmp; } - core->DelTable( table ); + gamedata->DelTable( table ); } } @@ -1257,7 +1257,7 @@ void Actor::AddAnimation(const ieResRef resource, int gradient, int height, int flags) { - ScriptedAnimation *sca = core->GetScriptedAnimation(resource, false); + ScriptedAnimation *sca = gamedata->GetScriptedAnimation(resource, false); if (!sca) return; sca->ZPos=height; @@ -1662,8 +1662,8 @@ void Actor::ReactToDeath(const char * deadname) { - int table = core->LoadTable( "death" ); - TableMgr *tm = core->GetTable( table ); + int table = gamedata->LoadTable( "death" ); + TableMgr *tm = gamedata->GetTable( table ); if (!tm) return; // lookup value based on died's scriptingname and ours // if value is 0 - use reactdeath @@ -1698,7 +1698,7 @@ break; } } - core->DelTable(table); + gamedata->DelTable(table); } //call this only from gui selects @@ -2176,7 +2176,7 @@ } const CREItem *slot = inventory.GetSlotItem(idx); if (!slot) return; //quick item slot is empty - Item *itm = core->GetItem(slot->ItemResRef); + Item *itm = gamedata->GetItem(slot->ItemResRef); if (!itm) return; //quick item slot contains invalid item resref ITMExtHeader *ext_header = itm->GetExtHeader(headerindex); //item has no extended header, or header index is wrong @@ -2191,7 +2191,7 @@ } else { item->Charges=slot->Usages[headerindex]; } - core->FreeItem(itm,slot->ItemResRef, false); + gamedata->FreeItem(itm,slot->ItemResRef, false); } void Actor::ReinitQuickSlots() @@ -2287,7 +2287,7 @@ if (core->QuerySlotEffects(slot) == SLOT_EFFECT_MISSILE) { const CREItem *slotitm = inventory.GetSlotItem(slot); assert(slotitm); - Item *itm = core->GetItem(slotitm->ItemResRef); + Item *itm = gamedata->GetItem(slotitm->ItemResRef); assert(itm); ITMExtHeader *ext_header = itm->GetExtHeader(header); if (ext_header) { @@ -2299,7 +2299,7 @@ } else { empty = true; } - core->FreeItem(itm,slotitm->ItemResRef, false); + gamedata->FreeItem(itm,slotitm->ItemResRef, false); } } @@ -2388,7 +2388,7 @@ if (!wield) { return 0; } - Item *item = core->GetItem(wield->ItemResRef); + Item *item = gamedata->GetItem(wield->ItemResRef); if (!item) { return 0; } @@ -2397,7 +2397,7 @@ wi->itemflags = wield->Flags; } which = item->GetWeaponHeader(true); - core->FreeItem(item, wield->ItemResRef, false); + gamedata->FreeItem(item, wield->ItemResRef, false); return 0; } @@ -2409,7 +2409,7 @@ if (!wield) { return 0; } - Item *item = core->GetItem(wield->ItemResRef); + Item *item = gamedata->GetItem(wield->ItemResRef); if (!item) { return 0; } @@ -2422,7 +2422,7 @@ which = item->GetWeaponHeader(false); //make sure we use 'false' in this freeitem //so 'which' won't point into invalid memory - core->FreeItem(item, wield->ItemResRef, false); + gamedata->FreeItem(item, wield->ItemResRef, false); if (!which) { return 0; } @@ -2446,7 +2446,7 @@ if (spellbook.HaveSpell(spellname, 0) ) { return LSR_KNOWN; } - Spell *spell = core->GetSpell(spellname); + Spell *spell = gamedata->GetSpell(spellname); if (!spell) { return LSR_INVALID; //not existent spell } @@ -2466,7 +2466,7 @@ break; } } else tmp = 0; - core->FreeSpell(spell, spellname, false); + gamedata->FreeSpell(spell, spellname, false); if (!explev) { return LSR_INVALID; } @@ -3391,12 +3391,12 @@ void Actor::GetSoundFrom2DA(ieResRef Sound, unsigned int index) { - int table=core->LoadTable( anims->ResRef ); + int table=gamedata->LoadTable( anims->ResRef ); if (table<0) { return; } - TableMgr * tab = core->GetTable( table ); + TableMgr * tab = gamedata->GetTable( table ); if (!tab) { goto end; } @@ -3417,7 +3417,7 @@ } strnlwrcpy(Sound, tab->QueryField (index, 0), 8); end: - core->DelTable( table ); + gamedata->DelTable( table ); } void Actor::GetSoundFromINI(ieResRef Sound, unsigned int index) @@ -3708,7 +3708,7 @@ CREItem *item = inventory.GetSlotItem(slot); if (!item) return false; - Item *itm = core->GetItem(item->ItemResRef); + Item *itm = gamedata->GetItem(item->ItemResRef); if (!itm) return false; //quick item slot contains invalid item resref if ((header<CHARGE_COUNTERS) && !item->Usages[header]) { return false; @@ -3716,7 +3716,7 @@ Projectile *pro = itm->GetProjectile(slot, header); ChargeItem(slot, header, item, itm, silent); - core->FreeItem(itm,item->ItemResRef, false); + gamedata->FreeItem(itm,item->ItemResRef, false); if (pro) { pro->SetCaster(globalID); GetCurrentArea()->AddProjectile(pro, Pos, target); @@ -3735,7 +3735,7 @@ CREItem *item = inventory.GetSlotItem(slot); if (!item) return false; - Item *itm = core->GetItem(item->ItemResRef); + Item *itm = gamedata->GetItem(item->ItemResRef); if (!itm) return false; //quick item slot contains invalid item resref if ((header<CHARGE_COUNTERS) && !item->Usages[header]) { return false; @@ -3743,7 +3743,7 @@ Projectile *pro = itm->GetProjectile(slot, header); ChargeItem(slot, header, item, itm, silent); - core->FreeItem(itm,item->ItemResRef, false); + gamedata->FreeItem(itm,item->ItemResRef, false); if (pro) { pro->SetCaster(globalID); GetCurrentArea()->AddProjectile(pro, Pos, tar->globalID); @@ -3758,7 +3758,7 @@ item = inventory.GetSlotItem(slot); if (!item) return; - itm = core->GetItem(item->ItemResRef); + itm = gamedata->GetItem(item->ItemResRef); } if (!itm) return; //quick item slot contains invalid item resref @@ -3872,8 +3872,8 @@ if (FistRows<0) { FistRows=0; - int table = core->LoadTable( "fistweap" ); - TableMgr *fist = core->GetTable( table ); + int table = gamedata->LoadTable( "fistweap" ); + TableMgr *fist = gamedata->GetTable( table ); if (fist) { //default value strnlwrcpy( DefaultFist, fist->QueryField( (unsigned int) -1), 8); @@ -3887,7 +3887,7 @@ *(int *) fistres[i] = atoi(fist->GetRowName( i)); } } - core->DelTable( table ); + gamedata->DelTable( table ); } if (col>MAX_LEVEL) col=MAX_LEVEL; if (col<1) col=1; @@ -3904,8 +3904,8 @@ static ieDword ResolveTableValue(const char *resref, ieDword stat, ieDword mcol, ieDword vcol) { long ret = 0; //don't close this table, it can mess with the guiscripts - int table = core->LoadTable(resref); - TableMgr *tm = core->GetTable(table); + int table = gamedata->LoadTable(resref); + TableMgr *tm = gamedata->GetTable(table); if (tm) { unsigned int row; if (mcol == 0xff) { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -218,7 +218,7 @@ font->Print( rgn, ( unsigned char * ) overHeadText, palette?palette:core->InfoTextPalette, IE_FONT_ALIGN_CENTER | IE_FONT_ALIGN_TOP, false ); //core->GetVideoDriver()->FreePalette(palette); - core->FreePalette(palette); + gamedata->FreePalette(palette); } void Scriptable::ImmediateEvent() @@ -565,7 +565,7 @@ return; } - Spell* spl = core->GetSpell( SpellResRef ); + Spell* spl = gamedata->GetSpell( SpellResRef ); //create projectile from known spellheader Projectile *pro=spl->GetProjectile(SpellHeader); SpellHeader = -1; @@ -591,14 +591,14 @@ SpellHeader = -1; return; } - Spell* spl = core->GetSpell( SpellResRef ); + Spell* spl = gamedata->GetSpell( SpellResRef ); //create projectile from known spellheader Projectile *pro=spl->GetProjectile(SpellHeader); if (pro) { pro->SetCaster(GetGlobalID()); GetCurrentArea()->AddProjectile(pro, Pos, LastTarget); } - core->FreeSpell(spl, SpellResRef, false); + gamedata->FreeSpell(spl, SpellResRef, false); LastTarget = 0; LastTargetPos.empty(); } @@ -647,7 +647,7 @@ //start spellcasting (common part) void Scriptable::SpellCast(const ieResRef SpellResRef) { - Spell* spl = core->GetSpell( SpellResRef ); + Spell* spl = gamedata->GetSpell( SpellResRef ); if (!spl) { SpellHeader = -1; return; @@ -668,7 +668,7 @@ SPLExtHeader *header = spl->GetExtHeader(SpellHeader); SetWait(header->CastingTime*AI_UPDATE_TIME); - core->FreeSpell(spl, SpellResRef, false); + gamedata->FreeSpell(spl, SpellResRef, false); } /******************** @@ -1811,11 +1811,11 @@ FreeGroundIcons(); while (i--) { CREItem *slot = inventory.GetSlotItem(i); //borrowed reference - Item *itm = core->GetItem( slot->ItemResRef ); //cached reference + Item *itm = gamedata->GetItem( slot->ItemResRef ); //cached reference //well, this is required in PST, needs more work if some other //game is broken by not using -1,0 - groundicons[i] = core->GetBAMSprite( itm->GroundIcon, 0, 0 ); - core->FreeItem( itm, slot->ItemResRef ); //decref + groundicons[i] = gamedata->GetBAMSprite( itm->GroundIcon, 0, 0 ); + gamedata->FreeItem( itm, slot->ItemResRef ); //decref } } Modified: gemrb/trunk/gemrb/plugins/Core/Button.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/Button.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -69,8 +69,8 @@ if (Text) { free( Text ); } - core->FreePalette( normal_palette); - core->FreePalette( disabled_palette); + gamedata->FreePalette( normal_palette); + gamedata->FreePalette( disabled_palette); } /** Sets the 'type' Image of the Button to 'img'. 'type' may assume the following values: @@ -644,7 +644,7 @@ // Set palette used for drawing button label in normal state void Button::SetTextColor(const Color &fore, const Color &back) { - core->FreePalette( normal_palette ); + gamedata->FreePalette( normal_palette ); normal_palette = core->CreatePalette( fore, back ); Changed = true; } Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -185,8 +185,8 @@ // Note: this doesn't happen "often", so this isn't a performance // bottleneck. (wjp) DropAnims(); - core->FreePalette(palette[PAL_HELMET], 0); - core->FreePalette(modifiedPalette[PAL_HELMET], 0); + gamedata->FreePalette(palette[PAL_HELMET], 0); + gamedata->FreePalette(modifiedPalette[PAL_HELMET], 0); } void CharAnimations::SetWeaponRef(const char* ref) @@ -196,8 +196,8 @@ // TODO: Only drop weapon anims? DropAnims(); - core->FreePalette(palette[PAL_WEAPON], 0); - core->FreePalette(modifiedPalette[PAL_WEAPON], 0); + gamedata->FreePalette(palette[PAL_WEAPON], 0); + gamedata->FreePalette(modifiedPalette[PAL_WEAPON], 0); } void CharAnimations::SetOffhandRef(const char* ref) @@ -207,8 +207,8 @@ // TODO: Only drop shield/offhand anims? DropAnims(); - core->FreePalette(palette[PAL_OFFHAND], 0); - core->FreePalette(modifiedPalette[PAL_OFFHAND], 0); + gamedata->FreePalette(palette[PAL_OFFHAND], 0); + gamedata->FreePalette(modifiedPalette[PAL_OFFHAND], 0); } void CharAnimations::LockPalette(const ieDword *gradients) @@ -271,7 +271,7 @@ needmod = true; } if ((colorcount == 0) && (needmod==false) ) { - core->FreePalette(palette[PAL_MAIN], PaletteResRef); + gamedata->FreePalette(palette[PAL_MAIN], PaletteResRef); PaletteResRef[0]=0; return; } @@ -286,7 +286,7 @@ modifiedPalette[PAL_MAIN] = new Palette(); modifiedPalette[PAL_MAIN]->SetupGlobalRGBModification(palette[PAL_MAIN], GlobalColorMod); } else { - core->FreePalette(modifiedPalette[PAL_MAIN], 0); + gamedata->FreePalette(modifiedPalette[PAL_MAIN], 0); } return; } @@ -298,14 +298,14 @@ needmod = true; } if (!needmod && PaletteResRef[0]) { - core->FreePalette(palette[PAL_MAIN], PaletteResRef); + gamedata->FreePalette(palette[PAL_MAIN], PaletteResRef); } PaletteResRef[0]=0; //handling special palettes like MBER_BL (black bear) if (PType!=1) { snprintf(PaletteResRef,8,"%.4s_%-.2s",ResRef, (char *) &PType); strlwr(PaletteResRef); - Palette *tmppal = core->GetPalette(PaletteResRef); + Palette *tmppal = gamedata->GetPalette(PaletteResRef); if (tmppal) { palette[PAL_MAIN] = tmppal; } else { @@ -317,7 +317,7 @@ modifiedPalette[PAL_MAIN] = new Palette(); modifiedPalette[PAL_MAIN]->SetupGlobalRGBModification(palette[PAL_MAIN], GlobalColorMod); } else { - core->FreePalette(modifiedPalette[PAL_MAIN], 0); + gamedata->FreePalette(modifiedPalette[PAL_MAIN], 0); } return; } @@ -349,7 +349,7 @@ modifiedPalette[(int)type]->SetupRGBModification(palette[(int)type],ColorMods, (int)type); } } else { - core->FreePalette(modifiedPalette[(int)type], 0); + gamedata->FreePalette(modifiedPalette[(int)type], 0); } } @@ -371,12 +371,12 @@ void CharAnimations::InitAvatarsTable() { - int tmp= core->LoadTable( "avatars" ); + int tmp= gamedata->LoadTable( "avatars" ); if (tmp<0) { printMessage("CharAnimations", "A critical animation file is missing!\n", LIGHT_RED); abort(); } - TableMgr *Avatars = core->GetTable( tmp ); + TableMgr *Avatars = gamedata->GetTable( tmp ); AvatarTable = (AvatarStruct *) calloc ( AvatarsCount = Avatars->GetRowCount(), sizeof(AvatarStruct) ); int i=AvatarsCount; while(i--) { @@ -400,7 +400,7 @@ } AvatarTable[i].Size=Avatars->QueryField(i,AV_SIZE)[0]; } - core->DelTable( tmp ); + gamedata->DelTable( tmp ); } CharAnimations::CharAnimations(unsigned int AnimID, ieDword ArmourLevel) @@ -491,12 +491,12 @@ CharAnimations::~CharAnimations(void) { DropAnims(); - core->FreePalette(palette[PAL_MAIN], PaletteResRef); + gamedata->FreePalette(palette[PAL_MAIN], PaletteResRef); int i; for (i = 1; i < 4; ++i) - core->FreePalette(palette[i], 0); + gamedata->FreePalette(palette[i], 0); for (i = 0; i < 4; ++i) - core->FreePalette(modifiedPalette[i], 0); + gamedata->FreePalette(modifiedPalette[i], 0); } /* This is a simple Idea of how the animation are coded @@ -1096,13 +1096,13 @@ if (rand()&1) { Prefix="sf2"; sprintf(ResRef,"%c%3s%4s",this->ResRef[0], Prefix, this->ResRef+1); - if (core->Exists(ResRef, IE_BAM_CLASS_ID) ) { + if (gamedata->Exists(ResRef, IE_BAM_CLASS_ID) ) { return; } } Prefix="sf1"; sprintf(ResRef,"%c%3s%4s",this->ResRef[0], Prefix, this->ResRef+1); - if (core->Exists(ResRef, IE_BAM_CLASS_ID) ) { + if (gamedata->Exists(ResRef, IE_BAM_CLASS_ID) ) { return; } Prefix = "stc"; Modified: gemrb/trunk/gemrb/plugins/Core/Console.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Console.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/Console.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -51,7 +51,7 @@ } Video *video = core->GetVideoDriver(); - core->FreePalette( palette ); + gamedata->FreePalette( palette ); video->FreeSprite( Cursor ); } Modified: gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -204,8 +204,8 @@ initialized = 1; - int effT = core->LoadTable( "efftext" ); - efftextTable = core->GetTable( effT ); + int effT = gamedata->LoadTable( "efftext" ); + efftextTable = gamedata->GetTable( effT ); int eT = core->LoadSymbol( "effects" ); if (eT < 0) { @@ -246,7 +246,7 @@ //printf("-------- FN: %d, %s\n", i, effectname); } core->DelSymbol( eT ); - if ( efftextTable ) core->DelTable( effT ); + if ( efftextTable ) gamedata->DelTable( effT ); //additional initialisations for (i=0;diced_effects[i].Name;i++) { Modified: gemrb/trunk/gemrb/plugins/Core/Font.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Font.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/Font.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -72,7 +72,7 @@ Font::~Font(void) { Video *video = core->GetVideoDriver(); - core->FreePalette( palette ); + gamedata->FreePalette( palette ); video->FreeSprite( sprBuffer ); } @@ -207,7 +207,7 @@ const Color c = {(unsigned char) r,(unsigned char)g, (unsigned char)b, 0}; Palette* newPal = core->CreatePalette( c, black ); video->SetPalette( sprBuffer, newPal ); - core->FreePalette( newPal ); + gamedata->FreePalette( newPal ); continue; } if (stricmp( tag, "/color" ) == 0) { @@ -368,7 +368,7 @@ const Color c = {(unsigned char) r,(unsigned char) g,(unsigned char) b, 0}; Palette* newPal = core->CreatePalette( c, black ); video->SetPalette( sprBuffer, newPal ); - core->FreePalette( newPal ); + gamedata->FreePalette( newPal ); continue; } if (stricmp( tag, "/color" ) == 0) { Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -68,9 +68,9 @@ { //initializing the skill->stats conversion table { - int table = core->LoadTable( "skillsta" ); + int table = gamedata->LoadTable( "skillsta" ); if (table!=-1) { - TableMgr *tab = core->GetTable( table ); + TableMgr *tab = gamedata->GetTable( table ); int rowcount = tab->GetRowCount(); SkillCount = rowcount; if (rowcount) { @@ -83,39 +83,39 @@ } //initializing the happiness table { - int table = core->LoadTable( "happy" ); + int table = gamedata->LoadTable( "happy" ); if (table!=-1) { - TableMgr *tab = core->GetTable( table ); + TableMgr *tab = gamedata->GetTable( table ); for (int alignment=0;alignment<3;alignment++) { for (int reputation=0;reputation<20;reputation++) { happiness[alignment][reputation]=strtol(tab->QueryField(reputation,alignment), NULL, 0); } } - core->DelTable( table ); + gamedata->DelTable( table ); } } //initializing the reaction mod. reputation table { - int table = core->LoadTable( "rmodrep" ); + int table = gamedata->LoadTable( "rmodrep" ); if (table!=-1) { - TableMgr *tab = core->GetTable( table ); + TableMgr *tab = gamedata->GetTable( table ); for (int reputation=0;reputation<20;reputation++) { rmodrep[reputation]=strtol(tab->QueryField(0,reputation), NULL, 0); } - core->DelTable( table ); + gamedata->DelTable( table ); } } //initializing the reaction mod. charisma table { - int table = core->LoadTable( "rmodchr" ); + int table = gamedata->LoadTable( "rmodchr" ); if (table!=-1) { - TableMgr *tab = core->GetTable( table ); + TableMgr *tab = gamedata->GetTable( table ); for (int charisma=0;charisma<25;charisma++) { rmodchr[charisma]=strtol(tab->QueryField(0,charisma), NULL, 0); } - core->DelTable( table ); + gamedata->DelTable( table ); } } } @@ -295,7 +295,7 @@ CREItem *itemslot = inventory->GetSlotItem(i); if (!itemslot) continue; - Item *item = core->GetItem(itemslot->ItemResRef); + Item *item = gamedata->GetItem(itemslot->ItemResRef); if (!item) continue; bool ret = false; @@ -303,7 +303,7 @@ //the store is the same as the item's name ret = StoreHasItemCore(itemslot->ItemResRef, itemname); } - core->FreeItem(item, itemslot->ItemResRef); + gamedata->FreeItem(item, itemslot->ItemResRef); if (ret) { return true; } @@ -662,7 +662,7 @@ else { ds = core->GetResourceMgr()->GetResource( parameters->string0Parameter, IE_CRE_CLASS_ID ); } - Actor *ab = core->GetCreature(ds); + Actor *ab = gamedata->GetCreature(ds); //iwd2 allows an optional scriptname to be set //but bg2 doesn't have this feature @@ -725,7 +725,7 @@ static ScriptedAnimation *GetVVCEffect(const char *effect, int iterations) { if (effect[0]) { - ScriptedAnimation* vvc = core->GetScriptedAnimation(effect, false); + ScriptedAnimation* vvc = gamedata->GetScriptedAnimation(effect, false); if (!vvc) { printMessage("GameScript","Failed to create effect.",LIGHT_RED); return NULL; @@ -760,7 +760,7 @@ void ChangeAnimationCore(Actor *src, const char *resref, bool effect) { DataStream* ds = core->GetResourceMgr()->GetResource( resref, IE_CRE_CLASS_ID ); - Actor *tar = core->GetCreature(ds); + Actor *tar = gamedata->GetCreature(ds); if (tar) { Map *map = src->GetCurrentArea(); map->AddActor( tar ); @@ -830,10 +830,10 @@ int CheckInteract(const char *talker, const char *target) { int interact = -1; - interact = core->LoadTable( "interact" ); + interact = gamedata->LoadTable( "interact" ); if(!interact) return 0; - const char *value = core->GetTable(interact)->QueryField(talker, target); + const char *value = gamedata->GetTable(interact)->QueryField(talker, target); if(!value) return 0; switch(value[0]) { @@ -999,10 +999,10 @@ goto end_of_quest; } /* banter dialogue */ - pdtable = core->LoadTable( "interdia" ); + pdtable = gamedata->LoadTable( "interdia" ); //Dialog is a borrowed reference, we cannot free pdtable while it is being used if (pdtable!=-1) { - Dialog = core->GetTable( pdtable )->QueryField( scriptingname, "FILE" ); + Dialog = gamedata->GetTable( pdtable )->QueryField( scriptingname, "FILE" ); } break; } @@ -1058,7 +1058,7 @@ //if pdtable was allocated, free it now, it will release Dialog end_of_quest: if (pdtable!=-1) { - core->DelTable( pdtable ); + gamedata->DelTable( pdtable ); } } @@ -1135,12 +1135,12 @@ { strncpy(item->ItemResRef, resref, 8); if (a==-1) { - Item *origitem = core->GetItem(resref); + Item *origitem = gamedata->GetItem(resref); for(int i=0;i<3;i++) { ITMExtHeader *e = origitem->GetExtHeader(i); item->Usages[i]=e?e->Charges:0; } - core->FreeItem(origitem, resref, false); + gamedata->FreeItem(origitem, resref, false); } else { item->Usages[0]=(ieWord) a; item->Usages[1]=(ieWord) b; @@ -2314,16 +2314,16 @@ { Point p; - int table = core->LoadTable( "entries" ); + int table = gamedata->LoadTable( "entries" ); if (table<0) { return p; } - TableMgr *tab = core->GetTable( table ); + TableMgr *tab = gamedata->GetTable( table ); const char *tmpstr = tab->QueryField(areaname, entryname); int x=-1; int y=-1; sscanf(tmpstr, "%d.%d", &x, &y); - core->DelTable(table); + gamedata->DelTable(table); p.x=(short) x; p.y=(short) y; return p; @@ -2334,13 +2334,13 @@ { unsigned int dist; - Spell* spl = core->GetSpell( spellres ); + Spell* spl = gamedata->GetSpell( spellres ); if (!spl) { printMessage("GameScript"," ",LIGHT_RED); printf("Spell couldn't be found:%.8s.\n", spellres); return 0; } dist=spl->GetCastingDistance(actor); - core->FreeSpell(spl, spellres, false); + gamedata->FreeSpell(spl, spellres, false); return dist*15; } Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -62,8 +62,8 @@ LastScriptUpdate = 0; //loading master areas - int mtab = core->LoadTable("mastarea"); - TableMgr *table = core->GetTable(mtab); + int mtab = gamedata->LoadTable("mastarea"); + TableMgr *table = gamedata->GetTable(mtab); if (table) { int i = table->GetRowCount(); mastarea.reserve(i); @@ -72,22 +72,22 @@ strnuprcpy (tmp,table->QueryField(i,0),8); mastarea.push_back( tmp ); } - core->DelTable(mtab); + gamedata->DelTable(mtab); } //loading rest/daylight switching movies (only bg2 has them) memset(restmovies,'*',sizeof(restmovies)); memset(daymovies,'*',sizeof(restmovies)); memset(nightmovies,'*',sizeof(restmovies)); - mtab = core->LoadTable("restmov"); - table = core->GetTable(mtab); + mtab = gamedata->LoadTable("restmov"); + table = gamedata->GetTable(mtab); if (table) { for(int i=0;i<8;i++) { strnuprcpy(restmovies[i],table->QueryField(i,0),8); strnuprcpy(daymovies[i],table->QueryField(i,1),8); strnuprcpy(nightmovies[i],table->QueryField(i,2),8); } - core->DelTable(mtab); + gamedata->DelTable(mtab); } interval = 1000/AI_UPDATE_TIME; @@ -325,8 +325,8 @@ actor->SetBase(IE_EXPLORE, 1); if (join&JP_INITPOS) { // 0 - single player, 1 - tutorial, 2 - expansion - int saindex = core->LoadTable( "startpos" ); - TableMgr* strta = core->GetTable( saindex ); + int saindex = gamedata->LoadTable( "startpos" ); + TableMgr* strta = gamedata->GetTable( saindex ); ieDword playmode = 0; core->GetDictionary()->Lookup( "PlayMode", playmode ); //hack for iwd2 @@ -338,15 +338,15 @@ playmode *= 2; actor->Pos.x = actor->Destination.x = (short) atoi( strta->QueryField( playmode, actor->InParty-1 ) ); actor->Pos.y = actor->Destination.y = (short) atoi( strta->QueryField( playmode + 1, actor->InParty-1 ) ); - core->DelTable( saindex ); + gamedata->DelTable( saindex ); - saindex = core->LoadTable( "startare" ); - strta = core->GetTable( saindex ); + saindex = gamedata->LoadTable( "startare" ); + strta = gamedata->GetTable( saindex ); playmode /= 2; playmode *= 3; strnlwrcpy(actor->Area, strta->QueryField( playmode, 0 ), 8 ); //TODO: set viewport - core->DelTable( saindex ); + gamedata->DelTable( saindex ); SelectActor(actor,true, SELECT_QUIET); } @@ -802,8 +802,8 @@ //reading the challenge rating table for iwd2 (only when needed) void Game::LoadCRTable() { - int mtab = core->LoadTable("moncrate"); - TableMgr *table = core->GetTable(mtab); + int mtab = gamedata->LoadTable("moncrate"); + TableMgr *table = gamedata->GetTable(mtab); if (table) { int maxrow = table->GetRowCount()-1; crtable = new CRRow[MAX_LEVEL]; @@ -817,7 +817,7 @@ crtable[i][j]=atoi(table->QueryField(row,col) ); } } - core->DelTable(mtab); + gamedata->DelTable(mtab); } } Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-01-25 21:11:38 UTC (rev 5537) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -141,13 +141,13 @@ { unsigned int i,j; TableMgr * tab; - int table=core->LoadTable("formatio"); + int table=gamedata->LoadTable("formatio"); if (table<0) { goto fallback; } - tab = core->GetTable( table); + tab = gamedata->GetTable( table); if (!tab) { - core->DelTable(table); + gamedata->DelTable(table); goto fallback; } formationcount = tab->GetRowCount(); @@ -163,7 +163,7 @@ // // read in formation data // - core->DelTable(table); + gamedata->DelTable(table); return; fallback: formationcount = 1; @@ -225,13 +225,13 @@ { const char *folder; - int SlotTable = core->LoadTable( "savegame" ); + int SlotTable = gamedata->LoadTable( "savegame" ); if (SlotTable >= 0) { - TableMgr* tab = core->GetTable( SlotTable ); + TableMgr* tab = gamedata->GetTable( SlotTable ); folder = tab->QueryField(0); core->GetSaveGameIterator()->CreateSaveGame(0, folder, 0); if (SlotTable >= 0) { - core->DelTable(SlotTable); + gamedata->DelTable(SlotTable); } } } @@ -240,13 +240,13 @@ { const char *folder; - int SlotTable = core->LoadTable( "savegame" ); + int SlotTable = gamedata->LoadTable( "savegame" ); if (SlotTable >= 0) { - TableMgr* tab = core->GetTable( SlotTable ); + TableMgr* tab = gamedata->GetTable( SlotTable ); folder = tab->QueryField(1); core->GetSaveGameIterator()->CreateSaveGame(1, folder, mqs == 1); if (SlotTable >= 0) { - core->DelTable(SlotTable); + gamedata->DelTable(SlotTable); } } } Added: gemrb/trunk/gemrb/plugins/Core/GameData.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.cpp (rev 0) +++ gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-01-25 22:09:39 UTC (rev 5538) @@ -0,0 +1,464 @@ +/* GemRB - Infinity Engine Emulator +* Copyright (C) 2003-2005 The GemRB Project +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. + +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. + +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* $Id$ +* +*/ + + +#include "GameData.h" + +#include "Actor.h" +#include "Cache.h" +#include "Factory.h" +#include "Item.h" +#include "Spell.h" +#include "Effect.h" +#include "ActorMgr.h" +#include "FileStream.h" +#include "Interface.h" +#include "SpellMgr.h" +#include "ItemMgr.h" +#include "EffectMgr.h" +#include "ResourceMgr.h" +#include "Game.h" + +static void ReleaseItem(void *poi) +{ + delete ((Item *) poi); +} + +static void ReleaseSpell(void *poi) +{ + delete ((Spell *) poi); +} + +static void ReleaseEffect(void *poi) +{ + delete ((Effect *) poi); +} + +static void ReleasePalette(void *poi) +{ + //we allow nulls, but we shouldn't release them + if (!poi) return; + //as long as palette has its own refcount, this should be Release + ((Palette *) poi)->Release(); +} + +// TODO: this is duplicated from Interface.cpp +#define FreeInterfaceVector(type, variable, member) \ +{ \ + std::vector<type>::iterator i; \ + for(i = (variable).begin(); i != (variable).end(); ++i) { \ + if (!(*i).free) { \ + core->FreeInterface((*i).member); \ + (*i).free = true; \ + } \ + } \ +} + +GameData::GameData() +{ + factory = new Factory(); +} + +GameData::~GameData() +{ + FreeInterfaceVector( Table, tables, tm ); +} + +void GameData::ClearCaches() +{ + ItemCache.RemoveAll(ReleaseItem); + SpellCache.RemoveAll(ReleaseSpell); + EffectCache.RemoveAll(ReleaseEffect); + PaletteCache.RemoveAll(ReleasePalette); +} + +Actor *GameData::GetCreature(DataStream *stream, unsigned char InParty) +{ + ActorMgr* actormgr = ( ActorMgr* ) core->GetInterface( IE_CRE_CLASS_ID ); + if (!actormgr->Open( stream, true )) { + core->FreeInterface( actormgr ); + return NULL; + } + Actor* actor = actormgr->GetActor(InParty); + core->FreeInterface( actormgr ); + return actor; +} + +int GameData::LoadCreature(const char* ResRef, int InParty, bool character) +{ + DataStream *stream; + + if (character) { + char nPath[_MAX_PATH], fName[16]; + snprintf( fName, sizeof(fName), "%s.chr", ResRef); + PathJoin( nPath, core->GamePath, "characters", fName, NULL ); + ResolveFilePath( nPath ); + FileStream *fs = new FileStream(); + fs -> Open( nPath, true ); + stream = (DataStream *) fs; + } + else { + stream = core->GetResourceMgr()->GetResource( ResRef, IE_CRE_CLASS_ID ); + } + Actor* actor = GetCreature(stream, InParty); + if ( !actor ) { + return -1; + } + //actor->InParty = (ieByte) InParty; + //both fields are of length 9, make this sure! + memcpy(actor->Area, core->GetGame()->CurrentArea, sizeof(actor->Area) ); + if (actor->BaseStats[IE_STATE_ID] & STATE_DEAD) { + actor->SetStance( IE_ANI_TWITCH ); + } else { + actor->SetStance( IE_ANI_AWAKE ); + } + actor->SetOrientation( 0, false ); + + if ( InParty ) { + return core->GetGame()->JoinParty( actor, JP_JOIN|JP_INITPOS ); + } + else { + return core->GetGame()->AddNPC( actor ); + } +} + +/** Loads a 2DA Table, returns -1 on error or the Table Index on success */ +int GameData::LoadTable(const ieResRef ResRef) +{ + int ind = GetTableIndex( ResRef ); + if (ind != -1) { + return ind; + } + //printf("(%s) Table not found... Loading from file\n", ResRef); + DataStream* str = core->GetResourceMgr()->GetResource( ResRef, IE_2DA_CLASS_ID ); + if (!str) { + return -1; + } + TableMgr* tm = ( TableMgr* ) core->GetInterface( IE_2DA_CLASS_ID ); + if (!tm) { + delete str; + return -1; + } + if (!tm->Open( str, true )) { + core->FreeInterface( tm ); + return -1; + } + Table t; + t.free = false; + strncpy( t.ResRef, ResRef, 8 ); + t.tm = tm; + ind = -1; + for (size_t i = 0; i < tables.size(); i++) { + if (tables[i].free) { + ind = ( int ) i; + break; + } + } + if (ind != -1) { + tables[ind] = t; + return ind; + } + tables.push_back( t ); + return ( int ) tables.size() - 1; +} +/** Gets the index of a loaded table, returns -1 on error */ +int GameData::GetTableIndex(const char* ResRef) const +{ + for (size_t i = 0; i < tables.size(); i++) { + if (tables[i].free) + continue; + if (strnicmp( tables[i].ResRef, ResRef, 8 ) == 0) + return ( int ) i; + } + return -1; +} +/** Gets a Loaded Table by its index, returns NULL on error */ +TableMgr* GameData::GetTable(unsigned int index) const +{ + if (index >= tables.size()) { + return NULL; + } + if (tables[index].free) { + return NULL; + } + return tables[index].tm; +} +/** Frees a Loaded Table, returns false on error, true on success */ +bool GameData::DelTable(unsigned int index) +{ + if (index==0xffffffff) { + FreeInterfaceVector( Table, tables, tm ); + tables.clear(); + return true; + } + if (index >= tables.size()) { + return false; + } + if (tables[index].free) { + return false; + } + core->FreeInterface( tables[index].tm ); + tables[index].free = true; + return true; +} +bool GameData::Exists(const char *ResRef, SClass_ID type, bool silent) +{ + // TODO: check various caches before going to KeyImp + return core->GetResourceMgr()->HasResource( ResRef, type, silent ); +} + +Palette *GameData::GetPalette(const ieResRef resname) +{ + Palette *palette = (Palette *) PaletteCache.GetResource(resname); + if (palette) { + return palette; + } + //additional hack for allowing NULL's + if (PaletteCache.RefCount(resname)!=-1) { + return NULL; + } + DataStream* str = core->GetResourceMgr()->GetResource( resname, IE_BMP_CLASS_ID ); + ImageMgr* im = ( ImageMgr* ) core->GetInterface( IE_BMP_CLASS_ID ); + if (im == NULL) { + delete ( str ); + return NULL; + } + if (!im->Open( str, true )) { + PaletteCache.SetAt(resname, NULL); + core->FreeInterface( im ); + return NULL; + } + + palette = new Palette(); + im->GetPalette(0,256,palette->col); + core->FreeInterface( im ); + palette->named=true; + PaletteCache.SetAt(resname, (void *) palette); + return palette; +} + +void GameData::FreePalette(Palette *&pal, const ieResRef name) +{ + int res; + + if (!pal) { + return; + } + if (!name || !name[0]) { + if(pal->named) { + printf("Palette is supposed to be named, but got no name!\n"); + abort(); + } else { + pal->Release(); + pal=NULL; + } + return; + } + if (!pal->named) { + printf("Unnamed palette, it should be %s!\n", name); + abort(); + } + res=PaletteCache.DecRef((void *) pal, name, true); + if (res<0) { + printMessage( "Core", "Corrupted Palette cache encountered (reference count went below zero), ", LIGHT_RED ); + printf( "Palette name is: %.8s\n", name); + abort(); + } + if (!res) { + pal->Release(); + } + pal = NULL; +} + +Item* GameData::GetItem(const ieResRef resname) +{ + Item *item = (Item *) ItemCache.GetResource(resname); + if (item) { + return item; + } + DataStream* str = core->GetResourceMgr()->GetResource( resname, IE_ITM_CLASS_ID ); + ItemMgr* sm = ( ItemMgr* ) core->GetInterface( IE_ITM_CLASS_ID ); + if (sm == NULL) { + delete ( str ); + return NULL; + } + if (!sm->Open( str, true )) { + core->FreeInterface( sm ); + return NULL; + } + + item = new Item(); + //this is required for storing the 'source' + strnlwrcpy(item->Name, resname, 8); + sm->GetItem( item ); + if (item == NULL) { + core->FreeInterface( sm ); + return NULL; + } + + core->FreeInterface( sm ); + ItemCache.SetAt(resname, (void *) item); + return item; +} + +//you can supply name for faster access +void GameData::FreeItem(Item const *itm, const ieResRef name, bool free) +{ + int res; + + res=ItemCache.DecRef((void *) itm, name, free); + if (res<0) { + printMessage( "Core", "Corrupted Item cache encountered (reference count went below zero), ", LIGHT_RED ); + printf( "Item name is: %.8s\n", name); + abort(); + } + if (res) return; + if (free) delete itm; +} + +Spell* GameData::GetSpell(const ieResRef resname) +{ + Spell *spell = (Spell *) SpellCache.GetResource(resname); + if (spell) { + return spell; + } + DataStream* str = core->GetResourceMgr()->GetResource( resname, IE_SPL_CLASS_ID ); + SpellMgr* sm = ( SpellMgr* ) core->GetInterface( IE_SPL_CLASS_ID ); + if (sm == NULL) { + delete ( str ); + return NULL; + } + if (!sm->Open( str, true )) { + core->FreeInterface( sm ); + return NULL; + } + + spell = new Spell(); + //this is required for storing the 'source' + strnlwrcpy(spell->Name, resname, 8); + sm->GetSpell( spell ); + if (spell == NULL) { + core->FreeInterface( sm ); + return NULL; + } + + core->FreeInterface( sm ); + + SpellCache.SetAt(resname, (void *) spell); + return spell; +} + +void GameData::FreeSpell(Spell *spl, const ieResRef name, bool free) +{ + int res; + + res=SpellCache.DecRef((void *) spl, name, free); + if (res<0) { + printMessage( "Core", "Corrupted Spell cache encountered (reference count went below zero), ", LIGHT_RED ); + printf( "Spell name is: %.8s or %.8s\n", name, spl->Name); + abort(); + } + if (res) return; + if (free) delete spl; +} + +Effect* GameData::GetEffect(const ieResRef resname) +{ + Effect *effect = (Effect *) EffectCache.GetResource(resname); + if (effect) { + return effect; + } + DataStream* str = core->GetResourceMgr()->GetResource( resname, IE_EFF_CLASS_ID ); + EffectMgr* em = ( EffectMgr* ) core->GetInterface( IE_EFF_CLASS_ID ); + if (em == NULL) { + delete ( str ); + return NULL; + } + if (!em->Open( str, true )) { + core->FreeInterface( em ); + return NULL; + } + + effect = em->GetEffect(new Effect() ); + if (effect == NULL) { + core->FreeInterface( em ); + return NULL; + } + + core->FreeInterface( em ); + + EffectCache.SetAt(resname, (void *) effect); + return effect; +} + +void GameData::FreeEffect(Effect *eff, const ieResRef name, bool free) +{ + int res; + + res=EffectCache.DecRef((void *) eff, name, free); + if (res<0) { + printMessage( "Core", "Corrupted Effect cache encountered (reference count went below zero), ", LIGHT_RED ); + printf( "Effect name is: %.8s\n", name); + abort(); + } + if (res) return; + if (free) delete eff; +} + +//if the default setup doesn't fit for an animation +//create a vvc for it! +ScriptedAnimation* GameData::GetScriptedAnimation( const char *effect, bool doublehint) +{ + ScriptedAnimation *ret = NULL; + + if (Exists( effect, IE_VVC_CLASS_ID ) ) { + DataStream *ds = core->GetResourceMgr()->GetResource( effect, IE_VVC_CLASS_ID ); + ret = new ScriptedAnimation(ds, true); + } else { + AnimationFactory *af = (AnimationFactory *) + core->GetResourceMgr()->GetFactoryResource( effect, IE_BAM_CLASS_ID, IE_NORMAL ); + if (af) { + ret = new ScriptedAnimation(); + ret->LoadAnimationFactory( af, doublehint?2:0); + } + } + if (ret) { + strnlwrcpy(ret->ResName, effect, 8); + } + return ret; +} + +// Return single BAM frame as a sprite. Use if you want one frame only, +// otherwise it's not efficient +Sprite2D* GameData::GetBAMSprite(const ieResRef ResRef, int cycle, int frame) +{ + Sprite2D *tspr; + AnimationFactory* af = ( AnimationFactory* ) + core->GetResourceMgr()->GetFactoryResource( ResRef, IE_BAM_CLASS_ID, IE_NORMAL ); + if (!af) return 0; + if (cycle == -1) + tspr = af->GetFrameWithoutCycle( (unsigned short) frame ); + else + tspr = af->GetFrame( (unsigned short) frame, (unsigned char) cycle ); + return tspr; +} + + Property changes on: gemrb/trunk/gemrb/plugins/Core/GameData.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Id Added: svn:eol-style + native Added: gemrb/trunk/gemrb/plugins/Core/GameData.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.h (rev 0) +++ gemrb/trunk/gemrb/plugins/Core/GameData.h 2009-01-25 22:09:39 UTC (rev 5538) @@ -0,0 +1,102 @@ +/* GemRB - Infinity Engine Emulator + * Copyright (C) 2003 The GemRB Project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ + * + */ + +#ifndef GAMEDATA_H +#define GAMEDATA_H + +#include "../../includes/SClassID.h" +#include "../../includes/ie_types.h" +#include "Cache.h" + +class TableMgr; +class Palette; +class Item; +class Spell; +class Effect; +class ScriptedAnimation; +class Factory; +class Actor; +class Sprite2D; + +struct Table { + TableMgr * tm; + char ResRef[8]; + bool free; +}; + +class GameData +{ +public: + GameData(); + ~GameData(); + + void ClearCaches(); + + Factory* GetFactory() const { return factory; } + + // TODO: don't require manually opening a DataStream for this + /** Returns actor */ + Actor *GetCreature(DataStream *stream, unsigned char InParty=0); + /** Returns a PC index, by loading a creature */ + int LoadCreature(const char *ResRef, int InParty, bool character=false); + + // TODO: make it more convenient to look up a value from a table + // There should be no need for a full Load, Get, Del sequence + + /** Loads a 2DA Table, returns -1 on error or the Table Index on success */ + int LoadTable(const char * ResRef); + /** Gets the index of a loaded table, returns -1 on error */ + int GetTableIndex(const char * ResRef) const; + /** Gets a Loaded Table by its index, returns NULL on error */ + TableMgr * GetTable(unsigned int index) const; + /** Frees a Loaded Table, returns false on error, true on success */ + bool DelTable(unsigned int index); + + /** returns true if resource exists */ + bool Exists(const char *ResRef, SClass_ID type, bool silent=false); + + Palette* GetPalette(const ieResRef resname); + void FreePalette(Palette *&pal, const ieResRef name=NUL... [truncated message content] |
From: <wjp...@us...> - 2009-01-26 20:35:15
|
Revision: 5540 http://gemrb.svn.sourceforge.net/gemrb/?rev=5540&view=rev Author: wjpalenstijn Date: 2009-01-26 20:35:11 +0000 (Mon, 26 Jan 2009) Log Message: ----------- properly release movie audio streams and handle failure to allocate them Modified Paths: -------------- gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp gemrb/trunk/gemrb/plugins/MVEPlayer/mve_play.cpp gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp Modified: gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp 2009-01-26 09:50:07 UTC (rev 5539) +++ gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp 2009-01-26 20:35:11 UTC (rev 5540) @@ -218,22 +218,23 @@ int MVEPlay::setAudioStream() { - ieDword volume ; - core->GetDictionary()->Lookup( "Volume Movie", volume) ; - return core->GetAudioDrv()->SetupNewStream(0, 0, 0, volume, - false, false) ; + ieDword volume ; + core->GetDictionary()->Lookup( "Volume Movie", volume) ; + int source = core->GetAudioDrv()->SetupNewStream(0, 0, 0, volume, false, false) ; + return source; } void MVEPlay::freeAudioStream(int stream) { - core->GetAudioDrv()->ReleaseStream(stream, true); + if (stream > -1) + core->GetAudioDrv()->ReleaseStream(stream, true); } void MVEPlay::queueBuffer(int stream, unsigned short bits, int channels, short* memory, int size, int samplerate) { - core->GetAudioDrv()->QueueBuffer(stream, bits, channels, - memory, size, samplerate) ; + if (stream > -1) + core->GetAudioDrv()->QueueBuffer(stream, bits, channels, memory, size, samplerate) ; } Modified: gemrb/trunk/gemrb/plugins/MVEPlayer/mve_play.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/MVEPlayer/mve_play.cpp 2009-01-26 09:50:07 UTC (rev 5539) +++ gemrb/trunk/gemrb/plugins/MVEPlayer/mve_play.cpp 2009-01-26 20:35:11 UTC (rev 5540) @@ -302,9 +302,10 @@ if ( mve_audio_source == -1 ) { fprintf( stderr, " failure\n"); mve_audio_canplay = 0 ; + } else { + fprintf( stderr, " success\n" ); + mve_audio_canplay = 1; } - fprintf( stderr, " success\n" ); - mve_audio_canplay = 1; mve_audio_underruns = 0; #endif Modified: gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp 2009-01-26 09:50:07 UTC (rev 5539) +++ gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp 2009-01-26 20:35:11 UTC (rev 5540) @@ -519,9 +519,9 @@ { if (streams[stream].free || !streams[stream].locked) return false; + streams[stream].locked = false; if (!HardStop) { - // unlock it, so it will automatically be reclaimed when needed - streams[stream].locked = false; + // it's now unlocked, so it will automatically be reclaimed when needed return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 18:21:02
|
Revision: 5549 http://gemrb.svn.sourceforge.net/gemrb/?rev=5549&view=rev Author: wjpalenstijn Date: 2009-01-27 18:20:59 +0000 (Tue, 27 Jan 2009) Log Message: ----------- start using AutoTable Modified Paths: -------------- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Game.h Modified: gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2009-01-27 18:17:54 UTC (rev 5548) +++ gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2009-01-27 18:20:59 UTC (rev 5549) @@ -89,15 +89,9 @@ bool trackflag = core->GetStringReference(STR_TRACKING)!=(ieStrRef) -1; if (!tracks) { - int trackdata = gamedata->LoadTable( "tracking" ); - if (trackdata < 0) { + AutoTable tm("tracking"); + if (!tm.ok()) return -1; - } - TableMgr* tm = gamedata->GetTable( trackdata ); - if (!tm) { - gamedata->DelTable( trackdata ); - return -1; - } trackcount = tm->GetRowCount(); tracks = new ResRefToStrRef[trackcount]; for (i=0;i<trackcount;i++) { @@ -128,9 +122,8 @@ str = NULL; if (Sounds[0][0] == UNINITIALIZED_BYTE) { memset( Sounds, 0, sizeof( Sounds ) ); - int SoundTable = gamedata->LoadTable( "defsound" ); - TableMgr* at = gamedata->GetTable( SoundTable ); - if (at) { + AutoTable at("defsound"); + if (at.ok()) { for (int i = 0; i < DEF_COUNT; i++) { strncpy( Sounds[i], at->QueryField( i, 0 ), 8 ); if(Sounds[i][0]=='*') { @@ -138,7 +131,6 @@ } } } - gamedata->DelTable( SoundTable ); } } Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-01-27 18:17:54 UTC (rev 5548) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-01-27 18:20:59 UTC (rev 5549) @@ -62,9 +62,8 @@ LastScriptUpdate = 0; //loading master areas - int mtab = gamedata->LoadTable("mastarea"); - TableMgr *table = gamedata->GetTable(mtab); - if (table) { + AutoTable table; + if (table.load("mastarea")) { int i = table->GetRowCount(); mastarea.reserve(i); while(i--) { @@ -72,22 +71,18 @@ strnuprcpy (tmp,table->QueryField(i,0),8); mastarea.push_back( tmp ); } - gamedata->DelTable(mtab); } //loading rest/daylight switching movies (only bg2 has them) memset(restmovies,'*',sizeof(restmovies)); memset(daymovies,'*',sizeof(restmovies)); memset(nightmovies,'*',sizeof(restmovies)); - mtab = gamedata->LoadTable("restmov"); - table = gamedata->GetTable(mtab); - if (table) { + if (table.load("restmov")) { for(int i=0;i<8;i++) { strnuprcpy(restmovies[i],table->QueryField(i,0),8); strnuprcpy(daymovies[i],table->QueryField(i,1),8); strnuprcpy(nightmovies[i],table->QueryField(i,2),8); } - gamedata->DelTable(mtab); } interval = 1000/AI_UPDATE_TIME; @@ -309,7 +304,7 @@ } //determines if startpos.2da has rotation rows (it cannot have tutorial line) -bool Game::DetermineStartPosType(TableMgr *strta) +bool Game::DetermineStartPosType(const TableMgr *strta) { if ((strta->GetRowCount()>=6) && !stricmp(strta->GetRowName(4),"START_ROT" ) ) { @@ -324,13 +319,12 @@ actor->InitButtons(actor->GetStat(IE_CLASS)); //init actor's buttons actor->SetBase(IE_EXPLORE, 1); if (join&JP_INITPOS) { + AutoTable strta("startpos"); // 0 - single player, 1 - tutorial, 2 - expansion - int saindex = gamedata->LoadTable( "startpos" ); - TableMgr* strta = gamedata->GetTable( saindex ); ieDword playmode = 0; core->GetDictionary()->Lookup( "PlayMode", playmode ); //hack for iwd2 - startorient = DetermineStartPosType(strta); + startorient = DetermineStartPosType(strta.ptr()); if (startorient || strta->GetRowCount()<6) { playmode %= 2; actor->SetOrientation( atoi( strta->QueryField( playmode+4, actor->InParty-1) ), false ); @@ -338,15 +332,12 @@ playmode *= 2; actor->Pos.x = actor->Destination.x = (short) atoi( strta->QueryField( playmode, actor->InParty-1 ) ); actor->Pos.y = actor->Destination.y = (short) atoi( strta->QueryField( playmode + 1, actor->InParty-1 ) ); - gamedata->DelTable( saindex ); - saindex = gamedata->LoadTable( "startare" ); - strta = gamedata->GetTable( saindex ); + strta.load("startare"); playmode /= 2; playmode *= 3; strnlwrcpy(actor->Area, strta->QueryField( playmode, 0 ), 8 ); //TODO: set viewport - gamedata->DelTable( saindex ); SelectActor(actor,true, SELECT_QUIET); } @@ -802,9 +793,8 @@ //reading the challenge rating table for iwd2 (only when needed) void Game::LoadCRTable() { - int mtab = gamedata->LoadTable("moncrate"); - TableMgr *table = gamedata->GetTable(mtab); - if (table) { + AutoTable table("moncrate"); + if (table.ok()) { int maxrow = table->GetRowCount()-1; crtable = new CRRow[MAX_LEVEL]; for(int i=0;i<MAX_LEVEL;i++) { @@ -817,7 +807,6 @@ crtable[i][j]=atoi(table->QueryField(row,col) ); } } - gamedata->DelTable(mtab); } } Modified: gemrb/trunk/gemrb/plugins/Core/Game.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.h 2009-01-27 18:17:54 UTC (rev 5548) +++ gemrb/trunk/gemrb/plugins/Core/Game.h 2009-01-27 18:20:59 UTC (rev 5549) @@ -390,7 +390,7 @@ /** Dumps information about the object */ void DebugDump(); private: - bool DetermineStartPosType(TableMgr *strta); + bool DetermineStartPosType(const TableMgr *strta); }; #endif // ! GAME_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-27 21:09:27
|
Revision: 5554 http://gemrb.svn.sourceforge.net/gemrb/?rev=5554&view=rev Author: wjpalenstijn Date: 2009-01-27 21:09:16 +0000 (Tue, 27 Jan 2009) Log Message: ----------- GetTable to AutoTable Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp gemrb/trunk/gemrb/plugins/Core/TableMgr.h gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp Modified: gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2009-01-27 21:09:16 UTC (rev 5554) @@ -195,7 +195,6 @@ if (initialized) { return true; } - TableMgr* efftextTable=NULL; SymbolMgr* effectsTable; memset( effect_refs, 0, sizeof( effect_refs ) ); for(i=0;i<MAX_EFFECTS;i++) { @@ -204,8 +203,7 @@ initialized = 1; - int effT = gamedata->LoadTable( "efftext" ); - efftextTable = gamedata->GetTable( effT ); + AutoTable efftextTable("efftext"); int eT = core->LoadSymbol( "effects" ); if (eT < 0) { @@ -246,7 +244,6 @@ //printf("-------- FN: %d, %s\n", i, effectname); } core->DelSymbol( eT ); - if ( efftextTable ) gamedata->DelTable( effT ); //additional initialisations for (i=0;diced_effects[i].Name;i++) { Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-01-27 21:09:16 UTC (rev 5554) @@ -68,9 +68,8 @@ { //initializing the skill->stats conversion table { - int table = gamedata->LoadTable( "skillsta" ); - if (table!=-1) { - TableMgr *tab = gamedata->GetTable( table ); + AutoTable tab("skillsta"); + if (tab) { int rowcount = tab->GetRowCount(); SkillCount = rowcount; if (rowcount) { @@ -83,39 +82,33 @@ } //initializing the happiness table { - int table = gamedata->LoadTable( "happy" ); - if (table!=-1) { - TableMgr *tab = gamedata->GetTable( table ); + AutoTable tab("happy"); + if (tab) { for (int alignment=0;alignment<3;alignment++) { for (int reputation=0;reputation<20;reputation++) { happiness[alignment][reputation]=strtol(tab->QueryField(reputation,alignment), NULL, 0); } } - gamedata->DelTable( table ); } } //initializing the reaction mod. reputation table { - int table = gamedata->LoadTable( "rmodrep" ); - if (table!=-1) { - TableMgr *tab = gamedata->GetTable( table ); + AutoTable tab("rmodrep"); + if (tab) { for (int reputation=0;reputation<20;reputation++) { rmodrep[reputation]=strtol(tab->QueryField(0,reputation), NULL, 0); } - gamedata->DelTable( table ); } } //initializing the reaction mod. charisma table { - int table = gamedata->LoadTable( "rmodchr" ); - if (table!=-1) { - TableMgr *tab = gamedata->GetTable( table ); + AutoTable tab("rmodchr"); + if (tab) { for (int charisma=0;charisma<25;charisma++) { rmodchr[charisma]=strtol(tab->QueryField(0,charisma), NULL, 0); } - gamedata->DelTable( table ); } } } @@ -827,11 +820,10 @@ int CheckInteract(const char *talker, const char *target) { - int interact = -1; - interact = gamedata->LoadTable( "interact" ); + AutoTable interact("interact"); if(!interact) return 0; - const char *value = gamedata->GetTable(interact)->QueryField(talker, target); + const char *value = interact->QueryField(talker, target); if(!value) return 0; switch(value[0]) { @@ -966,7 +958,7 @@ } const char* Dialog = NULL; - int pdtable = -1; + AutoTable pdtable; switch (Flags & BD_LOCMASK) { case BD_STRING0: @@ -994,13 +986,13 @@ speaker->Interact(type); target->Response(type); Sender->ReleaseCurrentAction(); - goto end_of_quest; + return; } /* banter dialogue */ - pdtable = gamedata->LoadTable( "interdia" ); + pdtable.load("interdia"); //Dialog is a borrowed reference, we cannot free pdtable while it is being used - if (pdtable!=-1) { - Dialog = gamedata->GetTable( pdtable )->QueryField( scriptingname, "FILE" ); + if (pdtable) { + Dialog = pdtable->QueryField( scriptingname, "FILE" ); } break; } @@ -1009,7 +1001,7 @@ //dialog is not meaningful if (!Dialog || Dialog[0]=='*') { Sender->ReleaseCurrentAction(); - goto end_of_quest; + return; } //maybe we should remove the action queue, but i'm unsure //no, we shouldn't even call this! @@ -1025,7 +1017,7 @@ if (tar->GetNextAction()) { core->DisplayConstantString(STR_TARGETBUSY,0xff0000); Sender->ReleaseCurrentAction(); - goto end_of_quest; + return; } } } @@ -1053,11 +1045,6 @@ core->GetDictionary()->SetAt("DialogChoose",(ieDword) -1); gc->InitDialog( scr, tar, Dialog); } -//if pdtable was allocated, free it now, it will release Dialog -end_of_quest: - if (pdtable!=-1) { - gamedata->DelTable( pdtable ); - } } void MoveBetweenAreasCore(Actor* actor, const char *area, Point &position, int face, bool adjust) @@ -2312,16 +2299,14 @@ { Point p; - int table = gamedata->LoadTable( "entries" ); - if (table<0) { + AutoTable tab("entries"); + if (!tab) { return p; } - TableMgr *tab = gamedata->GetTable( table ); const char *tmpstr = tab->QueryField(areaname, entryname); int x=-1; int y=-1; sscanf(tmpstr, "%d.%d", &x, &y); - gamedata->DelTable(table); p.x=(short) x; p.y=(short) y; return p; Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-01-27 21:09:16 UTC (rev 5554) @@ -1230,15 +1230,14 @@ int tT = core->LoadSymbol( "trigger" ); int aT = core->LoadSymbol( "action" ); int oT = core->LoadSymbol( "object" ); - int iT = gamedata->LoadTable( "script" ); - if (tT < 0 || aT < 0 || oT < 0 || iT < 0) { + AutoTable objNameTable("script"); + if (tT < 0 || aT < 0 || oT < 0 || !objNameTable) { printMessage( "GameScript","A critical scripting file is missing!\n",LIGHT_RED ); abort(); } triggersTable = core->GetSymbol( tT ); actionsTable = core->GetSymbol( aT ); objectsTable = core->GetSymbol( oT ); - TableMgr* objNameTable = gamedata->GetTable( iT ); if (!triggersTable || !actionsTable || !objectsTable || !objNameTable) { printMessage( "GameScript","A critical scripting file is damaged!\n",LIGHT_RED ); abort(); Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-01-27 21:09:16 UTC (rev 5554) @@ -152,20 +152,15 @@ { ieResRef GroupName; int i; - TableMgr * tab; - int table=gamedata->LoadTable( "spawngrp" ); + AutoTable tab("spawngrp"); Spawns.RemoveAll(NULL); Spawns.SetType( GEM_VARIABLES_POINTER ); - if (table<0) { + if (!tab) return; - } - tab = gamedata->GetTable( table ); - if (!tab) { - goto end; - } + i=tab->GetColNamesCount(); while (i--) { int j=tab->GetRowCount(); @@ -184,32 +179,26 @@ Spawns.SetAt( GroupName, (void*) creatures ); } } -end: - gamedata->DelTable( table ); } void InitPathFinder() { PathFinderInited = true; - int passabletable = gamedata->LoadTable( "pathfind" ); - if (passabletable >= 0) { - TableMgr* tm = gamedata->GetTable( passabletable ); - if (tm) { - const char* poi; + AutoTable tm("pathfind"); + if (tm) { + const char* poi; - for (int i = 0; i < 16; i++) { - poi = tm->QueryField( 0, i ); - if (*poi != '*') - Passable[i] = atoi( poi ); - } - poi = tm->QueryField( 1, 0 ); + for (int i = 0; i < 16; i++) { + poi = tm->QueryField( 0, i ); if (*poi != '*') - NormalCost = atoi( poi ); - poi = tm->QueryField( 1, 1 ); - if (*poi != '*') - AdditionalCost = atoi( poi ); - gamedata->DelTable( passabletable ); + Passable[i] = atoi( poi ); } + poi = tm->QueryField( 1, 0 ); + if (*poi != '*') + NormalCost = atoi( poi ); + poi = tm->QueryField( 1, 1 ); + if (*poi != '*') + AdditionalCost = atoi( poi ); } } @@ -1353,15 +1342,10 @@ column = 0; tablename = "music"; } - int songlist = gamedata->LoadTable( tablename ); - if (songlist < 0) { + + AutoTable tm(tablename); + if (!tm) return; - } - TableMgr* tm = gamedata->GetTable( songlist ); - if (!tm) { - gamedata->DelTable( songlist ); - return; - } const char* poi = tm->QueryField( SongHeader.SongList[SongType], column ); core->GetMusicMgr()->SwitchPlayList( poi, true ); } Modified: gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2009-01-27 21:09:16 UTC (rev 5554) @@ -129,8 +129,7 @@ return explosioncount; } - unsigned int resource = gamedata->LoadTable("areapro"); - TableMgr *explist = gamedata->GetTable(resource); + AutoTable explist("areapro"); if (explist) { explosioncount = 0; @@ -142,7 +141,6 @@ strnuprcpy(explosions[ rows].resource1, explist->QueryField(rows, 0), 8); strnuprcpy(explosions[ rows].resource2, explist->QueryField(rows, 1), 8); } - core->DelSymbol(resource); } return explosioncount; } Modified: gemrb/trunk/gemrb/plugins/Core/TableMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/Core/TableMgr.h 2009-01-27 21:09:16 UTC (rev 5554) @@ -93,6 +93,7 @@ bool load(const char* ResRef); void release(); bool ok() const { return table != 0; } + operator bool() const { return table != 0; } const TableMgr& operator*() const { return *table; } const TableMgr* operator->() const { return table; } Modified: gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp 2009-01-27 20:37:48 UTC (rev 5553) +++ gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp 2009-01-27 21:09:16 UTC (rev 5554) @@ -171,11 +171,10 @@ if (!newGame->CurrentArea[0]) { // 0 - normal, 1 - tutorial, 2 - extension - int i = gamedata->LoadTable( "STARTARE" ); - TableMgr* tm = gamedata->GetTable( i ); + AutoTable tm("STARTARE"); ieDword playmode = 0; //only bg2 has 9 rows (iwd's have 6 rows - normal+extension) - if (tm->GetRowCount()==9) { + if (tm && tm->GetRowCount()==9) { core->GetDictionary()->Lookup( "PlayMode", playmode ); playmode *= 3; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2009-01-29 21:06:42
|
Revision: 5572 http://gemrb.svn.sourceforge.net/gemrb/?rev=5572&view=rev Author: wjpalenstijn Date: 2009-01-29 21:06:38 +0000 (Thu, 29 Jan 2009) Log Message: ----------- more AutoTable usage Modified Paths: -------------- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Particles.cpp gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp gemrb/trunk/gemrb/plugins/TLKImporter/TLKImp.cpp Modified: gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -362,8 +362,7 @@ if (RandColor==-1) { RandColor=0; RandRows=0; - int table = gamedata->LoadTable( "randcolr" ); - TableMgr *rndcol = gamedata->GetTable( table ); + AutoTable rndcol("randcolr"); if (rndcol) { RandColor = rndcol->GetColumnCount(); RandRows = rndcol->GetRowCount(); @@ -383,7 +382,6 @@ else { RandColor=0; } - gamedata->DelTable( table ); } if (stat<200) return; Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -371,12 +371,11 @@ void CharAnimations::InitAvatarsTable() { - int tmp= gamedata->LoadTable( "avatars" ); - if (tmp<0) { + AutoTable Avatars("avatars"); + if (!Avatars) { printMessage("CharAnimations", "A critical animation file is missing!\n", LIGHT_RED); abort(); } - TableMgr *Avatars = gamedata->GetTable( tmp ); AvatarTable = (AvatarStruct *) calloc ( AvatarsCount = Avatars->GetRowCount(), sizeof(AvatarStruct) ); int i=AvatarsCount; while(i--) { @@ -400,7 +399,6 @@ } AvatarTable[i].Size=Avatars->QueryField(i,AV_SIZE)[0]; } - gamedata->DelTable( tmp ); } CharAnimations::CharAnimations(unsigned int AnimID, ieDword ArmourLevel) Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -140,15 +140,12 @@ void GameControl::ReadFormations() { unsigned int i,j; - TableMgr * tab; - int table=gamedata->LoadTable("formatio"); - if (table<0) { - goto fallback; - } - tab = gamedata->GetTable( table); + AutoTable tab("formatio"); if (!tab) { - gamedata->DelTable(table); - goto fallback; + // fallback + formationcount = 1; + formations = (formation_type *) calloc(1,sizeof(formation_type) ); + return; } formationcount = tab->GetRowCount(); formations = (formation_type *) calloc(formationcount, sizeof(formation_type)); @@ -160,14 +157,6 @@ formations[i][j].y=k; } } -// -// read in formation data -// - gamedata->DelTable(table); - return; -fallback: - formationcount = 1; - formations = (formation_type *) calloc(1,sizeof(formation_type) ); } Point GameControl::GetFormationOffset(ieDword formation, ieDword pos) @@ -224,30 +213,20 @@ void GameControl::AutoSave() { const char *folder; - - int SlotTable = gamedata->LoadTable( "savegame" ); - if (SlotTable >= 0) { - TableMgr* tab = gamedata->GetTable( SlotTable ); + AutoTable tab("savegame"); + if (tab) { folder = tab->QueryField(0); core->GetSaveGameIterator()->CreateSaveGame(0, folder, 0); - if (SlotTable >= 0) { - gamedata->DelTable(SlotTable); - } } } void GameControl::QuickSave() { const char *folder; - - int SlotTable = gamedata->LoadTable( "savegame" ); - if (SlotTable >= 0) { - TableMgr* tab = gamedata->GetTable( SlotTable ); + AutoTable tab("savegame"); + if (tab) { folder = tab->QueryField(1); core->GetSaveGameIterator()->CreateSaveGame(1, folder, mqs == 1); - if (SlotTable >= 0) { - gamedata->DelTable(SlotTable); - } } } Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -630,15 +630,8 @@ bool Interface::ReadAbilityTable(const ieResRef tablename, ieWordSigned *mem, int columns, int rows) { - TableMgr * tab; - int table=gamedata->LoadTable( tablename ); - - if (table<0) { - return false; - } - tab = gamedata->GetTable( table ); + AutoTable tab(tablename); if (!tab) { - gamedata->DelTable(table); return false; } //this is a hack for rows not starting at 0 in some cases @@ -657,7 +650,6 @@ mem[rows*j+i+fix] = (ieWordSigned) strtol(tab->QueryField(i,j),NULL,0 ); } } - gamedata->DelTable(table); return true; } @@ -852,17 +844,12 @@ AreaAliasTable->SetType(GEM_VARIABLES_INT); } - int table = gamedata->LoadTable( tablename ); - - if (table < 0) { + AutoTable aa(tablename); + if (!aa) { //don't report error when the file doesn't exist return true; } - TableMgr* aa = gamedata->GetTable( table ); - if (!aa) { - gamedata->DelTable( table ); - return false; - } + int idx = aa->GetRowCount(); while (idx--) { ieResRef key; @@ -871,7 +858,6 @@ ieDword value = atoi(aa->QueryField(idx,0)); AreaAliasTable->SetAt(key, value); } - gamedata->DelTable( table ); return true; } @@ -948,21 +934,14 @@ bool Interface::ReadStrrefs() { int i; - TableMgr * tab; - int table=gamedata->LoadTable("strings"); memset(strref_table,-1,sizeof(strref_table) ); - if (table<0) { + AutoTable tab("strings"); + if (!tab) { return false; } - tab = gamedata->GetTable(table); - if (!tab) { - goto end; - } for(i=0;i<STRREF_COUNT;i++) { strref_table[i]=atoi(tab->QueryField(i,0)); } -end: - gamedata->DelTable(table); return true; } @@ -974,24 +953,20 @@ free(data); data = NULL; } - int table = gamedata->LoadTable( tablename ); - if (table < 0) { + AutoTable tm(tablename); + if (!tm) { printStatus( "ERROR", LIGHT_RED ); printf( "Cannot find %s.2da.\n",tablename ); return 0; } - TableMgr* tm = gamedata->GetTable( table ); - if (tm) { - count = tm->GetRowCount(); - data = (ieResRef *) calloc( count, sizeof(ieResRef) ); - for (int i = 0; i < count; i++) { - strnlwrcpy( data[i], tm->QueryField( i, 0 ), 8 ); - //* marks an empty resource - if (data[i][0]=='*') { - data[i][0]=0; - } + count = tm->GetRowCount(); + data = (ieResRef *) calloc( count, sizeof(ieResRef) ); + for (int i = 0; i < count; i++) { + strnlwrcpy( data[i], tm->QueryField( i, 0 ), 8 ); + //* marks an empty resource + if (data[i][0]=='*') { + data[i][0]=0; } - gamedata->DelTable( table ); } return count; } @@ -1000,7 +975,6 @@ { ieDword i; int size; - int table = -1; if (!IsAvailable( IE_2DA_CLASS_ID )) { printf( "No 2DA Importer Available.\nTermination in Progress...\n" ); return GEM_ERROR; @@ -1143,8 +1117,8 @@ printStatus( "OK", LIGHT_GREEN ); printMessage( "Core", "Loading Fonts...\n", WHITE ); - table = gamedata->LoadTable( "fonts" ); - if (table < 0) { + AutoTable tab("fonts"); + if (!tab) { printStatus( "ERROR", LIGHT_RED ); printf( "Cannot find fonts.2da.\nTermination in Progress...\n" ); return GEM_ERROR; @@ -1157,7 +1131,6 @@ } DataStream* str = NULL; - TableMgr* tab = gamedata->GetTable( table ); int count = tab->GetRowCount(); for (int i = 0; i < count; i++) { const char* ResRef = tab->QueryField( i, 0 ); @@ -1192,8 +1165,6 @@ fnt->SetFirstChar( (ieByte) first_char ); fonts.push_back( fnt ); } - gamedata->DelTable( table ); - FreeInterface(bamint); } printMessage( "Core", "Fonts Loaded...", WHITE ); @@ -3213,8 +3184,7 @@ int cnt = 0; vars->Lookup("Display Movie Subtitles", subtitles); if (subtitles) { - int table = gamedata->LoadTable(ResRef); - TableMgr *sttable = gamedata->GetTable(table); + AutoTable sttable(ResRef); if (sttable) { cnt = sttable->GetRowCount()-3; if (cnt>0) { @@ -3233,7 +3203,6 @@ int g = atoi(sttable->QueryField("green", "frame")); int b = atoi(sttable->QueryField("blue", "frame")); SubtitleFont = GetFont (MovieFont); //will change - gamedata->DelTable(table); if (SubtitleFont) { Color fore = {(unsigned char) r,(unsigned char) g,(unsigned char) b, 0x00}; Color back = {0x00, 0x00, 0x00, 0x00}; @@ -3654,9 +3623,7 @@ if (slotmatrix) { free(slotmatrix); } - int ItemTypeTable = gamedata->LoadTable( "itemtype" ); - TableMgr *it = gamedata->GetTable(ItemTypeTable); - + AutoTable it("itemtype"); ItemTypes = 0; if (it) { ItemTypes = it->GetRowCount(); //number of itemtypes @@ -3680,13 +3647,11 @@ } slotmatrix[i] = (ieDword) value; } - gamedata->DelTable(ItemTypeTable); } //slottype describes the inventory structure Inventory::Init(HasFeature(GF_MAGICBIT)); - int SlotTypeTable = gamedata->LoadTable( "slottype" ); - TableMgr *st = gamedata->GetTable(SlotTypeTable); + AutoTable st("slottype"); if (slottypes) { free(slottypes); slottypes = NULL; @@ -3742,7 +3707,6 @@ default:; } } - gamedata->DelTable( SlotTypeTable ); } return (it && st); } @@ -4238,17 +4202,12 @@ bool Interface::ReadItemTable(const ieResRef TableName, const char * Prefix) { ieResRef ItemName; - TableMgr * tab; int i,j; - int table=gamedata->LoadTable(TableName); - if (table<0) { + AutoTable tab(TableName); + if (!tab) { return false; } - tab = gamedata->GetTable(table); - if (!tab) { - goto end; - } i=tab->GetRowCount(); for(j=0;j<i;j++) { if (Prefix) { @@ -4269,8 +4228,6 @@ strlwr(ItemName); RtRows->SetAt(ItemName, (void*)itemlist); } -end: - gamedata->DelTable(table); return true; } @@ -4278,9 +4235,7 @@ { ieResRef RtResRef; int i; - TableMgr * tab; - int table=gamedata->LoadTable( "randitem" ); ieDword difflev=0; //rt norm or rt fury vars->Lookup("Nightmare Mode", difflev); if (RtRows) { @@ -4293,26 +4248,22 @@ } RtRows->SetType( GEM_VARIABLES_POINTER ); } - if (table<0) { + AutoTable tab("randitem"); + if (!tab) { return false; } - tab = gamedata->GetTable( table ); - if (!tab) { - goto end; - } if (difflev>=tab->GetColumnCount()) { difflev = tab->GetColumnCount()-1; } strncpy( GoldResRef, tab->QueryField((unsigned int) 0,(unsigned int) 0), sizeof(ieResRef) ); //gold if ( GoldResRef[0]=='*' ) { - gamedata->DelTable( table ); return false; } strncpy( RtResRef, tab->QueryField( 1, difflev ), sizeof(ieResRef) ); i=atoi( RtResRef ); if (i<1) { ReadItemTable( RtResRef, 0 ); //reading the table itself - goto end; + return true; } if (i>5) { i=5; @@ -4321,8 +4272,6 @@ strncpy( RtResRef,tab->QueryField(2+i,difflev), sizeof(ieResRef) ); ReadItemTable( RtResRef,tab->GetRowName(2+i) ); } -end: - gamedata->DelTable( table ); return true; } @@ -4990,9 +4939,7 @@ if (resource3) { resource3[0]=0; } - int table = gamedata->LoadTable(resref); - TableMgr *tab = gamedata->GetTable(table); - + AutoTable tab(resref); if (tab) { unsigned int cols = tab->GetColumnCount(); unsigned int row = (unsigned int) Roll(1,tab->GetRowCount(),-1); @@ -5008,9 +4955,7 @@ { ieDword *ret; - int table = gamedata->LoadTable(resref); - TableMgr *tab = gamedata->GetTable(table); - + AutoTable tab(resref); if (tab) { ieDword cnt = tab->GetRowCount(); ret = (ieDword *) malloc((1+cnt)*sizeof(ieDword)); Modified: gemrb/trunk/gemrb/plugins/Core/Particles.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Particles.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/Core/Particles.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -49,17 +49,10 @@ void InitSparks() { int i,j; - TableMgr * tab; - - int table=gamedata->LoadTable( "sprklclr" ); - - if (table<0) { + AutoTable tab("sprkclr"); + if (!tab) return; - } - tab = gamedata->GetTable( table ); - if (!tab) { - goto end; - } + memset(sparkcolors,0,sizeof(sparkcolors)); for (i=0;i<MAX_SPARK_COLOR;i++) { for (j=0;j<MAX_SPARK_PHASE;j++) { @@ -77,8 +70,6 @@ TranslateColor(value, sparkcolors[i+1][j]); } } -end: - gamedata->DelTable( table ); } Particles::Particles(int s) Modified: gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -1162,8 +1162,7 @@ ieDword cls = STAT_GET(IE_CLASS); if (!spell_abilities) { - int table = gamedata->LoadTable("clssplab"); - TableMgr *tab = gamedata->GetTable(table); + AutoTable tab("clssplab"); if (!tab) { spell_abilities = (int *) malloc(sizeof(int)*CSA_CNT); for (int ab=0;ab<CSA_CNT;ab++) { @@ -1179,7 +1178,6 @@ spell_abilities[ab*splabcount+i]=atoi(tab->QueryField(i,ab)); } } - gamedata->DelTable(table); } if (cls>=splabcount) cls=0; return spell_abilities[which*splabcount+cls]; Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -393,26 +393,18 @@ static void ReadSpellProtTable(const ieResRef tablename) { - TableMgr * tab; if (spellres) { free(spellres); } spellres = NULL; spellrescnt = 0; - int table=gamedata->LoadTable( tablename ); - - if (table<0) { - return; - } - tab = gamedata->GetTable( table ); + AutoTable tab(tablename); if (!tab) { - gamedata->DelTable(table); return; } spellrescnt=tab->GetRowCount(); spellres = (IWDIDSEntry *) malloc(sizeof(IWDIDSEntry) * spellrescnt); if (!spellres) { - gamedata->DelTable(table); return; } for( int i=0;i<spellrescnt;i++) { @@ -422,8 +414,6 @@ spellres[i].value = (ieDword) strtol(tab->QueryField(i,1),NULL,0 ); spellres[i].relation = (ieWord) strtol(tab->QueryField(i,2),NULL,0 ); } - gamedata->DelTable(table); - return; } //unusual types which need hacking (fake stats) Modified: gemrb/trunk/gemrb/plugins/TLKImporter/TLKImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/TLKImporter/TLKImp.cpp 2009-01-29 21:02:35 UTC (rev 5571) +++ gemrb/trunk/gemrb/plugins/TLKImporter/TLKImp.cpp 2009-01-29 21:06:38 UTC (rev 5572) @@ -44,18 +44,11 @@ autoFree = false; if (monthnamecount==0) { int i; - TableMgr * tab; - - int table=gamedata->LoadTable("months"); - if (table<0) { + AutoTable tab("months"); + if (!tab) { monthnamecount=-1; return; } - tab = gamedata->GetTable(table); - if (!tab) { - monthnamecount=-1; - goto end; - } monthnamecount = tab->GetRowCount(); monthnames = (int *) malloc(sizeof(int) * monthnamecount); days = (int *) malloc(sizeof(int) * monthnamecount); @@ -63,8 +56,6 @@ days[i]=atoi(tab->QueryField(i,0)); monthnames[i]=atoi(tab->QueryField(i,1)); } -end: - gamedata->DelTable(table); } } @@ -187,15 +178,11 @@ } else { race=0; } - int table = gamedata->LoadTable("races"); - if (table<0) { - return -1; - } - TableMgr *tab=gamedata->GetTable(table); + + AutoTable tab("races"); if (!tab) { return -1; } - //don't unload table because we'll load it again soon anyway return atoi(tab->QueryField(race,0) ); } @@ -354,8 +341,7 @@ ieDword row = 0; //default value is 0 (generalist) //this is subject to change, the row number in magesch.2da core->GetDictionary()->Lookup( "MAGESCHOOL", row ); - int ind = gamedata->LoadTable( "magesch" ); - TableMgr* tm = gamedata->GetTable( ind ); + AutoTable tm("magesch"); if (tm) { const char* value = tm->QueryField( row, 2 ); Decoded = GetString( atoi( value ), 0 ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-01-30 15:21:46
|
Revision: 5580 http://gemrb.svn.sourceforge.net/gemrb/?rev=5580&view=rev Author: avenger_teambg Date: 2009-01-30 15:21:42 +0000 (Fri, 30 Jan 2009) Log Message: ----------- implemented modal effects Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/Font.cpp gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Game.h gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-01-30 15:02:25 UTC (rev 5579) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-01-30 15:21:42 UTC (rev 5580) @@ -292,6 +292,8 @@ } //this one is saved only for PC's ModalState = 0; + //set it to a neutral value + ModalSpell[0] = '*'; //this one is saved, but not loaded? localID = globalID = 0; } @@ -2656,6 +2658,16 @@ void Actor::PerformAttack(ieDword gameTime) { + //apply the modal effect on the beginning of each round + if ((gameTime%ROUND_SIZE==0) && ModalState) { + if (!ModalSpell[0]) { + printMessage("Actor","Modal Spell Effect was not set!\n", YELLOW); + ModalSpell[0]='*'; + } else if(ModalSpell[0]!='*') { + core->ApplySpell(ModalSpell, this, this, 0); + } + } + if (!attackcount) { if (initiative) { if (InParty) { @@ -4152,3 +4164,4 @@ strcpy(multiclass, tm->QueryField(tm->FindTableValue(5, BaseStats[IE_CLASS]), 4)); } } + Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-01-30 15:02:25 UTC (rev 5579) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-01-30 15:21:42 UTC (rev 5580) @@ -146,6 +146,7 @@ ieResRef applyWhenHelpless; //cast spell on condition ieResRef applyWhenAttacked; //cast spell on condition ieResRef applyWhenBeingHit; //cast spell on condition + ieResRef ModalSpell; //apply this spell once per round PCStatsStruct* PCStats; ieResRef SmallPortrait; Modified: gemrb/trunk/gemrb/plugins/Core/Font.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Font.cpp 2009-01-30 15:02:25 UTC (rev 5579) +++ gemrb/trunk/gemrb/plugins/Core/Font.cpp 2009-01-30 15:21:42 UTC (rev 5580) @@ -131,6 +131,7 @@ pal = palette; } if (startrow) enablecap=false; + if (initials==this) { enablecap=false; } Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-01-30 15:02:25 UTC (rev 5579) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-01-30 15:21:42 UTC (rev 5580) @@ -1088,8 +1088,6 @@ //runs all area scripts -#define ROUND_SIZE 10 - void Game::UpdateScripts() { // This function is called more than once for each value of GameTime. Modified: gemrb/trunk/gemrb/plugins/Core/Game.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.h 2009-01-30 15:02:25 UTC (rev 5579) +++ gemrb/trunk/gemrb/plugins/Core/Game.h 2009-01-30 15:21:42 UTC (rev 5580) @@ -50,6 +50,9 @@ #include "Particles.h" #include "Variables.h" +//the length of a round in game ticks? +#define ROUND_SIZE 10 + //the size of the bestiary register #define BESTIARY_SIZE 260 Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-01-30 15:02:25 UTC (rev 5579) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-01-30 15:21:42 UTC (rev 5580) @@ -70,6 +70,7 @@ static int StoreSpellsCount = -1; static int UsedItemsCount = -1; static int ItemSoundsCount = -1; +static int ModalSpellCount = -1; //#define UIT_ALLOW_REPLACE 1 //item is replaceable with another item on this list @@ -104,6 +105,7 @@ static SpellExtHeader *SpellArray = NULL; static UsedItemType *UsedItems = NULL; static ResRefPairs *ItemSounds = NULL; +static ieResRef *ModalSpells = NULL; static int ReputationIncrease[20]={(int) UNINIT_IEDWORD}; static int ReputationDonation[20]={(int) UNINIT_IEDWORD}; @@ -5778,6 +5780,25 @@ } } +static void ReadModalSpells() +{ + int i; + + ModalSpellCount = 0; + int table = gamedata->LoadTable("modal"); + if (table>=0) { + TableMgr *tab = gamedata->GetTable(table); + if (!tab) goto table_loaded; + ModalSpellCount = tab->GetRowCount(); + ModalSpells = (ieResRef *) malloc( sizeof(ieResRef) * ModalSpellCount); + for (i=0;i<ModalSpellCount;i++) { + strnlwrcpy(ModalSpells[i], tab->QueryField(i,0), 8 ); + } +table_loaded: + gamedata->DelTable(table); + } +} + static void ReadSpecialItems() { int i; @@ -8022,15 +8043,17 @@ } PyDoc_STRVAR( GemRB_SetModalState__doc, -"SetModalState(slot, state)\n\n" -"Sets the modal state of the actor." ); +"SetModalState(slot, state[,spell])\n\n" +"Sets the modal state of the actor.\n" +"If 'spell' is not given, it will set a default spell resource associated with the state."); static PyObject* GemRB_SetModalState(PyObject * /*self*/, PyObject* args) { int slot; int state; + const char *spell=NULL; - if (!PyArg_ParseTuple( args, "ii", &slot, &state )) { + if (!PyArg_ParseTuple( args, "ii|s", &slot, &state, &spell )) { return AttributeError( GemRB_SetModalState__doc ); } Game *game = core->GetGame(); @@ -8042,6 +8065,17 @@ return RuntimeError( "Actor not found" ); } actor->SetModal( (ieDword) state); + if (spell) { + strnlwrcpy(actor->ModalSpell, spell, 8); + } else { + if (ModalSpellCount==-1) { + ReadModalSpells(); + } + if (state>=ModalSpellCount) + actor->ModalSpell[0]=0; + else + strnlwrcpy(actor->ModalSpell, ModalSpells[state], 8); + } Py_INCREF( Py_None ); return Py_None; @@ -8842,12 +8876,32 @@ free(StoreSpells); StoreSpells=NULL; } + if (SpecialSpells) { + free(SpecialSpells); + SpecialSpells=NULL; + } if (SpecialItems) { free(SpecialItems); SpecialItems=NULL; } + if (UsedItems) { + free(UsedItems); + UsedItems=NULL; + } + if (ItemSounds) { + free(ItemSounds); + ItemSounds=NULL; + } + if (ModalSpells) { + free(ModalSpells); + ModalSpells=NULL; + } StoreSpellsCount = -1; + SpecialSpellsCount = -1; SpecialItemsCount = -1; + UsedItemsCount = -1; + ItemSoundsCount = -1; + ModalSpellCount = -1; ReputationIncrease[0]=(int) UNINIT_IEDWORD; ReputationDonation[0]=(int) UNINIT_IEDWORD; GUIAction[0]=UNINIT_IEDWORD; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-02-04 10:05:41
|
Revision: 5636 http://gemrb.svn.sourceforge.net/gemrb/?rev=5636&view=rev Author: fuzzie Date: 2009-02-04 10:05:33 +0000 (Wed, 04 Feb 2009) Log Message: ----------- generate GEM_TAB on tab keydown, force-display tooltips on tab press Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2009-02-03 22:00:12 UTC (rev 5635) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2009-02-04 10:05:33 UTC (rev 5636) @@ -326,6 +326,15 @@ } Control *ctrl = NULL; + // tab shows tooltips + if (Key == GEM_TAB) { + if (last_win_over != NULL) { + Control *ctrl = last_win_over->GetOver(); + if (ctrl != NULL) { + ctrl->DisplayTooltip(); + } + } + } //the default control will get only GEM_RETURN if (Key == GEM_RETURN) { ctrl = last_win_focused->GetDefaultControl(); Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-03 22:00:12 UTC (rev 5635) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-04 10:05:33 UTC (rev 5636) @@ -316,6 +316,9 @@ case SDLK_RALT: key = GEM_ALT; break; + case SDLK_TAB: + key = GEM_TAB; + break; default: break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-02-06 12:22:50
|
Revision: 5655 http://gemrb.svn.sourceforge.net/gemrb/?rev=5655&view=rev Author: fuzzie Date: 2009-02-06 12:22:43 +0000 (Fri, 06 Feb 2009) Log Message: ----------- add DrawEllipseSegment function, change DrawTargetPoint to use it (both unfinished) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/Video.h gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-02-05 22:31:43 UTC (rev 5654) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-02-06 12:22:43 UTC (rev 5655) @@ -33,6 +33,7 @@ #include "Projectile.h" #include <cassert> +#include <cmath> extern Interface* core; @@ -1141,11 +1142,29 @@ GetTime( step ); step = tp_steps [(step >> 6) & 7]; - //Region vp = core->GetVideoDriver()->GetViewport(); - core->GetVideoDriver()->DrawEllipse( (ieWord) (Destination.x - vp.x), - (ieWord) (Destination.y - vp.y), (unsigned short) (size * 10 - step), - (unsigned short) ( size * 15 / 2 - step), selectedColor ); + step = step + 1; + int csize = (size - 1) * 4; + if (csize < 4) csize = 3; + /* segments should not go outside selection radius */ + unsigned short xradius = (csize * 4) - 5; + unsigned short yradius = (csize * 3) - 5; + ieWord xcentre = (ieWord) (Destination.x - vp.x); + ieWord ycentre = (ieWord) (Destination.y - vp.y); + + // TODO: 0.5 and 0.7 are pretty much random values + // right segment + core->GetVideoDriver()->DrawEllipseSegment( xcentre + step, ycentre, xradius, + yradius, selectedColor, -0.5, 0.5 ); + // top segment + core->GetVideoDriver()->DrawEllipseSegment( xcentre, ycentre - step, xradius, + yradius, selectedColor, -0.7 - M_PI_2, 0.7 - M_PI_2 ); + // left segment + core->GetVideoDriver()->DrawEllipseSegment( xcentre - step, ycentre, xradius, + yradius, selectedColor, -0.5 - M_PI, 0.5 - M_PI ); + // bottom segment + core->GetVideoDriver()->DrawEllipseSegment( xcentre, ycentre + step, xradius, + yradius, selectedColor, -0.7 - M_PI - M_PI_2, 0.7 - M_PI - M_PI_2 ); } /********************** Modified: gemrb/trunk/gemrb/plugins/Core/Video.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Video.h 2009-02-05 22:31:43 UTC (rev 5654) +++ gemrb/trunk/gemrb/plugins/Core/Video.h 2009-02-06 12:22:43 UTC (rev 5655) @@ -156,6 +156,9 @@ virtual void GetPixel(short x, short y, Color* color) = 0; /** Draws a circle */ virtual void DrawCircle(short cx, short cy, unsigned short r, const Color& color, bool clipped = true) = 0; + /** Draws an Ellipse Segment */ + virtual void DrawEllipseSegment(short cx, short cy, unsigned short xr, unsigned short yr, const Color& color, + double anglefrom, double angleto, bool drawlines = true, bool clipped = true) = 0; /** Draws an ellipse */ virtual void DrawEllipse(short cx, short cy, unsigned short xr, unsigned short yr, const Color& color, bool clipped = true) = 0; Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-05 22:31:43 UTC (rev 5654) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-06 12:22:43 UTC (rev 5655) @@ -1932,6 +1932,119 @@ SDL_UnlockSurface( disp ); } } + +static double ellipseradius(unsigned short xr, unsigned short yr, double angle) { + double one = (xr * sin(angle)); + double two = (yr * cos(angle)); + return sqrt(xr*xr*yr*yr / (one*one + two*two)); +} + +/** This functions Draws an Ellipse Segment */ +void SDLVideoDriver::DrawEllipseSegment(short cx, short cy, unsigned short xr, + unsigned short yr, const Color& color, double anglefrom, double angleto, bool drawlines, bool clipped) +{ + /* beware, dragons and clockwise angles be here! */ + double radiusfrom = ellipseradius(xr, yr, anglefrom); + double radiusto = ellipseradius(xr, yr, angleto); + long xfrom = (long)round(radiusfrom * cos(anglefrom)); + long yfrom = (long)round(radiusfrom * sin(anglefrom)); + long xto = (long)round(radiusto * cos(angleto)); + long yto = (long)round(radiusto * sin(angleto)); + + if (drawlines) { + // TODO: DrawLine's clipping code works differently to the clipping + // here so we add Viewport.x/Viewport.y as a hack for now + DrawLine(cx + Viewport.x, cy + Viewport.y, + cx + xfrom + Viewport.x, cy + yfrom + Viewport.y, color, clipped); + DrawLine(cx + Viewport.x, cy + Viewport.y, + cx + xto + Viewport.x, cy + yto + Viewport.y, color, clipped); + } + + // *Attempt* to calculate the correct x/y boundaries. + // TODO: this doesn't work very well - you can't actually bound many + // arcs this way (imagine a segment with a small piece cut out). + if (xfrom > xto) { + long tmp = xfrom; xfrom = xto; xto = tmp; + } + if (yfrom > yto) { + long tmp = yfrom; yfrom = yto; yto = tmp; + } + if (xfrom >= 0 && yto >= 0) xto = xr; + if (xto <= 0 && yto >= 0) xfrom = -xr; + if (yfrom >= 0 && xto >= 0) yto = yr; + if (yto <= 0 && xto >= 0) yfrom = -yr; + + //Uses Bresenham's Ellipse Algorithm + long x, y, xc, yc, ee, tas, tbs, sx, sy; + + if (SDL_MUSTLOCK( disp )) { + SDL_LockSurface( disp ); + } + tas = 2 * xr * xr; + tbs = 2 * yr * yr; + x = xr; + y = 0; + xc = yr * yr * ( 1 - ( 2 * xr ) ); + yc = xr * xr; + ee = 0; + sx = tbs * xr; + sy = 0; + + while (sx >= sy) { + if (x >= xfrom && x <= xto && y >= yfrom && y <= yto) + SetPixel( cx + ( short ) x, cy + ( short ) y, color, clipped ); + if (-x >= xfrom && -x <= xto && y >= yfrom && y <= yto) + SetPixel( cx - ( short ) x, cy + ( short ) y, color, clipped ); + if (-x >= xfrom && -x <= xto && -y >= yfrom && -y <= yto) + SetPixel( cx - ( short ) x, cy - ( short ) y, color, clipped ); + if (x >= xfrom && x <= xto && -y >= yfrom && -y <= yto) + SetPixel( cx + ( short ) x, cy - ( short ) y, color, clipped ); + y++; + sy += tas; + ee += yc; + yc += tas; + if (( 2 * ee + xc ) > 0) { + x--; + sx -= tbs; + ee += xc; + xc += tbs; + } + } + + x = 0; + y = yr; + xc = yr * yr; + yc = xr * xr * ( 1 - ( 2 * yr ) ); + ee = 0; + sx = 0; + sy = tas * yr; + + while (sx <= sy) { + if (x >= xfrom && x <= xto && y >= yfrom && y <= yto) + SetPixel( cx + ( short ) x, cy + ( short ) y, color, clipped ); + if (-x >= xfrom && -x <= xto && y >= yfrom && y <= yto) + SetPixel( cx - ( short ) x, cy + ( short ) y, color, clipped ); + if (-x >= xfrom && -x <= xto && -y >= yfrom && -y <= yto) + SetPixel( cx - ( short ) x, cy - ( short ) y, color, clipped ); + if (x >= xfrom && x <= xto && -y >= yfrom && -y <= yto) + SetPixel( cx + ( short ) x, cy - ( short ) y, color, clipped ); + x++; + sx += tbs; + ee += xc; + xc += tbs; + if (( 2 * ee + yc ) > 0) { + y--; + sy -= tas; + ee += yc; + yc += tas; + } + } + if (SDL_MUSTLOCK( disp )) { + SDL_UnlockSurface( disp ); + } +} + + /** This functions Draws an Ellipse */ void SDLVideoDriver::DrawEllipse(short cx, short cy, unsigned short xr, unsigned short yr, const Color& color, bool clipped) Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2009-02-05 22:31:43 UTC (rev 5654) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2009-02-06 12:22:43 UTC (rev 5655) @@ -110,6 +110,9 @@ void SetPixel(short x, short y, const Color& color, bool clipped = true); void GetPixel(short x, short y, Color* color); void DrawCircle(short cx, short cy, unsigned short r, const Color& color, bool clipped = true); + /** This functions Draws an Ellipse Segment */ + void DrawEllipseSegment(short cx, short cy, unsigned short xr, unsigned short yr, const Color& color, + double anglefrom, double angleto, bool drawlines = true, bool clipped = true); /** This functions Draws an Ellipse */ void DrawEllipse(short cx, short cy, unsigned short xr, unsigned short yr, const Color& color, bool clipped = true); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-02-07 21:15:15
|
Revision: 5669 http://gemrb.svn.sourceforge.net/gemrb/?rev=5669&view=rev Author: avenger_teambg Date: 2009-02-07 21:15:11 +0000 (Sat, 07 Feb 2009) Log Message: ----------- added unknown54 field in doors (so this field is not corrupted by gemrb in original saves) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h Modified: gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2009-02-07 15:43:14 UTC (rev 5668) +++ gemrb/trunk/gemrb/plugins/AREImporter/AREImp.cpp 2009-02-07 21:15:11 UTC (rev 5669) @@ -615,6 +615,7 @@ ieStrRef OpenStrRef; ieStrRef NameStrRef; ieResRef Dialog; + ieDword Unknown54; str->Read( LongName, 32 ); LongName[32] = 0; @@ -644,7 +645,7 @@ str->ReadWord( &OpenImpededCount ); str->ReadWord( &ClosedImpededCount ); str->ReadDword( &ClosedFirstImpeded ); - str->Seek( 4, GEM_CURRENT_POS ); + str->ReadDword( &Unknown54); ieResRef OpenResRef, CloseResRef; str->ReadResRef( OpenResRef ); str->ReadResRef( CloseResRef ); @@ -740,6 +741,7 @@ door->cibcount = ClosedImpededCount; door->SetMap(map); + door->Unknown54 = Unknown54; door->TrapDetectionDiff = TrapDetect; door->TrapRemovalDiff = TrapRemoval; door->Trapped = Trapped; @@ -1423,8 +1425,7 @@ stream->WriteWord( &tmpWord); stream->WriteDword( &VertIndex); VertIndex += tmpWord; - //unknown54 - stream->WriteDword( &tmpDword); + stream->WriteDword( &d->Unknown54); stream->WriteResRef( d->OpenSound); stream->WriteResRef( d->CloseSound); stream->WriteDword( &d->Cursor); Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-02-07 15:43:14 UTC (rev 5668) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-02-07 21:15:11 UTC (rev 5669) @@ -462,6 +462,7 @@ ieStrRef OpenStrRef; ieStrRef NameStrRef; ieResRef Dialog; + ieDword Unknown54; //not known yet private: void SetWallgroups(int count, int value); void ImpedeBlocks(int count, Point *points, unsigned int value); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-02-12 22:40:55
|
Revision: 5686 http://gemrb.svn.sourceforge.net/gemrb/?rev=5686&view=rev Author: avenger_teambg Date: 2009-02-12 22:40:50 +0000 (Thu, 12 Feb 2009) Log Message: ----------- implemented default cancel button, bound it to the escape key changed control popup to ctrl-space Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Button.cpp gemrb/trunk/gemrb/plugins/Core/Button.h gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/Core/EventMgr.h gemrb/trunk/gemrb/plugins/Core/Window.cpp gemrb/trunk/gemrb/plugins/Core/Window.h gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Button.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.cpp 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/Core/Button.cpp 2009-02-12 22:40:50 UTC (rev 5686) @@ -334,11 +334,17 @@ { if (State != IE_GUI_BUTTON_DISABLED && State != IE_GUI_BUTTON_LOCKED) { if (Key == GEM_RETURN) { - if (Flags & IE_GUI_BUTTON_DEFAULT) { + if (Flags & IE_GUI_BUTTON_DEFAULT ) { RunEventHandler( ButtonOnPress ); return; } } + else if (Key == GEM_ESCAPE) { + if (Flags & IE_GUI_BUTTON_CANCEL ) { + RunEventHandler( ButtonOnPress ); + return; + } + } } Control::OnSpecialKeyPress(Key); } Modified: gemrb/trunk/gemrb/plugins/Core/Button.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.h 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/Core/Button.h 2009-02-12 22:40:50 UTC (rev 5686) @@ -54,7 +54,7 @@ #define IE_GUI_BUTTON_ALT_SOUND 0x00000008 #define IE_GUI_BUTTON_CHECKBOX 0x00000010 // or radio button #define IE_GUI_BUTTON_RADIOBUTTON 0x00000020 // sticks in a state -#define IE_GUI_BUTTON_DEFAULT 0x00000040 // enter button triggers it +#define IE_GUI_BUTTON_DEFAULT 0x00000040 // enter key triggers it #define IE_GUI_BUTTON_ANIMATED 0x00000080 //these bits are hardcoded in the .chu structure @@ -73,6 +73,7 @@ #define IE_GUI_BUTTON_CENTER_PICTURES 0x00080000 // center button's PictureList #define IE_GUI_BUTTON_BG1_PAPERDOLL 0x00100000 // BG1-style paperdoll PictureList #define IE_GUI_BUTTON_HORIZONTAL 0x00200000 // horizontal clipping of overlay +#define IE_GUI_BUTTON_CANCEL 0x00400000 // cancel key triggers it #define IE_GUI_BUTTON_NORMAL 0x00000004 // default button, doesn't stick Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2009-02-12 22:40:50 UTC (rev 5686) @@ -336,9 +336,14 @@ } } //the default control will get only GEM_RETURN - if (Key == GEM_RETURN) { - ctrl = last_win_focused->GetDefaultControl(); + else if (Key == GEM_RETURN) { + ctrl = last_win_focused->GetDefaultControl(0); } + //the default cancel control will get only GEM_ESCAPE + else if (Key == GEM_ESCAPE) { + ctrl = last_win_focused->GetDefaultControl(1); + } + //if there was no default button set, then the current focus will get it if (!ctrl) { ctrl = last_win_focused->GetFocus(); @@ -359,7 +364,7 @@ break; //buttons will receive only GEM_RETURN case IE_GUI_BUTTON: - if (Key != GEM_RETURN) { + if (Key != GEM_RETURN && Key!=GEM_ESCAPE) { return; } break; Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.h 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.h 2009-02-12 22:40:50 UTC (rev 5686) @@ -44,7 +44,9 @@ #define GEM_ALT 0x89 #define GEM_HOME 0x8a #define GEM_END 0x8b +#define GEM_ESCAPE 0x8c + #define GEM_MOD_SHIFT 1 #define GEM_MOD_CTRL 2 #define GEM_MOD_ALT 4 Modified: gemrb/trunk/gemrb/plugins/Core/Window.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Window.cpp 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/Core/Window.cpp 2009-02-12 22:40:50 UTC (rev 5686) @@ -44,7 +44,8 @@ Visible = WINDOW_INVISIBLE; Flags = WF_CHANGED; Cursor = IE_CURSOR_NORMAL; - DefaultControl = -1; + DefaultControl[0] = -1; + DefaultControl[1] = -1; ScrollControl = -1; } @@ -230,12 +231,15 @@ Invalidate(); } -Control* Window::GetDefaultControl() const +Control* Window::GetDefaultControl(unsigned int ctrltype) const { if (!Controls.size()) { return NULL; } - return GetControl( (ieWord) DefaultControl ); + if (ctrltype>=2) { + return NULL; + } + return GetControl( (ieWord) DefaultControl[ctrltype] ); } Control* Window::GetScrollControl() const @@ -257,7 +261,8 @@ /** Redraw all the Window */ void Window::Invalidate() { - DefaultControl = -1; + DefaultControl[0] = -1; + DefaultControl[1] = -1; ScrollControl = -1; for (unsigned int i = 0; i < Controls.size(); i++) { if (!Controls[i]) { @@ -270,11 +275,17 @@ ScrollControl = i; break; case IE_GUI_BUTTON: - if (!( Controls[i]->Flags & IE_GUI_BUTTON_DEFAULT )) - break; + if (( Controls[i]->Flags & IE_GUI_BUTTON_DEFAULT )) { + DefaultControl[0] = i; + } + if (( Controls[i]->Flags & IE_GUI_BUTTON_CANCEL )) { + DefaultControl[1] = i; + } + break; //falling through case IE_GUI_GAMECONTROL: - DefaultControl = i; + DefaultControl[0] = i; + DefaultControl[1] = i; break; default: ; } Modified: gemrb/trunk/gemrb/plugins/Core/Window.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Window.h 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/Core/Window.h 2009-02-12 22:40:50 UTC (rev 5686) @@ -125,7 +125,7 @@ /** Deletes the xth. Control */ void DelControl(unsigned short i); /** Returns the Default Control which may be a button/gamecontrol atm */ - Control* GetDefaultControl() const; + Control* GetDefaultControl(unsigned int ctrltype) const; /** Returns the Control which should get mouse scroll events */ Control* GetScrollControl() const; /** Sets 'ctrl' as currently under mouse */ @@ -166,7 +166,7 @@ /** Window flags: Changed, Floating, Framed, Child */ int Flags; int Cursor; - int DefaultControl; + int DefaultControl[2]; //default enter and cancel int ScrollControl; private: // Private attributes /** BackGround Image. No BackGround if this variable is NULL. */ Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-12 19:51:28 UTC (rev 5685) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-12 22:40:50 UTC (rev 5686) @@ -277,13 +277,16 @@ break; case SDL_KEYDOWN: - if (event.key.keysym.sym == SDLK_ESCAPE) { + if ((event.key.keysym.sym == SDLK_SPACE) && GetModState(event.key.keysym.mod) & GEM_MOD_CTRL) { core->PopupConsole(); break; } key = (unsigned char) event.key.keysym.unicode; if (key < 32 || key == 127) { switch (event.key.keysym.sym) { + case SDLK_ESCAPE: + key = GEM_ESCAPE; + break; case SDLK_END: key = GEM_END; break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-02-28 21:30:32
|
Revision: 5756 http://gemrb.svn.sourceforge.net/gemrb/?rev=5756&view=rev Author: zefklop Date: 2009-02-28 21:30:29 +0000 (Sat, 28 Feb 2009) Log Message: ----------- Fix cmath header usage? Fix compilation on newer windows system. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/Slider.cpp gemrb/trunk/gemrb/plugins/Core/Slider.h gemrb/trunk/gemrb/plugins/Core/TileOverlay.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-02-28 21:30:29 UTC (rev 5756) @@ -17,6 +17,8 @@ * * $Id$ */ +#include <cassert> + #include "../../includes/win32def.h" #include "../../includes/strrefs.h" #include "ActorBlock.h" @@ -32,9 +34,6 @@ #include "GameControl.h" #include "Projectile.h" -#include <cassert> -#include <cmath> - extern Interface* core; #define YESNO(x) ( (x)?"Yes":"No") @@ -137,7 +136,7 @@ } //ai is nonzero if this is an actor currently in the party -//if the script level is AI_SCRIPT_LEVEL, then we need to +//if the script level is AI_SCRIPT_LEVEL, then we need to //load an AI script (.bs) instead of (.bcs) void Scriptable::SetScript(const ieResRef aScript, int idx, bool ai) { @@ -1276,7 +1275,7 @@ } unsigned int oval, cval; - oval = PATH_MAP_IMPASSABLE; + oval = PATH_MAP_IMPASSABLE; if (Flags & DOOR_TRANSPARENT) { cval = PATH_MAP_DOOR_TRANSPARENT; } @@ -1560,7 +1559,7 @@ } //detect this trap, using a skill, skill could be set to 256 for 'sure' -//skill is the all around modified trap detection skill +//skill is the all around modified trap detection skill //a trapdetectiondifficulty of 100 means impossible detection short of a spell void Highlightable::DetectTrap(int skill) { @@ -1710,7 +1709,7 @@ Trapped = 0; TrapDetected = 0; inventory.SetInventoryType(INVENTORY_HEAP); - // NULL should be 0 for this + // NULL should be 0 for this memset (groundicons, 0, sizeof(groundicons) ); groundiconcover = 0; } Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-02-28 21:30:29 UTC (rev 5756) @@ -21,6 +21,7 @@ #ifndef WIN32 #include <sys/time.h> #endif +#include <cmath> #include "../../includes/win32def.h" #include "GameControl.h" #include "Interface.h" @@ -35,7 +36,6 @@ #include "Item.h" #include "Game.h" #include "SaveGameIterator.h" -#include <cmath> #define DEBUG_SHOW_INFOPOINTS 0x01 #define DEBUG_SHOW_CONTAINERS 0x02 Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2009-02-28 21:30:29 UTC (rev 5756) @@ -19,6 +19,9 @@ * */ +#include <cmath> +#include <cassert> + #include "../../includes/win32def.h" #include "Map.h" #include "Interface.h" @@ -40,9 +43,6 @@ #include "Palette.h" #include "MapMgr.h" -#include <cmath> -#include <cassert> - #ifndef WIN32 #include <sys/time.h> #else @@ -385,7 +385,7 @@ { delete LightMap; delete SmallMap; - + LightMap = lm; SmallMap = sm; @@ -1049,7 +1049,7 @@ //if a visible aggressive actor was put on the map, it is an autopause reason //guess game is always loaded? if not, then we'll crash ieDword gametime = core->GetGame()->GameTime; - + if (IsVisible(actor->Pos, false) && actor->Schedule(gametime) ) { ActorSpottedByPlayer(actor); } @@ -1390,7 +1390,7 @@ // these circles are slightly different for sizes 7 and up. if (size > MAX_CIRCLESIZE) size = MAX_CIRCLESIZE; - if (size < 2) size = 2; + if (size < 2) size = 2; unsigned int ppx = px/16; unsigned int ppy = py/12; @@ -2816,7 +2816,7 @@ { int ac=animcount; Video* video = core->GetVideoDriver(); - + //always draw the animation tinted because tint is also used for //transparency Color tint = {255,255,255,255-(ieByte) transparency}; @@ -2852,7 +2852,7 @@ if (! (AreaType&AT_EXTENDED_NIGHT)) return false; //no need of change if the area already has the right tilemap if ((DayNight == day_or_night) && GetTileMap()) return false; - + MapMgr* mM = ( MapMgr* ) core->GetInterface( IE_ARE_CLASS_ID ); //no need to open and read the .are file again //using the ARE class for this because ChangeMap is similar to LoadMap Modified: gemrb/trunk/gemrb/plugins/Core/Slider.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Slider.cpp 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/Core/Slider.cpp 2009-02-28 21:30:29 UTC (rev 5756) @@ -19,6 +19,7 @@ * */ +#include <cmath> #include "../../includes/win32def.h" #include "Slider.h" #include "Interface.h" @@ -107,7 +108,7 @@ if (!Value) Value = 1; core->GetDictionary()->SetAt( VarName, pos * Value ); - } + } Changed = true; } Modified: gemrb/trunk/gemrb/plugins/Core/Slider.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Slider.h 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/Core/Slider.h 2009-02-28 21:30:29 UTC (rev 5756) @@ -31,7 +31,6 @@ #include "Control.h" #include "Sprite2D.h" -#include <math.h> // !!! Keep these synchronized with GUIDefines.py !!! #define IE_GUI_SLIDER_ON_CHANGE 0x02000000 @@ -60,7 +59,7 @@ */ class GEM_EXPORT Slider : public Control { -public: +public: Slider(short KnobXPos, short KnobYPos, short KnobStep, unsigned short KnobStepsCount, bool Clear = false); ~Slider(); /** Draws the Control on the Output Display */ Modified: gemrb/trunk/gemrb/plugins/Core/TileOverlay.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/TileOverlay.cpp 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/Core/TileOverlay.cpp 2009-02-28 21:30:29 UTC (rev 5756) @@ -23,7 +23,6 @@ #include "TileOverlay.h" #include "Interface.h" #include "Video.h" -#include <math.h> extern Interface* core; bool RedrawTile = false; Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-28 21:19:45 UTC (rev 5755) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-02-28 21:30:29 UTC (rev 5756) @@ -19,11 +19,11 @@ * */ +#include <cmath> +#include <cassert> #include "../../includes/win32def.h" #include "SDLVideoDriver.h" #include "../Core/Interface.h" -#include <cmath> -#include <cassert> #include "../Core/SpriteCover.h" #include "../Core/Console.h" #include "../Core/Audio.h" @@ -1939,7 +1939,7 @@ static double ellipseradius(unsigned short xr, unsigned short yr, double angle) { double one = (xr * sin(angle)); double two = (yr * cos(angle)); - return sqrt(xr*xr*yr*yr / (one*one + two*two)); + return sqrt(xr*xr*yr*yr / (one*one + two*two)); } /** This functions Draws an Ellipse Segment */ @@ -2001,7 +2001,7 @@ if (-x >= xfrom && -x <= xto && -y >= yfrom && -y <= yto) SetPixel( cx - ( short ) x, cy - ( short ) y, color, clipped ); if (x >= xfrom && x <= xto && -y >= yfrom && -y <= yto) - SetPixel( cx + ( short ) x, cy - ( short ) y, color, clipped ); + SetPixel( cx + ( short ) x, cy - ( short ) y, color, clipped ); y++; sy += tas; ee += yc; @@ -2030,7 +2030,7 @@ if (-x >= xfrom && -x <= xto && -y >= yfrom && -y <= yto) SetPixel( cx - ( short ) x, cy - ( short ) y, color, clipped ); if (x >= xfrom && x <= xto && -y >= yfrom && -y <= yto) - SetPixel( cx + ( short ) x, cy - ( short ) y, color, clipped ); + SetPixel( cx + ( short ) x, cy - ( short ) y, color, clipped ); x++; sx += tbs; ee += xc; @@ -2362,7 +2362,7 @@ for (p.y = -radius; p.y < radius; p.y++) { for (p.x = -radius; p.x < radius; p.x++) { - a = intensity*(radius-(signed) Distance(p,q))/radius; + a = intensity*(radius-(signed) Distance(p,q))/radius; if(a<0) a=0; else if(a>255) a = 255; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-03-01 17:39:58
|
Revision: 5761 http://gemrb.svn.sourceforge.net/gemrb/?rev=5761&view=rev Author: zefklop Date: 2009-03-01 17:39:46 +0000 (Sun, 01 Mar 2009) Log Message: ----------- An hour is 300 units of game time. Use this rule everywhere. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-03-01 09:47:24 UTC (rev 5760) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-03-01 17:39:46 UTC (rev 5761) @@ -476,7 +476,7 @@ actor->Select( false ); } - if (! (flags & SELECT_QUIET)) { + if (! (flags & SELECT_QUIET)) { core->SetEventFlag(EF_SELECTION); //core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); } @@ -868,7 +868,7 @@ return true; } -//canmove=true: if some PC can't move (or hostile), then this returns false +//canmove=true: if some PC can't move (or hostile), then this returns false bool Game::EveryoneNearPoint(Map *area, Point &p, int flags) const { for (unsigned int i=0; i<PCs.size(); i++) { @@ -981,7 +981,7 @@ old = PartyGold; PartyGold += add; if (old<PartyGold) { - core->DisplayConstantStringValue( STR_GOTGOLD, 0xc0c000, PartyGold-old); + core->DisplayConstantStringValue( STR_GOTGOLD, 0xc0c000, PartyGold-old); } else { core->DisplayConstantStringValue( STR_LOSTGOLD, 0xc0c000, old-PartyGold); } Modified: gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp 2009-03-01 09:47:24 UTC (rev 5760) +++ gemrb/trunk/gemrb/plugins/GAMImporter/GAMImp.cpp 2009-03-01 17:39:46 UTC (rev 5761) @@ -113,7 +113,7 @@ ieDword GameTime; str->ReadDword( &GameTime ); - newGame->GameTime = GameTime*15; + newGame->GameTime = GameTime; str->ReadWord( &newGame->WhichFormation ); for (i = 0; i < 5; i++) { @@ -692,7 +692,7 @@ stream->Write( Signature, 8); //using Signature for padding memset(Signature, 0, sizeof(Signature)); - tmpDword = game->GameTime/15; + tmpDword = game->GameTime; stream->WriteDword( &tmpDword ); //pst has a single preset of formations if (game->version==GAM_VER_PST) { Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-03-01 09:47:24 UTC (rev 5760) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-03-01 17:39:46 UTC (rev 5761) @@ -2853,7 +2853,7 @@ static PyObject* GemRB_GameControlSetTargetMode(PyObject * /*self*/, PyObject* args) { int Mode; - int Types = TARGET_TYPE_ALL; + int Types = TARGET_TYPE_ALL; if (!PyArg_ParseTuple( args, "i|i", &Mode, &Types )) { return AttributeError( GemRB_GameControlSetTargetMode__doc ); @@ -3752,7 +3752,7 @@ return NULL; } - int hours = ((int)GameTime)/4500; + int hours = ((int)GameTime)/300; int days = hours/24; hours -= days*24; char tmpstr[10]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-03-07 23:17:05
|
Revision: 5773 http://gemrb.svn.sourceforge.net/gemrb/?rev=5773&view=rev Author: zefklop Date: 2009-03-07 23:16:53 +0000 (Sat, 07 Mar 2009) Log Message: ----------- Well... HAVE_SNPRINTF is already declared in SDL.h... Thank you -Werror. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.h gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h Modified: gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.h =================================================================== --- gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.h 2009-03-07 23:11:38 UTC (rev 5772) +++ gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.h 2009-03-07 23:16:53 UTC (rev 5773) @@ -29,6 +29,7 @@ #define REFERENCE_DISTANCE 50 #define ACM_BUFFERSIZE 8192 +#include "SDL.h" #include "../Core/Audio.h" #include "../Core/LRUCache.h" #include "../Core/Interface.h" @@ -39,7 +40,6 @@ #include "AmbientMgrAL.h" #include "../Core/ResourceMgr.h" #include "StackLock.h" -#include "SDL.h" #ifndef WIN32 #include <AL/al.h> Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-03-07 23:11:38 UTC (rev 5772) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-03-07 23:16:53 UTC (rev 5773) @@ -21,7 +21,6 @@ #include <cmath> #include <cassert> -#include "../../includes/win32def.h" #include "SDLVideoDriver.h" #include "../Core/Interface.h" #include "../Core/SpriteCover.h" Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2009-03-07 23:11:38 UTC (rev 5772) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.h 2009-03-07 23:16:53 UTC (rev 5773) @@ -22,11 +22,10 @@ #ifndef SDLVIDEODRIVER_H #define SDLVIDEODRIVER_H +#include <SDL.h> +#include "../../includes/win32def.h" #include "../Core/Video.h" -#include <SDL.h> - - class SDLVideoDriver : public Video { private: SDL_Surface* disp; @@ -168,7 +167,7 @@ Color SpriteGetPixel (Sprite2D* sprite, unsigned short x, unsigned short y); Color SpriteGetPixelSum (Sprite2D* sprite, unsigned short xbase, unsigned short ybase, unsigned int ratio); bool IsSpritePixelTransparent (Sprite2D* sprite, unsigned short x, unsigned short y); - Sprite2D* SpriteScaleDown( Sprite2D* sprite, unsigned int ratio ); + Sprite2D* SpriteScaleDown( Sprite2D* sprite, unsigned int ratio ); Sprite2D* CreateLight(int radius, int intensity); //both parameters must be signed void SetGamma(int brightness, int contrast); void SetMouseScrollSpeed(int speed); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ze...@us...> - 2009-03-08 22:56:50
|
Revision: 5780 http://gemrb.svn.sourceforge.net/gemrb/?rev=5780&view=rev Author: zefklop Date: 2009-03-08 22:56:48 +0000 (Sun, 08 Mar 2009) Log Message: ----------- Better handle failure when creating creature animations. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp gemrb/trunk/gemrb/plugins/Core/Actor.cpp Modified: gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2009-03-08 21:45:11 UTC (rev 5779) +++ gemrb/trunk/gemrb/plugins/CREImporter/CREImp.cpp 2009-03-08 22:56:48 UTC (rev 5780) @@ -509,7 +509,9 @@ //this is required so the actor has animation already act->SetAnimationID( ( ieWord ) act->BaseStats[IE_ANIMATION_ID] ); //Speed is determined by the number of frames in each cycle of its animation - Animation* anim = act->GetAnims()->GetAnimation(IE_ANI_WALK, 0)[0]; + CharAnimations* anims = act->GetAnims(); + assert(anims) ; + Animation* anim = anims->GetAnimation(IE_ANI_WALK, 0)[0]; assert(anim) ; act->SetBase(IE_MOVEMENTRATE, anim->GetFrameCount()) ; // Setting up derived stats Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-03-08 21:45:11 UTC (rev 5779) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-03-08 22:56:48 UTC (rev 5780) @@ -394,31 +394,33 @@ } } anims = new CharAnimations( AnimID&0xffff, BaseStats[IE_ARMOR_TYPE]); - if (anims) { - anims->SetOffhandRef(ShieldRef); - anims->SetHelmetRef(HelmetRef); - anims->SetWeaponRef(WeaponRef); + if(anims->ResRef[0] == 0) { + delete anims ; + anims = NULL ; + printMessage("Actor", " ",LIGHT_RED); + printf("Missing animation for %s\n",LongName); + return ; + } + anims->SetOffhandRef(ShieldRef); + anims->SetHelmetRef(HelmetRef); + anims->SetWeaponRef(WeaponRef); - //if we have a recovery palette, then set it back - assert(anims->palette[PAL_MAIN] == 0); - anims->palette[PAL_MAIN] = recover; - if (recover) { - anims->lockPalette = true; - } - //bird animations are not hindered by searchmap - //only animtype==7 (bird) uses this feature - //this is a hardcoded hack, but works for all engine type - if (anims->GetAnimType()!=IE_ANI_BIRD) { - BaseStats[IE_DONOTJUMP]=0; - } else { - BaseStats[IE_DONOTJUMP]=DNJ_BIRD; - } - SetCircleSize(); - anims->SetColors(BaseStats+IE_COLORS); - } else { - printMessage("Actor", " ",LIGHT_RED); - printf("Missing animation for %s\n",LongName); - } + //if we have a recovery palette, then set it back + assert(anims->palette[PAL_MAIN] == 0); + anims->palette[PAL_MAIN] = recover; + if (recover) { + anims->lockPalette = true; + } + //bird animations are not hindered by searchmap + //only animtype==7 (bird) uses this feature + //this is a hardcoded hack, but works for all engine type + if (anims->GetAnimType()!=IE_ANI_BIRD) { + BaseStats[IE_DONOTJUMP]=0; + } else { + BaseStats[IE_DONOTJUMP]=DNJ_BIRD; + } + SetCircleSize(); + anims->SetColors(BaseStats+IE_COLORS); } CharAnimations* Actor::GetAnims() @@ -3233,7 +3235,7 @@ // currently we don't have a real direction, but the orientation field // could be used with higher granularity. When we need the face value // it could be divided so it will become a 0-15 number. - // + // SpriteCover *sc = 0, *newsc = 0; int blurx = cx; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-04-04 19:52:51
|
Revision: 5847 http://gemrb.svn.sourceforge.net/gemrb/?rev=5847&view=rev Author: avenger_teambg Date: 2009-04-04 19:52:47 +0000 (Sat, 04 Apr 2009) Log Message: ----------- fixed party ordering Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-04-03 17:55:10 UTC (rev 5846) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2009-04-04 19:52:47 UTC (rev 5847) @@ -709,7 +709,7 @@ PCs[Index1]->InParty = PCs[Index2]->InParty; PCs[Index2]->InParty = tmp; //signal a change of the portrait window - core->SetEventFlag(EF_SELECTION); + core->SetEventFlag(EF_PORTRAIT); } void Game::DeleteJournalEntry(ieStrRef strref) @@ -1509,13 +1509,21 @@ void Game::DebugDump() { + size_t idx; + printf("Currently loaded areas:\n"); - for(size_t idx=0;idx<Maps.size();idx++) { + for(idx=0;idx<Maps.size();idx++) { Map *map = Maps[idx]; printf("%s\n",map->GetScriptName()); } printf("CombatCounter: %d\n", (int) CombatCounter); printf("Attackers count: %d\n", (int) Attackers.size()); + printf("Party size: %d\n", (int) PCs.size()); + for(idx=0;idx<PCs.size();idx++) { + Actor *actor = PCs[idx]; + + printf("Name: %s Order %d\n",actor->ShortName, actor->InParty); + } } Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-04-03 17:55:10 UTC (rev 5846) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2009-04-04 19:52:47 UTC (rev 5847) @@ -578,7 +578,7 @@ case '7': case '8': case '9': - SelectActor(Key-'1'); + SelectActor(Key-'0'); break; default: core->GetGame()->SetHotKey(toupper(Key)); @@ -595,7 +595,7 @@ } /* doesn't fall through here */ - Actor* actor = game->GetPC( whom,false ); + Actor* actor = game->FindPC( whom ); if (!actor) return; Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-03 17:55:10 UTC (rev 5846) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-04 19:52:47 UTC (rev 5847) @@ -4465,10 +4465,12 @@ if (!game) { return RuntimeError( "No game loaded!" ); } +/* PlayerSlot = game->FindPlayer( PlayerSlot ); - Actor* MyActor = core->GetGame()->GetPC( PlayerSlot, false ); +*/ + Actor* MyActor = game->FindPC( PlayerSlot ); if (!MyActor) { - return NULL; + return RuntimeError( "Actor not found!" ); } MyActor->SetText(Name, Which); MyActor->SetMCFlag(MC_EXPORTABLE,BM_OR); @@ -4492,10 +4494,12 @@ if (!game) { return RuntimeError( "No game loaded!" ); } +/* PlayerSlot = game->FindPlayer( PlayerSlot ); - Actor* MyActor = core->GetGame()->GetPC( PlayerSlot, false ); +*/ + Actor* MyActor = game->FindPC( PlayerSlot ); if (!MyActor) { - return NULL; + return RuntimeError( "Actor not found!" ); } MyActor->SetSoundFolder(Sound); Py_INCREF( Py_None ); @@ -4693,8 +4697,10 @@ if (!game) { return RuntimeError( "No game loaded!" ); } +/* PlayerSlot = game->FindPlayer( PlayerSlot ); - Actor* MyActor = core->GetGame()->GetPC( PlayerSlot, false ); +*/ + Actor* MyActor = game->FindPC( PlayerSlot ); if (!MyActor) { return PyInt_FromLong( 0 ); } @@ -4781,8 +4787,10 @@ if (!game) { return RuntimeError( "No game loaded!" ); } +/* PlayerSlot = game->FindPlayer( PlayerSlot ); - Actor* MyActor = core->GetGame()->GetPC( PlayerSlot, false ); +*/ + Actor* MyActor = game->FindPC( PlayerSlot ); if (!MyActor) { return PyString_FromString( ""); } @@ -4908,10 +4916,12 @@ if (!game) { return RuntimeError( "No game loaded!" ); } +/* PlayerSlot = game->FindPlayer( PlayerSlot ); - Actor* MyActor = core->GetGame()->GetPC( PlayerSlot, false ); +*/ + Actor* MyActor = game->FindPC( PlayerSlot ); if (!MyActor) { - return NULL; + return RuntimeError( "Actor not found!" ); } if (Portrait1) { MyActor->SetPortrait( Portrait1, 1); @@ -4923,8 +4933,7 @@ TableMgr* mtm = gamedata->GetTable( mastertable ); int count = mtm->GetRowCount(); if (count< 1 || count>8) { - printMessage( "GUIScript", "Table is invalid.\n", LIGHT_RED ); - return NULL; + return RuntimeError("Table is invalid." ); } const char *poi = mtm->QueryField( 0 ); int AnimID = strtoul( poi, NULL, 0 ); @@ -5590,7 +5599,7 @@ } STOItem* si = store->GetItem( Slot ); if (!si) { - return NULL; + return RuntimeError("Store item not found!"); } if (si->InfiniteSupply != -1) { @@ -5641,7 +5650,7 @@ { STOItem* si = store->GetItem( Slot ); if (!si) { - return NULL; + return RuntimeError("Store item not found!"); } //the amount of items is stored in si->PurchasedAmount //it will adjust AmountInStock/PurchasedAmount @@ -5674,7 +5683,7 @@ { STOItem* si = store->GetItem( Slot ); if (!si) { - return NULL; + return RuntimeError("Store item not found!"); } si->Flags ^= IE_INV_ITEM_SELECTED; if (si->Flags & IE_INV_ITEM_SELECTED) { @@ -6022,15 +6031,19 @@ if (!PyArg_ParseTuple( args, "s|i", &String, &actornum )) { return AttributeError( GemRB_ExecuteString__doc ); } + Game *game = core->GetGame(); + if (!game) { + return RuntimeError( "No game loaded!" ); + } if (actornum) { - Actor *pc = core->GetGame()->GetPC(actornum-1, false); + Actor *pc = game->FindPC(actornum); if (pc) { GameScript::ExecuteString( pc, String ); } else { printMessage("GUIScript","Player not found!\n", YELLOW); } } else { - GameScript::ExecuteString( core->GetGame()->GetCurrentArea( ), String ); + GameScript::ExecuteString( game->GetCurrentArea( ), String ); } Py_INCREF( Py_None ); return Py_None; @@ -8760,7 +8773,7 @@ return RuntimeError( "No game loaded!" ); } - game->SwapPCs(idx1, idx2); + game->SwapPCs(game->FindPlayer(idx1), game->FindPlayer(idx2)); Py_INCREF( Py_None ); return Py_None; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-04-05 10:35:24
|
Revision: 5856 http://gemrb.svn.sourceforge.net/gemrb/?rev=5856&view=rev Author: avenger_teambg Date: 2009-04-05 10:35:09 +0000 (Sun, 05 Apr 2009) Log Message: ----------- typos Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-04-05 10:32:20 UTC (rev 5855) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-04-05 10:35:09 UTC (rev 5856) @@ -2177,7 +2177,6 @@ if (header<0) { if (!PCStats) return; //not a player character PCStats->GetSlotAndIndex(which,idx,headerindex); -printf("HI: %x\n", headerindex); if (headerindex==0xffff) return; //headerindex is invalid } else { idx=(ieWord) which; Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-05 10:32:20 UTC (rev 5855) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-05 10:35:09 UTC (rev 5856) @@ -8390,7 +8390,7 @@ //is there any better check for a non existent item? if (!itemdata.itemname[0]) { - printMessage("GUIScript","Empty slot used?", YELLOW); + printMessage("GUIScript","Empty slot used?\n", YELLOW); Py_INCREF( Py_None ); return Py_None; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lyn...@us...> - 2009-04-06 11:11:52
|
Revision: 5861 http://gemrb.svn.sourceforge.net/gemrb/?rev=5861&view=rev Author: lynxlupodian Date: 2009-04-06 11:11:24 +0000 (Mon, 06 Apr 2009) Log Message: ----------- update the ActionsWindow when learning spells / special abilities Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-04-05 20:29:56 UTC (rev 5860) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-04-06 11:11:24 UTC (rev 5861) @@ -4628,6 +4628,7 @@ } Actor *actor = (Actor *) Sender; actor->LearnSpell (parameters->string0Parameter, parameters->int0Parameter); + core->SetEventFlag(EF_ACTION); } void GameScript::RemoveSpell( Scriptable* Sender, Action* parameters) Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-05 20:29:56 UTC (rev 5860) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-06 11:11:24 UTC (rev 5861) @@ -6384,7 +6384,10 @@ if (!actor) { return RuntimeError( "Actor not found" ); } - return PyInt_FromLong( actor->LearnSpell(Spell, Flags) ); + + int ret = actor->LearnSpell( Spell, Flags ); // returns 0 on success + if (!ret) core->SetEventFlag( EF_ACTION ); + return PyInt_FromLong( ret ); } PyDoc_STRVAR( GemRB_RemoveSpell__doc, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lyn...@us...> - 2009-04-08 08:41:06
|
Revision: 5869 http://gemrb.svn.sourceforge.net/gemrb/?rev=5869&view=rev Author: lynxlupodian Date: 2009-04-08 08:40:42 +0000 (Wed, 08 Apr 2009) Log Message: ----------- in gcc 4.4 <string> will no longer includes <cstdio> Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GameData.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h gemrb/trunk/gemrb/plugins/Core/LRUCache.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp gemrb/trunk/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp gemrb/trunk/gemrb/plugins/OpenALAudio/StackLock.cpp gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp gemrb/trunk/gemrb/plugins/TLKImporter/TlkOverride.cpp Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -19,6 +19,7 @@ * */ +#include <cstdio> #include "GSUtils.h" #include "Interface.h" #include "TileMap.h" Modified: gemrb/trunk/gemrb/plugins/Core/GameData.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/Core/GameData.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -19,7 +19,7 @@ * */ - +#include <cstdio> #include "GameData.h" #include "Actor.h" Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-04-08 08:40:42 UTC (rev 5869) @@ -25,6 +25,7 @@ #ifndef GAMESCRIPT_H #define GAMESCRIPT_H +#include <cstdio> #include "DataStream.h" #include "Variables.h" #include "SymbolMgr.h" Modified: gemrb/trunk/gemrb/plugins/Core/LRUCache.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/LRUCache.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/Core/LRUCache.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -21,6 +21,7 @@ #include "LRUCache.h" #include <cassert> +#include <cstdio> struct VarEntry { VarEntry* prev; Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -19,6 +19,7 @@ * */ +#include <cstdio> #include "Spellbook.h" #include "Interface.h" #include "Spell.h" Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -19,6 +19,7 @@ * */ +#include <cstdio> #include "GUIScript.h" #include "../Core/Interface.h" #include "../Core/Map.h" Modified: gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/MVEPlayer/MVEPlay.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -22,6 +22,7 @@ #include <assert.h> #include <fcntl.h> #include <sys/stat.h> +#include <cstdio> #include "../Core/Interface.h" #include "../Core/Video.h" #include "../Core/Audio.h" Modified: gemrb/trunk/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -22,6 +22,7 @@ #include <limits.h> #include <cmath> #include <cassert> +#include <cstdio> #include "../Core/Ambient.h" #include "../Core/Interface.h" #include "../Core/Game.h" Modified: gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/OpenALAudio/OpenALAudio.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -21,6 +21,7 @@ #include "OpenALAudio.h" #include <cassert> +#include <cstdio> bool checkALError(const char* msg, const char* status) { int error = alGetError(); Modified: gemrb/trunk/gemrb/plugins/OpenALAudio/StackLock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/OpenALAudio/StackLock.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/OpenALAudio/StackLock.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -19,6 +19,7 @@ * */ +#include <cstdio> #include "StackLock.h" // adapted from ScummVM's mutex.cpp Modified: gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/SDLVideo/SDLVideoDriver.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -21,6 +21,7 @@ #include <cmath> #include <cassert> +#include <cstdio> #include "SDLVideoDriver.h" #include "../Core/Interface.h" #include "../Core/SpriteCover.h" Modified: gemrb/trunk/gemrb/plugins/TLKImporter/TlkOverride.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/TLKImporter/TlkOverride.cpp 2009-04-06 21:59:39 UTC (rev 5868) +++ gemrb/trunk/gemrb/plugins/TLKImporter/TlkOverride.cpp 2009-04-08 08:40:42 UTC (rev 5869) @@ -21,7 +21,7 @@ * (dynamic) part of the talk table (tlk) */ - +#include <cstdio> #include "TlkOverride.h" #define SEGMENT_SIZE 512 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |