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
Bongo Bill
Jan 17, 2012

Appropriate mouse capture behavior in windowed games depends on how the game uses the mouse. If the mouse controls a cursor that moves around as normal, then the window should not capture it, because it's expected that the cursor should be able to move beyond the boundaries of the window. (An exception would be if the controls rely on having the cursor "stick" at the edges of the window, a UI paradigm that would be more appropriate to a fullscreen-only game.) If the mouse controls a UI element that doesn't function like an ordinary cursor - the crosshairs in an FPS, for instance, or the camera, or directly influencing some game element - then the window should capture the mouse, because the player doesn't expect that gameplay element to be able to function outside of the game.

If you've got a cursor while in menus and some other reason for having a mouse at other times, then capture the mouse when you close the menu and release it when you open it.

Adbot
ADBOT LOVES YOU

Bongo Bill
Jan 17, 2012

Mug posted:

I'm pretty sure I can do this, so I will.

My game is intended to be ran full-screen, but windowed is an option.

As a rule of thumb, make sure it never takes more than a single keystroke to release the mouse even if you do ever capture it. One feature of the Steam overlay is adding this behavior to all compatible games run in windowed (or, if you've got multiple displays, even fullscreen) mode.

Bongo Bill
Jan 17, 2012

Mug posted:

Hitting escape will bring up an overlay menu with real, uncaptured mouse that you can move anywhere. Would that be fine?

This is how most games do it, in fact. If all of them did, the world would be a better place. Just make sure that menu can be brought up at any time, possibly excepting loading screens (maybe release the mouse during loading screens if they're long enough for it to matter).

Bongo Bill
Jan 17, 2012

1: a ninja
2: a man is haunted by ghosts
3: the green option "A" is not selected
4: the green option "A" is selected
5: the blue option "A" is not selected
6: a ninja is reading over a man's shoulder
7: a ninja is stabbing a man
8: a mommy ninja and a baby ninja
9: a music note

Bongo Bill
Jan 17, 2012

Oh, I missed the third one. That's "a crowd."

Bongo Bill
Jan 17, 2012

Svampson posted:

So I got myself one of them mac computers so I can make iOS games and stuff, so I started messing around with Futile about a week ago and it's so much fun to use :D

Anyway here is what I've got so far running on my iPhone 4 (+ some loud inappropriate music that came with iMovie), I think this might be the fourth turn-based strategy game I've shown here maybe I'll actually finish and release this one who knows! (Don't bet on it)

https://www.youtube.com/watch?v=0C5aCSuIX6c

This looks very cool. Did the pinch zooming come "free" from Futile or did you implement it manually?

Bongo Bill
Jan 17, 2012

Unlimited saving is good from an accessibility standpoint. Unlimited loading risks the player coming to feel reliant on unfun degenerate strategies. (Permitting loading only from saves made at a save point is a kind of limit on loading.)

Bongo Bill
Jan 17, 2012

Player behavior tends to gravitate towards the most effective strategies that they have already used, regardless of whether other strategies are more fun or even exist. (That's not strictly true. They'll do things that they know will produce feedback, and visible progress toward victory is the strongest feedback available. But it holds true in most cases.) As a game designer, your job is to make the player comfortable with the intentionally fun styles of play, even if you have to trick them.

If there's a way to win your game that's easier but less fun than what you've got in mind, then you can bet there will be people out there who'll discover it, use it to the exclusion of all other strategies, and then complain that your game is boring. They will take your coloring book, color outside the lines, and then blame you for the ugliness of the result. You don't have to make it impossible to play wrong - after all, it's fun to break the rules every now and then - but giving some indication that it doesn't count can curb the worst of it.

Bongo Bill
Jan 17, 2012

Gromit posted:

Both of these "issues" are just players wanting to play your game how they want to play it. Their preferred method is not "wrong" - it's how they want to enjoy what they paid for.
Why is it a problem to give your players more options? If they want to turn your game into a TAS, why not let them?

Perhaps my opinion is not very popular, but I have never once complained that a game let me save whenever I wanted. This is not the case when a game purposely prevents me from doing so for no apparent reason.

The most common use case for a game involves a player who does not know enough about it to properly decide the way they want to play. Most games are pedagogical experiences - playing the game and learning how to play are integrated into the same process.

Making abuse impossible is rarely the best way to discourage it from happening, partly because there are players like you who know better than to ruin it for themselves, and partly because a heavy-handed "fix" like that only appears necessary when some other aspect of the game, which may subsequently go uncorrected, is incentivizing degenerate play.

Bongo Bill
Jan 17, 2012

First of all, you need to decide what kind of data is going to be in your map. What's going to be stored in an individual hex? From the looks of it, you've got uniform empty hexes, which can be occupied by a single star-like object. In that case, I'd recommend a dictionary, with a Vector2 (or Point2D, or your own hand-rolled dumb coordinate struct, or whatever) as the keys, and any coordinate pair that is not a key in the dictionary is assumed to be empty. This will give you very good random access performance, and it will map easily to a relational database, with all the potential advantages those entail if you're willing to include SQLite or some such thing in it.

On the other hand, if a significant fraction of your hexes are not empty, and you've got lots of them containing data that's not unique - say, indicating one hex as "safe" and one as "dangerous" - then you'll want to use a quadtree. (If you were working in three dimensions, it'd be an octree instead.) You're representing the whole map as a tree, where each stem node has four children and knows its own center point, while only the leaf nodes have data. The whole map is the root, and you divide it into quadrants, each as one child node from the root. Divide each node recursively, until reaching a section where all the hexes in it are the same (all empty or whatever) - all those hexes will be represented by a single leaf node. To look up any given coordinate, you simply descend the tree recursively according to which child node the coordinate falls in, until you reach a leaf node; it won't be very deep, so performance is good (though in the worst case, a very unorderly high-entropy map, like television static, it will end up being worse than just a huge 2D array).

