smm2_parsing

package module
v0.0.0-...-f1d5edb Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 10, 2023 License: MIT Imports: 18 Imported by: 0

README

smm2_parsing

Super Mario Maker 2 file parsing in go. Includes level, thumbnail and replay parsing.

API

Level encryption
func DecryptLevel(buf []byte) ([]byte, error)

Decrypt BCD binary.

func EncryptLevel(buf []byte) ([]byte, error)

Encrypt BCD binary into format accepted by the game.

func Compress(data []byte) ([]byte, error)

Zlib compression. Zlib compression on a decrypted BCD generally makes it 1% of the size.

func Decompress(buf []byte) ([]byte, error)

Zlib decompression.

Level parsing
func (s *BCD) Load(buf []byte) error

Load encrypted BCD into BCD struct.

func (s *BCD) LoadDecrypted(buf []byte) error

Load decrypted BCD into BCD struct.

func (s *BCD) Save() ([]byte, error)

Save encrypted BCD from BCD struct.

func (s *BCD) SaveDecrypted() ([]byte, error)

Save decrypted BCD from BCD struct.

func EncodeToUCS2(str string) []byte

Encode string to UCS-2 slice, used to create Name and Description from strings.

func DecodeFromUCS2(src []byte) (string, error)

Decode UCS-2 slice to string, used to create strings from Name and Description. If there is a dangling surrogate an error will be returned.

A number of enums are also provided in level_format_enums.go.

Thumbnail encryption
func EncryptJpegThumbnail(buf []byte) ([]byte, error)

Encrypt thumbnail to be accepted by the game. Will ignore already encrypted thumbnails. Encrypted thumbnails contain some data at the end but are still viewable by standard image viewers.

func RepackThumbnailUntilFit(buf []byte) ([]byte, error)

Thumbnails accepted by the game must be less than 0x1BF9C bytes, this continually tries to repack the JPEG until it is under this limit and returns an error if quality 20 is not enough to make the JPEG fit under the size limit.

func UnpackJpegThumbnail(buf []byte) ([]byte, error)

Unpack arbitrary image into JPEG. Simply performs image.Decode(reader).

func RepackWorldThumbnailSilly(buf []byte) ([]byte, error)

Some thumbnails fail for some reason.

Replay parsing
func (s *Replay) Load(buf []byte) error

Load WR, first clear or upload replay into list.

func (s *Replay) GetTASText() string

Get nx-tas compatible tas script from replay. Due to slight differences there will be desyncs.

Examples

import (
	"os"
	"github.com/mm2srv/smm2_parsing"
)

encrypted, err := os.ReadFile("test.bcd")
if err != nil {
    return err
}
decrypted, err := smm2_parsing.DecryptLevel(encrypted)
if err != nil {
    return err
}
compressed, err := smm2_parsing.Compress(decrypted)
if err != nil {
    return err
}
err = os.WriteFile("test_compressed.bcd", compressed, 0644)
if err != nil {
    return err
}

Read encrypted BCD from disk, decrypt it, compress it and write it to disk.

import (
	"os"
	"github.com/mm2srv/smm2_parsing"
)

decrypted, err := os.ReadFile("thumbnail.jpg")
if err != nil {
    return err
}
encrypted, err := smm2_parsing.EncryptJpegThumbnail(decrypted)
if err != nil {
    return err
}
err = os.WriteFile("thumbnail_encrypted.jpg", encrypted, 0644)
if err != nil {
    return err
}

Read thumbnail from disk and encrypt it so it is accepted by the game.

import (
	"os"
	"github.com/mm2srv/smm2_parsing"
)

decrypted, err := os.ReadFile("decrypted.bcd")
if err != nil {
    return err
}
bcd := &smm2_parsing.BCD{}
if bcd.LoadDecrypted(decrypted) != nil {
    return err
}

bcd.Header.UploadId = 0
bcd.Header.ManagementFlags = (level.Header.ManagementFlags &^ (1 << 16))
bcd.Header.ManagementFlags = (level.Header.ManagementFlags &^ (1 << 4))
bcd.Header.ManagementFlags = (level.Header.ManagementFlags &^ (1 << 6))

newDecrypted, err := bcd.Save()
if err != nil {
	return err
}
err = os.WriteFile("no_upload_flag.bcd", newDecrypted, 0644)
if err != nil {
    return err
}

Read decrypted BCD from disk, remove upload flag and write it back to disk.

import (
	"os"
    "fmt"
	"github.com/mm2srv/smm2_parsing"
)

replayFile, err := os.ReadFile("replay.bin")
if err != nil {
    return err
}
replay := &smm2_parsing.Replay{}
if replay.Load(replayFile) != nil {
    return err
}
for _, entry := range replay.entries {
    // Iterate through replay entries
    if entry.entry_type == Time {
        fmt.Printf("Time: %d frames\n", entry.frames)
	} else if entry.entry_type == Joysticks {
        fmt.Printf("Joysticks: %d x %d y\n", entry.joystick_x, entry.joystick_y)
	} else if entry.entry_type == Inputs {
        // Iterate through inputs to construct a string
        var inputString string
		if len(entry.inputs) == 0 {
			inputString = "NONE"
		} else {
            for i, input := range entry.inputs {
                inputString += replay.InputToName(input)
                if i != len(entry.inputs) - 1 {
                    inputString += " "
                }
            }
		}
		fmt.Printf("Inputs: %s\n", inputString)
	}
}

Load WR, first clear or upload replay into list and print that list.

Credits

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Compress

func Compress(data []byte) ([]byte, error)

func DecodeFromUCS2

func DecodeFromUCS2(src []byte) (string, error)

func Decompress

func Decompress(buf []byte) ([]byte, error)

func DecryptLevel

func DecryptLevel(buf []byte) ([]byte, error)

func DecryptReplay

func DecryptReplay(buf []byte) ([]byte, error)

func EncodeToUCS2

func EncodeToUCS2(str string) []byte

func EncryptJpegThumbnail

func EncryptJpegThumbnail(buf []byte) ([]byte, error)

Add neccesary data at the end of the thumbnail

func EncryptLevel

func EncryptLevel(buf []byte) ([]byte, error)

func RemoveUploadedFlag

func RemoveUploadedFlag(rawBCD []byte) ([]byte, error)

func RepackThumbnailUntilFit

func RepackThumbnailUntilFit(buf []byte) ([]byte, error)

func RepackWorldThumbnailSilly

func RepackWorldThumbnailSilly(buf []byte) ([]byte, error)

no clue why but (some) dump world thumbnails fail otherwise

func UnpackJpegThumbnail

func UnpackJpegThumbnail(buf []byte) ([]byte, error)

Types

type AutoscrollSpeed

type AutoscrollSpeed uint8
const (
	AUTOSCROLL_X1 AutoscrollSpeed = 0
	AUTOSCROLL_X2 AutoscrollSpeed = 1
	AUTOSCROLL_X3 AutoscrollSpeed = 2
)

type AutoscrollType

type AutoscrollType uint8
const (
	AUTOSCROLL_NONE AutoscrollType = 0
	SLOW            AutoscrollType = 1
	NORMAL          AutoscrollType = 2
	FAST            AutoscrollType = 3
	CUSTOM          AutoscrollType = 4
)

type BCD

type BCD struct {
	//VersionNumber1 uint32  // Assumed version number -- must be 1 in v1.0.0
	//VersionNumber2 uint16  // Assumed version number -- must be 0x10 in v1.0.0
	//Padding1       [2]byte // 2 empty bytes
	//CRC32          uint32  // CRC32 of the decrypted level file from offset 0x10 to 0x5BFD0 (non-inclusive)
	//Magic          [4]byte // Magic SCDL (53 53 44 4C)
	Header    Header // header 0x200
	OverWorld LevelArea
	SubWorld  LevelArea
}

func LoadBCD

func LoadBCD(buf []byte) (*BCD, error)

func (*BCD) Load

func (s *BCD) Load(buf []byte) error

func (*BCD) LoadDecrypted

func (s *BCD) LoadDecrypted(buf []byte) error

func (*BCD) Save

func (s *BCD) Save() ([]byte, error)

func (*BCD) SaveDecrypted

func (s *BCD) SaveDecrypted() ([]byte, error)

type BoundaryType

type BoundaryType uint8
const (
	BUILT_ABOVE_LINE BoundaryType = 0
	BUILT_BELOW_LINE BoundaryType = 0
)

type ClearConCategory

type ClearConCategory uint8
const (
	CATEGORY_NONE    ClearConCategory = 0
	CATEGORY_PARTS   ClearConCategory = 1
	CATEGORY_STATUS  ClearConCategory = 2
	CATEGORY_ACTIONS ClearConCategory = 3
)

type ClearConId

type ClearConId uint32
const (
	CLEARCON_NONE                                                                                              ClearConId = 0
	REACH_THE_GOAL_WITHOUT_LANDING_AFTER_LEAVING_THE_GROUND                                                    ClearConId = 137525990
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_MECHAKOOPA                                                     ClearConId = 199585683
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_CHEEP_CHEEP                                                    ClearConId = 272349836
	REACH_THE_GOAL_WITHOUT_TAKING_DAMAGE                                                                       ClearConId = 375673178
	REACH_THE_GOAL_AS_BOOMERANG_MARIO                                                                          ClearConId = 426197923
	REACH_THE_GOAL_WHILE_WEARING_A_SHOE                                                                        ClearConId = 436833616
	REACH_THE_GOAL_AS_FIRE_MARIO                                                                               ClearConId = 713979835
	REACH_THE_GOAL_AS_FROG_MARIO                                                                               ClearConId = 744927294
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_LARRY                                                          ClearConId = 751004331
	REACH_THE_GOAL_AS_RACCOON_MARIO                                                                            ClearConId = 900050759
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BLOOPER                                                        ClearConId = 947659466
	REACH_THE_GOAL_AS_PROPELLER_MARIO                                                                          ClearConId = 976173462
	REACH_THE_GOAL_WHILE_WEARING_A_PROPELLER_BOX                                                               ClearConId = 994686866
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_SPIKE                                                          ClearConId = 998904081
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BOOM_BOOM                                                      ClearConId = 1008094897
	REACH_THE_GOAL_WHILE_HOLDING_A_KOOPA_SHELL                                                                 ClearConId = 1051433633
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_PORCUPUFFER                                                    ClearConId = 1061233896
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_CHARVAARGH                                                     ClearConId = 1062253843
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BULLET_BILL                                                    ClearConId = 1079889509
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BULLY_BULLIES                                                  ClearConId = 1080535886
	REACH_THE_GOAL_WHILE_WEARING_A_GOOMBA_MASK                                                                 ClearConId = 1151250770
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_HOP_CHOPS                                                      ClearConId = 1182464856
	REACH_THE_GOAL_WHILE_HOLDING_A_RED_POW_BLOCK_OR_REACH_THE_GOAL_AFTER_ACTIVATING_AT_LEAST_ALL_RED_POW_BLOCK ClearConId = 1219761531
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BOB_OMB                                                        ClearConId = 1221661152
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_SPINY_SPINIES                                                  ClearConId = 1259427138
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BOWSER_MEOWSER                                                 ClearConId = 1268255615
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_ANT_TROOPER                                                    ClearConId = 1279580818
	REACH_THE_GOAL_ON_A_LAKITUS_CLOUD                                                                          ClearConId = 1283945123
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BOO                                                            ClearConId = 1344044032
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_ROY                                                            ClearConId = 1425973877
	REACH_THE_GOAL_WHILE_HOLDING_A_TRAMPOLINE                                                                  ClearConId = 1429902736
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_MORTON                                                         ClearConId = 1431944825
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_FISH_BONE                                                      ClearConId = 1446467058
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_MONTY_MOLE                                                     ClearConId = 1510495760
	REACH_THE_GOAL_AFTER_PICKING_UP_AT_LEAST_ALL_1_UP_MUSHROOM                                                 ClearConId = 1656179347
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_HAMMER_BRO                                                     ClearConId = 1665820273
	REACH_THE_GOAL_AFTER_HITTING_AT_LEAST_ALL_P_SWITCH_OR_REACH_THE_GOAL_WHILE_HOLDING_A_P_SWITCH              ClearConId = 1676924210
	REACH_THE_GOAL_AFTER_ACTIVATING_AT_LEAST_ALL_POW_BLOCK_OR_REACH_THE_GOAL_WHILE_HOLDING_A_POW_BLOCK         ClearConId = 1715960804
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_ANGRY_SUN                                                      ClearConId = 1724036958
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_POKEY                                                          ClearConId = 1730095541
	REACH_THE_GOAL_AS_SUPERBALL_MARIO                                                                          ClearConId = 1780278293
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_POM_POM                                                        ClearConId = 1839897151
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_PEEPA                                                          ClearConId = 1969299694
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_LAKITU                                                         ClearConId = 2035052211
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_LEMMY                                                          ClearConId = 2038503215
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_LAVA_BUBBLE                                                    ClearConId = 2048033177
	REACH_THE_GOAL_WHILE_WEARING_A_BULLET_BILL_MASK                                                            ClearConId = 2076496776
	REACH_THE_GOAL_AS_BIG_MARIO                                                                                ClearConId = 2089161429
	REACH_THE_GOAL_AS_CAT_MARIO                                                                                ClearConId = 2111528319
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_GOOMBA_GALOOMBA                                                ClearConId = 2131209407
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_THWOMP                                                         ClearConId = 2139645066
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_IGGY                                                           ClearConId = 2259346429
	REACH_THE_GOAL_WHILE_WEARING_A_DRY_BONES_SHELL                                                             ClearConId = 2549654281
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_SLEDGE_BRO                                                     ClearConId = 2694559007
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_ROCKY_WRENCH                                                   ClearConId = 2746139466
	REACH_THE_GOAL_AFTER_GRABBING_AT_LEAST_ALL_50_COIN                                                         ClearConId = 2749601092
	REACH_THE_GOAL_AS_FLYING_SQUIRREL_MARIO                                                                    ClearConId = 2855236681
	REACH_THE_GOAL_AS_BUZZY_MARIO                                                                              ClearConId = 3036298571
	REACH_THE_GOAL_AS_BUILDER_MARIO                                                                            ClearConId = 3074433106
	REACH_THE_GOAL_AS_CAPE_MARIO                                                                               ClearConId = 3146932243
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_WENDY                                                          ClearConId = 3174413484
	REACH_THE_GOAL_WHILE_WEARING_A_CANNON_BOX                                                                  ClearConId = 3206222275
	REACH_THE_GOAL_AS_LINK                                                                                     ClearConId = 3314955857
	REACH_THE_GOAL_WHILE_YOU_HAVE_SUPER_STAR_INVINCIBILITY                                                     ClearConId = 3342591980
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_GOOMBRAT_GOOMBUD                                               ClearConId = 3346433512
	REACH_THE_GOAL_AFTER_GRABBING_AT_LEAST_ALL_10_COIN                                                         ClearConId = 3348058176
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BUZZY_BEETLE                                                   ClearConId = 3353006607
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BOWSER_JR                                                      ClearConId = 3392229961
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_KOOPA_TROOPA                                                   ClearConId = 3437308486
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_CHAIN_CHOMP                                                    ClearConId = 3459144213
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_MUNCHER                                                        ClearConId = 3466227835
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_WIGGLER                                                        ClearConId = 3481362698
	REACH_THE_GOAL_AS_SMB2_MARIO                                                                               ClearConId = 3513732174
	REACH_THE_GOAL_IN_A_KOOPA_CLOWN_CAR_JUNIOR_CLOWN_CAR                                                       ClearConId = 3649647177
	REACH_THE_GOAL_AS_SPINY_MARIO                                                                              ClearConId = 3725246406
	REACH_THE_GOAL_IN_A_KOOPA_TROOPA_CAR                                                                       ClearConId = 3730243509
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_PIRANHA_PLANT_JUMPING_PIRANHA_PLANT                            ClearConId = 3748075486
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_DRY_BONES                                                      ClearConId = 3797704544
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_STINGBY_STINGBIES                                              ClearConId = 3824561269
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_PIRANHA_CREEPER                                                ClearConId = 3833342952
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_FIRE_PIRANHA_PLANT                                             ClearConId = 3842179831
	REACH_THE_GOAL_AFTER_BREAKING_AT_LEAST_ALL_CRATES                                                          ClearConId = 3874680510
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_LUDWIG                                                         ClearConId = 3974581191
	REACH_THE_GOAL_AS_SUPER_MARIO                                                                              ClearConId = 3977257962
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_SKIPSQUEAK                                                     ClearConId = 4042480826
	REACH_THE_GOAL_AFTER_GRABBING_AT_LEAST_ALL_COIN                                                            ClearConId = 4116396131
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_MAGIKOOPA                                                      ClearConId = 4117878280
	REACH_THE_GOAL_AFTER_GRABBING_AT_LEAST_ALL_30_COIN                                                         ClearConId = 4122555074
	REACH_THE_GOAL_AS_BALLOON_MARIO                                                                            ClearConId = 4153835197
	REACH_THE_GOAL_WHILE_WEARING_A_RED_POW_BOX                                                                 ClearConId = 4172105156
	REACH_THE_GOAL_WHILE_RIDING_YOSHI                                                                          ClearConId = 4209535561
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_SPIKE_TOP                                                      ClearConId = 4269094462
	REACH_THE_GOAL_AFTER_DEFEATING_AT_LEAST_ALL_BANZAI_BILL                                                    ClearConId = 4293354249
)

