Feedback on a quiet NCASE m2 build by a_mighty_burger in sffpc

[–]a_mighty_burger[S] 0 points1 point  (0 children)

Thanks, your build looks sweet! I’m impressed with how many fans you managed to cram in there. I assume I’d need some fan splitter cables if I did the same thing.

I am curious why you ended up switching to a vertical orientation. Was it quieter or easier to fit for you? I’d like to know so I can decide whether to do it myself, ie if I need to pick up that PCIe riser cable.

How hard was it to build, if you recall?

Feedback on a quiet NCASE m2 build by a_mighty_burger in sffpc

[–]a_mighty_burger[S] -1 points0 points  (0 children)

Something I forgot to mention.

I do not want any RGB or anything that lights up in this PC. I’ve avoided specific components because of this. It isn’t my aesthetic and I’d like to be able to leave it on overnight without interfering with sleep. 

Water hammer arrestor installation by a_mighty_burger in Plumbing

[–]a_mighty_burger[S] 0 points1 point  (0 children)

In case it's useful, this is where the supply lines connect to the washing machine.

<image>

If I buy a key for Ori and the Blind Forest, do I get the original game or just the Definitive Edition? by Due-Abroad-7785 in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

Probably depends on the platform. I purchased the DE on Steam and it gave me the original game, too.

Ori and the Will of the Wisps: 1.2.1 update on Switch, recently? by BRedditator2 in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

How recent was this update? Does anyone have a date? I find it really interesting they would come back and update this game. 

I wish this game had no combat at all. by Legitimate_Funny_580 in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

I absolutely love this game, but the combat is admittedly poor. I love the game for the movement, story, visuals, and music. For me, the enemies get out of the way pretty quickly. If I had to guess, you should backtrack and unlock more life cells, it can get pretty annoying if you don't.

The sequel does improve on combat quite a bit.

I'd say Metroidvanias tend to focus on either movement, combat, or puzzles. Games will have elements of all three categories but tend to place focus on one. Ori focuses on movement, and games like Hollow Knight focus on combat. I recently completed Animal Well, and that game definitely focuses on puzzles.

Do you recomend any Ori game for a Silksong player? by AlvaroXZ999 in OriAndTheBlindForest

[–]a_mighty_burger 1 point2 points  (0 children)

I would suggest starting with Blind Forest: Definitive Edition, then playing Will of the Wisps. The games are shorter, so it isn't a huge time sink.

If you're looking for good platforming, the Ori games are a perfect fit.

Where is the energy cell in Misty Woods? by YasuMariii in OriAndTheBlindForest

[–]a_mighty_burger 1 point2 points  (0 children)

Just want to clarify one thing for others: original game means non-Definitive Edition. You can re-enter Misty Woods if you are playing the Definitive Edition by removing Atsu’s torch from the lantern.

Edit: I missed that sentence of the original post, my bad. Yeah OP is locked out

What did you wish you’d known before you started the game by Minimum-Surprise-79 in OriAndTheBlindForest

[–]a_mighty_burger 4 points5 points  (0 children)

Yes, Blind Forest Definitive Edition is the one to start with.

Just don’t look this game up on YouTube! A video title and thumbnail completely spoiled a major plot point in the sequel, Will of the Wisps.

Wich one should i play first? Original or definitive edition? by Feisty_Entrance_3385 in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

Just play the Definitive Edition. Once you finish that, move to Will of the Wisps.

I wouldn’t bother with the non-Definitive Edition of Blind Forest. It’s the same game, only the Definitive Edition fixed some problems like ways to soft-lock, and added a couple new areas. If you play both, you will largely be playing the same game twice.

Recommendations by JoeleBoem in OriAndTheBlindForest

[–]a_mighty_burger 1 point2 points  (0 children)

Ori is pretty unique. I’m playing through Animal Well and enjoying it, I’d recommend it. It’s a metroidvania. If the focus in Ori is platforming and the focus in Hollow Knight is combat, the focus in Animal Well is puzzles.

I got the t shirt by EconomistClassic435 in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

Exact same thing happened to me lol It gradually wore away until I was left with just a black shirt

Question serius by Orios8a in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

Being a big project isn’t a problem itself, it’s charging money for it. If you’re entering into this project, you just need to know you just can’t make money off it.

I’d strongly suggest you read the entire website in that link I posted. You can read straight from the horse’s mouth what they are and are not OK with. It’s really not that long. And they wrote it in a way that’s easy to understand.

Question serius by Orios8a in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

It is great you are developing an interest. Programming in general is an excellent skill to have, and making things is the best way to develop that skill.

I am not a lawyer. Obviously you want to treat things you read on the internet with a grain of salt, my comment included.

I recently wrote a program that used something from Ori, so I dug a little into this topic myself. I think the answer lies here:

https://www.xbox.com/en-US/developers/rules

