Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

[DevLog] Craft or Die!

A topic by chozoid created Sep 29, 2020 Views: 496 Replies: 9
Viewing posts 1 to 6
(4 edits)

First post

Hello to you! My brother told me about this jam a few days ago. It seemed really interesting. At first, I was unsure if I would be ready to launch myself in a whole month game jam. But finally... Here I am, and I'm pretty excited about it!

During the month (and after!), I'll keep on reporting updates on this topic, since I rarely post on social media.

A little about me

I'm a programmer from Québec, Canada. I started to learn programming since I was 16, now I'm 24. I have always been interested in problems solving, computer, and gaming. So these are the reasons why I began, and still passionate about it. I enjoy to learn new things and touching to everything, so at the moment, I'm doing contractual fullstack developer jobs. I like it, but I'm planning to start game development, and if it works, doing this as a full time job! I really love the creative aspect of game development, and that's why I want to make that turn. I have already participated in a Ludum Dare, and I liked it!

Why I want to do this jam?

Like I mentioned above, I would want to get serious in game development. So, why not start with a long game jam?! :D I think it will teach me how to have good working habits, and be more productive, instead of always relying on motivation when I work from home (this is not that I lack motivation, but sometimes, yes :P ).  Thus, it could help me on that point. Also, taking the time to make a whole game on my own, polish it, and release it, will be very educative about the games development process.

Craft or Die! What is it?

Initially, my brother and I came up with this idea during Ludum Dare two years ago, and we made a prototype. We did it in Unity, and I recently learned about Godot, so with his approval, I decided to start convert it in a Godot project, finish it, and add new things to the game.

The idea, a short resume

Craft or Die is a Shoot 'Em Up and Crafting, Vertical Scroller, hard game. The game is taking place in space, where you control a ship to destroy your enemies, and have to craft weapons and upgrades to survive along the levels.

Some of the game mechanics:

  • Crafting items is done in real time, during levels, while enemies can hit you!
  • Materials for crafting are collected on enemies, breakable obstacles, or special objects.
  • Some obstacles will have to be destroyed, with specific weapons, to get pass it.
  • New crafting recipes are unlocked sometimes.
  • Levels and score based game (you will be able to replay a level to have a better score).
  • Permanent upgrades (maybe, I'm unsure)

Some little things will maybe change during the development. But these are the main mechanics! :)

Sounds pretty cool - you mentioned the player controls a ship, is this game set in space?

Good luck to you, this jam should be a fun one.

Yup. I forgot to mention, I just updated my post. Thanks! :)

Of course, this jam will be a lot of fun! Do you participate?

I'm going to try to - I just had a baby a little over a month ago so... we'll see how much I can get done. 

Nice, and good luck!

(3 edits)

Days 1-2

what I've done

  • Set up Godot project, Bitbucket, and Trello Board
  • A scrolling background
  • Player can move the ship, without going out of bound
  • Player can fire projectile

Player control

For now, the player can move with WASD or with left joystick when using a gamepad. He can shoot with Space, or A on a controller.

Weapons and projectiles

I took the idea from the prototype made in Unity. At the moment, there's only one weapon, but I took the time to add three classes only to fire projectiles to help me build more weapons in the future. There's a Weapon class, holding a CannonMouth that fire Projectile. Cannon mouth is only a position with a rotation that fire a selected projectile in the correct direction/angle, when it's triggered. But I think it will help me in the future. Multiple cannon mouths, each associated with a selected projectile, can be placed on a weapon. It tooks some time for me to get it to work correctly, although now it is!

Assets

I'm not an artist, so I'll certainly struggle to make arts all by myself, however, I'll try to. At the moment, I'm using some old assets from the last project (for the ship, and projectiles). The background was made in Krita a few days ago, but I'll retouch it because I'm not satisfied about it. :P For the ship, enemies, and others assets, I'll probably try to remake them in Marmoset Hexels. I'll probably work on this tomorrow!

Submitted

ooo looks like we're both doing a space shooter :) Looking great so far. I've just implemented enemy shots... LOL

Cool! Axonite is looking great too! I'll keep an eye on it. :)

(1 edit)

Days 3-4-5

I did not have a lot of time on day 3, but I still did a little bit.

What I've done

  • Trying to make assets.
  • Being desespered about my art skills,  and trying to find an assets pack that I could modify.
  • Changing my mind and do some missile assets in Hexels, and finally being (mostly) satisfied.
  • A little of documentation.
  • Refactoring and adding a Destructible class to be extended by my already created classes.
  • Adding first enemy scene, with basic functionalities (it's only shooting projectiles randomly, for now).
  • Detecting collisions on player and enemies.

Arts

For now, I'll reuse assets from last project, and make some in Hexels. I'll think about what I do for my assets (create mines, or buy an assets pack and modify them) when the game will be more mature.

Collisions

That part did go well. For now, collisions between projectiles and enemies (or player) only despawn the projectile. I already added health and a function to take damage on the Ship class (extended by Player, and BaseEnemy), so I'll have to connect them and add an explosion to have a finished shot.

(2 edits)

Days 6 to 10

What I've done

  • Player and enemies can now take damage, and die.
  • Collectibles and Materials classes and scenes.
  • Enemies can now drop materials, I added a drop table on my Enemy base class.
  • Dropped materials can be picked up by the player.
  • Inventory on Player class added, it's updating when a material is picked up. A HUD representing the player's inventory has been added too.
  • Health bar for the player.
  • Enemies on stage are now disabled by default (all non relevant nodes attached to it are not processing), to save resources. They are enabled when they enter the screen.
  • Some refactoring, and comments added.

Player's health bar

It's a simple bar made in Hexels. For now, it's only updating his value and go up or down without any animation. I'll add animations, and color modulation depending on the health value (green when full, to red when low).

Collectible and Material

Collectible is a simple class that check for collisions with entities that are in "player" group, if it collide with the player, "collect" abstract method is called. His scene is holding a sprite that is defined by the classes that is extending this one. Material class has an id representing an in-game material (I don't feel the need to have a name for each material, their "name" will be a visual representation of the material). The sprite is loaded with a Resource manager class, which returns the correct sprite for the material id. Dropped material "float" in space, with a random direction, speed, and rotation.

Drop table

Drop table is a Dictionary attached to BaseEnemy class with a helper class to parse it. I did not want to make a class for the drop table it self, since I wanted to easily edit an enemy drops in the editor. The Dictionary is formatted as below.

drop_table = {
    "nb_of_drops":[
        {"quantity": 0, "random_weight": 1},
        {"quantity": 1, "random_weight": 1},
        {"quantity": 2, "random_weight": 1},
        {"quantity": 3, "random_weight": 1}
    ],
    "drops":[
        {"material": 1, "random_weight": 1},
        {"material": 2, "random_weight": 1},
        {"material": 3, "random_weight": 1},
        {"material": 4, "random_weight": 1},
        {"material": 5, "random_weight": 1},
        {"material": 6, "random_weight": 1},
        {"material": 7, "random_weight": 1},
        {"material": 8, "random_weight": 1},
        {"material": 9, "random_weight": 1},
        {"material": 10, "random_weight": 1},
        {"material": 11, "random_weight": 1},
        {"material": 12, "random_weight": 1}
    ]
}
# nb_of_drops dictionaries represent the quantity of materials that can be dropped.
# drop_table["drops"][i]["material"] returns a material id,
# and drop_table["drops"][i]["random_weight"] returns the random weight for this id.
#
# random_weight is used as:
# (random weight for an entry) / (total random weight) = (chance to drop)
# e.g.
# [...]
#     drops:[
#         {"material": 1, "random_weight": 2},
#         {"material": 2, "random_weight": 3},
#         {"material": 3, "random_weight": 7}
#     ]
#}
# Total weight = 12
# Material 1 has 2/12 chance to drop
# Material 2 has 3/12 chance to drop
# Material 3 has 7/12 chance to drop
#
# *Quantities follow the same idea. 

I could have simplified the structure and get rid of "quantity", "material", and "random_weight" keys, But I wanted to make it clear, and well formatted in the editor.

Enemies

Now, they are disabled when they're not visible in screen. Disabled means that all their children nodes are not processing, I still keep a visibility notifier node processing to know if the enemy is visible on screen, when it is, I reactivate the processing of children. When enemies are disabled, they still move in the background, they move toward the viewport and "spawns" when it enters the screen, so I can build levels in the editor and have a visual representation for each level.

What I want to do next

  • Animate player's health bar.
  • A BaseRecipe class, used as a base for crafting recipe.
  • First recipe to craft a weapon, and attach it to the player.
  • A crafting menu in the HUD.