Combining these approaches is what large dynamically-generated worlds do; it generates one "chunk" at a time as needed, and that chunk is represented by an octree or quadtree.

At different times in the process of dealing with the map, you might find that one of these structures is more useful than others. In fact you'll probably find that you want both at the same time. Represent the relatively information-poor terrain as a tree, and the information-rich objects located therein as a dictionary. They don't even have to use the same coordinate system!

Bongo Bill fucked around with this message at 03:02 on Mar 30, 2013

Bongo Bill
Jan 17, 2012

The real quality of this kind of RPG is in the interactions between its subsystems. Let each one be a feedback loop with a different radius - progress in one should open up possibilities in others.

Having separate systems for party composition and character advancement is fine, but you've got to design how those systems interact and what considerations those interactions force on the player. If they're completely isolated, then you might as well just have one or the other.

Bongo Bill
Jan 17, 2012

TJChap2840 posted:

Also, what is the "clean" way for adding a large amount of a class of things to a game? In my piddling around, I have been using a inheritance (Tile Class > Grass Tile > Overgrown Grass Tile > etc), but I know that will get out of control quickly.

Lots of complex games use an entity-component system. Google can direct you to more in-depth literature about this paradigm, but I can give you a brief overview. Unity uses it by default.

ECS is very different from object-oriented design. In OOP, the type of an object - and its ancestor types, to which it can be coerced - are used to describe some of what that object is to be used for. Programming courses often emphasize as a core principle the difference between inheritance ("is-a") and composition ("has-a") relationships, the former of which is a defining principle of conventional OOP. ECS, on the other hand, uses only composition; it's driven entirely (or almost entirely - you can mix paradigms) by data.

Everything in the simulation - every enemy, every projectile, every discrete part of the environment, all the data about the player, even the UI widgets and abstracted controllers - are Entities. Entities are distinguished from each other not by what kind of entity they are, but by what data they have. A bullet, for instance, would have X and Y coordinates, a hitbox, a graphic, a sound effect, maybe a countdown to its expiration or some data about how much damage it would do. Each piece of data about an Entity is called a Component, and an Entity is literally nothing more than an ID (you can even do without the ID, but it makes debugging much easier) and a collection of Components - and, crucially, only the components it needs. Your entire game state - not necessarily the state of the program, which also has to keep track of things like the window manager, but the simulation - is nothing more than a collection of Entities.

