As was foretold, we've added advertisements to the forums! If you have questions, or if you encounter any bugs, please visit this thread: https://forums.penny-arcade.com/discussion/240191/forum-advertisement-faq-and-reports-thread/

[Game Dev] I don't have a publisher. What I do have are a very particular set of skills.

1808183858692

Posts

  • CornucopiistCornucopiist Registered User regular
    Handkor wrote: »
    I wonder if there would be a market for audio only games where the input is limited to tapping/jostling your phone while it's essentially in your pocket or hand. Audio games for the bus there all you need is to put on earbuds and close you eyes while you just tap on your phone in you hands without needing to look.

    Easy to do for choose your own adventure audio books but something more involved where the accelerometers pick up the direction of your tap.

    Don't underestimate the appeal of blinkenlights. There's a lot of juicyness in just having bright colorful light coming from a screen.

  • KupiKupi Registered User regular
    Kupi's Weekly Friday Game Dev Status Report

    You know how they say "never change a working system"? This whole project to convert to System.Text.Json from the Newtonsoft library has been a real lesson in why that adage came about (whatever legitimate reasons I may have for wanting to change to the new library as documented in my previous post). For context, I'm stuck with .NET Core 3.1, as that's the only version that Monogame supports on consoles (granted that I'm about a decade out from being able to produce anything worth publishing to the console audience, but I'm working on not declaring myself incapable of success). Well, I discovered that the initial version of System.Text.Json that shipped with .NET Core 3.1 has a pretty incredible bug-- if you have an object with a property that is a custom collection type (that is, it implements ICollection) with an auto-initialized value, i.e.
    public class CustomList<T> : IList<T> {
        // IList<T> implementation details
    }
    
    public class BugCauser {
        public CustomList<int> DeserializesBadly { get; set; } = new CustomList<int>();
    }
    

    ... then what happens is System.Text.Json first detects that you're using a custom ICollection, reads all the objects stored in the JSON list into a temporary list instance, and then (incorrectly) says "Oh, this property already has a value assigned. I'll just call ICollection.Add() passing in my temporary list". You can't add a list of ints as a member of a list of ints!

    I can see how this bug happened, because there is also a branch much earlier on when it's detecting the type of object it's writing into where all the built-in types are given special treatment, and I'd say a solid 99.9% of people are using the built-in collection types instead of their own.

    Now, I did learn a lot through this exercise. I learned how to make the debugger download the source code from Microsoft (though the step-through experience is a bit janky because you're stepping through optimized binaries), got some exercise with tracking down the commit in the public GitHub repo where the problem was introduced and subsequently fixed, and nevertheless discovered to my immense disappointment that the fix was published in .NET 5 and is unlikely to be backported. Fortunately it's possible to work around the problem (it's actually never really necessary to auto-initialize a property of my custom collection types, and in a very extreme case you could implement your ICollection.Add() method to detect when it's been passed an enumerable of its collection type and add all the elements to itself), but it's something that needs to be fixed as part of this change-over project that actually doesn't need to be.

    My Pokemon knockoff, meanwhile, proceeds apace; I'm still in the process of sorting out the format for the various content files, but I've just reached the threshold of starting work on the battle engine, which is the fun part. So look forward to that aspect of the report being a lot more fun next week.

    My favorite musical instrument is the air-raid siren.
  • ScooterScooter Registered User regular
    halkun wrote: »
    Blind game

    There's a forum you might want to check out if you're interested in feedback from blind devs/gamers: https://forum.audiogames.net/

    I'm not a regular there or anything, but I did get some attention there a ways back from having Text-to-Speech in my game. In my case it wasn't even something I put in for accessibility reasons, just a quick implementation after a user said they preferred to listen to text games rather than read, but they do seem hungry for that kind of stuff. Unfortunately I was never able to make my game fully blind-accessible, as I added more stuff it would have taken more and more time to get everything functioning with audio cues. In my next game it's probably going to be even less practical.

  • CornucopiistCornucopiist Registered User regular
    So, still a bit annoyed that all of the animations, scheduled texts etc. which point to my Serializable Enum 'Gamestate'
    So I switched over to Enum gamestates.
    Full disclosure; the gamemanager script was passed on from two earlier game, and I had a 'knocked out' enum gamestate all ready to go.
    The one issue is that I've serialised a class to set up animations, triggered by the gamestate.
    This way I can easily set these up in the editor.
    ziwk03xa1zlk.png
    HOWEVER!

    If I add an enum, the animations I have already set up change their enum value, because they're stored as the index rather than the string.
    So after adding an enum I need to look at all my animations and reset them.
    Would be useful to have a fix for that...

    So, I've circled back to this problem. Enums work, they are *just* available to select in my 'animation' class and some others that work the same way. However, what it's really pointing to is the position in the declared enums list, and when I add an enum all the instances of the 'animation' class have to be checked and corrected, as they now point one enum earlier.

    I don't really need the enum functionality. What I truly desire is the following:

    1) attach my gamemanager script in the scene / create a scriptable object in my project
    2) list strings in a 'gameState' list in either.
    3) attach my animator script in the scene and fill in a list of 'animation' class where I can select strings from the gameState list.

    What it really comes down to is the ability to declare in my 'animation' class a gamemanager.gamestate.string or something like that.

    But I can't get this to work...

  • ScooterScooter Registered User regular
  • exisexis Registered User regular
    Kupi wrote: »
    Kupi's Weekly Friday Game Dev Status Report

    You know how they say "never change a working system"? This whole project to convert to System.Text.Json from the Newtonsoft library has been a real lesson in why that adage came about (whatever legitimate reasons I may have for wanting to change to the new library as documented in my previous post). For context, I'm stuck with .NET Core 3.1, as that's the only version that Monogame supports on consoles (granted that I'm about a decade out from being able to produce anything worth publishing to the console audience, but I'm working on not declaring myself incapable of success). Well, I discovered that the initial version of System.Text.Json that shipped with .NET Core 3.1 has a pretty incredible bug-- if you have an object with a property that is a custom collection type (that is, it implements ICollection) with an auto-initialized value, i.e.
    public class CustomList<T> : IList<T> {
        // IList<T> implementation details
    }
    
    public class BugCauser {
        public CustomList<int> DeserializesBadly { get; set; } = new CustomList<int>();
    }
    

    ... then what happens is System.Text.Json first detects that you're using a custom ICollection, reads all the objects stored in the JSON list into a temporary list instance, and then (incorrectly) says "Oh, this property already has a value assigned. I'll just call ICollection.Add() passing in my temporary list". You can't add a list of ints as a member of a list of ints!

    I can see how this bug happened, because there is also a branch much earlier on when it's detecting the type of object it's writing into where all the built-in types are given special treatment, and I'd say a solid 99.9% of people are using the built-in collection types instead of their own.

    Now, I did learn a lot through this exercise. I learned how to make the debugger download the source code from Microsoft (though the step-through experience is a bit janky because you're stepping through optimized binaries), got some exercise with tracking down the commit in the public GitHub repo where the problem was introduced and subsequently fixed, and nevertheless discovered to my immense disappointment that the fix was published in .NET 5 and is unlikely to be backported. Fortunately it's possible to work around the problem (it's actually never really necessary to auto-initialize a property of my custom collection types, and in a very extreme case you could implement your ICollection.Add() method to detect when it's been passed an enumerable of its collection type and add all the elements to itself), but it's something that needs to be fixed as part of this change-over project that actually doesn't need to be.

    My Pokemon knockoff, meanwhile, proceeds apace; I'm still in the process of sorting out the format for the various content files, but I've just reached the threshold of starting work on the battle engine, which is the fun part. So look forward to that aspect of the report being a lot more fun next week.

    Interesting find. No criticism, but given your reasons for migrating, do you feel it was worth the effort? Seems it was a good opportunity to learn some stuff but also seems like it was pretty far into nice-to-have territory to start with?

  • CornucopiistCornucopiist Registered User regular
    Scooter wrote: »

    I thought saw that reply, but I saw a different similar question (more recent). Both OPs seem to have exactly the same problem I have...
    It's a bit clunky to my mind. I've been using lists of ints like this for tiles types in some of my other projects. It's always a shuffle between logically (human-readable) grouping ints (1000s are ground, 2000s are buildings) and adding types on the fly. You end up scrolling down long lists of values to figure out what you have to add the new tile as.
    For gamestates, there's two considerations. One is predicting granularity. I started with a few gamestates to represent the game's major set pieces. Then I added camera stations. Next, it's ending types (out of fuel/out of nodes/crash/win). Feature creep galore!
    So I might think that I only need 3 digits to cover all game states, but maybe later I'll end up having to squeeze more extra gamestates in than foreseen. At which point that defeats the whole exercise.

    The other is logic. Sure, enums give me 'craft_hovers < ignition'. I'd like to at one point do more with my game logic. The smart thing to do would probably be using Unity's animation system which does exactly that, but I like to work in code. So I'd love to be able to have a custom class, which I can make a list of, where each state includes things like a list of state names and conditions that the state could move to.


    For the moment what I've done is created scriptableobjects with only a string inside. Also clunky.

    Writing all this I realised that another workaround would be to have an GameStateName enum with all the strings I need. Then have all my animation and cameracontroller classes etc. set up in the editor using the enum (out of order). Then to have a custom GameState class that contains the same enum for the object name and for pointing to the next class.

    Thanks, duck!

  • HandkorHandkor Registered User regular
    The project I am currently working on involves roller skating. I've quickly done some programmer art level animation using UE5's FullBody IK with a simple rig which is serviceable for now to allow me to move forward and setup my animation blueprints and so on.

    Eventually I will want something that looks good without necessarily be motion capture. The UE4 marketplace gave me a lot of skateboarding but no roller derby style roller skating.

    Do any of you know of a good way to find people willing to do commissions?

    I looked at Fiver as an option but are there better or other ways of finding animators that do freelance?

    I don't need a character artist but just animations using the default unreal skeleton. Maybe I could reach out to some of the animators already on the marketplace to see if they do commissions.

  • Endless_SerpentsEndless_Serpents Registered User regular
    Handkor wrote: »
    The project I am currently working on involves roller skating. I've quickly done some programmer art level animation using UE5's FullBody IK with a simple rig which is serviceable for now to allow me to move forward and setup my animation blueprints and so on.

    Eventually I will want something that looks good without necessarily be motion capture. The UE4 marketplace gave me a lot of skateboarding but no roller derby style roller skating.

    Do any of you know of a good way to find people willing to do commissions?

    I looked at Fiver as an option but are there better or other ways of finding animators that do freelance?

    I don't need a character artist but just animations using the default unreal skeleton. Maybe I could reach out to some of the animators already on the marketplace to see if they do commissions.

    I’ve no answer, but I wonder if the animations for Jet Set Radio are out there somewhere, and you could retrofit and alter them to suit…

  • HandkorHandkor Registered User regular
    Handkor wrote: »
    The project I am currently working on involves roller skating. I've quickly done some programmer art level animation using UE5's FullBody IK with a simple rig which is serviceable for now to allow me to move forward and setup my animation blueprints and so on.

    Eventually I will want something that looks good without necessarily be motion capture. The UE4 marketplace gave me a lot of skateboarding but no roller derby style roller skating.

    Do any of you know of a good way to find people willing to do commissions?

    I looked at Fiver as an option but are there better or other ways of finding animators that do freelance?

    I don't need a character artist but just animations using the default unreal skeleton. Maybe I could reach out to some of the animators already on the marketplace to see if they do commissions.

    I’ve no answer, but I wonder if the animations for Jet Set Radio are out there somewhere, and you could retrofit and alter them to suit…

    Even if they are, I don't want to take from a copyrighted work. Also making them work on the unreal skeleton would probably take me as much time as finding good footage and doing it myself.

  • MadpoetMadpoet Registered User regular
    Handkor wrote: »
    The project I am currently working on involves roller skating. I've quickly done some programmer art level animation using UE5's FullBody IK with a simple rig which is serviceable for now to allow me to move forward and setup my animation blueprints and so on.

    Eventually I will want something that looks good without necessarily be motion capture. The UE4 marketplace gave me a lot of skateboarding but no roller derby style roller skating.

    Do any of you know of a good way to find people willing to do commissions?

    I looked at Fiver as an option but are there better or other ways of finding animators that do freelance?

    I don't need a character artist but just animations using the default unreal skeleton. Maybe I could reach out to some of the animators already on the marketplace to see if they do commissions.
    Ooh, can you talk about the project? One of my BFFs was a coach on the (four time WFTDA champion) Rose City Rollers, and I might be able to help if you need footage, information, or contacts.

  • HandkorHandkor Registered User regular
    edited November 2021
    Madpoet wrote: »
    Handkor wrote: »
    The project I am currently working on involves roller skating. I've quickly done some programmer art level animation using UE5's FullBody IK with a simple rig which is serviceable for now to allow me to move forward and setup my animation blueprints and so on.

    Eventually I will want something that looks good without necessarily be motion capture. The UE4 marketplace gave me a lot of skateboarding but no roller derby style roller skating.

    Do any of you know of a good way to find people willing to do commissions?

    I looked at Fiver as an option but are there better or other ways of finding animators that do freelance?

    I don't need a character artist but just animations using the default unreal skeleton. Maybe I could reach out to some of the animators already on the marketplace to see if they do commissions.
    Ooh, can you talk about the project? One of my BFFs was a coach on the (four time WFTDA champion) Rose City Rollers, and I might be able to help if you need footage, information, or contacts.

    That's really cool but for now youtube is quite good with training videos actually. Not going to be following any roller derby rule sets or anything as it is not going to be fought on track and against other teams.

    The setup is five members of a team are driving back from a regional tournament only to be caught in a flash of light => crash car => wake up in a post apocalyptic world. Car is trashed so they put on their gear and head out and navigate multiple roads only to fight multiple mad max style local warlords to get to the macguffin that allows them to go home. B movie shlock essentially.

    The bad guys are not going to be on roller skates but other forms of travel, I don't want to make this a world that for some reason everybody settles their differences with roller derby.

    The gameplay is going to be similar to Road Rash and Death Skid Marks with the whole team carrying weapons. The idea is that you not only control your own character but you set formations and launch teammates at targets to attack or get launched yourself to take out targets. The idea would be to equip blockers with defensive gear and shields and attack with the jammer or pivots. So controlling when to attack and regroup will be important to prevent getting injured.

    The enemies are going to vary from guys standing in the road or running to some on horseback. Later as the difficulty increases you'll be facing off with enemies in cars and truck.

    I'm still in early prototyping right now and work is keeping me very busy so this project may end up getting nowhere.

    Handkor on
  • CornucopiistCornucopiist Registered User regular
    edited November 2021
    Handkor wrote: »
    The bad guys are not going to be on roller skates but other forms of travel, I don't want to make this a world that for some reason everybody settles their differences with roller derby.
    But whyyyyyy?

    I mean, you're already investing your own dev efforts into rollerskating as a mechanic. Then, your environment is already set up for that rollerskating. Then, your player is going to get onto the rollerskating learning curve.
    It sounds to me that if there's a value to your game it'll be strongly linked to rollerskating.
    So the logical thing to me would be to make it all-skating and see if that works before adding more mechanics?

    As a worldbuilder of sorts, to me the 'everybody rollerskates' is catnip.
    Primo, it stands out. You want to have a 90ies approach to worldbuilding; it has to be extreme to the max. Going solo means you don't have anyone at the table who doesn't like rollerskating and makes it all vanilla.
    Segundo, design choices should have meaning. They rollerskate because they happen to have skates along is weaksauce. They roller skate because they were actualised as the atavistic gods of destruction in this roller-derby world, now you have meaning.
    Tertio, no plotholes or fridge logic. In any world where violence is a valid option, you need to explain why swords beat guns and skates beat monster trucks. That might be handwaved away (Dune Holtzman shields) , but it could end up with stacked piles of reasons... ex: swords beat guns because swordwielders can move faster. Fast swordwielders can't themselves carry guns because guns are too heavy to move fast. Swords are lighter than guns because they are made of unobtainium. You can't make guns from unobtainium because... it has a low melting point?

    There are of course counterarguments.
    -You can explore the sweet spot of rollerskate/monstertruck interaction and make that the strong point of your game. But the more vehicles you add, the more interaction types you get, and the less likely it is that you hit the sweet spot for all of them.
    -And, sadly, realistic games do better in today's market. But that also means you're up against every other realistic game, rather than nailing the postapocalyptic roller derby niche.

    Cornucopiist on
  • KupiKupi Registered User regular
    Kupi's Weekly Friday Game Dev Status Report
    exis wrote: »
    Interesting find. No criticism, but given your reasons for migrating, do you feel it was worth the effort? Seems it was a good opportunity to learn some stuff but also seems like it was pretty far into nice-to-have territory to start with?

    Your criticism has nonetheless been graciously accepted. :wink:

    Being honest with myself, I don't think there's actually a metric for success that I can use on this project. The primary measurable advantage that I can think of-- reducing garbage collections that occur during gameplay as a consequence of doing content loading in parallel-- hasn't manifested yet and is unlikely to for quite some time. The philosophical comfort of using only the built-in tools is really only valuable to me. So, with the benefit of hindsight: this probably wouldn't have passed muster in a professional setting. (Fortunately, I'm not a professional right now. :lol:)

    Setting aside the necessity of the thing, I completed the conversion to System.Text.Json as my JSON handler this week, and after finally getting past all the compiler errors and "oh right that needs to use properties instead of public fields" cases, I loaded up my test project and oh lord it was only rendering every fifth frame. Which shouldn't have been a thing that changing the loading logic should have been able to affect! As it turned out, the "configuration" logic that I use to set engine settings, such as the internal resolution (what the pixel-art is rendered to before being stretched to fit the device resolution), the size of the tile placement grid, collision layer interactions, and so on, wasn't reading from the settings file correctly. For safety's sake, I had set that up so that if a configuration value failed to parse, it just stayed with the default value. (So if you set the tile placement size to "dfahjdf", it'll just stay at 32.) Well, in moving over to the new JSON parser, I'd accidentally removed the logic that makes sure it never loads the configuration setting more than once, and since my old configuration settings file had some invalid JSON (which Newtonsoft was happy to parse, but System.Text.Json is stricter about), it was throwing and swallowing an exception every time you tried to use that configured value.

    When you throw and catch thirty exceptions a frame, bad things happen.

    After getting my test project (the Sonic demo) to work, I decided to make sure that my stress test project was working as well. It took a few format fixes, but I got the ants bouncing around in their maze again... and discovered that the frame time for my most-used test case had gone from 5.2 ms/frame to 6 ms/frame. Somehow, switching from public fields to properties had raised my frame time by a little under 20%. As the first StackOverflow question to come up on the subject itself states, that's a serious "wait, what?" because if you actually got that much perf out of using fields, Microsoft would tell you. And then I had a forehead-slapper: I was running my stress test in debug mode. Properties are just a syntactic sugar for methods, and while they're aggressively inlined by the JIT compiler, debug mode doesn't perform those optimizations to let you set breakpoints on them. When I ran the stress test in the Release configuration, not only did the difference between the new and old timings disappear, the base test case went to 3.3 ms/frame-- in other words I think I'm in the clear to stop worrying about perf.

    That said, I did one more thing on the subject of object serialization, which is that I wrote a custom loader for my pooled object type that allocates an instance from the object pool rather than creating a new instance when loading that object, so objects loaded from files can also be repeatedly created (and disposed) without doing garbage-producing allocations.

    Unfortunately, I'm going to have to delay the talk of my Pokemon knock-off by another week, because trying to schedule a repairman for my refrigerator took a toll in time and anxiety for several mornings this week and pushed my retraining exercise time out of the way. However, I will share the name of an ice-type move that occurred to me and struck me funny enough that I knew I'd have to use it somewhere: Snow Flak

    The next thing I have on my list is fixing a few nuisances in my content editors. Which is standing in the way of my actually using them to make content which can be used to make games which is what I'm supposed to be doing.

    My favorite musical instrument is the air-raid siren.
  • HandkorHandkor Registered User regular
    Handkor wrote: »
    The bad guys are not going to be on roller skates but other forms of travel, I don't want to make this a world that for some reason everybody settles their differences with roller derby.
    But whyyyyyy?

    I mean, you're already investing your own dev efforts into rollerskating as a mechanic. Then, your environment is already set up for that rollerskating. Then, your player is going to get onto the rollerskating learning curve.
    It sounds to me that if there's a value to your game it'll be strongly linked to rollerskating.
    So the logical thing to me would be to make it all-skating and see if that works before adding more mechanics?

    As a worldbuilder of sorts, to me the 'everybody rollerskates' is catnip.
    Primo, it stands out. You want to have a 90ies approach to worldbuilding; it has to be extreme to the max. Going solo means you don't have anyone at the table who doesn't like rollerskating and makes it all vanilla.
    Segundo, design choices should have meaning. They rollerskate because they happen to have skates along is weaksauce. They roller skate because they were actualised as the atavistic gods of destruction in this roller-derby world, now you have meaning.
    Tertio, no plotholes or fridge logic. In any world where violence is a valid option, you need to explain why swords beat guns and skates beat monster trucks. That might be handwaved away (Dune Holtzman shields) , but it could end up with stacked piles of reasons... ex: swords beat guns because swordwielders can move faster. Fast swordwielders can't themselves carry guns because guns are too heavy to move fast. Swords are lighter than guns because they are made of unobtainium. You can't make guns from unobtainium because... it has a low melting point?

    There are of course counterarguments.
    -You can explore the sweet spot of rollerskate/monstertruck interaction and make that the strong point of your game. But the more vehicles you add, the more interaction types you get, and the less likely it is that you hit the sweet spot for all of them.
    -And, sadly, realistic games do better in today's market. But that also means you're up against every other realistic game, rather than nailing the postapocalyptic roller derby niche.

    I get what your saying but I've just started working on this idea and derisking the tech hurdles first. Gameplay mechanics comes next and then fleshing out the story and content. One of my goals is to have variety between the enemy factions to not just be palette swaps. This can lead to a section of the game where you go against a rollerskating faction but I really don't want this to be a 90s style extreme everything is focused on this one thing. Heck eScooters are more common than rollerskates today so they'd be more likely to be found in large quantities. I'd rather have the protagonists succeed because they are using a novel approach that all the enemies were not ready for.

    You've already put more thought into the world building and design than I have. I'm still just exploring some mechanics so I'm not investing much energy yet into the story, that can come later when I have all the parts that I want to be working with.

    The game is not going to be that realistic, I'm already using stylized/cartoonish looking main characters already. Realistic is too much work for a one person team and esthetics and art style come much later in my process.

    Sword beats gun is easy, guns are rare and so is ammo so only bosses/end game enemies have guns. Car and truck win against rollerskates but when the roller skater can grab onto the vehicle, suddenly the vehicle is vulnerable, especially to sticky bombs or slashed tires. Again working cars and fuel will be rare so moslty bosses or near endgame. Frankly somebody on horseback seems harder to handle than a car.

    The team is not rollerskating just because they have them, it's what they are best at.

    As for marketability, I am doing this for me and do not care about target audiences and such, this is a hobby not a source of income. But as the project progresses if it does turn out to be more fun to make it a rollerskate-a-palooza-extravaganza then it'll be easy to pivot towards that.

  • CornucopiistCornucopiist Registered User regular
    Handkor wrote: »

    You had me at escooters.

  • PhyphorPhyphor Building Planet Busters Tasting FruitRegistered User regular
    "16k ought to be enough for anybody"

    So I was wondering why my compiler instance was just up and dying, so I went back and rebuilt the debug version, only to find that it had been exiting normally, and that it couldn't accept any message bigger than 16k and I was trying to send 36k of code... Although to be fair to myself I was initially planning on IPCing handles and not file contents but uh it's easier to just stuff a bunch of text in a pipe so that's what I did

    I have been doing many things in the past few months but mostly in the backend stuff

    I rewrote how I was handling all input to get the click model I wanted and reduce spurious clicks, which broke many things
    Then I decided to bite the bullet and rewrite my serialization from ad-hoc to flatbuffers and that broke many different things too
    Then I pondered how I was going to do things properly. I started writing a C++ version of the CPU & PPU as a sanity check, then I realized that I'm writing them as if I was running a normal emulator engine where you tick the CPU and that triggers bus activity and that won't work

    Because CPUs back then ran at the speed of RAM, and because they had no pipelines, RAM access was asynchronous-read, synchronous-write. This provides a very peculiar dynamic, that if you read data it is available immediately (well after some gate delays anyway) but if you write data it only has to be available at the clock edge, in other words read data depends on the address bus or specifically that an input port depends on an output port and I can't handle combinatorial cycles at all

    My testing protocol is "set inputs, evaluate, read outputs" but this is incorrect in this instance. Someone could create a design that actually passes testing because I would just provide all values anyway but if the read data is somewhere in the dependency of the address bus then the actual simulation of the whole system would fail mysteriously

    So I have to make this a component that the player connects stuff to directly, then I can pop up an error in the editor if a combinatorial loop exists. However, this isn't how hardware design languages work, so they still need to be ports when saving/loading but I have to sneakily elide them from the usual display and pretend they are ports on this entirely different component instead

    And so I rewrote my sample CPU implementation in the proper way, which turned out to be quite easy. I have a giant file with microcode entries, but to make my life easier most of those entries are either constant 0 for unreachable states (which converts nicely to a pointer) or a reference to a named local parameter that sets up all the bits in a defined way, so to create my C++ version I just make an array of function pointers, implement each of my constants as a function that looks like so
    void ADDR_ZP(NMOS6502 *cpu)
    {
    	cpu->addr = cpu->readpc();
    }
    void ADDR_ZPX(NMOS6502 *cpu)
    {
    	cpu->al += cpu->x;
    	cpu->readpcninc();
    }
    void OP_STA(NMOS6502 *cpu)
    {
    	cpu->write(cpu->addr, cpu->a);
    }
    
    and reformat the list like this
    	// 95 STA d,x
    	ADDR_ZP,
    	ADDR_ZPX,
    	OP_STA,
    	INSTRUCTION_FETCH,
    	0,
    	0,
    	0,
    	0,
    
    and boom instant cycle-precise bus-agnostic CPU

    With any luck I can probably use that to automagically generate the million test cases I'm going to need for a thorough test. Although even for that I've been thinking about how precise and picky I want/need to be. There's the first level where the instruction is implemented logically. Next level, it's implemented with the correct cycle count. Then, because it has no concept of "idle bus cycle" (yet, the 16-bit version added that) it matches the correct sequence of operations, eg RMW instructions always read the address, then write the original data back, then write the new data back. "Page crossing" instructions have a cycle that reads from an address 256 bytes away from the real address, etc. Then finally, undefined instructions are implemented (which I don't even do yet). I'd like to accept and recognize all of these as increasingly precise implementations, and probably score them amongst only peers when I get around to that

    I also created a little circuit that will let me draw text (and it flips the color each frame)! Uses features not available in the editor yet though. It's actually quite heavyweight, with 2 8-bit adders per character. It's adding constants so maybe my optimization passes are eliminating some gates but still, 23 MHz is a pretty nice result, I only need 5.4 to run it realtime and this might be roughly comparable to how big the sprite engine is
    lik0tlkmlxrv.png

  • KupiKupi Registered User regular
    Kupi's Weekly Friday Game Dev Status Report

    Circumstances conspired to leave me emotionally and physically drained this week (either dealing with a refrigerator that the repairman ensured me was working correctly the day before it actually died and left a puddle in my kitchen, or feeling the effects of my COVID booster shot for most of the last 24-hour period). Therefore, not much was accomplished. To make up the deficit, I'm going to make this post itself part of my game dev work by describing the premise of the game I'm working on as retraining for the job market.

    A while back in a previous game dev thread, I discussed a game prototype I'd made that used the game of Nim as a basis for a JRPG battle engine. The game of Nim goes by many names; for instance, there was a Flash game called Pearls Before Swine that made the rounds in the Internet of the late 90s/early 2000s. It's an exercise that shows up in programming interview questions and any time some video game needs a puzzle to wall the player for a little bit. The short version is that Nim is that game where you have one or more piles of tokens, and on each turn you have to pick up some restricted number of the tokens. Your goal is not to be the one who takes the last token. I felt that Nim could contribute an interesting element to a JRPG battle engine by providing a "board state" separate from character HP, MP, and status effects. In most JRPGs, what happened last turn has very little effect on your decision-making; you choose the same options round after round in an attempt to bring the enemy's HP to zero, stopping only to heal or work around a bad status effect.

    In my original prototype, events that would normally be influenced by the randomizer-- like critical hits and misses-- were instead put on a timeline of events. Every time a character (or team) took their turn, the timeline would advance by a particular amount based on what move they were using, and whatever node on the timeline they landed on would affect the outcome. If you landed on a critical hit node, then the attack would be a critical hit. If you landed on a miss node, the attack would miss. There were also things like half-damage or bonus-damage nodes, MP cost reduction nodes, and certain moves would directly influence the timeline, like turning nodes into land mines that caused the character who stepped on them to take damage. I wrote a minimax AI to play as the enemy, and it was able to reason through the battles quite well-- too well, in fact.

    See, the timeline was generated on a fixed schedule, depending on the battle. That meant the AI was able to reason about the consequences of its decisions fifty turns out. Meanwhile, I discovered that humans (at least, the one human exposed to the game, myself) really struggle to see more than two or three turns out, especially once the timeline started to fill up with triggered effects and extra negative nodes. It worked, but it wasn't fun. So I put it into storage and moved on to other projects.

    So, lately, I decided to revisit this design with the knowledge I'd gained from the first attempt. Between the arrangement of the combat parties (in the original prototype, there was a Darkest Dungeon-style marching order) and the constantly-mutating timeline, there was actually too much "board state" for a human to handle. On the first point, a Pokemon knockoff makes a great fit for a game with one-on-one duels, so that's the direction I'm going for the framing device. And as for the timeline itself, the timeline no longer has an extensible node type, but represents a simpler, reusable state. Now, the timeline is just a randomly-generated stream of digits from 0 to 9, plus two special symbols. That is, at any given time during a battle, you see something like this:
    > 1 * 5 8 1 6 2 1 8 X 3 5 5 6 0 4 5 6 0 0 8
    

    Where the ">" represents the current head of the timeline, and the numbers thereafter approach from the right. On any given turn, you first choose to advance the timeline by 1, 2, or 3 spaces, and what the number you land on determines is which of your moves you're allowed to use. Every move has a range of numbers it's allowed to be used on; in my head, it feels appropriate for weaker moves to be available on a larger range of smaller numbers, while stronger moves are available on a narrower range of higher numbers. Or, to borrow some terms from Pokemon, you can use Thundershock on 0-4, Thunderbolt on 5-7, and Thunder on 8-9. (And the move actually has to be one of the limited number of moves you're allotted per monster to begin with.) (You are allowed to land on a space you have no moves for-- you just can't actually do anything on that space.) Therefore, your choice of how much to move the timeline ahead not only influences what moves you have available on your turn, but what moves your opponent will be able to choose from on theirs.

    There are two special symbols on the timeline, the * and the X. The * is a wildcard and always lets you use any move. The X is a penalty space; not only will you lose your turn for landing on it, you'll lose your turn just for crossing it. This produces the dynamic of the original game of Nim, with both players trying to avoid being the one to cross the X and lose a precious turn. (There's actually a third special symbol, the "taming" symbol, but that's used to add wild monsters to your team and doesn't bear elaboration at this point.)

    Because only 21 numbers exist on the timeline at once, there is a hard cap to how much the computer can think ahead of the human player. It's subject to similar uncertainty regarding the next values to come down the pike.

    So, that's the premise I'm working off of. I feel like this design avoids the excessive complication that plagued the first one, giving a human a much better shot at keeping up with the AI.

    On an unrelated note, I am making a point to be more deliberate in the use of my time. Time management has been a weakness of mine of late (and was rather involved in why I lost my last job), so I'm taking up a strategy of forward-declaring my intent for how I'm going to spend the next hour, every hour. Hopefully this will produce better results than just going wherever my heart takes me. We'll see.

    My favorite musical instrument is the air-raid siren.
  • PhyphorPhyphor Building Planet Busters Tasting FruitRegistered User regular
    That's an interesting turn system but who loses their turn is always "fixed"

    > 0 1 2 3 4 5 6 7 8 9 X

    (6,7,8) -> 9 because your opponent is always forced to skip
    Therefore, 5 -> (6, 7, 8) always leads to losing your turn
    (2,3,4) -> 5 because your opponent is always forced to skip
    Therefore, 1 -> (2, 3, 4) always leads to losing your turn
    Player 1 should advance 0 -> 1 and player 2 always loses their turn. Player 2 will in fact always lose their turn unless there is already a multiple of 3 numbers until the next X. Now it's possible individual move power levels can override this as the player who is losing their turn anyway has more freedom to choose and maybe the forced numbers suck but there is almost certainly a "correct" answer at any point

  • KupiKupi Registered User regular
    Kupi's Weekly Friday Game Dev Status Report

    All my game dev activity this week was on the Pokemon knockoff. I've slipped into a pretty comfortable TDD rhythm, picking the next obvious thing that needs to be done, writing a test for it in NUnit, and then implementing and/or fixing the required behavior if/when the test fails. As it stands, the engine can now handle the absolute bare minimum of what constitutes an RPG battle-- Tweedledee and Tweedledum (my test monsters) will merrily slap and/or hit each other with hammers until one of them is forced to flee. This can branch in one of two directions-- either I can take that and go back to working on story/map navigation now that you can actually get to the end of a resolved battle, or I can keep working on battle features like status effects, type effectiveness, and the AI controller. Who knows!
    Phyphor wrote: »
    That's an interesting turn system but who loses their turn is always "fixed"

    > 0 1 2 3 4 5 6 7 8 9 X

    (6,7,8) -> 9 because your opponent is always forced to skip
    Therefore, 5 -> (6, 7, 8) always leads to losing your turn
    (2,3,4) -> 5 because your opponent is always forced to skip
    Therefore, 1 -> (2, 3, 4) always leads to losing your turn
    Player 1 should advance 0 -> 1 and player 2 always loses their turn. Player 2 will in fact always lose their turn unless there is already a multiple of 3 numbers until the next X. Now it's possible individual move power levels can override this as the player who is losing their turn anyway has more freedom to choose and maybe the forced numbers suck but there is almost certainly a "correct" answer at any point

    This is a worthy objection. I've been leaning on the hope that just choosing the options that win you the game of Nim won't necessarily be better in terms of damage output from the moves you use along the way, but as Shin Megami Tensei V recently reminded me, hope is not a strategy. This gave me another idea, though: move usability isn't just restricted to specific ranges of moves, it's an abstract class that's capable of examining the entire state of the battle to determine if a move is usable. (The intent was to have, say, counter-attack moves that can be used on any number, so long as that number is higher than the number your opponent used for their last move.) Therefore, the condition "advancement of the timeline crossed the X" doesn't instantly result in the loss of your turn; rather, it's just an input into the move usability check for each move. That means it's possible to have moves that are still usable when crossing the X-- though I'm inclined to make such moves only usable on crossing the X, in order to create the sort of "circle trump" dynamic that exists in games like War (the card game) where the Ace, as the card with the lowest face value, gets defeated by every card except the King, which can only be defeated by the Ace.

    Or to put it in other words, while crossing the X could normally render all moves unusable, there could be a class of moves that are only usable when crossing the X, which I'm inclined to make the recoil moves or "disaster options" like Explosion. Sure, you can force me to take the X, but my monster is the kind that can have Explosion. Force me to take the X and I'll kill us both. :lol:

    My favorite musical instrument is the air-raid siren.
  • halkunhalkun Registered User regular
    edited December 2021
    So, I just finished my second all-nigher in a row. I have a new project I'm absolutely obsessed about and I have no road blocks so far. I want to talk about it.

    So let's talk about pineapples and the chronicles thereof.

    Sometime around 2007, I came up with an idea to teach Japanese through a video game. I didn't want to make something pedagogical, I wanted to make it like Emit which was a visual novel that taught English via a plot of a time-warping portal and the main characters in life-threatening situations.

    My idea was you were stuck on an island with a Japanese girl. You can't speak Japanese, nor her English. The conceit was you had an electronic pocket Japanese dictionary/translator, but it had an AI that was super peeved that it got broken and wet and refuses to talk to the girl directly. This forces you to play a game of telephone when you want to communicate, and in the process learn Japanese. The name of the game was called "The Pineapple Chronicles", named after the logbook you had (with a pineapple on the cover) where you wrote down all the Japanese you learned.

    I tried to make this game FIVE TIMES!

    My last effort was going to be my last big push. 100% not stopping and not turning back for anything! It ended in such a spectacular disaster, I wound up a few thousand dollars less then when I started.

    I decided to scrap the whole thing.

    So very recently I had an epiphany and my stupid disaster of an idea come to life again. I immediately hit the breaks. No. Not again. "Pineapple" is dead and I'm not going to go for a sixth time. However, the idea I had appeared to be very doable, Unlike my other tries I made some low-key prototypes and the system seemed sound. There is no foreseeable scope issues, tooling could be made pretty easily, and the data models was really consistent and extendable. Yes, I was making my own engine, but the foundation was stable and I would know the system through and through and not trying to program by accident which plagued my older attempts

    But I wasn't going to touch "Pineapple" again. The core idea is the same: Learn Japanese through a story, and not through lessons and rote.

    So, against my better judgement. I'm making the sequel instead.

    The name "Hakari: A Pineapple Story" may be a little silly. I will probably drop the subtitle, but it kind of amuses me to think about keeping it in. Especially when the book from the first one isn't even in this version on the game. I was even thinking about calling it "Hikari:The Pineapple Chronicles part 2" but I decided to probably keep the dead buried.

    Oh. So the hook of this game is that I decided to smoosh together Japanese Visual Novel technology with a 1980s text adventure game system. So basically a VN, but *much* more interactive, and a text adventure game, but *much* more visual.

    And the plot? As opposed to coming up with scenarios where I had to figure out how to get two people to talk on a desert island. I decided to teach Japanese the way, I learned it. Basically by having my 14-year-old ass dumped in the middle of Kanagawa. You just open you mouth and hope that what falls out is intelligible. It helps that MANY plot points are being ripped from my own growing up in Japan, with many names being changed to protect the guilty. It's also going to be, hopefully, super funny. (The protagonist is 23 by the way)

    There are a few conceits that made it over from Pineapple that have a new coat of paint. The translator is just your phone, and you have a little more agency to look things up. There are more characters with varying degrees of English proficiency. Mostly, it's about dealing with the tenant who lives one unit down from you in your small apartment building.

    Every game needs a hook and a kicker, so here is mine:
    "A visual novel adventure game where you try and learn some Japanese in Yokohama, and try not to get killed in the war between your cute next-door neighbor and a few pan-dimensional bio-mechs.

    I know I kinda buried the lede there.

    I'll have screenshots and more techy stuff soon. Oh and I'm also funded with a low 5 digit budget!

    I didn't mean to write a book. I'm just kinda super excited about this.

    halkun on
  • halkunhalkun Registered User regular
    edited December 2021
    Architecture:
    So the thing that makes my game different than the others I've tried to make is my data management. For those who don't know I'm an old-school C programmer and so many of the current Object Orientated paradigms are a black art to me. However, data speaking, everything in my game in an object. I mean everything. This means the inventory you have, the people you meet, the locations you visit, even the passages between, the player, and the "holdall" that holds you personal inventory. You can issue the same command on any object, and depending on what it is will action in some way. I define an object using a struct.

    Now I know some of the C++/C# people may think that a class will be a better route. This way I gain abilities such as inheritance, overrides, and even... well methods, but I'm an curmudgeon and I like C and for many moons I've worked around this, and will continue to do so.

    That is not to say, I'm not "cheating" a bit. My struct has a few function pointers in it so that you can call functions in it. Mind you it's the function that determines the object behavior and not the struct itself. (vtables are for wimps!).

    Mind you, with the lack if inheritance, my one object struct as many many attributes that are really irritant to particular types of objects. For example, I can give make a location portable, or put a person in a bottle. However, I can also give a coin light to illuminate a room.

    So, my game will potentially have thousands of objects and I'm going to need some way to wield and organize them.

    Originally I was hand updating object.c and object.h, and that gut dumb real quick as I was forgetting irrelevant, yet required attributes. (You have set the attribute false, but it needs to at least be there.) The was changed to a text file that an awk script ran through, generated the code, and filled in the blanks. When this got stupid, this was again changed to a python script that takes JSON as in input, and adds relevant default attributes depending on object type. One again, for example, rooms are fixed in place by default. A person object has pronoun attributes set to "they/them", but a "woman" object gets all the same "person" defaults, but sets the pronouns to "she/her". Of course, most objects get a graphic attribute as well that will put it on the screen.

    I also use some external utilities to manage my data as well. I use Trizbort and oStorybook to manage my map, objects, and story. Screenshot is here that has sample data. This has proven to be invaluable as a planning tool

    I also suppose a current screenshot of the game would be in order.

    I also have a screenshot from earlier prototype to get a feel for the GUI layout and interface. The box in the lower right hand corner is going to be a navigation compass rose, with tabs for actions and inventory management.
    The absolute coolest thing of all, is that you can play entirely with the keyboard, or use point and click, and, if I play my cards right, will have spoken audio... That means you can play the game completely blind too! (Or with all the text.. completely deaf too..) I wouldn't recommend both blind and deaf as that would probably hamper the game experience, but I guess technically you could do that too.

    Oh, if you guys know a good offline JSON editor... That would be sweet.

    halkun on
  • CornucopiistCornucopiist Registered User regular
    edited December 2021
    So, shit happened almost two years ago. I got COVID, and it's given me something akin to early onset dementia. It's not super worrying, but I recently realised that I'm sliding backwards in my mastery of English. And while I'm scaling the slope towards 'okay writing' I might never get there, because even as I gain writing skills, my fundamental language skills are disappearing
    A friend who also had COVID has the same symptom: we mess up idiom and expressions. For example; when I talked about it on fBook, I nearly wrote 'throw in my hat' instead of 'throw in the towel'. I caught 'hat' being wrong, but it took ten minutes for 'towel' to come to mind.
    It's been getting worse, and it coincides with my personal life being hard, and my post-COVID brain having serious concentration problems when trying to do my day job.
    Anyway, as a brain does, not half an hour after I decided I might quit writing, my brain came up with a sudden insight.

    I want to create a happy place. My writing is a lot of things, but it's not a happy place.
    This was a specific vision: a mix between Magnum PI, Terriers (late, lamented) and Psych. A detective who lives on a warm, sunny beach.
    I write sci-fi, and there's a certain attraction to the challenge of writing sci-fi with such a limited scope, in such a specific context with the goal of the end result being feel-good.
    But, as I said, my writing has anyway gotten harder than is manageable, and it always veers into grimdark.
    Whereas my game development is easier to steer towards that happy place.
    So I'd like to start thinking about such a detective game, simple, mobile, bite sized, for 2023.
    I now have robust UI systems, I am going to finish a robust city generator in 2022, and I've started work on a 'smalltalk' generator. Should I foresee more systems apart from the obvious 'case generator'?

    For the case generator, off the cuff, I'll need a *client*, who is part of a social network. I need *persons* who are part of the social network (suspects) or geographically involved (witnesses). I need a *case resolution*, which is made up out of *cause-and-effect steps* with social relations weighting, and each *step* should have a set of *clues* attached which exist in a geographic distribution along with non-pertinent clues.

    What do you guys think?

    Cornucopiist on
  • KupiKupi Registered User regular
    I think I like making a "happy place" with that premise. Just avoid violent crime and you're golden; this is a place where people call the private detective for a missing person who turns out to have just forgot to charge their phone before going for a long drive and kid's teddy bear goes missing because a seagull picked it up and dropped it in the bed of a passing pickup truck. :biggrin:

    My favorite musical instrument is the air-raid siren.
  • IncenjucarIncenjucar VChatter Seattle, WARegistered User regular
    Frog Detective would approve.

  • KupiKupi Registered User regular
    Kupi's Weekly Friday Game Dev Status Report

    This week was entirely consumed with my Pokemon knock-off, not just because it's now my regularly scheduled activity between the hours of Get Out Of Bed and Eating Lunch, but also because I think I have an unhealthy fixation on the engineering challenges that's keeping me from getting along with the actual game design parts on my MonoGame engine.

    That said, last week I said that I could either return to the main game flow or keep plugging away at the battle engine, and it turned out that my heart preferred the latter. Aside from a few trivial math-related tasks (like STABPower Bonus For Same Type and type effectiveness), the bulk of the work this week was implementing the game's major status effect management. ("Major" in this case being what Pokemon would call a non-volatile status.)

    I was going to give a brief review of the core premise of the battle engine here, but I trust y'all can scroll up eight posts if you need that context.

    Because the game's only permitted randomness is in the generation of the timeline, attacks can't have a percentage chance to inflict a status ailment. So, instead, I'm going with what I perceive to be a Sekiro/Soulslike system of status effects, where attacks that inflict status effects accrue status effect damage until they finally reach the point where they apply. So in my engine, each Nimster (have I mentioned that I'm calling them Nimsters yet*? I have now, if not) has a Vitality stat that serves as your "status health". Each status's damage is tracked separately, and gaining status damage in excess of your Vitality for any individual one means that status effect is now applied. Moreover, every status effect can actually wrap around and apply multiple times; some of them have caps, but each one can stack up at least twice. Here's how each one functions:

    Poison: It's a traditional poison status; after taking your turn, you lose 1/16th of your maximum Health for each stack of Poison you have. My plan to is key the absolute center damage rate (average power attack against an average Health stat from an average attack stat to an average defense stat) to defeat a Nimster in six attacks, so inflicting a stack of Poison each turn works out to victory in around the same number of turns, and possibly fewer if your opponent has lower Vitality than Health.

    Paralysis: Remember how I said my previous version of this battle engine had concepts that were easy for the computer to navigate but nearly impossible for a human? ... I think I did it again. Instead of randomly denying you your turn (which this engine doesn't support) or halving your Speed (which doesn't exist in this engine), Paralysis overrides your moveset with a worthless "shudder" move if the number you land on has a specific relationship to the current turn number (public knowledge). Those being:
    1 stack: If the turn number and the number you land on have the same 1s digit. (i.e. landing % 10 == turnNumber % 10)
    2 stacks: If the turn number and the number you land on plus or minus five have the same 1s digit. (i.e. landing % 5 == turnNumber % 5)
    3 stacks: If the turn number and the number you land on are both even or odd. (i.e. landing % 2 == turnNumber % 2)
    I think I can make this easier to reason about with a good visualization of the timeline, meaning, I might be able to calculate in advance which timeline nodes will be disabled on which future turns and communicate that to the player.
    The Star, as a positive wildcard, is counted as never matching the turn number for the sake of producing a Shudder.

    Sleep: Sleep replaces your entire moveset with the useless move Doze and the Sleep-cancelling move Wake. Initially, Wake can only be used on 9, and Doze is usable on every lower number. For each turn Doze is used and every time the Nimster takes direct damage, the minimum number to use Wake reduces by 1. As with Paralysis, the Star can be used to Wake regardless of the sleep counter. If the status effect is reinflicted, the sleep counter goes down by 1 (increasing the minimum number to use Wake, not above 9).

    Pain: Quick aside: instead of individual PP for each move, Nimsters have a "Stamina" stat that fuels all of their moves. (Consequently, Nimsters have stats called Health, Vitality, and Stamina, all of which have been used to mean "HP" in other contexts... :lol:) Pain increases the amount of Stamina used by a percentage (25% now, but subject to change as balance concerns surface) for each stack.

    Tangent: when a Pokemon runs out of PP for all of its moves (or is otherwise rendered unable to use any move), they're forced to use "Struggle", a weak, typeless attack with a massive recoil ratio. When Nimsters run out of Stamina, they instead pay for the attack by losing a percentage of their maximum health (their actual maximum health, not "an amount of health which is a fraction of their maximum health") matching what they would have paid in Stamina. Since you can't regain Stamina by any means during a battle, this means that even if you use recovery moves without the Stamina to pay for them, you're eventually going to fall on the floor because your maximum Health trends toward 0.

    Bind: You lose the ability to advance the timeline by 1 for each stack of Bind, to a minimum of 1. (This was originally Freezing, but I figured calling it "Bind" lends itself to a wider array of thematic expressions.)

    Weak and Blind: Weak and Blind function similarly, granting a point of Block or Evade to the enemy for each stack on the attacker. Which leads to the question, what are Block and Evade? Without affecting usability, Block and Evade cause attacks that land on specific ranges of numbers to fail, with Block counting upward from 0 and Evade counting downward from 9 (under the idea that lower numbers represent weaker attacks that would be easier to negate by blocking, and higher numbers represent stronger but slower attacks that would be easier to negate by dodging). You can get Block and Evade from various sources, and likewise there will be attacks, passive abilities, and other factors that punch through or ignore Block and Evade entirely.

    Fear: When inflicted, the Nimster subject to Fear immediately retreats, which is Nimsters's euphemism for "fainted".

    ... and that's it for the game's major statuses! With the battle engine functioning at a minimum-viable-product level, I feel it's time to start moving back toward the main gameplay context, which means creating a somewhat unintelligent opponent AI to take the reins as you battle other trainers, which will enable the game to advance past the point it's at now (the first fight with your annoying kid rival).


    * Note how Kupi does not scroll up eight posts to get the necessary context.

    My favorite musical instrument is the air-raid siren.
  • halkunhalkun Registered User regular
    edited December 2021
    Do you want to know how to hate yourself for a few days? Dive into the bowls of UTF-8 and implement Ruby characters (Furigana).

    flyay7z6zji7.png

    Not only does it work. I actually follow the Unicode standard using the proper anchor, separator, and terminator code points.

    halkun on
  • Endless_SerpentsEndless_Serpents Registered User regular
    This doesn’t count for anything but I wanted to show somebody.

    zr4jwft0soio.png

  • KupiKupi Registered User regular
    edited December 2021
    One of my longstanding ideas for a toss-off/ramp-up game dev project to proof-of-concept my platforming game code has been Attitude Mammal, the absolutely generic platform hero. That design's worthy of the title. :lol:

    Kupi on
    My favorite musical instrument is the air-raid siren.
  • Endless_SerpentsEndless_Serpents Registered User regular
    edited December 2021
    You folks remember Knytt Stories? It was a little platformer where you could make and post large continuous levels for others to play. Just been thinking about it today, along with Mario Maker, but for a slightly faster character and a bunch of mechanics stolen from Celeste. Plus a hookshot? Sure.

    Anyways, have a matching generic final boss: C.E.O

    waxwazz7xrcj.jpeg

    Wait no, maybe like this?

    9iowhyqs3wu7.jpeg

    Endless_Serpents on
  • Endless_SerpentsEndless_Serpents Registered User regular
    Kupi wrote: »
    One of my longstanding ideas for a toss-off/ramp-up game dev project to proof-of-concept my platforming game code has been Attitude Mammal, the absolutely generic platform hero. That design's worthy of the title. :lol:

    Attitude Mammal was too fun not to doodle.

    87uu58zrylxg.png


    I can’t wait to see them skate around Red Ruby Location with their pal Wings.

  • halkunhalkun Registered User regular
    I have been coding for 15 hours....

    Spoilered for big...
    d3xtwn1r6p4t.png

    So I have my windows system 90% done, it has window titles, colored text, and themes. (You can also place the window anywhere) The last I have to do is multi-page scrolling. When the text is full, a little throbber comes up letting you push a button to continue. It will then scroll up the screen and continue.

    After that... It's input!

  • SmokeStacksSmokeStacks Registered User regular
    The gamedev thread in the Christmas hangout inspired me to give Unreal a go (my previous experience is comprised of goofing around building some very simplistic levels in Hammer/Worldcraft like 20 years ago and making some slightly less simplistic levels for Duke Nukem 3D in the BUILD editor a bit before that, so I essentially have zero experience).

    I'm following along with a 5 hour long UE5 starter tutorial, I'm about 40 minutes in in videotime (so a little over an hour realtime) and it has been pretty fun. So far I've gone over setting up a new project, looking at/adjusting the size of/rearranging the locations of windows in the UI, selecting objects, adding objects, moving/scaling/rotating objects, deleting objects, and copying existing objects. Behold, ye mortals, I bring to you the Conference Room of the Damned! Set your eyes upon it if you dare:
    3nthgpuikuxg.jpg

    The next step was to build a very crude building with an offset roof to see the difference in lighting inside and outside, and look at post processing and camera exposure settings (I won't show this building because it is embarrassing even to myself). The next section is an intro to materials but I think this is a good spot to call it a night.

  • ZekZek Registered User regular
    edited January 2022
    I've been trying to get myself back into game dev over the holidays - I've documented in this thread my struggles with motivation and sticking to projects. One thing inspiring me to get back into it is going through the Science of Well-Being online course (highly recommended!), which observes that people tend to be happier when they're in a highly productive flow state than they are when they're just relaxing. I've found that my hobbies are inadequate for this and game dev allows me to get into that flow state; however I'm not that creative and I struggle to feel confident about my ideas as I build them out. Maybe I could join somebody else's project and let them do the design, but that feels like it would become similar to a job and I already do software for a living. I ordered The Art of Game Design: A Book of Lenses and we'll see if reading it helps me to find a better process for this.

    I haven't ruled out the idea of going back to my previous project but I figure I'll start on something simpler. I'm thinking of building a purely UI-canvas-driven idle game, with the design challenge that it's completely without text, just driven by icons and widgets that the player has to intuit the function of on their own. I figure that differentiates it a bit and creates a number of interesting design challenges. I started building it with basically no theme, just abstract icons, but that felt too boring. Now I'm thinking of doing a pokemon sort of thing where each button is a pet and you build up a menagerie with a basic battle system etc.

    Zek on
  • SmokeStacksSmokeStacks Registered User regular
    Ok, so, Materials now.

    iu4rhr587wm8.jpg

    So with an ugly flat yellow/orange we can crank the metallic level up to 1.0,, and the roughness to 0.0, and we get a nice gold reflective surface. After this I paused the tutorial and tried to make a "regular" mirror by creating a new cube, scaling it to a mirror shape, and applying the same texture but with no color by dropping the color saturation and value down to zero, and it worked. So then I thought I'd duplicate it and see if I could create a HOM, but that did not work (the reflected mirror was just a flat ugly beige color inside the reflection). Back to the tutorial.

    38six61fbcja.jpg

    So we added some noise as a roughness texture to age the monument, then used the linear interpolation feature to make it so that anywhere on the roughness texture that is black should show up as the brown rust texture (a stand in for dirt), and anywhere on the roughness texture that is white should show the ugly orange texture.

    jdsknabb0sfj.jpg

    It worked. It looks like a yellow tennis ball that is covered in dog poop, but it worked.

  • KoopahTroopahKoopahTroopah The koopas, the troopas. Philadelphia, PARegistered User regular
    That "Book of Lenses" book was a textbook I used in some game design courses. It's pretty good, definitely helps define the right type of game to help fit what you're looking to do.

  • ZekZek Registered User regular
    I spent a couple days on the basics of my minimalist idle game but I'm not sure there's anything here. The premise is that you keep your pets fed and they give you a heart currency which you use to unlock stuff. Then I added a day/night clock widget that allows you to generate sun/moon currency based on time of day (because solar/lunar power? idk). But for an idle game to be compelling it needs a coherent premise and a long runway of new mechanics to unlock over time, and I don't have many ideas past this. Here's what I did so far:

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

    Right now I'm starting to go back to the RPG wizard battler project I started last January (feels like forever ago). Fortunately the code mostly still makes sense to me. I think I gave up on this one prematurely and the fundamentals are pretty decent. Where I left off I had just reworked the progression concept, I changed it into a roguelike structure with equipment found during a run and substantial permanent progression in between runs.

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

    First order of business is getting it running in Unity WebGL, since I now know I have to do my saving in PlayerPrefs instead of file saves. I'm also hoping I can get copy/paste working in the browser so I can use that to export/import save data as text, which is a staple of browser games.

  • halkunhalkun Registered User regular
    I didn't realize the forums were back...

    Progress on my Visual Novel/Interactive fiction engine I'm working on...

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

  • ScooterScooter Registered User regular
    So, GameJolt just up and banned all mature content games today out of nowhere. While it seems aimed at porn games, given that there was no warning and the broad nature of the filters, it seems a lot of other games got hit as well.

    While they do of course have the right to choose what content goes on the site, the suddenness of the reversal after allowing adult content for years seems really unprofessional. It doesn't help that their PR dude on twitter's been acting extra salty when presented with legitimate concerns, pretty much directly pushing people to go to itch.

    I've been debating whether or not it would be worthwhile to put my next game on there given the poor traffic I've gotten with my first one, but this pretty much settles it...even if they reverse course at this point, it doesn't seem like a site I'd want to bother with at this point.

  • ZekZek Registered User regular
    I'm getting back into the swing of things, I fixed some very obnoxious WebGL bugs and got a working demo! https://zek23.itch.io/magicario

    It's still very rough on polish but the basic gameplay loop is in there, I'd appreciate any feedback on how to make it more fun. I feel like the combat still needs something but I'm not sure what, I might make it turn-based with an optional auto mode so the difficulty can be tuned to be more strategic. The first thing I'm thinking of doing is removing the per-run XP bar and leveling up since it feels pretty superfluous and just makes the game balance weird - I can put all the progression into gearing which players have some control over (with the upgrade to reveal chests).

Sign In or Register to comment.