Throne of darkness (Card based RPG) (Demo)
Jesusemora haven't been here in a while, and what am i greeted with? exclusion of my (clearly superior) operating system. i'm starting riots and burning storefronts because of you.
cool progress though. if you decide to open the gates to us penguins, i'll try to break your game for you.
packrat I made this in ubuntu, it works through wine like most godot games.
But I will try to upload a linux version now, maybe tomorrow.
packrat well you wouldn't believe what happened today , I exported the linux version and my disk crashed, then it would not boot because fsck was damaged. I had to re-download an ubuntu image and flash it and then run fsck from the live usb, it took me all day.
I'm not making this up , clearly superior operating system indeed
anyways here's the linux version:
- Edited
Jesusemora Thanks for the blood sweat and tears you put into a linux version. They're delicious.
About the crash, that sounds miserable. Ubuntu does use the ext4 filesystem, right? In all my years, ext4 has never once failed me. Granted, if we're talking "operating system", mine has been Arch for years and the closest I got to Ubuntu was Lubuntu around 2016. I imagine both have fewer failure points being smaller operating systems.
Edit: I'm updating my system for the first time in months to install the vulkan drivers your game demands. I might be paying back in equal measure soon. Yes, it's taken me this long to finally install vulkan drivers for the first time.
EditEdit: System updated, installed vulkan, switched modules so vulkan actually works, going to the grocery store for a soda and possibly those bunny shaped cheese crackers, then I'll finally get around to that thing i promised.
Note: apparently my system was left on for 5 days straight when i rebooted after the module stuff was done. woops. I remember now i did install vulkan before, and I switched amd modules before and never installed vulkan again for a reason, but i can't remember why. i'm posting, and your game opens, so that can't be it. can't wait to find out later.
- Edited
Bug Report
This is all I found in the time I've got today.
I did not play Rogue much, because I figured a plain character to test the game's core mechanics would be better. I also wanted to throw the chair.
Options Menu:
- SFX slider in fact controls Music volume.
- Music slider controls nothing as far as I could tell.
- All sliders don't seem to scale volume as traditionally expected. The volume increases exponentially as the slider moves to the right instead of linearly.
Enemies:
- Animations don't get interrupted when damaged during the previous animation. In fact they stack. I watched a lizard dude stumble around for about half a minute after the last blow before he finally collapsed. Same thing happened when I ended the turn.
The Map:
- A road will end terminating with a "Road" or "Combat" rather than a "Road's End" card. I'm not sure what else "Road's End" might mean. It could be a bug, or Road's End is a special card that's not implemented yet. A road terminating with "Combat" is understandable.
Barbarian class:
- Rage: The card says it will draw 3 damage cards. It does draw cards that inflict damage, but I also drew cards that don't:
Beaver Blood - heals and generates a card
Healing Potion - heals
Shield - gains block - Indominatable Spirit: Card reads "On discard returns to your hand", however it just gets discarded.
Rogue class:
- Pocket Sand!: "Applies 4 ticks of blinded". I've been unable to figure out what blinded does.
Jesusemora no bindows release? smh..
- Edited
kuligs2 the windows version is the first file, I added it to the first post.
packrat Ubuntu does use the ext4 filesystem, right? In all my years, ext4 has never once failed me.
It could be a lot of things, the cheap ssd, or the blackouts causing sectors that "could be narrower". don't worry about it, this happens every few months, then I fix it and works fine until it suddenly doesn't anymore.
packrat mine has been Arch for years
my condolences
I used to have fedora, but it was very unstable and then ran out of updates without upgrading to a new version, so when I reinstalled the system I moved to ubuntu which has an LTS, it's much more stable.
packrat I'm updating my system for the first time in months to install the vulkan drivers your game demands. I might be paying back in equal measure soon. Yes, it's taken me this long to finally install vulkan drivers for the first time.
odd, I don't think I had to install anything, if I did it was just an apt-get install. but then again I have an up-to-date kernel, which arch infamously doesn't.
I could try to make a compatibility port in future versions, the only thing that could cause problems are a few shaders, but that should work in opengl?
packrat Bug Report
Thanks a lot for this, it's really helpful. I will look into it.
packrat Options Menu:
SFX slider in fact controls Music volume.
Music slider controls nothing as far as I could tell.
All sliders don't seem to scale volume as traditionally expected. The volume increases exponentially as the slider moves to the right instead of linearly.
odd, they appear to be connected correctly. I will test it.
the volume is based on godot's volume db, I need to do some research into this.
packrat Enemies:
Animations don't get interrupted when damaged during the previous animation. In fact they stack. I watched a lizard dude stumble around for about half a minute after the last blow before he finally collapsed. Same thing happened when I ended the turn.
this was caused by a solution to a game breaking bug, I will try to improve it in future versions.
packrat The Map:
A road will end terminating with a "Road" or "Combat" rather than a "Road's End" card. I'm not sure what else "Road's End" might mean. It could be a bug, or Road's End is a special card that's not implemented yet. A road terminating with "Combat" is understandable.
I will make the actual icons for the world cards and replace those. yes, more cards should be added, like a shop or random events, the road's end was a test of the map generation. It could be fixed with a second pass to detect unconnected cards but it wasn't a priority.
packrat Rage: The card says it will draw 3 damage cards. It does draw cards that inflict damage, but I also drew cards that don't:
Beaver Blood - heals and generates a card
Healing Potion - heals
Shield - gains block
this sounds like a bug. the "get card by effect" function finds cards with an effect of type DamageEffect
, I will look into it.
edit: apparently, godot can't return the class type when using typeof(), it returns object. this appears to be a problem with godot for a long time.
I created a new card_effects_manager with a single enum, rage now works as expected.
fixed.
packrat Indominatable Spirit: Card reads "On discard returns to your hand", however it just gets discarded.
this was working, looks like I need to test it again.
edit: I tested it and it's working as intended. when using reckless attack, if indomitable spirit is discarded, it returns to the hand.
maybe it needs better phrasing, or is it a different problem?
packrat Pocket Sand!: "Applies 4 ticks of blinded". I've been unable to figure out what blinded does.
if you mouse over blind
it should popup a tooltip explaining that it reduces enemy damage. I will however look into it.
the tick system is also due for improvements, like adding the ticks to the enemy bar.
edit: mousing over blind does indeed popup a tooltip explaining the effect.
Well, I have a lot of work to do, I will color some more drawings (they are starting to pile up) and adding 3 new rogue cards. And it seems barbarian needs some attention.
but what did you think of the gameplay? is it fun?
- Edited
Jesusemora edit: mousing over blind does indeed popup a tooltip explaining the effect.
you're right. turns out i wasn't patient enough during yesterday's session. woops.
Jesusemora the only thing that could cause problems are a few shaders, but that should work in opengl
i forced it to use opengl3 for giggles to see what happens. the most obvious issue is the map. the cards are blank. the terminal spits out some stuff saying the shader code compilation failed because uniform instances aren't supported in gl_compatability shaders. i forgot instance uniforms were even a thing.
by the way, when shader compilation fails, it spits out the entire .gdshader file contents pointing out the point of failure. i am currently looking at your shader code for, i'm assuming, the map cards. there's two empty lines at the top of the file before shader_type spatial;
is declared, and i'm going to need you to fix that immediately. it's bugging me.
finally, the actual question
Jesusemora but what did you think of the gameplay? is it fun?
the gameplay was alright. it seems to pull a lot from Slay the Spire, but the map is a nice change. i played Slay the Spire religiously back when it was dirt cheap and full of placeholder art, so i have to admit, i'm burnt out on the formula. i got pretty bored pretty quickly playing your demo.
i think if you vary the combat a little further from Slay the Spire, but keep the core gameplay loop intact, it could be a cool spin on That Other Card Roguelite (Slay the Spire).
the vintage fantasy look is nice, and could get a lot cooler if it's fleshed out more. I've heard if you look hard enough, freelance artists can charge fairly cheap, but that's up to you. it would offload a ton of labor, if you consider it labor.
packrat i forced it to use opengl3 for giggles to see what happens.
how do you even do that? from terminal?
packrat the most obvious issue is the map. the cards are blank. the terminal spits out some stuff saying the shader code compilation failed because uniform instances aren't supported in gl_compatability shaders. i forgot instance uniforms were even a thing.
I use uniforms to tint the cards and tell which spaces have been visited. I wonder if there's a way to do fallback like in unity, or if it has to be done from gdscript.
the characters on the other hand use a "conventional" uniform, meaning there's a single material. this has its limits but instance uniforms are not supported for 2D.
packrat when shader compilation fails, it spits out the entire .gdshader file contents pointing out the point of failure
can't tell if this is due to leaving debug options on when exporting (I need to research this too). but it could be normal since the shader is sent to the GPU to be compiled.
packrat there's two empty lines at the top of the file before shader_type spatial; is declared, and i'm going to need you to fix that immediately. it's bugging me.
fixed. but you'll have to wait for the next release.
packrat the gameplay was alright. it seems to pull a lot from Slay the Spire, but the map is a nice change.
thanks I put a lot of work into generating the map.
I have never player slay the spire, I did play two similar games and what stood up was how lame the enemies were, at one point I was fighting a psyduck.
The idea is to make more of a linear RPG, there will be some dialog and you will be joined by companions, who will add their cards to the deck, and when one character dies all their cards are removed from play.
In fact the first version had 4 characters and they had some synergy, but I'm at least a month away from adding them back, as there are not enough cards yet.
packrat i played Slay the Spire religiously back when it was dirt cheap and full of placeholder art, so i have to admit, i'm burnt out on the formula. i got pretty bored pretty quickly playing your demo.
I hope the game gets more fun as I add more cards and mechanics. I just added 3 more cards and finished the art for one.
packrat i think if you vary the combat a little further from Slay the Spire, but keep the core gameplay loop intact, it could be a cool spin on That Other Card Roguelite (Slay the Spire).
I'm planning to.
packrat the vintage fantasy look is nice, and could get a lot cooler if it's fleshed out more.
working on it, as soon as I finish coloring this batch of drawings I will work on the UI and small elements. the cards also need to be bigger now that I changed the resolution, the art starts to glitch at that size.
packrat I've heard if you look hard enough, freelance artists can charge fairly cheap, but that's up to you. it would offload a ton of labor, if you consider it labor.
I feel like I'm learning more by doing it myself. while the first drawings are not great, the next are going to be better, It's just that I hadn't drawn in like 10 years, I was out of practice.
devlog: I added 3 more rogue cards and finished art for one, I will work on the barbarian soon.
the element of surprise: shuffle surprise attack into your deck.
surprise attack: when drawn, deal 4 damage to a random enemy, then return to the deck. this used to also draw a card but this caused infinite recursion, it's due for a buff.
last ditch effort: deal 200 damage, destroy your deck. this has really good synergy with rogue thanks to cards like ace under the sleeve and sneak. it will also synergize with cards that generate cards.
Jesusemora leaving debug options on when exporting
for the record, this is how i was able to force it to use opengl3. it allowed me to launch it with all* the godot options including --rendering-driver opengl3
. try ./path/to/godot/executable/ --help
, there's a lot of useful options i haven't found mentioned in any docs.
* i haven't actually tried all of them
** in fact i haven't tested if for some reason you can launch non-debug exports with terminal options
- Edited
packrat that's good to know, I will do some testing later.
devlog: worked on painting the second wind art, but I'm not convinced.
Then tried making the game more fun: throw rock and throw axe are no longer deal damage to an enemy, now they deal damage to a random enemy, and with this I added the ability to create particle effects from the damage_enemies method, which means particle effects on non-target cards like sneak attack.
This makes throw rock and throw axe different from sword attack. next I'm thinking of adding multi-attack cards like a cleave, as well as a shield attack that deals damage while adding shields.
update: I made the cards bigger, which involved a lot of math in order to maintain the same aspect ratio, and then manually editing each card scene (part of this problem will go away when I implement proper burn animations), now the text has more horizontal space and the art occupies a perfect square. I might tweak it some more.
I also fixed a bug related to the tooltip being bugged, and as a result cards that deal with other cards now pull the description directly from them, including rich text. the tooltip is also richtext now instead of just a label.
- Edited
Devlog: still working on art, but made a pause to deal with card text.
I looked up localization and then started working on porting the hard-coded text to tr
s, using gettext allows me to replace the hardcoded is_plural
methods with godot's built in tr_n
.
in the process I did some cleanup, but more is needed.
since I know both spanish and english, I'm using tags and moving the card names and descriptions and translating them at the same time, which has been a bit of a tedious process, but going pretty fast:
I've also been thinking of ways to make the game more fun:
I will give each card different types of damage, for example, sword attack could deal slashing damage, while rock throw would deal bludgeoning damage, skeletons would be resistant to slashing but weak to bludgeoning.
damage types are already implemented for the bleed effect, so it will be just a couple changes to the code.
another idea is to add tags to the cards, there would be weapon
cards like sword attack and disarmed
cards like THESE HANDS, then I would implement cards that interact with these. An idea is a card that discards all weapons and replaces them with unarmed attack cards.
I also noticed that the text is too small, so some changes will be made to the cards when I add tags.
The number on the corner will also be replaced with a symbol telling whether the card has a reshuffle effect or not.
update: process for making translations could be more streamlined, every time I make a change I have to override the pot file, then merge the changes to the en and es files, then open each individually and fight the poedit interface. but maybe this is just not the workflow it was designed to work with.
I added tags, more testing is requires to see if I missed something.
I made some more changes to the card, it's ugly but the text is more readable and still fits, changing the description and title boxes is going to take some extra coding but it's feasible.
before continuing I should work on some particle effects like slashes and of course a better card burning effect, which will lead to refactoring the spagetti code of the discard mechanic. the good: a single card burned scene and rounded edges. the bad: having to animate fire and then cleaning up the code.
- Edited
devlog: It's been a while.
I almost abandon this project but decided to try and at least finish another demo.
my atempts at making barbarian fun didn't entirely work. some new barbarian cards were added.
eye of the jaguar:
replace your weapon cards with martial cards. this is underwhelming, perhaps because there are not many martial cards yet and weapons tend to have better effects. on the good side, this card can generate cards from other classes like dodge, so there's some potential.
cleave:
deal 5 damage to all enemies. for some reason this card is very fun. also with the new changes the combat is more fun with more enemies rather than with a single one. maybe it will become more fun once the monsters have some special abilities. this will however involve creating and rendering an additional animation.
shield bash:
deal 4 damage gain 4 block. this card is underwhelming too.
then I decided to start working on other parts of the game, I added 20 wizard cards, for now they are variations of fireball, but some apply the new burning effect. what's special about wizard is that most cards don't have reshuffle, so they are used once per combat, meaning wizard is good early game thanks to powerful cards but drops in power as the cards are used.
oh, I also added damage types, but I need to go and include them in each of the descriptions, and maybe centralize the method by which description text is created, so that things like color are obtained from an autoload instead of being stored in the translation file.
before making a burning animation (I should probably just go and do it) I decided that I need a finalized version of the cards, so I made the parts of the card into images, and backgrounds for each class, now it's not as flat. however, I still need to make backgrounds for non-spell cards and for rogue.
wizard is no longer blue and now has all the colors combined, barbarian has some blood in it, and I forgot to screenshot the "normal" class, but it has contrasting grey shapes.
edit: I almost forgot , the most important change is I started work on adding summons, and in the future enchantments.
so far there's a single token and it's a skeleton, you drag the token towards an enemy and it animates an attack like in hearthstone.
I'm planning on making it possible to only attack once per turn with each token, and some work went into allowing cards to target tokens, and for tokens to behave like enemies. so I changed uses of the Enemy
class through the project to use a new parent class EntityUnit
(couldn't think of a better name). this basically has part of the enemy functionality like hurt
and buffs/debuffs, but doesn't attack on its own.
I HAD to implement manual targeting due to the way the game was designed. I hope I remember my notes for next time I design something like this.
most of the summons will come from wizards, but maybe I could add some Misha for the barbarian. I have a panther icon, but maybe it would be better to use some of my monster drawings, I'm getting tired of drawing humans.
next would be making the enemies target tokens before attacking players, so the tokens would work as a sort of wall, which would be another unique way of mitigating damage.
so far we have dodge, block and heal, and maybe block would work better with some knight class.
devlog: Great new everyone! the barbarian class is fun now!
all it took was the addition of 1 card.
Forest friend:
#description pending, when drawn, it summons one token which is going to be a beast of some kind.
when forest friend is drawn it summons a token and then the card is removed from play. the fun thing is this card can be generated, this results in more forest friends being added.
the tokens now form a wall in front of the characters and take damage from enemies, they can also attack once per turn. there is also code for triggering effects at the beginning of the turn and at the end of the turn.
the tokens can be targeted with single target cards like reckless attack, this creates more opportunities for card effects and buffs. maybe a fire elemental could gain attack if it's burning. there could also be cards that target tokens, like giving them the ability to attack again.
I also looked at some of the bugs, including sound. I have connected the buses to the correct numbers and some of the audiostreams were set to master, so now SFX should affect SFX, and music should affect music.
I could not do anything about volume curve though, I need to do some research first. volume in DB appears to not be linear but some kind of curve.
I also added more cards and the SummonEffect
and OnDrawSummonEffect
. I could add one for when discarding for the barbarian too.
Summon fire elemental
barbarian doesn't just attack, discards cards, draws, heals and generates cards, it will now have some summons that are somewhat chaotic.
- Edited
Devlog: I finished "centralizing" most of the description hints to pull from an entry in the translation file instead of having to rewrite it every time, I also made it so that the coloring and bbcode of the numbers is done through a method in an autoload instead of having to rewrite it every time.
the translation files are more clear now, it's easier to "code", it's less prone to errors, and more uniform, looking something like this:
{hint} Deal {points} {dtype} damage to a random enemy
When drawn: Deal 5 bludgeoning damage to a random enemy
I also tried to improve the cards, I made the text smaller so that the longer descriptions can fit, but not too small, and bunched everything closer, the art now covers an entire square, but on the other hand, the art and description covers the entire card, so I'm thinking of adding some sort of border like in most card games. but it's looking pretty clean.
edit: move the art inside a panel container and set it to clip and then added a border to the card backgrounds
which one is better?
the first one looks nice, but the second one tells you it's a barbarian card because of the color.
devlog: some more work on UI, this time on tokens. added ATK and Health to tokens, when health drops it gets red. I also added some temporary images to tell them apart and test the system and because a skeleton doesn't fit as well.
I'm still working out some bugs and problems:
the tokens can attack each other, so they can be set to attack each other by accident given that they are so close together. This is a sort of accidental sort of planned feature. If I could set the enemies to attack each other that would make for a good card effect.
the tokens should also display as cards in order to show effects and flavour text, but when testing they just looked out of place. Right now I'm thinking of implementing right click to show the description, but I fear it could be a lot of work.
The reason why these can't be tooltips is because descriptions will have tooltips of their own, and that kind of thing either doesn't work or is buggy.
there's also a ton of new cards, none of which have art. the barbarian got 2.
caged beast:
draw a card. when discarded: summon an unleashed beast. (no one call peta)
throw beast:
deal 5 damage, summon a small beast (I'm thinking maybe some kind of squirrel or other small critter).
notes: shield
is now a normal card
, and alongside fire arrow
and healing potion
makes 3. this means that the third reward option is no longer always healing potion.
devlog: made the rest of the card backgrounds.
- Edited
devlog: more art, more pending. I will try to finish the art for barbarian and rogue cards.
I made several changes to the card effects for barbarian since it was too broken, now the class is more challenging which results in having to think more about the next move, hence more fun.
among other changes:
healing potion now heals for 8
mead now generates a chair, making it different from beaver blood
second wind was too broken. with the buff to healing potion, second wind was still better. the first change was to have it discard a card, but was too bad. now it shuffles an Exhaust into the deck (spelling pending ), which is a card that can't be removed unless used, and it discards a card. this also streamlines the shuffling of cards into the deck with the new
ShuffleSpecificCardEffect
class, which must replace ShuffleSneakAttackEffect
and ShuffleSurpriseAttackEffect
, and in the future could display an entire card instead of just text.
shield is no longer reshuffled.
throw axe and throw rock are not reshuffled anymore, turning them into bad fodder cards that can be generated at random, this effectively nerfs cards like indomitable spirit and beaver blood without having to change their effect.
shield bash now discards a card. previously it dealt damage while adding block, making it better than shield for no reason.
I will try to upload a second DEMO by end of week or next week, with all the changes. although the wizard class will not be available.
devlog: did some small improvements, now some cards no longer create particles when used while others like sword attack no longer creates a thrown object, basically the particles when releasing the mouse after dragging a card do more specific things depending on the card.
I also changed the thing on the corner, cards that can be reshuffled now have an R on the left, while others don't have anything. I could add card levels later for better progression.
I then moved the card names and descriptions to the translation file and then filled the spanish translation, which took me the most time.
devlog: Made some more changes to the "interface" to make it less clunky. after fighting math for a while, I managed to implement an arrow. dragging a beast to attack now draws an arrow using a Stylebox, but some more math is required to get it to align perfectly. for now it looks good.
the tokens also change color after attacking, showing that they can't attack again.
due to time constraints, I'm going to be leaving some B&W images for some cards, so they don't look so s**t. maybe I will get to color them at some point:
devlog: I'm uploading the second DEMO, It's not as polished as I would've liked, some art is in B&W, other is missing, but it's much better than the last.
apparently, I had added a camp tile and it was working, it just needed some bug-fixing. you can now fully restore health by entering a camp tile, though there is no animation at the moment. the tile is spent after moving into it.
also updated some more art like the sword and the third beast. I don't like the "fluff" of caged beast so it will be changed for something else that makes sense.
I also increased the difficulty to present some more of a challenge, the first 4 combats tend to have a single enemy, but difficulty ramps up afterwards.
here's the link to the folder
https://drive.google.com/drive/folders/1eFa12eSpFBKbSAf_68YH66_XvcsIeq-C?usp=sharing