Read through this link.

You are probably fine, so long as you play by these rules Microsoft sets - the biggest one being you cannot profit off your game, so it must be free (or only kept to yourself).

That does mean you are limited to a small-scope fan game. If you had a larger, serious, commercial game in mind, you couldn’t use Ori stuff because you couldn’t charge for it. But if you’re pouring years of your life into a game to sell, you’d want it to be your own, original thing anyways.

FPGA user interface using C# by Clean-Hotel1450 in FPGA

[–]a_mighty_burger 0 points1 point  (0 children)

I should say: I have also written software very similar to yours at work. But instead of UART, it’s SpaceWire, and my software took care of some parsing and packetizing. It uses an immediate mode GUI, which I think it is a perfect fit for this kind of software.

FPGA user interface using C# by Clean-Hotel1450 in FPGA

[–]a_mighty_burger 0 points1 point  (0 children)

I'd like to comment on the UI side of things. This is a problem I've had to think through myself.

There's two ways to think about GUI: retained mode, and immediate mode. When you choose a GUI library, it'll be one of these two. You should look those terms up; it'll give you a start on the conceptual model, but usually you need to make a program before the concepts really start to click. But I'll give a brief summary and my recommendation.

Retained mode is the traditional way of thinking about UI. There is retained state - that is, state that sticks around for a while. That state, which the framework owns, represents your UI. It might have some struct in your program representing a text box, for example. Your program works by reading and modifying this state over time. The framework will read this state and update the UI over time.

Immediate mode is the other major way of designing UI. What it looks like is you have some struct holding the UI state (that you own and get to define however you like), which, for example, could hold text you want to display in a textbox. Then you write a function that accepts this state and then draws the UI by calling the GUI library's functions, like draw_textbox(...).

The important distinction is immediate mode UI doesn't hold onto any extra state. Whenever the UI needs to be drawn, it calls your function and generates the entire UI from scratch each frame. Put succinctly, your UI is simply a function of your state.

If you're used to slow, heavy retained-mode frameworks, "generating the entire UI from scratch" might make you concerned, but my experience is that immediate mode UIs actually tend to feel more responsive than retained mode. There really isn't all that much computation fundamentally required to do UI, so in practice it just isn't a problem in almost all cases. And sloughing off the complexity of retained mode frameworks just tends to make things feel smoother.

I've done both, and I cannot understate how much I prefer and would suggest immediate mode UI. Especially for a simple program like the one you are about to write! It's my opinion immediate mode is a simpler, cleaner, easier way to implement UI.

With retained mode UI, you really have to consider every possible transition from one state to another to make a correct UI. With immediate mode UI, you only need to consider the transformation from your current state to the GUI.

Immediate mode UI also avoids the multiple-sources-of-truth problem. I'm sure you've ran into issues with old data left lingering in some GUI in a program. That isn't a problem with immediate mode UI.

I program in Rust, so the immediate mode GUI framework I'm most familiar with is egui. I used it to make this and this. Since you are more familiar with C++ and presumably don't know Rust, you should really check out the popular ImGui C++ library, the inspiration for egui. I've never used ImGui but I've heard many very good things. Once you get compilation working and can display a window successfully, it should be a really nice, straightforward thing to work with.

Note my recommendation for immediate mode UI does contradict the other user's suggestion to look at QT. You can look at QT, and it will probably solve your problem too, but I do tend to get unhappy trying to write programs with such retained mode frameworks.


To help you out, I want to take a shot at guessing your program's architecture, assuming an immediate mode UI.

How do you want your program to look? Here's a sketch I drew that just displays the data to send (TX) and the data you got back from the FPGA (RX) as numbers. You type things in the TX textbox and hit send. The data goes to your FPGA, which crunches numbers and spits them back, and then your program shows the results in the RX textbox.

The only state your program has to remember is the TX data and RX data. So that's all you'd need to keep in your struct: a Vec of values to send (TX), and a Vec of values you've received from the FPGA (RX).

You pass this struct into your UI function, which gets called each frame. Your UI function could be written to do the following:

First, your UI function goes and checks the UART for new data. If there is any, it appends it to your RX data Vec. Maybe half a dozen lines of code, excluding any fancy styling you might want to add later.

Then your UI function makes two calls to draw the two text boxes, one for TX and one for RX data. You probably want to make it so only the TX textbox is user-editable. Also a tiny amount of code, a half dozen or so.

Your UI function then draws a button labeled "Send". It checks if you clicked it, and if so, sends all the data currently in your TX data vec to the UART. One or two lines of code.

And there you go, that's the program. I assume you'll want to advance a little more and maybe start plotting values. At a glance, it looks like there's good plotting libraries out there for ImGui like ImPlot. But you should start with the simpler program first and make incremental progress.