type ClearPipe

type ClearPipe struct {
	Index     uint8
	NodeCount uint8
	Unk       uint16
	Nodes     [36]ClearPipeNode
}

type ClearPipeNode

type ClearPipeNode struct {
	Type      uint8
	Index     uint8
	X         uint8
	Y         uint8
	Width     uint8
	Height    uint8
	Unk1      uint8
	Direction uint8
}

type CourseTheme

type CourseTheme uint8
const (
	OVERWORLD   CourseTheme = 0
	UNDERGROUND CourseTheme = 1
	CASTLE      CourseTheme = 2
	AIRSHIP     CourseTheme = 3
	UNDERWATER  CourseTheme = 4
	GHOST_HOUSE CourseTheme = 5
	SNOW        CourseTheme = 6
	DESERT      CourseTheme = 7
	SKY         CourseTheme = 8
	FOREST      CourseTheme = 9
)

type Entry

type Entry struct {
	// contains filtered or unexported fields
}

type ExclamationBlock

type ExclamationBlock struct {
	Unk1      uint8
	Index     uint8
	NodeCount uint8
	Unk2      uint8
	Nodes     [10]ExclamationBlockNode
}

type ExclamationBlockNode

type ExclamationBlockNode struct {
	Unk1      uint8
	Direction uint8
	Unk2      uint16
}

type GameVersion

type GameVersion uint32
const (
	V1_0_0   GameVersion = 0
	V1_0_1   GameVersion = 1
	V1_1_0   GameVersion = 2
	V2_0_0   GameVersion = 3
	V3_0_0   GameVersion = 4
	V3_0_1   GameVersion = 5
	VUNKNOWN GameVersion = 33
)

type Ground

type Ground struct {
	X            uint8
	Y            uint8
	Id           uint8
	BackgroundId uint8
}
type Header struct {
	YStart                  uint8  // Starting Y position of level
	YGoal                   uint8  // Y position of goal (in tiles)
	XGoal                   uint16 //	X position of goal (in tiles * 10)
	TimeLimit               uint16 // Time limit; defaults to 300
	ClearConditionMagnitude uint16 // Target amount required for clear condition
	CreationYear            uint16 //	Creation year
	CreationMonth           uint8  //	Creation month
	CreationDay             uint8  //	Creation day
	CreationHour            uint8  //	Creation hour
	CreationMinute          uint8  //	Creation minute
	AutoscrollSpeed         uint8
	ClearConditionCategory  uint8  //	Clear condition type (more below)
	ClearConditionObject    uint32 // Clear condition object (CRC32 of more below)
	UnkGameVer              uint32
	ManagementFlags         uint32 // Management flags: &1 always seems to be set, &2 shows that a level has passed its Clear Check, &0x10 shows that the level may not be uploaded
	ClearAttemmpts          uint32
	ClearCheckTime          uint32 // Time taken in Clear Check (units unknown), or 0xFFFFFFFF if the level has not been cleared
	CreationId              uint32 // Initialised to a random value when a level is created
	UploadId                uint64
	GameVersion             uint32
	Unk1                    [0xBD]byte
	GameStyle               [0x2]byte // Game style: M1, M3, MW, WU, 3W
	Unk2                    uint8
	Name                    [0x42]byte // Course name, null-terminated, UCS-2
	Description             [0xCA]byte //	Course description, null-terminated, UCS-2 (game only lets you enter up to 75, but there's space for 100)
}

type Icicle

type Icicle struct {
	X    uint8
	Y    uint8
	Type uint8
	Unk1 uint8
}

type LevelArea

type LevelArea struct {
	Theme                     uint8
	AutoscrollType            uint8
	BoundaryType              uint8
	Orientation               uint8
	LiquidEndHeight           uint8
	LiquidType                uint8
	LiquidSpeed               uint8
	LiquidStartHeight         uint8
	BoundaryRight             uint32
	BoundaryTop               uint32
	BoundaryLeft              uint32
	BoundaryBottom            uint32
	UnkFlag                   uint32
	ObjectCount               uint32
	SoundEffectCount          uint32
	SnakeBlockCount           uint32
	ClearPipeCount            uint32
	PiranhaCreeperCount       uint32
	ExclamationMarkBlockCount uint32
	TrackBlockCount           uint32
	Unk1                      uint32
	GroundCount               uint32
	TrackCount                uint32
	IceCount                  uint32
	Objects                   [2600]Object
	Sounds                    [300]Sound
	Snakes                    [5]Snake
	ClearPipes                [200]ClearPipe
	PiranhaCreepers           [10]PiranhaCreeper
	ExclamationBlocks         [10]ExclamationBlock
	TrackBlocks               [10]TrackBlock
	Ground                    [4000]Ground
	Tracks                    [1500]Track
	Icicles                   [300]Icicle
	Unk2                      [0xDBC]byte
}

type LiquidSpeed

type LiquidSpeed uint8
const (
	NONE      LiquidSpeed = 0
	LIQUID_X1 LiquidSpeed = 1
	LIQUID_X2 LiquidSpeed = 2
	LIQUID_X3 LiquidSpeed = 3
)

type LiquidType

type LiquidType uint8
const (
	STATIC             LiquidType = 0
	RISING_OR_FALLING  LiquidType = 1
	RISING_AND_FALLING LiquidType = 2
)

type ObjId

type ObjId uint16
const (
	GOOMBA                  ObjId = 0
	KOOPA                   ObjId = 1
	PIRANHA_FLOWER          ObjId = 2
	HAMMER_BRO              ObjId = 3
	BLOCK                   ObjId = 4
	QUESTION_BLOCK          ObjId = 5
	HARD_BLOCK              ObjId = 6
	GROUND                  ObjId = 7
	COIN                    ObjId = 8
	PIPE                    ObjId = 9
	SPRING                  ObjId = 10
	LIFT                    ObjId = 11
	THWOMP                  ObjId = 12
	BULLET_BILL_BLASTER     ObjId = 13
	MUSHROOM_PLATFORM       ObjId = 14
	BOB_OMB                 ObjId = 15
	SEMISOLID_PLATFORM      ObjId = 16
	BRIDGE                  ObjId = 17
	P_SWITCH                ObjId = 18
	POW                     ObjId = 19
	SUPER_MUSHROOM          ObjId = 20
	DONUT_BLOCK             ObjId = 21
	CLOUD                   ObjId = 22
	NOTE_BLOCK              ObjId = 23
	FIRE_BAR                ObjId = 24
	SPINY                   ObjId = 25
	GOAL_GROUND             ObjId = 26
	GOAL                    ObjId = 27
	BUZZY_BEETLE            ObjId = 28
	HIDDEN_BLOCK            ObjId = 29
	LAKITU                  ObjId = 30
	LAKITU_CLOUD            ObjId = 31
	BANZAI_BILL             ObjId = 32
	ONE_UP                  ObjId = 33
	FIRE_FLOWER             ObjId = 34
	SUPER_STAR              ObjId = 35
	LAVA_LIFT               ObjId = 36
	STARTING_BRICK          ObjId = 37
	STARTING_ARROW          ObjId = 38
	MAGIKOOPA               ObjId = 39
	SPIKE_TOP               ObjId = 40
	BOO                     ObjId = 41
	CLOWN_CAR               ObjId = 42
	SPIKES                  ObjId = 43
	BIG_MUSHROOM            ObjId = 44
	SHOE_GOOMBA             ObjId = 45
	DRY_BONES               ObjId = 46
	CANNON                  ObjId = 47
	BLOOPER                 ObjId = 48
	CASTLE_BRIDGE           ObjId = 49
	JUMPING_MACHINE         ObjId = 50
	SKIPSQUEAK              ObjId = 51
	WIGGLER                 ObjId = 52
	FAST_CONVEYOR_BELT      ObjId = 53
	BURNER                  ObjId = 54
	DOOR                    ObjId = 55
	CHEEP_CHEEP             ObjId = 56
	MUNCHER                 ObjId = 57
	ROCKY_WRENCH            ObjId = 58
	TRACK                   ObjId = 59
	LAVA_BUBBLE             ObjId = 60
	CHAIN_CHOMP             ObjId = 61
	BOWSER                  ObjId = 62
	ICE_BLOCK               ObjId = 63
	VINE                    ObjId = 64
	STINGBY                 ObjId = 65
	ARROW                   ObjId = 66
	ONE_WAY                 ObjId = 67
	SAW                     ObjId = 68
	PLAYER                  ObjId = 69
	BIG_COIN                ObjId = 70
	HALF_COLLISION_PLATFORM ObjId = 71
	KOOPA_CAR               ObjId = 72
	CINOBIO                 ObjId = 73
	SPIKE_BALL              ObjId = 74
	STONE                   ObjId = 75
	TWISTER                 ObjId = 76
	BOOM_BOOM               ObjId = 77
	POKEY                   ObjId = 78
	P_BLOCK                 ObjId = 79
	SPRINT_PLATFORM         ObjId = 80
	SMB2_MUSHROOM           ObjId = 81
	DONUT                   ObjId = 82
	SKEWER                  ObjId = 83
	SNAKE_BLOCK             ObjId = 84
	TRACK_BLOCK             ObjId = 85
	CHARVAARGH              ObjId = 86
	SLIGHT_SLOPE            ObjId = 87
	STEEP_SLOPE             ObjId = 88
	REEL_CAMERA             ObjId = 89
	CHECKPOINT_FLAG         ObjId = 90
	SEESAW                  ObjId = 91
	RED_COIN                ObjId = 92
	CLEAR_PIPE              ObjId = 93
	CONVEYOR_BELT           ObjId = 94
	KEY                     ObjId = 95
	ANT_TROOPER             ObjId = 96
	WARP_BOX                ObjId = 97
	BOWSER_JR               ObjId = 98
	ON_OFF_BLOCK            ObjId = 99
	DOTTED_LINE_BLOCK       ObjId = 100
	WATER_MARKER            ObjId = 101
	MONTY_MOLE              ObjId = 102
	FISH_BONE               ObjId = 103
	ANGRY_SUN               ObjId = 104
	SWINGING_CLAW           ObjId = 105
	TREE                    ObjId = 106
	PIRANHA_CREEPER         ObjId = 107
	BLINKING_BLOCK          ObjId = 108
	SOUND_EFFECT            ObjId = 109
	SPIKE_BLOCK             ObjId = 110
	MECHAKOOPA              ObjId = 111
	CRATE                   ObjId = 112
	MUSHROOM_TRAMPOLINE     ObjId = 113
	PORKUPUFFER             ObjId = 114
	CINOBIC                 ObjId = 115
	SUPER_HAMMER            ObjId = 116
	BULLY                   ObjId = 117
	ICICLE                  ObjId = 118
	EXCLAMATION_BLOCK       ObjId = 119
	LEMMY                   ObjId = 120
	MORTON                  ObjId = 121
	LARRY                   ObjId = 122
	WENDY                   ObjId = 123
	IGGY                    ObjId = 124
	ROY                     ObjId = 125
	LUDWIG                  ObjId = 126
	CANNON_BOX              ObjId = 127
	PROPELLER_BOX           ObjId = 128
	GOOMBA_MASK             ObjId = 129
	BULLET_BILL_MASK        ObjId = 130
	RED_POW_BOX             ObjId = 131
	ON_OFF_TRAMPOLINE       ObjId = 132
)

type Object

type Object struct {
	X      uint32
	Y      uint32
	Unk1   uint16
	Width  uint8
	Height uint8
	Flag   uint32
	CFlag  uint32
	Ex     uint32
	Id     uint16
	CId    uint16
	LId    uint16
	SId    uint16
}

type OrientationType

type OrientationType uint8
const (
	HORIZONTAL OrientationType = 0
	VERTICAL   OrientationType = 1
)

type PiranhaCreeper

type PiranhaCreeper struct {
	Unk1      uint8
	Index     uint8
	NodeCount uint8
	Unk2      uint8
	Nodes     [20]PiranhaCreeperNode
}

type PiranhaCreeperNode

type PiranhaCreeperNode struct {
	Unk1      uint8
	Direction uint8
	Unk2      uint16
}

type Random

type Random struct {
	// contains filtered or unexported fields
}

type Replay

type Replay struct {
	// contains filtered or unexported fields
}

func (*Replay) GetTASText

func (s *Replay) GetTASText() string

func (*Replay) HandleEndCap

func (s *Replay) HandleEndCap(reader *bytes.Reader)

func (*Replay) HandleInput

func (s *Replay) HandleInput(reader *bytes.Reader) bool

func (*Replay) HandleJoysticks

func (s *Replay) HandleJoysticks(reader *bytes.Reader)

func (*Replay) HandleTimePassed

func (s *Replay) HandleTimePassed(units int)

func (*Replay) InputToName

func (s *Replay) InputToName(input ReplayInputType) string

func (*Replay) Load

func (s *Replay) Load(buf []byte) error

type ReplayEntryType

type ReplayEntryType uint8
const (
	Time ReplayEntryType = iota
	Joysticks
	Inputs
)

type ReplayInputType

type ReplayInputType uint8
const (
	X ReplayInputType = iota
	Y
	A
	B
	R
	L
	ZR
	ZL
	Up
	Down
	Left
	Right
	Plus
	Minus
	JoyUp
	JoyDown
	JoyLeft
	JoyRight
)

type Snake

type Snake struct {
	Index     uint8
	NodeCount uint8
	Unk1      uint16
	Nodes     [120]SnakeNode
}

type SnakeNode

type SnakeNode struct {
	Index     uint16
	Direction uint16
	Id        uint32
}

type Sound

type Sound struct {
	Id   uint8
	X    uint8
	Y    uint8
	Unk1 uint8
}

type SoundId

type SoundId uint8
const (
	SHOCK                SoundId = 0
	CLATTER              SoundId = 1
	KICK                 SoundId = 2
	APPLAUSE             SoundId = 3
	GLORY                SoundId = 4
	PUNCH                SoundId = 5
	LAUGHTER             SoundId = 6
	BABY                 SoundId = 7
	DING_DONG            SoundId = 8
	BOSS_MUSIC           SoundId = 9
	HEARTBEAT            SoundId = 10
	SCREAM               SoundId = 11
	DRAMA                SoundId = 12
	JUMP                 SoundId = 13
	CHEER                SoundId = 14
	DOOM                 SoundId = 15
	FIREWORKS            SoundId = 16
	HONK_HONK            SoundId = 17
	BZZT                 SoundId = 18
	BONUS_MUSIC          SoundId = 19
	SILENCE              SoundId = 20
	UNKNOWN1             SoundId = 21
	UNKNOWN2             SoundId = 22
	PARTY_POPPERINGS     SoundId = 23
	BOOO                 SoundId = 24
	GUFFAW               SoundId = 25
	NEAR_MISS            SoundId = 26
	UNKNOWN3             SoundId = 27
	UNKNOWN4             SoundId = 28
	OINK                 SoundId = 29
	KUH_THUNK            SoundId = 30
	BEEP                 SoundId = 31
	NINJA_ATTACKGERS     SoundId = 32
	UNKNOWN5             SoundId = 33
	UNKNOWN6             SoundId = 34
	ZAP                  SoundId = 35
	FLASH                SoundId = 36
	YEAH                 SoundId = 37
	AWW                  SoundId = 38
	UNKNOWN7             SoundId = 39
	UNKNOWN8             SoundId = 40
	AUDIENCE             SoundId = 41
	SCATTING             SoundId = 42
	SPARK                SoundId = 43
	TRADITIONAL          SoundId = 44
	ELECTRIC_GUITAR      SoundId = 45
	TWISTY_TURNY         SoundId = 46
	WOOZY                SoundId = 47
	FINAL_BOSS           SoundId = 48
	PEACEFUL             SoundId = 49
	HORROR               SoundId = 50
	SUPER_MARIO_GALAXY   SoundId = 51
	SUPER_MARIO_64       SoundId = 52
	SUPER_MARIO_SUNSHINE SoundId = 53
	SUPER_MARIO_KART     SoundId = 54
	UNKNOWN9             SoundId = 55
)

type Track

type Track struct {
	Unk1  uint16
	Flags uint8
	X     uint8
	Y     uint8
	Type  uint8
	LId   uint16
	Unk2  uint16
	Unk3  uint16
}

type TrackBlock

type TrackBlock struct {
	Unk1      uint8
	Index     uint8
	NodeCount uint8
	Unk2      uint8
	Nodes     [10]TrackBlockNode
}

type TrackBlockNode

type TrackBlockNode struct {
	Unk1      uint8
	Direction uint8
	Unk2      uint16
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL