Sly 1:LS

From SlyMods
Jump to navigation Jump to search
Data Structure
GameSly Cooper and the Thievius Raccoonus
Official NameYes

LS (Level State) is a data structure in Sly Cooper and the Thievius Raccoonus. It is used for storing the current state of each level in the Game State.

Structure[edit | edit source]

The LS struct is defined as follows:
struct LS {
    enum FLS fls; /* Level state flags */
    float dt; /* Time spent in level (secs) */
    float dtTimedBest; /* Best MTS time for level */
    float uSuck; /* Current player suck value for level */
    float suck_field_0x10; /* Unknown value, related to uSuck */
    int afDialogPlayed[12]; /*  Dialog played flags */
    struct SceneVar a_scene_vars[4]; /* Scene variables */
    int cclue; /* Count of bottles collected */
    uint fclue; /* Flags marking which bottles have been collected */
    undefined4 field_0x6c; /* Unknown */
    int field_0x70; /* Unknown */
    byte * unk_ptr_0x74; /* Unknown ptr to 1-byte value */

Level state flags[edit | edit source]

The current state of the level is represented using the FLS enum, which has the following possible values:

Name Value Description
FLS_Visited 0x1 The level has been visited and is selectable from View Map.
FLS_KeyCollected 0x2 The key has been collected on the level.
FLS_Secondary 0x4 The vault has been opened on the level.
FLS_Tertiary 0x8 The MTS has been completed on the level.
FLS_BossDefeated 0x10 Unknown

uSuck values[edit | edit source]

Each individual level state has a uSuck value which is used to scale the game's difficulty. There is also a second value related to suck stored at offset 0x10, but the purpose of that value is currently unknown. It is often incremented at the same time as the first suck value, but the second one is sometimes multiplied by some value to make it bigger or smaller.

Clue values[edit | edit source]

The level state has two values associated with clue bottles. The first, cclue, is the quantity of clue bottles have been collected in the level. The second, fclue, is a bitfield that keeps track of which specific clue bottles have been collected.

Each bit in fclue corresponds to a specific clue in the map. During a level load, any particular clue bottle will only be spawned in if the corresponding bit is not set.

Dialogue flags[edit | edit source]

Every LS has an array for storing up to 12 dialogue flags, afDialogPlayed, with each flag corresponding to a specific dialog. Most are Bentley cutscenes but it is also used for things like the PA announcements in the hub maps.

If a dialog flag is set to 0, that dialog will automatically play when Sly enters the associated trigger volume. If the flag is set to 1, then the trigger volume instead causes the L1 popup blot to appear in the lower-left corner, giving the option to replay the dialog.

Scene variables[edit | edit source]

Every LS has slots for up to 4 scene variables. Each scene variable is a numerical ID and value pair. On a new game, the ID and values of all scene variables are 0, and the game sets them as it needs to.

When the game first sets a scene variable, it uses the first available slot on the LS. Then, when the game needs to check the value of a scene variable for a particular level, it iterates over the scene flags on that level’s LS and stops when it finds a match.

The following is a list of all known scene variables the game uses. There may still be more that are undiscovered.

Level ID (hex) ID (dec) Known Values
Prowling the Grounds 0x748 1864 1 - Unknown
Into The Machine 0x7e3 2019 2019 - Set if the invisible wall of fire is activated
Last Call 0x5a8 1448 1 - Unknown
The Swamp's Dark Center 0x692 1682 1 - Voodoo gate left candle broken on the roof near Down Home Cooking
The Swamp's Dark Center 0x695 1685 1 - Voodoo gate right candle broken on the roof near Down Home Cooking
Duel by the Dragon 0x53b 1339 0 - Set when you first load the level. It indicates that the first Carmelita cutscene should play when you get to the roof.

1 - Set when the first Carmelita cutscene plays. It remains 1 after you die so you don't have to watch the cutscene every time.

A Strange Reunion 0x701 1793 1 - Unknown, set when the level starts. Probably related to cutscenes.

3 - Unknown, probably related to cutscenes.

A Strange Reunion 0x704 1796 10 - Unknown

See also[edit | edit source]