From: Laszlo T. <ave...@us...> - 2012-01-21 17:26:42
|
gemrb: Infinity Engine emulator The branch master has been updated via f575f3c5bbf9036fd2c508c4b0cb6ded7d3122b4 (commit) via 8b9ef18aca4db64fbc2d20683c5943b6986d30aa (commit) Summary of changes: gemrb/core/DisplayMessage.cpp | 16 +++++++++++ gemrb/core/DisplayMessage.h | 2 + gemrb/core/Scriptable/Actor.cpp | 46 +++++++++++++++++++++++-------- gemrb/core/Scriptable/Actor.h | 6 +++- gemrb/includes/strrefs.h | 3 +- gemrb/override/bg1/strings.2da | 1 + gemrb/override/bg2/strings.2da | 1 + gemrb/override/how/strings.2da | 1 + gemrb/override/iwd/strings.2da | 1 + gemrb/override/iwd2/strings.2da | 11 ++++--- gemrb/override/pst/strings.2da | 1 + gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp | 33 ++++++++++++++++++++-- 12 files changed, 99 insertions(+), 23 deletions(-) from 9270a590efc287e7ffc6b265fbc2e2120a6c7157 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=f575f3c5bbf9036fd2c508c4b0cb6ded7d3122b4 commit f575f3c5bbf9036fd2c508c4b0cb6ded7d3122b4 Author: Avenger <ave...@so...> Date: Sat Jan 21 18:26:16 2012 +0100 implemented cleave feat diff --git a/gemrb/core/Scriptable/Actor.cpp b/gemrb/core/Scriptable/Actor.cpp index ae35c4c..4f1267d 100644 --- a/gemrb/core/Scriptable/Actor.cpp +++ b/gemrb/core/Scriptable/Actor.cpp @@ -3247,6 +3247,24 @@ bool Actor::AttackIsStunning(int damagetype) const { } static EffectRef fx_sleep_ref = { "State:Helpless", -1 }; +static EffectRef fx_cleave_ref = { "Cleave", -1 }; + +void Actor::CheckCleave() +{ + int cleave = GetFeat(FEAT_CLEAVE); + //feat level 1 only enables one cleave per round + if ((cleave==1) && fxqueue.HasEffect(fx_cleave_ref) ) { + cleave = 0; + } + if(cleave) { + Effect * fx = EffectQueue::CreateEffect(fx_cleave_ref, attackcount, 0, FX_DURATION_INSTANT_LIMITED); + if (fx) { + fx->Duration = core->Time.round_sec; + core->ApplyEffect(fx, this, this); + delete fx; + } + } +} //returns actual damage int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype, int critical) @@ -3306,27 +3324,32 @@ int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype, i } NewBase(IE_HITPOINTS, (ieDword) -damage, MOD_ADDITIVE); + Actor *act=NULL; + if (!hitter) { + // TODO: check this + hitter = area->GetActorByGlobalID(LastHitter); + } - // also apply reputation damage if we hurt (but not killed) an innocent - if (Modified[IE_CLASS] == CLASS_INNOCENT && !core->InCutSceneMode()) { - Actor *act=NULL; - if (!hitter) { - // TODO: check this - hitter = area->GetActorByGlobalID(LastHitter); + if (hitter) { + if (hitter->Type==ST_ACTOR) { + act = (Actor *) hitter; } + } - if (hitter) { - if (hitter->Type==ST_ACTOR) { - act = (Actor *) hitter; - } - } + // also apply reputation damage if we hurt (but not killed) an innocent + if (Modified[IE_CLASS] == CLASS_INNOCENT && !core->InCutSceneMode()) { if (act && act->GetStat(IE_EA) <= EA_CONTROLLABLE) { core->GetGame()->SetReputation(core->GetGame()->Reputation + core->GetReputationMod(1)); } } + int chp = (signed) BaseStats[IE_HITPOINTS]; if (damage > 0) { + //if this kills us, check if attacker could cleave + if (act && (damage>chp)) { + act->CheckCleave(); + } GetHit(); //fixme: implement applytrigger, copy int0 into LastDamage there LastDamage = damage; @@ -3335,7 +3358,6 @@ int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype, i } InternalFlags|=IF_ACTIVE; - int chp = (signed) BaseStats[IE_HITPOINTS]; int damagelevel = 0; //FIXME: this level is never used if (damage<10) { damagelevel = 1; diff --git a/gemrb/core/Scriptable/Actor.h b/gemrb/core/Scriptable/Actor.h index 61acfc6..7be18bf 100644 --- a/gemrb/core/Scriptable/Actor.h +++ b/gemrb/core/Scriptable/Actor.h @@ -315,6 +315,8 @@ public: ieDword lastInit; bool no_more_steps; int speed; + //how many attacks left in this round, must be public for cleave opcode + int attackcount; PolymorphCache *polymorphCache; // fx_polymorph etc WildSurgeSpellMods wildSurgeMods; @@ -323,8 +325,6 @@ private: CharAnimations* anims; SpriteCover* extraCovers[EXTRA_ACTORCOVERS]; ieByte SavingThrow[5]; - //how many attacks in this round - int attackcount; //true every second round of attack bool secondround; int attacksperround; @@ -501,6 +501,8 @@ public: bool HandleCastingStance(const ieResRef SpellResRef, bool deplete); /* check if the actor should be just knocked out by a lethal hit */ bool AttackIsStunning(int damagetype) const; + /* check and perform a cleave movement */ + void CheckCleave(); /* deals damage to this actor */ int Damage(int damage, int damagetype, Scriptable *hitter, int modtype=MOD_ADDITIVE, int critical=0); /* displays the damage taken and other details (depends on the game type) */ diff --git a/gemrb/includes/strrefs.h b/gemrb/includes/strrefs.h index 85e0ede..c256e38 100644 --- a/gemrb/includes/strrefs.h +++ b/gemrb/includes/strrefs.h @@ -208,7 +208,8 @@ #define STR_ARTERIAL 175 #define STR_EXPERTISE 176 #define STR_POWERATTACK 177 +#define STR_CLEAVE 178 -#define STRREF_COUNT 178 +#define STRREF_COUNT 179 #endif //! IE_STRINGS_H diff --git a/gemrb/override/bg1/strings.2da b/gemrb/override/bg1/strings.2da index b82f83e..f5063e5 100644 --- a/gemrb/override/bg1/strings.2da +++ b/gemrb/override/bg1/strings.2da @@ -179,3 +179,4 @@ HAMSTRING -1 ARTERIAL -1 EXPERTISE -1 POWERATTACK -1 +CLEAVE -1 diff --git a/gemrb/override/bg2/strings.2da b/gemrb/override/bg2/strings.2da index ea044fb..444d37d 100644 --- a/gemrb/override/bg2/strings.2da +++ b/gemrb/override/bg2/strings.2da @@ -179,3 +179,4 @@ HAMSTRING -1 ARTERIAL -1 EXPERTISE -1 POWERATTACK -1 +CLEAVE -1 diff --git a/gemrb/override/how/strings.2da b/gemrb/override/how/strings.2da index 24b6cbe..c8b2d87 100644 --- a/gemrb/override/how/strings.2da +++ b/gemrb/override/how/strings.2da @@ -179,3 +179,4 @@ HAMSTRING -1 ARTERIAL -1 EXPERTISE -1 POWERATTACK -1 +CLEAVE -1 diff --git a/gemrb/override/iwd/strings.2da b/gemrb/override/iwd/strings.2da index f40f706..5b93de4 100644 --- a/gemrb/override/iwd/strings.2da +++ b/gemrb/override/iwd/strings.2da @@ -179,3 +179,4 @@ HAMSTRING -1 ARTERIAL -1 EXPERTISE -1 POWERATTACK -1 +CLEAVE -1 diff --git a/gemrb/override/iwd2/strings.2da b/gemrb/override/iwd2/strings.2da index 64c259e..61c1c19 100644 --- a/gemrb/override/iwd2/strings.2da +++ b/gemrb/override/iwd2/strings.2da @@ -174,8 +174,9 @@ AURACLEANSED 23797 INDOOR_FAIL 9744 SPELL_DISRUPTED 14796 CHAOSSHIELD -1 -RAPIDSHOT -1 -HAMSTRING -1 -ARTERIAL -1 -EXPERTISE -1 -POWERATTACK -1 +RAPIDSHOT 35796 +HAMSTRING 35787 +ARTERIAL 35774 +EXPERTISE 35785 +POWERATTACK 35794 +CLEAVE 39846 diff --git a/gemrb/override/pst/strings.2da b/gemrb/override/pst/strings.2da index 25466a9..e0f2aeb 100644 --- a/gemrb/override/pst/strings.2da +++ b/gemrb/override/pst/strings.2da @@ -179,3 +179,4 @@ HAMSTRING -1 ARTERIAL -1 EXPERTISE -1 POWERATTACK -1 +CLEAVE -1 diff --git a/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp b/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp index 79f7d47..dbf45f3 100644 --- a/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp +++ b/gemrb/plugins/IWDOpcodes/IWDOpcodes.cpp @@ -198,7 +198,7 @@ static int fx_protection_from_elements (Scriptable* Owner, Actor* target, Effect static int fx_aegis (Scriptable* Owner, Actor* target, Effect* fx); //426 static int fx_executioner_eyes (Scriptable* Owner, Actor* target, Effect* fx); //427 //428 DeathMagic (same as 0xd) -static int fx_effects_on_struck (Scriptable* Owner, Actor* target, Effect *fx);//429 EffectsOnStruck (similar to 0xe8) +static int fx_effects_on_struck (Scriptable* Owner, Actor* target, Effect *fx);//429 (similar to 0xe8) static int fx_projectile_use_effect_list (Scriptable* Owner, Actor* target, Effect* fx); //430 static int fx_energy_drain (Scriptable* Owner, Actor* target, Effect* fx); //431 static int fx_tortoise_shell (Scriptable* Owner, Actor* target, Effect* fx); //432 @@ -211,7 +211,7 @@ static int fx_heroic_inspiration (Scriptable* Owner, Actor* target, Effect* fx); //static int fx_prevent_ai_slowdown (Scriptable* Owner, Actor* target, Effect* fx); //439 static int fx_barbarian_rage (Scriptable* Owner, Actor* target, Effect* fx); //440 //441 MovementRateModifier4 -//442 unknown +static int fx_cleave (Scriptable* Owner, Actor* target, Effect* fx); //442 static int fx_missile_damage_reduction (Scriptable* Owner, Actor* target, Effect* fx); //443 static int fx_tenser_transformation (Scriptable* Owner, Actor* target, Effect* fx); //444 //static int fx_445 (Scriptable* Owner, Actor* target, Effect* fx); //445 unused @@ -333,6 +333,7 @@ static EffectDesc effectnames[] = { { "HeroicInspiration", fx_heroic_inspiration, 0, -1 },//438 //{ "PreventAISlowDown", fx_prevent_ai_slowdown, 0, -1 }, //439 same as bg2 { "BarbarianRage", fx_barbarian_rage, 0, -1 }, //440 + { "Cleave", fx_cleave, 0, -1 }, //442 { "MissileDamageReduction", fx_missile_damage_reduction, 0, -1 }, //443 { "TensersTransformation", fx_tenser_transformation, 0, -1 }, //444 { "SmiteEvil", fx_smite_evil, 0, -1 }, //446 @@ -3093,7 +3094,33 @@ int fx_barbarian_rage (Scriptable* /*Owner*/, Actor* /*target*/, Effect* fx) //441 MovementRateModifier4 (same as others) -//442 Unknown (needs research) +//442 Cleave +int fx_cleave (Scriptable* /*Owner*/, Actor* target, Effect* fx) +{ + if (0) print( "fx_cleave (%2d) Amount:%d\n", fx->Opcode, fx->Parameter1); + //just remain dormant after first apply for the remaining duration (possibly disabling more cleaves) + if (!fx->FirstApply) return FX_APPLIED; + Map *map = target->GetCurrentArea(); + if (!map) return FX_NOT_APPLIED; + + //reset attackcount to a previous number and hack the current opponent to another enemy nearby + //SeeCore returns the closest living enemy + //FIXME:the previous opponent must be dead by now, or this code won't work + if (SeeCore(target, Enemy, false) ) { + Actor *enemy = map->GetActorByGlobalID(target->LastSeen); + //50 is more like our current weapon range + if (enemy && (PersonalDistance(enemy, target)<50) && target->LastSeen!=target->LastTarget) { + displaymsg->DisplayConstantStringNameValue(STR_CLEAVE, DMC_WHITE, target, fx->Parameter1); + target->attackcount=fx->Parameter1; + target->SetTarget(enemy); + target->LastTarget=target->LastSeen; + //linger around for more + return FX_APPLIED; + } + } + //no opponent found, nothing to do + return FX_NOT_APPLIED; +} //443 MissileDamageReduction int fx_missile_damage_reduction (Scriptable* /*Owner*/, Actor* target, Effect* fx) http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=8b9ef18aca4db64fbc2d20683c5943b6986d30aa commit 8b9ef18aca4db64fbc2d20683c5943b6986d30aa Author: Avenger <ave...@so...> Date: Sat Jan 21 18:24:09 2012 +0100 another DisplayString variant (name .... %d ....) diff --git a/gemrb/core/DisplayMessage.cpp b/gemrb/core/DisplayMessage.cpp index 26b016f..53f769e 100644 --- a/gemrb/core/DisplayMessage.cpp +++ b/gemrb/core/DisplayMessage.cpp @@ -187,6 +187,22 @@ void DisplayMessage::DisplayConstantStringName(int stridx, unsigned int color, c core->FreeString(text); } +//Treats the constant string as a numeric format string, otherwise like the previous method +void DisplayMessage::DisplayConstantStringNameValue(int stridx, unsigned int color, const Scriptable *speaker, int value) const +{ + if (stridx<0) return; + if(!speaker) return; + + char* text = core->GetString( strref_table[stridx], IE_STR_SOUND|IE_STR_SPEECH ); + //allow for a number + int bufflen = strlen(text)+6; + char* newtext = ( char* ) malloc( bufflen ); + snprintf( newtext, bufflen, text, value ); + core->FreeString(text); + DisplayStringName(newtext, color, speaker); + free(newtext); +} + // String format is // <charname> - blah blah <someoneelse> void DisplayMessage::DisplayConstantStringAction(int stridx, unsigned int color, const Scriptable *attacker, const Scriptable *target) const diff --git a/gemrb/core/DisplayMessage.h b/gemrb/core/DisplayMessage.h index 7d11d46..3a1730c 100644 --- a/gemrb/core/DisplayMessage.h +++ b/gemrb/core/DisplayMessage.h @@ -66,6 +66,8 @@ public: void DisplayConstantStringValue(int stridx, unsigned int color, ieDword value) const; /** displays a string constant in the textarea, starting with speaker's name */ void DisplayConstantStringName(int stridx, unsigned int color, const Scriptable *speaker) const; + /** displays a string constant in the textarea, starting with speaker's name, also replaces one numeric value (it is a format string) */ + void DisplayConstantStringNameValue(int stridx, unsigned int color, const Scriptable *speaker, int value) const; /** displays a string constant in the textarea, starting with actor, and ending with target */ void DisplayConstantStringAction(int stridx, unsigned int color, const Scriptable *actor, const Scriptable *target) const; /** displays a string in the textarea */ ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |