bad news:
i can't get both moon coin AND light claw; my inventory is currently perfectly full, flute and gun powder will be put into storage in mana land before getting the drum, so i'd have then 1 slot free, which could either be the coin or the claw
opening the storage one time more to take one of those out when i have room for it adds almost 900 frames to the total costs of the item, for a total of about 1800 frames; so i think it's best if i only take the light claw for zable, since there it basically hits a total of three bosses compared to only one with the coin against archdemon (plus the claw sort of kills half a boss fight with its roughly doubling damage)
can drop the hammer as well....
on another note, if i'd go for a kill-em-all i'd miss lv18 after lugar by about 2,2-2,4k exp (measured by a simple test run); so i better be a bit more picky and go for 18-but-almost-19 at mhl
addit:
not sure, should i do this?
Link to video
i tend for a yes, because i find it very funny how bigieu does nothing while i collect one spirit a pack of twins, and then she just disappears!?
she is just an ordinary npc (non-participating character) after all
note: once does NOT work, because the moon forest entrance would still be blocked; that above does work though, just finished a non-tas'd test run with it at ~937k frames/4:20h finishing blow archdemon, considering how much time i wasted with not finding my way, killing almost everything in sight and lots of spell animations i can skip with tas, sub 4h seems reasonably possible
next small-ish update, entrance moon forest, already got the moon coin; levels 16/16/15
1:55h total/1:47h in-game
i still need about 6k additional exp from normal enemies, not yet sure which enemies/region is optimal for this on-the-way-grinding, or rather how many enemies i can still skip
update:
poor Lugar, Kevin has serious anger issues...Link to video
we have two kinds of text boxes:
1. the long one-line text bar
if i can push a button to determine when it closes, it hardly lasts 10 frames (1/6 second) after registering the button, short enough to easily miss
2. the big 3-line text boxes
text flows at 1 symbol/space each frame; if it's full, it takes about 70 frames
in both cases a translation patch wouldn't help much, you'd have to pause the video hundreds of times at the right frame if you wanted to read story stuff, so i agree that's better/easier to have/use subs than bother with a patch; might or not make them once i finish, though i've no idea how to
note1:
some dialog stays around longer because there are some animations triggered by the dialog box which have to finish first
note2:
i've yet to figure out/successfully reproduce how i got kevin to rapid punch lugar at the end; after he starts that he refuses any input and acts on his own w/out input but is still counted as player 1.
ok, 1.5k re-records later and no progress - i wish that was a joke (i hate gildervine), i give up on manual trying with him and wanna see how an iterative script fares against him; if it succeedes (which i doubt) it at least shows another nice contrast between "playing styles" - it feels stupid to use that, but i haven't found another cleaner way.
i have not the faintest idea why gildervine makes such problems, just taking the sleep flower (he always targets riesz for whatever reason, since he started to threaten with casting it) wouldn't help since he'd soon after throw out two normal enemies and cast sleep flower or poison bubble AGAIN; and at exactly 50% hp he turns god mode on until all small enemies are gone and his head visible
the following is mostly meant as a backup for myself in case i lose the script - though if anyone wants to use it, feel free to do so, but at own risk ofc
the script is just a random-input-bot that starts at the current frame and saves results to savestate 8 and 9; slot 8 receives the result which lowered 7FFAF0 the most (gildervine's health in this case), slot 9 receives the try which lasted the longest (useful to check how far i can get w/out a spell)
one try is aborted if one of the following condition is met:
-someone in my party loses health
-someone receives a negative status (e.g. sleep, poison)
-for 80 frames 7FFAF0 didn't change a.k.a. no damage was dealt (changeable with failrange)
-7F0032 becomes non-zero, this happens exactly for ALL message boxes - which means in this case a spell is announced
-1000 frames passed (changeable with limit)
more notes:
-party states are from trangix's script
-tries determines maximum number of iterations, once they are used up, the game is paused and state 8 loaded
-L,R,select and start are not used because they'd freeze two characters for no gain
-X is not used because i don't need the menu right now
-the input is random, not systematically, else we'd never finish (16384 possibilities per frame, so 2.684.435.456 in 2 frames, no idea how much for 100 or even 1000, it just ebcomes unreasonable)
local csave=savestate.create(1)
local cmaster=savestate.create(9)
local dmaster=savestate.create(10)
local limit=1000
local tries=1000
local failrange=80
local frame=0
local hpA=0
local hpB=0
local hpC=0
local hpA2=0
local hpB2=0
local hpC2=0
local failcheck=0
local failcounter=0
local record=30000
local longest=0
local bossadr=0x7FFAF0
local inputA={}
local inputB={}
local eneX = 165
local eneY = 50
local nextlv = {0,30,67,125,204,363,602,945,1418,2049,2870,3914,5218,6819,8759,11080,13827,17049,20794,25115,30065,35701,42081,49265,57316,66298,76278,87324,99507,112899,127575,143611,161086,180080,200675,222956,247009,272921,300783,330686}
function getStatus(adr)
local lv = memory.readbyte(adr + 0x21)
local hp = memory.readword(adr + 0x2)
local mh = memory.readword(adr + 0x12)
local at = memory.readword(adr + 0x53)
local di = memory.readword(adr + 0x5B)
local ex = memory.readword(adr + 0xCF)
local lu = memory.readbyte(adr + 0xD1)
if ((lv>50) or (hp>mh) or (hp == 0) or (mh == 0) or (at == 0) or (at > 1000) or (di == 0) or (di > 500) or (ex == 0)) then
return false
else
return lv,hp,mh,at,di,ex,lu
end
end
function getChar(id)
local charX = 0
local charY = 0
local atk,dif,exp,lv,nxt = 0
local i,j
for i = 0x7FE4F6 , 0x7FFFF6 , 0x10 do
if (memory.readbyte(i) == memory.readbyte(i+0x3)) and (memory.readbyte(i) == id) then
charX = memory.readword(i+0x29)
charY = memory.readword(i+0x2d)
end
end
for j = 0x7FEDD0 , 0x7FFFD0 , 0x100 do
if (memory.readbyte(j) == memory.readbyte(j+0x20)) and (memory.readbyte(j) == id) then
atk = memory.readbyte(j+0x73)
dif = memory.readbyte(j+0x7B)
exp = (memory.readbyte(j+0x2D)*50000) +memory.readbyte(j+0x2F)
lv = memory.readbyte(j+0x41)
nxt = nextlv[lv+2] - exp
end
end
if (charX and charY and atk and dif and nxt) then
return charX,charY,atk,dif,nxt
end
end
function getEnemyList()
local t = {}
local i
for i = 0 ,60, 1 do
local tmp = memory.readbyte(0x7EB0A4+i*0x10)
local num = memory.readbyte(0x7EB0A3+i*0x10)
if ((tmp < 0x7f) and (tmp ~= 0)) then
t[num] = tmp
end
end
return t
end
function drawRiesz()
local textX = 2
local textY = 50
if getChar(0x85) then
local cX,cY,a,d,n = getChar(0x85)
gui.text(textX,textY,string.format("Riesz (%4d,%4d)",cX,cY))
gui.text(textX,textY+7,string.format("A:%3d D:%3d Next:%d",a,d,n))
end
end
function drawKevin()
local textX = 2
local textY = 64
if getChar(0x81) then
local cX,cY,a,d,n = getChar(0x81)
gui.text(textX,textY,string.format("Kevin (%4d,%4d)",cX,cY))
gui.text(textX,textY+7,string.format("A:%3d D:%3d Next:%d",a,d,n))
end
end
function drawHawk()
local textX = 2
local textY = 78
if getChar(0x82) then
local cX,cY,a,d,n = getChar(0x82)
gui.text(textX,textY,string.format("Hawk (%4d,%4d)",cX,cY))
gui.text(textX,textY+7,string.format("A:%3d D:%3d Next:%d",a,d,n))
end
end
function drawEnemy()
local i = 0, j , adr
local list = getEnemyList()
for adr = 0x7FB0F0,0x7FFFF0,0x100 do
local id = memory.readbyte(adr)
if (id == list[3]) then
if getStatus(adr) then
local lv,hp,mh,at,di,ex,lu = getStatus(adr)
local test = memory.readword(adr+0x33)
gui.text(eneX,eneY+i*14,string.format("Lv.%02d %d/%d %x",lv+1,hp,mh,adr))
gui.text(eneX,eneY+7+i*14,string.format("A:%d D:%d E:%d $:%d",at,di,ex,lu))
i = i + 1
list[3] = nil
end
elseif (id == list[4]) then
if getStatus(adr) then
local lv,hp,mh,at,di,ex,lu = getStatus(adr)
local test = memory.readword(adr+0x33)
gui.text(eneX,eneY+i*14,string.format("Lv.%02d %d/%d %x",lv+1,hp,mh,adr))
gui.text(eneX,eneY+7+i*14,string.format("A:%d D:%d E:%d $:%d",at,di,ex,lu))
i = i + 1
list[4] = nil
end
elseif (id == list[5]) then
if getStatus(adr) then
local lv,hp,mh,at,di,ex,lu = getStatus(adr)
local test = memory.readword(adr+0x33)
gui.text(eneX,eneY+i*14,string.format("Lv.%02d %d/%d %x",lv+1,hp,mh,adr))
gui.text(eneX,eneY+7+i*14,string.format("A:%d D:%d E:%d $:%d",at,di,ex,lu))
i = i + 1
list[5] = nil
end
end
end
end
function drawTime()
local d,h,m,day,hour,min,hm
local color = "white"
local dlist = {"Sun.","Mon.","Tue.","Wed.","Thr.","Fri.","Sat."}
d = memory.readbyte(0x7E2FFA)
h = memory.readbyte(0x7E2FFB)
if ((h<5>12)) then color = "gray" end
m = memory.readword(0x7E2FFC)
hm = (h *32 + m) *1440 / 16 / 32
if (dlist[d+1]) then
day = dlist[d+1]
hour = hm / 60
min = hm % 60
gui.text(210,0,string.format("%s %02d:%02d",day,hour,min),color)
end
end
function drawAlert()
local a, b, c
local color = "white"
a = memory.readbyte(0x7FEDE9)
b = memory.readbyte(0x7E5F91)
c = memory.readbyte(0x7E5F94)
d = record
gui.text(190,10,string.format("Value: %d",a),color)
gui.text(190,20,string.format("Seed: %d, %d",b,c),color)
gui.text(190,30,string.format("Health: %d",d),color)
end
savestate.load(csave)
savestate.save(cmaster)
record=memory.readdword(bossadr)
while(true) do
frame=limit
hpA=memory.readbyte(0x7FEDF2)
hpB=memory.readbyte(0x7FF0F2)
hpC=memory.readbyte(0x7FF3F2)
hpA2=memory.readbyte(0x7FEDF3)
hpB2=memory.readbyte(0x7FF0F3)
hpC2=memory.readbyte(0x7FF3F3)
failcheck=memory.readdword(bossadr)
failcounter=failrange
while frame>0 do
drawRiesz()
drawKevin()
drawHawk()
drawEnemy()
drawTime()
drawAlert()
inputA={}
inputB={}
if math.random(1000)<620 then
inputA.A=1
end
if math.random(1000)<540 then
inputB.A=1
end
if math.random(1000)<250 then
inputA.B=1
end
if math.random(1000)<280 then
inputB.B=1
end
if math.random(1000)<10 then
inputA.Y=1
end
if math.random(1000)<10 then
inputB.Y=1
end
if math.random(1000)<75 then
inputA.left=1
else if math.random(900)<80 then
inputA.right=1
end
end
if math.random(1000)<100 then
inputB.left=1
else if math.random(900)<100 then
inputB.right=1
end
end
if math.random(1000)<75 then
inputA.up=1
else if math.random(900)<75 then
inputA.down=1
end
end
if math.random(1000)<100 then
inputB.up=1
else if math.random(900)<100 then
inputB.down=1
end
end
joypad.set(1,inputA)
joypad.set(2,inputB)
frame=frame-1
snes9x.frameadvance()
if failcheck==memory.readdword(bossadr) then
failcounter=failcounter-1
if failcounter==0 then
frame=limit
if memory.readdword(bossadr)<record then
record=memory.readdword(bossadr)
savestate.save(cmaster)
end
if longest<movie.framecount() then
longest=movie.framecount()
savestate.save(dmaster)
end
savestate.load(csave)
tries=tries-1
failcounter=failrange
end
else
failcheck=memory.readdword(bossadr)
failcounter=failrange
end
if hpA~=memory.readbyte(0x7FEDF2) or hpB~=memory.readbyte(0x7FF0F2) or hpC~=memory.readbyte(0x7FF3F2) then
frame=limit
if memory.readdword(bossadr)<record then
record=memory.readdword(bossadr)
savestate.save(cmaster)
end
if longest<movie.framecount() then
longest=movie.framecount()
savestate.save(dmaster)
end
savestate.load(csave)
tries=tries-1
failcounter=failrange
end
if hpA2~=memory.readbyte(0x7FEDF3) or hpB2~=memory.readbyte(0x7FF0F3) or hpC2~=memory.readbyte(0x7FF3F3) then
frame=limit
if memory.readdword(bossadr)<record then
record=memory.readdword(bossadr)
savestate.save(cmaster)
end
if longest<movie.framecount() then
longest=movie.framecount()
savestate.save(dmaster)
end
savestate.load(csave)
tries=tries-1
failcounter=failrange
end
if memory.readbyte(0x7FEE22)~=0 or memory.readbyte(0x7FF122)~=0 or memory.readbyte(0x7FF422)~=0 then
frame=limit
if memory.readdword(bossadr)<record then
record=memory.readdword(bossadr)
savestate.save(cmaster)
end
if longest<movie.framecount() then
longest=movie.framecount()
savestate.save(dmaster)
end
savestate.load(csave)
tries=tries-1
failcounter=failrange
end
if memory.readbyte(0x7F0032)~=0 then
frame=limit
if memory.readdword(bossadr)<record then
record=memory.readdword(bossadr)
savestate.save(cmaster)
end
if longest<movie.framecount() then
longest=movie.framecount()
savestate.save(dmaster)
end
savestate.load(csave)
tries=tries-1
failcounter=failrange
end
if frame == 1 then
frame=limit
if memory.readdword(bossadr)<record then
record=memory.readdword(bossadr)
savestate.save(cmaster)
end
if longest<movie.framecount() then
longest=movie.framecount()
savestate.save(dmaster)
end
savestate.load(csave)
tries=tries-1
failcounter=failrange
end
if tries==0 then
savestate.load(cmaster)
snes9x.pause()
end
end
end
addendum:
was quoted already way earlier in this thread:
this has sadly to be taken too literally - luck does NOT affect bosses at all; i used a cheat to set everyone's luck to 1 while playing back all my previous boss-fights - all went as if nothing changed
Gilderb**ch
honestly... 160k re-records for that!?
Link to video
minor explanation:
at 50% health gildervine turns unvulnerable if any normal enemies are on screen, they don't even have to be alive
so... let's just kill it quick and be done? i wish... that bug watched to much anime as it refuses to die for ~15 seconds after it's been killed; i needed to apply more pressure to the game/system to stop gilder at that point and way less to let that bug die - plain impossible, so here goes the first spell; and the bug takes long to die...
sleep flower is part of gilder removing his god mode, can't do anything about it
pollen attack... ~70k re-records (mostly via bot) and couldn't get past it
magic shield... 25% health skill, no time after the last spell to do something
sleep flower at 200 health left... another ~40k re-records here...
really, does he start so high on priority?
i know that spells/skills get a set priority when the character "decides" to use it, and then the priority increases as time passes; gilder seems to start/increase unreasonably high there...
Riesz - as useful as ever; stands around, gets poison bubbled, put to sleep, gets up and immediatly put to sleep again
at least he got a deserved sprite mess-up - a bit cartoony cross-popping-veins
i hope it's not only for my emulator though
75% of all re-records so far for one boss, one boss that is normally not even a real threat just annoying
/rant
Looking pretty solid there.
While I'm sure you've thought about this already, did you consider the possibility of grabbing a considerable amount of moon coins (chest drop) while you were in the forest getting luna (or possibly on your way to Dolan)?
The 1/5hp down effect works on bosses, so I imagine it would be extremely handy as a timesaver on some of the bosses that have rather high amounts of hp, or are just a pain to kill.
Either way, keep it up, it's looking good.
Honestly, the Gildervine is the worst battle i have done so far; it seems the more re-records a boss takes, the worse it will be at the end.
Compare:
G-vine with 160k re-records: gets off 5 spells
Gorva with a few hundred: no spells, no hit (my personal favorite battle btw)
I already got one, it will be used against the final boss, all others have to low total health to justify getting one;
i think it costs about 1k frames total to wait for a chest to appear, to manipulate the drop(hopefully 0) then later at the boss fight open the menu and use the coin and for the animation; that kind of assumes the enemy killing is for free, which it is not; and that is against the MAXIMUM of 3600 frames (one minute) the boss battle will be active (substract buff-times etc from it) for all but the last two bosses; actually way less considering how over-powered Kevin will be after his glitch before the next boss (boosted to max atk i mean; need flammie for it, that's way it's not been done so far).
Special cases:
Dangaard (thunder god beast) - insanely high health this "early" in the game, but in reality it's 4 separat boss battles in a row with very low health each (5-6k), would be nice if one coin counted for all of these, but it doesn't. Would probably no even then be worth it.
Bigieu - almost triple the previous bosses health, could be worth it, but i go with one ice saber on Kevin and Hawk each against her, this should still exceed the damage i can do with a 1k frame investment for a coin.
Archdemon - slightly more health than bigieu, but no weakness (he only absorbs certain elements, but is weak to nothing, at least not to a saber'd attack), so basically cuts my damage in half - definitly coin-worthy.
I hope that was not too much details. xD
thanks
edit:
wow, after 4 months i finally advance from page 9 to 10
at mhl - class changing, want to rethink/test my plans regarding who changes at all, atm i think only Hawk should get a cc
costs: ~30 seconds for each cc, and increased damage taken from spells
i would recommend class changing them all, not only you gain damage output and several new skills, but your stats automatically max out to highest possible stats your previous classes attains. so i dont see how you could get increased damage taken from spells since your int score is automatically maxed out of previous classes which translates into higher mag def.
He's glitching the heck out of the game, you do know that right? Kevin's strength stat is glitched way beyond what would be achievable via levelups.
As for magic defense, there's a multiplier in the game code that kicks in if the character has changed class. In other words, the magic defense equation is different for base classes vs. upgraded classes.
Pyrel - an open-source rewrite of the Angband roguelike game in Python.
small nitpick here; his str isn't touched at all - which is currently my main problem*; only the atk will be altered
normally
base atk = str * weapon multiplier + minor constants from weapons
with glitch it'll simply be
base atk = maximum allowed (370)
totally independent from str, or actually slightly less, depends on how often i repeat the glitch
specifically:
i start with 114 atk, each repetition increases the current atk by 1/7
114 -> 130 first glitch
130 -> 148 second
148 -> 169 third
...
251 -> 286 seventh
286 -> 326 eight
326 -> 372 ninth, capped down to 370, fits extremely well
370 -> 370 tenth
werewolf's atk buff and the atk-up spell affect a third different value actually, so it goes up a bit more
ignoring that magic defense in general is stupidly ineffective either way**, i should be able to reduce the amount of spells that hit me to almost none, so it shouldn't matter anyway - i'd have said exactly none, but that gildervine incident proofed me otherwise
*after he lvls up outside of wolf form, the glitch will end and he'll be back to the upper atk formula with a meager 10 str (or a bit more if i cc him) and 10 weapon multiplier
this a big problem considering that the 6 bosses in the final dungeon (zable, jagan, fmh, genova, tzenker, bigieu) are almost back-to-back with high exp rewards each (50% of a lvl and more) and not so many enemies inbetween - between tzenker and bigieu are exactly 3 if i remember right
**with best armor you can reduce spell damage by 8 points for every int you gain vs 300-500 damage means exactly nothing; or spr instead of int for certain spells;
skills like whirlwind profit from that spell multiplier, too - why does that remember my of a certain incident where i walked into the cave of darkness and was greeted by 3 full techs...
sure, no problem
most spells that concern me hit all anyway - e.g. fable zar's hell cross opening attack, archdemon's skill/spell arsenal, maybe fiegmund's diving below the battlefield - but that should already be all
interesting info, based on info i gleaned from gamefaqs and whatnot, opposite seems to occur, nice find i might be able to use that for my solo SD3 playthrough
also wouldnt class changing lise and hawk for stat ups and stat ups skills save more time considering you generally lower the bosses' damage output and defenses thus boosting your damage output further by using those skills?
Class changing a character is only relevant if their increased offense makes up for the time spent on the class change. As I understand it Lise is basically irrelevant with or without class changing -- it's not worth spending the time to level her up / buy her better weapons since that time could be better used letting Kevin attack more. Hawk's more of an edge case since he does contribute some useful damage.
Pyrel - an open-source rewrite of the Angband roguelike game in Python.
plus all stat-ups are better used via items (no charge-up time so to speak, and not restricting class choices - the buff spells that can't be bought are available as drop early enough)
although i only have to care for atk-up and sabers, as i have almost no defense that could be increased; 10 -> 13, yeah sure, no
stat-downs can be covered by hawk's jutsus, so i lose exactly nothing by not changing riesz - hawk gets them relatively late, but i only "need" def-down for archdemon, everyone else has too low hp&def to make it worth it's time
atk-down or mind-down is the best single spell to use if more survivability is needed (600 or something spellpower down by 1/3 is better than buffing the max defense of 300 by 1/5)
I went with CC for Hawk+Kevin; Riesz is simply too inactive (would be way more useful with 3-player patch, but...)
I hope the atk glitch is not too repetitive/boring:
Link to video
glitching Kevin's Atk to max is going on there
Kevin has to transform into his wolf form, or at least start; the wolf bonus is given very early, and that's all I need here.
Once he has his temporary wolf form atk bonus, i call flammie to get away; now this is where the real glitch happens: his wolf atk bonus is NOT removed because I use flammie. If a rope or door or whatever is used while Kevin is transformed, his transformation is ended properly and the atk bonus removed. Not so here; he keeps his higher atk as his new BASE attack.
So if I repeat the process again his wolf atk bonus is applied again and again until his base atk reaches the cap of 370.
Remember, I started at 114 base atk for Kevin; this 2:15 minutes investment more than trippled his base atk and increases his real damage almost ten-fold.
He deals about 260 damage with a normal attack while in wolf form now against the ninjas in the desert fortress; without the glitch it'd be 30ish.
I all the time say "base atk", because that is capped at 370; but wolf bonus and atk-up/saber can still get us even higher attack power.
how to lose this glitch:
1) changing his weapon
Always when the game has to display the attack value of any weapon Kevin can equip, it recalculates and resets his base atk to the calculated value.
2) lvling while in human form
While in wolf form the game does not update your attack on a lvl up ever; so if str is taken, his atk does NOT increase until you re-equip his weapon. (see above)
3) shopping
Can't have him sell his old weapons (don't need to anyway) or have him buy a weapon himself; if e.g. Hawk buys it for him, fast enough to not show the improvement dialog, it's fine though.
Any questions left?
Thanks for the detailed explanation. Makes sense. :)
Sounds like you might have to spam levelups during the nighttime then. Or take non-STR levelups when human? Not that boosting STR would help much at this point, would it?
Pyrel - an open-source rewrite of the Angband roguelike game in Python.
no, the glitch is lost as soon as the lvl-up screen comes up and Kevin isn't in wolf-form, what stat I take then does not matter at all
on the matter of lvl-ups one more note:
the game does indeed update the base atk of kevin, no matter which form he currently has, specifically it gets brought down to normal - however, when he untransforms back to human, the game overwrites the base attack of Kevin again with his old attack value; that way I can save the glitched attack.
how I think the game works this:
starting point:
variables: human form, atk = 370
Kevin transforms:
game order: store his atk in a back-up value and update atk with wolf bonus
variables: atk = 422, back-up-value = 370
this is probably done because rounding errors with a integer system can be fatal/game breaking;
x = atk * 8 / 7 loses any number after the point (so 422.85 becomes 422)
x * 7 / 8 is not necessarily the old "atk" value (369 in this case, so already wrong)
Kevin levels up:
game order: update atk, run lvl-up script
variables: atk = str * weapon multiplier + constants = 114
back-up-value is not touched, THIS right here is one part of the reason why I can have an (even more) overpowered Kevin
--NOTE: here Kevin is WEAK--
Kevin is transformed back to human:
game order: give him his old atk back
variables: atk = back-up-value = 370
for what ever reason calling flammie does NOT trigger this method, THAT is the 2nd part of our glitch
demonstrating the result:
Link to video
edit:
545545 frames, finally done with all those long cutscenes, back to dungeon crawling