PDA

View Full Version : Skald, Pean skill workaround


Rudi
10-29-2012, 10:40 PM
Hi everybody
after getting several crashes because of Skald Pean skill and finding out it's
the Last Hero buff which causes them, I tried to find a workaround.

For anyone interested, simply find the function: special_bless_song_attack()
in unit_special_attacks.lua (needs extraction) and comment two lines at the spell selection function (lines 946,947), it should look like this:
--elseif spell == "spell_last_hero" then
--spell_last_hero_attack(lvl, dmgts, cell)

this eliminates the Last Hero buff from applying but at least prevents Skalds from crashing your games.

Anybody with a better understanding of scripting feel free to post a cleaner solution while we're waiting for an appropriate fix (hopefully soon).

zjazd18
10-29-2012, 10:46 PM
Sorry for being noob, but in what file. I'm stuck at one battle coz of constant crash, trying CCing skalds all rounds with fear but fight is too hard that way.

camelotcrusade
10-29-2012, 10:53 PM
This is great. Last Hero as a random buff is no fun, imo, because it's not a good spell to use in a game where you want to minimize losses!

Are you able to upload a file that does which we can put inside our mods folder, rather than do these steps? It's safer for noobs like me.

SchDerGrosse
10-29-2012, 11:08 PM
Same here.

"unit_special_attacks.lua (needs extraction) "

where is this file located? What does "needs extraction" mean? :/

Rudi
10-30-2012, 07:32 AM
sorry if the instructions weren't clear; the file has to be extracted from ses.kfs
i'll upload mine so you can compare
just unpack in your sessions\addon folder to use

SchDerGrosse
10-30-2012, 09:37 AM
sorry if the instructions weren't clear; the file has to be extracted from ses.kfs
i'll upload mine so you can compare
just unpack in your sessions\addon folder to use
Thank you Sir!

camelotcrusade
10-30-2012, 02:23 PM
Yay, thank you. I'm actually going to try replacing the Last Hero with Dragon Slayer to see if it works... that way he'll at least have a 4th spell (and that one seems like what a bard should sing about!).

We are starting to need a collected Mods thread. Not it! Lol.

camelotcrusade
10-30-2012, 03:15 PM
I am wondering if we can use this same file (unit_special_attacks.lua) to fix the Witch Hunter's "Magical Help" which right now always gives Dragon Slayer. It *might* be this section:

---------------
function special_magic_buff_attack()
Attack.act_aseq(0, "buff")
local dmgts = Attack.aseq_time(0, "x")

local tab_spells = {
{s = "dragon_slayer", prob = 0},
{s = "dark_knight", prob = 0},
{s = "light_knight", prob = 0},
{s = "divine_armor", prob = 0},
{s = "fire_breath", prob = 0},
{s = "haste", prob = 0},
{s = "stone_skin", prob = 0},
{s = "bless", prob = 0},
}
------------------

It actually goes on for a while, but if somebody who is better than I am at reading this code could look at it, maybe you can tell us what to tweak so "Magical Help" isn't always dragon slayer.

Puce Moose
10-30-2012, 04:12 PM
Regarding the witch hunter's issue:

I tried editing the file and replacing the prob = 0 with prob = 5. That made no difference in game. I then tried moving the {s = "bless", prob = 0}, line above the {s = "dragon_slayer", prob = 0}, line.

After making that change, now my witch hunters always cast bless. It looks like the buff as it currently stands always casts the first buff in the list.

camelotcrusade
10-30-2012, 04:21 PM
Regarding the witch hunter's issue:

I tried editing the file and replacing the prob = 0 with prob = 5. That made no difference in game. I then tried moving the {s = "bless", prob = 0}, line above the {s = "dragon_slayer", prob = 0}, line.

After making that change, now my witch hunters always cast bless. It looks like the buff as it currently stands always casts the first buff in the list.

So we could at least pick the spell we want, but it would be more fun if the random function worked. All those zeroes seems to indicate something is messed up. Did you see farther down where it says:

=============
acnt = table.getn(tab_spells)
for i = 1, acnt do
local spell_name = tab_spells[i].s
if Attack.act_is_spell(0, spell_name) then
tab_spells[i].prob = 0
else
tab_spells[i].prob = math.min(0, math.ceil(tab_spells[i].prob))
end
end

local spell = random_choice(tab_spells)
if spell.s == "dragon_slayer" then
spell_dragon_slayer_attack(2, dmgts, 0)
elseif spell.s == "dark_knight" then
spell_dark_knight_attack(2, dmgts, 0)
elseif spell.s == "light_knight" then
spell_light_knight_attack(2, dmgts, 0)
elseif spell.s == "divine_armor" then
spell_divine_armor_attack(2, dmgts, 0)
elseif spell.s == "fire_breath" then
spell_fire_breath_attack(2, dmgts, 0)
elseif spell.s == "haste" then
spell_haste_attack(2, dmgts, 0)
elseif spell.s == "stone_skin" then
spell_stone_skin_attack(2, dmgts, 0)
elseif spell.s == "bless" then
spell_bless_attack(2, dmgts, 0)
end

==========

Maybe the key is in there?

Rudi
10-30-2012, 04:44 PM
I think that somewhere along the line it overwrites the probabilities calculated with 0 so the script takes the first from the table which is dragon hunter, when I take hold of some witch hunters I'll try to find where exactly. My first guess is that it's the first if in:
for i = 1, acnt do
local spell_name = tab_spells[i].s
if Attack.act_is_spell(0, spell_name) then
tab_spells[i].prob = 0
else
tab_spells[i].prob = math.min(0, math.ceil(tab_spells[i].prob))
end

if someone could comment the 3 lines starting with if and do some testing it'd be great. Cause I'd like to finish the game at least once before digging in code :)

Nokturhn
10-30-2012, 04:47 PM
Thank you sir for this workaround ! I finally managed to finish the second island without a single crash ! Thanks ! :D

Puce Moose
10-30-2012, 05:16 PM
Rudi:

I tried that, but it made the game crashed (probably something I messed up while editing), so I tried something else that I think would accomplish the same thing:

for i = 1, acnt do
local spell_name = tab_spells[i].s
if Attack.act_is_spell(0, spell_name) then
tab_spells[i].prob = math.min(0, math.ceil(tab_spells[i].prob))
else
tab_spells[i].prob = math.min(0, math.ceil(tab_spells[i].prob))
end
end

Unfortunately, it still selected the first spell in the list (bless in my case, since I shuffled bless on top of the spell group).

I found an enemy group with two stacks of witch hunters, which should make for some good testing.

Interestingly, when I changed that section to this:

acnt = table.getn(tab_spells)
for i = 1, acnt do
local spell_name = tab_spells[i].s
if Attack.act_is_spell(0, spell_name) then
tab_spells[i].prob = math.min(2, math.ceil(tab_spells[i].prob))
else
tab_spells[i].prob = math.min(2, math.ceil(tab_spells[i].prob))
end
end

The enemy witch hunters still always cast bless, but my witch hunter stack always casts Hell/Fire Breath (the sixth spell in the list).

camelotcrusade
10-30-2012, 05:21 PM
Seems like you guys are close to figuring it out. I would love that and then I might acutally use Witch Hunters (buggy abilities turn me off).

Sorry I'm useless at programming. When I get in the game next I'm going to see if simply replacing "Last_Hero" with "Dragon_Slayer" in the Skald song area will give me that spell instead (and hopefully, no crash). That's probably the extent of my programming abilities, lol.

Bhruic
10-30-2012, 05:49 PM
Seems to be working for me now. Should have been math.max, not math.min


for i = 1, acnt do
local spell_name = tab_spells[i].s
if Attack.act_is_spell(0, spell_name) then
tab_spells[i].prob = 0
else
tab_spells[i].prob = math.max(0, math.ceil(tab_spells[i].prob))
end
end

Puce Moose
10-30-2012, 05:54 PM
Nice find, Bhruic. I was just coming back to report that I found a fix (though mine was a little different; tab_spells[i].prob = math.min(10, math.ceil(tab_spells[i].prob)) , but I think yours is the more elegant solution.

This should make the witch hunters a bit more interesting to use now.

BB Shockwave
10-31-2012, 07:51 AM
I seriously wonder why they even bothered to bring back Last hero at all, when AP eliminated this spell. It is the epytome of uselessness. So much, that for The Legend, I used this spell to mod myself an "Animated Dead" spell in it's place that I could use to resurrect my undead troops. :)

BB Shockwave
10-31-2012, 07:53 AM
I am wondering if we can use this same file (unit_special_attacks.lua) to fix the Witch Hunter's "Magical Help" which right now always gives Dragon Slayer. It *might* be this section:

---------------
function special_magic_buff_attack()
Attack.act_aseq(0, "buff")
local dmgts = Attack.aseq_time(0, "x")

local tab_spells = {
{s = "dragon_slayer", prob = 0},
{s = "dark_knight", prob = 0},
{s = "light_knight", prob = 0},
{s = "divine_armor", prob = 0},
{s = "fire_breath", prob = 0},
{s = "haste", prob = 0},
{s = "stone_skin", prob = 0},
{s = "bless", prob = 0},
}
------------------

It actually goes on for a while, but if somebody who is better than I am at reading this code could look at it, maybe you can tell us what to tweak so "Magical Help" isn't always dragon slayer.

Witch Hunters work fine in AP/Crossworlds, so anyone thought of checking their programmed abilities there?

pcrevue
10-10-2013, 08:50 PM
Try changing the probability to 1 which is 100% in maths. (There is no probability of 5)