gdlib 0.2.5

Rust library for editing Geometry Dash savefiles
use phf::{Map, phf_map};

use crate::gdobj::GDObjPropType;

/// Names of properties (INCOMPLETE):
/// (property, name)
pub const PROPERTY_TABLE: Map<u16, (&'static str, GDObjPropType)> = phf_map! {
    1 => ("object ID", GDObjPropType::Int),
    2 => ("x pos", GDObjPropType::Float),
    3 => ("y pos", GDObjPropType::Float),
    4 => ("is flipped horizontally?", GDObjPropType::Bool),
    5 => ("is flipped vertically?", GDObjPropType::Bool),
    6 => ("rotation", GDObjPropType::Float),
    7 => ("Red", GDObjPropType::Int),
    8 => ("Green", GDObjPropType::Int),
    9 => ("Blue", GDObjPropType::Int),
    10 => ("Fade time / chance to trigger group 1", GDObjPropType::Float),
    11 => ("Touch triggerable", GDObjPropType::Bool),
    15 => ("Using player colour 1", GDObjPropType::Bool),
    16 => ("Using player colour 2", GDObjPropType::Bool),
    17 => ("Blending enabled", GDObjPropType::Bool),
    20 => ("Editor layer 1", GDObjPropType::Int),
    21 => ("Object colour", GDObjPropType::ColourChannel),
    22 => ("Secondary colour", GDObjPropType::ColourChannel),
    23 => ("Colour channel", GDObjPropType::ColourChannel),
    24 => ("Z layer", GDObjPropType::Int),
    25 => ("Z order", GDObjPropType::Int),
    28 => ("Move units x", GDObjPropType::Int),
    29 => ("Move units y", GDObjPropType::Int),
    30 => ("Move easing", GDObjPropType::Easing),
    31 => ("Base64-encoded text", GDObjPropType::Text),
    34 => ("Is group parent?", GDObjPropType::Bool),
    35 => ("Opacity", GDObjPropType::Float),
    36 => ("Is active trigger?", GDObjPropType::Bool),
    45 => ("Pulse fade in time", GDObjPropType::Float),
    46 => ("Pulse hold time", GDObjPropType::Float),
    47 => ("Pulse fade out time", GDObjPropType::Float),
    49 => ("Copy colour specs", GDObjPropType::Text),
    50 => ("Copy colour from channel", GDObjPropType::Bool),
    51 => ("Target group/item/channel", GDObjPropType::Group),
    56 => ("Activate group", GDObjPropType::Bool),
    57 => ("Groups", GDObjPropType::Group),
    58 => ("Follow player's x movement", GDObjPropType::Bool),
    59 => ("Follow player's y movement", GDObjPropType::Bool),
    60 => ("Copy opacity", GDObjPropType::Bool),
    61 => ("Editor layer 2", GDObjPropType::Int),
    62 => ("Spawn triggerable", GDObjPropType::Bool),
    64 => ("Don't fade", GDObjPropType::Bool),
    67 => ("Don't enter", GDObjPropType::Bool),
    71 => ("Target group 2", GDObjPropType::Group),
    75 => ("Shake strength", GDObjPropType::Float),
    80 => ("Group/item 1", GDObjPropType::Item),
    84 => ("Shake interval", GDObjPropType::Float),
    85 => ("Easing rate", GDObjPropType::Float),
    86 => ("Exclusive pulse mode", GDObjPropType::Bool),
    87 => ("Multitriggerable", GDObjPropType::Bool),
    94 => ("Dynamic block?", GDObjPropType::Bool),
    95 => ("Group/item 2", GDObjPropType::Item),
    96 => ("No glow", GDObjPropType::Bool),
    99 => ("Multi activate", GDObjPropType::Bool),
    100 => ("Target move mode", GDObjPropType::Unknown),
    101 => ("Target move mode axis lock", GDObjPropType::Unknown),
    103 => ("Is high detail?", GDObjPropType::Bool),
    116 => ("No object effects", GDObjPropType::Bool),
    117 => ("Reverses gameplay", GDObjPropType::Bool),
    120 => ("Timewarp amount", GDObjPropType::Float),
    121 => ("No touch?", GDObjPropType::Bool),
    128 => ("X scale", GDObjPropType::Float),
    129 => ("Y scale", GDObjPropType::Float),
    134 => ("Passable", GDObjPropType::Bool),
    135 => ("Hidden", GDObjPropType::Bool),
    136 => ("Non-stick X", GDObjPropType::Bool),
    137 => ("Is ice block?", GDObjPropType::Bool),
    138 => ("Controlling player 1", GDObjPropType::Bool),
    141 => ("Follow camera's x movement", GDObjPropType::Bool),
    142 => ("Follow camera's y movement", GDObjPropType::Bool),
    143 => ("X movement multiplier", GDObjPropType::Float),
    144 => ("Y movement multiplier", GDObjPropType::Float),
    148 => ("Gravity", GDObjPropType::Float),
    193 => ("Grip slope?", GDObjPropType::Bool),
    200 => ("Controlling player 2", GDObjPropType::Bool),
    201 => ("Controlling target player", GDObjPropType::Bool),
    210 => ("No legacy HSV", GDObjPropType::Bool),
    217 => ("Enter/Exit transition config", GDObjPropType::Unknown),
    274 => ("Parent groups", GDObjPropType::Group),
    279 => ("Is area parent?", GDObjPropType::Bool),
    284 => ("Single player touch", GDObjPropType::Bool),
    289 => ("Non-stick Y", GDObjPropType::Bool),
    343 => ("Enter effect channel", GDObjPropType::Unknown),
    344 => ("Target transition channel", GDObjPropType::Unknown),
    356 => ("Scale stick", GDObjPropType::Bool),
    369 => ("Center effect", GDObjPropType::Bool),
    371 => ("Camera zoom", GDObjPropType::Float),
    372 => ("No audio scale", GDObjPropType::Bool),
    392 => ("Song ID", GDObjPropType::Int),
    393 => ("Small step", GDObjPropType::Bool),
    394 => ("Directional move mode", GDObjPropType::Bool),
    395 => ("Center group id", GDObjPropType::Group),
    397 => ("Dynamic move", GDObjPropType::Bool),
    399 => ("Prep?", GDObjPropType::Bool),
    400 => ("Load Prep?", GDObjPropType::Bool),
    404 => ("Song speed", GDObjPropType::Int),
    406 => ("Song volume", GDObjPropType::Int),
    408 => ("Start offset in ms", GDObjPropType::Int),
    409 => ("Fade in time in ms", GDObjPropType::Int),
    410 => ("End offset in ms", GDObjPropType::Int),
    411 => ("Fade out time in ms", GDObjPropType::Int),
    413 => ("Loop song?", GDObjPropType::Bool),
    432 => ("Song channel", GDObjPropType::Unknown),
    445 => ("Claim touch?", GDObjPropType::Bool),
    446 => ("Object material", GDObjPropType::Unknown),
    460 => ("No end effects?", GDObjPropType::Bool),
    461 => ("Instant end?", GDObjPropType::Bool),
    467 => ("No end sound effects?", GDObjPropType::Bool),
    472 => ("Stop time counter?", GDObjPropType::Bool),
    473 => ("Target time for event", GDObjPropType::Float),
    475 => ("Multiactivatable time event", GDObjPropType::Bool),
    476 => ("First item type", GDObjPropType::Unknown),
    477 => ("Second item type", GDObjPropType::Unknown),
    479 => ("Modifier", GDObjPropType::Float),
    480 => ("Left operator", GDObjPropType::Unknown),
    481 => ("Right operator", GDObjPropType::Unknown),
    482 => ("Compare operator", GDObjPropType::Unknown),
    483 => ("Second modifier", GDObjPropType::Float),
    484 => ("Tolerance", GDObjPropType::Float),
    485 => ("Left round mode", GDObjPropType::Unknown),
    486 => ("Right round mode", GDObjPropType::Unknown),
    488 => ("Kerning", GDObjPropType::Int),
    491 => ("Set persistent item", GDObjPropType::Bool),
    492 => ("Target all persistent items", GDObjPropType::Bool),
    493 => ("Reset item to 0", GDObjPropType::Bool),
    494 => ("Timer", GDObjPropType::Item),
    495 => ("Extra sticky", GDObjPropType::Bool),
    496 => ("Don't boost Y?", GDObjPropType::Bool),
    504 => ("Spawn only", GDObjPropType::Bool),
    506 => ("Camera guide preview opacity", GDObjPropType::Float),
    507 => ("No particles", GDObjPropType::Bool),
    509 => ("Don't boost X?", GDObjPropType::Bool),
    511 => ("Has extended collision", GDObjPropType::Bool),
    534 => ("Material control ID", GDObjPropType::Int),
    540 => ("Stop player jump", GDObjPropType::Bool),
    541 => ("Stop player movement", GDObjPropType::Bool),
    542 => ("Stop player rotation", GDObjPropType::Bool),
    543 => ("Stop player sliding", GDObjPropType::Bool),
    544 => ("Silent move", GDObjPropType::Bool),
    547 => ("X offset of spawned particles", GDObjPropType::Int),
    548 => ("Y offset of spawned particles", GDObjPropType::Int),
    549 => ("X offset variation of spawned particles", GDObjPropType::Int),
    550 => ("Y offset variation of spawned particles", GDObjPropType::Int),
    551 => ("Match rotation of spawned particles?", GDObjPropType::Bool),
    552 => ("Rotation of spawned particles", GDObjPropType::Int),
    553 => ("Rotation variation of spawned particles", GDObjPropType::Int),
    554 => ("Scale of spawned particles", GDObjPropType::Float),
    555 => ("Scale variation of spawned particles", GDObjPropType::Float),
    578 => ("Left sign mode", GDObjPropType::Unknown),
    579 => ("Right sign mode", GDObjPropType::Unknown),
    595 => ("Don't stop song on death", GDObjPropType::Bool),
    10004 => ("Starting speed", GDObjPropType::Unknown),
    10002 => ("Starting gamemode", GDObjPropType::Unknown),
    10003 => ("Starting in mini mode?", GDObjPropType::Bool),
    10008 => ("Starting in dual mode?", GDObjPropType::Bool),
    10021 => ("Is disabled?", GDObjPropType::Bool),
    10028 => ("Starting in mirror mode?", GDObjPropType::Bool),
    10029 => ("Rotate gameplay?", GDObjPropType::Bool),
    10020 => ("Reverse gameplay?", GDObjPropType::Bool),
    10019 => ("Target order", GDObjPropType::Unknown),
    10026 => ("Target channel", GDObjPropType::Unknown),
    10035 => ("Reset camera?", GDObjPropType::Bool),
};

pub fn get_property_type(p: u16) -> Option<GDObjPropType> {
    PROPERTY_TABLE.get(&p).map(|v| v.1)
}