Skip to main content

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

Catapult: Launcher Bot Meets PiperView game page

A thing throwing robot and a lost kitten solve 2D platforming puzzles.
Submitted by happybloke, Jillycakes — 59 minutes, 55 seconds before the deadline
Add to collection

Play game

Catapult: Launcher Bot Meets Piper's itch.io page

Results

CriteriaRankScore*Raw Score
Story#1592.8672.867
Music#2902.9332.933
Mechanics#3882.8002.800
Aesthetics#4092.9332.933
Overall#4392.7332.733
Theme#4782.6672.667
Fun#5082.3332.333
Sound#6351.5331.533

Ranked from 15 ratings. Score is adjusted from raw score by the median number of ratings per game in the jam.

How many people worked on this game in total?
2

Did you use any existing assets? If so, list them below.
Yes. Luis Humanoid's music. GDQuest's Assets with CC License. Assets from SAKPIX's steampunk megapack.

Leave a comment

Log in with itch.io to leave a comment.

Comments

Submitted

Nice art and music! 

The gameplay looked interesting, but it took me a second to realize that "Z" is to pick up the wrench. At the beginning (the text window with controls) is says press "X" to pick up and "X" to throw. Might be a typo.

Well done!

Developer(+1)

it was 100% a typo and was my bad.

Submitted(+1)

Like the art style and the music choice.

I think the mechanics could do with a bit of work though, just to make things a bit more intuitive.

Thanks for the game.

Submitted

Neat game, but very fiddly with the puzzles which makes them hard/frustrating.

Consider using a more standard control scheme so players are already familiar with how to control the character.

Submitted

That text animation is beautiful! Need to look into how to do that.

I kept pressing the wrench button but it would only sometimes let me throw things, not sure why? I also got trapped by the box on the second level.

Love the art! And some great puzzle ideas in here


Developer(+1)

Thanks!   You'll want to start by looking into "CharFXTransform" in the Godot documentation.   The "visible" boolean is what you want to play with.  For the fade out part, just make it wait for the fade in process to finish before starting and repeat the logic except change opacity from 100 to 0, so the same thing but in reverse visually... To make it wiggle, you can actually offset each individual character with [var].offset = Vector2(X, Y), but you want to make sure you make X and Y something like X = sin(something)* amplitude and Y = sin(something)* amplitude.   or cos.  Basically you leverage that sin/cos is a wave, and multiply it by how wiggly you want it to be.   Create this in a standalone .gd, give it a classname, be sure to include a declared variable called "bbcode" = "[sickradeffect]" then you can call your sick rad effect into code attached to dialogue box if and only if you wrap text in the inspector like this.   "[sickradeffect]SICKRADEFFECTEXAMPLE[/sickradeffect]"    That way sickradeffect only applies if and only if you wrap text in this.  You're essentially adding something custom along side the ability to write out text like this "[b]THIS WOULD BE BOLD[/b]".


This is the way to do it to save yourself from typing it out over and over again in whatever project.   Even cooler, you can create a permanent, personal library of text effects that to include in any project from the get go.   If you haven't written anything like that yet, once you do, congrats, you've crafted your first personalized boilerplate code.  Ideally each text effect that you design should be in a seperate .gd file, and should have a unique bbcode to prevent conflicts.   In your dialogue box code include something like "text_label.custom_effects = [sickradeffect.new(), sickradeffect2.new(),...etc]",.         "custom_effects" is a pre-existing array designed for you to fill it with....custom effects in the manner described here.  And then make sure to @onready your label.   I hope that helps!   

Developer(+1)

Actually, I went ahead and had a conversation with some AI so it could output a super generic guide to probably better explain what I'm talking about, in full, and in order, and with descriptive variables wrapped in square brackets.  I was just steam of consciousness typing my last reply.   😅    This should *actually* help you do this.  I read it over and I think it's right.


1. class_name — making a script globally available

When you put class_name [YourEffectName] at the top of a GDScript file, Godot registers it project-wide. Every other script can use [YourEffectName] by name with no import needed.

class_name [YourEffectName] extends RichTextEffect # Now any script in the project can write: # [YourEffectName].new()

Without class_name you'd have to use load("res://[path/to/your/file].gd").new() every time. class_name skips all of that.

2. RichTextEffect — what it is and how Godot uses it

Godot's RichTextLabel node has a built-in system for per-character visual effects. You plug in any number of effects and Godot calls them automatically every frame for every character.

To create one, extend RichTextEffect and implement one function:

extends RichTextEffect  var bbcode = "[your_tag]"   # the tag this effect listens for  func _process_custom_fx(char_fx: CharFXTransform) -> bool:     # Godot calls this every frame for every character inside [[your_tag]]...[[/your_tag]]     # char_fx gives you: index, color, offset, and more     # whatever you do here IS what appears on screen     return true

3. The bbcode variable — which characters get the effect

The bbcode variable tells Godot which tag to listen for. If you set it to "[your_tag]", only characters wrapped in [[your_tag]]...[[/your_tag]] get processed.

# In your effect script: var bbcode = "[your_tag]"  # In your label text: label.text = "Normal text [[your_tag]]this gets the effect[[/your_tag]] normal again"

Setting bbcode = "" applies the effect to all characters with no tag needed. Built-in tags like [b], [color], [i] are unaffected — they run independently and stack fine.

4. custom_effects — registering effects on a label

custom_effects is a built-in array on every RichTextLabel. It ships empty. You fill it with instances of your effects and Godot runs all of them every frame.

# In [YourDialogueScript] or wherever you control the label: @onready var [your_label_variable]: RichTextLabel = $[YourPanelNode]/[YourLabelNode]  func _ready() -> void:     [your_label_variable].custom_effects = [         [YourFirstEffect].new(),         [YourSecondEffect].new(),         [YourThirdEffect].new()     ]

All registered effects are active. Which ones actually do anything depends on whether the text contains their BBCode tag.

5. @onready — safely referencing child nodes

Node references can only be resolved once the scene tree is ready. @onready delays the assignment until that moment automatically.

# This is shorthand for assigning in _ready(): @onready var [your_label_variable]: RichTextLabel = $[YourPanelNode]/[YourLabelNode]  # It's exactly equivalent to writing: var [your_label_variable]: RichTextLabel func _ready() -> void:     [your_label_variable] = $[YourPanelNode]/[YourLabelNode]

The variable name ([your_label_variable]) is your choice. The node path ($[YourPanelNode]/[YourLabelNode]) must match the actual scene tree structure.

6. Combining multiple effects

Because each effect has its own BBCode tag, you can stack them freely on the same text:

[your_label_variable].text = "[[first_tag]][[second_tag]]both effects here[[/second_tag]] only first here[[/first_tag]]"

Godot runs each registered effect on each character. A character inside both tags gets both effects applied.

One file per effect is the right structure. Don't try to bundle multiple effects into one file — you can only declare one bbcode variable per class, and GDScript only allows one class_name per file.

7. The full plug-and-play setup

1

Create effect files — one per effect, each with class_name [YourEffectName], var bbcode = "[your_tag]", and _process_custom_fx().

2

Register them in [YourDialogueScript] — add all effects to [your_label_variable].custom_effects in _ready().

3

Use tags in text — wrap any text in [[your_tag]]..[[/your_tag]] and the effect runs automatically.

4

Adding a new effect — create the file, add one line to custom_effects. Nothing else needs to change.

8. What "boilerplate" means here

Boilerplate is reusable code that solves a general problem with no project-specific logic in it. A well-written [YourEffectName] qualifies — it knows nothing about your game, just how to transform characters visually. Drop it into any Godot project and it works.

A dialogue box script is boilerplate at its core (entry cycling, timing, dismiss fade) but often has project-specific parts on top (portrait modes, character-specific flags). Strip those out and the skeleton becomes reusable too.

Submitted

I got stuck on the second puzzle when piper gets stuck, I thought the platform will go up so it is easy to aim but aiming for the switch with a wrench is very difficult. Idk if it is intentional and I am doing it wrong or it is a bug. Very neat design on the puzzles, a really nice combo of difficult and easy. There is a nice satisfaction of solving the puzzles. if aiming was with mouse input, it would have been mush easier for me. Also not seeing the trajectory of the wrench is making it difficult for me to aim. An awesome job on the puzzle, as much as I could play they were perfect and satisfying. An overall great entry!

Submitted(+1)

Neat concept! Although I did run into a problem during the second level. When Piper dropped the box for LB it fell on LB's head and he got stuck.

Developer

Yeah!  Sorry about that, I'm fiddling with ways to make the box bouncy in that situation now

Submitted

Nice job! Some solid mechanics in there that could be expanded upon nicely

Submitted

Good game, the art and mechanics are nice. Good work.

And if you want to try mine, I’d be happy.

Developer(+1)

I absolutely will!

Submitted

Solid game overall! The WASD button not being move took me a while to get used to but I got the hang of it. The background though is very cool, it is very distracting to me considering I'm throwing small wrenches and stuff which made it harder to see. I love the two characters cat and robot and I love the dynamic of them though! I wish there were also a bit more feedback of when things are happenign (door opening, etc) but other than that, you did a great job! Also congrats for submitting your first game jam!

Submitted

The not having WASD controls made this game a lot more difficult because I kept pushing the wrong buttons just on instinct. 

Solid choice on the music though. 

Submitted

The game had a great visual language but I found the controlls foreign and hard to overcome. I think it needs a cleared indications of where you are supposed to go and where you are throwing.

Best of luck on your game dev journey. 

Submitted

The buttonless input on the start screen caught my attention, and the animation on the text was really cute. I also liked that you showed the controls inside the game itself.

When I escaped from the pile of robots, I expected them to stay in the scene, but they all disappeared. Reaching the platform was frustratingly difficult for me, or maybe I’m just bad at it, ahaha.

Overall though, it was fun. Congratulations!

Submitted

Nice game. :)

Submitted

Glad you figured out how to get it published as a web build, will hopefully allow for more people to give it a try. 

I liked the ideas behind the mechanics but found the controls a little awkward. The dissolving platforms are a nice mechanic but could use better visual indication before you jump on them. 

There were a few times when I got the characters soft locked - an example is pushing the first crate partially down the stairs and then going over the top of the create and falling down you then can't get back up the stairs.

I like the little initial interaction with the cat, would have been interesting  to see how that developed.

Developer

Oh man, I really did typo the instructions.  Yes, Z picks up and shoots, not x.    

Submitted (1 edit)

The parallax background I find it very imposing and all the characters and items blend into it and its hard to differentiate them.
Also I could not get 'X' to work with the robot. I pressed 'Z' to pick and pressed 'Z' to shoot.

Also the intro with the robot is really well done. I like it. The art of the cat and the robot are nice and the music is good.

For a first time game jam I think this is really good imo.

Submitted

Good idea and interesting challenges. Hard to master controls while being used to WASD and SPACE.  In the beginning tutorial explains that throwing wrench would be done with X, I had to use Z for throwing and aiming wrench.