Damage knockback woes, losing tile alignment

Ask and answer questions about making games and related topics. Unrelated topics go in that other forum.

Moderators: marionline, SDHawk

User avatar
Foxley
Metal Slime
Posts: 832
Joined: Sat Nov 09, 2013 5:54 pm

Damage knockback woes, losing tile alignment

Post by Foxley »

So I have a mostly-ish working system for having player and NPC/enemy knockback when damage is taken. The knockback distance is 10 tick/frame counts of 4 pixels, or 40 pixels, or two tiles. I've tried to remedy this by making the script set the player or NPC location to an X/Y coordinate that matches up with the tilemap, but it doesn't seem to help very much and sometimes results in victims being knocked through solid walls.

The scripts for calculating frames is really long and spread over multiple script blocks, so I'll just do the main script.

Code: Select all

## NPC Extra data 0: Enemy health
## NPC Extra data 1: Enemy hurtframes
## NPC Extra data 2: Knockback direction
## NPC Slice Extra 0: Attack cooldown
## NPC Slice Extra 1: Attack animation frames
## NPC Slice Extra 2: Invincibility frames
## NPC Script Argument: Attack power - read NPC (ref, NPCstat:script argument)

script, check hit frames, begin
	variable (ref, next, killed, power)
	ref := next npc reference

	while (ref) do (
		next := next npc reference(ref)
		power := read NPC (ref, NPCstat:script argument)
		
		if &#40;player iframes < 1 && slice collide &#40;get npc slice&#40;ref&#41;, player hitbox&#41;&#41; then &#40;
			if &#40;power > 0&#41; then &#40;damage player&#40;ref&#41;&#41;
		&#41;
		if &#40;player attacking && slice collide &#40;get npc slice&#40;ref&#41;, sword&#41;&#41; then &#40;
			if &#40;get slice extra&#40;get npc slice&#40;ref&#41;, extra 2&#41; < 1 && power > 0&#41; then &#40;
				killed &#58;= damage enemy &#40;ref&#41;
			&#41;
		&#41;
		if &#40;not&#40;killed&#41; && npc extra &#40;ref, extra 1&#41; > 0&#41; then &#40;
			switch &#40;npc extra &#40;ref, extra 2&#41;&#41; do &#40;
				case &#40;north&#41; do &#40;
					if &#40;check npc wall &#40;ref, north&#41;&#41; then &#40;
						set npc extra &#40;ref, extra 1, 0&#41;
					&#41; else &#40;put npc &#40;ref, npc pixel x&#40;ref&#41;, npc pixel y&#40;ref&#41; --5&#41;&#41;
				&#41;
				case &#40;east&#41; do &#40;
					if &#40;check npc wall &#40;ref, east&#41;&#41; then &#40;
						set npc extra &#40;ref, extra 1, 0&#41;
					&#41; else &#40;put npc &#40;ref, npc pixel x&#40;ref&#41; +5, npc pixel y&#40;ref&#41;&#41;&#41;
				&#41;
				case &#40;south&#41; do &#40;
					if &#40;check npc wall &#40;ref, south&#41;&#41; then &#40;
						set npc extra &#40;ref, extra 1, 0&#41;
					&#41; else &#40;put npc &#40;ref, npc pixel x&#40;ref&#41;, npc pixel y&#40;ref&#41; +5&#41;&#41;
				&#41;
				case &#40;west&#41; do &#40;
					if &#40;check npc wall &#40;ref, west&#41;&#41; then &#40;
						set npc extra &#40;ref, extra 1, 0&#41;
					&#41; else &#40;put npc &#40;ref, npc pixel x&#40;ref&#41; --5, npc pixel y&#40;ref&#41;&#41;&#41;
				&#41;
			&#41;
			set npc extra &#40;ref, extra 1, npc extra &#40;ref, extra 1&#41; -- 1&#41;
			if &#40;npc extra&#40;ref, extra 1&#41; < 1&#41; then &#40;
				set NPC moves &#40;ref, true&#41;
			&#41;
		&#41;
		if &#40;not&#40;killed&#41; && get slice extra&#40;get npc slice&#40;ref&#41;, extra 2&#41; > 0&#41; then &#40;
			update enemy flash &#40;ref&#41;
		&#41;
		ref &#58;= next
	&#41;
	if &#40;player hurtframe > 0&#41; then &#40;
		switch &#40;player hurtdir&#41; do &#40;
			case &#40;north&#41; do &#40;
				if &#40;check hero wall &#40;me, north&#41;&#41; then &#40;
					player hurtframe &#58;= 0
					put hero &#40;me, hero x &#40;me&#41; * 20, hero y &#40;me&#41; * 20&#41;
				&#41;
				
				else &#40;put hero &#40;me, hero pixel x &#40;me&#41;, hero pixel y &#40;me&#41; --4&#41;&#41;
			&#41;
			case &#40;east&#41; do &#40;
				if &#40;check hero wall &#40;me, east&#41;&#41; then &#40;
					player hurtframe &#58;= 0
					put hero &#40;me, hero x &#40;me&#41; * 20, hero y &#40;me&#41; * 20&#41;
				&#41;
				else &#40;put hero &#40;me, hero pixel x &#40;me&#41; +4, hero pixel y &#40;me&#41;&#41;&#41;
			&#41;
			case &#40;south&#41; do &#40;
				if &#40;check hero wall &#40;me, south&#41;&#41; then &#40;
					player hurtframe &#58;= 0
					put hero &#40;me, hero x &#40;me&#41; * 20, hero y &#40;me&#41; * 20&#41;
				&#41;
				else &#40;put hero &#40;me, hero pixel x &#40;me&#41;, hero pixel y &#40;me&#41; +4&#41;&#41;
			&#41;
			case &#40;west&#41; do &#40;
				if &#40;check hero wall &#40;me, west&#41;&#41; then &#40;
					player hurtframe &#58;= 0
					put hero &#40;me, hero x &#40;me&#41; * 20, hero y &#40;me&#41; * 20&#41;
				&#41;
				else &#40;put hero &#40;me, hero pixel x &#40;me&#41; --4, hero pixel y &#40;me&#41;&#41;&#41;
			&#41;
		&#41;
		decrement &#40;player hurtframe&#41;
		if &#40;player hurtframe < 1&#41; then &#40;
			resume player
		&#41;
	&#41;
	if &#40;player iframes > 0&#41; then &#40;update player flash&#41;
end
If you need to look at other scripts in my .HSS file, just let me know and I'll Dropbox it. If I don't get this bug fixed the game will never be releasable for the multicart project, so I'd really appreciate advice and assistance getting this fixed.
User avatar
Foxley
Metal Slime
Posts: 832
Joined: Sat Nov 09, 2013 5:54 pm

Post by Foxley »

Something I've noticed with the engine, and part of why this is wonky, is that a player or NPC will get -1 to its X or Y coordinate on the tilemap if it's moved even 1 pixel to the west or north. So if an enemy is standing 2 tiles to the right of a wall, and gets attacked and knocked westward, it will get knocked back a single frame and then stop. This doesn't happen if the knockback is being done south or east, those actually function pretty normally.
User avatar
MorpheusKitami
Slime Knight
Posts: 218
Joined: Wed Nov 30, 2016 8:23 pm
Location: Somewhere in America

Post by MorpheusKitami »

How about using zones to extend the no knockback areas?
User avatar
Spoonweaver
Liquid Metal King Slime
Posts: 6461
Joined: Mon Dec 08, 2008 7:07 am
Contact:

Post by Spoonweaver »

doing pixel based effects mixed with tilebased movement is not a good idea.
I suggest calculating your actual knockback position based solely on tiles and simply place the character into the correct tile based on that after the pixel based graphical effect is over.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

I take it that movement is pixel based? Despite what you said, you've got 5pixels/tick knockback for npcs, and 4pixels/tick for heroes.
Foxley wrote:Something I've noticed with the engine, and part of why this is wonky, is that a player or NPC will get -1 to its X or Y coordinate on the tilemap if it's moved even 1 pixel to the west or north. So if an enemy is standing 2 tiles to the right of a wall, and gets attacked and knocked westward, it will get knocked back a single frame and then stop. This doesn't happen if the knockback is being done south or east, those actually function pretty normally.
Yes, tile position is the tile that the top-left corner of the NPC/hero is on. To fix that, just replace "hero x(who)" with "(hero pixel x(who) + 10) / 20", etc.

The built-in tilebased movement (including "check hero/npc walls") also take the tile position as the topleft corner. Assuming that you're using pixel based movement, you need to ditch check hero/npc walls and check manually, because the hero/npc might overlap multiple tiles, and it's not possible to use those commands unless you create a temp npc/temporarily move the npc to the right position, call the command, and then delete it/move it back.
For collision detection, just take some scripts from a side scroller. SS101 (the can fall/rise/left/right scripts, but beware that you need to divide the values by 10) is a good start. See here.

Hmm, this really should be built into the engine...

A bug: in your while loop, killed might get set to true, and then it'll still be true for the next npc processed. So put a "killed := false" at the top.

A tip: I like to write something like "defineconstant(extra 1, extra: health)" to make the scripts much more readable. James does it even better, and will create scripts like "get enemy health(who)" and "set enemy health(who, amount)" that just call "set/get npc extra".

Edit: Foxley, the blame for this is on you. I'm working on a script command to do pixel-perfect wallmap collision detection.
Last edited by TMC on Fri Jan 20, 2017 6:58 am, edited 3 times in total.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Yeah, I know what you're going to say. "But TMC, my movement is tilebased! Whatever gave you the preposterous idea otherwise?"

Well, in that case, consider the case in which knockback is exactly 20 pixels and the target starts out tile-aligned. You should only call check npc/hero walls once, at the beginning, not each tick, otherwise the later calls will give wrong results. This can't result in the target getting knocked through a wall they shouldn't be able to, though. If knockback is 40 tiles, you should check it twice.

The hard case is when the target isn't tile-aligned to begin with, due to being mid step. How exactly would you expect to handle that? They'll be mis-aligned after the knockback too. During the knockback the wall checking will be wrong.
User avatar
Foxley
Metal Slime
Posts: 832
Joined: Sat Nov 09, 2013 5:54 pm

Post by Foxley »

TMC wrote:I take it that movement is pixel based? Despite what you said, you've got 5pixels/tick knockback for npcs, and 4pixels/tick for heroes.
There's a very good explanation for that: I suck. I think I was testing things in the knockback scripts several weeks ago and forgot to put them back to normal, somehow didn't even realize it.
Yes, tile position is the tile that the top-left corner of the NPC/hero is on. To fix that, just replace "hero x(who)" with "(hero pixel x(who) + 10) / 20", etc.
Going to try this while on break if I can.
A bug: in your while loop, killed might get set to true, and then it'll still be true for the next npc processed. So put a "killed := false" at the top.
I can see how that would look confusing, because it is. What I'm doing there is calling the damage enemy script, which subtracts health from the enemy in the amount of the hero's attack power, and returns true to the "killed" variable in the bigger script if the enemy's health just got put below 1. If it doesn't, it will instead apply knockback frames and flashing/invincibility frames to the enemy.
A tip: I like to write something like "defineconstant(extra 1, extra: health)" to make the scripts much more readable. James does it even better, and will create scripts like "get enemy health(who)" and "set enemy health(who, amount)" that just call "set/get npc extra".
That's not a bad idea, it'd make the huger scripts look nicer. I didn't know you could define things that aren't straight up integers as constants, actually.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Foxley wrote:I can see how that would look confusing, because it is. What I'm doing there is calling the damage enemy script, which subtracts health from the enemy in the amount of the hero's attack power, and returns true to the "killed" variable in the bigger script if the enemy's health just got put below 1. If it doesn't, it will instead apply knockback frames and flashing/invincibility frames to the enemy.
I got all of that. But you didn't understand what the problem is; reread what I wrote. If an NPC is killed, knockback and invisibility flashing for all following NPCs won't happen.

Only integers and constants can be used as the values of constants. (It was too hard to allow constant expressions.)
User avatar
Foxley
Metal Slime
Posts: 832
Joined: Sat Nov 09, 2013 5:54 pm

Post by Foxley »

Right now I'm thinking of just eliminating knockback as a game feature and just setting enemy movement to 0 while they're flashing their i-frames. I've already sunk way too much time on this one single thing and all it's doing is making me frustrated and wanting to avoid working on the actual game.

I've determined that tile based movement (which I do want to keep, because I can use built-in NPC behavior and thus actually finish the game in another month rather than another year) and pixel based knockback are not at all compatible because even if I do a "set npc position" or "set hero position" after the knockback in order to realign to the grid, it doesn't actually really work. It works sometimes, but that's not good enough. And working with commands that use tile X/Y and trying to work in pixel X/Y logic into those commands is unpredictable and way too hard to understand, e.g. read pass block. I did understand the concept of doing +10 to the hero or NPC pixel position to get the middle of the sprite and not the top left corner, but I don't see how I can make actual use of it using the commands that are available.

I'm just going to quickly implement the 0 movement speed thing right now, and if I have time to kill before March I'll give this whole thing another try. Thanks for the help.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Actually, looking more into it (but not doing any experiments), I think that the NPC shouldn't end up misaligned as long as you allow its original movement (stepping between two tiles) to continue without trying to realign it, and you use "set NPC moves(npc, false)" to make sure it doesn't start a new step mid-knockback. So the NPC movement is its original movement plus the knockback, meaning it could move diagonally. But it looks to me like your script should already do that, so I guess I'm missing something if it gets misaligned.

I could have a look at your game, but I don't have time the next few days. Definitely don't waste too much time on this.

Oh, and I did implement that new command for easy wall checking but I haven't finished and committed it yet.
Last edited by TMC on Sun Jan 22, 2017 3:19 pm, edited 1 time in total.
User avatar
Foxley
Metal Slime
Posts: 832
Joined: Sat Nov 09, 2013 5:54 pm

Post by Foxley »

Cool, thanks TMC. I appreciate your interest. The copy of my game I uploaded about a month ago should have the exact same code:

https://dl.dropboxusercontent.com/s/unl ... tion37.zip

Let me know if you have any questions.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Ah, cool, I hadn't tried out your demo before. Nice, this definitely the best recreation of the Zelda mechanics on the OHR that I've seen. Looks like you definitely have a lot of other things to be working on aside from knockback!

I thought some more and realised that knock parallel to the direction of an already-moving target needs to be handled differently to a perpendicular or non-moving target: if knocked against a wall, the existing movement should be cancelled. When I have time I'll try implementing it.
Playing with the demo though, it's clear that when misalignment happens it's almost impossible to understand why. Also, you can get knocked against the edge of the screen and become totally stuck. That's another edge case that needs special handling.
But now I worry that knockback could also interfere with other stuff, like tools for walking on water.
Last edited by TMC on Mon Jan 23, 2017 3:41 pm, edited 1 time in total.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

OK, I implemented it and it seems to work!
I finally finished the implementation of the script command, check wall collision x/y that I mentioned, and used that. (Note: there was a bug in the command, so wait for the next nightly build, revision 8352+ in svninfo.txt)

Here are the knockback scripts:

Code: Select all

script, north or south, dir, begin
	return &#40;dir == north || dir == south&#41;
end
script, knockback npc, ref, dir, xpixels, ypixels, begin
	variable&#40;xgo, ygo&#41;
	xgo &#58;= check wall collision x &#40;npc pixel x&#40;ref&#41;, npc pixel y&#40;ref&#41;, 20, 20, xpixels, ypixels&#41;
	ygo &#58;= check wall collision y &#40;npc pixel x&#40;ref&#41;, npc pixel y&#40;ref&#41;, 20, 20, xpixels, ypixels&#41;
	if &#40;xgo <> xpixels || ygo <> ypixels&#41; then &#40;
		# Hit a wall
		set npc extra &#40;ref, extra 1, 0&#41;  # End knockback
		# If knockback direction is perpendicular to the npc movement
		# direction, allow the npc to complete its step, because it can keep
		# moving forward, and realign itself.
		# Otherwise, we just forcifully aligned the npc by slamming it into
		# a wall, so stop it
		if &#40;north or south&#40;dir&#41; == north or south&#40;npc direction&#40;ref&#41;&#41;&#41; then &#40;
			# Walking 0 tiles cancels existing movement in that direction
			walk npc&#40;ref, north, 0&#41;
			walk npc&#40;ref, east, 0&#41;
		&#41;
	&#41;
	put npc &#40;ref, npc pixel x&#40;ref&#41; + xgo, npc pixel y&#40;ref&#41; + ygo&#41;
end

script, knockback player, dir, xpixels, ypixels, begin
	variable&#40;xgo, ygo&#41;
	xgo &#58;= check wall collision x &#40;hero pixel x, hero pixel y, 20, 20, xpixels, ypixels&#41;
	ygo &#58;= check wall collision y &#40;hero pixel x, hero pixel y, 20, 20, xpixels, ypixels&#41;
	if &#40;xgo <> xpixels || ygo <> ypixels&#41; then &#40;
		# Hit a wall
		player hurtframe &#58;= 0 # End knockback
		if &#40;north or south&#40;dir&#41; == north or south&#40;hero direction&#41;&#41; then &#40;
			walk hero&#40;me, north, 0&#41;
			walk hero&#40;me, east, 0&#41;
		&#41;
	&#41;
	put hero &#40;me, hero pixel x + xgo, hero pixel y + ygo&#41;
end

script, check hit frames, begin
	variable &#40;ref, next, killed, power&#41;
	ref &#58;= next npc reference

	while &#40;ref&#41; do &#40;
		next &#58;= next npc reference&#40;ref&#41;
		power &#58;= read NPC &#40;ref, NPCstat&#58;script argument&#41;
		killed &#58;= false
		
		if &#40;player iframes < 1 && slice collide &#40;get npc slice&#40;ref&#41;, player hitbox&#41;&#41; then &#40;
			if &#40;power > 0&#41; then &#40;damage player&#40;ref&#41;&#41;
		&#41;
		if &#40;player attacking && slice collide &#40;get npc slice&#40;ref&#41;, sword&#41;&#41; then &#40;
			if &#40;get slice extra&#40;get npc slice&#40;ref&#41;, extra 2&#41; < 1 && power > 0&#41; then &#40;
				killed &#58;= damage enemy &#40;ref&#41;
			&#41;
		&#41;
		if &#40;not&#40;killed&#41; && npc extra &#40;ref, extra 1&#41; > 0&#41; then &#40;
			switch &#40;npc extra &#40;ref, extra 2&#41;&#41; do &#40;
				case &#40;north&#41;
					knockback npc &#40;ref, north, 0, -5&#41;
				case &#40;east&#41;
					knockback npc &#40;ref, east,  5, 0&#41;
				case &#40;south&#41;
					knockback npc &#40;ref, south, 0, 5&#41;
				case &#40;west&#41;
					knockback npc &#40;ref, west, -5, 0&#41;
			&#41;
			set npc extra &#40;ref, extra 1, npc extra &#40;ref, extra 1&#41; -- 1&#41;
			if &#40;npc extra&#40;ref, extra 1&#41; <= 0&#41; then &#40;
				set NPC moves &#40;ref, true&#41;
			&#41;
		&#41;
		if &#40;not&#40;killed&#41; && get slice extra&#40;get npc slice&#40;ref&#41;, extra 2&#41; > 0&#41; then &#40;
			update enemy flash &#40;ref&#41;
		&#41;
		ref &#58;= next
	&#41;
	if &#40;player hurtframe > 0&#41; then &#40;
		switch &#40;player hurtdir&#41; do &#40;
			case &#40;north&#41;
				knockback player &#40;north, 0, -4&#41;
			case &#40;east&#41;
				knockback player &#40;east,  4, 0&#41;
			case &#40;south&#41;
				knockback player &#40;south, 0, 4&#41;
			case &#40;west&#41;
				knockback player &#40;west, -4, 0&#41;
		&#41;
		decrement &#40;player hurtframe&#41;
		if &#40;player hurtframe <= 0&#41; then &#40;
			resume player
		&#41;
	&#41;
	if &#40;player iframes > 0&#41; then &#40;update player flash&#41;
end
(PS: I see that tabs get converted to spaces. Hit the 'quote' button to access the scripts with the original tabs.)

Just a combination of the new wallchecking commands, and the tricky movement cancellation rule.

However, when the player got knocked to the edge of the screen they got stuck. To fix that, I added walls around the edge of every screen, and suspend hero walls during the 'scroll' script. That way the wall collision prevents problems. I added the walls with a script instead of editing the map:

Code: Select all

# Create a rectangle of walls at the edges of the current screen
script, create walls around screen, begin
	variable &#40;x, y, area x, area y&#41;
	area x &#58;= camera pixel x / 20
	area y &#58;= camera pixel y / 20 + 2
	for &#40;x, area x, area x + 15&#41; do &#40;
		write passblock&#40;x, area y, &#40;read passblock&#40;x, area y&#41;, or, northwall&#41;&#41;
		write passblock&#40;x, area y + 7, &#40;read passblock&#40;x, area y + 7&#41;, or, southwall&#41;&#41;
	&#41;
	for &#40;y, area y, area y + 7&#41; do &#40;
		write passblock&#40;area x, y, &#40;read passblock&#40;area x, y&#41;, or, westwall&#41;&#41;
		write passblock&#40;area x + 15, y, &#40;read passblock&#40;area x + 15, y&#41;, or, eastwall&#41;&#41;
	&#41;
end

script, scroll, dir, begin
	player control &#58;= false
	suspend player
	switch &#40;dir&#41; do &#40;
		case &#40;up&#41; do &#40;
			pan camera &#40;dir, 8, 5&#41;
			decrement &#40;room y&#41;
		&#41; case &#40;right&#41; do &#40;
			pan camera &#40;dir, 16, 8&#41;
			increment &#40;room x&#41;
		&#41; case &#40;down&#41; do &#40;
			pan camera &#40;dir, 8, 5&#41;
			increment &#40;room y&#41;
		&#41; case &#40;left&#41; do &#40;
			pan camera &#40;dir, 16, 8&#41;
			decrement &#40;room x&#41;
		&#41;
	&#41;
	set hero speed &#40;me, 1&#41;
	suspend hero walls   # ADDED
	walk hero &#40;me, dir, 1&#41;
	wait for camera
	update map
	set hero speed &#40;me, 4&#41;
	resume hero walls   # ADDED
	resume player
	create walls around screen   # ADDED
	player control &#58;= true
	screen edge check
end
Plus call "create walls around screen" in the newgame and loadgame scripts. Or just from "update map".

Finally, I noticed that when the player walks into an enemy they don't get knocked in the correct direction (backwards), so I wrote a script to pick the direction regardless of who walks into whom:

Code: Select all

# Direction to push the player on touching npc 'ref'
script, calculate player hurtdir, ref, begin
	variable&#40;nx, ny, px, py&#41;
	nx &#58;= npc pixel x &#40;ref&#41;
	ny &#58;= npc pixel y &#40;ref&#41;
	px &#58;= hero pixel x
	py &#58;= hero pixel y
	if &#40;abs&#40;nx -- px&#41; > abs&#40;ny -- py&#41;&#41; then &#40;
		if &#40;nx > px&#41; then &#40;
			player hurtdir &#58;= west
		&#41; else &#40;
			player hurtdir &#58;= east
		&#41;
	&#41; else &#40;
		if &#40;ny > py&#41; then &#40;
			player hurtdir &#58;= north
		&#41; else &#40;
			player hurtdir &#58;= south
		&#41;
	&#41;
end
Call from within "damage player".

I notice that if you stand still, the enemies bounce off you without hurting you. There's no command to suspend npc-hero obstruction without also suspending npc-npc obstruction. But if you mark all NPCs as step-on-activated then they can walk into the player. However, then you can still stand on the tiles at the edges of the screen and they won't be able to touch you, so you need a different solution (or you could now just allow NPCs to walk to the screen edge, since the walls at the screen edge now achieve what I assume was the purpose of not letting them on the screen edge).

OK, have fun!
Last edited by TMC on Wed Jan 25, 2017 2:14 pm, edited 4 times in total.
User avatar
Foxley
Metal Slime
Posts: 832
Joined: Sat Nov 09, 2013 5:54 pm

Post by Foxley »

I'm pretty caught up in the middle of a busy workweek and too fatigued to get deep into Hamsterspeak code, but in short TMC: You've really gone above and beyond rushing out these new commands so quickly! I'm looking forward to playing with them soon and we'll see if I can get normal knockback behavior going.

Skimming through, a couple of things toward the end: I did make all enemy NPCs step-on, and to bound them away from the screen edges, I made an Enemy Movement zone that covers all the walkable parts of the map that aren't on the screen edges.
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

OK, let me know if you have trouble integrating it. I figured that since you've probably made changes in the past month, it would be better for me to just provide the parts that you should change.
Also, helping others with their multicart games in this way is a good substitute for me working on my own, especially since getting work done on the OHR is my real priority.
Post Reply