Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
leper khan
Dec 28, 2010
Honest to god thinks Half Life 2 is a bad game. But at least he likes Monster Hunter.

12 rats tied together posted:

an example of this i've worked with in the past is skills for an mmorpg. this skill "can target the ground" and "has an area of effect" and "is a trap" and "ignores defense", and so on.

it's easy to rack up dozens of these and cramming them into a single "battle flags" integer and unpacking it is pretty ergonomic as far as mmorpg code goes

sounds like an entity definition. give your components an integer id and you can serialize them as N+1 ints

flags get tricky when you have more than ~64 types of thing to deal with, but you certainly could pack the definitions. as number of potential things grows, you're not saving much. eg if you have 255 potential things and only ever have 4, that's 5 chars unpacked or 32 chars packed. it gets a bit less degenerate if you need 16 bits to count your things, but still IME cheaper.

Adbot
ADBOT LOVES YOU

fritz
Jul 26, 2003

OneEightHundred posted:

Technically shifting things into the sign bit is undefined behavior so certain compilers might complain about it or do weird things.

It's gdscript, not c or c++.

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

Kaedric posted:

And now that I've spent the time to write all that useless fluff above I realize that because it's a contrived example, it's sort of a bad one. Thinking back on it, you'd probably use this mostly for checking things that you check OFTEN, not necessarily something like a quest reward which is a one and done. Maybe a better example would be combining elemental effects to create a spell. Instead of checking has_earth && has_fire && has_wind you might make a shorthand bit checker for that. I don't know! I'm tired.
I'm on the side of bits, I like bits, but even a good example of this isn't really about the readability, because just as you can do
code:
int SOME_COMBINATION = FLAG1|FLAG2|FLAG3;
if (flagsObject.flags&SOME_COMBINATION==SOME_COMBINATION)...
you can do
code:
bool FlagsObject::someCombination() {return flag1 && flag2 && flag3;}
if (flagsObject.someCombination())...
(which is also less error-prone because it's an easy mistake to do if flagsObject.flags&SOME_COMBINATION and forget the equality check which gives you a horrible bug that's difficult to find later.)

The nice thing about bits is they're small and the comparison is fast, neither of which really matters in these days of multi-megabyte save files and processors measured in gigaflops not singleflops, but I still like them!

Kaedric
Sep 5, 2000

Yes, I would agree and say that probably one of the more important areas this would help (meaning: a good place to actually bother doing it) would be in multiplayer netcode, where every bit is a cost in literal money and/or bandwidth.

more falafel please
Feb 26, 2005

forums poster

Kaedric posted:

Yes, I would agree and say that probably one of the more important areas this would help (meaning: a good place to actually bother doing it) would be in multiplayer netcode, where every bit is a cost in literal money and/or bandwidth.

It depends a lot on your packet frequency and how big your average packet is. Back in the day to pass cert on Xbox, you needed to be "playable" on 64kbps, 100ms average latency, 1% average packet loss (IIRC). "Playable" was pretty vague, but that was always the target. On a couple games I worked on where we ran lockstep between two peers at 60fps, sending a tiny packet every frame, bandwidth was dominated by Ethernet/IP/UDP headers. Cutting a few bits from the payload wouldn't make a noticeable difference.

Tunicate
May 15, 2012

Something something, premature optimization

leper khan
Dec 28, 2010
Honest to god thinks Half Life 2 is a bad game. But at least he likes Monster Hunter.

Tunicate posted:

Something something, premature optimization

yes, overuse and misinterpret the quote more. thats what we need.

Raenir Salazar
Nov 5, 2010

College Slice

leper khan posted:

yes, overuse and misinterpret the quote more. thats what we need.

Did you step down as mod. :(

In any case I think Tunicate is just making a joking reference.

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

i like manipulating bits because it makes me feel like a real programmer. i'm not some java monkey playing with interfaces! i'm a real dev!

bobthenameless
Jun 20, 2005

aardvaard posted:

i like manipulating bits because it makes me feel like a real programmer. i'm not some java monkey playing with interfaces! i'm a real dev!

tbqh this is probably a significant part of why I also like to do it

Rocko Bonaparte
Mar 12, 2002

Every day is Friday!
Unreal Blueprint code gets into some serious spaghetti really quickly. I think my main issue is with reusing return values. Say, I have an object to which I'll be doing a bunch of stuff in a row. A sequence will give a top-to-bottom ordering but won't stop me from having to connect that object in a fan to all of the different commands. Is there a better way to do this? Just save it to a temporary variable and drop that next to every command?

blastron
Dec 11, 2007

Don't doodle on it!


Rocko Bonaparte posted:

Unreal Blueprint code gets into some serious spaghetti really quickly. I think my main issue is with reusing return values. Say, I have an object to which I'll be doing a bunch of stuff in a row. A sequence will give a top-to-bottom ordering but won't stop me from having to connect that object in a fan to all of the different commands. Is there a better way to do this? Just save it to a temporary variable and drop that next to every command?

I either use a temporary variable to eliminate wires or reroute nodes to keep everything tame. I also try to keep things as uncluttered as possible, which generally involves collapsing chunks of logic into their own nodes or using comment blocks and reroute nodes to segregate things into discrete chunks.

Since you're mentioning that you're reusing return values: one very important thing to note is that pure functions (the ones without execution pins) are evaluated every time their return values are accessed. This is generally fine, since pure functions shouldn't be mutating state and should be quick to access, but you can get in trouble if you're using something with variable results, like a random number generator.

Truspeaker
Jan 28, 2009

Speaking of reroute nodes, I just learned yesterday that there is a shortcut to just pop one down wherever your cursor is. By default it's the R button, and if you do it while dragging an execution pin around it even lets you continue dragging the pin around without having to click again.

One of those very small things that seems obvious in hindsight, but feels huge after (sort of) years of right clicking and hitting "rer" as fast as I could.

Chillmatic
Jul 25, 2003

always seeking to survive and flourish

Rocko Bonaparte posted:

Unreal Blueprint code gets into some serious spaghetti really quickly. I think my main issue is with reusing return values. Say, I have an object to which I'll be doing a bunch of stuff in a row. A sequence will give a top-to-bottom ordering but won't stop me from having to connect that object in a fan to all of the different commands. Is there a better way to do this? Just save it to a temporary variable and drop that next to every command?


You fix this by doing the exact same things you would do in a text-based language.

Also, if you’re working within a function that has inputs/arguments, Unreal automatically turns them into local variables scoped to the function, so you don’t even need to run a wire from the input to wherever it needs to go.

blastron
Dec 11, 2007

Don't doodle on it!


Truspeaker posted:

Speaking of reroute nodes, I just learned yesterday that there is a shortcut to just pop one down wherever your cursor is. By default it's the R button, and if you do it while dragging an execution pin around it even lets you continue dragging the pin around without having to click again.

One of those very small things that seems obvious in hindsight, but feels huge after (sort of) years of right clicking and hitting "rer" as fast as I could.

Double-clicking on an existing wire gets you a node, too!

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador
Got a dumb question for any unity pros that might be reading. Not directly dev adjacent so feel free to tell me to gently caress off, but this might be an easy answer for someone with experience. I've spent a decent chunk of time working with Unity in the past for some personal game dev stuff but nothing on any professional level.

Basically I've been trying to decompile the code of a recent strategy game to try to understand the math on a particular obfuscated mechanic. I was easily able to extract the code from DLLs and skim through it for the exact function that calculates what I'm trying to understand, but the problem is that the specific chance is based on a list populated from a database, and I can't for the life of me figure out where that data is at. Anybody able to give a hint at where in the final compiled game structure for a Unity game I could expect to see that? Keep digging around DLLs? Encoded in some separate asset? Too ambiguous based on how the devs might have organized their code?

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

It's probably in a scriptable object. I believe uTinyRipper can read them: https://github.com/mafaca/UtinyRipper

Hughlander
May 11, 2005

Eschatos posted:

Got a dumb question for any unity pros that might be reading. Not directly dev adjacent so feel free to tell me to gently caress off, but this might be an easy answer for someone with experience. I've spent a decent chunk of time working with Unity in the past for some personal game dev stuff but nothing on any professional level.

Basically I've been trying to decompile the code of a recent strategy game to try to understand the math on a particular obfuscated mechanic. I was easily able to extract the code from DLLs and skim through it for the exact function that calculates what I'm trying to understand, but the problem is that the specific chance is based on a list populated from a database, and I can't for the life of me figure out where that data is at. Anybody able to give a hint at where in the final compiled game structure for a Unity game I could expect to see that? Keep digging around DLLs? Encoded in some separate asset? Too ambiguous based on how the devs might have organized their code?

Define 'database'? Asset Database? Remote database? Is this a runtime computation? Build time?

There's a bunch of possibilities depending on what your'e talking about.

If you mean designers enter data into a database, and then at build time it's pulled from the database and obsufcated into the final executable, it can be almost anywhere. Look for how to open an asset bundle for whatever version of Unity the game is built for like maybe https://github.com/SeriousCache/UABE/releases

leper khan
Dec 28, 2010
Honest to god thinks Half Life 2 is a bad game. But at least he likes Monster Hunter.

Eschatos posted:

Got a dumb question for any unity pros that might be reading. Not directly dev adjacent so feel free to tell me to gently caress off, but this might be an easy answer for someone with experience. I've spent a decent chunk of time working with Unity in the past for some personal game dev stuff but nothing on any professional level.

Basically I've been trying to decompile the code of a recent strategy game to try to understand the math on a particular obfuscated mechanic. I was easily able to extract the code from DLLs and skim through it for the exact function that calculates what I'm trying to understand, but the problem is that the specific chance is based on a list populated from a database, and I can't for the life of me figure out where that data is at. Anybody able to give a hint at where in the final compiled game structure for a Unity game I could expect to see that? Keep digging around DLLs? Encoded in some separate asset? Too ambiguous based on how the devs might have organized their code?

if its a sqlite db, it will either be in streaming assets, resources, or in memory. if its in memory and loaded over the network, youd need to go through dynamic analysis or use a shim dll to man in the middle the data

you'd need to be more specific about storage for us to help you more directly

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

What's the game?

Red Mike
Jul 11, 2011

Red Mike posted:

Of course I wrote that but then I realised there's a simple workaround to avoid it entirely, using the C# built-in NativeLibrary.Load/GetExport to pretend to be calling dlopen/dlsym. I got a basic MonoGame sample running now, with only these changes needed in the MonoGame repo: load "libSDL" without anything else, don't set "Sdl.GL.Attribute.ContextFlags" for debug (it breaks context creation), fix MonoGame's glEnable/glDisable thinking they should return int (they're void return delegates), enable GLES define in MonoGame (and fix the couple places that don't listen to the define), don't call glPolygonMode which isn't implemented in WebGL (and I assume there's others I haven't run into). Commits with the changes here.

The OpenGL ES support is the big one that might need some weird changes to the code, but the others are all things that can live in the existing DesktopGL backend. That said, I have a feeling MonoGame maintainers will be reluctant to look at this.

MonoGame branch of the sample here.

e: Especially because the reason NativeLibrary works for this is because I'm basically hitting the SDL binding I'm including in the project, so they can't escape having to do that for WASM builds anyway.

Cross-posting myself from the .NET thread, since I feel like gamedev people might be particularly interested in this.

Managed to get SDL, and then MonoGame, compiling for WebAssembly directly via a .NET8 build (not Blazor, not IL2CPP, etc). No weird custom runtimes, no having to unpick arcane symbols, no figuring out the magic emscripten commands to do things.

That said, the MonoGame code will definitely need more changes to prevent usage of legacy GL/attributes/etc but in principle this approach works, and means any project using DesktopGL should translate pretty much 1-to-1 with only internal library changes. It also needs the MonoGame maintainers to decide on/agree with the approach, as well as particulars, and ideally one of them to take this forward.
And the specifics of my WASM sample will likely change with .NET 9 and onwards as this bit of the runtime keeps changing.

Hughlander
May 11, 2005

Red Mike posted:

Cross-posting myself from the .NET thread, since I feel like gamedev people might be particularly interested in this.

Managed to get SDL, and then MonoGame, compiling for WebAssembly directly via a .NET8 build (not Blazor, not IL2CPP, etc). No weird custom runtimes, no having to unpick arcane symbols, no figuring out the magic emscripten commands to do things.

That said, the MonoGame code will definitely need more changes to prevent usage of legacy GL/attributes/etc but in principle this approach works, and means any project using DesktopGL should translate pretty much 1-to-1 with only internal library changes. It also needs the MonoGame maintainers to decide on/agree with the approach, as well as particulars, and ideally one of them to take this forward.
And the specifics of my WASM sample will likely change with .NET 9 and onwards as this bit of the runtime keeps changing.

I hear you being summoned to https://forums.somethingawful.com/showthread.php?threadid=4051802

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador
I'll try to provide some more context. The math I'm working out is the exact chance to cast a spell on an enemy which in UI shows a strength and a resistance number, but is definitely randomized somehow in that even values are a coin flip, lower strength will probably but not always fail, and higher will probably but not always succeed.

Suppose I should clarify that I'm not completely certain what's base C#/Unity functionality and what's their own custom stuff, but the gist of it is:

There's one class I'm looking at that handles the math. It starts by creating a list of success chances and calling base.<databasename>.FetchSingle<tablename>()); to load data in. I've looked at the classes that define the table and chance objects, they literally just define the existence of the list and an int/float for the chance, no hard data. Later in the actual functions, it subtracts resistance from strength, then calls .Find on that table with the difference as the argument, saving the result to one float. A second number is generated with base.Random.NextFloat(), they're compared, if the random number is higher, spell fails, otherwise it succeeds. Since random.nextfloat returns a value between 0 and 1, presumably the table holds percentage chances based on the difference between strength and resistance.