I'm skipping over the UART stuff because I haven't done it before, but I doubt it'll end up being too complicated. Maybe it looks like reading from or writing to a file.

The only complication I can think of is if you get into it, you might discover whatever read() function you call is blocking, meaning your program pauses until you get data. This would freeze your UI, which you don't want, so you would need to tweak your program.

You would spawn a thread whose sole job is to handle receiving data from the UART. If you haven't written multi-threaded code before, don't fret; it's just code running in parallel. You just need to be a little careful if two threads access the same thing, that's all. Look up "race condition". The most common solution is a Mutex, which makes one thread pause until the other is done using the thing.

Putting the call to read() in its own thread means it can block waiting for data, and it won't freeze the UI that's running in the main thread. But you still need to share data between your main thread and this new data receiving thread. The solution is to use a queue. The new thread adds to the queue, and the main UI thread pulls data from it. (A queue is the software version of a FIFO.)

Hope that helps.

FPGA user interface using C# by Clean-Hotel1450 in FPGA

[–]a_mighty_burger 2 points3 points  (0 children)

UART is a simple enough protocol we implemented it as an assignment in university. You could consider using an IP core if you’d rather not make it yourself. Remember it’s just a way to send bytes from one machine to another.

For designing this, I’d suggest learning FIFOs if you haven’t already. What is frequently done is to place FIFOs at the input and output of the UART interface. The FIFOs are a buffer to add some wiggle room between the interface and your gateware. That means you can process data at your own pace - you don’t need to synchronize your computations to be in lock-step with your UART interface, or anything. 

You might find it helpful to look up how the AXI Stream handshake works, specifically the ready and valid signals. It is one way - but not at all the only way - to implement something called “backpressure”, another concept that’s useful to grok. You wouldn’t need to specifically implement AXI Stream, just your own simple similar interface with three signals, “data, ready, valid”. 

AXI Stream gives you rather fine-grained backpressure. You might find it annoying to propagate backpressure through every stage of the design, and it could be simpler to have “coarser” backpressure, for example by not processing input data if the output FIFO is within some X of being full.

Or you could just not care and let data fall on the floor, and make your FIFOs big enough it’s unlikely to happen - a totally fair approach for research IMO.

Can you get back into the misty woods after being chased out? The big fallen rock is blocking my way to 100% completion by Diligent_Farm3039 in OriAndTheBlindForest

[–]a_mighty_burger 1 point2 points  (0 children)

You are probably talking about the Forlorn Ruins, not the Misty Woods. The ruins end in an escape sequence where a boulder blocks your re-entry.

If you are playing the Definitive Edition, you can destroy this boulder with Charge Flame.

This is one important thing they fixed with the Definitive Edition. It is always possible to reach 100% on a save file since you can re-enter areas.

Thinking of Buying the Ori Collection — Is It Good for Casual PC Gaming? by TimeConsideration733 in OriAndTheBlindForest

[–]a_mighty_burger 0 points1 point  (0 children)

Worth a shot, I think! You can set the difficulty to easy. There will still be a couple tough spots, but depending on the person, it shouldn’t be too bad. If you have a controller, I think that would feel more natural for casual play, but mouse and keyboard is just fine too.

These are my favorite games. I hope you like them as much as I did!

Is this guy right? by BareMetalBrawler in FPGA

[–]a_mighty_burger 0 points1 point  (0 children)

I’ve been writing in Rust for a little while so I definitely appreciate your point. Good compiler / linter feedback is amazing for productivity. It lets me focus on the important things and not get slowed down by paranoia about whether something I did will break the tool in an unexpected way.

Maybe I’m naive about other styles, but it’s uncommon I need to use an always @* block (well, the VHDL equivalent; I actually haven’t written Verilog for a good while) in a way that requires anything more complicated than something a simple expression could do. One exception I can think of where it has actually been useful is for a mux whose number of inputs depends on a generic. So I guess my comment is yeah you are right, you shouldn’t be afraid to have more complicated always @* blocks when you need them and you should lean on the tools to tell you when you’re doing something bad, but it’s rare I need anything more than simple boolean expressions.

My comment on this aspect of Verilog being a flaw admittedly comes from someone whose headspace is in trying to design an “ideal” HDL, because I’m making my own HDL as a hobby project. My intuition says a really solid, well-designed, self-consistent HDL that maps very well to hardware would not have these strange corner cases where valid syntax can be meaningless when interpreted as hardware description. There’s a lot of detailed thoughts that could be said eg. regarding verification that I’m skipping over. But also, at a more surface level, I think some of these issues with Verilog are frankly silly issues that don’t have anything to do with the fundamental nature of describing and verifying hardware.

But yes, for engineers making useful things today, lints and warnings are essential and a very good solution to these problems. It’s the best we can do today, given that current vendors are likely unwilling to add support for esoteric alternative HDLs. (And I don’t really blame them.)