From: Laszlo T. <ave...@us...> - 2012-06-03 10:31:36
|
gemrb: Infinity Engine emulator The branch master has been updated via a45d1229932f21b20110be6133410e337193983e (commit) via 462d177d5c0bd0b203f75b2e9ec19246fb37c7a6 (commit) Summary of changes: gemrb/core/Game.cpp | 2 +- gemrb/core/Game.h | 1 + gemrb/core/GameScript/Actions.cpp | 4 ++- gemrb/core/Scriptable/Actor.cpp | 49 +++++++++++++++++++++++++------- gemrb/core/Scriptable/Actor.h | 10 ++++++- gemrb/override/bg1/difflvls.2da | 5 +++ gemrb/override/shared/difflvls.2da | 5 +++ gemrb/plugins/FXOpcodes/FXOpcodes.cpp | 3 -- 8 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 gemrb/override/bg1/difflvls.2da create mode 100644 gemrb/override/shared/difflvls.2da from 2db5ca44a9eb5eb2ef1476b44539daa18b53427a (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=a45d1229932f21b20110be6133410e337193983e commit a45d1229932f21b20110be6133410e337193983e Author: Avenger <ave...@so...> Date: Sun Jun 3 12:30:57 2012 +0200 removed some debug print diff --git a/gemrb/plugins/FXOpcodes/FXOpcodes.cpp b/gemrb/plugins/FXOpcodes/FXOpcodes.cpp index 4a87dfd..f4e5104 100644 --- a/gemrb/plugins/FXOpcodes/FXOpcodes.cpp +++ b/gemrb/plugins/FXOpcodes/FXOpcodes.cpp @@ -3625,10 +3625,8 @@ int fx_knock (Scriptable* Owner, Actor* /*target*/, Effect* fx) } Point p(fx->PosX, fx->PosY); -print("KNOCK Pos: %d.%d", fx->PosX, fx->PosY); Door *door = map->TMap->GetDoorByPosition(p); if (door) { -print("Got a door"); if (door->LockDifficulty<100) { door->SetDoorLocked(false, true); } @@ -3636,7 +3634,6 @@ print("Got a door"); } Container *container = map->TMap->GetContainerByPosition(p); if (container) { -print("Got a container"); if(container->LockDifficulty<100) { container->SetContainerLocked(false); } http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=462d177d5c0bd0b203f75b2e9ec19246fb37c7a6 commit 462d177d5c0bd0b203f75b2e9ec19246fb37c7a6 Author: Avenger <ave...@so...> Date: Sun Jun 3 12:30:14 2012 +0200 configurable xp/damage adjustments per difficulty level, added nightmare mode handling diff --git a/gemrb/core/Game.cpp b/gemrb/core/Game.cpp index 80c6321..efa036f 100644 --- a/gemrb/core/Game.cpp +++ b/gemrb/core/Game.cpp @@ -1169,7 +1169,7 @@ void Game::ShareXP(int xp, int flags) if (PCs[i]->GetStat(IE_STATE_ID)&STATE_DEAD) { continue; } - PCs[i]->AddExperience(individual); + PCs[i]->AddExperience(individual, flags&SX_COMBAT); } } diff --git a/gemrb/core/Game.h b/gemrb/core/Game.h index 8100326..2f019eb 100644 --- a/gemrb/core/Game.h +++ b/gemrb/core/Game.h @@ -52,6 +52,7 @@ class TableMgr; //ShareXP flags #define SX_DIVIDE 1 //divide XP among team members #define SX_CR 2 //use challenge rating resolution +#define SX_COMBAT 4 //combat xp, adjusted by difficulty //joinparty flags #define JP_JOIN 1 //refresh join time diff --git a/gemrb/core/GameScript/Actions.cpp b/gemrb/core/GameScript/Actions.cpp index 6e4f802..9f8e53f 100644 --- a/gemrb/core/GameScript/Actions.cpp +++ b/gemrb/core/GameScript/Actions.cpp @@ -2823,7 +2823,9 @@ void GameScript::AddXPObject(Scriptable* Sender, Action* parameters) } else { displaymsg->DisplayConstantStringValue(STR_GOTXP, DMC_BG2XPGREEN, (ieDword)xp); } - actor->AddExperience(xp); + + //normally the second parameter is 0, but it may be handy to have control over that (See SX_* flags) + actor->AddExperience(xp, parameters->int1Parameter); core->PlaySound(DS_GOTXP); } diff --git a/gemrb/core/Scriptable/Actor.cpp b/gemrb/core/Scriptable/Actor.cpp index 5709cd4..1259e66 100644 --- a/gemrb/core/Scriptable/Actor.cpp +++ b/gemrb/core/Scriptable/Actor.cpp @@ -81,7 +81,7 @@ static const Color magenta = { 0xff, 0x00, 0xff, 0xff }; -static int sharexp = SX_DIVIDE; +static int sharexp = SX_DIVIDE|SX_COMBAT; static int classcount = -1; static int extraslots = -1; static char **clericspelltables = NULL; @@ -104,6 +104,11 @@ static int skillcount = -1; static int **afcomments = NULL; static int afcount = -1; static ieVariable CounterNames[4]={"GOOD","LAW","LADY","MURDER"}; +//I keep the zero index the same as core rules (default setting) +static int dmgadjustments[6]={0, -50, -25, 0, 50, 100}; //default, easy, normal, core rules, hard, nightmare +//XP adjustments on easy setting (need research on the amount) +//Seems like bg1 halves xp, bg2 doesn't have any impact +static int xpadjustments[6]={0, -50, 0, 0, 0, 0}; static int FistRows = -1; static int *wmlevels[20]; @@ -121,7 +126,7 @@ static ieDword crit_hit_scr_shake = 1; static ieDword bored_time = 3000; static ieDword footsteps = 1; static ieDword always_dither = 1; -static ieDword GameDifficulty = 3; +static ieDword GameDifficulty = DIFF_CORE; //the chance to issue one of the rare select verbal constants #define RARE_SELECT_CHANCE 5 //these are the max number of select sounds -- the size of the pool to choose from @@ -1487,7 +1492,17 @@ GEM_EXPORT void UpdateActorConfig() //FIXME: Drop all actors' SpriteCover. //the actor will change dithering only after selected/moved (its spritecover was updated) core->GetDictionary()->Lookup("Always Dither", always_dither); - core->GetDictionary()->Lookup("Difficulty Level", GameDifficulty); + + //Handle Game Difficulty and Nightmare Mode + GameDifficulty = 0; + core->GetDictionary()->Lookup("Nightmare Mode", GameDifficulty); + if (GameDifficulty) { + GameDifficulty = DIFF_NIGHTMARE; + } else { + GameDifficulty = 0; + core->GetDictionary()->Lookup("Difficulty Level", GameDifficulty); + } + if (GameDifficulty>DIFF_NIGHTMARE) GameDifficulty = DIFF_NIGHTMARE; } static void InitActorTables() @@ -1506,10 +1521,11 @@ static void InitActorTables() state_invisible=STATE_INVISIBLE; } + //I'm not sure if xp is reduced or not in iwd2 on easy setting if (core->HasFeature(GF_CHALLENGERATING)) { sharexp=SX_DIVIDE|SX_CR; } else { - sharexp=SX_DIVIDE; + sharexp=SX_DIVIDE|SX_COMBAT; } ReverseToHit = core->HasFeature(GF_REVERSE_TOHIT); CheckAbilities = core->HasFeature(GF_CHECK_ABILITIES); @@ -2159,6 +2175,17 @@ static void InitActorTables() } } } + + //difficulty level based modifiers + tm.load("difflvls"); + if (tm) { + memset(xpadjustments, 0, sizeof(xpadjustments) ); + memset(dmgadjustments, 0, sizeof(dmgadjustments) ); + for (i=0; i<6; i++) { + dmgadjustments[i] = atoi(tm->QueryField(0, i) ); + xpadjustments[i] = atoi(tm->QueryField(1, i) ); + } + } } void Actor::SetLockedPalette(const ieDword *gradients) @@ -3503,7 +3530,7 @@ int Actor::Damage(int damage, int damagetype, Scriptable *hitter, int modtype, i DisplayCombatFeedback(damage, resisted, damagetype, hitter); // instant chunky death if the actor is petrified or frozen - if (Modified[IE_STATE_ID] & (STATE_FROZEN|STATE_PETRIFIED) && !Modified[IE_DISABLECHUNKING] && GameDifficulty > 2) { + if (Modified[IE_STATE_ID] & (STATE_FROZEN|STATE_PETRIFIED) && !Modified[IE_DISABLECHUNKING] && GameDifficulty > DIFF_NORMAL) { damage = 123456; // arbitrarily high for death; won't be displayed LastDamageType |= DAMAGE_CHUNKING; } @@ -5912,12 +5939,9 @@ void Actor::ModifyDamage(Scriptable *hitter, int &damage, int &resisted, int dam if (damage>0) { // adjust enemy damage according to difficulty settings: - // -50%, -25%, 0, 50%, 100% + // -50%, -25%, 0, 50%, 100%, 150% if (Modified[IE_EA] < EA_GOODCUTOFF) { - int adjustmentPercent = (GameDifficulty - 3) * 25; - if (GameDifficulty > 3) { - adjustmentPercent *= 2; - } + int adjustmentPercent = dmgadjustments[GameDifficulty]; damage += (damage * adjustmentPercent)/100; } @@ -6131,12 +6155,15 @@ void Actor::Heal(int days) } } -void Actor::AddExperience(int exp) +void Actor::AddExperience(int exp, int combat) { if (core->HasFeature(GF_WISDOM_BONUS)) { //TODO find out the 3ED variant exp = (exp * (100 + core->GetWisdomBonus(0, Modified[IE_WIS]))) / 100; } + if (combat) { + exp += exp*xpadjustments[GameDifficulty]/100; + } SetBase(IE_XP,BaseStats[IE_XP]+exp); } diff --git a/gemrb/core/Scriptable/Actor.h b/gemrb/core/Scriptable/Actor.h index b7dafd2..7942a22 100644 --- a/gemrb/core/Scriptable/Actor.h +++ b/gemrb/core/Scriptable/Actor.h @@ -97,6 +97,14 @@ namespace GemRB { #define PANIC_RUNAWAY 2 #define PANIC_RANDOMWALK 3 +//Game Difficulty +#define DIFF_DEFAULT 0 +#define DIFF_EASY 1 +#define DIFF_NORMAL 2 +#define DIFF_CORE 3 +#define DIFF_HARD 4 +#define DIFF_NIGHTMARE 5 + /** flags for GetActor */ //default action #define GA_DEFAULT 0 @@ -580,7 +588,7 @@ public: /* Heals actor by days */ void Heal(int days); /* Receive experience (handle dual/multi class) */ - void AddExperience(int exp); + void AddExperience(int exp, int combat); /* Calculate experience bonus */ int CalculateExperience(int type, int level); /* Sets the modal state after checks */ diff --git a/gemrb/override/bg1/difflvls.2da b/gemrb/override/bg1/difflvls.2da new file mode 100644 index 0000000..d71ae9a --- /dev/null +++ b/gemrb/override/bg1/difflvls.2da @@ -0,0 +1,5 @@ +2DA V1.0 +0 + DEFAULT EASY NORMAL CORE HARD NIGHTMARE +DMG 0 -50 -25 0 50 100 +XP 0 -50 0 0 0 0 diff --git a/gemrb/override/shared/difflvls.2da b/gemrb/override/shared/difflvls.2da new file mode 100644 index 0000000..36115bb --- /dev/null +++ b/gemrb/override/shared/difflvls.2da @@ -0,0 +1,5 @@ +2DA V1.0 +0 + DEFAULT EASY NORMAL CORE HARD NIGHTMARE +DMG 0 -50 -25 0 50 100 +XP 0 0 0 0 0 0 ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |