the cutting room mirror

Development Leftovers & Comments

This is a sub-page of Glover (Windows, 2022).

This needs some investigation.
Discuss ideas and findings on the talk page.
Specifically: Still more files to look through in levels/, as well as some stuff in objects/ as well as images for the changed elements if applicable.

All throughout the files for this release, source files intended for developer eyes were leftover, spanning from unpacked object files to entire landscape files prior to conversion to level files and commandline tools.

Uncompiled Tools Source Code#

Prior to the update on April 23, 2025 (when these files would be removed), a folder named tools/ was left within the game files, containing five source code files that relate to tools used during Glover's development.

Download Source Code for Glover Command Line Tools

File: Glover_cmd_tools.7z (18.6 KB) (info)

glo.h#


In the root directory of tools/, A header file named glo.h can be found, this file contain typedefs for the struture of .glo files and functions for handling said files. It is used by heck.c.

Comments

Line(s)

144

264

283

298

541

593

699

Commented Snippets

Line(s)

148

150

158

166

174

178 -> 181

184

188 -> 194

197

203

205

207

213

241

246

252

heck.c#


In tools/hecker/, a C source file named heck.c can be found. It appears to be a command line tool relating to the game's object files with the following functions:

Argument

Help Text

test

verify load+save results in an exact match

texswap

rename textures

texwrap

list all textures with >1 UV

meshdel

delete meshes matching a name

glo2txt

convert glo to text format

txt2glo

convert text file back into binary glo

obecomp.c#


In tools/obecomp/, a C file named obecomp.c can be found. It's another command line tool with the purpose of compiling OBE files into Glover Object files (GLO).
The file contents contain some interesting snippets, such as:

  • A comment block detailing the specs of the GLO format:
*******************************************************************************
 * Convert OBE file to GLO
********************************************************************************
 * GLO (Glover Object) spec
 * Little endian
 * 
 * "GLO" Magic - 4 bytes
 * Version - 2 bytes
 * Number of Objects - 2 bytes
 * List of objects:
 * 
 * * Number of anim segs - 2 bytes
 * * Anim seg list:
 * * * Name - 24 bytes
 * * * start frame - 4 bytes
 * * * end frame - 4 bytes
 * * * flags - 4 bytes
 * * * speed - 4 bytes
 * Number of (top level) meshes - 2 bytes
 * Mesh:
 * * Name - 24 bytes
 * * Number of moveKeys - 2 bytes
 * * moveKeys list:
 * * * Time - 4 bytes
 * * * Vector - 12 bytes
 * * Number of scaleKeys - 2 bytes
 * * scaleKeys list:
 * * * Time - 4 bytes
 * * * Vector - 12 bytes
 * * Number of rotateKeys - 2 bytes
 * * rotateKeys list:
 * * * Time - 4 bytes
 * * * Quaternion - 16 bytes
 * * Number of vertices - 2 bytes
 * * Vertex list:
 * * * Vector - 12 bytes
 * * Number of faces - 2 bytes
 * * Face list:
 * * * Texture filename - 16 bytes
 * * * Color - 4 bytes
 * * * Flags - 2 bytes
 * * * Vertex ref list (always 3):
 * * * * Index in vertex list - 2 bytes
 * * * * Texture UV - 8 bytes
 * * Number of sprites - 2 bytes
 * * Sprite list:
 * * * Texture filename - 16 bytes
 * * * Color - 4 bytes
 * * * Sprite pos - 12 bytes
 * * * Sprite size - 8 bytes
 * * * Sprite flags - 2 bytes
 * * Mesh Translucency - 2 bytes
 * * Mesh flags - 2 bytes
 * * Has child? - 2 bytes
 * * * (Child mesh, recursive)
 * * Has next? - 2 bytes
 * * * (Next mesh, recursive)
*******************************************************************************/
  • A char array of textures that didn't exist (at the time of the file being written):
// Textures that don't exist
const char *NULLTEX[] = {
    "ace.bmp", "puzzle.bmp", "hasbro2.bmp", "spank.bmp", "ether.bmp",
    "butterfly.bmp", "caterpillar.bmp", "fly.bmp", "ladybird.bmp", "spider.bmp",
    "smallfish.bmp", "snail.bmp", "weevil.bmp",
    NULL
};
  • A struct of textures that needed specific UV fixes (again, at the time of the file being written):
// Textures to expand UVs
const struct {
    char name[TEX_NAME_LEN];
    float u, v;
} UVFIX[] = {
    { "redstripe.bmp", 5, 4 },
    { "", 0, 0 },
};

scripted.c & scripted.h#


Finally, found in tools/scripted/, a C source file and C header file can be found detailing another command line tool, which contains code relating to a file parser for .lnd files to convert them to .lev files.
Unlike heck and obecomp, this tool includes two header files that were present in the main game's source code, tokens.h and crc32.h. These weren't included in the game files, so under normal circumstances, this can't be recompiled into an executable.
Like obecomp.c, scripted.c also contains numerous amounts of interesting snippets, including:

  • A comment block at the start of the file, featuring the project name ("oddballs"), the file's former name ("files.cpp"), a file description ("handles all file control") and a copyright notice from Interactive Studios Limited (ISL) from 1996.
/*
 *  Project:         oddballs
 *  File:            files.cpp
 *  Description:     handles all file control
 *
 *  (c)1996 ISL.
 */
  • Several char arrays, listing various names for objects in a file, like actors, conditions and terrain.

Variable Name

Snippet

Actor Names

char *actorName[] = {   
                        "CAMERA","HAND","BALL","DEBRIS","BULLET", "SNEEZY","MOOCOW","BOVVA",
                        "CANNONBALL","SAMTEX","MALLET","GENERALWU","LIONFISH","CHESTER",
                        "KEG","REGGIE", "SWISH","KNIGHT", "ROBES", "FUMBLE", "MIKE",
                        "RAPTOR", "CRUMPET", "TRACEY","YOOFOW", "OPEC", "CYMON",
                        "SUCKER", "BUGLE", "DENIS", "CHUCK","HUBCHICKEN","FRANKIE",
                        "KLOSET","FLANNEL","SELWYN_WHALE","SELWYN_CRAB","SELWYN_FISH",
                        "ROBOT","EVIL_ROBOT","SPANK","BABY_SPANK","EVIL_GLOVE","DIBBER","FLY","SNAIL",
                        "BIGFISH","LITTLEFISH","LADYBIRD","WEEVIL","CATERPILLAR","BUTTERFLY",
                        "SPIDER","BAT","FROG","DRAGFLY","BOXTHING","BUG","NME_FROG","*"};

Exit Door Names

char *exitDoorName[] = 
{
    "LEVEL",
    "SUB_LEVEL",
    "WORLD",
    "BONUS",
    "BONUS_DONE",
    "ATLANTIS",
    "CARNIVAL",
    "PIRATES",
    "PREHISTORIC",
    "FEAR",
    "SPACE",
    "CAVE",
    "HUB",
    "CAMEO",
    "QUIT",
    "LEVEL_1",
    "LEVEL_2",
    "LEVEL_3",
    "LEVEL_BOSS",
    "LEVEL_BONUS",
    "ASSAULT"
};

Terrain Names

char *terrainName[] = 
{
    "STONE",
    "GRASS",
    "ICE",
    "MUD",
    "SAND",
    "WATERY",
    "LAVA",
    "STICKY",
    "SLIDY",
    "GOO",
    "SNOW",
    "ICYSNOW",
    "FORCE_FIELD",
    "STICKY2",
};

Vent Names

char *ventName[] = 
{
    "FLAME",
    "STEAM",
    "AIR",
    "SMOKE",
    "SNOWBALL",
    "BOULDER",
    "ICICLE",
    "FLOATY",
    "BUBBLE",
    "CANNONBALL",
    "WATER"
};

Pickup Names

char *pickupName[] = 
{
    "STUN",
    "DEATH",
    "FROGGY",
    "SUCTION",
    "HERCULES",
    "SPEEDUP",
    "ROTORBLADES",
    "BOWLINGBALL",
    "POWERBALL",
    "BALLBEARING",
    "BEACHBALL",
    "SNOWBALL",
    "CRYSTALBALL",
    "BOOMERANGBALL",
    "VANISHBALL",
};
  • Comment blocks that are to specify what each function does. Most aren't filled in.

Function Name

Comment Block

main

/*  --------------------------------------------------------------------------------
    Function    : 
    Purpose     : 
    Parameters  : 
    Returns     : 
    Info        :
*/

ParseLandscapeFile

/*  --------------------------------------------------------------------------------
    Function    : ParseLandscapeFile()
    Purpose     : loads in all the meshes that make up the landscape
    Parameters  : filename
    Returns     : success/failure
    Info        :
*/

PlatformAddPoint

/*  --------------------------------------------------------------------------------
    Function    : PlatformAddPoint()
    Purpose     : 
    Parameters  : 
    Returns     : 
    Info        :
*/

IsCameraAction

/*  --------------------------------------------------------------------------------
    Function    : 
    Purpose     : 
    Parameters  : 
    Returns     : 
    Info        :
*/

IsCameraCondition

NMEInitInstruction

NMEDetermineConditionType

/*  --------------------------------------------------------------------------------
    Function    : NMEDetermineConditionType
    Purpose     : converts a string into the correct condition type number
    Parameters  : char *string
    Returns     : char
    Info        :
*/
  • Default filepaths of the dev's file structure from when this file was written, they're used as default filepaths on a ParseLandscapeFile call when running main with less than 2 arguments.

File

Out File

d:/n64/oddballs/graphics/worlds/atlantis/at2.lnd
d:/n64/oddballs/graphics/worlds/atlantis/at2.lev
  • Commented out code.

Function

Function Code / Function Snippet

ParseLandscapeFile

PlatformAddPoint

Landscape Files#

Present in data/levels/, uncompiled source files (*.lnd) for every level can be found next to their compiled counterparts (*.lev). These files are entirely ASCII-based.
The source files can also contain comments, this comment can be found at the start of every .lnd file:

 /* ------------------------------------------------------ */
 /*    Genesis world file.  *   Interactive Studios Ltd    */
 /* ------------------------------------------------------ */
 /* :Version                                         0.01a */
 /* ------------------------------------------------------ */

Most object declarations (E.G. Platforms, Pickups and Puzzles) can have comments preceding it, an example being:

/* ----   [OBJECT TYPE] - You want a description too?   ---- */

After all objects have been specified, most files end that section with this comment:

 /* ------------------------------------------------------ */
 /* Genesis world file END                                 */
 /* ------------------------------------------------------ */

Most of these landscape files match the corresponding .lev file, however there are exceptions where aspects were commented out or changed.

acourse#


acourse.lnd has one line commented out, which is an alternate declaration for the Tip entity that informs you how to change your ball at a different position.

Line(s)

Unused

Used

(403 - 405) -> 406

/* TIP -187 45 -307 28 */

TIP -156 125 -2480 28

atlantis_boss#


atlantis_boss.lnd also has some lines commented out, this one being a change in one of the puzzle declarations.

Line(s)

Unused

Used

(180 - 184) -> (186 - 189)

/* PUZZLE NUMTIMES 1
    ACTION SET_CAM_DIST 0 220 0 0
    ACTION SET_CAM_HEIGHT 0 -50 0 0 */
PUZZLE NUMTIMES 1
    CONDITION NME_DEAD 2 1
    ACTION SET_CAM_HEIGHT 0 -50 0 0 
    ACTION START_MOVE 1 10 4 0

carnival_1#


carnival_1.lnd has a number of declarations that have been commented out, as well as general developer comments.

Changes

Line(s)

33 -> 34

115 <- 117

(120 - 121) -> 122

(125 - 126) -> 127

(130 - 131)-> 132

363 -> 365

371 -> 372

825 -> 826

855 -> 856

877 -> 878

900 -> 901

982 -> 983

(991 - 997) -> (998 - 1002)

(1028 - 1032) -> (1036 - 1038)

Commented Definitions

Line(s)

1

61

282

312

536

946 -> 950

957 -> 959

987

1019

present#


present.lnd is the company credits space when you boot the game. The changes in this were purely to comment out the declarations for the assets tied to the original developers.

Commented Definitions

Line(s)

22

25 -> 26

29

35

38

41

44

47 -> 48

51 -> 52

55 -> 56

59

space_1#


space_1 has two files tied to it, space_1.lnd and space_1.lnd.bak.
While space_1.lnd doesn't have anything noteworthy in it, space_1.lnd.bak appears to be a substancially different level, featuring different puzzles, landscape declarations and usage of the backdrop nebula2.bmp.
The file looks to share a lot of its structure with the OOTW_LEVEL1.lev file found in the 1998 PC port of Glover, however none of the referenced files are present in either release.

Download Space 1 Landscape Backup File

File: Glover_Space1_lndbak.7z (1.72 KB) (info)

space_boss1#


space_boss1.lnd doesn't have much commented, mainly landscapes for an archway and an exit door.

Line(s)

Definitions

34 -> 42

/*

/* ----   LANDSCAPE - You want a description too?   ---- */
 LANDSCAPE  arch.ndo -1250.000000 150.000000 2858.000000 

/* ----   LANDSCAPE - You want a description too?   ---- */
 LANDSCAPE  lildr.ndo -1250.000000 125.000000 2838.000000 

*/

124

/*EXITDOOR SUB_LEVEL 0*/

space_boss3#


No, there isn't a "space_boss2" file. space_boss3.lnd has a few more landscape pieces commented out, along with comments describing the Cross-Stitch cameo.

Commented Definitions

Line(s)

25 -> 31

35 -> 41

137

173 -> 176

Cameo Comments

        CAMEO_INSTRUCTION MOVE_ACTOR 2 30 500 1600 15 -1 -1         /* evil glove fly-by */
    CAMEO_INSTRUCTION MOVE_ACTOR -1 50 700 -290 10000 49 -1     /* cam start */
    CAMEO_INSTRUCTION MOVE_ACTOR -2 57 587 13 10000 49 -1       /* cam target start */
                                                                
    CAMEO_INSTRUCTION TARGET_CAMERA 2 0 0 0 -9 -50              /* target evil glove */
    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 30 3950 14 2 -283         /* evil glove fly-by */
    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 30 3950 16 1 4            /* evil glove fly-by */
    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 30 3950 18 1 5            /* evil glove fly-by */
    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 30 3950 20 1 6            /* evil glove fly-by */
    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 30 3950 22 -1 7           /* evil glove fly-by */
    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 350 4000 14 -1 8          /* evil glove into robot */
                                                                
    CAMEO_INSTRUCTION ROTATE_ACTOR 2 -1.57 -1 8
                                                                
/*  CAMEO_INSTRUCTION MOVE_ACTOR -2  0 413 4000 14 -14 9        /* move target up to head */ */

    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 -10000 -10000 10000 1 14  /* evil glove fuck off */

    CAMEO_INSTRUCTION MOVE_ACTOR -1  0 600 3000 25 -1 8         /* move cam up to head */
    CAMEO_INSTRUCTION MOVE_ACTOR -1  0 600 3000 25 150 12       /* move cam up to head */

    CAMEO_INSTRUCTION MOVE_ACTOR 2  0 350 4000 14 2 9           
    CAMEO_INSTRUCTION MOVE_ACTOR -1  0 400 -50 45 -1 13     /* move cam back */
    CAMEO_INSTRUCTION TARGET_CAMERA 1 0 0 0 1 9             /* target robot */

Backup Objects#

Found throughout data/objects, some backup model files were leftover from development, most differ with just textures being swapped.
For easier comparisons, all the files that only have .glo variants have been ran through the heck tool to convert them from .glo files to .txt files.

pikotitbox#


The most interesting file is pikotitbox.txt, which can be found in data/objects/present. This file is a text version of what would be baked into pikotitbox.glo, although the elements are missing their XLU token.
In the leftover text file, the old vertex contents are present, but entirely commented out in favour of new vertex contents. The old contents are likely for the former developer/publisher elements.

Fortress 3 (ff3)#


Stored in data/objects/fortress. A handful of texture assignments were changed from their former assignment to cavewew.bmp.

Example Snippet

Unused (ff3_bak.glo)

Used (ff3.glo)

face "white2.bmp" FFFFFFFF 0008 {
    vref 0 0.000000 0.000000
    vref 1 2.000000 0.000000
    vref 2 2.000000 1.000000
}
face "cavewew.bmp" FFFFFFFF 0008 {
    vref 0 0.000000 0.000000
    vref 1 2.000000 0.000000
    vref 2 2.000000 1.000000
}

Unused Assignment

Used Assignment

"white2.bmp"
"cavewew.bmp"
"test6.bmp"
"cavewew.bmp"
"wpris07.bmp"
"cavewew.bmp"
"wpris08.bmp"
"cavewew.bmp"
"jumbo1.bmp"
"cavewew.bmp"
"closit.bmp"
"cavewew.bmp"
"exit1.bmp"
"cavewew.bmp"

wayroom#


Stored in data/objects/wayroom. The only change between the two is changing the texture assignments from "water1g.bmp" to "cavewew.bmp".

Example Snippet

Unused (wayroom_bak.glo)

Used (wayroom.glo)

face "water1g.bmp" FFFFFFFF 0008 {
    vref 40 1.000000 1.000000
    vref 41 0.850000 0.187500
    vref 42 0.150000 0.187500
}
face "cavewew.bmp" FFFFFFFF 0008 {
    vref 40 1.000000 1.000000
    vref 41 0.850000 0.187500
    vref 42 0.150000 0.187500
}

Texture Bank Comments#

Within the various files found in data/textures/bnk, comments can be found within the many bank files, along with commented out entries.
===textures.ini===


An ini file found in data/textures/bnk. It's apparently not used anymore, but is only kept around for its comments for the files that are used for textures.

Comment

; TEXTURES.INI
; This file isn't used anymore, but it's still here for the comments

; BNK FILES
; Each "bnk" is a plain-text list of file paths to bmp textures
; A comma followed by number may be appended to set flags (see below)
; Lines beginning with a semicolon or space will be ignored
; Note that object meshes explicitly reference textures by filename,
; therefore it is not advisable to change the filenames

; TEXTURE FLAGS
; Texture coordinate wrapping (unset defaults GL_CLAMP_TO_EDGE)
; +1 = GL_REPEAT horizontally
; +2 = GL_REPEAT vertically
; +4 = GL_MIRRORED_REPEAT horizontally (takes precidence over GL_REPEAT)
; +8 = GL_MIRRORED_REPEAT vertically (takes precidence over GL_REPEAT)
; Texture filtering (unset defaults GL_NEAREST)
; +16 = GL_LINEAR filtering
; Texture scrolling for stuff like running water
; +32 = Scroll down 1 pixel per tick
; +64 = Scroll right 1 pixel per tick
; +128 = Scroll up 1 pixel per tick
; +256 = Scroll left 1 pixel per tick

; TEXTURE FILES
; The filenames in the BNKs are fed straight to stb_image_load
; While most are BMP, many common image formats are supported, see:
; https://github.com/nothings/stb/blob/master/stb_image.h
; The supported file types are in the "QUICK NOTES"
; In the case of a load failure, the game will use a blank white texture