Expert player (2468)
Joined: 6/2/2009
Posts: 1182
Location: Teresópolis - Rio de Janeiro - Brazil
Samsara wrote:
I've long lost and forgotten the RAM address that contains boss/enemy HP.
I found some memory addresses, but they're on a different range and some of your tricks work a little different in BizHawk; the landing cancel must be done in the same frame you land.
--Run Saber Useful Memory Addresses

memory.usememorydomain("WRAM")

while true do
	gui.text(10,40,"Alow X: "..memory.read_u16_le(0x000E10))
	gui.text(10,50,"Sewa X: "..memory.read_u16_le(0x000E30))
	gui.text(10,60,"Alow Y: "..memory.read_u16_le(0x00E12))
	gui.text(10,70,"Sewa Y: "..memory.read_u16_le(0x00E32))
	gui.text(10,80,"Cam. X "..memory.read_u16_le(0x00548))
	gui.text(10,90,"Cam. Y "..memory.read_u16_le(0x0054A))
	gui.text(10,100,"Boss H: "..memory.read_u8(0x00E54))
 emu.frameadvance()
end
In BizHawk you'll have to wait longer to start the game, so even with two players I'm only 37 frames ahead of you at the first miniboss. edit: the camera positions... Here's a small two player testrun, it's only 40 frames faster than your one player wip and since the climb through walls still have some possible uses, and is easier to do with one player, I'm not going any further with this test. http://tasvideos.org/userfiles/info/4633504251639592
I am old enough to know better, but not enough to do it.
Former player
Joined: 6/27/2004
Posts: 550
Location: New York
Out of curiosity, does anyone know what the difficulty level changes in this game? It doesn't seem to affect default health, continue count, or enemy spawns. Is it maybe drop rates/boss health?
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Blechy wrote:
Out of curiosity, does anyone know what the difficulty level changes in this game? It doesn't seem to affect default health, continue count, or enemy spawns. Is it maybe drop rates/boss health?
I'm only a year late to answering this... Eh, not the latest I've ever been. I remember doing some testing after finishing the currently published run and finding out that it most likely doesn't have an effect on anything that would be noticeable in a TAS or speedrun, and I couldn't even find any information online relating to differences between each difficulty. I think drop rates are mostly "fixed", in that there may be slight variations but for the most part the same enemies will almost always drop the same pickups. Boss health is the only thing I can think of... Maybe only the end bosses of each level, since I don't think it affected the sub-bosses in Taj Base from what I remember of my testing... I'll have another go at testing difficulty differences since I'm most likely coming back to the run very soon. Every time I look at my avatar I'm just reminded of how much can be improved in that run. The new run might end up being on the easiest difficulty if boss health is affected, since I feel like boss battles drag on much too long and don't really give enough room to be entertaining, unless your idea of entertaining is "Wow, that glowy green guy spin-jumped into that huge dragon 20 times!"
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Okay, forget what I said about the pickup drops being "fixed": Easy difficulty drops much more pickups than the other difficulties. I wasn't looking for that kind of difference, I was mainly focusing on enemy health, so I don't know if there are more drops in Normal than in Hard, but there are definitely a lot more pickups in Easy. That's it. There are no other differences. Boss and miniboss health stays the same across all three difficulties as far as I tested. I couldn't play through the whole game three times because of time reasons, but at the very least all the bosses in the first two levels have the same health across difficulties. So basically, there's no reason at all to change the difficulty in a TAS. You get enough health on Hard to be able to take damage in the right spots, and there's only two places in the game where you can use bombs: One on the first miniboss in Bruford, since you can get 7 hits on him before he retreats into the wall and using a bomb immediately after the 7th hit saves about a second or so over waiting for him to pop back out so you can attack again, and one on the last boss to end input early. Though, ending input early (like the published trainwr- I mean run) means you don't get to the end credits ASAP: It's faster in-game to just deliver the last couple hits yourself, so if you're pedantic about that sort of thing then there you go, have some validation. Something else I noticed while testing: Apparently using a bomb attack increases the boss/enemy HP value by 2 (counting for 2 hits on the enemy or boss listed) when there are no enemies on screen. I'm guessing that's how the attack hits for 3 damage: The bomb attack itself hits for only 1 damage and the HP value just increases by 2 to account for the extra damage. I dunno, I just thought it was kinda interesting. though i'm secretly hoping someone can do something awesome with that knowledge.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Player (37)
Joined: 2/16/2012
Posts: 282
Hello! I made a hitbox script for Run Saber. They handle things in interesting ways... For example, rather than giving an enemy an additional hitbox for an attack or making complex shapes from multiple hitboxes, they just cycle through some offsets and sizes depending on the current animation without changing the center. This is most evident with the first miniboss and the lightning in Stage 2. What this also means is that there are plenty of gaps to abuse, especially for a TAS. They might have screwed up in a few places as well... [URL=http://www.makeagif.com/TulvQy][/URL] Code below. I make no claims about it being clean or efficient or complete, but it should be reasonable for now. Developed and tested on BizHawk 1.8.4, although some minor modifications should make it suitable for other versions/emulators.
while true do
	
	camx = mainmemory.read_u16_le(0x000548)
	camy = mainmemory.read_u16_le(0x00054A)
	
	textX=20
	textY=40
	
	hp = mainmemory.read_u8(0x001F3A)
	gui.text(textX,textY,string.format("HP:  %d",hp))
	
	memory.usememorydomain("CARTROM")
	
	hitbox_left = mainmemory.read_u16_le(0x000270)
	hitbox_right = mainmemory.read_u16_le(0x000272)
	hitbox_up = mainmemory.read_u16_le(0x000274)
	hitbox_down = mainmemory.read_u16_le(0x000276)
	
	if(mainmemory.read_u8(0x000E1D)~=0xFF) then
		attack_right = mainmemory.read_u16_le(0x000280)
		attack_left = mainmemory.read_u16_le(0x000282)
		attack_up = mainmemory.read_u16_le(0x000284)
		attack_down = mainmemory.read_u16_le(0x000286)
	
		
			gui.drawBox(attack_left-camx,attack_up-camy,attack_right-camx, attack_down-camy,"green")
			
	end
	
	--gui.text(textX,textY+14,string.format("X: %X",camx))
	--gui.text(textX,textY+28,string.format("Y: %X",camy))
	if(mainmemory.read_u8(0x000E1E)~=0x00) then
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"blue")
	else
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"white")
	end
	
	
	hitbox_left = mainmemory.read_u16_le(0x000278)
	hitbox_right = mainmemory.read_u16_le(0x00027A)
	hitbox_up = mainmemory.read_u16_le(0x00027C)
	hitbox_down = mainmemory.read_u16_le(0x00027E)
	
	if(mainmemory.read_u8(0x000E3D)~=0xFF) then
		attack_right = mainmemory.read_u16_le(0x000288)
		attack_left = mainmemory.read_u16_le(0x00028A)
		attack_up = mainmemory.read_u16_le(0x00028C)
		attack_down = mainmemory.read_u16_le(0x00028E)
	
		gui.drawBox(attack_left-camx,attack_up-camy,attack_right-camx, attack_down-camy,"green")
	end
	
	if(mainmemory.read_u8(0x000E3E)~=0x00) then
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"blue")
	else
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"white")
	end
	
	
	
	
	for i = 2,0x0F,1 do
		
		if(mainmemory.read_u8(0x000e00+(i*0x20))>0) then
		
		ID = mainmemory.read_u8(0x000e00+(i*0x20))*2
		
		NEWDC = mainmemory.read_u8(0x000e1c+(i*0x20))*4
		
		pos_x = mainmemory.read_u16_le(0x000e10+(i*0x20))
		pos_y = mainmemory.read_u16_le(0x000e12+(i*0x20))
		
		offset_x = memory.read_u8(0x038A00+NEWDC)
		length_x = memory.read_u8(0x038A01+NEWDC)
		offset_y = memory.read_u8(0x038A02+NEWDC)
		length_y = memory.read_u8(0x038A03+NEWDC)
		
		gui.drawPixel(pos_x-camx, pos_y-camy,"red")
		
		if(mainmemory.read_u8(0x000E0C+(i*0x20))==0) then
			mycolor = "red"
		else
			mycolor = "white"
		end
		
		if(bit.band(mainmemory.read_u8(0x000e07+(i*0x20)),0x40)~=0) then
			gui.drawBox(pos_x-camx+offset_x-length_x,pos_y-camy-offset_y,pos_x-camx+offset_x, pos_y-camy-offset_y+length_y,mycolor)
		else 
			gui.drawBox(pos_x-camx-offset_x+length_x,pos_y-camy-offset_y,pos_x-camx-offset_x, pos_y-camy-offset_y+length_y,mycolor)
		end
		--gui.drawText(pos_x-camx, pos_y-camy,string.format("%d",i))
		damage = mainmemory.read_u8(0x000e14+(i*0x20))
		max_hp = mainmemory.read_u8(0x000e15+(i*0x20))
		
		if(max_hp-damage <128>0) then
		
			addr_offset = mainmemory.read_u8(0x000c0e+(i*0x10))*8
		
			pos_x = mainmemory.read_u16_le(0x000c05+(i*0x10))
			pos_y = mainmemory.read_u16_le(0x000c07+(i*0x10))
		
			offset_x = memory.read_u8(0x009045+addr_offset)
			length_x = memory.read_u8(0x009047+addr_offset)
			offset_y = memory.read_u8(0x009049+addr_offset)
			length_y = memory.read_u8(0x00904B+addr_offset)
		
			gui.drawBox(pos_x-camx+offset_x,pos_y-camy+offset_y,pos_x-camx+offset_x+length_x, pos_y-camy+offset_y+length_y,"purple")

		end
	end
	
	emu.frameadvance()
end
Patashu
He/Him
Joined: 10/2/2005
Posts: 4043
Amazing hitboxes! Cough cough.
My Chiptune music, made in Famitracker: http://soundcloud.com/patashu My twitch. I stream mostly shmups & rhythm games http://twitch.tv/patashu My youtube, again shmups and rhythm games and misc stuff: http://youtube.com/user/patashu
Player (37)
Joined: 2/16/2012
Posts: 282
Small update to the script. I investigated several things that difficulty impacts, but the only notable things so far are enemy speed and drop rates. I will need to double-check for speed, but I believe the speed changes are the same for Easy and Normal and only speed up for Hard. Drop rates are a bit more interesting. Drops are calculated per specific enemy types but also per specific screens. This means killing a bunch of the same enemies in the same general area will push thier "counter" towards new drops. There can only be three drops per area enemy type though; this is hardcoded. But anyway, there is a table corresponding to enemy types and drop rates. If Easy, this drop rate is cut in half (rshift, so the rounding is beneficial). Normal it is left as is. Hard adds 25% (base + rshift x2) to this value. I have not spent any time looking into what sources the drops themselves other than checking into $76, which counts up every time a new drop appears, even if not dropped by an enemy. This controls what item is spawned, but there are some other factors that affect it that I'm not sure of. I have an updated script that takes everything into account, but I will hold off on posting it until I understand what actually drops better. EDIT: I also forgot to mention a bug/feature of the way it calculates the drop counter for a particular group. The counter is incremented as soon as a particular enemy's HP drops to 0. However, the code to calculate whether or not to spawn a drop does not execute until the unit has finished exploding. For some enemies this is instantaneous, but others that "fall back" when hit have quite some delay before spawning an item. So consider this scenario: enemy counter is at 0 initially. This enemy type will drop something when the counter is at 2. Two enemies approach. You kill the first, counter rises to 1. While the enemy is falling back, you kill the other enemy. The counter now rises to 2. Now the first enemy finishes exploding and spawns an item, since the counter is at 2. But when the second enemy finishes exploding, the counter is still a 2. Both enemies will thus spawn a drop. This also does not count towards the "no more than 3" drops requirement; if you could find a setup to kill 4 enemies and end up on the magic number by the time the first one explodes, all 4 will drop something. This also means there can be events where an enemy that should drop something will not because you kill another enemy too quickly. This does use up one of the "only 3 drops" so be careful on that.
Player (37)
Joined: 2/16/2012
Posts: 282
Script below. Here's the lowdown on drops though: -Each enemy type has a set variety of drops. Almost every single variety is dependent on whether you have upgraded saber; if you don't that will always be the drop. If you have the saber, it will always be only one other thing (for a specific enemy group). -The one enemy group that does not conform to this are the cannons in Bruford. They alternate between bomb and HP based on the RNG ($5C). You cannot get saber upgrade from them. -My statements above were mostly correct for drops, however for enemies that have a drop rate below 4 they are unaffected by difficulty. Basically, enemies that drop every 3 hits or every 1 hit will always remain that way. -You can use bombs to activate the enemy bug I describe above (especially for enemies that blow up instantly), however note that only 4 powerups can be on the screen at one time. Thus if they have 4 enemies left to cause a drop and there are 4 enemies on-screen, using a bomb will cause all of them to drop. One more thing to mention about difficulty: as far as I've been able to tell so far the only other gameplay difference beyond enemy speed and drop rates is with the final boss. The window to attack the core is significantly smaller on Hard. So about the script. It tracks a lot of things, but most of it should be pretty self-explanitory. Blue is good, Red is bad. Purple are typically projectiles, however some non-damaging debris also falls under this category. Green boxes are player attacks. White means the entity is invulnerable. The white number underneath enemies is their HP. The color-coded number below it is the number of enemies to kill before a drop is triggered. Green means a saber upgrade, Red is a bomb, Purple is HP, and Blue is Big HP. Extra lives cannot drop from enemies. If you see lone red pixels around, that marks the center (according to the game) of an enemy. There are some artifacts here and there, such as hitboxes that cannot actually hurt you and stray purple debris. In any case, enjoy. Let me know if something is broken.
while true do
	
	camx = mainmemory.read_u16_le(0x000548)
	camy = mainmemory.read_u16_le(0x00054A)
	
	textX=30
	textY=50
	
	hp = mainmemory.read_u8(0x001F3A)
	gui.text(textX,textY,string.format("HP:  %d",hp))
	diff = mainmemory.read_u8(0x001F0F)
	
	memory.usememorydomain("CARTROM")
	
	hitbox_left = mainmemory.read_u16_le(0x000270)
	hitbox_right = mainmemory.read_u16_le(0x000272)
	hitbox_up = mainmemory.read_u16_le(0x000274)
	hitbox_down = mainmemory.read_u16_le(0x000276)
	
	if(mainmemory.read_u8(0x000E1D)~=0xFF) then
		attack_right = mainmemory.read_u16_le(0x000280)
		attack_left = mainmemory.read_u16_le(0x000282)
		attack_up = mainmemory.read_u16_le(0x000284)
		attack_down = mainmemory.read_u16_le(0x000286)
	
		
			gui.drawBox(attack_left-camx,attack_up-camy,attack_right-camx, attack_down-camy,"green")
			
	end
	
	if(mainmemory.read_u8(0x000E1E)~=0x00) then
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"blue")
	else
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"white")
	end
	
	
	hitbox_left = mainmemory.read_u16_le(0x000278)
	hitbox_right = mainmemory.read_u16_le(0x00027A)
	hitbox_up = mainmemory.read_u16_le(0x00027C)
	hitbox_down = mainmemory.read_u16_le(0x00027E)
	
	if(mainmemory.read_u8(0x000E3D)~=0xFF) then
		attack_right = mainmemory.read_u16_le(0x000288)
		attack_left = mainmemory.read_u16_le(0x00028A)
		attack_up = mainmemory.read_u16_le(0x00028C)
		attack_down = mainmemory.read_u16_le(0x00028E)
	
		gui.drawBox(attack_left-camx,attack_up-camy,attack_right-camx, attack_down-camy,"green")
	end
	
	if(mainmemory.read_u8(0x000E3E)~=0x00) then
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"blue")
	else
		gui.drawBox(hitbox_left-camx,hitbox_up-camy,hitbox_right-camx, hitbox_down-camy,"white")
	end
	
	
	
	
	for i = 2,0x0F,1 do
		
		if(mainmemory.read_u8(0x000e00+(i*0x20))>0) then
		
		ID = mainmemory.read_u8(0x000e00+(i*0x20))*4
		
		NEWDC = mainmemory.read_u8(0x000e1c+(i*0x20))*4
		
		pos_x = mainmemory.read_u16_le(0x000e10+(i*0x20))
		pos_y = mainmemory.read_u16_le(0x000e12+(i*0x20))
		
		offset_x = memory.read_u8(0x038A00+NEWDC)
		length_x = memory.read_u8(0x038A01+NEWDC)
		offset_y = memory.read_u8(0x038A02+NEWDC)
		length_y = memory.read_u8(0x038A03+NEWDC)
		

		drop_offset = memory.read_u8(0x0091eb+ID)
		if(drop_offset >=0x04) then
			if(diff==0x00) then
				drop_sub = bit.rshift(drop_offset,1)
			elseif(diff==0x10) then
				drop_sub = drop_offset + bit.rshift(drop_offset,2)
			else
				drop_sub = drop_offset
			end
		else
			drop_sub = drop_offset
		end
		
		gui.drawPixel(pos_x-camx, pos_y-camy,"red")
		
		if(mainmemory.read_u8(0x000E0C+(i*0x20))==0) then
			mycolor = "red"
		else
			mycolor = "white"
		end
		
		if(bit.band(mainmemory.read_u8(0x000e07+(i*0x20)),0x40)~=0) then
			gui.drawBox(pos_x-camx+offset_x-length_x,pos_y-camy-offset_y,pos_x-camx+offset_x, pos_y-camy-offset_y+length_y,mycolor)
		else 
			gui.drawBox(pos_x-camx-offset_x+length_x,pos_y-camy-offset_y,pos_x-camx-offset_x, pos_y-camy-offset_y+length_y,mycolor)
		end
		
		damage = mainmemory.read_u8(0x000e14+(i*0x20))
		max_hp = mainmemory.read_u8(0x000e15+(i*0x20))
		
		drop_index = mainmemory.read_u8(0x000e17+(i*0x20))
		drop_count = mainmemory.read_u8(0x000d00+drop_index)
		drop_type = memory.read_u8(0x0091ec+ID)
		
		if(drop_type == 0x05) then
			if(mainmemory.read_u8(0x000e19)==0x01) then
				drop_color = "red" -- Bomb
			else
				drop_color = "green" -- Sword Up
			end
		elseif(drop_type == 0x01) then -- HP Up
			if(mainmemory.read_u8(0x000e19)==0x01) then
				drop_color = "purple" -- HP Up
			else
				drop_color = "green" -- Sword Up
			end
		elseif(drop_type == 0x03) then -- Big HP Up
			if(mainmemory.read_u8(0x000e19)==0x01) then
				drop_color = "blue" -- Big HP Up
			else
				drop_color = "green" -- Sword Up
			end
		elseif(drop_type == 0x07) then -- HP or bomb?
			if(bit.band(mainmemory.read_u8(0x00005c),0x01)==0) then
				drop_color = "purple" -- HP Up
			else
				drop_color = "red" -- Bomb
			end
		else
			drop_color = "white"
		end
		
		
		if(max_hp-damage < 128 and max_hp-damage ~= 0) then

			gui.drawText(pos_x-camx, pos_y-camy,string.format("%d",max_hp-damage))
			
		end
		
		if(drop_sub<0x20>0) then
			if(((drop_sub-(drop_count))%drop_sub)~=0) then
				gui.drawText(pos_x-camx, pos_y-camy+10,string.format("%d",(drop_sub-(drop_count))%drop_sub),drop_color)
			else
				gui.drawText(pos_x-camx, pos_y-camy+10,string.format("%d",(drop_sub)),drop_color)
			end
		end
		
		end
	end
	
	for i = 0,0x0f,1 do --was 7
		--if(i<8>=0x0c) then
			ID = mainmemory.read_u8(0x000c00+(i*0x10))
			if(ID>0) then
			
				addr_offset = mainmemory.read_u8(0x000c0e+(i*0x10))*8
			
				pos_x = mainmemory.read_u16_le(0x000c05+(i*0x10))
				pos_y = mainmemory.read_u16_le(0x000c07+(i*0x10))
			
				offset_x = memory.read_u8(0x009045+addr_offset)
				length_x = memory.read_u8(0x009047+addr_offset)
				offset_y = memory.read_u8(0x009049+addr_offset)
				length_y = memory.read_u8(0x00904B+addr_offset)
			
				gui.drawBox(pos_x-camx+offset_x,pos_y-camy+offset_y,pos_x-camx+offset_x+length_x, pos_y-camy+offset_y+length_y,"purple")
				
				--gui.drawText(pos_x-camx, pos_y-camy,string.format("%d",mainmemory.read_u8(0x000c01+(i*0x10))))

			end
		--end
	end
	
	emu.frameadvance()
end
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
This looks amazing! Unfortunately, I'm having a bit of trouble getting the script to run. It works for a few seconds before the console spits out an error and deactivates the script:
LuaInterface.LuaScriptException: (filepath)\Run Saber.lua:147: attempt to compare number with boolean
I know absolutely nothing about scripting, so I don't know if this is an error in the script itself or if it's just me having done something weird when copy-pasting. That being said, excellent job on the scripts and working out the difficulty changes and drop mechanics. I wasn't planning on re-doing my improvement run until TAStudio was fully implemented but this is making me change my mind...
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Player (37)
Joined: 2/16/2012
Posts: 282
Looking it over, I think somehow some of the comparators got screwed up in posting them on the site. The line it's complaining about is shown as: if(drop_sub<0x20>0) then which should be: if( drop_sub>0 and drop_sub<0x20) then I don't know why it changed in the course of posting. I'll put it on pastebin when I get home. A brief scan of the rest of the script seems like that should be the only issue. It happens again in a commented line, but that shouldn't matter. EDIT: Aha, it did it again! Yeah, it is interpreting some of it as HTML where I have stuff in carrot braces. Swapped order above should fix it. EDIT2: Pastebin of the code available here: http://pastebin.com/LSB8Jmjm
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Thank you, it's working beautifully now.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Hello, old friend. It's been a while. Link to video The main improvement over both the published run and my last improvement WIP is not changing the difficulty: The difficulty changes nothing that would be noticeable in the run, and in fact no one really knew the differences between each difficulty until recently since they're not even noticeable to experienced players. This saves about 2 seconds, but most of that is lost due to Bizhawk's more accurate loading times, leaving the improvement to only 53 frames upon landing in the first stage. Around 15 frames are gained, but 23 are lost, leaving the current improvement at 45 frames. There are two things to note: There's an extra enemy spawn compared to the Snes9x WIP which causes the bulk of the lost frames, and I unavoidably lose a frame every time I land, since the landing cancel has to be performed a frame later on Bizhawk. If I can get that enemy to cooperate and not spawn, then I'll have at most 6-7 gameplay frames over the Snes9x WIP due to all the other minor movement optimizations. I know, I'm just as confused as you are. This may become a group project depending on circumstances.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Site Admin, Skilled player (1254)
Joined: 4/17/2010
Posts: 11476
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
Omnigamer wrote:
Looking it over, I think somehow some of the comparators got screwed up in posting them on the site. The line it's complaining about is shown as: if(drop_sub<0x20>0) then which should be: if( drop_sub>0 and drop_sub<0x20) then I don't know why it changed in the course of posting. I'll put it on pastebin when I get home. A brief scan of the rest of the script seems like that should be the only issue. It happens again in a commented line, but that shouldn't matter. EDIT: Aha, it did it again! Yeah, it is interpreting some of it as HTML where I have stuff in carrot braces. Swapped order above should fix it. EDIT2: Pastebin of the code available here: http://pastebin.com/LSB8Jmjm
Might be too late and stuff, but disabling HTML code in the post always fixes this.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Alright, back to work on this. I couldn't work out enemy despawning (I doubt it's possible, unlike enemy spawning), so that extra enemy remains. Side effect of the difficulty change, I suppose. I'm currently optimizing the boss fight in Taj Base, and at the moment I've saved 10 frames over my previous improvement, which if I remember correctly was a 2 second improvement over the published run's boss fight. There's still more time that can come off of it, I'm sure, but it's really hard to optimize killing a boss that's offscreen for 90% of the fight. At least this is the most time-consuming part. The rest of the run should come more naturally after this fight. EDIT: Almost immediately after posting this, I saved 24 more frames on the fight. I should post more often! Optimizing this new strategy saved another 10 frames. Pretty sure this is about the best I can get this fight...
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Sorry about the relatively quick double-post. I encoded my progress so far, after getting a bit into Tong City: Link to video
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Editor, Experienced player (570)
Joined: 11/8/2010
Posts: 4036
The plane part was awesome! The published movie seems to have the same nice slashing to the music, but there's more of it here and the jumping off the very tips of the spinning plane makes this run a lot funnier and more surprising. Overall, the entertainment is better so far, and it looks "cleaner" technically too.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Link to video Through Tong City. I think I'm sick of this level after doing it twice in as many days. Some mild changes compared to the last video. Everything is intentional. You may notice a couple weird parts, but I can assure you they're intentionally done. I think that up to this point, the movie's around 200 frames faster than my last improvement? There's a lot of unavoidable time losses, too, so I probably saved around 4-5 seconds total. Sub-13 is a possibility at this point...
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Checking in! So I'm at the Stage 3 boss, or as I like to call it, the most boring section of the run. I'm beginning to think a few things at this point: * Not changing the difficulty was a bad decision, but not for the reason I was expecting * I kinda hate TASing this game now The difficulty change had the unexpected side effect of screwing up enemy positions when compared to the published run or my old improvement. In most cases, I'm losing time due to extra enemy spawns or enemies being in my way for longer, but in other cases I'm actually gaining a lot of that time back because of enemies not spawning in some cases, or enemies not getting in my way at all. It's like a see-saw where I get dunked in lava on the way down, but hugged by angels on the way back up. Jodvalley has been a hassle from the very beginning, but at the same time it's probably the biggest hassle I'll face in the run. It's probably the worst stage when it comes to unavoidable time losses: 76 frames in my case, mainly due to the slower dinosaurs constantly getting in the way. However, some of those frames are made up because of slower dinosaurs allowing for better ways to deal with them. This is only over the improvement run, I'm not losing nearly that much time compared to the published run, if I'm even losing time at all. Even with that loss, I'm still saving time in Jodvalley. Not very much, but I'm still improving my old improvement by a decently significant margin. At the first hit on the boss, I'm 34 frames ahead of the improvement in this stage. I'm not sure if I can save more time, but I know I can't lose any at this point. ...Now that I've said that, I'm gonna lose a few frames. The curse has taken effect. Also, I lost 4 frames, so I absolutely did curse myself. Well. Since I found my super old notes file/submission text in progress for the improvement run, I can give some rough frame savings over the published run. Hooray! The file was last edited in 2013 and I'm not sure where I was comparing framecounts, but this should still give an idea as to how much time is being saved. TITLES + TAJ BASE * Old improvement is 285 frames faster than published run * This run is 101 frames faster than old improvement * Therefore, this section is about 386 frames faster than the published run TONG CITY * Old improvement is 343 frames faster than published run * This run is 108 frames faster than old improvement * Therefore, this stage is about 451 frames faster than the published run JODVALLEY * Old improvement is 234 frames faster than published run * This run is 30 frames faster than old improvement * Therefore, this stage is about 264 frames faster than the published run GREY FAC *Old improvement (up to where it ended) is 110 frames faster than published run * This run is 62 frames faster than old improvement (up to where it ended) * Therefore, this stage is currently 172 frames faster than published run TOTAL: 1272 frames (~21.2 seconds) over the published run. As for Bruford, I'll have to directly compare to the published run. There's a significant improvement to the first miniboss that's going to save a second or two, and the final bosses can be heavily optimized as well. My time estimate is around 13:10 now. Hopefully under, and given the quality of the published run, that's actually pretty likely.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Player (37)
Joined: 2/16/2012
Posts: 282
For Jodvalley boss, I'm not sure if it makes sense compared to your strategy, but I believe for real-time there was some benefit in using a bomb at some point in the attack cycle. IIRC it saved some amount of time, but depends on whether you've found a better strategy than "repeatedly screw attack into boss."
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
I gave it a quick test and using a bomb ends up slower in the TAS by about 90 frames. The jumping is short enough in the TAS for normal attacks to be faster.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
Samsara
She/They
Senior Judge, Site Admin, Expert player (2239)
Joined: 11/13/2006
Posts: 2822
Location: Northern California
Encoding final file... Expect this slaughtering of my published run on the workbench within an hour or two.
TASvideos Admin and acting Senior Judge 💙 Currently unable to dedicate a lot of time to the site, taking care of family. Now infrequently posting on Bluesky
warmCabin wrote:
You shouldn't need a degree in computer science to get into this hobby.
BigBoct
He/Him
Editor, Former player
Joined: 8/9/2007
Posts: 1692
Location: Tiffin/Republic, OH
Looking forward to it. Been watching the WIPs off and on, and I'm not sure whether to be impressed at all the time saved from my original run, or embarrassed that I apparently did that bad a job. -_-
Previous Name: boct1584
Player (37)
Joined: 2/16/2012
Posts: 282
I posted in the workshop thread, but just putting here too: Difficulty also affects the final boss's invulnerability cycles. On lower difficulties, the core spends more time vulnerable. In the encoded TAS it looks like you still use the Hard difficulty strat, which can only hit the boss once per cycle. Normal should be able to hit 2-3 times per cycle. Not sure how much time removing those extra swipes saves though. EDIT: Samsara replied in the submission thread, but the gist is that the invulnerability period after hitting the boss negates any benefit from trying to get more hits in a cycle.