ECS is particularly commonly used in MMORPGs, because it maps easily to a relational database. Every row is an Entity, each column a Component. If an Entity doesn't need a Component (if something doesn't make any noise, for instance, it has no need for a Component with the filename of a sound effect), then just put Null in that column.

An Entity is just a collection of Components, and there are many ways to implement that relationship. It can be implemented statically, like the base Entity class is abstract, each type of Component is its own interface, and each "type" of game object is a concrete class extending Entity and implementing only those Components that it needs. Or it can be implemented dynamically, with a single concrete Entity class with a list or vector of Components, and an abstract Component class which each type of Component extends singly. You could build it sideways, and give each type of Component a static member variable (you could use CRTP in C++ for this) that's a list of which Entities have Components of this type. If your language has dynamic typing you may not even need to bother with classes at all, or you could do something exotic with variadic templates or God knows what. You just need to make sure there's a way that your Entities and Components are accessible to the third part of the puzzle, the Systems.

I've talked a lot about how to structure the data of your program, but not where the logic should reside, and Systems are it. Implemented right, a System is a stateless (usually), parallelizable (but not necessarily parallel!), specialized (ideally) part of the program. A System is responsible for manipulating the Entities. You would create a Rendering system, for instance, which takes every Entity that has the Components which correspond to something that needs to be drawn (at its simplest, X and Y coordinates and a texture), and draws them.

You need some way to make your Systems aware of which Entities they're supposed to be acting on. One way to do this would be with a function Register (and Unregister) that adds the Entity to the list of Entities watched by a given System; in a simpler game, you could also structure it so that there's a 1:1 correspondence between Components and Systems, and make it so adding a Component to an Entity also adds that Component to that System (the Component then of course needs to know what Entity it belongs to). Or you could just eat the overhead of querying an in-memory relational database multiple times per frame.

In a platformer, you might have an Entity which represents the player character. This would be a discrete unit with lots of Components, even including the ones corresponding to the controller (depending on how abstract you want to make it). Your Jumping system would look for all the players who are trying to jump, determine whether they're able to (i.e. they're not currently in the air or something), then put the appropriate force vector in the physics Component and change its current animation state to "jumping" (again, there are many different ways to do this). Then you'd run the Physics System, which looks at every Entity with the Components representing hitboxes, positions, force vectors, or any other data needed for physics, and it would operate on them as needed, flagging any collisions, which would in turn be handled by the Collision system. The Animation system would take everything that has animations and determine which frame needs to be drawn. Finally the Rendering system would look at any Entities with Components containing screen coordinates and a texture, and render them. Any two systems that don't need to be synchronized - that is, they don't depend on each other - can even be made to run on separate threads.

It's a very complex structure, and involves a lot of effort up front to implement it. It's a different way of thinking about your program. There are many ways to design them and it's hard to say which ones are better, but it's easier to change it since you can swap different versions of Systems in and out on the fly.

It gives you the advantage of being able to separate concerns and not worry too much about taxonomy. But it also has some very substantial drawbacks, like if two Systems need some way to communicate with each other (as they often do - usually a message-passing system is bolted on top of it), as well as the runtime overhead of dealing with all these parts. It's possibly overkill for a one-person game. It also means you've got to think more about how other optimizations fit into it.

I've just given you a very superficial overlook of how to do this, and no doubt more experienced engineers will take issue with some of my examples. The short version is: games are inherently complex programs, so no matter what approach you take, there will be complexities in your code; but you can influence how and where that complexity will manifest itself, and ensure it does so in the manner and place that it's easiest for you to think about.

So, to answer your question, to represent the difference between a generic tile, a grass tile, and an overgrown grass tile - well, you tell me. What is the difference between those three? Model that difference in your program, not hypothetical differences that you won't be concerned with.

Bongo Bill
Jan 17, 2012

Orzo posted:

Your post is good, I just have one nit to pick: composition, which is at its core the basis for entity-component systems, is definitely in the realm of OOP. OOP does not necessarily imply deep inheritance trees--that's just how beginners tend to abuse it.

Ah. Yeah, you're right. I'll qualify it: using composition only and not inheritance is neither the most common nor the most obvious way to use OOP (which is nevertheless flexible enough to support a variety of styles).

Bongo Bill
Jan 17, 2012

Unormal posted:

Are there any languages that use composition (has-a) instead of inheritance (is-a) as the language-primary first-class oo semantic? Seems like there should be, but I can't think of any off the top of my head.

Go does this, with a statically-typed version of Python-esque "duck typing" (if it looks like a duck, quacks like a duck...). A Go class can't be inherited; instead, every method signature is implicitly an interface. So everything that has-a foo() member is-a valid argument to a function which only calls its arguments' foo() methods. You can still simulate inheritance by making a wrapper class that just forwards method arguments to the "parent" member, and there's some syntactic sugar to make this smoother, but it doesn't have first-class semantic support.

On the dynamically-typed side of things, Lua (and Javascript, and several others) use a type model where everything that isn't a primitive (and also some things that are) is just an arbitrary string-(or other primitive-)indexed container, so the member operator ("." in most languages) is just an alias for the container index operator ("[]" in most languages). This effectively means that composition is the only first-class OO semantic. I don't know if that counts, but you can do some very fun things with it - including using metatables to hack together something syntactically indistinguishable from inheritance.

Bongo Bill
Jan 17, 2012

The White Dragon posted:

Oh, speaking of poo poo that compiles, I'm like one boss stage and around three minor cosmetic touch-ups away from putting out an actual demo that you fuckers can play. If someone can gimme a quick write-up of how to export things out of Visual Studio 2010, it'd help me a lot. I mean, I can just upload the thing that compiles when I debug, but I dunno if that's a good/smart thing to do.

I don't know if this is in the express version, but the full version of VS2010 has a wizard for making an installer in Build > Publish. That might do the trick. Just be sure to check that the thing it makes is the thing you want.

If that's not an option, then you can just take everything the game needs, put it in a folder with the executable and any DLLs, and release it yourself. You don't want to release the version of the executable, as it still has all the debug info in it. But if it's enough to give people a folder with the executable and all the resources, you can just set the build configuration from "Debug" to "Release" (it's the drop-down menu next to the run button) and build the project. This will create executable versions of all your binaries in the appropriate locations.

Then you can make an installer for it by creating a new project, then selecting something that looks appropriate from Other Project Types > Setup and Deployment, and adding to it all the files that you want to install.

Bongo Bill
Jan 17, 2012

If you're a programmer without an artist, then crowdfunding may not be for you. Crowdfunding is an appeal directly to your players - and people play video games with their eyes. If the selling points of your game are invisible, then you won't sell much by showing them.

You can get by without art solely on the strength of your vision if you can come up with one humdinger of a video explaining exactly why your idea is unique and cool. Selling it effectively may require good graphic design, but in that case the art doesn't need to resemble the game, only communicate the idea, which is probably easier for a programmer to do.

In the future there may be an equally liberating new funding model that's better-suited for intrinsically invisible pitches, but until that time comes, you've got to make do with what exists.

Bongo Bill
Jan 17, 2012

I think the text is too small for a window of that size.

Bongo Bill
Jan 17, 2012

Third Murderer posted:

Can anyone relate their experiences with LÖVE2D? One of my many unrealistic resolutions this year is to complete a game, even if it's just a tiny shmup or something. I was going to dust off some old SFML code as a starting point, since I'm a terrible fool who hates using stuff like Game Maker because I want to feel like I'm "learning something," but LÖVE2D apparently uses Lua, so I was thinking I could use learning that as an excuse to use it. It sounds easy to use and perfect for small 2D projects, but I don't really know much about it.

