From: <ave...@us...> - 2007-03-11 23:18:39
|
Revision: 4545 http://gemrb.svn.sourceforge.net/gemrb/?rev=4545&view=rev Author: avenger_teambg Date: 2007-03-11 16:18:38 -0700 (Sun, 11 Mar 2007) Log Message: ----------- iwd2 spell hit effects play only once too Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-03-11 15:47:27 UTC (rev 4544) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-03-11 23:18:38 UTC (rev 4545) @@ -387,7 +387,7 @@ } } sca->SetBlend(); - + sca->PlayOnce(); map->AddVVCell(sca); } 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...> - 2007-06-09 19:55:28
|
Revision: 4691 http://gemrb.svn.sourceforge.net/gemrb/?rev=4691&view=rev Author: avenger_teambg Date: 2007-06-09 12:55:30 -0700 (Sat, 09 Jun 2007) Log Message: ----------- some more 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 2007-06-09 19:28:00 UTC (rev 4690) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-06-09 19:55:30 UTC (rev 4691) @@ -37,12 +37,35 @@ #define PI_NAUSEA 43 #define PI_HOPELESSNESS 47 #define PI_RIGHTEOUS 67 +#define PI_FAITHARMOR 84 #define PI_HOLYPOWER 86 #define PI_DEATHWARD 87 #define PI_ENFEEBLEMENT 90 #define PI_FIRESHIELD 121 #define PI_ICESHIELD 122 +#define SS_HOPELESSNESS 0 +#define SS_PROTFROMEVIL 1 +#define SS_ARMOROFFAITH 2 +#define SS_NAUSEA 3 +#define SS_ENFEEBLED 4 +#define SS_FIRESHIELD 5 +#define SS_ICESHIELD 6 +#define SS_HELD 7 +#define SS_DEATHWARD 8 +#define SS_HOLYPOWER 9 +#define SS_GOODCHANT 10 +#define SS_BADCHANT 11 +#define SS_GOODPRAYER 12 +#define SS_BADPRAYER 13 +#define SS_GOODRECIT 14 +#define SS_BADRECIT 15 +#define SS_RIGHTEOUS 16 //allied +#define SS_RIGHTEOUS2 17 //allied and same alignment +#define SS_STONESKIN 18 +#define SS_IRONSKIN 19 +#define SS_SANCTUARY 20 + static int fx_fade_rgb (Actor* Owner, Actor* target, Effect* fx);//e8 static int fx_iwd_visual_spell_hit (Actor* Owner, Actor* target, Effect* fx);//e9 static int fx_cold_damage (Actor* Owner, Actor* target, Effect* fx);//ea @@ -332,6 +355,17 @@ } } +//returns true if spell state is already set or illegal +static bool SetSpellState(Actor *target, unsigned int spellstate) +{ + if (spellstate>=192) return true; + unsigned int pos = IE_SPLSTATE_ID1+(spellstate>>5); + unsigned int bit = 1<<(spellstate&31); + if (target->GetStat(pos)&bit) return true; + STAT_BIT_OR(pos, bit); + return false; +} + //iwd got a hardcoded 'fireshield' system //this effect applies damage on ALL nearby actors, except the center static EffectRef fx_damage_opcode_ref={"Damage",NULL,-1}; @@ -1226,8 +1260,9 @@ int fx_hopelessness (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_hopelessness (%2d)\n", fx->Opcode); - //what else we need + if (SetSpellState(target, SS_HOPELESSNESS)) return FX_APPLIED; target->AddPortraitIcon(PI_HOPELESSNESS); + STATE_SET(STATE_HELPLESS); return FX_APPLIED; } @@ -1235,22 +1270,56 @@ int fx_protection_from_evil (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_protection_from_evil (%2d)\n", fx->Opcode); + // + if (SetSpellState(target, SS_PROTFROMEVIL)) return FX_APPLIED; target->AddPortraitIcon(PI_PROTFROMEVIL); return FX_APPLIED; } //402 AddEffectsList +int fx_add_effects_list (Actor* Owner, Actor* target, Effect* fx) +{ + //after iwd2 style ids targeting, apply the spell named in the resource field + if (check_iwd_targeting(Owner, target, fx->Parameter1, fx->Parameter2) ) { + return FX_NOT_APPLIED; + } + core->ApplySpell(fx->Resource, Owner, target, fx->Power); + return FX_NOT_APPLIED; +} + //403 ArmorOfFaith +int fx_faith_armor (Actor* /*Owner*/, Actor* target, Effect* fx) +{ + if (0) printf( "fx_faith_armor (%2d)\n", fx->Opcode); + if (SetSpellState(target, SS_ARMOROFFAITH)) return FX_APPLIED; + //TODO: damage reduction (all types) + target->AddPortraitIcon(PI_FAITHARMOR); + return FX_APPLIED; +} //404 Nausea -int fx_nausea (Actor* /*Owner*/, Actor* target, Effect* fx) +static EffectRef fx_unconscious_state_ref={"State:Helpless",NULL,-1}; + +int fx_nausea (Actor* Owner, Actor* target, Effect* fx) { if (0) printf( "fx_nausea (%2d)\n", fx->Opcode); - target->AddPortraitIcon(PI_NAUSEA); // is it ok? + //FIXME: i'm not sure if this part is there + //create the sleep effect only once? + if (!fx->Parameter3) { + Effect *newfx = EffectQueue::CreateEffect(fx_unconscious_state_ref, + fx->Parameter1, 1, fx->Duration); + core->ApplyEffect(newfx, Owner, target); + fx->Parameter3=1; + } + //end of unsure part + if (SetSpellState(target, SS_NAUSEA)) return FX_APPLIED; + target->AddPortraitIcon(PI_NAUSEA); + STATE_SET(STATE_HELPLESS|STATE_SLEEP); return FX_APPLIED; } //405 Enfeeblement int fx_enfeeblement (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_enfeeblement (%2d)\n", fx->Opcode); + if (SetSpellState(target, SS_ENFEEBLED)) return FX_APPLIED; target->AddPortraitIcon(PI_ENFEEBLEMENT); // is it ok? return FX_APPLIED; } @@ -1259,16 +1328,20 @@ { if (0) printf( "fx_fireshield (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); if (fx->Parameter2) { + if (SetSpellState(target, SS_ICESHIELD)) return FX_APPLIED; target->AddPortraitIcon(PI_ICESHIELD); } else { + if (SetSpellState(target, SS_FIRESHIELD)) return FX_APPLIED; target->AddPortraitIcon(PI_FIRESHIELD); } + //target->SetSpellOnHit(fx->Resource); return FX_APPLIED; } //407 DeathWard int fx_death_ward (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_death_ward (%2d)\n", fx->Opcode); + if (SetSpellState(target, SS_DEATHWARD)) return FX_APPLIED; target->AddPortraitIcon(PI_DEATHWARD); // is it ok? return FX_APPLIED; } @@ -1276,14 +1349,25 @@ int fx_holy_power (Actor* /*Owner*/, Actor* target, Effect* fx) { if (0) printf( "fx_holy_power (%2d)\n", fx->Opcode); - target->AddPortraitIcon(PI_HOLYPOWER); // is it ok? + if (SetSpellState(target, SS_HOLYPOWER)) return FX_APPLIED; + target->AddPortraitIcon(PI_HOLYPOWER); return FX_APPLIED; } //409 RighteousWrath int fx_righteous_wrath (Actor* /*Owner*/, Actor* target, Effect* fx) { - if (0) printf( "fx_righteous_wrath (%2d)\n", fx->Opcode); - target->AddPortraitIcon(PI_RIGHTEOUS); // is it ok? + if (0) printf( "fx_righteous_wrath (%2d) Type: %d\n", fx->Opcode, fx->Parameter2); + target->AddPortraitIcon(PI_RIGHTEOUS); + if (fx->Parameter2) + { + if (SetSpellState(target, SS_RIGHTEOUS2)) return FX_APPLIED; + // + } + else + { + if (SetSpellState(target, SS_RIGHTEOUS)) return FX_APPLIED; + // + } return FX_APPLIED; } //410 SummonAllyIWD2 @@ -1304,23 +1388,23 @@ //419 Unconsciousness //420 Death2 (see in core effects) //421 EntropyShield -//422 -//423 -//424 +//422 StormShell +//423 ProtectionFromElements +//424 HoldUndead //425 ControlUndead2 (see above) -//426 -//427 -//428 -//429 -//430 -//431 -//432 -//433 -//434 -//435 -//436 -//437 -//438 +//426 Aegis +//427 ExecutionerEyes +//428 Banish +//429 WhenStruckUseEffectList +//430 ProjectileUseEffectList +//431 EnergyDrain +//432 TortoiseShell +//433 Blink +//434 PersistentUseEffectList +//435 DayBlindness +//436 DamageReduction +//437 Disguise +//438 HeroicInspiration //439 PreventAISlowDown int fx_prevent_ai_slowdown (Actor* /*Owner*/, Actor* target, Effect* fx) { @@ -1329,22 +1413,22 @@ STAT_SET(IE_ENABLEOFFSCREENAI,1); return FX_APPLIED; } -//440 +//440 BarbarianRage //441 MovementRateModifier4 -//442 -//443 -//444 -//445 -//446 -//447 -//448 -//449 -//450 -//451 -//452 -//453 -//454 -//455 -//456 -//457 +//442 Unknown +//443 MissileDamageReduction +//444 TensersTransformation +//445 Unknown +//446 SmiteEvil +//447 Restoration +//448 AlicornLance +//449 CallLightning +//450 GlobeInvulnerability +//451 LowerResistance +//452 Bane +//453 PowerAttack +//454 Expertise +//455 ArterialStrike +//456 HamString +//457 RapidShot This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-07-31 20:34:09
|
Revision: 4737 http://gemrb.svn.sourceforge.net/gemrb/?rev=4737&view=rev Author: avenger_teambg Date: 2007-07-31 13:33:52 -0700 (Tue, 31 Jul 2007) Log Message: ----------- iwd: 2 new effects Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-07-31 18:11:50 UTC (rev 4736) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-07-31 20:33:52 UTC (rev 4737) @@ -494,7 +494,7 @@ int i = area->GetActorCount(true); while(i--) { Actor *victim = area->GetActor(i,true); - if (target!=victim) continue; + if (target==victim) continue; if (PersonalDistance(target, victim)<20) { Effect *tmp = new Effect(); memcpy(tmp, newfx, sizeof(Effect)); @@ -1273,7 +1273,7 @@ int i = area->GetActorCount(true); while(i--) { Actor *victim = area->GetActor(i,true); - if (target!=victim) continue; + if (target==victim) continue; if (PersonalDistance(target, victim)<20) { Effect *tmp = new Effect(); memcpy(tmp, newfx, sizeof(Effect)); @@ -1764,18 +1764,52 @@ //0x124 MagicalRest (same as bg2) //0x125 BeholderDispelMagic (???) //0x126 HarpyWail (???) -int fx_harpy_wail (Actor* /*Owner*/, Actor* target, Effect* fx) +int fx_harpy_wail (Actor* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_harpy_wail (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); - target->Panic(); + if (0) printf( "fx_harpy_wail (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); + if (!fx->Resource[0]) { + strcpy(fx->Resource,"SPIN166"); + } + if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { + return FX_NOT_APPLIED; + } + + Map *area = target->GetCurrentArea(); + int i = area->GetActorCount(true); + while(i--) { + Actor *victim = area->GetActor(i,true); + if (target==victim) continue; + if (PersonalDistance(target, victim)<20) { + //this function deletes tmp + core->ApplySpell(fx->Resource, victim, Owner, fx->Power); + } + } + return FX_NOT_APPLIED; } //0x127 JackalWereGaze (Charm ?) -int fx_jackalwere_gaze (Actor* /*Owner*/, Actor* target, Effect* fx) +int fx_jackalwere_gaze (Actor* Owner, Actor* target, Effect* fx) { - if (0) printf( "fx_jackalwere_gaze (%2d): Mod: %d, Type: %d\n", fx->Opcode, fx->Parameter1, fx->Parameter2 ); - target->Panic(); + if (0) printf( "fx_jackalwere_gaze (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); + if (!fx->Resource[0]) { + strcpy(fx->Resource,"SPIN179"); + } + if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { + return FX_NOT_APPLIED; + } + + Map *area = target->GetCurrentArea(); + int i = area->GetActorCount(true); + while(i--) { + Actor *victim = area->GetActor(i,true); + if (target==victim) continue; + if (PersonalDistance(target, victim)<20) { + //this function deletes tmp + core->ApplySpell(fx->Resource, victim, Owner, fx->Power); + } + } + return FX_APPLIED; } //0x128 ModifyGlobalVariable (same as bg2) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-08-01 20:31:20
|
Revision: 4738 http://gemrb.svn.sourceforge.net/gemrb/?rev=4738&view=rev Author: avenger_teambg Date: 2007-08-01 13:31:20 -0700 (Wed, 01 Aug 2007) Log Message: ----------- iwd: another opcode Modified Paths: -------------- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp Modified: gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-07-31 20:33:52 UTC (rev 4737) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2007-08-01 20:31:20 UTC (rev 4738) @@ -148,7 +148,7 @@ static int fx_resist_spell_and_message (Actor* Owner, Actor* target, Effect *fx);//122 static int fx_rod_of_smithing (Actor* Owner, Actor* target, Effect* fx); //123 //0x124 MagicalRest (same as bg2) -//0x125 BeholderDispelMagic (???) +static int fx_beholder_dispel_magic (Actor* Owner, Actor* target, Effect* fx); //125 static int fx_harpy_wail (Actor* Owner, Actor* target, Effect* fx); //126 static int fx_jackalwere_gaze (Actor* Owner, Actor* target, Effect* fx); //127 //0x128 ModifyGlobalVariable (same as bg2) @@ -273,6 +273,7 @@ { "Protection:Spell2", fx_resist_spell, -1}, //ce { "Protection:Spell3", fx_resist_spell_and_message, -1}, //122 { "RodOfSmithing", fx_rod_of_smithing, -1}, //123 + { "BeholderDispelMagic", fx_beholder_dispel_magic, -1},//125 { "HarpyWail", fx_harpy_wail, -1}, //126 { "JackalWereGaze", fx_jackalwere_gaze, -1}, //127 { "UseMagicDeviceModifier", fx_use_magic_device_modifier, -1}, //12a @@ -1762,8 +1763,35 @@ } //0x124 MagicalRest (same as bg2) -//0x125 BeholderDispelMagic (???) -//0x126 HarpyWail (???) + +//0x125 BeholderDispelMagic (applies resource on nearby actors) +//TODO: range, affected actors +int fx_beholder_dispel_magic (Actor* Owner, Actor* target, Effect* fx) +{ + if (0) printf( "fx_beholder_dispel_magic (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); + if (!fx->Resource[0]) { + strcpy(fx->Resource,"SPIN164"); + } + if (STATE_GET(STATE_DEAD|STATE_PETRIFIED|STATE_FROZEN) ) { + return FX_NOT_APPLIED; + } + + Map *area = target->GetCurrentArea(); + int i = area->GetActorCount(true); + while(i--) { + Actor *victim = area->GetActor(i,true); + if (target==victim) continue; + if (PersonalDistance(target, victim)<20) { + //this function deletes tmp + core->ApplySpell(fx->Resource, victim, Owner, fx->Power); + } + } + + return FX_NOT_APPLIED; +} + +//0x126 HarpyWail (applies resource on nearby actors) +//TODO: range, affected actors, sound effect int fx_harpy_wail (Actor* Owner, Actor* target, Effect* fx) { if (0) printf( "fx_harpy_wail (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); @@ -1788,7 +1816,8 @@ return FX_NOT_APPLIED; } -//0x127 JackalWereGaze (Charm ?) +//0x127 JackalWereGaze (applies resource on nearby actors) +//TODO: range, affected actors int fx_jackalwere_gaze (Actor* Owner, Actor* target, Effect* fx) { if (0) printf( "fx_jackalwere_gaze (%2d): Spell: %s\n", fx->Opcode, fx->Resource ); @@ -2420,6 +2449,7 @@ //set avatar anim? return FX_NOT_APPLIED; } + //438 HeroicInspiration int fx_heroic_inspiration (Actor* /*Owner*/, Actor* target, Effect* fx) { @@ -2575,6 +2605,7 @@ STAT_SUB(IE_RESISTMAGIC, 15); return FX_APPLIED; } + //452 Bane static EffectRef fx_bless_ref={"Bless",NULL,-1}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2008-04-12 11:00:15
|
Revision: 5137 http://gemrb.svn.sourceforge.net/gemrb/?rev=5137&view=rev Author: avenger_teambg Date: 2008-04-12 04:00:16 -0700 (Sat, 12 Apr 2008) Log Message: ----------- fixed global a global variable leak in IWDOpc 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-04-12 10:42:39 UTC (rev 5136) +++ gemrb/trunk/gemrb/plugins/IWDOpcodes/IWDOpc.cpp 2008-04-12 11:00:16 UTC (rev 5137) @@ -334,7 +334,15 @@ { NULL, NULL, 0 }, }; +struct IWDIDSEntry { + ieDword value; + ieWord stat; + ieWord relation; +}; +static int spellrescnt = -1; +static IWDIDSEntry *spellres = NULL; + IWDOpc::IWDOpc(void) { core->RegisterOpcodes( sizeof( effectnames ) / sizeof( EffectRef ) - 1, effectnames ); @@ -359,6 +367,9 @@ free (EntropyProjectileList); } EntropyProjectileList = NULL; + if (spellres) { + free (spellres); + } } //iwd got a weird targeting system @@ -379,15 +390,6 @@ //diffmode for gemrb. (Thus scripts can use the very same relation //functions). -struct IWDIDSEntry { - ieDword value; - ieWord stat; - ieWord relation; -}; - -static int spellrescnt = -1; -static IWDIDSEntry *spellres = NULL; - static void ReadSpellProtTable(const ieResRef tablename) { TableMgr * tab; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |