345 lines
11 KiB
Python
345 lines
11 KiB
Python
# coding=utf-8
|
|
|
|
from ui_menu_pulldown_item import PulldownMenuItem, SeparatorItem, PulldownMenuData, FileQuitItem, ViewToggleCRTItem, ViewToggleCameraTiltItem, ViewSetZoomItem, ViewToggleGridItem
|
|
|
|
class GameModePulldownMenuItem(PulldownMenuItem):
|
|
# unless overridden, game mode items not allowed in art mode
|
|
art_mode_allowed = False
|
|
|
|
|
|
#
|
|
# game menu
|
|
#
|
|
class HideEditUIItem(GameModePulldownMenuItem):
|
|
label = 'Hide edit UI'
|
|
command = 'toggle_game_edit_ui'
|
|
close_on_select = True
|
|
always_active = True
|
|
|
|
class NewGameDirItem(GameModePulldownMenuItem):
|
|
label = 'New game…'
|
|
command = 'new_game_dir'
|
|
always_active = True
|
|
|
|
class SetGameDirItem(GameModePulldownMenuItem):
|
|
label = 'Open game…'
|
|
command = 'set_game_dir'
|
|
close_on_select = True
|
|
always_active = True
|
|
|
|
class PauseGameItem(GameModePulldownMenuItem):
|
|
label = 'blah'
|
|
command = 'toggle_anim_playback'
|
|
always_active = True
|
|
def get_label(app):
|
|
return ['Pause game', 'Unpause game'][app.gw.paused]
|
|
|
|
class OpenConsoleItem(GameModePulldownMenuItem):
|
|
label = 'Open dev console'
|
|
command = 'toggle_console'
|
|
close_on_select = True
|
|
always_active = True
|
|
art_mode_allowed = True
|
|
|
|
#
|
|
# state menu
|
|
#
|
|
class ResetStateItem(GameModePulldownMenuItem):
|
|
label = 'Reset to last state'
|
|
command = 'reset_game'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
class LoadStateItem(GameModePulldownMenuItem):
|
|
label = 'Load state…'
|
|
command = 'load_game_state'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
class SaveStateItem(GameModePulldownMenuItem):
|
|
label = 'Save current state'
|
|
command = 'save_current'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
class SaveNewStateItem(GameModePulldownMenuItem):
|
|
label = 'Save new state…'
|
|
command = 'save_game_state'
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
#
|
|
# view menu
|
|
#
|
|
class ObjectsToCameraItem(GameModePulldownMenuItem):
|
|
label = 'Move selected object(s) to camera'
|
|
command = 'objects_to_camera'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
class CameraToObjectsItem(GameModePulldownMenuItem):
|
|
label = 'Move camera to selected object'
|
|
command = 'camera_to_objects'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) != 1
|
|
|
|
class ToggleDebugObjectsItem(GameModePulldownMenuItem):
|
|
label = ' Draw debug objects'
|
|
command = 'toggle_debug_objects'
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
def should_mark(ui):
|
|
return ui.app.gw.properties and ui.app.gw.properties.draw_debug_objects
|
|
|
|
class ToggleOriginVizItem(GameModePulldownMenuItem):
|
|
label = ' Show all object origins'
|
|
command = 'toggle_all_origin_viz'
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
def should_mark(ui):
|
|
return ui.app.gw.show_origin_all
|
|
|
|
class ToggleBoundsVizItem(GameModePulldownMenuItem):
|
|
label = ' Show all object bounds'
|
|
command = 'toggle_all_bounds_viz'
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
def should_mark(ui):
|
|
return ui.app.gw.show_bounds_all
|
|
|
|
class ToggleCollisionVizItem(GameModePulldownMenuItem):
|
|
label = ' Show all object collision'
|
|
command = 'toggle_all_collision_viz'
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
def should_mark(ui):
|
|
return ui.app.gw.show_collision_all
|
|
|
|
#
|
|
# world menu
|
|
#
|
|
class EditWorldPropertiesItem(GameModePulldownMenuItem):
|
|
label = 'Edit world properties…'
|
|
command = 'edit_world_properties'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
#
|
|
# room menu
|
|
#
|
|
|
|
class ChangeRoomItem(GameModePulldownMenuItem):
|
|
label = 'Change current room…'
|
|
command = 'change_current_room'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
|
|
class AddRoomItem(GameModePulldownMenuItem):
|
|
label = 'Add room…'
|
|
command = 'add_room'
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
class SetRoomObjectsItem(GameModePulldownMenuItem):
|
|
label = 'Add/remove objects from room…'
|
|
command = 'set_room_objects'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
class RemoveRoomItem(GameModePulldownMenuItem):
|
|
label = 'Remove this room'
|
|
command = 'remove_current_room'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
class RenameRoomItem(GameModePulldownMenuItem):
|
|
label = 'Rename this room…'
|
|
command = 'rename_current_room'
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
class ToggleAllRoomsVizItem(GameModePulldownMenuItem):
|
|
label = 'blah'
|
|
command = 'toggle_all_rooms_visible'
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
def get_label(app):
|
|
return ['Show all rooms', 'Show only current room'][app.gw.show_all_rooms]
|
|
|
|
class ToggleListOnlyRoomObjectItem(GameModePulldownMenuItem):
|
|
label = ' List only objects in this room'
|
|
command = 'toggle_list_only_room_objects'
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
def should_mark(ui):
|
|
return ui.app.gw.list_only_current_room_objects
|
|
|
|
class ToggleRoomCamerasItem(GameModePulldownMenuItem):
|
|
label = ' Camera changes with room'
|
|
command = 'toggle_room_camera_changes'
|
|
def should_dim(app):
|
|
return len(app.gw.rooms) == 0
|
|
def should_mark(ui):
|
|
return ui.app.gw.room_camera_changes_enabled
|
|
|
|
class SetRoomCameraItem(GameModePulldownMenuItem):
|
|
label = "Set this room's camera marker…"
|
|
command = 'set_room_camera_marker'
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
class SetRoomEdgeDestinationsItem(GameModePulldownMenuItem):
|
|
label = "Set this room's edge warps…"
|
|
command = 'set_room_edge_warps'
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
class SetRoomBoundsObject(GameModePulldownMenuItem):
|
|
label = "Set this room's edge object…"
|
|
command = 'set_room_bounds_obj'
|
|
def should_dim(app):
|
|
return app.gw.current_room is None
|
|
|
|
class AddSelectedToCurrentRoomItem(GameModePulldownMenuItem):
|
|
label = 'Add selected objects to this room'
|
|
command = 'add_selected_to_room'
|
|
def should_dim(app):
|
|
return app.gw.current_room is None or len(app.gw.selected_objects) == 0
|
|
|
|
class RemoveSelectedFromCurrentRoomItem(GameModePulldownMenuItem):
|
|
label = 'Remove selected objects from this room'
|
|
command = 'remove_selected_from_room'
|
|
def should_dim(app):
|
|
return app.gw.current_room is None or len(app.gw.selected_objects) == 0
|
|
|
|
#
|
|
# object menu
|
|
#
|
|
|
|
class SpawnObjectItem(GameModePulldownMenuItem):
|
|
label = 'Spawn object…'
|
|
command = 'choose_spawn_object_class'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
class DuplicateObjectsItem(GameModePulldownMenuItem):
|
|
label = 'Duplicate selected objects'
|
|
command = 'duplicate_selected_objects'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
class SelectObjectsItem(GameModePulldownMenuItem):
|
|
label = 'Select objects…'
|
|
command = 'select_objects'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return not app.gw.game_dir
|
|
|
|
class EditArtForObjectsItem(GameModePulldownMenuItem):
|
|
label = 'Edit art for selected…'
|
|
command = 'edit_art_for_selected_objects'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
class SetObjectRoomsItem(GameModePulldownMenuItem):
|
|
label = 'Add/remove this object from rooms…'
|
|
command = 'set_object_rooms'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) != 1
|
|
|
|
class DeleteSelectedObjectsItem(GameModePulldownMenuItem):
|
|
label = 'Delete selected object(s)'
|
|
command = 'erase_selection_or_art'
|
|
close_on_select = True
|
|
def should_dim(app):
|
|
return len(app.gw.selected_objects) == 0
|
|
|
|
class GameMenuData(PulldownMenuData):
|
|
items = [HideEditUIItem, OpenConsoleItem, SeparatorItem,
|
|
NewGameDirItem, SetGameDirItem, PauseGameItem, SeparatorItem,
|
|
FileQuitItem]
|
|
|
|
class GameStateMenuData(PulldownMenuData):
|
|
items = [ResetStateItem, LoadStateItem, SaveStateItem, SaveNewStateItem]
|
|
|
|
class GameViewMenuData(PulldownMenuData):
|
|
items = [ViewToggleCRTItem, ViewToggleGridItem, SeparatorItem,
|
|
ViewSetZoomItem, ViewToggleCameraTiltItem, SeparatorItem,
|
|
ObjectsToCameraItem, CameraToObjectsItem, ToggleDebugObjectsItem,
|
|
ToggleOriginVizItem, ToggleBoundsVizItem, ToggleCollisionVizItem]
|
|
|
|
def should_mark_item(item, ui):
|
|
if hasattr(item, 'should_mark'):
|
|
return item.should_mark(ui)
|
|
return False
|
|
|
|
class GameWorldMenuData(PulldownMenuData):
|
|
items = [EditWorldPropertiesItem]
|
|
|
|
class GameRoomMenuData(PulldownMenuData):
|
|
items = [ChangeRoomItem, AddRoomItem, RemoveRoomItem, RenameRoomItem,
|
|
ToggleAllRoomsVizItem, ToggleListOnlyRoomObjectItem, ToggleRoomCamerasItem, SeparatorItem,
|
|
AddSelectedToCurrentRoomItem, RemoveSelectedFromCurrentRoomItem,
|
|
SetRoomObjectsItem, SeparatorItem,
|
|
SetRoomCameraItem, SetRoomEdgeDestinationsItem, SetRoomBoundsObject,
|
|
SeparatorItem
|
|
]
|
|
def should_mark_item(item, ui):
|
|
"show checkmark for current room"
|
|
if not ui.app.gw.current_room:
|
|
return False
|
|
if hasattr(item, 'should_mark'):
|
|
return item.should_mark(ui)
|
|
return ui.app.gw.current_room.name == item.cb_arg
|
|
|
|
def get_items(app):
|
|
items = []
|
|
if len(app.gw.rooms) == 0:
|
|
return items
|
|
# TODO: this is almost c+p'd from LayerMenuData, generalize it
|
|
# first determine longest line to set width of items
|
|
longest_line = 0
|
|
for room_name in app.gw.rooms:
|
|
if len(room_name) > longest_line:
|
|
longest_line = len(room_name)
|
|
# check non-generated menu items too
|
|
for item in GameRoomMenuData.items:
|
|
if len(item.label) + 1 > longest_line:
|
|
longest_line = len(item.label) + 1
|
|
# cap at max allowed line length
|
|
for room_name,room in app.gw.rooms.items():
|
|
class TempMenuItemClass(GameModePulldownMenuItem): pass
|
|
item = TempMenuItemClass
|
|
# leave spaces for mark
|
|
item.label = ' %s' % room_name
|
|
# pad, put Z depth on far right
|
|
item.label = item.label.ljust(longest_line)
|
|
# trim to keep below a max length
|
|
item.label = item.label[:longest_line]
|
|
# tell PulldownMenu's button creation process not to auto-pad
|
|
item.no_pad = True
|
|
item.command = 'change_current_room_to'
|
|
item.cb_arg = room_name
|
|
items.append(item)
|
|
# sort room list alphabetically so it's stable, if arbitrary
|
|
items.sort(key=lambda item: item.label, reverse=False)
|
|
return items
|
|
|
|
|
|
class GameObjectMenuData(PulldownMenuData):
|
|
items = [SpawnObjectItem, DuplicateObjectsItem, SeparatorItem,
|
|
SelectObjectsItem, EditArtForObjectsItem, SetObjectRoomsItem,
|
|
DeleteSelectedObjectsItem]
|