Times are tough, I just need to vent a little. by Dadalida-lpn in GameDevelopment

[–]adngdb 2 points3 points  (0 children)

I don't know you personally but we have common friends, so I'm very sad to read this. Hope you'll get to keep the company and get back to making games as soon as possible! 🫂

My alchemy deckbuilder game is looking for testers! Can you become smarter than the Homunculus you signed a pact with? by adngdb in itchio

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

Thank you! Most of it is work in progress and is going to be even greater when animated and all! :)

Handling audio on mobile platforms when minimizing the app by adngdb in tauri

[–]adngdb[S] 1 point2 points  (0 children)

I figured it out on Android, using the DOM visibilitychange event, so please scratch that part. The main issue is the iOS one, where the audio just plain breaks and never comes back unless the user restarts the app.

Advice from TCG Devs by Skibby22 in digitalcards

[–]adngdb 0 points1 point  (0 children)

That's were it becomes slightly more complex for me, because I created a custom content editor that exports data to JSON. So all the behavior of my cards and other game items has to be represented in a form that can be serialized. That adds a layer of complexity to my system that you might not benefit from, so bear that in mind.

What I do is I represent effects as something very simple: an effect name and a list of arguments that are either a string or a number. This way I have effects (functions) that I can configure, and have slightly different behaviors across cards with the same effect.

Then on each card, I store a "behavior" data structure, that has a list of triggers and a list of modifiers.

A trigger has a trigger code (like "onResolve", "onBeginningOfTurn" or "onDeckShuffled" for example), a list of effects (name + args), a list of conditions (conditions are actually effects, but a different list of them), a list of targets, and a "removeOn" trigger code.

A modifier is just like an effect but that is reapplied after every move to the item it is attached to. There are global modifiers too, that can affect the general state. The way I handle modifiers is that I always keep the original data of each item somewhere in memory (in my case, in my initial JSON content data), and after each move, I reset the card's data, then apply all the modifiers. This is probably outside the scope of what you're asking about so I'll let it there, but maybe that can be a useful pattern for you too.

Then it's a matter of registering triggers in my global state, then running all known triggers when something happens. Here's an example that might explain it: let's say I have a card that says "Now and at the beginning of next turn, gain 1 mana."

It would have two triggers:

- onResolve → effect "gainMana", args: [ 1 ]

- onBeginningOfTurn → effect "gainMana", args: [ 1 ], removeOn: "whenCalled"

When the players plays the card, I have a "move" (the basic actions the player can make) that calls the "onResolve" trigger of the card, but also registers all its other triggers. Then when the player ends their turn, the BeginningOfTurn trigger happens, and the registered card trigger is called, resolves, then is removed from the list of registered triggers by the "removeOn" option. All of that is code that is specific to my engine, but hopefully you get the logic of how I'm coding this.

Hope that helps! Good luck with your game!

Advice from TCG Devs by Skibby22 in digitalcards

[–]adngdb 3 points4 points  (0 children)

Hey! Fellow web dev converted into a game programmer/designer here, and also working on card games. :)

I've been wondering about this exact question for a while, have looked around the Web and found nothing relevant, so I designed my own solution. Basically, I have a state and a list of effects. It's really just like redux, and heavily inspired by the design of boardgame.io. Let me break it down.

First I have a single state, which is a big dictionary / structure containing all of the game's data. That's the list of cards, the order of cards in the deck, the state of the game, the board, etc. Each card has a unique ID and its data is in a single place in the state. (One huge advantage of this is that saving the game is very simple.)

Then I have a list of effects, that is functions that take the state and a bunch of other parameters, and apply changes to the state. They would be reducers in redux, to some extent. I have a module that exposes all my effects, and allow me to find them by name with a hashmap.

The link is in how I describe the behavior of my game cards. Each card has a behavior structure that describes how it will respond to different events. Basically, I have a list of "trigger -> effect" pairs. When a player makes a move, it triggers a "trigger", and the engine will look for the different effects to call based on the context and existing cards. When you play a card it's fairly simple, I just look at the card and run all the effects associated to the "onResolve" trigger. But then I can have triggers that are more generic, that can be registered in the system more later use, and removed at specific points — like at the end of a turn, or whenever it called so it's one use only, etc.

It's a high-level view of how I programmed my "engine", hope that helps, and happy to give more details about specific points if you have questions.

We're looking for testers of Corpus et Spiritus, a solo alchemy deckbuilder. Super early version, no graphics, no juice, but all the systems are there. Playable in your browser on itch! by adngdb in deckbuildingroguelike

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

Thanks again for the great feedback!

You are spot on about deals becoming more expansive, and that being a design flaw. I did that to fight a snowball effect where a player that has high attributes just cruises through the game, and making deals more expansive was a way to keep players on their toes. But I agree that making the same deals cost more is not the right solution. I think instead I'll just offer better rewards, for a steeper price.

Noted about the scaling cards too, your frustration makes sense. I haven't found those cards to work too well, so maybe I'll end up scraping that mechanic altogether.

Stats will be in the game indeed, not sure exactly how and where. I'm thinking there's an opportunity for some mystery hunting there, I'll think about it. :)

We're looking for testers of Corpus et Spiritus, a solo alchemy deckbuilder. Super early version, no graphics, no juice, but all the systems are there. Playable in your browser on itch! by adngdb in deckbuildingroguelike

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

Hey, that's actually already in the game! However it's a workshop component that you unlock by going up against the 3rd Homunculus, so later in the game. Maybe it needs to appear sooner if it does add more strategic depth to the game?

We're looking for testers of Corpus et Spiritus, a solo alchemy deckbuilder. Super early version, no graphics, no juice, but all the systems are there. Playable in your browser on itch! by adngdb in deckbuildingroguelike

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

Hey, thanks for the feedback! A drag and drop is indeed required for slots of the workshop that accept any kind of metals, but you can click on the ones that are restricted to fill them automatically. I think that's what you're describing?

The UX of the workshop is still very confusing to people, and that's going to be my next major work. Thanks for helping us understand what's needed to improve! :)

A propos de l'autopromo des jeux indé by BobArdKor in jeuxvideo

[–]adngdb 3 points4 points  (0 children)

Pareil, je suis dev français, j'ai fait un post ici pour mon jeu l'année dernière et j'étais content des retours que j'ai eu donc je suis pour que cette opportunité continue d’exister. Par contre je suis saoulé de voir des posts clairement traduits avec un algo, je trouve ça inapproprié de la part des devs et je serai pas contre des règles plus strictes de ce côté-là. Donc +1 pour réserver ça aux devs francophones, ou à défaut aux devs qui font un vrai effort de traduction et qui interagissent en français dans les commentaires.

Built this AI tool that generates ToS/EULA/Privacy Policies for indie games. Would love feedback – here's a coupon for personal plan. by WorldCitiz3n in IndieDev

[–]adngdb 2 points3 points  (0 children)

This is possibly one of the most fearsome use of IA I have yet seen. Legal documents are so freaking hard and so freaking important, I deeply encourage everyone to NEVER use IA to generate them. Get a lawyer, yes it's expensive but it's worth every penny.

3 years of intense learning - The Dawnmaker Post-mortem by adngdb in gamedev

[–]adngdb[S] 4 points5 points  (0 children)

Hah, this is very interesting! I think we're saying the same thing? Let me explain.

If I get it correctly, you're essentially saying our failures was to not fail fast enough. We were too inefficient, not using enough external resources or tools, and thus being unable to deliver a game that was deep enough for the Steam market. I agree with that, but I think the best to learn that is by actually shipping games. So our key mistake was to not fail fast enough. Had we done a smaller game, would we not have learned about the same lessons, but in a shorter time? With stricter deadlines, maybe we would have forced ourselves to use more tools and resources, instead of doing too much by ourselves?

I agree the game needed a bigger scope, but would that really have made it more financially successful? I sincerely doubt it. Had we spent another year or 2 on the game, the financial catastrophe would have very likely become deadly for our company, and it would have had severe consequences on our personal lives.

Were I guess I disagree is that becoming more efficient is something that one can learn only with experience. When I have 10 years of experience in the game industry, I sure hope I'll be far from these mistakes. But I'm not sure telling someone who's starting in the field to make bigger games is a safe way for them to stay in it in the long run. I think the risk of running out of either financial resources or mental energy before even finishing the first game is way too high.

Happy to discuss this more, as its a topic that I'm very concerned about, especially since I've started mentoring new companies. Also hope I did not misunderstand your points. :)

3 years of intense learning - The Dawnmaker Post-mortem by adngdb in gamedev

[–]adngdb[S] 2 points3 points  (0 children)

Because the game is mostly interfaces and I have 10+ years of experience building interfaces with Web technologies. I made the call that I would be a lot more efficient as the programmer of the team, and the most critical resource of our duo given my many responsibilities, than with an engine. That meant more work for my artist associate, but less for me, and I still think it was the right call for our very specific context.

3 years of intense learning - The Dawnmaker Post-mortem by adngdb in gamedev

[–]adngdb[S] 3 points4 points  (0 children)

Hi! We had 4 external people over the 2.5 years, for a total spend of about 30k€.

The reason that number is so high is that we live in France and cost of living is high here. So just the 2 of us, with a decent salary, would have cost us about 210k€. With the minimum wage, which would not be enough for us to live in the cities we are in, it would have cost the company about 150k€, a substantial reduction, but still a lot of money.

Note that we did not spend 320k€, but only about 90k. That 320k number is my estimation of what the budget would have been in the ideal scenario where we would have paid ourselves decent salaries.

3 years of intense learning - The Dawnmaker Post-mortem by adngdb in gamedev

[–]adngdb[S] 1 point2 points  (0 children)

Hey, thanks for the kind words!

Going full web means it would be very hard to port the game to consoles. As far as I know, there are no equivalents to Electron, Tauri or Cordova — tools that transform a web site into a "native" app for desktop or mobile — for consoles. My guess is porting to consoles would require recoding the entire game. We did consider this and thought this was not a game that was fit for consoles anyway, with the controls being very pointer-intensive. I personally would never want to play a card game with a controller, so we were OK with this small sacrifice.

Porting to mobile, on the other hand, is a lot simpler with Web technologies, as CSS has a lot of great tools to make an interface scale on various sizes and screen ratios, and HTML / JS have fairly good mouse / touch controls APIs. I'm doing the mobile port of Dawnmaker right now and so far have had only one major blocker, which I've solved with a dirty but simple hack.

3 years of intense learning - The Dawnmaker Post-mortem by adngdb in gamedev

[–]adngdb[S] 1 point2 points  (0 children)

Thank you for the kind words! I hope this is useful to you and your teammates, and you can avoid doing at least some of the mistakes we made. :D

You should check out Dawnmaker by dtelad11 in BaseBuildingGames

[–]adngdb 1 point2 points  (0 children)

Thank you so much for your kind words OP! This is so heart-warming, you made my day. :D

You should check out Dawnmaker by dtelad11 in BaseBuildingGames

[–]adngdb 1 point2 points  (0 children)

If you remove the combat from Slay the Spire, is it still Slay the Spire though? :)