extends SceneTree ## Writes the project's input map into project.godot. ## ## Hand-editing the [input] section is error-prone -- the events are serialised ## engine objects with a long property list. Generating them through the real ## API means the file is always in the format the engine expects. ## ## godot --headless --path . --script tools/setup_input_map.gd ## ## Re-run after changing the bindings below. Physical keycodes are used so the ## bindings follow key position rather than layout. func _init() -> void: _action("move_up", [_key(KEY_W), _key(KEY_UP)]) _action("move_down", [_key(KEY_S), _key(KEY_DOWN)]) _action("move_left", [_key(KEY_A), _key(KEY_LEFT)]) _action("move_right", [_key(KEY_D), _key(KEY_RIGHT)]) _action("fire", [_mouse(MOUSE_BUTTON_LEFT), _key(KEY_SPACE)]) _action("emergency_escape", [_key(KEY_F)]) _action("interact", [_key(KEY_E)]) # One per inventory slot. Number keys use the slot; shift-number drops it, # which is read in code rather than bound here -- a modifier is not an # action, and duplicating four bindings to express it would be worse. for i in SimConfig.INVENTORY_SLOTS: _action("use_slot_%d" % (i + 1), [_key((KEY_1 + i) as Key)]) _action("system_menu", [_key(KEY_ESCAPE)]) _action("debug_overlay", [_key(KEY_F1)]) var err := ProjectSettings.save() print("input map written, err=%d" % err) quit(0 if err == OK else 1) func _action(name: String, events: Array) -> void: ProjectSettings.set_setting("input/" + name, { "deadzone": 0.2, "events": events, }) ## device -1 (DEVICE_ID_EMULATION) is what the editor writes and is the only ## value that matches input from a real device. A freshly constructed event ## defaults to 16, which silently matches nothing. func _key(code: Key) -> InputEventKey: var e := InputEventKey.new() e.device = -1 e.physical_keycode = code return e func _mouse(button: MouseButton) -> InputEventMouseButton: var e := InputEventMouseButton.new() e.device = -1 e.button_index = button return e