use phf::{Map, phf_map};
use crate::cclocallevels::{gdlevel::leveldata::HeaderValueType, gdobj::structs::GDObjPropType};
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),
};
pub static LEVEL_HEADER_PROPERTIES: Map<u16, (&'static str, HeaderValueType)> = phf_map! {
1u16 => ("Audio track", HeaderValueType::Int),
2u16 => ("Gamemode", HeaderValueType::Gamemode),
3u16 => ("Mini mode", HeaderValueType::Bool),
4u16 => ("Speed", HeaderValueType::Speed),
5u16 => ("Obj2 blending", HeaderValueType::Bool),
6u16 => ("Background texture ID", HeaderValueType::Int),
7u16 => ("Ground texture ID", HeaderValueType::Int),
8u16 => ("Dual mode", HeaderValueType::Bool),
9u16 => ("Level or Startpos object", HeaderValueType::Bool),
10u16 => ("Two player mode", HeaderValueType::Bool),
11u16 => ("Flip gravity", HeaderValueType::Bool),
12u16 => ("Colour3 blending", HeaderValueType::Bool),
13u16 => ("Song offset seconds", HeaderValueType::Float),
14u16 => ("Guidelines", HeaderValueType::GuidelineString),
15u16 => ("Fade in", HeaderValueType::Bool),
16u16 => ("Fade out", HeaderValueType::Bool),
17u16 => ("Ground line ID", HeaderValueType::Int),
18u16 => ("Font ID", HeaderValueType::Int),
19u16 => ("Startpos target order", HeaderValueType::Int),
20u16 => ("Reverse gameplay", HeaderValueType::Bool),
21u16 => ("Startpos disabled", HeaderValueType::Bool),
22u16 => ("Plaformer mode", HeaderValueType::Bool),
25u16 => ("Middleground texture ID", HeaderValueType::Int),
26u16 => ("Startpos target channel", HeaderValueType::Int),
27u16 => ("Allow multi-rotation", HeaderValueType::Bool),
28u16 => ("Mirror mode", HeaderValueType::Bool),
29u16 => ("Rotate gameplay", HeaderValueType::Bool),
31u16 => ("Enable player squeeze", HeaderValueType::Bool),
32u16 => ("Fix gravity bug", HeaderValueType::Bool),
33u16 => ("Fix negative scale", HeaderValueType::Bool),
34u16 => ("Fix robot jump", HeaderValueType::Bool),
35u16 => ("Startpos reset camera", HeaderValueType::Bool),
36u16 => ("Spawn group", HeaderValueType::Int),
37u16 => ("Dynamic level height", HeaderValueType::Bool),
38u16 => ("Sort groups", HeaderValueType::Bool),
39u16 => ("Fix radius collision", HeaderValueType::Bool),
40u16 => ("Enable 2.2 changes", HeaderValueType::Bool),
41u16 => ("Allow static rotate", HeaderValueType::Bool),
42u16 => ("Reverse sync", HeaderValueType::Bool),
43u16 => ("No time penalty", HeaderValueType::Bool),
44u16 => ("Decrease boost slide", HeaderValueType::Bool),
1038u16 => ("Colours", HeaderValueType::ColourString),
1039u16 => ("Colour page", HeaderValueType::Int),
};
pub fn get_obj_property_type(p: u16) -> Option<GDObjPropType> {
PROPERTY_TABLE.get(&p).map(|v| v.1)
}
pub fn get_level_header_property_type(p: u16) -> Option<HeaderValueType> {
LEVEL_HEADER_PROPERTIES.get(&p).map(|v| v.1)
}
pub const OBJECT_NAMES: &[(i32, &str)] = &[
(1, "Default block"),
(2, "Waffle block floor"),
(3, "Waffle block corner"),
(4, "Waffle block inner corner"),
(5, "Waffle block filler"),
(6, "Waffle block no bottom"),
(7, "Waffle block straight"),
(8, "Spike"),
(9, "Ground spikes"),
(10, "Normal gravity portal"),
(11, "Flipped gravity portal"),
(12, "Cube portal"),
(13, "Ship portal"),
(15, "Pulse pole tall"),
(16, "Pulse pole medium"),
(17, "Pulse pole short"),
(18, "Transparent spikes huge"),
(19, "Transparent spikes big"),
(20, "Transparent spikes medium"),
(21, "Transparent spikes small"),
(22, "No block transition object"),
(23, "Blocks from top transition object"),
(24, "Blocks from bottom transition object"),
(25, "Blocks from left transition object"),
(26, "Blocks from right transition object"),
(27, "Scale in transition object"),
(28, "Scale out transition object"),
(31, "Start pos"),
(32, "Enable player trail"),
(33, "Disable player trail"),
(34, "Solid startpos"),
(35, "Yellow pad"),
(36, "Yellow orb"),
(39, "Small spike"),
(40, "Half block default"),
(41, "Chain tall"),
(45, "Mirror portal reverse"),
(46, "Mirror portal normal"),
(47, "Ball portal"),
(48, "Transparent clouds big"),
(49, "Transparent clouds small"),
(50, "Pulse circle"),
(51, "Pulse ring"),
(52, "Pulse heart"),
(53, "Pulse diamond"),
(54, "Pulse star"),
(55, "Random direction transition object"),
(56, "Away to left transition object"),
(57, "Away to right transition object"),
(58, "Away from middle transition object"),
(59, "Away to middle transition object"),
(60, "Pulse music note"),
(61, "Ground spikes wavy"),
(62, "Wavy block floor"),
(67, "Blue pad"),
(83, "Waffle block"),
(84, "Blue orb"),
(88, "Buzzsaw big"),
(89, "Buzzsaw medium"),
(98, "Buzzsaw small"),
(99, "Size portal normal"),
(101, "Size portal small"),
(111, "UFO portal"),
(140, "Pink pad"),
(141, "Pink orb"),
(200, "Speed portal 0.5x"),
(201, "Speed portal 1x"),
(202, "Speed portal 2x"),
(203, "Speed portal 3x"),
(286, "Dual portal double"),
(287, "Dual portal single"),
(899, "Trigger Colour"),
(901, "Trigger Move"),
(914, "Text object"),
(1006, "Trigger Pulse"),
(1007, "Trigger Alpha"),
(1049, "Trigger Toggle"),
(1268, "Trigger Spawn"),
(1346, "Trigger Rotation"),
(1347, "Trigger Follow"),
(1520, "Trigger Shake"),
(1585, "Trigger Animate"),
(1595, "Trigger Touch"),
(1611, "Trigger Count"),
(1615, "Counter"),
(1616, "Trigger Stop"),
(1812, "Trigger On death"),
(1812, "Trigger follow player y"),
(1815, "Trigger Collision"),
(1816, "Collision block"),
(1818, "BG effect on"),
(1819, "BG effect off"),
(1912, "Trigger Random"),
(1913, "Trigger Camera zoom"),
(1915, "Don't fade + don't enter transition object"),
(1917, "Trigger Reverse gameplay"),
(1932, "Trigger Player control"),
(1934, "Trigger Song"),
(1935, "Trigger Time warp"),
(2016, "Camera guide"),
(2066, "Trigger Gravity"),
(2067, "Trigger Scale"),
(2068, "Trigger Advanced random"),
(2900, "Trigger rotate gameplay"),
(2900, "Trigger Middleground config"),
(3024, "Trigger Area stop"),
(3031, "Trigger Middleground change"),
(3600, "Trigger End"),
(3604, "Trigger Event"),
(3606, "BG speed config"),
(3608, "Trigger Spawn particle"),
(3609, "Trigger Instant collision"),
(3612, "MG speed config"),
(3613, "UI config"),
(3614, "Trigger Time"),
(3615, "Trigger Time event"),
(3617, "Trigger Time control"),
(3618, "Trigger Reset group"),
(3619, "Trigger Item edit"),
(3620, "Trigger Item compare"),
(3640, "Collision state block"),
(3641, "Trigger Persistent item"),
(3643, "Toggle block"),
(3662, "Trigger Link visible"),
];