I've used Love2D, and it's a neat little library. It doesn't have much in the way of heavy features, but it covers all the basics very well, is extremely well-documented, and is surrounded by a fairly active ecosystem of libraries extending it. If your alternative was SFML you shouldn't encounter any unpleasant surprises. It has good performance because all the heavy lifting is done by the Love2D binary, which simply uses the Lua runtime to execute your script and provides bindings to the library functions it calls. You don't even write the main game loop yourself; it already calls the update and draw functions every frame, so you just have to define the callbacks.

Lua is a very fun language once you get used to programming in a Lua-ey way (which you will have to, as it is idiosyncratic). Unlike some dynamic languages like Javascript and Python, Lua doesn't make it easy for you to treat it like a C-style language, so it behooves you to understand a few things about it:

Every non-primitive object is a table. (This includes functions, but programming Lua code that takes advantage of the fact that functions are tables is going very far beyond what you'll need to put together a game in Love2D.) A table is an associative array, or, in C++ terms, a map. Every member of an object is an element in the table, and the variable name is the string key for accessing it, so the two following lines of code are exactly equivalent:
code:
foo.bar
foo["bar"]
You can simulate object-oriented-style methods by declaring a function that takes the table it "belongs to" as its first argument, assigning it to the corresponding field in that table, and calling it with a colon instead of a period. The following two lines are also equivalent:
code:
foo:method()
foo.method(foo)
You can make it behave even more like object-oriented code by doing some metatable tricks, but I would advise against it, because 1) as a newcomer to the language you don't want to dive right into metatables, and 2) making Lua feel more like C++ doesn't seem like the best way to learn Lua. I'd also advise against being too clever with the ability of functions to return any number of arguments.

Every variable declared not as a member of a table is automatically a global variable unless explicitly declared local. A Lua program has a single top-level global table (which you can access and manipulate just like any other table), so you may wish to be careful when declaring variables not to pollute it. On the other hand, Lua was invented for use cases where having a lot of global state is normal or at least not a huge deal, and if needed there are ways to still perform sane unit testing even in a program where everything is global.

If you need to load a data file - something for which, in another language, you'd use something like XML or JSON - consider instead implementing it as a Lua script which declares and returns a table describing whatever you want to retrieve from the file. Then just load it with the "dofile" function. If you need to write a table, you may need something more robust.

If you refer to the version of Programming In Lua available online, note that it targets version 5.0 of the language, while the current version is 5.2, so it doesn't cover some of the newer features. Most likely, you'll want to look at this tutorial about how to create modules idiomatically, which is important for structuring your code.

You can expect to find it extremely pleasant for the sort of ad-hoc structure that very basic game prototypes tend to form, and the Love2D community has a lot of resources for common game development tasks. Also, if you use the Entity-Component-System pattern, as you should, you'll find Lua's native data structure particularly well-suited to it.

Bongo Bill fucked around with this message at 13:17 on Jan 5, 2014

Bongo Bill
Jan 17, 2012

No market for abstract?

Bongo Bill
Jan 17, 2012

Is there a general opinion of LibGDX?

Bongo Bill
Jan 17, 2012

The most useful Inform 7 resource I've ever seen was Inform 7 for Programmers. I don't think Inform 7's promise of a programming language that is like natural language quite panned out, and that document helped me understand the actual language semantics. However, based on the title you already know whether it'll be any good for you.

Bongo Bill
Jan 17, 2012

I would blame Errol Flynn if anything cinematic is responsible for the impression, but even he was just following in an existing tradition of stage fighting, which has always been more like dance than combat. Ceremonial fighting is an art form and you have to decide how artistic you want you simulation to be.

Bongo Bill
Jan 17, 2012

Chirps are good, but where does chatter fit into this?

Bongo Bill
Jan 17, 2012

Omi no Kami posted:

So I think I either had a really smart idea, or a really dumb one: I know that a realtime time-management game is a bad idea, especially when I want the player to carefully weigh the importance of every action without always being stressed, but the complaint I have with literal Persona chunks of time is that it feels very janky to constantly jump forward in time.

What I'm thinking is, instead of 3 chunks per day and n stamina-bounded actions per chunk, what if I make a 24-hour clock, and make every single action from pooping to talking chew up time? (Interviewing a witness advances the clock 30 minutes, typing up that report back at the office will take 90). Add to that a stamina gauge that takes, say, 12 hours to drain (after which the only actions you can take are nap-related), and let you eat and drink stimulants with diminishing returns to pad your day beyond that in return for stat nerfs down the line (because your circadian rythmns are out of whack and you're chain-smoking cigarettes with one hand and guzzling crappy station coffee with the other).

I have a gut feeling that sticking with "You can do 3 things per day" is still the better decision, since it's much easier to understand a time economy with a single unit of measure ("The ME needs 5 chunks to finish his report, and your subordinates can each give you one chunk of help this week"), but I think the idea of the clock always running is super-compelling if you can make it work.

Implement the fine-grained time-cost system and prototype it, then just change everything to take 8 hours if it doesn't work out.

Bongo Bill
Jan 17, 2012

Omi no Kami posted:

Oh hey, that would work... you're thinking there would be a single singleton/library class that actually contained all the logic, and I'd be handing the item pointers to that?

It depends on the rest of your data structures. What language are we talking about?

Bongo Bill
Jan 17, 2012

Line breaks are free. Maintaining code is harder than writing it and code is read more often than it's written, so write for readability. Your goal should be to make as little of your code clever as necessary.

More contentiously, you don't have to worry about O(n) for small n.

Bongo Bill
Jan 17, 2012

On that note, is there any sort of "guide" for using Unity solely as a rendering system but writing the entire rest of the game from scratch and ignoring all of its logical features?

Bongo Bill
Jan 17, 2012

Hell, I'd even like to ignore their ECS architecture if possible and use something more suited to the specific game I like to pretend I have time to be writing.

Bongo Bill
Jan 17, 2012

A farmer living in an apartment!? Now that's suspicious.

Edit: it sounds like you're facing a discoverability problem. How do you telegraph to the player 1) what they can do, and 2) what effects they can expect from it? This is the only problem in game design, except for all the others. Thinking about it that way might help.

Bongo Bill fucked around with this message at 07:05 on Sep 17, 2015

Bongo Bill
Jan 17, 2012

Omi no Kami posted:

I finished implementing investigations, so I'm on to planting evidence in the level... is there any getting out of loading the level at least once to get intelligent evidence placement? What I'm doing right now is placing a crime simulator actor at the scene of the crime, and the next time that room loads into memory it does a bunch of raytraces to randomly place the victim, temporarily enables physics on each piece of evidence, puts the evidence over the body, and applies a radial physics burst in a random direction to simulate the effect of stuff falling out of pockets/getting thrown around. Stuff that would stick to surfaces, like fingerprints, footprints, and blood spatter, is placed last- evidence of someone's presence is placed by selecting a random location on a line that connects the entrance to the body, and blood just traces a ray from the victim in a random direction and paints a decal on the first surface it hits.

This works, but it's super-clunky, and it carries the disadvantage of linking evidence to instantiated actors whose position I then have to cache somewhere persistent so they last between sessions/spawns. Do you think it's worth cleaning this up and running with the idea of physically simulating the crime within level geometry, or this a fundamentally clunky way to make crime scenes look convincing?

With a system like this, how do you account for the possibility of a vital piece of evidence being moved after the blood splattered on it, leaving a clean spot where it was? My understanding of mystery video games is that things like this occur in over half of all murders.

Seriously, though:

With this kind of generation, you're generating details as late as possible, but if two details need to be mutually consistent, then either you must generate them at the same time or you must cache the one that is known earlier. There's no way around it. If I'm understanding correctly, adding extra data, such as actor position, to a detail you've already cached, such as a crime scene, is consistent with the data model you already designed, which I think is a sign you're on the right track.

Bongo Bill
Jan 17, 2012

Omi no Kami posted:

So my quest system is done, this week I'm building the subsystem that specifically handles criminal cases and I have a really stupid problem. The whole system breaks down to generating Profiles of suspects, which get gradually more detailed as the case develops. A lot of the profile relies on demographic data, as that's super-easy to mix & match programmatically, but what I'm realizing is that the elegance of the system slams to a halt the instant you have multiple suspects. If I have two hair colors, two shoe sizes, a fiber from one shirt, and a finding that at least one of the perps had a severe psychiatric illness, how the heck am I supposed to figure out which stuff belongs to which guy? Requiring the player to manually assign which evidence goes on which profile is finnicky and a waste of their time, but if the game automatically puts the right evidence on the right profile it becomes massively easier to solve the crime, because even a couple of pieces of evidence get super-specific: anyone could have red hair and not be able to account for their whereabouts during the crime, but how many suspects both have red hair, no alibi, and a friend with a size eight shoe?

A big matrix with evidence on one axis and suspects along the other, and icons indicating whether the evidence implicates that suspect or rules them out. Add extra icons for circumstantial and/or inconclusive. With this in place, doesn't much matter which cells get filled in automatically and which are filled in by the player. Click on the suspect to toggle whether they're ruled out; click on the evidence to toggle whether it's a red herring.

Bongo Bill fucked around with this message at 02:32 on Oct 13, 2015

Bongo Bill
Jan 17, 2012

It's almost as though art has an element of aesthetic discretion.

Bongo Bill
Jan 17, 2012

Omi no Kami posted:

Auto-incrementing 32-bit int sounds like the smart way to go, but here's the dumb follow-up problem with that: because my maps are built procedurally, the world logic component only knows where all the rooms are because each room broadcasts a message along with its own data when it's created, so I just have world logic listen for that event, and every time it fires the logic component checks its own map, and if it doesn't have a reference to that room, it adds one.

That poses a problem for incrementing IDs, because I have no way of verifying that the same rooms will be built in the same order every time the game runs. Is the option here to do something weird, like hashing its Vector3 location into an int?

Find the unique thing about the rooms that will be the same every time you generate from the same seed, and use that or a hash of it as the key. That isn't really a weird thing to do.

Bongo Bill
Jan 17, 2012

Zereth posted:

Please make it so you murderees can also be shot with a knife.

You don't want to go overboard with something like this, but scrambling the murder weapons from Clue is good comedy and a good opportunity for misdirection. Blunt trauma with the handle of a knife, choked on a bullet, the knot in the noose came undone and the victim fell only to land exactly on an exposed lead pipe.

Bongo Bill
Jan 17, 2012

AntiPseudonym posted:

Oh, yep!

https://www.youtube.com/watch?v=Fm1xjjGdTJY

And yeah, you're definitely right. I've got a website for the company with a blog on it, but I've been so incredibly hammered trying to get the game ready for PAX I haven't updated it in months.

Why's this video unlisted?

Bongo Bill
Jan 17, 2012

Omi no Kami posted:

"Hard-boiled detective balances ethics vs. efficacy to clear as many cases as possible before she's forced to retire"

That's a story but it doesn't tell us much about the game.

Bongo Bill
Jan 17, 2012

Murder Manor

Bongo Bill
Jan 17, 2012

One time the game put the chicken hat on me even when I told it not to and I got mad.

Bongo Bill
Jan 17, 2012

Super guides are absolutely a good feature, but you have to be very careful about the UX because it's going to show up at the most emotionally delicate moments. Burying it in a menu means it won't be seen by the players who need it most, but prompting too eagerly insults the ones who are motivated to finish it the hard way.

This suggests that the optimal solution would be to enable the super guide prompts, but bury an option in the options to suppress the prompts right next to the option to enable it immediately. Or, from the Nth refusal onward, put a "don't ask me again" button on the prompt.

Just don't do like they did in New Super Mario Bros. U and have the super guide box make an annoying noise at you until it scrolls off-screen.

Adbot
ADBOT LOVES YOU

Bongo Bill
Jan 17, 2012

It's a new year. If I commit one change to the repository every day, no matter how trivial, it should eventually contain a game, right?

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