Digging around further, there's dozens of other classes that reference the database for a bunch of different values, so I figure it holds all the data for game mechanics numbers. I see the database class that defines what it holds, with a bunch of methods to load, remove and fetch data, but no hard numbers or info on where that's being pulled from. There's a separate staticdata DLL that was the most obvious candidate, but that just seems like a bunch of helper functions and constructors, no actual value data. Whatever refers to where the database is saved is not listed in any obvious fashion.

I've spent some time pulling up the separate assets in a lovely little tool, Asset Bundle Extractor, but that pretty much just looks like fonts, materials, textures, etc, nothing that looks relevant that's larger than a few dozen bytes. Lots of very small gameobjects with irrelevant or generic names. I'm guessing the actual database reference was set in the Unity UI somewhere and not hardcoded, and how that translates to the final compiled game, I don't know.

Hughlander posted:

Define 'database'? Asset Database? Remote database? Is this a runtime computation? Build time?

There's a bunch of possibilities depending on what your'e talking about.

If you mean designers enter data into a database, and then at build time it's pulled from the database and obsufcated into the final executable, it can be almost anywhere. Look for how to open an asset bundle for whatever version of Unity the game is built for like maybe https://github.com/SeriousCache/UABE/releases

Great question, don't know the answer. Results from the asset bundles are above.


