GOODBYE WORLD

GOODBYE WORLD

Not enough ratings
Blocks Custom Levels Guide
By Yams
How-to guide on how to create your own Blocks levels for GOODBYE WORLD
2
2
2
   
Award
Favorite
Favorited
Unfavorite
Introduction
Hello everyone!

I really enjoyed the game, and I hope you all did as well. I really loved the storyline and found that the gameplay really flowed nicely with it. I am surprised that this game isn't talked about enough.

The level design is really well done, some weren't too hard to complete and had you to take your time. I found myself wanting to play more, even with the Bonus section I was expecting some extra stages, but they are just the same stages in the storyline. Nonetheless I really enjoyed them.

With that being said, I took a look at the game's files and saw that they weren't complicated to modify. I will try to avoid the more technical jargon for those of you who are just looking to make a level. I will do my best to include everything to my knowledge.

For brevity, when I talk about the game's directory I am talking about where GOODBYE WORLD is installed, usually found in C:\Program Files (x86)SteamLibrary\steamapps\common\. If this is where you install your steam games, the game's directory would be found in the folder GOODBYE WORLD.

I will be omitting any extra explanations such as "go to this folder, then this folder", in this guide, it will talk about files being in folders, though they will be shown as a path (as seen above, C:\Program Files (x86)\SteamLibrary\steamapps\common is a path to the common folder, I'm sure you'll understand).

You can also bring up the game directory through left clicking the game -> Manage -> Browse Local Files
Game Files
We are only talking about level creation so for this guide we will only mention the necessary files to achieve a custom level that we can play.

The files needed for a level are in these directories:
  • stage/Level directory = GOODBYE WORLD\gb\map
  • text for the speech bubbles = GOODBYE WORLD\text\<language>\text_data_gb_<language>.ini
Where <language> represents the language you choose/speak/write. If we are using the english files we will be using the file: GOODBYE WORLD\text\eng\text_data_gb_eng.ini

Level Files


All stage/levels are found in the game's directory under GOODBYE WORLD\gb\map and each letter in that directory pertains to a world:
  • a = world 1 stages/levels 1-4
  • b = world 2 stages/levels 1-4
  • c = world 3 stages/levels 1-4

Inside Level Files


The `ini` file format is a configuration file for various computer software. To read more, click here[en.wikipedia.org]

We'll use the world 1 stage 1-4 files for the examples onward, seen in: GOODBYE WORLD\gb\map\a\
We have 4 files:
  • stage_1.ini = The first stage/level
  • stage_2.ini = The second stage/level
  • stage_3.ini = The third stage/level
  • stage_4.ini = The fourth stage/level
pretty straight forward.

Peering into stage_1.ini we have what we call Sections. Denoted by a word inbetween an open Square Bracket `[` then by a closing Square Bracket `]`. Below are the section's seen in the stage/level files as well as a short description on the value's
  • [data] = The current level map.
  • [text] = This is where each speech bubble appears along the level.
  • [section] = Which text to use in GOODBYE WORLD\text\eng\text_data_gb_eng.ini
  • [key] = Which text line which speech bubble.
  • [bg] = The background type and other things.

Speech Bubble Text Files


We have our text for our speech bubbles which reside in the directory: GOODBYE WORLD\text\.
In this directory we have multiple directories that pertain to each language:
  • cmn = Contains Credits
  • cns = Chinese Translation
  • cnt = Cantonese Translation
  • eng = English Translation
  • jpn = Japanese Translation
  • kor = Korean Translation

Inside Speech Bubble Text Files


For these examples we will be using the english version of the text files.
inside we have a similar format, where we have sections and our values. This file text_data_gb_eng.ini indicated by the gb in it's name are used for the stages/levels.
  • text_0 = The menu text, seen by hitting tab in game.
  • text_1-12 = These are currently used for the stages/levels in game.
  • str_* = The string of text per line.
Avoid Breaking the Game
There are some things you should know to avoid breaking the game. If you do end up breaking, no worries, just revert back to the original file (Make backups!). If you do happen to forget to make a backup of the original maps, you can restore these with the "verify file integrity" option through steam (google is your friend).

Seen below are some of the things I've observed in testing and have highlighted pertaining to the game mechanics and the bounderies on how far you can push level creation.
  • At the time of writing, the current version is 1.2.0 and only accepts the 3 worlds, meaning if you add a fourth world `d` in GOODBYE WORLD\gb\map\ it will not reach these maps.
  • Only stage1-4.ini files are read. If you add a `stage_5.ini` it will be skipped.
  • You can have multiple doors as well as keys, but when any door is unlocked the level ends.
  • Maps can be as short as you'd like with a recommended minimum line length of 10, and as long as you'd like when creating them. Keep in mind that every line (0-7) needs to be of equal length.
  • If the map lines (0-7) are not all the same length, the game will crash.
  • You can have multiple speech bubbles, but if there are not enough text to display it will simply say "ERROR!" inside.
  • If you do not have any speech bubbles, the [text] section must be present with a value of 0 = .
Adding Speech Bubble Text
Stated in the "Game Files" section of this guide, the text/speech bubble file that hold the text used in game are found in GOODBYE WORLD\text\<language>\text_data_gb_<language>.ini. The file used in the stages/levels have `gb` in the file name. Ensure that you are editing the right file!

For these examples we will be using the english translations, located in the file: GOODBYE WORLD\text\eng\text_data_gb_eng.ini.

We have the following sections and values in this file:
  • [text_*] = The section of text for a specific level.
  • str_* = The text that are in the speech bubbles. Starting from str_0 onwards.

The [text_] sections and str_ values are called within the stage_*.ini files under the [section], and [key] sections. How to use and import each text in this file is explained below in the "Adding Speech Bubbles" section of this guide.

[text_*] Sections


Much like the technical name, these sections hold the necessary text that should be used in a given level:
  • [text_0] = Holds the controls and menu text. Seen in game when the TAB key is hit.
  • [text_1] = Holds the text used by the World 1, stage_1.ini level
  • [text_2] = Holds the text used by the World 1, stage_2.ini level
  • [text_3] = Holds the text used by the World 1, stage_3.ini level
  • [text_4] = Holds the text used by the World 1, stage_4.ini level
  • [text_12] = Holds the text used by the World 3, stage_4.ini level

The [text_] sections are used by the [section] section in the stage_*.ini level files.

str_* Values


Stated above the [text_*] sections have text values abbreviated as str_, as in the programming world, any text are called strings.

The str_ values hold the text for each level, for [text_1] we have:
  • str_0 = Let's go!
  • str_1 = The glowing blocks\ncan be broken
  • str_2 = The blocks you broke\ncan be set elsewhere
  • str_3 = Enemy ahead!\nBe careful…
  • str_4 = If you get stuck,\ntry starting over
  • str_5 = Unlock the door\nto clear the stage!

The [str_] values are used by the [key] section in the stage_*.ini level files.

You'll find that there is a `\n` in the middle of the str_ values above. This is called a `New line`, much like the name, it starts the text after it on a new line:
Given the text str_3 = Enemy ahead!\nBe careful… Will appear formatted in game /===============\ | Enemy ahead! | | Be careful… | \===============/


To add new text, you may add a new section that is not being used. At the time of writing we have [text_0], [text_1], [text_2], [text_3], [text_4], [text_12] being used by various stages/levels:
[text_5] str_0 = Hello!\nWelcome! str_1 = Watch out! str_2 = There are Monsters ahead! str_3 = Look at the Beautiful sky! str_4 = You're close to\nfinishing the level! str_5 = Hint: Use the `z` key to break blocks

I can now import and use [text_5] in my custom made level.


Important!


It's important to note that in the programming world, arrays start at 0. Meaning that if you are adding any new text to the first speech bubble, it must start at 0 (str_0).
Adding Speech Bubbles
For the examples used here we will be using the english version of the text/speech bubble files as well as the first world and level GOODBYE WORLD\gb\map\a\stage_1.ini

In the stage/level files we have our sections, and we will be using 3 of these:
  1. [text]
  2. [section]
  3. [key]

Deleting Speech Bubble Text


To delete any speech bubble text you may disregard the [section] and [key] sections but you must leave the [text] section as such:
[text] 0 = .

[text] Section
The [text] section will contain a map of any given position where the speech bubble will show up, as well as how high off the ground.

Given the stage/level:
0 = ..............H...............................................W@ 1 = ..............H...............................................H. 2 = ..............H...............................................H. 3 = ..............H...............................................D. 4 = ..............B...................H...B...H.WW.WW.H.......HWWWHW 5 = .............WWW..B...H..E..H..B..H.H.............H.H.....B...H. 6 = .P..........WWWWW.....HWWWWWH.BBB.HWHWWWHWH.......H...H...B.K.H. 7 = GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

We have our text positions:
0 = ........6....4......6.4.....4.........................5

The "." pertain to how far in the speech bubbles are placed, and the numbers 6,4,6,4,4,5 pertain to where they are placed in the level, given the lines 0-7. We can visualize this where the ! represents where the speech bubbles are placed:
[data] 3 = ...... 4 = .............!B.......!.....!.....H...B...H.WW.WW.H.......HWWWHW 5 = .............WWW..B...H..E..H..B..H.H.............H.H.!...B...H. 6 = .P......!...WWWWW...!.HWWWWWH.BBB.HWHWWWHWH.......H...H...B.K.H. 7 = GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG [text] 0 = ........6....4......6.4.....4.........................5

Pretty simple. If you'd like to add a speech bubble to a level, count how many `.` in you'd like to place it at, then on which line.

If we add a text position of:
0 = ..646.464.

Visualizing these new positions would be in the level:
3 = ...... 4 = ...!..!.!... 5 = ............ 6 = .P!.!..!.... 7 = GGG...

We can see what it looks like in game:


[section] Section


In the [Section] section we have the number of speech bubbles as well as the number that it pertains to in the text file (GOODBYE WORLD\text\eng\text_data_gb_eng.ini)

for our [text] section we have:
0 = ........6....4......6.4.....4.........................5

and in our [section] section we have:
0 = 1 1 = 1 2 = 1 3 = 1 4 = 1 5 = 1

We have 6 speech bubbles in the first stage/level and in our section we have which text_* to use. In this instance everything is assigned to 1, so in our text file: text_data_gb_eng.ini we are using the [text_1] section.

We also have our [key] section in our stage_1.ini file:
0 = 0 1 = 1 2 = 2 3 = 3 4 = 4 5 = 5

This pertains to the str_* values under our [text_1] section in text_data_gb_eng.ini.

With all this said we can now correlate our speech bubbles with the text in our file:
0 = ........6....4......6.4.....4.........................5
  1. Bubble (6) = text_1 = str_0 = "Let's go!"
  2. Bubble (4) = text_1 = str_1 = "The glowing blocks\ncan be broken"
  3. Bubble (6) = text_1 = str_2 = "The blocks you broke\ncan be set elsewhere"
  4. Bubble (4) = text_1 = str_3 = "Enemy ahead!\nBe careful…"
  5. Bubble (4) = text_1 = str_4 = "If you get stuck,\ntry starting over"
  6. Bubble (5) = text_1 = str_5 = "Unlock the door\nto clear the stage!"

Misc Notes on Speech Bubbles


You may wish to mix and match different texts from other levels, you are able to by setting which bubble in [section] as well as which line in [key]
[text] 0 = ........6....4......6.4 [section] 0 = 1 1 = 2 2 = 1 3 = 2 [key] 0 = 0 1 = 2 2 = 5 3 = 0

For this example we've set:
  1. Bubble (6) = text_1 = str_0 = "Let's go!"
  2. Bubble (4) = text_2 = str_2 = "Sand blocks can't be set\neven if you break them!"
  3. Bubble (6) = text_1 = str_5 = "Unlock the door\nto clear the stage!"
  4. Bubble (4) = text_2 = str_0 = "I love the sea."
Background
For the final section in our stage files we have the [bg] section.

This pertains to the Background of the stage. All known values at the time of writing are:
  • type = Set which background to use. (1-4)
  • dark = Set flashlight view. (0 or 1)
  • no_left = Set whether player can move left. (0 or 1)
  • lava = Set whether the floor is lava. (0 or 1)
  • slow = Set slow speed of player. (0 or 1)
  • retry = Restart to titlescreen (Conditional)

Type Values


Type will define the background used for the stage/level

type = 0:


type = 1:


type = 2:


type = 3:


type = 4:


Dark Values


Dark will define whether the player is in a flashlight view

dark = 0:


dark = 1:


No Left Values


No left indicates whether a player can move left

no_left = 0:


no_left = 1:


Lava Values


Set whether the level has lava.

lava = 0:


lava = 1:


Slow Values


Slow sets the player movement speed

slow = 0:


slow = 1:



Retry Values


Retry is a conditional value where it is based off of whether a player is currently on a speech bubble

Given the values shown here in our stage file:
[text] 0 = ...6.6.6 [section] 0 = 1 1 = 1 2 = 1 [key] 0 = 0 1 = 1 2 = 2 [bg] retry = 2

With a retry value of 2, if the player is currently standing on the 3rd speech bubble (arrays start at 0), the player will then restart to the titlescreen:



Though retry is set at 2 here, it can be set to any value given that the speech bubble exists in that stage/level, it will work with any amount of speech bubbles in a stage/level.
Mapping
This is probably what you're here for.

We will be using the first world, first stage/level for our example (GOODBYE WORLD\gb\map\a\stage_1.ini).

The maps are represented in ASCII which is very easy to customize, think of it as a grid.

The map is as seen under the [data] section, where the lines are numbered from 0 to 7, yielding 8 lines (arrays start at 0):
0 = ..............H...............................................W@ 1 = ..............H...............................................H. 2 = ..............H...............................................H. 3 = ..............H...............................................D. 4 = ..............B...................H...B...H.WW.WW.H.......HWWWHW 5 = .............WWW..B...H..E..H..B..H.H.............H.H.....B...H. 6 = .P..........WWWWW.....HWWWWWH.BBB.HWHWWWHWH.......H...H...B.K.H. 7 = GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

For the discussion of lines, I will talk about line length, this is pertaining to how characters are present on a line:
Line 0, with a length of 5 0 = ..... Line 4, with a length of 10 4 = .......... Line 3, with a length of 10 3 = ..P....D..

For the discussion of block positions, it will pertain to the # character on a given line:
5'th block on line 0 v 0 = .......... 2nd block on line 2 v 2 = .......... 7th block on line 4 v 4 = ......W...


About Placement/Important Things to Know


There are a few things I've observed in my testing:
  • You may have multiple Keys and Doors, but as soon as the player unlocks any door block, the stage/level will end:
    0 = ..........KKKKKKKW 1 = .........DDDDDDDDW 2 = ........KKKKKKKKKW 3 = .......DDDDDDDDDDW 4 = ......KKKKKKKKKKKW 5 = .....DDDDDDDDDDDDW 6 = .P.KKKKKKKKKKKKKDW 7 = GGGGGGGGGGGGGGGGGG
  • If the Player is standing on the right side of the door when unlocking, the Player will teleport to the left side of the door for the completion animation. If there is a block on the left side of the door, the Player will continue to teleport left until completion animation is finished.
    Player will teleport 0 = ......D........... 1 = ......D........... 2 = ......D........... 3 = ......D........... 4 = ......D........... 5 = ......D........... 6 = ......D.P.K....... 7 = GGGGGGGGGGGGGGGGGG Player will teleport to the 6'th block on line 6, and continue to teleport to the 5'th block for the completion animation routine 0 = ......D........... 1 = ......D........... 2 = ......D........... 3 = ......D........... 4 = ......D........... 5 = ......D........... 6 = .....WD.P.K....... 7 = GGGGGGGGGGGGGGGGGG Same behaviour, though the player is teleported to the first block on line 6 0 = ......D........... 1 = ......D........... 2 = ......D........... 3 = ......D........... 4 = ......D........... 5 = ......D........... 6 = WWWWWWD.P.K....... 7 = GGGGGGGGGGGGGGGGGG
  • You're able to have a level that does not have any Keys or Doors.
  • You're able to have a level that does not have a Player. However, the Player will spawn on line 0, on the first block
    Player will spawn here v 0 = .................. 1 = .................. 2 = .................. 3 = .................. 4 = .................. 5 = .................. 6 = .................. 7 = GGGGGGGGGGGGGGGGGG
  • If there are no Ground blocks present and the Player falls, the Player will not die
    The Player will not die 0 = .................. 1 = .................. 2 = .................. 3 = .................. 4 = ........P......... 5 = .................. 6 = .................. 7 = ..................
  • If the Ground blocks on line 7 are replaced with Spike blocks and the Player collides with them, it will result in a soft lock, you will be unable to restart:
    Will result in a softlock 0 = .................. 1 = .................. 2 = .................. 3 = .................. 4 = ........P......... 5 = .................. 6 = .................. 7 = NNNNNNNNNNNNNNNNNN
  • If the map lines (0-7) are not all the same length, the game will crash:
    Results in a crash 0 = ................ 1 = .............. 2 = ........... 3 = ................ 4 = ......K...... 5 = ......W......... 6 = .P...WWW......D.. 7 = GGGGGGGGGGGGGGGG Accepted 0 = ................. 1 = ................. 2 = ................. 3 = ................. 4 = ......K.......... 5 = ......W.......... 6 = .P...WWW......D.. 7 = GGGGGGGGGGGGGGGGG
  • Stages/levels can be a short as you'd like, or as long as you'd like. However, if the level is shorter than the play area (the gameboy screen), the stage/level will load, but if the Player attempts to retry or if the Player dies within the level, it will crash the game. If the line length is 6 and the player steps on the 6'th block the game will crash. For best practice try to keep a short stage/level as the same width as the play area (a line length of 10). The longest level I've tested is a line length of 512:
    Short level, crashes upon retry/death 0 = .. 1 = .. 2 = .. 3 = .. 4 = .. 5 = .. 6 = P. 7 = GN Game will crash when the player steps on the 6'th block 0 = ...... 1 = ...... 2 = ...... 3 = ...... 4 = ...... 5 = ...... 6 = .P.... 7 = GGGGGK Best practice 0 = .......... 1 = .......... 2 = .......... 3 = .......... 4 = .......... 5 = .....K.... 6 = .P..WWW.D. 7 = GGGGGGGGGG
  • Enemies that are placed immediately above a block will be an Okera (Frog guy):
    4 = ....... 5 = ...E... 6 = .P.W.E. 7 = GGGGGGG
  • Enemies that are placed in the air or a space above a block, will be a Bat:
    4 = ...E... 5 = .....E. 6 = .P.W... 7 = GGGGGGG
  • Single Sand blocks that are placed in the air will stay suspended.
    0 = .......... 1 = .......... 2 = .......... 3 = .......... 4 = .......... 5 = ....SSSSS. 6 = .P........ 7 = GGGGGGGGGG
  • Sand that is placed atop of a block that can be broken, and is then broken, will fall:
    0 = .......... 1 = .......... 2 = ....S..S.. 3 = ....S..S.. 4 = ....S..S.. 5 = ....S..S.. 6 = .P..B..S.. 7 = GGGGGGGGGG
  • If the Letters are not in All Caps then it will render as invisible blocks:
    0 = .......... 1 = .......... 2 = .......... 3 = .......... 4 = .......... 5 = .....k.... 6 = .p..www.d. 7 = gggggggggg
  • Any blocks that you wish to delete, must be replaced with a `.`
  • You can add more than one "Player", but the placement furthest into the level will be the starting point:
    Here the right-most `P` will be where the player starts the level v 6 = ...P...........P...........P..........P.........P.............. 7 = GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
Map Value Index
This contains all known blocks that are in the stage/level files.

Editor's Note: I'm not too sure what H is representing, for the purpose of this guide I will be referring to it as "Pillars".

@ = Invisible Block (or any lowercase character):


B = Breakable Block:


D = Door:


E = Enemy:


G = Ground:
type = 0:


type = 1:


type = 2:


type = 3:


H = Pillars:


K = Key:


N = Spikes:


P = Player:


S = Sand:


W = Wall:

Summary
Some things to keep in mind while making your maps.

  • Maps are located in: GOODBYE WORLD\gb\map
  • Text/Speech bubbles are located in: GOODBYE WORLD\text\<language>\text_data_gb_<language>.ini
  • Arrays start at 0, ensure that your [text], [section], [key] values line up with the text_* section and str_* lines in the Text/Speech bubbles file.
  • Maps can be as short as you'd like with a recommended minimum line length of 10, and as long as you'd like when creating them. Keep in mind that every line (0-7) needs to be of equal length.
  • Any Letters that are not uppercase will be rendered as invisible blocks.
  • Any blocks that you wish to delete, must be replaced with a `.`
  • Have Fun!

I hope that this will give you some replay-ability as this game is really well made. I hope you enjoyed this guide :)
Try It Out
Remember to back up the original maps!

You can name this file and place them in the first world directory, GOODBYE WORLD\gb\map\a\

File Name: stage_1.ini
; Copy all contents below as you see them and paste it into your stage_1.ini file [data] 0 = W..E..W..E..W..E..W..E..W.E..W. 1 = WK.......................K...D. 2 = WSSSS..W..W..W..W..W..W..W...W. 3 = WSSS..W........................ 4 = WSS..WH........................ 5 = WS..WHH.NNNNNNNNNNNNNNNNNNNNNN. 6 = WP.WHHH.BBBBBBBBBBBBBBBBBBBBBBB 7 = GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG [text] 0 = .66...216.....................6 [section] 0 = 12 1 = 1 2 = 3 3 = 1 4 = 1 5 = 0 [key] 0 = 0 1 = 0 2 = 1 3 = 3 4 = 1 5 = 10 [bg] type = 3


This is a test map, you can check out all of the available blocks, and change various [bg] values as you wish!
; All known blocks are present [data] 0 = SSSSSSSSSSKKKKKKKKKK 1 = EEEEEEEEEEDDDDDDDDDD 2 = WWWWWWWWWWGGGGGGGGGG 3 = .................... 4 = P...............KD.. 5 = @@@@@@@@@@HHHHHHHHHH 6 = NNNNNNNNNNEEEEEEEEEE 7 = GGGGGGGGGG.......... ; You don't need any [section] or [key] sections if you do not want any text [text] 0 = 333333333......4.... [bg] ; ; Excluding the `type` value and the retry value, ; 0 means that the value is disabled ; Setting it to 1 will enable it ; ; Type (Background img): 0, 1, 2, 3, 4 type = 0 ; Dark: 0 or 1 dark = 0 ; Lava: 0 or 1 lava = 1 ; Slow: 0 or 1 slow = 0 ; Retry: the # of which speech bubble ; When the player retries over the 10'th speech bubble, the Player will be reset to the title screen ; Arrays start at 0 retry = 9 ; No Left: 0 or 1 no_left = 0
1 Comments
Vex 4 Dec, 2024 @ 9:58pm 
Whoa thats awesome! I'll have to give this a try