From: <ave...@us...> - 2008-09-12 16:42:27
|
Revision: 5268 http://gemrb.svn.sourceforge.net/gemrb/?rev=5268&view=rev Author: avenger_teambg Date: 2008-09-12 16:42:22 +0000 (Fri, 12 Sep 2008) Log Message: ----------- fixed effect leaks in IWD2 opcodes Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2008-09-12 16:33:57 UTC (rev 5267) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2008-09-12 16:42:22 UTC (rev 5268) @@ -507,10 +507,8 @@ Actor *victim = area->GetActor(i,true); if (target==victim) continue; if (PersonalDistance(target, victim)<20) { - Effect *tmp = new Effect(); - memcpy(tmp, newfx, sizeof(Effect)); - //this function deletes tmp - core->ApplyEffect(tmp, victim, Owner); + //this function deletes newfx (not anymore) + core->ApplyEffect(newfx, victim, Owner); } } //finally remove the master copy @@ -1185,6 +1183,18 @@ fx->TimingMode=FX_DURATION_AFTER_EXPIRES; fx->Duration=core->GetGame()->GameTime+7*15; + //build effects to apply + Effect * newfx1, *newfx2; + + newfx1 = EffectQueue::CreateEffectCopy(fx, fx_confusion_ref, 0, 0); + newfx1->TimingMode = FX_DURATION_INSTANT_LIMITED; + newfx1->Duration = fx->Parameter1; + + newfx2 = EffectQueue::CreateEffectCopy(fx, fx_immunity_resource_ref, 0, 0); + newfx2->TimingMode = FX_DURATION_INSTANT_LIMITED; + newfx2->Duration = fx->Parameter1; + memcpy(newfx2->Resource, fx->Source, sizeof(newfx2->Resource) ); + //collect targets and apply effect on targets Map *area = target->GetCurrentArea(); int i = area->GetActorCount(true); @@ -1207,21 +1217,14 @@ continue; } - Effect * newfx; - //apply a confusion opcode on target (0x80) - newfx = EffectQueue::CreateEffectCopy(fx, fx_confusion_ref, 0, 0); - newfx->TimingMode = FX_DURATION_INSTANT_LIMITED; - newfx->Duration = fx->Parameter1; - core->ApplyEffect(newfx, Owner, victim); - + core->ApplyEffect(newfx1, Owner, victim); + //apply a resource resistance against this spell to block flood - newfx = EffectQueue::CreateEffectCopy(fx, fx_immunity_resource_ref, 0, 0); - newfx->TimingMode = FX_DURATION_INSTANT_LIMITED; - newfx->Duration = fx->Parameter1; - memcpy(newfx->Resource, fx->Source, sizeof(newfx->Resource) ); - core->ApplyEffect(newfx, Owner, victim); + core->ApplyEffect(newfx2, Owner, victim); } + delete newfx1; + delete newfx2; return FX_APPLIED; } @@ -1238,6 +1241,18 @@ fx->TimingMode=FX_DURATION_AFTER_EXPIRES; fx->Duration=core->GetGame()->GameTime+7*15; + //build effects to apply + Effect * newfx1, *newfx2; + + newfx1 = EffectQueue::CreateEffectCopy(fx, fx_fear_ref, 0, 0); + newfx1->TimingMode = FX_DURATION_INSTANT_LIMITED; + newfx1->Duration = fx->Parameter1; + + newfx2 = EffectQueue::CreateEffectCopy(fx, fx_immunity_resource_ref, 0, 0); + newfx2->TimingMode = FX_DURATION_INSTANT_LIMITED; + newfx2->Duration = fx->Parameter1; + memcpy(newfx2->Resource, fx->Source, sizeof(newfx2->Resource) ); + //collect targets and apply effect on targets Map *area = target->GetCurrentArea(); int i = area->GetActorCount(true); @@ -1254,21 +1269,14 @@ continue; } - Effect * newfx; - //apply a panic opcode on target (0x18) - newfx = EffectQueue::CreateEffectCopy(fx, fx_fear_ref, 0, 0); - newfx->TimingMode = FX_DURATION_INSTANT_LIMITED; - newfx->Duration = fx->Parameter1; - core->ApplyEffect(newfx, Owner, victim); + core->ApplyEffect(newfx1, Owner, victim); //apply a resource resistance against this spell to block flood - newfx = EffectQueue::CreateEffectCopy(fx, fx_immunity_resource_ref, 0, 0); - newfx->TimingMode = FX_DURATION_INSTANT_LIMITED; - newfx->Duration = fx->Parameter1; - memcpy(newfx->Resource, fx->Source, sizeof(newfx->Resource) ); - core->ApplyEffect(newfx, Owner, victim); + core->ApplyEffect(newfx2, Owner, victim); } + delete newfx1; + delete newfx2; return FX_APPLIED; } @@ -1450,10 +1458,7 @@ Actor *victim = area->GetActor(i,true); if (target==victim) continue; if (PersonalDistance(target, victim)<20) { - Effect *tmp = new Effect(); - memcpy(tmp, newfx, sizeof(Effect)); - - core->ApplyEffect(tmp, Owner, target); + core->ApplyEffect(newfx, Owner, target); } } delete newfx; @@ -1855,6 +1860,9 @@ Effect *newfx = EffectQueue::CreateEffect(fx_death_ref, 0, 8, FX_DURATION_INSTANT_PERMANENT); core->ApplyEffect(newfx, Owner, target); + + delete newfx; + return FX_NOT_APPLIED; } //0x11d Sleep2 ??? power word sleep? @@ -1959,6 +1967,9 @@ 0, FX_DURATION_INSTANT_PERMANENT); } core->ApplyEffect(newfx, Owner, target); + + delete newfx; + return FX_NOT_APPLIED; } @@ -2133,8 +2144,10 @@ if (!fx->Parameter3) { Effect *newfx = EffectQueue::CreateEffect(fx_unconscious_state_ref, fx->Parameter1, 1, fx->Duration); + newfx->Power = fx->Power; core->ApplyEffect(newfx, Owner, target); - newfx->Power = fx->Power; + + delete newfx; fx->Parameter3=1; } //end of unsure part This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-07-06 18:04:14
|
Revision: 6710 http://gemrb.svn.sourceforge.net/gemrb/?rev=6710&view=rev Author: avenger_teambg Date: 2009-07-06 18:04:12 +0000 (Mon, 06 Jul 2009) Log Message: ----------- implemented area animation change effect opcode (this is a new effect to generalize a HoW hack) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-07-06 17:47:34 UTC (rev 6709) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-07-06 18:04:12 UTC (rev 6710) @@ -30,6 +30,7 @@ #include "../Core/Spell.h" #include "../Core/damages.h" #include "../Core/GSUtils.h" //needs for displaystringcore +#include "../Core/ProjectileServer.h" //needs for alter_animation #include "IWDOpc.h" static ieResRef *iwd_spell_hits = NULL; @@ -159,6 +160,9 @@ //0x129 HideInShadows (same as bg2) static int fx_use_magic_device_modifier (Actor* Owner, Actor* target, Effect* fx);//12a +//iwd related, gemrb specific effects (IE. unhardcoded hacks) +static int fx_alter_animation (Actor *Owner, Actor *target, Effect* fx); //399 + //iwd2 specific effects static int fx_hopelessness (Actor* Owner, Actor* target, Effect* fx);//400 static int fx_protection_from_evil (Actor* Owner, Actor* target, Effect* fx);//401 @@ -283,6 +287,8 @@ { "HarpyWail", fx_harpy_wail, -1}, //126 { "JackalWereGaze", fx_jackalwere_gaze, -1}, //127 { "UseMagicDeviceModifier", fx_use_magic_device_modifier, -1}, //12a + //unhardcoded hacks for IWD + { "AlterAnimation", fx_alter_animation, -1}, //399 //iwd2 effects { "Hopelessness", fx_hopelessness, -1}, //400 { "ProtectionFromEvil", fx_protection_from_evil, -1}, //401 @@ -2061,6 +2067,63 @@ return FX_APPLIED; } +//GemRB specific IWD related effects + +//This code is needed for the ending cutscene in IWD (found in a projectile) +//The effect will alter the target animation's cycle by a xor value +//Parameter1: the value to binary xor on the initial cycle numbers of the animation(s) +//Parameter2: an optional projectile (IWD spell hit projectiles start at 0x1001) +//Resource: the animation's name + +//Useful applications other than the HoW cutscene: +//A fireball could affect environment by applying the effect on certain animations +//all you need to do: +//Name the area animation as 'burnable'. +//Create alternate cycles for the altered area object +//Create a spell hit animation (optionally) +//Create the effect which will contain the spell hit projectile and the cycle change command +int fx_alter_animation (Actor* Owner, Actor* /*target*/, Effect* fx) +{ + if (0) printf( "fx_alter_animation (%2d)\n", fx->Opcode); + Map *map = Owner->GetCurrentArea(); + if (!map) { + return FX_NOT_APPLIED; + } + + aniIterator iter = map->GetFirstAnimation(); + while(AreaAnimation *an = map->GetNextAnimation(iter) ) { + //Only animations with 8 letters could be used, no problem, iwd uses 8 letters + if (!strnicmp (an->Name, fx->Resource, 8) ) { + //play spell hit animation + Projectile *pro=core->GetProjectileServer()->GetProjectileByIndex(fx->Parameter2); + pro->SetCaster(Owner->GetGlobalID()); + map->AddProjectile(pro, an->Pos, an->Pos); + //alter animation, we need only this for the original, but in the + //spirit of unhardcoding, i provided the standard modifier codeset + //0->4, 1->5, 2->6, 3->7 + //4->0, 5->1, 6->2, 7->3 + ieWord value = fx->Parameter1>>16; + switch(fx->Parameter1&0xffff) { + case BM_SET: + an->sequence=value; + break; + case BM_OR: + an->sequence|=value; + break; + case BM_NAND: + an->sequence&=~value; + break; + case BM_XOR: + an->sequence^=value; + break; + } + an->frame=0; + an->InitAnimation(); + } + } + return FX_NOT_APPLIED; +} + //IWD2 effects //400 Hopelessness This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-09-18 16:06:12
|
Revision: 7205 http://gemrb.svn.sourceforge.net/gemrb/?rev=7205&view=rev Author: avenger_teambg Date: 2009-09-18 16:06:05 +0000 (Fri, 18 Sep 2009) Log Message: ----------- Use GetThiefLevel Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-09-18 16:03:19 UTC (rev 7204) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-09-18 16:06:05 UTC (rev 7205) @@ -487,7 +487,7 @@ case STI_CIRCLESIZE: return DiffCore((ieDword) target->GetAnims()->GetCircleSize(), val, spellres[type].relation); case STI_EVASION: - if (target->GetStat(IE_LEVELTHIEF) < 7 ) { + if (target->GetThiefLevel() < 7 ) { return 0; } val = target->GetSavingThrow(1,0); //breath This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lyn...@us...> - 2009-10-02 09:12:44
|
Revision: 7318 http://gemrb.svn.sourceforge.net/gemrb/?rev=7318&view=rev Author: lynxlupodian Date: 2009-10-02 09:12:34 +0000 (Fri, 02 Oct 2009) Log Message: ----------- fixed fx_summon_creature2 to handle parameter2==3 properly; belhifet's true form is now spawned hostile Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-02 08:02:20 UTC (rev 7317) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-02 09:12:34 UTC (rev 7318) @@ -1297,7 +1297,7 @@ //0x103 SummonCreature2 -static int eamods[]={EAM_DEFAULT,EAM_SOURCEALLY,EAM_SOURCEENEMY,EAM_NEUTRAL}; +static int eamods[]={EAM_DEFAULT,EAM_SOURCEALLY,EAM_SOURCEENEMY}; int fx_summon_creature2 (Scriptable* Owner, Actor* target, Effect* fx) { @@ -1315,11 +1315,15 @@ //creature's target is target //position of appearance is target's pos (not sure!!!) int eamod = EAM_DEFAULT; - if (fx->Parameter2<4){ + if (fx->Parameter2<3){ eamod = eamods[fx->Parameter2]; } Effect *newfx = EffectQueue::CreateUnsummonEffect(fx); - core->SummonCreature(fx->Resource, fx->Resource2, Owner, target, target->Pos, eamod, 0, newfx); + if (fx->Parameter2 == 3) { // summon at source + core->SummonCreature(fx->Resource, fx->Resource2, Owner, target, Owner->Pos, eamod, 0, newfx); + } else { + core->SummonCreature(fx->Resource, fx->Resource2, Owner, target, target->Pos, eamod, 0, newfx); + } delete newfx; return FX_NOT_APPLIED; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-10-12 21:46:11
|
Revision: 7415 http://gemrb.svn.sourceforge.net/gemrb/?rev=7415&view=rev Author: avenger_teambg Date: 2009-10-12 21:46:03 +0000 (Mon, 12 Oct 2009) Log Message: ----------- unhardcoded the pomab mirror image effect Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-12 21:44:30 UTC (rev 7414) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-12 21:46:03 UTC (rev 7415) @@ -1334,6 +1334,7 @@ //This is ugly, hardcoded, crap, but this is what we got from BlackIsle //Use a 2da for the positions and the resrefs. +/* static Point pomab_positions[6]={ Point(0x1e8, 0x20a), Point(0x1c6, 0x1f6), @@ -1343,6 +1344,7 @@ Point(0x1dd, 0x217) }; static ieResRef pomab_resref[2]={"eepomab","pomimg"}; +*/ int fx_summon_pomab (Scriptable* Owner, Actor* target, Effect* fx) { @@ -1356,12 +1358,32 @@ return FX_APPLIED; } - int real = core->Roll(1,6,-1); + ieResRef tableResRef; - for (int i=0;i<6;i++) { - core->SummonCreature(real==i?pomab_resref[0]:pomab_resref[1], fx->Resource2, Owner, - target, pomab_positions[i], EAM_DEFAULT, 100, NULL); + if (fx->Resource[0]) { + strnlwrcpy(tableResRef, fx->Resource, 8); + } else { + memcpy(tableResRef,"pomab",6); } + + AutoTable tab(tableResRef); + if (!tab) { + return FX_NOT_APPLIED; + } + + int cnt = tab->GetRowCount()-1; + if (cnt<2) { + return FX_NOT_APPLIED; + } + + int real = core->Roll(1,cnt,-1); + const char *resrefs[2]={tab->QueryField(0,1), tab->QueryField(1,1) }; + + for (int i=0;i<cnt;i++) { + Point p(atoi(tab->QueryField(i+1,1)), atoi(tab->QueryField(i+1,1))); + core->SummonCreature(resrefs[real!=i], fx->Resource2, Owner, + target, p, EAM_DEFAULT, 0, NULL); + } return FX_NOT_APPLIED; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2009-10-12 21:53:41
|
Revision: 7416 http://gemrb.svn.sourceforge.net/gemrb/?rev=7416&view=rev Author: avenger_teambg Date: 2009-10-12 21:53:29 +0000 (Mon, 12 Oct 2009) Log Message: ----------- meeh Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-12 21:46:03 UTC (rev 7415) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-12 21:53:29 UTC (rev 7416) @@ -1332,20 +1332,6 @@ //0x105 immunity to effect (same as bg2?) //0x106 SummonPomab -//This is ugly, hardcoded, crap, but this is what we got from BlackIsle -//Use a 2da for the positions and the resrefs. -/* -static Point pomab_positions[6]={ - Point(0x1e8, 0x20a), - Point(0x1c6, 0x1f6), - Point(0x1d0, 0x20a), - Point(0x1b5, 0x204), - Point(0x1c2, 0x216), - Point(0x1dd, 0x217) -}; -static ieResRef pomab_resref[2]={"eepomab","pomimg"}; -*/ - int fx_summon_pomab (Scriptable* Owner, Actor* target, Effect* fx) { if (0) printf( "fx_summon_pomab (%2d): ResRef:%s Anim:%s Type: %d\n", fx->Opcode, fx->Resource, fx->Resource2, fx->Parameter2 ); @@ -1377,10 +1363,10 @@ } int real = core->Roll(1,cnt,-1); - const char *resrefs[2]={tab->QueryField(0,1), tab->QueryField(1,1) }; + const char *resrefs[2]={tab->QueryField((unsigned int) 0,0), tab->QueryField((int) 0,1) }; for (int i=0;i<cnt;i++) { - Point p(atoi(tab->QueryField(i+1,1)), atoi(tab->QueryField(i+1,1))); + Point p(atoi(tab->QueryField(i+1,0)), atoi(tab->QueryField(i+1,1))); core->SummonCreature(resrefs[real!=i], fx->Resource2, Owner, target, p, EAM_DEFAULT, 0, NULL); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fu...@us...> - 2009-10-12 22:04:15
|
Revision: 7418 http://gemrb.svn.sourceforge.net/gemrb/?rev=7418&view=rev Author: fuzzie Date: 2009-10-12 22:03:53 +0000 (Mon, 12 Oct 2009) Log Message: ----------- pomab table entries are hex, must use strtol Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-12 21:57:56 UTC (rev 7417) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2009-10-12 22:03:53 UTC (rev 7418) @@ -1366,7 +1366,7 @@ const char *resrefs[2]={tab->QueryField((unsigned int) 0,0), tab->QueryField((int) 0,1) }; for (int i=0;i<cnt;i++) { - Point p(atoi(tab->QueryField(i+1,0)), atoi(tab->QueryField(i+1,1))); + Point p(strtol(tab->QueryField(i+1,0),NULL,0), strtol(tab->QueryField(i+1,1), NULL, 0)); core->SummonCreature(resrefs[real!=i], fx->Resource2, Owner, target, p, EAM_DEFAULT, 0, NULL); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |