[FE8] FreeMovement Rework

The moving speed can only set to be 10H,20H,40H and 100H,maybe the reason of the moving problem may be course of this?
If possiable, I think maybe a gif(mGBA can make it) to be uploaded could explain this problem more clearly?

I set it to 20H already.
image

You can see how I tap directions, but unless I hold them, they usually get dropped.

Most games use a buffer so that if you tap a button, it will do that action when it gets to that part of the cycle. (Eg. the action might only happen every 5 frames, but it is always checking for user input and saves the latest user input until the 5 frame window is up.)

Does that clarify things?

2 Likes

Got it。

This issue may not easy to solve,However。

If you comment out“_6C_CALL_ROUTINE(pFMU_HandleSave|1)” in proc-defination,I believe you will get a smoother operation。This is just the cost for saving the game(And that’s just what i said “wasting too much time and resources” before)。

In origin,Sme insert pulse in moving(just as fig.5 at the start of this thread ). I fixed MU6C so that the moving anime can output smoothly,but as long as you wanna save game automatically,you cannot avoid a little bit game lagging。And that’s just why I set such a low speed.

Anyway,I think there should be some way to optimize this issue。Save button press in buffer (here we just need to put it into 6C state) may be a effective way on that and I will try it。But for now,my advice is speed limitation.

Edit1: Here come up with another way: make a longer timer。
If we judge Timer%0xA,rather than Timer%0x5,I think this problem can be solved a little.

Edit2: Hold on the directional button,dont release it. Then you will find it moving more smoothly。

2 Likes

Besides, it’s quite a interesting hack for print button press on screen, but I failed to find it. Would you like to share a link?

https://code.google.com/archive/p/vba-rerecording/

Got it!

Something I just noticed - pressing Start can flash the screen.
vQZlJAVzR0

It won’t let me make the files due to this error, so I can’t test it with a different timer.
image

But as you say, commenting out the saving function makes it feel a lot smoother.
6dFwUOtM6H

1 Like

I have just post the new verson on top of thread, you can have a look.
but It’s too late now, and I can’t stay up anymore. So here is some simple instractions you may refer:

  1. You can make modular actions for each button in HookList.event (functions are at “src/FreeMU_ButtonPress.c”).
  2. you can set Delaytime/FreeMU_Flag by yourself at “/FreeMovement.event”.
  3. Traps have worked in some level, but it need to be set by yourself. I have made a template in “Examples/_TrapExample.event”.
1 Like

I have no idea on flashing, which I have not been encountered yet.
On that error for compling C, maybe you should replace “struct FMUProc*” to “struct FMUProc* proc” at line 43. That may be my writing mistake.

1 Like

Updated!
Although it is not currently possible to directly call the effect function of TrapRework, but now there is some way to interact with traps! See the start of thread!

1 Like

Now you can set trap events by EventCaller
image1

3 Likes

Hello. I created an explanation on how to use Free Movement in FEBuilder, it was already posted in the Discord channel but I think it’d be useful to have it here as well.

To insert the Free Movement hack, download the file in FreeMovement Rework - Modular version updated with tutorials! , and extract it

In FEBuilder, go to Run ->Insert Events via Event Assembler, click on Select File and select the FreeMovement.event file, then click Load Script

In the same folder of FreeMovement.event, FEBuilder will create FreeMovement.sym, open this file

Search for EnableFreeMovementASMC=$ in that file, there will be an address after it, in my case it’s B88871, but use whatever address appears for you instead

In the start event of the chapter that you want to enable free movement, go into the event commands and search for ASMC, then select it

Input the address found in FreeMovement.sym (in my case, B88871) in the “assembler function” field, then press insert. To disable free movement, do the same but use the address listed for DisableFreeMovementASMC=$ instead

7 Likes

I have uploaded a version with Expanded-Modular-Save on Git, which can be got here

4 Likes

What benefit does using this version have? Were there issues with saving data without the expanded modular save before?

1 Like

not any new features. just someone told me that he have no idea on how to modify FreeMU to ExpModularSave, so I add this.
For skilled hackers,it is better to write save/load function and fit to Exp Modular Save by oneself.

1 Like

I think I have got ideas on solve laggering when try saving games. Maybe we can call for saving game by parallel worker with function:

static void (*StartParallerWorkerWithParam)( void* func, int param, ProcPtr) = (const void*) 0x80ACE21;

Later I may have a try.

FreeMovementControlProc is not being properly initialized.

Because procs are placed in memory dynamically, there is no guarantee that the proc previously occupying the same space didn’t leave behind data. in pFMU_OnInit, it is assumed that FMUnit is initialized to 0. If a proc has previously placed a value here, then the unit pointer used ends up being junk data:

Solution: Add initialization to pFMU_InitTimer

void pFMU_InitTimer(struct FMUProc* proc){
	proc->uTimer = 0;
	proc->FMUnit = 0; //fix
	return;
}

This runs once prior to pFMU_OnInit, which means the field is always initialized to 0 as expected

5 Likes

I endure the quirks of free roam so everyone else doesn’t have to.

got it

1 Like

pFMU_InitTimer seems to run when changing units, meaning the currently controlled unit can’t change beyond the first in the unit array. Instead I initialized proc->FMUnit to 0 in a new function in the first block of the proc code. So far so good.

	FreeMovementControlProc:
	_6C_SET_NAME(FreeMovementProcName)
	_6C_SET_MARK(2)
	_6C_YIELD
    _6C_CALL_ROUTINE(pFMU_InitFMUnit)
	_6C_CALL_ROUTINE($801C895) // ClearActionAndSave
    .
    .
    .

Really thought I was going mad with this one. The blue menu background is drawn on BG1.

  • The tiles are in VRAM.
  • Priority-wise it made sense, BG1 should be drawn over BG3.
  • Window0 was enabled, but disabling it still didn’t get BG1 to show.
  • No HBlankHandlers are active, LCDIOBuffer should reflect memory block 4 exactly.
  • Everything adds up, why doesn’t BG1 show!?
    Turns out BG1 was blending with BG3, so much so that BG1 was invisible. Suddenly feel nostalgic; Somehow I always overlook blending as an option when it comes to these display errors. Anywho, the issue can be solved by clearing windows and blend/BLDY effects before starting the menu.
bool FMU_OnButton_StartMenu(FMUProc* proc){
    gLCDIOBuffer.dispControl.enableWin0 = 0;
    gLCDIOBuffer.dispControl.enableWin1 = 0;
    gLCDIOBuffer.dispControl.enableObjWin = 0;
    gLCDIOBuffer.blendControl.effect = 0;
	StartMenuAdjusted(&FreeMovementLMenu,0,0,0);
	return 1;
}
4 Likes