leper khan posted:

if its a sqlite db, it will either be in streaming assets, resources, or in memory. if its in memory and loaded over the network, youd need to go through dynamic analysis or use a shim dll to man in the middle the data

you'd need to be more specific about storage for us to help you more directly

StreamingAssets looks to only have video/audio/images.
Resources only contains two files, unity default resources and unity_builtin_extra.
Only other stuff is the various .asset files and some jsons in the root data folder, some almost certainly irrelevant tiny files, and the Managed and Plugin folders that hold the game DLLs and some irrelevant other DLLs respectively.


Anyway if that don't make it obvious I'm at the limit of my technical skill and will probably just have to leave it ambiguous from here. Trying to reverse engineer this stuff is pretty fun for a while, but I have my limits.

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador

aardvaard posted:

What's the game?

Solium Infernum.

Also I spoke too soon on StreamingAssets, there's a sneaky little folder called aa holding... what looks like all the Unity game objects. Just gotta figure out how to read these .bundle files, Asset Bundle Extractor and uTinyRipper can't handle em. Still, that's progress.

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

Any chance of just running the game in a debugger, hooking a point in the code that uses the database, and using the methods you've seen to query the data from it? I think dnSpy can do this.

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador

aardvaard posted:

Any chance of just running the game in a debugger, hooking a point in the code that uses the database, and using the methods you've seen to query the data from it? I think dnSpy can do this.

Good idea, my debugging experience always came down to print statements and commenting out code, never got around to learning the actual tools there. Here's an excuse.

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

You can also use something like MelonLoader to inject a DLL you've written: https://github.com/LavaGang/MelonLoader Then you can use reflection to look up the classes you want to inspect.

Raenir Salazar
Nov 5, 2010

