gdlib 0.3.3

Rust library for editing Geometry Dash savefiles
Documentation
//! Properties lookup table
use phf::{Map, phf_map};

use crate::gdobj::GDObjPropType;

// TODO: make the types not unknown
// note: if it;s a number but not specifically an int, don't say it's an int.
/// Names of properties (INCOMPLETE):
/// (property, name)  
///
/// Reference: <https://flowvix.github.io/gd-info-explorer/props>
pub static PROPERTY_TABLE: Map<u16, (&'static str, GDObjPropType)> = phf_map! {
    1u16 => ("object ID", GDObjPropType::Int),
    2u16 => ("x pos", GDObjPropType::Float),
    3u16 => ("y pos", GDObjPropType::Float),
    4u16 => ("is flipped horizontally?", GDObjPropType::Bool),
    5u16 => ("is flipped vertically?", GDObjPropType::Bool),
    6u16 => ("rotation", GDObjPropType::Float),
    7u16 => ("Red", GDObjPropType::Int),
    8u16 => ("Green", GDObjPropType::Int),
    9u16 => ("Blue", GDObjPropType::Int),
    10u16 => ("duration / group trigger chance", GDObjPropType::Float),
    11u16 => ("Touch triggerable", GDObjPropType::Bool),
    15u16 => ("Using player colour 1", GDObjPropType::Bool),
    16u16 => ("Using player colour 2", GDObjPropType::Bool),
    17u16 => ("Blending enabled", GDObjPropType::Bool),
    20u16 => ("Editor layer 1", GDObjPropType::Int),
    21u16 => ("Object colour", GDObjPropType::ColourChannel),
    22u16 => ("Secondary colour", GDObjPropType::ColourChannel),
    23u16 => ("Colour channel", GDObjPropType::ColourChannel),
    24u16 => ("Z layer", GDObjPropType::Int),
    25u16 => ("Z order", GDObjPropType::Int),
    28u16 => ("Move units x", GDObjPropType::Int),
    29u16 => ("Move units y", GDObjPropType::Int),
    30u16 => ("Move easing", GDObjPropType::Easing),
    31u16 => ("Base64-encoded text", GDObjPropType::Text),
    32u16 => ("Scale", GDObjPropType::Float),
    34u16 => ("Is group parent?", GDObjPropType::Bool),
    35u16 => ("Opacity", GDObjPropType::Float),
    36u16 => ("Is interactable?", GDObjPropType::Bool),
    45u16 => ("Pulse fade in time", GDObjPropType::Float),
    46u16 => ("Pulse hold time", GDObjPropType::Float),
    47u16 => ("Pulse fade out time", GDObjPropType::Float),
    48u16 => ("HSV is enabled", GDObjPropType::Bool),
    49u16 => ("Copy colour specs", GDObjPropType::Text),
    50u16 => ("Copy colour from channel", GDObjPropType::Bool),
    51u16 => ("Target item", GDObjPropType::Group),
    52u16 => ("Pulse group?", GDObjPropType::Bool),
    56u16 => ("Activate group", GDObjPropType::Bool),
    57u16 => ("Groups", GDObjPropType::Group),
    58u16 => ("Follow player's x movement", GDObjPropType::Bool),
    59u16 => ("Follow player's y movement", GDObjPropType::Bool),
    60u16 => ("Copy opacity", GDObjPropType::Bool),
    61u16 => ("Editor layer 2", GDObjPropType::Int),
    62u16 => ("Spawn triggerable", GDObjPropType::Bool),
    63u16 => ("Spawn delay", GDObjPropType::Float),
    64u16 => ("Don't fade", GDObjPropType::Bool),
    65u16 => ("Pulse main colour only", GDObjPropType::Bool),
    66u16 => ("Pulse detail colour only", GDObjPropType::Bool),
    67u16 => ("Don't enter", GDObjPropType::Bool),
    68u16 => ("Rotate degrees", GDObjPropType::Float),
    69u16 => ("Rotate x360", GDObjPropType::Int),
    70u16 => ("Lock object rotation", GDObjPropType::Bool),
    71u16 => ("Target item 2", GDObjPropType::Group),
    72u16 => ("X-axis follow mod", GDObjPropType::Float),
    73u16 => ("Y-axis follow mod", GDObjPropType::Float),
    75u16 => ("Shake strength", GDObjPropType::Float),
    76u16 => ("Animation ID", GDObjPropType::Int),
    77u16 => ("Target count", GDObjPropType::Int),
    80u16 => ("Input item 1", GDObjPropType::Item),
    81u16 => ("Touch hold mode", GDObjPropType::Bool),
    82u16 => ("Touch toggle on/off", GDObjPropType::Unknown),
    84u16 => ("Shake interval", GDObjPropType::Float),
    85u16 => ("Easing rate", GDObjPropType::Float),
    86u16 => ("Exclusive pulse mode", GDObjPropType::Bool),
    87u16 => ("Multitriggerable", GDObjPropType::Bool),
    89u16 => ("Touch dual mode", GDObjPropType::Bool),
    90u16 => ("Follow speed", GDObjPropType::Float),
    91u16 => ("Follow delay", GDObjPropType::Float),
    92u16 => ("Follow offset", GDObjPropType::Int),
    93u16 => ("Trigger on exit", GDObjPropType::Bool),
    94u16 => ("Dynamic block?", GDObjPropType::Bool),
    95u16 => ("Input item 2", GDObjPropType::Item),
    96u16 => ("No glow", GDObjPropType::Bool),
    99u16 => ("Multi activate", GDObjPropType::Bool),
    100u16 => ("Target move mode", GDObjPropType::Unknown),
    101u16 => ("Target move mode axis lock", GDObjPropType::Unknown),
    102u16 => ("Disable preview", GDObjPropType::Bool),
    103u16 => ("Is high detail?", GDObjPropType::Bool),
    104u16 => ("count trigger Multi activate", GDObjPropType::Bool),
    105u16 => ("Max follow speed", GDObjPropType::Float),
    116u16 => ("No object effects", GDObjPropType::Bool),
    117u16 => ("Reverses gameplay", GDObjPropType::Bool),
    120u16 => ("Timewarp amount", GDObjPropType::Float),
    121u16 => ("No touch?", GDObjPropType::Bool),
    128u16 => ("X scale", GDObjPropType::Float),
    129u16 => ("Y scale", GDObjPropType::Float),
    131u16 => ("Y warp angle", GDObjPropType::Float),
    132u16 => ("X warp angle", GDObjPropType::Float),
    133u16 => ("Only move", GDObjPropType::Bool),
    134u16 => ("Passable", GDObjPropType::Bool),
    135u16 => ("Hidden", GDObjPropType::Bool),
    136u16 => ("Non-stick X", GDObjPropType::Bool),
    137u16 => ("Is ice block?", GDObjPropType::Bool),
    138u16 => ("Controlling player 1", GDObjPropType::Bool),
    141u16 => ("Follow camera's x movement", GDObjPropType::Bool),
    142u16 => ("Follow camera's y movement", GDObjPropType::Bool),
    143u16 => ("X movement multiplier", GDObjPropType::Float),
    144u16 => ("Y movement multiplier", GDObjPropType::Float),
    148u16 => ("Gravity", GDObjPropType::Float),
    150u16 => ("New X Scale", GDObjPropType::Float),
    151u16 => ("New Y Scale", GDObjPropType::Float),
    152u16 => ("Random probabilities list", GDObjPropType::ProbabilitiesList),
    153u16 => ("Div by value X", GDObjPropType::Bool),
    154u16 => ("Div by value Y", GDObjPropType::Bool),
    193u16 => ("Grip slope?", GDObjPropType::Bool),
    198u16 => ("Touch player only", GDObjPropType::Unknown),
    200u16 => ("Controlling player 2", GDObjPropType::Bool),
    201u16 => ("Controlling target player", GDObjPropType::Bool),
    210u16 => ("No legacy HSV", GDObjPropType::Bool),
    217u16 => ("Enter/Exit transition config", GDObjPropType::Unknown),
    274u16 => ("Parent groups", GDObjPropType::Unknown),
    279u16 => ("Is area parent?", GDObjPropType::Bool),
    284u16 => ("Single player touch", GDObjPropType::Bool),
    289u16 => ("Non-stick Y", GDObjPropType::Bool),
    343u16 => ("Enter effect channel", GDObjPropType::Unknown),
    344u16 => ("Target transition channel", GDObjPropType::Unknown),
    356u16 => ("Scale stick", GDObjPropType::Bool),
    369u16 => ("Center effect", GDObjPropType::Bool),
    371u16 => ("Camera zoom", GDObjPropType::Float),
    372u16 => ("No audio scale", GDObjPropType::Bool),
    385u16 => ("X reference position", GDObjPropType::Unknown),
    386u16 => ("Y reference position", GDObjPropType::Unknown),
    387u16 => ("X reference is relative", GDObjPropType::Bool),
    388u16 => ("Y reference is relative", GDObjPropType::Bool),
    389u16 => ("Seconds only", GDObjPropType::Bool),
    390u16 => ("Special counter mode", GDObjPropType::Unknown),
    391u16 => ("Counter alignment", GDObjPropType::Int),
    392u16 => ("Song ID", GDObjPropType::Int),
    393u16 => ("Small step", GDObjPropType::Bool),
    394u16 => ("Directional move mode", GDObjPropType::Bool),
    395u16 => ("Center group id", GDObjPropType::Group),
    396u16 => ("Directional mode distance", GDObjPropType::Int),
    397u16 => ("Dynamic move", GDObjPropType::Bool),
    399u16 => ("Prep?", GDObjPropType::Bool),
    400u16 => ("Load Prep?", GDObjPropType::Bool),
    401u16 => ("Rotation target ID", GDObjPropType::Int),
    402u16 => ("Rotation offset", GDObjPropType::Float),
    403u16 => ("Dynamic move easing", GDObjPropType::Int),
    404u16 => ("Song speed", GDObjPropType::Int),
    406u16 => ("Song volume", GDObjPropType::Float),
    408u16 => ("Start offset in ms", GDObjPropType::Int),
    409u16 => ("Fade in time in ms", GDObjPropType::Int),
    410u16 => ("End offset in ms", GDObjPropType::Int),
    411u16 => ("Fade out time in ms", GDObjPropType::Int),
    413u16 => ("Loop song?", GDObjPropType::Bool),
    430u16 => ("Event listeners", GDObjPropType::EventsList),
    432u16 => ("Song channel", GDObjPropType::Unknown),
    441u16 => ("Spawn ordered", GDObjPropType::Bool),
    442u16 => ("Spawn ID remaps", GDObjPropType::SpawnRemapsList),
    444u16 => ("No multiactivate platformer", GDObjPropType::Bool),
    445u16 => ("Claim touch?", GDObjPropType::Bool),
    446u16 => ("Object material", GDObjPropType::Unknown),
    447u16 => ("Event extra ID", GDObjPropType::Group),
    452u16 => ("Relative rotation", GDObjPropType::Bool),
    460u16 => ("No end effects?", GDObjPropType::Bool),
    461u16 => ("No end sound effects?", GDObjPropType::Bool),
    466u16 => ("Is Timer?", GDObjPropType::Bool),
    467u16 => ("Start time", GDObjPropType::Bool),
    468u16 => ("Don't override", GDObjPropType::Bool),
    469u16 => ("Ignore timewarp", GDObjPropType::Bool),
    470u16 => ("Time value multipler", GDObjPropType::Float),
    471u16 => ("Start paused timer", GDObjPropType::Float),
    472u16 => ("Stop time counter?", GDObjPropType::Bool),
    473u16 => ("Target time", GDObjPropType::Float),
    474u16 => ("Pause at target time", GDObjPropType::Bool),
    475u16 => ("Multiactivatable time event", GDObjPropType::Bool),
    476u16 => ("First item type", GDObjPropType::Unknown),
    477u16 => ("Second item type", GDObjPropType::Unknown),
    478u16 => ("Target item type", GDObjPropType::Unknown),
    479u16 => ("Modifier", GDObjPropType::Float),
    480u16 => ("Left operator", GDObjPropType::Unknown),
    481u16 => ("Right operator", GDObjPropType::Unknown),
    482u16 => ("Compare operator", GDObjPropType::Unknown),
    483u16 => ("Second modifier", GDObjPropType::Float),
    484u16 => ("Tolerance", GDObjPropType::Float),
    485u16 => ("Left round mode", GDObjPropType::Unknown),
    486u16 => ("Right round mode", GDObjPropType::Unknown),
    487u16 => ("Instant end?", GDObjPropType::Bool),
    488u16 => ("Kerning", GDObjPropType::Int),
    491u16 => ("Set persistent item", GDObjPropType::Bool),
    492u16 => ("Target all persistent items", GDObjPropType::Bool),
    493u16 => ("Reset item to 0", GDObjPropType::Bool),
    494u16 => ("Timer", GDObjPropType::Item),
    495u16 => ("Extra sticky", GDObjPropType::Bool),
    496u16 => ("Don't boost Y?", GDObjPropType::Bool),
    504u16 => ("Spawn only", GDObjPropType::Bool),
    506u16 => ("Camera guide preview opacity", GDObjPropType::Float),
    507u16 => ("No particles", GDObjPropType::Bool),
    509u16 => ("Don't boost X?", GDObjPropType::Bool),
    511u16 => ("Has extended collision", GDObjPropType::Bool),
    516u16 => ("MinX ID", GDObjPropType::Group),
    517u16 => ("MinY ID", GDObjPropType::Group),
    518u16 => ("MaxX ID", GDObjPropType::Group),
    519u16 => ("MaxY ID", GDObjPropType::Group),
    525u16 => ("Event Extra ID 2", GDObjPropType::Bool),
    533u16 => ("Middleground", GDObjPropType::Int),
    534u16 => ("Material control ID", GDObjPropType::Int),
    535u16 => ("Use control ID", GDObjPropType::Bool),
    540u16 => ("Stop player jump", GDObjPropType::Bool),
    541u16 => ("Stop player movement", GDObjPropType::Bool),
    542u16 => ("Stop player rotation", GDObjPropType::Bool),
    543u16 => ("Stop player sliding", GDObjPropType::Bool),
    544u16 => ("Silent move", GDObjPropType::Bool),
    547u16 => ("X offset of spawned particles", GDObjPropType::Int),
    548u16 => ("Y offset of spawned particles", GDObjPropType::Int),
    549u16 => ("X offset variation of spawned particles", GDObjPropType::Int),
    550u16 => ("Y offset variation of spawned particles", GDObjPropType::Int),
    551u16 => ("Match rotation of spawned particles?", GDObjPropType::Bool),
    552u16 => ("Rotation of spawned particles", GDObjPropType::Int),
    553u16 => ("Rotation variation of spawned particles", GDObjPropType::Int),
    554u16 => ("Scale of spawned particles", GDObjPropType::Float),
    555u16 => ("Scale variation of spawned particles", GDObjPropType::Float),
    556u16 => ("Spawn delay variation", GDObjPropType::Float),
    574u16 => ("Respawn time", GDObjPropType::Float),
    577u16 => ("Relative scale", GDObjPropType::Bool),
    578u16 => ("Left sign mode", GDObjPropType::Unknown),
    579u16 => ("Right sign mode", GDObjPropType::Unknown),
    580u16 => ("Stop mode", GDObjPropType::Unknown),
    581u16 => ("Reset remap", GDObjPropType::Bool),
    582u16 => ("X velocity modifier", GDObjPropType::Float),
    583u16 => ("Y velocity modifier", GDObjPropType::Float),
    595u16 => ("Don't stop song on death", GDObjPropType::Bool),
    10002u16 => ("Starting gamemode", GDObjPropType::Unknown),
    10003u16 => ("Starting in mini mode?", GDObjPropType::Bool),
    10004u16 => ("Starting speed", GDObjPropType::Unknown),
    10008u16 => ("Starting in dual mode?", GDObjPropType::Bool),
    10019u16 => ("Target order", GDObjPropType::Unknown),
    10020u16 => ("Reverse gameplay?", GDObjPropType::Bool),
    10021u16 => ("Is disabled?", GDObjPropType::Bool),
    10026u16 => ("Target channel", GDObjPropType::Unknown),
    10028u16 => ("Starting in mirror mode?", GDObjPropType::Bool),
    10029u16 => ("Rotate gameplay?", GDObjPropType::Bool),
    10035u16 => ("Reset camera?", GDObjPropType::Bool),
};

/// Get type of a property by ID
pub fn get_property_type(p: u16) -> Option<GDObjPropType> {
    PROPERTY_TABLE.get(&p).map(|v| v.1)
}