College Slice
Do the Devs have a twitter account? You could always ask them. Sometimes creatives play ball and don't mind sharing their secrets.

Sometimes they frustratingly don't. :(

Red Mike
Jul 11, 2011

Sick burn, but FYI there is an actual point to this work. Any dev who has a MonoGame/FNA/etc project (not a Unity one) can publish directly to web without needing to change their game code, only with an updated library and a config change in their .NET project. Before this, the only real option was to find a fork that implements this in a much more difficult way and change your game code a bunch to allow it to work.

Lucid Dream
Feb 4, 2003

That boy ain't right.

Red Mike posted:

Sick burn, but FYI there is an actual point to this work. Any dev who has a MonoGame/FNA/etc project (not a Unity one) can publish directly to web without needing to change their game code, only with an updated library and a config change in their .NET project. Before this, the only real option was to find a fork that implements this in a much more difficult way and change your game code a bunch to allow it to work.

It’s super cool. I’m still a huge MonoGame/FNA fan, so it’s rad to hear. I grew up making flash games, and I’ve missed being able to deploy to the web.

Hughlander
May 11, 2005

Red Mike posted:

Sick burn, but FYI there is an actual point to this work. Any dev who has a MonoGame/FNA/etc project (not a Unity one) can publish directly to web without needing to change their game code, only with an updated library and a config change in their .NET project. Before this, the only real option was to find a fork that implements this in a much more difficult way and change your game code a bunch to allow it to work.

That's not a burn. I'd love for you to post there in great details for how you did what you did. I think that it's pretty drat awesome and would love to know more.

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador

Raenir Salazar posted:

Do the Devs have a twitter account? You could always ask them. Sometimes creatives play ball and don't mind sharing their secrets.

Sometimes they frustratingly don't. :(

Nah they've been cagey about it on discord/steam forums. Probably want to preserve the mystery.

bobthenameless
Jun 20, 2005

Red Mike posted:

Sick burn, but FYI there is an actual point to this work. Any dev who has a MonoGame/FNA/etc project (not a Unity one) can publish directly to web without needing to change their game code, only with an updated library and a config change in their .NET project. Before this, the only real option was to find a fork that implements this in a much more difficult way and change your game code a bunch to allow it to work.

also would like to throw out that this is p cool and something that is incredibly interesting to me too as a monogame/xna/fna fan as well as someone whos been looking at various other things with webassembly targets lately - in general also thinking back to flash games, but also just for idly thinking about different ways to build up an itch portfolio of smaller games and pros and cons of that kinda starting point vs a zip and such.

hell the first thing i remember about unity was that raptor and minotaur game and i definitely played those in a browser too

bobthenameless fucked around with this message at 09:22 on Mar 2, 2024

Red Mike
Jul 11, 2011

Hughlander posted:

That's not a burn. I'd love for you to post there in great details for how you did what you did. I think that it's pretty drat awesome and would love to know more.

I came across pretty serious but I was laughing, because it does feel like one of those "overcomplicated" projects even if it has a goal. I'll try and post in that thread with more info, although at this point the amount of info I'd have to dump to get to the actual meat of the problems is huge. Appreciate the kind words from everyone though!

The MonoGame discussion in their Discord didn't really go anywhere, and I'd need maintainers to take it up and agree on the right approach (because moving to OpenGL ES instead of what they currently use involves a big performance hit/feature loss, and it would mean switching the GLES define to be a runtime check which has implications), but no-one's really been that interested yet. Someone did take it and set up a repo to publish the sample to web: Github link, Hosted sample.


In the meantime I found FNA-XNA and realised they've been trying to get WASM going for a while, but ran into the same issues as I did initially and decided to work through it using Uno.Wasm which is a can of worms; it's been defunct for a while now. I jumped in and went through their docs and process, ran into a major issue because FNA requires SDL 2.26 (which doesn't normally compile well with Emscripten 3.1.34 that dotnet is locked to), but I found a good workaround within Emscripten to make it build! So with that, FNA doesn't need any code changes and WASM builds work. I also set up a Github CI to build the dependencies for Emscripten, so you don't need to build C libraries yourself.

FNA sample branch here.
FNAlibs release page here for Emscripten.

Effectively if you take your C# FNA project (or a sample one), take the FNAlibs from there instead of the normal place, and import them in a new wasmbrowser template that has the basic changes from my sample repo's FNA branch (csproj, main.js, the new .js file) that calls your Game class, it should work as-is with no real changes. I'll probably try to set up a basic guide or C# template that does this. e: I'll also probably try to get a CI action to deploy my sample to Github pages, which should technically work.

There's probably things to figure out re: file/asset loading, features that don't exist in web (some types of GL blending, some transparency things, multiple contexts); but in principle the library and your game code need no changes, only some platform-specific additions at most. I also have no idea what performance is like, but probably pretty low due to lack of threads among other things.

Rocko Bonaparte
Mar 12, 2002

Every day is Friday!
I have an Unreal Engine CommonTextBlock with an overflow policy set to ellipses. When it gets excess text, it just draws it beyond the the area. It's a title text inside of a custom button. I'm guessing it has to do with some constraint issue with its hierarchy. It goes something like:

1. Root widget
2. Size Box
3. Button
4. Vertical Box
5. The Text Block is here

The button doesn't expand if the text is larger than the default 300 pixel width given for the size box. However, the text does. What I want is to constrain everything below the size box such that the text block is forced to use its overflow policy.

I'm assuming there is some concept I don't know about for carrying constraints around in that hierarchy.

blastron
Dec 11, 2007

Don't doodle on it!


Rocko Bonaparte posted:

I have an Unreal Engine CommonTextBlock with an overflow policy set to ellipses. When it gets excess text, it just draws it beyond the the area. It's a title text inside of a custom button. I'm guessing it has to do with some constraint issue with its hierarchy. It goes something like:

1. Root widget
2. Size Box
3. Button
4. Vertical Box
5. The Text Block is here

The button doesn't expand if the text is larger than the default 300 pixel width given for the size box. However, the text does. What I want is to constrain everything below the size box such that the text block is forced to use its overflow policy.

I'm assuming there is some concept I don't know about for carrying constraints around in that hierarchy.

There’s some magical combinations of buttons you need to hit in order to get text to respect layout. The first thing that comes to mind is that your text block might need to be set to fill horizontally instead of being center-aligned. There’s two sets of alignment buttons for text: one, toward the top of the list of properties, that controls how the widget behaves in the layout, and another, kinda in the middle, that controls text flow within the widget. I think, but am not sure because I’m not at my computer, that text containers need to be coerced into fitting into the rest of the layout by using fills.

Rocko Bonaparte
Mar 12, 2002

Every day is Friday!
It looks like for that text box, I had to go to the vertical box and set the clipping policy to "Clip to Bounds." That seems to have been the final missing ingredient. I think I had that alignment already set and I'll just assume that was also necessary.

I decided to see if I could clip some other text boxes that I didn't expect to normally have to clip, but something seems to be fixing everything to a minimum width. I was thinking the Size Box's minimum desired width would do that, but it isn't enabled. I don't care as much about this but I suspect I'll get bit by something like that later some day.

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador

aardvaard posted:

Any chance of just running the game in a debugger, hooking a point in the code that uses the database, and using the methods you've seen to query the data from it? I think dnSpy can do this.

Yeah dnSpy looks like it's going to require some knowledge way past my skillset. It hasn't been updated in four years so there aren't any modern versions of the DLLs to replace in a game for it to function. Either gotta figure out how to create my own modern version(unlikely) or an alternate successor tool.

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

Then I'd go the mod loader route. Use MelonLoader, BepInEx or something else of the sort and just build a DLL that prints out the relevant data when loaded. Or even just calls System.Diagnostics.Debugger.Launch() which will prompt you to attach a VS debugger.

Adbot
ADBOT LOVES YOU

Eschatos
Apr 10, 2013


pictured: Big Cum's Most Monstrous Ambassador

aardvaard posted:

Then I'd go the mod loader route. Use MelonLoader, BepInEx or something else of the sort and just build a DLL that prints out the relevant data when loaded. Or even just calls System.Diagnostics.Debugger.Launch() which will prompt you to attach a VS debugger.

Good idea. Did make some other progress in that Asset Ripper can handle those files natively. Problem there is most of the scripts it exports are blank and there's a bunch of errors when trying to open the output in Unity, but those seem fixable and it's some good progress towards figuring this out. Guessing it doesn't work well with the actual code DLLs, but still feels like I'm on the verge of cracking this conundrum.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply